//global que indica si se esta enviando algun formulario
 
peticionActiva = false;

function terminarEsperaId(idBoton, valueBackup, error, activarPeticiones){
    terminarEspera(document.getElementById(idBoton), valueBackup, error, activarPeticiones);
}


function terminarEspera(boton, valueBackup, error, activaPeticiones){
    var activaPeticiones = (activaPeticiones != null) ? activaPeticiones : true;
    if (boton) {
        //podria ser que tras una llamada AJAX el boton ya no exista en el documento, o que no se haya mandado un boton
        boton.value = valueBackup;
        boton.disabled = '';
    }
    if (activaPeticiones){
        peticionActiva = false;
    }
    if (error){
        notificarError(error);
    }
}

function enviarFormulario(boton, nombreForm){
    var id = setTimeout(function(){_enviarFormulario(boton, nombreForm);}, 10);
    return false;
}

function _enviarFormulario(boton, nombreForm){
    if (!peticionActiva){
        peticionActiva = true;
	    if (boton) {
            var valueBackup = boton.value;
	        boton.disabled = 'disabled';
	        boton.value = 'enviando...';
        } else {
            var valueBackup = '';
        }
	    var funTimeoutError = function(){ terminarEspera(boton, valueBackup, ''); };
	    var funTimeout = function(){ terminarEspera(boton, valueBackup); };
	    var id = setTimeout(funTimeoutError, 5000);
	    var form = document.forms[nombreForm];
	    var validacion = getListaValidacionForm(form);
	    ocultarErroresFormularios();
	    if(procesarFormulario(form, validacion)){
	        //Reactivamos el boton justo antes de enviar el formulario
	        clearTimeout(id);
	        id = setTimeout(funTimeout, 100);
	        form.submit();
	        return false;
	    }
	    //Si no se ha validado correctamente, forzamos la reactivacion
	    clearTimeout(id);
	    id = setTimeout(funTimeout, 100);
	} else {
	    notificarError('Hay otro envío de formulario en marcha')
	}
	return false;
}

function getListaValidacionForm(form){
    /*
    Devuelve la lista de validacion correspondiente a un formulario:
    - Primero comprueba si el formulario tiene un campo 'nombreValidacion', en cuyo caso su valor sera el nombre del validador
    - Si no ha encontrado el campo 'nombreValidacion', el validador se habrá de llamara segun indique la accion del formulario
      (ej. action="/controlador/accion" --> validador = "accionControlador"
    */
    if (form.elements['nombreValidacion']){
	    var nombreValidacion = form.elements['nombreValidacion'].value;
    } else {
        var action = form.action.replace(argumentosJs['home_url'], '');
        var inicio = 0;
        var fin = action.length;
        if (action.charAt(0) == '/'){ 
            inicio = 1;
        }
        if (action.charAt(action.length -1) == '/'){ 
            fin -= 1;
        }
        var componentes = action.slice(inicio, fin).split('/');
        var accion = 'index';
        if (componentes.length >1){
            accion = componentes[1];
        }
        if (componentes[0].charAt(componentes[0].length -1) == 's') {
            //TODO: Plurales irregulares
            componentes[0] = componentes[0].slice(0, componentes[0].length -1);
        }
        var nombreValidacion = accion + componentes[0].charAt(0).toUpperCase() + componentes[0].slice(1, componentes[0].length);
        if (form.elements['buscador']){
            nombreValidacion += '_buscador';
        }
    }
    return validacion[nombreValidacion];
}

function procesarFormulario(form, camposValid){
    if (validarCampos(form, camposValid)){
        url = obtenerUrl(form, camposValid);
        form.action = url;  
        return true;      
    }
    return false;
}

