// Create the namespace
if( !window.com ) {
	/**
	 * @ignore
	 **/
	window.com = new Object();
}
if( !com.jitjat ) {
	/**
	 * @ignore
	 **/
	 com.jitjat = new Object();
}
if( !com.jitjat.menus ) {
	/**
	 * @ignore
	 **/
	 com.jitjat.menus = new Object();
}

/**
 * @class Menu Management Class
 * <p>Handles menu events and initialization</p>
 * *
 * @author Gregory Ramsperger <gregory@jitjat.com>
 * @version 2.0, Feb 16, 2005
 * @constructor
 **/
com.jitjat.menus.MenuRegistry = function() {
		var menuRegistryRef = this;
		try {
			// mozilla/firefox/safari/w3c
			window.addEventListener( "load", function() { menuRegistryRef.initMenus(); }, false );
			window.addEventListener( "unload", function() { menuRegistryRef.closeAllMenus(); }, false );
			
		} catch( e ) {
			try {
				// ie 5+
				window.attachEvent( "onload", function() { menuRegistryRef.initMenus(); }, false );
				window.attachEvent( "onunload", function() { menuRegistryRef.closeAllMenus(); }, false );
			} catch( e ) {
				// others
				// be a little more careful with this and add old refs
				var oldOnLoadRef = window.onload ? window.onload : document.onload;
				var oldOnUnLoadRef = window.onunload ? window.onunload : document.onunload;
				
				window.onload = document.onload = function() {
					menuRegistryRef.initMenus();
					oldOnLoadRef();
				}

				window.onunload = document.onunload = function() {
					menuRegistryRef.closeAllMenus();
					oldOnUnLoadRef();
				}
					

			}
		}
}

	/**
	 * Storage of registered menus
	 * @private
	 * @type Array
	 **/
	com.jitjat.menus.MenuRegistry.prototype.registeredMenus = new Array();
	
	/**
	 * Timer used for delayed menu close
	 * @private
	 * @type timeout
	 **/
	com.jitjat.menus.MenuRegistry.prototype.closeTimer = null;

	/**
	 * Clear the delayed menu close timer
	 * @private
	 **/
	com.jitjat.menus.MenuRegistry.prototype.clearCloseTimer = function() {
		if( this.closeTimer ) {
			clearTimeout( this.closeTimer );
			this.closeTimer = null;
		}
	}

	/**
	 * Close all registered menus
	 **/
	com.jitjat.menus.MenuRegistry.prototype.closeAll = function() {
		for( menuName in this.registeredMenus ) {
			this.registeredMenus[menuName].close();
		}
	}

	/**
	 * Prepare a for a delayed close
	 **/
	com.jitjat.menus.MenuRegistry.prototype.delayedClose = function() {
		this.clearCloseTimer();
		this.closeTimer = setTimeout('menuRegistry.closeAll();', 500);
	}

	/**
	 * Get a named menu from the registry
	 * @param <dfn>String</dfn> menuName the name of the menu to retrieve
	 * @return a com.jitjat.menus.Menu or <code>null</code>
	 **/
	com.jitjat.menus.MenuRegistry.prototype.getMenu = function( menuName ) {
		return this.registeredMenus[menuName];
	}

	/**
	 * Open a named menu from the registry
	 * <p>Closes any other registered menus</p>
	 * @param <dfn>String</dfn> menuName the name of the menu to open
	 **/
	com.jitjat.menus.MenuRegistry.prototype.open = function( menuName ) {
		this.clearCloseTimer();

		menuName = menuName.toString();

		for( thisMenuName in this.registeredMenus ) {
			if( thisMenuName == menuName ) {
				this.registeredMenus[thisMenuName].open();
			} else {
				this.registeredMenus[thisMenuName].close();
			}
		}
	}

	/**
	 * Register a menu with the registry
	 * <p>This is where the magic happens. Event listeners are added to the menu, the menuBody, and the menuHead</p>
	 * @param <dfn>com.jitjat.menus.Menu</dfn> menu the menu to register in this registry
	 **/
	com.jitjat.menus.MenuRegistry.prototype.register = function( menu ) {
		var menuRef = menu;
		var menuRegistryRef = this;
		var menuEle = document.getElementById( menu.name );
		var menuHeadEle = document.getElementById( menu.name + "Head" );
		var menuBodyEle = document.getElementById( menu.name + "Body" );
		var menuItemEles = menuBodyEle.getElementsByTagName( "li" );

		try {
			// mozilla/firefox/safari/w3c
			menuHeadEle.addEventListener( "mouseover", function() { menuRegistryRef.menuHeadOver(  menuRef ); }, false );
			menuHeadEle.addEventListener( "mouseout",  function() { menuRegistryRef.menuHeadOut(   menuRef ); }, false );
			menuHeadEle.addEventListener( "mouseup",   function() { menuRegistryRef.menuHeadUp(    menuRef ); }, false );
			menuHeadEle.addEventListener( "mousedown", function() { menuRegistryRef.menuHeadDown(  menuRef ); }, false );
			menuHeadEle.addEventListener( "click",     function() { menuRegistryRef.menuHeadClick( menuRef ); }, false );

			menuBodyEle.addEventListener( "mouseover", function() { menuRegistryRef.menuBodyOver( menuRef ); }, false );
			menuBodyEle.addEventListener( "mouseout",  function() { menuRegistryRef.menuBodyOut(  menuRef ); }, false );
			
			for( var i=0; i<menuItemEles.length; i++ ) {
				var menuItemEleRef = menuItemEles[i];
				menuItemEleRef.addEventListener( "mouseover", function() { menuRegistryRef.menuItemOver(  menuRef, menuItemEleRef ); }, false );
				menuItemEleRef.addEventListener( "mouseout",  function() { menuRegistryRef.menuItemOut(   menuRef, menuItemEleRef ); }, false );
				menuItemEleRef.addEventListener( "mouseup",   function() { menuRegistryRef.menuItemUp(    menuRef, menuItemEleRef ); }, false );
				menuItemEleRef.addEventListener( "mousedown", function() { menuRegistryRef.menuItemDown(  menuRef, menuItemEleRef ); }, false );
				menuItemEleRef.addEventListener( "click",     function() { menuRegistryRef.menuItemClick( menuRef, menuItemEleRef ); }, false );
			}
			
		} catch( e ) {
			try {
				// ie 5+
				menuHeadEle.attachEvent( "onmouseover", function() { menuRegistryRef.menuHeadOver(   menuRef ); }, false );
				menuHeadEle.attachEvent( "onmouseout",  function() { menuRegistryRef.menuHeadOut(    menuRef ); }, false );
				menuHeadEle.attachEvent( "onmouseup",   function() { menuRegistryRef.menuHeadUp(     menuRef ); }, false );
				menuHeadEle.attachEvent( "onmousedown", function() { menuRegistryRef.menuHeadDown(   menuRef ); }, false );
				menuHeadEle.attachEvent( "onclick",     function() { menuRegistryRef.menuHeadClick(  menuRef ); }, false );

				menuBodyEle.attachEvent( "onmouseover", function() { menuRegistryRef.menuBodyOver( menuRef ); }, false );
				menuBodyEle.attachEvent( "onmouseout",  function() { menuRegistryRef.menuBodyOut(  menuRef ); }, false );

				for( var i=0; i<menuItemEles.length; i++ ) {
					var menuItemEleRef = menuItemEles[i];
					menuItemEleRef.attachEvent( "onmouseover", function() { menuRegistryRef.menuItemOver(   menuRef, menuItemEleRef ); }, false );
					menuItemEleRef.attachEvent( "onmouseout",  function() { menuRegistryRef.menuItemOut(    menuRef, menuItemEleRef ); }, false );
					menuItemEleRef.attachEvent( "onmouseup",   function() { menuRegistryRef.menuItemUp(     menuRef, menuItemEleRef ); }, false );
					menuItemEleRef.attachEvent( "onmousedown", function() { menuRegistryRef.menuItemDown(   menuRef, menuItemEleRef ); }, false );
					menuItemEleRef.attachEvent( "onclick",     function() { menuRegistryRef.menuItemClick(  menuRef, menuItemEleRef ); }, false );
				}
			} catch( e ) {
				// others
				menuHeadEle.onmouseover = function() { menuRegistryRef.menuHeadOver(   menuRef ); };
				menuHeadEle.onmouseout  = function() { menuRegistryRef.menuHeadOut(    menuRef ); };
				menuHeadEle.onmouseup   = function() { menuRegistryRef.menuHeadUp(     menuRef ); };
				menuHeadEle.onmousedown = function() { menuRegistryRef.menuHeadDown(   menuRef ); };
				menuHeadEle.onclick     = function() { menuRegistryRef.menuHeadClick(  menuRef ); };

				menuBodyEle.onmouseover = function() { menuRegistryRef.menuBodyOver( menuRef ); };
				menuBodyEle.onmouseout  = function() { menuRegistryRef.menuBodyOut(  menuRef ); };

				for( var i=0; i<menuItemEles.length; i++ ) {
					var menuItemEleRef = menuItemEles[i];
					menuItemEleRef.onmouseover = function() { menuRegistryRef.menuItemOver(  menuRef, menuItemEleRef ); };
					menuItemEleRef.onmouseout  = function() { menuRegistryRef.menuItemOut(   menuRef, menuItemEleRef ); };
					menuItemEleRef.onmouseup   = function() { menuRegistryRef.menuItemUp(    menuRef, menuItemEleRef ); };
					menuItemEleRef.onmousedown = function() { menuRegistryRef.menuItemDown(  menuRef, menuItemEleRef ); };
					menuItemEleRef.onclick     = function() { menuRegistryRef.menuItemClick( menuRef, menuItemEleRef ); };
				}
			}
		}

		this.registeredMenus[menu.name] = menu;
	}

	/** menuHeadOver( DOMElement )
	 *  Handle mouseover events from menu buttons
	 **/
	com.jitjat.menus.MenuRegistry.prototype.menuHeadOver = function( menu ) {
		this.open(menu);
	
	}
	
	/** menuHeadOut( DOMElement )
	 *  Handle mouseout events from menu buttons
	 **/
	com.jitjat.menus.MenuRegistry.prototype.menuHeadOut = function( menu ) {
		this.delayedClose();
	}
	
	com.jitjat.menus.MenuRegistry.prototype.menuHeadDown = function( menu ) {}
	com.jitjat.menus.MenuRegistry.prototype.menuHeadUp = function( menu ) {}
	com.jitjat.menus.MenuRegistry.prototype.menuHeadClick = function( menu ) {}

	
	/** menuBodyOver( )
	 * Handle moueover events from the menu contents
	 **/
	com.jitjat.menus.MenuRegistry.prototype.menuBodyOver = function( menu ) {
		this.clearCloseTimer();
	}
	
	/** menuBodyOut( )
	 * Handle moueout events from the menu contents
	 **/
	com.jitjat.menus.MenuRegistry.prototype.menuBodyOut = function( menu ) {
		this.delayedClose();
	}

	/** menuItemOver( )
	 * Handle moueover events from the menu contents
	 **/
	com.jitjat.menus.MenuRegistry.prototype.menuItemOver = function( menu, itemEle ) {
		this.clearCloseTimer();
	}
	
	/** menuItemOut( )
	 * Handle moueout events from the menu contents
	 **/
	com.jitjat.menus.MenuRegistry.prototype.menuItemOut = function( menu, itemEle ) {
		this.delayedClose();
	}
	
	com.jitjat.menus.MenuRegistry.prototype.menuItemDown = function( menu ) {}
	com.jitjat.menus.MenuRegistry.prototype.menuItemUp = function( menu ) {}

	/** itemClick( DOMElement )
	 *  Handle click events from menu items
	 **/
	com.jitjat.menus.MenuRegistry.prototype.menuItemClick = function( item ) {
		this.closeAll();
	}
	
	com.jitjat.menus.MenuRegistry.prototype.closeAllMenus = function() {
		this.closeAll();
	}


