(function(){var i,j,k,a="auto",b="absolute",c="span",d="div",e="x-menu-list-item",f="ul",g="li",h="x-menu-list";k=Ext;j=k.menu;i=k.ux;function l(n){var o,m=this;l.superclass.constructor.call(m,n);o=m.toolItems;m.toolItems=new k.util.MixedCollection();if(o){m.addTool.apply(m,o)}}k.extend(l,j.Menu,{width:200,height:120,shadow:true,render:function(){var m,n,o,p,q,r,s,u,t=this;if(t.el){return}m=new k.Layer({cls:"x-menu ux-start-menu",shadow:t.shadow,constrain:false,parentEl:t.parentEl||document.body,zindex:15000});o=m.createChild({tag:d,cls:"x-window-header x-unselectable x-panel-icon "+t.iconCls});o.createChild({tag:c,cls:"x-window-header-text"});o.wrap({cls:"ux-start-menu-tl"});o.wrap({cls:"ux-start-menu-tr"});o.wrap({cls:"ux-start-menu-tc"});t.el=m;t.header=o;t.menuBWrap=m.createChild({tag:d,cls:"x-window-body x-border-layout-ct ux-start-menu-body"});n=t.menuBWrap.wrap({cls:"ux-start-menu-ml"});t.menuBWrap.wrap({cls:"x-window-mc ux-start-menu-bwrap"});t.menuPanel=t.menuBWrap.createChild({tag:d,cls:"x-panel x-border-panel ux-start-menu-apps-panel"});t.toolsPanel=t.menuBWrap.createChild({tag:d,cls:"x-panel x-border-panel ux-start-menu-tools-panel"});q=n.wrap({cls:"x-window-bwrap"});r=q.createChild({tag:d,cls:"ux-start-menu-bc"});r.wrap({cls:"ux-start-menu-bl x-panel-nofooter"});r.wrap({cls:"ux-start-menu-br"});t.keyNav=new j.MenuNav(t);if(t.plain){m.addClass("x-menu-plain")}if(t.cls){m.addClass(t.cls)}t.focusEl=m.createChild({tag:"a",cls:"x-menu-focus",href:"#",onclick:"return false;",tabIndex:"-1"});s=t.menuPanel.createChild({tag:f,cls:h});u=t.toolsPanel.createChild({tag:f,cls:h});p={click:t.onClick,mouseover:t.onMouseOver,mouseout:t.onMouseOut,scope:t};s.on(p);t.items.each(function(w){var v;v=document.createElement(g);v.className=e;s.dom.appendChild(v);w.render(v,this)},t);t.ul=s;t.autoWidth();u.on(p);t.toolItems.each(function(w){var v;v=document.createElement(g);v.className=e;u.dom.appendChild(v);w.render(v,this)},t);t.toolsUl=u;t.autoWidth();t.menuBWrap.setStyle("position","relative");t.menuBWrap.setHeight(t.height);t.menuPanel.setStyle({padding:"2px",position:b,overflow:a});t.toolsPanel.setStyle({padding:"2px 4px 2px 2px",position:b,overflow:a});t.setTitle(t.title)},findTargetItem:function(o){var n,m=this;n=o.getTarget(".x-menu-list-item",m.ul,true);if(n&&n.menuItemId){if(m.items.get(n.menuItemId)){return m.items.get(n.menuItemId)}else{return m.toolItems.get(n.menuItemId)}}},show:function(o,r,n){var p,q,m=this;m.parentMenu=n;if(!m.el){m.render()}m.fireEvent("beforeshow",m);m.showAt(m.el.getAlignToXY(o,r||m.defaultAlign),n,false);q=100;p=m.menuBWrap.getBox();m.menuPanel.setWidth(p.width-q);m.menuPanel.setHeight(p.height);m.toolsPanel.setWidth(q);m.toolsPanel.setX(p.x+p.width-q);m.toolsPanel.setHeight(p.height)},addTool:function(){var n,o,p,q,r,m=this;o=arguments;n=o.length;for(p=0;p<n;p++){q=o[p];if(q.render){r=m.addToolItem(q)}else{if(typeof q==="string"){if(q==="separator"||q==="-"){r=m.addToolSeparator()}else{r=m.addText(q)}}else{if(q.tagName||q.el){r=m.addElement(q)}else{if(typeof q==="object"){r=m.addToolMenuItem(q)}}}}}return r},addToolSeparator:function(){return this.addToolItem(new j.Separator({itemCls:"ux-toolmenu-sep"}))},addToolItem:function(o){var m,n=this;n.toolItems.add(o);if(n.ul){m=document.createElement(g);m.className=e;n.ul.dom.appendChild(m);o.render(m,n);n.delayAutoWidth()}return o},addToolMenuItem:function(m){if(!(m instanceof j.Item)){if(typeof m.checked==="boolean"){m=new j.CheckItem(m)}else{m=new j.Item(m)}}return this.addToolItem(m)},setTitle:function(o,n){var m=this;m.title=o;m.header.child(c).update(o);return m}});i.StartMenu=l})();(function(){var t,u,v,a="x-btn-icon",b="ux-startbutton",c="removeClass",d="li",e="ux-quickstart-panel",f='<table border="0" cellpadding="0" cellspacing="0" class="x-btn-wrap"><tbody><tr><td class="ux-quickstart-button-left"><i>&#160;</i></td><td class="ux-quickstart-button-center"><em unselectable="on"><button class="x-btn-text" type="{1}" style="height:28px;">{0}</button></em></td><td class="ux-quickstart-button-right"><i>&#160;</i></td></tr></tbody></table>',g="center",h="addClass",i="ul",j=20,k="ux-taskbuttons-panel",l="ux-quickstart-menubutton",m="x-taskbuttons-scrolling",n="ux-taskbar-start",o="lr",p="resize",q="west",r="x-clear",s="border";u=Ext;t=u.num;v=u.ux;v.TaskBar=function(w){this.app=w;this.init()};u.extend(v.TaskBar,u.util.Observable,{init:function(){var w,z,A,B,y=this;y.startMenu=new v.StartMenu(y.app.startConfig);y.startBtn=new u.Button({text:"Start",id:b,iconCls:"start",menu:y.startMenu,menuAlign:"bl-tl",renderTo:n,template:new u.Template('<table border="0" cellpadding="0" cellspacing="0" class="x-btn-wrap"><tbody><tr><td class="ux-startbutton-left"><i>&#160;</i></td><td class="ux-startbutton-center"><em unselectable="on"><button class="x-btn-text" type="{1}" style="height:30px;">{0}</button></em></td><td class="ux-startbutton-right"><i>&#160;</i></td></tr></tbody></table>')});B=u.get(b).getWidth()+10;A=new u.BoxComponent({el:n,id:"TaskBarStart",minWidth:B,region:q,split:true,width:B});y.qsPanel=new v.QuickStartPanel({el:e,id:"TaskBarQuickStart",minWidth:60,region:q,split:true,width:94});y.tbPanel=new v.TaskButtonsPanel({el:k,id:"TaskBarButtons",region:g});z=new u.Container({el:"ux-taskbar-panel-wrap",items:[y.qsPanel,y.tbPanel],layout:s,region:g});w=new v.TaskBarContainer({el:"ux-taskbar",layout:s,items:[A,z]});return y},addTaskButton:function(w){return this.tbPanel.addButton(w,k)},removeTaskButton:function(w){this.tbPanel.removeButton(w)},setActiveButton:function(w){this.tbPanel.setActiveButton(w)},addQuickStartButton:function(w){return this.qsPanel.addButton(w,e)},removeQuickStartButton:function(w){this.qsPanel.removeButton(w)}});v.TaskBarContainer=u.extend(u.Container,{initComponent:function(){var w=this;v.TaskBarContainer.superclass.initComponent.call(w);w.el=u.get(w.el)||u.getBody();w.el.setHeight=u.emptyFn;w.el.setWidth=u.emptyFn;w.el.setSize=u.emptyFn;w.el.setStyle({overflow:"hidden",margin:"0",border:"0 none"});w.el.dom.scroll="no";w.allowDomMove=false;w.autoWidth=true;w.autoHeight=true;u.EventManager.onWindowResize(w.fireResize,w);w.renderTo=w.el},fireResize:function(x,y){this.fireEvent(p,this,x,y,x,y)}});v.TaskButtonsPanel=u.extend(u.BoxComponent,{activeButton:null,enableScroll:true,scrollIncrement:0,scrollRepeatInterval:400,scrollDuration:.35,animScroll:true,resizeButtons:true,buttonWidth:168,minButtonWidth:118,buttonMargin:2,buttonWidthSet:false,initComponent:function(){var w=this;v.TaskButtonsPanel.superclass.initComponent.call(w);w.on(p,w.delegateUpdates);w.items=[];w.stripWrap=u.get(w.el).createChild({cls:"ux-taskbuttons-strip-wrap",cn:{tag:i,cls:"ux-taskbuttons-strip"}});w.stripSpacer=u.get(w.el).createChild({cls:"ux-taskbuttons-strip-spacer"});w.strip=new u.Element(w.stripWrap.dom.firstChild);w.edge=w.strip.createChild({tag:d,cls:"ux-taskbuttons-edge"});w.strip.createChild({cls:r})},addButton:function(z){var w,y,x=this;w=x.strip.createChild({tag:d},x.edge);y=new v.TaskBar.TaskButton(z,w);x.items.push(y);if(!x.buttonWidthSet){x.lastButtonWidth=y.container.getWidth()}x.setActiveButton(y);return y},removeButton:function(A){var w,x,z,B,y=this;x=document.getElementById(A.container.id);A.destroy();x.parentNode.removeChild(x);B=[];for(z=0,w=y.items.length;z<w;z++){if(y.items[z]!==A){B.push(y.items[z])}}y.items=B;y.delegateUpdates()},setActiveButton:function(w){this.activeButton=w;this.delegateUpdates()},delegateUpdates:function(){var w=this;if(w.resizeButtons&&w.rendered){w.autoSize()}if(w.enableScroll&&w.rendered){w.autoScroll()}},autoSize:function(){var w,x,y,z,A,B,C,D,E;C=this.items.length;w=this.el.dom.clientWidth;if(!this.resizeButtons||C<1||!w){return}E=Math.max(Math.min(Math.floor((w-4)/C)-this.buttonMargin,this.buttonWidth),this.minButtonWidth);z=this.stripWrap.dom.getElementsByTagName("button");this.lastButtonWidth=u.get(z[0].id).findParent(d).offsetWidth;for(A=0,D=z.length;A<D;A++){x=z[A];B=u.get(z[A].id).findParent(d).offsetWidth;y=x.offsetWidth;x.style.width=(E-(B-y))+"px"}},autoScroll:function(){var x,y,z,A,B,C,w=this;B=w.items.length;z=w.el.dom.clientWidth;A=w.stripWrap;y=A.dom.offsetWidth;C=w.getScrollPos();x=w.edge.getOffsetsTo(w.stripWrap)[0]+C;if(!w.enableScroll||B<1||y<j){return}A.setWidth(z);if(x<=z){A.dom.scrollLeft=0;if(w.scrolling){w.scrolling=false;w.el.removeClass(m);w.scrollLeft.hide();w.scrollRight.hide()}}else{if(!w.scrolling){w.el.addClass(m)}z-=A.getMargins(o);A.setWidth(z>j?z:j);if(!w.scrolling){if(!w.scrollLeft){w.createScrollers()}else{w.scrollLeft.show();w.scrollRight.show()}}w.scrolling=true;if(C>(x-z)){A.dom.scrollLeft=x-z}else{w.scrollToButton(w.activeButton,true)}w.updateScrollButtons()}},createScrollers:function(){var w,y,z,x=this;z=x.el.dom.offsetHeight;w=x.el.insertFirst({cls:"ux-taskbuttons-scroller-left"});w.setHeight(z);w.addClassOnOver("ux-taskbuttons-scroller-left-over");x.leftRepeater=new u.util.ClickRepeater(w,{interval:x.scrollRepeatInterval,handler:x.onScrollLeft,scope:x});x.scrollLeft=w;y=x.el.insertFirst({cls:"ux-taskbuttons-scroller-right"});y.setHeight(z);y.addClassOnOver("ux-taskbuttons-scroller-right-over");x.rightRepeater=new u.util.ClickRepeater(y,{interval:x.scrollRepeatInterval,handler:x.onScrollRight,scope:x});x.scrollRight=y},getScrollWidth:function(){var w=this;return w.edge.getOffsetsTo(w.stripWrap)[0]+w.getScrollPos()},getScrollPos:function(){return t(this.stripWrap.dom.scrollLeft)||0},getScrollArea:function(){return t(this.stripWrap.dom.clientWidth)||0},getScrollAnim:function(){var w=this;return{duration:w.scrollDuration,callback:w.updateScrollButtons,scope:w}},getScrollIncrement:function(){return(this.scrollIncrement||this.lastButtonWidth+2)},scrollToButton:function(A,w){var x,y,z,B,C;A=A.el.dom.parentNode;if(!A){return}y=A;C=this.getScrollPos();z=this.getScrollArea();B=u.fly(y).getOffsetsTo(this.stripWrap)[0]+C;x=B+y.offsetWidth;if(B<C){this.scrollTo(B,w)}else{if(x>(C+z)){this.scrollTo(x-z,w)}}},scrollTo:function(y,x){var w=this;w.stripWrap.scrollTo("left",y,x?w.getScrollAnim():false);if(!x){w.updateScrollButtons()}},onScrollRight:function(){var w,x,y;w=this.getScrollWidth()-this.getScrollArea();y=this.getScrollPos();x=Math.min(w,y+this.getScrollIncrement());if(x!==y){this.scrollTo(x,this.animScroll)}},onScrollLeft:function(){var w,x;x=this.getScrollPos();w=Math.max(0,x-this.getScrollIncrement());if(w!==x){this.scrollTo(w,this.animScroll)}},updateScrollButtons:function(){var x,w=this;x=w.getScrollPos();w.scrollLeft[x===0?h:c]("ux-taskbuttons-scroller-left-disabled");w.scrollRight[x>=(w.getScrollWidth()-w.getScrollArea())?h:c]("ux-taskbuttons-scroller-right-disabled")}});v.TaskBar.TaskButton=function(x,w){this.win=x;v.TaskBar.TaskButton.superclass.constructor.call(this,{iconCls:x.iconCls,text:u.util.Format.ellipsis(x.title,12),renderTo:w,handler:function(){if(x.minimized||x.hidden){x.show()}else{if(x===x.manager.getActive()){x.minimize()}else{x.toFront()}}},clickEvent:"mousedown",template:new u.Template('<table border="0" cellpadding="0" cellspacing="0" class="x-btn-wrap"><tbody><tr><td class="ux-taskbutton-left"><i>&#160;</i></td><td class="ux-taskbutton-center"><em unselectable="on"><button class="x-btn-text" type="{1}" style="height:28px;">{0}</button></em></td><td class="ux-taskbutton-right"><i>&#160;</i></td></tr></tbody></table>')})};u.extend(v.TaskBar.TaskButton,u.Button,{onRender:function(){var w=this;v.TaskBar.TaskButton.superclass.onRender.apply(w,arguments);w.cmenu=new u.menu.Menu({items:[{text:"Restore",handler:function(){var x=this;if(!x.win.isVisible()){x.win.show()}else{x.win.restore()}},scope:w},{text:"Minimize",handler:w.win.minimize,scope:w.win},{text:"Maximize",handler:w.win.maximize,scope:w.win},"-",{text:"Close",handler:w.closeWin.createDelegate(w,w.win,true),scope:w.win}]});w.cmenu.on("beforeshow",function(){var x,y;y=this.cmenu.items.items;x=this.win;y[0].setDisabled(x.maximized!==true&&x.hidden!==true);y[1].setDisabled(x.minimized===true);y[2].setDisabled(!x.maximizable||x.maximized===true||x.hidden===true);y[4].setDisabled(x.closable===false)},w);w.el.on("contextmenu",function(z){var y,x=this;z.stopEvent();if(!x.cmenu.el){x.cmenu.render()}y=z.getXY();y[1]-=x.cmenu.el.getHeight();x.cmenu.showAt(y)},w)},closeWin:function(w,y,x){if(!x.isVisible()){x.show()}else{x.restore()}x.close()}});v.QuickStartPanel=u.extend(u.BoxComponent,{enableMenu:true,initComponent:function(){var w=this;v.QuickStartPanel.superclass.initComponent.call(w);w.on(p,w.delegateUpdates);w.menu=new u.menu.Menu();w.items=[];w.stripWrap=u.get(w.el).createChild({cls:"ux-quickstart-strip-wrap",cn:{tag:i,cls:"ux-quickstart-strip"}});w.stripSpacer=u.get(w.el).createChild({cls:"ux-quickstart-strip-spacer"});w.strip=new u.Element(w.stripWrap.dom.firstChild);w.edge=w.strip.createChild({tag:d,cls:"ux-quickstart-edge"});w.strip.createChild({cls:r})},addButton:function(x){var w,y;w=this.strip.createChild({tag:d},this.edge);y=new u.Button(u.apply(x,{cls:a,menuText:x.text,renderTo:w,template:new u.Template(f),text:null}));this.items.push(y);this.delegateUpdates();return y},removeButton:function(A){var w,x,z,B,y=this;x=document.getElementById(A.container.id);A.destroy();x.parentNode.removeChild(x);B=[];for(z=0,w=y.items.length;z<w;z++){if(y.items[z]!==A){B.push(y.items[z])}}y.items=B;y.delegateUpdates()},menuAdd:function(w){this.menu.add(w)},delegateUpdates:function(){var w=this;if(w.enableMenu&&w.rendered){w.showButtons();w.clearMenu();w.autoMenu()}},showButtons:function(){var w,x;x=this.items.length;for(w=0;w<x;w++){this.items[w].show()}},clearMenu:function(){this.menu.removeAll()},autoMenu:function(){var w,x,y,z,A,B,C,D,E,F,G=this;F=G.items.length;E=G.el.dom.clientWidth;x=G.stripWrap;C=x.dom.offsetWidth;B=G.edge.getOffsetsTo(G.stripWrap)[0];if(!G.enableMenu||F<1||C<j){return}x.setWidth(E);if(B<=E){if(G.showingMenu){G.showingMenu=false;G.menuButton.hide()}}else{E-=x.getMargins(o);x.setWidth(E>j?E:j);if(!G.showingMenu){if(!G.menuButton){G.createMenuButton()}else{G.menuButton.show()}}A=G.getMenuButtonPos();for(D=F-1;D>=0;D--){w=G.items[D].el.dom.offsetLeft+G.items[D].el.dom.offsetWidth;if(w>A){G.items[D].hide();y=G.items[D].initialConfig;z={iconCls:y.iconCls,handler:y.handler,scope:y.scope,text:y.menuText};G.menuAdd(z)}else{G.items[D].show()}}G.showingMenu=true}},createMenuButton:function(){var w,y,z;y=this.el.dom.offsetHeight;z=this.el.insertFirst({cls:"ux-quickstart-menubutton-wrap"});z.setHeight(y);w=new u.Button({cls:a,iconCls:"quickstart-menubutton",id:l,menu:this.menu,renderTo:z,template:new u.Template(f)});z.setWidth(u.get(l).getWidth());this.menuButton=z},getMenuButtonPos:function(){return this.menuButton.dom.offsetLeft}})})();Ext.Desktop=function(d){var f,h,j,l,n,p,q,a=200,b="active-win",c=100,k=this;q=Ext;p=q.lib.Dom;h=new q.ux.TaskBar(d);n=q.get("x-desktop");f=q.get("ux-taskbar");j=q.get("x-shortcuts");l=new q.WindowGroup();k.taskbar=h;k.shortcuts=j;function i(){n.setHeight(p.getViewHeight()-f.getHeight())}function g(r){r.minimized=true;r.hide()}function o(r){q.fly(r.taskButton.el).removeClass(b)}function m(s){var r;r=l.getActive();if(r&&r!==s){o(r)}h.setActiveButton(s.taskButton);q.fly(s.taskButton.el).addClass(b);s.minimized=false}function e(r){h.removeTaskButton(r.taskButton);i()}q.EventManager.onWindowResize(i);k.layout=i;k.createWindow=function(s,r){var t,u;u=r||q.Window;t=new u(q.applyIf(s||{},{manager:l,minimizable:true}));t.render(n);t.taskButton=h.addTaskButton(t);t.cmenu=new q.menu.Menu({items:[]});t.animateTarget=t.taskButton.el;t.on({activate:m,deactivate:o,minimize:g,close:e});i();return t};k.getManager=function(){return l};k.getWindow=function(r){return l.get(r)};k.getActiveWindow=function(){return l.getActive()};k.getWinWidth=function(){var r;r=p.getViewWidth();return r<a?a:r};k.getWinHeight=function(){var r;r=(p.getViewHeight()-f.getHeight());return r<c?c:r};k.getWinX=function(r){return(p.getViewWidth()-r)/2};k.getWinY=function(r){return(p.getViewHeight()-f.getHeight()-r)/2};k.hideShortcuts=function(){j.hide()};k.showShortcuts=function(){j.show()};k.hideTaskbar=function(){f.hide();i()};k.showTaskbar=function(){f.show();i()};k.mask=function(s,r){n.mask(s,r)};k.unmask=function(){n.unmask()};i();if(j){j.on("click",function(u,s){var r;s=u.getTarget("dt",j);if(s){u.stopEvent();r=d.getModule(s.id.replace("-shortcut",""));if(r){r.showWindow()}}})}};Ext.app.App=function(b){var a=this;Ext.apply(a,b);a.addEvents({ready:true,destroy:true});Ext.onReady(a.initApp,a)};Ext.extend(Ext.app.App,Ext.util.Observable,{isReady:false,startMenu:null,modules:null,getModules:Ext.emptyFn,init:Ext.emptyFn,initApp:function(){var a=this;a.desktop=new Ext.Desktop(a);a.modules=a.getModules();if(a.modules){a.initModules(a.modules);a.initQuickStart(a.modules)}a.init();Ext.EventManager.on(window,"destroy",a.onDestroy,a);a.fireEvent("ready",a);a.isReady=true},initModules:function(d){var a,b,c,e,f;f=this.desktop.taskbar.startMenu;for(e=0,b=d.length;e<b;e++){a=d[e];c=a.launcher;if(c&&c.hideInMenu!==true){f.add(c)}a.app=this}},initQuickStart:function(d){var a,b,c,e;for(e=0,b=d.length;e<b;e++){a=d[e];c=a.launcher;if(c&&c.hideInQS!==true){this.desktop.taskbar.addQuickStartButton(c)}}},getModule:function(d){var a,b,c,e;c=this.modules;for(e=0,b=c.length;e<b;e++){a=c[e];if(a.id===d){return a}}return null},onReady:function(c,b){var a=this;if(!a.isReady){a.on("ready",c,b)}else{c.call(b,a)}},getDesktop:function(){return this.desktop},onDestroy:function(a){if(this.fireEvent("destroy",this)===false){a.stopEvent()}}});(function(){var a,c;c=Ext;a=c.emptyFn;function b(e){var d=this;c.apply(d,e);b.superclass.constructor.call(d);d.init()}c.extend(b,c.util.Observable,{init:a,getWindow:a,showWindow:function(){var d;d=this.getWindow.apply(this,arguments);if(d){d.show()}}});c.app.WinModule=b})();(function(){var d,e,f,g,i,a="player-win",b="</div>",c="player";i=Ext;d=XOGame;e=_tr;g=i.util.Format.htmlEncode;function h(j){return'<div class="username">'+g(j.username)+'</div><div class="lastlogin">'+d.util.parseLastLogin(j.lastlogin)+b+(d.user.id!==j.id?'<div class="new">'+e("newGame")+b:"")}f=i.extend(i.Window,{initEvents:function(){var j=this;f.superclass.initEvents.call(j);j.body.on("click",j.onNewGame,j,{delegate:".new"})},onNewGame:function(){d.getNewGameWindow(this.playerId).show();this.close()},update:function(){this.body.update(h(d.getPlayer(this.playerId)))}});d.PlayerWindowModule=i.extend(i.app.WinModule,{id:a,getWindow:function(j,m){var k,l,n,o;k=j.playerId;o=this.app.getDesktop();n=o.getWindow(c+k);if(!n&&m!==false){l=d.getPlayer(k);n=o.createWindow({id:c+k,title:String.format(e("playerTitle"),g(l.username)),width:180,height:150,iconCls:"user",cls:a,resizable:false,shim:false,animCollapse:false,constrainHeader:true,html:h(l),playerId:k},f)}else{if(n&&j.forceUpdate){n.update()}}return n}})})();(function(){var A,B,C,D,F,G,H,L,N,a=120,b="click",c="game-x-turn",d="selected",e="x",f="_move_",g="",h="_",i=".net",j="first",k=100,l="-",m="next",n=" ",o="lastMove",p="number",q="prev",r="close",s="o",t=2000,u="game-o-turn",v="game_",w="b",x="last",y="simulation";F=Ext;A=XOGame;C=_tr;N=F.num;B=F.util.Format.htmlEncode;G=0;function I(E,O){return(E%O)+h+Math.floor(E/O)}function M(){if(!H){H=new F.XTemplate('<div class="game"><div class="net size{size}"><tpl for="moves">{[ "<a id=\\"game_" + parent.id + "_" + this.i2c(xindex-1, parent.size) + "\\"" + (Ext.isIE ? " href=\\"#\\"" : "") + (values ? " class=\\"" + values+ "\\"" : "") + "></a>" ]}</tpl></div></div>',{i2c:I});H.compile()}return H}function J(){if(!L){L=new F.XTemplate('<div class="moves"><tpl for="moves">{[ "<a href=\\"#\\" id=\\"game_" + parent.gameId + "_move_" + (xindex-1) + "\\"><div class=\\"n\\">" + xindex + ".</div><div>X:" + values.x + "&#160;Y:" + values.y + "</div><br style=\\"clear:both\\"/></a>" ]}</tpl></div>');L.compile()}return L}function z(Q){var E,O,P;O=A.openedGames;P=Q.gameId;E=O.getById(P);O.remove(E)}function K(){G--;A.getGameListWindow().checkPublicGames()}D=F.extend(F.Window,{initEvents:function(){var O,P,Q,R,S,T,E=this;D.superclass.initEvents.call(E);Q=A.getGame(E.gameId);P=E.getTopToolbar().items;S=P.itemAt(0);O=P.itemAt(1);T=P.itemAt(3);R=P.itemAt(5);E.myLastMove=S;E.lastMove=O;E.simulation=T;E.chatBtn=R;if(Q.inProgress()){S.on(b,E.markMyLastMove,E);O.on(b,E.markLastMove,E);T.on(b,E.toggleSimulation,E)}R.toggleHandler=E.toggleChat;R.scope=E;if(Q.isPublicList()){S.hide();T.hide();P.itemAt(4).hide()}E.fixTypeTBText(Q);E.on("show",E.markMoves,E)},render:function(){var O,P,E=this;D.superclass.render.apply(E,arguments);M().overwrite(E.getLayout().center.panel.body,E.getTemplateData());E.body.select(".net > a").on(b,E.onMatrixClick,E);E.update(false);E.syncTitle();P=E.getComponent(1);E.chat=P;P.type="g"+E.gameId;P.on({collapse:function(R){var Q;Q=this.getSize().height;R.hide();this.setHeight(Q-a)},expand:function(R){var Q;Q=this.getSize().height;R.show();this.setHeight(Q+a);this.syncChatSize();R.focusInput()},scope:E});E.on("activate",function(){this.focusInput.defer(50,this)},P);O=E.getComponent(2);E.moves=O;O.on("expand",function(R){var Q,S,T,U,V,W,X,Y,aa,ab,ac,Z=this;W=R.body;ab=Z.gameId;aa=A.getGame(ab);Y=aa.getNetIterator();T=Z.getTopToolbar();Q=[];V=0;while((S=Y.next())){X=S.split(h);Q[V++]={x:N(X[0])+1,y:N(X[1])+1}}J().overwrite(W,{gameId:ab,moves:Q});ac=aa.getMovesCount();U=ac-1;F.fly(v+ab+f+U).addClass(d);Z.currentMovePos=U;if(ac>99){W.select(">.moves").addClass("wide")}W.select(">.moves>a").on({click:function(af,ad){var ae,ag;if(!ad.href){ad=ad.parentNode}ae=ad.id.split(h);ag=N(ae[ae.length-1]);if(ag<=this.currentMovePos){this.blinkCoordAt(ag)}af.stopEvent()},dblclick:function(af,ad){var ae;if(!ad.href){ad=ad.parentNode}ae=ad.id.split(h);this.goToMove(N(ae[ae.length-1]));af.stopEvent()},scope:Z});Z.gtSeparator=T.addSeparator();Z.gtFirst=T.addButton({tooltip:C("firstMove"),iconCls:"x-tbar-page-first",handler:Z.goToMove.createDelegate(Z,[j])});Z.gtPrev=T.addButton({tooltip:C("prevMove"),iconCls:q,handler:Z.goToMove.createDelegate(Z,[q])});Z.gtPlay=T.addButton({tooltip:C("playMoves"),iconCls:"x-tbar-page-next",disabled:true,enableToggle:true,toggleHandler:Z.toggleMovesPlay,scope:Z});Z.gtNext=T.addButton({tooltip:C("nextMove"),iconCls:m,disabled:true,handler:Z.goToMove.createDelegate(Z,[m])});Z.gtLast=T.addButton({tooltip:C(o),iconCls:"x-tbar-page-last",disabled:true,handler:Z.goToMove.createDelegate(Z,[x])});Z.fixTypeTBText(aa)},E,{single:true});O.on({collapse:function(R){var Q=this;R.hide();Q.setWidth(Q.getSize().width-k);Q.simulation.enable();Q.syncGTMovesVisibility();if(!Q.chat.collapsed){Q.syncChatSize()}Q.goToMove(x)},expand:function(S){var R,Q=this;S.show();Q.setWidth(Q.getSize().width+k);Q.simulation.disable();Q.syncGTMovesVisibility();if(!Q.chat.collapsed){Q.syncChatSize()}R=F.fly(v+Q.gameId+f+Q.currentMovePos);R.scrollIntoView(R.dom.parentNode.parentNode)},scope:E})},setIconClass:function(O){var E=this;D.superclass.setIconClass.call(E,O);if(E.taskButton){E.taskButton.setIconClass(O)}},setFigure:function(P,E){var O;O=F.fly(v+this.gameId+h+P);if(O){O.removeClass([e,s,"bx","bo"]);O.addClass(E)}},onMatrixClick:function(R,Q,O){var E,P,S,T,U;R.stopEvent();E=F.fly(Q);P=E.parent();U=P.hasClass(e)||P.hasClass(s);if(U&&!E.hasClass(e)&&!E.hasClass(s)){T=Q.id;S=T.substr(T.indexOf(h,T.indexOf(h)+1)+1);this.makeMove(S)}},toggleSimulation:function(){var E,O,Q,R,S,T,P=this;R=A.getGame(P.gameId);T=R.myTurn();Q=P.body.child(i);if(R.isSimulation()){if(!T){Q.removeClass(R.getOpponentFigure())}if(R.hasWinner()){P.markWinningMoves(false)}O=R.getSimulationMoves();for(S=0,E=O.length;S<E;S++){P.setFigure(O[S],g)}R.endSimulation();P.update(false)}else{if(!T){Q.addClass(R.getOpponentFigure())}if(P.markCoord){P.setFigure(P.markCoord,g);P.markCoord=null}R.startSimulation()}P.syncTitle()},toggleChat:function(){this.chat.toggleCollapse(false)},toggleMoves:function(){this.moves.toggleCollapse(false)},addMsg:function(O,E){this.chatBtn.toggle(true);this.chat.addMsg(O,E)},markMoves:function(){this.markLastMove();this.markWinningMoves()},onDestroy:function(){var O,E=this;delete E.myLastMove;delete E.lastMove;delete E.simulation;delete E.chatBtn;delete E.chat;delete E.moves;if(E.gtFirst){delete E.gtSeparator;delete E.gtFirst;delete E.gtPrev;delete E.gtPlay;delete E.gtNext;delete E.gtLast;O=E.movesPlay;if(O){clearInterval(O);delete E.movesPlay}}D.superclass.onDestroy.call(E)},markWinningMoves:function(R){var E,O,P,Q;P=this.gameId;O=A.getGame(P);if(O.hasWinner()){E=O.getLastMoveFigure();Q=R===false?"removeClass":"addClass";F.each(O.getWinMoves(O.getLastMove()),function(S){F.fly(v+P+h+S)[Q](w+E)})}},update:function(V){var E,O,P,Q,S,T,U,W,X,Y,Z,aa,ab,ac,ad,ae,af,ag,R=this;W=R.body.child(i);af=A.getGame(R.gameId);ae=af.isSimulation();S=R.lastMove;Y=R.myLastMove;U=R.simulation;ag=af.getLastMoveFigure();Z=af.isPublicList();if(af.inProgress()){ad=af.myTurn();X=af.isStartedByMe();ac=af.getLastMove();aa=af.net.getCount();O=af.getMyFigure();if(ae){E=af.getOpponentFigure();W.addClass(ad?O:E);W.removeClass(ad?E:O)}else{if(ad){W.addClass(O)}else{W.removeClass(O)}}R.setFigure(ac,ag);if(V!==false&&(Z||ad&&!ae)){R.blinkCoord(ac,ag)}if(Z){if(af.isXTurn()){R.setIconClass(c)}else{R.setIconClass(u)}}else{if(ad){R.setIconClass("game-my-turn")}else{R.setIconClass("game-not-my-turn")}}if(aa>0){S.enable();U.enable()}else{S.disable();U.disable()}if(((X||Z)&&aa>0)||(!X&&aa>1)){Y.enable()}else{Y.disable()}}else{if((ab=af.getWinner())!==null){W.removeClass([e,s]);if(ae){Y.disable();S.disable()}else{Q=R.getTopToolbar();T=Q.items;P="moves";T.itemAt(2).destroy();T.itemAt(4).destroy();Y.destroy();S.destroy();U.destroy();Q.addSeparator();Q.addButton({tooltip:{text:C(P),showDelay:t},enableToggle:true,toggleHandler:R.toggleMoves,scope:R,iconCls:P});R.fixTypeTBText(af)}if(Z){if(ag==e){R.setIconClass(c)}else{R.setIconClass(u)}}else{if(ab.id===A.user.id){R.setIconClass("game-won")}else{R.setIconClass("game-lost")}}R.syncTitle();R.markWinningMoves()}}},makeMove:function(R){var O,P,Q,E=this;P=A.getGame(E.gameId);Q=!P.isSimulation();if(Q){if(!P.myTurn()){throw new Error("Not your move !")}O=E.markCoord;if(O!==R){if(O){E.setFigure(O,g)}E.markCoord=R;E.blinkCoord(R,P.getMyFigure(),0);return}E.markCoord=null}P.updateField(R);E.update(false);if(Q){A.makeMove(P.id,R)}},markMyLastMove:function(){var E;E=A.getGame(this.gameId);if(E.inProgress()){this.blinkCoord(E.getMyLastMove(),E.getMyFigure())}},markLastMove:function(){var E;E=A.getGame(this.gameId);if(E.inProgress()){this.blinkCoord(E.getLastMove(),E.getLastMoveFigure())}},blinkCoord:function(T,E,R){var O,P,Q=this,S;if(!T){return}P=Q.lastBC;S=w+E;if(P){P.img.removeClass(P.cls);clearTimeout(P.timer)}O=F.get(v+Q.gameId+h+T);O.addClass(S);if(typeof R!=p){R=5000}if(R>0){Q.lastBC={img:O,cls:S,timer:setTimeout(function(){O.removeClass(S);if(Q.lastBC){delete Q.lastBC}},R)}}else{if(P){delete Q.lastBC}}},blinkCoordAt:function(E){var O,P,Q;O=A.getGame(this.gameId);P=O.getNet();Q=P.keys[E];this.blinkCoord(Q,P.itemAt(E),1500)},getTemplateData:function(){var E,O,P,Q,R,S,T;P=A.getGame(this.gameId);O=P.getNet();S=[];R=P.size;for(Q=0,E=R*R;Q<E;Q++){T=I(Q,R);S[Q]=O.key(T)||null}return{id:P.id,size:R,moves:S}},goToMove:function(W){var E,O,P,Q,R,S,T,U,V,X,Y,Z,ab,ac,ad,aa=this;X=aa.currentMovePos;ad=aa.gameId;ab=A.getGame(ad);Z=ab.getMovesCount()-1;if(typeof W===p){if(W===X){return}V=ab.getNetIterator();Y=ab.getNet();ac=W>X;P=0;T=d;O=v;Q=f;R=h;while((S=V.next())){if(ac&&P<=W&&P>=X){U=F.fly(O+ad+R+S);U.addClass(Y.key(S))}else{if(!ac&&P>W&&P<=X){U=F.fly(O+ad+R+S);U.removeClass([e,s])}}P++}F.fly(O+ad+Q+X).removeClass(T);E=F.fly(O+ad+Q+W);E.addClass(T).scrollIntoView(E.dom.parentNode.parentNode);aa.currentMovePos=W;aa.syncGTMoves();if(W===Z){aa.markWinningMoves()}else{if(X===Z){aa.markWinningMoves(false)}aa.blinkCoordAt(W)}}else{switch(W){case j:X=0;break;case q:if(X<=0){return false}X--;break;case m:if(X>=Z){return false}X++;break;default:X=Z}aa.goToMove(X)}return true},toggleMovesPlay:function(){var E=this,O,P;P=E.movesPlay;if(P){clearInterval(P);E.movesPlay=null}else{O=function(){if(E.goToMove(m)===false){E.gtPlay.toggle()}};E.movesPlay=setInterval(O,t);O()}},syncGTMovesVisibility:function(){var E,O,P,Q,R,S,T;R=this.moves;Q=this.gtSeparator;T=this.gtFirst;P=this.gtPrev;S=this.gtPlay;E=this.gtNext;O=this.gtLast;if(R.collapsed){Q.hide();T.hide();P.hide();S.hide();E.hide();O.hide()}else{Q.show();T.show();P.show();S.show();E.show();O.show()}},syncGTMoves:function(){var O,P,Q,R,E=this;if(!E.moves.collapsed){R=E.currentMovePos;O=A.getGame(E.gameId);P=R===0;Q=R===O.getMovesCount()-1;E.gtFirst.setDisabled(P);E.gtPrev.setDisabled(P);E.gtPlay.setDisabled(Q);E.gtNext.setDisabled(Q);E.gtLast.setDisabled(Q)}},syncChatSize:function(){var E,O,P;O=this.chat;P=O.msgInput;E=a;if(P){E-=22;P.setWidth(this.getSize().width-14)}O.msgCt.setHeight(E)},syncTitle:function(){var E,O,P;E=A.getGame(this.gameId);if((O=E.getWinner())){P=String.format(C("gameWon"),B(O.username))}else{if(E.isPublicList()){P=String.format(C("publicGameTitle"),B(E.x.username),B(E.o.username))}else{P=C("gameAgainst")+n+B(E.getOpponent().username)+n+C("with")+n+C("figure_"+E.getMyFigure())}}if(E.isSimulation()){P+=" ("+C(y)+")"}this.setTitle(P)},fixTypeTBText:function(P){var O,Q,R,S,E=this;R=E.tbTypeFill;S=E.tbTypeText;O=E.getTopToolbar();Q=P.isPublic();if(R){R.destroy();S.destroy()}if(Q||P.isPublish()){E.tbTypeFill=O.addFill();if(Q){E.tbTypeText=O.addText(C("game_public"))}else{E.tbTypeText=O.addText(C("game_publish"))}}else{E.tbTypeFill=null;E.tbTypeText=null}}});A.GameWindowModule=F.extend(F.app.WinModule,{id:"game-win",init:function(){A.openedPublicGamesCount=function(){return G}},getWindow:function(R,E){var O,P,Q,S,T,U,V,W,X;W=R.gameId;X=this.app.getDesktop();T="game"+W;Q=X.getWindow(T);if(!Q&&E!==false){U=A.getGame(W);S=U.size*17;V="chat";O="user";P=y;Q=X.createWindow({id:T,title:"&nbsp;",resizable:false,constrainHeader:true,width:S+26,height:S+68,iconCls:"bogus",layout:"border",tbar:[{tooltip:{text:C("myLastMove"),showDelay:t},iconCls:O},{tooltip:{text:C(o),showDelay:t},iconCls:O},l,{tooltip:{text:C(P),showDelay:t},enableToggle:true,iconCls:P},l,{tooltip:{text:C(V),showDelay:t},enableToggle:true,iconCls:V}],items:[{region:"center"},{collapsed:true,hidden:true,region:"south",height:a,xtype:V,playSound:false,readOnly:U.isPublicList()},{region:"east",collapsed:true,hidden:true,autoScroll:true,width:k}],gameId:W},D);A.openedGames.add(U.getRecord().copy());Q.on(r,z);if(U.isPublicList()){G++;Q.on(r,K)}}return Q}})}());(function(){var u,v,w,x,y,z,C,H,K,M,N,a="opponent",b="draw.gif",c=21,d="delete",e="newGame",f=" ",g="lastMove",h="gamegrid",i="gameTie",j="icon-grid",k="o",l=70,m="x",n="",o="lastmove",p="refuse",q="</a>",r="gameList",s="pubgamegrid";y=Ext;H=y.grid;u=XOGame;z=u.Client;w=_tr;v=y.util.Format.htmlEncode;function L(R){var E,Q;if(R.myTurn()){return"icons/tick.png"}if(R.inProgress()){return"icons/cross.png"}Q=R.getMyFigure();E=R.onmove;if(E==-1&&Q==m||E==-2&&Q==k){return"win.gif"}if(E==-1&&Q==k||E==-2&&Q==m){return"lose.gif"}return b}function P(E){var Q;if(E.isTie()){return b}Q=E.getWinner();if(E.isXTurn()||Q&&Q.id===E.x.id){return"sx.gif"}return"so.gif"}function A(E){return'<img src="/images/'+E+'"></img>'}function t(S,R,E){var Q;Q=u.getGame(E.id);return A(L(Q))}function O(S,R,E){var Q;Q=u.getGame(E.id);return A(P(Q))}function F(Q,E){return'<a class="'+E+'">'+v(Q.username)+q}function J(R,Q,E){return F(u.getGame(E.id).getOpponent(),a)}function D(R,Q,E){return F(u.getGame(E.id).x,m)}function G(R,Q,E){return F(u.getGame(E.id).o,k)}function B(W,U,S,Z,E,X){var Q,R,T,V,Y;Y=u.getGame(S.id);V=Y.lastmove;T=false;if((R=Y.getWinner())){Q=w(R.id==u.user.id?"win":"loss")+f+V.format(u.dateTimeFormat)}else{if(Y.isNew()){Q=w(e);if(Y.canRefuse()){T=true;Q+=f+w("yourMove")+'<a class="refuse">'+w(p)+q}}else{if(Y.isTie()){Q=w(i)}else{Q=V.format(u.dateTimeFormat)}}}if(!T&&X===u.games){if(V.getElapsed()>864000000){Q+='<a class="delete">'+w(d)+q}}return Q}function I(V,T,S,Y,E,W){var Q,R,U,X;X=u.getGame(S.id);U=X.lastmove;if((R=X.getWinner())){Q=String.format(w("gameWon"),v(R.username))+f+U.format(u.dateTimeFormat)}else{if(X.isNew()){Q=w(e)}else{if(X.isTie()){Q=w(i)}else{Q=U.format(u.dateTimeFormat)}}}return Q}M=z.getGamesList;C=y.extend(y.PagingToolbar,{onRender:function(R,E){var Q=this;C.superclass.onRender.call(Q,R,E);Q.loading.hide();Q.items.itemAt(9).hide()},doLoad:function(Q){var E;E=this.grid;E.loadMask.onBeforeLoad();this.load(E.ltype,Q)}});K=y.extend(y.grid.GridPanel,{initComponent:function(){var Q,E=this;Q={disableSelection:true,loadMask:true,cm:new H.ColumnModel(E.getCMCfg()),viewConfig:{forceFit:true},bbar:new C({pageSize:u.pageSize,displayInfo:true,store:E.ds,grid:E,load:M})};y.apply(E,y.apply(E.initialConfig,Q));K.superclass.initComponent.apply(E,arguments);E.on("render",E.addGameTip);E.on("rowclick",E.onRowClk)},getCMCfg:function(){return[{header:n,resizable:false,width:c,renderer:t},{header:w("gameAgainst"),width:130,renderer:J},{header:w(g),width:220,renderer:B,dataIndex:o}]},onRowClk:function(R,U,T){var E,Q,S;T.stopEvent();Q=R.getStore().getAt(U).id;S=y.fly(T.getTarget());if(S.hasClass(a)){E=u.getGame(Q);u.showPlayer(E.getOpponent().id)}else{if(S.hasClass(m)){E=u.getGame(Q);u.showPlayer(E.x.id)}else{if(S.hasClass(k)){E=u.getGame(Q);u.showPlayer(E.o.id)}else{if(S.hasClass(d)){u.removeGame(Q)}else{if(S.hasClass(p)){u.refuseGame(Q)}else{u.showGame(Q)}}}}}},addGameTip:function(E){E.tip=new y.ToolTip({view:E.getView(),target:E.getView().mainBody,delegate:".x-grid3-row",trackMouse:true,renderTo:document.body,listeners:{beforeshow:function(S){var Q,R,T,U;U=S.view.findRowIndex(S.triggerElement);R=E.getStore().getAt(U).id;Q=u.getGame(R);T=w("game_type")+": ";if(Q.isPublic()){T+=w("game_public")}else{if(Q.isPublish()){T+=w("game_publish")}else{return false}}S.body.dom.innerHTML=T}}})},checkNumGames:function(){var E,Q;E=this.store;Q=E.getCount();if(Q>this.getBottomToolbar().pageSize){E.remove(E.getAt(Q-1))}}});x=y.extend(K,{getCMCfg:function(){return[{header:n,resizable:false,width:c,renderer:O},{header:w("player_x"),width:l,renderer:D},{header:w("player_o"),width:l,renderer:G},{header:w(g),width:160,renderer:I,dataIndex:o}]}});u.GameListWindow=y.extend(y.app.WinModule,{id:"gamelist-win",init:function(){var Q,E=this;Q=w(r);E.launcher={text:Q,iconCls:j,handler:E.showWindow,tooltip:Q,scope:E}},getWindow:function(){var E,Q;if(!N){Q=this.id;E=Q+"-public";N=this.app.getDesktop().createWindow({id:Q,title:w(r),width:400,height:500,minWidth:350,minHeight:300,x:250,y:0,closable:false,iconCls:j,shim:false,animCollapse:false,constrainHeader:true,layout:"fit",playSound:true,items:[{xtype:"tabpanel",border:false,activeTab:0,items:[{id:Q+"-mine",xtype:h,title:w("active"),ds:u.games},{id:Q+"-archive",xtype:h,title:w("archived"),ds:u.archivedGames,ltype:1,listeners:{activate:{fn:function(R){R.getBottomToolbar().doLoad(0)},single:true}}},{id:E,xtype:s,title:w("public"),ds:u.publicGames,ltype:2,closable:true,listeners:{activate:function(R){R.getStore().removeAll();R.getBottomToolbar().doLoad(0)}}}],listeners:{beforetabchange:function(T,S,R){if(N){N.publicTabActive=R.id==E}},tabchange:function(){if(N&&N.publicTabActive){N.checkPublicGames()}}}}],tools:[{id:"sound",handler:function(){N.toggleSound()},scope:N}],toggleSound:function(){var R=this;R.playSound=!R.playSound;R.tools.sound.toggleClass("x-tool-sound-mute")},checkPublicGames:function(){if(u.openedPublicGamesCount()===0&&this.getComponent(0).getActiveTab().id!=E){z.stopPublic()}}});N.toggleSound()}return N}});u.PagingToolbar=C;y.reg(h,K);y.reg(s,x)}());(function(){var g,h,i,j,k,l,n,o,p,q,a="all",b=90,c="1",d="combo",e="x",f="local";q=Ext;h=XOGame;k=_tr;n=q.util.Format.htmlEncode;i="value";j="text";function m(){var r,s;s=[];for(r=15;r<21;r++){s.push([""+r])}o=new Ext.data.SimpleStore({fields:[i],data:s});l=new Ext.data.SimpleStore({fields:[i,j],data:[[e,k("figure_x")],["o",k("figure_o")]]});p=new Ext.data.SimpleStore({fields:[i,j],data:[[c,k("game_normal")],["5",k("game_publish")],["3",k("game_public")]]})}g=q.extend(q.Window,{initComponent:function(){var s,r=this;if(!o){m()}s={items:[{layout:"form",border:false,bodyStyle:"padding:5px",labelWidth:b,defaults:{width:b},items:[{xtype:d,fieldLabel:k("gameSize"),store:o,displayField:i,triggerAction:a,editable:false,mode:f,value:"20"},{xtype:d,fieldLabel:k("play_with"),store:l,valueField:i,displayField:j,triggerAction:a,editable:false,mode:f,value:e},{xtype:d,fieldLabel:k("game_type"),store:p,valueField:i,displayField:j,triggerAction:a,editable:false,mode:f,value:c}],buttonAlign:"center",buttons:[{text:k("startNewGame"),listeners:{click:r.onNewGame,scope:r}}]}]};Ext.apply(r,Ext.apply(r.initialConfig,s));g.superclass.initComponent.call(r)},onNewGame:function(){var r,s,t,u;u=this.getComponent(0);s=u.getComponent(0).getValue();r=u.getComponent(1).getValue();t=u.getComponent(2).getValue();h.newGame(this.playerId,s,r,t);this.close()}});h.NewGameWindowModule=q.extend(q.app.WinModule,{id:"new-game-win",getWindow:function(r,v){var s,t,u,w,x,y;s=r.playerId;y=this.app.getDesktop();x=this.id;u=x+s;w=y.getWindow(u);if(!w&&v!==false){t=h.getPlayer(s);w=y.createWindow({id:u,title:String.format(k("newGameTitle"),n(t.username)),width:210,height:160,iconCls:"user",cls:x,resizable:false,shim:false,animCollapse:false,constrainHeader:true,playerId:s},g);w.animateTarget=null}return w}})})();(function(){var h,j,k,l,m,n,a="-list",b="accordion",c="username",d="lastlogin",e="-online",f="online_list_",g="players";h=XOGame;n=Ext;k=_tr;j=n.tree;l=n.data;m=h.Client.getPlayersList;function i(o){return{id:f+o.id,text:n.util.Format.htmlEncode(o.username),iconCls:"user",leaf:true,playerId:o.id}}h.PlayersWindow=n.extend(n.app.WinModule,{id:"players-win",init:function(){var p,o=this;p=k(g);o.launcher={text:p,iconCls:b,handler:o.showWindow,tooltip:p,scope:o};o.onlineData=null},getWindow:function(){var p,q,r,o=this;r=o.app.getDesktop();q=r.getWindow(o.id);if(!q){p=new l.Store({recordType:h.PlayerRecord,sortInfo:{field:d,direction:"DESC"}});q=r.createWindow({id:o.id,title:k(g),width:250,height:350,x:0,y:0,iconCls:b,shim:false,constrainHeader:true,layout:"fit",items:[{xtype:"tabpanel",border:false,activeTab:0,items:[{id:o.id+e,title:k("online"),xtype:"treepanel",loader:new j.TreeLoader(),rootVisible:false,lines:false,autoScroll:true,root:new j.AsyncTreeNode({children:o.onlineData}),listeners:{click:function(t){var s;s=t.attributes.playerId;if(s){h.showPlayer(s)}},render:function(s){new j.TreeSorter(s,{caseSensitive:true})}}},{id:o.id+a,title:k("list"),xtype:"grid",ds:p,cm:new n.grid.ColumnModel([{dataIndex:c,header:k(c),width:100},{dataIndex:d,header:k("lastLogin"),width:130,renderer:h.util.parseLastLogin}]),loadMask:true,viewConfig:{forceFit:true},bbar:new h.PagingToolbar({pageSize:h.pageSize,store:p,load:m,listeners:{render:function(){var t,s=this;s.grid=h.getPlayersModule().getListPanel();s.first.hide();s.last.hide();s.next.getEl().parent().insertAfter(s.prev.getEl().parent());t=s.items;t.itemAt(6).hide();t.itemAt(9).hide()}}}),listeners:{rowclick:function(t,v,u){var s;u.stopEvent();s=t.getStore().getAt(v);h.showPlayer(s.id)},activate:{fn:function(s){s.getBottomToolbar().doLoad(0)},single:true}}}]}]})}return q},setOnlinePlayers:function(r){var o,p,q;q=[];for(p=0,o=r.length;p<o;p++){q.push(i(r[p]))}this.onlineData=[{text:k("others"),expanded:true,iconCls:"online-others",children:q}]},getOnlinePanel:function(){return this.getWindow().findById(this.id+e)},getListPanel:function(){return this.getWindow().findById(this.id+a)},updateOnlineStatus:function(o,p){var q;q=this.getOnlinePanel().getRootNode().firstChild;if(p==="1"){q.appendChild(new j.TreeNode(i(o)));o.updateData({lastlogin:new Date()})}else{q.findChild("id",f+o.id).remove()}},getPlayerRecord:function(o){return this.getListPanel().getStore().getById(o)}})}());(function(){var f,g,h,i,j,k,l,m,o,p,q,a='.gif" />',b="<br/>",c="",d=150;i=1;m=2;g=[[/&lt;:[Oo]/g,i,"74_74"],[/(:o|\(clown)\)/g,m,"34"],[/:-ss/g,m,"42"],[/(:@|\(pig)\)/g,m,"49"],[/\(:\|/g,m,"37"],[/#:-?s/g,m,"18"],[/\((ap|plane)\)/g,i,"60_60"],[/&gt;-\)/g,m,"61"],[/\((A|a)\)/g,i,"angel_smile"],[/:-?@/g,i,"angry_smile"],[/[Xx]-?\(/g,m,"14"],[/8o\|/g,i,"48_48"],[/\((B|b)\)/g,i,"beer_mug"],[/o=&gt;/g,m,"73"],[/b-\(/g,m,"66"],[/:&quot;&gt;/g,m,"9"],[/\(\|\|\)/g,i,"56_56"],[/\((Z|z)\)/g,i,"guy"],[/\([Uu]\)/g,i,"broken_heart"],[/:-[Bb]/g,m,"26"],[/~o\)/g,m,"57"],[/\((\^|cake)\)/g,i,"cake"],[/\((P|p)\)/g,i,"camera"],[/\((@|cat)\)/g,i,"cat"],[/\((au|car)\)/g,i,"59_59"],[/~:&gt;/g,m,"52"],[/\((O|o|clock)\)/g,i,"clock"],[/%%-/g,m,"54"],[/\((C|c|coffee)\)/g,i,"coffee"],[/\(mo\)/g,i,"69_69"],[/\((H|h|cool)\)/g,i,"shades_smile"],[/b-\)/g,m,"16"],[/\(co\)/g,i,"63_63"],[/\(coy\)/g,m,"5"],[/\(6\)/g,i,"devil_smile"],[/:\|/g,i,"what_smile"],[/\((&amp;|dog)\)/g,i,"dog"],[/#-o/g,m,"40"],[/:\^\)/g,i,"71_71"],[/:-#/g,i,"47_47"],[/\([Ee]\)/g,i,"envelope"],[/:-?\$/g,i,"red_smile"],[/8-\)/g,i,"75_75"],[/\(~\)/g,i,"film"],[/\*\*==/g,m,"55"],[/:-[Ll]/g,m,"62"],[/\((G|g|gift)\)/g,i,"present"],[/:d/g,i,"teeth_smile"],[/\((X|x|girl)\)/g,i,"girl"],[/\(S\)/g,i,"moon"],[/\((L|l|heart)\)/g,i,"heart"],[/o-&gt;/g,m,"72"],[/@-\)/g,m,"43"],[/(:x|\(inlove\))/g,m,"8"],[/\((ip|island)\)/g,i,"62_62"],[/:-j/g,m,"78"],[/:-?\*/g,m,"11"],[/\(\{\)/g,i,"guy_hug"],[/\([Ii]\)/g,i,"lightbulb"],[/\(li\)/g,i,"73_73"],[/l-\)/g,m,"30"],[/:\^o/g,m,"44"],[/\((D|d|drink)\)/g,i,"martini"],[/\((mp|cell)\)/g,i,"64_64"],[/\$-\)/g,m,"64"],[/\((M|m|msn)\)/g,i,"messenger"],[/\((8|note)\)/g,i,"note"],[/8-\|/g,i,"49_49"],[/\[-\(/g,m,"33"],[/@\};-/g,m,"53"],[/\((pi|pizza)\)/g,i,"57_57"],[/\((pl|plate)\)/g,i,"55_55"],[/\[-o&lt;/g,m,"63"],[/\(~~\)/g,m,"56"],[/\([Kk]\)/g,i,"kiss"],[/\((F|f|rose)\)/g,i,"rose"],[/\(\}\)/g,i,"girl_hug"],[/\^o\)/g,i,"50_50"],[/\[-X/g,m,"68"],[/\((bah|sheep)\)/g,i,"70_70"],[/\+o\(/g,i,"52_52"],[/:-&amp;/g,m,"31"],[/:-&lt;/g,m,"46"],[/8-\}/g,m,"35"],[/8-X/g,m,"59"],[/\|-\)/g,i,"77_77"],[/[Ii]-\)/g,m,"28"],[/:&gt;/g,m,"15"],[/\((sn|snail)\)/g,i,"53_53"],[/\((so|soccer)\)/g,i,"58_58"],[/\((\*|star)\)/g,i,"star"],[/\(st\)/g,i,"66_66"],[/\((T|t)\)/g,i,"phone"],[/\=;/g,m,"27"],[/:-?\?/g,i,"72_72"],[/\([Nn]\)/g,i,"thumbs_down"],[/\([Yy]\)/g,i,"thumbs_up"],[/\(um\)/g,i,"61_61"],[/:-?\[/g,i,"bat"],[/:-w/g,m,"45"],[/\([Ww]\)/g,i,"wilted_rose"],[/:-&quot;/g,m,"65"],[/\(%\)/g,m,"75"],[/:-?\)+/g,m,"1"],[/:-?\(/g,m,"2"],[/;-?\)/g,m,"3"],[/:-?[dD]/g,m,"4"],[/:-?[pP]/g,m,"10"],[/:-?[Oo]/g,i,"omg_smile"],[/:-?[Ss]/g,i,"confused_smile"]];q=Ext;f=XOGame;h=_tr;j=q.TaskMgr;k=q.util.Format.htmlEncode;p=/<e t="([^"]+)" s="([^"]+)"\/>/;o="chat";function e(v){var r,u,w,x,y,z;for(w=0,r=g.length;w<r;w++){y=g[w];v=v.replace(y[0],'<e t="'+y[1]+'" s="'+y[2]+'"/>')}while((u=v.match(p))!==null){x=u[1];y=u[2];if(x==i){z='<img src="http://messenger.msn.com/Resource/emoticons/'+y+a}else{z='<img src="http://us.i1.yimg.com/us.yimg.com/i/mesg/emoticons6/'+y+a}v=v.replace(p,z)}return v}l=q.extend(q.app.WinModule,{id:o+"-win",init:function(){var s,r=this;s=h(o);r.launcher={text:s,iconCls:o,handler:r.showWindow,tooltip:s,scope:r}},getWindow:function(){var r,s,t,u;u=this.app.getDesktop();t=this.id;s=u.getWindow(t);if(!s){s=u.createWindow({id:t,title:h(o),width:250,height:d,x:0,y:350,iconCls:o,constrainHeader:true,border:false,items:[{xtype:o}],tools:[{id:"sound",handler:function(x,w,v){v.tools.sound.toggleClass("x-tool-sound-mute");v.chat.toggleSound()}}]});r=s.getComponent(0);s.chat=r;r.msgCt.body.update(h("chatWelcome")+b);s.on({resize:r.syncSize,activate:{fn:r.focusInput,scope:r,delay:50},scope:r})}return s}});function n(r){q.applyIf(r,{border:false,maxScroll:0,playSound:true,readOnly:false,type:c,items:[{cls:"msgCt",autoScroll:true}]});if(!r.readOnly){r.items.push({xtype:"textfield"})}n.superclass.constructor.call(this,r)}q.extend(n,q.Panel,{afterRender:function(){var r=this;r.msgCt=r.getComponent(0);r.msgInput=r.getComponent(1);n.superclass.afterRender.apply(r,arguments);r.syncSize()},initEvents:function(){var s,r=this;n.superclass.initEvents.apply(r,arguments);r.msgCt.on("render",function(t){var u,v;v=t.body;u=v.dom;this.scrollTask={run:function(){var w;if(this.maxScroll<=u.scrollTop){this.maxScroll=u.scrollTop;if(!v.scroll("down",5)){w=this.scrollTask;j.stop(w);delete w.taskStartTime}}},args:[],interval:d,scope:this}},r);s=r.msgInput;if(s){s.on("specialkey",function(u,t){if(t.getKey()==t.ENTER){this.sendMsg()}},r)}},focusInput:function(){var r;r=this.msgInput;if(r){r.focus()}},syncSize:function(){var r,u,v,w,s=this;w=s.container.getSize();r=w.height;v=s.scrollTask;u=s.msgInput;s.maxScroll=0;if(u){r-=22;s.msgInput.setWidth(w.width)}s.msgCt.setHeight(r);if(v&&!v.taskStartTime){j.start(v)}},toggleSound:function(){this.playSound=!this.playSound},sendMsg:function(){var r,s;s=this.msgInput;r=s.getValue();if(r!==c){f.Client.chat(r,this.type);this.addMsg(r,f.user);s.setValue(c)}},addMsg:function(v,s){var r,u;r=this.msgCt.body;u=this.scrollTask;r.createChild(k(s.username)+": "+e(k(v))+b);if(!u.taskStartTime){j.start(u)}if(this.playSound&&s.id!==f.user.id){f.notify()}}});f.ChatWindowModule=l;q.reg(o,n)}());(function(){var j,k,l,m,n,a="simMoves",b="lastmove",c="_",d="onmove",e="type",f="empty",g="simMove",h="o",i="x";k=XOGame;n=Ext;l=n.num;j=(function(){var o,p;p=0;return{setGame:function(q){o=q.net.keys;p=0},reset:function(){p=0},next:function(){return o[p++]||null},prev:function(){return p>0?o[--p]:null}}}());m={getOpponent:function(){var o=this;if(k.user.id===o.x.id){return o.o}else{return o.x}},isStartedByMe:function(){var o=this;return o.started===o[o.getMyFigure()].id},isMine:function(){var o;o=k.user.id;return this.x.id==o||this.o.id==o},inProgress:function(){return this.onmove>0},getWinner:function(){var o=this;if(o.onmove===-1){return o.x}else{if(o.onmove===-2){return o.o}else{return null}}},hasWinner:function(){return this.onmove===-1||this.onmove===-2},isTie:function(){return this.onmove===-3},isTieMove:function(){var o,p=this;o=p.size;return p.getMovesCount()==o*o},isNew:function(){return this.type%2===1},canRefuse:function(){return this.isNew()&&this.isStartedByMe()},getMyFigure:function(){if(k.user.id===this.x.id){return i}else{return h}},getOpponentFigure:function(){return this.getMyFigure()===i?h:i},getLastMoveFigure:function(){if(this.getMovesCount()<1){return null}return this.net.last()},myTurn:function(){return this.onmove===k.user.id},isXTurn:function(){return this.onmove===this.x.id},firstMoveX:function(){return this.started===this.x.id},getMyLastMove:function(){var o;o=this.getMovesCount()-1;if(this.myTurn()){o--}if(o<0){return null}return this.net.keys[o]},getLastMove:function(){var o;o=this.getMovesCount();if(o<1){return null}return this.net.keys[o-1]},getNet:function(){var o=this;if(o.isNetLoaded()){return o.net}throw new Error("net not loaded! ("+o.id+")")},setNet:function(p){var o,q,r;q=this.net;q.removeKey(f);if(p.length>0){if(this.firstMoveX()){r=i;o=h}else{r=h;o=i}n.each(p,function(t,s){q.add(t,s%2===0?r:o)})}},isNetLoaded:function(){return !this.net.containsKey(f)},getMovesCount:function(){return this.net.getCount()},makeSimMove:function(s,p){var o,q,r;r=this.getRecord();o=this.myTurn();q=this.isSimulation();if(!q||o){throw new Error("Not in simulation or your turn!")}this.simMove={coord:s,type:p,lastmove:new Date()};r.set(g,this.simMove)},updateField:function(t,u,v){var o,p,q,r,s,w,y,x=this;if(x.net.containsKey(t)){throw new Error("Field "+t+" not empty")}p=x.getRecord();q=u=="1";r=u=="2";o=x.isSimulation();w=x.isPublicList();s=x.isXTurn();if(o){x.simMoves.push(t)}else{p.beginEdit()}if(x.isNetLoaded()){x.net.add(t,s?i:h);if(typeof u=="undefined"){q=x.isWinMove(t);if(!q){r=x.isTieMove()}}}if(q){x.onmove=s?-1:-2}else{if(r){x.onmove=-3}else{x.onmove=s?x.o.id:x.x.id;if(x.isNew()){x.type--;p.set(e,x.type)}}}p.set(d,x.onmove);if(!o){v=v||new Date();x.lastmove=v;p.set(b,v);p.commit();y=p.store;if(y!==k.openedGames){y.remove(p);if(!w&&(q||r)){y=k.archivedGames}y.insert(0,p)}}},isWinMove:function(o){return this.getWinMoves(o).length>4},getWinMoves:function(u){var o,q,r,s,t,p=this;r=u.split(c);s=l(r[1]);r=l(r[0]);if(p.isNetLoaded()){o=p.net.get(u)}else{if(p.inProgress()){o=p.getMyFigure()}else{o=p.getLastMoveFigure()}}if(!o){throw new Error("Figure not found")}t=[u];q=1;while(p.net.key(r+c+(s+q))===o){t.push(r+c+(s+q));q++}q=1;while(p.net.key(r+c+(s-q))===o){t.push(r+c+(s-q));q++}if(t.length>4){return t}q=1;t=[u];while(p.net.key(r-q+c+s)===o){t.push(r-q+c+s);q++}q=1;while(p.net.key(r+q+c+s)===o){t.push(r+q+c+s);q++}if(t.length>4){return t}q=1;t=[u];while(p.net.key(r-q+c+(s+q))===o){t.push(r-q+c+(s+q));q++}q=1;while(p.net.key(r+q+c+(s-q))===o){t.push(r+q+c+(s-q));q++}if(t.length>4){return t}q=1;t=[u];while(p.net.key(r-q+c+(s-q))===o){t.push(r-q+c+(s-q));q++}q=1;while(p.net.key(r+q+c+(s+q))===o){t.push(r+q+c+(s+q));q++}if(t.length>4){return t}return[]},getRecord:function(){return k.getGameRecord(this.id)},isSimulation:function(){return this.simMoves!==null},isPublic:function(){var o;o=this.type;return o===2||o===3},isPublish:function(){var o;o=this.type;return o===4||o===5},isPublicList:function(){var o;o=this.type;return !this.isMine()&&(o===2||o===4)},getSimulationMoves:function(){return this.simMoves||[]},startSimulation:function(){var p,o=this;if(o.isSimulation()){throw new Error("Simulation already in progress")}p=o.getRecord();o.simMoves=[];p.beginEdit();p.set(a,o.simMoves)},endSimulation:function(){var o,p,r,s,t,q=this;t=q.getRecord();p=q.simMoves;if(!p){throw new Error("Simulation not in progress")}for(s=0,o=p.length;s<o;s++){q.net.removeAt(q.net.length-1)}t.reject(true);q.simMoves=null;q.onmove=t.get(d);q.type=t.get(e);r=q.simMove;if(r){q.updateField(r.coord,r.type,r.lastmove);q.simMove=null}},getNetIterator:function(){j.setGame(this);return j}};k.getGameInstance=function(o){if(m.id!=o.id){m.id=o.id;m.x=k.getPlayer(o.get("id_x"));m.o=k.getPlayer(o.get("id_o"));m.size=o.get("size");m.lastmove=o.get(b);m.onmove=o.get(d);m.started=o.get("started");m.type=o.get(e);m.net=o.get("net");m.simMoves=o.get(a)||null;m.simMove=o.get(g)||null}return m}}());(function(){var b;b=XOGame;function a(f,e,d){var c=this;c.id=f;c.username=e;c.lastlogin=d;c.lastupdate=d?new Date():null;b.addPlayer(c)}a.prototype={updateData:function(e){var c,d,f;if(b.getPlayersModule){c=b.getPlayersModule().getPlayerRecord(this.id);if(c){c.beginEdit();for(f in e){c.set(f,e[f])}c.commit();d=c.store;d.remove(c);d.insert(0,c)}}for(f in e){this[f]=e[f]}this.lastupdate=new Date()},needRefresh:function(){return !this.lastupdate||this.lastupdate.getElapsed()>300000}};b.Player=a})();Ext.override(Ext.ToolTip,{onTargetOver:function(c){var b,a=this;if(a.disabled||c.within(a.target.dom,true)){return}b=c.getTarget(a.delegate);if(b){a.triggerElement=b;a.clearTimer("hide");a.targetXY=c.getXY();a.delayShow()}},onMouseMove:function(c){var b,a=this;b=c.getTarget(a.delegate);if(b){a.targetXY=c.getXY();if(b===a.triggerElement){if(!a.hidden&&a.trackMouse){a.setPagePosition(a.getTargetXY())}}else{a.hide();a.lastActive=new Date(0);a.onTargetOver(c)}}else{if(!a.closable&&a.isVisible()){a.hide()}}},hide:function(){var a=this;a.clearTimer("dismiss");a.lastActive=new Date();delete a.triggerElement;Ext.ToolTip.superclass.hide.call(a)}});Ext.get("loading").remove();Ext.fly("loading-mask").fadeOut({remove:true});