function validarCampos(form, camposValid){
    var errores = [];
    var ok = true;
    var i;
    for(i=0; i<camposValid.length; i++){
        var campoValid = camposValid[i];
        var nombreCampo = campoValid['nombre'];
        var campoForm   = form.elements[nombreCampo];
        var valorCampo = '';
        if (!campoForm){
            if (campoValid['privado']) {
	            //Significa que hicimos un browser->back
	            campoForm   = form.elements['p_' + nombreCampo];
	            if (campoForm) {
	                if (campoForm.value == undefined) {
                        //el campo es un checkbox multiple
                        renombrarCheckbox(campoForm, nombreCampo);
                    } else {
                        campoForm.name = nombreCampo;
                    }
	            }
	        }
	    }       
        if (campoForm){
            if (campoForm.type == 'checkbox') {
                if (campoForm.checked) {
                    valorCampo = campoForm.value;
                }
            } else {
                var valorCampo  = campoForm.value;
            }
        }
        //si tenemos un checkbox multiple, obtendremos un array con todos sus valores
        if (valorCampo == undefined) {
            valorCampo = checkboxToArray(campoForm);
        }
        var tipoCampo   = campoValid['tipo'];
        var argsValid   = campoValid['args'];
        res = eval('validar' + tipoCampo.slice(0,1).toUpperCase() + tipoCampo.slice(1) + '(valorCampo,nombreCampo,argsValid)');
        if (res[0]){
            ok = false;
        }
        errores.push([nombreCampo,res[0],res[1]]);
    }
    if (!ok){
        var erroresNotificaciones = getEstructuraErrores();
        erroresNotificaciones['formulario']['accion'] = form.name.charAt(4).toLowerCase() + form.name.slice(5);
        for (i=0; i<errores.length; i++){
            var err = errores[i];
            // err[0] = nombre; err[1] = esError?; err[2] = mensaje
            var divError = document.getElementById('error_' + form.name.charAt(4).toLowerCase() + form.name.slice(5) + '_' + err[0]);
            if (!err[1]){
                if (divError){
                    divError.style.display = 'none';
                }
            } else {
                var mensajeError = err[2];
                if (divError){
	                var clases = divError.className.split(' ');
	                var editable = true;
	                for (var j = 0; j < clases.length; j++){
	                    if (clases[j] == 'noeditable'){
	                        editable = false;
	                        break;
	                    }
	                }
	                if (!editable){
	                    mensajeError = divError.innerHTML;
	                }
	            }
                if (mensajeError != ""){
                    if (divError){
                        divError.innerHTML = mensajeError;
                    }
                    erroresNotificaciones['formulario'][err[0]] = {'codigo': 1, 'mensaje': mensajeError};
                } else {
                    erroresNotificaciones['formulario'][err[0]] = {'codigo': 1, 'mensaje': 'Error en el campo <b>' + err[0] + '</b> del formulario'};
                }
                if (divError){
                    divError.style.display = 'block';
                }
            }
        }
        actualizarNotificaciones(erroresNotificaciones, []);
    }
    return ok;
}


function validarNick(valor, nombre, args){
    var error = false;
    var mensaje = '';
    if (!args['nulo'] && valor==''){
        error = true;
        mensaje = 'El campo <b>' + nombre + "</b> es obligatorio";
    }
    return [error,mensaje];
}

function validarBool(valor, nombre, args){
    var error = false;
    var mensaje = '';
    if (!args['nulo'] && valor==''){
        error = true;
        mensaje = 'El campo <b>' + nombre + "</b> es obligatorio";
    }
    return [error,mensaje];
}

function validarEmail(valor, nombre, args){
    var error = false;
    var mensaje = '';
    if (!args['nulo'] && valor==''){
        error = true;
        mensaje = 'El campo <b>' + nombre + "</b> es obligatorio";
    }
    return [error,mensaje];
}

function validarNombrePropio(valor, nombre, args){
    var error = false;
    var mensaje = '';
    if (!args['nulo'] && valor==''){
        error = true;
        mensaje = 'El campo <b>' + nombre + "</b> es obligatorio";
    }
    return [error,mensaje];
}

function validarDireccion(valor, nombre, args){
    var error = false;
    var mensaje = '';
    if (!args['nulo'] && valor==''){
        error = true;
        mensaje = 'El campo <b>' + nombre + "</b> es obligatorio";
    }
    return [error,mensaje];
}

function validarCp(valor, nombre, args){
    var error = false;
    var mensaje = '';
    if (!args['nulo'] && valor==''){
        error = true;
        mensaje = 'El campo <b>' + nombre + "</b> es obligatorio";
    }
    return [error,mensaje];
}

function validarId(valor, nombre, args){
    var error = false;
    var mensaje = '';
    if (!args['nulo'] && valor==''){
        error = true;
        mensaje = 'El campo <b>' + nombre + "</b> es obligatorio";
    }
    return [error,mensaje];
}

function validarPassword(valor, nombre, args){
    var error = false;
    var mensaje = '';
    if (!args['nulo'] && valor==''){
        error = true;
        mensaje = 'El campo <b>' + nombre + "</b> es obligatorio";
    }
    return [error,mensaje];
}

