	/* Cookie API from http://www.actulab.com */
		function getCookieVal(offset) {
		var endstr=document.cookie.indexOf (";", offset);
		if (endstr==-1) endstr=document.cookie.length;
		return unescape(document.cookie.substring(offset, endstr));
		}
		function LireCookie(nom) {
		var arg=nom+"=";
		var alen=arg.length;
		var clen=document.cookie.length;
		var i=0;
		while (i<clen) {
		var j=i+alen;
		if (document.cookie.substring(i, j)==arg) return getCookieVal(j);
		i=document.cookie.indexOf(" ",i)+1;
		if (i==0) break;
		}
		return null;
		}
		
		function EcrireCookie(nom, valeur) {
		var argv=EcrireCookie.arguments;
		var argc=EcrireCookie.arguments.length;
		var expires=(argc > 2) ? argv[2] : null;
		var path=(argc > 3) ? argv[3] : null;
		var domain=(argc > 4) ? argv[4] : null;
		var secure=(argc > 5) ? argv[5] : false;
		document.cookie=nom+"="+escape(valeur)+
		((expires==null) ? "" : ("; expires="+expires.toGMTString()))+
		((path==null) ? "" : ("; path="+path))+
		((domain==null) ? "" : ("; domain="+domain))+
		((secure==true) ? "; secure" : "");
		}
		
		function EffaceCookie(nom) {
		date=new Date;
		date.setFullYear(date.getFullYear()-1);
		EcrireCookie(nom,null,date);
		}
		
		/* End of Cookie API */
		
		/* Multibrowser XMLHTTPREQUEST function from wikipedia */
		function createXhr()	{
		
		if (window.XMLHttpRequest)
			return new XMLHttpRequest();
	
		if (window.ActiveXObject)
		{
			var names = [
				"Msxml2.XMLHTTP.6.0",
				"Msxml2.XMLHTTP.3.0",
				"Msxml2.XMLHTTP",
				"Microsoft.XMLHTTP"
				];
        for(var i in names)
        {
            try{ return new ActiveXObject(names[i]); }
            catch(e){}
        }
		}
		return null; // non supporté
	}
	
	function Asc(String)	{
	return String.charCodeAt(0);
	}

	function Chr(AsciiNum)	{
	return String.fromCharCode(AsciiNum);
	}

