MENULIB_LOADED = true;

if (typeof(UTILITY_LOADED) == "undefined")
    alert("Utility.js must be loaded before MenuLib.js");

/* class PopupMenuItem */

PopupMenuItem = function(objParentMenu, menuText, menuLink, objSubMenu) 
{
    this.id = objParentMenu.id + "_" + getRandomValue();
    this.menuID = objParentMenu.id;
    this.popupMenuItem = "PopupMenuItem";
    this.parent = objParentMenu;
    this.menuText = menuText;
    this.menuLink = menuLink;
    this.divElement = null;
    this.subMenuPopup = objSubMenu;
}

PopupMenuItem.prototype.render = function(parentElement) 
{
    var div = document.createElement("div");
    div.style.position = "relative";
    div.style.zIndex = 11;
    setClassName(div, this.parent.itemStyle);
    div.id = this.id;
    div.setAttribute("menuID", this.parent.id);
    var obj = this;
    div.onmouseover = function() { obj.mouseover(obj) };
    div.onmouseout = function() { obj.mouseout(obj) };
    div.onclick = function() { obj.click(obj) };
    this.divElement = div;
    this.divID = this.id;

    var linkText = this.menuText;
    if (this.subMenuPopup)
        linkText += "...";

    var anchor = document.createElement("a");
    anchor.href = this.menuLink;
    anchor.style.verticalAlign = "top";
    anchor.className = this.parent.linkStyle;
    anchor.innerText = linkText;
    anchor.textContent = linkText;

    this.divElement.appendChild(anchor);
    parentElement.appendChild(this.divElement);
    if (this.subMenuPopup) 
    {
        var thisXY = getPageXY(this.divElement);
        this.subMenuPopup.mouseOverElementId = div.id;
        this.subMenuPopup.posX = thisXY.x + div.offsetWidth;
        this.subMenuPopup.poxY = thisXY.y;
        this.subMenuPopup.parent = this.parent;
        this.subMenuPopup.parentMenuItem = this;
        this.subMenuPopup.render(document.body);
    }
}

PopupMenuItem.prototype.mouseout = function(objItem) 
{
    if (objItem == null)
        objItem = this;
    setClassName(objItem.divElement, objItem.parent.itemStyle);
}

PopupMenuItem.prototype.mouseover = function(objItem) 
{
    if (objItem == null)
        objItem = this;
    var objMenu = objItem.parent;
    objMenu.closeAllSubMenus();
    objMenu.menuSystem.clearTimer();
    if (objItem.subMenuPopup) 
    {
        var x = parseInt((objMenu.posX > -1 ? objMenu.posX : objMenu.divElement.offsetLeft) +
                objMenu.divElement.offsetWidth);
        var y = parseInt((objMenu.posY > -1 ? objMenu.posY : objMenu.divElement.offsetTop) +
                objItem.divElement.offsetTop);
        objItem.subMenuPopup.moveTo(x, y);
        objItem.subMenuPopup.activate();
    }
    else
        objMenu.resetAllMenuItems();
    setClassName(objItem.divElement, objMenu.overStyle);
}

PopupMenuItem.prototype.click = function(objItem) 
{
    if (objItem == null)
        objItem = this;
    document.location = objItem.menuLink;
}

/* class PopupMenu */

PopupMenu = function(ctrlID, x, y, menuStyle, itemStyle, overStyle, linkStyle, menuSystem) 
{
    this.popupMenu = "PopupMenu";
    this.id = ctrlID;
    this.posX = parseInt(x);
    this.posY = parseInt(y);
    this.menuSystem = menuSystem;
    this.menuStyle = menuStyle;
    this.itemStyle = itemStyle;
    this.overStyle = overStyle;
    this.linkStyle = linkStyle;
    this.menuItems = new Array();
    this.zIndex = 10;
    this.onMenuHide = null;
    this.onMenuShow = null;
    this.divElement = null;
    this.headerDivElement = null;
    this.footerDivElement = null;
    this.mouseIsOverSubMenu = false;
    this.parent = null;
    this.parentMenuItem = null;
    this.mouseOverElementId = null;
    this.filterString = "";
}

PopupMenu.prototype.addItem = function(menuText, menuLink, objSubMenu) 
{
    this.menuItems.push(new PopupMenuItem(this, menuText, menuLink, objSubMenu));
}

PopupMenu.prototype.render = function(parentElement) 
{
    var div = document.createElement("div");
    if (this.posX > -1)
        div.style.left = this.posX + "px";
    if (this.posY > -1)
        div.style.top = this.posY + "px";
    div.style.position = "absolute";
    div.style.zIndex = this.zIndex;
    div.style.overflow = "hidden";
    div.id = this.id;
    setClassName(div, this.menuStyle);
    div.setAttribute("popupMenu", this);
    var obj = this;
    div.onmouseout = function() { obj.mouseout(obj) };
    div.onmouseover = function() { obj.mouseover(obj) };

    if (this.headerDivElement) 
    {
        displayElement(this.headerDivElement, true);
        div.appendChild(this.headerDivElement);
    }
    for (var i = 0; i < this.menuItems.length; i++) 
    {
        this.menuItems[i].render(div);
    }
    if (this.footerDivElement) 
    {
        displayElement(this.footerDivElement, true);
        div.appendChild(this.footerDivElement);
    }

    this.divElement = div;
    parentElement.appendChild(div);
    this.close();

    if (this.mouseOverElementId) 
    {
        var element = getElement(this.mouseOverElementId);
        if (element)
        {
            element.onmouseover = function() { menuSystem.activate(obj.id); }
            element.onmouseout = function() { menuSystem.setDelayTimer(); }
        }
    }
}

