/**********************************************************
Tipo:			Biblioteca de funciones Javascript
Descripción: 	Funciones genéricas Javascript
**********************************************************/

/**
@desc	Parsea una URL cambiando los caracteres raros por %NN, donde NN es su código ASCII
@param	string	texto a modificar
@return	string modificado
*/
function parsearURL(texto){
    var partes = texto.split("?");
    if(partes.length>1){
        var textoParams = partes.slice(1).join("?");
        var params = encodeURIComponent(textoParams).replace(/%26/g,"&").replace(/%3D/g,"=");
        return partes[0]+"?"+params;
    }else
        return texto;
}

/**
@desc	Determina si el navegador usado es mozilla
@return	bool true/false
*/
function esMozilla(){
	return (typeof document.implementation != 'undefined') && (typeof document.implementation.createDocument != 'undefined');
}

/**
@desc	Determina si el navegador usado es Internet Explorer
@return	bool true/false
*/
function esIE(){
	return (self.navigator.appName.indexOf("Microsoft Internet Explorer")!=-1);
}

/**
@desc	Obtiene el scroll horizontal de la pagina actual
@return	int Posición en pixels
*/
function obtenerScrollX(){
	if(navigator.appName == "Microsoft Internet Explorer")
		return document.documentElement.scrollLeft;
	else
		return window.pageXOffset;
}

/**
@desc	Obtiene el scroll vertical de la pagina actual
@return	int Posición en pixels
*/
function obtenerScrollY(){
	if(navigator.appName == "Microsoft Internet Explorer")
		return document.documentElement.scrollTop;
	else
		return window.pageYOffset;
}

/**
@desc	Obtiene el ancho total de la pagina en pixels
@return	int Ancho en pixels
*/
function anchoPagina(){
 	var de = document.documentElement;
 	var w = window.innerWidth || self.innerWidth || (de&&de.clientWidth) || document.body.clientWidth;
 	return w;
}

/**
@desc	Obtiene el alto total de la pagina en pixels
@return	int Alto en pixels
*/
function altoPagina(){
	var de = document.documentElement;
 	var h = window.innerHeight || self.innerHeight || (de&&de.clientHeight) || document.body.clientHeight
 	return h;
}

/**
@desc Genera un id aleatorio para aplicar sobre un elemento recien creado
@return string Id recien creado
*/
function generarIdAleatorio(){
    return "fwk"+parseInt(Math.random()*1000000);
}

/**
@desc	Muestra la ventana pasada (nodo DOM) en forma de popup emergente
@param	DOMNode	Nodo DOM a mostrar
*/
var fwkVentanas = new Array();
function abrirVentana(objVentana,sinFondo){
    if(fwkVentanas.indexOf(objVentana)>-1) //la ventana se ha abierto antes, la cerramos
        cerrarVentana(objVentana);
    var fondo = document.createElement("div");
    fondo.className = "divVentana";
    //creacion del fondo para oscurecer el resto de la pagina
    if(!sinFondo){
        fondo.className += " divFondoVentana";
	    fondo.style.top = "0px";
	    fondo.style.left = "0px";
	    fondo.style.width = anchoPagina()+"px";
	    fondo.style.height = altoPagina()+"px";
	    //mantenemos la ventana en la misma posicion independientemente del scroll
	    if(esIE()){
		    fondo.style.position = "absolute";
		    fondo.style.top = obtenerScrollY()+"px";
		    fondo.style.left = obtenerScrollX()+"px";
		    window.onscroll = function(){
			    fondo.style.top = obtenerScrollY()+"px";
			    fondo.style.left = obtenerScrollX()+"px";
		    }
	    }else{
		    fondo.style.position = "fixed";
		    fondo.style.top = "0px";
		    fondo.style.left = "0px";
	    }

	    if(esIE()){ //hacemos desaparecer todos los select de la pagina
            var combos = document.getElementsByTagName("select");
            for(var i=0;i<combos.length;i++)
                combos[i].style.display = "none";
        }
    }
    fondo.style.zIndex = 100+fwkVentanas.length;
    objVentana.style.zIndex = 100+fwkVentanas.length;
    //ponemos el nodo al fondo y al documento
    fondo.appendChild(objVentana);
    fwkVentanas.push(objVentana);
    document.body.appendChild(fondo);
}

