
////////////////////////////////////////
// Global variables

var g_openMenu = null;  // The menu that is open
var g_over = null;      // The menu the mouse is currently over
var g_overCounter = 0;  // A counter for the timeout

////////////////////////////////////////
// Browser compatibility

NS4 = (document.layers);

function findElement(id)
{
    if(NS4)
    {
        if(document[id])        return document[id];
        if(document.images[id]) return document.images[id];
        if(document.layers[id]) return document.layers[id];
        return null;
    }

	if(document.getElementById)
		return document.getElementById(id);
	else
	    return document.all[id];
}

function getElementPosition(element)
{
    if(NS4) return ([element.x, element.y]);
    
	var left = 0;
	var top = 0;
	var ctl = element;
  	while(ctl!=null)
  	{
  		left += ctl.offsetLeft;
  		top += ctl.offsetTop;
  		ctl = ctl.offsetParent;
  	}
	return ([left,top]);
}

function setElementPosition(element, loc)
{
    if(NS4) { element.top = loc[1]; element.left = loc[0]; return; }
    
	element.style.top = loc[1];
	element.style.left = loc[0];
}

function showElement(element)
{
    if(NS4) { element.visibility = "show"; }
    
	element.style.visibility = "visible"
}

function hideElement(element)
{
    if(NS4) { element.visibility = "hide"; }
    
    element.style.visibility = "hidden";
}


////////////////////////////////////////
// Internal functions

function i_showMenu(menuName)
{
    if(g_openMenu != menuName)
    {
        i_hideMenu();
        
        var image = findElement(menuName + "Image");
        var popup = findElement(menuName + "Popup");
        
        var pos = getElementPosition(image);
        pos[0] += 1;
        pos[1] += image.height;
        setElementPosition(popup, pos);
        showElement(popup);

        g_openMenu = menuName;
    }        
}

function i_hideMenu()
{
    if(g_openMenu != null)
    {
        var popup = findElement(g_openMenu + "Popup");
        hideElement(popup);
        g_openMenu = null;        
    }
}

function i_menuTimeout(counterValue)
{
    if(g_over==null && g_overCounter==counterValue)
        i_hideMenu();
}            

function i_imageName(itemName)
{
    var slashPos = itemName.indexOf("/");
    return slashPos<0 ? itemName : slashPos==itemName.length-1 ? itemName.substr(0, slashPos) : itemName.substr(slashPos+1);
}

function i_imageSource(itemName, state)
{
    return "images/menu/" + i_imageName(itemName) + "-" + state + ".gif";
}

function i_setImage(itemName, state)
{
    findElement(i_imageName(itemName) + "Image").src = i_imageSource(itemName, state);
}


////////////////////////////////////////
// Public functions

//
// If menu name contains no slash, it is a top level menu item with no submenus
// If menu name ends with a slash, it is a top level menu item with submenus
// If menu name contains a slash not at the end, it is a submenu item
//
function menuOver(itemName)
{
    var slashPos = itemName.indexOf("/");
    var mainMenu = slashPos<0 ? itemName : itemName.substr(0, slashPos);
    var subMenu = slashPos<0 ? null : itemName.substr(slashPos+1);

    if(subMenu!=null)
        i_showMenu(mainMenu);
    else
        i_hideMenu();
    g_over = mainMenu;
    i_setImage(itemName, "on");
}

function menuOut(itemName)
{
    i_setImage(itemName, "off");
    g_over = null;
    g_overCounter = g_overCounter + 1;
    setTimeout("i_menuTimeout("+g_overCounter+")",500);
}

function menuInitImage(itemName)
{
    new Image().src = i_imageSource(itemName, "off");  // Preload
    new Image().src = i_imageSource(itemName, "on");   // Preload
    i_setImage(itemName, "off");
}
