//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'], '').replace(argumentosJs['home_url_segura'], '');
        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, camposParciales) {
    /** valida los campos del formulario form de acuerdo a la lista de validacion camposvalid
    *** camposParciales es un argumento opcional. Define una lista de nombres de campos a validar
    *** de forma que no se validarian todas las entradas de camposValid, sino solo aquellas cuyos
    *** nombres esten en camposParciales*/
    var i;
    var campos = [];
    if (camposParciales) {
        for( i = 0; i < camposValid.length; i ++) {
            var campoValid = camposValid[i];
            for (var j = 0; j <= camposParciales.length; j++) {
                if(camposParciales[j] == campoValid['nombre']) {
                    campos.push(campoValid);
                    break;
                }
            }
        }
    } else {
        campos = camposValid;
    }

    var errores = [];
    var ok = true;
    for(i=0; i<campos.length; i++) {
        var campoValid = campos[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 una input multiple
                        renombrarCheckbox(campoForm, nombreCampo);
                    } else {
                        campoForm.name = nombreCampo;
                    }
	            }
	        }
	    }       
        if (campoForm) {
            //si campoForm es una lista de input
            if (Object.prototype.toString.call(campoForm) === '[object NodeList]') {
                valorCampoTemp = checkboxToArray(campoForm);
                //si type == radio en ese caso valorCampo no sera una lista si no el unico valor checked (si lo hay).
                if (campoForm[0].type == 'radio') {
                    if (valorCampoTemp.length > 0) {
                        valorCampo = valorCampoTemp[0];
                    } else {
                        valorCampo = '';
                    }
                } else {//en otro caso valorCampo es la lista de valores 
                    valorCampo = valorCampoTemp;
                }
            } else {
                if (campoForm.type == 'checkbox') {
                    if (campoForm.checked) {
                        valorCampo = campoForm.value;
                    }
                } else {
                    var valorCampo  = campoForm.value;
                }
            }
        }

        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";
    } else if (validarAlfabetico(valor, nombre, args)[0]) {
        error = true;
        mensaje = 'El campo <b>' + nombre + "</b> sólo puede contener caracteres alfabéticos";
    }
    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";
    } else if (valor != '') {
        if (typeof valor != 'boolean') {
            if ((typeof valor == 'string' && valor.toUpperCase() != 'TRUE' && valor != '1' && valor.toUpperCase() != 'FALSE' && valor != '0' && valor.toUpperCase() != 'ON') || (typeof valor == 'number' && valor != 0 && valor != 1)) {
                error = true;
                mensaje = 'El campo <b>' + nombre + "</b> no tiene un formato válido";
            }
        }
    }

    return [error,mensaje];
}


function validarEmail(valor, nombre, args) {
    var error = false;
    var mensaje = '';
    if (!valor || valor == '') {
        if (!args['nulo']) {
            error = true;
            mensaje = 'El campo <b>' + nombre + "</b> es obligatorio";
        }
    } else if (valor.match('^([^@\\s]+)@((?:[-a-z0-9]+\\.)+[a-z]{2,})$') == null) {
        error = true;
        mensaje = 'El campo <b>' + nombre + '</b> tiene un formato no válido para un e-mail';
    }

    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";
    } else if (args['maxLong'] != undefined && valor.length > args['maxLong']) {
        error = true;
        mensaje = 'Ha superado la longitud maxima permitida';
    } else {
        if (validarAlfabetico(valor, nombre, args)[0]) {
            error = true;
            mensaje = 'El campo <b>' + nombre + '</b> sólo puede contener caracteres alfabéticos';
        }
    }

    return [error,mensaje];
}


var max_lon_direccion = 50;
var min_lon_direccion = 7;
function validarDireccion(valor, nombre, args) {
    var error = false;
    var mensaje = '';
    if (!valor || valor == '') {
        if (!args['nulo']) {
            error = true;
            mensaje = 'El campo <b>' + nombre + "</b> es obligatorio";
        }
    } else if (valor.length > max_lon_direccion || valor.length < min_lon_direccion) {
        error = true;
        mensaje = 'La longitud del campo <b>' + nombre + ' </b> ha de estar entre ' + max_lon_direccion + ' y ' + min_lon_direccion
    }
    return [error,mensaje];
}


