var HMENU_DELAY = 250;
var HMENU_HIDEDELAY = 1000;

/*
 
 Array utilities
 
*/

if (typeof(Array.indexOf) != 'function') {
    Array.prototype.indexOf = function(x) {
        var i;
        for(i=0; i<this.length; i++) {
            if (this[i] == x) return i;
        }
        return -1;
    }
    
    Array.prototype.hdelete = function(idx) {
        var a = new Array();
        for (var i=0; i<this.length; i++) {
            if (i != idx) a.push(this[i]);
        }
        return a;
    }
}

//if (typeof(getAnchorPosition)=='undefined') {
//    alert('/js/hjslib/hanchorposition.js is need but not loaded!');
//}


/*
 
 class HMenuItem
 
*/
function HMenuItem(caption, url, selected, userMenuId) {
    this.caption = caption;
    this.selected = selected == true;
    this.userMenuId = userMenuId;
    if (typeof(url)=='object') {
        this.addSubItems(url);
    } else {
        this.url = url;
    }
}
HMenuItem.prototype = {
    caption: null,
    url: null,
    selected: null,
    userMenuId: null,
    subItems: null,
    menuId: null,
    
    level: null,
    parent: null,
    idx: null,
    id: null,
    horizontal: null,
    
    
    addSubItems: function(items) {
        var i;
        if (items == null) {
            this.subItems = null;
        } else {
            this.subItems = new Array();
            for(i=0;i<items.length;i++) {
                //alert(items[i]);
                //this.subItems.push( new HMenuItem(items[i][0], items[i][1]));
                this.subItems.push( items[i] );
            }
        }
    },
    
    renderItem: function(level) {
        if (this.parent == null) return '';
        var html = '', attr = '';
        for(var l=0; l<level; l++) html+='  ';
        attr += ' id="hmenuitem_'+this.id+'"';
        if (this.horizontal)
            attr += ' horizontal="true"';
        if (this.subItems) {
            attr += ' submenu="hmenu_'+this.id+'"';
        } else if (this.url) {
            attr += ' action="'+this.url+'"';
        }
        attr += ' class="hmenuitem'+(this.subItems?' hhassubmenu':'')
            +' hmenulevel'+this.level
            +(this.selected?' hmenuselected':'')
            +'"';
        if (this.userMenuId) {
            attr += ' userid="'+this.userMenuId+'"';
        }
        /*
        if (this.subItems) {
            attr += ' class="hmenuitem hhassubmenu hmenulevel'+this.level+'"';
        } else {
            attr += ' class="hmenuitem hmenulevel'+this.level+'"';
        }
        */
        attr += ' onmouseover="HMenuOver(this)" onmouseout="HMenuOut(this)" onclick="HMenuAction(this)"';
        if (!this.horizontal)
            html += '<tr>';
        html += '<td'+attr+'>';
            //+this.id+','+this.level+','+this.idx+','+
        html += this.caption;
        html += '</td>';
        if (!this.horizontal)
            html += '</tr>';
        html += '\n';
        return html;
    },
    
    renderSubMenu: function(level) {
        if (!this.subItems) {
            return '';
        }
        var i,html = '';
        /*for(i=0; i<this.subItems.length; i++) {
            html += this.subItems[i].render(level+1);
        }
        return html;*/

        //html += this.caption+':'+this.subItems.length+'\n';
        var attr = '', cls = '';
        cls = 'hmenu '+(this.id?'hsubmenu':'hmainmenu');
        attr += ' id="hmenu'+(this.id?'_'+this.id:'')+'" class="'+cls+'" menudiv="true"';
        if (this.parent) {
            attr +=' parent="hmenu'+(this.parent.id?'_'+this.parent.id:'')+'"';
        }
        html += '<div'+attr+'>\n<table cellpadding="0" cellspacing="0">\n'; // class="'+cls+'">\n';
        for(i=0; i<this.subItems.length; i++) {
            html += this.subItems[i].renderItem(level+1);
        }
        html += '</table>\n</div>\n';
        
        html += '\n';
        for(i=0; i<this.subItems.length; i++) {
            html += this.subItems[i].renderSubMenu(level+1);
        }
        html += '\n';
        return html;
    },
    
    render: function(level) {
        return this.renderItem(level) + this.renderSubMenu(level);
    },
    
    createIds: function(parent,level,idx) {
        this.parent = parent;
        this.level = level;
        this.idx = idx;
        if (parent == null) {
            this.id = '';
        } else {
            this.id = ''+(idx<10?idx:String.fromCharCode(idx+48+7));
        }
        //while (this.id.length < 2) this.id = '0'+this.id;
        
        if (this.parent) {
            this.id = ''+this.parent.id+this.id;
        }
        if (this.subItems) {
            for(var i=0; i<this.subItems.length; i++) {
                this.subItems[i].createIds(this, level+1, i);
            }
        } else {
        }
    }
    
}


