var gameUrl="http://"+window.location.host+"/yabble/game.php";var entryUrl="http://"+window.location.host+"/yabble/index.php";var rpcUrl="/yabble/RPC.php";var debugMode=false;window.onload=function(){if($("board")!=null){Game.Init()}if($("gameslist")!=null){PreGameEnvironment.Init()}};var PreGameEnvironment={Init:function(){PreGameEnvironment.ListGames();Event.observe("creategameform","submit",function(a){Game.Create();Event.stop(a)});Event.observe("joingameform","submit",function(a){Game.Join();Event.stop(a)});Event.observe("demogameform","submit",function(a){Game.Demo();Event.stop(a)})},ListGames:function(){Communicator._RemoteCall("Game::ListAll",[],function(d){var e=d.evalJSON();var c=$("gameslist");for(var b=0;b<e.length;b++){var a=document.createElement("span");Event.observe(a,"click",PreGameEnvironment.JoinGameForm);a.innerHTML=e[b];c.appendChild(a)}})},JoinGameForm:function(b){$("joingamename").value=Event.element(b).innerHTML;$("joingamepassword").focus();var a=Cookie.get("playername");if(a){$("joinplayername").value=a}}};var Dashboard={scores:{},ShowInfo:function(a){$("infoBox").innerHTML="<span>"+a+"</span>";$("infoBox").style.display="block"},HideInfo:function(){$("infoBox").innerHTML="";$("infoBox").style.display="none"},Init:function(){var e=$("gamelabel");e.innerHTML="<strong>"+Cookie.get("gamename")+"</strong>";var c=$("challengeBox");c.addClassName("leightbox");c.innerHTML='<span id="challengeBoxText">Do you want to challenge any of the words: <span id="challengeWords"></span></span><br /><br />';var h=$("dashboard");h.style.visibility="hidden";var d=$("scoreboardHeading");d.innerHTML="<strong>Score:</strong>";var b=$("scoreboard");b.readOnly=true;var f=$("infoBox");f.style.display="none";var g=document.createElement("input");g.type="button";g.id="challengeBoxYesButton";g.value="Yes";var a=document.createElement("input");a.id="challengeBoxNoButton";a.type="button";a.value="No";c.appendChild(g);c.appendChild(document.createTextNode(" "));c.appendChild(a);Event.observe(g,"click",function(){g.disabled=true;a.disabled=true;var k=$("challengeWordsList").innerHTML;var l=k.split(",");for(var j=0;j<l.length;j++){l[j]=l[j].trim()}Communicator._RemoteCall("Game::ChallengeLastMove",[Cookie.get("gamename"),l],function(i){Turn.lightBox.deactivate();g.disabled=false;a.disabled=false})});Event.observe(a,"click",function(){g.disabled=true;a.disabled=true;Communicator._RemoteCall("Game::DeclineChallengeOption",[Cookie.get("gamename")],function(i){Turn.lightBox.deactivate();g.disabled=false;a.disabled=false})});c.style.zIndex=6000;Dashboard._AddStartButton()},Update:function(){Communicator._RemoteCall("Game::Info",[Cookie.get("gamename")],function(f){$("dashboard").style.visibility="hidden";var d=f.evalJSON();var a=d.moves;Dashboard.ClearScore();var g,h;for(var e=0;e<a.length;e++){if(!a[e][2]){g=["SWAP TILES"];h=null}else{g=a[e][2];h=a[e][1]}var j=a[e][0];Dashboard.AddScore(j,h,g)}var c=d.players;var b=d.currentMove;Dashboard.SetPlayers(c,b);$("dashboard").style.visibility="visible";if($("challengeBox").getStyle("display")!="none"||$("challengeBox").getStyle("visibility")!="hidden"){$("challengeBoxNoButton").focus()}})},SetPlayers:function(d,g){var e=$("players");e.innerHTML='<strong id="playersHeading">Players:</strong>';for(var b=0;b<d.length;b++){var a=d[b][0];var f=d[b][1];Dashboard.scores[a]=f;var c=(a.toUpperCase()==Game.playername.toUpperCase())?"self":"";if(a==g){c+=" current";c=(c!="")?' class="'+c+'"':"";e.innerHTML+="<span"+c+">\u00BB "+a+" ("+f+")</span>"}else{c=(c!="")?' class="'+c+'"':"";e.innerHTML+="<span"+c+">&nbsp;&nbsp; "+a+" ("+f+")</span>"}}},AddScore:function(e,d,f){d=(d==null)?"":" - "+d;var c="";for(var b=0;b<=f.length-2;b++){c+=f[b]+", "}c+=f[f.length-1];var a=$("scoreboard");a.value="\u2022 "+e+d+" ["+c+"]\n"+a.value},GetScore:function(a){return Dashboard.scores[a]},UndoLastScore:function(){$("scoreboard").value=$("scoreboard").value.substring($("scoreboard").value.indexOf("\n")+1)},ClearScore:function(){$("scoreboard").value=""},_AddStartButton:function(){Communicator._RemoteCall("Player::IsOwner",[Cookie.get("gamename")],function(b){if(b=="true"){var a=document.createElement("input");a.type="button";a.id="startGame";a.value="Start Game";if(Game.isStarted){a.style.visibility="hidden"}Event.observe(a,"click",Game.Start);$("dashboard").appendChild(a)}})}};var Game={playername:null,isStarted:false,Init:function(){Debug.Init();Communicator.Init();Bag.Init();Board.Init();Rack.Init();Turn.Init();Dashboard.Init();addLightboxMarkup();Game.playername=Cookie.get("playername")},Create:function(b,a,c,d){b=(b==null)?($("gamename").value):b;a=(a==null)?($("gamepassword").value):a;c=(c==null)?($("playername").value):c;d=(d==null)?($("playerpassword").value):d;Communicator._RemoteCall("Game::Create",[b,a,c,d],function(e){if(e=="true"){Cookie.set("gamename",b);Cookie.set("playername",c);window.location=gameUrl}else{if(e.startsWith("!")){alert(e.substring(1));return}}})},Start:function(){if(Game.isStarted==true){return}Game.isStarted=true;Communicator._RemoteCall("Game::Start",[Cookie.get("gamename")],function(a){if(a.startsWith("!")){alert(a.substring(1));return}})},Demo:function(a){$("joingamename").value="demo";$("joingamepassword").value="demo";$("joinplayername").value="demo";$("joinplayerpassword").value="demo";Game.Join()},Join:function(d){var b=$("joingamename").value;var a=$("joingamepassword").value;var c=$("joinplayername").value;var f=$("joinplayerpassword").value;if(a==""){$("joingamepassword").focus()}if(c==""){$("joingamepassword").focus()}Communicator._RemoteCall("Player::Add",[c,f,b,a],function(e){if(e.startsWith("!")){alert(e.substring(1));return}Cookie.set("gamename",b);Cookie.set("playername",c);window.location=gameUrl})}};var Communicator={Updater:null,LastResponse:null,Init:function(){args=Array(Cookie.get("gamename"));Communicator.Updater=new Ajax.PeriodicalUpdater("",rpcUrl,{method:"post",parameters:{r:"State::Get",args:args.toJSON()},insertion:Insertion.Top,frequency:2,onSuccess:Communicator.ProcessResponse,onFailure:Communicator.FailedResponse})},StopPolling:function(){Communicator.Updater.stop()},StartPolling:function(){Communicator.Updater.start()},ProcessResponse:function(g){var d=g.responseText;if(d=="EXIT"){window.location=entryUrl}Debug.W2(g.responseText);Debug.W2("last,current: "+Communicator.LastResponse+", "+d,-1);if(Communicator.LastResponse==d){return}Debug.W("status changed. last:"+Communicator.LastResponse+" current:"+d);Communicator.LastResponse=d;var c=(d.indexOf("::")>=0)?d.indexOf("::"):d.length;var h=d.substring(0,c).toUpperCase();var f=d.substring(c+2);Game.isStarted=true;Turn.swapTilesMode=false;switch(h){case"REDIRECT":window.location=entryUrl;return;case"TURN":Dashboard.HideInfo();Rack.Lock();Board.Update();Dashboard.Update();if(f.toUpperCase()!=Game.playername.toUpperCase()){Dashboard.ShowInfo("Awaiting move from "+f)}else{Dashboard.ShowInfo("Your turn")}Rack.Update(f);break;case"CHALLENGE":Dashboard.Update();Board.Update();var e=(f.substring(f.indexOf(":")+1,f.lastIndexOf(":"))).evalJSON();var a=f.substring(f.lastIndexOf(":")+1)-0;var i=f.substring(0,f.indexOf(":"));if(i.toUpperCase()==Game.playername.toUpperCase()){Turn.Challenge(e,a)}else{Dashboard.ShowInfo("Awaiting challenge from "+i)}break;case"JOIN":Game.isStarted=false;Dashboard.Update();break;case"GAMEOVER":Dashboard.Update();Board.Update();Rack.Update();var b=f.evalJSON();Turn.GameOver(b);break}},FailedReponse:function(a){},_RemoteCall:function(c,a,b){new Ajax.Request(rpcUrl,{method:"post",parameters:{r:c,args:a.toJSON()},onSuccess:function(d){Debug.W("RC: "+d.responseText);b(d.responseText)},onFailure:function(d){alert("Please try again. Failed trying to connect to server.")}})}};var Common={DisableSelection:function(a){a.onselectstart=function(){return false};a.unselectable="on";a.style.MozUserSelect="none"},Random:function(b,a){return(b+Math.floor(Math.random()*a))}};function $$$(a,f){var c;if(arguments.length>2){for(var b=0,e=[],d=arguments.length;b<d;b++){e.push($$$(arguments[b]))}return e}if((typeof a=="number")&&(typeof f=="number")){c=document.getElementById(Tile.Id(a,f))}else{if(a.constructor==Array){c=document.getElementById(Tile.Id(a[0],a[1]))}else{c=a}}Object.extend(c,Tile);if((typeof a=="number")&&(typeof f=="number")){c.X=a;c.Y=f}else{if(a.constructor==Array&&arguments.length<=2){c.X=a[0];c.Y=a[1]}}return c}var Turn={firstTurn:true,allTilesBonus:50,lightBox:null,swapTilesMode:false,SwapTiles:function(){Turn.swapTilesMode=true;$("submitTurn").style.display="none";$("swapTiles").style.display="none";$("swapSelected").style.display="inline";$("cancelSwap").style.display="inline";Turn.Undo();Rack.Unlock();Event.observe($("cancelSwap"),"click",function(){$("submitTurn").style.display="inline";$("swapTiles").style.display="inline";$("swapSelected").style.display="none";$("cancelSwap").style.display="none";var b=$("rack");for(var a=0;a<Rack.numTiles;a++){tile=$$$(b.childNodes[a]);tile.removeClassName("selectedTile")}Turn.swapTilesMode=false;return})},SwapSelected:function(){var a=Rack.SelectedTiles();var c=[];for(var b=0;b<a.length;b++){c.push(a[b].Letter())}Communicator._RemoteCall("Bag::SwapTiles",[Cookie.get("gamename"),c],function(f){var d=f.evalJSON();for(var e=0;e<a.length;e++){a[e].RemoveLetter();a[e].AssignLetter(d[e]);a[e].removeClassName("selectedTile");a[e].addClassName("selectableTile");$("cancelSwap").style.display="none";$("swapSelected").style.display="none";$("submitTurn").style.display="inline";$("swapTiles").style.display="inline";Rack.Lock()}})},Init:function(){Turn.ChallengeBoxInit()},ChallengeBoxInit:function(){Turn.lightBox=new lightbox("challengeBox")},Challenge:function(b,a){Dashboard.HideInfo();Turn.lightBox.activate();$("challengeWords").innerHTML='<span id="challengeWordsList">'+b+"</span> ("+a+" points)"},Skip:function(){Communicator._RemoteCall("Game::SkipMove",[Cookie.get("gamename")],function(a){Debug.W2(a,-1)})},Submit:function(){if(Tile.selectedTile!=null){Tile.selectedTile.Drop()}var f=Turn._GetWordCoordinates();if(f==""){return}var c=($$$(f[0]).Y==($$$(f[f.length-1])).Y);if(f.length==1){c=false;if(($$$(f[0]).Left()&&!$$$(f[0]).Left().IsEmpty())){c=true}if(($$$(f[0]).Right()&&!$$$(f[0]).Right().IsEmpty())){c=true}}if(f.length>Rack.numTiles){Debug.W("Placed more tiles than available in rack!",1)}Debug.W("isHorizontalWord: "+c,4);var e=Turn.GetWords(f,c);if(!e){return}var a=[];for(var b=0;b<e.length;b++){a.push(Tile.Letters(e[b]))}if(typeof e=="undefined"){return}var d=Turn.CalculateScore(f,e);Debug.W("Score for Turn: "+d);Communicator._RemoteCall("Game::AddMove",[Cookie.get("gamename"),f,Tile.Letters(f),d,a],function(g){if(g.charAt(0)=="!"){return}Debug.W2(g,-1);Turn.LockWord(f);Rack.Lock();Dashboard.ShowInfo("Move Submitted")})},GameOver:function(f){var g=0;maxScorePlayers=[];for(var c=0;c<f.length;c++){var b=f[c][0];var d=f[c][1];if(d>g){g=d;maxScorePlayers=[b]}else{if(d==g){maxScorePlayers.push(b)}}}var e="";if(maxScorePlayers.length==1){e=maxScorePlayers[0]+" Won!"}else{if(maxScorePlayers.length>1){e="Match is a tie between ";for(var a=0;a<maxScorePlayers.length;a++){e+=maxScorePlayers[a];e+=(a==maxScorePlayers.length-2)?" and ":((a==maxScorePlayers.length-1)?"":", ")}}}Rack.Lock();$("submitTurn").style.visibility="hidden";$("swapTiles").style.visibility="hidden";if($("startGame")){$("startGame").style.visibility="hidden"}Communicator.StopPolling();Dashboard.ShowInfo("Game Over. <strong>"+e+"</strong><br /><br />Remaining tile points have been added to, or subtracted from final score")},Undo:function(){var b;var c=Rack.EmptyTiles();coordinates=Turn._GetWordCoordinates();for(var a=0;a<coordinates.length;a++){b=$$$(coordinates[a]);c[a].AssignLetter(b.Letter());b.RemoveLetter()}},CalculateScore:function(g,e){Debug.W("Calculating points...",4);var a,d,h,k,f=0;for(var c=0;c<e.length;c++){h=0;k=1;a=e[c];for(var b=0;b<a.length;b++){d=$$$(a[b]);h+=d.Points();if(d.IsDoubleWordScore()){k=k*2}else{if(d.IsTripleWordScore()){k=k*3}}}h=h*k;f+=h;Debug.W(Tile.Letters(a)+": "+h,3)}if(g.length==Rack.numTiles){f+=Turn.allTilesBonus;Debug.W("All tiles used! Bonus: "+Turn.allTilesBonus,3)}return f},LockWord:function(b){for(var a=0;a<b.length;a++){$$$(b[a]).Lock()}},UnlockWord:function(b){for(var a=0;a<b.length;a++){$$$(b[a]).Unlock()}},GetWords:function(e,c){var a,d=[];if(!Turn.ValidateMove(e,c)){return false}a=function(){return c?Turn._GetHorizontalWord($$$(e[0])):Turn._GetVerticalWord($$$(e[0]))}();Debug.W("primaryWord: "+a,4);Debug.W("primaryWord: "+Tile.Letters(a),4);d.push(a);d=d.concat(Turn._GetConnectedWords(a));for(var b=0;b<d.length;b++){Debug.W("word: "+Tile.Letters(d[b]),4)}return d},ValidateMove:function(n,o){if(n.length==0){alert("Validator: Failed! No tiles placed");Debug.W("Validator: Failed! No tiles placed",3);return false}if(!n.length!=1){var p=n[0][o?1:0];for(var m=0;m<n.length;m++){if(n[m][o?1:0]!=p){alert("Validator: Failed! All tiles are not on same row/column");Debug.W("Validator: Failed! All tiles are not on same row/column",3);return false}}}Debug.W("Validator: All tiles are in same row/column.",4);var g=Turn.GetWordBegin(o,$$$(n[0]));var a=Turn.GetWordEnd(o,$$$(n[0]));if(o){while(g.X<=a.X){if(g.IsEmpty()){alert("Validator: Failed! Horizontal word not continuous");Debug.W("Validator: Failed! Horizontal word not continuous",3);return false}g=g.Right()}}else{while(g.Y<=a.Y){if(g.IsEmpty()){alert("Validator: Failed! Vertical word not continuous");Debug.W("Validator: Failed! Vertical word not continuous",3);return false}g=g.Below()}}Debug.W("Validator: Word is continuous. [f: "+g.X+","+g.Y+", l: "+a.X+","+a.Y+"]",4);if(!Turn.firstTurn){var d=false;for(var e=0;e<n.length;e++){var k=$$$(n[e]);if((k.Left()&&k.Left().IsLocked())||(k.Right()&&k.Right().IsLocked())||(k.Above()&&k.Above().IsLocked())||(k.Below()&&k.Below().IsLocked())){d=true}}if(!d){alert("Validator: Failed! Word not connected");Debug.W("Validator: Failed! Word not connected",3);return false}}Debug.W("Validator: Word is connected",4);if(Turn.firstTurn){if(n.length<2){alert("Validator: Failed! Word is too small");Debug.W("Validator: Failed! Word is too small",3);return false}var h=false;for(var b=0;b<n.length;b++){if((n[b][0]==Math.floor(Board.numRows/2))&&(n[b][1]==Math.floor(Board.numColumns/2))){h=true}}if(!h){alert("Validator: Failed! First move must touch center tile");Debug.W("Validator: Failed! First move must touch center tile",3);return false}}Debug.W("Validation passed",3);Turn.firstTurn=false;return true},_GetConnectedWords:function(a,e){var f=[];if(typeof e=="undefined"){e=true}Debug.W("Getting connected words to "+Tile.Letters(a)+"...",4);var d=(a[0][1]==a[a.length-1][1]);Debug.W("isHorizontalWord: "+d,4);var c;for(var b=0;b<a.length;b++){if(d){c=Turn._GetVerticalWord($$$(a[b]),e);if(c!=""){f.push(c)}}else{c=Turn._GetHorizontalWord($$$(a[b]),e);if(c!=""){f.push(c)}}}return f},_GetHorizontalWord:function(g,c){var k,f,a,j,h=true,d=[],b=false;if(typeof c=="undefined"){c=true}a=Turn.GetWordBegin(h,g);j=Turn.GetWordEnd(h,g);Debug.W("_GetHorizontalWord: wordBegin | wordEnd: "+a+" | "+j,4);k=a.X;f=j.X;if(k==f){return[]}while(k<=f){var i=$$$(k,a.Y);if(!i.IsLocked()){b=true}d.push([k,a.Y]);k++}Debug.W("_GetHorizontalWord: "+d+"(isNewWord: "+b+")",4);if(c){if(b){return d}else{return""}}return d},_GetVerticalWord:function(g,c){var k,f,a,j,h=false,d=[],b=false;if(typeof c=="undefined"){c=true}a=Turn.GetWordBegin(h,g);j=Turn.GetWordEnd(h,g);Debug.W("_GetVerticalWord: wordBegin | wordEnd: "+a+" | "+j,4);k=a.Y;f=j.Y;if(k==f){return[]}while(k<=f){var i=$$$(a.X,k);if(!i.IsLocked()){b=true}d.push([a.X,k]);k++}Debug.W("_GetVerticalWord: "+d+"(isNewWord: "+b+")",4);if(c){if(b){return d}else{return""}}return d},GetWordBegin:function(a,b){if(a){while(b.Left()&&!b.Left().IsEmpty()){b=b.Left()}}else{while(b.Above()&&!b.Above().IsEmpty()){b=b.Above()}}Debug.W("GetWordBegin: "+b.X+","+b.Y+" is '"+b.Letter()+"'",4);return b},GetWordEnd:function(a,b){if(a){while(b.Right()&&!b.Right().IsEmpty()){b=b.Right()}}else{while(b.Below()&&!b.Below().IsEmpty()){b=b.Below()}}Debug.W("GetWordEnd: "+b.X+","+b.Y+" is '"+b.Letter()+"'",4);return b},_GetFirstCoordinate:function(c){var a=Board.numRows,d=Board.numColumns;for(var b=0;b<c.length;b++){a=(c[b][0]<a)?c[b][0]:a;d=(c[b][1]<d)?c[b][1]:d}Debug.W("_GetFirstCoordinate: "+a+","+d,4);return[a,d]},_GetLastCoordinate:function(c){var d=-1,b=-1;for(var a=0;a<c.length;a++){d=(c[a][0]>d)?c[a][0]:d;b=(c[a][1]>b)?c[a][1]:b}Debug.W("_GetLastCoordinate: "+d+","+b,4);return[d,b]},_GetWordCoordinates:function(){var c=[];var b;for(var a=0;a<Board.numColumns;a++){for(var d=0;d<Board.numRows;d++){b=$$$(a,d);if(!b.IsEmpty()&&b.IsSelectable()){c.push([b.X,b.Y]);Debug.W("_GetWordCoordinates: "+b.id+": "+Tile.Letter(b),4)}}}return c}};var Board={numRows:15,numColumns:15,tripleWordScore:[[0,0],[0,7],[0,14],[7,0],[7,14],[14,0],[14,7],[14,14]],doubleWordScore:[[1,1],[1,13],[2,2],[2,12],[3,3],[3,11],[4,4],[4,10],[7,7],[10,4],[10,10],[11,3],[11,11],[12,2],[12,12],[13,1],[13,13]],tripleLetterScore:[[1,5],[1,9],[5,1],[5,5],[5,9],[5,13],[9,1],[9,5],[9,9],[9,13],[13,5],[13,9]],doubleLetterScore:[[0,3],[0,11],[2,6],[2,8],[3,0],[3,7],[3,14],[6,2],[6,6],[6,8],[6,12],[7,3],[7,10],[8,2],[8,6],[8,8],[8,11],[11,0],[11,7],[11,14],[12,6],[12,8],[14,3],[14,11]],currentRowId:null,Init:function(){Board._Draw();Board._ColorBoard(Board.tripleWordScore,"TW","3W");Board._ColorBoard(Board.doubleWordScore,"DW","2W");Board._ColorBoard(Board.tripleLetterScore,"TL","3L");Board._ColorBoard(Board.doubleLetterScore,"DL","2L")},Update:function(){Communicator._RemoteCall("Game::GetBoard",[Cookie.get("gamename")],function(f){Debug.W2("Got Board: "+f);var b=f.evalJSON();Turn.firstTurn=true;$("board").style.visibility="hidden";var d;for(var c=0;c<b.length;c++){d=b[c].split("");for(var a=0;a<d.length;a++){var e=$$$(a,c);if(d[a]!="#"){e.RemoveLetter();e.AssignLetter(d[a]);e.Unlock();e.Lock();Turn.firstTurn=false}else{e.RemoveLetter();e.Unlock()}}}$("board").style.visibility="visible";$("startGame").style.visibility="hidden"})},_Draw:function(){var b=$("board");b.style.visibility="hidden";for(var d=0;d<Board.numRows;d++){var f=$(document.createElement("div"));f.addClassName("tilerow");f.id="row"+d;b.appendChild(f);for(var a=0;a<Board.numColumns;a++){var e=Tile.Create(Tile.Id(a,d));f.appendChild(e)}var g=$(document.createElement("div"));g.addClassName("clear");f.appendChild(g)}b.style.visibility="visible"},_ColorBoard:function(d,a,b){for(var c=0;c<d.length;c++){$$$(d[c]).addClassName(a)}}};var Rack={numTiles:7,Init:function(){Rack.Draw();var b=document.createElement("input");b.type="button";b.id="submitTurn";b.value="Submit Turn";b.disabled=true;Event.observe(b,"click",Turn.Submit);$("rack").appendChild(b);var d=document.createElement("input");d.type="button";d.id="swapTiles";d.value="Swap Tiles";d.disabled=true;Event.observe(d,"click",Turn.SwapTiles);$("rack").appendChild(d);var c=document.createElement("input");c.type="button";c.id="swapSelected";c.value="Swap Selected";c.style.display="none";Event.observe(c,"click",Turn.SwapSelected);$("rack").appendChild(c);var a=document.createElement("input");a.type="button";a.id="cancelSwap";a.value="Cancel";a.style.display="none";$("rack").appendChild(a)},Draw:function(){var c=$("rack");for(var a=0;a<this.numTiles;a++){var b=Tile.Create(Tile.Id(a));b.addClassName("racktile");c.appendChild(b)}},Lock:function(){$("submitTurn").disabled=true;$("swapTiles").disabled=true;var b;var c=$("rack");for(var a=0;a<Rack.numTiles;a++){b=$$$(c.childNodes[a]);b.Lock()}},Unlock:function(){$("submitTurn").disabled=false;$("swapTiles").disabled=false;var b;var c=$("rack");for(var a=0;a<Rack.numTiles;a++){b=$$$(c.childNodes[a]);b.Unlock()}},Update:function(a){var b=Rack.EmptyTiles();if(b.length<1&&(typeof a!="undefined")){if(a.toUpperCase()==Game.playername.toUpperCase()){Rack.Unlock()}return}Communicator._RemoteCall("Bag::GetTiles",[Cookie.get("gamename")],function(e){$("rack").style.visibility="hidden";var f=e.evalJSON();var d;for(var c=0;c<Rack.numTiles;c++){d=$$$($("rack").childNodes[c]);d.RemoveLetter();if(typeof f[c]!="undefined"){d.AssignLetter(f[c])}}if((typeof a!="undefined")&&a.toUpperCase()==Game.playername.toUpperCase()){Rack.Unlock()}$("rack").style.visibility="visible"})},IsEmpty:function(){var a=this.FilledTiles();return(a.length==0)},EmptyTiles:function(){return Rack._GetTiles("empty")},FilledTiles:function(){return Rack._GetTiles("filled")},SelectedTiles:function(){return Rack._GetTiles("selected")},_GetTiles:function(d){var a=[];for(var c=0;c<Rack.numTiles;c++){var b=$$$($("rack").childNodes[c]);if(d=="empty"){if(b.IsEmpty()){a.push(b)}}else{if(d=="filled"){if(!b.IsEmpty()){a.push(b)}}else{if(d=="selected"){if(!b.IsEmpty()&&b.IsSelected()){a.push(b)}}}}}return a}};var Bag={points:null,Init:function(){Bag.points={".":0,e:1,a:1,i:1,o:1,n:1,r:1,t:1,l:1,s:1,u:1,d:2,g:2,b:3,c:3,m:3,p:3,f:4,h:4,v:4,w:4,y:4,k:5,j:8,x:8,q:10,z:10}},GetPoints:function(a){if(a==a.toUpperCase()){return 0}return Bag.points[a]}};var Tile={selectedTile:null,isBlank:false,type:null,X:null,Y:null,Letter:function(){if(this.childNodes){if(this.hasClassName("blank")){return this.childNodes[0].innerHTML.toUpperCase()}else{return this.childNodes[0].innerHTML}}else{return""}},AssignLetter:function(b){if(!this.IsEmpty()){Debug.W("Cannot place letter on occupied tile",2);return}var c=$(document.createElement("span"));if(b==b.toUpperCase()){this.addClassName("blank");c.appendChild(document.createTextNode(b.toLowerCase()))}else{c.appendChild(document.createTextNode(b))}c.addClassName("letter");this.appendChild(c);var a=$(document.createElement("span"));a.addClassName("score");a.appendChild(document.createTextNode(Bag.GetPoints(b)));this.appendChild(a);return this},RemoveLetter:function(){this.innerHTML="";this.removeClassName("lockedTile");this.removeClassName("blank");return this},Create:function(b){var a=$(document.createElement("div"));a.addClassName("tile");a.id=b;Common.DisableSelection(a);return a},Lock:function(){if(this.hasClassName("lockedTile")){return}this.addClassName("lockedTile");this.removeClassName("selectableTile");Event.stopObserving(this,"mousedown",this._ClickHandler);return this},Unlock:function(){if(this.hasClassName("selectableTile")){return}if(this.hasClassName("lockedTile")){this.removeClassName("lockedTile")}if(this.parentNode.id=="rack"){this.addClassName("selectableTile")}Event.stopObserving(this,"mousedown",this._ClickHandler);Event.observe(this,"mousedown",this._ClickHandler);return this},Select:function(){if(this.IsEmpty()){return}if(!this.hasClassName("selectableTile")&&!Turn.swapTilesMode){return}Tile.selectedTile=this;if(Turn.swapTilesMode&&this.hasClassName("selectedTile")){this.removeClassName("selectedTile");this.addClassName("selectableTile");return}if(this.hasClassName("blank")){Tile.isBlank=true}else{Tile.isBlank=false}this.addClassName("selectedTile");this.removeClassName("selectableTile");Debug.W("Select: "+(this.id),4);return this},Drop:function(){if(Tile.selectedTile==null){return}if(this==Tile.selectedTile){this.addClassName("selectableTile");Tile.selectedTile.removeClassName("selectedTile");Tile.selectedTile=null;return this}if(!this.IsEmpty()){if(!this.hasClassName("selectableTile")){return}else{Tile.selectedTile.removeClassName("selectedTile");Tile.selectedTile.addClassName("selectableTile");return this.Select()}}if(Tile.selectedTile.Letter()=="."||Tile.isBlank){return this.DropBlank()}this.AssignLetter(Tile.selectedTile.Letter());this.addClassName("selectableTile");this.removeClassName("selectedTile");Tile.selectedTile.removeClassName("selectedTile");Tile.selectedTile.RemoveLetter();Tile.selectedTile=null;return this},DropBlank:function(){var b="";var a=/^[a-zA-Z]$/;if(this.hasClassName("racktile")){Tile.selectedTile.removeClassName("blank");Tile.selectedTile.removeClassName("selectedTile");Tile.selectedTile.RemoveLetter();Tile.selectedTile=null;Tile.isBlank=false;this.AssignLetter(".");this.addClassName("selectableTile");this.removeClassName("blank");return}var c=function(d){if(!a.test(b)){if(b==""||b=="undefined"){b=prompt("Please type in an alphabet for the blank tile")}else{b=prompt('"'+b+'" is not a valid alphabet. Please type in an alphabet for the blank tile')}if(b==null){Tile.selectedTile.addClassName("selectableTile");Tile.selectedTile.removeClassName("selectedTile");Tile.selectedTile=null;Tile.isBlank=false;return}c(d)}};c(this);if(b==null){return}this.AssignLetter(b.toUpperCase());this.addClassName("selectableTile");Tile.selectedTile.removeClassName("blank");Tile.selectedTile.removeClassName("selectedTile");Tile.selectedTile.RemoveLetter();Tile.selectedTile=null;Tile.isBlank=false},Id:function(a,b){if(typeof b=="undefined"){return"r"+a}else{return"t"+a+"x"+b}},X:function(){return this.id.substr(1,this.id.indexOf("x")-1)-0},Y:function(){return this.id.substr(this.id.indexOf("x")+1)-0},Left:function(){if(this.X==0){return false}else{return $$$(this.X-1,this.Y)}},Right:function(){if(this.X==Board.numColumns-1){return false}else{return $$$(this.X+1,this.Y)}},Above:function(){if(this.Y==0){return false}else{return $$$(this.X,this.Y-1)}},Below:function(){if(this.Y==Board.numRows-1){return false}else{return $$$(this.X,this.Y+1)}},IsLocked:function(){return this.hasClassName("lockedTile")},IsEmpty:function(){return(this.innerHTML=="")},IsSelected:function(){return this.hasClassName("selectedTile")},IsSelectable:function(){return this.hasClassName("selectableTile")},Letters:function(d){var c;if(typeof d[0]=="number"){c=$$$(d);if(c.hasClassName("blank")){return c.Letter().toUpperCase()}else{return c.Letter()}}var a="";for(var b=0;b<d.length;b++){c=$$$(d[b]);if(c.hasClassName("blank")){a=a+c.Letter().toUpperCase()}else{a=a+c.Letter()}}return a},Points:function(){var b,a=0;b=this.Letter();a=Bag.GetPoints(b);if(this.IsLocked()){return a}if(this.hasClassName("TL")){return a*3}if(this.hasClassName("DL")){return a*2}return a},IsDoubleWordScore:function(){if(!this.IsLocked()&&this.hasClassName("DW")){return true}return false},IsTripleWordScore:function(){if(!this.IsLocked()&&this.hasClassName("TW")){return true}return false},IsOnBoard:function(){var b=this.ancestors(0);for(var c=0;c<b.length;c++){if(b[c].id.toUpperCase()=="BOARD"){return true}}return false},IsOnRack:function(){var b=this.ancestors(0);for(var c=0;c<b.length;c++){if(b[c].id.toUpperCase()=="RACK"){return true}}return false},_ClickHandler:function(a){var b=$$$(Event.element(a));if(!b.hasClassName("tile")){b=b.ancestors()[0]}if(Turn.swapTilesMode){b.Select();return}if(Tile.selectedTile!=null){b.Drop()}else{b.Select()}}};var Debug={_count:0,maxlen:5000,Level:3,Init:function(){if(window.location.host!="localhost"){debugMode=false}if(!debugMode){$("debugdiv").style.visibility="hidden";$("debugdiv2").style.visibility="hidden"}else{$("debugdiv").style.visibility="visible";$("debugdiv2").style.visibility="visible"}},W:function(a,b){if(!debugMode){return}if(typeof b=="undefined"){b=3}var c=$("debug");if(c==null){return}if(Debug.Level>=b){if(c.value.length>this.maxlen){this.Clear()}c.value=++this._count+"> "+a+"\n"+c.value}},W2:function(a,b){if(!debugMode){return}if(typeof b=="undefined"){b=4}var c=$("debug2");if(Debug.Level>=b){if(c.value.length>this.maxlen){this.Clear2()}c.value=++this._count+"> "+a+"\n"+c.value}},Clear:function(){var a=$("debug");a.value=""},Clear2:function(){var a=$("debug2");a.value=""}};String.prototype.escapeRegExp=function(){return this.replace(/([.*+?^${}()|[\]\/\\])/g,"\\$1")};String.prototype.trim=function(){return this.replace(/^\s+|\s+$/g,"")};String.prototype.ltrim=function(){return this.replace(/^\s+/,"")};String.prototype.rtrim=function(){return this.replace(/\s+$/,"")};var Cookie={set:function(a,b,e){b=encodeURIComponent(b);if(e){var c=new Date();c.setTime(c.getTime()+(e*1000));expiry="; expires="+c.toGMTString()}else{expiry=""}document.cookie=a+"="+b+expiry+"; path=/"},get:function(a){var b=document.cookie.match("(?:^|;)\\s*"+a.escapeRegExp()+"=([^;]*)");return b?decodeURIComponent(b[1]):false},unset:function(a){if(typeof a=="object"){this.set(a.key,"",-1)}else{this.set(a,"",-1)}}};