function attachToolTipBehavior() {
	var sideBar = document.getElementById('sudokugrid');
	if(sideBar)	{
		var inputs = sideBar.getElementsByTagName('input');
	}
	var i;
	for ( i=0;i<inputs.length;i++ ) {
		par1 = inputs[i].id.substr(1,1);
		par2 = inputs[i].id.substr(2,2);
		inputs[i].setAttribute('onKeyPress','return onKeyPressBlockNumbers('+par1+','+par2+',event);');
		inputs[i].setAttribute('onBlur','checkCell('+par1+','+par2+');');
//		inputs[i].setAttribute('onClick','clickCell('+par1+','+par2+');');
		inputs[i].setAttribute('onFocus','clickCell('+par1+','+par2+');');
	}
}

function initStuff() {
	initSudokuArray();
	attachToolTipBehavior();
	new Draggable('suggestions',{revert:false});
	new Draggable('controls',{revert:false});
	new Draggable('rules',{revert:false});
	new Draggable('sudoku',{revert:false});
	new Draggable('completedrag',{revert:false});
	new Draggable('legend',{revert:false});
	new PeriodicalExecuter(autoFillStep, 1);

}

Event.observe(window, 'load', initStuff, false);

var suggestionsshow = true;
var nextstepsshow = true;
var completedbool = false;
var completepercent = 0;

function toggleSuggestions() {
		if(!suggestionsshow) {
			new Effect.toggle($('suggestions'),'blind')
			suggestionsshow = true;
		} else {
			new Effect.toggle($('suggestions'),'blind')
			suggestionsshow = false;			
		}

}

function clickCell(firstpar, secondpar) {
	sudokuInputs[firstpar][secondpar].className = "";

	// if show tips checkbox is true
	if($('suggestionscheckbox').checked == true) {
		$('ajaxsuggestions').innerHTML = "";
		doSuggestions(firstpar, secondpar);
		if(!suggestionsshow) {
			new Effect.toggle($('suggestions'),'blind');
			suggestionsshow = true;
		}
	} else {
		if(suggestionsshow) {
			new Effect.toggle($('suggestions'),'blind');
			suggestionsshow = false;
		}
	}

	if($('nextstepscheckbox').checked == true) {
		nextSteps();
		if(!nextstepsshow) {
			nextstepsshow = true;
		}
	} else {
		if(nextstepsshow) {
			allNodes = document.getElementsByClassName("inputsuggest");
			for(i = 0; i < allNodes.length; i++) {
		    	allNodes[i].classname = "";
			}
			nextstepsshow = false;
		}
	}

}

function doCompleteAnimation() {
	if(!completedbool) {
		//new Effect.Pulsate("sudoku");
		completedbool = true;
		new Effect.toggle($('wrapper'),'blind');
		id = window.setTimeout("new Effect.toggle($('again'),'blind');",2000);


		//var again = confirm("Proficiat.\nWil u opnieuw spelen?");
		if(again) {
			window.location = "http://www.jurriaanpersyn.com/projects/sudoku/";
		} else {
			window.location = "http://www.jurriaanpersyn.com/";
		}
	}
}

function autoFill() {
	if($('autofillcheckbox').checked) {
		if($('suggestionscheckbox').checked) {
			$('suggestionscheckbox').checked = false;
			suggestionsshow = false;
			new Effect.toggle($('suggestions'),'blind');
		}
		if($('nextstepscheckbox').checked) {
			$('nextstepscheckbox').checked = false;
			nextstepsshow = false;
		}
	}	
}

function autoFillStep() {
	if($('autofillcheckbox').checked == true && completepercent != 100) {
          		$('ajaxsuggestions').innerHTML = "";
	    //Ajax code to grab news and update DOM
		var url = 'php/sudoku2.php';
		var pars = 'mode=autofill&sudokustring='+sudokuMatrixAsString();
		var myAjax = new Ajax.Request( url, { method: 'get', parameters: pars, onComplete: autoFillStepComplete });
	}
	if($('nextstepscheckbox').checked == true && completepercent != 100) {
		nextSteps();
	}
}

function autoFillStepComplete(originalRequest) {
	var response = originalRequest.responseText;
	var responsearray = response.split(";");
	document.getElementById("s"+responsearray[0]).value = responsearray[1];
	checkCell(responsearray[0].substr(1,1), responsearray[0].substr(0,1));

}



