function copyFunction(func, arg)
{
	return function()
	{
		func(arg);
	}
}


var MenuModel = new Object();
var MenuElement = function()
{
    return{
    level : null,
    opened : false,
    element : null,
    childs : new Array(),
    ishiding : false,
    hidingref : null,
    parent : null
    }
}

Array.prototype.contains = function(object)
{
    for(var i = 0; i < this.length; i++)
    {
        if(this[i] == object)
            return true;
    }
    return false;
}

var root = new MenuElement();
root.level = -1;

function setMenuElementParent(item)
{
    if(item.level == 0)
    {
        if(!root.childs.contains(item))
        {
            item.parent = root;
            root.childs.push(item);
        }
    }
    else{
    try{
        var parent = item.element.parentNode.parentNode.parentNode;
        item.parent = MenuModel[parent.getAttribute('id')];
        MenuModel[parent.getAttribute('id')].childs.push(item);
        }catch(e)
        {
            alert(e + '\n\n' + item.element.innerHTML);
        }
    }
}

var TopMenu = new Object();

TopMenu.menuList = new Array();
TopMenu.activeMenu = null;
TopMenu.showLock = false;
TopMenu.hideLock = false;

TopMenu.addMenu = function(id)
{
	TopMenu.menuList.push(id);
}

TopMenu.init = function()
{
	//try{
	    for(m = 0; m < TopMenu.menuList.length; m++ )
	    {
	        var item = new MenuElement();
    	
		    var menuItem = document.getElementById(TopMenu.menuList[m]);
		    item.element = menuItem;
    		
		    var level = menuItem.className;
		    if(level == 'Last')
		        item.level = 0;
            else
            {
                level = level.split('Last')[0].split(' ')[0];
		        item.level = parseInt(level.substring(level.length - 1, level.length));
		    }
    		
		    MenuModel[menuItem.getAttribute('id')] = item;
    		
		    if (document.all){
			    menuItem.onmouseenter = copyFunction(TopMenu.show, menuItem);
			    menuItem.onmouseleave = copyFunction(TopMenu.delayedHide, menuItem);
		    }
		    else
		    {
			    menuItem.onmouseover = copyFunction(TopMenu.show, menuItem);
			    menuItem.onmouseout = copyFunction(TopMenu.delayedHide, menuItem);
		    }
		    //menuItem.style.zIndex = "1000";
		    TopMenu.menuList[m] = menuItem;
    		
		    lis = menuItem.getElementsByTagName("LI");
		    for(l = 0; l<lis.length; l++)
		    {
			    lis[l].style.display = "block";
		    }
	    }
	    for(key in MenuModel)
	    {
	        setMenuElementParent(MenuModel[key]);
	    }
	//}catch(e)
	//{
	    //alert("Menu::init - unable to initialize the menu.\nERROR:\n" + e);
	//}
}

/**
    Mindent bezar, csak azt az agat nem, ami az item-hez tartozik
*/
TopMenu.hideNonChildItems = function(parent, selected)
{
    if(parent != null)
    {
        for(var i = 0; i < parent.childs.length; i++)
        {
            var item = parent.childs[i];
            if(item != selected)
            {
                TopMenu.hideNonChildItems(item, null);
                if(item.opened)
                    TopMenu.hide(item.element);
            }
        }
    }
}

TopMenu.show = function(obj)
{
    try
    {
	if (TopMenu.showLock == false)
	{
	    var item = MenuModel[obj.getAttribute('id')];
	    item.ishiding = false;
	    if(item.hidingref != null)
	    {
	        clearInterval(item.hidingref);
	        item.hidingref = null;
	    }
	    
	    TopMenu.hideNonChildItems(item.parent);
	
		TopMenu.showLock = true;
		ul = obj.getElementsByTagName('DIV');
		if (ul.length > 0)
		{
			ul = ul[0];
			ul.style.display = 'block';
			TopMenu.activeMenu = ul;
		}
		
		lis = obj.parentNode;
		for(c = 0; c < lis.length; c++)
		{
			if(lis[c] != obj)
				selectedIndex = obj.className.indexOf(" selected");
				if (selectedIndex!=-1){
					obj.className = obj.className.substring(0, selectedIndex);
				}
		}
		
		obj.className += " selected";
		item.opened = true;
		
		TopMenu.showLock = false;
	}
	else{
		TopMenu.showLock = false;
	}
	}catch(e)
	{
	    alert("Menu::show - unable to show menu node [" + obj.getAttribute('id') +" ].\nERROR:\n" + e);
	}
}


TopMenu.delayedHide = function(obj)
{
    var item = MenuModel[obj.getAttribute('id')];
    item.ishiding = true;
    item.hidingref = setTimeout(copyFunction(TopMenu.hide, obj), 1000);  
}

/**
    Akkor zarhato be 
    -   ha a gyerek elemei kozott mar nincs semmi nyitva
    -   es maga a hiding folyamat nem lett leallitva
*/
TopMenu.isHidable = function(obj)
{
    var item = MenuModel[obj.getAttribute('id')];
    if(!item.ishiding)
        return false;

    item.ishiding = false;

    for(var i = 0; i < item.childs.length; i++)
    {
        if(item.childs[i].opened)
            return false;
    }
    
    return true;
}

TopMenu.hide = function(obj)
{
    try
    {
    if (TopMenu.hideLock == false && TopMenu.isHidable(obj))
	{	
		TopMenu.hideLock = true;
		
		ul = obj.getElementsByTagName('DIV');
		if (ul.length > 0)
		{
			ul = ul[0];
			ul.style.display = 'none';
		}
		if(TopMenu.activeMenu != null)
		{
			//TopMenu.activeMenu.style.display = 'none';
			TopMenu.activeMenu = null;
		}
		
		selectedIndex = obj.className.indexOf(" selected");
		if (selectedIndex!=-1){
			obj.className = obj.className.substring(0, selectedIndex);
		}
		var item = MenuModel[obj.getAttribute('id')];
		item.opened = false;
		item.hidingref = null;		
		TopMenu.hideLock = false;
	}
	else{
		TopMenu.hideLock = false;
	}
	}catch(e)
	{
	    alert("Menu::hide - unable to hide node.[" + obj.getAttribute('id') + "]\nERROR:\n" + e);
	}
}

addLoadEvent(TopMenu.init);
