import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.text.*;
import java.lang.Math.*;

public class bio extends Applet implements ActionListener
{
static byte numDates=10;
static long mtod=86400000;
static double pstep=0.2731819698774;
static double estep=0.2243994752564;
static double cstep=0.190399554763;
Label bdLabel=new Label("Date of Birth:");
Label sdLabel=new Label("Start Date:");
Label edLabel=new Label("End Date:");
Label redLabel=new Label("Physical");
Label greenLabel=new Label("Emotional");
Label blueLabel=new Label("Cognitive");
Label magentaLabel=new Label("Passion");
Label yellowLabel=new Label("Wisdom");
Label cyanLabel=new Label("Mastery");
Label blackLabel=new Label("Overall");
DatePanel bd=new DatePanel();
DatePanel sd=new DatePanel(-10);
DatePanel ed=new DatePanel(10);
Button calcButton=new Button("Calculate");
Font defaultFont=new Font("MS Sans Serif",Font.PLAIN,13);
Cursor textCursor=new Cursor(Cursor.TEXT_CURSOR);
Cursor handCursor=new Cursor(Cursor.HAND_CURSOR);
Panel controlPanel=new Panel(new GridLayout(14,1));
Panel datePanel=new Panel();
Panel outputPanel=new Panel();
DateFormat df=DateFormat.getDateInstance(DateFormat.MEDIUM);
GridBagLayout gbl=new GridBagLayout();
GridBagConstraints gbc=new GridBagConstraints();
FontMetrics fm=getFontMetrics(defaultFont);

	public void init()
	{
		setBackground(Color.lightGray);
		setLayout(gbl);
		gbc.fill=gbc.BOTH;
		gbc.weighty=1.0;
		gbc.gridwidth=2;
		gbl.setConstraints(controlPanel,gbc);
		gbc.weightx=.4;
		gbc.gridwidth=1;
		gbl.setConstraints(datePanel,gbc);
		gbc.weightx=.6;
		gbc.gridwidth=3;
		gbl.setConstraints(outputPanel,gbc);
		bdLabel.setFont(defaultFont);
		controlPanel.add(bdLabel);
		controlPanel.add(bd);
		sdLabel.setFont(defaultFont);
		controlPanel.add(sdLabel);
		controlPanel.add(sd);
		edLabel.setFont(defaultFont);
		controlPanel.add(edLabel);
		controlPanel.add(ed);
		calcButton.setFont(defaultFont);
		calcButton.setCursor(handCursor);
		calcButton.addActionListener(this);
		controlPanel.add(calcButton);
		redLabel.setFont(defaultFont);
		redLabel.setForeground(Color.red);
		controlPanel.add(redLabel);
		greenLabel.setFont(defaultFont);
		greenLabel.setForeground(Color.green);
		controlPanel.add(greenLabel);
		blueLabel.setFont(defaultFont);
		blueLabel.setForeground(Color.blue);
		controlPanel.add(blueLabel);
		magentaLabel.setFont(defaultFont);
		magentaLabel.setForeground(Color.magenta);
		controlPanel.add(magentaLabel);
		yellowLabel.setFont(defaultFont);
		yellowLabel.setForeground(Color.yellow);
		controlPanel.add(yellowLabel);
		cyanLabel.setFont(defaultFont);
		cyanLabel.setForeground(Color.cyan);
		controlPanel.add(cyanLabel);
		blackLabel.setFont(defaultFont);
		controlPanel.add(blackLabel);
		outputPanel.setBackground(Color.white);
		outputPanel.setFont(defaultFont);
		datePanel.setFont(defaultFont);
		add(controlPanel);
		add(datePanel);
		add(outputPanel);
	}

