var alertaSesionEterna = true;

function getXmlHttpObject() {
    var xmlhttp;
    if (window.XMLHttpRequest) {
        // IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp = new XMLHttpRequest();
    } else if (window.ActiveXObject) {
        // IE6, IE5
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    } else {
        alert("Tu navegador no soporta Ajax.\nAlgunas funcionalidades de nuestra web pueden no funcionar correctamente en tu navegador.");
    }
    return xmlhttp;
}


function pintarLienzo(contenido, lienzo) {
    if (lienzo != undefined && lienzo != null){
        if (typeof lienzo == 'string') {
            lienzo = document.getElementById(lienzo);
        }
        lienzo.innerHTML = contenido;
    }
}


function dictToPost(diccionario) {
    var post = '';
    for (param in diccionario){
        if(diccionario[param] != null){
            if (typeof diccionario[param] == "object") {
                for (var i=0; i<diccionario[param].length; i++) {
                    post += (post == '' ? '' : '&') + param + '=' + encodeURIComponent(diccionario[param][i]);
                }
            } else {
                post += (post == '' ? '' : '&') + param + '=' + encodeURIComponent(diccionario[param]);
            }
        } else {
            post += (post == '' ? '' : '&') + param + '=' + '';
        }
    }
    return post;
}


function dictToGet(diccionario) {
    //Transforma un dicionario en una cadena con formato de llamada GET
    var get = '';
    for (param in diccionario){
        if(diccionario[param] != null){
            if (typeof diccionario[param] == "object") {
                for (var i=0; i<diccionario[param].length; i++) {
                    get += '/' + param + '=' + encodeURIComponent(diccionario[param][i]);
                }
            } else {
                get += '/' + param + '=' + encodeURIComponent(diccionario[param]);
            }
        } else {
            get += '/' + param + '=' + '';
        }
    }
    return get;
}


function ajaxParam(url, parametros, lienzo, carga, fExito, fError, fCarga, metodo) {
    if (typeof lienzo == 'string') {
        lienzo = document.getElementById(lienzo);
    }
    if (typeof carga == 'string') {
        carga = document.getElementById(carga);
    }
    var fExito = (fExito) ? fExito : function(respuesta, lienzo){pintarLienzo(respuesta['respuesta'], lienzo);};
    var fError = (fError) ? fError : function(error) {
                                                 var errores = getEstructuraErrores();
                                                 errores['sistema']['ajax'] = {'codigo': 1, 'mensaje':error};
                                                 actualizarNotificaciones(errores, []);
                                             }
    var fCarga = (fCarga) ? fCarga : function(lienzo){pintarLienzo('<img alt="cargando" title="cargando" src="/images/loading.gif" />', lienzo);};
    var metodo = (metodo) ? metodo: "POST";
    var xmlhttp = getXmlHttpObject();
    if (carga != null) {
        var cargaBackup = carga.innerHTML;
    }
    xmlhttp.onreadystatechange = function () {
        if (xmlhttp.readyState == 0) {
            
        }
        if (xmlhttp.readyState == 1) {
            if (carga != null){
                fCarga(carga);
            }
        }
        if (xmlhttp.readyState == 2) {
           
        }
        if (xmlhttp.readyState == 4) {                        
            if (xmlhttp.status == 200) {
               try {
                    var dict = JSON.parse(xmlhttp.responseText);
                } catch (error) {
                    //Por algun motivo no nos llega una respuesta en JSON                    
                    fError('Ha ocurrido un error inesperado. Inténtelo más adelante.');
                    return;
                }
                if (dict && dict['argumentos_js']['REDIRECCION']) {
                    //Se nos ha enviado una petición de redireccion, asi que la ejecutamos y no hacemos nada mas
                      window.location = dict['argumentos_js']['REDIRECCION'];
                      return false;
                }
                actualizarJs(dict['argumentos_js']['js']);
                actualizarCss(dict['argumentos_js']['css']);
                pintarLienzo(cargaBackup, carga);
                actualizarNotificaciones(dict['errores'], dict['notificaciones']);
                actualizarValidacion(dict['validacion']);
                //declaramos globales los argumentos_js recibidos
                actualizarArgumentosJs(dict['argumentos_js']);
                fExito(dict, lienzo);
            } else if (xmlhttp.status >= 300 && (xmlhttp.status <= 400)) {
                if (carga != null){
                    pintarLienzo(cargaBackup, carga);
                }
                fError('Ha ocurrido un error inesperado. Inténtelo más adelante.');
            } else if (xmlhttp.status > 400 && (xmlhttp.status < 500)) {
                if (carga != null){
                    pintarLienzo(cargaBackup, carga);
                }
                if (xmlhttp.status == 401) {
                    fError('No tienes permisos para realizar esta acción.');
                } else if (xmlhttp.status == 403) {
                    fError('Debes iniciar sesión para realizar esta acción.');
                } else {
                    fError('Puede que tu cuenta no tenga permisos suficientes para realizar la acción');
                }
            } else if (xmlhttp.status >= 500 && (xmlhttp.status < 600)) {
                if (carga != null){
                    pintarLienzo(cargaBackup, carga);
                }
                fError('Ha ocurrido un error inesperado. Inténtelo más adelante.');
            }
        }
    };
    if (metodo == "POST") {
        xmlhttp.open(metodo,url,true);
        xmlhttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded; charset=UTF-8');
        //Indicamos en la peticion que se trata de una llamada AJAX
        parametros['ajax'] = true;
        xmlhttp.send(dictToPost(parametros));
    } else {
        parametros['ajax'] = true;
        xmlhttp.open(metodo, url + dictToGet(parametros), true);
        xmlhttp.send(null);
    }
    return false;
}


