/**********************************************************
Tipo:			Biblioteca de funciones Javascript
Descripción: 	Funciones de los selectores
**********************************************************/

//lista de selectores cargados (para cada id de selector, su url)
var selectores = new Array();
//lista de paginas por las que navega cada selector
var navegacionSelector = new Array();
var selectorActual = "";
//separadores de los selectores
var sepN1="|*|";
var sepN2="|||";
var txtCargando="<span class='cargando'>Cargando...</span>";
var txtCerrarVentana="Cerrar ventana";
var txtVolverVentana="Paso anterior";

/**
@desc	Abre la ventana de un selector
@param string Identificador del selector (campo al que apunta)
@param string Clase CSS para usar en la ventana
@return objDOM Ventana del selector
*/
function ventanaSelector(idSelector,claseCSSPopup){
	var ventana = $("selectorVentana"+idSelector);
	if(ventana==null){
		ventana = document.createElement("div");
		ventana.id = "selectorVentana"+idSelector;
        //ponemos ahora el HTML a la ventana
        var html = "";
		html += "<a href=\"javascript:cerrarVentanaSelector('"+idSelector+"')\" class='boton botonCerrar' title='"+txtCerrarVentana+"'>";
        html +=     txtCerrarVentana;
        html += "</a>";
		html += "<a href=\"javascript:atrasSelector('"+idSelector+"')\" class='boton botonVolver' title='"+txtVolverVentana+"'>";
        html +=     txtVolverVentana;
        html += "</a>";
		html += "<div class='selectorVentanaContenido selectorVentanaContenido"+claseCSSPopup+"' id='selectorVentanaContenido"+idSelector+"'></div>";
        ventana.innerHTML = html;
	}
    //cada vez se cambia el class para que cada selector se muestre de una forma
    ventana.className = "selectorVentana selectorVentana"+claseCSSPopup;
	return ventana;
}             

/**                                      
@desc	Cierra la ventana popup de los selectores
@param string Identificador del selector a cerrar
*/
function cerrarVentanaSelector(idSelector){
    var ventana = $("selectorVentana"+idSelector);
	navegacionSelector = new Array(); //reseteamos la navegacion
	selectorActual = "";
    if(ventana && ventana.firstChild) //quitamos su html interno por si hay imagenes y demás (sobrecargan la pagina)
        ventana.firstChild.innerHTML = "";
    cerrarVentana();
}


/**
@desc	Carga el dato pasado en el selector directamente y lo recarga
@param	string	Id del input hidden destino del selector
@param	string	URL del selector
@param	string	Valor a cargar
@param  bool Determina si hay que ignorar el evento onchange
*/
function cargarDestinoSelector(idDestino,valorDestino,ignorarOnChange){
    var destino = $(idDestino);
	if(destino)
		destino.value = valorDestino;
    cerrarVentanaSelector();
    //cargamos el dato visual en el selector
	ejecutarAjaxHTML(selectores[idDestino]['urlSelector'],"info=1&valorSelector="+valorDestino+"&idDestino="+idDestino,"POST",idDestino+"Visual");
    //llamamos a la funcion de cambio de selector
    if(selectores[idDestino]['onChange'] && !ignorarOnChange){
        var manejador = selectores[idDestino]['onChange'];
        manejador();
    }
}

/**
@desc   Recarga la visualización del selector segun su estado actual
@param  string    Id del input hidden destino del selector
@param  string    URL del selector
*/
function actualizarDestinoVisualSelector(idDestino){
    var destino = $(idDestino);
    var valorActual = "";
    if(destino)
        valorActual = destino.value;
    cerrarVentanaSelector();
    //cargamos el dato visual en el selector
    ejecutarAjaxHTML(selectores[idDestino]['urlSelector'],"info=1&valorSelector="+valorActual+"&idDestino="+idDestino,"POST",idDestino+"Visual");
}

/**
@desc	Añade/actualiza el dato pasado a la lista existente en el selector
@param	string	Id del input hidden destino del selector
@param	string	URL del selector
@param	string	Conjunto de valores del elemento a cargar (separados por "|")
@param	int	Posicion que ocupa el elemento identificador de cada n-upla
*/
function actualizarElementoDestinoSelector(idDestino,valorElemento,posicionId){
	var destino = $(idDestino);
	var valorNuevo = "";
	var enLista = false;
	if(destino && destino.value.length>0){
		//si habia datos, buscamos este id y lo añadimos
		var elementos = destino.value.split(sepN1);
		var idElemento = valorElemento.split(sepN2)[posicionId];
		for(var i=0;i<elementos.length;i++){
			var elemento = elementos[i].split(sepN2)[posicionId];
			if(elemento==idElemento){ //si ya estaba lo modificamos
				var inicio = "";
				if(i>0) //debe haber mas de 1 elemento
					inicio = elementos.slice(0,i).join(sepN1)+sepN1;
				var final = "";
				if(elementos.length>i+1)
					final = sepN1+elementos.slice(i+1).join(sepN1);
				valorNuevo = inicio+valorElemento+final;
				enLista = true;
			}
		}
		if(!enLista){
			if(elementos.length>0) //si habia elementos lo añadimos
				valorNuevo = destino.value+sepN1+valorElemento;
			else //si es el primero
				valorNuevo = valorElemento;
		}
	}else
		valorNuevo = valorElemento;
	cargarDestinoSelector(idDestino,valorNuevo);
}