	public void actionPerformed(ActionEvent e)
	{
		Graphics g=outputPanel.getGraphics();
		Graphics g2=datePanel.getGraphics();
		g.clearRect(0,0,outputPanel.getSize().width,outputPanel.getSize().height);
		g.setColor(Color.black);
		g.drawRect(0,0,outputPanel.getSize().width-1,outputPanel.getSize().height-1);
		g2.clearRect(0,0,datePanel.getSize().width,datePanel.getSize().height);
		int bday=bd.getDate();
		int sday=sd.getDate();
		int eday=ed.getDate();
		if (sday>bday&&eday>sday)
		{
			// Calculate the biorhythm lines
			int outw=(outputPanel.getSize().width-2)/2;
			int outtw=outputPanel.getSize().width-2;
			int midw=outputPanel.getSize().width/2;
			int datew=datePanel.getSize().width-10;
			g.drawLine(midw,0,midw,outputPanel.getSize().height);
			g.drawString("-",midw/2,20);
			g.drawString("+",midw/2*3,20);
			int offd=sday-bday;
			int endd=eday-bday;
			float gstep=(float)(outputPanel.getSize().height-2)/(endd-offd);
			int oldr,oldg,oldb,oldm,oldy,oldc,oldk,newr,newg,newb,newm,newy,newc,newk,oldv,newv;
			String date;
			byte numDates=0;
			int spc=fm.getHeight();
			oldr=(int)(Math.sin((double)offd*pstep)*outw+midw);
			oldg=(int)(Math.sin((double)offd*estep)*outw+midw);
			oldb=(int)(Math.sin((double)offd*cstep)*outw+midw);
			oldm=(oldr+oldg)/2;
			oldy=(oldg+oldb)/2;
			oldc=(oldr+oldb)/2;
			oldk=(oldr+oldg+oldb)/3;
			oldv=1;
			for (int curd=offd+1; curd<=endd; curd++)
			{
				newv=(int)((curd-offd)*gstep)+1;
				newr=(int)(Math.sin(curd*pstep)*outw+midw);
				g.setColor(Color.red);
				g.drawLine(oldr,oldv,newr,newv);
				newg=(int)(Math.sin(curd*estep)*outw+midw);
				g.setColor(Color.green);
				g.drawLine(oldg,oldv,newg,newv);
				newb=(int)(Math.sin(curd*cstep)*outw+midw);
				g.setColor(Color.blue);
				g.drawLine(oldb,oldv,newb,newv);
				newm=(newr+newg)/2;
				g.setColor(Color.magenta);
				g.drawLine(oldm,oldv,newm,newv);
				newy=(newg+newb)/2;
				g.setColor(Color.yellow);
				g.drawLine(oldy,oldv,newy,newv);
				newc=(newr+newb)/2;
				g.setColor(Color.cyan);
				g.drawLine(oldc,oldv,newc,newv);
				newk=(newr+newg+newb)/3;
				g.setColor(Color.black);
				g.drawLine(oldk,oldv,newk,newv);
				oldr=newr;
				oldg=newg;
				oldb=newb;
				oldm=newm;
				oldy=newy;
				oldc=newc;
				oldk=newk;
				oldv=newv;
				date=df.format(new Date((curd+bday)*mtod));
				if ((curd-offd-.5)*gstep/spc>=numDates)
				{
					g2.drawString(date,datew-fm.stringWidth(date),(int)((curd-offd-.5)*gstep+.5));
					g.setColor(Color.gray);
					g.drawLine(1,oldv,outtw,oldv);
					numDates++;
				}
			}
		}
		else
		{
			g.drawString("Please enter correct dates.",10,10);
		}
	}
}

class DatePanel extends Panel
{
Choice month=new Choice();
TextField date=new TextField("dd");
Choice century=new Choice();
TextField year=new TextField("yy");
	DatePanel()
	{
		month.add("Jan");
		month.add("Feb");
		month.add("Mar");
		month.add("Apr");
		month.add("May");
		month.add("Jun");
		month.add("Jul");
		month.add("Aug");
		month.add("Sep");
		month.add("Oct");
		month.add("Nov");
		month.add("Dec");
		century.add("18");
		century.add("19");
		century.add("20");
		century.select(1);
		add(month);
		add(date);
		add(century);
		add(year);
	}

	DatePanel(int dft)
	{
		month.add("Jan");
		month.add("Feb");
		month.add("Mar");
		month.add("Apr");
		month.add("May");
		month.add("Jun");
		month.add("Jul");
		month.add("Aug");
		month.add("Sep");
		month.add("Oct");
		month.add("Nov");
		month.add("Dec");
		century.add("18");
		century.add("19");
		century.add("20");
		GregorianCalendar today=new GregorianCalendar();
		try
		{
			today.add(today.DATE,dft);
		}
		catch (IllegalArgumentException e)
		{
		}
		month.select(today.get(today.MONTH));
		date.setText(Integer.toString(today.get(today.DATE)));
		century.select(today.get(today.YEAR)/100-18);
		year.setText(Integer.toString(today.get(today.YEAR)%100));
		add(month);
		add(date);
		add(century);
		add(year);
	}

	public int getDate()
	{
		return (int)(new GregorianCalendar((century.getSelectedIndex()+18)*100+Integer.parseInt(year.getText()),month.getSelectedIndex(),Integer.parseInt(date.getText())).getTime().getTime()/86400000);
	}
}