var menuHideDelay = 500;    // milliseconds
var menuShowDelay = 250;    // milliseconds

var visibleDiv = null; // visible menu div

var tmr;        // timeout variable
var tmrShow     // timeout variable for showing divs

//var oSrcDiv;
var oMouseEvent;

var intOffset = 30;         // mouse offset for menu popup;
var intMenuWidth = 0;
var intOverflowPadding = 20;

function showDiv(div, e)
{
    // clear any active timers
    clearAllTimers();
    
    if ( e )
    {
        var evt = new MouseEvent(e);
        oMouseEvent = evt;
    }
    
    /*if ( srcDiv )
    {
        oSrcDiv = srcDiv;
    }*/
    
/*    if ( visibleDiv )
    {
        // if one of the menus is already visible, no reason to delay showing a new menu
        actuallyShowDiv(div);
    }
    else
    {*/
        // no visible menu; want to delay to make sure user actually wants to see subnav
    
    tmrShow = setTimeout("actuallyShowDiv('" + div + "')", menuShowDelay);
    //}
}

function actuallyShowDiv(div)
{
    if ( visibleDiv )
    {
        hideDiv(visibleDiv, true);
    }
    
    /*if ( tmr )
    {
        clearTimeout(tmr);
    }*/
    
    //alert(oEvent);
    
    var oDiv = document.getElementById(div);

    // 2009-11-02 kpwerner - Account for menu extending beyond right edge of client window
    //oDiv.style.left = oMouseEvent.x - oMouseEvent.offsetX;
    
    //alert("oDiv.width = " + oDiv.width);
    var intLeft = oMouseEvent.x - oMouseEvent.offsetX;
    var windowWidth = document.body.clientWidth;
    
    //debug(document.body.clientWidth);
    
    // need to get oDiv's width, but it's not defined at the DIV level, it is defined by the width of its children
    getWidthFromChildren(oDiv);
    //alert(intMenuWidth);
    if ( (intLeft + intMenuWidth) > windowWidth )
    {
        //debug("It's true!");
        intLeft = windowWidth - intMenuWidth - intOverflowPadding;
    }
    
    oDiv.style.left = intLeft;
    oDiv.style.visibility = "visible";
    oDiv.style.display = "block";
    visibleDiv = div;
    //alert(oSrcDiv.offsetLeft);
}

function repositionMenu(div, e)
{
    var evt = new MouseEvent(e);
    var oDiv = document.getElementById(div);
    oDiv.style.left = evt.x - intOffset;
}

function hideDiv(div)
{
    // clear any active timers
    clearAllTimers();
    
    if ( arguments.length == 2 )
    {
        // hide the div NOW!
        actuallyHideDiv(div);
    }
    else
    {
        // hide the div after a short delay
        tmr = setTimeout("actuallyHideDiv('" + div + "')", menuHideDelay);   
    }
}

function actuallyHideDiv(div)
{
    var oDiv = document.getElementById(div);
    oDiv.style.visibility = "hidden";
    oDiv.style.display = "none";
    
    visibleDiv = null;
}

function clearAllTimers()
{
    if ( tmr )
    {
        clearTimeout(tmr);
    }
    
    if ( tmrShow )
    {
        clearTimeout(tmrShow);
    }
}

function mouseX(evt)
{
    if (evt.pageX)
    {
        return evt.pageX;
    } 
    else if (evt.clientX)
    {
       return evt.clientX + (document.documentElement.scrollLeft ?
       document.documentElement.scrollLeft :
       document.body.scrollLeft);
    }
    else
    {
        return null;
    }
}

/*function mouseY(evt)
{
    if (evt.pageY) return evt.pageY;
    else if (evt.clientY)
       return evt.clientY + (document.documentElement.scrollTop ?
       document.documentElement.scrollTop :
       document.body.scrollTop);
    else return null;
}*/

function MouseEvent(e)
{
    /* format is
    if ( understand Firefox DOM property/object )
    {
        use FF DOM property/object
    }
    else
    {
        use IE DOM property/object
    }
    */    
    
    // code from Ajax for Dummies by Steve Holzner, PhD
    // Copyright 2006 Wiley Publishing.
    if (e)
    {
        this.e = e;
    }
    else
    {
        this.e = window.event;
    }
    
    if ( e.pageX )
    {
        this.x = e.pageX;
    }
    else
    {
        this.x = e.clientX;
    }
    
    if ( e.pageY )
    {
        this.y = e.pageY;
    }
    else
    {
        this.y = e.clientY;
    }
    
    if ( e.target )
    {
        this.target = e.target;
    }
    else
    {
        this.target = e.srcElement;
    }
    // end copyrighted code
    
    if ( e.layerX )
    {
        this.offsetX = e.layerX;
    }
    else
    {
        this.offsetX = e.offsetX;
    }
    
    if ( e.layerY )
    {
        this.offsetY = e.layerY;
    }
    else
    {
        this.offsetY = e.offsetY;
    }
    
    
}

function getWidthFromChildren(startObject)
{
    for ( i = 0; i < startObject.children.length; i++ )
    {
        if ( intMenuWidth == 0 )
        {
            if ( startObject.children[i].tagName.toLowerCase() != "a" )
            {
                getWidthFromChildren(startObject.children[i]);
            }
            else
            {
                intMenuWidth = parseInt(startObject.children[i].style.width);
                //return startObject.children[i].style.width;
            }
        }
        else
        {
            return;
        }
    }
}


function debug(msg)
{
    alert(msg);
}