/**
@desc    Añade/actualiza el dato pasado a la lista existente en el selector (permite repeticiones de elementos)
@param    string    Id del input hidden destino del selector
@param    string    URL del selector
@param    string    Conjunto de valores del elemento a cargar (separados por "|")
@param    int    Posicion que ocupa el elemento identificador de cada n-upla
*/
function actualizarElementoDestinoSelectorAditivo(idDestino,valorElemento,posicionId){
    var destino = $(idDestino);
    var valorNuevo = "";
    if(destino && destino.value.length>0)  //si habia elementos lo añadimos
        valorNuevo = destino.value+sepN1+valorElemento;
    else
        valorNuevo = valorElemento;  
    cargarDestinoSelector(idDestino,valorNuevo);
}

/**                                                                                        
@desc	Añade/actualiza el dato pasado a la lista existente en el selector
@param	string	Id del input hidden destino del selector
@param	string	URL del selector
@param	string	id del elemento a eliminar
@param	int	Posicion que ocupa el elemento identificador de cada n-upla
*/
function quitarElementoDestinoSelector(idDestino,idElemento,posicionId){
	var destino = $(idDestino);
	if(destino && destino.value.length>0){
		//si habia datos, buscamos este id y lo añadimos
        var elementos = destino.value.split(sepN1);
		for(var i=0;i<elementos.length;i++){
			var elemento = elementos[i].split(sepN2);
			if(elemento[0]==idElemento){ //si ya estaba lo modificamos
				elementos[i]=-1;
				break;
			}
		}		
		destino.value = "";
		for(var i=0;i<elementos.length;i++)
			if(elementos[i] != -1){
				destino.value += elementos[i];
				destino.value += sepN1;
			}
		var valorNuevo = destino.value.substring(0,destino.value.length-sepN1.length);
		cargarDestinoSelector(idDestino,valorNuevo);
	}	
}


/**
@desc	Abre/Recarga la ventana del selector con los parametros pasados
@param	string	Identificador del campo de selector
@param  string  Clase CSS para el popup a abrir (dependera de la pagina)
@param	string	Parámetros a pasar al generador de contenido
@param  bool Si esta a true la página de selector se generará mostrando el letrero de "Cargando..."
*/
function abrirSelector(idDestino,claseCSSPopup,params,mostrarCargando){
	//obtenemos/creamos la ventana para selectores
	var ventana = ventanaSelector(idDestino,claseCSSPopup);
	//cargamos su contenido con ajax
    var cargando;
    if(mostrarCargando)
        cargando = txtCargando;
    else
        cargando = "&nbsp;";
    //abrimos la ventana
    abrirVentana(ventana);
	ejecutarAjaxHTML(selectores[idDestino]['urlSelector'],params,"POST","selectorVentanaContenido"+idDestino,cargando,"¡Se ha producido un error!");
    //añadimos la ruta al selector
    if(!navegacionSelector[idDestino])
        navegacionSelector[idDestino] = new Array();
	navegacionSelector[idDestino].push(new Array(params,claseCSSPopup));
	selectorActual = idDestino;
}

/**
@desc    Registra un selector para poder usarlo
@param    string    Identificador del campo de selector
@param    string    URL donde se ejecuta el selector
@param    function  Funcion a ejecutar cuando el selector cambie
*/
function registrarSelector(idDestino,urlSelector,eventoOnChange){
    var selector = new Array();      
    selector['urlSelector'] = urlSelector;
    selector['onChange'] = eventoOnChange;
    selectores[idDestino] = selector;
    navegacionSelector[idDestino] = new Array();
}

/**                                          
@desc	Vuelve al paso anterior en el selector
@param  string Identificador del selector sobre el que volver
*/
function atrasSelector(idSelector){
    var nav = navegacionSelector[idSelector];
    if(nav && nav.length>1){
		//obtenemos/creamos la ventana para selectores
        var paramsAnterior = nav[nav.length-2][0];
        var claseCSSAnterior = nav[nav.length-2][1];
        var ventana = ventanaSelector(idSelector,claseCSSAnterior);
		//abrimos la ventana
		abrirVentana(ventana);
		//cargamos su contenido con ajax
		ejecutarAjaxHTML(selectores[idSelector]['urlSelector'],paramsAnterior,"POST","selectorVentanaContenido"+idSelector,txtCargando,"¡Se ha producido un error!");
		//quitamos la ultima ruta de la navegacion
		nav.pop();
	}
}