
var MENU_HIDE_DELAY = 300; // in milliseconds
var cmenus = new Array();
var opening = false;

function init() {
    document.onmousemove = handleMouseMove;
}

function popupMenu() {
    opening = true;

    var args = popupMenu.arguments;
    var newmenus = new Array(args.length);
    var cid = '';

    for(var i = 0; i < args.length; i++) {
        if(cid == '') { cid = args[i]; }
        else          { cid = cid + '_' + args[i]; }
        var menu = document.getElementById(cid);
        newmenus[i] = menu;
    }

    for(var i = 0; i < cmenus.length; i++) {
        if(i < newmenus.length && cmenus[i] == newmenus[i]) {
            cancelHide(i);
        } else {
            hideMenu(i);
        }
    }

    for(var i = 0; i < newmenus.length; i++) {
        newmenus[i].style.visibility = 'visible';
        var overlay = document.getElementById(newmenus[i].id+"_overlay");

        if (overlay) {
            overlay.style.width = newmenus[i].clientWidth + 4;
            overlay.style.height = newmenus[i].clientHeight + 4;
            overlay.style.visibility='visible';
        }
    }
 
    cmenus = newmenus;
}

function popdownMenu() {
    opening = false;
}

function cancelHide(index) {
    if(cmenus[index]) {
        if(cmenus[index].timer) {
            clearTimeout(cmenus[index].timer);
            cmenus[index].timer = null;
        }
    }
}

function cancelHideChain(index) {
    cancelHide(index);
    if(index > 0) cancelHideChain(index - 1);
}

function hideMenu(index) {
    cancelHide(index);
    if(cmenus[index]) {
        cmenus[index].style.visibility = 'hidden';
        var overlay = document.getElementById(cmenus[index].id+"_overlay");
        if (overlay) { overlay.style.visibility='hidden'; }
        cmenus[index] = null;
    }
}

function handleMouseMove(e) {
    if(!opening && cmenus.length > 0) {
        if(document.all) e = window.event;
        var mouseX = document.body.scrollLeft + e.clientX;
        var mouseY = document.body.scrollTop + e.clientY;

        for(var i = cmenus.length-1; i >= 0; i--) {
            if(cmenus[i]) {
                var dims = getDims(cmenus[i]);
                if(mouseX < dims.x || mouseY < dims.y || mouseX > dims.x+cmenus[i].offsetWidth || mouseY > dims.y+cmenus[i].offsetHeight) {
                    if(!cmenus[i].timer) {
                        cmenus[i].timer = setTimeout("hideMenu("+i+")", MENU_HIDE_DELAY);
                    }
                } else {
                    cancelHideChain(i);
                    break;
                }
            }
        }
    }
}

function getDims(el){
    for (var lx=0,ly=0;el!=null; lx+=el.offsetLeft,ly+=el.offsetTop,el=el.offsetParent);
    return {x:lx,y:ly}
}

