/***********************************************************/
/* X in a Row made by Bjarne Fich                          */
/* www.rednebula.com                                       */
/***********************************************************/
/* Start game with:                                        */
/*  makeXRowGame(rows, sizex, sizey)                       */
/* Ex:                                                     */
/*  makeXRowGame(5,21,17);                                 */
/***********************************************************/

var xRowGridId = 0;
var xRowRGridId = 0;
var xRowBGridId = 0;
var xRowSizeX = 0;
var xRowSizeY = 0;
var xRowSize = 0;
var xRowTurn = "blue";


function makeXRowGame(rows, sizex, sizey) {
	document.write("<table cellpadding='0' cellspacing='1' border='0'><tr><td>");
	xRowRGridId = makeGrid(sizex, sizey, 0);
	xRowBGridId = makeGrid(sizex, sizey, 0);
	xRowGridId = makeGrid(sizex, sizey, "#808080");
	setGrid(xRowGridId, Math.round((sizex-1)/2), Math.round((sizey-1)/2), "#ff0000");
	drawGrid(xRowGridId, 20, "xRowClick");
	updateGrid(xRowGridId);
	xRowSizeX = sizex;
	xRowSizeY = sizey;
	xRowSize = rows;
	document.write("</td></tr></table>");
}


function xRowClick(x,y) {
	if (xRowTurn=="bluewin") {
		alert("Game over - you won.");
	} else if (xRowTurn=="redwin") {
		alert("Game over - you lost.");
	} else if (xRowTurn=="tie") {
		alert("Game over - tie, no combinations left.");
	} else if (xRowTurn!="blue") {
		alert("Not your turn yet.");
	} else {
		if (getGrid(xRowGridId, x, y) != "#808080") {
			alert("Can't click there.");
		} else {
			setGrid(xRowGridId, x, y, "#0000ff");
			updateGrid(xRowGridId);
			xRowTurn = "red";
			xRowTestWin();
			if (xRowTurn == "red") xRowRedTurn();
		}
	}
}