function ajaxForm(boton, formulario, lienzo, carga, fExito, fError, fCarga){
    var id = setTimeout(function(){_ajaxForm(boton, formulario, lienzo, carga, fExito, fError, fCarga);}, 10);
    return false;
}


function _ajaxForm(boton, formulario, lienzo, carga, fExito, fError, fCarga) {
    var fExito = (fExito) ? fExito : function(respuesta, lienzo){pintarLienzo(respuesta['respuesta'], lienzo);};
    var fError = (fError) ? fError : function(error) { 
                                                 var errores = getEstructuraErrores();
                                                 errores['sistema']['ajax'] = {'codigo': 1, 'mensaje':error};
                                                 actualizarNotificaciones(errores, []);
                                             }
    var valueBackup = '';
    //Asi podemos llamar a ajaxForm sin tener que pulsar ningun boton
    if (boton) {
        valueBackup = boton.value;
        boton.value = 'enviando..';
        boton.disabled = 'disabled';
    }
    var funTimeoutError = function(){ terminarEspera(boton, valueBackup, '', false); };
    var funTimeout = function(){ terminarEspera(boton, valueBackup, false, false); };
    var idError = setTimeout(funTimeoutError, 5000);
    var form = document.forms[formulario];
    var camposValid = getListaValidacionForm(form);
    ocultarErroresFormularios();
    if(validarCampos(form, camposValid)){
	    parametros = {}
	    for(i=0; i<camposValid.length; i++){
	        var campoValid  = camposValid[i];
	        var nombreCampo = campoValid['nombre'];
	        var campoForm   = form.elements[nombreCampo];
	        if (campoForm){
	            valorCampo = campoForm.value;
	            if (valorCampo == undefined) {
	                //el campo es un checkbox multiple
	                valorCampo = checkboxToArray(campoForm);
	            } else if (campoForm.type == 'checkbox' && !campoForm.checked) {
	                valorCampo = '';
	            }
	            if (campoValid['privado']) {
	                nombreCampo = 'p_' + nombreCampo;
	            }
	            parametros[nombreCampo] = valorCampo;
	        }
	    }
	    //Parche para compensar que nombreForm no esta nunca en las listas de validacion
	    var nombreForm = form.elements['nombreForm'];
	    if (nombreForm){
	        parametros['nombreForm'] = nombreForm.value;
	    }
	    //Generamos un id aleatorio para el boton, ya que la referencia this se perdera si empleamos una 
        //funcion de carga que sobrescriba el html del boton
        var boton_id = 'botonAjaxForm_' + idError;
        if (boton) {
            boton.id = boton_id;
        }
	    var fExitoTimeout = function(contenido, lienzo){
	                            clearTimeout(idError);
	                            terminarEsperaId(boton_id, valueBackup, false, false);
	                            fExito(contenido, lienzo);
	                        };
	    var fErrorTimeout = function(mensaje){
	                            clearTimeout(idError);
	                            terminarEsperaId(boton_id, valueBackup, false);
	                            fError(mensaje);
	                        };
	    ajaxParam(form.action, parametros, lienzo, carga, fExitoTimeout, fErrorTimeout, fCarga);
	} else {
	    //Si no se ha validado correctamente, forzamos la reactivacion
	    clearTimeout(idError);
	    var id = setTimeout(funTimeout, 100);
	}
	return false;
}


function notificarErrores(errores){
/*
    var errores = getEstructuraErrores();
    errores['sistema']['ajax'] = {codigo:1, mensaje: error};
    actualizarNotificaciones(errores, []);
*/
    var contenido = '';
    var total = 0;
   //Si usas el IE6 asqueroso, te quedaste sin mensajitos
    var IE6 = false /*@cc_on || @_jscript_version < 5.7 @*/;
    if (!IE6) {
        for (var i in errores) {
            contenido += '<div>' + errores[i] + '</div>';
            total += 1;
        }
        if (total && document.getElementById('barraError') != null){          
            document.getElementById('barraError').innerHTML = contenido;
            $("#barraError").fadeIn(1500, function(){setTimeout(function(){$("#barraError").fadeOut(1500);}, 3500);});
        }
    }
}


function notificarError(error){
    notificarErrores([error]);
}


function notificarExitos(mensajes){
/*
    var errores = getEstructuraErrores();
    errores['sistema']['ajax'] = {codigo:1, mensaje: error};
    actualizarNotificaciones(errores, []);
*/
    var contenido = '';
    var total = 0;
    //Si usas el IE6 asqueroso, te quedaste sin mensajitos
    var IE6 = false /*@cc_on || @_jscript_version < 5.7 @*/;
    if (!IE6) {
        for (var i in mensajes) {
            contenido += '<div>' + mensajes[i] + '</div>';
            total += 1;
        }
        if (total && document.getElementById('barraNotificacion')!= null) {
            document.getElementById('barraNotificacion').innerHTML = contenido;
            $("#barraNotificacion").fadeIn(1500, function(){setTimeout(function(){$("#barraNotificacion").fadeOut(1500);}, 3500);});
        }
    }
}


function notificarExito(mensaje){
    notificarExitos([mensaje]);
}


function getEstructuraErrores(){
    return {sistema: {}, formulario:{accion: '', huboErrores: false}};
}

