/* ------------------------------------------------------------------------
	(Blogspot)PGN Viewer
	
	Developped By: Chess Publishing -> http://chesspublishing.blogspot.com/
	Version: 1.1.4 but still unfinished and under development
	
	The used script is partly based on Palview and tries to use the same
		coding scheme for the moves.

	Feel free to redistribute the script/modify it, as
			   long as you leave my infos at the top.
------------------------------------------------------------------------- */

var nnn=0;var hclr='#E9D9C6';var vclr='green';var doc=document;
ie4=(doc.all)?1:0;ns6=(doc.getElementById)&&!(ie4);ns4=(doc.layers)?1:0;
//doc.onkeydown = KeyDown;
var restr=['1-0','0-1','1/2-1/2','*'];
var ipcs='ipnbrqkxov';var fench='/PNBRQK//pnbrqk12345678XOV';
var vdir='http://sites.google.com/site/viewchessgame/';
var pcsdir=vdir+'pcs/';var symdir=vdir+'sym/';var pdir=pcsdir;
var urlpcs=['i.gif','wp.gif','wn.gif','wb.gif','wr.gif','wq.gif','wk.gif','','','bp.gif','bn.gif','bb.gif','br.gif','bq.gif','bk.gif','','p3con0.gif','p3con1.gif','','w.gif','b.gif','letters.gif','figures.gif','x.gif','o.gif','v.gif'];
var brdimg=pcsdir+'bg.jpg';
var vl=[0,0,0,0,0,0,0,0];var vll=[0,0,0,0,0,0,0,0];
var s1=0;var s2=0;var r1=0;var r2=0;var lvflg=0;var mvflg=0;var pc=0;var capc=0;var cf=0;
var ep=0;var pr=0;var tmid=0;var tmc=0;var atgm=-1;
var lk=0;var cm=0;var tm=0;var ml=0;var cg=0;var cb=0;var prepc=8;
if(ie4)doc.onmousemove=MsMove;if(ns6)doc.onclick=ns6Click;
var gx=[-4];var mn=[0];var pm=[0];var jm=[0];var gl=[0];var jb=[0];var st=[0];
var gb=[];var gf=[];var gc=[];var gm=[];var startpos=[];
var gflip=[0];var gres=[0];var gend=[0];var gprob=[0];var gstrt=[0];
//var p1=new Image();p1.src=pdir+urlpcs[17];
var delay=1500;var InPlace=false;
function Nag(nag){
var s="<img src='"+symdir;
switch(nag){
case 1:s="!";break;case 2:s="?";break;case 3:s="!!";break;case 4:s="??";break;case 5:s="!?";break;
case 6:s="?!";break;case 8:s+="s13.gif' title='only move' />";break;case 11:s="=";break;
case 13:s+="s34.gif' title='position is unclear' />";break;
case 14:s+="s1.gif' title='white is slightly better' />";break;
case 15:s+="s2.gif' title='black is slightly better' />";break;
case 16:s+="s5.gif' title='white has a moderate advantage' />";break;
case 17:s+="s6.gif' title='black has a moderate advantage' />";break;
case 18:s+="s3.gif' title='white has a decisive advantage' />";break;
case 19:s+="s4.gif' title='black has a decisive advantage' />";break;
case 22:s+="s25.gif' title='White is in zugzwang' />";break;
case 23:s+="s25.gif' title='Black is in zugzwang' />";break;
case 24:case 26:case28:s+="s14.gif' title='White has a space advantage' />";break;
case 25:case 27:case 29:s+="s14.gif' title='Black has a space advantage' />";break;
case 30:case 32:case 34:s+="s30.gif' title='White has a development advantage' />";break;
case 31:case 33:case 35:s+="s30.gif' title='Black has a development advantage' />";break;
case 36:s+="s28.gif' title='White has the initiative' />";break;
case 37:s+="s28.gif' title='Black has the initiative' />";break;
case 40:s+="s26.gif' title='with attack' />";break;
case 44:s+="s7.gif' title='with compensation for material' />";break;
case 132:s+="s27.gif' title='with counterplay' />";break;
case 138:s+="s29.gif' title='time, time trouble' />";break;
case 146:s+="s38.gif' title='' />";break;
case 48:s+="s23.gif' title='White has a slight center control advantage' />";break;
case 49:s+="s23.gif' title='Black has a slight center control advantage' />";break;
case 50:s+="s23.gif' title='White has a moderate center control advantage' />";break;
case 51:s+="s23.gif' title='Black has a moderate center control advantage' />";break;
case 52:s+="s23.gif' title='White has a decisive center control advantage' />";break;
case 53:s+="s23.gif' title='Black has a decisive center control advantage' />";break;
case 54:s+="s35.gif' title='White has a slight kingside control advantage' />";break;
case 55:s+="s35.gif' title='Black has a slight kingside control advantage' />";break;
case 56:s+="s35.gif' title='White has a moderate kingside control advantage' />";break;
case 57:s+="s35.gif' title='Black has a moderate kingside control advantage' />";break;
case 58:s+="s35.gif' title='White has a decisive kingside control advantage' />";break;
case 59:s+="s35.gif' title='Black has a decisive kingside control advantage' />";break;
case 60:s+="s36.gif' title='White has a slight queenside control advantage' />";break;
case 61:s+="s36.gif' title='Black has a slight queenside control advantage' />";break;
case 62:s+="s36.gif' title='White has a moderate queenside control advantage' />";break;
case 63:s+="s36.gif' title='Black has a moderate queenside control advantage' />";break;
case 64:s+="s36.gif' title='White has a decisive queenside control advantage' />";break;
case 65:s+="s36.gif' title='Black has a decisive queenside control advantage' />";break;
case 148:s+="s24.gif' title='ending' />";break;
case 149:s+="s32.gif' title='file' />";break;
case 150:s+="s31.gif' title='diagonal' />";break;
case 151:case 152:s+="s20.gif' title='pair of bishops' />";break;
case 153:s+="s21.gif' title='bishops opposite color' />";break;
case 154:s+="s22.gif' title='bishops same color' />";break;
case 155:case 156:s+="s15.gif' title='connected pawns' />";break;
case 157:case 158:s+="s16.gif' title='disconnected pawns' />";break;
case 159:case 160:s+="s17.gif' title='doubled pawns' />";break;
case 161:case 162:s+="s18.gif' title='passed pawn' />";break;
case 163:case 164:s=">";break;
//prefix group
case 140:s+="s10.gif' title='with this idea' />";break;
case 141:s+="s11.gif' title='aimed against this move' />";break;
case 142:s+="s12.gif' title='is better' />";break;
case 143:s+="s33.gif' title='is weaker' />";break;
case 144:s=" =";break;
case 145:s+="s37.gif' title='editorial comment before' />";break;
default:
  s=" $"+nag;
}
return(s);
}
function Game(fn,mv_s,pgn,c_,strt,att,s_1,l_,flip){
var fc;var s=0;var res=3;var nr=0;var add_brd="";var l_c=pgn.charAt(pgn.length-1);var tl=0;
if (l_c=='2') res=2; else if (l_c=='0') res=0; else if (l_c=='1') res=1;
if (fn.length<2) fn="rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR 1";
if ( c_ === undefined ) c_=1;
if ( l_ === undefined ) l_=0;
if ( s_1 === undefined ) s_1="Initial Position";
if ( att === undefined ) att=0;
if ( strt === undefined ) strt=0;
if ( flip === undefined ) flip=0;
nr=nnn;gb[nr]=[64];gf[nr]=fn.replace(/[/-]/ig,"");gc[nr]=s_1;
gm[nr]=mv_s;gstrt[nr]=c_;nnn=nr+1;
gflip[nr]=flip; gflip[nnn]=0;gres[nr]=res; gres[nnn]=0;
gend[nr]=mv_s.length-4;gend[nnn]=0;gprob[nr]=att;gprob[nnn]=0;startpos[nr]=strt;
gx[nnn]=-4;mn[nnn]=0;pm[nnn]=0;jm[nnn]=0;gl[nnn]=0;jb[nnn]=0;st[nnn]=0;
  document.write("<A href='#pg"+nr+"' NAME='pg"+nr+"'></A><table class='board' align='left'><tr><td>");
  if(l_) document.write("<img style='width: 21px; height: 240px;' src='"+pcsdir+urlpcs[22]+"' align='left' />");
document.write("<table class='board' style='border: medium double black;' cellspacing=0 cellpadding=0 background='"+brdimg+"' onClick='BrdNum("+nr+")' id='brdt"+nr+"'><tr><td>");
add_brd=" name='brd"+nr+"'>";
 for(i=0;i<64;i++){
  fc=fench.indexOf(fn.charAt(s++));
  switch (fc){
    case 0: document.write("<br>"); i--; break;
    case 1: case 2: case 3: case 4: case 5: case 6: case 9: case 10: case 11: case 12: case 13: case 14: document.write("<img src='"+pdir+urlpcs[fc]+"'"+add_brd); break;
    case 15: case 16: case 17: case 18: case 19: case 20: case 21: case 22:
     fc-=14;
     while(fc--){
      document.write("<img src='"+pdir+urlpcs[0]+"'"+add_brd);i++; add_brd=">";}
      --i; break;
    default: document.write("<img src='"+pdir+urlpcs[0]+"'"+add_brd);
  }
   add_brd=">";
  }
  document.write("</td></tr></table>");
 if(l_) document.write("<img style='width: 261px; height: 20px; align: left' src='"+pcsdir+urlpcs[21]+"' border=0 />");

if(c_>1) document.write("</td><td style='vertical-align: top'><img style='width: 29px; height: 29px;' src='"+pcsdir+urlpcs[20]+"' title='Black to move' />"); else document.write("</td><td style='vertical-align: top'><img style='width: 29px; height: 29px;' src='"+pcsdir+urlpcs[19]+"' title='White to move' />");

document.write("</td></tr><tr><td style='text-align: center; line-height:1.0em;'><p id='it"+nr+"'>"+s_1+"</p><form NAME='form"+nr+"'><p><map NAME='map"+nr+"'><area coords='1,1,23,19' href='javascript:void(0)' onClick='GoStart("+nr+"); return false;'><area coords='24,1,46,19' href='javascript:void(0)' onClick='Back5("+nr+"); return false;'><area coords='47,1,69,19' href='javascript:void(0)' onClick='Back("+nr+"); return false;'><area coords='70,1,92,19' href='javascript:void(0)' onClick='Forward("+nr+"); return false;'><area coords='93,1,115,19' href='javascript:void(0)' onClick='Forward5("+nr+"); return false;'><area coords='116,1,138,19' href='javascript:void(0)' onClick='GoEnd(0); return false;'><area coords='139,1,161,19' href='javascript:void(0)' onClick='Flip("+nr+"); return false;'><area coords='162,1,184,19' href='javascript:void(0)' onClick='Astart("+nr+"); return false;'><area coords='185,1,207,19' href='javascript:void(0)' onClick='Step("+nr+"); return false;'></map><IMG SRC='"+pcsdir+urlpcs[16]+"' border=0 usemap='#map"+nr+"' height=18 width=206></p></form></td></tr></table>");
var tabel=pgn.match(/[()]|[0-9 .-]+|$[0-9]+|[^ .{]+|{[^}]*}/g);
var q=1;var i0=0;
if(tabel[0].charAt(0)=='{') {document.write(tabel[0].substr(1,tabel[0].length-2));i0=1;}
document.write("<div id='qz"+nr+"'");if(att!=0) document.write(" class='qzs'");document.write("><A href='#jmv"+nr+"' NAME='jmv"+nr+"'></A>");
document.write("<p class='pm'>"); // ******* markup, also can be used to remove space around images
tl=tabel.length;for (i=i0;i<tl;i++){
    if("NBRQKOabcdefgh".indexOf(tabel[i].charAt(0))==-1){
      switch(tabel[i].charAt(0)) {
        case '{': document.write("<span class='pc'>"+tabel[i].substr(1,tabel[i].length-2)+"</span>"); break;
        case '$': document.write(Nag(parseInt(tabel[i].substr(1,tabel[i].length-1)))); break;
	  case '(': document.write("<span class='pc'>(");break; // ******* markup
	  case ')': document.write(")</span>");break; // ******* markup
	  case ' ': if((tabel[i].length==1)&&(i<(tl-1))&&(tabel[i+1].charAt(0)=='$')) break;
        default: document.write(tabel[i]); }
  } else document.write("<a href='javascript:Mv("+nr+","+(q++)+")'>"+tabel[i]+"</a>");
}
document.write("</p>"); // ******* markup
document.write("</div>");
if(mv_s==''){FindScrBrd();InitBoard(nr);gen_cds(pgn);}
}

