function ValidaNif(cadenaNif)
{
	var valoresNif= new Array ("0","1","2","3","4","5","6","7","8","9","K","L","X");
	var valoresCif= new Array ("A","B","C","D","E","F","G","H","N","P","Q","S");
	var controlNif = 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");
	var controlCifLetras = new Array ("A","B","C","D","E","F","G","H","I","J");
	while (cadenaNif.length<9)
		cadenaNif = "0" + cadenaNif;	
	caracterControl=cadenaNif.substring(8,9).toUpperCase();
	//TIPO DE NIF	
	primerCaracter=cadenaNif.substring(0,1).toUpperCase();
	var tipo="desconocido";	
	
	for (i=0;i<valoresNif.length;i++)
	{
		if (valoresNif[i]==primerCaracter)
			tipo="NIF";
	}	
	if (tipo=="desconocido")
	{
		for (i=0;i<valoresCif.length;i++)
		{
			if (valoresCif[i]==primerCaracter)
				tipo="CIF";
		}
	}
	if (tipo=="desconocido") 
		return (5);		//El primer caracter del nif no es válido.
	if (tipo=="NIF")
	{	
		var provincia="";
		if ((primerCaracter=="K") || (primerCaracter=="L"))
		{		
			provincia=cadenaNif.substring(1,3);
			if (!esDigito(provincia))
				return 2;   //Codigo de provincia no válido			
			numero=cadenaNif.substring(3,8);			
		}
		else
			if (primerCaracter=="X")
			{	
				numero=cadenaNif.substring(1,8);
			}
			else
			{		
				numero=cadenaNif.substring(0,8);		
			}
		if (!esDigito(numero))
			return 3;   //Parte numérica del Nif no válida		
		caracterControlCalculado=controlNif [((parseFloat(numero)%23))];
		  //El algoritmo dice que al resto hay que 
		  //sumarle 1, eso lo hacemos al indexar el 
		  //array ya que los indices empiezan en 0				
		if (caracterControl != caracterControlCalculado)
			return 4;   //Carácter Control incorrecto
	}
	else
		if (tipo=="CIF")
		{
			if (primerCaracter=="N")
			{
				pais=cadenaNif.substring(1,4);
				if (!esDigito(pais)) return 6;   //Codigo de pais no válido
				numero=cadenaNif.substring(4,8);
			}
			else
			{
				numero=cadenaNif.substring(1,8);		
			}
			if (!esDigito(numero))
				return 3;   //Parte numérica del Nif no válida				
			caracterControlCalculado = 10 - ( (
							 Math.floor( 0.2*parseInt(cadenaNif.substring(1,2),10) ) +
							 ( 2*parseInt(cadenaNif.substring(1,2),10) %10) +						 
							  Math.floor( 0.2*parseInt(cadenaNif.substring(3,4),10) ) +
							 ( 2*parseInt(cadenaNif.substring(3,4),10) %10) +							 
							  Math.floor( 0.2*parseInt(cadenaNif.substring(5,6),10) ) +
							 ( 2*parseInt(cadenaNif.substring(5,6),10) %10) +
							  Math.floor( 0.2*parseInt(cadenaNif.substring(7,8),10) ) +
							 ( 2*parseInt(cadenaNif.substring(7,8),10) %10) +
							 parseInt(cadenaNif.substring(2,3),10) +
							 parseInt(cadenaNif.substring(4,5),10) +
							 parseInt(cadenaNif.substring(6,7),10) 
							 )% 10);		
			if ((primerCaracter=="N") ||(primerCaracter=="P") || (primerCaracter=="Q") || (primerCaracter=="S") )
			{
				caracterControlCalculado = valoresCif[caracterControlCalculado-1];
			}
			if (caracterControlCalculado==10)
				caracterControlCalculado=0;
			if (caracterControl != caracterControlCalculado)
				return 4;   //Carácter Control incorrecto
		} 
	return 0;  //todo bien.
}
function esDigito(cadenaEntrada)
{

	for (i=0;i<cadenaEntrada.length;i++)
	{

		if  ( isNaN(parseInt(cadenaEntrada.substring(i,i+1),10)) ) return (false);	//Netscape

		if ((cadenaEntrada.substring(i,i+1))!=(parseInt(cadenaEntrada.substring(i,i+1),10))) return (false);	//Explorer


	}
	return (true);

}