///// Funciones para validar formularios /////

// Devuelve TRUE si el caracter es un digito
function es_digito(c) {
    if ((c.charCodeAt(0) >= "0".charCodeAt(0)) &&
        (c.charCodeAt(0) <= "9".charCodeAt(0))) {
        return true;
    } else {
        return false;
    }
}

// Devuelve TRUE si el caracter es una letra
function es_letra(c) {
    c = c.toLowerCase();
    if ((c.charCodeAt(0) >= "a".charCodeAt(0)) &&
        (c.charCodeAt(0) <= "z".charCodeAt(0))) {
        return true;
    } else {
        return false;
    }
}

// Valida una direccion de correo electronico (@ y .)
function validamail(strEmail) {
    if ((strEmail.indexOf("@") != -1) && (strEmail.indexOf(".") != -1)){
        return true;
    } else {
        return false;
    }
}

// Valida que el valor recibido tenga formato de Codigo Postal (5 cifras)
function validaCP(cp) {
    var j
    if (cp.length != 5) {
        return false
    }
    for (j = 0; j < cp.length; j++) {
        if (!es_digito(cp.charAt(j))) {
            return false
        }
    }
    return true
}

// Valida que el valor recibido corresponda con el formato de número de teléfono
// (al menos 9 digitos y el signo + opcional, se admiten como separadores " " y "-")
function validaTfno(tfno) {
    var n
    var total = 0
    var ini = 0
    var min = 9

    if (tfno.charAt(0) == '+') {
        ini = 1
    }

    for (n = ini; n < tfno.length; n++) {
        car = tfno.charAt(n)
        if (es_digito(car)) {
            total++
        } else if ((car != ' ') && (car != '-')) {
            return false
        }
    }
    return (total >= min)
}

// Filtra la cadena de texto para que solo contenga mayúsculas y digitos
function filtrar_nif_cif(cadena) {
    i = 0
    res = ""
    while (i < cadena.length) {
        if (es_letra(cadena.charAt(i)) || es_digito(cadena.charAt(i))) {
            res += cadena.charAt(i).toUpperCase();
        }
        i++
    }
    return res
}

// Devuelve la letra correspondiente a un nif
function calcular_letra_nif(numero) {
    letras = new Array("T", "R", "W", "A", "G", "M", "Y", "F", "P", "D", "X", "B",
        "N", "J", "Z", "S", "Q", "V", "H", "L", "C", "K", "E")
    return (letras[numero % 23]);
}

// Valida que la cadena recibida tenga formato válido de NIF
function validar_nif(nif) {
    if (!es_digito(nif.charAt(1)) || !es_digito(nif.charAt(2)) || !es_digito(nif.charAt(3)) || !es_digito(nif.charAt(4)) || !es_digito(nif.charAt(5)) || !es_digito(nif.charAt(6)) || !es_digito(nif.charAt(7)) || !es_letra(nif.charAt(8))) {
        alert(ERR_NIF_1); // El NIF debe constar de 8 cifras y una letra
        return false;
    }
    if (calcular_letra_nif(nif.substr(0,8)) != nif.charAt(8).toUpperCase()) {
        alert(ERR_NIF_2); // "La letra del NIF no es correcta")
        return false;
    }
    return true;
}

// Valida que la cadena recibida tenga formato válido de CIF
function validar_cif(cif) {
    var i
    letras_iniciales = 'ABCDEFGHKLMPQSX';
    acaban_en_letra = 'PQSX';
    cif = cif.toUpperCase();
    if ((letras_iniciales.indexOf(cif.charAt(0)) < 0) || !es_digito(cif.charAt(1)) || !es_digito(cif.charAt(2)) || !es_digito(cif.charAt(3)) || !es_digito(cif.charAt(4)) || !es_digito(cif.charAt(5)) || !es_digito(cif.charAt(6)) || !es_digito(cif.charAt(7)) || (!es_digito(cif.charAt(8)) && !es_letra(cif.charAt(8)))) {
        alert(ERR_NIF_3); // "Formato incorrecto de CIF"
        return false;
    }
    suma = parseInt(cif.charAt(2)) + parseInt(cif.charAt(4)) + parseInt(cif.charAt(6));
    for (i = 1; i <= 4; i++) {
        doble = 2 * parseInt(cif.charAt(2*i - 1))
        suma += (doble % 10) + parseInt(doble / 10)
    }
    codigo = 10 - (suma % 10)
    if (codigo == 10) {
        codigo = 0
    }
    if (acaban_en_letra.indexOf(cif.charAt(0)) >= 0) {
        if (cif.charAt(8) != String.fromCharCode(64 + codigo)) {
            alert(ERR_NIF_4); // "El último caracter del CIF no es correcto"
            return false
        }
    }
    else if (parseInt(cif.charAt(8)) != parseInt(codigo)) {
        alert(ERR_NIF_4); // "El último caracter del CIF no es correcto"
        return false
    }
    return true
}

// Valida que el elemento recibido tenga formato válido de NIF/CIF
function validar_nif_cif(formulario, campo) {
    elem = document.forms[formulario].elements[campo]
    elem.value = filtrar_nif_cif(elem.value)
    nif_cif = elem.value
    if (nif_cif.length != 9) {
        alert(ERR_NIF_5); // "El NIF/CIF debe contener 9 caracteres"
        return false;
    }
    if (es_digito(nif_cif.charAt(0))) {
        return validar_nif(nif_cif);
    }
    else if (es_letra(nif_cif.charAt(0))) {
        return validar_cif(nif_cif);
    }
    else {
        alert(ERR_NIF_6); // "El NIF/CIF debe comenzar por letra o número"
        return false
    }
}