/*
function actualizarNotificaciones(errores, notificaciones){
    var contenido ='';
    var divError = '';
    var mensajeError = '';
    var editable = false;
    var clases = [];
    var mensajesError = [];
    var numErrores = 0;
    var contenidoResumen = '';
    if (notificaciones.length > 0){
        contenido += '<h3>Tienes las siguientes notificaciones:</h3><ul>';
        
        for (var i=0; i < notificaciones.length; i++){
            contenido += '<li class="notificacion">' + notificaciones[i] + '</li>';
        }
        contenido += '</ul>';
    }
    var huboError = false;
    
    for (var key in errores['sistema']){
        if (!huboError && errores['sistema'][key]['codigo']){
            contenido += '<h3>Se han producido los siguientes errores:</h3><ul>';
            huboError = true;
        }
        if (errores['sistema'][key]['codigo']){
            contenido += '<li class="error">' + errores['sistema'][key]['mensaje'] + '</li>';
            mensajesError.push(errores['sistema'][key]['mensaje']);
            numErrores += 1;
        }
    }
    if (huboError){
        contenido += '</ul>';
    }
    for (var key in errores['formulario']){
        if (!huboError && key != 'accion' && key != 'huboErrores' && errores['formulario'][key]['codigo']){
            contenido += '<h3>Se han producido los siguientes errores:</h3><ul>';
            huboError = true;
        }
        if (key != 'accion' && key != 'huboErrores'){
            if (errores['formulario'][key]['codigo']){
                //se ha producido un error, ahora comprobamos si existe un mensaje de error por defecto
                numErrores += 1;
                mensajeError = errores['formulario'][key]['mensaje'];
                divError = document.getElementById('error_' + errores['formulario']['accion']  + '_' + key);
                if (divError) {
                    clases = divError.className.split(' ');
	                editable = true;
	                for (var j = 0; j < clases.length; j++){
	                    if (clases[j] == 'noeditable'){
	                        editable = false;
	                        break;
	                    }
	                }
	                if (!editable && divError.innerHTML != ""){
	                    mensajeError = divError.innerHTML;
	                    divError.style.display = '';
	                } else {
	                    divError.innerHTML = mensajeError;
	                    divError.style.display = '';
	                }
                }
                contenido += '<li class="error">' + mensajeError + '</li>';
                mensajesError.push(mensajeError);
            }
        }
    }
    if (huboError){
        contenido += '</ul>';
    }
    
    if (document.getElementById('contenidoNotificaciones') != null){
        if (contenido != ''){
            document.getElementById('contenidoNotificaciones').innerHTML = contenido;
            if (numErrores) {
                contenidoResumen += '<span class="error">' + numErrores +'</span><img src="/images/error_pequeno.png" />';
            }
            if (notificaciones.length) {
                contenidoResumen += '<span class="notificacion">' + notificaciones.length +'</span><img src="/images/informacion_pequeno.png" />';
            }
            document.getElementById('resumenErroresNotificaciones').innerHTML = contenidoResumen;
            if (document.getElementById('notificaciones').style.display == 'none') {
                mostrar('notificaciones');
            } 
        } else {
            if (document.getElementById('contenidoNotificaciones').style.display != 'none') {
                minimizarNotificaciones();
            }
            if (document.getElementById('notificaciones').style.display != 'none') {
                ocultar('notificaciones');
            }
            document.getElementById('contenidoNotificaciones').innerHTML = contenido;
        }
    }
    notificarErrores(mensajesError);
    notificarExitos(notificaciones);
}
*/

function actualizarNotificaciones(errores, notificaciones){
    var contenido ='';
    var divError = '';
    var mensajeError = '';
    var editable = false;
    var clases = [];
    var contenidoResumen = '';
    
    for (var i=0; i < notificaciones.length; i++){
        contenido += '<span class="cajaAviso notificacion"><a class="cerrarMini" href="#" onclick="return ocultarAviso(this);"></a>' + notificaciones[i] + '</span>';
    }
    
    for (var key in errores['sistema']){
        if (errores['sistema'][key]['codigo']){
            if (key == 'login' && errores['sistema'][key]['codigo'] == 'login_obligatorio') {
                document.getElementById('mensajeErrorLogin').innerHTML =  errores['sistema'][key]['mensaje'];
                mostrarPopup('popupLogin');
            } else {
                contenido += '<span class="cajaAviso alerta"><a class="cerrarMini" href="#" onclick="return ocultarAviso(this);"></a>' + errores['sistema'][key]['mensaje'] + '</span>';
            }
        }
    }

    for (var key in errores['formulario']){
        if (key != 'accion' && key != 'huboErrores'){
            if (errores['formulario'][key]['codigo']){
                //se ha producido un error, ahora comprobamos si existe un mensaje de error por defecto
                mensajeError = errores['formulario'][key]['mensaje'];
                divError = document.getElementById('error_' + errores['formulario']['accion']  + '_' + key);
                if (divError) {
                    clases = divError.className.split(' ');
	                editable = true;
	                for (var j = 0; j < clases.length; j++){
	                    if (clases[j] == 'noeditable'){
	                        editable = false;
	                        break;
	                    }
	                }
	                if (!editable && divError.innerHTML != ""){
	                    mensajeError = divError.innerHTML;
	                    divError.style.display = '';
	                } else {
	                    divError.innerHTML = mensajeError;
	                    divError.style.display = '';
	                }
                } else {
                    //mostramos arriba los que no podemos mostrar en el formulario
                    contenido += '<span class="cajaAviso alerta"><a class="cerrarMini" href="#" onclick="return ocultarAviso(this);"></a>' + mensajeError + '</span>';
                }
            }
        }
    }
    if (document.getElementById('notificaciones')) {
        document.getElementById('notificaciones').innerHTML = contenido;
    }
}


