// Copyright (C) 2002  SJS Solutions Ltd

function MenuManager()
{
    var activeMenus = new Array;
    var timerId = null;
    var menuCurrentlyHasFocus = false;

    var getMenu = function (id) {
        return document.all['menu' + id];
    };

    var closeActiveMenus = function () {
        for (var i in activeMenus) {
            getMenu(activeMenus[i]).style.visibility = "hidden";
        }
        activeMenus = new Array;

        return;
    };

    this.openMenu = function (menuTabEl, parentId, childId) {
        // cancel any outstanding timeouts (FIXME: possible race condition?)
        // (after all we don't want parent menus suddenly disappearing!)
        if (timerId != null) {
            myClearTimeout(timerId);
        }

        // close any active windows starting from the last opened up
        // terminating either when the active menu id equals parentId or until
        // all active windows are closed
        var idxOfParentId = null;
        for (var i=0; i<activeMenus.length; i++) {
            if (activeMenus[i] == parentId) {
                idxOfParentId = i;
                break;
            }
        }
        for (var i=(idxOfParentId==null)?0:(idxOfParentId+1); i<activeMenus.length; i++) {
            
            getMenu(activeMenus[i]).style.visibility = "hidden";
        }
        var tmp = new Array;
        if (idxOfParentId != null) {
            for (var i=0; i<=idxOfParentId; i++) {
                tmp[tmp.length] = activeMenus[i];
            }
        }
        activeMenus = tmp;

        // make the child menu visible and position it
        var childMenu = getMenu(childId);
        childMenu.style.visibility = "visible";
        childMenu.style.left = 
             totalOffset(menuTabEl, 'Left') + menuTabEl.offsetWidth-2;
        childMenu.style.top =
             totalOffset(menuTabEl, 'Top')+3;

        activeMenus[activeMenus.length] = childId;

        timerId = mySetTimeout(function () {
            if (!menuCurrentlyHasFocus) {
                closeActiveMenus();
            }
        }, 5000);

        return;
    };

    this.menuGotFocus = function () {
        menuCurrentlyHasFocus = true;
        if (timerId != null) {
            myClearTimeout(timerId);
        }
    };

    this.menuLostFocus = function () {
        menuCurrentlyHasFocus = false;
        timerId = mySetTimeout(function () { closeActiveMenus(); }, 500);
    };
}

function totalOffset(el, side)
{
    var total = 0

    while(el.offsetParent) {
        total += eval("el.offset" + side)
        el = el.offsetParent
    }

    return total
}

var menuManager = new MenuManager();

