665 lines
		
	
	
		
			26 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
		
		
			
		
	
	
			665 lines
		
	
	
		
			26 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
| 
								 | 
							
								<!DOCTYPE HTML>
							 | 
						||
| 
								 | 
							
								<html>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<!--
							 | 
						||
| 
								 | 
							
								  pgn4web javascript chessboard
							 | 
						||
| 
								 | 
							
								  copyright (C) 2009-2014 Paolo Casaschi
							 | 
						||
| 
								 | 
							
								  see README file and http://pgn4web.casaschi.net
							 | 
						||
| 
								 | 
							
								  for credits, license and more details
							 | 
						||
| 
								 | 
							
								-->
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<head>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<title>chess games viewer: live broadcast</title>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<link rel="shortcut icon" href="pawn.ico" />
							 | 
						||
| 
								 | 
							
								<link rel="apple-touch-icon" href="pawn.png" />
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<script src="pgn4web.js" type="text/javascript"></script>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<script type="text/javascript">
							 | 
						||
| 
								 | 
							
								  "use strict";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  var pgnData_default = "live/live.pgn";
							 | 
						||
| 
								 | 
							
								  var maxBoards_default = 8;
							 | 
						||
| 
								 | 
							
								  var displayGame_default = 1;
							 | 
						||
| 
								 | 
							
								  var refreshMinutes_default = 1;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  var thisRegExp = /(&|\?)(help|h)=(true|t)(&|$)/i;
							 | 
						||
