/**************************************************************
 Validación del cif/nif. Por Carlitos. carlosbernad@teleline.es
 Si usas este script, deja intactas estas líneas (créditos). Vale?
 También te agradecería un e-mail con tus comentarios.
 Idea original de validación de cif de KarlanKas
**************************************************************/
function valcif(cif,fld){
	par = 0; non = 0; letras="ABCDEFGHKLMNPQS"; let=cif.charAt(0);
	if (!isNaN(let) || let.toUpperCase()=="X") return valnif(cif.substring(1,cif.length),fld);
	if (cif.length!=9){	goo(fld).focus(); return false; }
	if (letras.indexOf(let.toUpperCase())==-1){ goo(fld).focus(); return false; }
	for (zz=2;zz<8;zz+=2){ par = par+parseInt(cif.charAt(zz)); }
	for (zz=1;zz<9;zz+=2){ nn = 2*parseInt(cif.charAt(zz)); if (nn > 9) nn = 1+(nn-10); non = non+nn; }
	parcial = par + non; control = (10 - ( parcial % 10)); if (control==10) control=0;
	if (control!=cif.charAt(8)){ goo(fld).focus(); return false }
	return true;
}

function valnif(abc,fld){
	dni=abc.substring(0,abc.length-1); let=abc.charAt(abc.length-1);
	if (!isNaN(let)){ 
		goo(fld).focus(); return false;
	}else{
		cadena="TRWAGMYFPDXBNJZSQVHLCKET"; posicion = dni % 23; letra = cadena.substring(posicion,posicion+1);
		if (letra!=let.toUpperCase()){ goo(fld).focus(); return false; }
	}
	return true;
}

/*==============================================================================
Application:   Utility Function
Author:        John Gardner
------------------------------------------------------------------------------*/

