/* 
	Javascript File for SMFChess
*/

var chessTimeout = 0;
var chessChatTimeout = 0;

var clearTimer = "";
var clearTimerChat = "";
var chesschat_total = -1;

window.onload = function(){
	if(canChat){
		new Autocompleter.Local('SMFChessChatText', 'chatcommand_list', ['/me ', '/french ', '/italian ', '/portuguese '], {});	
	}
}

function my_DropFunc(){
	setInnerHTML(document.getElementById("controlMsg"), '');
	
	if(document.data.check.value != ""){
		var prev = document.data.check.value;
		if(prev != dd.obj.name)
			dd.elements[prev].moveTo(dd.elements[prev].defx,dd.elements[prev].defy);
	}
	
	var dropTarget = dd.obj.getEltBelow();
	if(dropTarget != null){
	document.data.check.value = dd.obj.name;
	document.data.Move.value = dd.obj.name +"-" + dropTarget.name;
	dd.obj.moveTo(dropTarget.defx,dropTarget.defy);
	}
	else {dd.obj.moveTo(dd.obj.defx, dd.obj.defy);
	document.data.check.value = "";
	document.data.Move.value = "";
	}
	
	if(quickplay){modify_chess();}
	
}

function checkUpdate(){
	if (!window.XMLHttpRequest)
		return;
	if (typeof(window.opera) != "undefined")
	{
		var test = new XMLHttpRequest();
		if (typeof(test.setRequestHeader) != "function")
			return;
	}
	getXMLDocument(smf_scripturl + '?action=chessXml;sa=update;sesc=' + cur_session_id + ';id=' + boardId + ';timestamp=' + timestampOld + ';xml', onDocReceived_updateBoard);
	
	if(chessTimeout < chessTimeoutLimit)
	{
		clearTimer = setTimeout("checkUpdate()", updateInterval );
	}
	else
	{
		setInnerHTML(document.getElementById("controlMsg"), chessTimeoutText);
	}
}

function modify_chess(){
	clearTimeout(clearTimer);
	setInnerHTML(document.getElementById("controlMsg"), '');
	if (!window.XMLHttpRequest)
		return;
	if (typeof(window.opera) != "undefined")
	{
		var test = new XMLHttpRequest();
		if (typeof(test.setRequestHeader) != "function")
			return;
	}

setInnerHTML(document.getElementById("controlMsg"), 'Sending...');
	
	var move = document.forms.data['Move'].value;
	if(document.data.check.value == "")
		prev = "";
	else
		prev = dd.elements[document.data.check.value].src;
	
	if(prev.match(/pawn/i)){
		if((move.match(/2/)&&move.match(/1/))||(move.match(/7/)&&move.match(/8/))){
			if(move.length < 6){
				if(move.match(/2/)&&move.match(/1/)){var playerIs =	'white';}else{var playerIs = 'black';}
				setInnerHTML(document.getElementById("controlMsg"), ' <a href="javascript:void(0)" onclick="document.data.Move.value = document.data.Move.value + \'Q\';modify_chess();"><img src="' + pieceLoc + playerIs + '_queen' + pieceFileType + '" alt="Q"/></a> <a href="javascript:void(0)" onclick="document.data.Move.value = document.data.Move.value + \'R\';modify_chess();"><img src="' + pieceLoc + playerIs + '_rook' + pieceFileType + '" alt="R"/></a> <a href="javascript:void(0)" onclick="document.data.Move.value = document.data.Move.value + \'B\';modify_chess();"><img src="' + pieceLoc + playerIs + '_bishop' + pieceFileType + '" alt="B"/></a> <a href="javascript:void(0)" onclick="document.data.Move.value = document.data.Move.value + \'N\';modify_chess();"><img src="' + pieceLoc + playerIs + '_knight' + pieceFileType + '" alt="N"/></a><br/>' + txtpawnPromotion);
				return false;
			}
		}
	}
	
	if(prev.match(/king/i)){
		if(move.length < 6){
			if((move.match(/c8/i)||move.match(/g8/i))&&prev.match(/black/i)){
				if((document.getElementById("blackQCastleDiv").style.display != 'none')&&move.match(/c8/i)){
					setInnerHTML(document.getElementById("controlMsg"), txtwouldcastle + ' <a href="javascript:void(0)" onclick="document.data.Move.value = \'O-O-O\';modify_chess();">' + txtyes + '</a> ' + txtor + ' <a href="javascript:void(0)" onclick="document.data.Move.value = document.data.Move.value + \'M\';modify_chess();">' + txtno + '</a>');
					return false;
				}
				else if((document.getElementById("blackKCastleDiv").style.display != 'none')&&move.match(/g8/i)){
					setInnerHTML(document.getElementById("controlMsg"), txtwouldcastle + ' <a href="javascript:void(0)" onclick="document.data.Move.value = \'O-O\';modify_chess();">' + txtyes + '</a> ' + txtor + ' <a href="javascript:void(0)" onclick="document.data.Move.value = document.data.Move.value + \'M\';modify_chess();">' + txtno + '</a>');
					return false;
				}
			}
			else if((move.match(/g1/i)||move.match(/c1/i))&&prev.match(/white/i)){
				if((document.getElementById("whiteQCastleDiv").style.display != 'none')&&move.match(/c1/i)){
					setInnerHTML(document.getElementById("controlMsg"), txtwouldcastle + ' <a href="javascript:void(0)" onclick="document.data.Move.value = \'O-O-O\';modify_chess();">' + txtyes + '</a> ' + txtor + ' <a href="javascript:void(0)" onclick="document.data.Move.value = document.data.Move.value + \'M\';modify_chess();">' + txtno + '</a>');
					return false;
				}
				else if((document.getElementById("whiteKCastleDiv").style.display != 'none')&&move.match(/g1/i)){
					setInnerHTML(document.getElementById("controlMsg"), txtwouldcastle + ' <a href="javascript:void(0)" onclick="document.data.Move.value = \'O-O\';modify_chess();">' + txtyes + '</a> ' + txtor + ' <a href="javascript:void(0)" onclick="document.data.Move.value = document.data.Move.value + \'M\';modify_chess();">' + txtno + '</a>');
					return false;
				}
			}
		}
	}
	
	var modifyMove = "addMove=" + move + "";
	sendXMLDocument(smf_scripturl + '?action=chessXml;sa=save;sesc=' + cur_session_id + ';id=' + boardId + ';xml', modifyMove, on_modify);
	return false;
}