function dtb(s0,sr,v0){
var s=0;var i0=0;i0=s0 % 8;var nr=nnn-1;
s=s0+9; while ((s<64)&&(s%8)>i0) {if (gb[nr][s]==v0) return(s); if (gb[nr][s]) break; s+=9; }
s=s0+7; while ((s<64)&&(s%8)<i0) {if (gb[nr][s]==v0) return(s); if (gb[nr][s]) break; s+=7; }
s=s0-7; while ((s>=0)&&(s%8)>i0) {if (gb[nr][s]==v0) return(s); if (gb[nr][s]) break; s-=7; }
s=s0-9; while ((s>=0)&&(s%8)<i0) {if (gb[nr][s]==v0) return(s); if (gb[nr][s]) break; s-=9; }
return(-1);}

function dtk(s0,sr,v0){
var nr=nnn-1;
if(s0>0){ if (gb[nr][s0-1]==v0) return(s0-1);
if(s0>6){ if (gb[nr][s0-7]==v0) return(s0-7);
if(s0>7){ if (gb[nr][s0-8]==v0) return(s0-8);
if(s0>8){ if (gb[nr][s0-9]==v0) return(s0-9);}}}}
if(s0<63){ if (gb[nr][s0+1]==v0) return(s0+1);
if(s0<57){ if (gb[nr][s0+7]==v0) return(s0+7);
if(s0<56){ if (gb[nr][s0+8]==v0) return(s0+8);
if(s0<55){ if (gb[nr][s0+9]==v0) return(s0+9);}}}}
return(-1);}