function checkVATNumber (toCheck) {
  var vatexp = new Array ();
  var defCCode = "GB";
  vatexp.push (/^(AT)U(\d{8})$/);                           //** Austria
  vatexp.push (/^(BE)(\d{9}\d?)$/);                         //** Belgium 
  vatexp.push (/^(BG)(\d{9,10})$/);                         // Bulgaria 
  vatexp.push (/^(CY)\d{8}[A-Z]$/);                         // Cyprus 
  vatexp.push (/^(CZ)(\d{8,10})(\d{3})?$/);                 //** Czech Republic
  vatexp.push (/^(DK)((\d{8}))$/);                          //** Denmark 
  vatexp.push (/^(EE)(\d{9})$/);                            //** Estonia 
  vatexp.push (/^(FI)(\d{8})$/);                            //** Finland 
  vatexp.push (/^(FR)(\d{11})$/);                           //** France (1)
  vatexp.push (/^(FR)[(A-H)|(J-N)|(P-Z)]\d{10}$/);          // France (2)
  vatexp.push (/^(FR)\d[(A-H)|(J-N)|(P-Z)]\d{9}$/);         // France (3)
  vatexp.push (/^(FR)[(A-H)|(J-N)|(P-Z)]{2}\d{9}$/);        // France (4)
  vatexp.push (/^(DE)(\d{9})$/);                            //** Germany 
  vatexp.push (/^(EL)(\d{8,9})$/);                          //** Greece 
  vatexp.push (/^(HU)(\d{8})$/);                            //** Hungary 
  vatexp.push (/^(IE)(\d{7}[A-W])$/);                       //** Ireland (1)
  vatexp.push (/^(IE)([7-9][A-Z]\d{5}[A-W])$/);             //** Ireland (2)
  vatexp.push (/^(IT)(\d{11})$/);                           //** Italy 
  vatexp.push (/^(LV)(\d{11})$/);                           //** Latvia 
  vatexp.push (/^(LT)(\d{9}|\d{12})$/);                     //** Lithunia
  vatexp.push (/^(LU)(\d{8})$/);                            //** Luxembourg 
  vatexp.push (/^(MT)(\d{8})$/);                            //** Malta
  vatexp.push (/^(NL)(\d{9})B\d{2}$/);                      //** Netherlands
  vatexp.push (/^(PL)(\d{10})$/);                           //** Poland
  vatexp.push (/^(PT)(\d{9})$/);                            //** Portugal
  vatexp.push (/^(RO)(\d{2,10})$/);                         // Romania
  vatexp.push (/^(SI)(\d{8})$/);                            //** Slovenia
  vatexp.push (/^(SK)(\d{9}|\d{10})$/);                     // Slovakia Republic
  vatexp.push (/^(ES)([A-Z]\d{8})$/);                       //** Spain (1)
  vatexp.push (/^(ES)(\d{8}[A-Z])$/);                       // Spain (2)
  vatexp.push (/^(ES)([A-Z]\d{7}[A-Z])$/);                  //** Spain (3)
  vatexp.push (/^(SE)(\d{10}\d[1-4])$/);                    //** Sweden
  vatexp.push (/^(GB)?(\d{9})$/);                           //** UK (1)
  vatexp.push (/^(GB)?(\d{9})\d{3}$/);                      //** UK (2)
  vatexp.push (/^(GB)?GD\d{3}$/);                           //** UK (3)
  vatexp.push (/^(GB)?HA\d{3}$/);                           //** UK (4)
  vatexp.push (/^(EU)(\d{9})$/);                            //** EU-type 
  var VATNumber = toCheck.toUpperCase();
  var chars = [" ","-",",","."];
  for ( var i=0; i<chars.length; i++) {
    while (VATNumber.indexOf(chars[i])!= -1) {
      VATNumber = VATNumber.slice (0,VATNumber.indexOf(chars[i])) + VATNumber.slice (VATNumber.indexOf(chars[i])+1);
    }
  }
  var valid = false;                         
  for (i=0; i<vatexp.length; i++) {
    if (vatexp[i].test(VATNumber)) {
      var cCode = RegExp.$1;                             // Isolate country code
      var cNumber = RegExp.$2;                           // Isolate the number
      if (cCode.length == 0) cCode = defCCode;           // Set up default country code
      switch (cCode) {     
        case "AT":valid = ATVATCheckDigit (cNumber);break;        
        case "BE":valid = BEVATCheckDigit (cNumber);break;          
        case "BG":valid = true;break;           
        case "CZ":valid = CZVATCheckDigit (cNumber);break;          
        case "DK":valid = DKVATCheckDigit (cNumber);break;       
        case "DE":valid = DEVATCheckDigit (cNumber);break;             
        case "EE":valid = EEVATCheckDigit (cNumber);break;             
        case "EL":valid = ELVATCheckDigit (cNumber);break;       
        case "ES":valid = ESVATCheckDigit (cNumber);break;       
        case "EU":valid = EUVATCheckDigit (cNumber);break;       
        case "FI":valid = FIVATCheckDigit (cNumber);break;        
        case "FR":valid = FRVATCheckDigit (cNumber);break;         
        case "GB":valid = UKVATCheckDigit (cNumber);break;         
        case "HU":valid = HUVATCheckDigit (cNumber);break;         
        case "IE":valid = IEVATCheckDigit (cNumber);break;              
        case "IT":valid = ITVATCheckDigit (cNumber);break;            
        case "LT":valid = LTVATCheckDigit (cNumber);break;            
        case "LU":valid = LUVATCheckDigit (cNumber);break;            
        case "LV":valid = LVVATCheckDigit (cNumber);break;             
        case "MT":valid = MTVATCheckDigit (cNumber);break;           
        case "NL":valid = NLVATCheckDigit (cNumber);break;            
        case "PL":valid = PLVATCheckDigit (cNumber);break;         
        case "PT":valid = PTVATCheckDigit (cNumber);break;           
        case "RO":valid = ROVATCheckDigit (cNumber);break;       
        case "SE":valid = SEVATCheckDigit (cNumber);break;        
        case "SI":valid = SIVATCheckDigit (cNumber);break;     
        default:valid = true;
      }
      if (valid) valid = VATNumber; break;
    }
  }
  return valid;
}