/*
 
 class HMenu
 
*/
function HMenu(items) {
    this.root = new HMenuItem(null,items);
    this.root.createIds(null,0,0);
    return this;
}

HMenu.prototype = {
    root: null, // private
    horizontal: null,
    
    render: function() {
        var html = '';
        for (var i=0; i<this.root.subItems.length; i++) {
            this.root.subItems[i].horizontal = this.horizontal == true;
        }
        //html += '<table class="hmenu">\n';
        html += this.root.render(0);
        //html += '</table>\n';
        
        return html;
    }
    
}



/*
 
 ***
 
*/

if (typeof(addClass) == 'undefined') {
    
function addClass(elem, clsName) {
    var cls = elem.className;
    if (!cls) {
        elem.className = clsName;
    } else {
        cls = cls.split(' ');
        if (cls.indexOf(clsName) < 0) {
            cls.push(clsName);
            elem.className = cls.join(' ');
        }
    }
}

function removeClass(elem, clsName) {
    var cls = elem.className;
    if (!cls) {
    } else {
        var i;
        cls = cls.split(' ');
        if ((i=cls.indexOf(clsName)) >= 0) {
            delete cls[i];
            elem.className = cls.join(' ');
        }
    }
}

} // style classname functions



/*
 
 Menu Timers
 
*/

var hMenuTimeout = null;
var hMenuHideTimeout = null;

function cancelMenuTimeout() {
    if (hMenuTimeout) {
        clearTimeout(hMenuTimeout);
        hMenuTimeout = null;
    }
}
function setMenuTimeout(str, delay) {
    cancelMenuTimeout();
    hMenuTimeout = setTimeout(str, delay);
}

function setMenuHideTimeout() {
    if (hMenuHideTimeout) {
        clearTimeout(hMenuHideTimeout);
    }
    hMenuHideTimeout = setTimeout('HMenuCheckMouse()', HMENU_HIDEDELAY);
}
function HMenuCheckMouse() {
    var mdiv = HMenuFindDiv(elementUnderMouse);
    if (!mdiv) {
        HHideAllSubMenus();
    } else {
        setMenuHideTimeout();
    }
        
}


var elementUnderMouse = null;
function HMenuMouseMove(myEvent) {
    if (window.event) myEvent = window.event;
    var myElement = myEvent.srcElement ? myEvent.srcElement : (myEvent.target ? myEvent.target : null);
    elementUnderMouse = myElement;
}

function HMenuDocLoaded() {
    if (document.attachEvent) {
        document.attachEvent('onmousemove', HMenuMouseMove);
    } else {
        document.addEventListener('mousemove', HMenuMouseMove, true);
    }
}

if (document.attachEvent) {
    window.attachEvent('onload', HMenuDocLoaded);
} else {
    addEventListener('load', HMenuDocLoaded, true);
}



/*
 
 SubMenu hide/show
 
*/

if (typeof(AnchorPosition_getPageOffsetLeft) == 'undefined') {

function AnchorPosition_getPageOffsetLeft (el) {
	var ol=el.offsetLeft;
	while ((el=el.offsetParent) != null) { ol += el.offsetLeft; }
	return ol;
	}
function AnchorPosition_getPageOffsetTop (el) {
	var ot=el.offsetTop;
	while((el=el.offsetParent) != null) { ot += el.offsetTop; }
	return ot;
	}

} // ===

