
/* The heart of the UI interactivity.  This is where the consequences of all key presses are defined.
   
   Most key presses will result in an "Action", which is a client-distributed message. 
   But some results of the key press will be just local to this client (e.g. everything 
   to do with the tray, which is hidden from other users).
 */

function KeyIsDown()
{
    if ( Player.IsMyTurn() )
    {
        switch (event.keyCode)
        {
            case _KEYCODE_ARROW_LEFT:
                if (!Board.MovementOkay( new Point(Board.NextLeft(), Board.CursorRow()), tileLaidDown ))
                    break;
                Action.Add( "left" );
                break;
            case _KEYCODE_ARROW_RIGHT:
                if (!Board.MovementOkay( new Point(Board.NextRight(), Board.CursorRow()), tileLaidDown ))
                    break;
                Action.Add( "right" );
                break;
            case _KEYCODE_ARROW_UP:
                if (!Board.MovementOkay( new Point(Board.CursorCol(), Board.NextUp()), tileLaidDown ))
                    break;
                Action.Add( "up" );
                break;
            case _KEYCODE_ARROW_DOWN:
                if (!Board.MovementOkay( new Point(Board.CursorCol(), Board.NextDown()), tileLaidDown ))
                    break;
                Action.Add( "down" );
                break;

            case _KEYCODE_NUMBERS+1:
            case _KEYCODE_NUMBERS+2:
            case _KEYCODE_NUMBERS+3:
            case _KEYCODE_NUMBERS+4:
            case _KEYCODE_NUMBERS+5:
            case _KEYCODE_NUMBERS+6:
            case _KEYCODE_NUMBERS+7:
                var num = event.keyCode - _KEYCODE_NUMBERS;
                var trayTD = document.getElementById("trayCell"+num);
                var tile = TrayTile( trayTD );
                if (!tile)
                    break;  // an empty slot in your tray (ignore the key press)

                if (exchangeMode)
                {
                    if ( list_index( tileExchanging, trayTD ) >= 0 )
                        break;  // already in list

                    tileExchanging.push(trayTD);
                    tile.Raise();

                    Action.Add( "exchange" ); // just to let the other players know you have picked a tile to exchange (they cannot see what tile though).
                }
                else
                {
                    trayTD.tileInx = -1;
                    Action.Add( "laid", tile.scrabbleSetInx );

                    if (tile.letter == " ")
                    {
                        var oldFunc = document.body.onkeydown;
                        var letterDIV;

                        var popUp = new PopUp({
                                width: 200, 
                                height: 50, 
                                onOpen: function()
                                {
                                    letterDIV = AddNode( popUp.div, "DIV" );
                                    letterDIV.style.color = "red";
                                    letterDIV.style.fontSize = "18pt";
                                    letterDIV.style.position = "absolute";
                                    
                                    letterDIV.style.top = 21;
                                    letterDIV.style.left = 91;
                                }, 
                                onClose: function()
                                {
                                    document.body.onkeydown = oldFunc;
                                }, 
                                noCloseButton: true
                            });
                        popUp.SetTitle( "Choose Wildcard" );
                        popUp.SetPosition( PagePosition.Absolute( 200, 200 ) );
                        popUp.SetBody( 
"<CENTER>"+
"<img src='"+tile.imgNode.src+"' id='_tmpBlankTile'/><br><br>"+
"Type in a Letter, then press ENTER."+
"</CENTER>"
                            );
                        popUp.Open();
                        
                        document.body.onkeydown = function()
                        {
                            var key = event.keyCode;
                            if ( key == _KEYCODE_RETURN && letterDIV.innerHTML.length == 1 )
                            {
                                Action.Add( "wildcardPick", letterDIV.innerHTML );
                                popUp.Close();
                                return;
                            }
                            var c = String.fromCharCode(key);
                            if ( _KEYCODE_A <= key && key <= _KEYCODE_Z )
                                letterDIV.innerHTML = c.toUpperCase();
                        };
                    }
                }
                break;


           case _KEYCODE_X:
                if (exchangeMode)
                    break; // already in exchange mode
                if (tileLaidDown.length > 0)
                {
                    alert("If you wish to exchange tiles, first you must remove all the tiles you've lain down (press ESC for each tile).");
                    break;
                }

                Action.Add( "beginExchange" );
                break;

           case _KEYCODE_ESC:
                if ( tileLaidDown.length == 0 && exchangeMode == false )
                    break; // already escaped all the way back to the board

                if ( exchangeMode && tileExchanging.length > 0 )
                {
                    var lastExchangeTD = tileExchanging.pop();
                    var tile = TrayTile( lastExchangeTD );
                    tile.Lower(); // back to original position
                }

                Action.Add( "esc" );
                break;

           case _KEYCODE_SPACE:
                if ( tileLaidDown.length == 0 && tileExchanging.length == 0 )
                {
                    var okayToPass = confirm("Do you want to pass this turn?");
                    if (!okayToPass)
                        break;
                }
                if ( tileLaidDown.length > 0 && Board.Holes( tileLaidDown ) )
                {
                    alert( "There are holes." );
                    break;
                }

                Action.Add( "doneWithTurn" );
                break;



           case _KEYCODE_J:
                jumbleTray();
                break;

           case _KEYCODE_T:
                Action.Add( "typeFocus" );
                break;

           case _KEYCODE_C:
                mainMenu.Select(0);
                break;
           case _KEYCODE_G:
                mainMenu.Select(1);
                break;
           case _KEYCODE_S:
                mainMenu.Select(2);
                break;
           case _KEYCODE_I:
                mainMenu.Select(3);
                break;


           default:
                //window.status = "keyCode="+event.keyCode+" not valid";
                break;
        }
    }
    else
    {
        switch (event.keyCode)
        {
           case _KEYCODE_J:
                if ( IsConnected() )
                    jumbleTray();
                break;

           case _KEYCODE_T:
                if ( IsConnected() )
                    Action.Add( "typeFocus" );
                break;

           case _KEYCODE_C:
                mainMenu.Select(0);
                break;
           case _KEYCODE_G:
                mainMenu.Select(1);
                break;
           case _KEYCODE_S:
                mainMenu.Select(2);
                break;
           case _KEYCODE_I:
                mainMenu.Select(3);
                break;

           default:
                //window.status = "keyCode="+event.keyCode+" not valid";
                break;
        }
    }
}

var exchangeMode = false;
var tileExchanging = new Array();

var tileLaidDown = new Array(); // once you start laying down 2 or more tiles, you are either in a Veritical or Horizontal orientation.
