waves/public/assets/g/chess/js/ltpgnviewer.js
2025-04-09 17:11:14 -05:00

4073 lines
137 KiB
JavaScript
Raw Blame History

// LT-PGN-VIEWER 3.498 (c) Lutz Tautenhahn (2001-2018)
var ScriptPath="http://www.lutanho.net/pgn/";
var i, j, s, StartMove, MoveCount, MoveType, CanPass, EnPass, MaxMove=600, isInit=false, isCalculating=false;
var CurVar=0, activeAnchor=-1, startAnchor=-1, activeAnchorBG="#CCCCCC", TargetDocument, isSetupBoard=false, BoardSetupMode='copy';
var dragX, dragY, dragObj, dragBorder, dragImgBorder, isDragDrop=false, isAnimating=false, isExecCommand=true, BoardPic, ParseType=1, AnnotationFile="";
var offsetAnchor=1, Indent=0;
OldCommands=new Array();
NewCommands=new Array();
dragImg=new Array(2);
dragPiece=new Array(8);
dragPiece[0]=-1;
dragPiece[4]=-1;
ShortPgnMoveText=new Array(3);
for (i=0; i<3; i++) ShortPgnMoveText[i] = new Array();
ShortPgnMoveText[0][CurVar]="";
PieceType = new Array(2); for (i=0; i<2; i++) PieceType[i] = new Array(16);
PiecePosX = new Array(2); for (i=0; i<2; i++) PiecePosX[i] = new Array(16);
PiecePosY = new Array(2); for (i=0; i<2; i++) PiecePosY[i] = new Array(16);
PieceMoves = new Array(2); for (i=0; i<2; i++) PieceMoves[i] = new Array(16);
var isRotated=false, isRecording=false, isNullMove=1, RecordCount=0, RecordedMoves="", SkipRefresh=0;
var AutoPlayInterval, isAutoPlay=false, Delay=1000, BoardClicked=-1, isCapturedPieces=false, LastStyle="", ThisStyle="", CandidateStyle="", AutoCapture=0, BCStyle="", BCCmds="", PieceFileExt=".gif", nAudio=0;
var PieceName = "KQRBNP", ShowPieceName = "KQRBNP";
PieceCode = new Array(6); for (i=0; i<6; i++) PieceCode[i]=PieceName.charCodeAt(i);
var StandardFen = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1";
var FenString = StandardFen;
ColorName = new Array("w","b","t"); //white, black, transparent
Castling = new Array(2); for (i=0; i<2; i++) Castling[i] = new Array(2);
Board = new Array(8); for (i=0; i<8; i++) Board[i] = new Array(8);
HalfMove = new Array(MaxMove+1);
HistMove = new Array(MaxMove);
HistCommand = new Array(MaxMove+1);
HistPiece = new Array(2);
for (i=0; i<2; i++) HistPiece[i] = new Array(MaxMove);
HistType = new Array(2);
for (i=0; i<2; i++) HistType[i] = new Array(MaxMove);
HistPosX = new Array(2);
for (i=0; i<2; i++) HistPosX[i] = new Array(MaxMove);
HistPosY = new Array(2);
for (i=0; i<2; i++) HistPosY[i] = new Array(MaxMove);
MoveArray = new Array();
PiecePic = new Array(2);
for (i=0; i<2; i++) PiecePic[i] = new Array(6);
LabelPic = new Array(5);
Annotation = new Array();
DocImg=new Array();
var ImagePathOld="-", ImagePath="", ImageOffset=0, IsLabelVisible=true, Border=1, BorderColor="#404040", ScoreSheet=0, BGColor="", BGOpacity=1;
function SetImagePath(pp)
{ ImagePath=pp;
}
function SetBorder(nn)
{ Border=parseInt(nn);
}
function SetBorderColor(cc)
{ if (cc.length==6) BorderColor="#"+cc;
else BorderColor=cc;
}
function SetScoreSheet(nn)
{ ScoreSheet=parseInt(nn);
}
function SetBGColor(cc)
{ if (cc.charAt(0)=="#") BGColor=cc;
else BGColor="#"+cc;
}
function SetBGOpacity(vv)
{ BGOpacity=parseFloat(vv);
}
function HEX2RGBA(vv)
{ if ((vv.length<7)||(vv.length>9)) return(vv);
var rr=0, gg=0, bb=0, oo=0, cc=vv.toLowerCase(), ss="0123456789abcdef";
rr+=16*ss.indexOf(cc.charAt(1))+ss.indexOf(cc.charAt(2));
gg+=16*ss.indexOf(cc.charAt(3))+ss.indexOf(cc.charAt(4));
bb+=16*ss.indexOf(cc.charAt(5))+ss.indexOf(cc.charAt(6));
oo+=16*ss.indexOf(cc.charAt(7))+ss.indexOf(cc.charAt(8));
if (oo<=0) oo=BGOpacity;
else oo/=255;
ss="rgba("+rr+","+gg+","+bb+","+oo+")";
if ((oo>0)&&(oo<1)) return(ss);
return(vv.substr(0,7));
}
function SetImg(ii,oo)
{ if (DocImg[ii]==oo.src) return;
DocImg[ii]=oo.src;
//if (ii<64)
if (isNaN(ii)) document.images[ii].src=oo.src;
else document.images[ii+ImageOffset].src=oo.src;
//else document.images[ii].src=oo.src;
}
function ShowLabels(bb)
{ IsLabelVisible=bb;
RefreshBoard();
}
function SwitchLabels()
{ IsLabelVisible=!IsLabelVisible;
RefreshBoard();
}
function GetValue(oo)
{ var vv="";
eval("vv="+oo);
return(vv);
}
function SetAutoCapture(vv)
{ AutoCapture=vv;
}
function SetIndent(vv)
{ Indent=vv;
}
function SetPieceFileExt(ss)
{ PieceFileExt=ss;
}
function SetAudio(nn)
{ nAudio=nn;
}
function PlayAudio(mm,dd)
{ var nn=1;
if (mm.indexOf("x")>0) nn=2;
if ((mm.indexOf("O-O")>=0)||(mm.indexOf("0-0")>=0)||(mm.indexOf("O<>O")>=0)||(mm.indexOf("0<>0")>=0)) nn=3;
if (mm=="") nn=0;
nn+=4*Math.floor(Math.random()*nAudio/4);
if (document.getElementById("audio"+nn))
{ if((isDragDrop)&&(dd>0)) setTimeout('AudioPlay('+nn+')',dd);
else AudioPlay(nn);
}
}
function AudioPlay(nn)
{ document.getElementById("audio"+nn).play();
}
function InitImages()
{ if (ImagePathOld==ImagePath) return;
var ii, jj;
BoardPic = new Image();
BoardPic.src = ImagePath+"t.gif";
for (ii=0; ii<2; ii++)
{ PiecePic[ii][0] = new Image(); PiecePic[ii][0].src = ImagePath+ColorName[ii]+"k"+PieceFileExt;
PiecePic[ii][1] = new Image(); PiecePic[ii][1].src = ImagePath+ColorName[ii]+"q"+PieceFileExt;
PiecePic[ii][2] = new Image(); PiecePic[ii][2].src = ImagePath+ColorName[ii]+"r"+PieceFileExt;
PiecePic[ii][3] = new Image(); PiecePic[ii][3].src = ImagePath+ColorName[ii]+"b"+PieceFileExt;
PiecePic[ii][4] = new Image(); PiecePic[ii][4].src = ImagePath+ColorName[ii]+"n"+PieceFileExt;
PiecePic[ii][5] = new Image(); PiecePic[ii][5].src = ImagePath+ColorName[ii]+"p"+PieceFileExt;
}
LabelPic[0] = new Image(); LabelPic[0].src = ImagePath+"8_1.gif";
LabelPic[1] = new Image(); LabelPic[1].src = ImagePath+"a_h.gif";
LabelPic[2] = new Image(); LabelPic[2].src = ImagePath+"1_8.gif";
LabelPic[3] = new Image(); LabelPic[3].src = ImagePath+"h_a.gif";
LabelPic[4] = new Image(); LabelPic[4].src = ImagePath+"1x1.gif";
ImagePathOld=ImagePath;
//ImageOffset=0;
for (ii=0; ii<document.images.length; ii++)
{ if (document.images[ii]==document.images["RightLabels"])
{ if (ii>64) ImageOffset=ii-64;
}
}
DocImg.length=0;
}
function sign(nn)
{ if (nn>0) return(1);
if (nn<0) return(-1);
return(0);
}
function OpenUrl(ss)
{ if (ss!="")
parent.frames[1].location.href = ss;
else
{ if (document.BoardForm.Url.value!="")
{ var nn=document.BoardForm.OpenParsePgn.selectedIndex;
if (((nn)||(document.BoardForm.Url.value.indexOf(".htm")>0))&&(!document.layers))
{ parent.frames[1].location.href = document.BoardForm.Url.value;
if (nn) setTimeout("ParsePgn("+nn+")",400);
}
else parent.frames[1].location.href = "pgnframe.html?"+document.BoardForm.Url.value;
}
else parent.frames[1].location.href = "pgnframe.html";
}
}
function Init(rr)
{ var cc, ii, jj, kk, ll, nn, mm;
isInit=true;
if (isAutoPlay) SetAutoPlay(false);
if (rr!='')
{ FenString=rr;
while (FenString.indexOf("|")>0) FenString=FenString.replace("|","/");
}
if (FenString=='standard')
FenString=StandardFen;
if ((document.BoardForm)&&(document.BoardForm.FEN))
document.BoardForm.FEN.value=FenString;
if (FenString == StandardFen)
{ for (ii=0; ii<2; ii++)
{ PieceType[ii][0]=0;
PiecePosX[ii][0]=4;
PieceType[ii][1]=1;
PiecePosX[ii][1]=3;
PieceType[ii][2]=2;
PiecePosX[ii][2]=0;
PieceType[ii][3]=2;
PiecePosX[ii][3]=7;
PieceType[ii][4]=3;
PiecePosX[ii][4]=2;
PieceType[ii][5]=3;
PiecePosX[ii][5]=5;
PieceType[ii][6]=4;
PiecePosX[ii][6]=1;
PieceType[ii][7]=4;
PiecePosX[ii][7]=6;
for (jj=0; jj<8; jj++)
{ PieceType[ii][jj+8]=5;
PiecePosX[ii][jj+8]=jj;
}
for (jj=0; jj<16; jj++)
{ PieceMoves[ii][jj]=0;
PiecePosY[ii][jj]=(1-ii)*Math.floor(jj/8)+ii*(7-Math.floor(jj/8));
}
}
for (ii=0; ii<8; ii++)
{ for (jj=0; jj<8; jj++) Board[ii][jj]=0;
}
for (ii=0; ii<2; ii++)
{ for (jj=0; jj<16; jj++)
Board[PiecePosX[ii][jj]][PiecePosY[ii][jj]]=(PieceType[ii][jj]+1)*(1-2*ii);
}
for (ii=0; ii<2; ii++)
{ for (jj=0; jj<2; jj++)
Castling[ii][jj]=1;
}
EnPass=-1;
HalfMove[0]=0;
if (document.BoardForm)
{ RefreshBoard();
if (document.BoardForm.Position)
document.BoardForm.Position.value="";
if (nAudio) PlayAudio("",0);
NewCommands.length=0;
ExecCommands();
}
StartMove=0;
MoveCount=StartMove;
MoveType=StartMove%2;
SetBoardClicked(-1);
RecordCount=0;
CurVar=0;
MoveArray.length=0;
BCCmds="";
if (TargetDocument) HighlightMove("m"+MoveCount+"v"+CurVar);
UpdateAnnotation(true);
}
else
{ for (ii=0; ii<2; ii++)
{ for (jj=0; jj<16; jj++)
{ PieceType[ii][jj]=-1;
PiecePosX[ii][jj]=0;
PiecePosY[ii][jj]=0;
PieceMoves[ii][jj]=0;
}
}
ii=0; jj=7; ll=0; nn=1; mm=1; cc=FenString.charAt(ll++);
while (cc!=" ")
{ if (cc=="/")
{ if (ii!=8)
{ alert("Invalid FEN [1]: char "+ll+" in "+FenString);
Init('standard');
return;
}
ii=0;
jj--;
}
if (ii==8)
{ alert("Invalid FEN [2]: char "+ll+" in "+FenString);
Init('standard');
return;
}
if (! isNaN(cc))
{ ii+=parseInt(cc);
if ((ii<0)||(ii>8))
{ alert("Invalid FEN [3]: char "+ll+" in "+FenString);
Init('standard');
return;
}
}
if (cc.charCodeAt(0)==PieceName.toUpperCase().charCodeAt(0))
{ if (PieceType[0][0]!=-1)
{ alert("Invalid FEN [4]: char "+ll+" in "+FenString);
Init('standard');
return;
}
PieceType[0][0]=0;
PiecePosX[0][0]=ii;
PiecePosY[0][0]=jj;
ii++;
}
if (cc.charCodeAt(0)==PieceName.toLowerCase().charCodeAt(0))
{ if (PieceType[1][0]!=-1)
{ alert("Invalid FEN [5]: char "+ll+" in "+FenString);
Init('standard');
return;
}
PieceType[1][0]=0;
PiecePosX[1][0]=ii;
PiecePosY[1][0]=jj;
ii++;
}
for (kk=1; kk<6; kk++)
{ if (cc.charCodeAt(0)==PieceName.toUpperCase().charCodeAt(kk))
{ if (nn==16)
{ alert("Invalid FEN [6]: char "+ll+" in "+FenString);
Init('standard');
return;
}
PieceType[0][nn]=kk;
PiecePosX[0][nn]=ii;
PiecePosY[0][nn]=jj;
nn++;
ii++;
}
if (cc.charCodeAt(0)==PieceName.toLowerCase().charCodeAt(kk))
{ if (mm==16)
{ alert("Invalid FEN [7]: char "+ll+" in "+FenString);
Init('standard');
return;
}
PieceType[1][mm]=kk;
PiecePosX[1][mm]=ii;
PiecePosY[1][mm]=jj;
mm++;
ii++;
}
}
if (ll<FenString.length)
cc=FenString.charAt(ll++);
else cc=" ";
}
if ((ii!=8)||(jj!=0))
{ alert("Invalid FEN [8]: char "+ll+" in "+FenString);
Init('standard');
return;
}
if ((PieceType[0][0]==-1)||(PieceType[1][0]==-1))
{ alert("Invalid FEN [9]: char "+ll+" missing king");
Init('standard');
return;
}
if (ll==FenString.length)
{ FenString+=" w ";
FenString+=PieceName.toUpperCase().charAt(0);
FenString+=PieceName.toUpperCase().charAt(1);
FenString+=PieceName.toLowerCase().charAt(0);
FenString+=PieceName.toLowerCase().charAt(1);
FenString+=" - 0 1";
ll++;
}
// { alert("Invalid FEN [10]: char "+ll+" missing active color");
// Init('standard');
// return;
// }
cc=FenString.charAt(ll++);
if ((cc=="w")||(cc=="b"))
{ if (cc=="w") StartMove=0;
else StartMove=1;
}
else
{ alert("Invalid FEN [11]: char "+ll+" invalid active color");
Init('standard');
return;
}
ll++;
if (ll>=FenString.length)
{ alert("Invalid FEN [12]: char "+ll+" missing castling availability");
Init('standard');
return;
}
Castling[0][0]=0; Castling[0][1]=0; Castling[1][0]=0; Castling[1][1]=0;
cc=FenString.charAt(ll++);
while (cc!=" ")
{ cc=cc.charCodeAt(0);
if (cc==PieceName.toUpperCase().charCodeAt(0))
Castling[0][0]=1;
if (cc==PieceName.toUpperCase().charCodeAt(1))
Castling[0][1]=1;
if (cc==PieceName.toLowerCase().charCodeAt(0))
Castling[1][0]=1;
if (cc==PieceName.toLowerCase().charCodeAt(1))
Castling[1][1]=1;
if ((cc>=65)&&(cc<=72)) //A...H for Chess960
{ if (cc>PiecePosX[0][0]+65) Castling[0][0]=1;
if (cc<PiecePosX[0][0]+65) Castling[0][1]=1;
}
if ((cc>=97)&&(cc<=104)) //a...h for Chess960
{ if (cc>PiecePosX[1][0]+97) Castling[1][0]=1;
if (cc<PiecePosX[1][0]+97) Castling[1][1]=1;
}
if (ll<FenString.length)
cc=FenString.charAt(ll++);
else cc=" ";
}
if (ll==FenString.length)
{ alert("Invalid FEN [13]: char "+ll+" missing en passant target square");
Init('standard');
return;
}
EnPass=-1;
cc=FenString.charAt(ll++);
while (cc!=" ")
{ if ((cc.charCodeAt(0)-97>=0)&&(cc.charCodeAt(0)-97<=7))
EnPass=cc.charCodeAt(0)-97;
if (ll<FenString.length)
cc=FenString.charAt(ll++);
else cc=" ";
}
if (ll==FenString.length)
{ alert("Invalid FEN [14]: char "+ll+" missing halfmove clock");
Init('standard');
return;
}
HalfMove[0]=0;
cc=FenString.charAt(ll++);
while (cc!=" ")
{ if (isNaN(cc))
{ alert("Invalid FEN [15]: char "+ll+" invalid halfmove clock");
Init('standard');
return;
}
HalfMove[0]=HalfMove[0]*10+parseInt(cc);
if (ll<FenString.length)
cc=FenString.charAt(ll++);
else cc=" ";
}
if (ll==FenString.length)
{ alert("Invalid FEN [16]: char "+ll+" missing fullmove number");
Init('standard');
return;
}
cc=FenString.substring(ll++);
if (isNaN(cc))
{ alert("Invalid FEN [17]: char "+ll+" invalid fullmove number");
Init('standard');
return;
}
if (cc<=0)
{ alert("Invalid FEN [18]: char "+ll+" invalid fullmove number");
Init('standard');
return;
}
StartMove+=2*(parseInt(cc)-1);
for (ii=0; ii<8; ii++)
{ for (jj=0; jj<8; jj++) Board[ii][jj]=0;
}
for (ii=0; ii<2; ii++)
{ for (jj=0; jj<16; jj++)
{ if (PieceType[ii][jj]!=-1)
Board[PiecePosX[ii][jj]][PiecePosY[ii][jj]]=(PieceType[ii][jj]+1)*(1-2*ii);
}
}
if (document.BoardForm)
{ RefreshBoard();
if (document.BoardForm.Position)
{ if (StartMove%2==0) document.BoardForm.Position.value="white to move";
else document.BoardForm.Position.value="black to move";
}
if (nAudio) PlayAudio("",0);
NewCommands.length=0;
ExecCommands();
}
MoveCount=StartMove;
MoveType=StartMove%2;
SetBoardClicked(-1);
RecordCount=0;
CurVar=0;
MoveArray.length=0;
BCCmds="";
if (TargetDocument) HighlightMove("m"+MoveCount+"v"+CurVar);
UpdateAnnotation(true);
}
}
function MoveBack(nn)
{ var ii, jj, cc;
if (BoardClicked>=0) SetBoardClicked(-1);
for (jj=0; (jj<nn)&&(MoveCount>StartMove); jj++)
{ if (RecordCount>0) RecordCount--;
MoveCount--;
MoveType=1-MoveType;
cc=MoveCount-StartMove;
ii=HistPiece[1][cc];
if ((0<=ii)&&(ii<16)) //we must do this here because of Chess960 castling
{ Board[PiecePosX[MoveType][ii]][PiecePosY[MoveType][ii]]=0;
Board[HistPosX[1][cc]][HistPosY[1][cc]]=(HistType[1][cc]+1)*(1-2*MoveType);
}
ii=HistPiece[0][cc];
Board[PiecePosX[MoveType][ii]][PiecePosY[MoveType][ii]]=0;
Board[HistPosX[0][cc]][HistPosY[0][cc]]=(HistType[0][cc]+1)*(1-2*MoveType);
PieceType[MoveType][ii]=HistType[0][cc];
PiecePosX[MoveType][ii]=HistPosX[0][cc];
PiecePosY[MoveType][ii]=HistPosY[0][cc];
PieceMoves[MoveType][ii]--;
ii=HistPiece[1][cc];
if ((0<=ii)&&(ii<16))
{ PieceType[MoveType][ii]=HistType[1][cc];
PiecePosX[MoveType][ii]=HistPosX[1][cc];
PiecePosY[MoveType][ii]=HistPosY[1][cc];
PieceMoves[MoveType][ii]--;
}
ii-=16;
if (0<=ii)
{ Board[HistPosX[1][cc]][HistPosY[1][cc]]=(HistType[1][cc]+1)*(2*MoveType-1);
PieceType[1-MoveType][ii]=HistType[1][cc];
PiecePosX[1-MoveType][ii]=HistPosX[1][cc];
PiecePosY[1-MoveType][ii]=HistPosY[1][cc];
PieceMoves[1-MoveType][ii]--;
}
if (CurVar!=0)
{ if (MoveCount==ShortPgnMoveText[2][CurVar])
{ CurVar=ShortPgnMoveText[1][CurVar];
if ((!isCalculating)&&(document.BoardForm)&&(document.BoardForm.PgnMoveText))
document.BoardForm.PgnMoveText.value=ShortPgnMoveText[0][CurVar];
}
}
}
if (HistCommand[MoveCount-StartMove]) NewCommands=HistCommand[MoveCount-StartMove].split("|");
if (isCalculating) return;
if (LastStyle) NewCommands[NewCommands.length]=LastStyle.charAt(0)+"last"+LastStyle.substr(1);
if (ThisStyle) NewCommands[NewCommands.length]=ThisStyle.charAt(0)+"this"+ThisStyle.substr(1);
if ((OldCommands.length>0)||(NewCommands.length>0)) ExecCommands();
if (document.BoardForm)
{ RefreshBoard();
if (document.BoardForm.Position)
{ if (MoveCount>StartMove)
document.BoardForm.Position.value=TransformSAN(HistMove[MoveCount-StartMove-1]);
else
document.BoardForm.Position.value="";
}
}
BCCmds="";
if (TargetDocument) HighlightMove("m"+MoveCount+"v"+CurVar);
UpdateAnnotation(false);
if (AutoPlayInterval) clearTimeout(AutoPlayInterval);
if (isAutoPlay) AutoPlayInterval=setTimeout("MoveBack("+nn+")", Delay);
}
function Uncomment(ss)
{ if (! ss) return(ss);
var ii, jj, llist=ss.split("{"), ll=llist.length, uu=llist[0], tt, kk;
for (ii=1; ii<ll; ii++)
{ tt=llist[ii];
jj=tt.indexOf("}")+1;
if (jj>0) uu+=tt.substring(jj);
}
llist=uu.split("$");
ll=llist.length;
uu=llist[0];
for (ii=1; ii<ll; ii++)
{ tt=llist[ii];
kk=tt.length;
for (jj=0; jj<kk; jj++)
{ if (isNaN(parseInt(tt.charAt(jj))))
//if (tt.charAt(jj)==" ")
{ uu+=tt.substring(jj+1);
jj=kk;
}
}
}
return(uu);
}
function GetComment(ss)
{ if (! ss) return(ss);
var ii, jj, llist=ss.split("}"), ll=llist.length, uu="", tt, kk;
for (ii=0; ii<ll; ii++)
{ tt=llist[ii];
jj=tt.indexOf("{")+1;
if (jj>0) uu+=tt.substring(jj);
}
return(uu);
}
function MoveForward(nn, rr)
{ var ii,ffst=0,llst,ssearch,ssub,ffull,mmove0="",mmove1="";
if (rr);
else
{ if ((document.BoardForm)&&(document.BoardForm.PgnMoveText))
ShortPgnMoveText[0][CurVar]=document.BoardForm.PgnMoveText.value;
if (BoardClicked>=0) SetBoardClicked(-1);
}
ffull=Uncomment(ShortPgnMoveText[0][CurVar]);
for (ii=0; (ii<nn)&&(ffst>=0)&&(MoveCount<MaxMove); ii++)
{ ssearch=Math.floor(MoveCount/2+2)+".";
llst=ffull.indexOf(ssearch);
ssearch=Math.floor(MoveCount/2+1)+".";
ffst=ffull.indexOf(ssearch);
if (ffst>=0)
{ ffst+=ssearch.length;
if (llst<0)
ssub=ffull.substring(ffst);
else
ssub=ffull.substring(ffst, llst);
mmove0=GetMove(ssub,MoveType);
if (mmove0!="")
{ if (ParseMove(mmove0, true)>0)
{ mmove1=mmove0;
if (MoveType==0)
HistMove[MoveCount-StartMove]=Math.floor((MoveCount+2)/2)+"."+mmove1;
else
HistMove[MoveCount-StartMove]=Math.floor((MoveCount+2)/2)+". ... "+mmove1;
HistCommand[MoveCount-StartMove+1]=NewCommands.join("|");
MoveCount++;
MoveType=1-MoveType;
}
else
{ if (MoveType==1)
{ ssub=Math.floor(MoveCount/2+1);
ssearch=ssub+"....";
ffst=ffull.indexOf(ssearch);
if (ffst<0) { ssearch=ssub+". ..."; ffst=ffull.indexOf(ssearch); }
if (ffst<0) { ssearch=ssub+". .."; ffst=ffull.indexOf(ssearch); }
if (ffst<0) { ssearch=ssub+" ..."; ffst=ffull.indexOf(ssearch); }
if (ffst<0) { ssearch=ssub+"..."; ffst=ffull.indexOf(ssearch); }
if (ffst<0) { ssearch=ssub+" .."; ffst=ffull.indexOf(ssearch); }
if (ffst>=0)
{ ffst+=ssearch.length;
if (llst<0) ssub=ffull.substring(ffst);
else ssub=ffull.substring(ffst, llst);
mmove0=GetMove(ssub,0);
if (mmove0!="")
{ if (ParseMove(mmove0, true)>0)
{ mmove1=mmove0;
HistMove[MoveCount-StartMove]=Math.floor((MoveCount+2)/2)+". ... "+mmove1;
HistCommand[MoveCount-StartMove+1]=NewCommands.join("|");
MoveCount++;
MoveType=1-MoveType;
}
else
{ ffst=-1;
//alert(mmove0+" is not a valid move.");
}
}
}
}
else
{ ffst=-1;
//alert(mmove0+" is not a valid move.");
}
}
}
else ffst=-1;
}
}
if (isCalculating) return;
if (LastStyle) NewCommands[NewCommands.length]=LastStyle.charAt(0)+"last"+LastStyle.substr(1);
if (ThisStyle) NewCommands[NewCommands.length]=ThisStyle.charAt(0)+"this"+ThisStyle.substr(1);
if ((OldCommands.length>0)||(NewCommands.length>0))
{ if ((isDragDrop)&&(nn==1)) setTimeout("ExecCommands()",Delay/2);
else ExecCommands();
}
if (document.BoardForm)
{ if ((document.BoardForm.Position)&&(mmove1!=""))
document.BoardForm.Position.value=TransformSAN(HistMove[MoveCount-StartMove-1]);
if ((nAudio)&&(mmove1!="")) PlayAudio(HistMove[MoveCount-StartMove-1],Delay/12+200);
if ((mmove1!="")&&(isDragDrop)&&(nn==1)&&(!dragObj)&&(dragPiece[0]>=0)&&(!rr)&&(!isAnimating)) AnimateBoard(1);
else RefreshBoard();
}
BCCmds="";
if (TargetDocument) HighlightMove("m"+MoveCount+"v"+CurVar);
UpdateAnnotation(false);
if (AutoPlayInterval) clearTimeout(AutoPlayInterval);
if (isAutoPlay) AutoPlayInterval=setTimeout("MoveForward("+nn+")", Delay);
}
function ParseMove(mm, sstore)
{ var ii, ffrom="", ccapt=0, ll, yy1i=-1;
var ttype0=-1, xx0=-1, yy0=-1, ttype1=-1, xx1=-1, yy1=-1;
if (MoveCount>StartMove)
{ CanPass=-1;
ii=HistPiece[0][MoveCount-StartMove-1];
if ((HistType[0][MoveCount-StartMove-1]==5)&&(Math.abs(HistPosY[0][MoveCount-StartMove-1]-PiecePosY[1-MoveType][ii])==2))
CanPass=PiecePosX[1-MoveType][ii];
}
else
CanPass=EnPass;
ii=1;
while (ii<mm.length)
{ if (! isNaN(mm.charAt(ii)))
{ xx1=mm.charCodeAt(ii-1)-97;
yy1=mm.charAt(ii)-1;
yy1i=ii;
ffrom=mm.substring(0, ii-1);
}
ii++;
}
if ((xx1<0)||(xx1>7)||(yy1<0)||(yy1>7))
{ if ((mm.indexOf("O")>=0)||(mm.indexOf("0")>=0))
{ if ((mm.indexOf("O-O-O")>=0)||(mm.indexOf("0-0-0")>=0)||(mm.indexOf("O<>O<EFBFBD>O")>=0)||(mm.indexOf("0<>0<EFBFBD>0")>=0))
{ if (EvalMove(ttype0, 6, xx0, yy0, ttype1, xx1, yy1, ccapt, sstore))
return(1);
return(0);
}
if ((mm.indexOf("O-O")>=0)||(mm.indexOf("0-0")>=0)||(mm.indexOf("O<>O")>=0)||(mm.indexOf("0<>0")>=0))
{ if (EvalMove(ttype0, 7, xx0, yy0, ttype1, xx1, yy1, ccapt, sstore))
return(1);
return(0);
}
return(0);
}
if ((mm.indexOf("---")>=0)||(mm.indexOf("<22><><EFBFBD>")>=0))
//if (mm.indexOf("...")>=0) //is buggy
{ if (EvalMove(ttype0, 8, xx0, yy0, ttype1, xx1, yy1, ccapt, sstore))
return(1);
return(0);
}
return(0);
}
ll=ffrom.length;
ttype0=5;
if (ll>0)
{ for (ii=0; ii<5; ii++)
{ if (ffrom.charCodeAt(0)==PieceCode[ii])
ttype0=ii;
}
if (ffrom.charAt(ll-1)=="x") ccapt=1;
else
{ if ((ffrom.charAt(ll-1)=="-")||(ffrom.charAt(ll-1)=="<22>")) ll--; //Smith Notation
}
if (isNaN(mm.charAt(ll-1-ccapt)))
{ xx0=ffrom.charCodeAt(ll-1-ccapt)-97;
if ((xx0<0)||(xx0>7)) xx0=-1;
}
else
{ yy0=ffrom.charAt(ll-1-ccapt)-1;
if ((yy0<0)||(yy0>7)) yy0=-1;
}
if ((yy0>=0)&&(isNaN(mm.charAt(ll-2-ccapt)))) //Smith Notation
{ xx0=ffrom.charCodeAt(ll-2-ccapt)-97;
if ((xx0<0)||(xx0>7)) xx0=-1;
else
{ ttype0=Math.abs(Board[xx0][yy0])-1;
if ((ttype0==0)&&(xx0-xx1>1)&&(yy0==yy1))
{ if (EvalMove(ttype0, 6, xx0, yy0, -1, -1, -1, 0, sstore))
return(1);
return(0);
}
if ((ttype0==0)&&(xx1-xx0>1)&&(yy0==yy1))
{ if (EvalMove(ttype0, 7, xx0, yy0, -1, -1, -1, 0, sstore))
return(1);
return(0);
}
}
}
}
if (Board[xx1][yy1]!=0) ccapt=1;
else
{ if ((ttype0==5)&&(xx1==CanPass)&&(yy1==5-3*MoveType)) ccapt=1;
}
ttype1=ttype0;
ii=mm.indexOf("=");
if (ii<0) ii=yy1i;
if ((ii>0)&&(ii<mm.length-1))
{ if (ttype0==5)
{ ii=mm.charCodeAt(ii+1);
if (ii==PieceCode[1]) ttype1=1;
if (ii==PieceCode[2]) ttype1=2;
if (ii==PieceCode[3]) ttype1=3;
if (ii==PieceCode[4]) ttype1=4;
}
}
if (sstore)
{ for (ii=0; ii<16; ii++)
{ if (PieceType[MoveType][ii]==ttype0)
{ if (EvalMove(ii, ttype0, xx0, yy0, ttype1, xx1, yy1, ccapt, true))
return(1);
}
}
}
else
{ ll=0;
for (ii=0; ii<16; ii++)
{ if (PieceType[MoveType][ii]==ttype0)
{ if (EvalMove(ii, ttype0, xx0, yy0, ttype1, xx1, yy1, ccapt, false))
ll++;
}
}
return(ll);
}
return(0);
}
function CanCastleLong()
{ if (Castling[MoveType][1]==0) return(-1);
if (PieceMoves[MoveType][0]>0) return(-1);
var jj=0;
while (jj<16)
{ if ((PiecePosX[MoveType][jj]<PiecePosX[MoveType][0])&&
(PiecePosY[MoveType][jj]==MoveType*7)&&
(PieceType[MoveType][jj]==2)&&
(PieceMoves[MoveType][jj]==0))
jj+=100;
else jj++;
}
if (jj==16) return(-1);
jj-=100;
Board[PiecePosX[MoveType][0]][MoveType*7]=0;
Board[PiecePosX[MoveType][jj]][MoveType*7]=0;
var ff=PiecePosX[MoveType][jj];
if (ff>2) ff=2;
while ((ff<PiecePosX[MoveType][0])||(ff<=3))
{ if (Board[ff][MoveType*7]!=0)
{ Board[PiecePosX[MoveType][0]][MoveType*7]=1-2*MoveType;
Board[PiecePosX[MoveType][jj]][MoveType*7]=(1-2*MoveType)*3;
return(-1);
}
ff++;
}
Board[PiecePosX[MoveType][0]][MoveType*7]=1-2*MoveType;
Board[PiecePosX[MoveType][jj]][MoveType*7]=(1-2*MoveType)*3;
return(jj);
}
function CanCastleShort()
{ if (Castling[MoveType][0]==0) return(-1);
if (PieceMoves[MoveType][0]>0) return(-1);
var jj=0;
while (jj<16)
{ if ((PiecePosX[MoveType][jj]>PiecePosX[MoveType][0])&&
(PiecePosY[MoveType][jj]==MoveType*7)&&
(PieceType[MoveType][jj]==2)&&
(PieceMoves[MoveType][jj]==0))
jj+=100;
else jj++;
}
if (jj==16) return(-1);
jj-=100;
Board[PiecePosX[MoveType][0]][MoveType*7]=0;
Board[PiecePosX[MoveType][jj]][MoveType*7]=0;
var ff=PiecePosX[MoveType][jj];
if (ff<6) ff=6;
while ((ff>PiecePosX[MoveType][0])||(ff>=5))
{ if (Board[ff][MoveType*7]!=0)
{ Board[PiecePosX[MoveType][0]][MoveType*7]=1-2*MoveType;
Board[PiecePosX[MoveType][jj]][MoveType*7]=(1-2*MoveType)*3;
return(-1);
}
ff--;
}
Board[PiecePosX[MoveType][0]][MoveType*7]=1-2*MoveType;
Board[PiecePosX[MoveType][jj]][MoveType*7]=(1-2*MoveType)*3;
return(jj);
}
function EvalMove(ii, ttype0, xx0, yy0, ttype1, xx1, yy1, ccapt, sstore)
{ var ddx, ddy, xx, yy, jj=-1, ttype2=-1, xx2=xx1, yy2=xx1, ttype3=-1, xx3=-1, yy3=-1, ff;
if (ttype0==6) //O-O-O with Chess960 rules
{ jj=CanCastleLong();
if (jj<0) return(false);
if (StoreMove(0, 0, 2, MoveType*7, jj, 2, 3, MoveType*7, sstore))
return(true);
else return(false);
}
if (ttype0==7) //O-O with Chess960 rules
{ jj=CanCastleShort();
if (jj<0) return(false);
if (StoreMove(0, 0, 6, MoveType*7, jj, 2, 5, MoveType*7, sstore))
return(true);
return(false);
}
if (ttype0==8) // --- NullMove
{ if (StoreMove(0, 0, PiecePosX[MoveType][0], PiecePosY[MoveType][0], -1, -1, -1, -1, sstore))
return(true);
return(false);
}
if ((PiecePosX[MoveType][ii]==xx1)&&(PiecePosY[MoveType][ii]==yy1))
return(false);
if ((ccapt==0)&&(Board[xx1][yy1]!=0))
return(false);
if ((ccapt>0)&&(sign(Board[xx1][yy1])!=(2*MoveType-1)))
{ if ((ttype0!=5)||(CanPass!=xx1)||(yy1!=5-3*MoveType))
return(false);
}
if ((xx0>=0)&&(xx0!=PiecePosX[MoveType][ii])) return(false);
if ((yy0>=0)&&(yy0!=PiecePosY[MoveType][ii])) return(false);
if (ttype0==0)
{ //if ((xx0>=0)||(yy0>=0)) return(false); //because of Smith Notation
if (Math.abs(PiecePosX[MoveType][ii]-xx1)>1) return(false);
if (Math.abs(PiecePosY[MoveType][ii]-yy1)>1) return(false);
}
if (ttype0==1)
{ if ((Math.abs(PiecePosX[MoveType][ii]-xx1)!=Math.abs(PiecePosY[MoveType][ii]-yy1))&&
((PiecePosX[MoveType][ii]-xx1)*(PiecePosY[MoveType][ii]-yy1)!=0))
return(false);
}
if (ttype0==2)
{ if ((PiecePosX[MoveType][ii]-xx1)*(PiecePosY[MoveType][ii]-yy1)!=0)
return(false);
}
if (ttype0==3)
{ if (Math.abs(PiecePosX[MoveType][ii]-xx1)!=Math.abs(PiecePosY[MoveType][ii]-yy1))
return(false);
}
if (ttype0==4)
{ if (Math.abs(PiecePosX[MoveType][ii]-xx1)*Math.abs(PiecePosY[MoveType][ii]-yy1)!=2)
return(false);
}
if ((ttype0==1)||(ttype0==2)||(ttype0==3))
{ ddx=sign(xx1-PiecePosX[MoveType][ii]);
ddy=sign(yy1-PiecePosY[MoveType][ii]);
xx=PiecePosX[MoveType][ii]+ddx;
yy=PiecePosY[MoveType][ii]+ddy;
while ((xx!=xx1)||(yy!=yy1))
{ if (Board[xx][yy]!=0) return(false);
xx+=ddx;
yy+=ddy;
}
}
if (ttype0==5)
{ if (Math.abs(PiecePosX[MoveType][ii]-xx1)!=ccapt) return(false);
if ((yy1==7*(1-MoveType))&&(ttype0==ttype1)) return(false);
if (ccapt==0)
{ if (PiecePosY[MoveType][ii]-yy1==4*MoveType-2)
{ if (PiecePosY[MoveType][ii]!=1+5*MoveType) return(false);
if (Board[xx1][yy1+2*MoveType-1]!=0) return(false);
}
else
{ if (PiecePosY[MoveType][ii]-yy1!=2*MoveType-1) return(false);
}
}
else
{ if (PiecePosY[MoveType][ii]-yy1!=2*MoveType-1) return(false);
}
}
if (ttype1!=ttype0)
{ if (ttype0!=5) return(false);
if (ttype1>=5) return(false);
if (yy1!=7-7*MoveType) return(false);
}
if ((ttype0<=5)&&(ccapt>0))
{ jj=15;
while ((jj>=0)&&(ttype3<0))
{ if ((PieceType[1-MoveType][jj]>0)&&
(PiecePosX[1-MoveType][jj]==xx1)&&
(PiecePosY[1-MoveType][jj]==yy1))
ttype3=PieceType[1-MoveType][jj];
else
jj--;
}
if ((ttype3==-1)&&(ttype0==5)&&(CanPass>=0))
{ jj=15;
while ((jj>=0)&&(ttype3<0))
{ if ((PieceType[1-MoveType][jj]==5)&&
(PiecePosX[1-MoveType][jj]==xx1)&&
(PiecePosY[1-MoveType][jj]==yy1-1+2*MoveType))
ttype3=PieceType[1-MoveType][jj];
else
jj--;
}
}
ttype3=-1;
}
if (StoreMove(ii, ttype1, xx1, yy1, jj, ttype3, xx3, yy3, sstore))
return(true);
return(false);
}
function StoreMove(ii, ttype1, xx1, yy1, jj, ttype3, xx3, yy3, sstore)
{ var iis_check=0, ll, cc=MoveCount-StartMove, ff=PiecePosX[MoveType][0], dd=0;
// if ((ttype1==5)||((jj>=0)&&(ttype3<0)))
if ((PieceType[MoveType][ii]==5)||((jj>=0)&&(ttype3<0)))
HalfMove[cc+1]=0;
else
HalfMove[cc+1]=HalfMove[cc]+1;
HistPiece[0][cc] = ii;
HistType[0][cc] = PieceType[MoveType][ii];
HistPosX[0][cc] = PiecePosX[MoveType][ii];
HistPosY[0][cc] = PiecePosY[MoveType][ii];
if (!isAnimating)
{ dragPiece[0]=PiecePosX[MoveType][ii];
dragPiece[1]=PiecePosY[MoveType][ii];
dragPiece[2]=xx1;
dragPiece[3]=yy1;
dragPiece[4]=-1;
}
if (jj<0)
HistPiece[1][cc] = -1;
else
{ if (ttype3>=0)
{ HistPiece[1][cc] = jj;
HistType[1][cc] = PieceType[MoveType][jj];
HistPosX[1][cc] = PiecePosX[MoveType][jj];
HistPosY[1][cc] = PiecePosY[MoveType][jj];
if (!isAnimating)
{ dragPiece[4]=PiecePosX[MoveType][jj];
dragPiece[5]=PiecePosY[MoveType][jj];
dragPiece[6]=xx3;
dragPiece[7]=yy3;
}
}
else
{ HistPiece[1][cc] = 16+jj;
HistType[1][cc] = PieceType[1-MoveType][jj];
HistPosX[1][cc] = PiecePosX[1-MoveType][jj];
HistPosY[1][cc] = PiecePosY[1-MoveType][jj];
}
}
Board[PiecePosX[MoveType][ii]][PiecePosY[MoveType][ii]]=0;
if (jj>=0)
{ if (ttype3<0)
Board[PiecePosX[1-MoveType][jj]][PiecePosY[1-MoveType][jj]]=0;
else
Board[PiecePosX[MoveType][jj]][PiecePosY[MoveType][jj]]=0;
}
PieceType[MoveType][ii]=ttype1;
if ((PiecePosX[MoveType][ii]!=xx1)||(PiecePosY[MoveType][ii]!=yy1)||(jj>=0))
{ PieceMoves[MoveType][ii]++; dd++; } //not a nullmove
PiecePosX[MoveType][ii]=xx1;
PiecePosY[MoveType][ii]=yy1;
if (jj>=0)
{ if (ttype3<0)
{ PieceType[1-MoveType][jj]=ttype3;
PieceMoves[1-MoveType][jj]++;
}
else
{ PiecePosX[MoveType][jj]=xx3;
PiecePosY[MoveType][jj]=yy3;
PieceMoves[MoveType][jj]++;
}
}
if (jj>=0)
{ if (ttype3<0)
Board[PiecePosX[1-MoveType][jj]][PiecePosY[1-MoveType][jj]]=0;
else
Board[PiecePosX[MoveType][jj]][PiecePosY[MoveType][jj]]=(PieceType[MoveType][jj]+1)*(1-2*MoveType);
}
Board[PiecePosX[MoveType][ii]][PiecePosY[MoveType][ii]]=(PieceType[MoveType][ii]+1)*(1-2*MoveType);
if ((ttype1==0)&&(ttype3==2)) //O-O-O, O-O
{ while (ff>xx1)
{ iis_check+=IsCheck(ff, MoveType*7, MoveType);
ff--;
}
while (ff<xx1)
{ iis_check+=IsCheck(ff, MoveType*7, MoveType);
ff++;
}
}
iis_check+=IsCheck(PiecePosX[MoveType][0], PiecePosY[MoveType][0], MoveType);
if ((iis_check==0)&&(sstore))
{ MoveArray[cc]=String.fromCharCode(97+HistPosX[0][cc])+(HistPosY[0][cc]+1)+String.fromCharCode(97+PiecePosX[MoveType][ii])+(PiecePosY[MoveType][ii]+1);
if (HistType[0][cc] != PieceType[MoveType][ii])
{ if (MoveType==0) MoveArray[cc]+=PieceName.charAt(PieceType[MoveType][ii]);
else MoveArray[cc]+=PieceName.charAt(PieceType[MoveType][ii]).toLowerCase();
}
MoveArray.length=cc+1;
return(true);
}
Board[PiecePosX[MoveType][ii]][PiecePosY[MoveType][ii]]=0;
Board[HistPosX[0][cc]][HistPosY[0][cc]]=(HistType[0][cc]+1)*(1-2*MoveType);
PieceType[MoveType][ii]=HistType[0][cc];
PiecePosX[MoveType][ii]=HistPosX[0][cc];
PiecePosY[MoveType][ii]=HistPosY[0][cc];
PieceMoves[MoveType][ii]-=dd;
if (jj>=0)
{ if (ttype3>=0)
{ Board[PiecePosX[MoveType][jj]][PiecePosY[MoveType][jj]]=0;
Board[HistPosX[0][cc]][HistPosY[0][cc]]=(HistType[0][cc]+1)*(1-2*MoveType);
Board[HistPosX[1][cc]][HistPosY[1][cc]]=(HistType[1][cc]+1)*(1-2*MoveType);
PieceType[MoveType][jj]=HistType[1][cc];
PiecePosX[MoveType][jj]=HistPosX[1][cc];
PiecePosY[MoveType][jj]=HistPosY[1][cc];
PieceMoves[MoveType][jj]--;
}
else
{ Board[HistPosX[1][cc]][HistPosY[1][cc]]=(HistType[1][cc]+1)*(2*MoveType-1);
PieceType[1-MoveType][jj]=HistType[1][cc];
PiecePosX[1-MoveType][jj]=HistPosX[1][cc];
PiecePosY[1-MoveType][jj]=HistPosY[1][cc];
PieceMoves[1-MoveType][jj]--;
}
}
if (iis_check==0) return(true);
return(false);
}
function IsCheck(xx, yy, tt)
{ var ii0=xx, jj0=yy, ddi, ddj, bb;
for (ddi=-2; ddi<=2; ddi+=4)
{ for (ddj=-1; ddj<=1; ddj+=2)
{ if (IsOnBoard(ii0+ddi, jj0+ddj))
{ if (Board[ii0+ddi][jj0+ddj]==10*tt-5) return(1);
}
}
}
for (ddi=-1; ddi<=1; ddi+=2)
{ for (ddj=-2; ddj<=2; ddj+=4)
{ if (IsOnBoard(ii0+ddi, jj0+ddj))
{ if (Board[ii0+ddi][jj0+ddj]==10*tt-5) return(1);
}
}
}
for (ddi=-1; ddi<=1; ddi+=2)
{ ddj=1-2*tt;
{ if (IsOnBoard(ii0+ddi, jj0+ddj))
{ if (Board[ii0+ddi][jj0+ddj]==12*tt-6) return(1);
}
}
}
if ((Math.abs(PiecePosX[1-tt][0]-xx)<2)&&(Math.abs(PiecePosY[1-tt][0]-yy)<2))
return(1);
for (ddi=-1; ddi<=1; ddi+=1)
{ for (ddj=-1; ddj<=1; ddj+=1)
{ if ((ddi!=0)||(ddj!=0))
{ ii0=xx+ddi;
jj0=yy+ddj;
bb=0;
while ((IsOnBoard(ii0, jj0))&&(bb==0))
{ bb=Board[ii0][jj0];
if (bb==0)
{ ii0+=ddi;
jj0+=ddj;
}
else
{ if (bb==4*tt-2) return(1);
if ((bb==6*tt-3)&&((ddi==0)||(ddj==0))) return(1);
if ((bb==8*tt-4)&&(ddi!=0)&&(ddj!=0)) return(1);
}
}
}
}
}
return(0);
}
function IsOnBoard(ii, jj)
{ if (ii<0) return(false);
if (ii>7) return(false);
if (jj<0) return(false);
if (jj>7) return(false);
return(true);
}
function GetMove(tt,nn)
{ var ii=0, jj=0, mm="", ll=-1, cc, ss=tt;
while (ss.indexOf("<br />")>0) ss=ss.replace("<br />","");
var kk=ss.length;
while (ii<kk)
{ cc=ss.charCodeAt(ii);
if ((cc<=32))//||(cc==46)) //||(cc>=127))
{ if (ll+1!=ii) jj++;
ll=ii;
}
else
{ if (jj==nn)
{ if ((cc==46)&&(!isNaN(mm))) { mm=""; ll=ii; }
else mm+=ss.charAt(ii);
}
}
ii++;
}
if ((nn==1)&&(mm=="")&&(ss.charAt(0)=="."))
{ ii=0;
while (ii<kk)
{ cc=ss.charAt(ii);
if ((cc!=".")&&(cc!=" ")) mm+=cc;
ii++;
}
}
if (mm!="")
{ ii=mm.indexOf("<");
jj=mm.indexOf(">");
ll=0; NewCommands.length=0;
while ((ii>=0)&&(jj>=0)&&(ii<jj))
{ NewCommands[ll++]=mm.substr(ii+1,jj-ii-1);
mm=mm.substr(0,ii)+mm.substr(jj+1);
ii=mm.indexOf("<");
jj=mm.indexOf(">");
}
}
return(mm);
}
function ExecCommand(bb)
{ isExecCommand=bb;
}
function ExecCommands(nnc, hh)
{ var ii, jj, kk, nn, mm, cc, tt, bb0, bb1, xx0, yy0, xx1, yy1, aa="";
if (!isExecCommand) return;
if (document.layers) return;
if (!document.getElementById("Board")) return;
if (nnc)
{ NewCommands.length=0;
if (nnc.indexOf(",")>0) NewCommands=nnc.replace(/ /g,'').split(",");
else NewCommands[0]=nnc.replace(/ /g,'');
if (hh);
else HistCommand[MoveCount-StartMove]=NewCommands.join("|");
setTimeout("ExecCommands()",100);
return;
}
var dd=parseInt(document.getElementById("Board").offsetHeight);
var dd32=Math.round(dd/32);
for (ii=0; ii<OldCommands.length; ii++)
{ tt=OldCommands[ii].charAt(0);
if ((tt=="B")||(tt=="C"))
{ nn=OldCommands[ii].charCodeAt(1)-97+(8-parseInt(OldCommands[ii].charAt(2)))*8;
if (isRotated) nn=63-nn;
if ((nn>=0)&&(nn<=63))
{ if (tt=="B") document.images[ImageOffset+nn].style.borderColor=BorderColor;
else document.images[ImageOffset+nn].style.backgroundColor="transparent";
}
}
if ((tt=="A")||(tt=="B")) document.getElementById("Canvas").innerHTML="<div style='position:absolute;top:0px;left:0px;width:0px;height:0px;'></div>";
}
if (NewCommands.length>2) SetAutoPlay(false);
for (ii=0; ii<NewCommands.length; ii++)
{ tt=NewCommands[ii].substr(1,4);
if ((tt=="this")||(tt=="last"))
{ if (tt=="this") { kk=MoveCount-StartMove-1; ll=0; }
else { kk=MoveCount-StartMove-2; ll=1; }
if (kk>=0)
{ tt=NewCommands[ii].charAt(0);
cc=NewCommands[ii].substr(5,8);
nn=NewCommands.length;
if ((tt=="B")||(tt=="C"))
{ NewCommands[nn]=tt+String.fromCharCode(97+HistPosX[0][kk])+(1+HistPosY[0][kk])+cc;
NewCommands[nn+1]=tt+String.fromCharCode(97+PiecePosX[(MoveType+ll+1)%2][HistPiece[0][kk]])+(1+PiecePosY[(MoveType+ll+1)%2][HistPiece[0][kk]])+cc;
}
if (tt=="A")
{ NewCommands[nn]=tt+String.fromCharCode(97+HistPosX[0][kk])+(1+HistPosY[0][kk]);
NewCommands[nn]+=String.fromCharCode(97+PiecePosX[(MoveType+ll+1)%2][HistPiece[0][kk]])+(1+PiecePosY[(MoveType+ll+1)%2][HistPiece[0][kk]])+cc;
}
NewCommands[ii]="X";
}
}
else
{ tt=NewCommands[ii].charAt(0);
if ((tt=="B")||(tt=="C"))
{ nn=NewCommands[ii].charCodeAt(1)-97+(8-parseInt(NewCommands[ii].charAt(2)))*8;
if ((nn>=0)&&(nn<=63))
{ if (isRotated) nn=63-nn;
cc=NewCommands[ii].substr(3,8);
if (cc=="R") cc="FF0000";
if (cc=="G") cc="00FF00";
if (cc=="B") cc="0000FF";
if (cc.length<6) cc="#FFFFFF";
else cc="#"+cc;
if (tt=="B") document.images[ImageOffset+nn].style.borderColor=cc.substr(0,7);
else document.images[ImageOffset+nn].style.backgroundColor=HEX2RGBA(cc);
}
}
if ((tt=="B")&&(dd>0))
{ kk=NewCommands[ii].charCodeAt(1)-97;
jj=parseInt(NewCommands[ii].charAt(2));
nn=kk+(8-jj)*8;
if ((nn>=0)&&(nn<=63)) bb0=Board[kk][jj-1];
if ((nn>=0)&&(nn<=63))
{ if (isRotated) nn=63-nn;
xx0=nn%8; yy0=(nn-xx0)/8;
cc=NewCommands[ii].substr(3,8);
if (cc=="R") cc="FF0000";
if (cc=="G") cc="00FF00";
if (cc=="B") cc="0000FF";
if (cc.length<6) cc="#FFFFFF";
else cc="#"+cc;
aa+=GetBorder(xx0,yy0,HEX2RGBA(cc),dd);
}
}
if ((tt=="A")&&(dd>0))
{ kk=NewCommands[ii].charCodeAt(1)-97;
jj=parseInt(NewCommands[ii].charAt(2));
nn=kk+(8-jj)*8;
if ((nn>=0)&&(nn<=63)) bb0=Board[kk][jj-1];
kk=NewCommands[ii].charCodeAt(3)-97;
jj=parseInt(NewCommands[ii].charAt(4));
mm=kk+(8-jj)*8;
if ((mm<0)||(mm>63))
{ mm=nn;
kk=NewCommands[ii].charCodeAt(1)-97;
jj=parseInt(NewCommands[ii].charAt(2));
}
if ((mm>=0)&&(mm<=63)) bb1=Board[kk][jj-1];
if ((nn>=0)&&(nn<=63)&&(mm>=0)&&(mm<=63))
{ if (isRotated) { nn=63-nn; mm=63-mm; }
xx0=nn%8; yy0=(nn-xx0)/8;
xx1=mm%8; yy1=(mm-xx1)/8;
nn=0; mm=0;
if (xx0<xx1) nn=1;
if (xx0>xx1) nn=-1;
if (yy0<yy1) mm=1;
if (yy0>yy1) mm=-1;
xx0=Math.round((2*xx0+1)*dd/16);
yy0=Math.round((2*yy0+1)*dd/16);
if (bb0!=0)
{ xx0+=nn*dd32;
yy0+=mm*dd32;
}
xx1=Math.round((2*xx1+1)*dd/16);
yy1=Math.round((2*yy1+1)*dd/16);
if (bb1!=0)
{ xx1-=nn*dd32;
yy1-=mm*dd32;
}
cc=NewCommands[ii].substr(5,8);
if (cc=="R") cc="FF0000";
if (cc=="G") cc="00FF00";
if (cc=="B") cc="0000FF";
if (cc.length<6) cc="#FFFFFF";
else cc="#"+cc;
if (NewCommands[ii].charAt(4)=="0") aa+=GetArrow(xx0,yy0,0,0,HEX2RGBA(cc),dd);
else aa+=GetArrow(xx0,yy0,xx1,yy1,HEX2RGBA(cc),dd);
}
}
}
}
if (aa!="")
{ document.getElementById("Canvas").style.top=-dd+"px";
for (ii=0; ii<8; ii++)
{ for (jj=0; jj<8; jj++)
aa+="<div id='c"+eval(ii+jj*8)+"' onMouseDown='BoardClick("+eval(ii+jj*8)+")' style='position:absolute;left:"+Math.round(ii*dd/8)+"px;top:"+Math.round(jj*dd/8)+"px;width:"+Math.round(dd/8)+"px;height:"+Math.round(dd/8)+"px;z-index:101;'></div>";
}
document.getElementById("Canvas").innerHTML=aa;
}
OldCommands.length=0;
for (ii=0; ii<NewCommands.length; ii++) OldCommands[ii]=NewCommands[ii];
NewCommands.length=0;
}
function SkipRefreshBoard(nn)
{ SkipRefresh=nn;
}
function RefreshBoard(rr)
{ if (SkipRefresh>0) return;
InitImages();
if (rr) DocImg.length=0;
var ii, jj, kk, kk0, ll, mm=1;
if (document.images["RightLabels"])
{ if (IsLabelVisible)
{ if (isRotated) SetImg("RightLabels",LabelPic[2]);
else SetImg("RightLabels",LabelPic[0]);
}
else SetImg("RightLabels",LabelPic[4]);
}
if (document.images["BottomLabels"])
{ if (IsLabelVisible)
{ if (isRotated) SetImg("BottomLabels",LabelPic[3]);
else SetImg("BottomLabels",LabelPic[1]);
}
else SetImg("BottomLabels",LabelPic[4]);
}
if (isSetupBoard)
{ if (isRotated)
{ for (ii=0; ii<8; ii++)
{ for (jj=0; jj<8; jj++)
{ if (Board[ii][jj]==0)
SetImg(63-ii-(7-jj)*8,BoardPic);
else
SetImg(63-ii-(7-jj)*8,PiecePic[(1-sign(Board[ii][jj]))/2][Math.abs(Board[ii][jj])-1]);
}
}
}
else
{ for (ii=0; ii<8; ii++)
{ for (jj=0; jj<8; jj++)
{ if (Board[ii][jj]==0)
SetImg(ii+(7-jj)*8,BoardPic);
else
SetImg(ii+(7-jj)*8,PiecePic[(1-sign(Board[ii][jj]))/2][Math.abs(Board[ii][jj])-1]);
}
}
}
}
else
{ for (ii=0; ii<8; ii++)
{ for (jj=0; jj<8; jj++)
{ if (Board[ii][jj]==0)
{ if (isRotated)
SetImg(63-ii-(7-jj)*8,BoardPic);
else
SetImg(ii+(7-jj)*8,BoardPic);
}
}
}
for (ii=0; ii<2; ii++)
{ for (jj=0; jj<16; jj++)
{ if (PieceType[ii][jj]>=0)
{ kk=PiecePosX[ii][jj]+8*(7-PiecePosY[ii][jj]);
if (isRotated)
SetImg(63-kk,PiecePic[ii][PieceType[ii][jj]]);
else
SetImg(kk,PiecePic[ii][PieceType[ii][jj]]);
}
}
}
if (isCapturedPieces)
{ var pp0=new Array(0,1,1,2,2,2,8);
kk0=0;
if (document.images["RightLabels"]) kk0++;
kk=0;
ii=0;
if (isRotated) ii=1;
for (jj=0; jj<16; jj++) pp0[PieceType[ii][jj]+1]--;
for (jj=1; jj<5; jj++)
{ for (ll=0; ll<pp0[jj+1]; ll++)
{ SetImg(64+kk0+(kk-kk%4)/4+(kk%4)*4,PiecePic[ii][jj]);
kk++;
pp0[0]++;
}
}
for (ll=0; ll>pp0[0]; ll--)
{ SetImg(64+kk0+(kk-kk%4)/4+(kk%4)*4,PiecePic[ii][5]);
kk++;
}
if (mm<kk) mm=kk;
while (kk<4) { SetImg(64+kk0+(kk-kk%4)/4+(kk%4)*4,BoardPic); kk++; }
while (kk<16){ SetImg(64+kk0+(kk-kk%4)/4+(kk%4)*4,LabelPic[4]); kk++; }
var pp1=new Array(0,1,1,2,2,2,8);
kk=0;
ii=1-ii;
for (jj=0; jj<16; jj++) pp1[PieceType[ii][jj]+1]--;
for (jj=1; jj<5; jj++)
{ for (ll=0; ll<pp1[jj+1]; ll++)
{ SetImg(92+kk0+(kk-kk%4)/4-(kk%4)*4,PiecePic[ii][jj]);
kk++;
pp1[0]++;
}
}
for (ll=0; ll>pp1[0]; ll--)
{ SetImg(92+kk0+(kk-kk%4)/4-(kk%4)*4,PiecePic[ii][5]);
kk++;
}
if (mm<kk) mm=kk;
while (kk<4) { SetImg(92+kk0+(kk-kk%4)/4-(kk%4)*4,BoardPic); kk++; }
while (kk<16){ SetImg(92+kk0+(kk-kk%4)/4-(kk%4)*4,LabelPic[4]); kk++; }
mm=Math.ceil(mm/4);
if ((parent)&&(parent.ChangeColWidth)) parent.ChangeColWidth(mm);
}
}
}
function SetLastStyle(ss)
{ LastStyle=ss;
}
function SetThisStyle(ss)
{ ThisStyle=ss;
}
function SetCandidateStyle(ss)
{ CandidateStyle=ss;
}
function SetBCStyle(ss)
{ BCStyle=ss;
if(!ss)
{ BCCmds="";
if (LastStyle)
BCCmds+=LastStyle.charAt(0)+"last"+LastStyle.substr(1);
if (ThisStyle)
{ if (LastStyle) BCCmds+=",";
BCCmds+=ThisStyle.charAt(0)+"this"+ThisStyle.substr(1);
}
ExecCommands(BCCmds,1);
}
}
function HighlightCandidates(nn, ccs)
{ if (nn<0) { ExecCommands('',1); return; }
var ii0=nn%8;
var jj0=7-(nn-ii0)/8;
var pp=Board[ii0][jj0];
var cc=sign(pp);
var tt=(1-cc)/2;
var dd, ddi, ddj, bb, jj, aa=new Array();
var nna=0, ddA=0;
if (ccs.charAt(0)=="A") ddA=1;
if (Math.abs(pp)==6)
{ Board[ii0][jj0]=0;
if (IsOnBoard(ii0, jj0+cc))
{ bb=Board[ii0][jj0+cc];
if (bb==0)
{ Board[ii0][jj0+cc]=pp;
if (!IsCheck(PiecePosX[tt][0], PiecePosY[tt][0], tt))
aa[nna++]=String.fromCharCode(ii0+97)+(jj0+cc+1);
Board[ii0][jj0+cc]=bb;
if (2*jj0+5*cc==7)
{ bb=Board[ii0][jj0+2*cc];
if (bb==0)
{ Board[ii0][jj0+2*cc]=pp;
if (!IsCheck(PiecePosX[tt][0], PiecePosY[tt][0], tt))
{ nna-=ddA;
aa[nna++]=String.fromCharCode(ii0+97)+(jj0+2*cc+1);
}
Board[ii0][jj0+2*cc]=bb;
}
}
}
}
for (ddi=-1; ddi<=1; ddi+=2)
{ if (IsOnBoard(ii0+ddi, jj0+cc))
{ bb=Board[ii0+ddi][jj0+cc];
if (bb*cc<0)
{ Board[ii0+ddi][jj0+cc]=pp;
if (!IsCheck(PiecePosX[tt][0], PiecePosY[tt][0], tt))
aa[nna++]=String.fromCharCode(ii0+ddi+97)+(jj0+cc+1);
Board[ii0+ddi][jj0+cc]=bb;
}
}
if (2*jj0-cc==7)
{ if (IsOnBoard(ii0+ddi, jj0))
{ if (Board[ii0+ddi][jj0]==-cc*6)
{ bb=Board[ii0+ddi][jj0+cc];
if (bb==0)
{ if (MoveCount>StartMove)
{ CanPass=-1;
dd=HistPiece[0][MoveCount-StartMove-1];
if ((HistType[0][MoveCount-StartMove-1]==5)&&(Math.abs(HistPosY[0][MoveCount-StartMove-1]-PiecePosY[1-MoveType][dd])==2))
CanPass=PiecePosX[1-MoveType][dd];
}
else
CanPass=EnPass;
if (CanPass==ii0+ddi)
{ Board[ii0+ddi][jj0+cc]=pp;
Board[ii0+ddi][jj0]=0; //bugfix 20130625
if (!IsCheck(PiecePosX[tt][0], PiecePosY[tt][0], tt))
aa[nna++]=String.fromCharCode(ii0+ddi+97)+(jj0+cc+1);
Board[ii0+ddi][jj0]=-pp; //bugfix 20130625
Board[ii0+ddi][jj0+cc]=bb;
}
}
}
}
}
}
Board[ii0][jj0]=pp;
}
if (Math.abs(pp)==5)
{ Board[ii0][jj0]=0;
for (ddi=-2; ddi<=2; ddi+=4)
{ for (ddj=-1; ddj<=1; ddj+=2)
{ if (IsOnBoard(ii0+ddi, jj0+ddj))
{ bb=Board[ii0+ddi][jj0+ddj];
if (bb*cc<=0)
{ Board[ii0+ddi][jj0+ddj]=pp;
if (!IsCheck(PiecePosX[tt][0], PiecePosY[tt][0], tt))
aa[nna++]=String.fromCharCode(ii0+ddi+97)+(jj0+ddj+1);
Board[ii0+ddi][jj0+ddj]=bb;
}
}
}
}
for (ddi=-1; ddi<=1; ddi+=2)
{ for (ddj=-2; ddj<=2; ddj+=4)
{ if (IsOnBoard(ii0+ddi, jj0+ddj))
{ bb=Board[ii0+ddi][jj0+ddj];
if (bb*cc<=0)
{ Board[ii0+ddi][jj0+ddj]=pp;
if (!IsCheck(PiecePosX[tt][0], PiecePosY[tt][0], tt))
aa[nna++]=String.fromCharCode(ii0+ddi+97)+(jj0+ddj+1);
Board[ii0+ddi][jj0+ddj]=bb;
}
}
}
}
Board[ii0][jj0]=pp;
}
if ((Math.abs(pp)==2)||(Math.abs(pp)==4))
{ Board[ii0][jj0]=0;
dd=1;
bb=0;
while ((IsOnBoard(ii0+dd,jj0+dd))&&(bb==0))
{ bb=Board[ii0+dd][jj0+dd];
if (bb*cc<=0)
{ Board[ii0+dd][jj0+dd]=pp;
if (!IsCheck(PiecePosX[tt][0], PiecePosY[tt][0], tt))
{ aa[nna++]=String.fromCharCode(ii0+dd+97)+(jj0+dd+1);
nna-=ddA;
}
Board[ii0+dd][jj0+dd]=bb;
}
dd++;
}
if (dd>1) nna+=ddA;
dd=-1;
bb=0;
while ((IsOnBoard(ii0+dd,jj0+dd))&&(bb==0))
{ bb=Board[ii0+dd][jj0+dd];
if (bb*cc<=0)
{ Board[ii0+dd][jj0+dd]=pp;
if (!IsCheck(PiecePosX[tt][0], PiecePosY[tt][0], tt))
{ aa[nna++]=String.fromCharCode(ii0+dd+97)+(jj0+dd+1);
nna-=ddA;
}
Board[ii0+dd][jj0+dd]=bb;
}
dd--;
}
if (dd<-1) nna+=ddA;
dd=1;
bb=0;
while ((IsOnBoard(ii0+dd,jj0-dd))&&(bb==0))
{ bb=Board[ii0+dd][jj0-dd];
if (bb*cc<=0)
{ Board[ii0+dd][jj0-dd]=pp;
if (!IsCheck(PiecePosX[tt][0], PiecePosY[tt][0], tt))
{ aa[nna++]=String.fromCharCode(ii0+dd+97)+(jj0-dd+1);
nna-=ddA;
}
Board[ii0+dd][jj0-dd]=bb;
}
dd++;
}
if (dd>1) nna+=ddA;
dd=-1;
bb=0;
while ((IsOnBoard(ii0+dd,jj0-dd))&&(bb==0))
{ bb=Board[ii0+dd][jj0-dd];
if (bb*cc<=0)
{ Board[ii0+dd][jj0-dd]=pp;
if (!IsCheck(PiecePosX[tt][0], PiecePosY[tt][0], tt))
{ aa[nna++]=String.fromCharCode(ii0+dd+97)+(jj0-dd+1);
nna-=ddA;
}
Board[ii0+dd][jj0-dd]=bb;
}
dd--;
}
if (dd<-1) nna+=ddA;
Board[ii0][jj0]=pp;
}
if ((Math.abs(pp)==2)||(Math.abs(pp)==3))
{ Board[ii0][jj0]=0;
dd=1;
bb=0;
while ((IsOnBoard(ii0+dd,jj0))&&(bb==0))
{ bb=Board[ii0+dd][jj0];
if (bb*cc<=0)
{ Board[ii0+dd][jj0]=pp;
if (!IsCheck(PiecePosX[tt][0], PiecePosY[tt][0], tt))
{ aa[nna++]=String.fromCharCode(ii0+dd+97)+(jj0+1);
nna-=ddA;
}
Board[ii0+dd][jj0]=bb;
}
dd++;
}
if (dd>1) nna+=ddA;
dd=-1;
bb=0;
while ((IsOnBoard(ii0+dd,jj0))&&(bb==0))
{ bb=Board[ii0+dd][jj0];
if (bb*cc<=0)
{ Board[ii0+dd][jj0]=pp;
if (!IsCheck(PiecePosX[tt][0], PiecePosY[tt][0], tt))
{ aa[nna++]=String.fromCharCode(ii0+dd+97)+(jj0+1);
nna-=ddA;
}
Board[ii0+dd][jj0]=bb;
}
dd--;
}
if (dd<-1) nna+=ddA;
dd=1;
bb=0;
while ((IsOnBoard(ii0,jj0+dd))&&(bb==0))
{ bb=Board[ii0][jj0+dd];
if (bb*cc<=0)
{ Board[ii0][jj0+dd]=pp;
if (!IsCheck(PiecePosX[tt][0], PiecePosY[tt][0], tt))
{ aa[nna++]=String.fromCharCode(ii0+97)+(jj0+dd+1);
nna-=ddA;
}
Board[ii0][jj0+dd]=bb;
}
dd++;
}
if (dd>1) nna+=ddA;
dd=-1;
bb=0;
while ((IsOnBoard(ii0,jj0+dd))&&(bb==0))
{ bb=Board[ii0][jj0+dd];
if (bb*cc<=0)
{ Board[ii0][jj0+dd]=pp;
if (!IsCheck(PiecePosX[tt][0], PiecePosY[tt][0], tt))
{ aa[nna++]=String.fromCharCode(ii0+97)+(jj0+dd+1);
nna-=ddA;
}
Board[ii0][jj0+dd]=bb;
}
dd--;
}
if (dd<-1) nna+=ddA;
Board[ii0][jj0]=pp;
}
if (Math.abs(pp)==1)
{ Board[ii0][jj0]=0;
for (ddi=-1; ddi<=1; ddi++)
{ for (ddj=-1; ddj<=1; ddj++)
{ if (((ddi!=0)||(ddj!=0))&&(IsOnBoard(ii0+ddi, jj0+ddj)))
{ bb=Board[ii0+ddi][jj0+ddj];
if (bb*cc<=0)
{ Board[ii0+ddi][jj0+ddj]=pp;
if (!IsCheck(ii0+ddi, jj0+ddj, tt))
aa[nna++]=String.fromCharCode(ii0+ddi+97)+(jj0+ddj+1);
Board[ii0+ddi][jj0+ddj]=bb;
}
}
}
}
Board[ii0][jj0]=pp;
jj=CanCastleLong();//O-O-O with Chess960 rules
if (jj>=0)
{ Board[ii0][jj0]=0;
Board[PiecePosX[MoveType][jj]][PiecePosY[MoveType][jj]]=0;
Board[2][tt*7]=1-2*tt;
Board[3][tt*7]=3*(1-2*tt);
ddi=ii0;
bb=0;
{ while (ddi>2)
{ bb+=IsCheck(ddi, tt*7, tt);
ddi--;
}
while (ddi<2)
{ bb+=IsCheck(ddi, tt*7, tt);
ddi++;
}
bb+=IsCheck(2, tt*7, tt);
}
bb+=IsCheck(PiecePosX[tt][0], PiecePosY[tt][0], MoveType);
if (bb==0) aa[nna++]=String.fromCharCode(2+97)+(tt*7+1);
Board[2][tt*7]=0;
Board[3][tt*7]=0;
Board[ii0][jj0]=pp;
Board[PiecePosX[tt][jj]][PiecePosY[tt][jj]]=cc*3;
}
jj=CanCastleShort();//O-O with Chess960 rules
if (jj>=0)
{ Board[ii0][jj0]=0;
Board[PiecePosX[MoveType][jj]][PiecePosY[MoveType][jj]]=0;
Board[6][tt*7]=1-2*tt;
Board[5][tt*7]=3*(1-2*tt);
ddi=ii0;
bb=0;
{ while (ddi>6)
{ bb+=IsCheck(ddi, tt*7, tt);
ddi--;
}
while (ddi<6)
{ bb+=IsCheck(ddi, tt*7, tt);
ddi++;
}
bb+=IsCheck(6, tt*7, tt);
}
bb+=IsCheck(PiecePosX[tt][0], PiecePosY[tt][0], MoveType);
if (bb==0) aa[nna++]=String.fromCharCode(6+97)+(tt*7+1);
Board[6][tt*7]=0;
Board[5][tt*7]=0;
Board[ii0][jj0]=pp;
Board[PiecePosX[tt][jj]][PiecePosY[tt][jj]]=cc*3;
}
}
if ((nna>0)&&(ccs!=" "))
{ tt=ccs.charAt(0);
cc=ccs.substr(1,6);
if (tt=="A")
{ bb=tt+String.fromCharCode(ii0+97)+(jj0+1)+aa[0]+cc;
for (jj=1; jj<nna; jj++) bb+=","+tt+String.fromCharCode(ii0+97)+(jj0+1)+aa[jj]+cc;
}
else
{ bb=tt+aa[0]+cc;
for (jj=1; jj<nna; jj++) bb+=","+tt+aa[jj]+cc;
}
ExecCommands(bb,1);
}
else return(aa);
}
function AddBCCmd(nn,bb)
{ var aa, ii, jj, mm, ll, nnn=nn;
if (isDragDrop&&(!bb)) return;
if (!BCCmds)
{ BCCmds="";
if (LastStyle)
BCCmds+=LastStyle.charAt(0)+"last"+LastStyle.substr(1);
if (ThisStyle)
{ if (LastStyle) BCCmds+=",";
BCCmds+=ThisStyle.charAt(0)+"this"+ThisStyle.substr(1);
}
}
aa=BCCmds;
if (isRotated) nnn=63-nn;
ii=nnn%8;
jj=7-(nnn-ii)/8;
mm=String.fromCharCode(ii+97)+eval(jj+1);
if (BCStyle.charAt(0)=="A")
{ ll=BCCmds.indexOf("i0");
if (ll>=0) BCCmds=BCCmds.replace("i0",mm);
else { if (BCCmds) BCCmds+=","; BCCmds+="A"+mm+"i0"+BCStyle.substr(1); }
}
else
{ if (BCCmds) BCCmds+=","
BCCmds+=BCStyle.substr(0,1)+mm+BCStyle.substr(1);
}
if (aa) aa=BCCmds.split(",");
ll=aa.length-1;
for (ii=0;ii<ll; ii++)
{ if (aa[ii]==aa[ll])
{ for (jj=ii+1; jj<ll; jj++) aa[jj-1]=aa[jj];
ll-=2;
ii=ll;
}
}
if (ll<aa.length-1)
{ aa.length=ll+1;
BCCmds=aa.join(",");
}
ExecCommands(BCCmds,1);
}
function UndoBCCmd()
{ if (!BCCmds) return;
var aa=BCCmds.split(",");
var ll=aa.length;
if (ll==1) BCCmds="";
else {aa.length=ll-1; BCCmds=aa.join(","); }
ExecCommands(BCCmds,1);
}
function SetBoardClicked(nn)
{ if (! document.BoardForm) return;
if (! document.images[ImageOffset].style) { BoardClicked=nn; return; }
if (CandidateStyle!="") HighlightCandidates(nn,CandidateStyle);
if (isDragDrop) { BoardClicked=nn; return; }
if (BoardClicked>=0)
{ if (BoardClicked<64)
{ if (isRotated)
document.images[ImageOffset+63-BoardClicked].style.borderColor=BorderColor;
else
document.images[ImageOffset+BoardClicked].style.borderColor=BorderColor;
}
else document.images[ImageOffset+BoardClicked+3].style.borderColor=BorderColor;
}
BoardClicked=nn;
if (BoardClicked>=0)
{ if (BoardClicked<64)
{ if (isRotated)
document.images[ImageOffset+63-BoardClicked].style.borderColor="#FF0000";
else
document.images[ImageOffset+BoardClicked].style.borderColor="#FF0000";
}
else document.images[ImageOffset+BoardClicked+3].style.borderColor="#FF0000";
}
}
function BoardClickMove(nn)
{ var ii0, jj0, ii1, jj1, iiv, jjv, nnn=nn, mm, mmx="", pp=0;
if (BoardClicked>=0) return(false);
if (isRotated) nnn=63-nn;
ii1=nnn%8;
jj1=7-(nnn-ii1)/8;
if (sign(Board[ii1][jj1])==((MoveCount+1)%2)*2-1) return(false);
for (ii0=0; ii0<8; ii0++)
{ for (jj0=0; jj0<8; jj0++)
{ if (sign(Board[ii0][jj0])==((MoveCount+1)%2)*2-1)
{ if (Math.abs(Board[ii0][jj0])==6)
{ mm=String.fromCharCode(ii0+97)+eval(jj0+1);
if (ii0!=ii1) mm+="x";
}
else
{ mm=PieceName.charAt(Math.abs(Board[ii0][jj0])-1)+String.fromCharCode(ii0+97)+eval(jj0+1);
if (Board[ii1][jj1]!=0) mm+="x";
}
mm+=String.fromCharCode(ii1+97)+eval(jj1+1);
if ((jj1==(1-MoveType)*7)&&(Math.abs(Board[ii0][jj0])==6)&&(Math.abs(jj0-jj1)<=1)&&(Math.abs(ii0-ii1)<=1))
{ mm=mm+"="+PieceName.charAt(1);
}
if (ParseMove(mm, false))
{ pp++;
iiv=ii0;
jjv=jj0;
mmx=mm;
}
}
}
}
if ((pp==1)&&((AutoCapture)||(mmx.indexOf("x")<0)))
{ SetBoardClicked(iiv+8*(7-jjv));
BoardClick(nn);
return(true);
}
return(false);
}
function BoardClick(nn,bb)
{ var ii0, jj0, ii1, jj1, mm, nnn, vv, ffull, ssearch, llst, ffst, ttmp, mmove0;
var pp, ffst=0, ssearch, ssub;
if (isSetupBoard) { SetupBoardClick(nn); return; }
if (! isRecording) return;
if (BCStyle) { AddBCCmd(nn,bb); return; }
if (isAutoPlay) SetAutoPlay(false);
if (MoveCount==MaxMove) return;
if (BoardClickMove(nn)) return;
if (isDragDrop&&(!bb)) return;
if (isRotated) nnn=63-nn;
else nnn=nn;
if (BoardClicked==nnn) { SetBoardClicked(-1); return; }
if (BoardClicked<0)
{ ii0=nnn%8;
jj0=7-(nnn-ii0)/8;
if (sign(Board[ii0][jj0])==0) return;
if (sign(Board[ii0][jj0])!=((MoveCount+1)%2)*2-1)
{ mm="---";
if ((document.BoardForm)&&(document.BoardForm.PgnMoveText))
ShortPgnMoveText[0][CurVar]=Uncomment(document.BoardForm.PgnMoveText.value);
ssearch=Math.floor(MoveCount/2+1)+".";
ffst=ShortPgnMoveText[0][CurVar].indexOf(ssearch);
if (ffst>=0)
ssub=ShortPgnMoveText[0][CurVar].substring(0, ffst);
else
ssub=ShortPgnMoveText[0][CurVar];
if (ParseMove(mm, false)==0) { SetBoardClicked(-1); return; }
if (!isNullMove) return;
if (MoveCount%2==0) { if(isNullMove!=2) { if (!confirm("White nullmove?")) return; }}
else { if(isNullMove!=2) {if (!confirm("Black nullmove?")) return; }}
for (vv=CurVar; vv<ShortPgnMoveText[0].length; vv++)
{ if ((vv==CurVar)||((ShortPgnMoveText[1][vv]==CurVar)&&(ShortPgnMoveText[2][vv]==MoveCount)))
{ ffull=Uncomment(ShortPgnMoveText[0][vv]);
ssearch=Math.floor(MoveCount/2+2)+".";
llst=ffull.indexOf(ssearch);
ssearch=Math.floor(MoveCount/2+1)+".";
ffst=ffull.indexOf(ssearch);
if (ffst>=0)
{ ffst+=ssearch.length;
if (llst<0) ttmp=ffull.substring(ffst);
else ttmp=ffull.substring(ffst, llst);
mmove0=GetMove(ttmp,MoveType);
if ((mmove0.indexOf(mm)<0)&&(MoveType==1))
{ ttmp=Math.floor(MoveCount/2+1);
ssearch=ttmp+"....";
ffst=ffull.indexOf(ssearch);
if (ffst<0) { ssearch=ttmp+". ..."; ffst=ffull.indexOf(ssearch); }
if (ffst<0) { ssearch=ttmp+". .."; ffst=ffull.indexOf(ssearch); }
if (ffst<0) { ssearch=ttmp+" ..."; ffst=ffull.indexOf(ssearch); }
if (ffst<0) { ssearch=ttmp+"..."; ffst=ffull.indexOf(ssearch); }
if (ffst<0) { ssearch=ttmp+" .."; ffst=ffull.indexOf(ssearch); }
if (ffst>=0)
{ ffst+=ssearch.length;
if (llst<0) ttmp=ffull.substring(ffst);
else ttmp=ffull.substring(ffst, llst);
mmove0=GetMove(ttmp,0);
}
}
if (mmove0.indexOf(mm)==0)
{ SetMove(MoveCount+1, vv);
vv=ShortPgnMoveText[0].length+1;
if (window.UserMove) setTimeout("UserMove(1,'"+mmove0+"')",Delay/2);
}
}
}
}
if (vv<ShortPgnMoveText[0].length+1)
{ if ((RecordCount==0)&&(!((document.BoardForm)&&(document.BoardForm.PgnMoveText))))
{ vv=ShortPgnMoveText[0].length;
ShortPgnMoveText[0][vv]="";
ShortPgnMoveText[1][vv]=CurVar;
ShortPgnMoveText[2][vv]=MoveCount;
CurVar=vv;
}
ParseMove(mm,true);
if (window.UserMove) setTimeout("UserMove(0,'"+mm+"')",Delay/2);
if (MoveType==0)
{ HistMove[MoveCount-StartMove]=Math.floor((MoveCount+2)/2)+"."+mm;
ssub+=Math.floor((MoveCount+2)/2)+".";
}
else
{ HistMove[MoveCount-StartMove]=Math.floor((MoveCount+2)/2)+". ... "+mm;
if (MoveCount==StartMove) ssub+=Math.floor((MoveCount+2)/2)+". ... ";
else ssub+=HistMove[MoveCount-StartMove-1]+" ";
}
if (RecordCount==0) RecordedMoves=HistMove[MoveCount-StartMove];
else
{ ttmp=RecordedMoves.split(" ");
ttmp.length=RecordCount+((MoveCount-RecordCount)%2)*2;
RecordedMoves=ttmp.join(" ");
if (MoveType==0) RecordedMoves+=" "+HistMove[MoveCount-StartMove];
else RecordedMoves+=" "+mm;
}
RecordCount++;
MoveCount++;
MoveType=1-MoveType;
if (document.BoardForm)
{ if (document.BoardForm.PgnMoveText) document.BoardForm.PgnMoveText.value=ssub+mm+" ";
if (document.BoardForm.Position)
document.BoardForm.Position.value=TransformSAN(HistMove[MoveCount-StartMove-1]);
if (nAudio) PlayAudio(HistMove[MoveCount-StartMove-1],0);
NewCommands.length=0;
if (LastStyle) NewCommands[NewCommands.length]=LastStyle.charAt(0)+"last"+LastStyle.substr(1);
if (ThisStyle) NewCommands[NewCommands.length]=ThisStyle.charAt(0)+"this"+ThisStyle.substr(1);
ExecCommands();
RefreshBoard();
}
}
}
SetBoardClicked(nnn);
return;
}
ii0=BoardClicked%8;
jj0=7-(BoardClicked-ii0)/8;
ii1=nnn%8;
jj1=7-(nnn-ii1)/8;
if (Math.abs(Board[ii0][jj0])==6)
{ if (ii0!=ii1) mm=String.fromCharCode(ii0+97)+"x";
else mm="";
}
else
{ mm=PieceName.charAt(Math.abs(Board[ii0][jj0])-1);
if (Board[ii1][jj1]!=0) mm+="x";
}
SetBoardClicked(-1);
mm+=String.fromCharCode(ii1+97)+eval(jj1+1);
if (Math.abs(Board[ii0][jj0])==1)
{ if (PiecePosY[MoveType][0]==jj1)
{ if (PiecePosX[MoveType][0]+2==ii1) mm="O-O";
if (PiecePosX[MoveType][0]-2==ii1) mm="O-O-O";
if (Board[ii1][jj1]==(1-2*MoveType)*3) //for Chess960
{ if (ii1>ii0) mm="O-O";
if (ii1<ii0) mm="O-O-O";
}
}
}
if ((document.BoardForm)&&(document.BoardForm.PgnMoveText))
ShortPgnMoveText[0][CurVar]=Uncomment(document.BoardForm.PgnMoveText.value);
ssearch=Math.floor(MoveCount/2+1)+".";
ffst=ShortPgnMoveText[0][CurVar].indexOf(ssearch);
if (ffst>=0)
ssub=ShortPgnMoveText[0][CurVar].substring(0, ffst);
else
ssub=ShortPgnMoveText[0][CurVar];
if ((jj1==(1-MoveType)*7)&&(Math.abs(Board[ii0][jj0])==6)&&(Math.abs(jj0-jj1)<=1)&&(Math.abs(ii0-ii1)<=1))
{ pp=0;
while(pp==0)
{ if (pp==0) { if (confirm("Queen "+PieceName.charAt(1)+" ?")) pp=1; }
if (pp==0) { if (confirm("Rook "+PieceName.charAt(2)+" ?")) pp=2; }
if (pp==0) { if (confirm("Bishop "+PieceName.charAt(3)+" ?")) pp=3; }
if (pp==0) { if (confirm("Knight "+PieceName.charAt(4)+" ?")) pp=4; }
}
mm=mm+"="+PieceName.charAt(pp);
}
pp=ParseMove(mm, false);
if (pp==0) return;
if (Math.abs(Board[ii0][jj0])!=1)
{ var mmm;
if (Math.abs(Board[ii0][jj0])==6)
{ if (mm.charAt(1)=="x") mmm=mm.substr(0,1)+eval(jj0+1)+mm.substr(1,11);
else mmm=String.fromCharCode(ii0+97)+eval(jj0+1)+mm;
}
else mmm=mm.substr(0,1)+String.fromCharCode(ii0+97)+eval(jj0+1)+mm.substr(1,11);
if (ParseMove(mmm, false)==0) return;
}
if (pp>1)
{ mm=mm.substr(0,1)+String.fromCharCode(ii0+97)+mm.substr(1,11);
if (ParseMove(mm, false)!=1)
{ mm=mm.substr(0,1)+eval(jj0+1)+mm.substr(2,11);
if (ParseMove(mm, false)!=1)
mm=mm.substr(0,1)+String.fromCharCode(ii0+97)+eval(jj0+1)+mm.substr(2,11);
}
}
for (vv=CurVar; vv<ShortPgnMoveText[0].length; vv++)
{ if ((vv==CurVar)||((ShortPgnMoveText[1][vv]==CurVar)&&(ShortPgnMoveText[2][vv]==MoveCount)))
{ ffull=Uncomment(ShortPgnMoveText[0][vv]);
ssearch=Math.floor(MoveCount/2+2)+".";
llst=ffull.indexOf(ssearch);
ssearch=Math.floor(MoveCount/2+1)+".";
ffst=ffull.indexOf(ssearch);
if (ffst>=0)
{ ffst+=ssearch.length;
if (llst<0)
ttmp=ffull.substring(ffst);
else
ttmp=ffull.substring(ffst, llst);
mmove0=GetMove(ttmp,MoveType);
if ((mmove0.indexOf(mm)<0)&&(MoveType==1))
{ ttmp=Math.floor(MoveCount/2+1);
ssearch=ttmp+"....";
ffst=ffull.indexOf(ssearch);
if (ffst<0) { ssearch=ttmp+". ..."; ffst=ffull.indexOf(ssearch); }
if (ffst<0) { ssearch=ttmp+". .."; ffst=ffull.indexOf(ssearch); }
if (ffst<0) { ssearch=ttmp+" ..."; ffst=ffull.indexOf(ssearch); }
if (ffst<0) { ssearch=ttmp+"..."; ffst=ffull.indexOf(ssearch); }
if (ffst<0) { ssearch=ttmp+" .."; ffst=ffull.indexOf(ssearch); }
if (ffst>=0)
{ ffst+=ssearch.length;
if (llst<0) ttmp=ffull.substring(ffst);
else ttmp=ffull.substring(ffst, llst);
mmove0=GetMove(ttmp,0);
}
}
if ((mmove0.indexOf(mm)==0)&&(mmove0.indexOf(mm+mm.substr(1))!=0))
{ SetMove(MoveCount+1, vv);
if (window.UserMove) setTimeout("UserMove(1,'"+mmove0+"')",Delay/2);
return;
}
}
}
}
if ((RecordCount==0)&&(!((document.BoardForm)&&(document.BoardForm.PgnMoveText))))
{ vv=ShortPgnMoveText[0].length;
ShortPgnMoveText[0][vv]="";
ShortPgnMoveText[1][vv]=CurVar;
ShortPgnMoveText[2][vv]=MoveCount;
CurVar=vv;
}
ParseMove(mm,true);
if (IsCheck(PiecePosX[1-MoveType][0], PiecePosY[1-MoveType][0], 1-MoveType)) mm+="+";
if (window.UserMove) setTimeout("UserMove(0,'"+mm+"')",Delay/2);
if (MoveType==0)
{ HistMove[MoveCount-StartMove]=Math.floor((MoveCount+2)/2)+"."+mm;
ssub+=Math.floor((MoveCount+2)/2)+".";
}
else
{ HistMove[MoveCount-StartMove]=Math.floor((MoveCount+2)/2)+". ... "+mm;
if (MoveCount==StartMove) ssub+=Math.floor((MoveCount+2)/2)+". ... ";
else ssub+=HistMove[MoveCount-StartMove-1]+" ";
}
if (RecordCount==0) RecordedMoves=HistMove[MoveCount-StartMove];
else
{ ttmp=RecordedMoves.split(" ");
ttmp.length=RecordCount+((MoveCount-RecordCount)%2)*2;
RecordedMoves=ttmp.join(" ");
if (MoveType==0) RecordedMoves+=" "+HistMove[MoveCount-StartMove];
else RecordedMoves+=" "+mm;
}
RecordCount++;
MoveCount++;
MoveType=1-MoveType;
if (document.BoardForm)
{ if (document.BoardForm.PgnMoveText) document.BoardForm.PgnMoveText.value=ssub+mm+" ";
if (document.BoardForm.Position)
document.BoardForm.Position.value=TransformSAN(HistMove[MoveCount-StartMove-1]);
if (nAudio) PlayAudio(HistMove[MoveCount-StartMove-1],0);
NewCommands.length=0;
if (LastStyle) NewCommands[NewCommands.length]=LastStyle.charAt(0)+"last"+LastStyle.substr(1);
if (ThisStyle) NewCommands[NewCommands.length]=ThisStyle.charAt(0)+"this"+ThisStyle.substr(1);
ExecCommands();
RefreshBoard();
}
}
function SwitchAutoPlay()
{ if (isAutoPlay) SetAutoPlay(false);
else SetAutoPlay(true);
}
function SetAutoPlay(bb)
{ isAutoPlay=bb;
if (AutoPlayInterval) clearTimeout(AutoPlayInterval);
if (isAutoPlay)
{ if ((document.BoardForm)&&(document.BoardForm.AutoPlay))
document.BoardForm.AutoPlay.value="stop";
MoveForward(1);
}
else
{ if ((document.BoardForm)&&(document.BoardForm.AutoPlay))
document.BoardForm.AutoPlay.value="play";
}
}
function SetDelay(vv)
{ Delay=vv;
}
function RotateBoard(bb)
{ SetBoardClicked(-1);
var ii, cc=new Array();
for (ii=0; ii<OldCommands.length; ii++) cc[ii]=OldCommands[ii];
NewCommands.length=0;
ExecCommands();
isRotated=bb;
if ((document.BoardForm)&&(document.BoardForm.Rotated))
document.BoardForm.Rotated.checked=bb;
RefreshBoard();
for (ii=0; ii<cc.length; ii++) NewCommands[ii]=cc[ii];
if (LastStyle) NewCommands[NewCommands.length]=LastStyle.charAt(0)+"last"+LastStyle.substr(1);
if (ThisStyle) NewCommands[NewCommands.length]=ThisStyle.charAt(0)+"this"+ThisStyle.substr(1);
ExecCommands();
}
function AllowRecording(bb)
{ if ((document.BoardForm)&&(document.BoardForm.Recording))
document.BoardForm.Recording.checked=bb;
isRecording=bb;
SetBoardClicked(-1);
}
function AllowNullMove(bb)
{ isNullMove=bb;
}
function ShowCapturedPieces(bb)
{ isCapturedPieces=bb;
if (isCapturedPieces) RefreshBoard();
else
{ var kk, kk0=0;
if (document.images["RightLabels"]) kk0++;
for (kk=0; kk<32; kk++) SetImg(64+kk0+kk,LabelPic[4]);
if ((parent)&&(parent.ChangeColWidth)) parent.ChangeColWidth(0);
}
}
function Is3FoldRepetition()
{ if (MoveCount<8) return(false);
var ss=GetFENList();
ss=ss.split("\n");
var ii, jj, kk=0, ll=ss.length-1;
var tt=new Array(ll+1);
for (ii=0; ii<=ll; ii++) tt[ii]=ss[ii].split(" ");
for (ii=ll-2; ii>=0; ii-=2)
{ if ((tt[ii][0]==tt[ll][0])&&(tt[ii][2]==tt[ll][2]))
{ kk++;
jj=ii;
}
}
if (kk<2) return(false);
if (kk>3) return(true);
ii=tt[jj][3];
if (ii=="-") return(true);
ss=tt[jj][0].split("/");
if (ii.indexOf("3")>0)
{ jj=ii.charCodeAt(0)-97;
kk=0;
for (ii=0; ii<ss[4].length; ii++)
{ if (ss[4].charAt(ii)=="p")
{ if (Math.abs(kk-jj)==1) return(false);
kk++;
}
else
{ if (isNaN(ss[4].charAt(ii))) kk++;
else kk+=parseInt(ss[4].charAt(ii));
}
}
}
if (ii.indexOf("6")>0)
{ jj=ii.charCodeAt(0)-97;
kk=0;
for (ii=0; ii<ss[3].length; ii++)
{ if (ss[3].charAt(ii)=="P")
{ if (Math.abs(kk-jj)==1) return(false);
kk++;
}
else
{ if (isNaN(ss[3].charAt(ii))) kk++;
else kk+=parseInt(ss[3].charAt(ii));
}
}
}
return(true);
}
function IsInsufficientMaterial()
{ var ss=GetFEN(true);
if (ss.indexOf("Q")>=0) return(false);
if (ss.indexOf("q")>=0) return(false);
if (ss.indexOf("R")>=0) return(false);
if (ss.indexOf("r")>=0) return(false);
if (ss.indexOf("P")>=0) return(false);
if (ss.indexOf("p")>=0) return(false);
var ii_B=false, ii_b=false, ii_N=false, ii_n=false;
if (ss.indexOf("B")>=0) ii_B=true;
if (ss.indexOf("b")>=0) ii_b=true;
if (ss.indexOf("N")>=0) ii_N=true;
if (ss.indexOf("n")>=0) ii_n=true;
if ((!ii_B)&&(!ii_b)&&(!ii_N)&&(!ii_n)) return(true);
if ((ii_N)&&(ii_B)&&(!ii_n)&&(!ii_b)) return(false);
if ((ii_n)&&(ii_b)&&(!ii_N)&&(!ii_B)) return(false);
if (ii_N)
{ if ((ii_n)||(ii_b)) return(false);
else return(true);
}
if (ii_n)
{ if ((ii_N)||(ii_B)) return(false);
else return(true);
}
var ii, jj, ww=0, bb=0;
for (ii=0; ii<8; ii++)
{ for (jj=0; jj<8; jj++)
{ if (Math.abs(Board[ii][jj])==4)
{ if ((ii+jj)%2==0) ww++;
else bb++;
}
}
}
if ((ww>0)&&(bb>0)) return(false);
return(true);
}
function IsMate()
{ var aa, ii0, jj0, nn=0, ii=IsCheck(PiecePosX[MoveType][0], PiecePosY[MoveType][0], MoveType);
for (ii0=0; (nn==0)&&(ii0<8); ii0++)
{ for (jj0=0; (nn==0)&&(jj0<8); jj0++)
{ if (sign(Board[ii0][jj0])==((MoveCount+1)%2)*2-1)
{ nn=(7-jj0)*8+ii0;
aa=HighlightCandidates(nn," ");
if (aa.length>0) nn=aa[0];
else nn=0;
}
}
}
if (nn==0)
{ if(ii) return("Checkmate.");
else return("Stalemate.");
}
return(false);
}
function IsDraw()
{ ff=GetFEN().split(" ");
if (parseInt(ff[4])>=100) return("Draw by 50 move rule.");
if (Is3FoldRepetition()) return("Draw by 3-fold repetition.");
if (IsInsufficientMaterial()) return("Draw by insufficient material.");
return(false);
}
function SetPgnMoveText(ss, vvariant, rroot, sstart)
{ if ((document.BoardForm)&&(document.BoardForm.PgnMoveText))
document.BoardForm.PgnMoveText.value=ss;
if (vvariant)
{ ShortPgnMoveText[0][vvariant]=ss;
ShortPgnMoveText[1][vvariant]=rroot;
ShortPgnMoveText[2][vvariant]=sstart;
}
else ShortPgnMoveText[0][0]=ss;
}
function ApplySAN(ss)
{ if (ss.length<6)
{ PieceName = "KQRBNP";
if ((document.BoardForm)&&(document.BoardForm.SAN))
document.BoardForm.SAN.value=PieceName;
}
else
{ PieceName = ss;
if ((document.BoardForm)&&(document.BoardForm.SAN))
document.BoardForm.SAN.value=ss;
}
for (var ii=0; ii<6; ii++) PieceCode[ii]=PieceName.charCodeAt(ii);
}
function ShowSAN(ss)
{ ShowPieceName=ss;
if (ss.length!=6) ShowPieceName="";
if ((ShowPieceName=="")||(ShowPieceName==PieceName)||(ShowPieceName=="Figure")) return;
if ((document.BoardForm)&&(document.BoardForm.PgnMoveText))
{ var tt=document.BoardForm.PgnMoveText.value;
if (tt=="") return;
var ww=window.open("", "", "width=600, height=400, menubar=no, locationbar=no, resizable=yes, status=no, scrollbars=yes");
ww.document.open();
ww.document.writeln("<HTML><HEAD></HEAD><BODY>"+TransformSAN(tt)+"</BODY></HTML>");
ww.document.close();
}
}
function TransformSAN(ss)
{ if (ss=="") return("");
if ((ShowPieceName=="")||(ShowPieceName==PieceName)||(ShowPieceName=="Figure")) return(ss);
var jj, rr, tt="";
for (jj=0; jj<ss.length; jj++)
{ rr=PieceName.indexOf(ss.charAt(jj));
if (rr>=0) tt+=ShowPieceName.charAt(rr);
else tt+=ss.charAt(jj);
}
return(tt);
}
function TransformFigureSAN(ss)
{ if (ss=="") return("");
var jj, rr, tt="";
for (jj=0; jj<ss.length; jj++)
{ rr=PieceName.indexOf(ss.charAt(jj));
if (rr>=0)
tt+="<big>&#"+(9812+rr)+";</big>";
else tt+=ss.charAt(jj);
}
return(tt);
}
function ApplyFEN(ss)
{ if (ss.length==0)
{ FenString = StandardFen;
if ((document.BoardForm)&&(document.BoardForm.FEN))
document.BoardForm.FEN.value=FenString;
}
else
{ FenString = ss;
if ((document.BoardForm)&&(document.BoardForm.FEN))
document.BoardForm.FEN.value=ss;
}
}
function GetFEN(sshort)
{ var ii, jj, ee, ss="";
for (jj=7; jj>=0; jj--)
{ ee=0;
for (ii=0; ii<8; ii++)
{ if (Board[ii][jj]==0) ee++;
else
{ if (ee>0)
{ ss=ss+""+ee;
ee=0;
}
if (Board[ii][jj]>0)
ss=ss+PieceName.toUpperCase().charAt(Board[ii][jj]-1);
else
ss=ss+PieceName.toLowerCase().charAt(-Board[ii][jj]-1);
}
}
if (ee>0) ss=ss+""+ee;
if (jj>0) ss=ss+"/";
}
if (sshort) return(ss);
if (MoveType==0) ss=ss+" w";
else ss=ss+" b";
ee="";
if ((Castling[0][0]>0)&&(PieceMoves[0][0]==0))
{ for (ii=0; ii<16; ii++)
{ if ((PieceType[0][ii]==2)&&(PiecePosX[0][ii]==7)&&(PiecePosY[0][ii]==0)&&(PieceMoves[0][ii]==0))
ee=ee+PieceName.toUpperCase().charAt(0);
}
}
if ((Castling[0][1]>0)&&(PieceMoves[0][0]==0))
{ for (ii=0; ii<16; ii++)
{ if ((PieceType[0][ii]==2)&&(PiecePosX[0][ii]==0)&&(PiecePosY[0][ii]==0)&&(PieceMoves[0][ii]==0))
ee=ee+PieceName.toUpperCase().charAt(1);
}
}
if ((Castling[1][0]>0)&&(PieceMoves[1][0]==0))
{ for (ii=0; ii<16; ii++)
{ if ((PieceType[1][ii]==2)&&(PiecePosX[1][ii]==7)&&(PiecePosY[1][ii]==7)&&(PieceMoves[1][ii]==0))
ee=ee+PieceName.toLowerCase().charAt(0);
}
}
if ((Castling[1][1]>0)&&(PieceMoves[1][0]==0))
{ for (ii=0; ii<16; ii++)
{ if ((PieceType[1][ii]==2)&&(PiecePosX[1][ii]==0)&&(PiecePosY[1][ii]==7)&&(PieceMoves[1][ii]==0))
ee=ee+PieceName.toLowerCase().charAt(1);
}
}
if (ee=="") ss=ss+" -";
else ss=ss+" "+ee;
if (MoveCount>StartMove)
{ CanPass=-1;
ii=HistPiece[0][MoveCount-StartMove-1];
if ((HistType[0][MoveCount-StartMove-1]==5)&&(Math.abs(HistPosY[0][MoveCount-StartMove-1]-PiecePosY[1-MoveType][ii])==2))
CanPass=PiecePosX[1-MoveType][ii];
}
else
CanPass=EnPass;
if (CanPass>=0)
{ ss=ss+" "+String.fromCharCode(97+CanPass);
if (MoveType==0) ss=ss+"6";
else ss=ss+"3";
}
else ss=ss+" -";
ss=ss+" "+HalfMove[MoveCount-StartMove];
ss=ss+" "+Math.floor((MoveCount+2)/2);
if ((document.BoardForm)&&(document.BoardForm.FEN))
document.BoardForm.FEN.value=ss;
return(ss);
}
function GetFENList(sshort)
{ var mmove=MoveCount, vvariant=CurVar, nn=0;
var ff, ff_new, ff_old;
isCalculating=true;
ff=GetFEN(sshort);
ff_new=ff;
do
{ ff_old=ff_new;
MoveBack(1);
ff_new=GetFEN(sshort);
if (ff_old!=ff_new) { ff=ff_new+"\n"+ff; nn++ }
}
while (ff_old!=ff_new);
isCalculating=false;
if (vvariant==0)
{ if (nn>0) MoveForward(nn); }
else SetMove(mmove, vvariant);
return(ff);
}
function ShowFENList()
{ var ww=window.open("", "", "width=600, height=400, menubar=no, locationbar=no, resizable=yes, status=no, scrollbars=yes");
ww.document.open();
ww.document.writeln("<HTML><HEAD></HEAD><BODY><PRE>"+GetFENList()+"</PRE></BODY></HTML>");
ww.document.close();
}
function MakePuzzle()
{ var ii, nn=0, ff, ff_old="", mm="", tt="", pp="", oo, aa="";
if (!document.BoardForm) return;
isCalculating=true;
if (document.BoardForm.FEN) ff_old=document.BoardForm.FEN.value;
ff=GetFEN();
if (document.BoardForm.PgnMoveText) mm=document.BoardForm.PgnMoveText.value;
if (document.BoardForm.HeaderText) tt=document.BoardForm.HeaderText.value;
if (document.BoardForm.EmailBlog) { if (document.BoardForm.EmailBlog.checked) pp=ScriptPath; }
ii=Math.floor(MoveCount/2+1)+".";
nn=mm.indexOf(ii);
if (nn>=0)
{ mm=mm.substr(nn);
if (MoveCount%2!=0)
{ mm=mm.substr(ii.length);
while ((mm!="")&&(mm.charAt(0)==" ")) mm=mm.substr(1);
nn=mm.indexOf(" ");
if (nn>0) mm=ii+" ..."+mm.substr(nn);
}
}
if (document.BoardForm.FEN) document.BoardForm.FEN.value=ff_old;
isCalculating=false;
var ww=window.open("", "", "width=600, height=400, menubar=no, locationbar=no, resizable=yes, status=no, scrollbars=yes");
ww.document.open();
ww.document.writeln('<HTML><HEAD></HEAD><BODY>');
ww.document.writeln(tt+"<BR><BR>");
ww.document.writeln('[FEN "'+ff+'"]<BR><BR>'+mm+'<BR><BR>');
ff_old=ff.split(" ");
while (ff.indexOf("/")>0) ff=ff.replace("/","|");
while (tt.indexOf("/")>0) tt=tt.replace("/","|");
while (mm.indexOf("#")>0) mm=mm.replace("#","++");
nn=pp+'problemboard.html?Init='+ff+'&ApplyPgnMoveText='+mm;
oo=document.BoardForm.ImagePath;
if (oo)
{ aa=oo.options[oo.options.selectedIndex].value;
if (aa) aa="&SetImagePath="+aa;
else aa="";
}
oo=document.BoardForm.BGColor;
if (oo)
{ for (ii=0; ii<oo.length; ii++)
{ if (oo[ii].checked) aa="&SetBGColor="+oo[ii].value+aa;
}
}
oo=document.BoardForm.Border;
if (oo)
{ if (oo.options.selectedIndex>0) aa=aa+"&SetBorder=1";
}
if (isDragDrop) aa+='&SetDragDrop=1';
if (isRotated) aa+='&RotateBoard=1';
if ((ShowPieceName!="")&&(ShowPieceName!=PieceName)) aa+='&ShowSAN='+ShowPieceName;
if (tt!="") tt='&AddText='+tt;
ww.document.writeln('<a href="'+nn+aa+tt+'"');
while (tt.indexOf("<")>0) tt=tt.replace("<","&lt;");
while (tt.indexOf(">")>0) tt=tt.replace(">","&gt;");
ww.document.writeln('>'+nn+aa+tt+'</a>');
if (MoveCount>2)
{ ff=ff_old[0]+" "+ff_old[1]+" "+ff_old[2]+" "+ff_old[3]+" 0 1";
ii=Math.floor(MoveCount/2+1);
nn=ii+1;
while (mm.indexOf(nn+".")>=0) nn++;
while (nn>ii)
{ nn--;
while (mm.indexOf(nn+".")>=0) mm=mm.replace(nn+".",(nn-ii+1)+".");
}
ww.document.writeln('<BR><BR><HR><BR>');
ww.document.writeln('[FEN "'+ff+'"]<BR><BR>'+mm+'<BR><BR>');
while (ff.indexOf("/")>0) ff=ff.replace("/","|");
nn=pp+'problemboard.html?Init='+ff+'&ApplyPgnMoveText='+mm;
if (tt!="") tt='&AddText='+tt;
ww.document.writeln('<a href="'+nn+aa+tt+'"');
while (tt.indexOf("<")>0) tt=tt.replace("<","&lt;");
while (tt.indexOf(">")>0) tt=tt.replace(">","&gt;");
ww.document.writeln('>'+nn+aa+tt+'</a>');
}
ww.document.writeln('</BODY></HTML>');
ww.document.close();
}
function MakeGamelink()
{ var nn=0, ff, mm="", tt="", pp="", oo, aa="";
if (!document.BoardForm) return;
if (document.BoardForm.FEN) ff=document.BoardForm.FEN.value;
if (ff==StandardFen) ff="";
if (document.BoardForm.PgnMoveText) mm=document.BoardForm.PgnMoveText.value;
if (document.BoardForm.HeaderText) tt=document.BoardForm.HeaderText.value;
if (document.BoardForm.EmailBlog) { if (document.BoardForm.EmailBlog.checked) pp=ScriptPath; }
var ww=window.open("", "", "width=600, height=400, menubar=no, locationbar=no, resizable=yes, status=no, scrollbars=yes");
ww.document.open();
ww.document.writeln('<HTML><HEAD></HEAD><BODY>');
ww.document.writeln(tt);
ww.document.writeln(mm);
ww.document.writeln('<BR><BR>');
while (ff.indexOf("/")>0) ff=ff.replace("/","|");
while (tt.indexOf("/")>0) tt=tt.replace("/","|");
while (mm.indexOf("#")>0) mm=mm.replace("#","++");
nn=pp+"ltpgnboard.html?Init="+ff+"&ApplyPgnMoveText="+mm;
oo=document.BoardForm.ImagePath;
if (oo)
{ aa=oo.options[oo.options.selectedIndex].value;
if (aa) aa="&SetImagePath="+aa;
else aa="";
}
if (ThisStyle) aa+='&SetThisStyle='+ThisStyle;
oo=document.BoardForm.BGColor;
if (oo)
{ for (ii=0; ii<oo.length; ii++)
{ if (oo[ii].checked) aa="&SetBGColor="+oo[ii].value+aa;
}
}
oo=document.BoardForm.Border;
if (oo)
{ if (oo.options.selectedIndex>0) aa=aa+"&SetBorder=1";
}
if (isDragDrop) aa+='&SetDragDrop=1';
if (isRotated) aa+='&RotateBoard=1';
if ((ShowPieceName!="")&&(ShowPieceName!=PieceName)) aa+='&ShowSAN='+ShowPieceName;
mm="&eval=AddText(unescape(%22"+escape("<|td><td>"+tt)+"%22)+GetHTMLMoveText(0,0,1))";
ww.document.writeln('<a href="'+nn+aa+mm+'"');
mm="&eval=AddText(%22<|td><td>"+tt+"%22+GetHTMLMoveText(0,0,1))";
while (mm.indexOf("<")>0) mm=mm.replace("<","&lt;");
while (mm.indexOf(">")>0) mm=mm.replace(">","&gt;");
ww.document.writeln('>'+nn+aa+mm+'</a>');
ww.document.writeln('</BODY></HTML>');
ww.document.close();
}
function SetTitle(tt)
{ top.document.title=tt;
}
function AddText(tt)
{ document.writeln(tt);
}
function EvalUrlString(ss)
{ var ii, jj, aa, uurl = window.location.search;
if (uurl != "")
{ uurl = uurl.substring(1, uurl.length);
while (uurl.indexOf("|")>0) uurl=uurl.replace("|","/");
while (uurl.indexOf("%7C")>0) uurl=uurl.replace("%7C","/");
var llist = uurl.split("&");
for (ii=0; ii<llist.length; ii++)
{ tt = llist[ii].split("=");
aa=tt[1];
for (jj=2; jj<tt.length; jj++) aa+="="+tt[jj];
if (ss)
{ if (ss==tt[0]) eval(tt[0]+"('"+unescape(aa)+"')");
}
else
{ if(eval("window."+tt[0])) eval(tt[0]+"('"+unescape(aa)+"')");
}
}
}
}
function OpenGame(nn)
{ if (parent.frames[1])
{ if ((parent.frames[1].OpenGame)&&
(parent.frames[1].document.forms[0])&&
(parent.frames[1].document.forms[0].GameList))
{ parent.frames[1].OpenGame(nn);
return;
}
}
setTimeout('OpenGame('+nn+')',400);
}
function SetMove(mmove, vvariant)
{ if (isNaN(mmove)) return;
var ii=isCalculating;
isCalculating=true;
if (RecordCount>0) MoveBack(MaxMove);
if (vvariant)
{ if (vvariant>=ShortPgnMoveText[0].length) { isCalculating=ii; return; }
if (CurVar!=vvariant)
{ SetMove(ShortPgnMoveText[2][vvariant], ShortPgnMoveText[1][vvariant]);
CurVar=vvariant;
}
}
else
{ while (CurVar!=0)
{ if (MoveCount==ShortPgnMoveText[2][CurVar])
{ CurVar=ShortPgnMoveText[1][CurVar];
if ((!isCalculating)&&(document.BoardForm)&&(document.BoardForm.PgnMoveText))
document.BoardForm.PgnMoveText.value=ShortPgnMoveText[0][CurVar];
}
else MoveBack(1);
}
}
isCalculating=ii;
var dd=mmove-MoveCount;
if (dd<=0) MoveBack(-dd);
else MoveForward(dd, 1);
if (isCalculating) return;
if ((document.BoardForm)&&(document.BoardForm.PgnMoveText))
document.BoardForm.PgnMoveText.value=ShortPgnMoveText[0][CurVar];
if (AutoPlayInterval) clearTimeout(AutoPlayInterval);
if (isAutoPlay) AutoPlayInterval=setTimeout("MoveForward(1)", Delay);
}
function ApplyPgnMoveText(ss, rroot, ddocument, ggame)
{ var vv=0;
if (! isNaN(rroot))
{ vv=ShortPgnMoveText[0].length;
ShortPgnMoveText[0][vv]="";
}
else
{ ShortPgnMoveText[0].length=1;
if (ddocument) TargetDocument=ddocument;
else TargetDocument=window.document;
if (rroot) activeAnchorBG=rroot;
if (ggame) startAnchor=ggame;
else startAnchor=-1;
}
var ii, uu="", uuu="", cc, bb=0, bbb=0, ll=ss.length;
for (ii=0; ii<ll; ii++)
{ cc=ss.substr(ii,1);
if (cc=="{") bbb++;
if (cc=="}") bbb--;
if (((cc==")")||(cc=="]"))&&(bbb==0))
{ bb--;
if (bb==0)
{ if (bbb==0) uu+=ApplyPgnMoveText(uuu, vv);
else uu+=uuu;
uuu="";
}
}
if (bb==0) uu+=cc;
else uuu+=cc;
if (((cc=="(")||(cc=="["))&&(bbb==0)) bb++;
}
if (! isNaN(rroot))
{ ii=0, jj=0, bb=0;
var uuc=Uncomment(uu);
while ((ii<uuc.length-1)&&(((ii>0)&&(uuc.charAt(ii-1)!=" "))||(isNaN(parseInt(uuc.charAt(ii)))))) ii++;
while ((ii<uuc.length-1)&&(! isNaN(parseInt(uuc.charAt(ii))))) { bb=10*bb+parseInt(uuc.charAt(ii)); ii++; }
if (ii<uuc.length-1)
{ uuu=uuc.substr(ii, 3);
switch (uuu)
{ case "...": jj=1; break;
case " ..": jj=1; break;
}
if (jj==0)
{ uuu=uuc.substr(ii, 4);
switch (uuu)
{ case "....": jj=1; break;
case ". ..": jj=1; break;
case " ...": jj=1; break;
}
}
if (jj==0)
{ uuu=uuc.substr(ii, 5);
if (uuu==". ...") jj=1;
}
}
bb=2*(bb-1)+jj;
//if (bb<0) bb=MoveCount;
SetPgnMoveText(uu, vv, rroot, bb);
}
else SetPgnMoveText(uu);
return(vv);
}
function GetHTMLMoveText(vvariant, nnoscript, ccommenttype, sscoresheet)
{ var vv=0, tt, ii, uu="", uuu="", cc, bb=0, bbb=0;
var ss="", sstart=0, nn=MaxMove, ffst=0,llst,ssearch,ssub,ffull,mmove0="",mmove1="", gg="";
if (sscoresheet) Annotation.length=0;
if (startAnchor!=-1) gg=",'"+startAnchor+"'";
isCalculating=true;
if (vvariant)
{ vv=vvariant;
if (! isNaN(ShortPgnMoveText[0][vv]))
{ SetMove(ShortPgnMoveText[0][vv], ShortPgnMoveText[1][vv]);
if (MoveCount!=ShortPgnMoveText[0][vv]) return("("+ShortPgnMoveText[0][vv]+")");
//CurVar=ShortPgnMoveText[1][vv];
if (ShortPgnMoveText[0][vv].indexOf(".0")>0) return(GetDiagram(1));
return(GetDiagram());
}
if (ShortPgnMoveText[2][vv]<0) return(ShortPgnMoveText[0][vv]);
SetMove(ShortPgnMoveText[2][vv], ShortPgnMoveText[1][vv]);
if (MoveCount!=ShortPgnMoveText[2][vv]) return(ShortPgnMoveText[0][vv]);
CurVar=vvariant;
}
else MoveBack(MaxMove);
tt=ShortPgnMoveText[0][vv];
ffull=Uncomment(ShortPgnMoveText[0][CurVar]);
for (ii=0; (ii<nn)&&(ffst>=0)&&(MoveCount<MaxMove); ii++)
{ ssearch=Math.floor(MoveCount/2+2)+".";
llst=ffull.indexOf(ssearch);
ssearch=Math.floor(MoveCount/2+1)+".";
ffst=ffull.indexOf(ssearch);
mmove1=""
if (ffst>=0)
{ ffst+=ssearch.length;
if (llst<0)
ssub=ffull.substring(ffst);
else
ssub=ffull.substring(ffst, llst);
mmove0=GetMove(ssub,MoveType);
if (mmove0!="")
{ if (ParseMove(mmove0, true)>0)
{ mmove1=mmove0;
if (MoveType==0)
HistMove[MoveCount-StartMove]=Math.floor((MoveCount+2)/2)+"."+mmove1;
else
HistMove[MoveCount-StartMove]=Math.floor((MoveCount+2)/2)+". ... "+mmove1;
HistCommand[MoveCount-StartMove+1]=NewCommands.join("|");
MoveCount++;
MoveType=1-MoveType;
}
else
{ if (MoveType==1)
{ ssub=Math.floor(MoveCount/2+1);
ssearch=ssub+"....";
ffst=ffull.indexOf(ssearch);
if (ffst<0) { ssearch=ssub+". ..."; ffst=ffull.indexOf(ssearch); }
if (ffst<0) { ssearch=ssub+". .."; ffst=ffull.indexOf(ssearch); }
if (ffst<0) { ssearch=ssub+" ..."; ffst=ffull.indexOf(ssearch); }
if (ffst<0) { ssearch=ssub+"..."; ffst=ffull.indexOf(ssearch); }
if (ffst<0)
{ ssearch=ssub+" ..";
ffst=ffull.indexOf(ssearch);
}
if (ffst>=0)
{ ffst+=ssearch.length;
if (llst<0) ssub=ffull.substring(ffst);
else ssub=ffull.substring(ffst, llst);
mmove0=GetMove(ssub,0);
if (mmove0!="")
{ if (ParseMove(mmove0, true)>0)
{ mmove1=mmove0;
HistMove[MoveCount-StartMove]=Math.floor((MoveCount+2)/2)+". ... "+mmove1;
HistCommand[MoveCount-StartMove+1]=NewCommands.join("|");
MoveCount++;
MoveType=1-MoveType;
}
else
{ ffst=-1;
//alert(mmove0+" is not a valid move.");
}
}
}
}
else
{ ffst=-1;
//alert(mmove0+" is not a valid move.");
}
}
}
else ffst=-1;
}
if (mmove1!="")
{ sstart=-1;
do sstart=tt.indexOf(mmove1, sstart+1);
while ((sstart>0)&&(IsInComment(tt, sstart)));
if (sstart>=0)
{ if (sscoresheet)
{ Annotation[MoveCount-1]=GetComment(tt.substr(0,sstart));
if (ss=="")
{ if (sscoresheet==2) ss+="<table width='100%' cellpadding=0 cellspacing=0><tr><td width='50%'>";
if (MoveCount%2==1) ss+="<table width='100%' cellpadding=0 cellspacing=0><colgroup><col width='20%'><col width='40%'><col width='40%'></colgroup><tr><th>"+eval((MoveCount+1)/2)+".</th>";
else ss+="<table width='100%' cellpadding=0 cellspacing=0><colgroup><col width='20%'><col width='40%'><col width='40%'></colgroup><tr><th>"+eval(MoveCount/2)+".</th><th>&nbsp;</th>";
}
else
{ if (MoveCount%2==1) ss+="<tr><th>"+eval((MoveCount+1)/2)+".</th>";
}
ss+="<th>";
}
else ss+=tt.substr(0,sstart);
if (! nnoscript) ss+="<a href=\"javascript:SetMove{{"+MoveCount+","+vv+gg+"}}\" name=\"m"+MoveCount+"v"+vv+"\">";
if (vv==0) ss+="<b>";
if (ShowPieceName=="Figure") ss+=TransformFigureSAN(mmove1);
else ss+=TransformSAN(mmove1);
if (vv==0) ss+="</b>";
if (! nnoscript) ss+="</a>";
tt=tt.substr(sstart+mmove1.length);
if (sscoresheet)
{ ss+="</th>";
if (MoveCount%2==0) ss+="</tr>";
if (sscoresheet==2)
{ if (MoveCount%80==0) ss+="</table></td></tr></table><table width='100%' cellpadding=0 cellspacing=0><tr><td width='50%'><table width='100%' cellpadding=0 cellspacing=0><colgroup><col width='20%'><col width='40%'><col width='40%'></colgroup>";
else
{ if (MoveCount%40==0) ss+="</table></td><td width='50%'><table width='100%' cellpadding=0 cellspacing=0><colgroup><col width='20%'><col width='40%'><col width='40%'></colgroup>";
}
}
}
}
else ffst=-1;
}
}
if (sscoresheet)
{ Annotation[MoveCount]=GetComment(tt);
if (MoveCount%2==1) ss+="<th>&nbsp;</th>";
ss+="</tr></table>";
if (sscoresheet==2)
{ if (MoveCount%80<40) ss+="</td><td width='50%'>&nbsp;";
ss+="</td></tr></table>";
}
}
else ss+=tt;
var ll=ss.length;
for (ii=0; ii<ll; ii++)
{ cc=ss.substr(ii,1);
if (cc=="{") bbb++;
if (cc=="}") bbb--;
if (((cc==")")||(cc=="]"))&&(bbb==0))
{ bb--;
if (bb==0)
{ if (bbb==0)
{ if (! isNaN(ShortPgnMoveText[0][uuu]))
{ cc=uu.length-1;
uu=uu.substr(0,cc);
cc="";
}
if (sscoresheet) uu+=GetHTMLMoveText(uuu, true);
else uu+=GetHTMLMoveText(uuu, nnoscript);
isCalculating=true;
}
else uu+=uuu;
uuu="";
}
}
if (bb==0)
{ if ((bbb==0)&&(Indent))
{ if (cc=="(") uu+="<div style='margin-left:"+Indent+"'>"+cc;
else
{ if (cc==")") uu+=cc+"</div>";
else uu+=cc;
}
}
else uu+=cc;
}
else uuu+=cc;
if (((cc=="(")||(cc=="["))&&(bbb==0)) bb++;
}
if (! vvariant)
{ SetMove(0,0);
tt=uu.split("{{");
ll=tt.length;
uu=tt[0];
for (ii=1; ii<ll; ii++) uu+="("+tt[ii];
tt=uu.split("}}");
ll=tt.length;
uu=tt[0];
for (ii=1; ii<ll; ii++) uu+=")"+tt[ii];
if ((ccommenttype==1)||(ccommenttype==true))
{ tt=uu.split("{");
ll=tt.length;
uu=tt[0];
for (ii=1; ii<ll; ii++) uu+="<i>"+tt[ii];
tt=uu.split("}");
ll=tt.length;
uu=tt[0];
for (ii=1; ii<ll; ii++) uu+="</i>"+tt[ii];
}
if (ccommenttype>=1)
{ tt=uu.split("{");
ll=tt.length;
uu=tt[0];
for (ii=1; ii<ll; ii++) uu+="<a href=\"javascript:SetMove()\"><span title=\""+tt[ii];
tt=uu.split("}");
ll=tt.length;
uu=tt[0];
for (ii=1; ii<ll; ii++) uu+="\" onMouseDown=\"if (this.innerHTML==\'{\'+this.title+\'}\') this.innerHTML=\'<I>{...}</I>\'; else this.innerHTML=\'{\'+this.title+\'}\';\"><I>{...}</I></span></a>"+tt[ii];
}
}
isCalculating=false;
return(uu);
}
function IsInComment(ss, nn)
{ var ii=-1, bb=0;
do { ii=ss.indexOf("{",ii+1); bb++; }
while ((ii>=0)&&(ii<nn));
ii=-1;
do { ii=ss.indexOf("}",ii+1); bb--; }
while ((ii>=0)&&(ii<nn));
return(bb);
}
function HighlightMove(nn)
{ var ii, cc, bb, jj=0, ll=TargetDocument.anchors.length;
if (ll==0) return;
if (! TargetDocument.anchors[0].style) return;
if ((activeAnchor>=0)&&(ll>activeAnchor))
{ TargetDocument.anchors[activeAnchor].style.backgroundColor="";
activeAnchor=-1;
}
if (isNaN(startAnchor))
{ while ((jj<ll)&&(TargetDocument.anchors[jj].name!=startAnchor)) jj++;
}
for (ii=jj; ((ii<ll)&&(activeAnchor<0)); ii++)
{ if (TargetDocument.anchors[ii].name==nn)
{ activeAnchor=ii;
TargetDocument.anchors[activeAnchor].style.backgroundColor=activeAnchorBG;
if ((document!=TargetDocument)&&(parent.document!=TargetDocument)&&(TargetDocument.anchors[offsetAnchor+activeAnchor].scrollIntoView))
{ if (parent.document==parent.parent.document)
TargetDocument.anchors[offsetAnchor+activeAnchor].scrollIntoView(false);
}
return;
}
}
}
function SetAnnotation(ff)
{ AnnotationFile=ff;
}
function UpdateAnnotation(bb)
{ if (Annotation.length==0) return;
if (! parent.frames["annotation"]) return;
if(bb)
{ with (parent.frames["annotation"].document)
{ open();
writeln("<html><head></head><body><form>");
writeln("<input type='hidden' name='MoveCount' value='"+MoveCount+"'>");
write("<textarea rows=8 style='width:100%' name='Annotation'>");
if (Annotation[MoveCount]) write(Annotation[MoveCount]);
writeln("</textarea>");
if (AnnotationFile) writeln("<input type='button' value='Save Annotation' onclick='parent.frames[\"board\"].SaveAnnotation(this.form)'>");
writeln("</form></body></html>");
close();
}
}
else
{ parent.frames["annotation"].document.forms[0].MoveCount.value=MoveCount;
if (Annotation[MoveCount])
parent.frames["annotation"].document.forms[0].Annotation.value=Annotation[MoveCount];
else
parent.frames["annotation"].document.forms[0].Annotation.value="";
}
}
function SaveAnnotation(ff)
{ var mm=parseInt(ff.MoveCount.value);
Annotation[mm]=ff.Annotation.value;
if ((AnnotationFile)&&(parent.frames['annotation']))
parent.frames['annotation'].location.replace(AnnotationFile+"?MoveCount="+mm+"&Annotation="+escape(Annotation[mm]));
}
function GetDiagram(pp, ssp)
{ var ii, jj, cc, tt, nn, mm, ss=String.fromCharCode(13)+"<P align=center>", oo, aa=new Array(64);
var bb=Border;
var iip=ImagePath;
if (document.BoardForm)
{ if (oo=document.BoardForm.ImagePath)
{ iip=oo.options[oo.options.selectedIndex].value;
if (iip!="") { iip=iip.replace("|","/"); bb=0; }
}
if (oo=document.BoardForm.Border) bb=oo.options.selectedIndex;
}
for (ii=0; ii<64; ii++) aa[ii]="";
if (isCalculating) oo=NewCommands;
else oo=OldCommands;
if (oo.length>0)
{ for (ii=0; ii<oo.length; ii++)
{ tt=oo[ii].charAt(0);
if ((tt=="B")||(tt=="C"))
{ nn=oo[ii].charCodeAt(1)-97+(8-parseInt(oo[ii].charAt(2)))*8;
if ((nn>=0)&&(nn<=63))
{ if (isRotated) nn=63-nn;
cc=oo[ii].substr(3,6);
if (cc=="R") cc="FF0000";
if (cc=="G") cc="00FF00";
if (cc=="B") cc="0000FF";
if (tt=="B") aa[nn]+="border-color:"+cc+";";
else aa[nn]+="background-color:"+HEX2RGBA(cc)+";";
}
}
}
}
ss+="<table border=0 cellpadding=1 cellspacing=0>";
if (ssp) ss+="<tr><th>"+ssp+"</th></tr>";
ss+="<tr><th bgcolor=#808080 style='vertical-align:top'>";
ss+="<TABLE border="+(bb+2)+" cellpadding=0 cellspacing=0><TR><TD>";
ss+="<div><TABLE border=0 cellpadding=0 cellspacing=0>";
var tt=new Array("k","q","r","b","n","p");
if (isRotated)
{ for (jj=0; jj<8; jj++)
{ ss+="<TR>";
for (ii=7; ii>=0; ii--)
{ if ((Board[ii][jj]==0)||((pp)&&((Board[ii][jj]+6)%6!=0)))
ss+="<TD background='"+iip+ColorName[(ii+jj+1)%2]+".gif'><IMG SRC='"+iip+"t.gif'";
else
ss+="<TD background='"+iip+ColorName[(ii+jj+1)%2]+".gif'><IMG SRC='"+iip+ColorName[(1-sign(Board[ii][jj]))/2]+tt[Math.abs(Board[ii][jj])-1]+PieceFileExt+"'";
if (document.layers) ss+=" border="+bb+"></TD>";
else ss+=" style='border-width:"+bb+"px; border-style:solid; border-color:"+BorderColor+";"+aa[jj*8+(7-ii)]+"'></TD>";
}
ss+="</TR>";
}
}
else
{ for (jj=7; jj>=0; jj--)
{ ss+="<TR>";
for (ii=0; ii<8; ii++)
{ if ((Board[ii][jj]==0)||((pp)&&((Board[ii][jj]+6)%6!=0)))
ss+="<TD background='"+iip+ColorName[(ii+jj+1)%2]+".gif'><IMG SRC='"+iip+"t.gif'";
else
ss+="<TD background='"+iip+ColorName[(ii+jj+1)%2]+".gif'><IMG SRC='"+iip+ColorName[(1-sign(Board[ii][jj]))/2]+tt[Math.abs(Board[ii][jj])-1]+PieceFileExt+"'";
if (document.layers) ss+=" border="+bb+"></TD>";
else ss+=" style='border-width:"+bb+"px; border-style:solid; border-color:"+BorderColor+";"+aa[(7-jj)*8+ii]+"'></TD>";
}
ss+="</TR>";
}
}
ss+="</TABLE></div>";
if (!document.layers)
{ var xx0, xx1, bb0, bb1, kk, dd=parseInt(document.getElementById("Board").offsetHeight);
if (iip!=0)
{ dd=0;
for (ii=0; ii<iip.length; ii++)
{ if (!isNaN(iip.charAt(ii))) { dd*=10; dd+=parseInt(iip.charAt(ii)); }
}
if (dd>0) dd+=2*bb;
dd*=8;
}
var dd32=Math.round(dd/32);
if (oo.length>0)
{ ss+="<div style='position:relative;top:-"+dd+"px'>";
for (ii=0; ii<oo.length; ii++)
{ tt=oo[ii].charAt(0);
if ((tt=="B")&&(dd>0))
{ kk=oo[ii].charCodeAt(1)-97;
jj=parseInt(oo[ii].charAt(2));
nn=kk+(8-jj)*8;
if ((nn>=0)&&(nn<=63)) bb0=Board[kk][jj-1];
if ((nn>=0)&&(nn<=63))
{ if (isRotated) nn=63-nn;
xx0=nn%8; yy0=(nn-xx0)/8;
cc=oo[ii].substr(3,6);
if (cc=="R") cc="FF0000";
if (cc=="G") cc="00FF00";
if (cc=="B") cc="0000FF";
if (cc.length<6) cc="#FFFFFF";
else cc="#"+cc;
ss+=GetBorder(xx0,yy0,HEX2RGBA(cc),dd);
}
}
if ((tt=="A")&&(dd>0))
{ kk=oo[ii].charCodeAt(1)-97;
jj=parseInt(oo[ii].charAt(2));
nn=kk+(8-jj)*8;
if ((nn>=0)&&(nn<=63)) bb0=Board[kk][jj-1];
kk=oo[ii].charCodeAt(3)-97;
jj=parseInt(oo[ii].charAt(4));
mm=kk+(8-jj)*8;
if ((mm>=0)&&(mm<=63)) bb1=Board[kk][jj-1];
if ((nn>=0)&&(nn<=63)&&(mm>=0)&&(mm<=63)&&(nn!=mm))
{ if (isRotated) { nn=63-nn; mm=63-mm; }
xx0=nn%8; yy0=(nn-xx0)/8;
xx1=mm%8; yy1=(mm-xx1)/8;
nn=0; mm=0;
if (xx0<xx1) nn=1;
if (xx0>xx1) nn=-1;
if (yy0<yy1) mm=1;
if (yy0>yy1) mm=-1;
xx0=Math.round((2*xx0+1)*dd/16);
yy0=Math.round((2*yy0+1)*dd/16);
if (bb0!=0)
{ xx0+=nn*dd32;
yy0+=mm*dd32;
}
xx1=Math.round((2*xx1+1)*dd/16);
yy1=Math.round((2*yy1+1)*dd/16);
if (bb1!=0)
{ xx1-=nn*dd32;
yy1-=mm*dd32;
}
cc=oo[ii].substr(5,6);
if (cc=="R") cc="FF0000";
if (cc=="G") cc="00FF00";
if (cc=="B") cc="0000FF";
if (cc.length<6) cc="#FFFFFF";
else cc="#"+cc;
ss+=GetArrow(xx0,yy0,xx1,yy1,HEX2RGBA(cc),dd);
}
}
}
ss+="</div>";
}
}
ss+="</TD></TR></TABLE>";
if (IsLabelVisible)
{ if (isRotated)
{ ss+="</th><th><img src='"+iip+"1_8.gif'></th>";
if (isCapturedPieces) ss+="<th>"+GetCapturedPieces(iip,bb)+"</th>";
ss+="</tr><tr><th><img src='"+iip+"h_a.gif'></th><th><img src='"+iip+"1x1.gif'>";
if (isCapturedPieces) ss+="</th><th>";
}
else
{ ss+="</th><th><img src='"+iip+"8_1.gif'></th>";
if (isCapturedPieces) ss+="<th>"+GetCapturedPieces(iip,bb)+"</th>";
ss+="</tr><tr><th><img src='"+iip+"a_h.gif'></th><th><img src='"+iip+"1x1.gif'>";
if (isCapturedPieces) ss+="</th><th>";
}
}
else
{ if (isCapturedPieces) ss+="</th><th>"+GetCapturedPieces(iip,bb);
}
ss+="</th></tr></table></P>"+String.fromCharCode(13);
return (ss);
}
function GetCapturedPieces(iip,bb)
{ var ii, jj, kk, ll, ss, rr=new Array(8);
for (ii=0; ii<8; ii++) rr[ii]="";
var tt=new Array("k","q","r","b","n","p");
var pp0=new Array(0,1,1,2,2,2,8);
kk=0;
ii=0;
if (isRotated) ii=1;
for (jj=0; jj<16; jj++) pp0[PieceType[ii][jj]+1]--;
for (jj=1; jj<5; jj++)
{ for (ll=0; ll<pp0[jj+1]; ll++)
{ rr[kk%4]+="<td><IMG SRC='"+iip+ColorName[ii]+tt[jj]+PieceFileExt+"'></td>";
kk++;
pp0[0]++;
}
}
for (ll=0; ll>pp0[0]; ll--)
{ rr[kk%4]+="<td><IMG SRC='"+iip+ColorName[ii]+tt[5]+PieceFileExt+"'></td>";
kk++;
}
while (kk<4) { rr[kk%4]+="<td><IMG SRC='"+iip+"t.gif'></td>"; kk++; }
while (kk<16){ rr[kk%4]+="<td><IMG SRC='"+iip+"1x1.gif'></td>"; kk++; }
var pp1=new Array(0,1,1,2,2,2,8);
kk=0;
ii=1-ii;
for (jj=0; jj<16; jj++) pp1[PieceType[ii][jj]+1]--;
for (jj=1; jj<5; jj++)
{ for (ll=0; ll<pp1[jj+1]; ll++)
{ rr[7-(kk%4)]+="<td><IMG SRC='"+iip+ColorName[ii]+tt[jj]+PieceFileExt+"'></td>";
kk++;
pp1[0]++;
}
}
for (ll=0; ll>pp1[0]; ll--)
{ rr[7-(kk%4)]+="<td><IMG SRC='"+iip+ColorName[ii]+tt[5]+PieceFileExt+"'></td>";
kk++;
}
while (kk<4) { rr[7-(kk%4)]+="<td><IMG SRC='"+iip+"t.gif'></td>"; kk++; }
while (kk<16){ rr[7-(kk%4)]+="<td><IMG SRC='"+iip+"1x1.gif'></td>"; kk++; }
ss="<table border=0 cellpadding="+bb+" cellspacing=0>";
for (ii=0; ii<8; ii++) ss+="<tr>"+rr[ii]+"</tr>";
ss+="</table>";
return(ss);
}
function GetBorder(theX0, theY0, theColor, theBoardSize)
{ //var bborder=2;
var ssize=Math.floor(theBoardSize/8), bborder=1+Math.floor(theBoardSize/128);
dd="<div style='visibility:hidden;position:absolute;left:"+eval(theX0*ssize)+"px;top:"+eval(theY0*ssize)+"px;width:"+ssize+"px;height:"+ssize+"px;z-index:99'>"
dd+="<div style='visibility:visible;position:absolute;left:0px;top:0px;width:"+eval(ssize-bborder)+"px;height:"+bborder+"px;background-color:"+theColor+";font-size:1pt;line-height:1pt;'></div>";
dd+="<div style='visibility:visible;position:absolute;left:"+bborder+"px;top:"+eval(ssize-bborder)+"px;width:"+eval(ssize-bborder)+"px;height:"+bborder+"px;background-color:"+theColor+";font-size:1pt;line-height:1pt;'></div>";
dd+="<div style='visibility:visible;position:absolute;left:0px;top:"+bborder+"px;width:"+bborder+"px;height:"+eval(ssize-bborder)+"px;background-color:"+theColor+";font-size:1pt;line-height:1pt;'></div>";
dd+="<div style='visibility:visible;position:absolute;left:"+eval(ssize-bborder)+"px;top:0px;width:"+bborder+"px;height:"+eval(ssize-bborder)+"px;background-color:"+theColor+";font-size:1pt;line-height:1pt;'></div>";
dd+="</div>";
return(dd);
}
var isOldIE=(navigator.userAgent.toLowerCase().indexOf('msie') != -1) ? (parseInt(navigator.userAgent.toLowerCase().split('msie')[1])<10) : false;
function GetArrow(theX0, theY0, theX1, theY1, theColor, theBoardSize)
{ var ssize=1+Math.floor(theBoardSize/80), ssize2=Math.floor(ssize/2);
//var ccL=9*ssize2, ccB=3*ssize2;
var ccL=Math.floor(theBoardSize/17), ccB=Math.floor(theBoardSize/51);
var xx0=theX0, yy0=theY0, xx1=theX1, yy1=theY1;
if ((xx0==xx1)&&(yy0==yy1)) yy0+=ccL;
if ((theX1==0)&&(theY1==0)) { xx1=xx0; yy0+=ccB; yy1=yy0-ccL; }
if (isOldIE) return(GetOldArrow(xx0, yy0, xx1, yy1, theColor, theBoardSize));
if ((xx0==xx1)&&(yy0-ccL==yy1)) { ccL=2*ccB; yy1=yy0-ccL; }
ccB=Math.round(ssize*5/3);
var ddx=xx1-xx0, ddy=yy1-yy0;
var nn=ddx*ddx+ddy*ddy;
if (nn==0) return(0);
nn=Math.sqrt(nn);
var aa=Math.acos(-ddy/nn)*180/Math.PI;
if (ddx<0) aa=360-aa;
var ss="<div style='visibility:hidden;position:absolute;left:"+Math.round((xx0+xx1-nn)/2)+"px; top:"+Math.round((yy0+yy1-nn)/2)+"px; width:"+Math.round(nn)+"px; height:"+Math.round(nn)+"px; -ms-transform: rotate("+aa+"deg); -webkit-transform: rotate("+aa+"deg); -moz-transform: rotate("+aa+"deg); transform: rotate("+aa+"deg); transform-origin: 50% 50%; z-index:100'>";
ss+="<div style='visibility:visible;position:absolute;left:"+Math.floor(nn/2-ccB)+"px;top:0px,width:0px;height:0px;border-style: solid; border-width: 0px "+ccB+"px "+ccL+"px "+ccB+"px;border-color: transparent transparent "+theColor+" transparent;'></div>";
ss+="<div style='visibility:visible;position:absolute;left:"+Math.floor(nn/2-ssize2)+"px;top:"+(ccL)+"px;width:0px;height:0px;border-style: solid; border-width: "+Math.ceil(nn-ccL)+"px 0px 0px "+ssize+"px;border-color: "+theColor+" transparent transparent "+theColor+";'></div>";
ss+="</div>";
return(ss);
}
function GetOldArrow(theX0, theY0, theX1, theY1, theColor, theBoardSize)
{ var ll, rr, tt, bb, ww, hh, ccl, ccr, cct, ccb, dd, tmpX0, tmpY0;
//var ssize=2;
var ssize=1+Math.floor(theBoardSize/128), ssize2=Math.floor(ssize/2), bborder=8*ssize;
var ddir=(((theY1>theY0)&&(theX1>theX0))||((theY1<theY0)&&(theX1<theX0))) ? true : false;
if (theX0<=theX1) { ll=theX0; rr=theX1; }
else { ll=theX1; rr=theX0; }
if (theY0<=theY1) { tt=theY0; bb=theY1; }
else { tt=theY1; bb=theY0; }
ww=rr-ll; hh=bb-tt;
dd="<div style='visibility:hidden;position:absolute;left:"+eval(ll-ssize2-bborder)+"px;top:"+eval(tt-ssize2-bborder)+"px;width:"+eval(ww+ssize+2*bborder)+"px;height:"+eval(hh+ssize+2*bborder)+"px;z-index:100'>"
if ((ww==0)||(hh==0)) dd+="<div style='visibility:visible;position:absolute;left:"+bborder+"px;top:"+bborder+"px;width:"+eval(ww+ssize)+"px;height:"+eval(hh+ssize)+"px;background-color:"+theColor+";font-size:1pt;line-height:1pt;'></div>";
else
{ if (ww>hh)
{ ccr=0; cct=0;
while (ccr<ww)
{ ccl=ccr;
while ((2*ccr*hh<=(2*cct+1)*ww)&&(ccr<=ww)) ccr++;
if (ddir) dd+="<div style='visibility:visible;position:absolute;left:"+eval(ccl+bborder)+"px;top:"+eval(cct+bborder)+"px;width:"+eval(ccr-ccl+ssize)+"px;height:"+ssize+"px;background-color:"+theColor+";font-size:1pt;line-height:1pt;'></div>";
else dd+="<div style='visibility:visible;position:absolute;left:"+eval(ww-ccr+bborder)+"px;top:"+eval(cct+bborder)+"px;width:"+eval(ccr-ccl+ssize)+"px;height:"+ssize+"px;background-color:"+theColor+";font-size:1pt;line-height:1pt;'></div>";
cct++;
}
}
else
{ ccb=0; ccl=0;
while (ccb<hh)
{ cct=ccb;
while ((2*ccb*ww<=(2*ccl+1)*hh)&&(ccb<hh)) ccb++;
if (ddir) dd+="<div style='visibility:visible;position:absolute;left:"+eval(ccl+bborder)+"px;top:"+eval(cct+bborder)+"px;width:"+ssize+"px;height:"+eval(ccb-cct+ssize)+"px;background-color:"+theColor+";font-size:1pt;line-height:1pt;'></div>";
else dd+="<div style='visibility:visible;position:absolute;left:"+eval(ww-ccl+bborder)+"px;top:"+eval(cct+bborder)+"px;width:"+ssize+"px;height:"+eval(ccb-cct+ssize)+"px;background-color:"+theColor+";font-size:1pt;line-height:1pt;'></div>";
ccl++;
}
}
}
var LL=1, ll0=ll, tt0=tt;
//var ccL=12, ccB=4;
//var ccL=Math.round(theBoardSize/24), ccB=Math.round(theBoardSize/72);
var ccL=Math.round(theBoardSize/28), ccB=Math.round(theBoardSize/67);
var DDX=theX1-theX0, DDY=theY1-theY0;
if ((DDX!=0)||(DDY!=0)) LL=Math.sqrt(0+(DDX*DDX)+(DDY*DDY));
tmpX0=theX1-Math.round(1/LL*(ccL*DDX-ccB*DDY));
tmpY0=theY1-Math.round(1/LL*(ccL*DDY+ccB*DDX));
ddir=(((theY1>tmpY0)&&(theX1>tmpX0))||((theY1<tmpY0)&&(theX1<tmpX0))) ? true : false;
if (tmpX0<=theX1) { ll=tmpX0; rr=theX1; }
else { ll=theX1; rr=tmpX0; }
if (tmpY0<=theY1) { tt=tmpY0; bb=theY1; }
else { tt=theY1; bb=tmpY0; }
ww=rr-ll; hh=bb-tt;
if ((ww==0)||(hh==0)) dd+="<div style='visibility:visible;position:absolute;left:"+eval(bborder+ll-ll0)+"px;top:"+eval(bborder+tt-tt0)+"px;width:"+eval(ww+ssize)+"px;height:"+eval(hh+ssize)+"px;background-color:"+theColor+";font-size:1pt;line-height:1pt;'></div>";
else
{ if (ww>hh)
{ ccr=0; cct=0;
while (ccr<ww)
{ ccl=ccr;
while ((2*ccr*hh<=(2*cct+1)*ww)&&(ccr<=ww)) ccr++;
if (ddir) dd+="<div style='visibility:visible;position:absolute;left:"+eval(ccl+bborder+ll-ll0)+"px;top:"+eval(cct+bborder+tt-tt0)+"px;width:"+eval(ccr-ccl+ssize)+"px;height:"+ssize+"px;background-color:"+theColor+";font-size:1pt;line-height:1pt;'></div>";
else dd+="<div style='visibility:visible;position:absolute;left:"+eval(ww-ccr+bborder+ll-ll0)+"px;top:"+eval(cct+bborder+tt-tt0)+"px;width:"+eval(ccr-ccl+ssize)+"px;height:"+ssize+"px;background-color:"+theColor+";font-size:1pt;line-height:1pt;'></div>";
cct++;
}
}
else
{ ccb=0; ccl=0;
while (ccb<hh)
{ cct=ccb;
while ((2*ccb*ww<=(2*ccl+1)*hh)&&(ccb<hh)) ccb++;
if (ddir) dd+="<div style='visibility:visible;position:absolute;left:"+eval(ccl+bborder+ll-ll0)+"px;top:"+eval(cct+bborder+tt-tt0)+"px;width:"+ssize+"px;height:"+eval(ccb-cct+ssize)+"px;background-color:"+theColor+";font-size:1pt;line-height:1pt;'></div>";
else dd+="<div style='visibility:visible;position:absolute;left:"+eval(ww-ccl+bborder+ll-ll0)+"px;top:"+eval(cct+bborder+tt-tt0)+"px;width:"+ssize+"px;height:"+eval(ccb-cct+ssize)+"px;background-color:"+theColor+";font-size:1pt;line-height:1pt;'></div>";
ccl++;
}
}
}
tmpX0=theX1-Math.round(1/LL*(ccL*DDX+ccB*DDY));
tmpY0=theY1-Math.round(1/LL*(ccL*DDY-ccB*DDX));
ddir=(((theY1>tmpY0)&&(theX1>tmpX0))||((theY1<tmpY0)&&(theX1<tmpX0))) ? true : false;
if (tmpX0<=theX1) { ll=tmpX0; rr=theX1; }
else { ll=theX1; rr=tmpX0; }
if (tmpY0<=theY1) { tt=tmpY0; bb=theY1; }
else { tt=theY1; bb=tmpY0; }
ww=rr-ll; hh=bb-tt;
if ((ww==0)||(hh==0)) dd+="<div style='visibility:visible;position:absolute;left:"+eval(bborder+ll-ll0)+"px;top:"+eval(bborder+tt-tt0)+"px;width:"+eval(ww+ssize)+"px;height:"+eval(hh+ssize)+"px;background-color:"+theColor+";font-size:1pt;line-height:1pt;'></div>";
else
{ if (ww>hh)
{ ccr=0; cct=0;
while (ccr<ww)
{ ccl=ccr;
while ((2*ccr*hh<=(2*cct+1)*ww)&&(ccr<=ww)) ccr++;
if (ddir) dd+="<div style='visibility:visible;position:absolute;left:"+eval(ccl+bborder+ll-ll0)+"px;top:"+eval(cct+bborder+tt-tt0)+"px;width:"+eval(ccr-ccl+ssize)+"px;height:"+ssize+"px;background-color:"+theColor+";font-size:1pt;line-height:1pt;'></div>";
else dd+="<div style='visibility:visible;position:absolute;left:"+eval(ww-ccr+bborder+ll-ll0)+"px;top:"+eval(cct+bborder+tt-tt0)+"px;width:"+eval(ccr-ccl+ssize)+"px;height:"+ssize+"px;background-color:"+theColor+";font-size:1pt;line-height:1pt;'></div>";
cct++;
}
}
else
{ ccb=0; ccl=0;
while (ccb<hh)
{ cct=ccb;
while ((2*ccb*ww<=(2*ccl+1)*hh)&&(ccb<hh)) ccb++;
if (ddir) dd+="<div style='visibility:visible;position:absolute;left:"+eval(ccl+bborder+ll-ll0)+"px;top:"+eval(cct+bborder+tt-tt0)+"px;width:"+ssize+"px;height:"+eval(ccb-cct+ssize)+"px;background-color:"+theColor+";font-size:1pt;line-height:1pt;'></div>";
else dd+="<div style='visibility:visible;position:absolute;left:"+eval(ww-ccl+bborder+ll-ll0)+"px;top:"+eval(cct+bborder+tt-tt0)+"px;width:"+ssize+"px;height:"+eval(ccb-cct+ssize)+"px;background-color:"+theColor+";font-size:1pt;line-height:1pt;'></div>";
ccl++;
}
}
}
dd+="</div>";
return(dd);
}
function SwitchSetupBoard()
{ SetBoardClicked(-1);
if (!isSetupBoard)
{ Init('standard');
isSetupBoard=true;
if ((document.BoardForm)&&(document.BoardForm.SetupBoard))
document.BoardForm.SetupBoard.value=" Ready ";
return;
}
isSetupBoard=false;
if ((document.BoardForm)&&(document.BoardForm.SetupBoard))
document.BoardForm.SetupBoard.value="Setup Board";
var ii, jj, ee, ss="", cc;
for (jj=7; jj>=0; jj--)
{ ee=0;
for (ii=0; ii<8; ii++)
{ if (Board[ii][jj]==0) ee++;
else
{ if (ee>0)
{ ss=ss+""+ee;
ee=0;
}
if (Board[ii][jj]>0)
ss=ss+PieceName.toUpperCase().charAt(Board[ii][jj]-1);
else
ss=ss+PieceName.toLowerCase().charAt(-Board[ii][jj]-1);
}
}
if (ee>0) ss=ss+""+ee;
if (jj>0) ss=ss+"/";
}
MoveType=-1;
while (MoveType<0)
{ if (MoveType<0)
{ if (confirm("White to move?")) MoveType=0;
}
if (MoveType<0)
{ if (confirm("Black to move?")) MoveType=1;
}
}
if (MoveType==0) ss=ss+" w ";
else ss=ss+" b ";
cc=0;
if ((Board[4][0]==1)&&(Board[7][0]==3)) { ss+="K"; cc++; }
if ((Board[4][0]==1)&&(Board[0][0]==3)) { ss+="Q"; cc++; }
if ((Board[4][7]==-1)&&(Board[7][7]==-3)) { ss+="k"; cc++; }
if ((Board[4][7]==-1)&&(Board[0][7]==-3)) { ss+="q"; cc++; }
if (cc==0) ss=ss+"-";
ss=ss+" -";
ss=ss+" "+HalfMove[MoveCount-StartMove];
ss=ss+" "+Math.floor((MoveCount+2)/2);
if ((document.BoardForm)&&(document.BoardForm.FEN))
document.BoardForm.FEN.value=ss;
Init(ss);
}
function SetBoardSetupMode(mm)
{ BoardSetupMode=mm;
SetBoardClicked(-1);
}
function SetupBoardClick(nn)
{ var ii, jj, ii0, jj0, ii1, jj1, mm, nnn;
if (isRotated) nnn=63-nn;
else nnn=nn;
if ((BoardClicked<0)&&(BoardSetupMode!='delete'))
{ if (nn>=64) { SetBoardClicked(nn); return; }
ii0=nnn%8;
jj0=7-(nnn-ii0)/8;
if (Board[ii0][jj0]!=0) SetBoardClicked(nnn);
return;
}
if (BoardClicked>=0)
{ ii0=BoardClicked%8;
jj0=7-(BoardClicked-ii0)/8;
}
ii1=nnn%8;
jj1=7-(nnn-ii1)/8;
if (((Board[ii1][jj1]!=0))&&(BoardSetupMode!='delete'))
{ SetBoardClicked(nnn);
return;
}
if (BoardSetupMode=='copy')
{ Board[ii1][jj1]=Board[ii0][jj0];
SetBoardClicked(nnn);
}
if (BoardSetupMode=='move')
{ if (BoardClicked>=64)
{ ii0=BoardClicked%2;
jj0=(BoardClicked-64-ii0)/2;
if (ii0==0) Board[ii1][jj1]=jj0+1;
else Board[ii1][jj1]=-jj0-1;
}
else
{ Board[ii1][jj1]=Board[ii0][jj0];
Board[ii0][jj0]=0;
SetBoardClicked(nnn);
}
}
if (BoardSetupMode=='delete')
{ Board[ii1][jj1]=0;
SetBoardClicked(-1);
}
if (isRotated)
{ for (ii=0; ii<8; ii++)
{ for (jj=0; jj<8; jj++)
{ if (Board[ii][jj]==0)
SetImg(63-ii-(7-jj)*8,BoardPic);
else
SetImg(63-ii-(7-jj)*8,PiecePic[(1-sign(Board[ii][jj]))/2][Math.abs(Board[ii][jj])-1]);
}
}
}
else
{ for (ii=0; ii<8; ii++)
{ for (jj=0; jj<8; jj++)
{ if (Board[ii][jj]==0)
SetImg(ii+(7-jj)*8,BoardPic);
else
SetImg(ii+(7-jj)*8,PiecePic[(1-sign(Board[ii][jj]))/2][Math.abs(Board[ii][jj])-1]);
}
}
}
}
function SetupPieceClick(ii,bb)
{ if (isDragDrop&&(!bb)) return;
var nn=BoardClicked;
if (ii>11)
{ if (nn>=0)
{ SetBoardSetupMode('delete');
if (isRotated) BoardClick(63-nn,true);
else BoardClick(nn,true);
SetBoardSetupMode('move');
}
return;
}
SetBoardClicked(-1);
BoardClick(ii+64,true);
}
function ParsePgn(nn,gg,ffile)
{ if ((nn>0)&&(nn<5)) ParseType=parseInt(nn);
var ii, jj, ll=0, ss, tt, uu="";
if (ffile) ss=" "+ffile;
else
{ if (! parent.frames[1].document.documentElement)
{ if (nn>-50) setTimeout("ParsePgn("+eval(nn-5)+",'"+gg+"')",400);
return;
}
ss=parent.frames[1].document.documentElement.innerHTML;
if (ss!="") ll=ss.length;
if (ll!=nn)
{ setTimeout("ParsePgn("+ll+",'"+gg+"')",400);
return;
}
if (ll==0) return;
ss=ss.replace(/\<html\>/i,'');
ss=ss.replace(/\<\/html\>/i,'');
ss=ss.replace(/\<head\>/i,'');
ss=ss.replace(/\<\/head\>/i,'');
ss=ss.replace(/\<body\>/i,'');
ss=ss.replace(/\<\/body\>/i,'');
ss=ss.replace(/\<pre\>/i,'');
ss=ss.replace(/\<\/pre\>/i,'');
ss=ss.replace(/\<xmp\>/i,'');
ss=ss.replace(/\<\/xmp\>/i,'');
ss=ss.replace(/&quot;/g,'"');
// while (ss.indexOf('&quot;')>0) ss=ss.replace('&quot;','"');
ss=ss.replace(/&lt;/g,'<');
ss=ss.replace(/&gt;/g,'>');
ss=" "+ss;
}
ss = ss.split("[");
if (ss.length<2) return;
tt=new Array(ss.length-1);
for (ii=1; ii<ss.length; ii++)
tt[ii-1]=ss[ii].split("]");
var bblack=new Array();
var wwhite=new Array();
var rresult=new Array();
var ppgnText=new Array();
var ggameText=new Array();
var ffenText=new Array();
var ssanText=new Array();
var kk, ff, sstype=new Array();
jj=0;
ffenText[jj]="";
ssanText[jj]="";
ggameText[jj]="";
for (ii=0; ii<tt.length; ii++)
{ kk=tt[ii][0].split(" ")[0];
sstype[kk]=kk;
if (tt[ii][0].substr(0,6)=="Black ")
bblack[jj]=tt[ii][0].substr(6,tt[ii][0].length);
if (tt[ii][0].substr(0,6)=="White ")
wwhite[jj]=tt[ii][0].substr(6,tt[ii][0].length);
if (tt[ii][0].substr(0,7)=="Result ")
rresult[jj]=tt[ii][0].substr(7,tt[ii][0].length);
if (tt[ii][0].substr(0,4)=="FEN ")
ffenText[jj]=tt[ii][0].substr(4,tt[ii][0].length);
if (tt[ii][0].substr(0,4)=="SAN ")
ssanText[jj]=tt[ii][0].substr(4,tt[ii][0].length);
ggameText[jj]+="["+tt[ii][0]+"]<br />";
kk=0;
while ((kk<tt[ii][1].length)&&(tt[ii][1].charCodeAt(kk)<49)) kk++;
if (kk<tt[ii][1].length)
{ ppgnText[jj]=tt[ii][1].substr(kk,tt[ii][1].length);
kk=0; ff=String.fromCharCode(13);
while ((kk=ppgnText[jj].indexOf(ff, kk))>0) ppgnText[jj]=ppgnText[jj].substr(0,kk)+""+ppgnText[jj].substr(kk+1);
kk=0; ff=String.fromCharCode(10)+String.fromCharCode(10);
while ((kk=ppgnText[jj].indexOf(ff, kk))>0) ppgnText[jj]=ppgnText[jj].substr(0,kk)+" <br /><br /> "+ppgnText[jj].substr(kk+2);
kk=0; ff=String.fromCharCode(10);
while ((kk=ppgnText[jj].indexOf(ff, kk))>0) ppgnText[jj]=ppgnText[jj].substr(0,kk)+" "+ppgnText[jj].substr(kk+1);
while (ffenText[jj].indexOf('"')>=0) ffenText[jj]=ffenText[jj].replace('"','');
while (ssanText[jj].indexOf('"')>=0) ssanText[jj]=ssanText[jj].replace('"','');
if (ParseType%2==1)
{ ppgnText[jj]=escape(ppgnText[jj]);
ffenText[jj]=escape(ffenText[jj]);
ssanText[jj]=escape(ssanText[jj]);
ggameText[jj]=escape(ggameText[jj]);
}
else
{ ppgnText[jj]=ppgnText[jj].replace(/\'/g,"\\'");
ggameText[jj]=ggameText[jj].replace(/\'/g,"\\'");
}
jj++;
ffenText[jj]="";
ssanText[jj]="";
ggameText[jj]="";
}
}
if (ParseType%2==1) uu="unescape";
var ssh=ScoreSheet;
if ((document.BoardForm)&&(document.BoardForm.ScoreSheet))
ssh=parseInt(document.BoardForm.ScoreSheet.options[document.BoardForm.ScoreSheet.options.selectedIndex].value);
if ((parent.frames["annotation"])&&(ssh==0)) ssh=1;
var bb=BGColor;
if (bb=="") bb="#E0C8A0";
var dd=parent.frames[1].document;
dd.open();
dd.writeln("<html><head>");
dd.writeln("<style type='text/css'>");
dd.writeln("body { background-color:"+bb+";color:#000000;font-size:10pt;line-height:12pt;font-family:Verdana; }");
if ((ssh)||(ParseType>2))
{ dd.writeln("table { border-left:1px solid #808080; border-top:1px solid #808080; }");
dd.writeln("td, th { border-right:1px solid #808080; border-bottom:1px solid #808080; font-size:10pt;line-height:12pt;font-family:Verdana; vertical-align:top}");
}
dd.writeln("a {color:#000000; text-decoration: none}");
dd.writeln("a:hover {color:#FFFFFF; background-color:#808080}");
dd.writeln("</style>");
dd.writeln("<"+"script language='JavaScript'>");
ii=ImagePath.replace("/","|");
if ((document.BoardForm)&&(document.BoardForm.ImagePath))
ii=document.BoardForm.ImagePath.options[document.BoardForm.ImagePath.options.selectedIndex].value;
if (ii!="") ii="&SetImagePath="+ii;
if (BGColor!="") ii=ii+"&SetBGColor="+BGColor.substr(1,6);
if ((document.BoardForm)&&(document.BoardForm.Border)&&(document.BoardForm.Border.options.selectedIndex>0))
ii=ii+"&SetBorder=1";
if (parent.frames["annotation"])
dd.writeln("if (! parent.frames[0]) location.href='pgnannotator.html?'+location.href+'&SetAnnotation="+AnnotationFile+ii+"';");
else
dd.writeln("if (! parent.frames[0]) location.href='ltpgnviewer.html?'+location.href+'"+ii+"';");
dd.writeln("var PgnMoveText=new Array();");
dd.writeln("var GameText=new Array();");
dd.writeln("var FenText=new Array();");
dd.writeln("var SanText=new Array();");
for (ii=0; ii<jj; ii++)
{ dd.writeln("PgnMoveText["+ii+"]='"+ppgnText[ii]+"';");
dd.writeln("GameText["+ii+"]='"+ggameText[ii]+"';");
if (ffenText[ii]!="") dd.writeln("FenText["+ii+"]='"+ffenText[ii]+"';");
if (ssanText[ii]!="") dd.writeln("SanText["+ii+"]='"+ssanText[ii]+"';");
}
dd.writeln("function OpenGame(nn)");
dd.writeln("{ if (parent.frames[0].IsComplete)");
dd.writeln(" { if (parent.frames[0].IsComplete())");
dd.writeln(" { if (nn>=0)");
dd.writeln(" { if (FenText[nn]) parent.frames[0].Init("+uu+"(FenText[nn]));");
dd.writeln(" else parent.frames[0].Init('standard');");
dd.writeln(" if (SanText[nn]) parent.frames[0].ApplySAN("+uu+"(SanText[nn]));");
dd.writeln(" //parent.frames[0].SetPgnMoveText("+uu+"(PgnMoveText[nn])); //variants not possible");
dd.writeln(" parent.frames[0].ApplyPgnMoveText("+uu+"(PgnMoveText[nn]),'#CCCCCC',window.document); //variants possible");
dd.writeln(" //document.getElementById('GameText').innerHTML="+uu+"(GameText[nn])+'<br />'+PgnMoveText[nn]; //pgn without html links");
if (ssh)
{ dd.writeln(" if (document.getElementById) document.getElementById('GameText').innerHTML=parent.frames[0].ScoreSheetHeader("+uu+"(GameText[nn]))+parent.frames[0].GetHTMLMoveText(0,false,true,"+ssh+")+parent.frames[0].ScoreSheetFooter(); //pgn with html links");
dd.writeln(" else if (document.GameTextLayer) { with(document.GameTextLayer) { document.open(); document.write(parent.frames[0].ScoreSheetHeader("+uu+"(GameText[nn]))+parent.frames[0].GetHTMLMoveText(0,false,true,"+ssh+")+parent.frames[0].ScoreSheetFooter()); document.close(); }}//pgn with html links");
if (parent.frames["annotation"])
dd.writeln(" parent.frames[0].UpdateAnnotation(true);");
}
else
{ dd.writeln(" if (document.getElementById) document.getElementById('GameText').innerHTML="+uu+"(GameText[nn])+'<br />'+parent.frames[0].GetHTMLMoveText(0,false,true); //pgn with html links");
dd.writeln(" else if (document.GameTextLayer) { with(document.GameTextLayer) { document.open(); document.write("+uu+"(GameText[nn])+'<br />'+parent.frames[0].GetHTMLMoveText(0,false,true)); document.close(); }}//pgn with html links");
dd.writeln(" if ((document.forms[0])&&(document.forms[0].GameList)) document.forms[0].GameList.options.selectedIndex=parseInt(nn)+1;");
}
dd.writeln(" }");
if (isDragDrop) dd.writeln(" if (parent.frames[0].SetDragDrop) parent.frames[0].SetDragDrop(1);");
dd.writeln(" return;");
dd.writeln(" }");
dd.writeln(" }");
dd.writeln(" setTimeout('OpenGame('+nn+')',400);");
dd.writeln("}");
dd.writeln("function SetMove(mm,vv){ if (parent.frames[0].SetMove) parent.frames[0].SetMove(mm,vv); }");
if (jj>1)
{ dd.writeln("function SearchGame()");
dd.writeln("{ var tt=document.forms[0].SearchText.value;");
dd.writeln(" var oo=document.forms[0].SearchType;");
dd.writeln(" oo=oo.options[oo.options.selectedIndex].text;");
dd.writeln(" if (tt=='') return(false);");
dd.writeln(" var ll=document.forms[0].GameList;");
dd.writeln(" var ii, jj=ll.selectedIndex-1, kk=ll.options.length-1;");
dd.writeln(" if (oo=='Moves')");
dd.writeln(" { for (ii=1; ii<kk; ii++)");
dd.writeln(" { if (PgnMoveText[(ii+jj)%kk].indexOf(tt)>=0)");
dd.writeln(" { ll.selectedIndex=(ii+jj)%kk+1;");
dd.writeln(" OpenGame(ll.options[(ii+jj)%kk+1].value);");
dd.writeln(" return(false);");
dd.writeln(" }");
dd.writeln(" }");
dd.writeln(" return(false);");
dd.writeln(" }");
dd.writeln(" tt=tt.toLowerCase();");
dd.writeln(" if (oo=='Player')");
dd.writeln(" { for (ii=1; ii<kk; ii++)");
dd.writeln(" { if (ll.options[(ii+jj)%kk+1].text.toLowerCase().indexOf(tt)>=0)");
dd.writeln(" { ll.selectedIndex=(ii+jj)%kk+1;");
dd.writeln(" OpenGame(ll.options[(ii+jj)%kk+1].value);");
dd.writeln(" return(false);");
dd.writeln(" }");
dd.writeln(" }");
dd.writeln(" return(false);");
dd.writeln(" }");
dd.writeln(" for (ii=1; ii<kk; ii++)");
dd.writeln(" { var nn, mm=oo.length+3, ss=GameText[(ii+jj)%kk].split('<br />');");
dd.writeln(" for (nn=0; nn<ss.length; nn++)");
dd.writeln(" { if ((ss[nn].indexOf(oo)>0)&&(ss[nn].toLowerCase().indexOf(tt)>=mm))");
dd.writeln(" { ll.selectedIndex=(ii+jj)%kk+1;");
dd.writeln(" OpenGame(ll.options[(ii+jj)%kk+1].value);");
dd.writeln(" return(false);");
dd.writeln(" }");
dd.writeln(" }");
dd.writeln(" }");
dd.writeln(" return(false);");
dd.writeln("}");
dd.writeln("if (window.event) document.captureEvents(Event.KEYDOWN);");
dd.writeln("document.onkeydown = KeyDown;");
dd.writeln("function KeyDown(e)");
dd.writeln("{ var kk=0;");
dd.writeln(" if (e) kk=e.which;");
dd.writeln(" else if (window.event) kk=event.keyCode;");
dd.writeln(" if ((kk==37)||(kk==52)||(kk==65460)) { if (parent.frames[0].MoveBack) parent.frames[0].MoveBack(1); }");
dd.writeln(" if ((kk==39)||(kk==54)||(kk==65462)) { if (parent.frames[0].MoveForward) parent.frames[0].MoveForward(1); }");
dd.writeln("}");
}
dd.writeln("</"+"script>");
if (jj==1) dd.writeln("</head><body onLoad=\"setTimeout('OpenGame(0)',400)\">");
else
{ if (ParseType<3)
{ if (parseInt(gg)<jj) dd.writeln("</head><body onLoad=\"setTimeout('OpenGame("+gg+")',400)\">");
else dd.writeln("</head><body>");
dd.writeln("<FORM onSubmit='return SearchGame()'><NOBR><SELECT name='GameList' onChange='OpenGame(this.options[selectedIndex].value)' SIZE=1>");
dd.writeln("<OPTION VALUE=-1>Select a game !");
for (ii=0; ii<jj; ii++)
{ if (ii==gg) dd.writeln("<OPTION VALUE="+ii+" selected>"+wwhite[ii].replace(/"/g,'')+" - "+bblack[ii].replace(/"/g,'')+" "+rresult[ii].replace(/"/g,''));
else dd.writeln("<OPTION VALUE="+ii+">"+wwhite[ii].replace(/"/g,'')+" - "+bblack[ii].replace(/"/g,'')+" "+rresult[ii].replace(/"/g,''));
}
dd.writeln("</SELECT>");
if (jj<24) dd.writeln("<!--");
dd.writeln("<INPUT name='SearchText' size=12><select name='SearchType'><option>Player</option>");
for (kk in sstype) dd.writeln("<option>"+kk+"</option>");
dd.writeln("<option>Moves</option></select><INPUT type='submit' value='search'>");
if (jj<24) dd.writeln("//-->");
dd.writeln("</NOBR></FORM>");
}
else
{ dd.writeln("</head><body>");
for (ii=0; ii<jj; ii++)
{ wwhite[ii]=wwhite[ii].replace(/"/g,'').replace('.','').replace(',',' ').replace(/ /g,' ');
bblack[ii]=bblack[ii].replace(/"/g,'').replace('.','').replace(',',' ').replace(/ /g,' ');
}
var ccT, ccL=1, ccN=new Array(), ccI=new Array(), ccC=new Array(), ccS=new Array(), ccO=new Array();
ccI[wwhite[0]]=0;
ccN[0]=wwhite[0];
for (ii=1; ii<jj; ii++)
{ for (kk=0; kk<ccL; kk++)
{ if (wwhite[ii]==ccN[kk]) kk=ccL+1;
}
if (kk==ccL)
{ ccI[wwhite[ii]]=ccL;
ccN[ccL++]=wwhite[ii];
}
}
for (ii=0; ii<jj; ii++)
{ for (kk=0; kk<ccL; kk++)
{ if (bblack[ii]==ccN[kk]) kk=ccL+1;
}
if (kk==ccL)
{ ccI[bblack[ii]]=ccL;
ccN[ccL++]=bblack[ii];
}
}
var ccCT=new Array(ccL);
for (kk=0; kk<ccL; kk++)
{ ccC[kk]=0; ccS[kk]=0; ccO[kk]=kk;
ccCT[kk]=new Array(ccL);
for (ii=0; ii<ccL; ii++) ccCT[kk][ii]="&nbsp;";
ccCT[kk][kk]="&nbsp;*";
}
for (ii=0; ii<jj; ii++)
{ ccT=rresult[ii].replace(/"/g,'');
if ((ccT.length==3)&&(ccT.indexOf("-")==1))
{ ccS[ccI[wwhite[ii]]]+=1.00001*parseInt(ccT.substr(0,1));
ccS[ccI[bblack[ii]]]+=1.00001*parseInt(ccT.substr(2,1));
ccCT[ccI[wwhite[ii]]][ccI[bblack[ii]]]+="&nbsp;<a href='javascript:OpenGame("+ii+")'>"+ccT.substr(0,1)+"</a>&nbsp;";
ccCT[ccI[bblack[ii]]][ccI[wwhite[ii]]]+="&nbsp;<a href='javascript:OpenGame("+ii+")'>"+ccT.substr(2,1)+"</a>&nbsp;";
}
else
{ ccS[ccI[wwhite[ii]]]+=0.5;
ccS[ccI[bblack[ii]]]+=0.5;
ccCT[ccI[wwhite[ii]]][ccI[bblack[ii]]]+="<a href='javascript:OpenGame("+ii+")'>&#189;</a>";
ccCT[ccI[bblack[ii]]][ccI[wwhite[ii]]]+="<a href='javascript:OpenGame("+ii+")'>&#189;</a>";
}
ccC[ccI[wwhite[ii]]]+=1;
ccC[ccI[bblack[ii]]]+=1;
}
for (ii=0; ii<ccL-1; ii++)
{ for (kk=ii; kk<ccL; kk++)
{ if (ccS[ccO[ii]]<ccS[ccO[kk]])
{ ccT=ccO[ii];
ccO[ii]=ccO[kk];
ccO[kk]=ccT;
}
}
}
dd.writeln("<table border=1 celpadding=0 cellspacing=0 width='100%'><tr><th>Rank</th><th>Name</th>");
for (kk=0; kk<ccL; kk++) dd.writeln("<th>"+(kk+1)+"</th>");
dd.writeln("<th>Score</th></tr>");
for (kk=0; kk<ccL; kk++)
{ dd.writeln("<tr><th nowrap>"+(kk+1)+"</th><th nowrap>"+ccN[ccO[kk]]+"</th>");
for (ii=0; ii<ccL; ii++) dd.writeln("<th nowrap>"+ccCT[ccO[kk]][ccO[ii]]+"&nbsp;</th>");
dd.writeln("<th nowrap>"+Math.round(10*ccS[ccO[kk]])/10+"/"+ccC[ccO[kk]]+"</th></tr>");
}
dd.writeln("</table><br>");
}
}
dd.writeln("<div id='GameText'> </div>");
dd.writeln("<layer id='GameTextLayer'> </layer>");
dd.writeln("<!--generated with LT-PGN-VIEWER 3.4--></body></html>");
dd.close();
}
function ScoreSheetHeader(tt)
{ var pp=new Array("Event","Site","Date","Round", "Result","White","Black","ECO","WhiteElo","BlackElo","FEN");
var vv=new Array("?","?","?","?","?","?","?","?","?","?","");
var ii, jj, ss, ee;
for (ii=0; ii<pp.length; ii++)
{ jj=tt.indexOf("["+pp[ii]);
if (jj>=0)
{ ss=tt.indexOf('"', jj+1);
if (ss>=0)
{ ee=tt.indexOf('"', ss+1);
if (ee>ss+1)
{ vv[ii]=tt.substring(ss+1,ee);
}
}
}
}
ss="<div align='center'><table width=50% cellpadding=0 cellspacing=0><tr><td><table width=100% cellpadding=2 cellspacing=0>";
ss+="<tr><td colspan=9><small>event</small><br /><nobr>"+vv[0]+"</nobr></td><td colspan=5><small>date</small><br /><nobr>"+vv[2]+"</nobr></td></tr>";
ss+="<tr><td colspan=9><small>site</small><br /><nobr>"+vv[1]+"</nobr></td><td width='8%'><small>rnd</small><br /><nobr>"+vv[3]+"</nobr></td><td width='16%' colspan=2><small>score</small><br /><nobr>"+vv[4]+"</nobr></td><td width='16%' colspan=2><small>eco</small><br /><nobr>"+vv[7]+"</nobr></td></tr>";
ss+="<tr><td colspan=11><small>white</small><br /><nobr>"+vv[5]+"</nobr></td><td colspan=3><small>rating</small><br /><nobr>"+vv[8]+"</nobr></td></tr>";
ss+="<tr><td colspan=11><small>black</small><br /><nobr>"+vv[6]+"</nobr></td><td colspan=3><small>rating</small><br /><nobr>"+vv[9]+"</nobr></td></tr>";
if (vv[10]) ss+="<tr><td colspan=14><small>fen</small><br /><nobr>"+vv[10]+"</nobr></td></tr>";
ss+="</table>";
return(ss);
}
function ScoreSheetFooter()
{ offsetAnchor=0;
return("</td></tr></table></div>");
}
function PrintPosition()
{ var pp="", tt="", ww;
if (document.BoardForm)
{ if (document.BoardForm.Pawns) pp=document.BoardForm.Pawns.checked;
if (pp) tt="Pawn structure after ";
else tt="Position after ";
if (parseInt(document.BoardForm.Position.value)>0) tt+=document.BoardForm.Position.value;
else tt=document.BoardForm.Position.value;
}
ww=window.open("");
with(ww.document)
{ open();
writeln("<html><head><title>"+tt+"</title></head><body><div align='center'>");
writeln(GetDiagram(pp,tt));
if(Annotation[MoveCount]) writeln(Annotation[MoveCount]);
writeln("</div></body></html>");
close();
}
ww.print();
}
function SetDragDrop(bb)
{ if ((document.BoardForm)&&(document.BoardForm.DragDrop))
document.BoardForm.DragDrop.checked=bb;
if (document.layers) return;
SetBoardClicked(-1);
isDragDrop=bb;
if (bb)
{ document.onmousedown=MouseDown;
document.onmousemove=MouseMove;
document.onmouseup=MouseUp;
}
else
{ document.onmousedown=null;
document.onmousemove=null;
document.onmouseup=null;
}
}
function MouseDown(e)
{ var ii="";
if (dragObj) MouseUp(e);
if (e)
{ dragObj=e.target;
ii=dragObj.id;
dragX=e.clientX;
dragY=e.clientY;
}
else if (window.event)
{ dragObj=event.srcElement;
ii=dragObj.id;
dragX=event.clientX;
dragY=event.clientY;
}
else return;
if (isNaN(parseInt(ii)))
{ if (isNaN(parseInt(ii.substr(1)))) { dragObj=null; return; }
ii=parseInt(ii.substr(1));
dragObj=document.images[ii+ImageOffset];
}
if (ii<64) BoardClick(ii,true);
else SetupPieceClick(ii-64,true);
if (!isDragDrop) return;
if ((BoardClicked<0)||(isAutoPlay)) dragObj=null;
else
{ dragObj.style.zIndex=200;
dragBorder=dragObj.style.borderWidth;
if (dragBorder) dragObj.style.borderWidth="0px";
}
return false;
}
function MouseMove(e)
{ if (!isDragDrop) return;
if (BoardClicked<0) return;
if (dragObj)
{ if (e)
{ dragObj.style.left=(e.clientX-dragX)+"px";
dragObj.style.top=(e.clientY-dragY)+"px";
}
else if (window.event)
{ dragObj.style.left=(event.clientX-dragX)+"px";
dragObj.style.top=(event.clientY-dragY)+"px";
}
}
return false;
}
function MouseUp(e)
{ var ii, jj, ddx=0, ddy=0, ww=32;
if (!isDragDrop) return;
if (BoardClicked<0) return;
if (dragObj)
{ ww=dragObj.width;
if (dragBorder) ww+=2*parseInt(dragBorder);
}
if ((isNaN(ww))||(ww==0)) ww=32;
if (e)
{ ddx=e.clientX-dragX;
ddy=e.clientY-dragY;
}
else if (window.event)
{ ddx=event.clientX-dragX;
ddy=event.clientY-dragY;
}
else return;
if (BoardClicked<64)
{ if (isRotated)
{ ii=(63-BoardClicked)%8;
jj=7-(63-BoardClicked-ii)/8;
}
else
{ ii=BoardClicked%8;
jj=7-(BoardClicked-ii)/8;
}
}
else
{ ii=9+BoardClicked%2;
jj=7-Math.floor((BoardClicked-64)/2);
}
ii+=Math.round(ddx/ww);
jj-=Math.round(ddy/ww);
if ((ii>=0)&&(ii<8)&&(jj>=0)&&(jj<8)) BoardClick(8*(7-jj)+ii,true);
else if ((isSetupBoard)&&(ii==9)&&(jj==0)) SetupPieceClick(12,true);
else BoardClick(BoardClicked,true);
if (dragObj)
{ dragObj.style.left = "0px";
dragObj.style.top = "0px";
dragObj.style.zIndex=1;
if (dragBorder) dragObj.style.borderWidth=dragBorder;
dragObj=null;
}
}
function AnimateBoard(nn)
{ var pp=0, mm=parseInt(Delay)/100;
isAnimating=true;
if (dragPiece[4]>=0) mm*=0.75;
mm=Math.floor(mm);
if (mm>10) mm=10;
if (nn>mm) pp=4;
if (nn%mm==1)
{ if (isRotated) dragImg[pp%3]=document.images[63-dragPiece[pp+2]-(7-dragPiece[pp+3])*8+ImageOffset];
else dragImg[pp%3]=document.images[dragPiece[pp+2]+(7-dragPiece[pp+3])*8+ImageOffset];
dragPiece[pp+2]=dragImg[pp%3].offsetLeft;
dragPiece[pp+3]=dragImg[pp%3].offsetTop;
if (isRotated) dragImg[pp%3]=document.images[63-dragPiece[pp+0]-(7-dragPiece[pp+1])*8+ImageOffset];
else dragImg[pp%3]=document.images[dragPiece[pp+0]+(7-dragPiece[pp+1])*8+ImageOffset];
dragPiece[pp+0]=dragImg[pp%3].offsetLeft;
dragPiece[pp+1]=dragImg[pp%3].offsetTop;
}
if (nn%mm!=0)
{ if (nn%mm==1)
{ dragImg[pp%3].style.zIndex=200+pp;
dragImgBorder=parseInt(dragImg[pp%3].style.borderWidth);
if (dragImgBorder) dragImg[pp%3].style.borderWidth="0px";
else dragImgBorder=0;
}
dragImg[pp%3].style.left=(Math.round((nn%mm)*(dragPiece[pp+2]-dragPiece[pp+0])/(mm-1))+dragImgBorder)+"px";
dragImg[pp%3].style.top=(Math.round((nn%mm)*(dragPiece[pp+3]-dragPiece[pp+1])/(mm-1))+dragImgBorder)+"px";
if ((dragPiece[4]>=0)&&(mm-1==nn)) setTimeout("AnimateBoard("+(mm+1)+")",50);
else setTimeout("AnimateBoard("+(nn+1)+")",50);
return;
}
RefreshBoard();
for (mm=0; mm<=pp; mm+=4)
{ dragImg[mm%3].style.left = 0;
dragImg[mm%3].style.top = 0;
dragImg[mm%3].style.zIndex=1;
if (dragImgBorder) dragImg[mm%3].style.borderWidth=dragImgBorder+"px";
dragImg[mm%3]=null;
dragPiece[mm+0]=-1;
}
isAnimating=false;
}
function IsComplete()
{ return(isInit);
}