/*
 * Mediante este metodo se valida el NIF de Personas jurídicas y entidades en general. 
 * Paramentros  
 * - documento a validar
 * Devuelve un booleano como resultado de la validacion
 */
function validarCIF(documento){
 	var temp=documento.toUpperCase();
	if (temp!==''){
		//si no tiene un formato valido devuelve error
		if (!/^[ABCDEFGHJPQRSUVNW]{1}[0-9]{7}[A-Z0-9]{1}$/.test(temp))	{
			return false;
		}
 
		//algoritmo para comprobacion de codigos tipo CIF
		var suma = parseInt(documento.charAt(2))+parseInt(documento.charAt(4))+parseInt(documento.charAt(6));
		for (var i=1; i < 8; i += 2)
		{
				var n = 2 * parseInt(documento.charAt(i));
				suma += Math.floor(n/10)+n%10;
		}

		var n = 10 - suma%10;

		//comprobacion de CIFs con codigo de control de tipo numerico
		if (/^[ABCDEFGHJNUV]{1}/.test(temp)){
			return(documento.charAt(8) == n%10);
		}
		
		//comprobacion de CIFs con codigo de control de tipo letra
		if (/^[PQRSNW]{1}/.test(temp)){
			return (documento.charAt(8) == String.fromCharCode(64 + n));
		}		
	}
	return false;
}

// ----------------- ----------------- ----------------- -----------------
/*
 * Mediante este metodo se valida el NIF de Personas físicas nacionales o extranjeros sin NIE
 * Paramentros  
 * - documento a validar
 * Devuelve un booleano como resultado de la validacion
 */
function validarNIF(documento){

 	var temp=documento.toUpperCase();
	if (temp!==''){
		//si no tiene un formato valido devuelve error
		if (!/^[KLM0-9]{1}[0-9]{7}[A-Z]{1}$/.test(temp))	{
			return false;
		}
	var cadenadni="TRWAGMYFPDXBNJZSQVHLCKE";
 
		//NIF especiales
		if (/^[KLM]{1}/.test(temp))
		{
			temp = temp.replace(/\S/,"0");
		}
 		var posicion = temp.substring(0,8) % 23;

		return (temp.charAt(8) == cadenadni.charAt(posicion));
	}

}

// ----------------- ----------------- ----------------- -----------------
/*
 * Mediante este metodo se valida el NIE 
 * Paramentros  
 * - documento a validar
 * Devuelve un booleano como resultado de la validacion
 */

function validarNIE(documento){

 	var temp=documento.toUpperCase();
	if (temp!==''){
		//si no tiene un formato valido devuelve error
		if (!/^[XYZ]{1}[0-9]{7}[A-Z]{1}$/.test(temp))	{
			return false;
		}
		var cadenadni="TRWAGMYFPDXBNJZSQVHLCKE";
	 
		var ch = "0";
		switch (temp.charAt(0)) {
				case "Y": ch = "1"; break;
				case "Z": ch = "2"; break;
		}
		temp = temp.replace(/\S/,ch);

 		var posicion = temp.substring(0,8) % 23;

		return (temp.charAt(8) == cadenadni.charAt(posicion));
	}

}

// ----------------- ----------------- ----------------- -----------------
function getTipoNIF(documento)
{
		if (/^[KLM0-9]{1}[0-9]{7}[A-Z]{1}$/i.test(documento))	return 1;
		if (/^[ABCDEFGHJPQRSUVNW]{1}[0-9]{7}[A-Z0-9]{1}$/i.test(documento))	return 2;
		if (/^[XYZ]{1}[0-9]{7}[A-Z]{1}$/i.test(documento))	return 3;

		return 0;
}


// ----------------- ----------------- ----------------- -----------------
/*
 * Mediante este metodo se validan todos los tipos de document (NIF,CIF,NIE)
 * Paramentros  
 * - documento a validar
 * Devuelve 1,2,3 para NIF,CIF,NIE correctos, -1,-2,-3 para NIF,CIF,NIE incorrectos ó 0 si no es de ningún tipo
 */
function validarDocumento(documento) {
		var tipo = getTipoNIF(documento);
		var res = false;
		switch(tipo) {
				case 1: res = validarNIF(documento);break;
				case 2: res = validarCIF(documento);break;
				case 3: res = validarNIE(documento);break;
		}
		var resultado = tipo * (res?1:-1);	
		switch (resultado){
				case -1: alert ("Por favor, introduzca un NIF correcto");break;
				case -2: alert ("Por favor, introduzca un CIF correcto");break;
				case -3: alert ("Por favor, introduzca un NIE correcto");break;
				case 0: alert ("Por favor, introduzca un NIF correcto"); break;
		}
		return resultado;
}