PopupMenu.prototype.activate = function() 
{
    displayElement(this.divElement, true);
    if (this.filterString && this.divElement.style.filter) 
    {
        setDimensions(this.divElement, this.divElement.offsetWidth, this.divElement.offsetHeight);
        displayElement(this.divElement, false);
        this.divElement.style.filter = this.filterString;
        displayElement(this.divElement, true);
    }
    this.menuSystem.clearTimer();
    if (isFunction(this.onMenuShow))
        this.onMenuShow(this);
}

PopupMenu.prototype.closeAllSubMenus = function() 
{
    for (var i = 0; i < this.menuItems.length; i++) 
    {
        if (this.menuItems[i].subMenuPopup)
            this.menuItems[i].subMenuPopup.close();
    }
    this.menuSystem.clearTimer();
}

PopupMenu.prototype.close = function() 
{
    this.closeAllSubMenus();
    displayElement(this.divElement, false);
    this.menuSystem.clearTimer();
    if (isFunction(this.onMenuHide))
        this.onMenuHide(this);
}

PopupMenu.prototype.resetAllMenuItems = function() 
{
    for (var i = 0; i < this.menuItems.length; i++) 
        setClassName(this.menuItems[i].divElement, this.itemStyle);
}

PopupMenu.prototype.findItemById = function(id) 
{
    var objItem = null;
    for (var i = 0; i < this.menuItems.length; i++) 
    {
        if (this.menuItems[i].id == id) 
        {
            objItem = this.menuItems[i];
            break;
        }
    }
    return objItem;
}

PopupMenu.prototype.findSubMenuById = function(id) 
{
    var objMenu = null;
    for (var i = 0; i < this.menuItems.length; i++) 
    {
        if (this.menuItems[i].subMenuPopup) 
        {
            if (this.menuItems[i].subMenuPopup.id == id) 
            {
                objMenu = this.menuItems[i].subMenuPopup;
                break;
            }
        }
    }
    return objMenu;
}

PopupMenu.prototype.moveTo = function(x, y) 
{
    setLocation(this.divElement, x, y);
}

PopupMenu.prototype.mouseover = function(obj) 
{
    if (obj == null)
        obj = this;
    obj.menuSystem.clearTimer();
    if (obj.parent)
        obj.parent.mouseIsOverSubMenu = true;
    else
        obj.mouseIsOverSubMenu = false;
    if (obj.parentMenuItem)
        setClassName(obj.parentMenuItem.divElement, obj.parent.overStyle);
}

PopupMenu.prototype.mouseout = function(obj) 
{
    if (obj == null)
        obj = this;
    obj.menuSystem.setDelayTimer();
}

/* class PopupMenuSystem */

PopupMenuSystem = function(msCloseDelay) 
{
    this.closeDelayTime = parseInt(msCloseDelay);
    this.objActiveMenu = null;
    this.popupMenus = new Array();
    this.timer = null;
    this.mainElement = document.createElement("div");
}

PopupMenuSystem.prototype.closeAll = function() 
{
    for (var i = 0; i < this.popupMenus.length; i++)
        this.popupMenus[i].close();
    this.closeActive();
}

PopupMenuSystem.prototype.closeActive = function() 
{
    if (this.objActiveMenu) 
    {
        this.objActiveMenu.close();
        this.objActiveMenu = null;
    }
    this.clearTimer();
}

PopupMenuSystem.prototype.addMenu = function(objPopupMenu) 
{
    this.popupMenus.push(objPopupMenu);
}

PopupMenuSystem.prototype.render = function(parentElement) 
{
    for (var i = 0; i < this.popupMenus.length; i++)
        this.popupMenus[i].render(this.mainElement);
    document.body.appendChild(this.mainElement);
}

PopupMenuSystem.prototype.activate = function(menuID) 
{
    var objMenu = null;
    for (var i = 0; i < this.popupMenus.length; i++) 
    {
        if (this.popupMenus[i].id == menuID) 
        {
            objMenu = this.popupMenus[i];
            break;
        }
    }
    if (objMenu) 
    {
        this.closeActive();
        objMenu.activate();
        this.objActiveMenu = objMenu;
        this.clearTimer();
    }
}

PopupMenuSystem.prototype.findMenuById = function(id) 
{
    var objMenu = null;
    for (var i = 0; i < this.popupMenus.length; i++) 
    {
        if (this.popupMenus[i].id == id) 
        {
            objMenu = this.popupMenus[i];
            break;
        }
        objMenu = this.popupMenus[i].findSubMenuById(id);
        if (objMenu)
            break;
    }
    return objMenu;
}

PopupMenuSystem.prototype.setDelayTimer = function() 
{
    if (this.timer)
        this.clearTimer();
    var obj = this;
    this.timer = window.setTimeout(function() {obj.closeActive();}, this.closeDelayTime);
}

PopupMenuSystem.prototype.clearTimer = function() 
{
    if (this.timer) 
    {
        window.clearTimeout(this.timer);
        this.timer = null;
    }
}

menuSystem = new PopupMenuSystem(1000);


