import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.util.*;

public class Chess extends Applet
    implements ActionListener, AdjustmentListener
{
    public ChessBoard theBoard;
    //public Dimension boardSize;
    public Random rand;
    //public Panel boardPanel;
    public Panel controlPanel = new Panel ();
    public Label statusLabel = new Label ("Applet is loading, please wait...");
    public boolean debugging = false;
    public ChessSet chessSet;
    public ChessThread runThread = null;
    private ThreadGroup appTG;

    public void init ()
    {
	rand = new Random ();
	appTG = Thread.currentThread ().getThreadGroup ();

	setLayout (new BorderLayout(2, 2));

	setupControlPanel ();
	add ("South", controlPanel);
	//boardPanel = new Panel ();
	//add("Center", boardPanel);

	theBoard = new ChessBoard ();
	add ("Center", theBoard);

    }

    public void setupControlPanel ()
    {
	controlPanel.setLayout(new BorderLayout ());

	//center panel contains status label and speed scrollbars
	Panel midPanel = new Panel ();
	controlPanel.add ("Center", midPanel);
	midPanel.setLayout(new BorderLayout (2, 2));
	statusLabel.setAlignment (Label.CENTER);
	/*
	Font f = getFont ().deriveFont (Font.BOLD);
	statusLabel.setFont (f);
	*/
	midPanel.add ("North", statusLabel);
	Panel barsPanel = new Panel ();
	midPanel.add ("Center", barsPanel);

	Panel behaviorPanel = new Panel ();
	controlPanel.add ("West", behaviorPanel);
	Panel movementPanel = new Panel ();
	behaviorPanel.add ("West", movementPanel);
	movementPanel.setLayout (new BorderLayout ());
	movementPanel.add ("West", new Label ("Movement type:"));
	Panel checkboxPanel = new Panel ();
	movementPanel.add ("Center", checkboxPanel);
	checkboxPanel.setLayout(new GridLayout(3, 1));
	CheckboxGroup cbg = new CheckboxGroup ();
    }

    private void setupPieces ()
    {
	String filename;
	Image [] pics = new Image [12];
	for (int i = 0; i < 12; i ++) {
	    if (i / 6 == 0) {
		filename = "w_";
	    } else {
		filename = "b_";
	    }
	    switch (i % 6) {
	    case ChessPiece.ROOK:
		filename += "rook";
		break;
	    case ChessPiece.KNIGHT:
		filename += "knight";
		break;
	    case ChessPiece.BISHOP:
		filename += "bishop";
		break;
	    case ChessPiece.QUEEN:
		filename += "queen";
		break;
	    case ChessPiece.KING:
		filename += "king";
		break;
	    case ChessPiece.PAWN:
		filename += "pawn";
		break;
	    }

	    filename += ".gif";
	    pics [i] = getImage (getCodeBase (), filename);
	}	    
	    
	chessSet = new ChessSet (pics, theBoard);

	theBoard.setPieces (chessSet);
	theBoard.newGame ();
    }

    public boolean startedOnce = false;
    public void start ()
    {
	//boardSize = boardPanel.getSize ();
	repaint ();
	if (!startedOnce) {
	    startedOnce = true;
	    setupPieces ();
	}

	statusMsg ("Running...");
	/*
	if (runThread == null)
	{
	    System.out.println ("chess");
	    runThread = new ChessThread (appTG, theBoard);
	    System.out.println ("went");
	}
	runThread.start ();
	*/
	System.out.println ("bye bye");
    }

    public void stop ()
    {
    }

    public void paint (Graphics g)
    {
	//g.setColor (Color.black);
	//g.fillRect (0, 0, boardSize.width, boardSize.height);
	//if (theBoard != null)
	//    theBoard.draw (g);
    }

    public void statusMsg (String msg)
    {
	if (!debugging)
	{
	    statusLabel.setText ("Status:     " + msg);
	}
    }

    public void debugMsg (String msg)
    {
	debugging = true;
	statusLabel.setText ("Debug: " + msg);
    }

    public void action ()
    {
    }

	//////////////////////////////////////////
	//	ActionListener actions
	//////////////////////////////////////////
    public void actionPerformed (ActionEvent e)
    {
    }

	//////////////////////////////////////////
	//	AdjustmentListener actions
	//////////////////////////////////////////
    public void adjustmentValueChanged(AdjustmentEvent e)
    {
    }

};

class ChessThread extends Thread
{
    private ChessBoard board;
    private boolean running;
    
    ChessThread (ThreadGroup tg, ChessBoard cb)
    {
	super(tg, "Chess thread");
	this.board = cb;
	start();
    }

    public void run ()
    {
	running = true;

	while (running) {
	    board.repaint ();
	    
	    try 
            {
	        wait ();
	    }
	    catch (InterruptedException e)
	    {}
	}
    }

    public void kill ()
    {
	running = false;
    }
}


