var implement = null;

function failSafe() {
    return true;
}

function domHideMenues() {
    var theMenubar = document.getElementById('menubar');
    if (theMenubar) {
        var theMenus = theMenubar.getElementsByTagName('div');
        for (var i = 0;  i < theMenus.length; i++) {
            theMenus[i].style.visibility = 'hidden';
        }
    }
    return true;
}

function domDeActivateMenues() {
    implement.menuesActive = false;
    domHideMenues();
    return true;
}

function showCurrentMenu(menuTitleNode) {
    if (menuTitleNode) {
        domHideMenues();
        var theMenubar = document.getElementById('menubar');
        if (theMenubar) {
            var menuBase = 0;
            for (var yn = theMenubar; yn.offsetParent; yn = yn.offsetParent) {
                 menuBase += yn.offsetTop;
            }
            menuBase += (theMenubar.offsetHeight - 1);
            var xpos = 0;
            for (var xn = menuTitleNode; xn.offsetParent; xn = xn.offsetParent) {
                 xpos += xn.offsetLeft;
            }
            var mn = menuTitleNode.nextSibling;
            while (mn && !implement.nameMatches(mn, 'div')) {
                mn = mn.nextSibling;
            }
            var leftPos = new String(xpos);
            leftPos = leftPos.concat('px');
            var topPos = new String(menuBase);
            topPos = topPos.concat('px');
            if (mn) {
                mn.style.visibility = 'visible';
                mn.style.left = leftPos;
                mn.style.top  = topPos;
            }
        }
    }
}

function domMenuDisplayOn() {
    if (implement.menuesActive) {
        showCurrentMenu(this);
    }
    return false;
}

function domActivateMenues() {
    implement.menuesActive = true;
    showCurrentMenu(this);
    return false;
}

function followLink() {
    window.location = this.href;
    return true;
}

function placeholderWarning() {
    alert('Action undefined');
}

function domPlaceHandlers () {
    var theMenubar = document.getElementById('menubar');
    document.onmouseup = domDeActivateMenues;
    if (theMenubar) {
        if (theMenubar.firstChild == null) alert('Null bar item.');
        for (var barItem = theMenubar.firstChild; !(barItem == null); barItem = barItem.nextSibling) {
            if (implement.nameMatches(barItem, 'ul')) {
               for (var listItem = barItem.firstChild; listItem; listItem = listItem.nextSibling) {
                    if (implement.nameMatches(listItem, 'li')) {
                        var itemChild = listItem.firstChild
                        while (itemChild) {
                            if (implement.nameMatches(itemChild, 'span')) {
                                itemChild.onmousedown = domActivateMenues;
                                itemChild.onmouseover = domMenuDisplayOn;
                            } else if (implement.nameMatches(itemChild, 'div')) {
                                var menuLinkList = itemChild.getElementsByTagName('a');
                                for (var i = 0;  i < menuLinkList.length; i++) {
                                     menuLinkList[i].onmouseup = followLink;
                                }
                            }
                            itemChild = itemChild.nextSibling;
                        }
                    }
                }
            }
        }
    }
    return true;
}

function sensitiveNameMatches (node, str) {
    return (node.nodeName == str);
}

function foldedNameMatches (node, str) {
    return (node.nodeName.toLowerCase() == str.toLowerCase());
}


function Supporter() {
    if (document.getElementsByTagName) {
        this.nameMatches = (document.getElementsByTagName('body')[0].nodeName == 'BODY') ? foldedNameMatches : sensitiveNameMatches;
    } else {
        this.nameMatches = placeholderWarning;
    }
    this.hideMenues = (document.getElementById && document.getElementsByTagName) ? domHideMenues :  failSafe;
    this.activateMenues = (document.getElementById && document.getElementsByTagName) ? domActivateMenues : placeholderWarning;
    this.placeHandlers = (document.getElementById && document.getElementsByTagName) ? domPlaceHandlers : failSafe;
}

function setup() {
    implement = new Supporter;
    implement.placeHandlers();
    implement.hideMenues();
    implement.menuesActive = false;
}

window.onload = setup;
