/*
El CIF consta de 9 dígitos:

 _   _ _ _ _ _ _ _   _
|_| |_|_|_|_|_|_|_| |_|
 ^   ^           ^   ^
 |   |_ Números _|   |
 |                   |
 |                  Dígito de control, un número ó letra: {Aó1,Bó2,Có3,Dó4,Eó5,Fó6,Gó7,Hó8,Ió9,Jó0}
 | 
Letra de tipo de Organización, una de las siguientes: {A,B,C,D,E,F,G,H,K,L,M,N,P,Q,S}

El primer dígito es una letra que indica el tipo de la organización y puede ser una de los siguientes:

            A - Sociedad Anónima.
            B - Sociedad de responsabilidad limitada.
            C - Sociedad colectiva.
            D - Sociedad comanditaria.
            E - Comunidad de bienes.
            F - Sociedad cooperativa.
            G - Asociación.
            H - Comunidad de propietarios.
            K - Formato antiguo.
            L - Formato antiguo.
            M - Formato antiguo.
            N - Formato antiguo.
            P - Corporación local.
            Q - Organismo autónomo.
            S - Organo de la administración.

Los siete dígitos siguientes son números y el último es el dígito de control que puede ser un número ó una letra.

Las operaciones para calcular el dígito de control se realizan sobre los siete dígitos centrales y son las siguientes:

- Sumar los dígitos de la posiciones pares. Suma = A

- Para cada uno de los dígitos de la posiciones impares, multiplicarlo por 2 y sumar los dígitos del resultado.
Ej.: ( 8 * 2 = 16 --> 1 + 6 = 7 ). Acumular el resultado. Suma = B

- Sumar A + B = C

- Tomar sólo el dígito de las unidades de C y restárselo a 10. Esta resta nos da D.

- A partir de D ya se obtiene el dígito de control. Si ha de ser numérico es directamente D y si se trata de una letra se corresponde con la relación:
A = 1, B = 2, C = 3, D = 4, E = 5, F = 6, G = 7, H = 8, I = 9, J = 0

Ejemplo para el C.I.F. : A58818501

- Utilizamos los siete dígitos centrales = 5881850

- Sumamos los dígitos pares: A = 8 + 1 + 5 = 14

- Posiciones impares:

        5 * 2 = 10 -> 1 + 0 = 1
        8 * 2 = 16 -> 1 + 6 = 7
        8 * 2 = 16 -> 1 + 6 = 7
        0 * 2 = 0 -> = 0
        Sumamos los resultados: B = 1 + 7 + 7 + 0 = 15

- Suma parcial: C = A + B = 14 + 15 = 29

- El dígito de las unidades de C es 9. Se lo restamos a 10 y nos da: D = 10 - 9 = 1

- Si el dígito de control ha de ser un número es 1 y si ha de ser una letra es la "A"
*/

// La función recibe el CIF completo
function validarDigitoControlCIF(cifstr){
	var v1 = new Array(0,2,4,6,8,1,3,5,7,9); 
	var temp = 0; 
	var temp1;
	var dcontrol = cifstr.substr(8,1);
	for( i = 2; i <= 6; i += 2 ){
		temp = temp + v1[ parseInt(cifstr.substr(i-1,1)) ];
		temp = temp + parseInt(cifstr.substr(i,1));
	}
	temp = temp + v1[ parseInt(cifstr.substr(7,1)) ];
	temp = (10 - ( temp % 10));
	if(dcontrol == temp){
		return(true);
	}
	else if(temp == 1){
		if(dcontrol == 'A'){
			return(true);
		}
	}
	else if(temp == 2){
		if(dcontrol == 'B'){
			return(true);
		}
	}
	else if(temp == 3){
		if(dcontrol == 'C'){
			return(true);
		}
	}
	else if(temp == 4){
		if(dcontrol == 'D'){
			return(true);
		}
	}
	else if(temp == 5){
		if(dcontrol == 'E'){
			return(true);
		}
	}
	else if(temp == 6){
		if(dcontrol == 'F'){
			return(true);
		}
	}
	else if(temp == 7){
		if(dcontrol == 'G'){
			return(true);
		}
	}
	else if(temp == 8){
		if(dcontrol == 'H'){
			return(true);
		}
	}
	else if(temp == 9){
		if(dcontrol == 'I'){
			return(true);
		}
	}
	else if(temp == 10){
		if((dcontrol == 'J') || (dcontrol == 0)){
			return(true);
		}
	}
	return(false);
}

