import java.applet.*;
import java.awt.*;

public class Puzzle extends Applet
{
	private Button shuffleButton10 = new Button("10 x Verschieben");
	private Button shuffleButton100 = new Button("100 x Verschieben");
	private Button restoreButton = new Button("Neues Spiel");
	private Button helpButton = new Button("Spielregeln");
	private PuzzleField field;
	private Color back;
    private Panel toolbar;
    private boolean started;
    
    public boolean isStarted()
    {
        return started;
    }
    
    private String getStringParam(String name, String defaultValue)
	{
        String param = getParameter(name);
        if (param == null) return defaultValue;
        return param;
    }

    private int getIntParam(String name, int defaultValue)
	{
        String param = getParameter(name);
        if (param == null) return defaultValue;
        return (Integer.parseInt(param));
    }
    
    /**
     * Liest ein param als int ein, wobei die Zahlenbasis angegeben werden kann.
     */
    private int getInt(String name, int def, int radix)
    {
        String param = getParameter(name);
        return param == null ? def : Integer.parseInt(param, radix);
    }

    // Bild holen und warten, bis es geladen ist
    private Image loadImage(String imageName)
	{

        // Bild holen
        Image image = getImage(getDocumentBase(), imageName);

        // ein MediaTracker-Objekt anlegen und das Bild davon kontrollieren lassen
        MediaTracker tracker = new MediaTracker(this);
        tracker.addImage(image, 0);

        // solange warten, bis das Bild vollständig geladen ist
        try {
            tracker.waitForID(0);
        } catch (InterruptedException e) { }

        // Referenz auf das Bild zurückliefern
        return image;
    }

    // Applet initialisieren
    public void init()
	{
        back = new Color(getInt("background", 0xc0c0c0, 16));
        setBackground(back);

        // Layout für das Applet ändern
        setLayout(new BorderLayout());

        // die Toolbar erzeugen und im Norden des Applets positionieren
        toolbar = new Panel(new GridLayout(1, 0));
        add(BorderLayout.NORTH, toolbar);

        // das Spielfeld auf einem Panel plaziert in dem Applet zentriert anzeigen
		field = new PuzzleField(this,
		    loadImage(getStringParam("image", "desert.jpg")),
		    getIntParam("gridx", 4),
		    getIntParam("gridy", 3),
		    getIntParam("gapx", 2),
		    getIntParam("gapy", 2),
		    getIntParam("borderx", 4),
		    getIntParam("bordery", 4));
        Panel center = new Panel(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();;
		center.add(field, c);
        add(BorderLayout.CENTER, center);
        newGame();
    }
    
    public void startGame()
    {
        started = true;
        toolbar.removeAll();
        toolbar.add(restoreButton);
        toolbar.add(helpButton);
        validate();
    }

    public void newGame()
    {
        started = false;
        toolbar.removeAll();
        toolbar.add(shuffleButton10);
        toolbar.add(shuffleButton100);
        toolbar.add(helpButton);
        validate();
    }

    // testet die Schaltflächen
    public boolean handleEvent(Event evt)
	{
        // nur näher testen, wenn die Nachricht ACTION_EVENT aufgetreten war
        if (evt.id==Event.ACTION_EVENT)
		{
            if (evt.target == shuffleButton10) {
				field.shuffle(10);
				startGame();
            } else if (evt.target == shuffleButton100) {
				field.shuffle(100);
				startGame();
            } else if (evt.target == restoreButton) {
				field.restore();
				newGame();
            } else if (evt.target == helpButton) {
                PuzzleHelpDialog.showIt("Puzzle Spielregeln",
"Ziel des Spiels ist es, das Bild wieder\n" +
"in die ursprüngliche Anordnung zu\n" +
"bringen. \n" +
"\n" +
"Mischen Sie das Puzzle dazu\n" +
"zunächst mit den Schaltflächen\n" +
"'10 x Verschieben' oder\n" +
"'100 x Verschieben'. Anschließend klicken Sie \n" +
"auf diejenigen Puzzleteile, die Sie\n" +
"verschieben möchten.\n");
			}
        }

        // Status der Nachrichten-Behandlungs-Methode der Basisklasse zurückliefern
        return super.handleEvent(evt);
    }
}