function dtr(s0,sr,v0){
var s=0;var i0=0;i0=s0 % 8;var nr=nnn-1;
if(sr.length>2&&sr.charAt(2)!='x'){s=sr.charCodeAt(1)-8*sr.charCodeAt(2)+351; return s;}
if(sr.length>1&&sr.charAt(1)!='x') {
s=s0-i0+sr.charCodeAt(1)-97;
if (s<0) {
s=i0+((56-sr.charCodeAt(1))<<3);
return s;}
if(s==s0){s=s0+1; while ((s%8)>i0) {if (gb[nr][s]==v0) return s; if(gb[nr][s]) break; s+=1; }
s=s0-1; while ((s%8)<i0) {if (gb[nr][s]==v0) return s; if(gb[nr][s]) break; s-=1; }}
return s;} else{
s=s0+8; while (s<64) {if (gb[nr][s]==v0) return s; if(gb[nr][s]) break; s+=8; }
s=s0+1; while ((s%8)>i0) {if (gb[nr][s]==v0) return s; if(gb[nr][s]) break; s+=1; }
s=s0-1; while ((s%8)<i0) {if (gb[nr][s]==v0) return s; if(gb[nr][s]) break; s-=1; }
s=s0-8; while (s>=0) {if (gb[nr][s]==v0) return s; if(gb[nr][s]) break; s-=8; }}
return(-1);}