/** Menu( string, boolean )
 *  The constructor for Menu instances.
 *  The first parameter is the menu name.
 *  The second parameter determines whether this menu's button remains in
 *    the active state or gets a rollover state. (optional)
 **/
com.jitjat.menus.Menu = function( menuName, isActive ) {
	this.name = menuName;
	this.isActive = (isActive) ? true : false;
}

	com.jitjat.menus.Menu.prototype.toString = function() { return this.name; }

	/** Menu.close()
	 *  Closes this menu
	 **/
	com.jitjat.menus.Menu.prototype.close = function() {
		this.getBody().style.display = "none";
	}

	/** Menu.getButton():menu button
	 *  Gets the DOM element representing the menu button
	 **/
	com.jitjat.menus.Menu.prototype.getButton = function() {
		return document.getElementById( this.name + "Btn" );
	}

	/** Menu.getBody():menu layer DIV
	 *  Gets the DOM element representing the menu layer
	 **/
	com.jitjat.menus.Menu.prototype.getBody = function() {
		return document.getElementById( this.name + "Body" );
	}

	/** Menu.open()
	 *  Opens this menu
	 **/
	com.jitjat.menus.Menu.prototype.open = function() {
		this.getBody().style.display = "block";
	}

/*====================================================*/


/*** INSTANCE INITIALIZATION ***/
menuRegistry = new com.jitjat.menus.MenuRegistry();

menuRegistry.initMenus = function() {
	// register and create the menu objects
	menuRegistry.register( new com.jitjat.menus.Menu("menu_explore", false) );
}
