/* Internet Explorer doesn't implement Array.indexOf */
if (!Array.prototype.indexOf) {
    Array.prototype.indexOf = function(searchElement, fromIndex) {
        if (!fromIndex) fromIndex = 0;
        for (var i = fromIndex; i<this.length; ++i) {
            if (searchElement == this[i]) {
                return i;
            }
        }
        return -1;
    }
}

function hasClass(el, classname)
{
    if (!el.className) return false;
    var classnames = el.className.split(' ');
    if (classnames.indexOf(classname)==-1) return false;
    return true;
}

function addClass(el, classname)
{
    var classnames = el.className.split(' ');
    if (classnames.indexOf(classname)==-1) {
        classnames.push(classname);
        el.className = classnames.join(' ');
    }
}

function swapClass(el, removeclassname, addclassname)
{
    var classnames = el.className.split(' ');
    var indexofremove = classnames.indexOf(removeclassname);
    var indexofadd = classnames.indexOf(addclassname);
    if (indexofremove!=-1) {
        delete(classnames[indexofremove]);
    }
    if (indexofadd==-1) {
        classnames.push(addclassname);
    }
    el.className = classnames.join(' ');
}

function removeClass(el, classname)
{
    var classnames = el.className.split(' ');
    var indexof = classnames.indexOf(classname);
    if (indexof!=-1) {
        delete(classnames[indexof]);
        el.className = classnames.join(' ');
    }
}

function make_menu(id)
{
    var menu = new Object();
    var topelement = document.getElementById(id);
    if (!topelement) return false;
    menu.root = topelement;
    // find links on different levels
    var a = topelement.getElementsByTagName('a');
    var div = null;
    menu.active = false;
    menu.activate_click = false;
    menu.items = new Array();
    for(var i=0; i<a.length; ++i) {
        swapClass(a[i].parentNode, 'on', 'off');
        a[i].menu = menu;
        a[i].is_top_node = _menu_is_top_node(a[i]);
        a[i].submenu = _menu_get_submenu(a[i]);
        a[i].parentitems = _menu_get_parentitems(a[i]);
        menu.items.push(a[i]);
    }
    var item;
    for(var i=0; i<menu.items.length; ++i) {
        item = menu.items[i];
        if (item.is_top_node) {
            item.onclick = _menu_onclick_root;
            item.onmouseover = _menu_onmouseover_root;
        }
        else {
            item.onmouseover = _menu_onmouseover;
            if (item.parentNode) {
                item.parentNode.linkitem = item;
                item.parentNode.onclick = _menu_onclick_parent;
                item.parentNode.onmouseover = _menu_onmouseover_parent;
            }
        }
    }
    return menu;
}

function destroy_menu(id)
{
    var topelement = document.getElementById(id);
    if (!topelement) return false;
    var a = topelement.getElementsByTagName('a');
    for(var i=0; i<a.length; ++i) {
        if (a[i].onclick) a[i].onclick = null;
        if (a[i].onmouseover) a[i].onmouseover = null;
        if (a[i].menu) a[i].menu = null;
        if (a[i].submenu) a[i].submenu = null;
        if (a[i].parentitems) a[i].parentitems = null;
        if (a[i].parentNode) {
            if (a[i].parentNode.linkitem) a[i].parentNode.linkitem = null;
            if (a[i].parentNode.onclick) a[i].parentNode.onclick = null;
            if (a[i].parentNode.onmouseover) a[i].parentNode.onmouseover = null;
        }
    }
}

function deactivate_menu(menu)
{
    if (menu.activate_click) {
        menu.activate_click = false;
        return;
    }
    var n = menu.items.length;
    for(var i=0; i<n; ++i) {
        swapClass(menu.items[i].parentNode, 'on', 'off');
    }
    menu.active = false;
}

function _menu_is_top_node(a)
{
    var root = a.menu.root;
    var parent = a.parentNode;
    while (parent!=root) {
        if (hasClass(parent, 'submenu')) return false;
        parent = parent.parentNode;
    }
    return true;
}

function _menu_get_submenu(a)
{
    var n = a.parentNode.childNodes.length;
    for(var i=0; i<n; ++i) {
        if (hasClass(a.parentNode.childNodes[i], 'submenu')) {
            return a.parentNode.childNodes[i];
        }
    }
    return null;
}

function _menu_get_parentitems(a)
{
    var parentitems = new Array();
    var parent = a.parentNode;
    while (parent && !parent.id) {
        parentitems.push(parent);
        parent = parent.parentNode;
    }
    return parentitems;
}

function _menu_deactiveate_others(a)
{
    var n = a.menu.items.length;
    for(var i=0; i<n; ++i) {
        if (a.parentitems.indexOf(a.menu.items[i].parentNode)==-1
        &&  a.menu.items[i].parentitems.indexOf(a.parentNode)==-1)  {
            swapClass(a.menu.items[i].parentNode, 'on', 'off');
        }
    }
}

function _menu_onclick_root()
{
    swapClass(this.parentNode, 'off', 'on');
    _menu_deactiveate_others(this);
    if (this.submenu) {
        this.menu.active = true;
        this.menu.activate_click = true;
        return false;
    }
}

function _menu_onmouseover_root()
{
    if (this.menu.active) {
        swapClass(this.parentNode, 'off', 'on');
        _menu_deactiveate_others(this);
    }
}

function _menu_onclick_parent(event)
{
    if (this.linkitem && this.linkitem.href) {
        window.location = this.linkitem.href;
        if (!event) event = window.event;
        event.cancelBubble = true;
        if (event.stopPropagation) event.stopPropagation();
        return false;
    }
}

function _menu_onmouseover_parent(event)
{
    swapClass(this, 'off', 'on');
    _menu_deactiveate_others(this.linkitem);
    if (!event) event = window.event;
    event.cancelBubble = true;
    if (event.stopPropagation) event.stopPropagation();
}

function _menu_onmouseover()
{
    swapClass(this.parentNode, 'off', 'on');
    _menu_deactiveate_others(this);
}