function dtn(s0,sr,v0){
var s=0; var i0=s0 % 8; var i_1=0;var nr=nnn-1;
if(sr.length>2&&sr.charAt(2)!='x'){s=sr.charCodeAt(1)-8*sr.charCodeAt(2)+351; return s;}
if(sr.length>1&&sr.charAt(1)!='x') {
i_1=sr.charCodeAt(1)-97-i0;
if (i_1>0){
  if(i_1>1){
    if(s0>6){s=s0-6; if (((s%8)>i0)&&(gb[nr][s]==v0)) return s;}
    if(s0<54) {s=s0+10; if (((s%8)>i0)&&(gb[nr][s]==v0)) return s;}
           }
  else{
    if(s0>15){s=s0-15; if (((s%8)>i0)&&(gb[nr][s]==v0)) return s;}
    if(s0<47) {s=s0+17; if (((s%8)>i0)&&(gb[nr][s]==v0)) return s;}
  }}
else {if (i_1>-2){
          if(s0>17) {s=s0-17; if (((s%8)<i0)&&(gb[nr][s]==v0)) return s;}
          if(s0<49){s=s0+15; if (((s%8)<i0)&&(gb[nr][s]==v0)) return s;}
                 } else if (i_1>-3){
if(s0>10) {s=s0-10; if (((s%8)<i0)&&(gb[nr][s]==v0)) return s;}
if(s0<58) {s=s0+6; if (((s%8)<i0)&&(gb[nr][s]==v0)) return s;}
                                   }
i_1=i0+((-i_1-45)<<3);s=s0-i_1;
if((s==8)||(s==-8)) {s=i_1-2;if(gb[nr][s]==v0)return s;else return (s+4);}
else {s=i_1-1;if(gb[nr][s]==v0)return s;else return (s+2);}
}
} else{
if(s0<58) {s=s0+6; if (((s%8)<i0)&&(gb[nr][s]==v0)) return s; 
if(s0<54) {s=s0+10; if (((s%8)>i0)&&(gb[nr][s]==v0)) return s; 
if(s0<49){s=s0+15; if (((s%8)<i0)&&(gb[nr][s]==v0)) return s; 
if(s0<47) {s=s0+17; if (((s%8)>i0)&&(gb[nr][s]==v0)) return s; }}}}
if(s0>6) {s=s0-6; if (((s%8)>i0)&&(gb[nr][s]==v0)) return s; 
if(s0>10) {s=s0-10; if (((s%8)<i0)&&(gb[nr][s]==v0)) return s; 
if(s0>15){s=s0-15; if (((s%8)>i0)&&(gb[nr][s]==v0)) return s; 
if(s0>17) {s=s0-17; if (((s%8)<i0)&&(gb[nr][s]==v0)) return s; }}}}}
return(-1);}

