/**
 * para crear cualquier menu: 
 *  Menus.newMenu(arrayMenus, arraySubMenus, opciones);
 * 
 * 	- El arrayMenus, es un array de strings, que contienen los ids de los padres de los menus
 * 	- EL arraySubMenus, es un array de string que contienen los ids de los submenus (los que se ocultaran).
 * 
 * 	- opciones
 * 		es un objecto javascript que permite varios parametros:
 * 			  unico: (true|false) si del conjunto, solo permitimos un menu abierto
 * 			  onOpenEffect: (function) funcion que permite definir la funcion que realizara el efecto de abrir el menu
 * 			  onCloseEffect: (function) funcion que permite definir la funcion que realizara el efecto de cerrar el menu
 * 			  onOpen: (function) funcion que se ejecuta tras abrir el menu
 * 			  onClose: (function) funcion que se ejecuta tras cerrar el menu
 * 			todas estas funciones reciben como parametros dos elementos, el menu y el submenu que estan implicados
 * 
 * 
 * 
 * Ejemplo de uso:
 * 	Menus.newMenu(["menu1", "menu2", "menu3"], ["submenu_menu1, "submenu_menu2", "submenu_menu3"], {unico: true, 
 * 		onOpenEffect: function(menu, submenu){
 * 			Effect.Appear(hijo); // esta es una funcion de scriptaculous.
 * 		}
 * 	})
 * 
 */
var Menus = {
	variableHrefAbiertos: "vE",
	objsMenus: new Array(),
	menusAbiertos: new Array(),
	
	obtenerAbiertos: function(){
		var params = this.getLocationParametros();
		var idsAbiertos = params[this.variableHrefAbiertos];
		if(idsAbiertos){
			this.menusAbiertos = idsAbiertos.split(",");
		}
	},
	actualizarAbiertos: function(){
		this.menusAbiertos = new Array();
		for(var i=0; i<this.objsMenus.length; i++){
			var menuAux = this.objsMenus[i];
			for(var j=0; j<menuAux.padres.length; j++){
				if(menuAux.padres[j].abierto){
					this.menusAbiertos.push(menuAux.padres[j].id);
				}
			}
		}
	},
	//funcion al hacer click en algun contenido de los submenus...
	anadirEstado: function(elem){	
		Menus.actualizarAbiertos();
		//this es el enlace
		var stringAbiertos = "";
		for(var i=0; i<Menus.menusAbiertos.length-1; i++){
			stringAbiertos += Menus.menusAbiertos[i] + ",";
		}
		if(Menus.menusAbiertos.length){
			stringAbiertos += Menus.menusAbiertos[Menus.menusAbiertos.length-1];
		}
		
		var expAncla = new RegExp(".#([^{&?}])*");
		var valorAncla = expAncla.exec(elem.href);
		elem.href=elem.href.replace(expAncla,'');
		
		var exp = new RegExp("." + Menus.variableHrefAbiertos + "=([^&])*");
		elem.href=elem.href.replace(exp,'');
		
		if (elem.href.indexOf('?')!=-1) {
	    	elem.href=elem.href+'&';
		} else {
			elem.href=elem.href+'?';
		}
		elem.href = elem.href + Menus.variableHrefAbiertos + '=' + stringAbiertos + valorAncla[0];
		// alert(elem.href);
	},
	anadirEstadoPersonalizado: function(elem, cadena) {
		var expAncla = new RegExp(".#([^{&?}])*");
		var valorAncla = expAncla.exec(elem.href);
		elem.href=elem.href.replace(expAncla,'');
		
		var exp = new RegExp("." + Menus.variableHrefAbiertos + "=([^&])*");
	   	elem.href = elem.href.replace(exp,'');
	   	
		if (elem.href.indexOf('?')!=-1) 
	    		elem.href = elem.href + '&';
		else 
			elem.href = elem.href + '?';	    
	  
		elem.href = elem.href + Menus.variableHrefAbiertos + '=' +  cadena +  valorAncla[0];
	},
	getLocationParametros: function(){
		var returnParametros = new Object();	
		var url = window.location.toString();
		var parametros = url.split("?");
		if(parametros.length >1){
			var parametros = parametros[1].split("&");
			for(var i=0; i<parametros.length; i++) {
				var param = parametros[i].split("=");
				
				var valor = param[1];
				param = param[0];
				returnParametros[param] = valor;
			}
	 	} 	
 	return returnParametros;
	},
	/**
	 * new Menu(arrayIdsPadres, arrayIdsHijos, opciones)
	 * opciones:
	 * 	- unico: true|false (si se permiten mantener un solo menu abierto o mas...)
	 *  - abiertos: array [] define los ids de los menus abiertos
	 * 	- onOpen: function que tiene el padre e hijo y permite definir el efecto a realizar
	 *  - onClose: function que ....
	 * 
	 */
	newMenu: function(arrayPadres, arrayHijos, opciones){
		if(this.menusAbiertos.length == 0){
			this.menusAbiertos = "TodosCerrados";
		}
		var opc = Object.extend(opciones || {}, {abiertos: this.menusAbiertos})
		this.objsMenus.push(new Menu(arrayPadres, arrayHijos, opc));
	}
}
Menus.obtenerAbiertos();

