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