GALILEO.util.Event.clickRightButton = new YAHOO.util.CustomEvent("clickRightButton");
GALILEO.util.Event.clickLeftButton = new YAHOO.util.CustomEvent("clickLeftButton");
GALILEO.util.Event.clickDownButton = new YAHOO.util.CustomEvent("clickDownButton");
GALILEO.util.Event.clickUpButton = new YAHOO.util.CustomEvent("clickUpButton");

/**
 * Componente encargado de mover registros entre multiSelects.
 *
 * @param elIzq Select izquierdo
 * @param elDrcho Select derecho
 **/
 GALILEO.util.Form.GMoveMultiSelect = function (elDcha, elIzqda, elDivButtons) {

	var buttonIzqSimple = new Image();
	buttonIzqSimple.src = GALILEO.widget.MultiSelect.config.pathIzqSimpleImg;
	buttonIzqSimple.setAttribute("id", "izqSimple_"+elDivButtons.id);
		
	var buttonIzqTodo = new Image();
	buttonIzqTodo.src = GALILEO.widget.MultiSelect.config.pathIzqTodoImg;
	buttonIzqTodo.setAttribute("id", "izqTodo_"+elDivButtons.id);
	
	var buttonDchaSimple = new Image();
	buttonDchaSimple.src = GALILEO.widget.MultiSelect.config.pathDchaSimpleImg;
	buttonDchaSimple.setAttribute("id", "dchaSimple_"+elDivButtons.id);
		
	var buttonDchaTodo = new Image();
	buttonDchaTodo.src = GALILEO.widget.MultiSelect.config.pathDchaTodoImg;
	buttonDchaTodo.setAttribute("id", "dchaTodo_"+elDivButtons.id);
	
	
	// Ubicamos los nuevos botones en su posición definitiva. Dentro de los div adecuados.
	elDivButtons.appendChild(buttonDchaSimple);	
	elDivButtons.appendChild(buttonDchaTodo);
	elDivButtons.appendChild(buttonIzqSimple);	
	elDivButtons.appendChild(buttonIzqTodo);
	
	// Añadimos los class a los botones creados
	YAHOO.util.Dom.addClass("izqSimple_"+elDivButtons.id, "boton_multi4");
	YAHOO.util.Dom.addClass("izqTodo_"+elDivButtons.id, "boton_multi4");
	YAHOO.util.Dom.addClass("dchaSimple_"+elDivButtons.id, "boton_multi4");
	YAHOO.util.Dom.addClass("dchaTodo_"+elDivButtons.id, "boton_multi4");
	
	/**
     * Mueve los campos seleccionados de la izquierda a la derecha
     **/
	var moverDerecha = function () {
		var elSelectIzq = elIzqda;
		var elSelectDrcha = elDcha;
		var sizeListIzq = elSelectIzq.options.length;
		var sizeListDrcha = elSelectDrcha.options.length;
		if ((sizeListIzq != 0) && (elSelectIzq.selectedIndex != -1)) {
			if (elSelectIzq.options[elSelectIzq.selectedIndex].value != "") {
			
				while (elSelectIzq.selectedIndex != -1) {
					
					var flagTodos = false;
					var flagExiste = false;
					
					if (sizeListDrcha == 1){
						// Si en la derecha está la opción Todos, no se pueden añadir más elementos
						if (elSelectDrcha.options[0].value == 0){
							flagTodos = true;
						}
					}				
					
					for (var i = 0; i < sizeListDrcha; i++) {
						if (elSelectIzq.options[elSelectIzq.selectedIndex].value == elSelectDrcha.options[i].value) {
							flagExiste = true;
							break;
						}
					}
					
					if (!flagExiste && !flagTodos) {
						
						// Si el elemento seleccionado tiene valor 0 significa que es TODOS y tenemos que borrar los demas elementos
						if (elSelectIzq.options[elSelectIzq.selectedIndex].value == 0) {
							for (var i = sizeListDrcha; i > 0; i--) {
								elSelectDrcha.options[i-1] = null;
							}
							sizeListDrcha = 0;
						}
						
						var text = elSelectIzq.options[elSelectIzq.selectedIndex].text;
						var value = elSelectIzq.options[elSelectIzq.selectedIndex].value;
						var opcion = new Option(text, value);
						elSelectDrcha.options[sizeListDrcha++] = opcion;
						
						//Borramos el elemento selected de la lista Arriba/Izquierda
						/*var flag = false; //indica que el elemento ya ha sido borrado. Termina el bucle.
						for (var i = sizeListIzq; i > 0; i--) {
							if ((elSelectIzq.options[i - 1].selected) && (!flag)) {
								elSelectIzq.options[i - 1] = null;
								flag = true;
								if ((i == 1) && (sizeListIzq > 1)) {
									elSelectIzq.selectedIndex = i-1;
								}
							}
						}*/
						GALILEO.util.Event.clickRightButton.fire();
					}
					
					elSelectIzq.options[elSelectIzq.selectedIndex].selected = false; 
				}
			}
			if (flagTodos){
				alert("Ya ha seleccionado todas las distribuidoras");
			}
		}
	};
	
	/**
     * Mueve los todos los campos del select de la izquierda a la derecha
     **/
	var moverDerechaTodo = function () {
		var elSelectIzq = elIzqda;
		var elSelectDrcha = elDcha;
		var sizeListIzq = elSelectIzq.options.length;
		var sizeListDrcha = elSelectDrcha.options.length;
		if (sizeListIzq != 0) {
			
			var flagTodos = false; 
			// Si en la derecha está la opción Todos, no se pueden añadir más elementos
			if (sizeListDrcha == 1){
				if (elSelectDrcha.options[0].value == 0){
					flagTodos = true;
				}
			}		
			
			if (!flagTodos){
				//Borramos los elementos de la derecha por que como vamos a pasar todos
				//y con la nueva funcionalidad los de la izquierda no se borran pues tenemos
				//que borrar la lista de la derecha
				elSelectDrcha.length = 0;
				tamanioListaDrcha = 0;
				for (var i = 0; i < sizeListIzq; i++) {
					//si hay una opcion Todas, esa no se pasa
					if (elSelectIzq.options[i].value > 0){
						var text = elSelectIzq.options[i].text;
						var value = elSelectIzq.options[i].value;
						var opcion = new Option(text, value);
						elSelectDrcha.options[tamanioListaDrcha] = opcion;
						tamanioListaDrcha++;
					}
				}
				
				GALILEO.util.Event.clickRightButton.fire();
			}
			else{
				alert("Ya ha seleccionado todas las distribuidoras");
			}
		}
	};
	
	/**
     * Mueve los campos seleccionados de la derecha a la izquierda
     **/
	var moverIzquierda = function () {
		var elSelectIzq = elIzqda;
		var elSelectDrcha = elDcha;
		var sizeListIzq = elSelectIzq.options.length;
		var sizeListDrcha = elSelectDrcha.options.length;
		if (sizeListDrcha != 0) {
			for (var i = sizeListDrcha; i > 0; i--) {
				if (elSelectDrcha.options[i - 1].selected) {
					elSelectDrcha.options[i - 1] = null;
				}
			}
			GALILEO.util.Event.clickLeftButton.fire();
		}
	};
	
	/**
     * Mueve todos campos de la derecha a la izquierda
     **/
	var moverIzquierdaTodo = function () {
		var elSelectIzq = elIzqda;
		var elSelectDrcha = elDcha;
		var sizeListIzq = elSelectIzq.options.length;
		var sizeListDrcha = elSelectDrcha.options.length;
		if (sizeListDrcha != 0) {
			//Borramos todos los elementos del derecho
			elSelectDrcha.length = 0;
			
			GALILEO.util.Event.clickLeftButton.fire();
		}
	};
    
    //Establecemos los escuchadores de los botones.
	YAHOO.util.Event.addListener("izqSimple_"+elDivButtons.id, "click", moverIzquierda);
	YAHOO.util.Event.addListener("izqTodo_"+elDivButtons.id, "click", moverIzquierdaTodo);
	YAHOO.util.Event.addListener("dchaSimple_"+elDivButtons.id, "click", moverDerecha);
	YAHOO.util.Event.addListener("dchaTodo_"+elDivButtons.id, "click", moverDerechaTodo);
	YAHOO.util.Event.addListener(elIzqda, "dblclick", moverDerecha);
	YAHOO.util.Event.addListener(elDcha, "dblclick", moverIzquierda);
};


