/*** Utility fuctions to handle grids and arrays ***/

/*
Handles a grid of small colored squares
function makeGrid(sizeX, sizeY, defaultValue, type);
- initializes a grid, and returns the gridId!
- type 0=Collor map (default), 1=Numbers/Text, 2=Color & Text (use "#fffffftext...") - ie. 7 chars color info
function drawGrid(gridId, size, clickFunction);
- draw the grid (writes the html). The clickfunction is a name to script function thet will recieve clicks with x,y - size is the size of each grid square
function updateGrid(gridId);
- update (redraw all grid squares)
function setGrid(gridId, posx, posy, val);
- set the value into the grid, for grids to be drawn, use a color
function getGrid(gridId, posx, posy);
- returns the grid value
*/

function getId(element) { // return object reference
	if (document.layers) {
		if (document.layers[element]) {
			return document.layers [ element ];
		} else {
			var i=0;
			while (i < document.layers.length) {
				if (document.layers[i].document.layers[element]) {
					return document.layers[i].document.layers[element];
					break;
				}
				i++;
			}
		}
	} else if (document.all) {
		return document.all[element];
	} else {
		return document.getElementById(element);
	}
}

var gridData = new Array();
var gridHeaderSize = 4;
// Format: gridId, sizeX, sizeY, type, val1, val2, val3, ... valN

function findGridEntry(gridId) {
	var pos = 0;
	while ((pos<gridData.length) && (gridData[pos]!=gridId))
		pos += gridHeaderSize + gridData[pos+1] * gridData[pos+2];
	return pos;
}

function makeGrid(sizeX, sizeY, defaultValue, type) {
	// Allocate a new grid
	var pos = 0;
	var gridId = 1;	
	while (pos<gridData.length) {
		if (gridData[pos] >= gridId) gridId = gridData[pos] + 1;
		pos += gridHeaderSize + gridData[pos+1] * gridData[pos+2];
	}
	gridData[pos+0] = gridId;
	gridData[pos+1] = sizeX;
	gridData[pos+2] = sizeY;
	gridData[pos+3] = type;
	for (var x=0; x<sizeX; x++)
		for (var y=0; y<sizeY; y++)
			gridData[pos+x+y*sizeX+gridHeaderSize] = defaultValue;
	return gridId;
}

function drawGrid(gridId, size, clickFunction) {
	var pos = findGridEntry(gridId);
	var sizeX = gridData[pos+1];
	var sizeY = gridData[pos+2];
	var sty = "style='background-color:#808080;border:1px;font-size:xx-small;height:"+size+"px;width:"+size+"px;'";
	document.write("<table cellpadding='0' cellspacing='1'>");
	for (var y=0; y<sizeY; y++) {
		document.write("<tr>");
		for (var x=0; x<sizeX; x++) {
			document.write("<td><center><div id='gameGrid_"+gridId+"_"+x+"_"+y+"' "+sty+" onClick='javascript:"+clickFunction+"("+x+","+y+")'></div></center></td>");
		}
		document.write("</tr>");
	}
	document.write("</table>");
	updateGrid(gridId);
}

function updateGridSquare(gridId, posx, posy, val) {
	var pos = findGridEntry(gridId);
	var type = gridData[pos+3];
	cell = getId("gameGrid_"+gridId+"_"+posx+"_"+posy);
	if (type==1) {
		cell.innerHTML = val;
	} else if (type==2) {
		cell.innerHTML = val.substring(7,val.length);
		cell.style.background = val.substring(0,7);
	} else {
		cell.style.background = val;
	}
}

function updateGrid(gridId) {
	var pos = findGridEntry(gridId);
	var sizeX = gridData[pos+1];
	var sizeY = gridData[pos+2];
	for (var x=0; x<sizeX; x++)
		for (var y=0; y<sizeY; y++) {
			updateGridSquare(gridId, x, y, gridData[pos+x+y*sizeX+gridHeaderSize])
		}
}

function clearGrid(gridId, val) {
	var pos = findGridEntry(gridId);
	var sizeX = gridData[pos+1];
	var sizeY = gridData[pos+2];
	for (var x=0; x<sizeX; x++)
		for (var y=0; y<sizeY; y++) {
			gridData[pos+x+y*sizeX+gridHeaderSize] = val;
		}
}

function setGrid(gridId, posx, posy, val) {
	var pos = findGridEntry(gridId);
	var sizeX = gridData[pos+1];
	var sizeY = gridData[pos+2];
	if ((posx>=0) && (posx<sizeX) && (posy>=0) && (posy<sizeY)) {
		gridData[pos+posx+posy*sizeX+gridHeaderSize] = val;
	} else {
		alert("Outside grid:("+gridId+") pos:("+posx+","+posy+") size:("+sizeX+","+sizeY+")");
	}
}

function getGrid(gridId, posx, posy) {
	var pos = findGridEntry(gridId);
	var sizeX = gridData[pos+1];
	var sizeY = gridData[pos+2];
	if ((posx>=0) && (posx<sizeX) && (posy>=0) && (posy<sizeY)) {
		return gridData[pos+posx+posy*sizeX+gridHeaderSize];
	} else {
		return "";
	}
}