function huboErrores(errores) {
    var error = false;
    if (errores['formulario']['huboErrores']) {
        error = true;
    }
    
    if (!error) {
        for (var key in errores['sistema']){
            if (errores['sistema'][key]['codigo']){
                error = true;
                break;
            }
        }
    }
    
    return error;
}

function actualizarValidacion(nuevasValidaciones) {
    if (typeof validacion == 'undefined'){
        validacion = {};
    }
    for (var key in nuevasValidaciones){
        validacion[key] = nuevasValidaciones[key];
    }
}


function actualizarArgumentosJs(nuevosArgumentos) {
    if (typeof argumentosJs == 'undefined'){
        argumentosJs = {};
    }
    for (var key in nuevosArgumentos){
        argumentosJs[key] = nuevosArgumentos[key];
    }
}


function intercambiar(elem1, elem2) {
    mostrarOcultar(elem1);
    mostrarOcultar(elem2);
    return false;
}


function mostrarOcultar(elemento) {
    if (typeof elemento == 'string') {
        elemento = document.getElementById(elemento);
    }
    if (elemento != null) {
        elemento.style.display = (elemento.style.display == 'none') ? '' : 'none';
    }
    return false;
}


function mostrar(elemento) {
    if (typeof elemento == 'string') {
        elemento = document.getElementById(elemento);
    }
    if (elemento != null) {
        elemento.style.display = '';
    }
    return false;
}


function ocultar(elemento) {
    if (typeof elemento == 'string') {
        elemento = document.getElementById(elemento);
    }
    if (elemento != null) {
        elemento.style.display = 'none';
    }
    return false;
}


function cambioHoras(id) {
    var horas = document.getElementById(id + '_horas');
    var minutos = document.getElementById(id + '_minutos');
    var time_input = document.getElementById(id);
    if (horas.value == '-1'){
        minutos.value = '-1';
        time_input.value = ''; 
    } else {
        if (minutos.value == '-1'){
            minutos.value = '00';
        }
        time_input.value = horas.value + ':' + minutos.value;
    }
}


function cambioMinutos(id) {
    var horas = document.getElementById(id + '_horas');
    var minutos = document.getElementById(id + '_minutos');
    var time_input = document.getElementById(id);
    if (minutos.value == '-1'){
        horas.value = '-1';
        time_input.value = ''; 
    } else {
        if (horas.value == '-1'){
            horas.value = '00';
        }
        time_input.value = horas.value + ':' + minutos.value;
    }
}


function habilitarDeshabilitar(elemento) {
    if (typeof elemento == 'string') {
        elemento = document.getElementById(elemento);
    }
    if (elemento != null) {
        elemento.disabled = elemento.disabled ? false : true;
    }
}


function habilitar(elemento) {
    if (typeof elemento == 'string') {
        elemento = document.getElementById(elemento);
    }
    if (elemento != null) {
        elemento.disabled = false;
    }
}


function deshabilitar(elemento) {
    if (typeof elemento == 'string') {
        elemento = document.getElementById(elemento);
    }
    if (elemento != null) {
        elemento.disabled = true;
    }
}


function cambiarAtributo(elemento, atributo, valor) {
    if (typeof elemento == 'string') {
        elemento = document.getElementById(elemento);
    }
    if (elemento != null) {
        elemento.setAttribute(atributo,valor);
    }
}


function diasDelMes(mes, ano) {
    //Espera los meses en un rango del 1 al 12
	return 32 - new Date(ano, mes -1, 32).getDate();
}


function actualizarSelect(select, contenido) {
    //Espera una lista de diccionarios del tipo [{'texto': xx, 'value': yy', 'selected': bool}]
    if (typeof select == 'string') {
        select = document.getElementById(select);
    }
    select.innerHTML = "";
    var opt = "";
    var opt_txt = "";
    for(var i = 0; i < contenido.length; i++) {
        opt = document.createElement("option");
        opt_txt = document.createTextNode(contenido[i]['texto']);
		opt.appendChild(opt_txt);
		opt.setAttribute("value", contenido[i]['value']);
		if (contenido[i]['selected']) {
		    opt.setAttribute("selected", "selected");
		}
		select.appendChild(opt);
	}
}


function actualizarSelectDias(idSelect, dias) {
    //Actualiza las opciones de un select al numero de dias que se pasan
    //Si el dia elegido previamente esta fuera de rango, elige el ultimo dia del rango
    var select = document.getElementById(idSelect);
    var elegido = select.value;
    var opciones = [];
    for (var i=0; i<dias; i++){
        opciones.push({'texto': i + 1, 'value': i + 1});
    }
    actualizarSelect(idSelect, opciones);
    if(elegido <= dias){
        select.value = elegido;
    } else {
        select.value = dias;
    }
}


function expandirDatos(boton, id) {
    //Para las cajas de datos (edicion de perfil, etc)
    boton.src = "/images/boton_bajar.png";
    boton.onclick = function() {contraerDatos(boton, id); return false;};
    document.getElementById(id).style.display = "block";
    //$("#" + id).slideToggle("slow");
}


function contraerDatos(boton, id) {
    //Para las cajas de datos (edicion de perfil, etc)
    boton.src = "/images/boton_derecha.png";
    boton.onclick = function() {expandirDatos(boton, id); return false;};
    document.getElementById(id).style.display = "none";
    //$("#" + id).slideToggle("slow");
}


