///// 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 = 'ABCDEFGHJKLMPQSUVRXW';
	acaban_en_letra = 'PQRSNXW';
	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)
	codigo2=codigo
	if (codigo == 10) {
		codigo2 = 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(codigo2)) {
		//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' || nif.charAt(0).toUpperCase()!='Y' || nif.charAt(0).toUpperCase()!='Z'){
        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) //Comentado, en explorer si el campo no es visible da error al darle el foco
			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_FORMATO);
        }
    } 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_FORMATO);
        }
    } else {
        alert(ERR_FECHA_FORMATO);
    }
    return false;
}
//Valida la tarjeta de residente
function validar_nie(NIF){
    var tabla = 'TRWAGMYFPDXBNJZSQVHLCKE';
    if (((NIF.charAt(0)).toUpperCase())=='X' || ((NIF.charAt(0)).toUpperCase())=='Y' ||((NIF.charAt(0)).toUpperCase())=='Z')  //Tarjeta de residentes, nuevo formato
    {
       sinletra2=NIF.substring(1,NIF.length-1);
       while(sinletra2.length<7)
       {
         sinletra2="0"+sinletra2;
       }
       if (((NIF.charAt(0)).toUpperCase())=='Y') {
         sinletra2="1"+sinletra2;
       }
       if (((NIF.charAt(0)).toUpperCase())=='Z') {
         sinletra2="2"+sinletra2;
       }
       for(i=1;i<NIF.length-1;i++)
       {
         if (!es_digito(NIF.charAt(i))){
            alert(ERR_NIE);
            return false;
         }
       }
       numero2=parseInt(sinletra2) % 23;
       if (tabla.charAt(numero2)==(NIF.charAt(8)).toUpperCase()) return true;
       alert(ERR_NIE);
       return false;
    }
}

function nuevoFormateo(num, numDec, decSep, thousandSep){
	if(typeof(num) == 'undefined') return;
	alert(num.toString().lastIndexOf("."));

}


// Convierte un numero a formato xx.xx,xx
function escribirNumero(Num, Dec){
	if(Num==0){
		return '';
	}
    if (Dec == null) Dec = 2;
    n = new NumberFormat(Num);
    n.setCurrency(false);
    n.setPlaces(Dec);
    n.setSeparators(true, '.',',');
    return n.toFormatted();
}

// Convierte un formato xx.xxx,xx a n?mero
function leerNumero(campo, Dec){
    if (Dec == null) Dec = 2;
    n = new NumberFormat();
    n.setCurrency(false);
    n.setPlaces(Dec);
    n.setSeparators(true, '.',',');
    n.setInputDecimal(',')
    n.setNumber(campo);
    return redondear(n.toUnformatted(), Dec);
}

// Actualiza un campo de formulario num?rico, formate?ndolo con dos decimales
function actualizarNumero(campo, Dec) {
    if (Dec == null) Dec = 2;
    campo.value = escribirNumero(leerNumero(campo.value, Dec), Dec);
}

// Actualiza un campo de formulario entero, formate?ndolo sin decimales
function actualizarEntero(campo) {
	var hh = campo.value;
    var num = escribirNumero(leerNumero(campo.value));
    campo.value = num.substring(0, num.length-4)
}

// Redondear con dos decimales
function redondear(Num, Dec){
    if (Dec == null) Dec = 2;
    var tmp = Math.pow(10, Dec);
    return Math.round(Num*tmp)/tmp;
}
