﻿ie4 = (document.all) ? 1 : 0;

if (!(ie4)) {
	var getter = function() { return this.textContent; };
	var setter = function(t) { return this.textContent = t; };
	HTMLElement.prototype.__defineGetter__("innerText", getter);
	HTMLElement.prototype.__defineSetter__("innerText", setter);
}

function gp(newply) {
	var source;
	var dest;
	var newPosition;
	var startPosition;
	var boardPosition;
	var piecemoved;

	var htmlmoves = HtmlDecode(document.getElementById(Moves).value);

	var arrMoveNotation = document.getElementById(Notation).innerText.split(" ");
	if (newply == 999) newply = arrMoveNotation.length - 1;
	if ((newply < 0) || (newply >= arrMoveNotation.length)) return;

	startPosition = document.getElementById(StartPosition).value;
	boardPosition = document.getElementById(posID).value;
	newPosition = startPosition;

	var promotedpieces = 0;
	var loop = 0;

	while (loop < newply) {
		source = htmlmoves.charCodeAt(loop * 2 + promotedpieces) - 6;
		dest = htmlmoves.charCodeAt(loop * 2 + 1 + promotedpieces) - 6;
		piecemoved = newPosition.charAt(source);

		//Check for en passant and pawn promotion
		if ((piecemoved == "f") || (piecemoved == "l")) {
			//check for enpassant
			if ((dest - source) % 12 != 0) {
				//The pawn has captured...check if destination was empty
				if (newPosition.charAt(dest) == "`") {
					if (loop % 2 == 0) {
						//White move
						newPosition = setCharAt(newPosition, dest - 12, "`");
					}
					else {
						//Black move
						newPosition = setCharAt(newPosition, dest + 12, "`");
					}
				}
			}
			//Check for pawn promotion
			if ((dest >= 110) && (loop % 2 == 0)) {
				promotedpieces++;
				piecemoved = htmlmoves.charAt(loop * 2 + 1 + promotedpieces);
			}
			else if ((dest <= 33) && (loop % 2 == 1)) {
				promotedpieces++;
				piecemoved = htmlmoves.charAt(loop * 2 + 1 + promotedpieces);
			}
		}
		else if ((piecemoved == "e") || (piecemoved == "k")) {
			if ((source == 30) && (dest == 32) && (piecemoved == "e")) {
				//White king side castling occured
				newPosition = setCharAt(newPosition, 33, "`");
				newPosition = setCharAt(newPosition, 31, "a");
			}
			else if ((source == 30) && (dest == 28) && (piecemoved == "e")) {
				//White queen side castling occured
				newPosition = setCharAt(newPosition, 26, "`");
				newPosition = setCharAt(newPosition, 29, "a");
			}
			else if ((source == 114) && (dest == 116) && (piecemoved == "k")) {
				//Black king side castling occured
				newPosition = setCharAt(newPosition, 117, "`");
				newPosition = setCharAt(newPosition, 115, "g");
			}
			else if ((source == 114) && (dest == 112) && (piecemoved == "k")) {
				//Black queen side castling occured
				newPosition = setCharAt(newPosition, 110, "`");
				newPosition = setCharAt(newPosition, 113, "g");
			}
		}
		newPosition = setCharAt(newPosition, dest, piecemoved);
		newPosition = setCharAt(newPosition, source, "`");

		loop++;
	}
	
	DisplayPosition(newPosition, boardPosition, "BoardTable");

	document.getElementById(posID).setAttribute("value", newPosition);
	var oldply = document.getElementById(currentPly).value;
	document.getElementById(currentPly).value = newply.toString();

	//Remove the highlight from previous active move and set it to current
	if (oldply != 0) {
		document.getElementById(String(oldply)).style.backgroundColor = 'White';
		document.getElementById(String(oldply)).style.color = 'Black';
	}

	//Display the current move under the board
	if (newply != 0) {
		var gameNotation = document.getElementById(Notation).innerText.split(" ");
		var moveNotation = document.getElementById(currentMove);
		moveNotation.innerText = "";
		if (newply % 2 == 0) moveNotation.innerText = String(Math.floor(newply / 2) + (newply % 2)) + "...";
		moveNotation.innerText += gameNotation[newply - 1];
		//Highlight the current move
		document.getElementById(String(newply)).style.backgroundColor = '#7086B8';
		document.getElementById(String(newply)).style.color = 'White';
	}
	else {
		document.getElementById(currentMove).innerText = "";
	}
}