/**
 * Componente encargado de mover registros entre multiSelects.
 * Utiliza sólo dos botones, que son imágenes, 'añadir' y 'quitar', y los inserta en una celda de tabla.
 *
 * @param elUp Select superior
 * @param elDown Select inferior
 **/
GALILEO.util.Form.GMoveMultiSelect2Buttons = function (elUp, elDown, elDivButtons) {

	var buttonAdd = new Image();
	buttonAdd.src = GALILEO.widget.MultiSelect.config.pathDownImg;
	buttonAdd.setAttribute("id", "add_"+elDivButtons.id);
		
	var buttonClear = new Image();
	buttonClear.src = GALILEO.widget.MultiSelect.config.pathUpImg;
	buttonClear.setAttribute("id", "clear_"+elDivButtons.id);
	
	//Ubicamos los nuevos botones en su posición definitiva. Dentro de los div adecuados.
	elDivButtons.appendChild(buttonAdd);	
	elDivButtons.appendChild(buttonClear);
	
	/**
     * Mueve los campos seleccionados de la izquierda a la derecha
     **/
	var moverDerecha = function () {
		var elSelectIzq = elUp;
		var elSelectDrcha = elDown;
		var sizeListIzq = elSelectIzq.options.length;
		var sizeListDrcha = elSelectDrcha.options.length;
		if ((sizeListIzq != 0) && (elSelectIzq.selectedIndex != -1)) {
			if (elSelectIzq.options[elSelectIzq.selectedIndex].value != "") {
				var flagExiste = false;
					
				for (var i = 0; i < sizeListDrcha; i++) {
					if (elSelectIzq.options[elSelectIzq.selectedIndex].value == elSelectDrcha.options[i].value) {
						flagExiste = true;
						break;
					}
				}
				
				if (!flagExiste) {
				
					var text = elSelectIzq.options[elSelectIzq.selectedIndex].text;
					var value = elSelectIzq.options[elSelectIzq.selectedIndex].value;
					var opcion = new Option(text, value);
					elSelectDrcha.options[sizeListDrcha++] = opcion;

					GALILEO.util.Event.clickDownButton.fire(elUp, elDown);
				}
			}
		}
	};
	/**
     * Mueve los campos seleccionados de la derecha a la izquierda
     **/
	var moverIzquierda = function () {
		var elSelectIzq = elUp;
		var elSelectDrcha = elDown;
		var sizeListIzq = elSelectIzq.options.length;
		var sizeListDrcha = elSelectDrcha.options.length;
		if (sizeListDrcha != 0) {
			for (var i = sizeListDrcha; i > 0; i--) {
				if (elSelectDrcha.options[i - 1].selected) {
					elSelectDrcha.options[i - 1] = null;
				}
			}
			GALILEO.util.Event.clickUpButton.fire(elUp, elDown);
		}
	};
    
    //Establecemos los escuchadores de los botones.
	YAHOO.util.Event.addListener("add_"+elDivButtons.id, "click", moverDerecha);
	YAHOO.util.Event.addListener("clear_"+elDivButtons.id, "click", moverIzquierda);
};


