﻿var MENU_HIDE_DELAY = 500;
var MENU_WIDTH = 195;
var menuHideObject = {};

//Gets the sub menu portion of a menu item that contains a sub menu
function getChildMenu(selectedMenu)
{ 
    var childMenu;
    if(selectedMenu)
    {
        for(var i = 0; i < selectedMenu.childNodes.length; i++)
        {
            if(selectedMenu.childNodes[i].tagName && selectedMenu.childNodes[i].tagName.toLowerCase() == 'ul')
            {
                childMenu = selectedMenu.childNodes[i];
            }   
        }
    }
    return childMenu;           
}

//Hides a menu
function hideMenu(selectedMenu, delay)
{
    var childMenu = getChildMenu(selectedMenu);
    if(!delay)
    {
        delay = MENU_HIDE_DELAY;
    }
    if(childMenu)
    {
        var selectedMenuID = selectedMenu.getAttribute('id');
        menuHideObject[selectedMenuID] = setTimeout( function()
        {
            childMenu.style.display = 'none';
            selectedMenu.style.position = '';
            delete menuHideObject[selectedMenuID];
        }, delay);
    }
}

//Displays a menu
function displayMenu(selectedMenu, isSubMenu)
{
    var childMenu = getChildMenu(selectedMenu);
    if(childMenu)
    {
        var selectedMenuID = selectedMenu.getAttribute('id');
        clearTimeout(menuHideObject[selectedMenuID]);
        delete menuHideObject[selectedMenuID];
        var menuFamily = getMenuFamily(selectedMenu);
        hideMenusExcept(menuFamily);
        selectedMenu.style.position = 'relative';
        if(isSubMenu)
        {
            showSubMenu(selectedMenu, childMenu);
        } 
        else
        {
            childMenu.style.display = 'block';
        }
    }
}

//Checks to see if a sub menu will overrun the window width, and
//positions and displays the sub menu accordingly.
function showSubMenu(selectedMenu, childMenu)
{
    var windowWidth;
    if(window.innerWidth)
    {
        windowWidth = window.innerWidth;
    }
    else if (document.body.offsetWidth)
    {
        windowWidth = document.body.offsetWidth;
    }
    var childMenuLeft = findLeft(selectedMenu) + MENU_WIDTH;
    if(childMenuLeft + MENU_WIDTH >= windowWidth)
    {
        childMenu.style.left = (MENU_WIDTH * -1) + 'px';
    }
    else
    {
        childMenu.style.left =  MENU_WIDTH + 'px';
    }
    childMenu.style.display = 'block';
}

//Gets the parent menu items of a given menu item.
function getMenuFamily(menuItem)
{
    var result = {}
    if(menuItem)
    {
        result[menuItem.id] = menuItem;
        while(menuItem.parentNode.parentNode && menuItem.parentNode.parentNode.id != 'Menu')
        {
            menuItem = menuItem.parentNode.parentNode;
            var itemID = menuItem.id;
            result[itemID] = menuItem;
        }
    }
    return result;
}

//Hides all menus except those specified in the menusToDisplay associative array
function hideMenusExcept(menusToDisplay)
{
    for(var timeoutRecordID in  menuHideObject)
    {
        if(menuHideObject.hasOwnProperty(timeoutRecordID))
        {
            if(!menusToDisplay[timeoutRecordID])
            {
                clearTimeout(menuHideObject[timeoutRecordID]);
                var menuToHide = document.getElementById(timeoutRecordID);
                if(menuToHide)
                {
                    hideMenu(menuToHide, 1);
                }
            }
        }
    }
}

//This function finds the x coordinate of the left edge of an object.
function findLeft(obj) {
    var curleft = 0;
    if (obj && obj.offsetParent) {
        curleft = obj.offsetLeft
        while (obj = obj.offsetParent) {
            curleft += obj.offsetLeft
        }
    }
    return curleft;
}

//This function finds the y coordinate of the top edge of an object.
function findTop(obj) {
    var curtop = 0;
    if (obj && obj.offsetParent) {
        curtop = obj.offsetTop
        while (obj = obj.offsetParent) {
            curtop += obj.offsetTop
        }
    }
    return curtop;
}