function on_modify(XMLDoc)
{
	if (XMLDoc)
	{
		var cur_control = XMLDoc.getElementsByTagName("control")[0].childNodes[0].nodeValue;
		setInnerHTML(document.getElementById("controlMsg"), cur_control);
	}
	
	//Empty Move box	
	if((mySide == "w")||(mySide == "b")){
		document.forms.data['Move'].value = "";
		if(document.forms.data['check'].value != ""){
			var prev = document.forms.data['check'].value;
			dd.elements[prev].moveTo(dd.elements[prev].defx,dd.elements[prev].defy);
		}
	}
	
	checkUpdate()
}

function onDocReceived_updateBoard(XMLDoc)
{
	if (!XMLDoc){return;}

	var cur_timestamp = XMLDoc.getElementsByTagName("timestamp")[0].childNodes[0].nodeValue;
	var cur_moveTimeleft = XMLDoc.getElementsByTagName("moveTimeleft")[0].childNodes[0].nodeValue;
	setInnerHTML(document.getElementById("moveClock"), cur_moveTimeleft);
	
	if(timestampOld < cur_timestamp){
		chessTimeout = 0;
		timestampOld = cur_timestamp;
		var cur_boarddata = XMLDoc.getElementsByTagName("boarddata")[0].childNodes[0].nodeValue;
		var cur_control = XMLDoc.getElementsByTagName("control")[0].childNodes[0].nodeValue;
		var cur_turnname = XMLDoc.getElementsByTagName("turnname")[0].childNodes[0].nodeValue;
		var cur_turnheader = XMLDoc.getElementsByTagName("turnheader")[0].childNodes[0].nodeValue;
		var cur_status = XMLDoc.getElementsByTagName("status")[0].childNodes[0].nodeValue;
		var cur_updated = XMLDoc.getElementsByTagName("updated")[0].childNodes[0].nodeValue;
		var cur_history = XMLDoc.getElementsByTagName("history")[0].childNodes[0].nodeValue;
		var cur_capturedW = XMLDoc.getElementsByTagName("capturedw")[0].childNodes[0].nodeValue;
		var cur_capturedB = XMLDoc.getElementsByTagName("capturedb")[0].childNodes[0].nodeValue;
		
		alterBoard(cur_boarddata, true);
		setInnerHTML(document.getElementById("controlMsg"), cur_control);
		setInnerHTML(document.getElementById("turnnameDiv"), cur_turnname);
		setInnerHTML(document.getElementById("turnheaderDiv"), cur_turnheader);
		setInnerHTML(document.getElementById("statusDiv"), cur_status);
		setInnerHTML(document.getElementById("updatedDiv"), cur_updated);
		setInnerHTML(document.getElementById("historyDiv"), cur_history);
		setInnerHTML(document.getElementById("capturedPiecesW"), cur_capturedW);
		setInnerHTML(document.getElementById("capturedPiecesB"), cur_capturedB);	
	}else{
		var cur_control = XMLDoc.getElementsByTagName("control")[0].childNodes[0].nodeValue;
		if(getInnerHTML(document.getElementById("controlMsg")) == '-'){
			setInnerHTML(document.getElementById("controlMsg"), cur_control);
		}
		chessTimeout++;
	}
}


