function Menu(id, toolbar, level)
{
	this.id = id;
	this.toolbar = toolbar;
	this.shim = null;
	this.level = level;
}

var MenuManager = {  

	menus: [],
	keyboardShortcutsEnabled: true,
	
	init: function()
	{
		Event.observe(window, "load", MenuManager.load);
	},
	
	load: function()
	{
		Event.observe(document, "click", function( evt )
		    {
                if( evt )
	            {
	                var srcElement = $(Event.element(evt));

                    if( srcElement && (!srcElement.type || srcElement.type != "submit") )
                    {
                        if( srcElement.className == "menupanel" || srcElement.up(".menupanel") )
                        {
                            return;
                        }
                    }
                }
                
		        MenuManager.hideAll();
		    }
		);
						
		if(Prototype.Browser.IE)
		{
			$$('table.ToolbarItem tr').each( function(e) {
				Event.observe(e, 'mouseover', function() {
					Element.addClassName(e, 'ToolbarItemHover');
				});
				Event.observe(e, 'mouseout', function() {
					Element.removeClassName(e, 'ToolbarItemHover');
				});
			});

			$$('table.PopupItem tr').each( function(e) {
				Event.observe(e, 'mouseover', function() {
					Element.addClassName(e, 'PopupItemHover');
				});
				Event.observe(e, 'mouseout', function() {
					Element.removeClassName(e, 'PopupItemHover');
				});
			});
		}
	},
	
	registerMenu: function( id, toolbar, level )
	{
		var menu = new Menu(id, toolbar, level);
		this.menus.push( menu );
	},
	
	findMenu: function( id )
	{
		for( var i = 0; i < this.menus.length; ++i )
		{	
			if(this.menus[i].id == id)
			{
				return  this.menus[i];
			}
		}

		return null;
	},
	
	showMenu: function( evt, parent, id )
	{
		if(this.onBeforeShowMenu)
		{
			this.onBeforeShowMenu();
		}
			
		var menuToOpen = this.findMenu(id);
		if(menuToOpen === null)
		{
			return;
		}
			
		for( var i = 0; i < this.menus.length; ++i )
		{		
			var subMenu = $( this.menus[i].id );
			if( subMenu === null )
			{
				continue;
			}
				
			if( subMenu.id == menuToOpen.id && (menuToOpen.level > 1 || (menuToOpen.level == 1 && subMenu.style.display !== ''))  )
			{
				var parentPos = Position.positionedOffset(parent);
								
				Position.absolutize(subMenu);
				
				if(menuToOpen.level > 1)
				{
					parentPos[0] += Position.cumulativeOffset(parent)[0] + parent.offsetWidth - 10;
					parentPos[1] += Position.positionedOffset($(this.menus[i].toolbar))[1];
				}

				subMenu.style.left = parentPos[0] + "px";
				subMenu.style.top  = (parentPos[1] + parent.offsetHeight - 2) + "px"; 
				
				subMenu.setOpacity(0).show();
							
				if(this.menus[i].shim === null)
				{
					this.menus[i].shim = Element.extend(document.createElement('IFRAME')).hide().addClassName('menushim').setStyle({position:'absolute',zIndex:'9000',border:'none'});
					
					if(Prototype.Browser.IE)
					{
						this.menus[i].shim.frameBorder = '0';
					}
						
					subMenu.offsetParent.appendChild(this.menus[i].shim);
				}
							
				this.menus[i].shim.style.width = subMenu.offsetWidth.toString() + 'px';
				this.menus[i].shim.style.height = subMenu.offsetHeight.toString() + 'px';
				this.menus[i].shim.style.left = subMenu.style.left;
				this.menus[i].shim.style.top = subMenu.style.top;

				this.menus[i].shim.show();
				subMenu.setOpacity(1);
			}
			else
			{
				if(this.menus[i].level >= menuToOpen.level)
				{
					subMenu.hide();
					if(this.menus[i].shim !== null)
					{
						this.menus[i].shim.hide();
					}
				}
			}
		}
				
		return Event.stop(evt);
	},
	
	hideAll: function()
	{    
		for( var i = 0; i < this.menus.length; ++i )
		{
			var elemMenu = $( this.menus[i].id );
			if( elemMenu === null )
			{
				continue;
			}
				
			elemMenu.hide();
			if(this.menus[i].shim !== null)
			{
				this.menus[i].shim.hide();
			}
		}
   	},
   	
   	enableItem: function(clientId, enable)
   	{
   	    var link = $(clientId);
   	    if (!link)
   	    {
   	        return;
   	    }
   	           	    
   	    var isEnabled = !Element.hasClassName(link, 'disabled');
   	    var noop;
   	    
   	    if (enable && !isEnabled)
   	    {
   			Element.removeClassName(link, 'disabled');
   			noop = link.onclick;
   	        link.onclick = noop.originalFunction;
   	        noop.originalFunction = null;
   	    }
   	    else if(!enable && isEnabled)
   	    {
   	        Element.addClassName(link, 'disabled');
   	        noop = function() { return false; };
   	        noop.originalFunction = link.onclick;
   	        link.onclick = noop;
   	    }
   	},
   	
   	fireClickEvent: function(evt, id)
    {
		if(!MenuManager.keyboardShortcutsEnabled)
		{
			return;
		}
			
	    $(id).onclick();
	    if(evt && (evt !== null))
	    {
		    Event.stop(evt);
		}
    }
};

MenuManager.init();