// Decompiled by Jad v1.5.7f. Copyright 2000 Pavel Kouznetsov.
// Jad home page: http://www.geocities.com/SiliconValley/Bridge/8617/jad.html
// Decompiler options: packimports(3) 
// Source File Name:   Client.java

package Scrabble;

import KennethTam.Debug;
import java.applet.Applet;
import java.awt.*;
import java.io.DataInputStream;
import java.io.PrintStream;
import java.net.*;
import java.util.StringTokenizer;

// Referenced classes of package Scrabble:
//            Board, ButtonPanel, ClientGameState, Rack

public class Client extends Applet
    implements Runnable
{

    public Client()
    {
    }

    public void init()
    {
        System.out.println("Applet init()");
        disableUI();
        _fConnected = false;
        _fComputerGame = false;
        _runner = null;
        _UIPanel = new Panel();
        _GamePanel = new Panel();
        _scorePanel = new Panel();
        _fontH24B = new Font("Helvetica", 1, 24);
        _fontTR14 = new Font("TimesRoman", 0, 14);
        _board = new Board(this);
        _rack = new Rack(this);
        _messages = new TextArea();
        _buttonPanel = new ButtonPanel();
        _btnNewGame = new Button("New Game");
        _btnSubmitMove = new Button("Submit Move");
        _btnDisable = new Button("Computer vs. Computer");
        setLayout(new GridLayout(1, 2, 10, 10));
        add(_GamePanel);
        add(_UIPanel);
        _GamePanel.setLayout(new BorderLayout());
        _GamePanel.add("North", _board);
        _GamePanel.add("South", _rack);
        _GamePanel.add("Center", _scorePanel);
        _scorePanel.setLayout(new FlowLayout());
        _scoreLabels = new Label[4];
        for(int i = 0; i < 4; i++)
        {
            _scoreLabels[i] = new Label("0000");
            _scoreLabels[i].setFont(_fontTR14);
            _scorePanel.add(_scoreLabels[i]);
        }

        _titleLabel = new Label("Scrabble", 1);
        _titleLabel.setFont(_fontH24B);
        _UIPanel.setLayout(new BorderLayout());
        _UIPanel.add("North", _titleLabel);
        _UIPanel.add("South", _buttonPanel);
        _buttonPanel.setLayout(new FlowLayout(1));
        _buttonPanel.add(_btnNewGame);
        _buttonPanel.add(_btnSubmitMove);
        _buttonPanel.add(_btnDisable);
        _UIPanel.add("Center", _messages);
        _tilesImg = loadImg("tiles.gif", this);
        _gameState = new ClientGameState(this);
        System.out.println("About to establish connection.");
        try
        {
            URL url = getCodeBase();
            System.out.println("Client is coming from: " + url);
            String s = url.getHost();
            InetAddress inetaddress = InetAddress.getByName(s);
            System.out.println("Client is coming off host: " + s + ", IP=" + inetaddress);
            _socket = new Socket(inetaddress, 5005);
            _inStream = new DataInputStream(_socket.getInputStream());
            _outStream = new PrintStream(_socket.getOutputStream());
            for(int j = 0; j < 10; j++)
            {
                String s1 = _inStream.readLine();
                StringTokenizer stringtokenizer = new StringTokenizer(s1);
                if(stringtokenizer.countTokens() != 2 || !stringtokenizer.nextToken().equals("S"))
                    continue;
                String s2 = stringtokenizer.nextToken();
                if(s2.equals("READY"))
                {
                    _messages.appendText("Connected to server.  Requesting a new game...\n");
                    _fConnected = true;
                    sendMessage("C NEWGAME");
                } else
                {
                    _messages.appendText("Server too busy, reload later.\n");
                }
                break;
            }

        }
        catch(UnknownHostException _ex)
        {
            _messages.appendText("Requested server unknown.\n");
            System.out.println("Attempted to connect to unknown host!");
        }
        catch(SocketException _ex)
        {
            _messages.appendText("Requested server is not in service.  Please try an alternate server!\n");
            System.out.println("Server not running!");
        }
        catch(Exception exception)
        {
            _messages.appendText("Exception in init: " + exception.getMessage() + "\n");
            System.out.println("Exception in init: " + exception.getMessage());
            exception.printStackTrace();
        }
        if(_fConnected)
            enableUI();
    }

    public void start()
    {
        System.out.println("Applet start()");
        if(_runner == null)
        {
            _runner = new Thread(this);
            _runner.start();
            return;
        }
        if(_runner.isAlive())
            _runner.resume();
    }

    public void stop()
    {
        System.out.println("Applet stop()");
        if(_runner != null && _runner.isAlive())
            _runner.suspend();
    }

    public void destroy()
    {
        System.out.println("Applet destroy()");
        if(_runner != null)
        {
            _runner.stop();
            _runner = null;
        }
    }

    public void enableUI()
    {
        enable();
    }

    public void disableUI()
    {
        disable();
    }

    public void sendMessage(String s)
    {
        Debug.assert(_outStream != null, "No output stream!");
        disableUI();
        System.out.println("Sending message: " + s);
        _outStream.println(s);
    }

    public boolean keyDown(Event event, int i)
    {
        return true;
    }

    public boolean action(Event event, Object obj)
    {
        if(event.target instanceof Button)
            handleButton((String)obj);
        return true;
    }

    private void handleButton(String s)
    {
        if(s.equals("New Game"))
        {
            _messages.appendText("Requesting a new game...\n");
            sendMessage("C NEWGAME");
        }
        if(s.equals("Submit Move"))
            if(_gameState.isMyTurn())
            {
                if(!_gameState.isMoveLegal())
                {
                    _messages.appendText("Illegal move!\n");
                } else
                {
                    _messages.appendText("Submitting move.\n");
                    sendMessage(_gameState.submitMove());
                }
            } else
            {
                _messages.appendText("Not your turn!\n");
            }
        if(s.equals("Computer vs. Computer"))
        {
            _messages.appendText("Requesting a computer vs. computer game...\n");
            sendMessage("C COMPUTERGAME");
        }
    }

    public void run()
    {
        try
        {
            while(true) 
            {
                String s = _inStream.readLine();
                disableUI();
                StringTokenizer stringtokenizer = new StringTokenizer(s);
                int l = stringtokenizer.countTokens();
                String as[] = new String[l];
                System.out.println(" Got a message");
                if(l == 0)
                {
                    System.out.println("  Message is empty");
                } else
                {
                    for(int i = 0; i < l; i++)
                        as[i] = stringtokenizer.nextToken();

                    if(as[0].equals("S"))
                    {
                        if(as[1].equals("NEWGAME_ACK"))
                        {
                            System.out.println(" Msg is NEWGAME_ACK - I am player #" + as[2] + " of " + as[3]);
                            _messages.appendText("..new game initiated.\n");
                            _gameState.beginNewGame();
                            _gameState.setPlayerInfo(Integer.parseInt(as[2]), Integer.parseInt(as[3]));
                            sendMessage("C REFRESH");
                        } else
                        if(as[1].equals("REFRESH_BEGIN"))
                        {
                            System.out.println(" Msg is REFRESH_BEGIN");
                            _gameState.dropActiveTile();
                            do
                            {
                                String s1 = _inStream.readLine();
                                StringTokenizer stringtokenizer1 = new StringTokenizer(s1);
                                int i1 = stringtokenizer1.countTokens();
                                as = new String[i1];
                                for(int j = 0; j < i1; j++)
                                    as[j] = stringtokenizer1.nextToken();

                                if(as[1].equals("TURNNUM"))
                                    _gameState.setTurnNum(Integer.parseInt(as[2]));
                                else
                                if(as[1].equals("CURRENTPLAYER"))
                                    _gameState.setCurrentPlayer(Integer.parseInt(as[2]));
                                else
                                if(as[1].equals("SCORESTATE"))
                                    _gameState.setScores(s1);
                                else
                                if(as[1].equals("RACKSTATE"))
                                {
                                    if(_gameState.getPlayerNum() == Integer.parseInt(as[2]))
                                    {
                                        int j1 = i1 - 3;
                                        String s2 = new String("");
                                        for(int k = 0; k < j1; k++)
                                            s2 = s2 + as[3 + k] + " ";

                                        _rack.setContents(s2);
                                    }
                                } else
                                if(as[1].equals("BOARDSTATE"))
                                    _board.setRow(s1);
                                else
                                if(as[1].equals("MESSAGE"))
                                    _messages.appendText(s1.substring(10) + "\n");
                            } while(!as[1].equals("REFRESH_END"));
                            repaint();
                        } else
                        if(as[1].equals("COMPUTERGAME_BEGIN"))
                        {
                            System.out.println(" Msg is COMPUTERGAME_BEGIN");
                            _messages.appendText("..computer vs. computer game initiated.\n");
                            _fComputerGame = true;
                            _gameState.beginNewGame();
                            _gameState.setPlayerInfo(Integer.parseInt(as[2]), Integer.parseInt(as[3]));
                        } else
                        if(as[1].equals("COMPUTERGAME_END"))
                        {
                            System.out.println(" Msg is COMPUTERGAME_END");
                            _messages.appendText("Computer vs. computer game finished.\n");
                            _fComputerGame = false;
                        }
                        if(!_fComputerGame)
                            enableUI();
                    }
                }
            }
        }
        catch(Exception exception)
        {
            System.out.println("Client::Run exception " + exception);
        }
    }

    public Image loadImg(String s, Component component)
    {
        Image image = null;
        try
        {
            MediaTracker mediatracker = new MediaTracker(component);
            image = getImage(getDocumentBase(), s);
            mediatracker.addImage(image, 1);
            mediatracker.waitForID(1);
        }
        catch(InterruptedException _ex)
        {
            System.out.println("Interrupted exception loading image");
        }
        return image;
    }

    public void paint(Graphics g)
    {
        _board.repaint();
        _rack.repaint();
    }

    public Insets insets()
    {
        return new Insets(10, 10, 10, 10);
    }

    public Board _board;
    public Rack _rack;
    public TextArea _messages;
    public Label _titleLabel;
    public Panel _UIPanel;
    public Panel _GamePanel;
    public Panel _scorePanel;
    public ButtonPanel _buttonPanel;
    public Button _btnNewGame;
    public Button _btnSubmitMove;
    public Button _btnDisable;
    public Label _scoreLabels[];
    public Image _tilesImg;
    public Font _fontH24B;
    public Font _fontTR14;
    public Socket _socket;
    public DataInputStream _inStream;
    public PrintStream _outStream;
    public boolean _fConnected;
    public Thread _runner;
    public ClientGameState _gameState;
    public boolean _fComputerGame;
}
