var strWidth; //            =   "200px"; //default menu width
var intDelay = 100;  //menu disappear speed onMouseout (in miliseconds)
var blnHideOnClick = true; //hide menu when user clicks within menu?

/////No further editting needed

var ie4 = document.all;
var ns6 = document.getElementById && !document.all;
var correctW;
if (navigator.userAgent.indexOf('MSIE') >= 0) {
    correctW = 0;
} else {
    correctW = 1;
}

if (ie4 || ns6) {
    var strOutput = '';
    strOutput = '<div id="dropmenudiv" style="visibility:hidden;width:' + String(Number(strWidth) + correctW) + 'px;"';
    strOutput += ' onmouseover="clearhidemenu();"';
    strOutput += ' onmouseout="dynamichide(event)">';
    strOutput += '</div>';
    document.write(strOutput);
}

function getposOffset(what, offsettype) {
    var totaloffset = (offsettype == "left") ? what.offsetLeft : what.offsetTop;
    var parentEl = what.offsetParent;
    while (parentEl != null) {
        totaloffset = (offsettype == "left") ? totaloffset + parentEl.offsetLeft : totaloffset + parentEl.offsetTop;
        parentEl = parentEl.offsetParent;
    }
    return totaloffset;
}


function showhide(parentObj, obj, e, visible, hidden, hoverClass) {
    if (ie4 || ns6) {
        dropmenuobj.style.left = dropmenuobj.style.top = "-500px";
    }

    if (!parentObj.className)
        parentObj.className = '';

    if (e.type == "click" && obj.visibility == hidden || e.type == "mouseover") {
        obj.visibility = visible;
        if (parentObj.className.indexOf(hoverClass) == -1) {
            parentObj.className += ' ' + hoverClass;
        }
    } else if (e.type == "click") {
        obj.visibility = hidden;
        parentObj.className = parentObj.className.replace(' ' + hoverClass, '');
    }
}

function iecompattest() {
    return (document.compatMode && document.compatMode != "BackCompat") ? document.documentElement : document.body;
}

function clearbrowseredge(obj, whichedge) {
    var edgeoffset = 0;
    if (whichedge == "rightedge") {
        var windowedge = ie4 && !window.opera ? iecompattest().scrollLeft + iecompattest().clientWidth - 15 : window.pageXOffset + window.innerWidth - 15;
        dropmenuobj.contentmeasure = dropmenuobj.offsetWidth;
        if (windowedge - dropmenuobj.x < dropmenuobj.contentmeasure) {
            edgeoffset = dropmenuobj.contentmeasure - obj.offsetWidth;
        }
    } else {
        var topedge = ie4 && !window.opera ? iecompattest().scrollTop : window.pageYOffset;
        var windowedge = ie4 && !window.opera ? iecompattest().scrollTop + iecompattest().clientHeight - 15 : window.pageYOffset + window.innerHeight - 18;
        dropmenuobj.contentmeasure = dropmenuobj.offsetHeight;
        if (windowedge - dropmenuobj.y < dropmenuobj.contentmeasure) { //move up?
            edgeoffset = dropmenuobj.contentmeasure + obj.offsetHeight;
            if ((dropmenuobj.y - topedge) < dropmenuobj.contentmeasure) { //up no good either?
                edgeoffset = dropmenuobj.y + obj.offsetHeight - topedge;
            }
        }
    }
    return edgeoffset;
}

function populatemenu(what) {
    if (ie4 || ns6) {
        dropmenuobj.innerHTML = what.join("");
    }
}

var liElement;
var liClass;
function dropdownmenu(obj, e, menucontents, hoverClass) {
    var correctX = 0;
    /*if (navigator.userAgent.indexOf('MSIE') >= 0) {
        correctX = 0;
    } else {
        correctX = -1;
    }*/
    if (window.event) {
        event.cancelBubble = true;
    } else if (e.stopPropagation) {
        e.stopPropagation();
    }

    if (liElement && obj != liElement) {
        liElement.className = liElement.className.replace(liClass, '');
    }

    clearhidemenu();
    dropmenuobj = document.getElementById ? document.getElementById("dropmenudiv") : dropmenudiv;

    populatemenu(menucontents);
    if (ie4 || ns6) {
        showhide(obj, dropmenuobj.style, e, "visible", "hidden", hoverClass);
        liElement = obj;
        liClass = hoverClass;
        dropmenuobj.x = getposOffset(obj, "left");
        dropmenuobj.y = getposOffset(obj, "top");
        dropmenuobj.style.left = dropmenuobj.x - clearbrowseredge(obj, "rightedge") + correctX + "px";
        dropmenuobj.style.top = dropmenuobj.y - clearbrowseredge(obj, "bottomedge") + obj.offsetHeight + "px";
    }

    return clickreturnvalue();
}

function clickreturnvalue() {
    if (ie4 || ns6) {
        return false;
    } else {
        return true;
    }
}

function contains_ns6(a, b) {
    while (b.parentNode) {
        if ((b = b.parentNode) == a) {
            return true;
        } else {
            return false;
        }
    }
}

function dynamichide(e) {
    if (ie4 && !dropmenuobj.contains(e.toElement)) {
        delayhidemenu();
    } else if (ns6 && e.currentTarget != e.relatedTarget && !contains_ns6(e.currentTarget, e.relatedTarget)) {
        delayhidemenu();
    }
}

function hidemenu(e) {
    if (typeof dropmenuobj != "undefined") {
        if (ie4 || ns6) {
            dropmenuobj.style.visibility = "hidden";
        }
    }
    if (liElement) {
        liElement.className = liElement.className.replace(liClass, '');
    }
}

function delayhidemenu() {
    if (ie4 || ns6) {
        delayhide = setTimeout("hidemenu()", intDelay);
    }
}

function clearhidemenu() {
    if (typeof delayhide != "undefined") {
        clearTimeout(delayhide);
    }
}

if (blnHideOnClick == true) {
    document.onclick = hidemenu;
}
