var hideDelay = 250; //delay in ms before hiding on mouse out 
var defaultShowDelay = 250; //default delay in ms before menu appears 

var showMenuTimer = new Array(3);
var hideMenuTimer = new Array(3);
var activeMenu = new Array(3); //only displaying one menu at a time, holds currently visible menu
var mouseOn = new Array(3);
var ddm_obj, ddm_eType , ddm_menuId, ddm_offset;

function stopProp(e)
{
	if (!e) var e = window.event;
		e.cancelBubble = true;
	if (e.stopPropagation) e.stopPropagation();

}

function getOffset(obj, type) 
{
    var offset=0;
    while( obj != null )
    {
        offset += (type == "left")? obj.offsetLeft : obj.offsetTop;
        obj=obj.offsetParent;
    }
    return offset;
}

function toggleHidden(obj, eType)//object to change visibility of, type of event as string 
{
    if((eType.toLowerCase() == "click" && obj.style.display.toLowerCase() != "block") || eType.toLowerCase() == "mouseover")
    {
        obj.style.display="block";
    } else if(eType.toLowerCase() == "click")
    {
        obj.style.display="none"
    }
}

function placeMenu(obj, menu, offset, vertical) //place menu relative to obj
{
    var bigNum=999999;
    var lowX = bigNum;
    var lowY = 0; // 0 is at the top so lower y has a higher value
    var x=0;
    var y=0;
    if(obj.coords)
    {
        coords = obj.coords.split(",");
        if(obj.shape.toLowerCase()=="rect") //take lowest individual x and y
        {
            for(var i=0; i<coords.length; i++)
            {
                if(i%2) //odd which means y coordinate
                {
                    if(coords[i]>lowY)
                        lowY=(+coords[i]); //coercion to numeric value
                }else { //even so x
                    if(coords[i]<lowX)
                        lowX=(+coords[i]);
                }
            }
        } else if(obj.shape.toLowerCase() == "poly") //lowest x out of all points having low y
        {
            for(var i=0; i<coords.length; i+=2)
            {
                if(coords[i+1]>lowY)
                {
                    lowY=(+coords[i+1]);
                    lowX=(+coords[i]);
                }else if(coords[i+1]=lowY)
                {
                    if(coords[i]<lowX)
                        lowX=(+coords[i]);
                }
            }
        }
        mapObj = obj.parentNode;
        obj = document.getElementById(mapObj.getAttribute("mapFor"));

        x = lowX;
        y = (-1 ) * (obj.offsetHeight - lowY);
        
    }
    menu.style.left = (getOffset(obj, "left") + browserEdgeOffset(obj,"right") + x + offset + (vertical? 0:(obj.offsetWidth+1)))+"px";
    menu.style.top = (getOffset(obj, "top") + browserEdgeOffset(obj,"bottom") + y - (vertical? 0: obj.offsetHeight)) + "px";
}

function browserEdgeOffset(obj, edge)
{
    var edgeSize = 0;
    var edgeOffset = 0;
    if(edge == "bottom")
    {
        edgeOffset  = obj.offsetHeight;
    } else if( edge == "top" )
    {
        edgeOffset = obj.offsetWidth;
    }
    return edgeOffset;
}


function dropDownMenu(obj, e, menuId, level, offset, delay)//object to place dropdown menu in relation to, id of menu <div> to display, optional right or left(negative value) offset for placing menu, optional time to delay before showing menu
{
	mouseOn[level] = obj;
    offset = (typeof(offset) != "undefined")? offset : 0;
    delay = (typeof(delay) != "undefined")? delay : defaultShowDelay;
    //store function parameters in globals for access by the timer function 
    ddm_obj=obj;
    ddm_menuId=menuId;
    ddm_eType=e.type;
    ddm_offset=offset;
    if(delay == 0 || e.type == "click")
    {
        if(typeof showMenuTimer[level] != "undefined")
            clearTimeout(showMenuTimer[level]);
        realDropDownMenu(level);
    } else //timer to show menu after a delay
    {
        if(typeof showMenuTimer[level] != "undefined")
            clearTimeout(showMenuTimer[level]);
        showMenuTimer[level]=setTimeout("realDropDownMenu("+level+")", delay);
    }
    return false;

}

function realDropDownMenu(level)
{
	if(!mouseOn[level])
	{
		return;
	}
    cancelHideMenuTimer(level);
    hideMenu(level); //hide the current menu
	//console.log("show",level);
    var menu = document.getElementById(ddm_menuId);
    activeMenu[level]=menu; //set current menu
    placeMenu(ddm_obj,menu, ddm_offset,level==0); //position menu
    toggleHidden(menu,ddm_eType); //unhide menu
}


function cancelHideMenuTimer(level)
{
	for( level; level>=0; level--)
	{
	    if(typeof hideMenuTimer[level] != "undefined")
		{
			//console.log("cancel",level);
	        clearTimeout(hideMenuTimer[level]);
			hideMenuTimer[level] = null;
		}
	}
}

function setHideMenuTimer(e,level)
{
	for(level; level>=0; level--)
	{
		mouseOn[level]=null;
		if(!hideMenuTimer[level])
		{
			//console.log("set");
		    hideMenuTimer[level]=setTimeout("hideMenu("+level+")", hideDelay);
		}
	}
}

function hideMenu(level)
{	
    if(activeMenu[level])
	{
		//console.log("hide",level);
        activeMenu[level].style.display="none";
	}
}