function dtrmn(clr, src,tgt,lvl,flg){
var frm=1;var tom=1;var flgsm=64;var flgl=64;var nr=nnn-1;
	if(tgt.charAt(tgt.length-2)=='='){flgsm=64+((fench.indexOf(tgtcharAt(tgt.length-1))-2)<<4); tgt=src.substr(src.length-2); src=src.substr(0,src.length-2);}
	tom=(tgt.charCodeAt(0)-8*tgt.charCodeAt(1)+351);flgl+=lvl;if(flg==2)flgl+=16;
if(clr){
  if(src==""){
    frm=tom-8;
    if (!gb[nr][frm]) frm-=8;
  } else {
switch(src.charAt(0)){
case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h':
  frm=(src.charCodeAt(0)-8*tgt.charCodeAt(1)+351-8);
  if((tom>39)&&(tom<48)&&(!gb[nr][tom])){flgsm+=32;if(tgt.charCodeAt(0)>src.charCodeAt(0))flgsm+=16;}
  flgsm+=4; break;
case 'Q':
  frm=dtb(tom,src,13); 
  if (frm<0)frm=dtr(tom,src,13); break;
case 'R':
  frm=dtr(tom,src,12); break;
case 'B':
  frm=dtb(tom,src,11); break;
case 'N':
  frm=dtn(tom,src,10); break;
case 'O':
  frm=4;if(src.length>2){tom=2;flgsm=96;} else {tom=6;flgsm=112;} break;
case 'K':
  frm=dtk(tom,src,14); break;
}
  }
} else {
    if(src==""){
    frm=tom+8;
    if (!gb[nr][frm]) frm+=8;
  } else {
switch(src.charAt(0)){
case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h':
  frm=(src.charCodeAt(0)-8*tgt.charCodeAt(1)+351+8);
  if((tom<24)&&(tom>15)&&(!gb[nr][tom])){flgsm+=32;if(tgt.charCodeAt(0)>src.charCodeAt(0))flgsm+=16;}
  flgsm+=4; break;
case 'Q':
  frm=dtr(tom,src,5);
  if (frm<0)frm=dtb(tom,src,5); break;
case 'R':
  frm=dtr(tom,src,4); break;
case 'B':
  frm=dtb(tom,src,3); break;
case 'N':
  frm=dtn(tom,src,2); break;
case 'O':
  frm=60;if(src.length>2){tom=58;flgsm=96;} else {tom=62;flgsm=112;} break;
case 'K':
  frm=dtk(tom,src,6); break;}
  }
}
if(frm==-1){document.write("==="+clr+" "+src+" "+tgt+" "+lvl+" "+flg+"<br>");}
gm[nr]=gm[nr]+String.fromCharCode(frm+63)+String.fromCharCode(tom+63)+String.fromCharCode(flgl)+String.fromCharCode(flgsm);
gend[nr]=gm[nr].length-4;

//if(flgsm!=64){alert("before: "+tm+"  "+gx[nr]);Mv(nr,1+(gend[nr]>>2));alert("after: "+tm+"  "+gx[nr]);}else{gb[nr][tom]=gb[nr][frm];gb[nr][frm]=0;}
gx[nr]=gend[nr];MvD(nr);Mv1(nr);
}

