import java.io.*;
import java.awt.*;
import java.applet.*;
import vrml.external.*;
import vrml.external.field.*;
// import vrml.external.exception.*; 
// import netscape.plugin.*; 
// import netscape.javascript.*; 
// import netscape.plugin.Plugin; 
// import netscape.javascript.JSObject; 
// import netscape.javascript.JSException;

public class solarsys extends Applet implements EventOutObserver {

//	private Button sunlight;
//	private Button orbit;
//	private Scrollbar uzeit;
//	private Scrollbar rzeit;
	private Scrollbar scaleX;
	private Scrollbar scaleP;	
	private TextField FieldSelected;
	private Scrollbar colorR ,colorG, colorB;
//	private Node[] planet;
	private Node System;
	private Node Merkur;
	private Node Venus;
//	private Node Erde;
	private Node Mars;
	private Node Jupiter;
	private Node Saturn;
	private Node Uranus;
	private Node Neptun;
	private Node Pluto;
	private Node selectedPlanet = null;

	public void init() {
		setLayout(null);
		addNotify();

		FieldSelected = new TextField("none"); FieldSelected.setEditable(false);
		FieldSelected.reshape(80, 20, 100, 24); add(FieldSelected);

		colorR = new Scrollbar(Scrollbar.HORIZONTAL, 0, 10, 0, 100);
		colorR.reshape(100, 90, 200, 20); add(colorR);
		colorG = new Scrollbar(Scrollbar.HORIZONTAL, 0, 10, 0, 100);
		colorG.reshape(100, 120, 200, 20); add(colorG);
		colorB = new Scrollbar(Scrollbar.HORIZONTAL, 0, 10, 0, 100);
		colorB.reshape(100, 150, 200, 20); add(colorB);

		scaleX = new Scrollbar(Scrollbar.HORIZONTAL, 0, 8, 20, 100);
		scaleX.reshape(500, 60, 200, 20); add(scaleX);
		scaleP = new Scrollbar(Scrollbar.HORIZONTAL, 0, 8, 20, 100);
		scaleP.reshape(500, 120, 200, 20); add(scaleP);

		Label l;
		l = new Label("Planet:");	l.reshape(20, 20, 50, 20);   add(l);
		l = new Label("Color:");	l.reshape(30, 60, 40, 20);   add(l);
		l = new Label("red:");		l.reshape(40, 90, 40, 20);   add(l);
		l = new Label("green:");	l.reshape(40, 120, 40, 20);  add(l);
		l = new Label("blue:");		l.reshape(40, 150, 40, 20);  add(l);
		l = new Label("Physics:");	l.reshape(400, 20, 40, 20);  add(l);
		l = new Label("Planet:");	l.reshape(410, 40, 40, 20);  add(l);
		l = new Label("Radius:");	l.reshape(420, 60, 40, 20);  add(l);
		l = new Label("Solar System:");	l.reshape(410, 80, 40, 20); add(l);
		l = new Label(" Sun-Planet-Ratio:");l.reshape(420,100, 40, 20); add(l);

		Browser browser = Browser.getBrowser(this);

		System = new Node();		
		Merkur = new Node();
		Venus = new Node();
//		Erde = new Node();
		Mars = new Node();
		Jupiter = new Node();
		Saturn = new Node();
		Uranus = new Node();
		Neptun = new Node();
		Pluto = new Node();

			System = browser.getNode("System");
			Merkur = browser.getNode("Merkur");
			Merkur.getEventOut("pselected").advise(this, new Integer(0));
			Venus = browser.getNode("Venus");
			Venus.getEventOut("pselected").advise(this, new Integer(1));
//			Erde = browser.getNode("Erde");
//			Erde.getEventOut("pselected").advise(this, new Integer(0));
			Mars = browser.getNode("Mars");
			Mars.getEventOut("pselected").advise(this, new Integer(2));
			Jupiter = browser.getNode("Jupiter");
			Jupiter.getEventOut("pselected").advise(this, new Integer(3));
			Saturn = browser.getNode("Saturn");
			Saturn.getEventOut("pselected").advise(this, new Integer(4));
			Uranus = browser.getNode("Uranus");
			Uranus.getEventOut("pselected").advise(this, new Integer(5));
			Neptun = browser.getNode("Neptun");
			Neptun.getEventOut("pselected").advise(this, new Integer(6));
			Pluto = browser.getNode("Pluto");
			Pluto.getEventOut("pselected").advise(this, new Integer(7));

//			planet[i] = browser.getNode("planet" + (new Integer(i)).toString());
//			planet[i].getEventOut("pselected").advise(this, new Integer(i));
	}
	public void callback(EventOut active, double timestamp, Object idx) {
		if (((EventOutSFBool) active).getValue()) {
			int intIdx = ((Integer) idx).intValue();
			switch (intIdx) {
				case 0: FieldSelected.setText("Merkur");  selectedPlanet = Merkur; break;
				case 1: FieldSelected.setText("Venus");   selectedPlanet = Venus; break;
//				case 2: FieldSelected.setText("Erde");    selectedPlanet = Erde; break;
				case 2: FieldSelected.setText("Mars");    selectedPlanet = Mars; break;
				case 3: FieldSelected.setText("Jupiter"); selectedPlanet = Jupiter; break;
				case 4: FieldSelected.setText("Saturn");  selectedPlanet = Saturn; break;
				case 5: FieldSelected.setText("Uranus");  selectedPlanet = Uranus; break;
				case 6: FieldSelected.setText("Neptun");  selectedPlanet = Neptun; break;
				case 7: FieldSelected.setText("Pluto");
			}
//			selectedPlanet = planet[intIdx];
			getPlanetValues();
		}
	}