// valida que el campo sea un nif o un nie válido.
function validar_nif_nie(nif) {
    if(nif.charAt(0).toUpperCase()!='X'){
        return validar_nif(nif);
    } else {
        return validar_nie(nif);
    }
}

// Valida que los campos recibidos hayan sido rellenados
function validar_obligatorios(formulario, campos_obligatorios) {
    var n
    for (n = 0; n < campos_obligatorios.length; n++) {
        campo = campos_obligatorios[n];
        if (!obtenerValor(formulario, campo)) {
            foco(formulario, campo)
            return false
        }
    }
    return true
}

// Valida que el valor recibido tenga formato de año (4 cifras)
function validaAnyo(anyo) {
    var j
    if (anyo.length != 4) {
        return false
    }
    for (j = 0; j < anyo.length; j++) {
        if (!es_digito(anyo.charAt(j))) {
            return false
        }
    }
    return true
}

function validarFecha(campo) {
    f = campo.value;
    if (campo.value.length == 10) {
        var dia = f.substr(0,2);
        var mes = f.substr(3,2);
        var anyo  = f.substr(6,4);
        var ndia  = parseInt(dia, 10);
        var nmes  = parseInt(mes, 10);
        var nanyo = parseInt(anyo, 10);
        var dias  = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
        if (nanyo % 4 == 0 && nanyo % 400 != 0) {
            dias[1] = 29;
        }
        if (nmes >= 1 && nmes <= 12 && ndia >= 1 && ndia <= dias[nmes-1] ) {
            campo.value = dia + "/" + mes + "/" + anyo;
            return true;
        } else {
            alert(ERR_FECHA_INVALIDA);
        }
    } else if (campo.value) {
        alert(ERR_FECHA_FORMATO);
        campo.value = "";
        campo.focus();
    }
//    campo.value = "";
    campo.focus();
    return false;
}

function validarFechaAnyos(campo,anyoini,anyofin) {
    if (validarFecha(campo)) {
        var anyo  = campo.value.substr(6,4);
        var nanyo = parseInt(anyo, 10);
        if (!(anyoini<=nanyo && nanyo<=anyofin)) {
            alert(ERR_FECHA_RANGOANYOSINVALIDO + anyoini + '-' + anyofin);
            campo.focus();
            return false;
        }
    }
    return true;
}

function validarFechaSelect(selectDia, selectMes, selectAnyo) {
    if ((selectDia.value != "") && (selectMes.value != "") && (selectAnyo.value != "")) {
        var dia = selectDia.value;
        var mes = selectMes.value;
        var anyo  = selectAnyo.value;
        var ndia  = parseInt(dia, 10);
        var nmes  = parseInt(mes, 10);
        var nanyo = parseInt(anyo, 10);
        var dias  = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
        if (nanyo % 4 == 0 && nanyo % 400 != 0) {
            dias[1] = 29;
        }
        if (nmes >= 1 && nmes <= 12 && ndia >= 1 && ndia <= dias[nmes-1] ) {
            return true;
        } else {
            alert(ERR_FECHA_NO_VALIDA);
        }
    } else {
        alert(ERR_FECHA_NO_VALIDA);
    }
    return false;
}
//Valida la tarjeta de residente
function validar_nie(NIF){
    var tabla = 'TRWAGMYFPDXBNJZSQVHLCKE';
    if (((NIF.charAt(0)).toUpperCase())=='X')  //Tarjeta de residentes, nuevo formato
    {
       sinletra2=NIF.substring(1,NIF.length-1);
       while(sinletra2.length<7)
       {
         sinletra2="0"+sinletra2;
       }
       for(i=1;i<NIF.length-1;i++)
       {
         if (!es_digito(NIF.charAt(i))){
            alert(ERR_NIE_1);
            return false;
         }
       }
       numero2=parseInt(sinletra2) % 23;
       if (tabla.charAt(numero2)==(NIF.charAt(8)).toUpperCase()) return true;
       alert(ERR_NIE_1);
       return false;
    }
}

function mktime() {
    var no, ma = 0, mb = 0, i = 0, d = new Date(), argv = arguments, argc = argv.length;

    if (argc > 0){
        d.setHours(0,0,0); d.setDate(1); d.setMonth(1); d.setYear(1972);
    }

    var dateManip = {
        0: function(tt){ return d.setHours(tt); },
        1: function(tt){ return d.setMinutes(tt); },
        2: function(tt){ var set = d.setSeconds(tt); mb = d.getDate() - 1; return set; },
        3: function(tt){ var set = d.setMonth(parseInt(tt)-1); ma = d.getFullYear() - 1972; return set; },
        4: function(tt){ return d.setDate(tt+mb); },
        5: function(tt){ return d.setYear(tt+ma); }
    };

    for( i = 0; i < argc; i++ ){
        no = parseInt(argv[i]*1);
        if (isNaN(no)) {
            return false;
        } else {
            // arg is number, let's manipulate date object
            if(!dateManip[i](no)){
                // failed
                return false;
            }
        }
    }
    return Math.floor(d.getTime()/1000);
}

function time() {
    return Math.round(new Date().getTime()/1000);
}