/*

tic tac toe

kaerith aka noruas 2004
kaerith@hotmail.fr

sous licence gpl (http://www.gnu.org/licenses/gpl.txt)

*/
	var board = null;
	var nb_token_played = 0;
	var started = false;
	var human_turn = false;
	var debug = false;

	var hc1 = 0;
	var hc2 = 0;
	var hc3 = 0;
	var hl1 = 0;
	var hl2 = 0;
	var hl3 = 0;
	var hd1 = 0; // g -> d
	var hd2 = 0; // d -> g

	var cc1 = 0;
	var cc2 = 0;
	var cc3 = 0;
	var cl1 = 0;
	var cl2 = 0;
	var cl3 = 0;
	var cd1 = 0;
	var cd2 = 0;

	var strlog = "";
	var score_h = 0;
	var score_c = 0;



	function init() {
		board = new Array(new Array(" ", " ", " "), new Array(" ", " ", " "), new Array(" ", " ", " "));
		nb_token_played = 0;
		started = false;
		human_turn = false;
		for(var i = 1; i < 10; i++) {
			var node = document.getElementById(i);
			node.innerHTML="<img src='http://kaerith.chez-alice.fr/tictactoe/blank.gif'>";
			fillBoard(i, " ");
		}
		strlog = "";
		log("GO");
	}


	function compute_humain(inO) {
		if(started && human_turn) {
			var tab = intToXY(inO.id);
			if(board[tab[0]][tab[1]] == " ") {
				inO.innerHTML="<img src='http://kaerith.chez-alice.fr/tictactoe/cross.gif'>";
				nb_token_played++;
				fillBoard(inO.id, "X");
				if(checkHWin()) {
					log("Human gagne");
					score_h ++;
					updatescore();
					started = false;
				} else
					computer_play();
			}
		}
	}



	function whosfirst() {
		return Math.round(Math.random());
	}


	function begin() {
		init();
		started = true;
		if(whosfirst() == 1) {
			human_play();
		} else {
			computer_play();
		}
	}

	function computer_play() {
		human_turn = false;
		if(nb_token_played < 9) {
			var case_a_jouer = compute();
			log("je joue " + case_a_jouer);
			paintRound(case_a_jouer);
			nb_token_played++;
			if(checkCWin()) {
				log("Je gagne");
				score_c++;
				updatescore();
				started = false;
			} else
				human_play();
		}
	}

	function human_play() {
		if(nb_token_played < 9) {
			human_turn = true;
		}
	}


	function compute() {
		if(board[1][1] == " ")
			return 5;
		//puis je gagner ?
		log("puis je gagner ?");
		for(var i = 1; i < 4; i++) {
			if(eval("cl" + i + " == 2")) {
					var res = getCaseLibreLigne(i-1);
					if(res != null) {
						return res;
					}
			}
			if(eval("cc" + i + " == 2")) {
					var res = getCaseLibreColonne(i-1);
					if(res != null) {
						return res;
					}
			}
		}
		if(cd1 == 2) {
			var res = getCaseLibreD1();
			if (res != null) {
				return res;
			}
		}
		if(cd2 == 2) {
			var res = getCaseLibreD2();
			if (res != null) {
				return res;
			}
		}
		//l'humain risque t'il de gagner ?
		log("l'humain risque t'il de gagner ?");
		for(var i = 1; i < 4; i++) {
			if(eval("hl" + i + " == 2")) {
					var res = getCaseLibreLigne(i-1);
					if(res != null) {
						return res;
					}
			}
			if(eval("hc" + i + " == 2")) {
					var res = getCaseLibreColonne(i-1);
					if(res != null) {
						return res;
					}
			}
		}
		if(hd1 == 2) {
			var res = getCaseLibreD1();
			if (res != null) {
				return res;
			}
		}
		if(hd2 == 2) {
			var res = getCaseLibreD2();
			if (res != null) {
				return res;
			}
		}
		//puis je aligner 2 ?
		log("puis je aligner 2 ?");
		for(var i = 1; i < 4; i++) {
			if(eval("cl" + i + " == 1")) {
					var res = getCaseLibreLigne(i-1);
					if(res != null) {
						return res;
					}
			}
			if(eval("cc" + i + " == 1")) {
					var res = getCaseLibreColonne(i-1);
					if(res != null) {
						return res;
					}
			}
		}
		if(cd1 == 1) {
			var res = getCaseLibreD1();
			if (res != null) {
				return res;
			}
		}
		if(cd2 == 1) {
			var res = getCaseLibreD2();
			if (res != null) {
				return res;
			}
		}
		return playRandomFreeCase();
	}




	function update() {
		hc1 = 0;
		hc2 = 0;
		hc3 = 0;
		hl1 = 0;
		hl2 = 0;
		hl3 = 0;
		hd1 = 0; // g -> d
		hd2 = 0; // d -> g

		cc1 = 0;
		cc2 = 0;
		cc3 = 0;
		cl1 = 0;
		cl2 = 0;
		cl3 = 0;
		cd1 = 0;
		cd2 = 0;


		// 00
		if(board[0][0] == "X") {
			hl1++;
			hc1++;
			hd1++;
		} else if(board[0][0] == "O") {
			cl1++;
			cc1++;
			cd1++;
		}
		//01
		if(board[0][1] == "X") {
			hl1++;
			hc2++;
		} else if(board[0][1] == "O") {
			cl1++;
			cc2++;
		}
		//02
		if(board[0][2] == "X") {
			hl1++;
			hc3++;
			hd2++;
		} else if(board[0][2] == "O") {
			cl1++;
			cc3++;
			cd2++;
		}

		//10
		if(board[1][0] == "X") {
			hl2++;
			hc1++;
		} else if(board[1][0] == "O") {
			cl2++;
			cc1++;
		}

		//11
		if(board[1][1] == "X") {
			hl2++;
			hc2++;
			hd2++;
			hd1++;
		} else if(board[1][1] == "O") {
			cl2++;
			cc2++;
			cd2++;
			cd1++;
		}

		//12
		if(board[1][2] == "X") {
			hl2++;
			hc3++;
		} else if(board[1][2] == "O") {
			cl2++;
			cc3++;
		}

		// 20
		if(board[2][0] == "X") {
			hl3++;
			hc1++;
			hd2++;
		} else if(board[2][0] == "O") {
			cl3++;
			cc1++;
			cd2++;
		}
		//21
		if(board[2][1] == "X") {
			hl3++;
			hc2++;
		} else if(board[2][1] == "O") {
			cl3++;
			cc2++;
		}
		//22
		if(board[2][2] == "X") {
			hl3++;
			hc3++;
			hd1++;
		} else if(board[2][2] == "O") {
			cl3++;
			cc3++;
			cd1++;
		}

		log("hl1 " + hl1 + "   hl2 " + hl2 + "   hl3 " + hl3 + "   hc1 " + hc1 + "   hc2 " + hc2 + "   hc3 " + hc3 + "   hd1 " + hd1 + "   hd2 " + hd2);
		log("cl1 " + cl1 + "   cl2 " + cl2 + "   cl3 " + cl3 + "   cc1 " + cc1 + "   cc2 " + cc2 + "   cc3 " + cc3 + "   cd1 " + cd1 + "   cd2 " + cd2);
		log(nb_token_played);

	}


	function log(instr) {
		if(debug) {
			strlog += instr + "<BR/>";
			var node = document.getElementById("LOG");
			node.innerHTML = strlog;
		}
	}

	function paintRound(inV) {
		var node = document.getElementById(inV);
		node.innerHTML="<img src='http://kaerith.chez-alice.fr/tictactoe/round.gif'>";
		fillBoard(inV, "O");
	}


	function fillBoard(inV, inStr) {
		if(inV == 1)
			board[0][0] = inStr;
		if(inV == 2)
			board[0][1] = inStr;
		if(inV == 3)
			board[0][2] = inStr;

		if(inV == 4)
			board[1][0] = inStr;
		if(inV == 5)
			board[1][1] = inStr;
		if(inV == 6)
			board[1][2] = inStr;

		if(inV == 7)
			board[2][0] = inStr;
		if(inV == 8)
			board[2][1] = inStr;
		if(inV == 9)
			board[2][2] = inStr;
	}


	function intToXY(inV) {
		var retTab = new Array(2);
		if(inV == 1) {
			retTab[0] = 0;
			retTab[1] = 0;
		}
		if(inV == 2) {
			retTab[0] = 0;
			retTab[1] = 1;
		}
		if(inV == 3) {
			retTab[0] = 0;
			retTab[1] = 2;
		}

		if(inV == 4) {
			retTab[0] = 1;
			retTab[1] = 0;
		}
		if(inV == 5) {
			retTab[0] = 1;
			retTab[1] = 1;
		}
		if(inV == 6) {
			retTab[0] = 1;
			retTab[1] = 2;
		}

		if(inV == 7) {
			retTab[0] = 2;
			retTab[1] = 0;
		}
		if(inV == 8) {
			retTab[0] = 2;
			retTab[1] = 1;
		}
		if(inV == 9) {
			retTab[0] = 2;
			retTab[1] = 2;
		}
		return retTab;
	}

	function getCaseLibreLigne(inv) {
		log("getCaseLibreLigne " + inv)
		for(var i = 0; i < 3; i++) {
			if(board[inv][i] == " ")
					return (inv * 3) + i + 1;
		}
	}

	function getCaseLibreColonne(inv) {
		log("getCaseLibreColonne " + inv)
		for(var i = 0; i < 3; i++) {
			if(board[i][inv] == " ")
					return inv + (i * 3) + 1;
		}
	}

	function getCaseLibreD1() {
		log("getCaseLibreD1");
		if(board[0][0] == " ")
			return 1;
		if(board[1][1] == " ")
			return 5;
		if(board[2][2] == " ")
			return 9;
	}

	function getCaseLibreD2() {
		log("getCaseLibreD2");
		if(board[0][2] == " ")
			return 3;
		if(board[1][1] == " ")
			return 5;
		if(board[2][0] == " ")
			return 7;
	}

	function checkCWin() {
		log("checkCWin");
		update();
		for(var j = 1; j < 4; j++) {
			if(eval("cl" + j + " == 3"))
				return true;
			if(eval("cc" + j + " == 3"))
				return true;
		}
		if(cd1 == 3)
			return true;
		if(cd2 == 3)
			return true;
		return false;
	}

	function checkHWin() {
		log("checkHWin");
		update();
		for(var j = 1; j < 4; j++) {
			if(eval("hl" + j + " == 3"))
				return true;
			if(eval("hc" + j + " == 3"))
				return true;
		}
		if(hd1 == 3)
			return true;
		if(hd2 == 3)
			return true;
		return false;
	}

	function playRandomFreeCase() {
		for(var i = 0; i < 3; i++) {
			var res = getCaseLibreLigne(i);
			 if( res != null)
			 	return res;
		}
	}

	function updatescore() {
		var node = document.getElementById("score");
		node.innerHTML = "Ordinateur : " + score_c + "<BR> Humain : " + score_h;

	}