var openedSubMenus = new Array();
var openedCallers = new Array();
function HShowSubMenu(id, caller) {
    var div = document.getElementById(id);
    caller = document.getElementById(caller);

    if (div.style.display = 'none') {
        if (elementUnderMouse != caller) return;
    }

    var parent = document.getElementById(div.getAttribute('parent'));
    //var pos = getAnchorPosition(parent);
    var pos = new Object();
    pos.x = AnchorPosition_getPageOffsetLeft(parent);
    pos.y = AnchorPosition_getPageOffsetTop(parent);
    if (caller.getAttribute('horizontal')=='true') {
        pos.x += caller.offsetLeft;
        pos.y += parent.offsetHeight;
    } else {
        pos.x += parent.offsetWidth;
        pos.y += caller.offsetTop;
    }
    div.style.left = pos.x;
    div.style.top = pos.y;

    if (div.style.display = 'none') {
        //if (elementUnderMouse != caller) return;
        openedSubMenus.push(id);
        div.style.display = 'block';
        addClass(caller,'hmenuopen');
        openedCallers.push(caller);
    }
}

function HHideSubMenu(id) {
    var div = document.getElementById(id);
    var i = openedSubMenus.indexOf(id);
    if (i >= 0) {
        var caller = openedCallers[i];
        openedSubMenus = openedSubMenus.hdelete(i);
        openedCallers = openedCallers.hdelete(i);
        //delete openedSubMenus[i];
        div.style.display = 'none';
        div.onmouseout = null;
        removeClass(caller,'hmenuopen');
    }
}

function HHideAllSubMenus() {
    while (openedSubMenus.length > 0) HHideSubMenu(openedSubMenus[0]);
}

function HHideUnusedSubMenus(elem) {
    var sm = openedSubMenus;
    var flags = new Array(sm.length);
    var i,first = true, parent;
    for (i=0; i<flags.length; i++) flags[i] = 0;
    var submenu;
    var alreadyOpened = false;
    if (submenu = elem.getAttribute('submenu')) {
        i = sm.indexOf(submenu);
        if (i>=0) alreadyOpened = flags[i] = 1;
    }
    elem = HMenuFindDiv(elem); // megkeresi a div-et ami a td-hez tartozik
    while (elem != null) {
        i = sm.indexOf(elem.id);
        if (i>=0) flags[i] = 1;
        if (parent = elem.getAttribute('parent')) {
            elem = document.getElementById(parent);
        } else {
            elem = null;
        }
    }
    for (i=0; i<flags.length; i++) {
        if (!flags[i]) {
            HHideSubMenu(sm[i]);
        }
    }
    return alreadyOpened;
}

function HMenuFindDiv(elem) {
    while (elem != null && elem.getAttribute) {
        if (elem.getAttribute('menudiv')=='true') return elem;
        elem = elem.parentNode;
    }
    return null;
}



/*
 
 Menu Events
 
*/

function HMenuOver(elem, delay) {
    if (!delay) delay = HMENU_DELAY;
    cancelMenuTimeout(); // for safe
    addClass(elem,'hmenuover');
    var subMenu = elem.getAttribute('submenu');
    var alreadyOpened = HHideUnusedSubMenus(elem);
    if (subMenu && !alreadyOpened) {
        setMenuTimeout('HShowSubMenu(\''+subMenu+'\',\''+elem.id+'\')', delay);
    }
    setMenuHideTimeout();
}

function HMenuOut(elem) {
    removeClass(elem,'hmenuover');
    setMenuHideTimeout();
    //setMenuTimeout('HMenuCheckMouse()', 1000);
}

function HMenuAction(elem) {
    if (typeof(customMenuAction)!='undefined') {
        eval(customMenuAction+'(elem)');
        return;
    }
    var action = elem.getAttribute('action');
    if (action == null) {
        HMenuOver(elem, 1);
        return;
    }
    HHideAllSubMenus();
    if (action.indexOf('javascript:')==0) {
        action = action.substr(11);
        eval(action);
    } else {
        document.location = action;
    }
}







//alert(HMenu);