function gen_cds(pgn){
var tabel=pgn.match(/[() ]|[0-9#+!?.-]+|[^)#+!? .{]+|{[^}]*}/g);
var q=1;var i0=0;var level=0;var flag=0;var pflag=0;var color=0;var i_=0;var nr=nnn-1;
if(tabel[0].charAt(0)=='{') i0=1;
for (i_=i0;i_<tabel.length;i_++){
    if("NBRQKOabcdefgh".indexOf(tabel[i_].charAt(0))==-1){
      switch(tabel[i_].charAt(0)) {
	  case '(': if(flag!=1){if(pflag!=1){vl[level]=gend[nr]>>2;}else{vl[level]=vll[level];} vll[level]=1+(gend[nr]>>2);}  //vl en vll
Mv(nr,vl[level]);
level++;
flag=2;
break;
	  case ')': level--; Mv(nr,vll[level]);
flag=1;break;
	  case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8':
	  case '9': if(tabel[i_].charAt(tabel[i_].length-2)=='.') color=1; else color=0; break;
        }
  } else {
	dtrmn(color, tabel[i_].substr(0,tabel[i_].length-2),tabel[i_].substr(tabel[i_].length-2), level, flag);
	if(color)color=0;else color=1;
	pflag=flag;flag=0;
	}
}}

function DrawPc(g,pc,sqr){
 if(gflip[g])
   sqr=63-sqr;
 doc.images[jb[g]+sqr].src=pdir+urlpcs[pc];}
function Fen2Brd(g,fn){
 var fc;
 var s=0;
 for(i=0;i<64;i++){
  fc=fench.indexOf(fn.charAt(s++));
  if(fc<=14||fc>=23)
   gb[g][i]=fc;
  else{
   fc-=14;
   while(fc--)
    gb[g][i++]=0;
   --i;
   }
  }
if(s!=fn.length) mn[g]=parseInt(fn.substr(++s));}
function Fen2Page(fn,c_,l_){
if ( c_ === undefined ) c_=0;
if ( l_ === undefined ) l_=0;
var fc;var s=0;
if(c_) document.write("<table class='board'><tr><td>");
if(l_) document.write("<img style='width: 21px; height: 240px;' src='"+pcsdir+urlpcs[22]+"' align='left' />");
document.write("<table class='board' style='border: medium double black;' cellspacing=0 cellpadding=0 background='"+brdimg+"' title='FEN: "+fn+"'><tr><td>");
 for(i=0;i<64;i++){
  fc=fench.indexOf(fn.charAt(s++));
  switch (fc){
    case 0: document.write("<br>"); i--; break;
    case 1: case 2: case 3: case 4: case 5: case 6: case 9: case 10: case 11: case 12: case 13: case 14: case 23: case 24: case 25: document.write("<img src='"+pdir+urlpcs[fc]+"'>"); break;
    case 15: case 16: case 17: case 18: case 19: case 20: case 21: case 22: fc-=14; while(fc--){document.write("<img src='"+pdir+urlpcs[0]+"'>");i++;} --i;break;
    default: document.write("<img src='"+pdir+urlpcs[0]+"'>");
   }
  }
  document.write("</td></tr></table>");
 if(l_) document.write("<img style='width: 261px; height: 20px; align: left' src='"+pcsdir+urlpcs[21]+"' border=0 />");
  if(c_) if(c_>1) document.write("</td><td style='vertical-align: top'><img style='width: 29px; height: 29px;' src='"+pcsdir+urlpcs[20]+"' title='Black to move' /></td></tr></table>"); else document.write("</td><td style='vertical-align: top'><img style='width: 29px; height: 29px;' src='"+pcsdir+urlpcs[19]+"' title='White to move' /></td></tr></table>");
}
var posbrd = 0;
function ShowFen(g,fn){
 Fen2Brd(g,pos[fn]);
 DrawBoard(g);
 WriteCap(g,cap[fn],'black');
 posbrd=1;
}
function InitBoard(g){
 if(atgm!=cg)Astop();
 Fen2Brd(g,gf[g]);
 gx[g]=-4;
 gl[g]=0;
 prepc=8;
 cg=g;
}
function FindScrBrd(){
var targ;
 j=0;
 for(i=0;i<doc.images.length;i++)
  if(doc.images[i].name != '')
   if(doc.images[i].name=='brd'+j.toString()){
    jb[j]=i;
    ++j;
    }
 j=0;
 for(i=0;i<doc.links.length;i++){
  if(doc.getElementById)
   targ='#'+doc.links[i].name;
  else
   targ=doc.links[i].hash;
  if(targ=='#jmv'+j){
    jm[j]=i+1;
    ++j;
    }
   }
}
function DrawBoard(g){
 for(i=0;i<64;i++)
  DrawPc(g,gb[g][i],i);
}
function DoMv(g,pc,to,from){
 gb[g][to]=pc;
 gb[g][from]=0;
}
function Gmv2lk(g){
 lk=0;
 if(gx[g]>=0)
  lk=gx[g]/4+jm[g];
}
var bs;
function HiMv(g){
 if(!ns4){
  Gmv2lk(g);
  if(lk==0)
   lk=jm[g]-1;
   if(lk==pm[g]) return;
   bs=doc.links[lk].style.backgroundColor;
   doc.links[lk].style.backgroundColor=hclr;
  if(pm[g])
   doc.links[pm[g]].style.backgroundColor=bs;
  pm[g]=lk;
 }
}
function MvD(g){
 var m=gx[g];
 if(m>=4)
  prepc=pc;
 ep=cf=pr=0;
 s1=r1=gm[g].charCodeAt(m)-63;
 s2=r2=gm[g].charCodeAt(m+1)-63;
 lvflg=gm[g].charCodeAt(m+2);
 mvflg=gm[g].charCodeAt(m+3);
 ml=lvflg&15;
 capc=gb[g][s2];
 pc=gb[g][s1];
 if((pc&7)==1)
  if((s2<8)||(s2>55)){
   pr=(pc&8)+((mvflg>>4)&3)+2;
   return;
  }
 if(mvflg&32){
  mvflg&16?++r1:--r1;
  if((pc&7)==1)
   ep=(pc&8)?1:9;
  else{
   r2=(s1-s2)>0?s1-4:s1+3;
   cf=1;
  }
 }
}
function Mv1(g){
 DoMv(g,pc,s2,s1);
 if(pr)
  gb[g][s2]=pr;
 if(ep)
  gb[g][r1]=0;
 if(cf)
  DoMv(g,gb[g][r2],r1,r2);
 if(pc&8)
  ++mn[g];
 else
  if((prepc&8)==0)
   ++mn[g];
 gl[g]=ml;
}
function Bk1(g){
 DoMv(g,pc,s1,s2);
 if(capc)
  gb[g][s2]=capc;
 if(pr)
   gb[g][s1]=(pc&8)+1;
 if(ep)
   gb[g][r1]=ep;
 if(cf)
   DoMv(g,gb[g][r1],r2,r1);
  --mn[g];
gl[g]=ml;
}
function Nxm(g,dr){
var tl;
tm=gx[g];
do{
 tm+=dr;
 tl=gm[g].charCodeAt(tm+2)&15;
}while(tl>gl[g]);
}
function Mv(g,mv){
 Mva(g,--mv*4);
}
function Mva(g,mv){
 var tf;
 InitBoard(g);
 if(gprob[g]) return;
 while(gx[g]<mv){
  Nxm(g,4);
  if(tm>mv){
   tf=gm[g].charCodeAt(gx[g]+6);
   if(tf&16)
    while(tm-=4){
     tf=gm[g].charCodeAt(tm+2);
     if((tf&31)==(gl[g]+17))
      if(tm<=mv) break;
    }
   else
    tm=gx[g]+4;
   if((tf&32)==0)
    Bk1(g);
   }
  gx[g]=tm;
  MvD(g);
  Mv1(g);
  }
 DrawBoard(g);
 HiMv(g);
 MvStr(g);
}
function AutoMv(){
var cm=gx[atgm]+4;
if(cm-4>=gend[atgm]) Astop();
 else{
  tmc=1;
  Forward(atgm);
  tmc=0;
  }
}
function Astop(){
 atgm=-1;
 tmc=0;
 clearInterval(tmid);
}
function Astart(g){
 if(atgm>=0)Astop();
 else{
 atgm=g;
 tmid=setInterval('AutoMv()',delay);
 AutoMv();
 }
}
function Flip(g){
 gflip[g]^=1;
 DrawBoard(g);
}
function Nxm5(g,dr){
 var tl;
 var i=11;
 var gln=gm[g].length-4;
 tm=gx[g];
 while(i--){
  tm+=dr;
  if((tm<-4)||(tm>gln)) break;
  tl=gm[g].charCodeAt(tm+2)&31;
  if(tl!=gl[g]) break;
  }
 tm-=dr;
 Mva(g,tm);
}
function Forward5(g){Nxm5(g,4);}
function Back5(g){Nxm5(g,-4);}
function GoStart(g){if(atgm>=0)Astop(); Mva(g,-4);}
function GoEnd(g){if(atgm>=0)Astop(); Mva(g,gend[g]);}
function Forward(g){
 if(atgm>=0 && tmc==0)Astop();
 lm=gm[g].length-4;
 if(gx[g]>=lm)return;
 if(st[g])
  tm=gx[g]+4;
 else
  Nxm(g,4);
 if(tm>lm)
  tm=gx[g]+4;
 Mva(g,tm);
}
function Back(g){
 if(atgm>=0)Astop();
 Nxm(g,-4);
 Mva(g,tm);
}
function Step(g){
 st[g]^=1;
 doc.images[jb[g]+65].src=pcsdir+urlpcs[16+st[g]];
}
function MvStr(g){
 var mvs='';
 var clr;
 posbrd=0;
 if(gx[g]<0){
  WriteCap(g,gc[g],'black');
  if(gstrt[g]==1){
   doc.images[jb[g]+64].src=pcsdir+urlpcs[19];
   doc.images[jb[g]+64].title="White to move";
  } else {
   doc.images[jb[g]+64].src=pcsdir+urlpcs[20];
   doc.images[jb[g]+64].title="Black to move";
  }
  if(gc[g]!='')
   posbrd=1;
  return;
  }
 mvs=(pc&8)?mn[g]-1:mn[g];
 mvs=mvs.toString()+'. ';
 if(pc&8){
  mvs += '... ';
  doc.images[jb[g]+64].src=pcsdir+urlpcs[19];
  doc.images[jb[g]+64].title="White to move";
 } else {
  doc.images[jb[g]+64].src=pcsdir+urlpcs[20];
  doc.images[jb[g]+64].title="Black to move";
 }
if(doc.all)
 mvs+=doc.links[lk].innerText;
else{
 Gmv2lk(g);
 mvs+=doc.links[lk].text;
}
 if(gx[g]==gend[g])
  mvs+=' '+restr[gres[g]];
clr=(gl[g]||(gx[g]>gend[g]))?vclr:'black';
 WriteCap(g,mvs,clr);
}
function WriteCap(b,tx,clr){
 var btx;
 if(ns4)return;
 btx='it'+b;
 if(ie4){
  if(!doc.getElementById)
   if(tx=='')
    tx='start';
  doc.all[btx].innerText=tx;
  doc.all[btx].style.color=clr;
  }
 else{
  if(tx=='')
   tx='&nbsp;';
  doc.getElementById(btx).innerHTML=tx;
  doc.getElementById(btx).style.color=clr;
 }
}
function KeyDown(e){
 var key = 0;
 key=ie4?event.keyCode:e.which;
 if(key!=0)
   ActOnKey(key);
}
function ActOnKey(key){
 if(key==39||key==102)Forward(cg)
 if(key==37||key==100)Back(cg)
 if(key==103)GoStart(cg)
 if(key==97) GoEnd(cg)
 if(key==111)Flip(cg)
 if(key==106)Astart(cg)
 if(key==96)Step(cg);
 if(!posbrd)MvStr(cg);
}
var MsX=MsY=0;var PcX=PcY=0;var Bx=By=0;var nq=dgp=dgs=0;
function MsMove(){
 if(ie4){
  if(dgp){
   MvPc(event.x, event.y);
   }  
 }
}
function MvPc(x,y){
 PcX-=MsX-x;
 PcY-=MsY-y;
 MsX=x;
 MsY=y;
 doc.all.pc1.style.pixelLeft=PcX;
 doc.all.pc1.style.pixelTop=PcY;
 return false;
}
function DropPc(g){
 var Sx,Sy;
 if(!InPlace) return false;
 doc.all.pc1.style.visibility='hidden';
 if(PcX+14<Bx||PcX+14>(Bx+232)){
   PcOffBrd(g);
   return false;
   }
 if(PcY+14<By||PcY+14>(By+232)){
   PcOffBrd(g);
   return false;
   }
 Sx=PcX-Bx+14;
 Sy=PcY-By+14;
 Sx=Math.floor(Sx/29);
 Sy=Math.floor(Sy/29);
 nq=Sy*8+Sx;
 if(gflip[g])
  nq=63-nq;
 Kibitz(g);
 Prob();
 return false;
}
function BrdNum(g){
 var s,a8,sqr;
 cg=g;
 if(ns6){
  ns6B=1;
  return false;
 }
 if(ie4){
 e=window.event;
 a8=doc.images[jb[g]].sourceIndex;
 if(dgp==0){
  sqr=doc.elementFromPoint(MsX=e.clientX,MsY=e.clientY).sourceIndex;
    if (doc.documentElement){
    PcX=MsX-e.offsetX+doc.documentElement.scrollLeft;
    PcY=MsY-e.offsetY+doc.documentElement.scrollTop;
  } else {
    PcX=MsX-e.offsetX+doc.body.scrollLeft;
    PcY=MsY-e.offsetY+doc.body.scrollTop;
  }
    Bx=PcX-doc.all[sqr].offsetLeft;
    By=PcY-doc.all[sqr].offsetTop;
  s=sqr-a8;
  s-=Math.floor(s/9);
  if(gflip[g])
   s=63-s;
  dgp=gb[g][s];
  if(dgp){
   dgs=s;
 //  col=dgp&8?'b':'w';
   pcstr=pdir+urlpcs[dgp];
   doc.images['dpc'].src=pcstr;
   gb[g][s]=0;
   DrawPc(g,0,s);
   doc.all.pc1.style.pixelLeft=PcX;
   doc.all.pc1.style.pixelTop=PcY;
   doc.all.pc1.style.visibility='visible';
   return false;
  }
 }
 else
  DropPc(cg);
  return false;
 }
}
function PcOffBrd(g){
alert('Piece Off Board!');
 gb[g][dgs]=dgp;
 DrawPc(g,dgp,dgs);
 dgp=0;
}
function Kibitz(g){
 if(dgp==1||dgp==9)
  if(nq<8||nq>55)
    dgp+=4;
 if(dgp==6&&dgs==60)
  if(nq==62)
   DoMv(g,4,61,63);
  else
   if(nq==58)
    DoMv(g,4,59,56);
 if(dgp==14&&dgs==4)
  if(nq==6)
   DoMv(g,12,5,7);
  else
   if(nq==2)
    DoMv(g,12,3,0);
 gb[g][nq]=dgp;
 DrawBoard(g)
 dgp=0;
}
var ns6T=ns6B=0;
function ns6Click(e){
 ns6T=e.target;
 if(ns6B)
  ns6Brd(cg);
 else
  dgp=0;
 ns6B=0;
}
function ns6Brd(g){
 for(i=0;i<64;i++)
  if(doc.images[jb[g]+i]==ns6T)break;
 if(i<64){
  if(gflip[g])
   i=63-i;
  if(dgp){
   nq=i;
   gb[g][dgs]=0;
   Kibitz(g);
   Prob();
   }
  else{
   dgp=gb[g][i];
   if(dgp)
    dgs=i;
   }
  }
}
function ShowProb(){
 gprob[cg]=0;
 if(ie4)
  doc.all['qz'+cg].style.visibility='visible';
 else
  doc.getElementById('qz'+cg).style.visibility='visible';
 Forward(cg);
}
function Prob(){
 if(gprob[cg]==0)return;
 gx[cg]+=4;
 MvD(cg);
 gx[cg]-=4;
 if((s1==dgs)&&(s2==nq))
  ShowProb();
 else{
  alert('Sorry -- that is not the correct answer!');
  if(--gprob[cg]==0){
    alert('Click for the correct answer');
    ShowProb();
  }
  else{
   InitBoard(cg);
   DrawBoard(cg);
  }
 }
}
function InitSys(){
 var i;
 FindScrBrd();
 for(i=0;i<nnn;i++){
//  InitBoard(i);
  Mv(i,startpos[i]);
 }
 cg=0;
 InPlace=true;
}