function gpO(boardNumber, newply) {
	var source;
	var dest;
	var newPosition;
	var startPosition;
	var piecemoved;

	var htmlmoves = HtmlDecode(document.getElementById(Mvs).value);
	var Notation = document.getElementById(GameNotation).value;

	var arrMoveNotation = Notation.split(" ");
	if (newply == 999) newply = arrMoveNotation.length - 1;
	if ((newply < 0) || (newply > arrMoveNotation.length)) return;

	startPosition = document.getElementById(startPos).value;
	newPosition = startPosition;

	var promotedpieces = 0;
	var loop = 0;

	while (loop < newply) {
		source = htmlmoves.charCodeAt(loop * 2 + promotedpieces) - 6;
		dest = htmlmoves.charCodeAt(loop * 2 + 1 + promotedpieces) - 6;
		piecemoved = newPosition.charAt(source);

		//Check for en passant and pawn promotion
		if ((piecemoved == "f") || (piecemoved == "l")) {
			//check for enpassant
			if ((dest - source) % 12 != 0) {
				//The pawn has captured...check if destination was empty
				if (newPosition.charAt(dest) == "`") {
					if (loop % 2 == 0) {
						//White move
						newPosition = setCharAt(newPosition, dest - 12, "`");
					}
					else {
						//Black move
						newPosition = setCharAt(newPosition, dest + 12, "`");
					}
				}
			}
			//Check for pawn promotion
			if ((dest >= 110) && (loop % 2 == 0)) {
				promotedpieces++;
				piecemoved = htmlmoves.charAt(loop * 2 + 1 + promotedpieces);
			}
			else if ((dest <= 33) && (loop % 2 == 1)) {
				promotedpieces++;
				piecemoved = htmlmoves.charAt(loop * 2 + 1 + promotedpieces);
			}
		}
		else if ((piecemoved == "e") || (piecemoved == "k")) {
			if ((source == 30) && (dest == 32) && (piecemoved == "e")) {
				//White king side castling occured
				newPosition = setCharAt(newPosition, 33, "`");
				newPosition = setCharAt(newPosition, 31, "a");
			}
			else if ((source == 30) && (dest == 28) && (piecemoved == "e")) {
				//White queen side castling occured
				newPosition = setCharAt(newPosition, 26, "`");
				newPosition = setCharAt(newPosition, 29, "a");
			}
			else if ((source == 114) && (dest == 116) && (piecemoved == "k")) {
				//Black king side castling occured
				newPosition = setCharAt(newPosition, 117, "`");
				newPosition = setCharAt(newPosition, 115, "g");
			}
			else if ((source == 114) && (dest == 112) && (piecemoved == "k")) {
				//Black queen side castling occured
				newPosition = setCharAt(newPosition, 110, "`");
				newPosition = setCharAt(newPosition, 113, "g");
			}
		}
		newPosition = setCharAt(newPosition, dest, piecemoved);
		newPosition = setCharAt(newPosition, source, "`");

		loop++;
	}
	DisplayPositionOverview(boardNumber, newPosition, startPosition);

	var moveNumber = "";

	if (newply % 2 == 0) {
		moveNumber = String(Math.floor(newply / 2)) + "...";
	}
	else {
		moveNumber = String(Math.floor(newply / 2) + 1) + ".";
	}

	switch (boardNumber) {
		case 1:
			{
				document.getElementById(lblNotation1).innerText = moveNumber + arrMoveNotation[newply - 1];
				break;
			}
		case 2:
			{
				document.getElementById(lblNotation2).innerText = moveNumber + arrMoveNotation[newply - 1];
				break;
			}
		case 3:
			{
				document.getElementById(lblNotation3).innerText = moveNumber + arrMoveNotation[newply - 1];
				break;
			}
		case 4:
			{
				document.getElementById(lblNotation4).innerText = moveNumber + arrMoveNotation[newply - 1];
				break;
			}
		case 5:
			{
				document.getElementById(lblNotation5).innerText = moveNumber + arrMoveNotation[newply - 1];
				break;
			}
		case 6:
			{
				document.getElementById(lblNotation6).innerText = moveNumber + arrMoveNotation[newply - 1];
				break;
			}
		default:
			{
				break;
			}
	}
}