function ATVATCheckDigit (vatnumber) {
  var total = 0;
  var multipliers = [1,2,1,2,1,2,1];
  var temp = 0;
  for (var i = 0; i < 7; i++) {
    temp = Number(vatnumber.charAt(i)) * multipliers[i];
    if (temp > 9)
      total = total + Math.floor(temp/10) + temp%10
    else
      total = total + temp;
  }  
  total = 10 - (total+4) % 10; 
  if (total == 10) total = 0;
  if (total == vatnumber.slice (7,8)) 
    return true
  else 
    return false;
}

function BEVATCheckDigit (vatnumber) {
  if (vatnumber.length == 9) vatnumber = "0" + vatnumber;
  if (97 - vatnumber.slice (0,8) % 97 == vatnumber.slice (8,10)) 
    return true
  else 
    return false;
}

function CZVATCheckDigit (vatnumber) {
  var total = 0;
  var multipliers = [8,7,6,5,4,3,2];
  if (vatnumber.length != 8) return true;
  for (var i = 0; i < 7; i++) total = total + Number(vatnumber.charAt(i)) * multipliers[i];
  total = 11 - total % 11;
  if (total == 10) total = 0; 
  if (total == 11) total = 1; 
  if (total == vatnumber.slice (7,8)) 
    return true
  else 
    return false;
}

function DEVATCheckDigit (vatnumber) {
  var product = 10;
  var sum = 0;     
  var checkdigit = 0;                      
  for (var i = 0; i < 8; i++) {
    sum = (Number(vatnumber.charAt(i)) + product) % 10;
    if (sum == 0) {sum = 10};
    product = (2 * sum) % 11;
  }
  if (11 - product == 10) {checkdigit = 0} else {checkdigit = 11 - product};
  if (checkdigit == vatnumber.slice (8,9))
    return true
  else 
    return false;
}

function DKVATCheckDigit (vatnumber) {
  var total = 0;
  var multipliers = [2,7,6,5,4,3,2,1];
  for (var i = 0; i < 8; i++) total = total + Number(vatnumber.charAt(i)) * multipliers[i];
  total = total % 11;
  if (total == 0) 
    return true
  else 
    return false;
}

function EEVATCheckDigit (vatnumber) {
  var total = 0;
  var multipliers = [3,7,1,3,7,1,3,7];
  for (var i = 0; i < 8; i++) total = total + Number(vatnumber.charAt(i)) * multipliers[i];
  total = 10 - total % 10;
  if (total == 10) total = 0;
  if (total == vatnumber.slice (8,9))
    return true
  else 
    return false;
}

function ELVATCheckDigit (vatnumber) {
  var total = 0;
  var multipliers = [256,128,64,32,16,8,4,2];
  if (vatnumber.length == 8) {vatnumber = "0" + vatnumber};
  for (var i = 0; i < 8; i++) total = total + Number(vatnumber.charAt(i)) * multipliers[i];
  total = total % 11;
  if (total > 9) {total = 0;};  
  if (total == vatnumber.slice (8,9)) 
    return true
  else 
    return false;
}

function ESVATCheckDigit (vatnumber) {
  var total = 0; 
  var temp = 0;
  var multipliers = [2,1,2,1,2,1,2];
  var esexp = new Array ();
  var i = 0;
  esexp.push (/^[A-H]\d{8}$/);
  esexp.push (/^[N|P|Q|S]\d{7}[A-Z]$/);
  if (esexp[0].test(vatnumber)) {
    for (i = 0; i < 7; i++) {
      temp = Number(vatnumber.charAt(i+1)) * multipliers[i];
      if (temp > 9) 
        total = total + Math.floor(temp/10) + temp%10 
      else 
        total = total + temp;
    }   
    total = 10 - total % 10;
    if (total == 10) {total = 0;}
    if (total == vatnumber.slice (8,9)) 
      return true
    else 
      return false;
  }
  else if (esexp[1].test(vatnumber)) {
    for (i = 0; i < 7; i++) {
      temp = Number(vatnumber.charAt(i+1)) * multipliers[i];
      if (temp > 9) 
        total = total + Math.floor(temp/10) + temp%10 
      else 
        total = total + temp;
    }    
    total = 10 - total % 10;
    total = String.fromCharCode(total+64);
    if (total == vatnumber.slice (8,9)) 
      return true
    else 
      return false;
  }
  else return true;
}