function validarCp(valor, nombre, args) {
    var error = false;
    var mensaje = '';
    if (!valor || valor == '' ) {
        if (!args['nulo']) {
            error = true;
            mensaje = 'El campo <b>' + nombre + "</b> es obligatorio";
        }
    } else if (valor.match('^(0[1-9]|5[0-2]|[1-4][0-9])[0-9]{3}$') == null) {
        error = true;
        mensaje = 'El campo <b>' + nombre + '</b> tiene un formato no válido para un código postal';
    }

    return [error,mensaje];
}


function validarId(valor, nombre, args) {
    var error = false;
    var mensaje = '';
    if (!valor || valor == '') {
        if (!args['nulo']) {
            error = true;
            mensaje = 'El campo <b>' + nombre + "</b> es obligatorio";
        }
    } else {
        if (validarNatural(valor, nombre, args)[0]) {
            error = true;
            mensaje = 'El campo <b>' + nombre + '</b> ha de ser un número entero positivo';
        }
    }      
    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 (!valor || valor == '') {
        if (!args['nulo']) {
            error = true;
            mensaje = 'El campo <b>' + nombre + "</b> es obligatorio";
        }
    } else if (valor.match('(</?[^>]+>)')) {
        error = true;
        mensaje = 'No se admiten etiquetas HTML';
    }

    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";
    } else if (Object.prototype.toString.call(valor) === '[object Array]') {
        for (var i = 0; i < valor.length; i++) {
            errorTemp = validarId(valor[i], nombre, args);
            if (errorTemp[0]) {
                error = true;
                mensaje = 'Un campo de <b>' + nombre + '</b> no tiene un valor correcto';
                break;
            }
        }
    }
    return [error,mensaje];
}


function validarAlfabetico(valor, nombre, args, caracteresProhibidos) {
    var caracteresProhibidos = (caracteresProhibidos != null) ? caracteresProhibidos : '<>';
    var error = false;
    var mensaje = '';
    if (!valor || valor == '') {
        if (!args['nulo']) {
            error = true;
            mensaje = 'El campo <b>' + nombre + '</b> es obligatorio';
        }
    } else if (valor.match('.*['+ caracteresProhibidos + '].*') != null) {
        error = true;
        mensaje = 'El campo <b>' + nombre + '</b> debe contener sólo caracteres alfabéticos válidos';
    }

    return [error,mensaje];
}


function validarListaAlfabeticos(valor, nombre, args) {
    var error = false;
    var mensaje = '';
    if (!args['nulo'] && valor == '') {
        error = true;
        mensaje = 'El campo <b>' + nombre + '</b> es obligatorio';
    } else if (Object.prototype.toString.call(valor) === '[object Array]') {
        for (var i = 0; i < valor.length; i++) {
            errorTemp = validarAlfabetico(valor[i], nombre, args, '<>,');
            if (errorTemp[0]) {
                error = true;
                mensaje = 'Un campo de <b>' + nombre + '</b> no tiene un valor correcto';
                break;
            }
        }
    }

    return [error,mensaje];
}


function validarImagen(valor, nombre, args) {
    var extensionesPermitidas = new Array ('.jpeg', '.jpg', '.png', '.gif');
    var error = false;
    var mensaje = '';
    if (!valor || valor == '') {
        if (!args['nulo']) {
            error = true;
            mensaje = 'El campo <b>' + nombre + '</b> es obligatorio';
        }
    } else {
        var extension = (valor.substring(valor.lastIndexOf('.'))).toLowerCase(); 
        permitida = false;
        for (var i = 0; i < extensionesPermitidas.length; i++) {
            if (extension == extensionesPermitidas[i]) {
                permitida = true;
                break;
            }
        }
        if (!permitida) {
            error = true;
            mensaje = 'El campo <b>' + nombre + '</b> tiene una extensión no válida';
        }
    }
    return [error,mensaje];
}