function validarComentario(valor, nombre, args){
    var error = false;
    var mensaje = '';
    if (!args['nulo'] && valor==''){
        error = true;
        mensaje = 'El campo <b>' + nombre + "</b> es obligatorio";
    }
    return [error,mensaje];
}

function validarListaIds(valor, nombre, args){
    var error = false;
    var mensaje = '';
    if (!args['nulo'] && valor==''){
        error = true;
        mensaje = 'El campo <b>' + nombre + "</b> es obligatorio";
    }
    return [error,mensaje];
}

function validarAlfabetico(valor, nombre, args){
    var error = false;
    var mensaje = '';
    if (!args['nulo'] && valor==''){
        error = true;
        mensaje = 'El campo <b>' + nombre + "</b> es obligatorio";
    }
    return [error,mensaje];
}

function validarImagen(valor, nombre, args){
    var error = false;
    var mensaje = '';
    if (!args['nulo'] && valor==''){
        error = true;
        mensaje = 'El campo <b>' + nombre + "</b> es obligatorio";
    }
    return [error,mensaje];
}

function validarFecha(valor, nombre, args){
    var error = false;
    var mensaje = '';
    if (!args['nulo'] && valor==''){
        error = true;
        mensaje = 'El campo <b>' + nombre + "</b> es obligatorio";
    }
    return [error,mensaje];
}

function validarFechaHora(valor, nombre, args){
    var error = false;
    var mensaje = '';
    if (!args['nulo'] && valor==''){
        error = true;
        mensaje = 'El campo <b>' + nombre + "</b> es obligatorio";
    }
    return [error,mensaje];
}

function validarSexo(valor, nombre, args){
    var error = false;
    var mensaje = '';
    if (!args['nulo'] && valor==''){
        error = true;
        mensaje = 'El campo <b>' + nombre + "</b> es obligatorio";
    }
    return [error,mensaje];
}

function validarCodigoInvitacion(valor, nombre, args){
    var error = false;
    var mensaje = '';
    if (!args['nulo'] && valor==''){
        error = true;
        mensaje = 'El campo <b>' + nombre + "</b> es obligatorio";
    }
    return [error,mensaje];
}

function validarTelefono(valor, nombre, args){
    var error = false;
    var mensaje = '';
    if (!args['nulo'] && valor==''){
        error = true;
        mensaje = 'El campo <b>' + nombre + "</b> es obligatorio";
    }
    return [error,mensaje];
}


function validarNatural(valor, nombre, args){
    var error = false;
    var mensaje = '';
    if (!args['nulo'] && valor==''){
        error = true;
        mensaje = 'El campo <b>' + nombre + "</b> es obligatorio";
    }
    return [error,mensaje];
}


function validarUrl(valor, nombre, args){
    var error = false;
    var mensaje = '';
    if (!args['nulo'] && valor==''){
        error = true;
        mensaje = 'El campo <b>' + nombre + "</b> es obligatorio";
    }
    return [error,mensaje];
}



function validarOk(valor, nombre, args){
    var error = false;
    var mensaje = '';
    if (!args['nulo'] && valor==''){
        error = true;
        mensaje = 'El campo <b>' + nombre + "</b> es obligatorio";
    }
    return [error,mensaje];
}

function obtenerUrl(form, camposValid){
    var campoValid;
    var nombreCampo;
    var campoForm;
    var valorCampo;
    var url;
    var i;
    
    url = form.action;
    for(i=0; i<camposValid.length; i++){
        campoValid  = camposValid[i];
        nombreCampo = campoValid['nombre'];
        campoForm   = form.elements[nombreCampo];
        if (campoForm){
            valorCampo = campoForm.value;
            if (valorCampo == undefined) {
                //el campo es un checkbox multiple
                valorCampo = checkboxToComas(campoForm);
            } else if (campoForm.type == 'checkbox' && !campoForm.checked) {
                valorCampo = '';
            }
            if (!campoValid['privado']) {
                if (valorCampo != false) {
                    url += '/' + nombreCampo + '=' + valorCampo;
                }
            } else {
                if (campoForm.value == undefined) {
                    //el campo es un checkbox multiple
                    renombrarCheckbox(campoForm, 'p_' + nombreCampo);
                } else {
                    campoForm.name = 'p_' + nombreCampo;
                }
            }
        }
    }
    return url;
}

