var Board, S, TilePlacers = [];
var L = ["Winner",9,9,9,5,6,5,4,3,3,2];

function win() {
	if (L.length==1) alert(L.pop());
	if (L.length) buildBoard(document.getElementById("board"),L.pop(),L.pop());
}

function buildBoard(b,x,y) {
	S = {x:x,y:y,n:x*y};
	Board = new Array(x);
	var tb = document.createElement("tbody");
	for (var i=0; i<x; i++) {
		Board[i] = new Array(y);
		tb.appendChild(document.createElement("tr"));
		for (var j=0; j<y; j++)
			tb.lastChild.appendChild(makeSquare(i,j));
	}
	b.replaceChild(tb, b.firstChild);
}
function makeSquare(x,y) {
	var td = document.createElement("td");
	Board[x][y] = {cell:td, state:1};
	td.x = x;	td.y = y;
	td.onclick = regTilePlacers;
	return td;
}

function regTilePlacers() {
	var x = this.x, y = this.y;
	cancelTilePlacers();
	var a = x>0 && y>0         && Board[x-1][y].state && Board[x][y-1].state;
	var b = x>0 && y<S.y-1     && Board[x-1][y].state && Board[x][y+1].state;
	var c = x<S.x-1 && y>0     && Board[x+1][y].state && Board[x][y-1].state;
	var d = x<S.x-1 && y<S.y-1 && Board[x+1][y].state && Board[x][y+1].state;
	switch (a+b+c+d) {
		case 0: return;
		case 1: var f = placeTile; break;
		default:
			var f = regGhostTile;
			TilePlacers.push(x,y);
			Board[x][y].cell.onclick = cancelTilePlacers;
	}
	if (a) f(x,y,-1,-1,0);
	if (b) f(x,y,-1, 1,0);
	if (c) f(x,y, 1,-1,0);
	if (d) f(x,y, 1, 1,0);
}

function drawTile(x,y,dx,dy,c) {
	Board[x][y].cell.className    = c?[c, dx+1?"n":"s", dy+1?"w":"e"].join(" "):"";
	Board[x+dx][y].cell.className = c?[c, dx+1?"s":"n"              ].join(" "):"";
	Board[x][y+dy].cell.className = c?[c,               dy+1?"e":"w"].join(" "):"";
}

function regGhostTile(x,y,dx,dy) {
	var c = Board[x+dx][y+dy].cell;
	c.onmouseover = function(){ drawTile(x,y,dx,dy,"g"); };
	c.onmouseout  = function(){ drawTile(x,y,dx,dy, 0 ); };
	c.onclick     = function(){ placeTile(x,y,dx,dy,0); };
	c.className  += " p";
	TilePlacers.push(x+dx, y+dy);
}

function placeTile(x,y,dx,dy,b) {
	cancelTilePlacers();
	Board[x][y].state = Board[x+dx][y].state = Board[x][y+dy].state = b;
	Board[x][y].tile  = Board[x+dx][y].tile  = Board[x][y+dy].tile  = b ? [] : [x,y,dx,dy];
	Board[x][y].cell.onclick = Board[x+dx][y].cell.onclick = Board[x][y+dy].cell.onclick =
		b ? regTilePlacers : removeTile;
	drawTile(x,y,dx,dy,b?0:"x");
	if (S.n-=3-6*b) return; win();
}

function cancelTilePlacers() {
	while (TilePlacers.length) {
		var y = TilePlacers.pop();
		var x = TilePlacers.pop();
		var c = Board[x][y].cell;
		c.onclick    = Board[x][y].state ? regTilePlacers : removeTile;
		c.onmouseout = c.onmouseover = null;
		c.className  = c.className.replace(/ ?p/, "");
	}
}

function removeTile() {
	var t = Board[this.x][this.y].tile;
	placeTile(t[0],t[1],t[2],t[3],1);
}