// La función recibe el CIF completo
function validarCIF(cifstr){
	// Retocada per Ramonet
	var resul = false;
	var temp = cifstr.toUpperCase(); // pasar a mayúsculas
	if (!/^[A-Za-z0-9]{9}$/.test(temp)){
		// Son 9 dígitos?
		alert ("Longitud incorrecta, un CIF consta de 9 dígitos");	
	}
	else if (!/^[ABCDEFGHKLMNPQS]/.test(temp)){
		// Es una letra de las admitidas ?
		alert("El primer dígito es incorrecto, debe ser una letra de las siguientes: A,B,C,D,E,F,G,H,K,L,M,N,P,Q,S ");
	}
	else{
		$control = validarDigitoControlCIF(cifstr.toUpperCase());
		if($control){
			alert("CIF CORRECTO");
		}
		else{
			alert("ATENCIÓN: CIF INCORRECTO");
		}
	}
	return(true);
}

function validarNIF(nifstr){
	// Retocada per Ramonet
	var resul = false;
	var temp = nifstr.toUpperCase(); // pasar a mayúsculas
	var letra = temp.substr(8,1);
	var cifras =  temp.substr(0,8);
	if (!/^[A-Za-z0-9]{9}$/.test(temp)){
		// Son 9 dígitos?
		alert ("Longitud incorrecta, un NIF consta de 9 dígitos (ocho números y una letra)");	
	}
	var letracorrecta = obtenerLetraNIF(cifras);
	if(letra == letracorrecta){
		alert("NIF CORRECTO");	
	}
	else{
		alert("ATENCIÓN: NIF INCORRECTO");
	}
	return(true);
}

// La función recibe la parte númerica del NIF
function obtenerLetraNIF(dnistr){
	var clave = 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");
	if (isNaN(dnistr)){
		alert("El DNI debe estar formado exclusivamente por digitos");
		return(false);
	}
	else{
		letra = clave[dnistr%23];
	}
	return(letra);
}

function validarcifonif(cifstr){
	// Si el primer caracter es un número del 0 al 9 intenta validar un NIF
	// prueba con un CIF en el caso contrario
	var temp = cifstr.toUpperCase(); // pasar a mayúsculas
	if (!/^[0-9]/.test(temp)){
		// Es una letra de las admitidas ?
		// alert("CIF");
		validarCIF(cifstr);
	}
	else{
		// alert("NIF");
		validarNIF(cifstr);
	}
}

function validarNIF2(nifstr){
	// Admite dos formatos NNNNNNNNL o NNNNNNNN-L
	var resul = false;
	var temp = nifstr.toUpperCase(); // pasar a mayúsculas
	var formato = 1;
	var letra = temp.substr(8,1);
	if(letra == '-'){
		letra = temp.substr(9,1);
		formato = 2;
	} // fin condición
	var cifras =  temp.substr(0,8);
	if (!/^[0-9]{8}[\-]?[TRWAGMYFPDXBNJZSQVHLCKE]{1}$/.test(temp)){
		alert ("Formato incorrecto de nif");	
	}
	var letracorrecta = obtenerLetraNIF(cifras);
	if(letra == letracorrecta){
		alert("NIF CORRECTO");	
	}
	else{
		alert("ATENCIÓN: NIF INCORRECTO");
	}
	return(true);
}


function validarNIFImproved(number, letter, lang){ return true;
	number = number.toUpperCase(); // pasar a mayúsculas
	letter = letter.toUpperCase(); // pasar a mayúsculas
	var cifras = number;
	var letra = letter;
	var dni = cifras+letra;
	if (!/^[0-9]{8}[\-]?[TRWAGMYFPDXBNJZSQVHLCKE]{1}$/.test(dni)){
		if(lang == "va"){
			alert ("El format del camp dni es incorrecte");
		}
		else{
			alert ("El formato del campo dni es incorrecto");
		}
		return(false);
	}
	var letracorrecta = obtenerLetraNIF(cifras);
	if(letra == letracorrecta){
		return(true);
	}
	else{
		if(lang == "va"){
			alert ("El format del camp dni es incorrecte");
		}
		else{
			alert ("El formato del campo dni es incorrecto");
		}
		return(false);
	}
}

function validarNIF9Caracteres(nifstr){
	// Formato: NNNNNNNNL
	var resul = false;
	var temp = nifstr.toUpperCase(); // pasar a mayúsculas
	var formato = 1;
	var letra = temp.substr(8,1);
	var cifras =  temp.substr(0,8);
	//if (!/^[0-9]{8}[\-]?[TRWAGMYFPDXBNJZSQVHLCKE]{1}$/.test(temp)){
	if (!/^[0-9]{8}[TRWAGMYFPDXBNJZSQVHLCKE]{1}$/.test(temp)){
		return(false);
	}
	var letracorrecta = obtenerLetraNIF(cifras);
	if(letra == letracorrecta){
		return(true);
	}
	else{
		return(false);
	} // end condition
}

