import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.util.Vector;

public class Chess extends Applet {
  public static void main(String args[]) {
    Applet applet = new Chess();
    Frame frame = new ChessFrame("Wei-Hwa Huang's Chess Applet",
       applet, 522, 615);
    // best: 512 585
  }
 
  // refreshes all images that need updating.
  private void refresh() {
    SquareCanvas temp;
    int newnum;
    for (int lcv=0;lcv<64;lcv++) {
      temp = (SquareCanvas)(cangroup.elementAt(lcv));
      newnum = translate(game.getlabel(lcv),lcv);
      if (newnum != temp.getImage()) {
        temp.setImage(newnum);
        temp.repaint();
      }
    }
  }

  private class MyListener implements ActionListener {
    public void actionPerformed(ActionEvent evt) {
      game.reset();
      refresh();
      String newmsg = game.getmessage();
      int perd = newmsg.indexOf('.');
      if (perd == -1) {
        message1.setText(newmsg);
        message2.setText("");
      } else {
        message1.setText(newmsg.substring(0,perd+1));
        message2.setText(newmsg.substring(perd+3));
      }
    }
  }
  
  private class MyMouseListener implements MouseListener {
    public void mouseClicked(MouseEvent e) {}
    public void mouseReleased(MouseEvent e) {}
    public void mouseEntered(MouseEvent e) {}
    public void mouseExited(MouseEvent e) {}
    public void mousePressed(MouseEvent e) {
      SquareCanvas temp = (SquareCanvas)e.getSource();
      int index = cangroup.indexOf(temp);
      if (game.pressed(index)) refresh();
      String newmsg = game.getmessage();
      int perd = newmsg.indexOf('.');
      if (perd == -1) {
        message1.setText(newmsg);
        message2.setText("");
      } else {
        message1.setText(newmsg.substring(0,perd+1));
        message2.setText(newmsg.substring(perd+3));
      }
    }
  }

  private int translate(String name,int index) {
    int answer;
    if (name.equals("-")) answer = 24; 
    else {
      String piecename = name.substring(2);
      if (piecename.equalsIgnoreCase("king")) answer = 0;
      else if (piecename.equalsIgnoreCase("queen")) answer = 4;
      else if (piecename.equalsIgnoreCase("bishop")) answer = 8;
      else if (piecename.equalsIgnoreCase("knight")) answer = 12;
      else if (piecename.equalsIgnoreCase("rook")) answer = 16;
      else if (piecename.equalsIgnoreCase("pawn")) answer = 20;
      else answer = 0;
      if (name.charAt(0) == 'B') answer += 2;
    }
    if ((index%8+index/8)%2 == 1) answer++;
    return(answer);
  }

  private class SquareCanvas extends Canvas {
    private Image myImage;
    private int imnum;
    public SquareCanvas(Image im) {
      myImage = im;
      imnum = -1;
    }
    public void setImage(int index) {
      myImage = imgroup[index]; 
      imnum = index;
    }
    public int getImage() {
      return(imnum);
    }
    public void paint(Graphics g) {
      Dimension dim = this.getSize();
      //g.drawImage(myImage,0,0,dim.width,dim.height,this);
      //g.drawImage(myImage,0,0,32,32,this);
      g.drawImage(myImage,0,0,this);
    }
  }

  private int clicks = 0;
  private Image imgroup[] = new Image[26];
  private Vector cangroup = new Vector(64);
  protected Chessgame game = new Chessgame();
  protected Label message1 = new Label("Welcome to Chess!  It is White's turn right now.");
  protected Label message2 = new Label("Please select a White piece to move by clicking on it.");

  // loads four images.
  private void loadkit (Toolkit t, String name, int start) {
    imgroup[start+0] = t.getImage("ww"+name+".GIF");
    imgroup[start+1] = t.getImage("wb"+name+".GIF");
    imgroup[start+2] = t.getImage("bw"+name+".GIF");
    imgroup[start+3] = t.getImage("bb"+name+".GIF");
  }

  public void init() {
    super.init();
    Panel playfield = new Panel();
    GridLayout grid = new GridLayout(8,8);
    playfield.setLayout(grid);
    MyListener listen = new MyListener();
    MyMouseListener mlisten = new MyMouseListener();
 
    // images
    Toolkit toolkit = Toolkit.getDefaultToolkit();
    loadkit(toolkit,"king",0);
    loadkit(toolkit,"queen",4);
    loadkit(toolkit,"bishop",8);
    loadkit(toolkit,"knight",12);
    loadkit(toolkit,"rook",16);
    loadkit(toolkit,"pawn",20);
    imgroup[24] = toolkit.getImage("wblank.GIF");
    imgroup[25] = toolkit.getImage("bblank.GIF");
    
    for (int lcv=0;lcv<64;lcv++) {
      SquareCanvas temp = new SquareCanvas(imgroup[0]);
      cangroup.addElement(temp);
      temp.addMouseListener(mlisten);
      playfield.add(temp);
    }
      
      Panel infobar = new Panel();

/*
      GridBagLayout gridbag = new GridBagLayout();
      infobar.setLayout(gridbag);
      GridBagConstraints c = new GridBagConstraints();
      c.gridheight=2;
      c.weightx=1;
      c.anchor=GridBagConstraints.CENTER;
      Button button = new Button("Reset");
      gridbag.setConstraints(button,c);
      button.addActionListener(listen);
      infobar.add(button);
      c.gridheight=1;
      c.weightx=7;
      c.anchor=GridBagConstraints.WEST;
      c.gridwidth=GridBagConstraints.REMAINDER;
      gridbag.setConstraints(message1,c);
      infobar.add(message1);
      gridbag.setConstraints(message2,c);
      infobar.add(message2);

      FlowLayout flow = new FlowLayout(FlowLayout.LEFT);
      infobar.setLayout(flow);
      Button button = new Button("Reset");
      button.addActionListener(listen);
      infobar.add(button);
      infobar.add(message1);
      infobar.add(message2);
*/

      GridLayout gd = new GridLayout(3,1);
      infobar.setLayout(gd);
      Button button = new Button("Reset");
      button.addActionListener(listen);
      infobar.add(button);
      infobar.add(message1);
      infobar.add(message2);

    setLayout(new BorderLayout());
    add("Center",playfield);
    add("North",infobar);

    game.reset();
    refresh();
  }
}

class ChessFrame extends Frame {

  private static class WinCloser extends WindowAdapter
  {
    public void windowClosing(WindowEvent e)
    {
      System.out.println("Searching for Bobby Fischer, eh?");
      System.exit(0);                     // terminate application normally
    }
  }

  public ChessFrame(String title, Applet applet, int width, int height) {
    super(title);
    addWindowListener(new WinCloser());
    setLayout(new BorderLayout());
    add("Center", applet);
    Button qbutton = new Button("Quit");
    qbutton.addActionListener(new QuitListener());
    add("South", qbutton);
    pack();
    setSize(width, height);
    setVisible(true);

    applet.init();
    applet.start();
  }

  private class QuitListener implements ActionListener {
    private void Quit() {
      System.out.println("Searching for Bobby Fischer, eh?");
      System.exit(0);                     // terminate application normally
    }
    public void actionPerformed(ActionEvent evt) {
      Quit();
    }
  }
}