/**
@desc	Cierra la última ventana mostrada
@param Object Objeto DOM con la ventana a ocultar
*/
function cerrarVentana(objVentana){
    if(!objVentana) //si no me viene la ventana obtengo la ultima mostrada
        objVentana = fwkVentanas[fwkVentanas.length-1];

    var i = fwkVentanas.indexOf(objVentana);
    if(i>-1){
        objVentana.parentNode.style.display = "none";
        objVentana.remove();
        fwkVentanas.splice(i,1);
    }

    if(fwkVentanas.length==0 && esIE()){
        //mostramos de nuevo todos los select de la pagina
        var combos = document.getElementsByTagName("select");
        for(var i=0;i<combos.length;i++){
            combos[i].style.display = "block";
        }
    }
}

/**
@desc   Devuelve true si se ha pulsado el enter (llamar desde onkeypress='esEnter(event)')
@param Event Evento a procesar
@return bool True si se ha pulsado enter
*/
function esEnter(e){
    //comprobamos el enter
    if(caracterPulsado(e) == 13){
        return true;
    }
}

/**
@desc   Determina si la cadena pasada es una dirección de e-mail correcta
@param  string Direccion a comprobar
@return bool True si es una direccion de e-mail, false en caso contrario
*/
function esEmail(email){
    var patron = new RegExp("([a-zA-Z0-9_\-]+(\.)?[a-zA-Z0-9_\-]+)+@([a-zA-Z0-9_\-]+(\.)[a-zA-Z0-9_\-]+)+");
    return (patron.test(email)==true);
}

/**
@desc   Devuelve el codigo ASCII de la tecla pulsada (llamar desde onkeypress='caracterPulsado(event)')
@param Event Evento a procesar
@return int Codigo ASCII de la tecla pulsada
*/
function caracterPulsado(e){
    var codigoCar;
    if(e && e.which){
        e = e;
        codigoCar = e.which;
    }else{
        e = event;
        codigoCar = e.keyCode;
    }
    return codigoCar;
}

/**
@desc   Espera el número de milisegundos pasado
@param  int    Tiempo en milisegundos que debe esperar el navegador
*/
function esperar(milisegundos){
    var esperando = true;
    var ahora = new Date();
    var alarma;
    var comienzoSegs = ahora.getTime();
    while(esperando){
        alarma = new Date();
        if(alarma.getTime() - comienzoSegs > milisegundos)
            esperando = false;
    }
}

/**
@desc   Muestra/oculta un elemento
@param  string   Id del tag HTML a ocultar/mostrar
@param  bool     Determina si hay que hacerlo visible o no, si no viene especificado se cambiará segun su display actual (si es display:block lo pasa a display:none y viceversa)
*/
function mostrarOcultar(idTagHTML,visible){
    var elemento = document.getElementById(idTagHTML);
    if(elemento){
        if(visible==undefined){
            if(elemento.style.display=="none")
                elemento.style.display = "block";
            else
                elemento.style.display = "none";
        }else{
            if(visible)
                elemento.style.display = "block";
            else
                elemento.style.display = "none";
        }
    }
}

/**
@desc   Muestra un mensaje de confirmación y redirige a la URL pasada para eliminar
@param  string  URL para eliminar
*/
function eliminarElemento(url){
    if(confirm("¿Eliminar elemento definitivamente?"))
        window.location = url;
}

/**
@desc   Muestra todas las propiedades de un objeto en un alert
@param  object Objeto para mostrar su contenido
*/
function mostrarAtributosObjeto(obj){
    var mensaje = "";
    for(p in obj)
        if((obj[p]+"").toString().indexOf("{")==-1)
            mensaje += p+": "+obj[p]+"\n";
    alert(mensaje);
}

/**
@desc   Muestra todas los metodos de un objeto en un alert
@param  object Objeto para mostrar su contenido
*/
function mostrarMetodosObjeto(obj){
    var mensaje = "";
    for(p in obj)
        if((obj[p]+"").toString().indexOf("{")!=-1)
            mensaje += p+": "+obj[p]+"\n";
    alert(mensaje);
}

/**
@desc   Determina si el elemento esta en la lista pasada
@param  mixed Elemento a buscar
@param  array Lista en la que buscar
@return bool True/false si esta o no en la lista
*/
function enArray(elemento,lista){
    for(var i=0;i<lista.length;i++)
        if(elemento==lista[i])
            return true;
    return false;
}