/**
 * new Menu(arrayIdsPadres, arrayIdsHijos, opciones)
 * 
 * opciones:
 * 	- unico: true|false (si se permiten mantener un solo menu abierto o mas...)
 *  	- abiertos: array [] define los ids de los menus abiertos
		 * si es unico, sera un string con el id del elemento abierto
		 * 
		 * si no es unico puede ser
		 *  - vacio: todos abiertos
		 *  - con alguno: los abiertos
		 *  - string con "cerrado" u otro texto: todos cerrados
 * 
 * 
 * 	- onOpen: function que tiene el padre e hijo y permite definier la accion a realizar, cambios de clase....
 *  	- onClose: function que ....
 * 			onOpen: function(elemPadre, elemHijo){
 * 				acciones a realizar
 * 			}
 * 	- onCloseEffect: function(elemPadre, elemHijo){}
 * 	- onOpenEffect: function(elemPadre, elemHijo){}
 * 
 */
function Menu(arrayPadres, arrayHijos, opciones){
	this.opciones = Object.extend({
		unico: false,
		abiertos: []
	}, opciones || {});
	this.padres = new Array(); //objetos dom
	this.hijos = new Array(); //objetos dom
	this.unico = this.opciones.unico;
	this.crearMenu(arrayPadres, arrayHijos);	
}
Menu.prototype.crearMenu = function(pd, hj){
	for(var i=0; i<pd.length; i++){
		var pdAux = $(pd[i]);
		var hjAux = $(hj[i]);
		
		if(typeof pdAux != "undefined" && (typeof hjAux != "undefined" || hj[i] == null)){
			this.padres.push(pdAux);
			if (hj[i] != null) {
				this.hijos.push(hjAux);
			} else {
				this.hijos.push(null);
			}
			
			//Logica para abrir por defecto los menus
			if(this.unico){
				if(this.opciones.abiertos.indexOf(pdAux.id) != -1){
					pdAux.abierto = true;
					if(typeof this.opciones.onOpen == 'function'){
						this.opciones.onOpen(pdAux, hjAux);
					}
				} else{
					pdAux.abierto = false;
					if (hj[i] != null) {
						hjAux.style.display = "none";
					}
					if(typeof this.opciones.onClose == 'function'){
						if (hj[i] != null) {
							this.opciones.onClose(pdAux, hjAux);
						} else {
							this.opciones.onClose(pdAux, null);
						}
					}
				}
			} else{
				//buscamos si pdAux.id esta en el array de
				if(this.opciones.abiertos.length == 0){
					pdAux.abierto = true;
					if(typeof this.opciones.onOpen == 'function'){
						this.opciones.onOpen(pdAux, hjAux);
					}
				}
				else if(this.opciones.abiertos.indexOf(pdAux.id) != -1){
					pdAux.abierto = true;
					if(typeof this.opciones.onOpen == 'function'){
						this.opciones.onOpen(pdAux, hjAux);
					}
				} else{
					pdAux.abierto = false;
					hjAux.style.display = "none";
					if(typeof this.opciones.onClose == 'function'){
						this.opciones.onClose(pdAux, hjAux);
					}
				}
			}
			var _this = this;
			pdAux.onclick = function(){
				_this.toggle(this.id);
			};
		}
	}
}
Menu.prototype.toggle = function(id){
	var pos = -1;
	for(var i=0; i<this.padres.length; i++){
		if(this.padres[i].id == id){
			pos = i;
			break;
		}
	}
	if(pos != -1){
		if(this.unico)
			this.abrirCerrarUnico(pos)
		else
			this.abrirCerrar(pos);
	}
}
Menu.prototype.abrirCerrar = function(pos){
	if(this.padres[pos].abierto){ //cerramos
		this.cerrarMenu(pos);
	} else{ //abrimos
		this.abrirMenu(pos);
	}
}
Menu.prototype.abrirCerrarUnico = function(pos){
	for(var i=0; i<this.padres.length; i++){
		if(this.padres[i].abierto){
			if(i != pos)
				this.cerrarMenu(i);
			break;
		}
	}
	if(this.padres[pos].abierto)
		this.cerrarMenu(pos);
	else
		this.abrirMenu(pos);
	
}
Menu.prototype.cerrarMenu = function(pos){
	this.padres[pos].abierto = false;
	if(typeof this.opciones.onCloseEffect == 'function'){
		this.opciones.onCloseEffect(this.padres[pos], this.hijos[pos]);
	} else{
		if (this.hijos[pos] != null) {
			this.hijos[pos].style.display = "none";
		}
	}
	if(typeof this.opciones.onClose == 'function')
		this.opciones.onClose(this.padres[pos], this.hijos[pos]);
}
Menu.prototype.abrirMenu = function(pos){
	this.padres[pos].abierto = true;
	if(typeof this.opciones.onOpenEffect == 'function'){
		this.opciones.onOpenEffect(this.padres[pos], this.hijos[pos]);
	} else{
		if (this.hijos[pos] != null) {
			this.hijos[pos].style.display = "";
		}
	}
	if(typeof this.opciones.onOpen == 'function')
		this.opciones.onOpen(this.padres[pos], this.hijos[pos]);
}

/*
Object.extend = function(destination, source) {
  for (var property in source) {
    destination[property] = source[property];
  }
  return destination;
}
function $() {
  var results = [], element;
  for (var i = 0; i < arguments.length; i++) {
    element = arguments[i];
    if (typeof element == 'string')
      element = document.getElementById(element);
	if(element)
	  results.push(element);
  }
  return results.reduce();
}
Object.extend(Array.prototype, {
  reduce: function() {
    return this.length > 1 ? this : this[0];
  },
  indexOf: function(object) {
    for (var i = 0; i < this.length; i++)
      if (this[i] == object) return i;
    return -1;
  }
});
*/