function IsJudiric(val)
{
	if(val == null) return false;
	if(val == 'undefined') return false;
	if(val.length != 1) return false;
	var chars = new Array
	(
		'A', 'B', 'C', 'E', 'F', 'G', 'D', 'H', 'P', 'Q'
	);
	
	for(var i = 0; i < chars.length; i++)
		if(val == chars[i]) return true;
	return false;
}


function IsDigit(val)
{
	if(val == null) return false;
	if(val == 'undefined') return false;
	if(val.length != 1) return false;
	var digits = new Array
	(
		'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'
	);
	
	for(var i = 0; i < digits.length; i++)
		if(val == digits[i]) return true;
	return false;
}

function IsNumeric(val)
{
	for(var i = 0; i < val.length; i++)
		if(!IsDigit(val.charAt(i)))	return false;
	return true;
}

function Pad(val, length, pad)
{
	var diff = length - val.length;
	if(diff <= 0) return val;
	for(var i = 0; i < diff; i++)	val = pad + val;
	return val;
}

function PadNIF(obj)
{
	if(!firstNIFInput) return;
	firstNIFInput = false;
	if (obj.value.length==0) return;
	var nif = obj.value; 
	var cLast = obj.value.substr(obj.value.length - 1,1); 
	var cFirst = obj.value.substr(0,1);

	if(IsJudiric(cFirst))
	{
		obj.value = nif.substr(0,8);	
	}
	else
	{
		if(!IsNumeric(cLast))
			nif = nif.substr(0,obj.value.length - 1);
		if(!IsNumeric(nif)) return;			
		obj.value = Pad(nif, 9, '0');
	}
}

function validarNIFCIF (nif)
{
if (nif.length == 0)
  {
  	return "";
  }
  var letrasNif = "TRWAGMYFPDXBNJZSQVHLCKE";
  var er;				// expresion regular
  var digitos;			// parte numerica del identificativo
  var letra;			// caracter verificador alfabetico
  var numero;			// digitos del identificador
  var letraCorrecta;		// letra correspondiente al numero segun la tabla
  var numCorrecto;

  // a.1) Personas físicas con DNI:
  er = /^(\d{7,9})$/;
  
encontrado = er.exec(nif);

  if (encontrado)
  {
    digitos = encontrado[1];
    if (digitos.length == 7)
    {
      if (digitos.charAt (0) == "0")
      {
        return "";
      }
      numero = "0".concat (digitos);
    }
    else
    {	//digitos.length == 8
      if ((digitos.charAt (0) == "0") && (digitos.charAt (1) == "0"))
      {
        return "";
      }
      numero = digitos;
    }
    letraCorrecta = letrasNif.charAt(numero % 23)
    return letraCorrecta;	
 }
 else
 {	// a.2) Personas físicas con nacionalidad española menores de 14 años sin DNI:
    er = /^[KkLlXxMm](\d{7,9})$/;
    encontrado = er.exec(nif);
    if (encontrado)
    {
      digitos = encontrado[1];
      letraCorrecta = letrasNif.charAt(digitos % 23);
      return letraCorrecta;
    }
    else // Aquí empieza la búsqueda de un CIF
    {
     var letrasCif = "JABCDEFGHI";
     var numCorrecto;		// codigo numerico correspondiente al numero
     // a) Nacionales
     er = /^[a-gA-G](\d{7})$/;
     encontrado = er.exec(nif);
     if (encontrado)
     {
       digitos = encontrado[1];
       numCorrecto = numeroCIF (digitos);
       return numCorrecto;
     }
     else
     {
       // b) Extranjeros
       // c) Organismos autonomos
       //er = /^[a-hA-HsSpPqQ](\d{7})([a-hA-HyYjJ])$/;
	er = /^[a-hA-HsSpPqQ](\d{7})$/;
       encontrado = er.exec(nif);
       if (encontrado)
       {
         digitos = encontrado[1];
         letraCorrecta = letrasCif.charAt(numeroCIF (digitos));
         return letraCorrecta;
       }
     }
   }
  }
  return "";
}

function numeroCIF (digitos)
{
  var R1;
  var R2;
  var R;
  var resto;
  R1 = Number (digitos.charAt (1)) + Number (digitos.charAt (3)) + Number (digitos.charAt (5));
  d1 = String (2 * digitos.charAt (0));
  d2 = String (2 * digitos.charAt (2));
  d3 = String (2 * digitos.charAt (4));
  d4 = String (2 * digitos.charAt (6));
  R2 = Number (aUnDigito (d1)) + Number (aUnDigito (d2)) + Number (aUnDigito (d3)) + Number 

(aUnDigito (d4));
  R = R1 + R2;
  resto = (10 - (R % 10)) % 10;
  return resto;
}

function aUnDigito (n)
{
  if (n % 10 == n)
  {	// un solo digito
    return n.charAt (0);
  }
  else
  {	// dos digitos
    return (Number (n.charAt (0)) + (n % 10));
  }
}
