function Utility()
{
}

Utility.layoutGrid = function
(
    divName,
    startingColHeight,
    maxColHeight,
    closure
)
{
    var colHeight = startingColHeight;

    var grid = new Array();
    grid.startingColHeight = startingColHeight;
    grid.maxColHeight = maxColHeight;

    var delta = 1;
    var col = 0;
    while (colHeight >= startingColHeight)
    {
        grid[col] = new Array();
        for (var i=0; i<colHeight; i++)
        {
            var space = new Space(col, i);
            grid[col].push(space);
        }

        if (colHeight == maxColHeight)
        {
            delta = -1;
        }
        colHeight += delta;
        col++;
    }

    colHeight = startingColHeight;
    var delta = 1;
    var col = 0;
    while (colHeight >= startingColHeight)
    {
        for (var i=0; i<colHeight; i++)
        {
            var space = grid[col][i];

            // every space has 6 neighbors (ul, u, ur, lr, l, and ll)
            space.ul = Utility.getNeighbor(grid, -1, -1, col, i, delta);
            space.u  = Utility.getNeighbor(grid,  0, -1, col, i, delta);
            space.ur = Utility.getNeighbor(grid,  1,  0, col, i, delta);
            space.lr = Utility.getNeighbor(grid,  1,  1, col, i, delta);
            space.l  = Utility.getNeighbor(grid,  0,  1, col, i, delta);
            space.ll = Utility.getNeighbor(grid, -1,  0, col, i, delta);

        }

        if (colHeight == maxColHeight)
        {
            delta = -1;
        }
        colHeight += delta;
        col++;
    }


    Utility.render(divName, grid, closure);

    return grid;
}


Utility.getNeighbor = function(grid, deltax, deltay, col, row, delta)
{
    var startingColHeight = grid.startingColHeight;
    var maxColHeight = grid.maxColHeight;
    var cell = grid[col][row];

    if (grid[col].length == maxColHeight)
    {
        if (deltax == 1) { deltay--; }
    }
    else if (delta < 0)
    {
        deltay = deltay - deltax;
    }

    var x = col + deltax;
    var y = row += deltay;


    if
    (
		((x >= 0) && (x < grid.length)) &&
		((y >= 0) || (y < grid[col].length))
	)
    {
        return grid[x][y];
    }


    return null;
}



Utility.render = function(divName, grid, closure)
{

    var controlDiv = document.getElementById(divName);
    var anchor = getElementPosition(controlDiv);
    var anchorLeft = parseInt(anchor.left);
    var anchorTop = parseInt(anchor.top);

    var colHeight = grid.startingColHeight;
    var maxColHeight = grid.maxColHeight;

    var left = 0;
    var top  = 0;

    var initialOffset = (maxColHeight - colHeight) * (Symbol.HEIGHT/2);

    var delta = 1;
    var col = 0;
    while (colHeight >= grid.startingColHeight)
    {
        for (var i=0; i<colHeight; i++)
        {
            var space = grid[col][i];

            space.left = Math.round(left + anchorLeft);
            space.top = Math.round(anchorTop + initialOffset + top + (i*Symbol.HEIGHT));

            if (closure != null)
            {
                closure.renderHex(controlDiv, space, col, i, colHeight);
            }
        }

        if (colHeight == grid.maxColHeight)
        {
            delta = -1;
        }

        if (delta > 0)
        {
            top -= (Symbol.HEIGHT/2);
        }
        else
        {
            top += (Symbol.HEIGHT/2);
        }

        colHeight += delta;

        left += (0.75 * Symbol.WIDTH);
        col++;
    }

}


Utility.onKeyDown = function(event)
{
    var e = event;
    if (e == null)
    {
        e = window.event;
    }

    var key = (e.which) ? e.which : e.keyCode;

}


Utility.divIdGen = 1;
Utility.createDivId = function(prefix)
{
    Utility.divIdGen++;
    var date = new Date()
    return prefix + '_' + Utility.divIdGen + '_' + date.getMilliseconds();
}

Utility.moveTo = function(div, newX, newY)
{
    div.style.left = newX;
    div.style.top = newY;
}

/**
 * Reveal a layer
 */
function showLayer(layerName)
{
    if (layerName.style != null)
    {
        layerName.style.display = "";
    }
}

/**
 * Hide a layer
 */
function hideLayer(layerName)
{
    if (layerName.style != null)
    {
        layerName.style.display = "none";
    }
}

/**
 * Reveal a layer
 */
function showLayerByName(layerName)
{
    var layer = document.getElementById(layerName);
    if (layer != undefined)
    {
        showLayer(layer);
    }
}

/**
 * Hide a layer
 */
function hideLayerByName(layerName)
{
    var layer = document.getElementById(layerName);
    if (layer != undefined)
    {
        hideLayer(layer);
    }
}

/**
 * Reveal a div
 */
function showDiv(div)
{
    if (div.style != null)
    {
        div.style.visibility = "visible";
    }
}

/**
 * Hide a div
 */
function hideDiv(div)
{
    if (div.style != null)
    {
        div.style.visibility = "hidden";
    }
}

/**
 * Reveal a div
 */
function showDivById(id)
{
    var div = document.getElementById(id);
    if (div != undefined)
    {
        showDiv(div);
    }
}

/**
 * Hide a div
 */
function hideDivById(id)
{
    var div = document.getElementById(id);
    if (div != undefined)
    {
        hideDiv(div);
    }
}

function isDivVisibleById(id)
{
    var div = document.getElementById(id);
    if (div != undefined)
    {
        return div.style.visibility != "hidden";

    }
}



function getElementPosition(elemID)
{
    var offsetTrail = document.getElementById(elemID);
    return getDivPosition(offsetTrail);
}


function getDivPosition(div)
{
    var offsetLeft = 0;
    var offsetTop = 0;
    while (div) {
        offsetLeft += div.offsetLeft;
        offsetTop += div.offsetTop;
        div = div.offsetParent;
    }
    if (navigator.userAgent.indexOf("Mac") != -1 &&
        typeof document.body.leftMargin != "undefined") {
        offsetLeft += document.body.leftMargin;
        offsetTop += document.body.topMargin;
    }
    return {left:offsetLeft, top:offsetTop};
}

Utility.createCookie = function(name,value,days) {
	if (days) {
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	}
	else var expires = "";
	document.cookie = name+"="+value+expires+"; path=/";
}

Utility.readCookie = function(name) {
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return null;
}

Utility.eraseCookie = function(name) {
	createCookie(name,"",-1);
}
