unindex compacted pgn4web

pull/83/head
Thibault Duplessis 2014-02-18 23:32:31 +01:00
parent 66867763dd
commit 65ae9ce844
2 changed files with 1 additions and 218 deletions

1
.gitignore vendored
View File

@ -6,6 +6,7 @@ project/project
project/target
public/trans
public/compiled
public/vendor/pgn4web/pgn4web-compacted.js
serve/
serve/README
target

View File

@ -1,218 +0,0 @@
var pgn4web_version="2.80",pgn4web_project_url="http://pgn4web.casaschi.net",pgn4web_project_author="Paolo Casaschi",pgn4web_project_email;"undefined"==typeof pgn4web_project_email&&(pgn4web_project_email="pgn4web@casaschi.net");var helpWin;function displayHelp(a){helpWin&&!helpWin.closed&&helpWin.close();(helpWin=window.open(detectHelpLocation()+(a?"?"+a:""),"pgn4web_help","resizable=yes,scrollbars=yes,toolbar=no,location=no,menubar=no,status=no"))&&window.focus&&helpWin.focus()}
function customFunctionOnPgnTextLoad(){}function customFunctionOnPgnGameLoad(){}function customFunctionOnMove(){}function customFunctionOnAlert(a){}function customFunctionOnCheckLiveBroadcastStatus(){}function customPgnHeaderTag(a,b,c){var d,e="";a=a.replace(/\W+/g,"");void 0===c&&(c=currentGame);pgnHeader[c]&&(d=pgnHeader[c].match("\\[\\s*"+a+'\\s*"([^"]+)"\\s*\\]'))&&(e=d[1]);b&&(a=document.getElementById(b))&&"string"==typeof a.innerHTML&&(a.innerHTML=e);return e}
function customPgnCommentTag(a,b,c,d){var e,f="",g;a=a.replace(/\W+/g,"");"undefined"==typeof d&&(d=0);"undefined"==typeof c&&(c=CurrentPly);MoveCommentsVar[d][c]&&(e=MoveCommentsVar[d][c].match("\\[%"+a+'\\s+((?:,?(?:"[^"]*"|[^,\\]]*))*)\\s*\\]'))&&(f=e[1].replace(/\s+$/,""));b&&(g=document.getElementById(b))&&"string"==typeof g.innerHTML&&(g.innerHTML=f);return f}function simpleAddEvent(a,b,c){a.addEventListener?a.addEventListener(b,c,!1):a.attachEvent&&a.attachEvent("on"+b,c)}
simpleAddEvent(document,"keydown",pgn4web_handleKey_event);simpleAddEvent(window,"load",pgn4web_onload_event);function pgn4web_onload_event(a){pgn4web_onload(a)}function pgn4web_onload(a){start_pgn4web()}function start_pgn4web(){alertFirstResetLoadingPgn?alertFirstResetLoadingPgn=!1:resetAlert();InitImages();createBoard();0<LiveBroadcastDelay&&restartLiveBroadcastTimeout();pgn4web_initTouchEvents()}
var alertLog,alertLast,alertNum,alertNumSinceReset,fatalErrorNumSinceReset,alertPromptInterval=null,alertPromptOn=!1,alertFirstResetLoadingPgn=!0;resetAlert();function resetAlert(){alertLog=Array(5);alertLast=alertLog.length-1;alertNum=alertNumSinceReset=fatalErrorNumSinceReset=0;stopAlertPrompt();alertFirstResetLoadingPgn||boardIsDefault(debugShortcutSquare)&&boardShortcut(debugShortcutSquare,"pgn4web v"+pgn4web_version+" debug info",null,!0)}
function myAlert(a,b,c){alertNum++;alertNumSinceReset++;b&&fatalErrorNumSinceReset++;alertLast=(alertLast+1)%alertLog.length;alertLog[alertLast]=a+"\n"+(new Date).toLocaleString();boardIsDefault(debugShortcutSquare)&&boardShortcut(debugShortcutSquare,"pgn4web v"+pgn4web_version+" debug info, "+alertNum+" alert"+(1<alertNum?"s":""),null,!0);c||0!==LiveBroadcastDelay&&!0!==LiveBroadcastAlert||!boardIsDefault(debugShortcutSquare)||startAlertPrompt();customFunctionOnAlert(a)}
function startAlertPrompt(){alertPromptOn||(alertPromptInterval&&clearTimeout(alertPromptInterval),alertPromptInterval=setTimeout("alertPromptTick(true);",500))}function stopAlertPrompt(){alertPromptInterval&&(clearTimeout(alertPromptInterval),alertPromptInterval=null);alertPromptOn&&alertPromptTick(!1)}
function alertPromptTick(a){alertPromptInterval&&(clearTimeout(alertPromptInterval),alertPromptInterval=null);var b=colRowFromSquare(debugShortcutSquare);if(b){var c=1500;if(b=document.getElementById("tcol"+b.col+"trow"+b.row))b.className=alertPromptOn?highlightOption&&(0===colFromHighlighted&&7===rowFromHighlighted||0===colToHighlighted&&7===rowToHighlighted)?"highlightWhiteSquare":"whiteSquare":"blackSquare",c=(alertPromptOn=!alertPromptOn)?500:3E3;a&&(alertPromptInterval=setTimeout("alertPromptTick(true);",
c))}}function stopEvProp(a){a.cancelBubble=!0;a.stopPropagation&&a.stopPropagation();a.preventDefault&&a.preventDefault();return!1}var shortcutKeysWereEnabled=!1;function disableShortcutKeysAndStoreStatus(){!0===(shortcutKeysWereEnabled=shortcutKeysEnabled)&&SetShortcutKeysEnabled(!1)}function restoreShortcutKeysStatus(){!0===shortcutKeysWereEnabled&&SetShortcutKeysEnabled(!0);shortcutKeysWereEnabled=!1}function customShortcutKey_Shift_0(){}function customShortcutKey_Shift_1(){}
function customShortcutKey_Shift_2(){}function customShortcutKey_Shift_3(){}function customShortcutKey_Shift_4(){}function customShortcutKey_Shift_5(){}function customShortcutKey_Shift_6(){}function customShortcutKey_Shift_7(){}function customShortcutKey_Shift_8(){}function customShortcutKey_Shift_9(){}function pgn4web_handleKey_event(a){pgn4web_handleKey(a)}var shortcutKeysEnabled=!1;
function pgn4web_handleKey(a){var b,c;a||(a=window.event);b=a.keyCode;if(a.altKey||a.ctrlKey||a.metaKey||!(shortcutKeysEnabled||27==b&&a.shiftKey))return!0;switch(b){case 8:case 9:case 16:case 17:case 18:case 32:case 33:case 34:case 35:case 36:case 92:case 93:case 188:return!0;case 27:a.shiftKey?interactivelyToggleShortcutKeys():displayHelp();break;case 189:if(c=prompt("Enter shortcut square coordinates to click:",""))for(c=c.toUpperCase().replace(/[^A-Z0-9]/g,"");b=colRowFromSquare(c);)boardOnClick[b.col][b.row]({id:"img_tcol"+
b.col+"trow"+b.row},a),c=c.substr(2);break;case 90:a.shiftKey?window.open(pgn4web_project_url):displayDebugInfo();break;case 37:case 74:backButton(a);break;case 38:case 72:startButton(a);break;case 39:case 75:forwardButton(a);break;case 40:case 76:endButton(a);break;case 73:MoveToPrevComment(a.shiftKey);break;case 79:MoveToNextComment(a.shiftKey);break;case 190:a.shiftKey?goToFirstChild():goToNextVariationSibling();break;case 85:a.shiftKey?undoStackRedo():undoStackUndo();break;case 45:undoStackRedo();
break;case 46:undoStackUndo();break;case 83:a.shiftKey?searchPgnGame(""):searchPgnGamePrompt();break;case 13:a.shiftKey?searchPgnGame(lastSearchPgnExpression,!0):searchPgnGame(lastSearchPgnExpression);break;case 68:a.shiftKey?displayFenData():displayPgnData(!0);break;case 187:SwitchAutoPlay();break;case 65:GoToMove(CurrentPly+1);SetAutoPlay(!0);break;case 48:a.shiftKey?customShortcutKey_Shift_0():SetAutoPlay(!1);break;case 49:a.shiftKey?customShortcutKey_Shift_1():SetAutoplayDelayAndStart(1E3);break;
case 50:a.shiftKey?customShortcutKey_Shift_2():SetAutoplayDelayAndStart(2E3);break;case 51:a.shiftKey?customShortcutKey_Shift_3():SetAutoplayDelayAndStart(3E3);break;case 52:a.shiftKey?customShortcutKey_Shift_4():SetAutoplayDelayAndStart(4E3);break;case 53:a.shiftKey?customShortcutKey_Shift_5():SetAutoplayDelayAndStart(5E3);break;case 54:a.shiftKey?customShortcutKey_Shift_6():SetAutoplayDelayAndStart(6E3);break;case 55:a.shiftKey?customShortcutKey_Shift_7():SetAutoplayDelayAndStart(7E3);break;case 56:a.shiftKey?
customShortcutKey_Shift_8():SetAutoplayDelayAndStart(8E3);break;case 57:a.shiftKey?customShortcutKey_Shift_9():setCustomAutoplayDelay();break;case 81:SetAutoplayDelayAndStart(1E4);break;case 87:SetAutoplayDelayAndStart(2E4);break;case 69:SetAutoplayDelayAndStart(3E4);break;case 82:pauseLiveBroadcast();break;case 84:a.shiftKey?LiveBroadcastSteppingMode=!LiveBroadcastSteppingMode:refreshPgnSource();break;case 89:restartLiveBroadcast();break;case 70:a.shiftKey&&!IsRotated||FlipBoard();break;case 71:SetHighlight(!highlightOption);
break;case 88:randomGameRandomPly();break;case 67:1<numberOfGames&&Init(Math.floor(Math.random()*numberOfGames));break;case 86:1<numberOfGames&&Init(0);break;case 66:Init(currentGame-1);break;case 78:Init(currentGame+1);break;case 77:1<numberOfGames&&Init(numberOfGames-1);break;case 80:a.shiftKey?SetCommentsOnSeparateLines(!commentsOnSeparateLines):SetCommentsIntoMoveText(!commentsIntoMoveText);b=CurrentPly;c=CurrentVar;Init();GoToMove(b,c);break;default:return!0}return stopEvProp(a)}
for(var boardOnClick=Array(8),boardTitle=Array(8),boardDefault=Array(8),col=0;8>col;col++)boardOnClick[col]=Array(8),boardTitle[col]=Array(8),boardDefault[col]=Array(8);clearShortcutSquares("ABCDEFGH","12345678");function colRowFromSquare(a){if("string"!=typeof a||!a)return null;var b=a.charCodeAt(0)-65;if(0>b||7<b)return null;a=56-a.charCodeAt(1);return 0>a||7<a?null:{col:b,row:a}}
function clearShortcutSquares(a,b){if("string"==typeof a&&"string"==typeof b)for(var c=0;c<a.length;c++)for(var d=0;d<b.length;d++)boardShortcut(a.charAt(c).toUpperCase()+b.charAt(d),"",function(a,b){})}function boardIsDefault(a){return(a=colRowFromSquare(a))?boardDefault[a.col][a.row]:!1}
function boardShortcut(a,b,c,d){var e=colRowFromSquare(a);if(e){var f=e.col,e=e.row;boardTitle[f][e]=b;c&&(boardOnClick[f][e]=c);boardDefault[f][e]=d?!0:!1;if(b=document.getElementById("img_tcol"+f+"trow"+e))IsRotated&&(a=String.fromCharCode(72-f,49+e)),b.title=a+(boardTitle[f][e]?": "+boardTitle[f][e]:"")}}var debugShortcutSquare="A8";boardShortcut("A8","pgn4web v"+pgn4web_version+" debug info",function(a,b){displayDebugInfo()},!0);
boardShortcut("B8","show this position FEN string",function(a,b){displayFenData()},!0);boardShortcut("C8","show this game PGN source data",function(a,b){b.shiftKey?savePgnData(!0):displayPgnData(!0)},!0);boardShortcut("D8","show full PGN source data",function(a,b){b.shiftKey?savePgnData():displayPgnData()},!0);boardShortcut("E8","search help",function(a,b){displayHelp("search_tool")},!0);boardShortcut("F8","shortcut keys help",function(a,b){displayHelp("shortcut_keys")},!0);
boardShortcut("G8","shortcut squares help",function(a,b){displayHelp(b.shiftKey?"informant_symbols":"shortcut_squares")},!0);boardShortcut("H8","pgn4web help",function(a,b){displayHelp(b.shiftKey?"credits_and_license":"")},!0);boardShortcut("A7","pgn4web website",function(a,b){window.open(pgn4web_project_url)},!0);boardShortcut("B7","undo last chessboard position update",function(a,b){undoStackUndo()},!0);boardShortcut("C7","redo last undo",function(a,b){undoStackRedo()},!0);
boardShortcut("D7","toggle highlight last move",function(a,b){SetHighlight(!highlightOption)},!0);boardShortcut("E7","flip board",function(a,b){b.shiftKey&&!IsRotated||FlipBoard()},!0);boardShortcut("F7","toggle show comments in game text",function(a,b){b.shiftKey?SetCommentsOnSeparateLines(!commentsOnSeparateLines):SetCommentsIntoMoveText(!commentsIntoMoveText);var c=CurrentPly,d=CurrentVar;Init();GoToMove(c,d)},!0);boardShortcut("G7","",function(a,b){},!0);
boardShortcut("H7","toggle enabling shortcut keys",function(a,b){interactivelyToggleShortcutKeys()},!0);boardShortcut("A6","",function(a,b){},!0);boardShortcut("B6","",function(a,b){},!0);boardShortcut("C6","search previous finished game",function(a,b){searchPgnGame('\\[\\s*Result\\s*"(?!\\*"\\s*\\])',!0)});boardShortcut("D6","search previous unfinished game",function(a,b){searchPgnGame('\\[\\s*Result\\s*"\\*"\\s*\\]',!0)});
boardShortcut("E6","search next unfinished game",function(a,b){searchPgnGame('\\[\\s*Result\\s*"\\*"\\s*\\]',!1)},!0);boardShortcut("F6","search next finished game",function(a,b){searchPgnGame('\\[\\s*Result\\s*"(?!\\*"\\s*\\])',!1)},!0);boardShortcut("G6","",function(a,b){},!0);boardShortcut("H6","",function(a,b){},!0);boardShortcut("A5","repeat last search backward",function(a,b){searchPgnGame(lastSearchPgnExpression,!0)},!0);
boardShortcut("B5","search prompt",function(a,b){b.shiftKey?searchPgnGame(""):searchPgnGamePrompt()},!0);boardShortcut("C5","repeat last search",function(a,b){searchPgnGame(lastSearchPgnExpression)},!0);boardShortcut("D5","search previous win result",function(a,b){searchPgnGame('\\[\\s*Result\\s*"(1-0|0-1)"\\s*\\]',!0)},!0);boardShortcut("E5","search next win result",function(a,b){searchPgnGame('\\[\\s*Result\\s*"(1-0|0-1)"\\s*\\]',!1)},!0);boardShortcut("F5","",function(a,b){},!0);
boardShortcut("G5","",function(a,b){},!0);boardShortcut("H5","",function(a,b){},!0);boardShortcut("A4","search previous event",function(a,b){searchPgnGame('\\[\\s*Event\\s*"(?!'+fixRegExp(gameEvent[currentGame])+'"\\s*\\])',!0)},!0);
boardShortcut("B4","search previous round of same event",function(a,b){searchPgnGame('\\[\\s*Event\\s*"'+fixRegExp(gameEvent[currentGame])+'"\\s*\\].*\\[\\s*Round\\s*"(?!'+fixRegExp(gameRound[currentGame])+'"\\s*\\])|\\[\\s*Round\\s*"(?!'+fixRegExp(gameRound[currentGame])+'"\\s*\\]).*\\[\\s*Event\\s*"'+fixRegExp(gameEvent[currentGame])+'"\\s*\\]',!0)},!0);
boardShortcut("C4","search previous game of same black player",function(a,b){searchPgnGame("\\[\\s*"+(b.shiftKey?"White":"Black")+'\\s*"'+fixRegExp(gameBlack[currentGame])+'"\\s*\\]',!0)},!0);boardShortcut("D4","search previous game of same white player",function(a,b){searchPgnGame("\\[\\s*"+(b.shiftKey?"Black":"White")+'\\s*"'+fixRegExp(gameWhite[currentGame])+'"\\s*\\]',!0)},!0);
boardShortcut("E4","search next game of same white player",function(a,b){searchPgnGame("\\[\\s*"+(b.shiftKey?"Black":"White")+'\\s*"'+fixRegExp(gameWhite[currentGame])+'"\\s*\\]',!1)},!0);boardShortcut("F4","search next game of same black player",function(a,b){searchPgnGame("\\[\\s*"+(b.shiftKey?"White":"Black")+'\\s*"'+fixRegExp(gameBlack[currentGame])+'"\\s*\\]',!1)},!0);
boardShortcut("G4","search next round of same event",function(a,b){searchPgnGame('\\[\\s*Event\\s*"'+fixRegExp(gameEvent[currentGame])+'"\\s*\\].*\\[\\s*Round\\s*"(?!'+fixRegExp(gameRound[currentGame])+'"\\s*\\])|\\[\\s*Round\\s*"(?!'+fixRegExp(gameRound[currentGame])+'"\\s*\\]).*\\[\\s*Event\\s*"'+fixRegExp(gameEvent[currentGame])+'"\\s*\\]',!1)},!0);boardShortcut("H4","search next event",function(a,b){searchPgnGame('\\[\\s*Event\\s*"(?!'+fixRegExp(gameEvent[currentGame])+'"\\s*\\])',!1)},!0);
boardShortcut("A3","load first game",function(a,b){1<numberOfGames&&Init(0)},!0);boardShortcut("B3","jump to previous games decile",function(a,b){if(0<currentGame){calculateDeciles();for(var c=deciles.length-2;0<=c;c--)if(currentGame>deciles[c]){Init(deciles[c]);break}}},!0);boardShortcut("C3","load previous game",function(a,b){Init(currentGame-1)},!0);boardShortcut("D3","load random game",function(a,b){1<numberOfGames&&Init(Math.floor(Math.random()*numberOfGames))},!0);
boardShortcut("E3","load random game at random position",function(a,b){randomGameRandomPly()},!0);boardShortcut("F3","load next game",function(a,b){Init(currentGame+1)},!0);boardShortcut("G3","jump to next games decile",function(a,b){if(currentGame<numberOfGames-1){calculateDeciles();for(var c=1;c<deciles.length;c++)if(currentGame<deciles[c]){Init(deciles[c]);break}}},!0);boardShortcut("H3","load last game",function(a,b){1<numberOfGames&&Init(numberOfGames-1)},!0);
boardShortcut("A2","stop autoplay",function(a,b){SetAutoPlay(b.shiftKey)},!0);boardShortcut("B2","toggle autoplay",function(a,b){SwitchAutoPlay()},!0);boardShortcut("C2","autoplay 1 second",function(a,b){SetAutoplayDelayAndStart(1E3*(b.shiftKey?10:1))},!0);boardShortcut("D2","autoplay 2 seconds",function(a,b){SetAutoplayDelayAndStart(1E3*(b.shiftKey?20:2))},!0);boardShortcut("E2","autoplay 5 seconds",function(a,b){SetAutoplayDelayAndStart(1E3*(b.shiftKey?50:5))},!0);
boardShortcut("F2","autoplay custom delay",function(a,b){setCustomAutoplayDelay()},!0);boardShortcut("G2","replay up to 6 previous half-moves, then autoplay forward",function(a,b){replayPreviousMoves(b.shiftKey?10:6)},!0);boardShortcut("H2","replay the previous half-move, then autoplay forward",function(a,b){replayPreviousMoves(b.shiftKey?3:1)},!0);boardShortcut("A1","go to game start",function(a,b){startButton(b)},!0);boardShortcut("B1","",function(a,b){},!0);
boardShortcut("C1","",function(a,b){},!0);boardShortcut("D1","move backward",function(a,b){GoToMove(CurrentPly-1)},!0);boardShortcut("E1","move forward",function(a,b){GoToMove(CurrentPly+1)},!0);boardShortcut("F1","",function(a,b){},!0);boardShortcut("G1","",function(a,b){},!0);boardShortcut("H1","go to game end",function(a,b){endButton(b)},!0);setG7A6B6H7boardShortcuts();
function setG7A6B6H7boardShortcuts(){0<LiveBroadcastDelay?(boardIsDefault("G7")&&boardShortcut("G7","",function(a,b){},!0),boardIsDefault("A6")&&boardShortcut("A6","pause live broadcast automatic games refresh",function(a,b){pauseLiveBroadcast()},!0),boardIsDefault("B6")&&boardShortcut("B6","restart live broadcast automatic games refresh",function(a,b){restartLiveBroadcast()},!0),boardIsDefault("H6")&&boardShortcut("H6","force live broadcast games refresh",function(a,b){refreshPgnSource()},!0)):(boardIsDefault("G7")&&
boardShortcut("G7","toggle autoplay next game",function(a,b){SetAutoplayNextGame(!autoplayNextGame)},!0),boardIsDefault("A6")&&boardShortcut("A6","",function(a,b){},!0),boardIsDefault("B6")&&boardShortcut("B6","",function(a,b){},!0),boardIsDefault("H6")&&boardShortcut("H6","",function(a,b){},!0))}setB1C1F1G1boardShortcuts();
function setB1C1F1G1boardShortcuts(){commentsIntoMoveText&&GameHasComments?(boardIsDefault("B1")&&boardShortcut("B1","go to previous comment or variation",function(a,b){b.shiftKey?GoToMove(CurrentPly-10):MoveToPrevComment()},!0),boardIsDefault("G1")&&boardShortcut("G1","go to next comment or variation",function(a,b){b.shiftKey?GoToMove(CurrentPly+10):MoveToNextComment()},!0)):(boardIsDefault("B1")&&boardShortcut("B1","move 10 half-moves backward",function(a,b){GoToMove(CurrentPly-10)},!0),boardIsDefault("G1")&&
boardShortcut("G1","move 10 half-moves forward",function(a,b){GoToMove(CurrentPly+10)},!0));commentsIntoMoveText&&GameHasVariations?(boardIsDefault("C1")&&boardShortcut("C1","go to parent variation",function(a,b){b.shiftKey?GoToMove(CurrentPly-6):GoToMove(StartPlyVar[CurrentVar])},!0),boardIsDefault("F1")&&boardShortcut("F1","cycle through alternative variations, if any, otherwise move forward",function(a,b){b.shiftKey?GoToMove(CurrentPly+6):goToNextVariationSibling()||GoToMove(CurrentPly+1)},!0)):
(boardIsDefault("C1")&&boardShortcut("C1","move 6 half-moves backward",function(a,b){GoToMove(CurrentPly-6)},!0),boardIsDefault("F1")&&boardShortcut("F1","move 6 half-moves forward",function(a,b){GoToMove(CurrentPly+6)},!0))}var deciles=Array(11);function calculateDeciles(){for(var a=0;a<deciles.length;a++)deciles[a]=Math.round((numberOfGames-1)*a/(deciles.length-1))}
function replayPreviousMoves(a){a=a?CurrentPly-a:StartPly;a<StartPlyVar[CurrentVar]&&(a=StartPlyVar[CurrentVar]+(0===CurrentVar?0:1));a!==CurrentPly&&GoToMove(a);SetAutoPlay(!0)}function detectJavascriptLocation(a){"undefined"==typeof a&&(a=/(pgn4web|pgn4web-compacted).js$/);for(var b=document.getElementsByTagName("script"),c=0;c<b.length;c++)if(b[c].src&&b[c].src.match(a))return b[c].src;return""}
function detectHelpLocation(){return detectJavascriptLocation().replace(/(pgn4web|pgn4web-compacted)\.js/,"pgn4web-help.html")}function detectBaseLocation(){for(var a=document.getElementsByTagName("base"),b=0;b<a.length;b++)if(a[b].href)return a[b].href;return""}var debugWin;
function displayDebugInfo(){var a,b=detectBaseLocation();a=detectJavascriptLocation();stopAlertPrompt();var c="pgn4web: version="+pgn4web_version+" homepage="+pgn4web_project_url+"\n\nHTMLURL: length="+location.href.length+" url=",d=100>location.href.length?location.href:location.href.substring(0,99)+"...",b="\n"+(b?"BASEURL: url="+b+"\n":"")+("pgn4web.js"!=a?"JSURL: url="+a+"\n":"");if(pgnUrl)b+="PGNURL: url="+pgnUrl;else if(a=document.getElementById("pgnText"))b+="PGNTEXT: length="+("textarea"==
a.tagName.toLowerCase()?a.value.length:"?");b+="\n\nGAME: current="+(currentGame+1)+" number="+numberOfGames+"\nVARIATION: current="+CurrentVar+" number="+(numberOfVars-1)+"\nPLY: start="+StartPly+" current="+CurrentPly+" number="+PlyNumber+"\nAUTOPLAY: status="+(isAutoPlayOn?"on":"off")+" delay="+Delay+"ms next="+autoplayNextGame+"\n\n";0<LiveBroadcastDelay&&(b+="LIVEBROADCAST: status="+liveStatusDebug()+" ticker="+LiveBroadcastTicker+" delay="+LiveBroadcastDelay+"m\nrefreshed: "+LiveBroadcastLastRefreshedLocal+
"\nreceived: "+LiveBroadcastLastReceivedLocal+"\nmodified (server time): "+LiveBroadcastLastModified_ServerTime()+"\n\n");"function"==typeof engineWinCheck&&(b+="ANALYSIS: "+(engineWinCheck()?"board=connected "+engineWin.customDebugInfo():"board=disconnected")+"\n\n");(a=customDebugInfo())&&(b+="CUSTOM: "+a+"\n\n");b+="ALERTLOG: fatalnew="+fatalErrorNumSinceReset+" new="+alertNumSinceReset+" shown="+Math.min(alertNum,alertLog.length)+" total="+alertNum+"\n--";if(0<alertNum)for(a=0;a<alertLog.length&&
void 0!==alertLog[(alertNum-1-a)%alertLog.length];a++)b+="\n"+alertLog[(alertNum-1-a)%alertLog.length]+"\n--";confirm(c+d+b+"\n\nclick OK to show this debug info in a browser window for cut and paste")&&(debugWin&&!debugWin.closed&&debugWin.close(),debugWin=window.open("","pgn4web_debug_data","resizable=yes,scrollbars=yes,toolbar=no,location=no,menubar=no,status=no"))&&(debugWin.document.open("text/html","replace"),debugWin.document.write("<html><head><title>pgn4web debug info</title><link rel='shortcut icon' href='pawn.ico' /></head><body>\n<pre>\n"+
c+location.href+" "+b+"\n</pre>\n</body></html>"),debugWin.document.close(),window.focus&&debugWin.focus());alertNumSinceReset=fatalErrorNumSinceReset=0}function liveStatusDebug(){return LiveBroadcastEnded?"ended":LiveBroadcastPaused?"paused":LiveBroadcastStarted?"started":"waiting"}function customDebugInfo(){return""}var pgnWin;
function displayPgnData(a){pgnWin&&!pgnWin.closed&&pgnWin.close();if(pgnWin=window.open("","pgn4web_pgn_data","resizable=yes,scrollbars=yes,toolbar=no,location=no,menubar=no,status=no")){var b="<html><head><title>pgn4web PGN source</title><link rel='shortcut icon' href='pawn.ico' /></head><body>\n<pre>\n";if(a)b+=fullPgnGame(currentGame)+"\n\n";else for(a=0;a<numberOfGames;++a)b+=fullPgnGame(a)+"\n\n";b+="\n</pre>\n</body></html>";pgnWin.document.open("text/html","replace");pgnWin.document.write(b);
pgnWin.document.close();window.focus&&pgnWin.focus()}}function savePgnData(a){pgnUrl&&!a?location.href=pgnUrl:displayPgnData(a)}
function CurrentFEN(){for(var a="",b=0,c=7;0<=c;c--){for(var d=0;7>=d;d++)0===Board[d][c]?b++:(b&&(a+=b,b=0),0<Board[d][c]?a+=FenPieceName.charAt(Board[d][c]-1).toUpperCase():0>Board[d][c]&&(a+=FenPieceName.charAt(-Board[d][c]-1).toLowerCase()));b&&(a+=b,b=0);0<c&&(a+="/")}a+=CurrentPly%2?" b":" w";b="";null!==RookForOOCastling(0)&&(b+=FenPieceName.charAt(0).toUpperCase());null!==RookForOOOCastling(0)&&(b+=FenPieceName.charAt(1).toUpperCase());null!==RookForOOCastling(1)&&(b+=FenPieceName.charAt(0).toLowerCase());
null!==RookForOOOCastling(1)&&(b+=FenPieceName.charAt(1).toLowerCase());a+=" "+(b||"-");HistEnPassant[CurrentPly]?(a+=" "+String.fromCharCode(HistEnPassantCol[CurrentPly]+97),a+=CurrentPly%2?"3":"6"):a+=" -";b=InitialHalfMoveClock;for(c=StartPly;c<CurrentPly;c++)6==HistType[0][c]||16<=HistPieceId[1][c]?b=0:b++;return a=a+(" "+b)+(" "+(Math.floor(CurrentPly/2)+1))}var fenWin;
function displayFenData(a){fenWin&&!fenWin.closed&&fenWin.close();var b=CurrentFEN(),c="",d=0;if(a)for(var e=CurrentPly;e<=StartPly+PlyNumber;e++){var f="";e==StartPly+PlyNumber?f=CurrentVar?"*":gameResult[currentGame]||"*":(0===e%2?f=Math.floor(e/2)+1+". ":e==CurrentPly&&(f=Math.floor(e/2)+1+"... "),f+=Moves[e]);c.length+f.length+1>d+80?(d=c.length,c+="\n"+f):(0<c.length&&(c+=" "),c+=f)}if(fenWin=window.open("","pgn4web_fen_data","resizable=yes,scrollbars=yes,toolbar=no,location=no,menubar=no,status=no"))d=
"<html><head><title>pgn4web FEN string</title><link rel='shortcut icon' href='pawn.ico' /></head><body>\n<b><pre>\n\n"+b+"\n\n</pre></b>\n<hr>\n<pre>\n\n",a&&(d+='[Event "'+((CurrentVar?"":gameEvent[currentGame])||"?")+'"]\n[Site "'+((CurrentVar?"":gameSite[currentGame])||"?")+'"]\n[Date "'+((CurrentVar?"":gameDate[currentGame])||"????.??.??")+'"]\n[Round "'+((CurrentVar?"":gameRound[currentGame])||"?")+'"]\n[White "'+((CurrentVar?"":gameWhite[currentGame])||"?")+'"]\n[Black "'+((CurrentVar?"":gameBlack[currentGame])||
"?")+'"]\n[Result "'+((CurrentVar?"":gameResult[currentGame])||"*")+'"]\n'),b==FenStringStart&&a||(d+='[SetUp "1"]\n[FEN "'+b+'"]\n'),""!==gameVariant[currentGame]&&(d+='[Variant "'+gameVariant[currentGame]+'"]\n'),a&&(d+="\n"+c+"\n"),d+="</pre>\n</body></html>",fenWin.document.open("text/html","replace"),fenWin.document.write(d),fenWin.document.close(),window.focus&&fenWin.focus()}
for(var pgnHeader=[],pgnGame=[],numberOfGames=-1,currentGame=-1,firstStart=!0,gameDate=[],gameWhite=[],gameBlack=[],gameEvent=[],gameSite=[],gameRound=[],gameResult=[],gameSetUp=[],gameFEN=[],gameInitialWhiteClock=[],gameInitialBlackClock=[],gameVariant=[],highlightedMoveId="",isAutoPlayOn=!1,AutoPlayInterval=null,Delay=1E3,autostartAutoplay=!1,autoplayNextGame=!1,initialGame=1,initialVariation=0,initialHalfmove=0,alwaysInitialHalfmove=!1,LiveBroadcastInterval=null,LiveBroadcastDelay=0,LiveBroadcastAlert=
!1,LiveBroadcastDemo=!1,LiveBroadcastStarted=!1,LiveBroadcastEnded=!1,LiveBroadcastPaused=!1,LiveBroadcastTicker=0,LiveBroadcastGamesRunning=0,LiveBroadcastStatusString="",LiveBroadcastLastModified=new Date(0),LiveBroadcastLastModifiedHeader=LiveBroadcastLastModified.toUTCString(),LiveBroadcastLastReceivedLocal="unavailable",LiveBroadcastLastRefreshedLocal="unavailable",LiveBroadcastPlaceholderEvent="live chess broadcast",LiveBroadcastPlaceholderPgn='[Event "'+LiveBroadcastPlaceholderEvent+'"]',gameDemoMaxPly=
[],gameDemoLength=[],LiveBroadcastSteppingMode=!1,ParseLastMoveError=!1,castleRook=-1,mvCapture=0,mvIsCastling=0,mvIsPromotion=0,mvFromCol=-1,mvFromRow=-1,mvToCol=-1,mvToRow=-1,mvPiece=-1,mvPieceId=-1,mvPieceOnTo=-1,mvCaptured=-1,mvCapturedId=-1,mvIsNull=0,Board=Array(8),i=0;8>i;++i)Board[i]=Array(8);
for(var HistCol=Array(3),HistRow=Array(3),HistPieceId=Array(2),HistType=Array(2),HistVar=[],PieceCol=Array(2),PieceRow=Array(2),PieceType=Array(2),PieceMoveCounter=Array(2),i=0;2>i;++i)PieceCol[i]=Array(16),PieceRow[i]=Array(16),PieceType[i]=Array(16),PieceMoveCounter[i]=Array(16),HistType[i]=[],HistPieceId[i]=[];for(i=0;3>i;++i)HistCol[i]=[],HistRow[i]=[];
var HistEnPassant=[!1],HistEnPassantCol=[-1],HistNull=[0],FenPieceName="KQRBNP",PieceCode=FenPieceName.split(""),FenStringStart="rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1",columnsLetters="ABCDEFGH",InitialHalfMoveClock=0,PieceImg=[Array(6),Array(6)],ClearImg,ImagePath="images",ImagePathOld=null,imageType="png",defaultImagesSize=40,highlightOption=!0,commentsIntoMoveText=!0,commentsOnSeparateLines=!1,pgnUrl="",CastlingLong=Array(2),CastlingShort=Array(2),Moves=[],MoveComments=[],MoveColor,
MoveCount,PlyNumber,StartPly,CurrentPly,IsRotated=!1,pgnHeaderTagRegExp=/\[\s*(\w+)\s*"([^"]*)"\s*\]/,pgnHeaderTagRegExpGlobal=/\[\s*(\w+)\s*"([^"]*)"\s*\]/g,pgnHeaderBlockRegExp=/\s*(\[\s*\w+\s*"[^"]*"\s*\]\s*)+/,emptyPgnHeader='[Event ""]\n[Site ""]\n[Date ""]\n[Round ""]\n[White ""]\n[Black ""]\n[Result ""]\n',alertPgn=emptyPgnHeader+"\n{error: click on the top left chessboard square for debug info}",pgn4webVariationRegExp=/\[%pgn4web_variation (\d+)\]/,pgn4webVariationRegExpGlobal=/\[%pgn4web_variation (\d+)\]/g,
gameSelectorHead=" &middot;&middot;&middot;",gameSelectorMono=!0,gameSelectorNum=!1,gameSelectorNumLenght=0,gameSelectorChEvent=0,gameSelectorChSite=0,gameSelectorChRound=0,gameSelectorChWhite=15,gameSelectorChBlack=15,gameSelectorChResult=0,gameSelectorChDate=10;
function CheckLegality(a,b){var c;if("--"==a)return StoreMove(b),!0;if("O-O"==a){if(!CheckLegalityOO())return!1;for(c=PieceCol[MoveColor][0];7>c;c++)if(IsCheck(c,7*MoveColor,MoveColor))return!1;StoreMove(b);return!0}if("O-O-O"==a){if(!CheckLegalityOOO())return!1;for(c=PieceCol[MoveColor][0];1<c;c--)if(IsCheck(c,7*MoveColor,MoveColor))return!1;StoreMove(b);return!0}if(!mvCapture&&0!==Board[mvToCol][mvToRow]||mvCapture&&Color(Board[mvToCol][mvToRow])!=1-MoveColor&&(6!=mvPiece||!HistEnPassant[b]||HistEnPassantCol[b]!=
mvToCol||mvToRow!=5-3*MoveColor)||mvIsPromotion&&(6!=mvPiece||6<=mvPieceOnTo||mvToRow!=7*(1-MoveColor)))return!1;for(var d=0;16>d;++d)if(PieceType[MoveColor][d]==mvPiece&&(1==mvPiece?c=CheckLegalityKing(d):2==mvPiece?c=CheckLegalityQueen(d):3==mvPiece?c=CheckLegalityRook(d):4==mvPiece?c=CheckLegalityBishop(d):5==mvPiece?c=CheckLegalityKnight(d):6==mvPiece&&(c=CheckLegalityPawn(d)),c))if(mvPieceId=d,StoreMove(b),IsCheck(PieceCol[MoveColor][0],PieceRow[MoveColor][0],MoveColor))UndoMove(b);else return!0;
return!1}function CheckLegalityKing(a){return 0<=mvFromCol&&mvFromCol!=PieceCol[MoveColor][a]||0<=mvFromRow&&mvFromRow!=PieceRow[MoveColor][a]||1<Math.abs(PieceCol[MoveColor][a]-mvToCol)||1<Math.abs(PieceRow[MoveColor][a]-mvToRow)?!1:!0}
function CheckLegalityQueen(a){return 0<=mvFromCol&&mvFromCol!=PieceCol[MoveColor][a]||0<=mvFromRow&&mvFromRow!=PieceRow[MoveColor][a]||0!==(PieceCol[MoveColor][a]-mvToCol)*(PieceRow[MoveColor][a]-mvToRow)&&Math.abs(PieceCol[MoveColor][a]-mvToCol)!=Math.abs(PieceRow[MoveColor][a]-mvToRow)||!CheckClearWay(a)?!1:!0}
function CheckLegalityRook(a){return 0<=mvFromCol&&mvFromCol!=PieceCol[MoveColor][a]||0<=mvFromRow&&mvFromRow!=PieceRow[MoveColor][a]||0!==(PieceCol[MoveColor][a]-mvToCol)*(PieceRow[MoveColor][a]-mvToRow)||!CheckClearWay(a)?!1:!0}function CheckLegalityBishop(a){return 0<=mvFromCol&&mvFromCol!=PieceCol[MoveColor][a]||0<=mvFromRow&&mvFromRow!=PieceRow[MoveColor][a]||Math.abs(PieceCol[MoveColor][a]-mvToCol)!=Math.abs(PieceRow[MoveColor][a]-mvToRow)||!CheckClearWay(a)?!1:!0}
function CheckLegalityKnight(a){return 0<=mvFromCol&&mvFromCol!=PieceCol[MoveColor][a]||0<=mvFromRow&&mvFromRow!=PieceRow[MoveColor][a]||2!=Math.abs(PieceCol[MoveColor][a]-mvToCol)*Math.abs(PieceRow[MoveColor][a]-mvToRow)?!1:!0}
function CheckLegalityPawn(a){if(0<=mvFromCol&&mvFromCol!=PieceCol[MoveColor][a]||0<=mvFromRow&&mvFromRow!=PieceRow[MoveColor][a]||Math.abs(PieceCol[MoveColor][a]-mvToCol)!=mvCapture)return!1;if(mvCapture){if(PieceRow[MoveColor][a]-mvToRow!=2*MoveColor-1)return!1}else if(PieceRow[MoveColor][a]-mvToRow==4*MoveColor-2){if(PieceRow[MoveColor][a]!=1+5*MoveColor||0!==Board[mvToCol][mvToRow+2*MoveColor-1])return!1}else if(PieceRow[MoveColor][a]-mvToRow!=2*MoveColor-1)return!1;return!0}
function RookForOOCastling(a){if(0>CastlingShort[a]||0<PieceMoveCounter[a][0])return null;for(var b=!1,c=0;16>c;c++)if(PieceCol[a][c]==CastlingShort[a]&&PieceCol[a][c]>PieceCol[a][0]&&PieceRow[a][c]==7*a&&3==PieceType[a][c]){b=!0;break}return!b||0<PieceMoveCounter[a][c]?null:c}
function CheckLegalityOO(){var a=RookForOOCastling(MoveColor);if(null===a)return!1;Board[PieceCol[MoveColor][0]][7*MoveColor]=0;Board[PieceCol[MoveColor][a]][7*MoveColor]=0;var b=PieceCol[MoveColor][a];for(6>b&&(b=6);b>PieceCol[MoveColor][0]||5<=b;){if(0!==Board[b][7*MoveColor])return!1;--b}castleRook=a;return!0}
function RookForOOOCastling(a){if(0>CastlingLong[a]||0<PieceMoveCounter[a][0])return null;for(var b=!1,c=0;16>c;c++)if(PieceCol[a][c]==CastlingLong[a]&&PieceCol[a][c]<PieceCol[a][0]&&PieceRow[a][c]==7*a&&3==PieceType[a][c]){b=!0;break}return!b||0<PieceMoveCounter[a][c]?null:c}
function CheckLegalityOOO(){var a=RookForOOOCastling(MoveColor);if(null===a)return!1;Board[PieceCol[MoveColor][0]][7*MoveColor]=0;Board[PieceCol[MoveColor][a]][7*MoveColor]=0;var b=PieceCol[MoveColor][a];for(2<b&&(b=2);b<PieceCol[MoveColor][0]||3>=b;){if(0!==Board[b][7*MoveColor])return!1;++b}castleRook=a;return!0}
function CheckClearWay(a){var b=sign(mvToCol-PieceCol[MoveColor][a]),c=sign(mvToRow-PieceRow[MoveColor][a]),d=PieceCol[MoveColor][a]+b;for(a=PieceRow[MoveColor][a]+c;d!=mvToCol||a!=mvToRow;){if(0!==Board[d][a])return!1;d+=b;a+=c}return!0}function CleanMove(a){a=a.replace(/[^a-wyzA-WYZ0-9#-]*/g,"");a.match(/^[Oo0]/)&&(a=a.replace(/[o0]/g,"O").replace(/O(?=O)/g,"O-"));return a=a.replace(/ep/i,"")}
function GoToMove(a,b){SetAutoPlay(!1);"undefined"==typeof b?b=CurrentVar:0>b?b=0:b>=numberOfVars&&(b=numberOfVars-1);0>a?a=0:a>=StartPlyVar[b]+PlyNumberVar[b]&&(a=StartPlyVar[b]+PlyNumberVar[b]);if(b===CurrentVar){var c=a-CurrentPly;0<c?MoveForward(c):MoveBackward(-c)}else{var c=StartPly,d=PredecessorsVars[CurrentVar].length-1;a:for(;0<=d;d--)for(var e=PredecessorsVars[b].length-1;0<=e;e--)if(PredecessorsVars[CurrentVar][d]===PredecessorsVars[b][e]){c=Math.min(PredecessorsVars[CurrentVar][d+1]?StartPlyVar[PredecessorsVars[CurrentVar][d+
1]]:CurrentPly,PredecessorsVars[b][e+1]?StartPlyVar[PredecessorsVars[b][e+1]]:a);break a}MoveBackward(CurrentPly-c,!0);MoveForward(a-c,b)}}function SetShortcutKeysEnabled(a){shortcutKeysEnabled=a}function interactivelyToggleShortcutKeys(){confirm("Shortcut keys currently "+(shortcutKeysEnabled?"enabled":"disabled")+".\nToggle shortcut keys to "+(shortcutKeysEnabled?"DISABLED":"ENABLED")+"?")&&SetShortcutKeysEnabled(!shortcutKeysEnabled)}function SetCommentsIntoMoveText(a){commentsIntoMoveText=a}
function SetCommentsOnSeparateLines(a){commentsOnSeparateLines=a}function SetAutostartAutoplay(a){autostartAutoplay=a}function SetAutoplayNextGame(a){autoplayNextGame=a}function SetInitialHalfmove(a,b){alwaysInitialHalfmove=!0===b;void 0===a?initialHalfmove=0:(initialHalfmove=a,"string"==typeof a&&a.match(/^(start|end|random|comment)$/)||isNaN(initialHalfmove=parseInt(initialHalfmove,10))&&(initialHalfmove=0))}function SetInitialVariation(a){initialVariation=isNaN(a=parseInt(a,10))?0:a}
function SetInitialGame(a){initialGame="undefined"==typeof a?1:a}function randomGameRandomPly(){if(1<numberOfGames){var a=initialHalfmove,b=alwaysInitialHalfmove;SetInitialHalfmove("random",!0);Init(Math.floor(Math.random()*numberOfGames));SetInitialHalfmove(a,b)}}function clockFromComment(a){return customPgnCommentTag("clk",null,a)}function clockFromHeader(a){return(a=(customPgnHeaderTag("Clock")+"").match("^"+(a?"W":"B")+"/(.*)$"))?a[1]:null}
function HighlightLastMove(){var a,b,c,d;undoStackStore();highlightedMoveId&&(a=document.getElementById(highlightedMoveId))&&(a.className=(highlightedMoveId.match(/Var0Mv/)?"move":"variation")+" notranslate");var e=CurrentPly-1;e>StartPlyVar[CurrentVar]+PlyNumberVar[CurrentVar]&&(e=StartPlyVar[CurrentVar]+PlyNumberVar[CurrentVar]);if(a=document.getElementById("GameLastComment"))commentsIntoMoveText?(variationTextDepth=0===CurrentVar?0:1,c='<SPAN CLASS="comment">'+strippedMoveComment(e+1,CurrentVar,
!0).replace(/\sID="[^"]*"/g,"")+"</SPAN>"):c="",a.innerHTML=c;c=(b=0===(e+1)%2)?"white":"black";if(a=document.getElementById("GameSideToMove"))a.innerHTML=c;c=document.getElementById(b?"GameBlackClock":"GameWhiteClock");d=b?gameInitialBlackClock[currentGame]:gameInitialWhiteClock[currentGame];var f=document.getElementById(b?"GameWhiteClock":"GameBlackClock"),g=b?gameInitialWhiteClock[currentGame]:gameInitialBlackClock[currentGame];c&&(a=e+1!==StartPly+PlyNumber||LiveBroadcastDemo&&"*"===gameResult[currentGame]?
null:clockFromHeader(!b),null===a&&(a=e+1>StartPly?clockFromComment(e+1):d,!a&&CurrentPly===StartPly+PlyNumber&&(d=RegExp((b?"Black":"White")+"\\s+Time:\\s*(\\S+)","i"),d=strippedMoveComment(StartPly+PlyNumber).match(d)))&&(a=d[1]),c.innerHTML=a);f&&(a=e+1!==StartPly+PlyNumber||LiveBroadcastDemo&&"*"===gameResult[currentGame]?null:clockFromHeader(b),null===a&&(a=e>StartPly?clockFromComment(e):g,!a&&CurrentPly===StartPly+PlyNumber&&(d=RegExp((b?"White":"Black")+"\\s+Time:\\s*(\\S+)","i"),d=strippedMoveComment(StartPly+
PlyNumber).match(d)))&&(a=d[1]),f.innerHTML=a);c&&f&&(c.innerHTML&&!f.innerHTML?f.innerHTML="-":!c.innerHTML&&f.innerHTML&&(c.innerHTML="-"));if(a=document.getElementById("GameNextMove"))c=0===CurrentVar&&e+1>=StartPly+PlyNumber?'<SPAN CLASS="move notranslate">'+gameResult[currentGame]+"</SPAN>":"undefined"==typeof Moves[e+1]?"":printMoveText(e+1,CurrentVar,0!==CurrentVar,!0,!1),a.innerHTML=c;if(a=document.getElementById("GameNextVariations")){c="";if(commentsIntoMoveText)for(f=childrenVars(e+1,CurrentVar),
b=0;b<f.length;b++)f[b]!==CurrentVar&&(c+=" "+printMoveText(e+1,f[b],0!==f[b],!0,!1));a.innerHTML=c}if(a=document.getElementById("GameLastMove"))c=e>=StartPly&&Moves[e]?printMoveText(e,CurrentVar,0!==CurrentVar,!0,!1):e===StartPly-1?'<SPAN CLASS="'+(0<CurrentVar?"variation":"move")+' notranslate">'+(Math.floor((e+1)/2)+1)+((e+1)%2?"...":".")+"</SPAN>":"",a.innerHTML=c;if(a=document.getElementById("GameLastVariations")){c="";if(commentsIntoMoveText)for(f=childrenVars(e,HistVar[e]),b=0;b<f.length;b++)f[b]!==
CurrentVar&&(c+=" "+printMoveText(e,f[b],0!==f[b],!0,!1));a.innerHTML=c}if(e>=StartPlyVar[CurrentVar]-1){b="Var"+CurrentVar+"Mv"+(e+1);if(a=document.getElementById(b))a.className=(CurrentVar?"variation variationOn":"move moveOn")+" notranslate";highlightedMoveId=b;highlightOption&&(e<StartPly||HistNull[e]?c=e=b=a=-1:(b=void 0===HistCol[0][e]?-1:HistCol[0][e],a=void 0===HistRow[0][e]?-1:HistRow[0][e],c=void 0===HistCol[2][e]?-1:HistCol[2][e],e=void 0===HistRow[2][e]?-1:HistRow[2][e]),highlightMove(b,
a,c,e))}}function SetHighlightOption(a){highlightOption=a}function SetHighlight(a){SetHighlightOption(a);a?HighlightLastMove():highlightMove(-1,-1,-1,-1)}var colFromHighlighted=-1,rowFromHighlighted=-1,colToHighlighted=-1,rowToHighlighted=-1;
function highlightMove(a,b,c,d){highlightSquare(colFromHighlighted,rowFromHighlighted,!1);highlightSquare(colToHighlighted,rowToHighlighted,!1);highlightSquare(a,b,!0)?(colFromHighlighted=a,rowFromHighlighted=b):colFromHighlighted=rowFromHighlighted=-1;highlightSquare(c,d,!0)?(colToHighlighted=c,rowToHighlighted=d):colToHighlighted=rowToHighlighted=-1}
function highlightSquare(a,b,c){if(void 0===a||void 0===b||!SquareOnBoard(a,b))return!1;b=IsRotated?b:7-b;a=IsRotated?7-a:a;var d=document.getElementById("tcol"+a+"trow"+b);if(!d)return!1;d.className=c?0===(b+a)%2?"highlightWhiteSquare":"highlightBlackSquare":0===(b+a)%2?"whiteSquare":"blackSquare";return!0}var undoStackMax=1E3,undoStackGame=Array(undoStackMax),undoStackVar=Array(undoStackMax),undoStackPly=Array(undoStackMax),undoStackStart=0,undoStackCurrent=0,undoStackEnd=0,undoRedoInProgress=!1;
function undoStackReset(){undoStackGame=Array(undoStackMax);undoStackVar=Array(undoStackMax);undoStackPly=Array(undoStackMax);undoStackStart=undoStackCurrent=undoStackEnd=0}
function undoStackStore(){if(undoRedoInProgress)return!1;if(undoStackStart===undoStackCurrent||currentGame!==undoStackGame[undoStackCurrent]||CurrentVar!==undoStackVar[undoStackCurrent]||CurrentPly!==undoStackPly[undoStackCurrent])undoStackCurrent=(undoStackCurrent+1)%undoStackMax,undoStackGame[undoStackCurrent]=currentGame,undoStackVar[undoStackCurrent]=CurrentVar,undoStackPly[undoStackCurrent]=CurrentPly,undoStackEnd=undoStackCurrent,undoStackStart===undoStackCurrent&&(undoStackStart=(undoStackStart+
1)%undoStackMax);return!0}function undoStackUndo(){if((undoStackCurrent-1+undoStackMax)%undoStackMax===undoStackStart)return!1;undoRedoInProgress=!0;undoStackCurrent=(undoStackCurrent-1+undoStackMax)%undoStackMax;undoStackGame[undoStackCurrent]!==currentGame&&Init(undoStackGame[undoStackCurrent]);GoToMove(undoStackPly[undoStackCurrent],undoStackVar[undoStackCurrent]);undoRedoInProgress=!1;return!0}
function undoStackRedo(){if(undoStackCurrent===undoStackEnd)return!1;undoRedoInProgress=!0;undoStackCurrent=(undoStackCurrent+1)%undoStackMax;undoStackGame[undoStackCurrent]!==currentGame&&Init(undoStackGame[undoStackCurrent]);GoToMove(undoStackPly[undoStackCurrent],undoStackVar[undoStackCurrent]);undoRedoInProgress=!1;return!0}
function fixCommonPgnMistakes(a){a=a.replace(/[\u00A0\u180E\u2000-\u200A\u202F\u205F\u3000]/g," ");a=a.replace(/\u00BD/g,"1/2");a=a.replace(/[\u2010-\u2015]/g,"-");a=a.replace(/\u2024/g,".");a=a.replace(/[\u2025-\u2026]/g,"...");return a=a.replace(/\\"/g,"'")}function fullPgnGame(a){var b=pgnHeader[a]?pgnHeader[a].replace(/^[^[]*/g,""):"",b=b.replace(/\[\s*(\w+)\s*"([^"]*)"\s*\][^[]*/g,'[$1 "$2"]\n');return b=b+"\n"+(pgnGame[a]?pgnGame[a].replace(/(^[\s]*|[\s]*$)/g,""):"")}
function pgnGameFromPgnText(a){var b,c,d,e,f,g;a=simpleHtmlentities(fixCommonPgnMistakes(a));a=a.replace(/(^|\n)%.*(\n|$)/g,"\n");numberOfGames=0;for(g="";b=pgnHeaderBlockRegExp.exec(a);)b=b[0],d=a.indexOf(b),e=d+b.length,c?(g+=a.slice(0,d),(d=0>(f=g.lastIndexOf("{"))||g.lastIndexOf("}")>f)?(pgnHeader[numberOfGames]=c,pgnGame[numberOfGames++]=g,g=""):g+=b):d=!0,d&&(c=b),a=a.slice(e);c&&(pgnHeader[numberOfGames]=c,pgnGame[numberOfGames++]=g+a);return 0<numberOfGames}
function pgnGameFromHttpRequest(a){return pgnGameFromPgnText(a)}var http_request_last_processed_id=0;
function updatePgnFromHttpRequest(a,b){var c=LOAD_PGN_FAIL;4!=a.readyState||b<http_request_last_processed_id||(http_request_last_processed_id=b,200==a.status||0===a.status||304==a.status?304==a.status?0<LiveBroadcastDelay?c=LOAD_PGN_UNMODIFIED:myAlert("error: unmodified PGN URL when not in live mode"):window.opera&&!a.responseText&&0===a.status?(a.abort(),c=LOAD_PGN_UNMODIFIED):a.responseText?pgnGameFromHttpRequest(a.responseText)?(0<LiveBroadcastDelay&&(LiveBroadcastLastReceivedLocal=(new Date).toLocaleString(),
(LiveBroadcastLastModifiedHeader=a.getResponseHeader("Last-Modified"))?LiveBroadcastLastModified=new Date(LiveBroadcastLastModifiedHeader):LiveBroadcastLastModified_Reset()),c=LOAD_PGN_OK):myAlert("error: no games found at PGN URL\n"+pgnUrl,!0):myAlert("error: no data received from PGN URL\n"+pgnUrl,!0):myAlert("error: failed reading PGN URL\n"+pgnUrl,!0),LiveBroadcastDemo&&c==LOAD_PGN_UNMODIFIED&&(c=LOAD_PGN_OK),loadPgnCheckingLiveStatus(c))}
var LOAD_PGN_FAIL=0,LOAD_PGN_OK=1,LOAD_PGN_UNMODIFIED=2;
function loadPgnCheckingLiveStatus(a){switch(a){case LOAD_PGN_OK:if(0<LiveBroadcastDelay){firstStart=!0;var b=ParseLastMoveError;if(LiveBroadcastStarted){a=gameWhite[currentGame];var c=gameBlack[currentGame],d=gameEvent[currentGame],e=gameRound[currentGame],f=gameSite[currentGame],g=gameDate[currentGame];initialGame=currentGame+1;LiveBroadcastOldCurrentVar=CurrentVar;LiveBroadcastOldCurrentPly=CurrentPly;LiveBroadcastOldCurrentPlyLast=0===CurrentVar&&CurrentPly===StartPlyVar[0]+PlyNumberVar[0];var h=
isAutoPlayOn;isAutoPlayOn&&SetAutoPlay(!1);LoadGameHeaders();LiveBroadcastFoundOldGame=!1;for(var k=0;k<numberOfGames&&!(LiveBroadcastFoundOldGame=gameWhite[k]==a&&gameBlack[k]==c&&gameEvent[k]==d&&gameRound[k]==e&&gameSite[k]==f&&gameDate[k]==g);k++);LiveBroadcastFoundOldGame&&(initialGame=k+1);if(LiveBroadcastFoundOldGame){var l=initialVariation,m=initialHalfmove;initialVariation=CurrentVar;initialHalfmove=LiveBroadcastSteppingMode?LiveBroadcastOldCurrentPlyLast||b?LiveBroadcastOldCurrentPly+1:
LiveBroadcastOldCurrentPly:LiveBroadcastOldCurrentPlyLast||b?"end":LiveBroadcastOldCurrentPly}}else LiveBroadcastStarted=!0}undoStackReset();Init();0<LiveBroadcastDelay&&(LiveBroadcastFoundOldGame&&(initialHalfmove=m,initialVariation=l),checkLiveBroadcastStatus());customFunctionOnPgnTextLoad();0<LiveBroadcastDelay&&LiveBroadcastFoundOldGame&&(LiveBroadcastSteppingMode?(h||LiveBroadcastOldCurrentPlyLast||b)&&SetAutoPlay(!0):h&&SetAutoPlay(!0));break;case LOAD_PGN_UNMODIFIED:0<LiveBroadcastDelay&&checkLiveBroadcastStatus();
break;default:0===LiveBroadcastDelay?(pgnGameFromPgnText(alertPgn),undoStackReset(),Init(),customFunctionOnPgnTextLoad()):LiveBroadcastStarted?checkLiveBroadcastStatus():(pgnGameFromPgnText(LiveBroadcastPlaceholderPgn),firstStart=!0,undoStackReset(),Init(),checkLiveBroadcastStatus(),customFunctionOnPgnTextLoad())}0<LiveBroadcastDelay&&restartLiveBroadcastTimeout()}var http_request_last_id=0;
function loadPgnFromPgnUrl(a){LiveBroadcastLastRefreshedLocal=(new Date).toLocaleString();var b=!1;if(window.XMLHttpRequest)b=new XMLHttpRequest,b.overrideMimeType&&b.overrideMimeType("text/plain");else if(window.ActiveXObject)try{b=new ActiveXObject("Msxml2.XMLHTTP")}catch(c){try{b=new ActiveXObject("Microsoft.XMLHTTP")}catch(d){return myAlert("error: XMLHttpRequest unavailable for PGN URL\n"+a,!0),!1}}if(!b)return myAlert("error: failed creating XMLHttpRequest for PGN URL\n"+a,!0),!1;var e=http_request_last_id++;
b.onreadystatechange=function(){updatePgnFromHttpRequest(b,e)};try{var f="";0<LiveBroadcastDelay&&-1==a.indexOf("?")&&-1==a.indexOf("#")&&(f="?noCache="+(68719476736+Math.floor(0xf000000000*Math.random())).toString(16).toUpperCase());b.open("GET",a+f);0<LiveBroadcastDelay&&b.setRequestHeader("If-Modified-Since",LiveBroadcastLastModifiedHeader);b.send(null)}catch(g){return myAlert("error: failed sending XMLHttpRequest for PGN URL\n"+a,!0),!1}return!0}function SetPgnUrl(a){pgnUrl=a}
function LiveBroadcastLastModified_Reset(){LiveBroadcastLastModified=new Date(0);LiveBroadcastLastModifiedHeader=LiveBroadcastLastModified.toUTCString()}function LiveBroadcastLastReceivedLocal_Reset(){LiveBroadcastLastReceivedLocal="unavailable"}function LiveBroadcastLastModified_ServerTime(){return 0===LiveBroadcastLastModified.getTime()?"unavailable":LiveBroadcastLastModifiedHeader}
function pauseLiveBroadcast(){0!==LiveBroadcastDelay&&(LiveBroadcastPaused=!0,clearTimeout(LiveBroadcastInterval),LiveBroadcastInterval=null)}function restartLiveBroadcast(){0!==LiveBroadcastDelay&&(LiveBroadcastPaused=!1,refreshPgnSource())}
function checkLiveBroadcastStatus(){var a,b;b="&nbsp;"+(LiveBroadcastTicker%2?"<>":"><")+"&nbsp;";if(0!==LiveBroadcastDelay){if(!1===LiveBroadcastStarted||"undefined"==typeof pgnHeader||1==numberOfGames&&gameEvent[0]==LiveBroadcastPlaceholderEvent)LiveBroadcastEnded=!1,LiveBroadcastGamesRunning=0,LiveBroadcastStatusString="0 "+b+" 0",a="live broadcast yet to start";else{var c=0;for(a=0;a<numberOfGames;a++)0<=gameResult[a].indexOf("*")&&c++;LiveBroadcastEnded=0===c;LiveBroadcastGamesRunning=c;LiveBroadcastStatusString=
c+" "+b+" "+numberOfGames;a=LiveBroadcastEnded?"live broadcast ended":c+" live game"+(1<c?"s":"")+" out of "+numberOfGames}if(b=document.getElementById("GameLiveStatus"))b.innerHTML=LiveBroadcastStatusString,b.title=a;if(b=document.getElementById("GameLiveLastRefreshed"))b.innerHTML=LiveBroadcastLastRefreshedLocal;if(b=document.getElementById("GameLiveLastReceived"))b.innerHTML=LiveBroadcastLastReceivedLocal;if(b=document.getElementById("GameLiveLastModifiedServer"))b.innerHTML=LiveBroadcastLastModified_ServerTime();
customFunctionOnCheckLiveBroadcastStatus()}}function restartLiveBroadcastTimeout(){0!==LiveBroadcastDelay&&(LiveBroadcastInterval&&(clearTimeout(LiveBroadcastInterval),LiveBroadcastInterval=null),LiveBroadcastEnded||LiveBroadcastPaused||(LiveBroadcastInterval=setTimeout("refreshPgnSource()",6E4*LiveBroadcastDelay)),LiveBroadcastTicker++)}var LiveBroadcastFoundOldGame=!1,LiveBroadcastOldCurrentVar,LiveBroadcastOldCurrentPly,LiveBroadcastOldCurrentPlyLast=!1;
function refreshPgnSource(){if(0!==LiveBroadcastDelay){LiveBroadcastInterval&&(clearTimeout(LiveBroadcastInterval),LiveBroadcastInterval=null);if(LiveBroadcastDemo){for(var a,b=0,c=0;c<numberOfGames;c++)a=[3,2,2,2,1,1,1,1,1,1,1,1][Math.floor(20*Math.random())]||0,gameDemoMaxPly[c]<=gameDemoLength[c]&&(gameDemoMaxPly[c]+=a,b+=a);0<b&&(LiveBroadcastLastReceivedLocal=(new Date).toLocaleString())}pgnUrl?loadPgnFromPgnUrl(pgnUrl):document.getElementById("pgnText")?loadPgnFromTextarea("pgnText"):(pgnGameFromPgnText(alertPgn),
undoStackReset(),Init(),customFunctionOnPgnTextLoad(),myAlert("error: missing PGN URL location and pgnText object in the HTML file",!0))}}
function loadPgnFromTextarea(a){var b=LOAD_PGN_FAIL,c;LiveBroadcastLastRefreshedLocal=(new Date).toLocaleString();document.getElementById(a)?("textarea"==document.getElementById(a).tagName.toLowerCase()?c=document.getElementById(a).value:(c=document.getElementById(a).innerHTML,0>c.indexOf("\n")&&(c=c.replace(/((\[[^\[\]]*\]\s*)+)/g,"\n$1\n")),0>c.indexOf('"')&&(c=c.replace(/(&quot;)/g,'"'))),!1===pgnHeaderTagRegExp.test(c)&&(c=emptyPgnHeader+"\n"+c),pgnGameFromPgnText(c)?(b=LOAD_PGN_OK,LiveBroadcastLastReceivedLocal=
(new Date).toLocaleString()):myAlert("error: no games found in "+a+" object in the HTML file")):myAlert("error: missing "+a+" textarea object in the HTML file",!0);loadPgnCheckingLiveStatus(b)}
function createBoard(){var a=document.getElementById("GameBoard");a&&(a.innerHTML='<DIV STYLE="font-size: small; font-family: sans-serif; padding: 10px; text-align: center;">...loading PGN data<br />please wait...</DIV>');pgnUrl?loadPgnFromPgnUrl(pgnUrl):document.getElementById("pgnText")?loadPgnFromTextarea("pgnText"):(pgnGameFromPgnText(alertPgn),undoStackReset(),Init(),customFunctionOnPgnTextLoad(),myAlert("error: missing PGN URL location or pgnText in the HTML file",!0))}
function setCurrentGameFromInitialGame(){switch(initialGame){case "first":currentGame=0;break;case "last":currentGame=numberOfGames-1;break;case "random":currentGame=Math.floor(Math.random()*numberOfGames);break;default:isNaN(parseInt(initialGame,10))?(currentGame=gameNumberSearchPgn(initialGame,!1,!0))||(currentGame=0):(initialGame=parseInt(initialGame,10),initialGame=0>initialGame?-Math.floor(-initialGame):Math.floor(initialGame),currentGame=initialGame<-numberOfGames?0:0>initialGame?numberOfGames+
initialGame:0===initialGame?Math.floor(Math.random()*numberOfGames):initialGame<=numberOfGames?initialGame-1:numberOfGames-1)}}
function GoToInitialHalfmove(){var a,b;a=0>initialVariation?Math.max(numberOfVars+initialVariations,0):Math.min(initialVariation,numberOfVars-1);switch(initialHalfmove){case "start":GoToMove(0,a);break;case "end":GoToMove(StartPlyVar[a]+PlyNumberVar[a],a);break;case "random":GoToMove(StartPlyVar[a]+Math.floor(Math.random()*(StartPlyVar[a]+PlyNumberVar[a])),a);break;case "comment":case "variation":GoToMove(0,a);MoveToNextComment("variation"==initialHalfmove);break;default:isNaN(initialHalfmove=parseInt(initialHalfmove,
10))&&(initialHalfmove=0),b=0>initialHalfmove?Math.max(StartPlyVar[a]+PlyNumberVar[a]+1+initialHalfmove,0):Math.min(initialHalfmove,StartPlyVar[a]+PlyNumberVar[a]),GoToMove(b,a)}}
function Init(a){if(void 0!==a)if(!isNaN(a)&&0<=a&&a<numberOfGames)currentGame=parseInt(a,10);else return;isAutoPlayOn&&SetAutoPlay(!1);InitImages();firstStart&&(LoadGameHeaders(),setCurrentGameFromInitialGame());void 0!==gameSetUp[currentGame]&&"1"!=gameSetUp[currentGame]?InitFEN():InitFEN(gameFEN[currentGame]);OpenGame(currentGame);CurrentPly=StartPly;firstStart||alwaysInitialHalfmove?(GoToInitialHalfmove(),setTimeout("autoScrollToCurrentMoveIfEnabled();",Math.min(666,0.9*Delay))):(synchMoves(),
RefreshBoard(),HighlightLastMove(),autoScrollToCurrentMoveIfEnabled(),customFunctionOnMove(),"function"==typeof engineWinOnMove&&engineWinOnMove());firstStart&&autostartAutoplay&&SetAutoPlay(!0);customFunctionOnPgnGameLoad();initialVariation=0;firstStart=!1}function myAlertFEN(a,b){myAlert("error: invalid FEN in game "+(currentGame+1)+": "+b+"\n"+a,!0)}
function InitFEN(a){var b,c,d;a="string"!=typeof a?FenStringStart:a.replace(/\\/g,"/").replace(/[^a-zA-Z0-9\s\/-]/g," ").replace(/(^\s*|\s*$)/g,"").replace(/\s+/g," ");for(b=0;8>b;++b)for(c=0;8>c;++c)Board[b][c]=0;MoveCount=StartPly=0;MoveColor=StartPly%2;var e=!1,f;CastlingLong=[0,0];CastlingShort=[7,7];InitialHalfMoveClock=0;HistVar[StartPly]=0;HistNull[StartPly]=0;if(a==FenStringStart)for(c=0;2>c;c++)for(PieceType[c]=[1,2,5,5,4,4,3,3,6,6,6,6,6,6,6,6],PieceCol[c]=[4,3,1,6,2,5,0,7,0,1,2,3,4,5,6,
7],PieceMoveCounter[c]=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],PieceRow[c]=c?[7,7,7,7,7,7,7,7,6,6,6,6,6,6,6,6]:[0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1],b=0;16>b;b++){d=PieceCol[c][b];var g=PieceRow[c][b];Board[d][g]=(1-2*c)*PieceType[c][b]}else{var h,k,l;for(b=0;2>b;b++)for(c=0;16>c;c++)PieceType[b][c]=-1,PieceCol[b][c]=0,PieceRow[b][c]=0,PieceMoveCounter[b][c]=0;b=0;c=7;h=0;l=k=1;for(d=a.charAt(h++);" "!=d;){if("/"==d){if(8!=b){myAlertFEN(a,"char "+h);InitFEN();return}b=0;c--}if(8==b){myAlertFEN(a,"char "+h);
InitFEN();return}if(!isNaN(d)&&(b+=parseInt(d,10),0>b||8<b)){myAlertFEN(a,"char "+h);InitFEN();return}if(d.charCodeAt(0)==FenPieceName.toUpperCase().charCodeAt(0)){if(-1!=PieceType[0][0]){myAlertFEN(a,"char "+h);InitFEN();return}PieceType[0][0]=1;PieceCol[0][0]=b;PieceRow[0][0]=c;b++}if(d.charCodeAt(0)==FenPieceName.toLowerCase().charCodeAt(0)){if(-1!=PieceType[1][0]){myAlertFEN(a,"char "+h);InitFEN();return}PieceType[1][0]=1;PieceCol[1][0]=b;PieceRow[1][0]=c;b++}for(g=1;6>g;g++){if(d.charCodeAt(0)==
FenPieceName.toUpperCase().charCodeAt(g)){if(16==k){myAlertFEN(a,"char "+h);InitFEN();return}PieceType[0][k]=g+1;PieceCol[0][k]=b;PieceRow[0][k]=c;k++;b++}if(d.charCodeAt(0)==FenPieceName.toLowerCase().charCodeAt(g)){if(16==l){myAlertFEN(a,"char "+h);InitFEN();return}PieceType[1][l]=g+1;PieceCol[1][l]=b;PieceRow[1][l]=c;l++;b++}}d=h<a.length?a.charAt(h++):" "}if(8!=b||0!==c)myAlertFEN(a,"char "+h),InitFEN();else if(-1==PieceType[0][0]||-1==PieceType[1][0])myAlertFEN(a,"missing King"),InitFEN();else{h==
a.length&&(a+="w "+assumedCastleRights()+" - 0 1");d=a.charAt(h++);"w"==d||"b"==d?"b"==d&&(StartPly+=1,MoveColor=1):myAlertFEN(a,"invalid active color");for(c=0;2>c;++c)for(b=0;16>b;b++)-1!=PieceType[c][b]&&(d=PieceCol[c][b],g=PieceRow[c][b],Board[d][g]=(1-2*c)*PieceType[c][b]);h++;h>=a.length&&(myAlertFEN(a,"missing castling availability"),a+=" "+assumedCastleRights()+" - 0 1",h++);CastlingLong=[-1,-1];CastlingShort=[-1,-1];for(d=a.charAt(h++);" "!=d;){if(d.charCodeAt(0)==FenPieceName.toUpperCase().charCodeAt(0)){for(CastlingShort[0]=
7;CastlingShort[0]>PieceCol[0][0]&&3!=Board[CastlingShort[0]][0];CastlingShort[0]--);CastlingShort[0]<=PieceCol[0][0]&&(myAlertFEN(a,"missing castling Rook "+d),CastlingShort[0]=-1)}if(d.charCodeAt(0)==FenPieceName.toUpperCase().charCodeAt(1)){for(CastlingLong[0]=0;CastlingLong[0]<PieceCol[0][0]&&3!=Board[CastlingLong[0]][0];CastlingLong[0]++);CastlingLong[0]>=PieceCol[0][0]&&(myAlertFEN(a,"missing castling Rook "+d),CastlingLong[0]=-1)}if(d.charCodeAt(0)==FenPieceName.toLowerCase().charCodeAt(0)){for(CastlingShort[1]=
7;CastlingShort[1]>PieceCol[1][0]&&-3!=Board[CastlingShort[1]][7];CastlingShort[1]--);CastlingShort[1]<=PieceCol[1][0]&&(myAlertFEN(a,"missing castling Rook "+d),CastlingShort[1]=-1)}if(d.charCodeAt(0)==FenPieceName.toLowerCase().charCodeAt(1)){for(CastlingLong[1]=0;CastlingLong[1]<PieceCol[1][0]&&-3!=Board[CastlingLong[1]][7];CastlingLong[1]++);CastlingLong[1]>=PieceCol[1][0]&&(myAlertFEN(a,"missing castling Rook "+d),CastlingLong[1]=-1)}b=columnsLetters.toUpperCase().indexOf(d);0<=b?c=0:(b=columnsLetters.toLowerCase().indexOf(d),
0<=b&&(c=1));0<=b&&(Board[b][7*c]==3*(1-2*c)?(b>PieceCol[c][0]&&(CastlingShort[c]=b),b<PieceCol[c][0]&&(CastlingLong[c]=b)):myAlertFEN(a,"missing castling Rook "+d));d=h<a.length?a.charAt(h++):" "}h>=a.length&&(myAlertFEN(a,"missing en passant square"),a+=" - 0 1",h++);for(d=a.charAt(h++);" "!=d;)0<=d.charCodeAt(0)-97&&7>=d.charCodeAt(0)-97&&(e=!0,f=d.charCodeAt(0)-97),d=h<a.length?a.charAt(h++):" ";h>=a.length&&(myAlertFEN(a,"missing halfmove clock"),a+=" 0 1",h++);InitialHalfMoveClock=0;for(d=a.charAt(h++);" "!=
d;){if(isNaN(d)){myAlertFEN(a,"invalid halfmove clock");break}InitialHalfMoveClock=10*InitialHalfMoveClock+parseInt(d,10);d=h<a.length?a.charAt(h++):" "}h>=a.length&&(myAlertFEN(a,"missing fullmove number"),a+=" 1",h++);b=0;for(d=a.charAt(h++);" "!=d;){if(isNaN(d)){myAlertFEN(a,"invalid fullmove number");b=1;break}b=10*b+parseInt(d,10);d=h<a.length?a.charAt(h++):" "}0===b&&(myAlertFEN(a,"invalid fullmove 0 set to 1"),b=1);StartPly+=2*(b-1);HistEnPassant[StartPly]=e;HistEnPassantCol[StartPly]=f;HistNull[StartPly]=
0;HistVar[StartPly]=0}}}
function assumedCastleRights(){var a,b="";if(0===PieceRow[0][0]&&4===PieceCol[0][0])for(a=0;a<PieceType[0].length;a++)3===PieceType[0][a]&&0===PieceRow[0][a]&&7===PieceCol[0][a]&&(b+=FenPieceName.charAt(0).toUpperCase()),3===PieceType[0][a]&&0===PieceRow[0][a]&&0===PieceCol[0][a]&&(b+=FenPieceName.charAt(1).toUpperCase());if(7===PieceRow[1][0]&&4===PieceCol[1][0])for(a=0;a<PieceType[1].length;a++)3===PieceType[1][a]&&7===PieceRow[1][a]&&7===PieceCol[1][a]&&(b+=FenPieceName.charAt(0).toLowerCase()),3===
PieceType[1][a]&&7===PieceRow[1][a]&&0===PieceCol[1][a]&&(b+=FenPieceName.charAt(1).toLowerCase());return b||"-"}function SetImageType(a){imageType=a}
function InitImages(){if(ImagePathOld!==ImagePath){0<ImagePath.length&&"/"!=ImagePath[ImagePath.length-1]&&(ImagePath+="/");ClearImg=new Image;ClearImg.src=ImagePath+"clear."+imageType;for(var a=["w","b"],b="KQRBNP".split(""),c=0;2>c;++c)for(var d=1;7>d;d++)PieceImg[c][d]=new Image,PieceImg[c][d].src=ImagePath+a[c]+b[d-1]+"."+imageType;ImagePathOld=ImagePath}}
function IsCheck(a,b,c){var d,e=2*c-1;if(1>=Math.abs(PieceCol[1-c][0]-a)&&1>=Math.abs(PieceRow[1-c][0]-b))return!0;for(c=-2;2>=c;c+=4)for(d=-1;1>=d;d+=2)if(SquareOnBoard(a+c,b+d)&&Board[a+c][b+d]==5*e||SquareOnBoard(a+d,b+c)&&Board[a+d][b+c]==5*e)return!0;for(c=-1;1>=c;c+=2)if(SquareOnBoard(a+c,b-e)&&Board[a+c][b-e]==6*e)return!0;for(c=-1;1>=c;++c)for(d=-1;1>=d;++d)if(0!==c||0!==d)for(var f=a+c,g=b+d,h=0;SquareOnBoard(f,g)&&0===h;)if(h=Board[f][g],0===h)f+=c,g+=d;else if(h==2*e||h==3*e&&(0===c||0===
d)||h==4*e&&0!==c&&0!==d)return!0;return!1}function fixRegExp(a){return a.replace(/([\[\]\(\)\{\}\.\*\+\^\$\|\?\\])/g,"\\$1")}
function LoadGameHeaders(){var a,b;gameEvent.length=gameSite.length=gameRound.length=gameDate.length=0;gameWhite.length=gameBlack.length=gameResult.length=0;gameSetUp.length=gameFEN.length=0;gameInitialWhiteClock.length=gameInitialBlackClock.length=0;gameVariant.length=0;for(a=pgnHeaderTagRegExpGlobal.lastIndex=0;a<numberOfGames;++a){var c=pgnHeader[a];gameEvent[a]=gameSite[a]=gameRound[a]=gameDate[a]="";gameWhite[a]=gameBlack[a]=gameResult[a]="";gameInitialWhiteClock[a]=gameInitialBlackClock[a]=
"";for(gameVariant[a]="";b=pgnHeaderTagRegExpGlobal.exec(c);)switch(b[1]){case "Event":gameEvent[a]=b[2];break;case "Site":gameSite[a]=b[2];break;case "Round":gameRound[a]=b[2];break;case "Date":gameDate[a]=b[2];break;case "White":gameWhite[a]=b[2];break;case "Black":gameBlack[a]=b[2];break;case "Result":gameResult[a]=b[2];break;case "SetUp":gameSetUp[a]=b[2];break;case "FEN":gameFEN[a]=b[2];break;case "WhiteClock":gameInitialWhiteClock[a]=b[2];break;case "BlackClock":gameInitialBlackClock[a]=b[2];
break;case "Variant":gameVariant[a]=b[2]}}if(LiveBroadcastDemo&&0<numberOfGames)for(a=0;a<numberOfGames;++a){if(void 0===gameDemoLength[a]||0===gameDemoLength[a])InitFEN(gameFEN[a]),ParsePGNGameString(pgnGame[a]),gameDemoLength[a]=PlyNumber;void 0===gameDemoMaxPly[a]&&(gameDemoMaxPly[a]=0);gameDemoMaxPly[a]<=gameDemoLength[a]&&(gameResult[a]="*")}}
function MoveBackward(a,b){var c=CurrentPly-1,d=c-a;for(d<StartPly&&(d=StartPly-1);c>d;--c)CurrentPly--,MoveColor=1-MoveColor,CurrentVar=HistVar[c],UndoMove(c);b||(synchMoves(),RefreshBoard(),HighlightLastMove(),autoScrollToCurrentMoveIfEnabled(),AutoPlayInterval&&(clearTimeout(AutoPlayInterval),AutoPlayInterval=null),isAutoPlayOn&&(d>=StartPlyVar[CurrentVar]?AutoPlayInterval=setTimeout("MoveBackward(1)",Delay):SetAutoPlay(!1)),customFunctionOnMove(),"function"==typeof engineWinOnMove&&engineWinOnMove())}
function MoveForward(a,b,c){var d,e=-1;"undefined"==typeof b&&(b=CurrentVar);var f=CurrentPly+parseInt(a,10);f>StartPlyVar[b]+PlyNumberVar[b]&&(f=StartPlyVar[b]+PlyNumberVar[b]);for(var g=CurrentPly;g<f;++g){if(b!==CurrentVar){for(d=0;d<PredecessorsVars[b].length&&PredecessorsVars[b][d]!==CurrentVar;d++);if(d===PredecessorsVars[b].length){myAlert("error: unknown path to variation "+b+" from "+CurrentVar+" in game "+(currentGame+1),!0);return}a=StartPlyVar[PredecessorsVars[b][d+1]];for(d+=1;d<PredecessorsVars[b].length-
1&&StartPlyVar[PredecessorsVars[b][d+1]]===StartPlyVar[PredecessorsVars[b][d]];d++);d=PredecessorsVars[b][d]}else d=a=-1;g===a&&(e=CurrentVar,CurrentVar=d);if("undefined"==typeof(d=MovesVar[CurrentVar][g]))break;if(ParseLastMoveError=!ParseMove(d,g)){b=Math.floor(g/2)+1+(0===g%2?". ":"... ");myAlert("error: invalid ply "+b+d+" in game "+(currentGame+1)+" variation "+CurrentVar,!0);g===a&&(CurrentVar=e);break}MoveColor=1-MoveColor}CurrentPly=g;c||(synchMoves(),RefreshBoard(),HighlightLastMove(),autoScrollToCurrentMoveIfEnabled(),
AutoPlayInterval&&(clearTimeout(AutoPlayInterval),AutoPlayInterval=null),ParseLastMoveError?SetAutoPlay(!1):g==f&&isAutoPlayOn&&(f<StartPlyVar[CurrentVar]+PlyNumberVar[CurrentVar]?AutoPlayInterval=setTimeout("MoveForward(1)",Delay):autoplayNextGame&&0===CurrentVar?AutoPlayInterval=setTimeout("AutoplayNextGame()",Delay):SetAutoPlay(!1)),customFunctionOnMove(),"function"==typeof engineWinOnMove&&engineWinOnMove())}var lastSynchCurrentVar=-1;
function synchMoves(){var a,b;if(CurrentVar!==lastSynchCurrentVar){Moves=[];MoveComments=[];for(var c=0;c<PredecessorsVars[CurrentVar].length;c++)for(a=StartPlyVar[PredecessorsVars[CurrentVar][c]],b=c<PredecessorsVars[CurrentVar].length-1?StartPlyVar[PredecessorsVars[CurrentVar][c+1]]:StartPlyVar[PredecessorsVars[CurrentVar][c]]+PlyNumberVar[PredecessorsVars[CurrentVar][c]];a<b;a++)Moves[a]=MovesVar[PredecessorsVars[CurrentVar][c]][a],MoveComments[a]=MoveCommentsVar[PredecessorsVars[CurrentVar][c]][a]||
"";MoveComments[a]=MoveCommentsVar[PredecessorsVars[CurrentVar][c-1]][a]||"";PlyNumber=StartPlyVar[CurrentVar]+PlyNumberVar[CurrentVar]-StartPly;lastSynchCurrentVar=CurrentVar}}function AutoplayNextGame(){if(0===fatalErrorNumSinceReset&&0<numberOfGames&&(Init((currentGame+1)%numberOfGames),1<numberOfGames||0<PlyNumber)){SetAutoPlay(!0);return}SetAutoPlay(!1)}
function MoveToNextComment(a){for(var b=CurrentPly+1;b<=StartPlyVar[CurrentVar]+PlyNumberVar[CurrentVar];b++)if(MoveComments[b].match(pgn4webVariationRegExp)||!a&&strippedMoveComment(b)){GoToMove(b);break}}function MoveToPrevComment(a){for(var b=CurrentPly-1;b>=StartPly;b--){if((0<b||0<CurrentVar)&&b===StartPlyVar[HistVar[b+1]]){GoToMove(b+1,HistVar[b]);break}if(MoveComments[b].match(pgn4webVariationRegExp)||!a&&strippedMoveComment(b)){GoToMove(b);break}}}
function OpenGame(a){ParsePGNGameString(pgnGame[a]);currentGame=a;ParseLastMoveError=!1;LiveBroadcastDemo&&gameDemoMaxPly[a]<=PlyNumber&&(PlyNumber=PlyNumberVar[0]=gameDemoMaxPly[a]);PrintHTML()}var CurrentVar=-1,lastVarWithNoMoves,numberOfVars,MovesVar,MoveCommentsVar,GameHasComments,GameHasVariations,StartPlyVar,PlyNumberVar,CurrentVarStack,PlyNumberStack,PredecessorsVars;
function initVar(){MovesVar=[];MoveCommentsVar=[];GameHasVariations=GameHasComments=!1;StartPlyVar=[];PlyNumberVar=[];CurrentVar=-1;lastVarWithNoMoves=[!1];numberOfVars=0;CurrentVarStack=[];PlyNumber=1;PlyNumberStack=[];PredecessorsVars=[];startVar(!1)}
function startVar(a){0<=CurrentVar&&(CurrentVarStack.push(CurrentVar),PlyNumberStack.push(PlyNumber));CurrentVar=numberOfVars++;PredecessorsVars[CurrentVar]=CurrentVarStack.slice(0);PredecessorsVars[CurrentVar].push(CurrentVar);MovesVar[CurrentVar]=[];MoveCommentsVar[CurrentVar]=[];a||(lastVarWithNoMoves[lastVarWithNoMoves.length-1]?myAlert("warning: malformed PGN data in game "+(currentGame+1)+": variant "+CurrentVar+" starting before parent",!0):PlyNumber-=1);lastVarWithNoMoves.push(!0);MoveCommentsVar[CurrentVar][StartPly+
PlyNumber]="";StartPlyVar[CurrentVar]=StartPly+PlyNumber}
function closeVar(){StartPly+PlyNumber===StartPlyVar[CurrentVar]?myAlert("warning: empty variation "+CurrentVar+" in game "+(currentGame+1),!1):GameHasVariations=!0;lastVarWithNoMoves.pop();PlyNumberVar[CurrentVar]=StartPly+PlyNumber-StartPlyVar[CurrentVar];for(var a=StartPlyVar[CurrentVar];a<=StartPlyVar[CurrentVar]+PlyNumberVar[CurrentVar];a++)MoveCommentsVar[CurrentVar][a]?(MoveCommentsVar[CurrentVar][a]=MoveCommentsVar[CurrentVar][a].replace(/\s+/g," "),MoveCommentsVar[CurrentVar][a]=translateNAGs(MoveCommentsVar[CurrentVar][a]),
MoveCommentsVar[CurrentVar][a]=MoveCommentsVar[CurrentVar][a].replace(/\s+$/g,"")):MoveCommentsVar[CurrentVar][a]="";CurrentVarStack.length?(CurrentVar=CurrentVarStack.pop(),PlyNumber=PlyNumberStack.pop()):myAlert("error: closeVar error in game "+(currentGame+1),!0)}
function childrenVars(a,b){"undefined"==typeof b&&(b=CurrentVar);"undefined"==typeof a&&(a=CurrentPly);for(var c=[],d=b;d<numberOfVars;d++)(d===b&&StartPlyVar[d]+PlyNumberVar[d]>a||realParentVar(d)===b&&StartPlyVar[d]===a&&0<PlyNumberVar[d])&&c.push(d);return c}function realParentVar(a){for(var b=PredecessorsVars[a].length-1;0<b;b--)if(StartPlyVar[PredecessorsVars[a][b]]!==StartPlyVar[PredecessorsVars[a][b-1]])return PredecessorsVars[a][b-1];return PredecessorsVars[a][b]}
function goToNextVariationSibling(){if(CurrentPly===StartPly)return!1;var a=childrenVars(CurrentPly-1,HistVar[CurrentPly-1]);if(2>a.length)return!1;for(var b=0;b<a.length&&a[b]!==CurrentVar;b++);if(a[b]!==CurrentVar)return!1;GoToMove(CurrentPly,a[(b+1)%a.length]);return!0}function goToFirstChild(){var a=childrenVars(CurrentPly,CurrentVar);if(1>a.length)return!1;if(a[0]===CurrentVar){if(2>a.length)return!1;GoToMove(CurrentPly+1,a[1])}else GoToMove(CurrentPly+1,a[0]);return!0}
function ParsePGNGameString(a){var b,c,d,e;for(a=a.replace(pgn4webVariationRegExpGlobal,"[%_pgn4web_variation_ $1]");(c=a.replace(/\((([\?!+#\s]|\$\d+|{[^}]*})*)\)/g," $1 "))!==a;)a=c;a=a.replace(/^\s/,"");a=a.replace(/\s$/,"");initVar();for(c=PlyNumber=0;c<a.length;c++)switch(a.charAt(c)){case " ":case "\b":case "\f":case "\n":case "\r":case "\t":break;case "$":d=c;for(c=d+1;0<="0123456789".indexOf(a.charAt(c))&&!(c++,c>=a.length););MoveCommentsVar[CurrentVar][StartPly+PlyNumber]&&(MoveCommentsVar[CurrentVar][StartPly+
PlyNumber]+=" ");MoveCommentsVar[CurrentVar][StartPly+PlyNumber]+=translateNAGs(a.substring(d,c).replace(/(^\s*|\s*$)/,""));c-=1;break;case "!":case "?":d=c;for(c=d+1;0<="!?".indexOf(a.charAt(c))&&!(c++,c>=a.length););MoveCommentsVar[CurrentVar][StartPly+PlyNumber]&&(MoveCommentsVar[CurrentVar][StartPly+PlyNumber]+=" ");MoveCommentsVar[CurrentVar][StartPly+PlyNumber]+=a.substring(d,c);c-=1;break;case "{":d=c+1;c=a.indexOf("}",c+1);0>c&&(myAlert("error: missing end comment } in game "+(currentGame+
1),!0),c=a.length);MoveCommentsVar[CurrentVar][StartPly+PlyNumber]&&(MoveCommentsVar[CurrentVar][StartPly+PlyNumber]+=" ");d=translateNAGs(a.substring(d,c).replace(/(^\s*|\s*$)/,""));MoveCommentsVar[CurrentVar][StartPly+PlyNumber]+=d;GameHasComments=GameHasComments||""!==d.replace(/\[%[^\]]*\]\s*/g,"").replace(basicNAGs,"").replace(/^\s+$/,"");break;case "%":if(0<c&&"\n"!=a.charAt(c-1))break;c=a.indexOf("\n",c+1);0>c&&(c=a.length);break;case ";":d=c+1;c=a.indexOf("\n",c+1);0>c&&(c=a.length);MoveCommentsVar[CurrentVar][StartPly+
PlyNumber]&&(MoveCommentsVar[CurrentVar][StartPly+PlyNumber]+=" ");d=translateNAGs(a.substring(d,c).replace(/(^\s*|\s*$)/,""));MoveCommentsVar[CurrentVar][StartPly+PlyNumber]+=d;GameHasComments=GameHasComments||""!==d.replace(/\[%[^\]]*\]\s*/g,"").replace(basicNAGs,"").replace(/^\s+$/,"");break;case "(":if(d="*"==a.charAt(c+1))c+=1;MoveCommentsVar[CurrentVar][StartPly+PlyNumber]+=" [%pgn4web_variation "+numberOfVars+"] ";startVar(d);break;case ")":closeVar();break;case "&":if("&lt;&gt;"==a.substr(c,
8)){a=a.slice(0,c)+" -- "+a.slice(c+8);c+=4;break}default:e=["1-0","0-1","1/2-1/2","*"];for(b=0;b<e.length;b++)if(a.indexOf(e[b],c)==c){0===CurrentVar?d=a.length:(d=c+e[b].length,MoveCommentsVar[CurrentVar][StartPly+PlyNumber]&&(MoveCommentsVar[CurrentVar][StartPly+PlyNumber]+=" "),MoveCommentsVar[CurrentVar][StartPly+PlyNumber]+=e[b]);c=d;break}if(c==a.length)break;d=Math.floor((StartPly+PlyNumber)/2)+1;e=d.toString();if(a.indexOf(e,c)==c)for(c+=e.length;-1!=" .\n\r".indexOf(a.charAt(c));)c++;
(d=c+a.substr(c).search(/[\s${;!?()]/))<c&&(d=a.length);c=a.substring(c,d);MovesVar[CurrentVar][StartPly+PlyNumber]=CleanMove(c);lastVarWithNoMoves[lastVarWithNoMoves.length-1]=!1;c=" "==a.charAt(d)?d:d-1;MovesVar[CurrentVar][StartPly+PlyNumber].match(/^[\s+#]*$/)||(PlyNumber++,MoveCommentsVar[CurrentVar][StartPly+PlyNumber]="")}if(0!==CurrentVar)for(myAlert("error: ParsePGNGameString ends with CurrentVar "+CurrentVar+" in game "+(currentGame+1),!0);0<CurrentVar;)closeVar();StartPlyVar[0]=StartPly;
PlyNumberVar[0]=PlyNumber;GameHasComments=GameHasComments||GameHasVariations;lastSynchCurrentVar=-1}
for(var NAGstyle="default",NAG=["","!","?","!!","??","!?","?!","forced move","singular move","worst move","drawish position","equal chances, quiet position","equal chances, active position","unclear position","White has a slight advantage",,"White has a moderate advantage",,"White has a decisive advantage",,"White has a crushing advantage",,"White is in zugzwang",,"White has a slight space advantage",,"White has a moderate space advantage",,"White has a decisive space advantage",,"White has a slight time (development) advantage",
,"White has a moderate time (development) advantage",,"White has a decisive time (development) advantage",,"White has the initiative",,"White has a lasting initiative",,"White has the attack",,"White has insufficient compensation for material deficit",,"White has sufficient compensation for material deficit",,"White has more than adequate compensation for material deficit",,"White has a slight center control advantage",,"White has a moderate center control advantage",,"White has a decisive center control advantage",
,"White has a slight kingside control advantage",,"White has a moderate kingside control advantage",,"White has a decisive kingside control advantage",,"White has a slight queenside control advantage",,"White has a moderate queenside control advantage",,"White has a decisive queenside control advantage",,"White has a vulnerable first rank",,"White has a well protected first rank",,"White has a poorly protected king",,"White has a well protected king",,"White has a poorly placed king",,"White has a well placed king",
,"White has a very weak pawn structure",,"White has a moderately weak pawn structure",,"White has a moderately strong pawn structure",,"White has a very strong pawn structure",,"White has poor knight placement",,"White has good knight placement",,"White has poor bishop placement",,"White has good bishop placement",,"White has poor rook placement",,"White has good rook placement",,"White has poor queen placement",,"White has good queen placement",,"White has poor piece coordination",,"White has good piece coordination",
,"White has played the opening very poorly",,"White has played the opening poorly",,"White has played the opening well",,"White has played the opening very well",,"White has played the middlegame very poorly",,"White has played the middlegame poorly",,"White has played the middlegame well",,"White has played the middlegame very well",,"White has played the ending very poorly",,"White has played the ending poorly",,"White has played the ending well",,"White has played the ending very well",,"White has slight counterplay",
,"White has moderate counterplay",,"White has decisive counterplay",,"White has moderate time control pressure",,"White has severe time control pressure"],i=14;139>i;i+=2)NAG[i+1]=NAG[i].replace("White","Black");function translateNAGs(a){var b=a.match(/\$+[0-9]+/g);if(b)for(var c=0;c<b.length;c++){var d=b[c].substr(1);void 0!==NAG[d]&&(a=a.replace(RegExp("\\$+"+d+"(?!\\d)"),NAG[d]))}return a}
function ParseMove(a,b){var c,d,e,f=-1;castleRook=-1;mvCapture=mvIsPromotion=mvIsCastling=0;mvCapturedId=mvCaptured=mvPieceOnTo=mvPieceId=mvPiece=mvToRow=mvToCol=mvFromRow=mvFromCol=-1;mvIsNull=0;if("undefined"==typeof a)return!1;HistEnPassant[b+1]=!1;HistEnPassantCol[b+1]=-1;if(0===a.indexOf("--"))return mvIsNull=1,CheckLegality("--",b),!0;for(c=a.length-1;0<c;c--)if(!isNaN(a.charAt(c))){mvToCol=a.charCodeAt(c-1)-97;mvToRow=a.charAt(c)-1;e=a.substring(0,c-1);f=c;break}if(0>mvToCol||7<mvToCol||0>
mvToRow||7<mvToRow)return 0===a.indexOf("O-O-O")?(mvPiece=mvIsCastling=1,mvPieceId=0,mvPieceOnTo=1,mvFromCol=4,mvToCol=2,mvFromRow=7*MoveColor,mvToRow=7*MoveColor,CheckLegality("O-O-O",b)):0===a.indexOf("O-O")?(mvPiece=mvIsCastling=1,mvPieceId=0,mvPieceOnTo=1,mvFromCol=4,mvToCol=6,mvFromRow=7*MoveColor,mvToRow=7*MoveColor,CheckLegality("O-O",b)):!1;e=e.replace(/-/g,"");d=e.length;if(4<d)return!1;mvPiece=-1;if(0===d)mvPiece=6;else{for(c=5;0<c;c--)if(e.charAt(0)==PieceCode[c-1]){mvPiece=c;break}-1==
mvPiece&&0<=columnsLetters.toLowerCase().indexOf(e.charAt(0))&&(mvPiece=6);if(-1==mvPiece)return!1;"x"==e.charAt(d-1)&&(mvCapture=1);if(isNaN(a.charAt(d-1-mvCapture))){if(mvFromCol=a.charCodeAt(d-1-mvCapture)-97,0>mvFromCol||7<mvFromCol)mvFromCol=-1}else if(mvFromRow=a.charAt(d-1-mvCapture)-1,0>mvFromRow||7<mvFromRow)mvFromRow=-1;else if(mvFromCol=a.charCodeAt(d-2-mvCapture)-97,0>mvFromCol||7<mvFromCol)mvFromCol=-1;if(1<d&&!mvCapture&&-1==mvFromCol&&-1==mvFromRow||6==mvPiece&&!mvCapture&&-1==mvFromCol&&
-1==mvFromRow)return!1}mvPieceOnTo=mvPiece;if(0!==Board[mvToCol][mvToRow]||6==mvPiece&&HistEnPassant[b]&&mvToCol==HistEnPassantCol[b]&&mvToRow==5-3*MoveColor)mvCapture=1;if(6==mvPiece&&(c=a.indexOf("="),0>c&&(c=f),0<c&&c<a.length-1&&(c=a.charAt(c+1),c==PieceCode[1]?mvPieceOnTo=2:c==PieceCode[2]?mvPieceOnTo=3:c==PieceCode[3]?mvPieceOnTo=4:c==PieceCode[4]&&(mvPieceOnTo=5),mvPieceOnTo!=mvPiece&&(mvIsPromotion=1)),mvToRow==7*(1-MoveColor)?!mvIsPromotion:mvIsPromotion))return!1;if(mvCapture){for(mvCapturedId=
15;0<=mvCapturedId;mvCapturedId--)if(0<PieceType[1-MoveColor][mvCapturedId]&&PieceCol[1-MoveColor][mvCapturedId]==mvToCol&&PieceRow[1-MoveColor][mvCapturedId]==mvToRow){mvCaptured=PieceType[1-MoveColor][mvCapturedId];if(1==mvCaptured)return!1;break}if(6==mvPiece&&1>mvCapturedId&&HistEnPassant[b])for(mvCapturedId=15;0<=mvCapturedId;mvCapturedId--)if(6==PieceType[1-MoveColor][mvCapturedId]&&PieceCol[1-MoveColor][mvCapturedId]==mvToCol&&PieceRow[1-MoveColor][mvCapturedId]==4-MoveColor){mvCaptured=PieceType[1-
MoveColor][mvCapturedId];break}}if(!CheckLegality(PieceCode[mvPiece-1],b))return!1;6==mvPiece&&2==Math.abs(HistRow[0][b]-mvToRow)&&(HistEnPassant[b+1]=!0,HistEnPassantCol[b+1]=mvToCol);return!0}
function SetGameSelectorOptions(a,b,c,d,e,f,g,h,k){"string"==typeof a&&(gameSelectorHead=a);gameSelectorNum=!0===b;gameSelectorChEvent=Math.max(Math.min(c,32)||0,0)||0;gameSelectorChSite=Math.max(Math.min(d,32)||0,0)||0;gameSelectorChRound=Math.max(Math.min(e,32)||0,0)||0;gameSelectorChWhite=Math.max(Math.min(f,32)||0,0)||0;gameSelectorChBlack=Math.max(Math.min(g,32)||0,0)||0;gameSelectorChResult=Math.max(Math.min(h,32)||0,0)||0;gameSelectorChDate=Math.max(Math.min(k,32)||0,0)||0}
var clickedSquareInterval=null;function clickedSquare(a,b){if(!clickedSquareInterval){var c=document.getElementById("tcol"+b+"trow"+a);if(c){var d=c.className;c.className=0===(a+b)%2?"blackSquare":"whiteSquare";clickedSquareInterval=setTimeout("reset_after_click("+a+","+b+",'"+d+"','"+c.className+"')",66);clearSelectedText()}}}function reset_after_click(a,b,c,d){if(a=document.getElementById("tcol"+b+"trow"+a))a.className==d&&(a.className=c),clickedSquareInterval=null}var lastSearchPgnExpression="";
function gameNumberSearchPgn(a,b,c){lastSearchPgnExpression=a;if(""===a)return!1;var d=RegExp("[\n\r]","gm");a=RegExp(a,"im");var e=0>currentGame||currentGame>=numberOfGames?0:currentGame,f=fullPgnGame(e);if(c&&f.replace(d," ").match(a))return e;b=b?-1:1;for(c=(e+b+numberOfGames)%numberOfGames;c!=e;c=(c+b+numberOfGames)%numberOfGames)if(f=fullPgnGame(c),f.replace(d," ").match(a))return c;return!1}
function searchPgnGame(a,b){"undefined"==typeof a&&(a="");lastSearchPgnExpression=a;var c=document.getElementById("searchPgnExpression");c&&(c.value=a);""===a||2>numberOfGames||(c=gameNumberSearchPgn(a,b,!1),!1!==c&&c!=currentGame&&Init(c))}function searchPgnGamePrompt(){if(2>numberOfGames)alert("info: search prompt disabled with less than 2 games");else{var a=prompt("Please enter search pattern for PGN games:",lastSearchPgnExpression);a&&searchPgnGame(a)}}
function searchPgnGameForm(){document.getElementById("searchPgnExpression")&&searchPgnGame(document.getElementById("searchPgnExpression").value)}var chessMovesRegExp=RegExp("\\b((\\d+(\\.{1,3}|\\s)\\s*)?((([KQRBN][a-h1-8]?)|[a-h])?x?[a-h][1-8](=[QRNB])?|O-O-O|O-O)\\b[!?+#]*)","g");function fixCommentForDisplay(a){return a.replace(chessMovesRegExp,'<SPAN CLASS="commentMove">$1</SPAN>')}var tableSize=0,textSelectOptions="";
function PrintHTML(){var a,b,c,d,e,f;if(d=document.getElementById("GameBoard")){c='<TABLE CLASS="boardTable" ID="boardTable" CELLSPACING=0 CELLPADDING=0'+(0<tableSize?' STYLE="width: '+tableSize+"px; height: "+tableSize+'px;">':">");for(a=0;8>a;++a){c+="<TR>";for(b=0;8>b;++b)e="tcol"+b+"trow"+a,f="img_"+e,c+=0===(a+b)%2?'<TD CLASS="whiteSquare" ID="'+e+'" BGCOLOR="#FFFFFF"':'<TD CLASS="blackSquare" ID="'+e+'" BGCOLOR="#D3D3D3"',c+=' ALIGN="center" VALIGN="middle">',IsRotated?String.fromCharCode(72-
b,49+a):String.fromCharCode(b+65,56-a),c+='<IMG SRC="'+ClearImg.src+'" CLASS="pieceImage" STYLE="border: none; display: block; vertical-align: middle;" ID="'+f+'" ONFOCUS="this.blur()" /></TD>';c+="</TR>"}d.innerHTML=c+"</TABLE>"}if(d=document.getElementById("boardTable"))tableSize=d.offsetWidth,0<tableSize&&(d.style.height=tableSize+"px");if(d=document.getElementById("GameButtons"))a=(tableSize-12)/5,c='<FORM NAME="GameButtonsForm" STYLE="display:inline;"><TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0"><TR><TD><INPUT ID="startButton" TYPE="BUTTON" VALUE="&lt;&lt;" STYLE="',
0<a&&(c+="width: "+a+"px;"),c+='"; CLASS="buttonControl" TITLE="go to game start" ID="btnGoToStart" onClick="clickedBbtn(this,event);" ONFOCUS="this.blur();"></TD><TD CLASS="buttonControlSpace" WIDTH="3"></TD><TD><INPUT ID="backButton" TYPE="BUTTON" VALUE="&lt;" STYLE="',0<a&&(c+="width: "+a+"px;"),c+='"; CLASS="buttonControl" TITLE="move backward" ID="btnMoveBackward1" onClick="clickedBbtn(this,event);" ONFOCUS="this.blur();"></TD><TD CLASS="buttonControlSpace" WIDTH="3"></TD><TD>',c+='<INPUT ID="autoplayButton" TYPE="BUTTON" VALUE='+
(isAutoPlayOn?"=":"+")+' STYLE="',0<a&&(c+="width: "+a+"px;"),c+=isAutoPlayOn?'"; CLASS="buttonControlStop" TITLE="toggle autoplay (stop)" ':'"; CLASS="buttonControlPlay" TITLE="toggle autoplay (start)" ',c+=' ID="btnPlay" NAME="AutoPlay" onClick="clickedBbtn(this,event);" ONFOCUS="this.blur();"></TD><TD CLASS="buttonControlSpace" WIDTH="3"></TD><TD><INPUT ID="forwardButton" TYPE="BUTTON" VALUE="&gt;" STYLE="',0<a&&(c+="width: "+a+"px;"),c+='"; CLASS="buttonControl" TITLE="move forward" ID="btnMoveForward1" onClick="clickedBbtn(this,event);" ONFOCUS="this.blur();"></TD><TD CLASS="buttonControlSpace" WIDTH="3"></TD><TD><INPUT ID="endButton" TYPE="BUTTON" VALUE="&gt;&gt;" STYLE="',
0<a&&(c+="width: "+a+"px;"),c+='"; CLASS="buttonControl" TITLE="go to game end" ID="btnGoToEnd" onClick="clickedBbtn(this,event);" ONFOCUS="this.blur();"></TD></TR></TABLE></FORM>',d.innerHTML=c;if(d=document.getElementById("GameSelector"))if(firstStart&&(textSelectOptions=""),2>numberOfGames){for(;d.firstChild;)d.removeChild(d.firstChild);textSelectOptions=""}else if(""===textSelectOptions){gameSelectorNum&&(gameSelectorNumLenght=Math.floor(Math.log(numberOfGames)/Math.log(10))+1);c='<FORM NAME="GameSel" STYLE="display:inline;"> <SELECT ID="GameSelSelect" NAME="GameSelSelect" STYLE="';
0<tableSize&&(c+="width: "+tableSize+"px; ");c+='font-family: monospace;" CLASS="selectControl" TITLE="select a game" ONCHANGE="this.blur(); if (this.value >= 0) { Init(this.value); this.value = -1; }" ONFOCUS="disableShortcutKeysAndStoreStatus();" ONBLUR="restoreShortcutKeysStatus();" > <OPTION CLASS="optionSelectControl" value=-1>';b="";for(a=0;32>a;a++)b+=" ";a=(gameSelectorNum?b.substring(0,gameSelectorNumLenght)+" ":"")+gameSelectorHead;c+=a.replace(/ /g,"&nbsp;");for(a=0;a<numberOfGames;a++)textSelectOptions+=
'<OPTION CLASS="optionSelectControl" value='+a+">",f="",gameSelectorNum&&(e=" "+(a+1),f+=b.substr(0,gameSelectorNumLenght-(e.length-1))+e+" "),0<gameSelectorChEvent&&(f+=" "+gameEvent[a].substring(0,gameSelectorChEvent)+b.substr(0,gameSelectorChEvent-gameEvent[a].length)+" "),0<gameSelectorChSite&&(f+=" "+gameSite[a].substring(0,gameSelectorChSite)+b.substr(0,gameSelectorChSite-gameSite[a].length)+" "),0<gameSelectorChRound&&(f+=" "+b.substr(0,gameSelectorChRound-gameRound[a].length)+gameRound[a].substring(0,
gameSelectorChRound)+" "),0<gameSelectorChWhite&&(f+=" "+gameWhite[a].substring(0,gameSelectorChWhite)+b.substr(0,gameSelectorChWhite-gameWhite[a].length)+" "),0<gameSelectorChBlack&&(f+=" "+gameBlack[a].substring(0,gameSelectorChBlack)+b.substr(0,gameSelectorChBlack-gameBlack[a].length)+" "),0<gameSelectorChResult&&(f+=" "+gameResult[a].substring(0,gameSelectorChResult)+b.substr(0,gameSelectorChResult-gameResult[a].length)+" "),0<gameSelectorChDate&&(f+=" "+gameDate[a].substring(0,gameSelectorChDate)+
b.substr(0,gameSelectorChDate-gameDate[a].length)+" "),textSelectOptions+=f.replace(/ /g,"&nbsp;");c+=textSelectOptions.replace(/&(amp|lt|gt);/g,"&amp;$1;")+"</SELECT></FORM>";d.innerHTML=c}if(d=document.getElementById("GameEvent"))d.innerHTML=gameEvent[currentGame];if(d=document.getElementById("GameRound"))d.innerHTML=gameRound[currentGame];if(d=document.getElementById("GameSite"))d.innerHTML=gameSite[currentGame];if(d=document.getElementById("GameDate"))d.innerHTML=gameDate[currentGame],d.style.whiteSpace=
"nowrap";if(d=document.getElementById("GameWhite"))d.innerHTML=gameWhite[currentGame];if(d=document.getElementById("GameBlack"))d.innerHTML=gameBlack[currentGame];if(d=document.getElementById("GameResult"))d.innerHTML=gameResult[currentGame],d.style.whiteSpace="nowrap";if(d=document.getElementById("GameText"))variationTextDepth=-1,c='<SPAN ID="ShowPgnText">'+variationTextFromId(0)+"</SPAN>",d.innerHTML=c;setB1C1F1G1boardShortcuts();if((d=document.getElementById("GameSearch"))&&firstStart)if(2>numberOfGames)for(;d.firstChild;)d.removeChild(d.firstChild);
else if(c='<FORM ID="searchPgnForm" STYLE="display: inline;" ACTION="javascript:searchPgnGameForm();"><INPUT ID="searchPgnButton" CLASS="searchPgnButton" STYLE="display: inline; ',0<tableSize&&(c+="width: "+tableSize/4+"px; "),c+='" TITLE="find games matching the search string (regular expression)" TYPE="submit" VALUE="?"><INPUT ID="searchPgnExpression" CLASS="searchPgnExpression" TITLE="find games matching the search string (regular expression)" TYPE="input" VALUE="" STYLE="display: inline; box-sizing: border-box; -moz-box-sizing: border-box; -webkit-box-sizing: border-box;',
0<tableSize&&(c+="width: "+3*tableSize/4+"px; "),c+='" ONFOCUS="disableShortcutKeysAndStoreStatus();" ONBLUR="restoreShortcutKeysStatus();">',c+="</FORM>",d.innerHTML=c,d=document.getElementById("searchPgnExpression"))d.value=lastSearchPgnExpression}function startButton(a){a.shiftKey?GoToMove(StartPlyVar[CurrentVar]+(CurrentPly<=StartPlyVar[CurrentVar]+1?0:1)):GoToMove(StartPlyVar[0],0)}function backButton(a){a.shiftKey?GoToMove(StartPlyVar[CurrentVar]):GoToMove(CurrentPly-1)}
function forwardButton(a){a.shiftKey?goToNextVariationSibling()||GoToMove(CurrentPly+1):GoToMove(CurrentPly+1)}function endButton(a){a.shiftKey?CurrentPly===StartPlyVar[CurrentVar]+PlyNumberVar[CurrentVar]?goToFirstChild():GoToMove(StartPlyVar[CurrentVar]+PlyNumberVar[CurrentVar]):GoToMove(StartPlyVar[0]+PlyNumberVar[0],0)}
function clickedBbtn(a,b){switch(a.id){case "startButton":startButton(b);break;case "backButton":backButton(b);break;case "autoplayButton":b.shiftKey?goToNextVariationSibling():SwitchAutoPlay();break;case "forwardButton":forwardButton(b);break;case "endButton":endButton(b)}}var basicNAGs=/^[\?!+#\s]+(\s|$)/;
function strippedMoveComment(a,b,c){"undefined"==typeof c&&(c=!1);"undefined"==typeof b&&(b=CurrentVar);return MoveCommentsVar[b][a]?fixCommentForDisplay(MoveCommentsVar[b][a]).replace(pgn4webVariationRegExpGlobal,function(a){return variationTextFromTag(a,c)}).replace(/\[%[^\]]*\]\s*/g,"").replace(basicNAGs,"").replace(/^\s+$/,""):""}
function basicNAGsMoveComment(a,b){"undefined"==typeof b&&(b=CurrentVar);if(!MoveCommentsVar[b][a])return"";var c=MoveCommentsVar[b][a].replace(/\[%[^\]]*\]\s*/g,"").match(basicNAGs,"");return c?c[0].replace(/\s+(?!class=)/gi,""):""}
function variationTextFromTag(a,b){"undefined"==typeof b&&(b=!1);var c=a.replace(pgn4webVariationRegExp,"$1");if(isNaN(c))return myAlert("error: issue parsing variation tag "+a+" in game "+(currentGame+1),!0),"";(c=variationTextFromId(c))?b&&(c="</SPAN>"+c+'<SPAN CLASS="comment">'):c="";return c}var variationTextDepth,printedComment,printedVariation;
function variationTextFromId(a){var b;if(isNaN(a)||0>a||a>=numberOfVars||"undefined"==typeof StartPlyVar[a]||"undefined"==typeof PlyNumberVar[a])return myAlert("error: issue parsing variation id "+a+" in game "+(currentGame+1),!0),"";var c=++variationTextDepth?'<SPAN CLASS="variation">'+(printedVariation?" ":"")+(1<variationTextDepth?"(":"[")+"</SPAN>":"";printedVariation=!1;for(var d=StartPlyVar[a];d<StartPlyVar[a]+PlyNumberVar[a];d++){printedComment=!1;commentsIntoMoveText&&(b=strippedMoveComment(d,
a,!0))&&(commentsOnSeparateLines&&0===variationTextDepth&&d>StartPlyVar[a]&&(c+='<DIV CLASS="comment" STYLE="line-height: 33%;">&nbsp;</DIV>'),printedVariation?-1==",.;:!?".indexOf(b.charAt(0))&&(c+='<SPAN CLASS="variation"> </SPAN>'):printedVariation=0<variationTextDepth,c+='<SPAN CLASS="comment">'+b+"</SPAN>",commentsOnSeparateLines&&0===variationTextDepth&&(c+='<DIV CLASS="comment" STYLE="line-height: 33%;">&nbsp;</DIV>'),printedComment=!0);if(printedComment||printedVariation)c+='<SPAN CLASS="variation"> </SPAN>';
printedVariation=!0;c+=printMoveText(d,a,0<variationTextDepth,printedComment||d==StartPlyVar[a],!0)}commentsIntoMoveText&&(b=strippedMoveComment(StartPlyVar[a]+PlyNumberVar[a],a,!0))&&(commentsOnSeparateLines&&0===variationTextDepth&&(c+='<DIV CLASS="comment" STYLE="line-height: 33%;">&nbsp;</DIV>'),printedVariation&&-1==",.;:!?".indexOf(b.charAt(0))&&(c+='<SPAN CLASS="comment notranslate"> </SPAN>'),c+='<SPAN CLASS="comment">'+b+"</SPAN>",printedComment=!0);c+=variationTextDepth--?'<SPAN CLASS="variation">'+
(variationTextDepth?")":"]")+"</SPAN>":"";printedVariation=!0;return c}
function printMoveText(a,b,c,d,e){"undefined"==typeof b&&(b=CurrentVar);"undefined"==typeof a&&(a=CurrentPly);var f="";if(b>=numberOfVars||a<StartPlyVar[b]||a>StartPlyVar[b]+PlyNumberVar[b])return f;var g=Math.floor(a/2)+1;0===a%2?f+='<SPAN CLASS="'+(c?"variation":"move")+' notranslate">'+g+".&nbsp;</SPAN>":d&&(f+='<SPAN CLASS="'+(c?"variation":"move")+' notranslate">'+g+"...&nbsp;</SPAN>");d=a+1;f+='<A HREF="javascript:void(0);" ONCLICK="GoToMove('+d+", "+b+');" CLASS="'+(c?"variation":"move")+' notranslate" '+
(e?'ID="Var'+b+"Mv"+d+'" ':"")+'ONFOCUS="this.blur();">'+MovesVar[b][a];commentsIntoMoveText&&(f+=basicNAGsMoveComment(d,b));return f+"</A>"}function enableAutoScrollToCurrentMove(a){autoScrollToCurrentMove_objId=a}function disableAutoScrollToCurrentMove(){autoScrollToCurrentMove_objId=""}function toggleAutoScrollToCurrentMove(a){autoScrollToCurrentMove_objId=autoScrollToCurrentMove_objId?"":a}var autoScrollToCurrentMove_objId="";
function autoScrollToCurrentMoveIfEnabled(){autoScrollToCurrentMove(autoScrollToCurrentMove_objId)}function objOffsetVeryTop(a){for(var b=a.offsetTop;a=a.offsetParent;)b+=a.offsetTop+a.clientTop;return b}
function autoScrollToCurrentMove(a){if(a&&(a=document.getElementById(a)))if(CurrentPly==StartPly)a.scrollTop=0;else{var b=document.getElementById("Var"+CurrentVar+"Mv"+CurrentPly);if(b){var c=objOffsetVeryTop(a),d=objOffsetVeryTop(b);if(d+b.offsetHeight>c+a.scrollTop+a.clientHeight||d<c+a.scrollTop)a.scrollTop=d-c}}}function FlipBoard(){var a=highlightOption;a&&SetHighlight(!1);IsRotated=!IsRotated;PrintHTML();RefreshBoard();a&&SetHighlight(!0)}
function RefreshBoard(){for(var a=0;8>a;++a)for(var b=0;8>b;++b)0===Board[a][b]&&SetImage(a,b,ClearImg.src);for(a=0;2>a;++a)for(b=0;16>b;++b)0<PieceType[a][b]&&SetImage(PieceCol[a][b],PieceRow[a][b],PieceImg[a][PieceType[a][b]].src)}
function SetAutoPlay(a){isAutoPlayOn=a;AutoPlayInterval&&(clearTimeout(AutoPlayInterval),AutoPlayInterval=null);isAutoPlayOn?(document.GameButtonsForm&&document.GameButtonsForm.AutoPlay&&(document.GameButtonsForm.AutoPlay.value="=",document.GameButtonsForm.AutoPlay.title="toggle autoplay (stop)",document.GameButtonsForm.AutoPlay.className="buttonControlStop"),CurrentPly<StartPlyVar[CurrentVar]+PlyNumberVar[CurrentVar]?AutoPlayInterval=setTimeout("MoveForward(1)",Delay):autoplayNextGame&&0===CurrentVar?
AutoPlayInterval=setTimeout("AutoplayNextGame()",Delay):SetAutoPlay(!1)):document.GameButtonsForm&&document.GameButtonsForm.AutoPlay&&(document.GameButtonsForm.AutoPlay.value="+",document.GameButtonsForm.AutoPlay.title="toggle autoplay (start)",document.GameButtonsForm.AutoPlay.className="buttonControlPlay")}var minAutoplayDelay=500,maxAutoplayDelay=3E5;
function setCustomAutoplayDelay(){var a=prompt("Enter custom autoplay delay, in seconds, between "+minAutoplayDelay/1E3+" and "+maxAutoplayDelay/1E3+":",Math.floor(Delay/100)/10);isNaN(a=parseInt(a,10))||SetAutoplayDelayAndStart(1E3*a)}function SetAutoplayDelay(a){isNaN(a=parseInt(a,10))||(Delay=Math.min(Math.max(a,minAutoplayDelay),maxAutoplayDelay))}function SetAutoplayDelayAndStart(a){MoveForward(1);SetAutoplayDelay(a);SetAutoPlay(!0)}
function SetLiveBroadcast(a,b,c,d){LiveBroadcastDelay=a;LiveBroadcastAlert=!0===b;LiveBroadcastDemo=!0===c;LiveBroadcastSteppingMode=!0===d;setG7A6B6H7boardShortcuts()}function SetImage(a,b,c){(a=document.getElementById("img_tcol"+(IsRotated?7-a:a)+"trow"+(IsRotated?b:7-b)))&&a.src!=c&&(a.src=c)}function SetImagePath(a){ImagePath=a}function SwitchAutoPlay(){isAutoPlayOn||MoveForward(1);SetAutoPlay(!isAutoPlayOn)}
function StoreMove(a){HistVar[a+1]=CurrentVar;(HistNull[a]=mvIsNull)||(HistPieceId[0][a]=mvPieceId,HistCol[0][a]=PieceCol[MoveColor][mvPieceId],HistRow[0][a]=PieceRow[MoveColor][mvPieceId],HistType[0][a]=PieceType[MoveColor][mvPieceId],HistCol[2][a]=mvToCol,HistRow[2][a]=mvToRow,mvIsCastling?(HistPieceId[1][a]=castleRook,HistCol[1][a]=PieceCol[MoveColor][castleRook],HistRow[1][a]=PieceRow[MoveColor][castleRook],HistType[1][a]=PieceType[MoveColor][castleRook]):0<=mvCapturedId?(HistPieceId[1][a]=mvCapturedId+
16,HistCol[1][a]=PieceCol[1-MoveColor][mvCapturedId],HistRow[1][a]=PieceRow[1-MoveColor][mvCapturedId],HistType[1][a]=PieceType[1-MoveColor][mvCapturedId]):HistPieceId[1][a]=-1,Board[PieceCol[MoveColor][mvPieceId]][PieceRow[MoveColor][mvPieceId]]=0,0<=mvCapturedId&&(PieceType[1-MoveColor][mvCapturedId]=-1,PieceMoveCounter[1-MoveColor][mvCapturedId]++,Board[PieceCol[1-MoveColor][mvCapturedId]][PieceRow[1-MoveColor][mvCapturedId]]=0),PieceType[MoveColor][mvPieceId]=mvPieceOnTo,PieceMoveCounter[MoveColor][mvPieceId]++,
PieceCol[MoveColor][mvPieceId]=mvToCol,PieceRow[MoveColor][mvPieceId]=mvToRow,mvIsCastling&&(PieceMoveCounter[MoveColor][castleRook]++,PieceCol[MoveColor][castleRook]=2==mvToCol?3:5,PieceRow[MoveColor][castleRook]=mvToRow),Board[mvToCol][mvToRow]=PieceType[MoveColor][mvPieceId]*(1-2*MoveColor),mvIsCastling&&(Board[PieceCol[MoveColor][castleRook]][PieceRow[MoveColor][castleRook]]=PieceType[MoveColor][castleRook]*(1-2*MoveColor)))}
function UndoMove(a){if(!HistNull[a]){var b=HistPieceId[0][a];Board[PieceCol[MoveColor][b]][PieceRow[MoveColor][b]]=0;Board[HistCol[0][a]][HistRow[0][a]]=HistType[0][a]*(1-2*MoveColor);PieceType[MoveColor][b]=HistType[0][a];PieceCol[MoveColor][b]=HistCol[0][a];PieceRow[MoveColor][b]=HistRow[0][a];PieceMoveCounter[MoveColor][b]--;b=HistPieceId[1][a];0<=b&&16>b&&(Board[PieceCol[MoveColor][b]][PieceRow[MoveColor][b]]=0,Board[HistCol[1][a]][HistRow[1][a]]=HistType[1][a]*(1-2*MoveColor),PieceType[MoveColor][b]=
HistType[1][a],PieceCol[MoveColor][b]=HistCol[1][a],PieceRow[MoveColor][b]=HistRow[1][a],PieceMoveCounter[MoveColor][b]--);b-=16;0<=b&&16>b&&(Board[PieceCol[1-MoveColor][b]][PieceRow[1-MoveColor][b]]=0,Board[HistCol[1][a]][HistRow[1][a]]=HistType[1][a]*(2*MoveColor-1),PieceType[1-MoveColor][b]=HistType[1][a],PieceCol[1-MoveColor][b]=HistCol[1][a],PieceRow[1-MoveColor][b]=HistRow[1][a],PieceMoveCounter[1-MoveColor][b]--)}}function Color(a){return 0>a?1:0<a?0:2}
function sign(a){return 0<a?1:0>a?-1:0}function SquareOnBoard(a,b){return 0<=a&&7>=a&&0<=b&&7>=b}var pgn4webMaxTouches=0,pgn4webOngoingTouches=[];function pgn4webOngoingTouchIndexById(a){for(var b=0;b<pgn4webOngoingTouches.length;b++)if(pgn4webOngoingTouches[b].identifier===a)return b;return-1}
function pgn4web_handleTouchStart(a){a.stopPropagation();for(var b=0;b<a.changedTouches.length;b++)pgn4webMaxTouches++,pgn4webOngoingTouches.push({identifier:a.changedTouches[b].identifier,clientX:a.changedTouches[b].clientX,clientY:a.changedTouches[b].clientY})}function pgn4web_handleTouchMove(a){a.stopPropagation();a.preventDefault()}
function pgn4web_handleTouchEnd(a){a.stopPropagation();for(var b,c=0;c<a.changedTouches.length;c++)-1!=(b=pgn4webOngoingTouchIndexById(a.changedTouches[c].identifier))&&(1==pgn4webOngoingTouches.length&&(customFunctionOnTouch(a.changedTouches[c].clientX-pgn4webOngoingTouches[b].clientX,a.changedTouches[c].clientY-pgn4webOngoingTouches[b].clientY),pgn4webMaxTouches=0),pgn4webOngoingTouches.splice(b,1));clearSelectedText()}
function pgn4web_handleTouchCancel(a){a.stopPropagation();for(var b,c=0;c<a.changedTouches.length;c++)-1!=(b=pgn4webOngoingTouchIndexById(a.changedTouches[c].identifier))&&(pgn4webOngoingTouches.splice(b,1),0===pgn4webOngoingTouches.length&&(pgn4webMaxTouches=0));clearSelectedText()}
function pgn4web_initTouchEvents(){var a=document.getElementById("GameBoard");a&&touchEventEnabled&&(simpleAddEvent(a,"touchstart",pgn4web_handleTouchStart),simpleAddEvent(a,"touchmove",pgn4web_handleTouchMove),simpleAddEvent(a,"touchend",pgn4web_handleTouchEnd),simpleAddEvent(a,"touchleave",pgn4web_handleTouchEnd),simpleAddEvent(a,"touchcancel",pgn4web_handleTouchCancel))}var waitForDoubleLeftTouchTimer=null;
function customFunctionOnTouch(a,b){13>Math.max(Math.abs(a),Math.abs(b))||(Math.abs(b)>1.5*Math.abs(a)?1<numberOfGames&&(0===currentGame&&0>b?Init(numberOfGames-1):currentGame===numberOfGames-1&&0<b?Init(0):Init(currentGame+sign(b))):Math.abs(a)>1.5*Math.abs(b)&&(0<a?isAutoPlayOn?GoToMove(StartPlyVar[CurrentVar]+PlyNumberVar[CurrentVar]):SwitchAutoPlay():isAutoPlayOn&&!waitForDoubleLeftTouchTimer?SwitchAutoPlay():(waitForDoubleLeftTouchTimer&&(clearTimeout(waitForDoubleLeftTouchTimer),waitForDoubleLeftTouchTimer=
null),0<LiveBroadcastDelay&&0===CurrentVar&&CurrentPly===StartPly+PlyNumber?(waitForDoubleLeftTouchTimer=setTimeout("waitForDoubleLeftTouchTimer = null;",900),replayPreviousMoves(6)):GoToMove(StartPlyVar[CurrentVar]+(CurrentPly<=StartPlyVar[CurrentVar]+1||0===CurrentVar?0:1)))))}var touchEventEnabled=!0;function SetTouchEventEnabled(a){touchEventEnabled=a}
function clearSelectedText(){window.getSelection?window.getSelection().empty?window.getSelection().empty():window.getSelection().removeAllRanges&&window.getSelection().removeAllRanges():document.selection&&document.selection.empty&&document.selection.empty()}function simpleHtmlentities(a){return a.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function simpleHtmlentitiesDecode(a){return a.replace(/&gt;/g,">").replace(/&lt;/g,"<").replace(/&amp;/g,"&")};