/*
Copyright (c) 2006, Caridy Patiņo (caridy@gmail.com). All rights reserved.
Code licensed under the BSD License:
http://developer.yahoo.net/yui/license.txt
Version 0.11.1
*/

/**
* @class
* MyMenuBar is an implementation of a Multilevel Menu Bar, displaying when the user mouses over a particular element, and disappearing on mouse out.
* @param {Element}	el	        The element representing the MenuBar
* @param {object}	userConfig	The configuration object literal containing the configuration that should be set for this Overlay. See configuration documentation for more details.
* @constructor
*/
YAHOO.widget.MyMenuBar = function(el, userConfig) {
    // Hides submenus of the root Menubar instance
    function hideSubmenus() {
        if(oMenuBar.activeItem) {
            var oSubmenu = oMenuBar.activeItem.cfg.getProperty("submenu");
            if(oSubmenu)
              oSubmenu.hide();
        }
    }    

    // Cancels the call to "hideSubmenus"
    function cancelTimer() {
      if(nTimeoutId)
        window.clearTimeout(nTimeoutId);
    }

    // "mouseout" event handler for each submenu of the menubar
    function onSubmenuMouseOut(p_sType, p_aArguments, p_oMenu) {
        cancelTimer();
        nTimeoutId = window.setTimeout(hideSubmenus, 750);
    }

    // "mouseover" handler for each item in the menubar
    function onMenuBarItemMouseOver(p_sType, p_aArguments, p_oMenuItem) {
        var oActiveItem = this.parent.activeItem;
        
        // Hide any other submenus that might be visible
        if(oActiveItem && oActiveItem != this)
            this.parent.clearActiveItem();
    
        // Select and focus the current MenuItem instance
        this.cfg.setProperty("selected", true);
        this.focus();
    
    
        // Show the submenu for this instance
        var oSubmenu = this.cfg.getProperty("submenu");
    
        if(oSubmenu)
          oSubmenu.show();
    }

    // "mouseout" handler for each item in the menubar
    function onMenuBarItemMouseOut(p_sType, p_aArguments, p_oMenuItem) {
        this.cfg.setProperty("selected", false);
        var oSubmenu = this.cfg.getProperty("submenu");
        if(oSubmenu) {
            var oDOMEvent = p_aArguments[0],
            	oRelatedTarget = YAHOO.util.Event.getRelatedTarget(oDOMEvent);
            if(!(oRelatedTarget == oSubmenu.element || this._oDom.isAncestor(oSubmenu.element, oRelatedTarget)))
              oSubmenu.hide();
        }
    }

    // events for each submenu
    function setSubmenus( aMenu ) {
	    var aMenuItems = aMenu.getItemGroups()[0],
			i = aMenuItems.length - 1;
	    if (i >= 0) {
		  do {
			var aSubMenu = aMenuItems[i].cfg.getProperty("submenu");
			
			if (typeof aSubMenu == 'object') {
		      // Add a "mouseover" event handler to each submenu
	          aSubMenu.mouseOverEvent.subscribe(cancelTimer);	
	          // Add a "mouseout" event handler to each submenu
	          aSubMenu.mouseOutEvent.subscribe(onSubmenuMouseOut, aSubMenu, true);
			  if (aSubMenu.srcElement && opacity)
				YAHOO.util.Dom.setStyle(aSubMenu.srcElement, 'opacity', opacity);
			  setSubmenus( aSubMenu );
			}
		  }
		  while(i--);
		}  
    }


    var nTimeoutId;
	var opacity = userConfig.opacity;

    // Instantiate and render the menubar and corresponding submenus
    var oMenuBar = new YAHOO.widget.MenuBar( el );
    oMenuBar.render();
    /*
        Add a "mouseover" and "mouseout" event handler each item 
        in the menu bar 
    */               
    var aMenuBarItems = oMenuBar.getItemGroups()[0],
        i = aMenuBarItems.length - 1;
    do {
        aMenuBarItems[i].mouseOverEvent.subscribe(onMenuBarItemMouseOver);
        aMenuBarItems[i].mouseOutEvent.subscribe(onMenuBarItemMouseOut);
    }
    while(i--);

    // Assign event handlers
    
    // Add a "mouseover" handler to the menubar
    oMenuBar.mouseOverEvent.subscribe(cancelTimer);
    
    // seting events for submenus
    setSubmenus( oMenuBar );

    // Add a "click" handler to the document
    YAHOO.util.Event.addListener(document, "click", hideSubmenus);
}

/**
* @class
* MyContextMenu is an implementation of a ContentMenu, displaying when the user click over a element.
* @param {Element}	el	        The element representing the Context where the menu must be displayed
* @param {object}	userConfig	The configuration object literal containing the configuration that should be set for this Overlay. See configuration documentation for more details.
* @constructor
*/
YAHOO.widget.MyContextMenu = function(el, userConfig) {
	var opacity = userConfig.opacity;
	// Create the context menu
	var oContextMenu = new YAHOO.widget.ContextMenu(
							userConfig.menu, 
							{ trigger: userConfig.context } 
						);
	
	if ((userConfig.options) && (typeof (userConfig.options) == 'object')) {
		var aMainMenuItems = userConfig.options;
		var nMainMenuItems = aMainMenuItems.length;
		var oMenuItem;
		// Add items to the main menu
		for(var i=0; i<nMainMenuItems; i++) {
			oMenuItem = new YAHOO.widget.ContextMenuItem(
							aMainMenuItems[i].text, 
							{ helptext: aMainMenuItems[i].helptext } 
						);
			/*
				Add a "click" event handler to each 
				ContextMenuItem instance
			*/
			oMenuItem.clickEvent.subscribe(
				aMainMenuItems[i].clickEvent, 
				oMenuItem, 
				true
			);
			oContextMenu.addItem(oMenuItem);
		}
	}
	
	// Render the context menu
	oContextMenu.render(document.body);
	oContextMenu.cfg.setProperty("context", [userConfig.context, "tl", "br"]);	
	
    /* Assign a "click" event handler display de context menu */
	YAHOO.util.Event.addListener(userConfig.context, "click", oContextMenu._onTriggerContextMenu, oContextMenu, true);

	if (oContextMenu.srcElement && opacity)
		YAHOO.util.Dom.setStyle(oContextMenu.srcElement, 'opacity', opacity);
}