function getObjectLeft(obj) {
    return obj.offsetParent ? (getObjectLeft(obj.offsetParent) + obj.offsetLeft) : obj.offsetLeft;
}

function getObjectTop(obj) {
    return obj.offsetParent ? (getObjectTop(obj.offsetParent) + obj.offsetTop) : obj.offsetTop;
}

function getLeft(obj) {
    if (document.layers) {
        return obj.x;
    } else if (document.all) {
        return getObjectLeft(obj);
    } else {
        var left = 0;
        while (obj != null) {
            left += obj["offsetLeft"];
            obj = obj.offsetParent;
        }
        return left;
    }
}

function getRight(obj) {
    return getLeft(obj) + getWidth(obj);
}

function getTop(obj) {
    if (document.layers) {
        return obj.y;
    } else if (document.all) {
        return getObjectTop(obj);
    } else {
        var top = 0;
        while (obj != null) {
            top += obj["offsetTop"];
            obj = obj.offsetParent;
        }
        return top;
    }
}

function getWidth(obj) {
    if (document.layers) {
        return obj.width;
    } else if (document.all) {
        return obj.offsetWidth;
    } else {
        return obj["offsetWidth"];
    }
}

function getHeight(obj) {
    if (document.layers) {
        return obj.height;
    } else if (document.all) {
        return obj.offsetHeight;
    } else {
        return obj["offsetHeight"];
    }
}

var menus = [];
var menuItems = [];

function menuBar(menuStructure, left, top, mainMenuStyleName, subMenuStyleName, separator) {
    var mb = new menu(null, menuStructure, 0, mainMenuStyleName, subMenuStyleName, separator);
    if ((left != null) && (top != null)) {
        mb.element.style.left = left;
        mb.element.style.top = top;
    } else {
        mb.element.style.position = 'static';
    }
}

function menu(item, menuStructure, level, mainMenuStyleName, subMenuStyleName, separator) {
    this.item = item;
    this.menuStructure = menuStructure;
    this.level = level;
    this.mainMenuStyleName = mainMenuStyleName;
    this.subMenuStyleName = subMenuStyleName;

    this.items = [];

    this.id = menus.length;
    menus[this.id] = this;

    this.hideTimer = null;
    this.showTimer = null;

    for (this.i = 0; this.i < this.menuStructure.length; this.i++) {
        this.items[this.i] = new menuItem(this, menuStructure[this.i], level, this.i, mainMenuStyleName, subMenuStyleName);
    }

    this.elementId = 'menu_' + this.id;
    document.write('<span align="left" id="' + this.elementId + '" class="' + (this.level == 0 ? this.mainMenuStyleName + '_container' : this.subMenuStyleName + '_container') + '" style="position:absolute; z-index:' + this.level + '; ' + (this.level > 0 ? ' visibility:hidden"' : '') + '"' + (this.level > 0 ? ' onMouseOver="menu_mouseOver(' + this.id + ');" onMouseOut="menu_mouseOut(' + this.id + ');"' : '') + '>');
    for (this.i = 0; this.i < this.items.length; this.i++) {
        var mi = this.items[this.i];

        document.write((this.level == 0 ? '<span' : '<div align="left"') + ' id="' + mi.elementId + '" class="' + (this.level == 0 ? this.mainMenuStyleName : this.subMenuStyleName) + '_item"' + ' onMouseOver="menuItem_mouseOver(' + mi.id + ')" onMouseOut="menuItem_mouseOut(' + mi.id + ');"' + '>')
        document.write('<a align="left" id="' + mi.anchorId + '" class="' + (this.level == 0 ? this.mainMenuStyleName : this.subMenuStyleName) + '_item" href="' + mi.href + '"' + (mi.target != null ? ' target="' + mi.target + '"' : '') + ' onClick="return menuItem_click(' + mi.id + ');">');
        document.write(mi.text);
        document.write('</a>');
        document.write(this.level == 0 ? '</span>' : '</div>');

        mi.element = document.getElementById(mi.elementId);
        mi.anchor = document.getElementById(mi.anchorId);

        if ((this.level == 0) && (this.i < this.items.length - 1)) {
            document.write('<span class="' + this.mainMenuStyleName + '_separator">' + separator + '</span>');
        }
    }
    document.write("</span>");
    this.element = document.getElementById(this.elementId);
    if (this.level > 0) {
        if (window.opera) {
            this.calculated = false;
        } else {
            var width = 0;
            for (this.i = 0; this.i < this.items.length; this.i++) {
                var w = getWidth(this.items[this.i].element);
                if (w > width) {
                    width = w;
                }
            }
            for (this.i = 0; this.i < this.items.length; this.i++) {
                this.items[this.i].element.style.width = width;
            }
        }
    }
}