function intercambiarHTML(id1, id2) {
    var temp = document.getElementById(id1).innerHTML;
    document.getElementById(id1).innerHTML = document.getElementById(id2).innerHTML;
    document.getElementById(id2).innerHTML = temp;   
    return false; 
}


function minimizarNotificaciones() {
    var boton = document.getElementById('botonInteriorNotificaciones');
    boton.src = "/images/boton_bajar.png";
    boton.onclick = function() {maximizarNotificaciones();};
    
    $("#contenidoNotificaciones").slideToggle(500, function(){
        $("#interiorNotificaciones").animate({
            width: "100px"
        }, 500 );});
    
    /*
    $("#contenidoNotificaciones").slideToggle(1500);
    */
}


function maximizarNotificaciones() {
    var boton = document.getElementById('botonInteriorNotificaciones');
    boton.src = "/images/boton_subir.png";
    boton.onclick = function() {minimizarNotificaciones();};
    
    $("#interiorNotificaciones").animate({
        width: "400px"
    }, 500, null, function() {
        $("#contenidoNotificaciones").slideToggle(500);});
    /*
    $("#contenidoNotificaciones").slideToggle(1500);
    */
}


function swapBuscadorSuperior(opcion) {
    if (opcion.value == 'eventos') {
        ocultar('buscadorSuperiorUsuarios');
        mostrar('buscadorSuperiorEventos');
    } else if (opcion.value == 'usuarios') {
        ocultar('buscadorSuperiorEventos');
        mostrar('buscadorSuperiorUsuarios');
    }
}

/*prueba de concepto para futuras transiciones de estilos*/
/*transita el color de fondo de un elemento, de un color a otro en unos pasos definidos durante un tiempo definido*/
function colorear(elementoId, rgbInicial, rgbFinal, pasos, duracionMs) {
    for (paso=0;paso<=pasos;paso++){
        setTimeout("document.getElementById('" + elementoId + "').style.backgroundColor = 'rgb(" + Math.floor(rgbInicial[0]+(rgbFinal[0]-rgbInicial[0])*paso/pasos) + "," + Math.floor(rgbInicial[1]+(rgbFinal[1]-rgbInicial[1])*paso/pasos) + "," + Math.floor(rgbInicial[2]+(rgbFinal[2]-rgbInicial[2])*paso/pasos) + ")'", duracionMs/pasos * paso);
    }
}


function mensajeRecordarme(input) {
    if (input.checked && alertaSesionEterna) {
        alertaSesionEterna = false;
        if (confirm('¿Estás seguro/a de que quieres que se te recuerde en este equipo?\n Si hay más personas con acceso a este equipo, recomendamos encarecidamente NO marcar la casilla')) {
            return;
        } else {
            input.checked = false;
        }
    } else {
        return;
    }
}


function anadirClase(elemento, clase) {
    if (typeof elemento == 'string') {
        elemento = document.getElementById(elemento);
    }
    if (elemento != null) {
        if (elemento.className) {
            if (!tieneClase(elemento, clase)) {
                elemento.className = elemento.className + ' ' + clase
            }
        } else {
            elemento.className = clase
        }
    }
}


function quitarClase(elemento, clase) {
    if (typeof elemento == 'string') {
        elemento = document.getElementById(elemento);
    }
    if (elemento != null) {
        var clases = elemento.className.split(' ');
        var className= '';
        for (var i = 0; i < clases.length; i++){
            if (clases[i] != clase) {
                if (className != '') {
                    className += ' ';
                }
                className += clases[i];
            }
        }
        elemento.className = className;
    }
}


function tieneClase(elemento, clase) {
    if (typeof elemento == 'string') {
        elemento = document.getElementById(elemento);
    }
    var encontrada = false;
    var clases = elemento.className.split(' ');
    var className= '';
    for (var i = 0; i < clases.length && !encontrada; i++){
        if (clases[i] == clase) {
            encontrada = true;
        }
    }
    return encontrada;
}


function seleccionarTodos(input) {
    for (i = 0; i < input.length; i++) {
    	input[i].checked = true ;
	}
}


function deseleccionarTodos(input) {
    for (i = 0; i < input.length; i++) {
    	input[i].checked = false ;
	}
}


function expandirPestanaDerecha(pestana) {
    pestana.onclick = function() {return contraerPestanaDerecha(pestana);};
    anadirClase(pestana.parentNode.parentNode, 'expandida');
    return false;
}


function contraerPestanaDerecha(pestana) {
    pestana.onclick = function() {return expandirPestanaDerecha(pestana);};
    quitarClase(pestana.parentNode.parentNode, 'expandida')
    return false;
}


function mostrarPestanasDer(padre) {
    var elementos = padre.children;
    for (var elemento = 0; elemento < elementos.length; elemento++) {
        if (tieneClase(elementos[elemento], 'pestana')) {
            mostrar(elementos[elemento]);
        }
   }
}


function ocultarPestanasDer(padre) {
    var elementos = padre.children;
    for (var elemento = 0; elemento < elementos.length; elemento++) {
        if (tieneClase(elementos[elemento], 'pestana')) {
            ocultar(elementos[elemento]);
        }
   }
}