function alterBoard(fenString, dragOn){
	var items = fenString.split(/\s/g);
	var pieces = items[0];
	var whosTurn = items[1];
	
	var currentCol = 8;
	var templetter = 9;
	var newImage = "";
	var pieceName = "";
	var oldImage = "";
	for(var no=0;no<pieces.length;no++){
		var character = pieces.substr(no,1);

		if(character.match(/[A-Z]/i)){		
			templetter++;
			newImage = templetter.toString(18) + currentCol;
			oldImage = dd.elements[newImage].src;
			
			if(character.match(/[P]/i))
				pieceName = "pawn";
			if(character.match(/[R]/i))
				pieceName = "rook";
			if(character.match(/[B]/i))
				pieceName = "bishop";
			if(character.match(/[N]/i))
				pieceName = "knight";
			if(character.match(/[Q]/i))
				pieceName = "queen";
			if(character.match(/[K]/i))
				pieceName = "king";
			
			if(character.match(/[A-Z]/)){
				dd.elements[newImage].swapImage(pieceLoc + "white_" + pieceName + pieceFileType);
				if((mySide == "w")&&(mySide == whosTurn)&&(dragOn)){
					dd.elements[newImage].setDraggable(true);
				}else{
					dd.elements[newImage].setDraggable(false);
				}
				
				if(pieceLoc + "white_" + pieceName + pieceFileType !=  oldImage){
					dd.elements[newImage].shakeThis();
				}
			}
			if(character.match(/[a-z]/)){
				dd.elements[newImage].swapImage(pieceLoc + "black_" + pieceName + pieceFileType);
				if((mySide == "b")&&(mySide == whosTurn)&&(dragOn)){
					dd.elements[newImage].setDraggable(true);
				}else{
					dd.elements[newImage].setDraggable(false);
				}
				
				if(pieceLoc + "black_" + pieceName + pieceFileType !=  oldImage){
					dd.elements[newImage].shakeThis();
				}
			}
		}
		else if(character.match(/[0-8]/)){
			for(var blank=0;blank < character;blank++){
				templetter++;
				newImage = templetter.toString(18) + currentCol;
				dd.elements[newImage].swapImage(blankLoc);
				dd.elements[newImage].setDraggable(false);
			}
		}else if(character == '/'){
			templetter = 9;
			currentCol = currentCol - 1;
		}
	}
	
	var canCastle = items[2];
	if(!canCastle.match(/[K]/)){document.getElementById("whiteKCastleDiv").style.display = "none";}
	else{document.getElementById("whiteKCastleDiv").style.display = "";}
	if(!canCastle.match(/[Q]/)){document.getElementById("whiteQCastleDiv").style.display = "none";}
	else{document.getElementById("whiteQCastleDiv").style.display = "";}
	if(canCastle.match(/[k-q]/)){
		if(!canCastle.match(/[k]/)){document.getElementById("blackKCastleDiv").style.display = "none";}
		else{document.getElementById("blackKCastleDiv").style.display = "";}
		if(!canCastle.match(/[q]/)){document.getElementById("blackQCastleDiv").style.display = "none";}
		else{document.getElementById("blackQCastleDiv").style.display = "";}
	}
	else{
		canCastle = items[3];
		if(!canCastle.match(/[k]/)){document.getElementById("blackKCastleDiv").style.display = "none";}
		else{document.getElementById("blackKCastleDiv").style.display = "";}
		if(!canCastle.match(/[q]/)){document.getElementById("blackQCastleDiv").style.display = "none";}
		else{document.getElementById("blackQCastleDiv").style.display = "";}
	}
}

