/**
 * The "menumin" object is the single global object used by CARGO Library.  It
 * contains utility function for setting up the minimized menubar of cargo interface.
 * @title  CARGO
 * @module menumin
 * @author Jose Manuel Rodriguez CNIO-INB (jmrodriguez@cnio.es)
 * @version 2.0
 */

/**
 * menumin is an abstract base class. It is defined by means of
 * list of menu items that composed by itself.
 * @constructor
 * @param {String} sContainerName Name of "div" container
 */
function menumin(sDivContainerName)
{
	this._createElementContainer(sDivContainerName, this.sDivMenuMin, "cargo-menu-min"); // Create "cargoMenuMin" Element

	this._initMenuMin();  // Initialize menu bar for Minimized widgets

};

menumin.prototype = {

/* ATTRIBUTES */

	/**
	* The Div name of menu bar
	* @type String
	*/
	sDivMenuMin: "cargoMenuMin",
	/**
	* The name of menu bar
	* @type String
	*/
	sMenuMinName: "menumin",
	/**
	* MenuBar YAHOO object
	* @type Object
	*/
	menu: null,

/* Private METHODS */

	/**
	* Create "div" element
	* @private
	* @param {String} sContainerName Name of "div" container
	*/
	_createElementContainer: function (sDivContainerName, sDivId, sDivClass)
	{
		var oDivElement = document.createElement("div");
		oDivElement.setAttribute("id", sDivId);
		oDivElement.setAttribute("class", sDivClass);
		document.getElementById(sDivContainerName).appendChild(oDivElement);
	},
	/**
	* Initialize MenuBar and
	* add click events into Widget SubMenu (to create widget "windows")
	* @private
	*/
	_initMenuMin: function (aSubMenuMin)
	{
		if ( eval(typeof(aSubMenuMin) != 'undefined') )
		{
			var aNewMenuMin = new Array();
			for (var iIndex = 0; iIndex < aSubMenuMin.length; iIndex++)
			{
				if (aSubMenuMin[iIndex] != null) {
					var sWidgetType = aSubMenuMin[iIndex].id;
					var aMenuItems = aSubMenuMin[iIndex].getItems();
	
					var aNewMenuItems = new Array();
					for (var i = 0; i < aMenuItems.length; i++)
					{
						var oMenuItem = new YAHOO.widget.MenuItem(aMenuItems[i].value);
						oMenuItem.value = aMenuItems[i].value;
						oMenuItem.text = aMenuItems[i].text;
						oMenuItem.target = aMenuItems[i].target;
						oMenuItem.clickEvent.subscribe(this._onWidgetMenuMinClick, oMenuItem );
						aNewMenuItems.push(oMenuItem);
					}
					var oNewMenuMin = {
						id: sWidgetType,
						text: sWidgetType,
						submenu: {
							id: sWidgetType,
							text: sWidgetType,
								itemdata: aNewMenuItems
							}
					};
					aNewMenuMin.push(oNewMenuMin);
				}
			}
			cargo.menuMin.menu.destroy();
			this.menu = new YAHOO.widget.MenuBar(this.sMenuMinName, { itemdata: aNewMenuMin });
		}
		else
		{
			this.menu = new YAHOO.widget.MenuBar(this.sMenuMinName, { visible: false });
		}
		this.menu.render(document.getElementById(this.sDivMenuMin));
	},
	/**
	* Every time user clicks on MenuItem of Widget,
	* we create "widget" object.
	* If the widget (window) already exists, we add widget object into array of cargo.service
	* @private
	*/
	_onWidgetMenuMinClick: function (p_sType, p_aArguments, oMenuMinItem)
	{
		// this "Menu Item" which has used this event
		var sWidgetName = this.value;
		
		// Get the input object from array
		var iServiceId = oMenuMinItem.target; // widget identifier ( == serviceId )
		var sWidgetType = oMenuMinItem.text ; // type of widget which has do event
	
		var aWidgetWindows = cargo.services[iServiceId].widgets;
		for (var iIndex = 0; iIndex < aWidgetWindows.length; iIndex++)
		{
			if ((aWidgetWindows[iIndex] != null) && (aWidgetWindows[iIndex].name == sWidgetName))
			{
				var aTypeSubMenuMin = cargo.menuMin.menu.getSubmenus(); // Get the minimized menus
				var iMenuMinIndex = cargo.menuMin._checkIfTypeMiniMenuExists(aTypeSubMenuMin, sWidgetType);
				var oMenuItem = aTypeSubMenuMin[iMenuMinIndex].removeItem(oMenuMinItem, sWidgetType);
	
				aWidgetWindows[iIndex].doMaximum(); // Maximaze the widget window
	
				// The subMenuMin of Type is empty
				if (aTypeSubMenuMin[iMenuMinIndex].getItems().length == 0)
				{
					aTypeSubMenuMin[iMenuMinIndex] = null;
					cargo.menuMin._initMenuMin(aTypeSubMenuMin);
				}
			}
		}
	},
	/**
	* Check if minimized menu already has the given type as menu.
	* @private
	* @return {Boolean} iIndex Index of array of widget submenu describing the type of widget
	*/
	_checkIfTypeMiniMenuExists: function (aWidgets, sType)
	{
		for ( var iIndex = 0; iIndex < aWidgets.length; iIndex ++)
		{
			if ( aWidgets[iIndex].id == sType ) { return iIndex; }
		}
		return -1;
	}
};

