/*
Sudoku, ©Copyright 2007 - bezumie.com, All Rights Reserved
Судоку, ©Copyright 2007 - bezumie.com, Всички права запазени
*/
var curCell;
var pencil;
var selColor='#C8FF9F';
var gameIsOver=true;
function charIsNum(aChar){
	return('1234567890'.indexOf(aChar)!=-1);
}
function addEvent(el,ev,fn,capt){
	if(el.addEventListener){
		el.addEventListener(ev,fn,capt);
		return true;
	}
	else if(el.attachEvent){
		var r=el.attachEvent('on'+ev,fn);
		return r;
	}
	else{
		el['on'+ev]=fn;
	}
}
function init(){
	pencil=true;
	toggle();
	document.onkeydown=keyPressed;
	for(var i=0;i<=9;i++){
		var c=document.getElementById('num'+i);
    	addEvent(c,'click',numClick,false);
	}
	for(var i=0;i<9;i++){
		for(var j=0;j<9;j++){
			var c=document.getElementById('c_'+i+'_'+j);
			if (c.className.indexOf("locked")==-1){
				addEvent(c,'click',cellClick,false);
				c.guess=false;
			}
		}
	}
	gameIsOver=false;
}
function keyPressed(e){
	if(gameIsOver)return;
	var c, col, row;
	if(e)c=e.which;
	else c=window.event.keyCode;
	if(curCell){
		col=curCell.col;
		row=curCell.row;
	}
	else{
		col=0;
		row=0;
	}
	switch(c){
		case 37:
			do{
				col--;
				if(col<0)col=8;
			} while(document.getElementById('c_'+row+'_'+col).className.indexOf('locked')!=-1);
			setCurCell(row,col);
			break;
		case 38:
			do {
				row--;
				if(row<0)row=8;
			} while(document.getElementById('c_'+row+'_'+col).className.indexOf('locked')!=-1);
			setCurCell(row,col);
			break;
		case 39:
			do{
				col++;
				if(col>8)col=0;
			} while(document.getElementById('c_'+row+'_'+col).className.indexOf('locked')!=-1);
			setCurCell(row,col);
			break;
		case 40:
			do{
				row++;
				if(row>8)row=0;
			} while(document.getElementById('c_'+row+'_'+col).className.indexOf('locked')!=-1);
			setCurCell(row,col);
			break;
		case 84:
			toggle();
			break;
		case 67:
			check();
			break;
		case 8:
		case 46:
			placeNum(0);
			break;
		default:
			var ch=String.fromCharCode(c);
			if(charIsNum(ch)==false)return true;
			var num=parseInt(ch);
			placeNum(num);
			break;		
	}
//	if (e && e.preventDefault) e.preventDefault();
//    else e.returnValue = false;
	return false;
}
function cellClick(e){
	if(gameIsOver)return;
	if(!e)e=window.event;
	var cell=e.srcElement?e.srcElement:e.target; 
	cell=cell.id.split('_');
	setCurCell(cell[1],cell[2]);
}
function setCurCell(r,c){
	if(curCell)curCell.bgColor='';
	curCell=document.getElementById('c_'+r+'_'+c);
	curCell.bgColor=selColor;
	curCell.row=r;
	curCell.col=c;
}
function numClick(e){
	if(gameIsOver)return;
	if(!e)e=window.event;
	var n=e.srcElement?e.srcElement:e.target;
	if(!n.innerHTML)var num=0;
	else var num=n.innerHTML;
	placeNum(num);
}
function placeNum(num){
	if(!curCell)return;
	if (!num){
		curCell.innerHTML='';
		curCell.style.fontSize='';
	}
	else {
		if (curCell.innerHTML.indexOf(num)!=-1){
			if (!pencil && curCell.style.fontSize!=''){
				curCell.innerHTML=num;
				textSettings(curCell,false);
				check(false);
			}
			else {
				curCell.innerHTML=curCell.innerHTML.replace(num, '');
				curCell.innerHTML=trimString(curCell.innerHTML);
				if (curCell.innerHTML==''){
					textSettings(curCell, false);
					curCell.innerHTML='';
				}
			}
		}
		else {
			if (pencil) {
				textSettings(curCell, true);
				var ss=curCell.innerHTML+ ' '+num;
				ss=sortGuesses(ss);
				ss=trimString(ss);
				curCell.innerHTML = ss;
			}
			else {
				curCell.innerHTML=num;
				textSettings(curCell, false);
				check(false);
			}
		}
	}
} 
function trimString(str) {
	while (str.charAt(0) == ' ') 
		str = str.substring(1);
	while (str.substring(0, 6) == ' ')
		str = str.substring(6);
	while (str.charAt(str.length - 1) == ' ')
		str = str.substring(0, str.length - 1);
	return str;
}
function textSettings(c,guess){
	if(guess){
		c.style.fontSize='10px';
		c.style.textAlign='right';
		c.style.fontWeight='normal';
		c.vAlign='top';
		c.guess=true;
	}
	else{
		c.style.fontSize='';
		c.style.fontWeight='';
		c.style.textAlign='center';
		c.vAlign='center';
		c.guess=false;
	}
}
function resetBoard(){
	if(!confirm(confirmReset))return;
	for(var i=0;i<9;i++){
		for(var j=0;j<9;j++){
			var el=document.getElementById('c_'+i+'_'+j);
			textSettings(el,false);
			if(el.className.indexOf('locked')==-1){
				el.innerHTML='';
				el.bgColor=''; 
			}
		}
	}
	curCell=null;
}
function toggle(){
	pencil=!pencil;
	if(pencil){
		document.getElementById('pencil').style.borderColor='red';
		document.getElementById('pen').style.borderColor='#c0c0c0';
	}
	else{
		document.getElementById('pen').style.borderColor='red';
		document.getElementById('pencil').style.borderColor='#c0c0c0';
	}
}
function markErr(i1,j1,i2,j2){
	gameIsOver=true;
	document.getElementById('c_'+i1+'_'+j1).style.color="red";
	document.getElementById('c_'+i2+'_'+j2).style.color="red";
	setTimeout("clearErr("+i1+','+j1+','+i2+','+j2+")", 1000);
}
function clearErr(i1,j1,i2,j2){
	gameIsOver=false;
	document.getElementById('c_'+i1+'_'+j1).style.color="";
	document.getElementById('c_'+i2+'_'+j2).style.color="";
}
function check(alerts){
	if(alerts==undefined)alerts=true;
	for(var i=0;i<9;i++){
		var l='';
		var ll='';
		var k='';
		var kk='';
		for(var j=0;j<9;j++){
			var c=document.getElementById('c_'+i+'_'+j);
			if(!c.guess){
				var v=c.innerHTML;
				if(v!=0){
					if(l.indexOf(v)!=-1){if(alerts)markErr(i,j,i,l.indexOf(v));return false;}
					l+=v;
				}
				else l+=' ';
				ll+=v;
			}
			var c=document.getElementById('c_'+j+'_'+i);
			if(!c.guess){
				var v=c.innerHTML;
				if(v!=0){
					if(k.indexOf(v)!=-1){if(alerts)markErr(j,i,k.indexOf(v),i);return false;}
					k+=v;
				}
				else k+=' ';
				kk+=v;
			}
		}
		if(!alerts && (ll.length!=9))return false;
		if(!alerts && (kk.length!=9))return false;
	}
	for(var x=0;x<3;x++){
		for(var y=0;y<3;y++){
			k='';
			for(var i=0;i<3;i++){
				for(var j=0;j<3;j++){
					var c=document.getElementById('c_'+(x*3+i)+'_'+(y*3+j));
					if(!c.guess){
						var v=c.innerHTML;
						if(v!=0){
							var l=k.indexOf(v);
							if(l!=-1){if(alerts)markErr(x*3+i,y*3+j,(x*3)+Math.floor(l/3),(y*3)+(l%3));return false;}
							k+=v;
						}
						else k+=' ';
					}
				}
			}
		}
	}
	if(!alerts)gameOver();
	return true;
}
function sortGuesses(str){
	var poss=new Array(9);
	var x=0;
	for(var i=0;i<str.length;i++){
		if(str.substring(i,i+1)==parseInt(str.substring(i,i+1))){
			poss[x]=str.substring(i,i+1);
			x++;
		}
	}
	poss.sort();
	var res='';
	for(i=0;i<x;i++)res=res+poss[i]+' ';
	return res;
}
function gameOver(){
	gameIsOver=true;
	$('#actions').hide('fast');
	$('#rules').hide('fast');
	var go=$('#gameOver');
	go.show('fast');
	$.post('getrate.php',{id:sudokuid,lang:lang},function(txt){});
	$('#ratediv').show('fast');
}
function rate(r){
	$('#ratediv').hide('fast');
	$.post('rate.php',{id:sudokuid,rate:r,lang:lang},function(txt){
		$('#thks').html(txt);
		$('#thks').show('fast');
	});
	return false;
}