	public void getSystemValues() {
		float[] scale = ((EventOutSFVec3f) System.getEventOut("scale-changed")).getValue();
		scaleP.setValue((int) (scale[0] * 100));
	}
	public void setSystemValues() {
		float[] scale = new float[3];
		scale[0] = (((float) scaleP.getValue()) / 50) * (((float) scaleP.getValue()) / 50);
		scale[1] = (((float) scaleP.getValue()) / 50) * (((float) scaleP.getValue()) / 50);
		scale[2] = (((float) scaleP.getValue()) / 50) * (((float) scaleP.getValue()) / 50);
		((EventInSFVec3f) System.getEventIn("set_scale" )).setValue(scale);
	}

	public void getPlanetValues() {
		float[] col = ((EventOutSFColor) selectedPlanet.getEventOut("col")).getValue();
//		float size  = ((EventOutSFFloat) selectedPlanet.getEventOut("size")).getValue();
		float[] size= ((EventOutSFVec3f) selectedPlanet.getEventOut("size")).getValue();
		colorR.setValue((int) (col[0] * 100));
		colorG.setValue((int) (col[1] * 100));
		colorB.setValue((int) (col[2] * 100));
//		radius.setValue((int) (size    * 100));
		scaleX.setValue((int) ((size[0] * 100)-50));
//		scaleY.setValue((int) (size[1] * 10));
//		scaleZ.setValue((int) (size[2] * 10));
	}
	private void setPlanetValues() {
		if (selectedPlanet != null) {
			float[] col = new float[3];
			float[] size = new float[3];
//			float size = new float;
//			float size;
			col[0] = ((float) colorR.getValue()) / 100;
			col[1] = ((float) colorG.getValue()) / 100;
			col[2] = ((float) colorB.getValue()) / 100;
			size[0] = (((float) scaleX.getValue()) / 10) * (((float) scaleX.getValue()) / 10);
			size[1] = (((float) scaleX.getValue()) / 10) * (((float) scaleX.getValue()) / 10);
			size[2] = (((float) scaleX.getValue()) / 10) * (((float) scaleX.getValue()) / 10);
//			size = ((float) radius.getValue()) / 100;
			((EventInSFColor) selectedPlanet.getEventIn("col")).setValue(col);
			((EventInSFVec3f) selectedPlanet.getEventIn("size" )).setValue(size);
//			((EventInSFFloat) selectedPlanet.getEventIn("size" )).setValue(size);
		}
	}
	public boolean handleEvent(Event e) {
		if ((e.id == Event.SCROLL_LINE_UP) || (e.id == Event.SCROLL_LINE_DOWN) ||
		    (e.id == Event.SCROLL_PAGE_UP) || (e.id == Event.SCROLL_PAGE_DOWN) ||
		    (e.id == Event.SCROLL_ABSOLUTE)) {
			setPlanetValues();
			setSystemValues();
			return true;
		}
		return false;
	}
}