var d = document;
var isTimer = 1;
var enhe = 1;

var mm = new Array(9);
var mm2 = new Array(9);
var mm3 = new Array(9);

var tm = 0;
var isTimerFrozen = true;
var solved = false;
var isLoaded = false;

var done = true;

for(i=0; i<=8; i++) {
	mm[i] = new Array(9);
	mm2[i] = new Array(9);
	mm3[i] = new Array(9);
}

addEvent(window, "load", game_init);

function game_init() {
	var settings = readCookie("sudokuCB");
	// Loading options/stats
	if(!settings || settings.length!=2)
		createCookie("sudokuCB", "11", 365);
	else {
		isTimer = parseInt(settings.charAt(0));
		enhe = parseInt(settings.charAt(1));
	}

	// Setting timer
	var divtimer = d.getElementById("timer");
	divtimer.style.display = (isTimer==1 ? "block": "none");

	// Setting enhe radio
	var rbenhe = d.getElementById("enhe"+enhe);
	rbenhe.checked = true;

	addEventById("mapsubmit", "click", game_new);
	addEventById("savegame", "click", game_save);
	addEventById("loadgame", "click", game_load);
	addEventById("cleargame", "click", game_clear);
	sndReq(enhe);
}

function game_new() {
	sndReq(getENH());
	// Hide numz
	d.getElementById('numz').style.top = "-10000px";
}

function game_save() {
	var s='';
	for(var i=0; i<=8; i++)
		for(var j=0; j<=8; j++)
			s+=mm[i][j];
	for(var i=0; i<=8; i++)
		for(var j=0; j<=8; j++)
			s+=mm2[i][j];
	
	createCookie("sudokuCBsave", s, 365);
}

function game_load() {
	var save = readCookie("sudokuCBsave");
	if(!save)
		game_new();
	else {
		var t=0;
		for(var i=0; i<=8; i++)
			for(var j=0; j<=8; j++) {
				mm[i][j] = save.charAt(t++);
				d.getElementById('td'+i+j).innerHTML = '<p class="base"><span class="n'+ mm[i][j] +'">' + (parseInt(mm[i][j])!=0 ? mm[i][j] : '') + '</span></p>';

				mm3[i][j] = 0;
			}
		
		for(var i=0; i<=8; i++)
			for(var j=0; j<=8; j++)
				mm2[i][j] = save.charAt(t++);
		
		for(var i=0; i<=8; i++)
			for(var j=0; j<=8; j++)
				if(mm2[i][j]!=0)
					setnum(mm2[i][j], i, j);

		tm=0;
		if(isTimerFrozen) {
			isTimerFrozen = false;
			setTimer();
		}
		done = true;
		solved = false;
	}
}

function game_clear() {
	for(var i=0; i<=8; i++)
		for(var j=0; j<=8; j++) {
			d.getElementById('td'+i+j).innerHTML = '<p class="base"><span class="n'+ mm[i][j] +'">' + (parseInt(mm[i][j])!=0 ? mm[i][j] : '') + '</span></p>';
			mm2[i][j] = 0;
			mm3[i][j] = 0;
		}

	done = true;
	solved = false;
}

function load(a) {
	var t=0;
	for(var i=0; i<=8; i++)
		for(var j=0; j<=8; j++) {
			mm[i][j] = a.charAt(t++);
			d.getElementById('td'+i+j).innerHTML = '<p class="base"><span class="n'+ mm[i][j] +'">' + (parseInt(mm[i][j])!=0 ? mm[i][j] : '') + '</span></p>';
			mm2[i][j] = 0;
			mm3[i][j] = 0;
		}

	tm=0;
	if(isTimerFrozen) {
		isTimerFrozen = false;
		setTimer();
	}
	done = true;
	solved = false;
	isLoaded = false;
}

function f(i,j) {
	if(mm[i][j] == 0) {
		var dl = d.getElementById('numz');
		dl.classname = "dl"+i+j;

		var t = j*41;
		if(d.getElementById('timer').style.display == 'block') {
			t += 50;
		}
		else {
			t += 10;
		}

		var l = i*41 + 30;

		dl.style.top = t + "px";
		dl.style.left = l + "px";
	}
}

function check(i0,j0) {
	if(mm2[i0][j0] == 0)
		return true;

	for(var i=0; i<=8; i++)
		for(var j=0; j<=8; j++)
			mm3[i][j] = parseInt(mm[i][j]) + parseInt(mm2[i][j]);
	
	for(j=0; j<=8; j++)
		if(j!=j0 && mm3[i0][j] == mm3[i0][j0])
			return false;

	for(i=0; i<=8; i++)
		if(i!=i0 && mm3[i][j0] == mm3[i0][j0])
			return false;

	var di = Math.floor(i0/3);
	var dj = Math.floor(j0/3);
	for(var i1=di*3; i1<=di*3+2; i1++) 
		for(var j1=dj*3; j1<=dj*3+2; j1++)
			if((i1!=i0 || j1!=j0) && mm3[i1][j1] == mm3[i0][j0])
				return false;

	return true;
}

function isSolved() {
	for(var i=0; i<=8; i++)
		for(var j=0; j<=8; j++)
			if(parseInt(mm3[i][j])==0)
				return false;
	
	var ps = d.getElementsByTagName('p');

	for(var i=0; i<ps.length; i++)
		if(ps[i].className == "solW")
			return false;

	return true;
}

function putnum(m1) {
	var i = parseInt(d.getElementById('numz').classname.charAt(2));
	var j = parseInt(d.getElementById('numz').classname.charAt(3));
	setnum(m1, i, j);
}