function autosugerencias(evento, elemento, lienzo, fSeleccion, forzarEnter) {
    var longidudMinima = 3;
    var key = forzarEnter ? 13 : ((window.event) ? event.keyCode : evento.keyCode);
    if (typeof lienzo == 'string') {
        lienzo = document.getElementById(lienzo);
    }
    if (elemento && elemento.value.length >= longidudMinima) {
        //cualquier click en el documento ocultará el cuadro de sugerencias
        //el lienzo ya tiene (por template) un onclick que anula el del document, en caso de que se clique sobre el lienzo
        document.onclick = function() {ocultar(lienzo); quitarClase('buscador', 'desplegado');};
        elemento.onclick = function() {setTimeout('mostrar("' + lienzo.id + '"); anadirClase("buscador", "desplegado");', 200);};
        if (key == 13) {
            var temp = _getSugerenciaActual(lienzo);
            var actual = temp[1];
            if (actual != null) {
                actual.onclick();
            } else if (elemento.value.length >= longidudMinima) {
                alert('No hay resultados para la búsqueda');
            } else {
                alert('El término de búsqueda es demasiado corto.\nDebe tener, al menos, ' + longidudMinima + ' caracteres.');
            }
        } else if (key == 38) {
            var temp = _getSugerenciaActual(lienzo);
            var anterior = temp[0];
            var actual = temp[1];
            quitarClase(actual, 'sugerenciaMarcada');
            anadirClase(anterior, 'sugerenciaMarcada');
        } else if (key == 40) {
            var temp = _getSugerenciaActual(lienzo);
            var actual = temp[1];
            var siguiente = temp[2];
            quitarClase(actual, 'sugerenciaMarcada');
            anadirClase(siguiente, 'sugerenciaMarcada');
        } else {
            var fExito = function(respuesta, lienzo) {
                            pintarLienzo(respuesta['respuesta'], lienzo);
                            mostrar(lienzo);
                            anadirClase('buscador', 'desplegado');
                         };
            return ajaxParam('/util/sugerencias', {'p_texto': elemento.value, 'p_funcion': fSeleccion, 'p_lienzo': lienzo.id}, lienzo, lienzo, fExito);
        }
    } else {
        if (key == 13) {
            alert('El término de búsqueda es demasiado corto. Debe tener, al menos, ' + longidudMinima + 'caracteres');
        }
        ocultar(lienzo);
        quitarClase('buscador', 'desplegado');
        elemento.onclick = null;
    }
}


function _getSugerenciaActual(lienzo) {
    if (typeof lienzo == 'string') {
        lienzo = document.getElementById(lienzo);
    }
    var divs = lienzo.getElementsByTagName('div');
    var posSugerenciaActual = -1;
    var posEntidadActual = -1;
    var sugerencias = [];
    var entidades = [];
    var actual = null;
    var anterior = null;
    var siguiente = null;
    var numSugerencias = 0;
    var numEntidades = 0;
    for (var div = 0; div < divs.length; div++) {
        if (tieneClase(divs[div], 'sugerencia')) {
            if (tieneClase(divs[div], 'sugerenciaMarcada')) {
                posSugerenciaActual = numSugerencias;
                posEntidadActual = numEntidades;
                actual = divs[div];
            }
            numSugerencias++;
            sugerencias.push(divs[div]);
        } else if (tieneClase(divs[div], 'entidad')) {
            numEntidades++;
            entidades.push(divs[div]);
        }
    }
    if (actual) {
        if (posSugerenciaActual > 0) {
            anterior = sugerencias[posSugerenciaActual - 1];
        }
        if ((posSugerenciaActual + 1) < numSugerencias) {
            siguiente = sugerencias[posSugerenciaActual + 1];
        }
    } else if (numSugerencias) {
        siguiente = sugerencias[0];
        anterior = sugerencias[numSugerencias - 1];
    }
    return [anterior,actual,siguiente];
}


function seleccionarSugerencia(sugerencia) {
    window.location = argumentosJs['home_url'] + '/' + sugerencia['entidad'].toLowerCase() + '/' + sugerencia['entidad'].toLowerCase() + '_id=' + sugerencia['entidad_id'];
}


function marcarSugerencia(sugerencia, lienzo) {
    var temp = _getSugerenciaActual(lienzo);
    var actual = temp[1];
    quitarClase(actual, 'sugerenciaMarcada');
    anadirClase(sugerencia, 'sugerenciaMarcada');
    
}

function mostrarLogin() {
    document.getElementById('botonLogin').onclick = function() {ocultarLogin();};
    anadirClase('botonLogin', 'seleccionado');
    mostrar('login');
    return false;
}

function ocultarLogin() {
    document.getElementById('botonLogin').onclick = function() {mostrarLogin();};
    quitarClase('botonLogin', 'seleccionado');
    ocultar('login');
    return false;
}


function agregarIframeCambiarAvatar(idActua, nombreForm, entidad) {
    //Agrega un iframe para subir un avatar

    var form = document.forms[nombreForm];
    var codigoImagen = getCodigoImagen(entidad, 1, form.elements['codigo_subida'].value);

	var input = document.createElement('input');
	input.type="hidden";
	input.name="codigo_imagen";
	input.value=codigoImagen;
	form.appendChild(input);

    var nuevoIframe = document.createElement('iframe');
    nuevoIframe.className = 'iframeImagenPresubida';
    nuevoIframe.src = "/upload/presubida_imagen/codigo_subida=" + form.elements['codigo_subida'].value + "/codigo_imagen=" + codigoImagen + "/posicion=1";
    nuevoIframe.allowtransparency="true";
    nuevoIframe.tabindex="0";

    document.getElementById(idActua).appendChild(nuevoIframe);
    return false;
}