function validarFecha(valor, nombre, args) {
    var error = false;
    var mensaje = '';
    if (!valor || valor == '') {
        if (!args['nulo']) {
            error = true;
            mensaje = 'El campo <b>' + nombre + '</b> es obligatorio';
        }
    } else {
        var valorUnificado = valor.replace('/', '-');
        try {
            fecha = valorUnificado.match('^([0-9]{4})\\-([0-9]{1,2})\\-([0-9]{1,2})$');
            testFecha = new Date(fecha[1], fecha[2] - 1, fecha[3]);
            if ((testFecha.getMonth() != fecha[2] - 1) || (testFecha.getDate() != fecha[3]) || (testFecha.getFullYear() != fecha[1])) {
                error = true;
                mensaje = 'El campo <b>' + nombre + '</b> tiene un formato de fecha incorrecta';
            }

        }catch (e) {
            try{
                fecha = valorUnificado.match('^([0-9]{1,2})\\-([0-9]{1,2})\\-([0-9]{4})$');
                testFecha = new Date(fecha[3], fecha[2] - 1, fecha[1]);
                if ((testFecha.getMonth() != fecha[2] - 1) || (testFecha.getDate() != fecha[1]) || (testFecha.getFullYear() != fecha[3])) {
                    error = true;
                    mensaje = 'El campo <b>' + nombre + '</b> tiene un formato de fecha incorrecta';
                }
            }catch(e) {
                error = true;
                mensaje = 'El campo <b>' + nombre + '</b> tiene un formato de fecha incorrecto';
            }
        }
        if (!error && args['fechaMaxima']) {

            fecha = args['fechaMaxima'].match('^([0-9]{4})\\-([0-9]{1,2})\\-([0-9]{1,2})$');
            if (fecha) {
                fechaMaxima = new Date(fecha[1], fecha[2] - 1, fecha[3]);
            } else {
                fecha = valorUnificado.match('^([0-9]{1,2})\\-([0-9]{1,2})\\-([0-9]{4})$');
                if (fecha) {
                    fechaMaxima = new Date(fecha[3], fecha[2] - 1, fecha[1]);
                }
            }
            
            if (fecha && testFecha > fechaMaxima) {
                error = true;
                mensaje = 'El campo <b>' + nombre + '</b> sobrepasa el valor máximo permitido';
            }
        }
    }

    return [error,mensaje];
}


function validarHora(valor, nombre, args) {
    var error = false;
    var mensaje = '';
    if (!valor || valor == '') {
        if (!args['nulo']) {
            error = true;
            mensaje = 'El campo <b>' + nombre + '</b> es obligatorio';
        }
    } else {
        try {
            hora = valor.match('^([0-9]{2})\\:([0-9]{2})$');//hh:mm
            testHora = new Date(0000, 00, 00, hora[1], hora[2]);
            if ((testHora.getHours() != hora[1]) || (testHora.getMinutes() != hora[2])) {
                error = true;
                mensaje = 'El campo <b>' + nombre + '</b> tiene un formato de hora incorrecta';
            }
        }catch (e) {
            try{
                hora = valor.match('^([0-9]{2})\\:([0-9]{2})\\:([0-9]{2})$');//hh:mm:ss
                testHora = new Date(0000, 00, 00, hora[1], hora[2], hora[3]);
                if ((testHora.getHours() != hora[1]) || (testHora.getMinutes() != hora[2]) || (testHora.getSeconds() != hora[3])) {
                    error = true;
                    mensaje = 'El campo <b>' + nombre + '</b> tiene un formato de hora incorrecta';
                }
            }catch(e) {
                try{
                    hora = valor.match('^([0-9]{2})\\:([0-9]{2})\\:([0-9]{2})\\.([0-9]+)$');//hh:mm:ss.f
                    testHora = new Date(0000, 00, 00, hora[1], hora[2], hora[3]);
                    if ((testHora.getHours() != hora[1]) || (testHora.getMinutes() != hora[2]) || (testHora.getSeconds() != hora[3])) {
                        error = true;
                        mensaje = 'El campo <b>' + nombre + '</b> tiene un formato de hora incorrecta';
                    }

                }catch(e) {
                    error = true;
                    mensaje = 'El campo <b>' + nombre + '</b> tiene un formato de hora incorrecta';
                }
            }
        }
    }
    return [error,mensaje];
}


function validarFechaHora(valor, nombre, args) {
    var error = false;
    var mensaje = '';
    if (!valor || valor == '') {
        if (!args['nulo']) {
            error = true;
            mensaje = 'El campo <b>' + nombre + '</b> es obligatorio';
        }
    } else {
        partes = valor.split(' ');
        if (partes.length == 1) {
            partes = valor.split('T');
        }
        if (partes.length <= 2) {
            var respuesta = validarFecha(partes[0], nombre, args);
            if ((!respuesta[0]) && (partes.length == 2)) {
                respuesta = validarHora(partes[1], nombre, args);
            }
            error = respuesta[0];
            mensaje = respuesta[1];
        }
        if (partes.length > 2 || error) {
            error = true;
            mensaje = 'Se recibió un formato de fecha-hora incorrecto';
        }

    }
    return [error,mensaje];
}