var sudokuInputs

function initSudokuArray() {

	// Get input values
	sudokuInputs = new Array(9);
	for (i1=0; i1<9; i1++)
		sudokuInputs[i1]=new Array(9);

	for (i2=0; i2<9; i2++) {
		for (j1=0; j1<9; j1++) {
			sudokuInputs[i2][j1] = document.getElementById('s'+i2+''+j1);
		}
	}
	
	completeLevel();


}

function onKeyPressBlockNumbers(xkp,ykp,e) {
        var bool = true;
	var key = (window.event)? e.keyCode : e.which;
	var keychar = String.fromCharCode(key);
	reg = /\d/;
	//alert(keychar);
	if(key==37) {
                    if(xkp > 0)
                    sudokuInputs[(xkp-1)][ykp].focus();
        } else if(key==38) {
                    if(ykp > 0)
                    sudokuInputs[xkp][(ykp-1)].focus();
        } else if(key==39) {
                    if(xkp < 8)
                    sudokuInputs[(xkp+1)][ykp].focus();
        } else 	if(key==40) {
                    if(ykp < 8)
                    sudokuInputs[xkp][(ykp+1)].focus();
        }

        bool = (reg.test(keychar) || (key == 46) || (key == 0) || (key == 8) || (key == 9) || (key == 37) || (key == 38) || (key == 39) || (key == 40));

        if((sudokuInputs[(xkp)][ykp].value.length > 0) && reg.test(keychar)) {
                    bool = false;
        }
	return bool;
}

function loadMatrix(a) {
	initSudokuArray();
	for (j50=0; j50<9; j50++) {
		for (i50=0; i50<9; i50++) {
			if(a[j50][i50] != 0) {
				sudokuInputs[i50][j50].value = a[j50][i50];
				sudokuInputs[i50][j50].disabled = true;
			} else {
				sudokuInputs[i50][j50].value = "";
				sudokuInputs[i50][j50].disabled = false
			}
			sudokuInputs[i50][j50].className = "";
		}
	}
	completeLevel();
}

function fixMatrix() {
	initSudokuArray();
	for (j50=0; j50<9; j50++) {
		for (i50=0; i50<9; i50++) {
			if(sudokuInputs[i50][j50].value != "") {
				sudokuInputs[i50][j50].disabled = true;
			} else {
				sudokuInputs[i50][j50].disabled = false
			}
			sudokuInputs[i50][j50].className = "";
		}
	}
	completeLevel();
}

function loadProblem(type) {
	//Ajax code to grab news and update DOM
	var url = 'php/sudoku2.php';
	var pars = 'mode=load&level=' + type;
	var myAjax = new Ajax.Request( url, { method: 'get', parameters: pars, onComplete: loadProblemComplete });
}

function loadProblemComplete(originalRequest) {
	var response = originalRequest.responseText;
	//alert(response);
	var responsearray = response.split(";");

	var a = [[0,0,0,0,0,0,0,0,0],
	         [0,0,0,0,0,0,0,0,0],
	         [0,0,0,0,0,0,0,0,0],
	         [0,0,0,0,0,0,0,0,0],
	         [0,0,0,0,0,0,0,0,0],
	         [0,0,0,0,0,0,0,0,0],
	         [0,0,0,0,0,0,0,0,0],
	         [0,0,0,0,0,0,0,0,0],
	         [0,0,0,0,0,0,0,0,0]];
	         
	for(k = 0; k < 81; k++) {
                //alert("a["+k/9+"]["+k%9+"]");
		a[Math.floor(k/9)][k%9] = responsearray[k];
	}

	loadMatrix(a);
}

function resetProblem() {
	
	completedbool = false;	

	var a = [[0,0,0,0,0,0,0,0,0],
	         [0,0,0,0,0,0,0,0,0],
	         [0,0,0,0,0,0,0,0,0],
	         [0,0,0,0,0,0,0,0,0],
	         [0,0,0,0,0,0,0,0,0],
	         [0,0,0,0,0,0,0,0,0],
	         [0,0,0,0,0,0,0,0,0],
	         [0,0,0,0,0,0,0,0,0],
	         [0,0,0,0,0,0,0,0,0]];

	loadMatrix(a);


}