function menu_hide(id) {
    menus[id].element.style.visibility = 'hidden';
    menus[id].item.element.className = (menus[id].item.parent.level == 0 ? menus[id].mainMenuStyleName + '_item' : menus[id].subMenuStyleName + '_item');
    menus[id].item.anchor.className = menus[id].item.element.className;
    for (var j = 0; j < menus[id].items.length; j++) {
        if (menus[id].items[j].subMenu != null) {
            menu_hide(menus[id].items[j].subMenu.id);
        }
    }
}

function menu_show(id) {
    var m = menus[id];
    var i = m.item;
    if (m.level == 1) {
        m.element.style.top = getTop(i.parent.element) + getHeight(i.parent.element);
        m.element.style.left = getLeft(i.element);
    } else {
        m.element.style.top = getTop(i.element) + 10;
        m.element.style.left = getRight(i.element) - 10;
    }
    m.element.style.visibility = 'visible';
    if ((this.level > 0) && (window.opera) && (!m.calculated)) {
        var width = 0;
        for (var j = 0; j < m.items.length; j++) {
            var w = getWidth(m.items[j].element);
            if (w > width) {
                width = w;
            }
        }
        for (var j = 0; j < m.items.length; j++) {
            m.items[j].element.style.width = width;
        }
        m.calculated = true;
    }
}

function menu_mouseOver(id) {
    var m = menus[id];
    while ((m != null) && (m.level != 0)) {
        clearTimeout(m.hideTimer);
        m = m.item.parent;
    }
    m = menus[id];
    m.showTimer = setTimeout('menu_show(' + m.id + ');', 0);
}

function menu_mouseOut(id) {
    var m = menus[id];
    while ((m != null) && (m.level != 0)) {
        if (m.showTimer != null) {
            clearTimeout(m.showTimer);
        }
        m.hideTimer = setTimeout('menu_hide(' + m.id + ');', 400);
        m = m.item.parent;
    }
}

function menuItem(parent, item, level, index, mainMenuStyleName, subMenuStyleName) {
    this.parent = parent;
    this.item = item;
    this.level = level;
    this.index = index;
    this.mainMenuStyleName = mainMenuStyleName;
    this.subMenuStyleName = subMenuStyleName;

    this.id = menuItems.length;
    menuItems[this.id] = this;

    this.text = item[0];
    this.href = item[1];
    this.target = item[2];
    this.subMenuStructure = item[3];

    if (this.subMenuStructure != null) {
        this.subMenu = new menu(this, this.subMenuStructure, level + 1, mainMenuStyleName, subMenuStyleName);
    } else {
        this.subMenu = null;
    }

    this.elementId = 'item_' + this.id;
    this.anchorId = 'anchor_' + this.id;
    this.element = null;
    this.anchor = null;
}

function menuItem_mouseOver(id) {
    var i = menuItems[id];
    for (var j = 0; j < i.parent.items.length; j++) {
        if ((i != i.parent.items[j]) && (i.parent.items[j].subMenu != null)) {
            menu_hide(i.parent.items[j].subMenu.id);
        }
    }
    var m = i.subMenu;
    if (m == null) {
        m = i.parent;
    }
    while ((m != null) && (m.level != 0)) {
        if (m.hideTimer != null) {
            clearTimeout(m.hideTimer);
        }
        m = m.item.parent;
    }
    if (i.subMenu != null) {
        i.subMenu.showTimer = setTimeout('menu_show(' + i.subMenu.id + ');', 0);
    }
    i.element.className = (i.parent.level == 0 ? i.mainMenuStyleName + '_item_active' : i.subMenuStyleName + '_item_active');
    i.anchor.className = i.element.className;
}

function menuItem_mouseOut(id) {
    var i = menuItems[id];
    var m = i.subMenu;
    if (m != null) {
        if (m.showTimer != null) {
            clearTimeout(m.showTimer);
        }
        m.hideTimer = setTimeout('menu_hide(' + m.id + ');', 400);
    }
    if ((m == null) || (m.element.style.visibility == 'hidden')) {
        i.element.className = (i.parent.level == 0 ? i.mainMenuStyleName + '_item' : i.subMenuStyleName + '_item');
        i.anchor.className = i.element.className;
    }
}

function menuItem_click(id) {
    return (menuItems[id].href != null);
}