function isdefined(variable) { 
	if(typeof(variable) !="undefined") { 
		return true; 
	} else {
		return false;
	};
 } 
	
		function elf(ident) {
			return document.getElementById(ident);
		}
		
		function removesound() {
			elf("soundsystem").innerHTML = "";
		}
		
		function onerror() {
		elf("waiting").style.display = "none";
		elf("playground").style.display = "none";
		elf("movelog").style.display = "none";
		elf("errortag").style.display = "block";
		elf("chatbox").style.display = "none";
		}
		
		function regcookie(value) {
		var date=new Date;
		date.setDate(date.getDate()+1);		
		EcrireCookie("CurrentGame",value,date);
		}
		
		function restoregame() {
		elf("waiting").innerHTML = "<p>Processing</p>";
		var infos = LireCookie("CurrentGame");		
		color = infos.substr(0,1);
		GameID = infos.substr(1,10);
		PlayerID = infos.substr(11,2);
		onHold();
		};
		
		function startgame() {
		var infos = LireCookie("CurrentGame");
		var gid = "";		
		if (infos != null) { 
			var gid = infos.substr(1,10);
		};
		elf("waiting").innerHTML = "<p>Requesting</p>";
		try {		
		requester.open("GET","./game.php?action=requestanotherplayer",false);
		requester.send(null);
		} catch(e) {
alert("request for another player failed");
		onerror();
		};
		if (requester.responseText != "" && requester.status == "200" && requester.responseText.length == 13) {
		color = requester.responseText.substr(0,1);
		GameID = requester.responseText.substr(1,10);
		PlayerID = requester.responseText.substr(11,2);
		if (gid == GameID) {
		//	restoregame(); //Impossible de jouer contre soi
			alert("Believing your GID cookie, you'll play against yourself.\n This will be avoided in final version");
		//	return;
		};
			try {		
				requester.open("GET","./game.php?action=takeit&GameID="+escape(GameID)+"&PlayerID="+escape(PlayerID)+"&color="+escape(color),false);
				requester.send(null);
			} catch(e) {
alert("request for taking game failed");			
			onerror();
			};
			if (requester.responseText != "OK" || requester.status != "200") {
alert("request for taking game failed");			
			onerror();
			};
		} else {
alert("request for another player failed");
		onerror();
		};
		if (color == 1) {
		elf("waiting").innerHTML = "<p>found an existing waiting game, you are black</p><p>Game will start in 5 seconds</p>";
		regcookie(color+GameID+PlayerID);
		setTimeout(onHold,2500);
		} else if (color == 0) {
		elf("waiting").innerHTML = "<p>waiting for another player, you'll be white</p>";
		regcookie(color+GameID+PlayerID);
		setTimeout(onHold,2500);
		};
		}
		
		function onHold() {
			try {		
				requester.open("GET","./game.php?action=verifygame&GameID="+escape(GameID),false);
				requester.send(null);
			} catch(e) {
alert("request for game verification failed");
			onerror();
			};
			if (requester.responseText != "OK" || requester.status != "200") {
				if (requester.responseText == "WT") {
					setTimeout(onHold,2500);
					return;
				};			
alert("request for game verification failed");
				onerror();
			};
			elf("waiting").innerHTML = "<p>Game Will Start</p>";
			startturns();
			elf("playground").style.display = "block";
			elf("movelog").style.display = "block";
			elf("chatbox").style.display = "block";
			ChatRequest();
		}
		
		function startturns() {
			try {		
				requester.open("GET","./game.php?action=snapshot&GameID="+escape(GameID),false);
				requester.send(null);
			} catch(e) {
alert("request for snapshot failed");
			onerror();
			};
			if (requester.responseText.length != 25 || requester.status != "200") {	
alert("request for snapshot failed");
				onerror();
			};
			
			var colorname = (color != 0) ? "black" : "white";
						
			elf("waiting").innerHTML = "<p>You are playing "+colorname+"</p><p><table><tr><td><p id='origin'></p></td><td><p> -> </p><td><p id='destination'></p></td><td><input type='button' value='valider' disabled='1' id='validate' onclick='goplay(1)'></input></tr></table></p>";

			var c = 65;
			var r = 1;
			var img = "case.png";
			snapshot = requester.responseText;
			for (var i = 0;i < 25;i++) {
				switch (snapshot.substr(i,1)) {
					case "X":
					img = "case.png";
					break;
					case "P":
					img = "Chess_tile_nl.png";
					break;
					case "D":
					img = "Chess_tile_nd.png";
					break;
					case "A":
					img = "Chess_tile_pl.png";
					break;
					case "B":
					img = "Chess_tile_pd.png";
					break;
			};
			elf(Chr(c)+r).firstChild.setAttribute("src",img);
			if ((i+1) % 5 == 0) {
				r = 1;
				c += 1;
			} else {
				r += 1;
			};			
		};
		
			try {		
				requester.open("GET","./game.php?action=currentturn&GameID="+escape(GameID),false);
				requester.send(null);
			} catch(e) {
alert("request for currentturn failed");
			onerror();
			};
			if (requester.status != "200") {	
alert("request for currentturn failed");
				onerror();
			};
			
			elf("turns").innerHTML = requester.responseText;			
			
			if (requester.responseText == 0) {
				elf("lastmove").style.visibility = "hidden";
			} else {
				elf("lastmove").style.visibility = "visible";
				try {		
					requester.open("GET","./game.php?action=lastmoves&GameID="+escape(GameID),false);
					requester.send(null);
				} catch(e) {
alert("request for lastmoves failed");
					onerror();
				};
				if (requester.status != "200") {	
alert("request for currentturn failed");
					onerror();
				};
				var resp = requester.responseText;
				var tempreg = new RegExp("/","g");
				var moves = resp.split(tempreg);
				elf("Wmove").innerHTML = "<p>"+moves[0]+"</p>";
				elf("Bmove").innerHTML = "<p>"+moves[1]+"</p>";
			};

			document.title = "T:"+elf("turns").innerHTML;
	
			if ((color == 0 && snapshot.indexOf("P") == -1) || (color == 1 && snapshot.indexOf("D") == -1)) {
				elf("playground").style.display = "none";
				elf("comment").innerHTML = "You loose";
				elf("validate").style.display = "none";
				document.title = "YOU LOOSE";
			};
			if ((color == 0 && snapshot.indexOf("D") == -1) || (color == 1 && snapshot.indexOf("P") == -1)) {
				elf("playground").style.display = "none";
				elf("comment").innerHTML = "You win";
				elf("validate").style.display = "none";
				document.title = "YOU WIN";
			};
	
			if (elf("focusing").checked) {
				alert((elf("turns").innerHTML == "0")?"New Game Begins!":"New Turn Begins!");
			};
			elf("soundsystem").innerHTML = '<bgsound src="turn.wav" loop="1"></bgsound>';
			setTimeout(removesound,5000);
	}
						
	
	
	function isvalidpion(position,depart) {
	//		alert(position);
			var xd = depart.id.substr(1,1);
			var yd = Asc(depart.id.substr(0,1));
			var xp = position.substr(1,1);
			var yp = Asc(position.substr(0,1));
			if (color == "1") {
				var mypieces = new Array("Chess_tile_nd.png","Chess_tile_pd.png");
				var hispieces = new Array("Chess_tile_nl.png","Chess_tile_pl.png");
			} else {
				var mypieces = new Array("Chess_tile_nl.png","Chess_tile_pl.png");
				var hispieces = new Array("Chess_tile_nd.png","Chess_tile_pd.png");
			};
			var mpc = mypieces.join();
			var hpc = hispieces.join();				
			if ((Math.abs(xd-xp)+Math.abs(yd-yp)) == 1 && xp >= 1 && yp >= 65 && xp <= 5 && yp <= 69)	{
				if ( elf(position).firstChild.getAttribute("src") == "case.png" ) {
					return true;
				};
			} else if ((Math.abs(xd-xp) == 1 && Math.abs(yd-yp) == 1) && xp >= 1 && xp <= 5 && yp >= 65 && yp <= 69) {	
		//	alert("xd :"+xd+" xp : "+xp+"\n yd : "+yd+" yp : "+yp+"\ndecalage :"+(Math.abs((xd-xp)+(yd-yp))));
				if ( hpc.indexOf(elf(position).firstChild.getAttribute("src"),0) != -1 ) {
					return true;
				};
			};
			return false;	
	}
	
	function isvalidchevalier(position,depart) {
			var xd = depart.id.substr(1,1);
			var yd = Asc(depart.id.substr(0,1));
			var xp = position.substr(1,1);
			var yp = Asc(position.substr(0,1));
			if (color == "1") {
				var mypieces = new Array("Chess_tile_nd.png","Chess_tile_pd.png");
				var hispieces = new Array("Chess_tile_nl.png","Chess_tile_pl.png");
			} else {
				var mypieces = new Array("Chess_tile_nl.png","Chess_tile_pl.png");
				var hispieces = new Array("Chess_tile_nd.png","Chess_tile_pd.png");
			};
			var mpc = mypieces.join();
			var hpc = hispieces.join();		
			if (xp >= 1 && xp <= 5 && yp >= 65 && yp <= 69) {
				if ((Math.abs(xp-xd) == 2 && Math.abs(yp-yd) == 1) || (Math.abs(yp-yd) == 2 && Math.abs(xp-xd) == 1)) {
					if ( elf(position).firstChild.getAttribute("src") == "case.png" || hpc.indexOf(elf(position).firstChild.getAttribute("src"),0) != -1 ) {
						return true;
					};
				};
			};
			return false;
	}
	
	function markdestination(cellule,color) {
		switch (cellule.firstChild.getAttribute("src")) {
			case "Chess_tile_pd.png":
			case "Chess_tile_pl.png":
			for (var x = -2;x <= 2;x++) {
				for (var y = -2;y <= 2;y++) {	
				var tested = (Chr(Asc(cellule.id.substr(0,1))+y))+(parseInt(cellule.id.substr(1,1))+x);		
					if (isvalidpion(tested,cellule)) {
						elf(tested).style.borderColor = color;
					};
				};
			};			
			break;
			case "Chess_tile_nl.png":
			case "Chess_tile_nd.png":
			for (var x = -2;x <= 2;x++) {
				for (var y = -2;y <= 2;y++) {	
				var tested = (Chr(Asc(cellule.id.substr(0,1))+y))+(parseInt(cellule.id.substr(1,1))+x);		
					if (isvalidchevalier(tested,cellule)) {
						elf(tested).style.borderColor = color;
					};
				};
			};
			break;
		};
	}	
	
	function verifydestination(depart,arrive) {
	switch (depart.firstChild.getAttribute("src")) {
			case "Chess_tile_pd.png":
			case "Chess_tile_pl.png":
			if (isvalidpion(arrive,depart)) { 
				return true;
			};
			break;
			case "Chess_tile_nl.png":
			case "Chess_tile_nd.png":
			if (isvalidchevalier(arrive,depart)) {
				return true;
			};
			break;
		};
	return false;
	}
	
			
	function selectcase(event) {
		var target = event.target || event.srcElement; //objet final ayant subi l'événement (Gecko ou MSIE)
		if (target.tagName=="IMG") {	
			var cell = elf(target.parentNode.id);
			if (color == 1) {
				var mypieces = new Array("Chess_tile_nd.png","Chess_tile_pd.png");
			} else {
				var mypieces = new Array("Chess_tile_nl.png","Chess_tile_pl.png");
			};
			var mpc = mypieces.join();
		if (snapshot != "") {
				if (elf("origin").innerHTML != "") {
					if (cell.id == elf("origin").innerHTML) {
						cell.style.borderStyle = "solid";
						cell.style.borderColor = "black";
						if (elf("destination").innerHTML != "") {
							elf(elf("destination").innerHTML).style.borderColor = "black";
							elf(elf("destination").innerHTML).style.borderStyle = "solid";
							elf("destination").innerHTML = "";		
						};	
						markdestination(elf(elf("origin").innerHTML),"black");									
						elf("origin").innerHTML = "";
						elf("validate").disabled = true;
						return;
					} else if (verifydestination(elf(elf("origin").innerHTML),cell.id)) {
						if (elf("destination").innerHTML != "") {
							elf(elf("destination").innerHTML).style.borderColor = "black";
							elf(elf("destination").innerHTML).style.borderStyle = "solid";
						};										
						markdestination(elf(elf("origin").innerHTML),"yellow");						
						cell.style.borderColor = "green";
						cell.style.borderStyle = "outset";
						elf("destination").innerHTML = cell.id;
						elf("validate").disabled = false;
						return;
					};
				};
				if (elf("origin").innerHTML == "" && elf("destination").innerHTML == "" && mpc.indexOf(cell.firstChild.getAttribute("src"),0) != -1) {
						markdestination(cell,"yellow");
						cell.style.borderColor = "red";
						cell.style.borderStyle = "inset";
						elf("origin").innerHTML = cell.id;
						return;
				};
			}; 


		}; 
	}	
	
	
	function goplay() {
		elf("validate").disabled = true;
		try {	
		requester.open("GET","./game.php?action=play&GameID="+escape(GameID)+"&PlayerID="+escape(PlayerID)+"&Start="+escape(elf("origin").innerHTML)+"&End="+escape(elf("destination").innerHTML),false);
		requester.send(null);
			} catch(e) {
alert("request for playing failed");
			onerror();
			};
			if (requester.status != "200" || requester.responseText == "IPK" || requester.responseText == "IGK") {	
alert("request for playing failed");
				onerror();
			};
			if (requester.responseText == "ILLEGAL") {
				alert("illegal play, try again");
				elf(elf("destination").innerHTML).style.borderColor = "black";
				elf(elf("destination").innerHTML).style.borderStyle = "solid";
				elf("destination").innerHTML = "";	
				markdestination(elf(elf("origin").innerHTML),"black");									
				elf(elf("origin").innerHTML).style.borderColor = "black";
				elf(elf("origin").innerHTML).style.borderStyle = "solid";
				elf("origin").innerHTML = "";
				startturns();
				return;
		};
		if (requester.responseText == "REC") {
			waitnxt();
		};
		if (requester.responseText == "NXT") {
			startnxt();
		};					
	}
	
	function startnxt() {
			elf("waiting").style.display = "block";
			elf("playground").style.display = "block";
			elf(elf("destination").innerHTML).style.borderColor = "black";
			elf(elf("destination").innerHTML).style.borderStyle = "solid";
			elf("destination").innerHTML = "";	
			markdestination(elf(elf("origin").innerHTML),"black");									
			elf(elf("origin").innerHTML).style.borderColor = "black";
			elf(elf("origin").innerHTML).style.borderStyle = "solid";
			elf("origin").innerHTML = "";
			startturns();
			return;
	};
	
	function waitnxt() {
			var cturn = elf("turns").innerHTML;
			elf("playground").style.display = "none";
			var wtext = elf("waiting").innerHTML  ;
			if (wtext.indexOf("Waiting for opponent move",0) == "-1") {
				elf("waiting").innerHTML += "<p>Waiting for opponent move</p>";
			} else { 
				elf("waiting").innerHTML = wtext.substr(0,wtext.length-4) + ".</p>";
			};				
			try {		
				requester.open("GET","./game.php?action=currentturn&GameID="+escape(GameID),false);
				requester.send(null);
			} catch(e) {
alert("request for current turn failed");
			onerror();
			};
			if (requester.status != "200") {	
alert("request for current turn failed");
				onerror();
			};
			if (parseInt(cturn) < parseInt(requester.responseText)) {
				startnxt();
			} else {	
				setTimeout(waitnxt,3000);
			};
	};
	
	function ChatSend() {
		elf("chatsend").disabled = "1";
		try {		
			requester.open("GET","./game.php?action=chat&GameID="+escape(GameID)+"&PlayerID="+escape(PlayerID)+"&Text="+escape(elf("chattext").value),false);
			requester.send(null);
		} catch(e) {
		elf("chatters").innerHTML += "<p>Error with sending chat text</p>";		
		elf("chatsend").removeAttribute("disabled");
		return;
		};
		if (requester.responseText != "OK" || requester.status != "200") {
		elf("chatters").innerHTML += "<p>Error with sending chat text</p>";
		elf("chatsend").removeAttribute("disabled");
		return;
		};
		elf("chattext").value = "";
		elf("chatsend").removeAttribute("disabled");	
		return;	
	}
	
	function ChatRequest() {
		var cid = "";	
		if (elf("chatters").hasChildNodes()) {	
			var el = elf("chatters").lastChild;
			while (el.previousSibling && (!isdefined(el.id) || el.id == "")) {
				el = el.previousSibling;
			};		
		cid = (isdefined(el.id)) ? el.id.substr(2) : "" ;
		};		
		try {	
			chatrequest.onreadystatechange = ChatState;	
			chatrequest.open("GET","./game.php?action=chatrequest&GameID="+escape(GameID)+"&lastline="+escape(cid),true);
			chatrequest.send(null);
		} catch(e) {
		elf("chatters").innerHTML += "<p>Error with receiving chat text</p>";		
		return;
		};
	}
		
	function ChatState() {
		if (chatrequest.readyState == 4) {
			if (chatrequest.status != "200") {
			elf("chatters").innerHTML += "<p>Error with receiving chat request</p>";
			setTimeout(ChatRequest,10000);
			return;
			};
		elf("chatters").innerHTML += chatrequest.responseText;
		setTimeout(ChatRequest,5000);
		};
	}
	
	