function EUVATCheckDigit (vatnumber) {
  return true;
}

function FIVATCheckDigit (vatnumber) {
  var total = 0; 
  var multipliers = [7,9,10,5,8,4,2];
  for (var i = 0; i < 7; i++) total = total + Number(vatnumber.charAt(i)) * multipliers[i];
  total = 11 - total % 11;
  if (total > 9) {total = 0;};  
  if (total == vatnumber.slice (7,8)) 
    return true
  else 
    return false;
}

function FRVATCheckDigit (vatnumber) {
  if (!(/^\d{11}$/).test(vatnumber)) return true;
  var total = vatnumber.substring(2); 
  total = (total*100+12) % 97;
  if (total == vatnumber.slice (0,2)) 
    return true
  else 
    return false;
}

function HUVATCheckDigit (vatnumber) {
  var total = 0;
  var multipliers = [9,7,3,1,9,7,3];
  for (var i = 0; i < 7; i++) total = total + Number(vatnumber.charAt(i)) * multipliers[i];
  total = 10 - total % 10; 
  if (total == 10) total = 0;
  if (total == vatnumber.slice (7,8)) 
    return true
  else 
    return false;
}

function IEVATCheckDigit (vatnumber) {
  var total = 0; 
  var multipliers = [8,7,6,5,4,3,2];
  if (/^\d[A-Z]/.test(vatnumber)) {
    vatnumber = "0" + vatnumber.substring(2,7) + vatnumber.substring(0,1) + vatnumber.substring(7,8);
  }
  for (var i = 0; i < 7; i++) total = total + Number(vatnumber.charAt(i)) * multipliers[i];
  total = total % 23;
  if (total == 0)
    total = "W"
  else
    total = String.fromCharCode(total+64);
  if (total == vatnumber.slice (7,8)) 
    return true
  else 
    return false;
}

function ITVATCheckDigit (vatnumber) {
  var total = 0;
  var multipliers = [1,2,1,2,1,2,1,2,1,2];
  var temp;
  temp=Number(vatnumber.slice(0,7));
  if (temp==0) return false;
  temp=Number(vatnumber.slice(7,10));
  if ((temp<1) || (temp>201)) return false;
  for (var i = 0; i < 10; i++) {
    temp = Number(vatnumber.charAt(i)) * multipliers[i];
    if (temp > 9) 
      total = total + Math.floor(temp/10) + temp%10 
    else 
      total = total + temp;
  }
  total = 10 - total % 10;
  if (total > 9) {total = 0;};  
  if (total == vatnumber.slice (10,11)) 
    return true
  else 
    return false;
}

function LTVATCheckDigit (vatnumber) {
  if (vatnumber.length != 9) return true;
  var total = 0;
  for (var i = 0; i < 8; i++) total = total + Number(vatnumber.charAt(i)) * (i+1);
  if (total % 11 == 10) {
    var multipliers = [3,4,5,6,7,8,9,1];
    total = 0;
    for (i = 0; i < 8; i++) total = total + Number(vatnumber.charAt(i)) * multipliers[i];
  }
  total = total % 11;
  if (total == 10) {total = 0;}; 
  if (total == vatnumber.slice (8,9)) 
    return true
  else 
    return false;
}

function LUVATCheckDigit (vatnumber) {
  if (vatnumber.slice (0,6) % 89 == vatnumber.slice (6,8)) 
    return true
  else 
    return false;
}

function LVVATCheckDigit (vatnumber) {
  if ((/^[0-3]/).test(vatnumber)) return true; 
  var total = 0;
  var multipliers = [9,1,4,8,3,10,2,5,7,6];
  for (var i = 0; i < 10; i++) total = total + Number(vatnumber.charAt(i)) * multipliers[i];
  if (total%11 == 4 && vatnumber[0] ==9) total = total - 45;
  if (total%11 == 4) 
    total = 4 - total%11
  else if (total%11 > 4) 
    total = 14 - total%11
  else if (total%11 < 4) 
    total = 3 - total%11;
  if (total == vatnumber.slice (10,11)) 
    return true
  else 
    return false;
}

