var selected = -1;
var tracker = false;
var warn = false;
var digct = 27;
var remain = 27;
var moves = 0;
var trs = new Array(3);
var tds = new Array(27);
var digs = new Array(1,2,3,4,5,6,7,8,9,1,1,1,2,1,3,1,4,1,5,1,6,1,7,1,8,1,9);
var undo = new Array();
var undoct = 0;
var histarr = new Array();
var histct = 0;
var hintson = false;
var tbody;

var req;
function recordScore() {
	if (window.XMLHttpRequest) {
		req = new XMLHttpRequest();
	} else if (window.ActiveXObject) {
		req = new ActiveXObject("Microsoft.XMLHTTP");
	}
	if (req) {
		var poststr = histarr[0];
		for (var i = 1; i < histct; i++)
			poststr += '-' + histarr[i];
		req.onreadystatechange = processReqChange;
		req.open("POST", "/tenpair/submit.php", true);
		req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		req.send('s='+moves + '&h='+poststr);
	}
}			

function processReqChange() {
}

// create the table with all the tenpair cells
function initTenPairGrid() {
	var mydiv = document.getElementById('contain');
	var tbl = document.createElement('table');
	tbody = document.createElement('tbody');
	for (var i = 0; i < 3; i++) {
		trs[i] = document.createElement('tr');
		trs[i].id = "r" + i;
		for (var j = 0; j < 9; j++) {
			var idx = i*9+j;
			tds[idx] = document.createElement('td');
			tds[idx].style.border = "1px solid black";
			tds[idx].style.fontSize = "24pt";
			tds[idx].style.width = "1.5em";
			tds[idx].style.height = "1.5em";
			tds[idx].style.backgroundColor = '#FFFFFF';
			tds[idx].id = "c" + idx;
			tds[idx].onmouseover = mouseOver;
			tds[idx].onmouseout = mouseOut;
			tds[idx].onclick = mouseClick;
			tds[idx].innerHTML = digs[idx];
			trs[i].appendChild(tds[idx]);
		}
		tbody.appendChild(trs[i]);
	}
	tbl.appendChild(tbody);
	mydiv.appendChild(tbl);
}

// draw and erase the tracker
function drawTracker(idx) {
}
function eraseTracker(idx) {
}

function checkMoveAvail() {
	var i, j = 0;
	for (i = 1; i < digct; i++) if (digs[i] >= 0) {
		if (digs[i] == digs[j] || digs[i]+digs[j] == 10)
			return true;
		j = i;
	}
	for (i = 0; i < 9; i++) {
		j = i;
		for (var k = i+9; k < digct; k += 9) if (digs[k] >= 0) {
			if (digs[k] == digs[j] || digs[k]+digs[j] == 10)
				return true;
			j = k;
		}
	}
	return false;
}

function checkPair(a, b) {
	var i, j;
	if (a > b) { i = b; b = a; a = i; }
	if (a%9 == b%9) {
		for (i = a+9; i < b; i += 9) if (digs[i] > 0) break;
		if (i == b) return true;
	}
	for (i = a+1; i < b; i++) if (digs[i] > 0) break;
	return (i == b);
}

function showHints() {
	var i, j = 0;
	for (i = 1; i < digct; i++) if (digs[i] >= 0) {
		if (digs[i] == digs[j] || digs[i]+digs[j] == 10) {
			tds[i].style.color = '#0000FF';
			tds[j].style.color = '#0000FF';
		}
		j = i;
	}
	for (i = 0; i < 9; i++) {
		j = i;
		for (var k = i+9; k < digct; k += 9) if (digs[k] >= 0) {
			if (digs[k] == digs[j] || digs[k]+digs[j] == 10) {
				tds[k].style.color = '#0000FF';
				tds[j].style.color = '#0000FF';
			}
			j = k;
		}
	}
	hintson = true;
}

function clearHints() {
	for (var i = 0; i < digct; i++)
		tds[i].style.color = '#000000';
	hintson = false;
}

function setRemaining() {
	document.getElementById('digits').innerHTML = "Remaining: " + remain;
}

function setMoves() {
	document.getElementById('moves').innerHTML = "Moves: " + moves;
}

