import java.applet.Applet;
import java.applet.AppletContext;
import java.awt.*;
import java.util.HashMap;
import java.net.MalformedURLException;
import java.net.URL;

import org.web3d.x3d.sai.*;
import org.xj3d.sai.*;

/**
 * An example class showing how to deploy the Xj3D Browser as an applet.
 * 
 * @author chris
 * 
 */
public class Xj3DAppletTutorial4 extends Applet implements Xj3DAnchorListener {

	Xj3DBrowser browser;
	boolean linkClicked;

	public Xj3DAppletTutorial4() {
	}

	// Methods from Applet

	public void init() {
		setLayout(new BorderLayout());
		browser = (Xj3DBrowser) getBrowser();
		browser.setAnchorListener(this);
		linkClicked = false;
		loadScene();
	}

	// Local methods

	// Generate the browser
	private ExternalBrowser getBrowser() {
		HashMap<String, Boolean> requestedParameters = new HashMap<String, Boolean>();
		requestedParameters.put("Xj3D_ConsoleShown", Boolean.TRUE);
		requestedParameters.put("Xj3D_LocationShown", Boolean.FALSE);

		X3DComponent comp = BrowserFactory
				.createX3DComponent(requestedParameters);
		Xj3DBrowser browser = (Xj3DBrowser) comp.getBrowser();

		setBackground(Color.blue);
		add((Component) comp, BorderLayout.CENTER);
		setVisible(Boolean.TRUE);

		return browser;
	}

	// Create the scene implementation and add it to the world
	private void loadScene() {
		X3DScene mainScene = browser
				.createX3DFromURL(new String[] { getParameter("modelURL") });
		browser.replaceWorld(mainScene);
	}

	// Methods defined by Xj3DAnchorListener

	public boolean processLinkActivation(String[] url, String[] param) {
		AppletContext appletContext = getAppletContext();
		String description = "Loading... " + url[0];
		appletContext.showStatus(description);
		try {
			appletContext.showDocument(new URL(url[0]), param[0]);
		} catch (MalformedURLException mue) {
			System.out.println("Invalid URL: " + url[0] + ".\n"
					+ mue.getStackTrace());
			return false;
		}
		X3DScene scene = (X3DScene) browser.getExecutionContext();
		SFColor color = (SFColor) scene.getNamedNode("material").getField(
				"diffuseColor");
		MFString link = (MFString) scene.getNamedNode("anchor").getField("url");
		if (linkClicked) {
			color.setValue(new float[] {0f, 1f, 0f});
			link.setValue(1, new String[] {"http://www.xj3d.org/applet_test/frames/frame_blue.html"});
		} else {
			color.setValue(new float[] {0f, 0f, 1f});
			link.setValue(1, new String[] {"http://www.xj3d.org/applet_test/frames/frame_green.html"});
		}
		
		linkClicked = !linkClicked;
		return true;
	}
}
