var curCell = -1;
var tracker = false;
var warnon = 1;
var celltds = new Array(81);
var celldivs = new Array(81);
var backColors = new Array(81);

function createTd(idx, l, t, r, b) {
	celltds[idx] = document.createElement('td');
	celltds[idx].id = "c" + idx;
	celltds[idx].style.fontSize = "24pt";
	celltds[idx].style.height = "1.5em";
	celltds[idx].style.width = "1.5em";
	celltds[idx].style.backgroundColor = "#FFFFFF";
	celltds[idx].style.border = "1px solid black";
	if (l) celltds[idx].style.borderLeftWidth = "4px";
	if (t) celltds[idx].style.borderTopWidth = "4px";
	if (r) celltds[idx].style.borderRightWidth = "4px";
	if (b) celltds[idx].style.borderBottomWidth = "4px";
	celltds[idx].onmouseover = mouseOver;
	celltds[idx].onmouseout = mouseOut;
	celltds[idx].onclick = mouseClick;

	celldivs[idx] = document.createElement('div');
	celldivs[idx].id = "d" + idx;
	celldivs[idx].style.textAlign = "center";

	if (puzzle.charAt(idx) == ' ') {
		celltds[idx].style.color = "#999999";
		if (curpuz.charAt(idx) == ' ')
			celldivs[idx].innerHTML = "&nbsp;";
		else
			celldivs[idx].innerHTML = curpuz.charAt(idx);
	} else {
		celldivs[idx].innerHTML = puzzle.charAt(idx);
		useRow(idx*9+parseInt(puzzle.charAt(idx))-1);
	}
	celltds[idx].appendChild(celldivs[idx]);
	backColors[idx] = "#FFFFFF";
}

// create the table with all the sudoku cells
function initSudokuGrid() {
	initBeforeGrid();

	var mydiv = document.getElementById('contain');
	var tbl = document.createElement('table');
	var tbody = document.createElement('tbody');

	for (var i = 0; i < 9; i++) {
		var newtr = document.createElement('tr');
		for (var j = 0; j < 9; j++) {
			createTd(i*9+j, j%3 == 0, i%3 == 0, j%3 == 2, i%3 == 2);
			newtr.appendChild(celltds[i*9+j]);
		}
		tbody.appendChild(newtr);
	}
	tbl.appendChild(tbody);
	mydiv.appendChild(tbl);

	initAfterGrid();
}

// draw and erase the tracker
function drawTracker(idx) {
	var cidx, ridx, bidx;
	
	cidx = idx%9;
	ridx = (idx-cidx)/9;
	bidx = idx - (idx % 3) - (ridx%3)*9;
	var bidx9 = (bidx-(bidx%9))/9;
	
	for (var i = 0; i < 9; i++) {
		for (var j = 0; j < 9; j++) {
			if (bidx%9 <= i && (bidx%9)+2 >= i &&
				bidx9 <= j && (bidx9)+2 >= j) {
				if (i == cidx) {
					if (j == ridx) {
						celltds[j*9+i].style.backgroundColor = '#DDDDDD';
					} else {
						celltds[j*9+i].style.backgroundColor = '#DDDDBB';
					}
				} else if (j == ridx) {
					celltds[j*9+i].style.backgroundColor = '#DDBBDD';
				} else {
					celltds[j*9+i].style.backgroundColor = '#FFBBBB';
				}
			} else if (i == cidx) {
				celltds[j*9+i].style.backgroundColor = '#BBFFBB';
			} else if (j == ridx) {
				celltds[j*9+i].style.backgroundColor = '#BBBBFF';
			}
		}
	}
}

function eraseTracker(idx) {
	var cidx, ridx, bidx;
	
	cidx = idx%9;
	ridx = (idx-cidx)/9;
	bidx = idx - (idx % 3) - (ridx%3)*9;
	for (var i = 0; i < 9; i++) {
		celltds[cidx+9*i].style.backgroundColor =
			backColors[cidx+9*i];
		celltds[ridx*9+i].style.backgroundColor =
			backColors[ridx*9+i];
		celltds[bidx+(i%3)+((i-(i%3))/3)*9].style.backgroundColor =
			backColors[bidx+(i%3)+((i-(i%3))/3)*9];
	}
}

function getEventId(e) {
	var targ;
	if (!e) var e = window.event;
	if (e.target) targ = e.target;
	else if (e.srcElement) targ = e.srcElement;
	if (targ.nodeType == 3) targ = targ.parentNode;
	return parseInt(targ.id.substring(1));
}

function mouseOver(e) {
	var idx = getEventId(e);
	curCell = idx;
	if (tracker) {
		drawTracker(idx);
	} else {
		celltds[idx].style.backgroundColor = '#DDDDDD';
	}
}

function mouseOut(e) {
	var idx = getEventId(e);
	curCell = -1;
	if (tracker) {
		eraseTracker(idx);
	} else {
		celltds[idx].style.backgroundColor = backColors[idx];
	}
}


