﻿
function menubuilder_mainmenu() 
{
    this.openSubmenuStack = new Array(0);
    this.hoveredmenuItemStack = new Array(0);
    this.hoverSubmenus = true;
    this.menuTimeoutMilliseconds = 3000;
    this.menuTimeout = null;

    //------------------------------------------- 
    this.arrayContainsValue = function(arrayToSearch, valueToFind) {
        for (var i = 0; i < arrayToSearch.length; i++) {
            if (arrayToSearch[i] == valueToFind) return true;
        }
        return false;
    }

    this.getArrayOfElementIdsAndAncestorIds = function(MenuItemDiv) {
        var El = new Array();

        // add the id of the current menu item element to the array 
        El[0] = MenuItemDiv.id;

        // add all parent items to the array 
        var parentNodeOfMenuItem;
        parentNodeOfMenuItem = MenuItemDiv.parentNode;
        while (parentNodeOfMenuItem.id != 'menubuilder_mainmenu_sub_0') {
            El[El.length] = parentNodeOfMenuItem.id.replace('_sub', '_item');
            parentNodeOfMenuItem = parentNodeOfMenuItem.parentNode;
        }

        // return array of menu items and all parent menu items and their parent menu items etc 
        return El;
    }


    this.mouseOverMenuItemDiv = function(MenuItemDiv, iLevel) {
        this.dehoverHoveredMenuItems();
        this.hoverMenuItemAndAncestors(MenuItemDiv);

        if (this.hoverSubmenus) {
            var iSubmenuDivID = MenuItemDiv.id.replace('_item', '_sub');
            var objSubmenuDiv = document.getElementById(iSubmenuDivID);

            // dehover all submenus of and below the current level 
            while (this.openSubmenuStack.length >= iLevel) {
                var objOpenSubmenuDiv = this.openSubmenuStack.pop();
                var iLevelOfSubmenu = iLevel;
                if (objOpenSubmenuDiv.id != iSubmenuDivID) {
                    this.dehoverSubmenu(objOpenSubmenuDiv, iLevelOfSubmenu);
                    iLevelOfSubmenu--;
                }
            }

            // hover submenu 
            this.hoverSubmenu(objSubmenuDiv, iLevel)

            // set timeout to reset the menu 
            window.clearTimeout(this.menuTimeout);
            this.menuTimeout = window.setTimeout('obj_menubuilder_mainmenu.closeMenu();', this.menuTimeoutMilliseconds);
        }
    }


    this.mouseOutMenuItemDiv = function(MenuItemDiv, iLevel) {
        // dehover current item immediately 
        this.dehoverMenuItem(MenuItemDiv, iLevel)
    }

    this.closeMenu = function() {
        // dehover all submenus and items 
        this.closeOpenSubmenus();
        this.dehoverHoveredMenuItems();
    }

    this.closeOpenSubmenus = function() {
        // dehover all submenus 
        while (this.openSubmenuStack.length > 0) {
            var objOpenSubmenuDiv = this.openSubmenuStack.pop();
            this.dehoverSubmenu(objOpenSubmenuDiv);
        }
    }

    this.dehoverHoveredMenuItems = function() {
        while (this.hoveredmenuItemStack.length > 0) {
            var objCurrentMenuItemDiv = this.hoveredmenuItemStack.pop();
            objCurrentMenuItemDiv.className = objCurrentMenuItemDiv.className.replace('-hover', '');
            objCurrentMenuItemDiv.className = objCurrentMenuItemDiv.className.replace(/ hover\d+/, '');
        }

    }

    this.hoverMenuItem = function(objMenuItemDiv, iLevel) {
        var sClassNameMenuItemDiv = objMenuItemDiv.className;
        sClassNameMenuItemDiv = sClassNameMenuItemDiv.replace('-hover', '');
        sClassNameMenuItemDiv = sClassNameMenuItemDiv.replace(' hover' + iLevel, '');
        sClassNameMenuItemDiv = sClassNameMenuItemDiv.replace(' item' + iLevel, '-hover item' + iLevel);
        sClassNameMenuItemDiv += ' hover' + iLevel;
        objMenuItemDiv.className = sClassNameMenuItemDiv;

        this.hoveredmenuItemStack.push(objMenuItemDiv);
    }

    this.dehoverMenuItem = function(objMenuItemDiv, iLevel) {
        //  var sClassNameMenuItemDiv = objMenuItemDiv.className; 
        //  sClassNameMenuItemDiv = sClassNameMenuItemDiv.replace('-hover', ''); 
        //  sClassNameMenuItemDiv = sClassNameMenuItemDiv.replace(' hover'+ iLevel, ''); 
        //  objMenuItemDiv.className = sClassNameMenuItemDiv; 
    }

    this.dehoverSubmenu = function(objSubmenuDiv, iLevel) {
        var sClassNameSubmenuDiv = objSubmenuDiv.className;
        sClassNameSubmenuDiv = sClassNameSubmenuDiv.replace('-hover', '');
        sClassNameSubmenuDiv = sClassNameSubmenuDiv.replace(/ smhover\d+/, '');
        objSubmenuDiv.className = sClassNameSubmenuDiv;
    }

    this.hoverMenuItemAndAncestors = function(objSubmenuDiv) {
        var iAncestorItem;
        var iaAncestorItemIDs = this.getArrayOfElementIdsAndAncestorIds(objSubmenuDiv);
        var iAncestorLevel = 1;
        for (iAncestorItem = iaAncestorItemIDs.length - 1; iAncestorItem >= 0; iAncestorItem--) {
            var objMenuItemDiv = document.getElementById(iaAncestorItemIDs[iAncestorItem]);
            this.hoverMenuItem(objMenuItemDiv, iAncestorLevel);
            iAncestorLevel++;
        }
    }

    this.hoverSubmenu = function(objSubmenuDiv, iLevel) {
        if (objSubmenuDiv) {
            var iLevelOfSubmenu = iLevel + 1;
            var sClassNameSubmenuDiv = objSubmenuDiv.className;
            sClassNameSubmenuDiv = sClassNameSubmenuDiv.replace('-hover', '').replace(' level' + iLevelOfSubmenu, '-hover level' + iLevelOfSubmenu);
            sClassNameSubmenuDiv = sClassNameSubmenuDiv.replace(' smhover' + iLevelOfSubmenu, '') + ' smhover' + iLevelOfSubmenu;
            objSubmenuDiv.className = sClassNameSubmenuDiv;
            this.openSubmenuStack.push(objSubmenuDiv);
        }
    }
}

var obj_menubuilder_mainmenu = new menubuilder_mainmenu(); 