function compact() {
	var rn = 0, rm = 0;
	for (var i = 0; i < digct; i++) {
		if (rm > 0) {
			digs[i-rm] = digs[i];
			tds[i-rm].innerHTML = tds[i].innerHTML;
		}
		if (digs[i] <= 0) rn++;
		else rn = 0;
		if (rn == 9) {
			rm += 9;
			rn = 0;
		}
	}
	while (i%9) {
		tds[i-rm].innerHTML = '&nbsp;';
		i++;
	}
	if (rm > 0) {
		selected = -1;
		if (hintson) clearHints();
		undoct = 0;
		document.getElementById('undo').disabled = 'true';
	}
	i -= rm;
	while (i < digct) {
		tbody.removeChild(trs[i/9]);
		i += 9;
	}
	digct -= rm;

	histarr[histct++] = 'C';
}

function addRow(i) {
	trs[i] = document.createElement('tr');
	trs[i].id = "r" + i;
	for (var j = 0; j < 9; j++) {
		var idx = i*9+j;
		tds[idx] = document.createElement('td');
		tds[idx].style.border = "1px solid black";
		tds[idx].style.fontSize = "24pt";
		tds[idx].style.width = "1.5em";
		tds[idx].style.height = "1.5em";
		tds[idx].style.backgroundColor = '#FFFFFF';
		tds[idx].style.color = '#000000';
		tds[idx].id = "c" + idx;
		tds[idx].onmouseover = mouseOver;
		tds[idx].onmouseout = mouseOut;
		tds[idx].onclick = mouseClick;
		tds[idx].innerHTML = '&nbsp;';
		trs[i].appendChild(tds[idx]);
	}
	tbody.appendChild(trs[i]);
}

function setDigit(idx, d) {
	if (!(idx%9)) addRow(idx/9);
	digs[idx] = d;
	tds[idx].innerHTML = d;
}

function deal() {
	if (checkMoveAvail()) {
		if (!confirm("There is still a move available.\n" +
			"Deal anyway?"))
			return;
	}
	var mx = digct;
	for (var i = 0; i < mx; i++) if (digs[i] > 0) {
		setDigit(digct, digs[i]);
		digct++;
	}
	remain <<= 1;
	setRemaining();
	undoct = 0;
	document.getElementById('undo').disabled = 'true';
	histarr[histct++] = 'D';
}

function undomove() {
	if (undoct > 0) {
		var idx = undo[--undoct];
		digs[idx] = -digs[idx];
		tds[idx].innerHTML = digs[idx];
		idx = undo[--undoct];
		digs[idx] = -digs[idx];
		tds[idx].innerHTML = digs[idx];
		remain += 2;
		moves--;
		setRemaining();
		setMoves();
		if (hintson) clearHints();
		histct--;
	}
	if (undoct == 0) document.getElementById('undo').disabled = 'true';
}

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);
	if (tracker) {
		drawTracker(idx);
	} else {
		tds[idx].style.backgroundColor = '#CCCCCC';
	}
}

function mouseOut(e) {
	var idx = getEventId(e);
	if (tracker) {
		eraseTracker(idx);
	} else if (idx == selected) {
		tds[idx].style.backgroundColor = '#BBBBFF';
	} else {
		tds[idx].style.backgroundColor = '#FFFFFF';
	}
}

function mouseClick(e) {
	var idx = getEventId(e);
	if (idx >= digct) return;
	if (digs[idx] <= 0) return;
	if (selected == idx) {
		selected = -1;
	} else if (selected >= 0) {
		if (digs[selected] + digs[idx] != 10 && digs[selected] != digs[idx]) {
			if (warn) alert("Those two digits aren't the same and don't sum to 10!");
			return;
		}
		if (!checkPair(selected, idx)) {
			if (warn) alert("Those two digits aren't next to each other!");
			return;
		}
		digs[selected] = -digs[selected];
		digs[idx] = -digs[idx];
		undo[undoct++] = selected;
		undo[undoct++] = idx;
		document.getElementById('undo').disabled = false;
		tds[selected].innerHTML = "&nbsp;";
		tds[idx].innerHTML = "&nbsp;";
		remain -= 2;
		moves++;
		setMoves();
		setRemaining();
		tds[selected].style.backgroundColor = '#FFFFFF';
		if (hintson) clearHints();
		histarr[histct++] = selected + 'x' + idx;
		selected = -1;
		if (remain == 0) {
			undoct = 0;
			document.getElementById('undo').disabled = 'true';
			alert("Congratulations!");
			recordScore();
		}
	} else {
		tds[idx].style.backgroundColor = '#DDDDFF';
		selected = idx;
	}
}


