var _topMenus = new Object();
var _topMenuLock = new Object();
var _topMenuHideTimeoutId = new Object();
var _loaded = false;

runOnLoad(function () { _loaded = true; });


function overlaps(a1, a2, b1, b2)
{
    return (a1 < b2 && a2 > b1);
}

function shiftObjectForScrollbar(obj)
{
    var content = MM_findObj("content");
    if (!content)
    {
        return false;
    }
    var contentBounds = getBounds(content);
    var maxBadX = contentBounds.x + contentBounds.w;
    var minBadX = maxBadX - SCROLLBAR_WIDTH;
	obj.style.visibility = "inline";
	var objBounds = getBounds(obj);
	var objTop = obj.style.top;
	if (objBounds.w == 0)
	{
		obj.style.top = -1000;
		show(obj, true);
		objBounds = getBounds(obj);
	}
    if (overlaps(objBounds.x, objBounds.x + objBounds.w, minBadX, maxBadX))
    {
		var centerX = objBounds.x + objBounds.w/2;
		var centerBadX = minBadX + (maxBadX - minBadX) / 2;
		if (centerBadX > centerX)
		{
			obj.style.left = minBadX - objBounds.w;
		} else {
			obj.style.left = contentBounds.x + contentBounds.w;
		}
		obj.style.top = objTop;
    }
}

function showTopMenu(button, name)
{
    if (_isMsie && !_loaded)
    {
        return;
    }
    var n = cleanName(name).toLowerCase();

    for (var i = 0; i < _menuRoot.sub.length; i++)
    {
        var node = _menuRoot.sub[i];
        if (!node)
        {
            continue;
        }

        var nodeName = cleanName(node.name).toLowerCase();
        if (nodeName != n)
        {
            continue;
        }

        hideTopMenus();
        var m = getTopMenu(node);
        var bounds = getBounds(button);
	    m.style.left = bounds.x;
        m.style.top = bounds.y + bounds.h;
        if (_isMsie)
        {
            m.style.display = "inline";
        }

	    if (_isMacGecko)
		{
            shiftObjectForScrollbar(m);
		}

        m.style.zIndex=300;
        show(m, true);
        enterTopMenu(node.uid);
        button.node = node;
        if (!button.oldonmouseout)
        {
            button.oldonmouseout = button.onmouseout;
            button.onmouseout = leaveTopMenuHandler;
        }
        return;
    }
}

function enterTopMenuHandler(e)
{
    if (!e)
    {
        e = event;
    }

    enterTopMenu(this.node.uid);
}

function leaveTopMenuHandler(e)
{
    if (!e)
    {
        e = event;
    }

    if (!isAncestor(this, e.relatedTarget))
    {
        leaveTopMenu(this.node.uid);
        _topMenus[this.node.uid].style.zIndex=250;
    }

    if (this.oldonmouseout)
    {
        this.oldonmouseout(e);
    }
}

function enterTopMenu(uid)
{
    //debug("enterTopMenu("+uid+")");
    
    _topMenuLock[uid] = true;
}

function leaveTopMenu(uid) 
{
    //debug("leaveTopMenu("+uid+")");
    _topMenuLock[uid] = false;
    if (_topMenuHideTimeoutId[uid])
    {
        clearTimeout(_topMenuHideTimeoutId[uid]);
    }
    _topMenuHideTimeoutId[uid] = setTimeout("hideTopIfUnlocked(\""+uid+"\");", HIDE_DELAY_MS);
};

function hideTopMenus()
{
    for (var i in _topMenus)
    {
        if (_topMenus[i] && isVisible(_topMenus[i]))
        {
            hide(_topMenus[i]);
        }
    }
}

function hideTopIfUnlocked(uid)
{
    //debug("hideTopIfUnlocked("+uid+")");
    if (!_topMenuLock[uid])
    {
        hide(getTopMenu(_nodes[uid]));
    }

    for (var i in _topMenus)
    {
        if (_topMenus[i] && isVisible(_topMenus[i]))
        {
            var b = getBounds(_topMenus[i]);
        }
    }
}

function getShortName(name)
{
    var s = cleanStr(name).toLowerCase();
    var i = s.indexOf(' ');
    if (i >= 0)
    {
        s = s.substring(0, i);
    }
    s = s.charAt(0).toUpperCase() + s.substring(1);
    return s;
}

function getTopMenu(superNode)
{
    if (!superNode)
    {
        return "";
    }

    if (_topMenus[superNode.uid])
    {
        return _topMenus[superNode.uid];
    }

    var container = document.createElement("div");
    container.className = "topMenu" + getShortName(superNode.name);
    hide(container, true);
    container.node = superNode;
    container.onmouseover = enterTopMenuHandler;
    container.onmouseout = leaveTopMenuHandler;
    var accum = "";
    accum += "<div class=\"topMenuInner\"><table class=\"topMenuTable\" cellspacing=\"1\" cellpadding=\"0\">";
    for (var i = 0; i < superNode.sub.length; i++)
    {
        var subNode = superNode.sub[i];
        if (!subNode)
        {
            continue;
        }

        accum += "<tr\">";
        accum += "<td";
        accum += " onmouseover=\"this.className='topTile-sel';\" onmouseout=\"this.className='topTile';\" onclick=\"gotoNode(" + subNode.uid + ");\"";
        accum += " class=\"topTile\"";
        accum += "><span class=\"menuText\">";
        accum += subNode.name;
        accum += "</span></td>";
        accum += "</tr>";
    }
    accum += "</table></div>";
    container.innerHTML = accum;
    _topMenus[superNode.uid] = container;
    document.body.appendChild(container);
    disableSelection(container);

    return container;
}

