﻿var 
  menuDatas = new Object();

function getMenu(menuID)
{
    var md = menuDatas[menuID];
    if (md == null)
    {   
        md = new Object();       
        md.menus = jQuery("#" + menuID + " li.menu");
        md.menus.bind("mouseover", function (e) { menuMouseOver(menuID, this); });
        md.menus.bind("mousemove", function (e) { menuMouseOver(menuID, this); });
        md.menus.bind("mouseout", function (e) { menuMouseOut(menuID, this); });
        
        var divs = jQuery("#" + menuID + " div.popup");
        divs.bind("mouseover", function (e) { menuMouseOver(menuID, this, true); });
        divs.bind("mousemove", function (e) { menuMouseOver(menuID, this, true); });
        divs.bind("mouseout", function (e) { menuMouseOut(menuID, this, true); });
        
        md.heights = new Array(md.menus.length);
        md.timers = new Array(md.menus.length);
        md.closing = new Array(md.menus.length);
        for (var menuIndex = 0; menuIndex < md.menus.length; menuIndex++)
        {
            var m = md.menus[menuIndex];
            md.heights[menuIndex] = getMenuPopupDiv(m).scrollHeight;
        }        
        menuDatas[menuID] = md;
    }
    return md;
}

function getMenuPopupDiv(menu)
{
    return jQuery("div.popup", menu)[0];
}

function getMenuIndex(menuData, menuElement)
{
    if (menuData)
    {
        for (var menuIndex = 0; menuIndex < menuData.menus.length; menuIndex++)
        {
            var m = menuData.menus[menuIndex];
            if (m == menuElement)
                return menuIndex;
        }
    }
    return -1;
}

function menuMouseOver(menuID, menu, isPopup)
{
    if (isPopup)
        menu = menu.parentNode;

    var md = getMenu(menuID);
    var mi = getMenuIndex(md, menu);
    if (mi != -1)
    {
        if (!isPopup)
        {
            var timer = md.timers[mi];
            if (!timer)
                menuOpenTimer(menuID, mi);
        }
            
        md.closing[mi] = false;
    }
}

function menuMouseOut(menuID, menu, isPopup)
{
    if (isPopup)
        menu = menu.parentNode;

    var md = getMenu(menuID);
    var mi = getMenuIndex(md, menu);
    if (mi != -1)
    {
        md.closing[mi] = true;
        var timer = md.timers[mi];
        if (!timer)
            md.timers[mi] = window.setTimeout("menuCloseTimer('" + menuID + "'," + mi + ")", 1000);
    }    
}

function menuClearTimer(menuData, menuIndex)
{
    if (menuData && (typeof menuIndex != undefined))
    {
        var timer = menuData.timers[menuIndex];
        if (timer)
        {
            window.clearTimeout(timer);
            menuData.timers[menuIndex] = 0;
        }
    }
}

function menuCloseTimer(menuID, menuIndex)
{
    var md = getMenu(menuID);
    if (md && (typeof menuIndex != undefined))
    {
        menuClearTimer(md, menuIndex);
        if (md.closing[menuIndex])
        {
            var div = getMenuPopupDiv(md.menus[menuIndex]);
            div.style.height = '0px';
            div.style.visibility = '';
        }
    }
}

function menuOpenTimer(menuID, menuIndex)
{
    var md = getMenu(menuID);
    if (md && (typeof menuIndex != undefined))
    {
        menuClearTimer(md, menuIndex);       
        var div = getMenuPopupDiv(md.menus[menuIndex]);
        var height = parseInt(div.style.height);
        if (!height)
            height = 0;
        height += 10;
        maxHeight = md.heights[menuIndex];
        if (height >= maxHeight)
        {
            height = maxHeight;
            
            for (var index = 0; index < md.menus.length; index++)
                if (menuIndex != menuID && (!md.timers[index]))
                {
                    md.closing[index] = true;
                    menuCloseTimer(menuID, index);
                }
                    
            if (md.closing[menuIndex])
                md.timers[menuIndex] = window.setTimeout("menuCloseTimer('" + menuID + "'," + menuIndex + ")", 600);
        }
        else
            md.timers[menuIndex] = window.setTimeout("menuOpenTimer('" + menuID + "'," + menuIndex + ")", 30);
        div.style.height = height + 'px';
        div.style.visibility = 'visible';
    }
}