function xRowRedTurn() {
	// Constants. Defines the value if a row contains X marks. (Zero = 1)
	var ScoreValues = new Array(1, 10, 100, 1000, 10000);
	for (var i=0, v=1; i<=xRowSize; i++, v*=10) ScoreValues[i] = v; 
	for (var x=0; x<xRowSizeX; x++)
		for (var y=0; y<xRowSizeY; y++) {
			setGrid(xRowRGridId, x, y, 0);
			setGrid(xRowBGridId, x, y, 0);
		}
	// Add all down-right diagonals to score
	for (var x=0; x<=xRowSizeX-xRowSize; x++)
		for (var y=0; y<=xRowSizeY-xRowSize; y++) {
			var r = 0;
			var b = 0;
			for (var t=0; t<xRowSize; t++) {
				if (getGrid(xRowGridId, x+t, y+t) == "#ff0000") { b=-xRowSize-1; r+=1 }
				if (getGrid(xRowGridId, x+t, y+t) == "#0000ff") { r=-xRowSize-1; b+=1 }
			}
			for (var t=0; t<xRowSize; t++) {
				if (r>=0) setGrid(xRowRGridId, x+t, y+t, ScoreValues[r] + getGrid(xRowRGridId, x+t, y+t));
				if (b>=0) setGrid(xRowBGridId, x+t, y+t, ScoreValues[b] + getGrid(xRowBGridId, x+t, y+t));
			}
		}
	// Add all down-left diagonals to score
	for (var x=xRowSize-1; x<xRowSizeX; x++)
		for (var y=0; y<=xRowSizeY-xRowSize; y++) {
			var r = 0;
			var b = 0;
			for (var t=0; t<xRowSize; t++) {
				if (getGrid(xRowGridId, x-t, y+t) == "#ff0000") { b=-xRowSize-1; r+=1 }
				if (getGrid(xRowGridId, x-t, y+t) == "#0000ff") { r=-xRowSize-1; b+=1 }
			}
			for (var t=0; t<xRowSize; t++) {
				if (r>=0) setGrid(xRowRGridId, x-t, y+t, ScoreValues[r] + getGrid(xRowRGridId, x-t, y+t));
				if (b>=0) setGrid(xRowBGridId, x-t, y+t, ScoreValues[b] + getGrid(xRowBGridId, x-t, y+t));
			}
		}
	// Add all verticals to score
	for (var x=0; x<xRowSizeX; x++)
		for (var y=0; y<=xRowSizeY-xRowSize; y++) {
			var r = 0;
			var b = 0;
			for (var t=0; t<xRowSize; t++) {
				if (getGrid(xRowGridId, x, y+t) == "#ff0000") { b=-xRowSize-1; r+=1 }
				if (getGrid(xRowGridId, x, y+t) == "#0000ff") { r=-xRowSize-1; b+=1 }
			}
			for (var t=0; t<xRowSize; t++) {
				if (r>=0) setGrid(xRowRGridId, x, y+t, ScoreValues[r] + getGrid(xRowRGridId, x, y+t));
				if (b>=0) setGrid(xRowBGridId, x, y+t, ScoreValues[b] + getGrid(xRowBGridId, x, y+t));
			}
		}
	// Add all horizontals to score
	for (var x=0; x<=xRowSizeX-xRowSize; x++)
		for (var y=0; y<xRowSizeY; y++) {
			var r = 0;
			var b = 0;
			for (var t=0; t<xRowSize; t++) {
				if (getGrid(xRowGridId, x+t, y) == "#ff0000") { b=-xRowSize-1; r+=1 }
				if (getGrid(xRowGridId, x+t, y) == "#0000ff") { r=-xRowSize-1; b+=1 }
			}
			for (var t=0; t<xRowSize; t++) {
				if (r>=0) setGrid(xRowRGridId, x+t, y, ScoreValues[r] + getGrid(xRowRGridId, x+t, y));
				if (b>=0) setGrid(xRowBGridId, x+t, y, ScoreValues[b] + getGrid(xRowBGridId, x+t, y));
			}
		}

	var xx=0;
	var yy=0;
	var vv=0;
	for (var x=0; x<xRowSizeX; x++)
		for (var y=0; y<xRowSizeY; y++)
			if (getGrid(xRowGridId, x, y) == "#808080")
				if (getGrid(xRowRGridId, x, y) + getGrid(xRowBGridId, x, y) > vv) {
					vv = getGrid(xRowRGridId, x, y) + getGrid(xRowBGridId, x, y);
					xx = x;
					yy = y;
				}

	/*
	// DEBUG DATA BEGIN
	document.calculator.Detail.value = "";
	for (var y=0; y<xRowSizeY; y++) {
		for (var x=0; x<xRowSizeX; x++) {
			if (getGrid(xRowGridId, x, y)!="#808080") {
				if (getGrid(xRowGridId, x, y)=="#ff0000") document.calculator.Detail.value += ',<R>';
				if (getGrid(xRowGridId, x, y)=="#0000ff") document.calculator.Detail.value += ',<B>';
			} else {
				var val = getGrid(xRowBGridId, x, y);
				if (val<10) { val = '  ' + val; }
				else if (val<100) { val = ' ' + val; }
				document.calculator.Detail.value += ',' + val;
			}
		}
		document.calculator.Detail.value += '\n';
	}
	document.calculator.Detail.value += '------------------\n';
	for (var y=0; y<xRowSizeY; y++) {
		for (var x=0; x<xRowSizeX; x++) {
			if (getGrid(xRowGridId, x, y)!="#808080") {
				if (getGrid(xRowGridId, x, y)=="#ff0000") document.calculator.Detail.value += ',<R>';
				if (getGrid(xRowGridId, x, y)=="#0000ff") document.calculator.Detail.value += ',<B>';
			} else {
				var val = getGrid(xRowRGridId, x, y);
				if (val<10) { val = '  ' + val; }
				else if (val<100) { val = ' ' + val; }
				document.calculator.Detail.value += ',' + val;
			}
		}
		document.calculator.Detail.value += '\n';
	}
	// DEBUG DATA END
	*/


	setGrid(xRowGridId, xx, yy, "#ff0000");
	updateGrid(xRowGridId);
	xRowTurn = "blue";
	xRowTestWin();
}