function DisplayPositionOverview(boardNumber, newPosition, oldPosition) {
	var row;
	var col;
	var imageName;

	var boardidentifier = String.fromCharCode(boardNumber + 64) //Convert the board number to A,B,C,D,E,F,G or H to identify the piece name

	for (var i = 0; i <= 143; i++) {
		if (newPosition.charAt(i) != oldPosition.charAt(i)) {
			row = Math.floor(i / 12) + 1;
			col = i % 12 + 1;
			imageName = CheckImageName(newPosition.charAt(i), row, col);

			var pieceNumber;
			if (i >= 110) { pieceNumber = i - 109 }
			else if (i >= 98) { pieceNumber = i - 89 }
			else if (i >= 86) { pieceNumber = i - 69 }
			else if (i >= 74) { pieceNumber = i - 49 }
			else if (i >= 62) { pieceNumber = i - 29 }
			else if (i >= 50) { pieceNumber = i - 9 }
			else if (i >= 38) { pieceNumber = i + 11 }
			else if (i >= 26) { pieceNumber = i + 31 }

			document.images["p" + boardidentifier + String(pieceNumber)].src = "images/small/" + imageName;
		}
	}
}

function ActOnKey(key) {
	if (key == 39 || key == 102) {
		var linknum = parseInt(document.getElementById(currentPly).value) + 1
		gp(linknum);
	}
	if (key == 37 || key == 100) {
		var linknum = parseInt(document.getElementById(currentPly).value) - 1
		gp(linknum);
	}
}

function CheckImageName(piece, row, col) {
	var imageName = "";
	switch (piece) {
		case "a":
			imageName = "wr";
			break;
		case "b":
			imageName = "wn";
			break;
		case "c":
			imageName = "wb";
			break;
		case "d":
			imageName = "wq";
			break;
		case "e":
			imageName = "wk";
			break;
		case "f":
			imageName = "wp";
			break;
		case "g":
			imageName = "br";
			break;
		case "h":
			imageName = "bn";
			break;
		case "i":
			imageName = "bb";
			break;
		case "j":
			imageName = "bq";
			break;
		case "k":
			imageName = "bk";
			break;
		case "l":
			imageName = "bp";
			break;
		case "`":
			imageName = "es";
			break;
	}
	if ((row + col) % 2 != 0) imageName += "w.gif"; else imageName += "b.gif";

	return imageName;
}

function DisplayPosition(newPosition, oldPosition, className) {
	var row;
	var col;
	var imageName;

	for (var i = 0; i <= 143; i++) {
		if (newPosition.charAt(i) != oldPosition.charAt(i)) {
			row = Math.floor(i / 12) + 1;
			col = i % 12 + 1;
			imageName = CheckImageName(newPosition.charAt(i), row, col);

			var pieceNumber;
			if (i >= 110) { pieceNumber = i - 109 }
			else if (i >= 98) { pieceNumber = i - 89 }
			else if (i >= 86) { pieceNumber = i - 69 }
			else if (i >= 74) { pieceNumber = i - 49 }
			else if (i >= 62) { pieceNumber = i - 29 }
			else if (i >= 50) { pieceNumber = i - 9 }
			else if (i >= 38) { pieceNumber = i + 11 }
			else if (i >= 26) { pieceNumber = i + 31 }

			if (className == "BoardTable") {
				document.images["p" + String(pieceNumber)].src = "images/" + imageName;
			}
			else if (className == "PositionExplorerTable") {
				document.images["p" + String(pieceNumber)].src = "images/big/" + imageName;
			}
		}
	}
}

function FlipBoard(className) {
	var row;
	var col;
	var imageName;

	var strHTML;
	strHTML = "<table class='" + className + "'>";

	var flipped = parseInt(document.getElementById(FlippedBoard).value);
	document.getElementById(FlippedBoard).value = 1 - flipped;

	if (flipped == 0) {
		for (row = 0; row <= 7; row += 1) {
			strHTML += "<tr>";
			for (col = 7; col >= 0; col -= 1) {
				var square;
				square = row * 12 + 24 + col + 2;
				imageName = CheckImageName(document.getElementById(posID).value.charAt(square), row, col);
				strHTML += "<td>";
				strHTML += "<img name='p" + String(square - 109 + (20 * (7 - row))) + "' src='images/" + (className == "PositionExplorerTable" ? "big/" : "") + imageName + "' />";
				strHTML += "</td>";
			}
			strHTML += "</tr>";
		}
	}
	else {
		for (row = 7; row >= 0; row -= 1) {
			strHTML += "<tr>";
			for (col = 0; col <= 7; col += 1) {
				var square;
				square = row * 12 + 24 + col + 2;
				imageName = CheckImageName(document.getElementById(posID).value.charAt(square), row, col);
				strHTML += "<td>";
				strHTML += "<img name='p" + String(square - 109 + (20 * (7 - row))) + "' src='images/" + (className == "PositionExplorerTable" ? "big/" : "") + imageName + "' />";
				strHTML += "</td>";
			}
			strHTML += "</tr>";
		}
	}
	strHTML += "</table>";
	document.getElementById(chPosition).innerHTML = strHTML;
}

