﻿MENULIB_LOADED = true;

if (UTILITY_LOADED == null)
    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(x, parentElement) {
    var div = document.createElement("div");
    setStyleAttribute(div, "position", "relative");
    setStyleAttribute(div, "zIndex", "11"); 
    setStyleAttribute(div, "width", this.parent.offsetWidth);
    setClassName(div, this.parent.itemStyle);
    div.setAttribute("id", this.id);
    div.setAttribute("menuID", this.parent.id);
    div.onmouseover = this.mouseover;
    div.onmouseout = this.mouseout;
    div.onclick = this.click;
    this.divElement = div;
    this.divID = this.id;

    var linkText = this.menuText;
    if (this.subMenuPopup)
        linkText += "...";

    var anchor = document.createElement("a");
    var linkUrl = this.menuLink;
    anchor.setAttribute("href", linkUrl);
    setClassName(anchor, this.parent.linkStyle);
    setStyleAttribute(anchor, "paddingLeft", x);
    setStyleAttribute(anchor, "paddingRight", x);
    setNodeText(anchor, linkText);

    this.divElement.appendChild(anchor);
    parentElement.appendChild(this.divElement);
    if (this.subMenuPopup) {
        this.subMenuPopup.parent = this.parent;
        this.subMenuPopup.parentMenuItem = this;
        this.subMenuPopup.render(document.body);
    }
}

PopupMenuItem.prototype.mouseout = function() {
    var objMenu = menuSystem.findMenuById(this.getAttribute("menuID"));
    var objItem = objMenu.findItemById(this.getAttribute("id"));
    setClassName(objItem.divElement, objMenu.itemStyle);
}

PopupMenuItem.prototype.mouseover = function() {
    var menuID = this.getAttribute("menuID");
    var itemID = this.getAttribute("id");
    var objMenu = menuSystem.findMenuById(menuID);
    var objItem = objMenu.findItemById(itemID); 
    objMenu.closeAllSubMenus();
    objMenu.menuSystem.clearTimer();
    if (objItem.subMenuPopup) {
        var x = (objMenu.posX > -1 ? objMenu.posX : objMenu.divElement.offsetLeft) + 
                objMenu.divElement.offsetWidth;
        var y = (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() { 
    var menuID = this.getAttribute("menuID");
    var itemID = this.getAttribute("id");
    var objMenu = menuSystem.findMenuById(menuID);
    var objItem = objMenu.findItemById(itemID);
    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.marginWidth = 3;
    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)
        setStyleAttribute(div, "left", this.posX);
    if (this.posY > -1)
        setStyleAttribute(div, "top", this.posY);
    setStyleAttribute(div, "width", "auto");
    setStyleAttribute(div, "height", "auto");
    setStyleAttribute(div, "position", "absolute");
    setStyleAttribute(div, "zIndex", this.zIndex);
    setStyleAttribute(div, "overflow", "hidden");
    div.setAttribute("id", this.id);
    setClassName(div, this.menuStyle);
    div.setAttribute("popupMenu", this);
    div.onmouseout = this.mouseOut;
    div.onmouseover = this.mouseOver;

    if (this.headerDivElement) {
        displayElement(this.headerDivElement, true);
        div.appendChild(this.headerDivElement);
    }
    for (var i = 0; i < this.menuItems.length; i++) {
        this.menuItems[i].render(this.marginWidth, div);
    }
    if (this.footerDivElement) {
        displayElement(this.footerDivElement, true);
        div.appendChild(this.footerDivElement);
    }

    this.divElement = div;
    parentElement.appendChild(div);
    this.close();

    if (this.mouseOverElementId)
        addHandler(this.mouseOverElementId, "onmouseover", "menuSystem.activate('" + this.id + "')");
}

PopupMenu.prototype.activate = function() {
    displayElement(this.divElement, true);
    if (this.filterString) {
	    setStyleAttribute(this.divElement, "width", this.divElement.offsetWidth);
    	setStyleAttribute(this.divElement, "height", this.divElement.offsetHeight);
        displayElement(this.divElement, false);
        setStyleAttribute(this.divElement, "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) {
    setStyleAttribute(this.divElement, "left", x);
    setStyleAttribute(this.divElement, "top", y);
}

PopupMenu.prototype.mouseOver = function(obj) {
    var obj = menuSystem.findMenuById(this.getAttribute("id"));
    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) {
    var menuID = this.getAttribute("id"); 
    var obj = menuSystem.findMenuById(menuID);
    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);