function validarSexo(valor, nombre, args) {
    var error = false;
    var mensaje = '';
    if (!valor || valor == '') {
        if (!args['nulo']) {
            error = true;
            mensaje = 'El campo <b>' + nombre + '</b> es obligatorio';
        }
    } else if (valor.toUpperCase() != 'HOMBRE' && valor.toUpperCase() != 'MUJER') {
        error = true;
        mensaje = 'El campo <b>' + nombre + '</b> sólo puede tener los valores hombre o mujer'
    }
    return [error,mensaje];
}


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


function validarTelefono(valor, nombre, args) {
    var error = false;
    var mensaje = '';
    if (!valor || valor == '') {
        if (!args['nulo']) {
            error = true;
            mensaje = 'El campo <b>' + nombre + '</b> es obligatorio';
        }
    } else if (valor.match('^(\\+34)?(6|9)[0-9]{8}$') == null) {
        error = true;
        mensaje = 'El campo <b>' + nombre + '</b> tiene un formato no válido para un teléfono';
    }

    return [error,mensaje];
}


function validarNatural(valor, nombre, args) {
    var error = false;
    var mensaje = '';
    if (!valor || valor == '') {
        if (!args['nulo']) {
            error = true;
            mensaje = 'El campo <b>' + nombre + "</b> es obligatorio";
        }
    } else {
        valor = parseInt(valor);
        if (isNaN(valor) || valor < 0) {  
            error = true;
            mensaje = 'El campo <b>' + nombre + ' debe ser un número entero positivo';
        }
    }
    return [error,mensaje];
}


function validarUrl(valor, nombre, args) {
    var error = false;
    var mensaje = '';
    if (!valor || valor == '') {
        if (!args['nulo']) {
            error = true;
            mensaje = 'El campo <b>' + nombre + "</b> es obligatorio";
        }
    } else {
        var expRegUrl = '';
        if (args['interna'] == undefined || args['interna']) {
            expRegUrl = '^https?:\/\/(' + argumentosJs.dominio + ')(\/(\\w+(\/\\w+)?(\/\\w+=[^<>]*)*\/?)?|\/)?(#[^<>]*)?$';
        } else if (!args['interna']) {
            expRegUrl = '^https?:\/\/(www\.)?([\.\-A-Za-z0-9_]+)\.([a-z]{2,4}|travel)(:\\d{2,5})?([\/\-A-Za-z0-9_]+\.[a-z]{2,4})?[\?]?(\\w+=[^<>&]*(&\\w+=[^<>\?]*)*)?$';
        }

        if (valor.match(expRegUrl) == null) {
            error = true;
            mensaje = 'El campo <b>' + nombre + '</b> tiene un formato no válido para url';
        }
    }

    return [error,mensaje];
}


function validarListaEmails(valor, nombre, args) {
    var error = false;
    var mensaje = '';
    if (!valor || valor == '') {
        if (!args['nulo']) {
            error = true;
            mensaje = 'El campo <b>' + nombre + "</b> es obligatorio";
        }
    } else if (Object.prototype.toString.call(valor) === '[object Array]') {
        for (var i = 0; i < valor.length; i++) {
            errorTemp = validarEmail(valor[i], nombre, args);
            if (errorTemp[0]) {
                error = true;
                mensaje = 'Un ' + nombre + ' tiene un formato incorrecto';
                break;
            }
        }
    } else {
        errorTemp = validarEmail(valor, nombre, args);
        if (errorTemp[0]) {
            error = true;
            mensaje = 'Un ' + nombre + ' tiene un formato incorrecto';
        }
    }

    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].type != 'checkbox' && campoForm[i].type != 'radio') || campoForm[i].checked) {
            campos[j] = campoForm[i].value;
            j += 1;
        }
    }
    return campos;
}

function inputToArray(campoForm) {
    var campos = [];
    var j = 0;
    if (campoForm) {
        if (!campoForm.length) {
            campos = [campoForm.value];
        } else {
            for (var i = 0; i < campoForm.length; i++) {
                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";
                }
            }
        }
    }
}