function xRowTestWin() {
	var tie = 0;
	// Test down-right diagonal
	for (var x=0; x<=xRowSizeX-xRowSize; x++)
		for (var y=0; y<=xRowSizeY-xRowSize; y++) {
			var r = 0;
			var b = 0;
			for (var t=0; t<xRowSize; t++) {
				if (getGrid(xRowGridId, x+t, y+t) == "#ff0000") { b=-xRowSize-1; r+=1 }
				if (getGrid(xRowGridId, x+t, y+t) == "#0000ff") { r=-xRowSize-1; b+=1 }
			}
			if (r==5) {
				xRowTurn = "redwin"; 
				for (var t=0; t<xRowSize; t++) setGrid(xRowGridId, x+t, y+t, "#800000");
			}
			if (b==5) {
				xRowTurn = "bluewin"; 
				for (var t=0; t<xRowSize; t++) setGrid(xRowGridId, x+t, y+t, "#000080");
			}
			if ((r>=0) || (b>=0)) tie=1;
		}
	// Test down-left diagonal
	for (var x=xRowSize-1; x<=xRowSizeX; x++)
		for (var y=0; y<=xRowSizeY-xRowSize; y++) {
			var r = 0;
			var b = 0;
			for (var t=0; t<xRowSize; t++) {
				if (getGrid(xRowGridId, x-t, y+t) == "#ff0000") { b=-xRowSize-1; r+=1 }
				if (getGrid(xRowGridId, x-t, y+t) == "#0000ff") { r=-xRowSize-1; b+=1 }
			}
			if (r==5) {
				xRowTurn = "redwin"; 
				for (var t=0; t<xRowSize; t++) setGrid(xRowGridId, x-t, y+t, "#800000");
			}
			if (b==5) {
				xRowTurn = "bluewin"; 
				for (var t=0; t<xRowSize; t++) setGrid(xRowGridId, x-t, y+t, "#000080");
			}
			if ((r>=0) || (b>=0)) tie=1;
		}
	// Test vertical
	for (var x=0; x<=xRowSizeX; x++)
		for (var y=0; y<=xRowSizeY-xRowSize; y++) {
			var r = 0;
			var b = 0;
			for (var t=0; t<xRowSize; t++) {
				if (getGrid(xRowGridId, x, y+t) == "#ff0000") { b=-xRowSize-1; r+=1 }
				if (getGrid(xRowGridId, x, y+t) == "#0000ff") { r=-xRowSize-1; b+=1 }
			}
			if (r==5) {
				xRowTurn = "redwin"; 
				for (var t=0; t<xRowSize; t++) setGrid(xRowGridId, x, y+t, "#800000");
			}
			if (b==5) {
				xRowTurn = "bluewin"; 
				for (var t=0; t<xRowSize; t++) setGrid(xRowGridId, x, y+t, "#000080");
			}
			if ((r>=0) || (b>=0)) tie=1;
		}
	// Test horizontal
	for (var x=0; x<=xRowSizeX-xRowSize; x++)
		for (var y=0; y<=xRowSizeY; y++) {
			var r = 0;
			var b = 0;
			for (var t=0; t<xRowSize; t++) {
				if (getGrid(xRowGridId, x+t, y) == "#ff0000") { b=-xRowSize-1; r+=1 }
				if (getGrid(xRowGridId, x+t, y) == "#0000ff") { r=-xRowSize-1; b+=1 }
			}
			if (r==5) {
				xRowTurn = "redwin"; 
				for (var t=0; t<xRowSize; t++) setGrid(xRowGridId, x+t, y, "#800000");
			}
			if (b==5) {
				xRowTurn = "bluewin"; 
				for (var t=0; t<xRowSize; t++) setGrid(xRowGridId, x+t, y, "#000080");
			}
			if ((r>=0) || (b>=0)) tie=1;
		}

	if (tie==0) xRowTurn = "tie"; 
	updateGrid(xRowGridId);
}
