//fhn.java
// applet framework
// for displaying lorenz-fhn
// copyright 1997 Timothy D. Sauer
// tsauer@gmu.edu

import java.lang.*;
import java.applet.*;
import java.awt.*;
import java.util.Date;

public class fhn3 extends Applet implements Runnable{

  //Control Panel
  Panel controls = new Panel();

  // Scroll bar for c1 and tau
  Scrollbar sbc1;
  Scrollbar sbtau;

  // Textfield for c1 and tau
  TextField tfc1;
  TextField tftau;
  int min=0;
  int max=100;


  Thread lz = null;


  public void start()
  { if(lz == null ) lz = new Thread(this);
    lz.start();
  }
  public void stop()
  {
    lz.stop();
    lz = null; // force gc
  }

  public void init()
  {
    this.setLayout(new BorderLayout());
    controls.setLayout (new GridLayout(3,2));
    this.add("South",controls);

    tfc1 = new TextField (5);
    sbc1 = new Scrollbar (Scrollbar.HORIZONTAL, 30, 1, min, max);
    tfc1.setText(String.valueOf(sbc1.getValue()));

    tftau = new TextField (5);
    sbtau = new Scrollbar (Scrollbar.HORIZONTAL, 10, 1, min, max);
    tftau.setText(String.valueOf(sbtau.getValue()));

    controls.add (new Label ("Coupling strength",1));
    controls.add (new Label ("Lorenz speed",1));
    controls.add (tfc1);
    controls.add (tftau);
    controls.add (sbc1);
    controls.add (sbtau);

    //    repaint();
  }

  double getValue(TextField textfield){

    double f;
    try {
      f = Double.valueOf(textfield.getText()).doubleValue();
    } catch (java.lang.NumberFormatException e) {
      f = 0.0;
    }
    return f;
  }

  public boolean handleEvent(Event evt) {
    
    if(evt.target.equals (sbc1)){
      tfc1.setText(String.valueOf(sbc1.getValue()));
    } else if ((evt.target.equals (tfc1)) && (evt.id == Event.ACTION_EVENT)) {
      setSliderValue(sbc1, getValue(tfc1));
      tfc1.setText(String.valueOf(sbc1.getValue()));
    }
    if(evt.target.equals (sbtau)){
      tftau.setText(String.valueOf(sbtau.getValue()));
    } else if ((evt.target.equals (tftau)) && (evt.id == Event.ACTION_EVENT)) {
      setSliderValue(sbtau, getValue(tftau));
      tftau.setText(String.valueOf(sbtau.getValue()));
    }
    if( evt.id == Event.WINDOW_DESTROY)// this is needed for graceful close
      {
	System.exit(0);
      }
    return false;
  }
      
  void setSliderValue(Scrollbar slider, double f) {

    int sliderValue = (int)f;
    if (sliderValue > max)sliderValue = max;
    if (sliderValue < min)sliderValue = min;
    slider.setValue(sliderValue);
  }

  public void run()
  {
    int i,ic1;float c1,tau,now1,now2,now3;
    float y[] = new float[7];
    float yn[] = new float[7];

    float y1[] = new float[7];
    float y2[] = new float[7];
    float y3[] = new float[7];
    float y4[] = new float[7];
    float y5[] = new float[7];
    float y6[] = new float[7];
    float y7[] = new float[7];
    float y8[] = new float[7];

    Graphics g;

  //Date
  Date now = new Date();

  now1 = now.getSeconds();
  now2 = now.getMinutes();
  now3 = now.getHours();

    g= this.getGraphics();

    y[0] = (float)0.;
    y[1] = (float)0.0;
    y[2] = (float)-3.+(float)(now1+now2+now3)/(float)200.;
    y[3] = (float)24.;
    y[4] = (float)0.;
    y[5] = (float)0.;
    y[6] = (float)0.;

    for(i=0;i<=6;i++)y1[i] = y[i];
    for(i=0;i<=6;i++)y2[i] = y1[i];
    for(i=0;i<=6;i++)y3[i] = y2[i];
    for(i=0;i<=6;i++)y4[i] = y3[i];
    for(i=0;i<=6;i++)y5[i] = y4[i];
    for(i=0;i<=6;i++)y6[i] = y5[i];
    for(i=0;i<=6;i++)y7[i] = y6[i];
    for(i=0;i<=6;i++)y8[i] = y7[i];

    c1=(float).005;tau=1;
    for(;;)// forever
    {
    for(i=0;i<=6;i++)y8[i] = y7[i];
    for(i=0;i<=6;i++)y7[i] = y6[i];
    for(i=0;i<=6;i++)y6[i] = y5[i];
    for(i=0;i<=6;i++)y5[i] = y4[i];
    for(i=0;i<=6;i++)y4[i] = y3[i];
    for(i=0;i<=6;i++)y3[i] = y2[i];
    for(i=0;i<=6;i++)y2[i] = y1[i];
    for(i=0;i<=6;i++)y1[i] = y[i];

    c1 = (float) getValue(tfc1);c1=c1/(float)10000.;
    tau = (float) getValue(tftau);tau=tau/(float)100.;

        if( !rk3.rk4( yn,y,(float)0., (float)0.02, c1,tau,6))
                                break;


       plot1( g,yn,y1 ,Color.red);
       plot1( g,y7,y8 ,Color.yellow);


       plot2( g,yn,y1 ,Color.green);
       plot2( g,y7,y8 ,Color.blue);

    for(i=0;i<=6;i++)y[i] = yn[i];

       try{ lz.sleep(10);} catch( InterruptedException e){;}

    }
  }

  public void plot1( Graphics g,float to[], float from[], Color c)
  {
    int xl,yl;
    float xb,yb;
    xl = size().width; yl = size().height;
    xb = (float)xl/(float)40.; yb = (float)yl/(float)60.;
    g.setColor( c);
    g.drawLine( (int)(from[1]*xb/2)+xl/4,(int)(200-from[3]*yb/2),
(int)(to[1]*xb/2)+xl/4,(int)(200-to[3]*yb/2) );

  }
  public void plot2( Graphics g,float to[], float from[], Color c)
  {
    int xl,yl;
    float xb,yb;
    float five,ten;

    five = (float)5.;
    ten = (float)10.;
    xl = size().width; yl = size().height;
    xb = (float)xl/(float)40.; yb = (float)yl/(float)60.;
    g.setColor( c);
    g.drawLine( (int)(from[0]*xb/ten),(int)(-from[5]*five*yb+2*yl/3),
(int)(to[0]*xb/ten),(int)(-to[5]*five*yb+2*yl/3) );

  }

  public void paint( Graphics g)
  { return; }

  public void update (Graphics g){
 
    paintAll(g);
  }

} // end of class fhn