function naturalToBase(numero, base) {
    //Convierte un numero decimal a la base que elijamos (max. 62)
    
    base = (base != null) ? base : 62;
    //diccionario para codificar numeros en modulo 62 por caractes
    var codificacion  = {0: '0', 1: '1', 2: '2', 3: '3', 4: '4', 5: '5', 6: '6', 7: '7', 8: '8', 9: '9', 10: 'A', 11: 'B', 12: 'C', 13: 'D', 14: 'E', 15: 'F', 16: 'G', 17: 'H', 18: 'I', 19: 'J', 20: 'K', 21: 'L', 22: 'M', 23: 'N', 24: 'O', 25: 'P', 26: 'Q', 27: 'R', 28: 'S', 29: 'T', 30: 'U', 31: 'V', 32: 'W', 33: 'X', 34: 'Y', 35: 'Z', 36: 'a', 37: 'b', 38: 'c', 39: 'd', 40: 'e', 41: 'f', 42: 'g', 43: 'h', 44: 'i', 45: 'j', 46: 'k', 47: 'l', 48: 'm', 49: 'n', 50: 'o', 51: 'p', 52: 'q', 53: 'r', 54: 's', 55: 't', 56: 'u', 57: 'v', 58: 'w', 59: 'x', 60: 'y', 61: 'z'}

    codigo = "";
    while (numero != 0){
        digito = numero % base;
        codigo = codificacion[digito] + codigo;
        numero =  parseInt((numero - (numero % base))/ base);
    }
    return codigo;
}

/*En un input de texto, quitar el texto sugerido*/ 
function clearInput(input, texto, password) {
    if (input.value == texto) {
        input.value = '';
        if (password) {
            input.type = 'password';
        }
    }    
}

/*En un input de texto, restaurar el texto sugerido*/
function resetInput(input, texto, password) {
    if (input.value == '') {
        input.value = texto;
        if (password) {
            input.type = 'text';
        }
    }
    
}

function ocultarAviso(boton) {
    ocultar(boton.parentNode);
    return false;
}

/*Para formularios con multiples apartados*/
function seleccionFormularioMultiple(boton, divOpciones, opcion) {
    var botones = boton.parentNode.parentNode.getElementsByTagName('td');
    for (var i=0; i < botones.length; i++) {
        quitarClase(botones[i], 'seleccionada');
    }
    anadirClase(boton.parentNode, 'seleccionada');
    var opciones = document.getElementById(divOpciones).children;
    for (var i=0; i < opciones.length; i++) {
        ocultar(opciones[i]);
    }
    mostrar(opcion);
    return false;
}


function isMouseLeaveOrEnter(e, handler) {
    //Función que simula el onMouseEnter y onMouseLeave de IE
    //Evita la activación múltiple que sucede dentro de un mismo layout cuando usamos onMouseOver y onMouseOut
    // gracias a http://dynamic-tools.net/toolbox/isMouseLeaveOrEnter/
    if (e.type != 'mouseout' && e.type != 'mouseover') return false;
    var reltg = e.relatedTarget ? e.relatedTarget : e.type == 'mouseout' ? e.toElement : e.fromElement; 
    while (reltg && reltg != handler) reltg = reltg.parentNode; 
    return (reltg != handler);
}

var _popupActivo = null;
var _fCierreActiva = null;
/* Muestra el elemento popup. Si no se define fcierre, simplemente se dejara de mostrar el elmenento */
function mostrarPopup(elemento, fCierre) {
    //las funciones de calculo de alto y ancho, del elemento y de la pagina, son cortesia del dialog_box

    if (!_popupActivo) {
        ocultarPopup();
    }
    _popupActivo = elemento;
    if (fCierre) {
        _fCierreActiva = fCierre;
    }
    var anchoPantalla = pageWidth();
    var altoPantalla = pageHeight();
    //var offsetIzquierda = leftPosition();
    //var offsetArriba = topPosition();
    var offsetIzquierda = 0;
    var offsetArriba = 0;
    var popup = document.getElementById(elemento);
    var mascara = document.getElementById('mascaraPopup');
    popup.alpha = 0;
    popup.style.opacity = 0;
    popup.style.filter = 'alpha(opacity=0)';
    mostrar(popup);
    var ancho = popup.offsetWidth;
    if (ancho >= anchoPantalla) {
        ancho = anchoPantalla - 50;
        popup.style.width = ancho + 'px';
    }
    var alto = popup.offsetHeight;
    if (alto >= altoPantalla) {
        alto = altoPantalla - 50;
        popup.style.height = alto + 'px';
    }
    var posicionHorizontal = offsetIzquierda + (anchoPantalla / 2) - (ancho / 2);
    var posicionVertical = offsetArriba + (altoPantalla / 3) - (alto / 2);
    if (posicionVertical <= 0) {
        posicionVertical = offsetArriba + (altoPantalla / 2) - (alto / 2);
    }
    mostrar(mascara);
    popup.style.left = posicionHorizontal + "px";
    popup.style.top = posicionVertical + "px";
    popup.alpha = 100;
    popup.style.opacity = (100 / 100);
    popup.style.filter = 'alpha(opacity=100)';
    return false;
}

function ocultarPopup() {
    var popup = document.getElementById(_popupActivo);
    var mascara = document.getElementById('mascaraPopup');
    if (_fCierreActiva) {
        _fCierreActiva();
    } else {
        ocultar(mascara);
        ocultar(popup);
        _popupActivo = null;
        _fCierreActiva = null;
    }
}

