/**********************************************************
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 (typeof window.ActiveXObject != 'undefined');	
}

/**                           
@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	Muestra la ventana pasada (nodo DOM) en forma de popup emergente
@param	DOMNode	Nodo DOM a mostrar
*/
function abrirVentana(objVentana){
	//creacion del fondo para oscurecer el resto de la pagina
	var fondo = document.createElement("div");
	fondo.className = "divFondoVentana"; //lo ponemos para ocultarlo despues
	fondo.style.top = "0px";
	fondo.style.left = "0px";
	fondo.style.width = anchoPagina()+"px";
	fondo.style.height = altoPagina()+"px";    
    fondo.style.zIndex = 100;
	//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";
	}

	//intentamos centrar la ventana en base a su ancho
    /*
	objVentana.style.position = "absolute";
	if(objVentana.style.width.indexOf("px")>0){
		var ancho = objVentana.style.width;
		ancho = ancho.substring(0,ancho.length-2);
		objVentana.style.left = "50%";
        objVentana.style.marginLeft = "-"+parseInt(ancho/2)+"px";
	}

	//intentamos centrar la ventana en base a su alto
	if(objVentana.style.height.indexOf("px")>0){
		var alto = objVentana.style.height;
		alto = alto.substring(0,alto.length-2);
		objVentana.style.top = "50%";
        objVentana.style.marginTop = "-"+parseInt(alto/2)+"px";
	}            */
	
	//ponemos el nodo al fondo y al documento
	fondo.appendChild(objVentana);
	//ponemos invisibles todos los fondos anteriores  
	cerrarVentana();
    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";
    }
	document.body.appendChild(fondo);
}

/**                        
@desc	Cierra la última ventana mostrada
*/
function cerrarVentana(){
	for(var i=0;i<document.body.childNodes.length;i++){
		var nodo = document.body.childNodes[i];
		if(nodo && nodo.className && nodo.className.indexOf("divFondoVentana")>-1)
			nodo.style.display = "none";
	}

    if(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)')
@return bool True si se ha pulsado enter
*/
function esEnter(e){  
    //comprobamos el enter
    if(caracterPulsado(e) == 13){ 
        return true;
    }                                
}
                         
/**                     
@desc   Devuelve el codigo ASCII de la tecla pulsada (llamar desde onkeypress='caracterPulsado(event)') 
@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   Muestra/oculta un campo de editor (colapsable)
@param  string Tipo de editor
@param  string Identificador del editor (campo al que representa)
*/
function ampliarCampoEditor(tipoEditor,idEditor){
    var contenedor = document.getElementById('contenedorEditor'+idEditor);
    var boton = document.getElementById('botonEditor'+idEditor);
    if(boton.className.indexOf("botonEditorMostrar")!=-1){
        boton.innerHTML = "Ocultar Contenido";
        boton.className = "botonEditor botonEditorOcultar";
        contenedor.className = "contenedorEditor"+tipoEditor+" contenedorEditorVisible contenedorEditorVisible"+tipoEditor;
    }else{
        boton.innerHTML = "Mostrar Contenido";
        boton.className = "botonEditor botonEditorMostrar";
        contenedor.className = "contenedorEditor"+tipoEditor+" contenedorEditorOculto contenedorEditorOculto"+tipoEditor;
    }
}

/**
@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;
}