function setnum(m1, i, j) {
if(!solved) {
	if(m1>=0) {
		if(!done)
			return;
		if((typeof(i)).indexOf("undefined")!=-1 || (typeof(j)).indexOf("undefined")!=-1)
			return;

		mm2[i][j] = m1;
		var tdid = 'td'+i+j;
		var s = ((check(i,j) ? '<p class="solR">' : '<p class="solW">') + '<span class="n'+m1+'">');
		d.getElementById(tdid).innerHTML = s + (m1!=0 ? m1 : '') + '</span></p>';
	
		done = false;
	
		//	---------Advanced test model (beta)
		for(var i1=0; i1<=8; i1++) {
			var m = mm2[i1][j];
			if(mm[i1][j]==0 && m!=0) {
				var tdid = 'td' + i1 + j;
				var s = ((check(i1,j) ? '<p class="solR">' : '<p class="solW">') + '<span class="n'+m+'">');
				d.getElementById(tdid).innerHTML = s + (m!=0 ? m : '') + '</span></p>';	
			}
		}
		
		for(var j1=0; j1<=8; j1++)
		{
			var m = mm2[i][j1];
			if(mm[i][j1]==0 && m!=0)
			{
				var tdid = 'td' + i + j1;
				var s = ((check(i,j1) ? '<p class="solR">' : '<p class="solW">') + '<span class="n'+m+'">');
				d.getElementById(tdid).innerHTML = s + (m!=0 ? m : '') + '</span></p>';	
			}
		}
		
		var di = Math.floor(i/3);
		var dj = Math.floor(j/3);
		
		for(var i1=di*3; i1<=di*3+2; i1++) 
			for(var j1=dj*3; j1<=dj*3+2; j1++) {
				var m = mm2[i1][j1];
				if(mm[i1][j1]==0 && m!=0) {
					var tdid = 'td' + i1 + j1;
					var s = ((check(i1,j1) ? '<p class="solR">' : '<p class="solW">') + '<span class="n'+m+'">');
					d.getElementById(tdid).innerHTML = s + (m!=0 ? m : '') + '</span></p>';	
				}
			}
		 // -------end of a m.
	 }

	 // Hide numz pane
	 d.getElementById('numz').style.top = "-10000px";
	
	 if(isSolved()) {
		 alert("Congratulations!");
		 if(!isLoaded)
			 sndGameInfo(tm);
		 isTimerFrozen = true;
		 solved = true;
	 }
	 
	 done = true;
}
}

function genTable() {
	var s = '<dl class="dl__" id="numz"><dt><a onclick="putnum(-1);"></a></dt><dt><a onclick="putnum(0);"></a></dt><dt><a onclick="putnum(-1);"></a></dt><dt><a onclick="putnum(1);"></a></dt><dt><a onclick="putnum(2);"></a></dt><dt><a onclick="putnum(3);"></a></dt><dt><a onclick="putnum(4);"></a></dt><dt><a onclick="putnum(5);"></a></dt><dt><a onclick="putnum(6);"></a></dt><dt><a onclick="putnum(7);"></a></dt><dt><a onclick="putnum(8);"></a></dt><dt><a onclick="putnum(9);"></a></dt></dl>';

	s += '<ul id="tab">\n';

	for(i=0; i<=8; i++)
		for(j=0; j<=8; j++) {
			var cl = 'class=\"' + ((j == 2 || j == 5) ? 'r' : '') + ((i == 2 || i == 5) ? 'b' : '') + '\"';
			s += '<li id=\"td' + j + i + '\" ' + cl + 'onclick=\"f(' + j + ',' + i + ')\"' + '></li>\n';		
		}

	s += '</ul>\n';
	d.write(s);
}

function setTimer() {
	var h = Math.floor(tm/3600);
	var h1 = Math.floor(h/10);
	var h2 = h%10;
	
	var m = Math.floor((tm - h*3600)/60);
	var m1 = Math.floor(m/10);
	var m2 = m%10;

	var s = tm%60;
	var s1 = Math.floor(s/10);
	var s2 = s%10;
	
	d.getElementById('th1').style.backgroundPosition = -h1*40+"px 0";
	d.getElementById('th2').style.backgroundPosition = -h2*40+"px 0";
	
	d.getElementById('tm1').style.backgroundPosition = -m1*40+"px 0";
	d.getElementById('tm2').style.backgroundPosition = -m2*40+"px 0";
	
	d.getElementById('ts1').style.backgroundPosition = -s1*40+"px 0";
	d.getElementById('ts2').style.backgroundPosition = -s2*40+"px 0";
	tm++;

	if(!isTimerFrozen)
		setTimeout('setTimer()', 1000);
}

function getENH() {
	for(var i=0; i<=4; i++)
		if(d.getElementById('enhe' + i).checked)
			enhe = i;

	return enhe;
}

// AJAX stuff
function createRequestObject() {
	var ro;

	if (window.XMLHttpRequest)
		ro = new XMLHttpRequest();
	else {
		ro = new ActiveXObject('Msxml2.XMLHTTP');
		if(!ro) 
			ro = new ActiveXObject('Microsoft.XMLHTTP'); 
	}

	return ro;
}

var http;
var http1;

function sndReq(action) {
	http = createRequestObject();
	http.open('get', '../s/map.php?action='+action+'&seed='+Math.round(100*Math.random()));
	http.onreadystatechange = handleResponse;
	http.send(null);
}

function sndGameInfo(time) {
	http1 = createRequestObject();
	http1.open('get', '../s/addgmstat.php?game_time=' + time + '&enhe=' + enhe);
	http1.send(null);
}

function handleResponse() {
	if(http.readyState == 4)
		load(http.responseText);
}