| 
								 | 
							
								  if (window.location.search.match(thisRegExp) !== null) {
							 | 
						||
| 
								 | 
							
								    alert("pgn4web live-mosaic-viewer.html parameters" + "\n\n" +
							 | 
						||
| 
								 | 
							
								      " - pgnData = file.pgn" + "\n\n" +
							 | 
						||
| 
								 | 
							
								      " - maxBoards = max number of boards to display in a page (default " + maxBoards_default + ")" + "\n\n" +
							 | 
						||
| 
								 | 
							
								      " - displayGame = number of game for display, negative counts backwards (default " + displayGame_default + ")" + "\n\n" +
							 | 
						||
| 
								 | 
							
								      " - refreshMinutes = live broadcast delay (default " + refreshMinutes_default + ")" + "\n\n" +
							 | 
						||
| 
								 | 
							
								      " - refreshDemo = if set true sets live demo mode (default false)" + "\n\n" +
							 | 
						||
| 
								 | 
							
								      " - headlessPage = if set true displays a page without heading (default false)" + "\n\n" +
							 | 
						||
| 
								 | 
							
								      // " - barePadding = if not null, displays a page with given padding and without header/footer (default null)" + "\n\n" +
							 | 
						||
| 
								 | 
							
								      " - help = true");
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  var pgnData = pgnData_default;
							 | 
						||
| 
								 | 
							
								  thisRegExp = /(&|\?)(pgnData|pd)=([^&]*)(&|$)/i;
							 | 
						||
| 
								 | 
							
								  if (window.location.search.match(thisRegExp) !== null) {
							 | 
						||
| 
								 | 
							
								    pgnData = unescape(window.location.search.match(thisRegExp)[3]);
							 | 
						||
| 
								 | 
							
								  } else {
							 | 
						||
| 
								 | 
							
								    // accepts pgnData as alias for pgnFile for consistency with board.html
							 | 
						||
| 
								 | 
							
								    thisRegExp = /(&|\?)(pgnFile|pf)=([^&]*)(&|$)/i;
							 | 
						||
| 
								 | 
							
								    if (window.location.search.match(thisRegExp) !== null) {
							 | 
						||
| 
								 | 
							
								      pgnData = unescape(window.location.search.match(thisRegExp)[3]);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  SetPgnUrl(pgnData); // if set, this has precedence over the inline PGN in the HTML file
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  var maxBoards = getMaxBoardFromLocalStorage();
							 | 
						||
| 
								 | 
							
								  thisRegExp = /(&|\?)(maxBoards|mb)=([\d]*)(&|$)/i;
							 | 
						||
| 
								 | 
							
								  if (window.location.search.match(thisRegExp) !== null) {
							 | 
						||
| 
								 | 
							
								    maxBoards = unescape(window.location.search.match(thisRegExp)[3]);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  maxBoards = parseInt(maxBoards, 10);
							 | 
						||
| 
								 | 
							
								  if (isNaN(maxBoards) || (maxBoards < 1)) { maxBoards = maxBoards_default; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  var displayGame = displayGame_default;
							 | 
						||
| 
								 | 
							
								  thisRegExp = /(&|\?)(displayGame|dg)=([+-]?[\d]+)(&|$)/i;
							 | 
						||
| 
								 | 
							
								  if (window.location.search.match(thisRegExp) !== null) {
							 | 
						||
| 
								 | 
							
								    displayGame = unescape(window.location.search.match(thisRegExp)[3]);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  displayGame = parseInt(displayGame, 10);
							 | 
						||
| 
								 | 
							
								  if (displayGame === 0) { displayGame = 1; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  var alertFlag = false;
							 | 
						||
| 
								 | 
							
								  var demoFlag = false;
							 | 
						||
| 
								 | 
							
								  thisRegExp = /(&|\?)(refreshDemo|rd)=([^&]*)(&|$)/i;
							 | 
						||
| 
								 | 
							
								  if (window.location.search.match(thisRegExp) !== null) {
							 | 
						||
| 
								 | 
							
								    var refreshDemo = unescape(window.location.search.match(thisRegExp)[3]);
							 | 
						||
| 
								 | 
							
								    if ((refreshDemo == "true") || (refreshDemo == "t")) { alertFlag = demoFlag = true; }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  thisRegExp = /(&|\?)(demoPly|dp)=([^&]*)(&|$)/i;
							 | 
						||
| 
								 | 
							
								  if (window.location.search.match(thisRegExp) !== null) {
							 | 
						||
| 
								 | 
							
								    gameDemoMaxPly = unescape(window.location.search.match(thisRegExp)[3]).split(",");
							 | 
						||
| 
								 | 
							
								    var p;
							 | 
						||
| 
								 | 
							
								    for (var g in gameDemoMaxPly) { gameDemoMaxPly[g] = isNaN(p = parseInt(gameDemoMaxPly[g], 10)) ? 0 : p; }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  var refreshMinutes = refreshMinutes_default;
							 | 
						||
| 
								 | 
							
								  var stepFlag = true;
							 | 
						||
| 
								 | 
							
								  thisRegExp = /(&|\?)(refreshMinutes|rm)=([^&]*)(&|$)/i;
							 | 
						||
| 
								 | 
							
								  if (window.location.search.match(thisRegExp) !== null) {
							 | 
						||
| 
								 | 
							
								    refreshMinutes = parseFloat(unescape(window.location.search.match(thisRegExp)[3]));
							 | 
						||
| 
								 | 
							
								    if (isNaN(refreshMinutes)) { refreshMinutes = refreshMinutes_default; }
							 | 
						||
| 
								 | 
							
								    if (refreshMinutes <= 0) { refreshMinutes = refreshMinutes_default; }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  SetLiveBroadcast(refreshMinutes, alertFlag, demoFlag, stepFlag);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function getMaxBoardFromLocalStorage() {
							 | 
						||
| 
								 | 
							
								    var mb;
							 | 
						||
| 
								 | 
							
								    try { mb = localStorage.getItem("pgn4web_chess_live_mosaic_viewer_maxBoards"); }
							 | 
						||
| 
								 | 
							
								    catch(e) { return maxBoards_default; }
							 | 
						||
| 
								 | 
							
								    return mb === null ? maxBoards_default : mb;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function setMaxBoardToLocalStorage(mb) {
							 | 
						||
| 
								 | 
							
								    try { localStorage.setItem("pgn4web_chess_live_mosaic_viewer_maxBoards", mb); }
							 | 
						||
| 
								 | 
							
								    catch(e) { return false; }
							 | 
						||
| 
								 | 
							
								    return true;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  var headlessPage = false;
							 | 
						||
| 
								 | 
							
								  thisRegExp = /(&|\?)(headlessPage|hp)=([^&]*)(&|$)/i;
							 | 
						||
| 
								 | 
							
								  if (window.location.search.match(thisRegExp) !== null) {
							 | 
						||
| 
								 | 
							
								    var headlessPageValue = unescape(window.location.search.match(thisRegExp)[3]);
							 | 
						||
| 
								 | 
							
								    if ((headlessPageValue == "true") || (headlessPageValue == "t")) { headlessPage = true; }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // undocumented feature
							 | 
						||
| 
								 | 
							
								  var barePadding = "";
							 | 
						||
| 
								 | 
							
								  thisRegExp = /(&|\?)(barePadding|bp)=([^&]*)(&|$)/i;
							 | 
						||
| 
								 | 
							
								  if (window.location.search.match(thisRegExp) !== null) {
							 | 
						||
| 
								 | 
							
								    barePadding = unescape(window.location.search.match(thisRegExp)[3]);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  barePadding = barePadding.replace(/[^a-zA-Z0-9%\s]/g, "");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  SetImagePath("images/alpha/24"); // just to avoid console errors
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								</script>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<style type="text/css">
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@import url("fonts/pgn4web-font-LiberationSans.css");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								html,
							 | 
						||
| 
								 | 
							
								body {
							 | 
						||
| 
								 | 
							
								  margin: 0px;
							 | 
						||
| 
								 | 
							
								  padding: 0px;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								body {
							 | 
						||
| 
								 | 
							
								  color: black;
							 | 
						||
| 
								 | 
							
								  background: white;
							 | 
						||
| 
								 | 
							
								  font-family: sans-serif;
							 | 
						||
| 
								 | 
							
								  padding: 1.75em;
							 | 
						||
| 
								 | 
							
								  overflow-x: hidden;
							 | 
						||
| 
								 | 
							
								  overflow-y: auto;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								a {
							 | 
						||
| 
								 | 
							
								  color: black;
							 | 
						||
| 
								 | 
							
								  text-decoration: none;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								a:hover {
							 | 
						||
| 
								 | 
							
								  color: red;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								.header {
							 | 
						||
| 
								 | 
							
								  color: red;
							 | 
						||
| 
								 | 
							
								  text-decoration: none;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								.beforeBoards {
							 | 
						||
| 
								 | 
							
								  display: inline-block;
							 | 
						||
| 
								 | 
							
								  text-align: right;
							 | 
						||
| 
								 | 
							
								  margin-top: 5px;
							 | 
						||
| 
								 | 
							
								  height: 20px;
							 | 
						||
| 
								 | 
							
								  width: 100%;
							 | 
						||
| 
								 | 
							
								  overflow: hidden;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								.afterBoards {
							 | 
						||
| 
								 | 
							
								  display: inline-block;
							 | 
						||
| 
								 | 
							
								  text-align: right;
							 | 
						||
| 
								 | 
							
								  height: 40px;
							 | 
						||
| 
								 | 
							
								  width: 100%;
							 | 
						||
| 
								 | 
							
								  overflow: hidden;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								.menuLine {
							 | 
						||
| 
								 | 
							
								  font-size: 12px;
							 | 
						||
| 
								 | 
							
								  font-family: 'pgn4web Liberation Sans', sans-serif;
							 | 
						||
| 
								 | 
							
								  line-height: 20px;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								.menuLink {
							 | 
						||
| 
								 | 
							
								  display: inline-block;
							 | 
						||
| 
								 | 
							
								  width: 2em;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								.commandLink:hover {
							 | 
						||
| 
								 | 
							
								  text-transform: uppercase;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								.hiddenFrame,
							 | 
						||
| 
								 | 
							
								.visibleFrame {
							 | 
						||
| 
								 | 
							
								  width: 256px;
							 | 
						||
| 
								 | 
							
								  height: 306px;
							 | 
						||
| 
								 | 
							
								  margin-left: 20px;
							 | 
						||
| 
								 | 
							
								  margin-right: 20px;
							 | 
						||
| 
								 | 
							
								  margin-top: 15px;
							 | 
						||
| 
								 | 
							
								  margin-bottom: 5px;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								.hiddenFrame {
							 | 
						||
| 
								 | 
							
								  display: none;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								.visibleFrame {
							 | 
						||
| 
								 | 
							
								  display: inline;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								.infoMessage {
							 | 
						||
| 
								 | 
							
								  font-weight: bold;
							 | 
						||
| 
								 | 
							
								  text-align: center;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								</style>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								</head>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<body id="body">
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<script type="text/javascript">
							 | 
						||
| 
								 | 
							
								"use strict";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function fixCSSforHeadelessPage() {
							 | 
						||
| 
								 | 
							
								  document.write("<style type='text/css'> body { color: #AAAAAA; } a { color: #AAAAAA; } a:hover { color: black; } .beforeBoards { margin-top: 10px; } </style>");
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function fixCSSforBarePadding() {
							 | 
						||
| 
								 | 
							
								  document.write("<style type='text/css'> body { padding: " + barePadding + "; } .beforeBoards, .afterBoards { display: none; } </style>");
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function printHeader() {
							 | 
						||
| 
								 | 
							
								  document.write("<h1 style='margin-top:0px; padding-top:0px; text-align:right;'><span style='float:left; color:red;'>pgn4web chess live broadcast</span><a href='.' onfocus='this.blur();' style='width:49px; height:29px; background:url(pawns.png) -47px -15px; vertical-align:baseline; display:inline-block;'></a></h1>");
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function printMenu() {
							 | 
						||
| 
								 | 
							
								  document.write("<div id='rightMenu' class='menuLine' style='text-align:right; float:right;'></div><div id='leftMenu' class='menuLine' style='text-align:left; float:left;'><span id='GameLiveStatusDemo' title='this is a simulation of the live broadcast functionality'></span><a id='GameLiveStatus' href='javascript:void(0);' style='display:none;' onclick='clickGameLiveStatus(); this.blur();'></a></div><div id='infoMessage' class='menuLine infoMessage'>chess games viewer: loading PGN data, please wait...</div>");
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var timeOfLastReplayPreviousMoves = 0;
							 | 
						||
| 
								 | 
							
								function clickGameLiveStatus() {
							 | 
						||
| 
								 | 
							
								  var thisTime = (new Date()).getTime();
							 | 
						||
| 
								 | 
							
								  if (thisTime - timeOfLastReplayPreviousMoves < 333) {
							 | 
						||
| 
								 | 
							
								    displayDebugInfo();
							 | 
						||
| 
								 | 
							
								  } else {
							 | 
						||
| 
								 | 
							
								    timeOfLastReplayPreviousMoves = thisTime;
							 | 
						||
| 
								 | 
							
								    replayPreviousMoves();
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function replayPreviousMoves() {
							 | 
						||
| 
								 | 
							
								  var showAll = LiveBroadcastEnded, wf, rpm;
							 | 
						||
| 
								 | 
							
								  for (var thisBoard in boardId) {
							 | 
						||
| 
								 | 
							
								    if ((wf = window.frames["board" + boardId[thisBoard]]) && (rpm = wf.replayPreviousMoves)) {
							 | 
						||
| 
								 | 
							
								      if (showAll || wf.newMovesFlagTimeout) { rpm(1); }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var nextBoardId = 1000;
							 | 
						||
| 
								 | 
							
								var boardId = new Array();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function updateBoardFrames(newMaxBoards) {
							 | 
						||
| 
								 | 
							
								  var theObj = document.getElementById("boardFrames");
							 | 
						||
| 
								 | 
							
								  if (theObj) {
							 | 
						||
| 
								 | 
							
								    theObj.innerHTML = "";
							 | 
						||
| 
								 | 
							
								    for (var board = 0; board < newMaxBoards; board++) {
							 | 
						||
| 
								 | 
							
								      theObj.innerHTML += "<iframe src='live-mosaic-tile.html?ut=t&rm=" + refreshMinutes + "' class='hiddenFrame' id='board" + nextBoardId + "' name='board" + nextBoardId + "' width='256' height='306' frameborder='0' marginheight='0' marginwidth='0' scrolling='no'>your web browser and/or your host do not support iframes as required to display the chessboard</iframe>";
							 | 
						||
| 
								 | 
							
								      boardId[board] = nextBoardId++;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  maxBoards = newMaxBoards;
							 | 
						||
| 
								 | 
							
								  setMaxBoardToLocalStorage(maxBoards);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if (headlessPage || (barePadding !== "")) {
							 | 
						||
| 
								 | 
							
								  fixCSSforHeadelessPage();
							 | 
						||
| 
								 | 
							
								  if (barePadding !== "") { fixCSSforBarePadding(); }
							 | 
						||
| 
								 | 
							
								  else { printMenu(); }
							 | 
						||
| 
								 | 
							
								} else {
							 | 
						||
| 
								 | 
							
								  printHeader();
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								</script>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<center>
							 | 
						||
| 
								 | 
							
								<a class="beforeBoards" name="boards" href="javascript:void(0);" onclick="goToHash('boards');" onfocus="this.blur();"> </a>
							 | 
						||
| 
								 | 
							
								<div id="boardFrames"></div>
							 | 
						||
| 
								 | 
							
								<a class="afterBoards" name="bottom" href="javascript:void(0);" onclick="goToHash('');" onfocus="this.blur();"> </a>
							 | 
						||
| 
								 | 
							
								</center>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<script type="text/javascript">
							 | 
						||
| 
								 | 
							
								"use strict";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								updateBoardFrames(maxBoards);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if (!headlessPage && (barePadding === "")) { printMenu(); }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var pgn4webClearShortCutSquaresForChildFrames = [ ["DH", "8"], ["H", "7"], ["ABH", "6"] ];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var filteredGames = new Array();
							 | 
						||
| 
								 | 
							
								var unfilteredGames = new Array();
							 | 
						||
| 
								 | 
							
								var numberOfGamesForDisplay = 0;
							 | 
						||
| 
								 | 
							
								var firstGame;
							 | 
						||
| 
								 | 
							
								var startGame;
							 | 
						||
| 
								 | 
							
								var firstBoardDisplayGame = 0;
							 | 
						||
| 
								 | 
							
								var gamesForHiding;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function firstFromDisplayGame(dGame) {
							 | 
						||
| 
								 | 
							
								  if (dGame > numberOfGames) { dGame = numberOfGames; }
							 | 
						||
| 
								 | 
							
								  else if (dGame < -numberOfGames) { dGame = -numberOfGames; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (dGame > 0) { dGame--; } // positive displayGame starts from +1 as first game
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  var dGameAdjustment = 0;
							 | 
						||
| 
								 | 
							
								  if (filteredGames.length > 0) {
							 | 
						||
| 
								 | 
							
								    var g;
							 | 
						||
| 
								 | 
							
								    if (dGame >= 0) {
							 | 
						||
| 
								 | 
							
								      for (g = 0; g < dGame; g++) {
							 | 
						||
| 
								 | 
							
								        if (checkForHiddenGame(gameEvent[g], gameSite[g], gameDate[g], gameRound[g], gameWhite[g], gameBlack[g])) {
							 | 
						||
| 
								 | 
							
								          dGameAdjustment--;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								      for (g = numberOfGames - 1; g > numberOfGames + dGame; g--) {
							 | 
						||
| 
								 | 
							
								        if (checkForHiddenGame(gameEvent[g], gameSite[g], gameDate[g], gameRound[g], gameWhite[g], gameBlack[g])) {
							 | 
						||
| 
								 | 
							
								          dGameAdjustment++;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return (dGame + dGameAdjustment);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function gameKey(event, site, date, round, white, black) {
							 | 
						||
| 
								 | 
							
								  var key = "";
							 | 
						||
| 
								 | 
							
								  key += "[" + (typeof(event) == "string" ? event : "") + "]";
							 | 
						||
| 
								 | 
							
								  key += "[" + (typeof(site) == "string" ? site : "") + "]";
							 | 
						||
| 
								 | 
							
								  key += "[" + (typeof(round) == "string" ? round : "") + "]";
							 | 
						||
| 
								 | 
							
								  key += "[" + (typeof(white) == "string" ? white : "") + "]";
							 | 
						||
| 
								 | 
							
								  key += "[" + (typeof(black) == "string" ? black : "") + "]";
							 | 
						||
| 
								 | 
							
								  return key;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function pgn4webHideChildFrameGame(event, site, date, round, white, black, test) {
							 | 
						||
| 
								 | 
							
								  var res = false;
							 | 
						||
| 
								 | 
							
								  if (numberOfGamesForDisplay > 1) {
							 | 
						||
| 
								 | 
							
								    res = hideGame(event, site, date, round, white, black, test);
							 | 
						||
| 
								 | 
							
								    if (res && (test !== true)) {
							 | 
						||
| 
								 | 
							
								      firstGame = firstFromDisplayGame(firstBoardDisplayGame);
							 | 
						||
| 
								 | 
							
								      customFunctionOnPgnTextLoad();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  return res;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function hideGame(event, site, date, round, white, black, test) {
							 | 
						||
| 
								 | 
							
								  var key = gameKey(event, site, date, round, white, black);
							 | 
						||
| 
								 | 
							
								  var meaningful = (key.match(/[A-Za-z0-9]/) !== null);
							 | 
						||
| 
								 | 
							
								  if (meaningful && (test !== true)) {
							 | 
						||
| 
								 | 
							
								    for (var f in filteredGames) { if (key == filteredGames[f]) { return false; } }
							 | 
						||
| 
								 | 
							
								    filteredGames.push(key);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  return meaningful;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function checkForHiddenGame(event, site, date, round, white, black) {
							 | 
						||
| 
								 | 
							
								  var key = gameKey(event, site, date, round, white, black);
							 | 
						||
| 
								 | 
							
								  for (var f in filteredGames) {
							 | 
						||
| 
								 | 
							
								    if (key == filteredGames[f]) { return true; }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  return false;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function hideEndedGames() {
							 | 
						||
| 
								 | 
							
								  for (var g = 0; g < numberOfGames; g++) {
							 | 
						||
| 
								 | 
							
								    if ((typeof(gameResult[g]) == "undefined") || (gameResult[g].indexOf("*") == -1)) {
							 | 
						||
| 
								 | 
							
								      hideGame(gameEvent[g], gameSite[g], gameDate[g], gameRound[g], gameWhite[g], gameBlack[g]);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  firstGame = firstFromDisplayGame(firstBoardDisplayGame);
							 | 
						||
| 
								 | 
							
								  customFunctionOnPgnTextLoad();
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function restoreHiddenGames() {
							 | 
						||
| 
								 | 
							
								  filteredGames = new Array();
							 | 
						||
| 
								 | 
							
								  firstGame = firstFromDisplayGame(firstBoardDisplayGame);
							 | 
						||
| 
								 | 
							
								  customFunctionOnPgnTextLoad();
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function pgnGameForBoard(gameNum) {
							 | 
						||
| 
								 | 
							
								  if (!LiveBroadcastDemo) { return fullPgnGame(gameNum); }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (gameDemoMaxPly[gameNum] > gameDemoLength[gameNum]) { return fullPgnGame(gameNum); }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Init(gameNum);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  var localPgnGame = "";
							 | 
						||
| 
								 | 
							
								  if (gameEvent[gameNum]) { localPgnGame += "[Event \"" + gameEvent[gameNum] + "\"]\n"; }
							 | 
						||
| 
								 | 
							
								  if (gameSite[gameNum]) { localPgnGame += "[Site \"" + gameSite[gameNum] + "\"]\n"; }
							 | 
						||
| 
								 | 
							
								  if (gameDate[gameNum]) { localPgnGame += "[Date \"" + gameDate[gameNum] + "\"]\n"; }
							 | 
						||
| 
								 | 
							
								  if (gameRound[gameNum]) { localPgnGame += "[Round \"" + gameRound[gameNum] + "\"]\n"; }
							 | 
						||
| 
								 | 
							
								  if (gameWhite[gameNum]) { localPgnGame += "[White \"" + gameWhite[gameNum] + "\"]\n"; }
							 | 
						||
| 
								 | 
							
								  if (gameBlack[gameNum]) { localPgnGame += "[Black \"" + gameBlack[gameNum] + "\"]\n"; }
							 | 
						||
| 
								 | 
							
								  if (gameResult[gameNum]) { localPgnGame += "[Result \"" + gameResult[gameNum] + "\"]\n"; }
							 | 
						||
| 
								 | 
							
								  if (gameFEN[gameNum]) { localPgnGame += "[FEN \"" + gameFEN[gameNum] + "\"]\n"; }
							 | 
						||
| 
								 | 
							
								  if (gameSetUp[gameNum]) { localPgnGame += "[SetUp \"" + gameSetUp[gameNum] + "\"]\n"; }
							 | 
						||
| 
								 | 
							
								  if (gameVariant[gameNum]) { localPgnGame += "[Variant \"" + gameVariant[gameNum] + "\"]\n"; }
							 | 
						||
| 
								 | 
							
								  if (gameInitialWhiteClock[gameNum]) { localPgnGame += "[WhiteClock \"" + gameInitialWhiteClock[gameNum] + "\"]\n"; }
							 | 
						||
| 
								 | 
							
								  if (gameInitialBlackClock[gameNum]) { localPgnGame += "[BlackClock \"" + gameInitialBlackClock[gameNum] + "\"]\n"; }
							 | 
						||
| 
								 | 
							
								  var thisTag = customPgnHeaderTag("TimeControl");
							 | 
						||
| 
								 | 
							
								  if (thisTag) { localPgnGame += "[TimeControl \"" + thisTag + "\"]\n"; }
							 | 
						||
| 
								 | 
							
								  localPgnGame += "\n";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  var gameDemoPlyNumber = gameDemoMaxPly[gameNum] <= gameDemoLength[gameNum] ? gameDemoMaxPly[gameNum] : gameDemoLength[gameNum] + 1;
							 | 
						||
| 
								 | 
							
								  for (var thisPly = StartPly; thisPly < StartPly + gameDemoPlyNumber; thisPly++) {
							 | 
						||
| 
								 | 
							
								    if (thisPly % 2) {
							 | 
						||
| 
								 | 
							
								      if (thisComment = MoveComments[thisPly].replace(/{/g, "")) {
							 | 
						||
| 
								 | 
							
								        localPgnGame += "{" + thisComment + "} " + ((thisPly+1)/2) + "... ";
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      localPgnGame += Moves[thisPly] + " \n";
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								      if (thisComment = MoveComments[thisPly].replace(/{/g, "")) { localPgnGame += "{" + thisComment + "} "; }
							 | 
						||
| 
								 | 
							
								      localPgnGame += (thisPly/2+1) + ". " + Moves[thisPly] + " ";
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  var thisComment = MoveComments[thisPly].replace(/{/g, "");
							 | 
						||
| 
								 | 
							
								  if (thisComment) { localPgnGame += "{" + thisComment + "} "; }
							 | 
						||
| 
								 | 
							
								  localPgnGame += " *";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return localPgnGame;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function updateBoard(thisBoardId) {
							 | 
						||
| 
								 | 
							
								  var gameNum = -1;
							 | 
						||
| 
								 | 
							
								  var thisBoard = -1;
							 | 
						||
| 
								 | 
							
								  var thisFrame, gameForBoard, thisPgnGame, thisFrameClass;
							 | 
						||
| 
								 | 
							
								  for (thisBoard in boardId) { if (thisBoardId === boardId[thisBoard]) { break; } }
							 | 
						||
| 
								 | 
							
								  thisBoard = parseInt(thisBoard, 10);
							 | 
						||
| 
								 | 
							
								  if ((thisBoard < boardId.length) && (thisFrame = document.getElementById("board" + thisBoardId))) {
							 | 
						||
| 
								 | 
							
								    if (thisBoard < numberOfGamesForDisplay) {
							 | 
						||
| 
								 | 
							
								      startGame = startFromFirstGame(firstGame);
							 | 
						||
| 
								 | 
							
								      if (startGame >= 0) { gameForBoard = (startGame + thisBoard) % numberOfGamesForDisplay; }
							 | 
						||
| 
								 | 
							
								      else { gameForBoard = (2 * numberOfGamesForDisplay + startGame - thisBoard) % numberOfGamesForDisplay; }
							 | 
						||
| 
								 | 
							
								      gameNum = unfilteredGames[gameForBoard];
							 | 
						||
| 
								 | 
							
								      thisPgnGame = simpleHtmlentitiesDecode(pgnGameForBoard(gameNum));
							 | 
						||
| 
								 | 
							
								      thisFrameClass = "visibleFrame";
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								      thisPgnGame = "";
							 | 
						||
| 
								 | 
							
								      thisFrameClass = "hiddenFrame";
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    try {
							 | 
						||
| 
								 | 
							
								      if (window.frames["board" + thisBoardId].readyToReceivePgn) {
							 | 
						||
| 
								 | 
							
								        window.frames["board" + thisBoardId].pauseLiveBroadcast();
							 | 
						||
| 
								 | 
							
								        window.frames["board" + thisBoardId].document.getElementById("pgnText").value = thisPgnGame;
							 | 
						||
| 
								 | 
							
								        window.frames["board" + thisBoardId].refreshPgnSource();
							 | 
						||
| 
								 | 
							
								        window.frames["board" + thisBoardId].clearShortcutSquares("A","8");
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    } catch(e) { myAlert("error: failed accessing iframe for board #" + thisBoard, true); }
							 | 
						||
| 
								 | 
							
								    thisFrame.className = thisFrameClass;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  return gameNum;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var firstLoadPgnText = true;
							 | 
						||
| 
								 | 
							
								var liveBroadcastUpdateTicker = 0;
							 | 
						||
| 
								 | 
							
								var previousPgnGameLength = new Array();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function customFunctionOnPgnTextLoad() {
							 | 
						||
| 
								 | 
							
								  var theObj;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (firstLoadPgnText) { firstGame = firstFromDisplayGame(displayGame); }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  unfilteredGames = new Array();
							 | 
						||
| 
								 | 
							
								  var newMovesInShownGames = false;
							 | 
						||
| 
								 | 
							
								  gamesForHiding = 0;
							 | 
						||
| 
								 | 
							
								  for (var g = 0; g < numberOfGames; g++) {
							 | 
						||
| 
								 | 
							
								    if (!checkForHiddenGame(gameEvent[g], gameSite[g], gameDate[g], gameRound[g], gameWhite[g], gameBlack[g])) {
							 | 
						||
| 
								 | 
							
								      unfilteredGames.push(g);
							 | 
						||
| 
								 | 
							
								      if ((typeof(gameResult[g]) == "undefined") || (gameResult[g].indexOf("*") == -1)) { gamesForHiding++; }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  numberOfGamesForDisplay = unfilteredGames.length;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  for (var board = 0; board < maxBoards; board++) {
							 | 
						||
| 
								 | 
							
								    if ((g = updateBoard(boardId[board])) != -1) {
							 | 
						||
| 
								 | 
							
								      if (board === 0) { firstBoardDisplayGame = displayGame >=0 ? g + 1 : numberOfGames - g; }
							 | 
						||
| 
								 | 
							
								      var found_g = false; for (var f in unfilteredGames) { if (unfilteredGames[f] === g) { found_g = true; break; } }
							 | 
						||
| 
								 | 
							
								      if (found_g) {
							 | 
						||
| 
								 | 
							
								        var currentPgnGameLength;
							 | 
						||
| 
								 | 
							
								        if (LiveBroadcastDemo) {
							 | 
						||
| 
								 | 
							
								          currentPgnGameLength = gameDemoMaxPly[g] > gameDemoLength[g] ? gameDemoLength[g] + 1 : gameDemoMaxPly[g];
							 | 
						||
| 
								 | 
							
								        } else {
							 | 
						||
| 
								 | 
							
								          currentPgnGameLength = pgnGame[g].replace(/{[^}]*}/g, " ").replace(/\([^)]*\)/g, " ").length;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        newMovesInShownGames = newMovesInShownGames || (typeof(previousPgnGameLength[g]) == "undefined") || (previousPgnGameLength[g] !== currentPgnGameLength);
							 | 
						||
| 
								 | 
							
								        previousPgnGameLength[g] = currentPgnGameLength;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (theObj = document.getElementById("GameLiveStatus")) {
							 | 
						||
| 
								 | 
							
								    if (alertNumSinceReset) {
							 | 
						||
| 
								 | 
							
								      theObj.title += " - " + alertNumSinceReset + " new alert" + (alertNumSinceReset > 1 ? "s" : "");
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    if (firstLoadPgnText) { theObj.style.display = "inline"; }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (newMovesInShownGames) { liveBroadcastUpdateTicker++; }
							 | 
						||
| 
								 | 
							
								  document.title = liveBroadcastUpdateTicker + "." + LiveBroadcastStatusString.replace(/^(\d*)\D*(\d*)$/, "$1.$2") + " live broadcast" + (demoFlag ? " demo" : "");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (theObj = document.getElementById("GameLiveStatusDemo")) { theObj.innerHTML = LiveBroadcastDemo ? "demo   " : ""; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  updateMenu();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (firstLoadPgnText) { firstLoadPgnText = false; }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function customDebugInfo() {
							 | 
						||
| 
								 | 
							
								  var dbg = "maxBoards=" + maxBoards;
							 | 
						||
| 
								 | 
							
								  dbg += " filtered=" + filteredGames.length;
							 | 
						||
| 
								 | 
							
								  return dbg;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function updateMenu() {
							 | 
						||
| 
								 | 
							
								  var theRightObject, theLeftObject, theInfoObject;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (theRightObject = document.getElementById("rightMenu")) {
							 | 
						||
| 
								 | 
							
								    theRightObject.innerHTML = "";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (numberOfGamesForDisplay > maxBoards) { theRightObject.innerHTML += "<span class='menuLink'><a class='commandLink' href='javascript:void(0);' onclick='previousPage();' title='showing from game " + (Math.abs(firstGame)+1) + "/" + numberOfGamesForDisplay + ": view the Earlier games' onfocus='this.blur();'> e </a></span><span class='menuLink'><a class='commandLink' href='javascript:void(0);' onclick='nextPage();' title='showing from game " + (Math.abs(firstGame)+1) + "/" + numberOfGamesForDisplay + ": view the Next games' onfocus='this.blur();'> n </a></span>"; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (maxBoards > 1 && numberOfGamesForDisplay > 1) { theRightObject.innerHTML += "<span class='menuLink'><a class='commandLink' href='javascript:void(0);' onclick='newBoards(" + Math.min(maxBoards - 1, numberOfGamesForDisplay - 1) + ");' title='show one chessboard Less' onfocus='this.blur();'> l </a></span>"; }
							 | 
						||
| 
								 | 
							
								    if (numberOfGamesForDisplay > maxBoards) { theRightObject.innerHTML += "<span class='menuLink'><a class='commandLink' href='javascript:void(0);' onclick='newBoards(" + (maxBoards + 1) + ");' title='show one chessboard More' onfocus='this.blur();'> m </a></span>"; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (LiveBroadcastStarted && !LiveBroadcastEnded && gamesForHiding && numberOfGamesForDisplay > 1) { theRightObject.innerHTML += "<span class='menuLink'><a class='commandLink' href='javascript:void(0);' onclick='hideEndedGames();' title='Hide games finished so far' onfocus='this.blur();'> h </a></span>"; }
							 | 
						||
| 
								 | 
							
								    if (filteredGames.length > 0) { theRightObject.innerHTML += "<span class='menuLink'><a class='commandLink' href='javascript:void(0);' onclick='restoreHiddenGames();' title='Unhide games previously hidden: " + filteredGames.length + "/" + numberOfGames + "' onfocus='this.blur();'> u </a></span>"; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (LiveBroadcastDelay > 0) {
							 | 
						||
| 
								 | 
							
								      if (LiveBroadcastEnded) { theRightObject.innerHTML += "<span class='menuLink'><a class='commandLink' href='javascript:void(0);' onclick='restartLiveBroadcast();' title='Check for the start of a new live broadcast event' onfocus='this.blur();'> c </a></span>"; }
							 | 
						||
| 
								 | 
							
								      else {
							 | 
						||
| 
								 | 
							
								        if (LiveBroadcastPaused && LiveBroadcastStarted) { theRightObject.innerHTML += "<span class='menuLink'><a class='commandLink' href='javascript:void(0);' onclick='restartLiveBroadcast(); updateMenu();' title='Restart live broadcast automatic refresh of games' onfocus='this.blur();'> r </a></span>"; }
							 | 
						||
| 
								 | 
							
								        else if (LiveBroadcastPaused && !LiveBroadcastStarted) { theRightObject.innerHTML += "<span class='menuLink'><a class='commandLink' href='javascript:void(0);' onclick='restartLiveBroadcast(); updateMenu();' title='Restart polling for a new live broadcast' onfocus='this.blur();'> r </a></span>"; }
							 | 
						||
| 
								 | 
							
								        else if (LiveBroadcastStarted) { theRightObject.innerHTML += "<span class='menuLink'><a class='commandLink' href='javascript:void(0);' onclick='pauseLiveBroadcast(); updateMenu();' title='Pause live broadcast automatic refresh of games' onfocus='this.blur();'> p </a></span>"; }
							 | 
						||
| 
								 | 
							
								        else { theRightObject.innerHTML += "<span class='menuLink'><a class='commandLink' href='javascript:void(0);' onclick='pauseLiveBroadcast(); updateMenu();' title='Pause polling for a new live broadcast' onfocus='this.blur();'> p </a></span>"; }
							 | 
						||
| 
								 | 
							
								        theRightObject.innerHTML += "<span class='menuLink'><a class='commandLink' class='commandLink' href='javascript:void(0);' onclick='refreshPgnSource();' title='Force games refresh" + (LiveBroadcastStarted ? ": last moves received on " + LiveBroadcastLastReceivedLocal : "") + "' onfocus='this.blur();'> f </a></span>";
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (theRightObject && (theLeftObject = document.getElementById("leftMenu"))) {
							 | 
						||
| 
								 | 
							
								      theRightObject.style.minWidth = 0;
							 | 
						||
| 
								 | 
							
								      theLeftObject.style.minWidth = 0;
							 | 
						||
| 
								 | 
							
								      theRightObject.style.minWidth = theLeftObject.offsetWidth;
							 | 
						||
| 
								 | 
							
								      theLeftObject.style.minWidth = theRightObject.offsetWidth;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (theInfoObject = document.getElementById("infoMessage")) {
							 | 
						||
| 
								 | 
							
								    if (numberOfGamesForDisplay < 1) {
							 | 
						||
| 
								 | 
							
								      theInfoObject.innerHTML = "warning: all games hidden: <a href='javascript:void(0);' onclick='restoreHiddenGames();' onfocus='this.blur();'>unhide games</a> or <a href='javascript:void(0);' onclick='refreshPgnSource();' onfocus='this.blur();'>force live refresh</a>";
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								      var theEvent = "";
							 | 
						||
| 
								 | 
							
								      var theSite = "";
							 | 
						||
| 
								 | 
							
								      for (var n = 0; n < numberOfGames; n++) {
							 | 
						||
| 
								 | 
							
								        if ((theEvent !== false) && (theEvent !== gameEvent[n])) {
							 | 
						||
| 
								 | 
							
								          if (theEvent) { theEvent = false; }
							 | 
						||
| 
								 | 
							
								          else { theEvent = gameEvent[n]; }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        if ((theSite !== false) && (theSite !== gameSite[n])) {
							 | 
						||
| 
								 | 
							
								          if (theSite) { theSite = false; }
							 | 
						||
| 
								 | 
							
								          else { theSite = gameSite[n]; }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      if (theEvent == "?") { theEvent = ""; }
							 | 
						||
| 
								 | 
							
								      if (theSite == "?") { theSite = ""; }
							 | 
						||
| 
								 | 
							
								      if (theEvent) { theEvent = theEvent.replace(/\s/g, " ").replace(/-/g, "‑"); }
							 | 
						||
| 
								 | 
							
								      if (theSite) { theSite = theSite.replace(/\s/g, " ").replace(/-/g, "‑"); }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      if (theEvent || theSite) {
							 | 
						||
| 
								 | 
							
								        var theInfoObjectText = "<span class='notranslate'>   ";
							 | 
						||
| 
								 | 
							
								        if (theEvent) { theInfoObjectText += theEvent; }
							 | 
						||
| 
								 | 
							
								        if (theEvent && theSite) { theInfoObjectText += "   "; }
							 | 
						||
| 
								 | 
							
								        if (theSite) { theInfoObjectText += theSite; }
							 | 
						||
| 
								 | 
							
								        theInfoObjectText += "   </span>";
							 | 
						||
| 
								 | 
							
								        theInfoObject.innerHTML = theInfoObjectText;
							 | 
						||
| 
								 | 
							
								        theInfoObject.title = "event currently on display: hover the mouse below each chessboard for more details";
							 | 
						||
| 
								 | 
							
								      } else {
							 | 
						||
| 
								 | 
							
								        theInfoObject.innerHTML = " ";
							 | 
						||
| 
								 | 
							
								        theInfoObject.title = "";
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function startFromFirstGame(fGame) {
							 | 
						||
| 
								 | 
							
								  if (fGame >= numberOfGamesForDisplay) { return numberOfGamesForDisplay - 1; }
							 | 
						||
| 
								 | 
							
								  if (fGame < -numberOfGamesForDisplay) { return 0; }
							 | 
						||
| 
								 | 
							
								  if (fGame < 0) { return numberOfGamesForDisplay + fGame; }
							 | 
						||
| 
								 | 
							
								  else { return fGame; }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function nextPage() {
							 | 
						||
| 
								 | 
							
								  firstGame = (startFromFirstGame(firstGame) + maxBoards) % numberOfGamesForDisplay;
							 | 
						||
| 
								 | 
							
								  firstGame -= (firstGame < 0 ? numberOfGamesForDisplay : 0);
							 | 
						||
| 
								 | 
							
								  customFunctionOnPgnTextLoad();
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function previousPage() {
							 | 
						||
| 
								 | 
							
								  firstGame = (startFromFirstGame(firstGame) - maxBoards + numberOfGamesForDisplay) % numberOfGamesForDisplay;
							 | 
						||
| 
								 | 
							
								  firstGame -= (firstGame < 0 ? numberOfGamesForDisplay : 0);
							 | 
						||
| 
								 | 
							
								  customFunctionOnPgnTextLoad();
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function newBoards(newMaxBoards) {
							 | 
						||
| 
								 | 
							
								  updateBoardFrames(newMaxBoards);
							 | 
						||
| 
								 | 
							
								  updateMenu();
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function cycleHash() {
							 | 
						||
| 
								 | 
							
								  switch (location.hash) {
							 | 
						||
| 
								 | 
							
								    case "#boards": goToHash("bottom"); break;
							 | 
						||
| 
								 | 
							
								    case "#bottom": goToHash(""); break;
							 | 
						||
| 
								 | 
							
								    default: goToHash("boards"); break;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function goToHash(hash) {
							 | 
						||
| 
								 | 
							
								  if (hash) { location.hash = ""; }
							 | 
						||
| 
								 | 
							
								  else { location.hash = "boards"; }
							 | 
						||
| 
								 | 
							
								  location.hash = hash;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function customShortcutKey_Shift_3() { cycleHash(); }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function customShortcutKey_Shift_5() {
							 | 
						||
| 
								 | 
							
								  displayGame = displayGame_default;
							 | 
						||
| 
								 | 
							
								  firstLoadPgnText = true;
							 | 
						||
| 
								 | 
							
								  customFunctionOnPgnTextLoad();
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function customShortcutKey_Shift_6() {
							 | 
						||
| 
								 | 
							
								  firstLoadPgnText = true;
							 | 
						||
| 
								 | 
							
								  customFunctionOnPgnTextLoad();
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function customShortcutKey_Shift_7() {
							 | 
						||
| 
								 | 
							
								  restoreHiddenGames();
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function customShortcutKey_Shift_8() {
							 | 
						||
| 
								 | 
							
								  newBoards(maxBoards_default);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								</script>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								</body>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								</html>
							 |