/**********************************************************
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();
//separadores de los selectores
var sepN1="|*|";
var sepN2="|||";
var sepN3="|x|";
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 array Clase CSS para usar en la ventana (array)
@return objDOM Ventana del selector
*/
function ventanaSelector(idSelector,claseCSSPopup){
	var ventana = $("selectorVentana"+idSelector);
    if(!ventana){
        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";
    var clases = claseCSSPopup.split(" ");
    for(var i=0;i<clases.length;i++)
        ventana.className += " selectorVentana"+clases[i].charAt(0).toUpperCase()+clases[i].substring(1);
	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[idSelector] = new Array(); //reseteamos la navegacion
    if(ventana) //si hay ventana la cerramos
        cerrarVentana(ventana);
}


/**
@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(idDestino);
    //cargamos el dato visual en el selector
	var objResultado = $(idDestino+"Visual");
    ejecutarAjax(
                selectores[idDestino]['urlSelector'],
                "info=1&valorSelector="+valorDestino+"&idDestino="+idDestino,
                "POST",
                        function(respuesta){
                            if(objResultado)
                                objResultado.innerHTML = respuesta;
                            //una vez que se completa la petición, 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(idDestino);
    //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,ignorarOnChange){
	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,ignorarOnChange);
}

/**
@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
@param  bool Determina si hay que ignorar el evento onchange
*/
function quitarElementoDestinoSelector(idDestino,idElemento,posicionId,ignorarOnChange){
	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,ignorarOnChange);
	}
}


/**
@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). Pueden ser varias separadas por comas
@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);
    //vaciamos el contenido de la ventana actual
    var contenido = $$("#"+ventana.id+" .selectorVentanaContenido");
    if(contenido[0])
        contenido[0].innerHTML = "";
	//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));
}

/**
@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   Determina si un selector esta registrado
@param  string    Identificador del campo de selector
*/
function selectorRegistrado(idDestino){
    if(selectores[idDestino] && selectores[idDestino]['urlSelector']!="")
        return true;
    else
        return false;
}


/**
@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();
	}
}