var overallx;
var overally;

function checkCell(x1, y1) {

	overallx = x1;
	overally = y1;

	boxx = x1-(x1%3);
	boxy = y1-(y1%3);

	unmarkRowError(y1);
	unmarkColumnError(x1);
	unmarkBoxError(boxx, boxy);
	unmarkComplete(boxx, boxy);

	error = 0;

	if(checkRow(y1)) {
		//alert("true");
		error = 1;
		markRowError(y1);
	}

	if(checkColumn(x1)) {	
		//alert("true");
		error = 1;
		markColumnError(x1);
	}

	if(checkBox(boxx, boxy)) {
		//alert("true");
		error = 1;
		markBoxError(boxx, boxy);
	}

	if(error == 0) {
		completeLevel();
	}
	
}

function completeLevel() {

	var entered = 0;
	var max = 81;

	for (i2=0; i2<9; i2++) {
		for (j1=0; j1<9; j1++) {
			if(sudokuInputs[i2][j1].value != "") {
				entered++;
			}
		}
	}

	for (i2=0; i2<9; i2++) {
		completerow = 0;
		for (j1=0; j1<9; j1++) {
			if(sudokuInputs[j1][i2].value != "") {
				completerow++;
			}
		}
		if(completerow == 9) {
			markRowComplete(i2);
		}
	}

	for (i2=0; i2<9; i2++) {
		completecolumn = 0;
		for (j1=0; j1<9; j1++) {
			if(sudokuInputs[i2][j1].value != "") {
				completecolumn++; 
			}
		}
		if (completecolumn == 9) {
			markColumnComplete(i2);
		}
	}



        boxx=0;
        boxy=0;
	for (iboxx=0; iboxx<3; iboxx++) {
               boxx=(3*iboxx);
	       for (iboxy=0; iboxy<3; iboxy++) {
                   boxy=(3*iboxy);
                   completebox = 0;
                   //alert(boxx+"-"+boxy);
                   for (i2=boxx; i2<(boxx+3); i2++) {
                       for (j1=boxy; j1<(boxy+3); j1++) {
                           if(sudokuInputs[i2][j1].value != "") {
                       	        completebox++;
                           }
                       }
                   }
                   if (completebox == 9) {
                       	markBoxComplete(boxx, boxy);
                   }
               }
        }


        completepercent = Math.round(((entered+0.01)/max)*100);
        document.getElementById("complete").innerHTML = completepercent + "% complete.";
        if(completepercent == 100) {
                doCompleteAnimation();
                $('autofillcheckbox').checked = false;
        }

        $("completebar").setAttribute("style", "width:"+completepercent+"%;");
	
}

function doSuggestions(x60,y60) {
	var url = 'php/sudoku2.php';
	var pars = 'mode=suggest&sudokustring='+sudokuMatrixAsString()+'&row='+y60+'&column='+x60;
	var target = 'ajaxsuggestions';
	var myAjax = new Ajax.Updater(target, url, {	method: 'get',	parameters: pars});
}

function nextSteps() {
	var url = 'php/sudoku2.php';
	var pars = 'mode=nextsteps&sudokustring='+sudokuMatrixAsString();
	var myAjax = new Ajax.Request( url, { method: 'get', parameters: pars, onComplete: showNextSteps });
}

function showNextSteps(originalRequest) {
	var response = originalRequest.responseText;
	var responsearray = response.split(";");
	for (i=0; i<responsearray.length; ++i) {
		document.getElementById("s"+responsearray[i]).className = "inputsuggest";
	}
}

function sudokuMatrixAsString() {
	var str ="";
	for (j99=0; j99<9; j99++) {
		for (i99=0; i99<9; i99++) {
			value = (sudokuInputs[i99][j99].value == "")?"0":sudokuInputs[i99][j99].value;
			str += value + ";";
		}
	}
	return str.substring(0,str.length-1);
}

function unmarkComplete(boxx2,boxy2) {
	for (i40=boxx2; i40<(boxx2+3); i40++) {
		for (j40=boxy2; j40<(boxy2+3); j40++) {
                      if(sudokuInputs[boxx2][boxy2].className == "inputcomplete") {
			sudokuInputs[boxx2][boxy2].className = "";
			                   }
		}
	}
}