function setCharAt(str, index, ichar) {
	if (index > str.length - 1) return str;
	return str.substr(0, index) + ichar + str.substr(index + 1);
}

function gpEx(newply, Notation, Moves, InitialPositionForPositionExplorer, strInitialWhiteKingPosition, strInitialBlackKingPosition) {
	var source;
	var dest;
	var newPosition;
	var startPosition;
	var boardPosition;
	var piecemoved;

	var htmlmoves = DecodeHexMoves(Moves);

	var arrMoveNotation = Notation.split(" ");
	if ((newply < 0) || (newply > arrMoveNotation.length)) return;

	startPosition = InitialPositionForPositionExplorer;
	boardPosition = document.getElementById(posID).value;
	newPosition = startPosition;

	var promotedpieces = 0;
	var loop = 0;

	document.getElementById(WK).value = strInitialWhiteKingPosition;
	document.getElementById(BK).value = strInitialBlackKingPosition;
	
	while (loop < newply) {
		source = htmlmoves.charCodeAt(loop * 2 + promotedpieces) - 6;
		dest = htmlmoves.charCodeAt(loop * 2 + 1 + promotedpieces) - 6;
		piecemoved = newPosition.charAt(source);

		//Check for en passant and pawn promotion
		if ((piecemoved == "f") || (piecemoved == "l")) {
			//check for enpassant
			if ((dest - source) % 12 != 0) {
				//The pawn has captured...check if destination was empty
				if (newPosition.charAt(dest) == "`") {
					if (piecemoved == "f") {
						//White move
						newPosition = setCharAt(newPosition, dest - 12, "`");
					}
					else {
						//Black move
						newPosition = setCharAt(newPosition, dest + 12, "`");
					}
				}
			}
			//Check for pawn promotion
			if ((dest >= 110) && (piecemoved == "f")) {
				promotedpieces++;
				piecemoved = htmlmoves.charAt(loop * 2 + 1 + promotedpieces);
			}
			else if ((dest <= 33) && (piecemoved=="l")) {
				promotedpieces++;
				piecemoved = htmlmoves.charAt(loop * 2 + 1 + promotedpieces);
			}
		}
		else if ((piecemoved == "e") || (piecemoved == "k")) {
			if ((source == 30) && (dest == 32) && (piecemoved == "e")) {
				//White king side castling occured
				newPosition = setCharAt(newPosition, 33, "`");
				newPosition = setCharAt(newPosition, 31, "a");
			}
			else if ((source == 30) && (dest == 28) && (piecemoved == "e")) {
				//White queen side castling occured
				newPosition = setCharAt(newPosition, 26, "`");
				newPosition = setCharAt(newPosition, 29, "a");
			}
			else if ((source == 114) && (dest == 116) && (piecemoved == "k")) {
				//Black king side castling occured
				newPosition = setCharAt(newPosition, 117, "`");
				newPosition = setCharAt(newPosition, 115, "g");
			}
			else if ((source == 114) && (dest == 112) && (piecemoved == "k")) {
				//Black queen side castling occured
				newPosition = setCharAt(newPosition, 110, "`");
				newPosition = setCharAt(newPosition, 113, "g");
			}
		}
		newPosition = setCharAt(newPosition, dest, piecemoved);
		newPosition = setCharAt(newPosition, source, "`");

		if (piecemoved == "e") {
			document.getElementById(WK).value = String(dest);
		}
		else if (piecemoved == "k") {
			document.getElementById(BK).value = String(dest);
		}

		loop++;
	}

	DisplayPosition(newPosition, boardPosition, "PositionExplorerTable");

	document.getElementById(posID).setAttribute("value", newPosition);
	var oldply = document.getElementById(currentPly).value;
	document.getElementById(currentPly).value = newply.toString();
}

function ConvertToDec(hexNumber) {
	return parseInt(hexNumber, 16);
}

function DecodeHexMoves(hexMoves) {
	var strDec = "";
	
	if (hexMoves != "") {
		for (var i = 0; i < hexMoves.length - 1; i += 2) {
			strDec += String.fromCharCode(ConvertToDec(hexMoves.substring(i,i + 2)));
		}
	}
	return strDec;
}