// calcula el ancho de la ventana //
function pageWidth() {
  return window.innerWidth != null ? window.innerWidth : document.documentElement && document.documentElement.clientWidth ? document.documentElement.clientWidth : document.body != null ? document.body.clientWidth : null;
}

// calculate el alto de la ventana //
function pageHeight() {
  return window.innerHeight != null? window.innerHeight : document.documentElement && document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body != null? document.body.clientHeight : null;
}

// calculate el offset vertical //
function topPosition() {
  return typeof window.pageYOffset != 'undefined' ? window.pageYOffset : document.documentElement && document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop ? document.body.scrollTop : 0;
}

// calculate el offset por la izquierda //
function leftPosition() {
  return typeof window.pageXOffset != 'undefined' ? window.pageXOffset : document.documentElement && document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft ? document.body.scrollLeft : 0;
}

//pensado para que haya un solo desplegable visible a la vez en toda la web
//TODO: ¿¿es inadecuado y deberia pensarse una solucion que permita mas de un desplegable mostrado, o por grupos???
var desplegableActivo = '';
var ocultarDesplegableActivo = -1;
function mostrarDesplegable(desplegable) {
    clearTimeout(ocultarDesplegableActivo);
    ocultar(desplegableActivo);
    desplegableActivo = desplegable;
    mostrar(desplegable);
}

function ocultarDesplegable(desplegable) {
    ocultarDesplegableActivo = setTimeout('ocultar("'+ desplegable +'");', 400);
}

/* distinto para el menu principal, por los bailes de clases */
var menu_idActivo = '';
var pestanaMenuSup = '';
var submenuMenuSup = '';
var ocultarMenuSupActivo = -1;
function mostrarDesplegable(desplegable) {
    clearTimeout(ocultarDesplegableActivo);
    ocultar(desplegableActivo);
    desplegableActivo = desplegable;
    mostrar(desplegable);
}

function ocultarDesplegable(desplegable) {
    ocultarDesplegableActivo = setTimeout('ocultar("'+ desplegable +'");', 400);
}

function mostrarMenuSup(pestana, menu_id, submenu) {
    clearTimeout(ocultarMenuSupActivo);
    _ocultarMenuSup();
    pestanaMenuSup = pestana;
    menu_idActivo = menu_id;
    submenuMenuSup = submenu;
    anadirClase('menuSupL1_' + menu_id, 'hover');
    anadirClase(pestana, 'hover');
    if (submenu) {
        mostrar('menuSupL2_' + menu_id);
    } else {
        anadirClase(pestana, 'seleccionada');
    }
}

function ocultarMenuSup() {
    ocultarMenuSupActivo = setTimeout('_ocultarMenuSup();', 250);
}

function _ocultarMenuSup() {
    if (submenuMenuSup) {
        ocultar('menuSupL2_' + menu_idActivo);
    } else  {
        quitarClase(pestanaMenuSup, 'seleccionada');
    }
    quitarClase('menuSupL1_' + menu_idActivo, 'hover');
    quitarClase(pestanaMenuSup, 'hover');
}

function actualizarJs(listaJs) {
    for (var i = 0; i < listaJs.length; i++) {
        var fichero = listaJs[i];
        var referencia = document.createElement('script');
        referencia.setAttribute('type', 'text/javascript');
        referencia.setAttribute('src', fichero);
        document.getElementsByTagName('head')[0].appendChild(referencia);
    }
}

function actualizarCss(listaCss) {
    for (var i = 0; i < listaCss.length; i++) {
        var fichero = listaCss[i];
        var referencia = document.createElement('link');
        referencia.setAttribute('rel', 'stylesheet');
        referencia.setAttribute('type', 'text/css');
        referencia.setAttribute('href', fichero);
        document.getElementsByTagName('head')[0].appendChild(referencia);
    }
}

/* Para formularios multipaso, muestra uno de los pasos en pantalla */
function cambiarPaso(form, paso, numpasos) {
    for (var i = 1; i <= numpasos; i++) {
        ocultar(form + '_' + i);
        quitarClase('menu_' + form + '_' + i, 'seleccionado');
    }
    mostrar(form + '_' + paso);
    anadirClase('menu_' + form + '_' + paso, 'seleccionado');
}


function solicitudesUsuario(usuario_id) {
    var fExito = function(respuesta, lienzo) {
        pintarLienzo(respuesta['respuesta'], lienzo);
        mostrarPopup('invitarUsuarioSuperior');
    };
    idCarga = 'invitarUsuario_' + usuario_id;
    return ajaxParam('/solicitud/ver', {'p_identificador': usuario_id}, 'solicitudesEntidadUsuario_' + usuario_id, idCarga, fExito);
}


function solicitudesEntidad(entidad, entidad_id, primeraVisita) {
    var fExito = function(respuesta, lienzo) {
        pintarLienzo(respuesta['respuesta'], lienzo);
        mostrarPopup('invitarUsuarioEntidad');
    };
    var identificador = entidad.substr(0,1).toUpperCase()+ entidad.substr(1,entidad.length).toLowerCase() + '_' + entidad_id;
    idLienzo = 'solicitudesEntidad' + identificador;

    idCarga = 'invitar' + identificador;
    var parametros = {'p_entidad': entidad, 'p_entidad_id': entidad_id};
    if (primeraVisita) {
        parametros['p_primeraVisita'] = true;
    }
    return ajaxParam('/solicitud/ver', parametros, idLienzo, idCarga, fExito);
}