function markBoxComplete(x2) {
	for (i40=boxx; i40<(boxx+3); i40++) {
		for (j40=boxy; j40<(boxy+3); j40++) {
			if(sudokuInputs[i40][j40].value != "") {
				sudokuInputs[i40][j40].className = "inputcomplete";
			}
		}
	}
}

function markColumnComplete(x2) {
	for(i4=0; i4<9; i4++) {
		sudokuInputs[x2][i4].className = "inputcomplete";
	}
}

function markRowComplete(y2) {
	for(i4=0; i4<9; i4++) {
		sudokuInputs[i4][y2].className = "inputcomplete";
	}
}
function markColumnError(x2) {
	for(i4=0; i4<9; i4++) {
		if(sudokuInputs[x2][i4].className != "inputcomplete") {
			sudokuInputs[x2][i4].className = "inputerror";
		}
	}
}

function unmarkColumnError(x3) {
	for(i5=0; i5<9; i5++) {
		if(sudokuInputs[x3][i5].className == "inputerror") {
			sudokuInputs[x3][i5].className = "";
		}
	}
}

function markRowError(y2) {
	for(i6=0; i6<9; i6++) {
		if(sudokuInputs[i6][y2].className != "inputcomplete") {
			sudokuInputs[i6][y2].className = "inputerror";
		}
	}
}

function unmarkRowError(y3) {
	for(i7=0; i7<9; i7++) {
		if(sudokuInputs[i7][y3].className == "inputerror") {
			sudokuInputs[i7][y3].className = "";
		}
	}
}

function markBoxError(xno, yno) {
	for(i30=xno; i30<(xno+3); i30++) {
		for(j30=yno; j30<(yno+3); j30++) {
			if(sudokuInputs[i30][j30].className != "inputcomplete") {
				sudokuInputs[i30][j30].className = "inputerror";
			}
		}
	}
}

function unmarkBoxError(xno, yno) {
	for(i6=xno; i6<(xno+3); i6++) {
		for(j6=yno; j6<(yno+3); j6++) {
			if(sudokuInputs[i6][j6].className == "inputerror") {
				sudokuInputs[i6][j6].className = "";
			}
		}
	}
}

function checkRow(y4) {
	var bool = false;
	for(i8=0; i8<9; i8++) {
		now = sudokuInputs[i8][y4].value;
		//sudokuInputs[i8][y4].value = "a";
		//alert("number:"+now);
		if(isInRow(y4, now) > 1) {
			// alert("found!");
			bool = true;
		} else {
			// alert(now + " not found.");
		}
	}
	return bool;
}

function checkColumn(x4) {
	var bool = false;
	for(i9=0; i9<9; i9++) {
		now = sudokuInputs[x4][i9].value;
		//sudokuInputs[x][o].value = "a";
		//alert("number:"+now);
		if(isInColumn(x4, now) > 1) {
			// alert("found!");
			bool = true;
		}
	}
	return bool;
}

function checkBox(xno,yno) {
	var bool = false;
	//alert(xno + "-" + yno);

	loop1start = xno;
	loop1end = xno+3;
	loop2start = yno;
	loop2end = yno+3
	
	for(i20=loop1start; i20<loop1end; i20++) {
		for(j20=loop2start; j20<loop2end; j20++) {
			now = sudokuInputs[i20][j20].value;
			if(isIn(xno, (xno+2), yno, (yno+2), now) > 1) {
				// alert("found!");
				bool = true;
			}
		}
	}

	return bool;
}


function isInRow(y5, number) {
	return isIn(0, 8, y5, y5, number);
}

function isInColumn(x5, number) {
	return isIn(x5, x5, 0, 8, number);
}

function isIn(xl, xh, yl, yh, number) {

	if(number == "") {
		return false;
	}

	var count = 0;

	for(i10=xl; i10<=xh; i10++) {
		for(j5=yl; j5<=yh; j5++) {
			if(sudokuInputs[i10][j5].value == number) {
				//alert("number:"+number+" found at "+i10+"-"+j5+".");
				count++;
			}
		}
	}

	return count;

	/*if (count>1) {
		return true;
	} else {
		return false;
	}*/

}

