content: package com.aicontest.visualizer;
  
  import java.applet.Applet;
  import java.awt.Color;
  import java.awt.Graphics;
  import java.awt.Panel;
  import java.net.MalformedURLException;
  import java.net.URL;
  
  import netscape.javascript.JSObject;
  
  import org.mozilla.javascript.ScriptableObject;
  import org.mozilla.javascript.Undefined;
  
  import com.aicontest.visualizer.js.dom.HTMLDocument;
  
  @SuppressWarnings("serial")
  public class VisualizerApplet extends Applet implements Runnable,
  		IVisualizerUser {
  
  	private URL replay;
  	private String replayStr;
  	private Thread thread;
  	private Visualizer webWrapper;
  
  	@Override
  	public void init() {
  		replayStr = getParameter("replay_string");
  		if (replayStr != null) {
  			replayStr = replayStr.replace("\\n", "\n");
  		} else {
  			try {
  				replay = new URL(getDocumentBase(), getParameter("replay"));
  			} catch (MalformedURLException e) {
  				e.printStackTrace();
  			}
  		}
  		setBackground(Color.WHITE);
  		setFocusable(true);
  	}
  
  	@Override
  	public void start() {
  		if (thread == null) {
  			thread = new Thread(this);
  			thread.start();
  		}
  	}
  
  	public void update(Graphics g) {
  		paint(g);
  	}
  
  	public synchronized void paint(Graphics g) {
  		if (webWrapper != null) {
  			webWrapper.paint(g);
  		}
  	}
  
  	public String getAppletInfo() {
  		return "This applet simulates a JavaScript web environment to run an aichallenge visualizer.";
  	}
  
  	public void run() {
  		try {
  			final JSObject jsRoot = JSObject.getWindow(this);
  			webWrapper = new Visualizer(this, getWidth(), getHeight(), false);
  			webWrapper.setJsRoot(jsRoot);
  			HTMLDocument document = webWrapper.getDomWindow().getDocument();
  			ScriptableObject options = webWrapper.construct("Options", null);
  			Object config = null;
  			String configString = getParameter("configOverrides");
  			if (configString != null) {
  				config = webWrapper.parseJSON(configString);
  			}
  			for (Object id : options.getIds()) {
  				String param = getParameter(id.toString());
  				if (param != null) {
  					Object old = options.get(id.toString(), options);
  					if (old instanceof Boolean) {
  						options.put(id.toString(), options,
  								"true".equals(param) || "1".equals(param));
  					} else if (old instanceof Double) {
  						options.put(id.toString(), options,
  								Double.parseDouble(param));
  					} else {
  						options.put(id.toString(), options, param);
  					}
  				}
  			}
  			options.put("data_dir", options, "/");
  			options.put("embedded", options, true);
  			ScriptableObject vis = webWrapper.construct("Visualizer",
  					new Object[] { document, options, Undefined.instance,
  							Undefined.instance, config });
  			if (replayStr != null) {
  				webWrapper.invoke(vis, "loadReplayData",
  						new Object[] { replayStr });
  			} else {
  				webWrapper.invoke(vis, "loadReplayDataFromURI",
  						new Object[] { replay });
  			}
  			addKeyListener(webWrapper);
  			webWrapper.loop();
  		} catch (Exception e) {
  			e.printStackTrace();
  		}
  	}
  
  	@Override
  	public String getJavaScriptPath() {
  		return null;
  	}
  
  	@Override
  	public IProgram getProgram() {
  		final Ants ants = new Ants();
  		return ants;
  	}
  
  	@Override
  	public void setVisualizerPanel(Panel visualizerPanel, boolean resizable) {
  		visualizerPanel.setSize(getWidth(), getHeight());
  		Thread.currentThread().isInterrupted();
  		add(visualizerPanel);
  	}
  
  	@Override
  	public boolean setFullScreen(boolean enable) {
  		return false;
  	}
  
  }