function send_SMFChessChat($delId){
	
	clearTimeout(clearTimerChat);
	
	if (!window.XMLHttpRequest)
		return;
	if (typeof(window.opera) != "undefined")
	{
		var test = new XMLHttpRequest();
		if (typeof(test.setRequestHeader) != "function")
			return;
	}
	
	if($delId > 0){
		var modifyChat = "deleteMsg=" + $delId;
	}else{
	var modifyChat =  "message=" + escape(textToEntities(document.forms.SMFChessChatForm['SMFChessChatText'].value.replace(/&#/g, "&#38;#"))).replace(/\+/g, "%2B");
	}
	
	document.forms.SMFChessChatForm['SMFChessChatButton'].disabled = true;
	document.forms.SMFChessChatForm['SMFChessChatButton'].value = chessChatButSend;
	
	document.forms.SMFChessChatForm['SMFChessChatText'].value = '';
	sendXMLDocument(smf_scripturl + '?action=chessChat;sa=save;sesc=' + cur_session_id + ';id=' + boardId + ';xml', modifyChat, on_send_SMFChessChat);
	
	return false;
}

function on_send_SMFChessChat(XMLDoc){
	document.forms.SMFChessChatForm['SMFChessChatButton'].value = chessChatButChat;
	checkUpdateChat();
}

function checkUpdateChat(){
	if (!window.XMLHttpRequest)
		return;
	if (typeof(window.opera) != "undefined")
	{
		var test = new XMLHttpRequest();
		if (typeof(test.setRequestHeader) != "function")
			return;
	}
	getXMLDocument(smf_scripturl + '?action=chessChat;sa=refresh;chatTotal=' + chesschat_total + ';sesc=' + cur_session_id + ';id=' + boardId + ';xml', onDocReceived_updateChat);
	
	if(chessChatTimeout < chessChatTimeoutLimit){
		clearTimerChat = setTimeout("checkUpdateChat()", updateIntervalChat );
	}else{
		if(canChat){
			document.getElementById("SMFChessChatTextSpan").style.display = "none";
		}
		setInnerHTML(document.getElementById("SMFChessChatBody"), chessChatTimeoutText);
	}
}

function onDocReceived_updateChat(XMLDoc){
	if (!XMLDoc){return;}

	var cur_whoswatching = XMLDoc.getElementsByTagName("whoswatching")[0].childNodes[0].nodeValue;
	var cur_whoswatching_div =  document.getElementById('whoswatchingDiv');
	if(getInnerHTML(cur_whoswatching_div) != cur_whoswatching){
		setInnerHTML(document.getElementById("whoswatchingDiv"), cur_whoswatching);
	}
	
	chesschat_total = XMLDoc.getElementsByTagName("newchattotal")[0].childNodes[0].nodeValue;
	cur_text = XMLDoc.getElementsByTagName("text")[0].childNodes[0].nodeValue;

	if(cur_text != ''){
		if(canChat)	{
			var cur_disabled = XMLDoc.getElementsByTagName("disabled")[0].childNodes[0].nodeValue;
			if(cur_disabled == 2){
				document.getElementById("SMFChessChatTextSpan").style.display = "";
			}
		}
		chessChatTimeout = "0";
		setInnerHTML(document.getElementById("SMFChessChatBody"), cur_text);
	}else{
		chessChatTimeout++;
	}
}

function chessCommand($command){
	
	clearTimeout(clearTimer);
	
	if (!window.XMLHttpRequest)
		return;
	if (typeof(window.opera) != "undefined")
	{
		var test = new XMLHttpRequest();
		if (typeof(test.setRequestHeader) != "function")
			return;
	}
	
	var chessCommandVar = "command=" + $command + "";
	var matchPos = $command.search(/admin/);
	if(matchPos != -1){
		if($command == "admin_addmove")
		{
			var adminAddMove = prompt(txtaddmove, "");
			chessCommandVar = chessCommandVar + "&addMove=" + adminAddMove
		}
			sendXMLDocument(smf_scripturl + '?action=chessXml;sa=control;sesc=' + cur_session_id + ';id=' + boardId + ';xml', chessCommandVar, on_chessCommand);
	}else{
			sendXMLDocument(smf_scripturl + '?action=chessXml;sa=control;sesc=' + cur_session_id + ';id=' + boardId + ';xml', chessCommandVar, on_chessCommand);
	}
	return false;
}

function on_chessCommand(XMLDoc){
	if (XMLDoc){
		var cur_control = XMLDoc.getElementsByTagName("control")[0].childNodes[0].nodeValue;
		var matchPos = cur_control.search(/clearchat/);
		if(matchPos = -1){
			setInnerHTML(document.getElementById("controlMsg"), cur_control);
		}
	}
	checkUpdate();
}

function historyViewer($id){
	if (!window.XMLHttpRequest)
		return;
	if (typeof(window.opera) != "undefined")
	{
		var test = new XMLHttpRequest();
		if (typeof(test.setRequestHeader) != "function")
			return;
	}
	getXMLDocument(smf_scripturl + '?action=chessXml;sa=historyViewer;sesc=' + cur_session_id + ';id=' + $id + ';xml', onDocReceived_historyViewer);
	if(is_disabled)
		is_disabled = false;
}

function onDocReceived_historyViewer(XMLDoc){
	if (!XMLDoc){return;}
	
	if(historyType){
		clearTimeout(clearTimer);
		timestampOld = 0;
	}
	
	var cur_boarddata = XMLDoc.getElementsByTagName("boarddata")[0].childNodes[0].nodeValue;
	var cur_turnname = XMLDoc.getElementsByTagName("turnname")[0].childNodes[0].nodeValue;
	var cur_turnheader = XMLDoc.getElementsByTagName("turnheader")[0].childNodes[0].nodeValue;
	var cur_status = XMLDoc.getElementsByTagName("status")[0].childNodes[0].nodeValue;
	var cur_capturedW = XMLDoc.getElementsByTagName("capturedw")[0].childNodes[0].nodeValue;
	var cur_capturedB = XMLDoc.getElementsByTagName("capturedb")[0].childNodes[0].nodeValue;
	alterBoard(cur_boarddata, false);
	setInnerHTML(document.getElementById("turnheaderDiv"), cur_turnheader);
	setInnerHTML(document.getElementById("turnnameDiv"), cur_turnname);
	setInnerHTML(document.getElementById("statusDiv"), cur_status);
	setInnerHTML(document.getElementById("capturedPiecesW"), cur_capturedW);
	setInnerHTML(document.getElementById("capturedPiecesB"), cur_capturedB);	
}

function showChat(type){
	if (!window.XMLHttpRequest)
		return;
	if (typeof(window.opera) != "undefined"){
		var test = new XMLHttpRequest();
		if (typeof(test.setRequestHeader) != "function")
			return;
	}
	
	clearTimeout(clearTimerChat);
	
	getXMLDocument(smf_scripturl + '?action=chessChat;sa=refresh;showChat=' + type + ';sesc=' + cur_session_id + ';id=' + boardId + ';xml', onDocReceived_showChat);
}

function onDocReceived_showChat(XMLDoc){
	if (!XMLDoc){return;}

	var cur_whoswatching = XMLDoc.getElementsByTagName("whoswatching")[0].childNodes[0].nodeValue;
	var cur_whoswatching_div =  document.getElementById('whoswatchingDiv');
	if(getInnerHTML(cur_whoswatching_div) != cur_whoswatching){
		setInnerHTML(document.getElementById("whoswatchingDiv"), cur_whoswatching);
	}
	var cur_disabled = XMLDoc.getElementsByTagName("disabled")[0].childNodes[0].nodeValue;
	if(canChat){
		if(cur_disabled == 2){
			document.getElementById("SMFChessChatTextSpan").style.display = "";
		}else{
				document.getElementById("SMFChessChatTextSpan").style.display = "none";
		}
		if(cur_disabled > 0){
			clearTimerChat = setTimeout("checkUpdateChat()", updateIntervalChat );
			chessChatTimeout = "0";
		}	
	}
	chesschat_total = XMLDoc.getElementsByTagName("newchattotal")[0].childNodes[0].nodeValue;
	cur_text = XMLDoc.getElementsByTagName("text")[0].childNodes[0].nodeValue;
	setInnerHTML(document.getElementById("SMFChessChatBody"), cur_text);
}

function send_SMFChessNotepad(){
	if (!window.XMLHttpRequest)
		return;
	if (typeof(window.opera) != "undefined"){
		var test = new XMLHttpRequest();
		if (typeof(test.setRequestHeader) != "function")
			return;
	}
	var modifyNotepad =  "message=" + escape(textToEntities(document.forms.SMFChessNotepadForm['SMFChessNotepadArea'].value.replace(/&#/g, "&#38;#"))).replace(/\+/g, "%2B");
	document.forms.SMFChessNotepadForm['SMFChessNotepadButton'].disabled = true;
	sendXMLDocument(smf_scripturl + '?action=chessXml;sa=saveNotepad;sesc=' + cur_session_id + ';id=' + boardId + ';xml', modifyNotepad, on_send_SMFChessNotepad);
	return false;
}

function on_send_SMFChessNotepad(XMLDoc){
	document.forms.SMFChessNotepadForm['SMFChessNotepadButton'].disabled = false;
}