/**
 * Componente que selecciona una opción de un componente select, introducida
 * desde un campo input.
 *
 * @param elInput
 * @param elSelect
 */
GALILEO.util.Form.GInputSelectSync = function (elInput, elSelect) {

	var elSelect = elSelect;
	var elInput = elInput;

	/**
	 * Método que comprueba si el valor introducido en el input existe en el select.
	 * 
	 * @param valor dato que proviene del input, y que será verificado
	 * @return boolean
	 * 				true: 'valor' existe en el select
	 * 				false: 'valor' no existe en el select
	 */
	var validate = function (valor) {
		var flag = false;
		for (var i = 0; i < elSelect.options.length; i++) {
			if (elSelect.options[i].value == valor) {
				flag = true;
			}
		}
		if (flag) {
			return true;
		} else {
			return false;
		}
	};

	/**
	 * Método que comprueba la existencia de una opción en blanco en el select,
	 * y en caso de que no existiera, la creará.
	 * 
	 * @param elSelect El select a comprobar
	 */
	var checkWhiteOption = function (elSelect) {
		elSelect.value = "";
		if (elSelect.value != "") {
			var opcionBlanca = new Option("", "", "defauldSelected");
			elSelect.options[elSelect.options.length] = opcionBlanca;
		}
		if (elInput.value != "") {
			if (validate(elInput.value)) {
				elSelect.value = elInput.value;
			} else {
				elSelect.value = "";
			}
		}
	};

	/**
	 * Método del componente que sincroniza el contenido del campo texto,
	 * y lo actualiza en el select.
	 *
	 * @param e
	 * @param obj Elemento input.
	 */
	var syncInputSelect = function (e, obj) {
		if (validate(obj.value)) {
			elSelect.value = obj.value;
		} else {
			elSelect.value = "";
		}
		
		var evObj = null;
		if( document.createEvent ) {
			evObj = document.createEvent('HTMLEvents');
			evObj.initEvent( 'change', true, true );
			elSelect.dispatchEvent(evObj);
		} else if  (document.createEventObject) {
  			evObj = document.createEventObject();
  			evObj.bubbles = true;
  			evObj.cancelable = true;
  			evObj.currentTarget = elSelect;
			elSelect.fireEvent('onchange',evObj);
		}
	};

	//Comprobamos el campo en blanco
	checkWhiteOption(elSelect);
	
	
	//Establecemos el escuchador para el campo input
	if (YAHOO.util.Event.getListeners(YAHOO.util.Dom.get(elSelect), "change" ) == null) {
		YAHOO.util.Event.addListener(elInput, "change", syncInputSelect, elInput);
	}
};

