<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -114,7 +114,7 @@ var player;
             showPlayerInfo:     true,
             showOptions:        true,
             showTools:          true,
-            showNavTree:        false,
+            showNavTree:        true,
             problemMode:        false
         };
         for (var key in params) {</diff>
      <filename>index.phtml</filename>
    </modified>
    <modified>
      <diff>@@ -539,6 +539,66 @@
 .eidogo-player .info a {
     color: #fff;
 }
+.eidogo-player .nav-tree-container {
+    float: right;
+    width: 420px;
+    height: 100px;
+    padding: 5px 0 5px 5px;
+    margin: 5px 0 5px 0;
+    overflow: auto;
+    background: #333;
+    display: none;
+    position: relative;
+}
+.eidogo-player .nav-tree table {
+    padding: 0;
+    margin: 0;
+    border-collapse: collapse;
+    border-spacing: 0;
+}
+.eidogo-player .nav-tree table td {
+    width: 24px;
+    height: 24px;
+    background: url(../images/navtree-line.gif);
+    padding: 0;
+}
+.eidogo-player .nav-tree .empty, .eidogo-player .nav-tree .elbow {
+    width: 19px;
+    height: 15px;
+    padding: 0 0 5px 5px;
+    background: #333;
+}
+.eidogo-player .nav-tree .elbow {
+    background: #333 url(../images/navtree-elbow.gif) 5px -2px no-repeat;
+}
+.eidogo-player .nav-tree a {
+    float: left;
+    margin: 0 0 5px 5px;
+    width: 19px;
+    height: 15px;
+    text-decoration: none;
+    font-size: 9px;
+    font-family: arial, helvetica, sans-serif;
+    text-align: center;
+    padding: 4px 0 0 0;
+    cursor: pointer;
+}
+.eidogo-player .nav-tree a.w {
+    background: url(../images/w.png);
+    color: #000;
+}
+.eidogo-player .nav-tree a.b {
+    background: url(../images/b.png);
+    color: #fff;
+}
+.eidogo-player .nav-tree a.x {
+    background: #444;
+    color: #ccc;
+}
+.eidogo-player .nav-tree a.current {
+    background: #822 !important;
+    color: #fff !important;
+}
 .eidogo-player .continuations {
     background: #aa9;
     padding: 5px;</diff>
      <filename>player/css/player-iphone.css</filename>
    </modified>
    <modified>
      <diff>@@ -618,53 +618,44 @@
 }
 .eidogo-player .nav-tree-container {
     float: right;
-    width: 375px;
+    width: 370px;
     height: 100px;
-    padding: 5px 0 5px 0;
+    padding: 5px 0 5px 5px;
     margin: 5px 0 5px 0;
     overflow: auto;
     background: #333;
     display: none;
     position: relative;
 }
-.eidogo-player .nav-tree ul {
-    clear: left;
-    margin: 0;
+.eidogo-player .nav-tree table {
     padding: 0;
-    list-style-type: none;
-    background: url(../images/navtree-left.gif) no-repeat;
-    background-position: 0 24px;
-    position: relative;
-    top: -24px;
-}
-.eidogo-player .nav-tree ul.root {
-    position: static;
-    top: 0;
-    padding-left: 5px;
-}
-.eidogo-player .nav-tree ul.root &gt; li {
-    padding-left: 0;
+    margin: 0;
+    border-collapse: collapse;
+    border-spacing: 0;
 }
-.eidogo-player .nav-tree ul.root &gt; li.first &gt; ul {
-    padding-bottom: 30px;
+.eidogo-player .nav-tree table td {
+    width: 24px;
+    height: 24px;
+    background: url(../images/navtree-line.gif);
+    padding: 0;
 }
-.eidogo-player .nav-tree li {
-    position: relative;
-    clear: left;
-    padding: 0 0 0 24px;
+.eidogo-player .nav-tree .empty, .eidogo-player .nav-tree .elbow {
+    width: 19px;
     height: 19px;
-    background: url(../images/navtree-elbow.gif) no-repeat;
+    padding: 0 0 5px 5px;
+    background: #333;
 }
-.eidogo-player .nav-tree li.first {
-    background: none;
-    cursor: pointer;
+.eidogo-player .nav-tree .elbow {
+    background: #333 url(../images/navtree-elbow.gif) 5px 0px no-repeat;
 }
-.eidogo-player .nav-tree li div.mainline {
-    height: 19px;
+.eidogo-player .nav-tree .line {
+    width: 24px;
+    height: 24px;
+    background: #333 url(../images/navtree-left.gif) 5px 0 no-repeat;
 }
 .eidogo-player .nav-tree a {
     float: left;
-    margin: 0 5px 5px 0;
+    margin: 0 0 5px 5px;
     width: 19px;
     height: 15px;
     text-decoration: none;
@@ -690,15 +681,6 @@
     background: #822 !important;
     color: #fff !important;
 }
-/*.eidogo-player .nav-tree li {
-    float: left;
-    background: red;
-    margin: 5px;
-    border: 1px solid yellow;
-}
-.eidogo-player .nav-tree li a {
-    display: block;
-}*/
 .eidogo-player .continuations {
     background: #aa9;
     padding: 5px;</diff>
      <filename>player/css/player.css</filename>
    </modified>
    <modified>
      <diff>@@ -613,45 +613,37 @@ _3c=_3c._children[0];
 }
 return _3c;
 },getPath:function(){
-var _3d=[];
-var cur=new eidogo.GameCursor(this.node);
-var mn=(cur.node._parent&amp;&amp;cur.node._parent._parent?-1:null);
-var _40;
-do{
-_40=cur.node;
-cur.previous();
-if(mn!=null){
+var n=this.node,_3e=[],mn=0;
+while(n&amp;&amp;n._parent&amp;&amp;n._parent._children.length==1&amp;&amp;n._parent._parent){
 mn++;
+n=n._parent;
 }
-}while(cur.hasPrevious()&amp;&amp;cur.node._children.length==1);
-if(mn!=null){
-_3d.push(mn);
+_3e.push(mn);
+while(n){
+if(n._parent&amp;&amp;(n._parent._children.length&gt;1||!n._parent._parent)){
+_3e.push(n.getPosition()||0);
 }
-_3d.push(_40.getPosition());
-do{
-if(cur.node._children.length&gt;1||cur.node._parent._parent==null){
-_3d.push(cur.node.getPosition());
+n=n._parent;
 }
-}while(cur.previous());
-return _3d.reverse();
+return _3e.reverse();
 },getPathMoves:function(){
-var _41=[];
+var _40=[];
 var cur=new eidogo.GameCursor(this.node);
-_41.push(cur.node.getMove());
+_40.push(cur.node.getMove());
 while(cur.previous()){
-var _43=cur.node.getMove();
-if(_43){
-_41.push(_43);
+var _42=cur.node.getMove();
+if(_42){
+_40.push(_42);
 }
 }
-return _41.reverse();
+return _40.reverse();
 },getMoveNumber:function(){
-var num=0,_45=this.node;
-while(_45){
-if(_45.W||_45.B){
+var num=0,_44=this.node;
+while(_44){
+if(_44.W||_44.B){
 num++;
 }
-_45=_45._parent;
+_44=_44._parent;
 }
 return num;
 },getGameRoot:function(){
@@ -1283,9 +1275,6 @@ this.prefs.showTools=!!cfg.showTools;
 this.prefs.showComments=typeof cfg.showComments!=&quot;undefined&quot;?!!cfg.showComments:true;
 this.prefs.showOptions=!!cfg.showOptions;
 this.prefs.showNavTree=!this.progressiveLoad&amp;&amp;typeof cfg.showNavTree!=&quot;undefined&quot;?!!cfg.showNavTree:false;
-if(this.prefs.showNavTree&amp;&amp;!(eidogo.browser.moz||eidogo.browser.safari3)){
-this.prefs.showNavTree=false;
-}
 },loadSgf:function(cfg,_16){
 cfg=cfg||{};
 this.nowLoading();
@@ -1347,6 +1336,7 @@ if(!_17&amp;&amp;typeof _16==&quot;function&quot;){
 _16();
 }
 },load:function(_1e,_1f){
+var _20=false;
 if(!_1f){
 _1f=new eidogo.GameNode();
 this.collectionRoot=_1f;
@@ -1356,11 +1346,12 @@ _1f._cached=true;
 this.doneLoading();
 this.progressiveLoads--;
 if(!_1f._parent){
-var _20=this.loadPath.length?parseInt(this.loadPath[0],10):0;
-this.initGame(_1f._children[_20||0]);
+var _21=this.loadPath.length?parseInt(this.loadPath[0],10):0;
+this.initGame(_1f._children[_21||0]);
+_20=true;
 }
 if(this.loadPath.length){
-this.goTo(this.loadPath,false);
+this.goTo(this.loadPath,_20);
 if(!this.progressiveLoad){
 this.loadPath=[0,0];
 }
@@ -1374,63 +1365,63 @@ this.currentColor=this.problemColor=this.cursor.getNextColor();
 this.currentColor=this.problemColor;
 }
 }
-},remoteLoad:function(url,_22,_23,_24,_25){
-_23=_23==&quot;undefined&quot;?true:_23;
-_25=(typeof _25==&quot;function&quot;)?_25:null;
-if(_23){
-if(!_22){
+},remoteLoad:function(url,_23,_24,_25,_26){
+_24=_24==&quot;undefined&quot;?true:_24;
+_26=(typeof _26==&quot;function&quot;)?_26:null;
+if(_24){
+if(!_23){
 this.gameName=url;
 }
 url=this.sgfPath+url+&quot;.sgf&quot;;
 }
-if(_24){
-this.loadPath=_24;
+if(_25){
+this.loadPath=_25;
 }
-var _26=function(req){
-var _28=req.responseText.replace(/^( |\t|\r|\n)*/,&quot;&quot;);
-if(_28.charAt(0)==&quot;(&quot;){
+var _27=function(req){
+var _29=req.responseText.replace(/^( |\t|\r|\n)*/,&quot;&quot;);
+if(_29.charAt(0)==&quot;(&quot;){
 var me=this;
-var sgf=new eidogo.SgfParser(_28,function(){
-me.load(this.root,_22);
-_25&amp;&amp;_25();
+var sgf=new eidogo.SgfParser(_29,function(){
+me.load(this.root,_23);
+_26&amp;&amp;_26();
 });
 }else{
-if(_28.charAt(0)==&quot;{&quot;){
-_28=eval(&quot;(&quot;+_28+&quot;)&quot;);
-this.load(_28,_22);
-_25&amp;&amp;_25();
+if(_29.charAt(0)==&quot;{&quot;){
+_29=eval(&quot;(&quot;+_29+&quot;)&quot;);
+this.load(_29,_23);
+_26&amp;&amp;_26();
 }else{
 this.croak(t[&quot;invalid data&quot;]);
 }
 }
 };
-var _2b=function(req){
+var _2c=function(req){
 this.croak(t[&quot;error retrieving&quot;]);
 };
-_3(&quot;get&quot;,url,null,_26,_2b,this,30000);
-},initGame:function(_2d){
-_2d=_2d||{};
+_3(&quot;get&quot;,url,null,_27,_2c,this,30000);
+},initGame:function(_2e){
+_2e=_2e||{};
 this.handleDisplayPrefs();
-var _2e=_2d.SZ||19;
-if(_2e!=9&amp;&amp;_2e!=13&amp;&amp;_2e!=19){
-_2e=19;
+var _2f=_2e.SZ||19;
+if(_2f!=9&amp;&amp;_2f!=13&amp;&amp;_2f!=19){
+_2f=19;
 }
 if(this.shrinkToFit){
-this.calcShrinkToFit(_2d,_2e);
+this.calcShrinkToFit(_2e,_2f);
 }
 if(!this.board){
-this.createBoard(_2e);
+this.createBoard(_2f);
 this.rules=new eidogo.Rules(this.board);
 }
 this.unsavedChanges=false;
 this.resetCursor(true);
 this.totalMoves=0;
-var _2f=new eidogo.GameCursor(this.cursor.node);
-while(_2f.next()){
+var _30=new eidogo.GameCursor(this.cursor.node);
+while(_30.next()){
 this.totalMoves++;
 }
 this.totalMoves--;
-this.showGameInfo(_2d);
+this.showGameInfo(_2e);
 this.enableNavSlider();
 this.selectTool(this.mode==&quot;view&quot;?&quot;view&quot;:&quot;play&quot;);
 this.hook(&quot;initGame&quot;);
@@ -1444,16 +1435,16 @@ if(!this.showingSearch){
 }
 (this.prefs.showOptions?_a:_b)(this.dom.options);
 (this.prefs.showNavTree?_a:_b)(this.dom.navTreeContainer);
-},createBoard:function(_30){
-_30=_30||19;
-if(this.board&amp;&amp;this.board.renderer&amp;&amp;this.board.boardSize==_30){
+},createBoard:function(_31){
+_31=_31||19;
+if(this.board&amp;&amp;this.board.renderer&amp;&amp;this.board.boardSize==_31){
 return;
 }
 try{
 this.dom.boardContainer.innerHTML=&quot;&quot;;
-var _31=(this.renderer==&quot;flash&quot;?eidogo.BoardRendererFlash:eidogo.BoardRendererHtml);
-var _32=new _31(this.dom.boardContainer,_30,this,this.cropParams);
-this.board=new eidogo.Board(_32,_30);
+var _32=(this.renderer==&quot;flash&quot;?eidogo.BoardRendererFlash:eidogo.BoardRendererHtml);
+var _33=new _32(this.dom.boardContainer,_31,this,this.cropParams);
+this.board=new eidogo.Board(_33,_31);
 }
 catch(e){
 if(e==&quot;No DOM container&quot;){
@@ -1461,30 +1452,30 @@ this.croak(t[&quot;error board&quot;]);
 return;
 }
 }
-},calcShrinkToFit:function(_33,_34){
+},calcShrinkToFit:function(_34,_35){
 var l=null,t=null,r=null,b=null;
-var _38={};
+var _39={};
 var me=this;
-_33.walk(function(_3a){
-var _3b,i,_3d;
-for(_3b in _3a){
-if(/^(W|B|AW|AB|LB)$/.test(_3b)){
-_3d=_3a[_3b];
-if(!(_3d instanceof Array)){
-_3d=[_3d];
+_34.walk(function(_3b){
+var _3c,i,_3e;
+for(_3c in _3b){
+if(/^(W|B|AW|AB|LB)$/.test(_3c)){
+_3e=_3b[_3c];
+if(!(_3e instanceof Array)){
+_3e=[_3e];
 }
-if(_3b!=&quot;LB&quot;){
-_3d=me.expandCompressedPoints(_3d);
+if(_3c!=&quot;LB&quot;){
+_3e=me.expandCompressedPoints(_3e);
 }else{
-_3d=[_3d[0].split(/:/)[0]];
+_3e=[_3e[0].split(/:/)[0]];
 }
-for(i=0;i&lt;_3d.length;i++){
-_38[_3d[i]]=&quot;&quot;;
+for(i=0;i&lt;_3e.length;i++){
+_39[_3e[i]]=&quot;&quot;;
 }
 }
 }
 });
-for(var key in _38){
+for(var key in _39){
 var pt=this.sgfCoordToPoint(key);
 if(l==null||pt.x&lt;l){
 l=pt.x;
@@ -1504,64 +1495,64 @@ this.cropParams.height=b-t+1;
 this.cropParams.left=l;
 this.cropParams.top=t;
 var pad=this.cropParams.padding;
-for(var _41=pad;l-_41&lt;0;_41--){
-}
-if(_41){
-this.cropParams.width+=_41;
-this.cropParams.left-=_41;
-}
-for(var _42=pad;t-_42&lt;0;_42--){
+for(var _42=pad;l-_42&lt;0;_42--){
 }
 if(_42){
-this.cropParams.height+=_42;
-this.cropParams.top-=_42;
+this.cropParams.width+=_42;
+this.cropParams.left-=_42;
 }
-for(var _43=pad;r+_43&gt;_34;_43--){
+for(var _43=pad;t-_43&lt;0;_43--){
 }
 if(_43){
-this.cropParams.width+=_43;
+this.cropParams.height+=_43;
+this.cropParams.top-=_43;
 }
-for(var _44=pad;b+_44&gt;_34;_44--){
+for(var _44=pad;r+_44&gt;_35;_44--){
 }
 if(_44){
-this.cropParams.height+=_44;
+this.cropParams.width+=_44;
+}
+for(var _45=pad;b+_45&gt;_35;_45--){
+}
+if(_45){
+this.cropParams.height+=_45;
 }
 },fetchOpponentMove:function(){
 this.nowLoading(t[&quot;gnugo thinking&quot;]);
-var _45=function(req){
+var _46=function(req){
 this.doneLoading();
 this.createMove(req.responseText);
 };
-var _47=function(req){
+var _48=function(req){
 this.croak(t[&quot;error retrieving&quot;]);
 };
-var _49=this.cursor.getGameRoot();
-var _4a={sgf:_49.toSgf(),move:this.currentColor,size:_49.SZ,level:this.opponentLevel};
-_3(&quot;post&quot;,this.opponentUrl,_4a,_45,_47,this,45000);
+var _4a=this.cursor.getGameRoot();
+var _4b={sgf:_4a.toSgf(),move:this.currentColor,size:_4a.SZ,level:this.opponentLevel};
+_3(&quot;post&quot;,this.opponentUrl,_4b,_46,_48,this,45000);
 },fetchScoreEstimate:function(){
 this.nowLoading(t[&quot;gnugo thinking&quot;]);
-var _4b=function(req){
+var _4c=function(req){
 this.doneLoading();
-var _4d=req.responseText.split(&quot;\n&quot;);
-var _4e,_4f=_4d[1].split(&quot; &quot;);
-for(var i=0;i&lt;_4f.length;i++){
-_4e=_4f[i].split(&quot;:&quot;);
-if(_4e[1]){
-this.addMarker(_4e[1],_4e[0]);
+var _4e=req.responseText.split(&quot;\n&quot;);
+var _4f,_50=_4e[1].split(&quot; &quot;);
+for(var i=0;i&lt;_50.length;i++){
+_4f=_50[i].split(&quot;:&quot;);
+if(_4f[1]){
+this.addMarker(_4f[1],_4f[0]);
 }
 }
 this.board.render();
-this.prependComment(_4d[0]);
+this.prependComment(_4e[0]);
 };
-var _51=function(req){
+var _52=function(req){
 this.croak(t[&quot;error retrieving&quot;]);
 };
-var _53=this.cursor.getGameRoot();
-var _54={sgf:_53.toSgf(),move:&quot;est&quot;,size:_53.SZ||19,komi:_53.KM||0,mn:this.moveNumber+1};
-_3(&quot;post&quot;,this.scoreEstUrl,_54,_4b,_51,this,45000);
-},playProblemResponse:function(_55){
+var _54=this.cursor.getGameRoot();
+var _55={sgf:_54.toSgf(),move:&quot;est&quot;,size:_54.SZ||19,komi:_54.KM||0,mn:this.moveNumber+1};
+_3(&quot;post&quot;,this.scoreEstUrl,_55,_4c,_52,this,45000);
+},playProblemResponse:function(_56){
 setTimeout(function(){
-this.variation(null,_55);
+this.variation(null,_56);
 if(this.hooks.playProblemResponse){
 this.hook(&quot;playProblemResponse&quot;);
 }else{
@@ -1570,42 +1561,42 @@ this.prependComment(t[&quot;end of variation&quot;]);
 }
 }
 }.bind(this),200);
-},goTo:function(_56,_57){
-_57=typeof _57!=&quot;undefined&quot;?_57:true;
-if(_57){
+},goTo:function(_57,_58){
+_58=typeof _58!=&quot;undefined&quot;?_58:true;
+if(_58){
 this.resetCursor(true);
 }
-var _58=parseInt(_56,10);
-if(!(_56 instanceof Array)&amp;&amp;!isNaN(_58)){
-if(_57){
-_58++;
+var _59=parseInt(_57,10);
+if(!(_57 instanceof Array)&amp;&amp;!isNaN(_59)){
+if(_58){
+_59++;
 }
-for(var i=0;i&lt;_58;i++){
+for(var i=0;i&lt;_59;i++){
 this.variation(null,true);
 }
 this.refresh();
 return;
 }
-if(!(_56 instanceof Array)||!_56.length){
-alert(t[&quot;bad path&quot;]+&quot; &quot;+_56);
+if(!(_57 instanceof Array)||!_57.length){
+alert(t[&quot;bad path&quot;]+&quot; &quot;+_57);
 return;
 }
-var _5a;
 var _5b;
-if(isNaN(parseInt(_56[0],10))){
+var _5c;
+if(isNaN(parseInt(_57[0],10))){
 if(!this.cursor.node._parent){
 this.variation(0,true);
 }
-while(_56.length){
+while(_57.length){
 if(this.progressiveLoads&gt;0){
-this.loadPath.push(_5a);
+this.loadPath.push(_5b);
 return;
 }
-_5a=_56.shift();
-_5b=this.getVariations();
-for(var i=0;i&lt;_5b.length;i++){
-if(_5b[i].move==_5a){
-this.variation(_5b[i].varNum,true);
+_5b=_57.shift();
+_5c=this.getVariations();
+for(var i=0;i&lt;_5c.length;i++){
+if(_5c[i].move==_5b){
+this.variation(_5c[i].varNum,true);
 break;
 }
 }
@@ -1613,42 +1604,42 @@ break;
 this.refresh();
 return;
 }
-var _5c=true;
-while(_56.length){
-_5a=parseInt(_56.shift(),10);
-if(!_56.length){
-for(var i=0;i&lt;_5a;i++){
+var _5d=true;
+while(_57.length){
+_5b=parseInt(_57.shift(),10);
+if(!_57.length){
+for(var i=0;i&lt;_5b;i++){
 this.variation(0,true);
 }
 }else{
-if(_56.length){
-if(!_5c&amp;&amp;this.cursor.node._parent._parent){
+if(_57.length){
+if(!_5d&amp;&amp;_58){
 while(this.cursor.node._children.length==1){
 this.variation(0,true);
 }
 }
-this.variation(_5a,true);
+this.variation(_5b,true);
 }
 }
-_5c=false;
+_5d=false;
 }
 this.refresh();
-},resetCursor:function(_5d,_5e){
+},resetCursor:function(_5e,_5f){
 this.board.reset();
 this.resetCurrentColor();
-if(_5e){
+if(_5f){
 this.cursor.node=this.cursor.getGameRoot();
 }else{
 this.cursor.node=this.collectionRoot;
 }
-this.refresh(_5d);
+this.refresh(_5e);
 },resetCurrentColor:function(){
 this.currentColor=(this.problemMode?this.problemColor:&quot;B&quot;);
-var _5f=this.cursor.getGameRoot();
-if(_5f&amp;&amp;_5f.HA&gt;1){
+var _60=this.cursor.getGameRoot();
+if(_60&amp;&amp;_60.HA&gt;1){
 this.currentColor=&quot;W&quot;;
 }
-},refresh:function(_60){
+},refresh:function(_61){
 if(this.progressiveLoads&gt;0){
 var me=this;
 setTimeout(function(){
@@ -1657,10 +1648,10 @@ me.refresh.call(me);
 return;
 }
 this.board.revert(1);
-this.execNode(_60);
-},variation:function(_62,_63){
-if(this.cursor.next(_62)){
-this.execNode(_63);
+this.execNode(_61);
+},variation:function(_63,_64){
+if(this.cursor.next(_63)){
+this.execNode(_64);
 this.resetLastLabels();
 if(this.progressiveLoads&gt;0){
 return false;
@@ -1668,18 +1659,18 @@ return false;
 return true;
 }
 return false;
-},execNode:function(_64,_65){
-if(!_65&amp;&amp;this.progressiveLoads&gt;0){
+},execNode:function(_65,_66){
+if(!_66&amp;&amp;this.progressiveLoads&gt;0){
 var me=this;
 setTimeout(function(){
-me.execNode.call(me,_64);
+me.execNode.call(me,_65);
 },10);
 return;
 }
 if(!this.cursor.node){
 return;
 }
-if(!_64){
+if(!_65){
 this.dom.comments.innerHTML=&quot;&quot;;
 this.board.clearMarkers();
 this.moveNumber=this.cursor.getMoveNumber();
@@ -1687,13 +1678,13 @@ this.moveNumber=this.cursor.getMoveNumber();
 if(this.moveNumber&lt;1){
 this.resetCurrentColor();
 }
-var _67=this.cursor.node.getProperties();
-for(var _68 in _67){
-if(this.propertyHandlers[_68]){
-(this.propertyHandlers[_68]).apply(this,[this.cursor.node[_68],_68,_64]);
+var _68=this.cursor.node.getProperties();
+for(var _69 in _68){
+if(this.propertyHandlers[_69]){
+(this.propertyHandlers[_69]).apply(this,[this.cursor.node[_69],_69,_65]);
 }
 }
-if(_64){
+if(_65){
 this.board.commit();
 }else{
 if(this.opponentUrl&amp;&amp;this.opponentColor==this.currentColor&amp;&amp;this.moveNumber==this.totalMoves){
@@ -1704,61 +1695,59 @@ this.updateControls();
 this.board.commit();
 this.board.render();
 }
-if(!_65&amp;&amp;this.progressiveUrl){
+if(!_66&amp;&amp;this.progressiveUrl){
 this.fetchProgressiveData();
 }
 if(this.problemMode&amp;&amp;this.currentColor&amp;&amp;this.currentColor!=this.problemColor&amp;&amp;!this.goingBack){
-this.playProblemResponse(_64);
+this.playProblemResponse(_65);
 }
 this.goingBack=false;
-},fetchProgressiveData:function(_69){
-var _6a=this.cursor.node||null;
-if(_6a&amp;&amp;_6a._cached){
+},fetchProgressiveData:function(_6a){
+var _6b=this.cursor.node||null;
+if(_6b&amp;&amp;_6b._cached){
 return;
 }
 if(this.progressiveMode==&quot;pattern&quot;){
-if(_6a&amp;&amp;!_6a._parent._parent){
+if(_6b&amp;&amp;!_6b._parent._parent){
 return;
 }
-this.fetchProgressiveContinuations(_69);
+this.fetchProgressiveContinuations(_6a);
 }else{
-var _6b=(_6a&amp;&amp;_6a._id)||0;
+var _6c=(_6b&amp;&amp;_6b._id)||0;
 this.nowLoading();
 this.progressiveLoads++;
-this.updatedNavTree=false;
-var _6c=function(){
-var _6d=this.cursor.getMoveNumber();
-if(_6d&gt;1){
+var _6d=function(){
+var _6e=this.cursor.getMoveNumber();
+if(_6e&gt;1){
 this.cursor.node.C=&quot;&lt;a id='cont-search' href='#'&gt;&quot;+t[&quot;show games&quot;]+&quot;&lt;/a&gt;&quot;+(this.cursor.node.C||&quot;&quot;);
 }
 this.refresh();
-if(_69&amp;&amp;typeof _69==&quot;function&quot;){
-_69();
+if(_6a&amp;&amp;typeof _6a==&quot;function&quot;){
+_6a();
 }
 _4(_2(&quot;cont-search&quot;),&quot;click&quot;,function(e){
-var _6f=8;
-var _70=this.board.getRegion(0,19-_6f,_6f,_6f);
-var _71=this.convertRegionPattern(_70);
-this.loadSearch(&quot;ne&quot;,_6f+&quot;x&quot;+_6f,this.compressPattern(_71));
+var _70=8;
+var _71=this.board.getRegion(0,19-_70,_70,_70);
+var _72=this.convertRegionPattern(_71);
+this.loadSearch(&quot;ne&quot;,_70+&quot;x&quot;+_70,this.compressPattern(_72));
 _7(e);
 }.bind(this));
 }.bind(this);
-var url=this.progressiveUrl+&quot;?&quot;+eidogo.util.makeQueryString({id:_6b,pid:this.uniq});
-this.remoteLoad(url,_6a,false,null,_6c);
+var url=this.progressiveUrl+&quot;?&quot;+eidogo.util.makeQueryString({id:_6c,pid:this.uniq});
+this.remoteLoad(url,_6b,false,null,_6d);
 }
-},fetchProgressiveContinuations:function(_73){
+},fetchProgressiveContinuations:function(_74){
 this.nowLoading();
 this.progressiveLoads++;
-this.updatedNavTree=false;
-var _74=this.cursor.getMoveNumber();
-var _75=(_74&gt;1?11:7);
-var _76=19-_75-1;
-var _77=this.board?this.convertRegionPattern(this.board.getRegion(0,_76+1,_75,_75)):&quot;.................................................&quot;;
-var _78={q:&quot;ne&quot;,w:_75,h:_75,p:_77,a:&quot;continuations&quot;,t:(new Date()).getTime()};
-var _79=function(req){
+var _75=this.cursor.getMoveNumber();
+var _76=(_75&gt;1?11:7);
+var _77=19-_76-1;
+var _78=this.board?this.convertRegionPattern(this.board.getRegion(0,_77+1,_76,_76)):&quot;.................................................&quot;;
+var _79={q:&quot;ne&quot;,w:_76,h:_76,p:_78,a:&quot;continuations&quot;,t:(new Date()).getTime()};
+var _7a=function(req){
 this.croak(t[&quot;error retrieving&quot;]);
 };
-var _7b=function(req){
+var _7c=function(req){
 if(!req.responseText||req.responseText==&quot;NONE&quot;){
 this.progressiveLoads--;
 this.doneLoading();
@@ -1766,64 +1755,64 @@ this.cursor.node._cached=true;
 this.refresh();
 return;
 }
-var _7d={LB:[],_children:[]},_7e;
-_7d.C=_74&gt;1?&quot;&lt;a id='cont-search' href='#'&gt;&quot;+t[&quot;show games&quot;]+&quot;&lt;/a&gt;&quot;:&quot;&quot;;
-var _7f,_80=eval(&quot;(&quot;+req.responseText+&quot;)&quot;);
-if(_80.length){
-_80.sort(function(a,b){
+var _7e={LB:[],_children:[]},_7f;
+_7e.C=_75&gt;1?&quot;&lt;a id='cont-search' href='#'&gt;&quot;+t[&quot;show games&quot;]+&quot;&lt;/a&gt;&quot;:&quot;&quot;;
+var _80,_81=eval(&quot;(&quot;+req.responseText+&quot;)&quot;);
+if(_81.length){
+_81.sort(function(a,b){
 return parseInt(b.count,10)-parseInt(a.count,10);
 });
-var _83=parseInt(_80[0].count,10);
-var x,y,_86,_87;
-_7d.C+=&quot;&lt;div class='continuations'&gt;&quot;;
-for(var i=0;_7f=_80[i];i++){
-_87=parseInt(_7f.count/_83*150);
-if(_83&gt;20&amp;&amp;parseInt(_7f.count,10)&lt;10){
+var _84=parseInt(_81[0].count,10);
+var x,y,_87,_88;
+_7e.C+=&quot;&lt;div class='continuations'&gt;&quot;;
+for(var i=0;_80=_81[i];i++){
+_88=parseInt(_80.count/_84*150);
+if(_84&gt;20&amp;&amp;parseInt(_80.count,10)&lt;10){
 continue;
 }
-_7e={};
-x=_76+parseInt(_7f.x,10)+1;
-y=parseInt(_7f.y,10);
-_86=this.pointToSgfCoord({x:x,y:y});
-_7e[this.currentColor||&quot;B&quot;]=_86;
-_7d.LB.push(_86+&quot;:&quot;+_7f.label);
-if(_87){
-_7d.C+=&quot;&lt;div class='continuation'&gt;&quot;+&quot;&lt;div class='cont-label'&gt;&quot;+_7f.label+&quot;&lt;/div&gt;&quot;+&quot;&lt;div class='cont-bar' style='width: &quot;+_87+&quot;px'&gt;&lt;/div&gt;&quot;+&quot;&lt;div class='cont-count'&gt;&quot;+_7f.count+&quot;&lt;/div&gt;&quot;+&quot;&lt;/div&gt;&quot;;
+_7f={};
+x=_77+parseInt(_80.x,10)+1;
+y=parseInt(_80.y,10);
+_87=this.pointToSgfCoord({x:x,y:y});
+_7f[this.currentColor||&quot;B&quot;]=_87;
+_7e.LB.push(_87+&quot;:&quot;+_80.label);
+if(_88){
+_7e.C+=&quot;&lt;div class='continuation'&gt;&quot;+&quot;&lt;div class='cont-label'&gt;&quot;+_80.label+&quot;&lt;/div&gt;&quot;+&quot;&lt;div class='cont-bar' style='width: &quot;+_88+&quot;px'&gt;&lt;/div&gt;&quot;+&quot;&lt;div class='cont-count'&gt;&quot;+_80.count+&quot;&lt;/div&gt;&quot;+&quot;&lt;/div&gt;&quot;;
 }
-_7d._children.push(_7e);
+_7e._children.push(_7f);
 }
-_7d.C+=&quot;&lt;/div&gt;&quot;;
+_7e.C+=&quot;&lt;/div&gt;&quot;;
 if(!this.cursor.node){
-_7d={_children:[_7d]};
+_7e={_children:[_7e]};
 }
 }
-this.load(_7d,this.cursor.node);
+this.load(_7e,this.cursor.node);
 _4(_2(&quot;cont-search&quot;),&quot;click&quot;,function(e){
-this.loadSearch(&quot;ne&quot;,_75+&quot;x&quot;+_75,this.compressPattern(_77));
+this.loadSearch(&quot;ne&quot;,_76+&quot;x&quot;+_76,this.compressPattern(_78));
 _7(e);
 }.bind(this));
-if(_73&amp;&amp;typeof _73==&quot;function&quot;){
-_73();
+if(_74&amp;&amp;typeof _74==&quot;function&quot;){
+_74();
 }
 }.bind(this);
-_3(&quot;get&quot;,this.progressiveUrl,_78,_7b,_79,this,45000);
+_3(&quot;get&quot;,this.progressiveUrl,_79,_7c,_7a,this,45000);
 },findVariations:function(){
 this.variations=this.getVariations();
 },getVariations:function(){
-var _8a=[],_8b=this.cursor.node._children;
-for(var i=0;i&lt;_8b.length;i++){
-_8a.push({move:_8b[i].getMove(),varNum:i});
+var _8b=[],_8c=this.cursor.node._children;
+for(var i=0;i&lt;_8c.length;i++){
+_8b.push({move:_8c[i].getMove(),varNum:i});
 }
-return _8a;
-},back:function(e,obj,_8f){
+return _8b;
+},back:function(e,obj,_90){
 if(this.cursor.previous()){
 this.board.revert(1);
 this.goingBack=true;
-this.refresh(_8f);
+this.refresh(_90);
 this.resetLastLabels();
 }
-},forward:function(e,obj,_92){
-this.variation(null,_92);
+},forward:function(e,obj,_93){
+this.variation(null,_93);
 },first:function(){
 if(!this.cursor.hasPrevious()){
 return;
@@ -1872,9 +1861,9 @@ if(this.mouseDown||this.regionBegun){
 if(!this.boundsCheck(x,y,[0,this.board.boardSize-1])){
 return;
 }
-var _9e=(x!=this.mouseDownX||y!=this.mouseDownY);
-var _9f=Math.abs(this.mouseDownClickX-cx)&gt;=19||Math.abs(this.mouseDownClickY-cy)&gt;=19;
-if(this.searchUrl&amp;&amp;!this.regionBegun&amp;&amp;_9e&amp;&amp;_9f){
+var _9f=(x!=this.mouseDownX||y!=this.mouseDownY);
+var _a0=Math.abs(this.mouseDownClickX-cx)&gt;=19||Math.abs(this.mouseDownClickY-cy)&gt;=19;
+if(this.searchUrl&amp;&amp;!this.regionBegun&amp;&amp;_9f&amp;&amp;_a0){
 this.selectTool(&quot;region&quot;);
 this.regionBegun=true;
 this.regionTop=this.mouseDownY;
@@ -1892,11 +1881,11 @@ if(this.domLoading){
 return;
 }
 this.mouseDown=false;
-var _a3=this.pointToSgfCoord({x:x,y:y});
+var _a4=this.pointToSgfCoord({x:x,y:y});
 if(this.mode==&quot;view&quot;||this.mode==&quot;play&quot;){
 for(var i=0;i&lt;this.variations.length;i++){
-var _a5=this.sgfCoordToPoint(this.variations[i].move);
-if(_a5.x==x&amp;&amp;_a5.y==y){
+var _a6=this.sgfCoordToPoint(this.variations[i].move);
+if(_a6.x==x&amp;&amp;_a6.y==y){
 this.variation(this.variations[i].varNum);
 _7(e);
 return;
@@ -1904,15 +1893,15 @@ return;
 }
 }
 if(this.mode==&quot;view&quot;){
-var _a6=this.cursor.getGameRoot(),_a7=[0,_a6.getPosition()],mn=0,_a9=_a6._children[0];
-while(_a9){
-if(_a9.getMove()==_a3){
-_a7.push(mn);
-this.goTo(_a7);
+var _a7=this.cursor.getGameRoot(),_a8=[0,_a7.getPosition()],mn=0,_aa=_a7._children[0];
+while(_aa){
+if(_aa.getMove()==_a4){
+_a8.push(mn);
+this.goTo(_a8);
 break;
 }
 mn++;
-_a9=_a9._children[0];
+_aa=_aa._children[0];
 }
 return;
 }
@@ -1920,12 +1909,12 @@ if(this.mode==&quot;play&quot;){
 if(!this.rules.check({x:x,y:y},this.currentColor)){
 return;
 }
-if(_a3){
-var _aa=this.cursor.getNextMoves();
-if(_aa&amp;&amp;_a3 in _aa){
-this.variation(_aa[_a3]);
+if(_a4){
+var _ab=this.cursor.getNextMoves();
+if(_ab&amp;&amp;_a4 in _ab){
+this.variation(_ab[_a4]);
 }else{
-this.createMove(_a3);
+this.createMove(_a4);
 }
 }
 }else{
@@ -1945,84 +1934,84 @@ _a(this.dom.searchButton,&quot;inline&quot;);
 _7(e);
 }
 }else{
-var _ab;
-var _ac=this.board.getStone({x:x,y:y});
+var _ac;
+var _ad=this.board.getStone({x:x,y:y});
 if(this.mode==&quot;add_b&quot;||this.mode==&quot;add_w&quot;){
-var _ad=this.cursor.node.emptyPoint(this.pointToSgfCoord({x:x,y:y}));
-if(_ac!=this.board.BLACK&amp;&amp;this.mode==&quot;add_b&quot;){
-_ab=&quot;AB&quot;;
+var _ae=this.cursor.node.emptyPoint(this.pointToSgfCoord({x:x,y:y}));
+if(_ad!=this.board.BLACK&amp;&amp;this.mode==&quot;add_b&quot;){
+_ac=&quot;AB&quot;;
 }else{
-if(_ac!=this.board.WHITE&amp;&amp;this.mode==&quot;add_w&quot;){
-_ab=&quot;AW&quot;;
+if(_ad!=this.board.WHITE&amp;&amp;this.mode==&quot;add_w&quot;){
+_ac=&quot;AW&quot;;
 }else{
-if(this.board.getStone({x:x,y:y})!=this.board.EMPTY&amp;&amp;!_ad){
-_ab=&quot;AE&quot;;
+if(this.board.getStone({x:x,y:y})!=this.board.EMPTY&amp;&amp;!_ae){
+_ac=&quot;AE&quot;;
 }
 }
 }
 }else{
 switch(this.mode){
 case &quot;tr&quot;:
-_ab=&quot;TR&quot;;
+_ac=&quot;TR&quot;;
 break;
 case &quot;sq&quot;:
-_ab=&quot;SQ&quot;;
+_ac=&quot;SQ&quot;;
 break;
 case &quot;cr&quot;:
-_ab=&quot;CR&quot;;
+_ac=&quot;CR&quot;;
 break;
 case &quot;x&quot;:
-_ab=&quot;MA&quot;;
+_ac=&quot;MA&quot;;
 break;
 case &quot;dim&quot;:
-_ab=&quot;DD&quot;;
+_ac=&quot;DD&quot;;
 break;
 case &quot;number&quot;:
-_ab=&quot;LB&quot;;
-_a3=_a3+&quot;:&quot;+this.labelLastNumber;
+_ac=&quot;LB&quot;;
+_a4=_a4+&quot;:&quot;+this.labelLastNumber;
 this.labelLastNumber++;
 break;
 case &quot;letter&quot;:
-_ab=&quot;LB&quot;;
-_a3=_a3+&quot;:&quot;+this.labelLastLetter;
+_ac=&quot;LB&quot;;
+_a4=_a4+&quot;:&quot;+this.labelLastLetter;
 this.labelLastLetter=String.fromCharCode(this.labelLastLetter.charCodeAt(0)+1);
 break;
 case &quot;clear&quot;:
-this.cursor.node.deletePropertyValue([&quot;TR&quot;,&quot;SQ&quot;,&quot;CR&quot;,&quot;MA&quot;,&quot;DD&quot;,&quot;LB&quot;],new RegExp(&quot;^&quot;+_a3));
+this.cursor.node.deletePropertyValue([&quot;TR&quot;,&quot;SQ&quot;,&quot;CR&quot;,&quot;MA&quot;,&quot;DD&quot;,&quot;LB&quot;],new RegExp(&quot;^&quot;+_a4));
 break;
 }
-if(this.cursor.node.hasPropertyValue(_ab,_a3)){
-this.cursor.node.deletePropertyValue(_ab,_a3);
-_ab=null;
+if(this.cursor.node.hasPropertyValue(_ac,_a4)){
+this.cursor.node.deletePropertyValue(_ac,_a4);
+_ac=null;
 }
 }
-if(_ab){
-this.cursor.node.pushProperty(_ab,_a3);
+if(_ac){
+this.cursor.node.pushProperty(_ac,_a4);
 }
 this.unsavedChanges=true;
-var _ad=this.checkForEmptyNode();
+var _ae=this.checkForEmptyNode();
 this.refresh();
-if(_ad){
+if(_ae){
 this.prependComment(t[&quot;position deleted&quot;]);
 }
 }
 }
 },checkForEmptyNode:function(){
 if(!eidogo.util.numProperties(this.cursor.node.getProperties())){
-var _ae=window.confirm(t[&quot;confirm delete&quot;]);
-if(_ae){
+var _af=window.confirm(t[&quot;confirm delete&quot;]);
+if(_af){
 var id=this.cursor.node._id;
-var _b0=0;
+var _b1=0;
 this.back();
-this.cursor.node._children=this.cursor.node._children.filter(function(_b1,i){
-if(_b1._id==id){
-_b0=i;
+this.cursor.node._children=this.cursor.node._children.filter(function(_b2,i){
+if(_b2._id==id){
+_b1=i;
 return false;
 }else{
 return true;
 }
 });
-if(_b0&amp;&amp;this.cursor.node._preferredChild==_b0){
+if(_b1&amp;&amp;this.cursor.node._preferredChild==_b1){
 this.cursor.node._preferredChild--;
 }
 return true;
@@ -2039,12 +2028,12 @@ this.regionBegun=false;
 _a(this.dom.searchButton,&quot;inline&quot;);
 }
 return true;
-},boundsCheck:function(x,y,_b6){
-if(_b6.length==2){
-_b6[3]=_b6[2]=_b6[1];
-_b6[1]=_b6[0];
+},boundsCheck:function(x,y,_b7){
+if(_b7.length==2){
+_b7[3]=_b7[2]=_b7[1];
+_b7[1]=_b7[0];
 }
-return (x&gt;=_b6[0]&amp;&amp;y&gt;=_b6[1]&amp;&amp;x&lt;=_b6[2]&amp;&amp;y&lt;=_b6[3]);
+return (x&gt;=_b7[0]&amp;&amp;y&gt;=_b7[1]&amp;&amp;x&lt;=_b7[2]&amp;&amp;y&lt;=_b7[3]);
 },getRegionBounds:function(){
 var l=this.regionLeft;
 var w=this.regionRight-this.regionLeft;
@@ -2060,15 +2049,15 @@ h=-h+1;
 }
 return [t,l,w,h];
 },showRegion:function(){
-var _bb=this.getRegionBounds();
-this.board.renderer.showRegion(_bb);
+var _bc=this.getRegionBounds();
+this.board.renderer.showRegion(_bc);
 },hideRegion:function(){
 this.board.renderer.hideRegion();
-},convertRegionPattern:function(_bc){
-return _bc.join(&quot;&quot;).replace(new RegExp(this.board.EMPTY,&quot;g&quot;),&quot;.&quot;).replace(new RegExp(this.board.BLACK,&quot;g&quot;),&quot;x&quot;).replace(new RegExp(this.board.WHITE,&quot;g&quot;),&quot;o&quot;);
+},convertRegionPattern:function(_bd){
+return _bd.join(&quot;&quot;).replace(new RegExp(this.board.EMPTY,&quot;g&quot;),&quot;.&quot;).replace(new RegExp(this.board.BLACK,&quot;g&quot;),&quot;x&quot;).replace(new RegExp(this.board.WHITE,&quot;g&quot;),&quot;o&quot;);
 },loadSearch:function(q,dim,p,a,o){
-var _c2={_children:[{SZ:this.board.boardSize,_children:[]}]};
-this.load(_c2);
+var _c3={_children:[{SZ:this.board.boardSize,_children:[]}]};
+this.load(_c3);
 a=a||&quot;corner&quot;;
 this.dom.searchAlgo.value=a;
 p=this.uncompressPattern(p);
@@ -2129,7 +2118,7 @@ this.board.renderer.renderMarker({x:x,y:y},&quot;dim&quot;);
 }
 }
 this.searchRegion(o);
-},searchRegion:function(_cd){
+},searchRegion:function(_ce){
 if(this.searching){
 return;
 }
@@ -2140,46 +2129,46 @@ _b(this.dom.searchContainer);
 this.prependComment(t[&quot;no search url&quot;]);
 return;
 }
-var _cd=parseInt(_cd,10)||0;
-var _ce=this.dom.searchAlgo.value;
-var _cf=this.getRegionBounds();
-var _d0=this.board.getRegion(_cf[0],_cf[1],_cf[2],_cf[3]);
-var _d1=this.convertRegionPattern(_d0);
-var _d2=/^\.*$/.test(_d1);
-var _d3=/^\.*o\.*$/.test(_d1);
-var _d4=/^\.*x\.*$/.test(_d1);
-if(_d2||_d3||_d4){
+var _ce=parseInt(_ce,10)||0;
+var _cf=this.dom.searchAlgo.value;
+var _d0=this.getRegionBounds();
+var _d1=this.board.getRegion(_d0[0],_d0[1],_d0[2],_d0[3]);
+var _d2=this.convertRegionPattern(_d1);
+var _d3=/^\.*$/.test(_d2);
+var _d4=/^\.*o\.*$/.test(_d2);
+var _d5=/^\.*x\.*$/.test(_d2);
+if(_d3||_d4||_d5){
 this.searching=false;
 _a(this.dom.comments);
 _b(this.dom.searchContainer);
 this.prependComment(t[&quot;two stones&quot;]);
 return;
 }
-var _d5=[];
-if(_cf[0]==0){
-_d5.push(&quot;n&quot;);
+var _d6=[];
+if(_d0[0]==0){
+_d6.push(&quot;n&quot;);
 }
-if(_cf[1]==0){
-_d5.push(&quot;w&quot;);
+if(_d0[1]==0){
+_d6.push(&quot;w&quot;);
 }
-if(_cf[0]+_cf[3]==this.board.boardSize){
-_d5.push(&quot;s&quot;);
+if(_d0[0]+_d0[3]==this.board.boardSize){
+_d6.push(&quot;s&quot;);
 }
-if(_cf[1]+_cf[2]==this.board.boardSize){
-_d5.push(&quot;e&quot;);
+if(_d0[1]+_d0[2]==this.board.boardSize){
+_d6.push(&quot;e&quot;);
 }
-if(_ce==&quot;corner&quot;&amp;&amp;!(_d5.length==2&amp;&amp;((_d5.contains(&quot;n&quot;)&amp;&amp;_d5.contains(&quot;e&quot;))||(_d5.contains(&quot;n&quot;)&amp;&amp;_d5.contains(&quot;w&quot;))||(_d5.contains(&quot;s&quot;)&amp;&amp;_d5.contains(&quot;e&quot;))||(_d5.contains(&quot;s&quot;)&amp;&amp;_d5.contains(&quot;w&quot;))))){
+if(_cf==&quot;corner&quot;&amp;&amp;!(_d6.length==2&amp;&amp;((_d6.contains(&quot;n&quot;)&amp;&amp;_d6.contains(&quot;e&quot;))||(_d6.contains(&quot;n&quot;)&amp;&amp;_d6.contains(&quot;w&quot;))||(_d6.contains(&quot;s&quot;)&amp;&amp;_d6.contains(&quot;e&quot;))||(_d6.contains(&quot;s&quot;)&amp;&amp;_d6.contains(&quot;w&quot;))))){
 this.searching=false;
 _a(this.dom.comments);
 _b(this.dom.searchContainer);
 this.prependComment(t[&quot;two edges&quot;]);
 return;
 }
-var _d6=(_d5.contains(&quot;n&quot;)?&quot;n&quot;:&quot;s&quot;);
-_d6+=(_d5.contains(&quot;w&quot;)?&quot;w&quot;:&quot;e&quot;);
+var _d7=(_d6.contains(&quot;n&quot;)?&quot;n&quot;:&quot;s&quot;);
+_d7+=(_d6.contains(&quot;w&quot;)?&quot;w&quot;:&quot;e&quot;);
 this.showComments(&quot;&quot;);
 this.gameName=&quot;search&quot;;
-var _d7=function(req){
+var _d8=function(req){
 this.searching=false;
 this.doneLoading();
 _b(this.dom.comments);
@@ -2196,56 +2185,56 @@ return;
 }
 }
 var ret=eval(&quot;(&quot;+req.responseText+&quot;)&quot;);
-var _da=ret.results,_db,_dc=&quot;&quot;,odd,_de=parseInt(ret.total,10),_df=parseInt(ret.offset,10)+1,_e0=parseInt(ret.offset,10)+50;
-for(var i=0;_db=_da[i];i++){
+var _db=ret.results,_dc,_dd=&quot;&quot;,odd,_df=parseInt(ret.total,10),_e0=parseInt(ret.offset,10)+1,_e1=parseInt(ret.offset,10)+50;
+for(var i=0;_dc=_db[i];i++){
 odd=odd?false:true;
-_dc+=&quot;&lt;a class='search-result&quot;+(odd?&quot; odd&quot;:&quot;&quot;)+&quot;' href='#'&gt;                    &lt;span class='id'&gt;&quot;+_db.id+&quot;&lt;/span&gt;                    &lt;span class='mv'&gt;&quot;+_db.mv+&quot;&lt;/span&gt;                    &lt;span class='pw'&gt;&quot;+_db.pw+&quot; &quot;+_db.wr+&quot;&lt;/span&gt;                    &lt;span class='pb'&gt;&quot;+_db.pb+&quot; &quot;+_db.br+&quot;&lt;/span&gt;                    &lt;span class='re'&gt;&quot;+_db.re+&quot;&lt;/span&gt;                    &lt;span class='dt'&gt;&quot;+_db.dt+&quot;&lt;/span&gt;                    &lt;div class='clear'&gt;&amp;nbsp;&lt;/div&gt;                    &lt;/a&gt;&quot;;
+_dd+=&quot;&lt;a class='search-result&quot;+(odd?&quot; odd&quot;:&quot;&quot;)+&quot;' href='#'&gt;                    &lt;span class='id'&gt;&quot;+_dc.id+&quot;&lt;/span&gt;                    &lt;span class='mv'&gt;&quot;+_dc.mv+&quot;&lt;/span&gt;                    &lt;span class='pw'&gt;&quot;+_dc.pw+&quot; &quot;+_dc.wr+&quot;&lt;/span&gt;                    &lt;span class='pb'&gt;&quot;+_dc.pb+&quot; &quot;+_dc.br+&quot;&lt;/span&gt;                    &lt;span class='re'&gt;&quot;+_dc.re+&quot;&lt;/span&gt;                    &lt;span class='dt'&gt;&quot;+_dc.dt+&quot;&lt;/span&gt;                    &lt;div class='clear'&gt;&amp;nbsp;&lt;/div&gt;                    &lt;/a&gt;&quot;;
 }
-if(_de&gt;_e0){
-_dc+=&quot;&lt;div class='search-more'&gt;&lt;a href='#' id='search-more'&gt;Show more...&lt;/a&gt;&lt;/div&gt;&quot;;
+if(_df&gt;_e1){
+_dd+=&quot;&lt;div class='search-more'&gt;&lt;a href='#' id='search-more'&gt;Show more...&lt;/a&gt;&lt;/div&gt;&quot;;
 }
 _a(this.dom.searchResultsContainer);
-this.dom.searchResults.innerHTML=_dc+&quot;&lt;br&gt;&quot;;
-this.dom.searchCount.innerHTML=_de;
-this.dom.searchOffsetStart.innerHTML=_df;
-this.dom.searchOffsetEnd.innerHTML=(_de&lt;_e0?_de:_e0);
+this.dom.searchResults.innerHTML=_dd+&quot;&lt;br&gt;&quot;;
+this.dom.searchCount.innerHTML=_df;
+this.dom.searchOffsetStart.innerHTML=_e0;
+this.dom.searchOffsetEnd.innerHTML=(_df&lt;_e1?_df:_e1);
 this.dom.searchContainer.scrollTop=0;
-if(_de&gt;_e0){
+if(_df&gt;_e1){
 setTimeout(function(){
 _4(_2(&quot;search-more&quot;),&quot;click&quot;,function(e){
-this.loadSearch(_d6,_cf[2]+&quot;x&quot;+_cf[3],_d1,&quot;corner&quot;,ret.offset+51);
+this.loadSearch(_d7,_d0[2]+&quot;x&quot;+_d0[3],_d2,&quot;corner&quot;,ret.offset+51);
 _7(e);
 }.bind(this));
 }.bind(this),0);
 }
 };
-var _e3=function(req){
+var _e4=function(req){
 this.croak(t[&quot;error retrieving&quot;]);
 };
-var _e5={q:_d6,w:_cf[2],h:_cf[3],p:_d1,a:_ce,o:_cd,t:(new Date()).getTime()};
+var _e6={q:_d7,w:_d0[2],h:_d0[3],p:_d2,a:_cf,o:_ce,t:(new Date()).getTime()};
 this.progressiveLoad=false;
 this.progressiveUrl=null;
 this.prefs.markNext=false;
 this.prefs.showPlayerInfo=true;
-this.hook(&quot;searchRegion&quot;,_e5);
+this.hook(&quot;searchRegion&quot;,_e6);
 this.nowLoading();
-_3(&quot;get&quot;,this.searchUrl,_e5,_d7,_e3,this,45000);
+_3(&quot;get&quot;,this.searchUrl,_e6,_d8,_e4,this,45000);
 },loadSearchResult:function(e){
 this.nowLoading();
-var _e7=e.target||e.srcElement;
-if(_e7.nodeName==&quot;SPAN&quot;){
-_e7=_e7.parentNode;
+var _e8=e.target||e.srcElement;
+if(_e8.nodeName==&quot;SPAN&quot;){
+_e8=_e8.parentNode;
 }
-if(_e7.nodeName==&quot;A&quot;){
-var _e8;
+if(_e8.nodeName==&quot;A&quot;){
+var _e9;
 var id;
 var mv;
-for(var i=0;_e8=_e7.childNodes[i];i++){
-if(_e8.className==&quot;id&quot;){
-id=_e8.innerHTML;
+for(var i=0;_e9=_e8.childNodes[i];i++){
+if(_e9.className==&quot;id&quot;){
+id=_e9.innerHTML;
 }
-if(_e8.className==&quot;mv&quot;){
-mv=parseInt(_e8.innerHTML,10);
+if(_e9.className==&quot;mv&quot;){
+mv=parseInt(_e9.innerHTML,10);
 }
 }
 }
@@ -2260,13 +2249,13 @@ _7(e);
 this.showingSearch=false;
 _b(this.dom.searchContainer);
 _a(this.dom.comments);
-},compressPattern:function(_ec){
+},compressPattern:function(_ed){
 var c=null;
 var pc=&quot;&quot;;
 var n=1;
 var ret=&quot;&quot;;
-for(var i=0;i&lt;_ec.length;i++){
-c=_ec.charAt(i);
+for(var i=0;i&lt;_ed.length;i++){
+c=_ed.charAt(i);
 if(c==pc){
 n++;
 }else{
@@ -2277,13 +2266,13 @@ pc=c;
 }
 ret=ret+pc+(n&gt;1?n:&quot;&quot;);
 return ret;
-},uncompressPattern:function(_f2){
+},uncompressPattern:function(_f3){
 var c=null;
 var s=null;
 var n=&quot;&quot;;
 var ret=&quot;&quot;;
-for(var i=0;i&lt;_f2.length;i++){
-c=_f2.charAt(i);
+for(var i=0;i&lt;_f3.length;i++){
+c=_f3.charAt(i);
 if(c==&quot;.&quot;||c==&quot;x&quot;||c==&quot;o&quot;){
 if(s!=null){
 n=parseInt(n,10);
@@ -2304,51 +2293,52 @@ for(var j=0;j&lt;n;j++){
 ret+=s;
 }
 return ret;
-},createMove:function(_f9){
-var _fa={};
-_fa[this.currentColor]=_f9;
-var _fb=new eidogo.GameNode(null,_fa);
-_fb._cached=true;
+},createMove:function(_fa){
+var _fb={};
+_fb[this.currentColor]=_fa;
+var _fc=new eidogo.GameNode(null,_fb);
+_fc._cached=true;
 this.totalMoves++;
-this.cursor.node.appendChild(_fb);
-this.unsavedChanges=true;
+this.cursor.node.appendChild(_fc);
+this.unsavedChanges=[this.cursor.node._children.last(),this.cursor.node];
+this.updatedNavTree=false;
 this.variation(this.cursor.node._children.length-1);
 },handleKeypress:function(e){
 if(this.editingText){
 return true;
 }
-var _fd=e.keyCode||e.charCode;
-if(!_fd||e.ctrlKey||e.altKey||e.metaKey){
+var _fe=e.keyCode||e.charCode;
+if(!_fe||e.ctrlKey||e.altKey||e.metaKey){
 return true;
 }
-var _fe=String.fromCharCode(_fd).toLowerCase();
-var _ff=[];
+var _ff=String.fromCharCode(_fe).toLowerCase();
+var _100=[];
 for(var i=0;i&lt;this.variations.length;i++){
-var _101=this.variations[i].move;
-var _102=this.sgfCoordToPoint(_101);
-var _103=&quot;&quot;+(i+1);
-var _104=this.board.getMarker(_102);
-if(_102.x!=null&amp;&amp;_104!=this.board.EMPTY&amp;&amp;typeof _104==&quot;string&quot;&amp;&amp;!_ff.contains(_101)){
-_103=_104.toLowerCase();
-}
-_103=_103.replace(/^var:/,&quot;&quot;);
-if(_fe==_103.charAt(0)){
+var _102=this.variations[i].move;
+var _103=this.sgfCoordToPoint(_102);
+var _104=&quot;&quot;+(i+1);
+var _105=this.board.getMarker(_103);
+if(_103.x!=null&amp;&amp;_105!=this.board.EMPTY&amp;&amp;typeof _105==&quot;string&quot;&amp;&amp;!_100.contains(_102)){
+_104=_105.toLowerCase();
+}
+_104=_104.replace(/^var:/,&quot;&quot;);
+if(_ff==_104.charAt(0)){
 this.variation(this.variations[i].varNum);
 _7(e);
 return;
 }
-_ff.push(_101);
+_100.push(_102);
 }
-if(_fd==112||_fd==27){
+if(_fe==112||_fe==27){
 this.selectTool(&quot;play&quot;);
 }
 var stop=true;
-switch(_fd){
+switch(_fe){
 case 39:
 if(e.shiftKey){
-var _106=this.totalMoves-this.moveNumber;
-var _107=(_106&gt;9?9:_106-1);
-for(var i=0;i&lt;_107;i++){
+var _107=this.totalMoves-this.moveNumber;
+var _108=(_107&gt;9?9:_107-1);
+for(var i=0;i&lt;_108;i++){
 this.forward(null,null,true);
 }
 }
@@ -2356,8 +2346,8 @@ this.forward();
 break;
 case 37:
 if(e.shiftKey){
-var _107=(this.moveNumber&gt;9?9:this.moveNumber-1);
-for(var i=0;i&lt;_107;i++){
+var _108=(this.moveNumber&gt;9?9:this.moveNumber-1);
+for(var i=0;i&lt;_108;i++){
 this.back(null,null,true);
 }
 }
@@ -2379,41 +2369,41 @@ break;
 if(stop){
 _7(e);
 }
-},showGameInfo:function(_108){
-this.hook(&quot;showGameInfo&quot;,_108);
-if(!_108){
+},showGameInfo:function(_109){
+this.hook(&quot;showGameInfo&quot;,_109);
+if(!_109){
 return;
 }
 this.dom.infoGame.innerHTML=&quot;&quot;;
 this.dom.whiteName.innerHTML=&quot;&quot;;
 this.dom.blackName.innerHTML=&quot;&quot;;
 var dl=document.createElement(&quot;dl&quot;),val;
-for(var _10b in this.infoLabels){
-if(_108[_10b] instanceof Array){
-_108[_10b]=_108[_10b][0];
+for(var _10c in this.infoLabels){
+if(_109[_10c] instanceof Array){
+_109[_10c]=_109[_10c][0];
 }
-if(_108[_10b]){
-if(_10b==&quot;PW&quot;){
-this.dom.whiteName.innerHTML=_108[_10b]+(_108[&quot;WR&quot;]?&quot;, &quot;+_108[&quot;WR&quot;]:&quot;&quot;);
+if(_109[_10c]){
+if(_10c==&quot;PW&quot;){
+this.dom.whiteName.innerHTML=_109[_10c]+(_109[&quot;WR&quot;]?&quot;, &quot;+_109[&quot;WR&quot;]:&quot;&quot;);
 continue;
 }else{
-if(_10b==&quot;PB&quot;){
-this.dom.blackName.innerHTML=_108[_10b]+(_108[&quot;BR&quot;]?&quot;, &quot;+_108[&quot;BR&quot;]:&quot;&quot;);
+if(_10c==&quot;PB&quot;){
+this.dom.blackName.innerHTML=_109[_10c]+(_109[&quot;BR&quot;]?&quot;, &quot;+_109[&quot;BR&quot;]:&quot;&quot;);
 continue;
 }
 }
-if(_10b==&quot;WR&quot;||_10b==&quot;BR&quot;){
+if(_10c==&quot;WR&quot;||_10c==&quot;BR&quot;){
 continue;
 }
-val=_108[_10b];
-if(_10b==&quot;DT&quot;){
-var _10c=_108[_10b].split(/[\.-]/);
-if(_10c.length==3){
-val=_10c[2].replace(/^0+/,&quot;&quot;)+&quot; &quot;+this.months[_10c[1]-1]+&quot; &quot;+_10c[0];
+val=_109[_10c];
+if(_10c==&quot;DT&quot;){
+var _10d=_109[_10c].split(/[\.-]/);
+if(_10d.length==3){
+val=_10d[2].replace(/^0+/,&quot;&quot;)+&quot; &quot;+this.months[_10d[1]-1]+&quot; &quot;+_10d[0];
 }
 }
 var dt=document.createElement(&quot;dt&quot;);
-dt.innerHTML=this.infoLabels[_10b]+&quot;:&quot;;
+dt.innerHTML=this.infoLabels[_10c]+&quot;:&quot;;
 var dd=document.createElement(&quot;dd&quot;);
 dd.innerHTML=val;
 dl.appendChild(dt);
@@ -2422,10 +2412,10 @@ dl.appendChild(dd);
 }
 this.dom.infoGame.appendChild(dl);
 },selectTool:function(tool){
-var _110;
+var _111;
 _b(this.dom.scoreEst);
 if(tool==&quot;region&quot;){
-_110=&quot;crosshair&quot;;
+_111=&quot;crosshair&quot;;
 }else{
 if(tool==&quot;comment&quot;){
 this.startEditComment();
@@ -2433,7 +2423,7 @@ this.startEditComment();
 if(tool==&quot;gameinfo&quot;){
 this.startEditGameInfo();
 }else{
-_110=&quot;default&quot;;
+_111=&quot;default&quot;;
 this.regionBegun=false;
 this.hideRegion();
 _b(this.dom.searchButton);
@@ -2444,7 +2434,7 @@ _a(this.dom.scoreEst,&quot;inline&quot;);
 }
 }
 }
-this.board.renderer.setCursor(_110);
+this.board.renderer.setCursor(_111);
 this.mode=tool;
 this.dom.toolsSelect.value=tool;
 },startEditComment:function(){
@@ -2475,9 +2465,9 @@ _b(this.dom.shade);
 _b(this.dom.commentsEdit);
 _a(this.dom.comments);
 this.selectTool(&quot;play&quot;);
-var _114=this.checkForEmptyNode();
+var _115=this.checkForEmptyNode();
 this.refresh();
-if(_114){
+if(_115){
 this.prependComment(t[&quot;position deleted&quot;]);
 }
 },startEditGameInfo:function(){
@@ -2507,11 +2497,11 @@ _b(this.dom.shade);
 _b(this.dom.gameInfoEdit);
 _a(this.dom.comments);
 var root=this.cursor.getGameRoot();
-var _11a=null;
+var _11b=null;
 for(var prop in this.infoLabels){
-_11a=_2(&quot;game-info-edit-field-&quot;+prop).value;
-if((root[prop]||&quot;&quot;)!=_11a){
-root[prop]=_11a;
+_11b=_2(&quot;game-info-edit-field-&quot;+prop).value;
+if((root[prop]||&quot;&quot;)!=_11b){
+root[prop]=_11b;
 this.unsavedChanges=true;
 }
 }
@@ -2528,33 +2518,33 @@ this.dom.blackTime.innerHTML=t[&quot;time left&quot;]+&quot;: &lt;span&gt;&quot;+(this.timeB?this.timeB:&quot;-
 _9(this.dom.controlPass,&quot;pass-on&quot;);
 this.dom.variations.innerHTML=&quot;&quot;;
 for(var i=0;i&lt;this.variations.length;i++){
-var _11d=i+1;
-var _11e=false;
+var _11e=i+1;
+var _11f=false;
 if(!this.variations[i].move||this.variations[i].move==&quot;tt&quot;){
 _8(this.dom.controlPass,&quot;pass-on&quot;);
 }else{
 if(this.prefs.markNext||this.variations.length&gt;1){
-var _11f=this.sgfCoordToPoint(this.variations[i].move);
-if(this.board.getMarker(_11f)!=this.board.EMPTY){
-var _120=this.board.getMarker(_11f);
-if(_120.indexOf(&quot;var:&quot;)!==0){
-_11d=_120;
+var _120=this.sgfCoordToPoint(this.variations[i].move);
+if(this.board.getMarker(_120)!=this.board.EMPTY){
+var _121=this.board.getMarker(_120);
+if(_121.indexOf(&quot;var:&quot;)!==0){
+_11e=_121;
 }else{
-_11e=true;
+_11f=true;
 }
 }
-if(this.prefs.markVariations&amp;&amp;!_11e){
-this.board.addMarker(_11f,&quot;var:&quot;+_11d);
+if(this.prefs.markVariations&amp;&amp;!_11f){
+this.board.addMarker(_120,&quot;var:&quot;+_11e);
 }
 }
 }
-var _121=document.createElement(&quot;div&quot;);
-_121.className=&quot;variation-nav&quot;;
-_121.innerHTML=_11d;
-_4(_121,&quot;click&quot;,function(e,arg){
+var _122=document.createElement(&quot;div&quot;);
+_122.className=&quot;variation-nav&quot;;
+_122.innerHTML=_11e;
+_4(_122,&quot;click&quot;,function(e,arg){
 arg.me.variation(arg.varNum);
 },{me:this,varNum:this.variations[i].varNum});
-this.dom.variations.appendChild(_121);
+this.dom.variations.appendChild(_122);
 }
 if(this.variations.length&lt;2){
 this.dom.variations.innerHTML=&quot;&lt;div class='variation-nav none'&gt;&quot;+t[&quot;no variations&quot;]+&quot;&lt;/div&gt;&quot;;
@@ -2589,101 +2579,101 @@ this.updateNavSlider();
 if(this.prefs.showNavTree){
 this.updateNavTree();
 }
-},setColor:function(_125){
-this.prependComment(_125==&quot;B&quot;?t[&quot;black to play&quot;]:t[&quot;white to play&quot;]);
-this.currentColor=this.problemColor=_125;
+},setColor:function(_126){
+this.prependComment(_126==&quot;B&quot;?t[&quot;black to play&quot;]:t[&quot;white to play&quot;]);
+this.currentColor=this.problemColor=_126;
 },setMoveNumber:function(num){
 this.moveNumber=num;
-},playMove:function(_127,_128,_129){
-_128=_128||this.currentColor;
-this.currentColor=(_128==&quot;B&quot;?&quot;W&quot;:&quot;B&quot;);
-_128=_128==&quot;W&quot;?this.board.WHITE:this.board.BLACK;
-var pt=this.sgfCoordToPoint(_127);
-if((!_127||_127==&quot;tt&quot;||_127==&quot;&quot;)&amp;&amp;!_129){
-this.prependComment((_128==this.board.WHITE?t[&quot;white&quot;]:t[&quot;black&quot;])+&quot; &quot;+t[&quot;passed&quot;],&quot;comment-pass&quot;);
+},playMove:function(_128,_129,_12a){
+_129=_129||this.currentColor;
+this.currentColor=(_129==&quot;B&quot;?&quot;W&quot;:&quot;B&quot;);
+_129=_129==&quot;W&quot;?this.board.WHITE:this.board.BLACK;
+var pt=this.sgfCoordToPoint(_128);
+if((!_128||_128==&quot;tt&quot;||_128==&quot;&quot;)&amp;&amp;!_12a){
+this.prependComment((_129==this.board.WHITE?t[&quot;white&quot;]:t[&quot;black&quot;])+&quot; &quot;+t[&quot;passed&quot;],&quot;comment-pass&quot;);
 }else{
-if(_127==&quot;resign&quot;){
-this.prependComment((_128==this.board.WHITE?t[&quot;white&quot;]:t[&quot;black&quot;])+&quot; &quot;+t[&quot;resigned&quot;],&quot;comment-resign&quot;);
+if(_128==&quot;resign&quot;){
+this.prependComment((_129==this.board.WHITE?t[&quot;white&quot;]:t[&quot;black&quot;])+&quot; &quot;+t[&quot;resigned&quot;],&quot;comment-resign&quot;);
 }else{
-if(_127&amp;&amp;_127!=&quot;tt&quot;){
-this.board.addStone(pt,_128);
-this.rules.apply(pt,_128);
-if(this.prefs.markCurrent&amp;&amp;!_129){
-this.addMarker(_127,&quot;current&quot;);
+if(_128&amp;&amp;_128!=&quot;tt&quot;){
+this.board.addStone(pt,_129);
+this.rules.apply(pt,_129);
+if(this.prefs.markCurrent&amp;&amp;!_12a){
+this.addMarker(_128,&quot;current&quot;);
 }
 }
 }
 }
-},addStone:function(_12b,_12c){
-if(!(_12b instanceof Array)){
-_12b=[_12b];
+},addStone:function(_12c,_12d){
+if(!(_12c instanceof Array)){
+_12c=[_12c];
 }
-_12b=this.expandCompressedPoints(_12b);
-for(var i=0;i&lt;_12b.length;i++){
-this.board.addStone(this.sgfCoordToPoint(_12b[i]),_12c==&quot;AW&quot;?this.board.WHITE:_12c==&quot;AB&quot;?this.board.BLACK:this.board.EMPTY);
+_12c=this.expandCompressedPoints(_12c);
+for(var i=0;i&lt;_12c.length;i++){
+this.board.addStone(this.sgfCoordToPoint(_12c[i]),_12d==&quot;AW&quot;?this.board.WHITE:_12d==&quot;AB&quot;?this.board.BLACK:this.board.EMPTY);
 }
-},addMarker:function(_12e,type){
-if(!(_12e instanceof Array)){
-_12e=[_12e];
+},addMarker:function(_12f,type){
+if(!(_12f instanceof Array)){
+_12f=[_12f];
 }
-_12e=this.expandCompressedPoints(_12e);
-var _130;
-for(var i=0;i&lt;_12e.length;i++){
+_12f=this.expandCompressedPoints(_12f);
+var _131;
+for(var i=0;i&lt;_12f.length;i++){
 switch(type){
 case &quot;TR&quot;:
-_130=&quot;triangle&quot;;
+_131=&quot;triangle&quot;;
 break;
 case &quot;SQ&quot;:
-_130=&quot;square&quot;;
+_131=&quot;square&quot;;
 break;
 case &quot;CR&quot;:
-_130=&quot;circle&quot;;
+_131=&quot;circle&quot;;
 break;
 case &quot;MA&quot;:
-_130=&quot;ex&quot;;
+_131=&quot;ex&quot;;
 break;
 case &quot;TW&quot;:
-_130=&quot;territory-white&quot;;
+_131=&quot;territory-white&quot;;
 break;
 case &quot;TB&quot;:
-_130=&quot;territory-black&quot;;
+_131=&quot;territory-black&quot;;
 break;
 case &quot;DD&quot;:
-_130=&quot;dim&quot;;
+_131=&quot;dim&quot;;
 break;
 case &quot;LB&quot;:
-_130=(_12e[i].split(&quot;:&quot;))[1];
+_131=(_12f[i].split(&quot;:&quot;))[1];
 break;
 default:
-_130=type;
+_131=type;
 break;
 }
-this.board.addMarker(this.sgfCoordToPoint((_12e[i].split(&quot;:&quot;))[0]),_130);
+this.board.addMarker(this.sgfCoordToPoint((_12f[i].split(&quot;:&quot;))[0]),_131);
 }
-},showTime:function(_132,type){
+},showTime:function(_133,type){
 var tp=(type==&quot;BL&quot;||type==&quot;OB&quot;?&quot;timeB&quot;:&quot;timeW&quot;);
 if(type==&quot;BL&quot;||type==&quot;WL&quot;){
-var mins=Math.floor(_132/60);
-var secs=(_132%60).toFixed(0);
+var mins=Math.floor(_133/60);
+var secs=(_133%60).toFixed(0);
 secs=(secs&lt;10?&quot;0&quot;:&quot;&quot;)+secs;
 this[tp]=mins+&quot;:&quot;+secs;
 }else{
-this[tp]+=&quot; (&quot;+_132+&quot;)&quot;;
+this[tp]+=&quot; (&quot;+_133+&quot;)&quot;;
 }
-},showAnnotation:function(_137,type){
+},showAnnotation:function(_138,type){
 var msg;
 switch(type){
 case &quot;N&quot;:
-msg=_137;
+msg=_138;
 break;
 case &quot;GB&quot;:
-msg=(_137&gt;1?t[&quot;vgb&quot;]:t[&quot;gb&quot;]);
+msg=(_138&gt;1?t[&quot;vgb&quot;]:t[&quot;gb&quot;]);
 break;
 case &quot;GW&quot;:
-msg=(_137&gt;1?t[&quot;vgw&quot;]:t[&quot;gw&quot;]);
+msg=(_138&gt;1?t[&quot;vgw&quot;]:t[&quot;gw&quot;]);
 break;
 case &quot;DM&quot;:
-msg=(_137&gt;1?t[&quot;dmj&quot;]:t[&quot;dm&quot;]);
+msg=(_138&gt;1?t[&quot;dmj&quot;]:t[&quot;dm&quot;]);
 break;
 case &quot;UC&quot;:
 msg=t[&quot;uc&quot;];
@@ -2692,7 +2682,7 @@ case &quot;TE&quot;:
 msg=t[&quot;te&quot;];
 break;
 case &quot;BM&quot;:
-msg=(_137&gt;1?t[&quot;vbm&quot;]:t[&quot;bm&quot;]);
+msg=(_138&gt;1?t[&quot;vbm&quot;]:t[&quot;bm&quot;]);
 break;
 case &quot;DO&quot;:
 msg=t[&quot;do&quot;];
@@ -2705,14 +2695,14 @@ msg=t[&quot;ho&quot;];
 break;
 }
 this.prependComment(msg);
-},showComments:function(_13a,junk,_13c){
-if(!_13a||_13c){
+},showComments:function(_13b,junk,_13d){
+if(!_13b||_13d){
 return;
 }
-this.dom.comments.innerHTML+=_13a.replace(/^(\n|\r|\t|\s)+/,&quot;&quot;).replace(/\n/g,&quot;&lt;br /&gt;&quot;);
-},prependComment:function(_13d,cls){
+this.dom.comments.innerHTML+=_13b.replace(/^(\n|\r|\t|\s)+/,&quot;&quot;).replace(/\n/g,&quot;&lt;br /&gt;&quot;);
+},prependComment:function(_13e,cls){
 cls=cls||&quot;comment-status&quot;;
-this.dom.comments.innerHTML=&quot;&lt;div class='&quot;+cls+&quot;'&gt;&quot;+_13d+&quot;&lt;/div&gt;&quot;+this.dom.comments.innerHTML;
+this.dom.comments.innerHTML=&quot;&lt;div class='&quot;+cls+&quot;'&gt;&quot;+_13e+&quot;&lt;/div&gt;&quot;+this.dom.comments.innerHTML;
 },downloadSgf:function(evt){
 _7(evt);
 if(this.downloadUrl){
@@ -2728,14 +2718,14 @@ location.href=&quot;data:text/plain,&quot;+encodeURIComponent(this.cursor.getGameRoot().to
 }
 },save:function(evt){
 _7(evt);
-var _141=function(req){
+var _142=function(req){
 this.hook(&quot;saved&quot;,[req.responseText]);
 };
-var _143=function(req){
+var _144=function(req){
 this.croak(t[&quot;error retrieving&quot;]);
 };
 var sgf=this.cursor.getGameRoot().toSgf();
-_3(&quot;POST&quot;,this.saveUrl,{sgf:sgf},_141,_143,this,30000);
+_3(&quot;POST&quot;,this.saveUrl,{sgf:sgf},_142,_144,this,30000);
 },constructDom:function(){
 this.dom.player=document.createElement(&quot;div&quot;);
 this.dom.player.className=&quot;eidogo-player&quot;+(this.theme?&quot; theme-&quot;+this.theme:&quot;&quot;);
@@ -2743,21 +2733,21 @@ this.dom.player.id=&quot;player-&quot;+this.uniq;
 this.dom.container.innerHTML=&quot;&quot;;
 eidogo.util.show(this.dom.container);
 this.dom.container.appendChild(this.dom.player);
-var _146=&quot;            &lt;div id='board-container' class='board-container'&gt;&lt;/div&gt;            &lt;div id='controls-container' class='controls-container'&gt;                &lt;ul id='controls' class='controls'&gt;                    &lt;li id='control-first' class='control first'&gt;First&lt;/li&gt;                    &lt;li id='control-back' class='control back'&gt;Back&lt;/li&gt;                    &lt;li id='control-forward' class='control forward'&gt;Forward&lt;/li&gt;                    &lt;li id='control-last' class='control last'&gt;Last&lt;/li&gt;                    &lt;li id='control-pass' class='control pass'&gt;Pass&lt;/li&gt;                &lt;/ul&gt;                &lt;div id='move-number' class='move-number&quot;+(this.permalinkable?&quot; permalink&quot;:&quot;&quot;)+&quot;'&gt;&lt;/div&gt;                &lt;div id='nav-slider' class='nav-slider'&gt;                    &lt;div id='nav-slider-thumb' class='nav-slider-thumb'&gt;&lt;/div&gt;                &lt;/div&gt;                &lt;div id='variations-container' class='variations-container'&gt;                    &lt;div id='variations-label' class='variations-label'&gt;&quot;+t[&quot;variations&quot;]+&quot;:&lt;/div&gt;                    &lt;div id='variations' class='variations'&gt;&lt;/div&gt;                &lt;/div&gt;                &lt;div class='controls-stop'&gt;&lt;/div&gt;            &lt;/div&gt;            &lt;div id='tools-container' class='tools-container'&quot;+(this.prefs.showTools?&quot;&quot;:&quot; style='display: none'&quot;)+&quot;&gt;                &lt;div id='tools-label' class='tools-label'&gt;&quot;+t[&quot;tool&quot;]+&quot;:&lt;/div&gt;                &lt;select id='tools-select' class='tools-select'&gt;                    &lt;option value='play'&gt;&amp;#9658; &quot;+t[&quot;play&quot;]+&quot;&lt;/option&gt;                    &lt;option value='view'&gt;&amp;#8594; &quot;+t[&quot;view&quot;]+&quot;&lt;/option&gt;                    &lt;option value='add_b'&gt;&amp;#9679; &quot;+t[&quot;add_b&quot;]+&quot;&lt;/option&gt;                    &lt;option value='add_w'&gt;&amp;#9675; &quot;+t[&quot;add_w&quot;]+&quot;&lt;/option&gt;                    &quot;+(this.searchUrl?(&quot;&lt;option value='region'&gt;&amp;#9618; &quot;+t[&quot;region&quot;]+&quot;&lt;/option&gt;&quot;):&quot;&quot;)+&quot;                    &quot;+(this.saveUrl&amp;&amp;!this.progressiveLoad?(&quot;&lt;option value='comment'&gt;&amp;para; &quot;+t[&quot;edit comment&quot;]+&quot;&lt;/option&gt;&quot;):&quot;&quot;)+&quot;                    &quot;+(this.saveUrl?(&quot;&lt;option value='gameinfo'&gt;&amp;#8962; &quot;+t[&quot;edit game info&quot;]+&quot;&lt;/option&gt;&quot;):&quot;&quot;)+&quot;                    &lt;option value='tr'&gt;&amp;#9650; &quot;+t[&quot;triangle&quot;]+&quot;&lt;/option&gt;                    &lt;option value='sq'&gt;&amp;#9632; &quot;+t[&quot;square&quot;]+&quot;&lt;/option&gt;                    &lt;option value='cr'&gt;&amp;#9679; &quot;+t[&quot;circle&quot;]+&quot;&lt;/option&gt;                    &lt;option value='x'&gt;&amp;times; &quot;+t[&quot;x&quot;]+&quot;&lt;/option&gt;                    &lt;option value='letter'&gt;A &quot;+t[&quot;letter&quot;]+&quot;&lt;/option&gt;                    &lt;option value='number'&gt;5 &quot;+t[&quot;number&quot;]+&quot;&lt;/option&gt;                    &lt;option value='dim'&gt;&amp;#9619; &quot;+t[&quot;dim&quot;]+&quot;&lt;/option&gt;                    &lt;option value='clear'&gt;&amp;#9617; &quot;+t[&quot;clear&quot;]+&quot;&lt;/option&gt;                &lt;/select&gt;                &lt;input type='button' id='score-est' class='score-est-button' value='&quot;+t[&quot;score est&quot;]+&quot;' /&gt;                &lt;select id='search-algo' class='search-algo'&gt;                    &lt;option value='corner'&gt;&quot;+t[&quot;search corner&quot;]+&quot;&lt;/option&gt;                    &lt;option value='center'&gt;&quot;+t[&quot;search center&quot;]+&quot;&lt;/option&gt;                &lt;/select&gt;                &lt;input type='button' id='search-button' class='search-button' value='&quot;+t[&quot;search&quot;]+&quot;' /&gt;            &lt;/div&gt;            &lt;div id='comments' class='comments'&gt;&lt;/div&gt;            &lt;div id='comments-edit' class='comments-edit'&gt;                &lt;textarea id='comments-edit-ta' class='comments-edit-ta'&gt;&lt;/textarea&gt;                &lt;div id='comments-edit-done' class='comments-edit-done'&gt;&quot;+t[&quot;done&quot;]+&quot;&lt;/div&gt;            &lt;/div&gt;            &lt;div id='game-info-edit' class='game-info-edit'&gt;                &lt;div id='game-info-edit-form' class='game-info-edit-form'&gt;&lt;/div&gt;                &lt;div id='game-info-edit-done' class='game-info-edit-done'&gt;&quot;+t[&quot;done&quot;]+&quot;&lt;/div&gt;            &lt;/div&gt;            &lt;div id='search-container' class='search-container'&gt;                &lt;div id='search-close' class='search-close'&gt;&quot;+t[&quot;close search&quot;]+&quot;&lt;/div&gt;                &lt;p class='search-count'&gt;&lt;span id='search-count'&gt;&lt;/span&gt;&amp;nbsp;&quot;+t[&quot;matches found&quot;]+&quot;                    Showing &lt;span id='search-offset-start'&gt;&lt;/span&gt;-&lt;span id='search-offset-end'&gt;&lt;/span&gt;&lt;/p&gt;                &lt;div id='search-results-container' class='search-results-container'&gt;                    &lt;div class='search-result'&gt;                        &lt;span class='pw'&gt;&lt;b&gt;&quot;+t[&quot;white&quot;]+&quot;&lt;/b&gt;&lt;/span&gt;                        &lt;span class='pb'&gt;&lt;b&gt;&quot;+t[&quot;black&quot;]+&quot;&lt;/b&gt;&lt;/span&gt;                        &lt;span class='re'&gt;&lt;b&gt;&quot;+t[&quot;result&quot;]+&quot;&lt;/b&gt;&lt;/span&gt;                        &lt;span class='dt'&gt;&lt;b&gt;&quot;+t[&quot;date&quot;]+&quot;&lt;/b&gt;&lt;/span&gt;                        &lt;div class='clear'&gt;&lt;/div&gt;                    &lt;/div&gt;                    &lt;div id='search-results' class='search-results'&gt;&lt;/div&gt;                &lt;/div&gt;            &lt;/div&gt;            &lt;div id='info' class='info'&gt;                &lt;div id='info-players' class='players'&gt;                    &lt;div id='white' class='player white'&gt;                        &lt;div id='white-name' class='name'&gt;&lt;/div&gt;                        &lt;div id='white-captures' class='captures'&gt;&lt;/div&gt;                        &lt;div id='white-time' class='time'&gt;&lt;/div&gt;                    &lt;/div&gt;                    &lt;div id='black' class='player black'&gt;                        &lt;div id='black-name' class='name'&gt;&lt;/div&gt;                        &lt;div id='black-captures' class='captures'&gt;&lt;/div&gt;                        &lt;div id='black-time' class='time'&gt;&lt;/div&gt;                    &lt;/div&gt;                &lt;/div&gt;                &lt;div id='info-game' class='game'&gt;&lt;/div&gt;            &lt;/div&gt;            &lt;div id='nav-tree-container' class='nav-tree-container'&gt;                &lt;div id='nav-tree' class='nav-tree'&gt;&lt;/div&gt;            &lt;/div&gt;            &lt;div id='options' class='options'&gt;                &quot;+(this.saveUrl?&quot;&lt;a id='option-save' class='option-save' href='#'&gt;&quot;+t[&quot;save to server&quot;]+&quot;&lt;/a&gt;&quot;:&quot;&quot;)+&quot;                &quot;+(this.downloadUrl||_c?&quot;&lt;a id='option-download' class='option-download' href='#'&gt;&quot;+t[&quot;download sgf&quot;]+&quot;&lt;/a&gt;&quot;:&quot;&quot;)+&quot;                &lt;div class='options-stop'&gt;&lt;/div&gt;            &lt;/div&gt;            &lt;div id='preferences' class='preferences'&gt;                &lt;div&gt;&lt;input type='checkbox'&gt; Show variations on board&lt;/div&gt;                &lt;div&gt;&lt;input type='checkbox'&gt; Mark current move&lt;/div&gt;            &lt;/div&gt;            &lt;div id='footer' class='footer'&gt;&lt;/div&gt;            &lt;div id='shade' class='shade'&gt;&lt;/div&gt;        &quot;;
-_146=_146.replace(/ id='([^']+)'/g,&quot; id='$1-&quot;+this.uniq+&quot;'&quot;);
-this.dom.player.innerHTML=_146;
+var _147=&quot;            &lt;div id='board-container' class='board-container'&gt;&lt;/div&gt;            &lt;div id='controls-container' class='controls-container'&gt;                &lt;ul id='controls' class='controls'&gt;                    &lt;li id='control-first' class='control first'&gt;First&lt;/li&gt;                    &lt;li id='control-back' class='control back'&gt;Back&lt;/li&gt;                    &lt;li id='control-forward' class='control forward'&gt;Forward&lt;/li&gt;                    &lt;li id='control-last' class='control last'&gt;Last&lt;/li&gt;                    &lt;li id='control-pass' class='control pass'&gt;Pass&lt;/li&gt;                &lt;/ul&gt;                &lt;div id='move-number' class='move-number&quot;+(this.permalinkable?&quot; permalink&quot;:&quot;&quot;)+&quot;'&gt;&lt;/div&gt;                &lt;div id='nav-slider' class='nav-slider'&gt;                    &lt;div id='nav-slider-thumb' class='nav-slider-thumb'&gt;&lt;/div&gt;                &lt;/div&gt;                &lt;div id='variations-container' class='variations-container'&gt;                    &lt;div id='variations-label' class='variations-label'&gt;&quot;+t[&quot;variations&quot;]+&quot;:&lt;/div&gt;                    &lt;div id='variations' class='variations'&gt;&lt;/div&gt;                &lt;/div&gt;                &lt;div class='controls-stop'&gt;&lt;/div&gt;            &lt;/div&gt;            &lt;div id='tools-container' class='tools-container'&quot;+(this.prefs.showTools?&quot;&quot;:&quot; style='display: none'&quot;)+&quot;&gt;                &lt;div id='tools-label' class='tools-label'&gt;&quot;+t[&quot;tool&quot;]+&quot;:&lt;/div&gt;                &lt;select id='tools-select' class='tools-select'&gt;                    &lt;option value='play'&gt;&amp;#9658; &quot;+t[&quot;play&quot;]+&quot;&lt;/option&gt;                    &lt;option value='view'&gt;&amp;#8594; &quot;+t[&quot;view&quot;]+&quot;&lt;/option&gt;                    &lt;option value='add_b'&gt;&amp;#9679; &quot;+t[&quot;add_b&quot;]+&quot;&lt;/option&gt;                    &lt;option value='add_w'&gt;&amp;#9675; &quot;+t[&quot;add_w&quot;]+&quot;&lt;/option&gt;                    &quot;+(this.searchUrl?(&quot;&lt;option value='region'&gt;&amp;#9618; &quot;+t[&quot;region&quot;]+&quot;&lt;/option&gt;&quot;):&quot;&quot;)+&quot;                    &quot;+(this.saveUrl&amp;&amp;!this.progressiveLoad?(&quot;&lt;option value='comment'&gt;&amp;para; &quot;+t[&quot;edit comment&quot;]+&quot;&lt;/option&gt;&quot;):&quot;&quot;)+&quot;                    &quot;+(this.saveUrl?(&quot;&lt;option value='gameinfo'&gt;&amp;#8962; &quot;+t[&quot;edit game info&quot;]+&quot;&lt;/option&gt;&quot;):&quot;&quot;)+&quot;                    &lt;option value='tr'&gt;&amp;#9650; &quot;+t[&quot;triangle&quot;]+&quot;&lt;/option&gt;                    &lt;option value='sq'&gt;&amp;#9632; &quot;+t[&quot;square&quot;]+&quot;&lt;/option&gt;                    &lt;option value='cr'&gt;&amp;#9679; &quot;+t[&quot;circle&quot;]+&quot;&lt;/option&gt;                    &lt;option value='x'&gt;&amp;times; &quot;+t[&quot;x&quot;]+&quot;&lt;/option&gt;                    &lt;option value='letter'&gt;A &quot;+t[&quot;letter&quot;]+&quot;&lt;/option&gt;                    &lt;option value='number'&gt;5 &quot;+t[&quot;number&quot;]+&quot;&lt;/option&gt;                    &lt;option value='dim'&gt;&amp;#9619; &quot;+t[&quot;dim&quot;]+&quot;&lt;/option&gt;                    &lt;option value='clear'&gt;&amp;#9617; &quot;+t[&quot;clear&quot;]+&quot;&lt;/option&gt;                &lt;/select&gt;                &lt;input type='button' id='score-est' class='score-est-button' value='&quot;+t[&quot;score est&quot;]+&quot;' /&gt;                &lt;select id='search-algo' class='search-algo'&gt;                    &lt;option value='corner'&gt;&quot;+t[&quot;search corner&quot;]+&quot;&lt;/option&gt;                    &lt;option value='center'&gt;&quot;+t[&quot;search center&quot;]+&quot;&lt;/option&gt;                &lt;/select&gt;                &lt;input type='button' id='search-button' class='search-button' value='&quot;+t[&quot;search&quot;]+&quot;' /&gt;            &lt;/div&gt;            &lt;div id='comments' class='comments'&gt;&lt;/div&gt;            &lt;div id='comments-edit' class='comments-edit'&gt;                &lt;textarea id='comments-edit-ta' class='comments-edit-ta'&gt;&lt;/textarea&gt;                &lt;div id='comments-edit-done' class='comments-edit-done'&gt;&quot;+t[&quot;done&quot;]+&quot;&lt;/div&gt;            &lt;/div&gt;            &lt;div id='game-info-edit' class='game-info-edit'&gt;                &lt;div id='game-info-edit-form' class='game-info-edit-form'&gt;&lt;/div&gt;                &lt;div id='game-info-edit-done' class='game-info-edit-done'&gt;&quot;+t[&quot;done&quot;]+&quot;&lt;/div&gt;            &lt;/div&gt;            &lt;div id='search-container' class='search-container'&gt;                &lt;div id='search-close' class='search-close'&gt;&quot;+t[&quot;close search&quot;]+&quot;&lt;/div&gt;                &lt;p class='search-count'&gt;&lt;span id='search-count'&gt;&lt;/span&gt;&amp;nbsp;&quot;+t[&quot;matches found&quot;]+&quot;                    Showing &lt;span id='search-offset-start'&gt;&lt;/span&gt;-&lt;span id='search-offset-end'&gt;&lt;/span&gt;&lt;/p&gt;                &lt;div id='search-results-container' class='search-results-container'&gt;                    &lt;div class='search-result'&gt;                        &lt;span class='pw'&gt;&lt;b&gt;&quot;+t[&quot;white&quot;]+&quot;&lt;/b&gt;&lt;/span&gt;                        &lt;span class='pb'&gt;&lt;b&gt;&quot;+t[&quot;black&quot;]+&quot;&lt;/b&gt;&lt;/span&gt;                        &lt;span class='re'&gt;&lt;b&gt;&quot;+t[&quot;result&quot;]+&quot;&lt;/b&gt;&lt;/span&gt;                        &lt;span class='dt'&gt;&lt;b&gt;&quot;+t[&quot;date&quot;]+&quot;&lt;/b&gt;&lt;/span&gt;                        &lt;div class='clear'&gt;&lt;/div&gt;                    &lt;/div&gt;                    &lt;div id='search-results' class='search-results'&gt;&lt;/div&gt;                &lt;/div&gt;            &lt;/div&gt;            &lt;div id='info' class='info'&gt;                &lt;div id='info-players' class='players'&gt;                    &lt;div id='white' class='player white'&gt;                        &lt;div id='white-name' class='name'&gt;&lt;/div&gt;                        &lt;div id='white-captures' class='captures'&gt;&lt;/div&gt;                        &lt;div id='white-time' class='time'&gt;&lt;/div&gt;                    &lt;/div&gt;                    &lt;div id='black' class='player black'&gt;                        &lt;div id='black-name' class='name'&gt;&lt;/div&gt;                        &lt;div id='black-captures' class='captures'&gt;&lt;/div&gt;                        &lt;div id='black-time' class='time'&gt;&lt;/div&gt;                    &lt;/div&gt;                &lt;/div&gt;                &lt;div id='info-game' class='game'&gt;&lt;/div&gt;            &lt;/div&gt;            &lt;div id='nav-tree-container' class='nav-tree-container'&gt;                &lt;div id='nav-tree' class='nav-tree'&gt;&lt;/div&gt;            &lt;/div&gt;            &lt;div id='options' class='options'&gt;                &quot;+(this.saveUrl?&quot;&lt;a id='option-save' class='option-save' href='#'&gt;&quot;+t[&quot;save to server&quot;]+&quot;&lt;/a&gt;&quot;:&quot;&quot;)+&quot;                &quot;+(this.downloadUrl||_c?&quot;&lt;a id='option-download' class='option-download' href='#'&gt;&quot;+t[&quot;download sgf&quot;]+&quot;&lt;/a&gt;&quot;:&quot;&quot;)+&quot;                &lt;div class='options-stop'&gt;&lt;/div&gt;            &lt;/div&gt;            &lt;div id='preferences' class='preferences'&gt;                &lt;div&gt;&lt;input type='checkbox'&gt; Show variations on board&lt;/div&gt;                &lt;div&gt;&lt;input type='checkbox'&gt; Mark current move&lt;/div&gt;            &lt;/div&gt;            &lt;div id='footer' class='footer'&gt;&lt;/div&gt;            &lt;div id='shade' class='shade'&gt;&lt;/div&gt;        &quot;;
+_147=_147.replace(/ id='([^']+)'/g,&quot; id='$1-&quot;+this.uniq+&quot;'&quot;);
+this.dom.player.innerHTML=_147;
 var re=/ id='([^']+)-\d+'/g;
-var _148;
+var _149;
 var id;
-var _14a;
-while(_148=re.exec(_146)){
-id=_148[0].replace(/'/g,&quot;&quot;).replace(/ id=/,&quot;&quot;);
-_14a=&quot;&quot;;
-_148[1].split(&quot;-&quot;).forEach(function(word,i){
+var _14b;
+while(_149=re.exec(_147)){
+id=_149[0].replace(/'/g,&quot;&quot;).replace(/ id=/,&quot;&quot;);
+_14b=&quot;&quot;;
+_149[1].split(&quot;-&quot;).forEach(function(word,i){
 word=i?word.charAt(0).toUpperCase()+word.substring(1):word;
-_14a+=word;
+_14b+=word;
 });
-this.dom[_14a]=_2(id);
+this.dom[_14b]=_2(id);
 }
 [[&quot;moveNumber&quot;,&quot;setPermalink&quot;],[&quot;controlFirst&quot;,&quot;first&quot;],[&quot;controlBack&quot;,&quot;back&quot;],[&quot;controlForward&quot;,&quot;forward&quot;],[&quot;controlLast&quot;,&quot;last&quot;],[&quot;controlPass&quot;,&quot;pass&quot;],[&quot;scoreEst&quot;,&quot;fetchScoreEstimate&quot;],[&quot;searchButton&quot;,&quot;searchRegion&quot;],[&quot;searchResults&quot;,&quot;loadSearchResult&quot;],[&quot;searchClose&quot;,&quot;closeSearch&quot;],[&quot;optionDownload&quot;,&quot;downloadSgf&quot;],[&quot;optionSave&quot;,&quot;save&quot;],[&quot;commentsEditDone&quot;,&quot;finishEditComment&quot;],[&quot;gameInfoEditDone&quot;,&quot;finishEditGameInfo&quot;],[&quot;navTree&quot;,&quot;navTreeClick&quot;]].forEach(function(eh){
 if(this.dom[eh[0]]){
@@ -2773,185 +2763,232 @@ _b(this.dom.navSliderThumb);
 return;
 }
 this.dom.navSlider.style.cursor=&quot;pointer&quot;;
-var _14f=false;
-var _150=null;
+var _150=false;
+var _151=null;
 _4(this.dom.navSlider,&quot;mousedown&quot;,function(e){
-_14f=true;
+_150=true;
 _7(e);
 },this,true);
 _4(document,&quot;mousemove&quot;,function(e){
-if(!_14f){
+if(!_150){
 return;
 }
 var xy=_6(e,this.dom.navSlider);
-clearTimeout(_150);
-_150=setTimeout(function(){
+clearTimeout(_151);
+_151=setTimeout(function(){
 this.updateNavSlider(xy[0]);
 }.bind(this),10);
 _7(e);
 },this,true);
 _4(document,&quot;mouseup&quot;,function(e){
-if(!_14f){
+if(!_150){
 return true;
 }
-_14f=false;
+_150=false;
 var xy=_6(e,this.dom.navSlider);
 this.updateNavSlider(xy[0]);
 return true;
 },this,true);
-},updateNavSlider:function(_156){
-var _157=this.dom.navSlider.offsetWidth-this.dom.navSliderThumb.offsetHeight;
-var _158=this.totalMoves;
-var _159=!!_156;
-_156=_156||(this.moveNumber/_158*_157);
-_156=_156&gt;_157?_157:_156;
-_156=_156&lt;0?0:_156;
-var _15a=parseInt(_156/_157*_158,10);
-if(_159){
+},updateNavSlider:function(_157){
+var _158=this.dom.navSlider.offsetWidth-this.dom.navSliderThumb.offsetHeight;
+var _159=this.totalMoves;
+var _15a=!!_157;
+_157=_157||(this.moveNumber/_159*_158);
+_157=_157&gt;_158?_158:_157;
+_157=_157&lt;0?0:_157;
+var _15b=parseInt(_157/_158*_159,10);
+if(_15a){
 this.nowLoading();
-var _15b=_15a-this.cursor.getMoveNumber();
-for(var i=0;i&lt;Math.abs(_15b);i++){
-if(_15b&gt;0){
+var _15c=_15b-this.cursor.getMoveNumber();
+for(var i=0;i&lt;Math.abs(_15c);i++){
+if(_15c&gt;0){
 this.variation(null,true);
 }else{
-if(_15b&lt;0){
+if(_15c&lt;0){
 this.cursor.previous();
 }
 }
 }
-if(_15b&lt;0){
-this.board.revert(Math.abs(_15b));
+if(_15c&lt;0){
+this.board.revert(Math.abs(_15c));
 }
 this.doneLoading();
 this.refresh();
 }
-_156=parseInt(_15a/_158*_157,10)||0;
-this.dom.navSliderThumb.style.left=_156+&quot;px&quot;;
+_157=parseInt(_15b/_159*_158,10)||0;
+this.dom.navSliderThumb.style.left=_157+&quot;px&quot;;
 },updateNavTree:function(){
 if(!this.prefs.showNavTree){
 return;
 }
-if(!this.unsavedChanges&amp;&amp;this.updatedNavTree){
+if(this.updatedNavTree){
 this.showNavTreeCurrent();
 return;
 }
 this.updatedNavTree=true;
-var html=&quot;&quot;,_15e=this.cursor.node._id,_15f=this.board.renderer.pointWidth+5,path=[this.cursor.getGameRoot().getPosition()],_161=this,_162=-1;
-var _163=function(node,_165,_166){
-var _167=0,_168=0,_169=_165,_16a;
-html+=&quot;&lt;li&quot;+(_166==0?&quot; class='first'&quot;:&quot;&quot;)+&quot;&gt;&lt;div class='mainline'&gt;&quot;;
-do{
-_16a=path.join(&quot;-&quot;)+&quot;-&quot;+_168;
-html+=&quot;&lt;a href='#' id='navtree-node-&quot;+_16a+&quot;' class='&quot;+(typeof node.W!=&quot;undefined&quot;?&quot;w&quot;:(typeof node.B!=&quot;undefined&quot;?&quot;b&quot;:&quot;x&quot;))+&quot;'&gt;&quot;+(_169)+&quot;&lt;/a&gt;&quot;;
+var _15e=[],path=[this.cursor.getGameRoot().getPosition()],cur=new eidogo.GameCursor(),maxx=0;
+var _162=function(node,_164,_165){
+var y=_165,x=_164;
+var n=node,_169=1;
+while(n&amp;&amp;n._children.length==1){
 _169++;
+n=n._children[0];
+}
+while(_15e[y]&amp;&amp;_15e[y].slice(x,x+_169+1).some(function(el){
+return (typeof el!=&quot;undefined&quot;);
+})){
+y++;
+}
+do{
+if(!_15e[y]){
+_15e[y]=[];
+}
+cur.node=node;
+node._pathStr=path.join(&quot;-&quot;)+&quot;-&quot;+(x-_164);
+_15e[y][x]=node;
+if(x&gt;maxx){
+maxx=x;
+}
+x++;
 if(node._children.length!=1){
 break;
 }
-if(node._parent._parent==null){
-path.push(node.getPosition());
-}else{
-_168++;
-}
 node=node._children[0];
-_167++;
 }while(node);
-html+=&quot;&lt;/div&gt;&quot;;
-if(node._children.length&gt;1){
-html+=&quot;&lt;ul style='margin-left: &quot;+(_167*_15f)+&quot;px'&gt;&quot;;
-}
 for(var i=0;i&lt;node._children.length;i++){
-if(node._children.length&gt;1){
 path.push(i);
-}
-_163(node._children[i],_169,i);
-if(node._children.length&gt;1){
+_162(node._children[i],x,y);
 path.pop();
 }
+};
+_162(this.cursor.getGameRoot(),0,0);
+var html=[&quot;&lt;table class='nav-tree'&gt;&quot;],node,td,cur=new eidogo.GameCursor(),x,y,_171,_172=1,LINE=2;
+for(x=0;x&lt;maxx;x++){
+_171=false;
+for(y=_15e.length-1;y&gt;0;y--){
+if(!_15e[y][x]){
+if(typeof _15e[y][x+1]==&quot;object&quot;){
+_15e[y][x]=_172;
+_171=true;
+}else{
+if(_171){
+_15e[y][x]=LINE;
+}
 }
-if(node._children.length&gt;1){
-html+=&quot;&lt;/ul&gt;&quot;;
+}else{
+_171=false;
 }
-html+=&quot;&lt;/li&gt;&quot;;
-if(_169&gt;_162){
-_162=_169;
 }
-};
-_163(this.cursor.getGameRoot(),0,0);
-this.dom.navTree.style.width=((_162+2)*_15f)+&quot;px&quot;;
-this.dom.navTree.innerHTML=&quot;&lt;ul class='root'&gt;&quot;+html+&quot;&lt;/ul&gt;&quot;;
+}
+for(y=0;y&lt;_15e.length;y++){
+html.push(&quot;&lt;tr&gt;&quot;);
+for(x=0;x&lt;_15e[y].length;x++){
+node=_15e[y][x];
+if(node==_172){
+td=&quot;&lt;div class='elbow'&gt;&lt;/div&gt;&quot;;
+}else{
+if(node==LINE){
+td=&quot;&lt;div class='line'&gt;&lt;/div&gt;&quot;;
+}else{
+if(node){
+td=[&quot;&lt;a href='#' id='navtree-node-&quot;,node._pathStr,&quot;' class='&quot;,(typeof node.W!=&quot;undefined&quot;?&quot;w&quot;:(typeof node.B!=&quot;undefined&quot;?&quot;b&quot;:&quot;x&quot;)),&quot;'&gt;&quot;,x,&quot;&lt;/a&gt;&quot;].join(&quot;&quot;);
+}else{
+td=&quot;&lt;div class='empty'&gt;&lt;/div&gt;&quot;;
+}
+}
+}
+html.push(&quot;&lt;td&gt;&quot;);
+html.push(td);
+html.push(&quot;&lt;/td&gt;&quot;);
+}
+html.push(&quot;&lt;/tr&gt;&quot;);
+}
+html.push(&quot;&lt;/table&gt;&quot;);
+this.dom.navTree.innerHTML=html.join(&quot;&quot;);
 setTimeout(function(){
 this.showNavTreeCurrent();
 }.bind(this),0);
 },showNavTreeCurrent:function(){
-var _16c=_2(&quot;navtree-node-&quot;+this.cursor.getPath().join(&quot;-&quot;));
-if(!_16c){
+var id=&quot;navtree-node-&quot;+this.cursor.getPath().join(&quot;-&quot;),_175=_2(id);
+if(!_175){
 return;
 }
 if(this.prevNavTreeCurrent){
 this.prevNavTreeCurrent.className=this.prevNavTreeCurrentClass;
 }
-this.prevNavTreeCurrent=_16c;
-this.prevNavTreeCurrentClass=_16c.className;
-_16c.className=&quot;current&quot;;
-},navTreeClick:function(e){
-var _16e=e.target||e.srcElement;
-if(_16e.nodeName.toLowerCase()==&quot;li&quot;&amp;&amp;_16e.className==&quot;first&quot;){
-_16e=_16e.parentNode.previousSibling.lastChild;
+this.prevNavTreeCurrent=_175;
+this.prevNavTreeCurrentClass=_175.className;
+_175.className=&quot;current&quot;;
+var w=_175.offsetWidth,h=_175.offsetHeight,xy=eidogo.util.getElXY(_175),_179=eidogo.util.getElXY(this.dom.navTree),l=xy[0]-_179[0],t=xy[1]-_179[1],ntc=this.dom.navTreeContainer,maxl=ntc.scrollLeft,maxr=maxl+ntc.offsetWidth-100;
+maxt=ntc.scrollTop,maxb=maxt+ntc.offsetHeight-30;
+if(l&lt;maxl){
+ntc.scrollLeft-=(maxl-l);
+}
+if(l+w&gt;maxr){
+ntc.scrollLeft+=((l+w)-maxr);
 }
-if(!_16e||!_16e.id){
+if(t&lt;maxt){
+ntc.scrollTop-=(maxt-t);
+}
+if(t+h&gt;maxb){
+ntc.scrollTop+=((t+h)-maxb);
+}
+},navTreeClick:function(e){
+var _17f=e.target||e.srcElement;
+if(!_17f||!_17f.id){
 return;
 }
-var path=_16e.id.replace(/^navtree-node-/,&quot;&quot;).split(&quot;-&quot;);
+var path=_17f.id.replace(/^navtree-node-/,&quot;&quot;).split(&quot;-&quot;);
 this.goTo(path,true);
 _7(e);
 },resetLastLabels:function(){
 this.labelLastNumber=1;
 this.labelLastLetter=&quot;A&quot;;
-},getGameDescription:function(_170){
+},getGameDescription:function(_181){
 var root=this.cursor.getGameRoot();
 if(!root){
 return;
 }
-var desc=(_170?&quot;&quot;:root.GN||this.gameName);
+var desc=(_181?&quot;&quot;:root.GN||this.gameName);
 if(root.PW&amp;&amp;root.PB){
 var wr=root.WR?&quot; &quot;+root.WR:&quot;&quot;;
 var br=root.BR?&quot; &quot;+root.BR:&quot;&quot;;
 desc+=(desc.length?&quot; - &quot;:&quot;&quot;)+root.PW+wr+&quot; vs &quot;+root.PB+br;
 }
 return desc;
-},sgfCoordToPoint:function(_175){
-if(!_175||_175==&quot;tt&quot;){
+},sgfCoordToPoint:function(_186){
+if(!_186||_186==&quot;tt&quot;){
 return {x:null,y:null};
 }
-var _176={a:0,b:1,c:2,d:3,e:4,f:5,g:6,h:7,i:8,j:9,k:10,l:11,m:12,n:13,o:14,p:15,q:16,r:17,s:18};
-return {x:_176[_175.charAt(0)],y:_176[_175.charAt(1)]};
+var _187={a:0,b:1,c:2,d:3,e:4,f:5,g:6,h:7,i:8,j:9,k:10,l:11,m:12,n:13,o:14,p:15,q:16,r:17,s:18};
+return {x:_187[_186.charAt(0)],y:_187[_186.charAt(1)]};
 },pointToSgfCoord:function(pt){
 if(!pt||(this.board&amp;&amp;!this.boundsCheck(pt.x,pt.y,[0,this.board.boardSize-1]))){
 return null;
 }
 var pts={0:&quot;a&quot;,1:&quot;b&quot;,2:&quot;c&quot;,3:&quot;d&quot;,4:&quot;e&quot;,5:&quot;f&quot;,6:&quot;g&quot;,7:&quot;h&quot;,8:&quot;i&quot;,9:&quot;j&quot;,10:&quot;k&quot;,11:&quot;l&quot;,12:&quot;m&quot;,13:&quot;n&quot;,14:&quot;o&quot;,15:&quot;p&quot;,16:&quot;q&quot;,17:&quot;r&quot;,18:&quot;s&quot;};
 return pts[pt.x]+pts[pt.y];
-},expandCompressedPoints:function(_179){
-var _17a;
+},expandCompressedPoints:function(_18a){
+var _18b;
 var ul,lr;
 var x,y;
-var _17f=[];
+var _190=[];
 var hits=[];
-for(var i=0;i&lt;_179.length;i++){
-_17a=_179[i].split(/:/);
-if(_17a.length&gt;1){
-ul=this.sgfCoordToPoint(_17a[0]);
-lr=this.sgfCoordToPoint(_17a[1]);
+for(var i=0;i&lt;_18a.length;i++){
+_18b=_18a[i].split(/:/);
+if(_18b.length&gt;1){
+ul=this.sgfCoordToPoint(_18b[0]);
+lr=this.sgfCoordToPoint(_18b[1]);
 for(x=ul.x;x&lt;=lr.x;x++){
 for(y=ul.y;y&lt;=lr.y;y++){
-_17f.push(this.pointToSgfCoord({x:x,y:y}));
+_190.push(this.pointToSgfCoord({x:x,y:y}));
 }
 }
 hits.push(i);
 }
 }
-_179=_179.concat(_17f);
-return _179;
+_18a=_18a.concat(_190);
+return _18a;
 },setPermalink:function(){
 if(!this.permalinkable){
 return true;</diff>
      <filename>player/js/all.compressed.js</filename>
    </modified>
    <modified>
      <diff>@@ -303,23 +303,20 @@ eidogo.GameCursor.prototype = {
         return node;
     },
     getPath: function() {
-        var path = [];
-        var cur = new eidogo.GameCursor(this.node);
-        var mn = (cur.node._parent &amp;&amp; cur.node._parent._parent ? -1 : null);
-        var prev;
-        do {
-            prev = cur.node;
-            cur.previous();
-            if (mn != null) mn++;
-        } while (cur.hasPrevious() &amp;&amp; cur.node._children.length == 1);
-        if (mn != null)
-            path.push(mn);
-        path.push(prev.getPosition());
-        do {
-            if (cur.node._children.length &gt; 1 || cur.node._parent._parent == null)
-                path.push(cur.node.getPosition());
-        } while (cur.previous());
-        return path.reverse();
+        var n = this.node,
+            rpath = [],
+            mn = 0;
+        while (n &amp;&amp; n._parent &amp;&amp; n._parent._children.length == 1 &amp;&amp; n._parent._parent) {
+            mn++;
+            n = n._parent;
+        }
+        rpath.push(mn);
+        while (n) {
+            if (n._parent &amp;&amp; (n._parent._children.length &gt; 1 || !n._parent._parent))
+                rpath.push(n.getPosition() || 0);
+            n = n._parent;
+        }
+        return rpath.reverse();
     },
     getPathMoves: function() {
         var path = [];</diff>
      <filename>player/js/gametree.js</filename>
    </modified>
    <modified>
      <diff>@@ -308,9 +308,6 @@ eidogo.Player.prototype = {
         this.prefs.showOptions = !!cfg.showOptions;
         this.prefs.showNavTree = !this.progressiveLoad &amp;&amp; typeof cfg.showNavTree != &quot;undefined&quot; ?
             !!cfg.showNavTree : false;
-        // Firefox and Safari 3 only for now
-        if (this.prefs.showNavTree &amp;&amp; !(eidogo.browser.moz || eidogo.browser.safari3))
-            this.prefs.showNavTree = false;
     },
     
     /**
@@ -436,6 +433,7 @@ eidogo.Player.prototype = {
      * a new gameRoot and initializes the game.
     **/
     load: function(data, target) {
+        var newGame = false;
         if (!target) {
             // load from scratch
             target = new eidogo.GameNode();
@@ -450,10 +448,11 @@ eidogo.Player.prototype = {
             // other if specified
             var gameIndex = this.loadPath.length ? parseInt(this.loadPath[0], 10) : 0;
             this.initGame(target._children[gameIndex || 0]);
+            newGame = true;
         }
         
         if (this.loadPath.length) {
-            this.goTo(this.loadPath, false);
+            this.goTo(this.loadPath, newGame);
             if (!this.progressiveLoad) {
                 this.loadPath = [0,0];
             }
@@ -766,7 +765,7 @@ eidogo.Player.prototype = {
                 for (var i = 0; i &lt; position; i++)
                     this.variation(0, true);
             } else if (path.length) {
-                if (!first &amp;&amp; this.cursor.node._parent._parent)
+                if (!first &amp;&amp; fromStart)
                     while (this.cursor.node._children.length == 1)
                         this.variation(0, true);
                 this.variation(position, true);
@@ -905,7 +904,6 @@ eidogo.Player.prototype = {
             var loadId = (loadNode &amp;&amp; loadNode._id) || 0;
             this.nowLoading();
             this.progressiveLoads++;
-            this.updatedNavTree = false;
             // Show pro game search after second move
             var completeFnWrap = function() {
                 var moveNum = this.cursor.getMoveNumber();
@@ -932,7 +930,6 @@ eidogo.Player.prototype = {
     fetchProgressiveContinuations: function(completeFn) {
         this.nowLoading();
         this.progressiveLoads++;
-        this.updatedNavTree = false;
         var moveNum = this.cursor.getMoveNumber();
         var size = (moveNum &gt; 1 ? 11 : 7);
         var left = 19 - size - 1;
@@ -1623,7 +1620,8 @@ eidogo.Player.prototype = {
         varNode._cached = true;
         this.totalMoves++;
         this.cursor.node.appendChild(varNode);
-        this.unsavedChanges = true;
+        this.unsavedChanges = [this.cursor.node._children.last(), this.cursor.node];
+        this.updatedNavTree = false;
         this.variation(this.cursor.node._children.length-1);
     },
 
@@ -2328,77 +2326,155 @@ eidogo.Player.prototype = {
         this.dom.navSliderThumb.style.left = offset + &quot;px&quot;;
     },
     
+    /**
+     * Construct a navigation tree from scratch, assuming it hasn't been done
+     * already and no unsaved additions have been made.
+     *
+     * We do this in two passes:
+     *    1) Construct a 2D array, navGrid, containing all nodes and where
+     *       to display them horizontally and vertically (adjustments are
+     *       made to avoid overlapping lines of play)
+     *    2) Based on navGrid, construct an HTML table to actually display
+     *       the nav tree
+     *
+     * Every time a new move is played, this entire process repeats, which is
+     * kind of slow and inefficient. An attempt was made to only update
+     * select portions of the tree, but it didn't improve performance much at
+     * all, especially not in IE, where the HTML display is the slowest part.
+     * A feasible method for making selective updates doesn't come to mind.
+    **/
     updateNavTree: function() {
         if (!this.prefs.showNavTree)
             return;
-        if (!this.unsavedChanges &amp;&amp; this.updatedNavTree) {
+        if (this.updatedNavTree) {
             this.showNavTreeCurrent();
             return;
         }
         this.updatedNavTree = true;
-        var html = &quot;&quot;,
-            curId = this.cursor.node._id,
-            nodeWidth = this.board.renderer.pointWidth + 5,
+        // Construct 2D nav grid
+        var navGrid = [],
             path = [this.cursor.getGameRoot().getPosition()],
-            player = this,
-            maxMoveNum = -1;
-        var traverse = function(node, startNum, varNum) {
-            var indent = 0,
-                offset = 0,
-                moveNum = startNum,
-                pathStr;
-            html += &quot;&lt;li&quot; + (varNum == 0 ? &quot; class='first'&quot; : &quot;&quot;) + &quot;&gt;&lt;div class='mainline'&gt;&quot;;
-            do {
-                pathStr = path.join('-') + &quot;-&quot; + offset;
-                html += &quot;&lt;a href='#' id='navtree-node-&quot; + pathStr  + &quot;' class='&quot; +
-                    (typeof node.W != &quot;undefined&quot; ? 'w' : (typeof node.B != &quot;undefined&quot; ? 'b' : 'x')) +
-                    &quot;'&gt;&quot; + (moveNum) + &quot;&lt;/a&gt;&quot;;
-                moveNum++;
+            cur = new eidogo.GameCursor(),
+            maxx = 0;
+        var traverse = function(node, startx, starty) {
+            var y = starty, x = startx;
+            var n = node, width = 1;
+            while (n &amp;&amp; n._children.length == 1) {
+                width++;
+                n = n._children[0];
+            }
+            // If we'll overlap any future moves, skip down a row
+            while (navGrid[y] &amp;&amp; navGrid[y].slice(x, x + width + 1).some(function(el) {
+                return (typeof el != &quot;undefined&quot;);
+            })) {
+                y++;
+            }
+            do {   
+                if (!navGrid[y])
+                    navGrid[y] = [];
+                cur.node = node;
+                node._pathStr = path.join('-') + &quot;-&quot; + (x - startx);
+                navGrid[y][x] = node;
+                if (x &gt; maxx)
+                    maxx = x;
+                x++;
                 if (node._children.length != 1) break;
-                if (node._parent._parent == null)
-                    path.push(node.getPosition());
-                else
-                    offset++;
                 node = node._children[0];
-                indent++;
             } while (node);
-            html += &quot;&lt;/div&gt;&quot;;
-            if (node._children.length &gt; 1)
-                html += &quot;&lt;ul style='margin-left: &quot; + (indent * nodeWidth) + &quot;px'&gt;&quot;;
             for (var i = 0; i &lt; node._children.length; i++) {
-                if (node._children.length &gt; 1)
-                    path.push(i);
-                traverse(node._children[i], moveNum, i);
-                if (node._children.length &gt; 1)
-                    path.pop();
+                path.push(i);
+                traverse(node._children[i], x, y);
+                path.pop();
             }
-            if (node._children.length &gt; 1)
-                html += &quot;&lt;/ul&gt;&quot;;
-            html += &quot;&lt;/li&gt;&quot;;
-            if (moveNum &gt; maxMoveNum) maxMoveNum = moveNum;
         }
         traverse(this.cursor.getGameRoot(), 0, 0);
-        this.dom.navTree.style.width = ((maxMoveNum+2) * nodeWidth) + &quot;px&quot;;
-        this.dom.navTree.innerHTML = &quot;&lt;ul class='root'&gt;&quot; + html + &quot;&lt;/ul&gt;&quot;;
+        // Construct HTML
+        var html = [&quot;&lt;table class='nav-tree'&gt;&quot;],
+            node, td, cur = new eidogo.GameCursor(),
+            x, y, showLine,
+            ELBOW = 1, LINE = 2;
+        for (x = 0; x &lt; maxx; x++) {
+            showLine = false
+            for (y = navGrid.length - 1; y &gt; 0; y--) {
+                if (!navGrid[y][x]) {
+                    if (typeof navGrid[y][x + 1] == &quot;object&quot;) {
+                        navGrid[y][x] = ELBOW;
+                        showLine = true;
+                    } else if (showLine) {
+                        navGrid[y][x] = LINE;
+                    }
+                } else {
+                    showLine = false;
+                }
+            }    
+        }
+        for (y = 0; y &lt; navGrid.length; y++) {
+            html.push(&quot;&lt;tr&gt;&quot;);
+            for (x = 0; x &lt; navGrid[y].length; x++) {
+                node = navGrid[y][x];
+                if (node == ELBOW) {
+                    td = &quot;&lt;div class='elbow'&gt;&lt;/div&gt;&quot;;
+                } else if (node == LINE) {
+                    td = &quot;&lt;div class='line'&gt;&lt;/div&gt;&quot;;
+                } else if (node) {
+                    td = [&quot;&lt;a href='#' id='navtree-node-&quot;,
+                          node._pathStr,
+                          &quot;' class='&quot;,
+                          (typeof node.W != &quot;undefined&quot; ? 'w' :
+                          (typeof node.B != &quot;undefined&quot; ? 'b' : 'x')),
+                          &quot;'&gt;&quot;,
+                          x,
+                          &quot;&lt;/a&gt;&quot;].join(&quot;&quot;);
+                } else {
+                    td = &quot;&lt;div class='empty'&gt;&lt;/div&gt;&quot;;
+                }
+                html.push(&quot;&lt;td&gt;&quot;);
+                html.push(td);
+                html.push(&quot;&lt;/td&gt;&quot;);
+            }
+            html.push(&quot;&lt;/tr&gt;&quot;);
+        }
+        html.push(&quot;&lt;/table&gt;&quot;);
+        this.dom.navTree.innerHTML = html.join(&quot;&quot;);
         setTimeout(function() {
             this.showNavTreeCurrent();
         }.bind(this), 0);
     },
     
     showNavTreeCurrent: function() {
-        var current = byId(&quot;navtree-node-&quot; + this.cursor.getPath().join(&quot;-&quot;));
+        var id = &quot;navtree-node-&quot; + this.cursor.getPath().join(&quot;-&quot;),
+            current = byId(id);
         if (!current) return;
+        // Highlight node
         if (this.prevNavTreeCurrent)
             this.prevNavTreeCurrent.className = this.prevNavTreeCurrentClass;
         this.prevNavTreeCurrent = current;
         this.prevNavTreeCurrentClass = current.className;
         current.className = &quot;current&quot;;
+        // Scroll into view if necessary
+        var w = current.offsetWidth,
+            h = current.offsetHeight,
+            xy = eidogo.util.getElXY(current),
+            navxy = eidogo.util.getElXY(this.dom.navTree),
+            l = xy[0] - navxy[0],
+            t = xy[1] - navxy[1],
+            ntc = this.dom.navTreeContainer,
+            maxl = ntc.scrollLeft,
+            maxr = maxl + ntc.offsetWidth - 100;
+            maxt = ntc.scrollTop,
+            maxb = maxt + ntc.offsetHeight - 30;
+        if (l &lt; maxl)
+            ntc.scrollLeft -= (maxl - l);
+        if (l + w &gt; maxr)
+            ntc.scrollLeft += ((l + w) - maxr);
+        if (t &lt; maxt)
+            ntc.scrollTop -= (maxt - t);
+        if (t + h &gt; maxb)
+            ntc.scrollTop += ((t + h) - maxb);
     },
     
     navTreeClick: function(e) {
         var target = e.target || e.srcElement;
-        if (target.nodeName.toLowerCase() == &quot;li&quot; &amp;&amp; target.className == &quot;first&quot;)
-            target = target.parentNode.previousSibling.lastChild;
         if (!target || !target.id) return;
         var path = target.id.replace(/^navtree-node-/, &quot;&quot;).split(&quot;-&quot;);
         this.goTo(path, true);</diff>
      <filename>player/js/player.js</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>0834d76af81f8ac744cc6e57672e265162b21dbd</id>
    </parent>
  </parents>
  <author>
    <name>Justin Kramer</name>
    <email>jkkramer@gmail.com</email>
  </author>
  <url>http://github.com/jkk/eidogo/commit/29cd15cf3ddb8f540d466dead2191e2fdc0295c6</url>
  <id>29cd15cf3ddb8f540d466dead2191e2fdc0295c6</id>
  <committed-date>2008-09-08T22:17:33-07:00</committed-date>
  <authored-date>2008-09-08T13:33:12-07:00</authored-date>
  <message>working crossbrowser navtree; needs optimization, esp in IE</message>
  <tree>174e23d6430dd951278be217585cae8f0a507c56</tree>
  <committer>
    <name>Justin Kramer</name>
    <email>jkkramer@gmail.com</email>
  </committer>
</commit>