function MTVATCheckDigit (vatnumber) {
  var total = 0;
  var multipliers = [3,4,6,7,8,9];
  for (var i = 0; i < 6; i++) total = total + Number(vatnumber.charAt(i)) * multipliers[i];
  total = 37 - total % 37;
  if (total == vatnumber.slice (6,8) * 1) 
    return true
  else 
    return false;
}

function NLVATCheckDigit (vatnumber) {
  var total = 0;                                 // 
  var multipliers = [9,8,7,6,5,4,3,2];
  for (var i = 0; i < 8; i++) total = total + Number(vatnumber.charAt(i)) * multipliers[i];
  total = total % 11;
  if (total > 9) {total = 0;};  
  if (total == vatnumber.slice (8,9)) 
    return true
  else 
    return false;
}

function PLVATCheckDigit (vatnumber) {
  var total = 0;
  var multipliers = [6,5,7,2,3,4,5,6,7];
  for (var i = 0; i < 9; i++) total = total + Number(vatnumber.charAt(i)) * multipliers[i];
  total = total % 11;
  if (total > 9) {total = 0;};
  if (total == vatnumber.slice (9,10)) 
    return true
  else 
    return false;
}

function PTVATCheckDigit (vatnumber) {
  var total = 0;
  var multipliers = [9,8,7,6,5,4,3,2];
  for (var i = 0; i < 8; i++) total = total + Number(vatnumber.charAt(i)) * multipliers[i];
  total = 11 - total % 11;
  if (total > 9) {total = 0;};
  if (total == vatnumber.slice (8,9)) 
    return true
  else 
    return false;
}

function ROVATCheckDigit (vatnumber) {
  var multipliers = [7,5,3,2,1,7,5,3,2,1];
  var VATlen = vatnumber.length;
  multipliers = multipliers.slice (10-VATlen);
  var total = 0;
  for (var i = 0; i < vatnumber.length-1; i++) {
    total = total + Number(vatnumber.charAt(i)) * multipliers[i];
  }  
  total = (10 * total) % 11;
  if (total == 10) total = 0; 
  if (total == vatnumber.slice (vatnumber.length-1, vatnumber.length))
    return true
  else 
    return false;
}

function SEVATCheckDigit (vatnumber) {
  var total = 0;
  var multipliers = [2,1,2,1,2,1,2,1,2];
  var temp = 0;
  for (var i = 0; i < 9; i++) {
    temp = Number(vatnumber.charAt(i)) * multipliers[i];
    if (temp > 9)
      total = total + Math.floor(temp/10) + temp%10
    else 
      total = total + temp;
  }
  total = 10 - (total % 10); 
  if (total == 10) total = 0;
  if (total == vatnumber.slice (9,10)) 
    return true
  else 
    return false;
}

function SKVATCheckDigit (vatnumber) {
  var total = 0; 
  var multipliers = [8,7,6,5,4,3,2];
  for (var i = 3; i < 9; i++) {
    total = total + Number(vatnumber.charAt(i)) * multipliers[i-3];
  }  
  total = 11 - total % 11;
  if (total > 9) total = total - 10;  
  if (total == vatnumber.slice (9,10)) 
    return true
  else 
    return false;
}

function SIVATCheckDigit (vatnumber) {
  var total = 0; 
  var multipliers = [8,7,6,5,4,3,2];
  for (var i = 0; i < 7; i++) total = total + Number(vatnumber.charAt(i)) * multipliers[i];
  total = 11 - total % 11;
  if (total > 9) {total = 0;};  
  if (total == vatnumber.slice (7,8)) 
    return true
  else 
    return false;
}

function UKVATCheckDigit (vatnumber) {
  if (vatnumber.length != 9) return true;
  var multipliers = [8,7,6,5,4,3,2];
  var total = 0;
  for (var i = 0; i < 7; i++) total = total + Number(vatnumber.charAt(i)) * multipliers[i];
  while (total > 0) {total = total - 97;}    
  total = Math.abs(total);
  if (total == vatnumber.slice (7,9)) 
    return true 
  else  
    return false;
}