/**
 * Componente que seleccionada una opción del select, la muestra en el campo input
 *
 * @param elSelect
 * @param elInput
 */
GALILEO.util.Form.GSelectInputSync = function (elSelect, elInput) {

	var elSelect = elSelect;
	var elInput = elInput;

	/**
	 * Método del componente que sincroniza el contenido del campo select,
	 * y lo actualiza en el input.
	 *
	 * @param e
	 * @param obj Elemento select.
	 */
	var syncSelectInput = function (e, obj) {
		elInput.value = obj.value;
	};
	
	if (YAHOO.util.Event.getListeners(YAHOO.util.Dom.get(elSelect), "change" ) == null) {
		YAHOO.util.Event.addListener(elSelect, "change", syncSelectInput, elSelect);
	}
};

/**
 * Componente establece un reloj
 *
 * @param 
 * @param 
 */
GALILEO.util.Form.GClock = function (elSpan, objFecha, objSegundos) {

 	var dosPuntos = ":";
 	var spanCadenaHora;
 	var flagFecha = objFecha;;
 	var flagSegundos = objSegundos;

 	/**
 	 * Función que coloca ceros delante de un valor.
 	 *
 	 * @param valor Dato al que se le colocarán delante ceros.
 	 * @param n Longitud del dato final. Si 'valor' es menor que 'n', la diferencia se
 	 * 		rellenará con ceros.
 	 */
 	var rellenaCeros = function (valor, n) {
		s = "" + valor;
		while (s.length < n) {
			s = "0" + s;
		}
		return s;
	};

	/**
	 * refresca el span del reloj
	 */
	var dynamicDate = function () {
		var reloj;
		var fecha;
		var hora;
		var dia;
		var mes;
		var agno;
		var horas;
		var minutos;
		var segundos;

		fecha = new Date();
	
		horas = rellenaCeros(fecha.getHours(), 2);
	    minutos = rellenaCeros(fecha.getMinutes(), 2);
		
		if (flagFecha) {
			dia = rellenaCeros(fecha.getDate(), 2);
		    mes = rellenaCeros(fecha.getMonth()+1, 2);
		    agno = rellenaCeros(fecha.getFullYear(), 4);
		    
		    reloj = dia + "/" + mes + "/" + agno + " - ";
		} else {
			reloj = "";
		}
		
		reloj = reloj + horas + dosPuntos + minutos;
		
		if (flagSegundos) {
	    	segundos = rellenaCeros(fecha.getSeconds(), 2);
	    	reloj = reloj + dosPuntos + segundos;
	    }
	
		//Cambiamos el estado de los 2 puntos.
	    if (dosPuntos == ":") {
		    dosPuntos = " ";
		} else {
			dosPuntos = ":";
		}

		if (spanCadenaHora == null) {
			spanCadenaHora = elSpan;
		}
	    spanCadenaHora.innerHTML = reloj;
	    
	    window.setTimeout(dynamicDate, 1000);
    };
    
    dynamicDate();
}
