/* iface.js
 *
 * Handles the interface of the sudoku board.
 *
 */

//Movement
var curx = 5;
var cury = 5;
function moveSqAbs(r,c) {
	$(".active").removeClass("active");
	cury = r;
	curx = c;
	if(curx > 9) curx = 9;
	if(cury > 9) cury = 9;
	if(curx < 1) curx = 1;
	if(cury < 1) cury = 1;
	$("td",$("#board tr").eq(cury-1)).eq(curx-1).addClass("active");
}
function moveSqRel(r,c) {
	moveSqAbs(cury+r,curx+c);
}

//Value modification
function checkBoard(r,c,checkSiblings) {
	var r1 = r-1;
	var c1 = c-1;
	//var sq2Check = new Array();
	// Positions are 0 based in this function.
	var cell1 = $("td",$("#board tr").eq(r1)).eq(c1);
	cell1.removeClass("err");
	for(var r2 = 0; r2 < 9; r2++) {
		if(r2 == r1) continue;
		cell2 = $("td",$("#board tr").eq(r2)).eq(c1)
		if($(cell2).text() == "") continue;
		if($(cell1).text() == $(cell2).text()) {
			$(cell1).addClass("err");
			$(cell2).addClass("err");
		} else if(checkSiblings && $(cell2).hasClass("err")) {
			checkBoard(r2+1,c,false);
		}
	}
	for(var c2 = 0; c2 < 9; c2++) {
		if(c2 == c1) continue;
		cell2 = $("td",$("#board tr").eq(r1)).eq(c2)
		if($(cell2).text() == "") continue;
		if($(cell1).text() == $(cell2).text()) {
			$(cell1).addClass("err");
			$(cell2).addClass("err");
		} else if(checkSiblings && $(cell2).hasClass("err")) {
			checkBoard(r,c2+1,false);
		}
	}
	for(var r2 = r1-r1%3; r2 <= r1-r1%3+2; r2++) {
		if(r1 == r2) continue;
		for(var c2 = c1-c1%3; c2 <= c1-c1%3+2; c2++) {
			if(c1 == c2) continue;
			cell2 = $("td",$("#board tr").eq(r2)).eq(c2)
			if($(cell2).text() == "") continue;
			if($(cell1).text() == $(cell2).text()) {
				$(cell1).addClass("err");
				$(cell2).addClass("err");
			} else if(checkSiblings && $(cell2).hasClass("err")) {
				checkBoard(r2+1,c2+1,false);
			}
		}
	}
	return;
}
function setVal(r,c,val) {
	cell = $("td",$("#board tr").eq(r-1)).eq(c-1)
	if(!$(cell).hasClass("locked"))
		$("td",$("#board tr").eq(r-1)).eq(c-1).text(val)
		checkBoard(r,c,true);
}

//Key detection
document.onkeydown = keyDetect
function keyDetect(e) {
	var evtobj=window.event? event : e
	var cd=evtobj.charCode? evtobj.charCode : evtobj.keyCode
	if(cd >= 49 && cd <= 57) {
		setVal(cury,curx,cd-48);
	} else if(cd == 48 || cd == 8 || cd == 46) {
		setVal(cury,curx,"");
		return false;
	} else if(cd == 37) { // Left
		moveSqRel(0,-1);
	} else if(cd == 38) { // Up
		moveSqRel(-1,0);
	} else if(cd == 39) { // Right
		moveSqRel(0,1);
	} else if(cd == 40) { // Down
		moveSqRel(1,0);
	}
}