function extraerCamposFormulario(form){
    var campos = {};
    var i;
    var campo;
    for (i=0; i<form.elements.length; i++){
        campo = form.elements[i];
        if (campo.type == 'radio') {
            if (campo.checked) {
                campos[campo.name] = campo.value;
            }
        } else {
            campos[campo.name] = campo.value;
        }
    }
    return campos;
}

function checkboxToArray(campoForm){
    var campos = [];
    var i;
    var j = 0;
    for (i=0; i<campoForm.length; i++){
        if (campoForm[i].checked){
            campos[j] = campoForm[i].value;
            j += 1;
        }
    }
    return campos;
}

function checkboxToComas(campoForm){
    var campos = checkboxToArray(campoForm);
    var comas = campos[0];
    var i;
    for (i=1; i<campos.length; i++){
        comas += ',' + campos[i];
    }
    return comas;
}

function renombrarCheckbox(campoForm, nuevoNombre){
    arrayTemp = [];
    var i;
    //creamos una copia de campoForm
    for (i=0; i<campoForm.length; i++){
        arrayTemp[i] = campoForm[i];
    }
    //si se utilizase campoForm en vez de arrayTemp, lo siguiente no funcionaria
    for (i=0; i<arrayTemp.length; i++){
        arrayTemp[i].name = nuevoNombre;
    }
    return arrayTemp;
}


function resaltarErroresFormulario(nombreForm, dictErrores){
    //Muestra los mensajes de error de un formulario, pero partiendo de un diccionario de errores tal y como
    //se usa en los controladores, en vez de los resultantes de una validacion javascript
    var form = document.forms[nombreForm];
    var camposValid = getListaValidacionForm(form);
    var errores = [];
    var mensajeError = '';
    var divError = '';
    var err = '';
    if (dictErrores['huboErrores']) {
        //Para cada campo del formulario, extraemos el error correspondiente, si es que existe
        //En algunas llamadas AJAX podriamos no tener valores de error para ciertos campos
        for(var i=0; i<camposValid.length; i++){
            var nombreCampo = camposValid[i]['nombre'];
            if (dictErrores[nombreCampo]) {
                errores.push([nombreCampo, dictErrores[nombreCampo]['codigo'], dictErrores[nombreCampo]['mensaje']]);
            }
        }
        
        //Ahora ponemos cada mensaje de error en su sitio
        for (i=0; i<errores.length; i++){
            err = errores[i];
            divError = document.getElementById('error_' + form.name.charAt(4).toLowerCase() + form.name.slice(5) + '_' + err[0]);
            //OJO: La validacion javascript envia false si hubo error, mientras que la aplicacion envia codigo 0 si NO hubo error
            if (!err[1]){
                if (divError){
                    divError.style.display = 'none';
                }
            } else {
                mensajeError = err[2];
                if (divError){
                    var clases = divError.className.split(' ');
                    var editable = true;
                    for (var j = 0; j < clases.length; j++){
                        if (clases[j] == 'noeditable'){
                            editable = false;
                            break;
                        }
                    }
                    if (!editable){
                        mensajeError = divError.innerHTML;
                    } else {
                        if (mensajeError != ""){
                            divError.innerHTML = mensajeError;
                        }
                    }
                    divError.style.display = 'block';
                }
            }
        }
    }
}


function ocultarErroresFormularios(){
    //Oculta los errores de formulario que se esten mostrando
    var errores = '';
    var error = '';
    var i = 0;
    if (document.getElementsByClassName) {
        errores = document.getElementsByClassName('error');
        for (i=0; i<errores.length; i++){
            error = errores[i];
            if (error.id && error.id.substring(6,0) == 'error_'){
                error.style.display = "none";
            }
        }
    } else {
        var divs = document.getElementsByTagName("div");
        var tds = document.getElementsByTagName("td");
        for (i=0; i<divs.length; i++){
            element = divs[i];
            if (element.className.indexOf("error") != -1) {
                if (element.id && element.id.substring(6,0) == 'error_'){
                    element.style.display = "none";
                }
            }
        }
        for (i=0; i<tds.length; i++){
            element = tds[i];
            if (element.className.indexOf("error") != -1) {
                if (element.id && element.id.substring(6,0) == 'error_'){
                    element.style.display = "none";
                }
            }
        }
    }
}

