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

var navegacionSelector = new Array();
var urlSelectorActual = "";
//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	int	Ancho en pixels de la ventana
@param	int	Alto en pixels de la ventana
*/
function ventanaSelector(ancho,alto){
	var ventana = document.getElementById("selectorVentanaPopup");
	if(ventana==null){
		ventana = document.createElement("div");
		ventana.id = "selectorVentanaPopup";
		//ponemos ahora el HTML a la ventana
        var html = "";
		html += "<a href='javascript:cerrarVentanaSelector()' class='boton botonCerrar' title='"+txtCerrarVentana+"'>";
        html +=     txtCerrarVentana;
        html += "</a>";
		html += "<a href='javascript:atrasSelector()' class='boton botonVolver' title='"+txtVolverVentana+"'>";
        html +=     txtVolverVentana;
        html += "</a>";
		html += "<div id='selectorVentanaPopupContenido'></div>";
        ventana.innerHTML = html;
	}
	if(!ancho || !alto){
		ancho = 300;
		alto = 200;
	}
	//cogemos el div de contenido
	var contenido = ventana.childNodes[ventana.childNodes.length-1];
	if(contenido){
		contenido.style.width = ancho+"px";
		contenido.style.height = alto+"px";
	}
	ventana.style.width = (ancho+20)+"px";
	ventana.style.height = (alto+30)+"px";		
	return ventana;
}

/**
@desc   Obtiene las dimensiones actuales de la ventana de selector (-1,-1 si falla)
@return Vector de dos elementos con las dimensiones
*/
function dimensionesVentana(){
    /*var ventana = document.getElementById("selectorVentanaPopup");
    if(ventana){
        var contenido = ventana.childNodes[ventana.childNodes.length-1];
        if(contenido){
            var cssAncho = contenido.style.width;
            var cssAlto = contenido.style.height;
            var ancho = parseInt(cssAncho.substring(0,cssAncho.length-2));
            var alto = parseInt(cssAlto.substring(0,cssAlto.length-2));
            return new Array(ancho,alto);
        }else
            return new Array(-1,-1);
    }else*/
        return new Array(-1,-1);
}

/**                                      
@desc	Cierra la ventana popup de los selectores
*/
function cerrarVentanaSelector(){
	navegacionSelector = new Array(); //reseteamos la navegacion
	urlSelectorActual = "";
	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
*/
function cargarDestinoSelector(idDestino,urlSelector,valorDestino){
	var destino = document.getElementById(idDestino);
	if(destino)
		destino.value = valorDestino;
    cerrarVentanaSelector();
	//cargamos el dato visual en el selector
	ejecutarAjaxHTML(urlSelector,"info=1&valorSelector="+valorDestino+"&idDestino="+idDestino,"POST",idDestino+"Visual");
}

/**                                                                 
@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,urlSelector){
    var destino = document.getElementById(idDestino);   
    var valorActual = "";
    if(destino)
        valorActual = destino.value;        
    cerrarVentanaSelector();
    //cargamos el dato visual en el selector
    ejecutarAjaxHTML(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,urlSelector,valorElemento,posicionId){
	var destino = document.getElementById(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,urlSelector,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,urlSelector,valorElemento,posicionId){
    var destino = document.getElementById(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,urlSelector,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,urlSelector,idElemento,posicionId){
	var destino = document.getElementById(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,urlSelector,valorNuevo);
	}	
}


/**
@desc	Abre/Recarga la ventana del selector con los parametros pasados
@param	string	URL del generador de contenido para el selector
@param	string	Parámetros a pasar al generador de contenido
@param  int Ancho del selector
@param  int Alto del selector
@param  bool Si esta a true la página de selector se generará mostrando el letrero de "Cargando..."
*/
function abrirSelector(urlSelector,params,ancho,alto,mostrarCargando){
	//obtenemos/creamos la ventana para selectores
	var ventana = ventanaSelector(ancho,alto);
	//cargamos su contenido con ajax
    var cargando;
    if(mostrarCargando)
        cargando = txtCargando;
    else{//si la ventana cambia de tamaño, quitamos su contenido para que no haya fallos de visualización
        var ventanaDim = dimensionesVentana();
        if(ancho!=ventanaDim[0] || alto!=ventanaDim[1])
            cargando = "&nbsp;";
        else
            cargando = null;
    }
    //abrimos la ventana
    abrirVentana(ventana);
	ejecutarAjaxHTML(urlSelector,params,"POST","selectorVentanaPopupContenido",cargando,"!Se ha producido un error!");
    //añadimos la ruta al selector
	navegacionSelector.push(new Array(params,ancho,alto));
	urlSelectorActual = urlSelector;
}

/**                                          
@desc	Vuelve al paso anterior en el selector
*/
function atrasSelector(){	
	if(navegacionSelector.length>1){
		//obtenemos/creamos la ventana para selectores
		var navegacionAnterior = navegacionSelector[navegacionSelector.length-2];
		var ventana = ventanaSelector(navegacionAnterior[1],navegacionAnterior[2]);
		//abrimos la ventana
		abrirVentana(ventana);
		//cargamos su contenido con ajax
		ejecutarAjaxHTML(urlSelectorActual,navegacionAnterior[0],"POST","selectorVentanaPopupContenido",txtCargando,"!Se ha producido un error!");
		//quitamos la ultima ruta de la navegacion
		navegacionSelector.pop();
	}
}