/**
@desc   Muestra un popup con el código HTML pasado
@param  string HTML interior
@param  string Clase CSS a aplicar al div exterior
*/
function mostrarPopupHTML(htmlInterno,claseCSS,sinFondo){
    var contenedor = document.createElement("div");
    contenedor.innerHTML = htmlInterno;
    return mostrarPopup(contenedor,claseCSS,sinFondo);
}

/**
@desc   Muestra un popup con el nodo pasado
@param  object Nodo DOM a incluir
@param  string Clase CSS a aplicar al div exterior
@return string Id de la ventana recien creada
*/
function mostrarPopup(objetoDOM,claseCSS,sinFondo){
    var ventana = document.createElement("div");
    ventana.className = claseCSS;
    ventana.id = generarIdAleatorio();
    var botonCerrar = document.createElement("a");
    botonCerrar.href = "javascript:cerrarVentana(\$('"+ventana.id+"'))";
    botonCerrar.className = "boton botonCerrar";
    botonCerrar.title = "Close window";
    botonCerrar.appendChild(document.createTextNode("Close window"));
    ventana.appendChild(botonCerrar);
    ventana.appendChild(objetoDOM);
    abrirVentana(ventana,sinFondo);
    return ventana.id;
}

/**
@desc Genera un boton DOM de cierre de ventana
@return DOM Objeto recien creado
*/
function botonCierreVentana(idVentana){
    //boton de cierre
    var botonCerrar = document.createElement("a");
    botonCerrar.href = "javascript:cerrarVentana(\$('"+idVentana+"'))";
    botonCerrar.className = "boton botonCerrar";
    botonCerrar.title = "Cerrar ventana";
    botonCerrar.appendChild(document.createTextNode("Cerrar ventana"));
    return botonCerrar;
}

/**
@desc Previsualiza la imagen pasada en una ventana
@param string URL de la imagen
*/
function previsualizarImagen(urlImagen){
    var img = new Image();
    img.onload = function(){
        var ancho=img.width;
        var alto=img.height;
        //ventana
        var ventana = document.createElement("div");
        ventana.id = generarIdAleatorio();
        ventana.className = "previsualizacion";
        var contenedor = document.createElement("div");
        contenedor.className = "previsualizacionContenedor";
        if(alto>600){
            alto = 600;
            contenedor.style.overflow = "auto";
        }
        if(ancho>900){
            ancho = 900;
            contenedor.style.overflow = "auto";
        }
        ventana.style.height = alto+"px";
        ventana.style.width = ancho+"px";
        //centramos la ventana
        ventana.style.marginTop = "-"+Math.round(alto/2)+"px";
        ventana.style.marginLeft = "-"+Math.round(ancho/2)+"px";
        //imagen
        var imagen = document.createElement("img");
        imagen.src = urlImagen;
        //abrimos la ventana
        contenedor.appendChild(imagen);
        ventana.appendChild(botonCierreVentana(ventana.id));
        ventana.appendChild(contenedor);
        abrirVentana(ventana);
    }
    img.src = urlImagen;
}

/**
@desc Previsualiza una URL en una ventana mediante un iframe. Devuelve el id de la ventana creada
@param string URL a abrir
@param string Clase CSS a aplicar sobre la ventana
@param bool Determina si la ventana debe usar fondo
@return string Id de la ventana recien creada
*/
function previsualizarUrl(url,claseCSS,sinFondo){
    var bloque = document.createElement("div");
    var cargando = document.createElement("div");
    cargando.className = "cargando";
    var iframe = document.createElement("iframe");
    iframe.frameBorder = 0;
    iframe.scrolling = "no";
    bloque.appendChild(cargando);
    bloque.appendChild(iframe);
    if(esIE())
        setTimeout(function(){ bloque.removeChild(cargando); },2000);
    else
        iframe.onload = function(){ bloque.removeChild(cargando); };
    iframe.src = url;
    return mostrarPopup(bloque,claseCSS,sinFondo);
}

/**
@desc Interpreta los bloques Javascript de un HTML (no devuelve nada)
@param string Contenido HTML
*/
function interpretarBloquesJS(html){
    var pos=-1;
    do{
        pos = html.indexOf("<script ",pos+1);
        if(pos>-1){
            var posInicio = html.indexOf(">",pos+1)+1;
            var posFin = html.indexOf("</script>",pos);
            if(posFin>-1 && posInicio>-1)
                eval(html.substring(posInicio,posFin));
        }
    }while(pos>-1);
}