// ----------------------------------------------------------------------
// Javascript form validation routines.
// Author: Stephen Poley
//
// Simple routines to quickly pick up obvious typos.
// All validation routines return true if executed by an older browser:
// in this case validation must be left to the server.
//
// Update Jun 2005: discovered that reason IE wasn't setting focus was
// due to an IE timing bug. Added 0.1 sec delay to fix.
//
// Update Oct 2005: minor tidy-up: unused parameter removed
//
// Update Jun 2006: minor improvements to variable names and layout
// ----------------------------------------------------------------------

var nbsp = 160;		// non-breaking space char
var node_text = 3;	// DOM text node-type
var emptyString = /^\s*$/ ;
var global_valfield;	// retain valfield for timer thread

// --------------------------------------------
//                  trim
// Trim leading/trailing whitespace off string
// --------------------------------------------

function trim(str)
{
  return str.replace(/^\s+|\s+$/g, '');
}


// --------------------------------------------
//                  setfocus
// Delayed focus setting to get around IE bug
// --------------------------------------------

function setFocusDelayed()
{
  global_valfield.focus();
}

function setfocus(valfield)
{
  // save valfield in global variable so value retained when routine exits
  global_valfield = valfield;
  setTimeout( 'setFocusDelayed()', 100 );
}


// --------------------------------------------
//                  msg
// Display warn/error message in HTML element.
// commonCheck routine must have previously been called
// --------------------------------------------

function msg(fld,     // id of element to display message in
             msgtype, // class to give element ("warn" or "error")
             message) // string to display
{
  // setting an empty string can give problems if later set to a 
  // non-empty string, so ensure a space present. (For Mozilla and Opera one could 
  // simply use a space, but IE demands something more, like a non-breaking space.)
  var dispmessage;
  if (emptyString.test(message)) 
    dispmessage = String.fromCharCode(nbsp);    
  else  
    dispmessage = message;

  var elem = document.getElementById(fld);
  elem.firstChild.nodeValue = dispmessage;  
  
  elem.className = msgtype;   // set the CSS class to adjust appearance of message
}

// --------------------------------------------
//            commonCheck
// Common code for all validation routines to:
// (a) check for older / less-equipped browsers
// (b) check if empty fields are required
// Returns true (validation passed), 
//         false (validation failed) or 
//         proceed (don't know yet)
// --------------------------------------------

var proceed = 2;  

function commonCheck    (valfield,   // element to be validated
                         infofield,  // id of element to receive info/error msg
                         required)   // true if required
{
  if (!document.getElementById) 
    return true;  // not available on this browser - leave validation to the server
  var elem = document.getElementById(infofield);
  if (!elem.firstChild) return true;  // not available on this browser 
  if (elem.firstChild.nodeType != node_text) return true;  // infofield is wrong type of node  

  if (emptyString.test(valfield.value)) {
    if (required) {
      msg (infofield, "error", "ERROR: required");  
      setfocus(valfield);
      return false;
    }
    else {
      msg (infofield, "warn", "");   // OK
      return true;  
    }
  }
  return proceed;
}

// --------------------------------------------
//            validatePresent
// Validate if something has been entered
// Returns true if so 
// --------------------------------------------

function validatePresent(valfield,   // element to be validated
                         infofield ) // id of element to receive info/error msg
{
  var stat = commonCheck (valfield, infofield, true);
  if (stat != proceed) return stat;

  msg (infofield, "warn", "");  
  return true;
}

// --------------------------------------------
//               validateEmail
// Validate if e-mail address
// Returns true if so (and also if could not be executed because of old browser)
// --------------------------------------------

function validateEmail  (valfield,   // element to be validated
                         infofield,  // id of element to receive info/error msg
                         required)   // true if required
{
  var stat = commonCheck (valfield, infofield, required);
  if (stat != proceed) return stat;

  var tfld = trim(valfield.value);  // value of field with whitespace trimmed off
  var email = /^[^@]+@[^@.]+\.[^@]*\w\w$/  ;
  if (!email.test(tfld)) {
    msg (infofield, "error", "ERROR: not a valid e-mail address");
    setfocus(valfield);
    return false;
  }

 
//  var emhot = /hotmail/gi;
//  if(emhot.test(tfld))
//  {
	// hotmail mag niet
//	msg (infofield, "error", "Hotmail is not allowed.");
//	return false;
//  }
  


   msg (infofield, "warn", "");
  return true;
}

function validatePostal  (valfield,   // element to be validated
                         infofield,  // id of element to receive info/error msg
                         required)   // true if required
{
  var stat = commonCheck (valfield, infofield, required);
  if (stat != proceed) return stat;

  var tfld = trim(valfield.value);  // value of field with whitespace trimmed off
  var postal = /^[0-9][0-9][0-9][0-9][A-Za-z][A-Za-z]/  ;
  if (!postal.test(tfld)) {
    msg (infofield, "error", "ERROR: not a valid postal code");
    setfocus(valfield);
    return false;
  }else
  {
  msg (infofield, "error", "");
  }

  
  return true;
}
// --------------------------------------------
//            validateTelnr
// Validate telephone number
// Returns true if so (and also if could not be executed because of old browser)
// Permits spaces, hyphens, brackets and leading +
// --------------------------------------------

function validateTelnr  (valfield,   // element to be validated
                         infofield,  // id of element to receive info/error msg
                         required)   // true if required
{
  var stat = commonCheck (valfield, infofield, required);
  if (stat != proceed) return stat;

  var tfld = trim(valfield.value);  // value of field with whitespace trimmed off
  var telnr = /^\+?[0-9 ()-]+[0-9]$/  ;
  if (!telnr.test(tfld)) {
    msg (infofield, "error", "ERROR: not a valid telephone number. Characters permitted are digits, space ()- and leading +");
    setfocus(valfield);
    return false;
  }

  var numdigits = 0;
  for (var j=0; j<tfld.length; j++)
    if (tfld.charAt(j)>='0' && tfld.charAt(j)<='9') numdigits++;

  if (numdigits<6) {
    msg (infofield, "error", "ERROR: " + numdigits + " digits - too short");
    setfocus(valfield);
    return false;
  }

  if (numdigits>14)
    msg (infofield, "warn", numdigits + " digits - check if correct");
  else { 
    if (numdigits<10)
      msg (infofield, "warn", "Only " + numdigits + " digits - check if correct");
    else
      msg (infofield, "warn", "");
  }
  return true;
}

// --------------------------------------------
//             validateAge
// Validate person's age
// Returns true if OK 
// --------------------------------------------

function validateAge    (valfield,   // element to be validated
                         infofield,  // id of element to receive info/error msg
                         required)   // true if required
{
  var stat = commonCheck (valfield, infofield, required);
  if (stat != proceed) return stat;

  var tfld = trim(valfield.value);
  var ageRE = /^[0-9]{1,3}$/
  if (!ageRE.test(tfld)) {
    msg (infofield, "error", "ERROR: not a valid age");
    setfocus(valfield);
    return false;
  }

  if (tfld>=200) {
    msg (infofield, "error", "ERROR: not a valid age");
    setfocus(valfield);
    return false;
  }

  if (tfld>110) msg (infofield, "warn", "Older than 110: check correct");
  else {
    if (tfld<7) msg (infofield, "warn", "Bit young for this, aren't you?");
    else        msg (infofield, "warn", "");
  }
  return true;
}

// Controleert nieuwsbrief invulvelden
function checkAanmeldNewsFields(theForm) {

  var tfld = trim(theForm.email.value);  // value of field with whitespace trimmed off
  var email = /^[^@]+@[^@.]+\.[^@]*\w\w$/  ;

  if(theForm.fname.value=="")
	{
		alert('Voornaam is verplicht');
		return false;
	}
	if(theForm.lname.value=="")
	{
		alert('Achternaam is verplicht');
		return false;
	}
	if(theForm.email.value=="")
	{
		alert('Email is verplicht');	
		return false;
	}else
	{
		 if (!email.test(tfld)) {
		    alert ("Onjuist email adres.");
		    setfocus(theForm.email);
		    return false;
		  }

		  var email2 = /^[A-Za-z][\w.-]+@\w[\w.-]+\.[\w.-]*[A-Za-z][A-Za-z]$/  ;
		  if (!email2.test(tfld)) 
		  {
		   alert ("Controleer email adres.");
		   return false;
		  }
		  
		  return true;
		  
	}
	
	return true;
};



function checkAccountDetailsAll(theForm,msg1,msg2)
{

	if (checkRegisterEmail(theForm,msg2) == true)
	{
		
		return checkAccountDetailFields(theForm, msg1);
	}else
	{	
	
		return false;
	}
}

function checkAccountDetailFields(theForm,errormsg) {
	novals = 0;

	if(theForm.txtBedrijfsnaam.value=="")
	{
		novals==1;
		setfocus(theForm.txtBedrijfsnaam);
		msg ('inf_verplicht', "error", errormsg);  
		return false;
	}else
	{
		msg ('inf_verplicht', "error", "");  
	}

	if(theForm.txtTelefoon.value=="")
	{
		novals==1;
		setfocus(theForm.txtTelefoon);
		msg ('inf_verplicht', "error", errormsg);  
		return false;
	}else
	{
		msg ('inf_verplicht', "error", "");  
	}	
	if(theForm.txtStraat.value=="")
	{
		novals==1;
		setfocus(theForm.txtStraat);
		msg ('inf_verplicht', "error", errormsg);  
		return false;
	}else
	{
		msg ('inf_verplicht', "error", "");  
	}	
	
	if(theForm.txtKVKnummer.value=="")
	{
		novals==1;
		
		setfocus(theForm.txtKVKnummer);
		msg ('inf_verplicht', "error", errormsg);  
		return false;
	}else
	{
		msg ('inf_verplicht', "error", "");  
	}		
	if(theForm.txtBTWnummer.value=="")
	{
		novals==1;
		setfocus(theForm.txtBTWnummer);
		msg ('inf_verplicht', "error", errormsg);  
		return false;
	}else
	{
		msg ('inf_verplicht', "error", "");  
		if(!checkVATNumber(theForm.txtBTWnummer.value))
		{
			novals==1;
			msg ('inf_txtBTWnummer', "error", "ERROR: not a valid VAT number.");  
			setfocus(theForm.txtBTWnummer);
			return false;
		}else
		{
			msg ('inf_verplicht', "error", "");  
		}
	}
	if(theForm.firstname.value=="")
	{
		novals==1;
		setfocus(theForm.firstname);
		msg ('inf_verplicht', "error", errormsg);  
		return false;
	}else
	{
		msg ('inf_verplicht', "error", "");  
	}	
	if(theForm.lastname.value=="")
	{
		novals==1;
		setfocus(theForm.lastname);
		msg ('inf_verplicht', "error", errormsg);  
		return false;
	}else
	{
		msg ('inf_verplicht', "error", "");  
	}	
	
	if(theForm.txtHuisnummer.value=="")
	{
		novals==1;
		setfocus(theForm.txtHuisnummer);
		msg ('inf_verplicht', "error", errormsg);  
		return false;
	}else
	{
		msg ('inf_verplicht', "error", "");  
	}	
	if(theForm.txtPostcode.value=="")
	{
		novals==1;
		setfocus(theForm.txtPostcode);
		msg ('inf_verplicht', "error", errormsg);  
		return false;
	}else
	{
		msg ('inf_verplicht', "error", "");  
	}	
	if(theForm.txtPlaats.value=="")
	{
		novals==1;
		setfocus(theForm.txtPlaats);
		msg ('inf_verplicht', "error", errormsg);  
		return false;
	}else
	{
		msg ('inf_verplicht', "error", "");  
	}					
	if(theForm.txtLand.value=="")
	{
		novals==1;
		setfocus(theForm.txtLand);
		msg ('inf_verplicht', "error", errormsg);  
		return false;
	}else
	{
		msg ('inf_verplicht', "error", "");  
	}	
	
	
	if(novals==1)
	{
		// niets ingevuld
		// alert('geen velden ingevuld');
		return false;
	}
	
  
	
	
	return true;
};

// Controleert nieuwsbrief invulvelden


function checkContactAll(theForm,msg1,msg2)
{
	if (checkContactEmail(theForm,msg2) == true)
	{
		return checkContactFields(theForm, msg1);
	}else
	{	
		return false;
	}
}
function checkContactEmail(theForm,errormsg) 
{
	var tfld = trim(theForm.emailAddress1.value);  // value of field with whitespace trimmed off
	var email = /^[^@]+@[^@.]+\.[^@]*\w\w$/  ;
	if (!email.test(tfld)) 
	{
	  msg ('inf_verplicht', "error", errormsg);
	  setfocus(theForm.emailAddress1);
	  return false;
	}else
	{
		return true;
	}	

}

function checkContactFields(theForm,errormsg) {
	novals = 0;
	
	//for (var i = 0; i < theForm.elements.length; i++) 
	//{      
	//	if(theForm.elements[i].value=="")
	//	{
	//		novals = 1;
	//	}
	//}
	if(theForm.companyName1.value=="")
	{
		novals==1;
		setfocus(theForm.companyName1);
		msg ('inf_verplicht', "error", errormsg);  
		return false;
	}else
	{
		msg ('inf_verplicht', "error", "");  
	}
	if(theForm.firstName1.value=="")
	{
		novals==1;
		setfocus(theForm.firstName1);
		msg ('inf_verplicht', "error", errormsg);  
		return false;
	}else
	{
		msg ('inf_verplicht', "error", "");  
	}
	if(theForm.lastName1.value=="")
	{
		novals==1;
		setfocus(theForm.lastName1);
		msg ('inf_verplicht', "error", errormsg);  
		return false;
	}else
	{
		msg ('inf_verplicht', "error", "");  
	}
	if(theForm.phoneNumber1.value=="")
	{
		novals==1;
		setfocus(theForm.phoneNumber1);
		msg ('inf_verplicht', "error", errormsg);  
		return false;
	}else
	{
		msg ('inf_verplicht', "error", "");  
	}	
	

	if(novals==1)
	{
		// niets ingevuld
		// alert('geen velden ingevuld');
		return false;
	}
	
  
	
	
	return true;
}




function checkRegisterAll(theForm,msg1,msg2)
{
//	alert('hello');
	if (checkRegisterEmail(theForm,msg2) == true)
	{
		// alert('true');
		return checkRegisterFields(theForm, msg1);
	}else
	{	
		return false;
	}
}
function checkRegisterEmail(theForm,errormsg) 
{
	var tfld = trim(theForm.txtEmail.value);  // value of field with whitespace trimmed off
	var email = /^[^@]+@[^@.]+\.[^@]*\w\w$/  ;
	if (!email.test(tfld)) 
	{
	  msg ('inf_verplicht', "error", errormsg);
	  setfocus(theForm.txtEmail);
	  return false;
	}else
	{
//	  var emhot = /hotmail/i;
//	  if(emhot.test(tfld))
//	  {
		// hotmail mag niet
//		msg ('inf_email', "error", "Hotmail is not allowed.");
//		setfocus(theForm.txtEmail);
//		return true;
//	  }else
//	  {
		return true;
//	  }
	}	
	
}


// function validateEmail  (valfield,   // element to be validated
                         // infofield,  // id of element to receive info/error msg
                         // required)   // true if required
// {
  // var stat = commonCheck (valfield, infofield, required);
  // if (stat != proceed) return stat;

  // var tfld = trim(valfield.value);  // value of field with whitespace trimmed off
  // var email = /^[^@]+@[^@.]+\.[^@]*\w\w$/  ;
  // if (!email.test(tfld)) {
    // msg (infofield, "error", "ERROR: not a valid e-mail address");
    // setfocus(valfield);
    // return false;
  // }

  // var email2 = /^[A-Za-z][\w.-]+@\w[\w.-]+\.[\w.-]*[A-Za-z][A-Za-z]$/  ;
  // if (!email2.test(tfld)) 
    // msg (infofield, "warn", "Unusual e-mail address - check if correct");
  // else
    // msg (infofield, "warn", "");
  // return true;
// }

function validateVAT(valfield, infofield, required)
{ 
  var stat = commonCheck (valfield, infofield, required);
  if (stat != proceed) return stat;
   
  
  if(!checkVATNumber (valfield.value))
  { 
    msg (infofield, "error", "ERROR: not a valid VAT number");
    setfocus(valfield);
    return false;
  }else
  {
       msg (infofield, "warn", "");
  }
  return true;
}

function checkRegisterFields(theForm,errormsg) {
	novals = 0;

//        alert('check registerfields');
	if(theForm.txtBTWnummer.value=="")
	{
		novals==1;
		//setfocus(txtBTWnummer);
		msg ('inf_verplicht', "error", errormsg);  
		return false;
	}else
	{
		msg ('inf_verplicht', "error", "");  
		if(!checkVATNumber(theForm.txtBTWnummer.value))
		{
			novals==1;
			msg ('inf_txtBTWnummer', "error", "ERROR: not a valid VAT number.");  
			
			return false;
		}else
		{
			msg ('inf_verplicht', "error", "");  
		}
	}
	if(theForm.txtBedrijfsnaam.value=="")
	{
		novals==1;
		setfocus(theForm.txtBedrijfsnaam);
		msg ('inf_verplicht', "error", errormsg);  
		return false;
	}else
	{
		msg ('inf_verplicht', "error", "");  
	}
	if(theForm.txtLoginNaam.value=="")
	{
		novals==1;
		setfocus(theForm.txtLoginNaam);
		msg ('inf_verplicht', "error", errormsg);  
		return false;
	}else
	{
		msg ('inf_verplicht', "error", "");  
	}
	if(theForm.txtWachtwoord.value=="")
	{
		novals==1;
		setfocus(theForm.txtWachtwoord);
		msg ('inf_verplicht', "error", errormsg);  
		return false;
	}else
	{
		msg ('inf_verplicht', "error", "");  
	}

	if(theForm.txtKVKnummer.value=="")
	{
		novals==1;
		
		setfocus(theForm.txtKVKnummer);
		msg ('inf_verplicht', "error", errormsg);  
		return false;
	}else
	{
		msg ('inf_verplicht', "error", "");  
	}		
	if(theForm.txtBTWnummer.value=="")
	{
		novals==1;
		setfocus(theForm.txtBTWnummer);
		msg ('inf_verplicht', "error", errormsg);  
		return false;
	}else
	{
		msg ('inf_verplicht', "error", "");  
	}	
	if(theForm.firstname.value=="")
	{
		novals==1;
		setfocus(theForm.firstname);
		msg ('inf_verplicht', "error", errormsg);  
		return false;
	}else
	{
		msg ('inf_verplicht', "error", "");  
	}	
	if(theForm.lastname.value=="")
	{
		novals==1;
		setfocus(theForm.lastname);
		msg ('inf_verplicht', "error", errormsg);  
		return false;
	}else
	{
		msg ('inf_verplicht', "error", "");  
	}	


	
	if(theForm.txtTelefoon.value=="")
	{
		novals==1;
		setfocus(theForm.txtTelefoon);
		msg ('inf_verplicht', "error", errormsg);  
		return false;
	}else
	{
		msg ('inf_verplicht', "error", "");  
	}	
	if(theForm.txtStraat.value=="")
	{
		novals==1;
		setfocus(theForm.txtStraat);
		msg ('inf_verplicht', "error", errormsg);  
		return false;
	}else
	{
		msg ('inf_verplicht', "error", "");  
	}	
	if(theForm.txtHuisnummer.value=="")
	{
		novals==1;
		setfocus(theForm.txtHuisnummer);
		msg ('inf_verplicht', "error", errormsg);  
		return false;
	}else
	{
		msg ('inf_verplicht', "error", "");  
	}	
	if(theForm.txtPostcode.value=="")
	{
		novals==1;
		setfocus(theForm.txtPostcode);
		msg ('inf_verplicht', "error", errormsg);  
		return false;
	}else
	{
		msg ('inf_verplicht', "error", "");  
	}	
	if(theForm.txtPlaats.value=="")
	{
		novals==1;
		setfocus(theForm.txtPlaats);
		msg ('inf_verplicht', "error", errormsg);  
		return false;
	}else
	{
		msg ('inf_verplicht', "error", "");  
	}					
	if(theForm.txtLand.value=="")
	{
		novals==1;
		setfocus(theForm.txtLand);
		msg ('inf_verplicht', "error", errormsg);  
		return false;
	}else
	{
		msg ('inf_verplicht', "error", "");  
	}	
	
	
	if(novals==1)
	{
		// niets ingevuld
		// alert('geen velden ingevuld');
		return false;
	}
	
  
	
	
	return true;
}

/*==============================================================================

Application:   Utility Function
Author:        John Gardner

Version:       V1.0
Date:          30th July 2005
Description:   Used to check the validity of an EU VAT number

Version:       V1.1
Date:          3rd August 2005
Description:   Lithunian legal entities & Maltese check digit checks added.

Version:       V1.2
Date:          20th October 2005
Description:   Italian checks refined (thanks Matteo Mike Peluso).

Version:       V1.3
Date:          16th November 2005
Description:   Error in GB numbers ending in 00 fixed (thanks Guy Dawson).

Version:       V1.4
Date:          28th September 2006
Description:   EU-type numbers added.

Version:       V1.5
Date:          1st January 2007
Description:   Romanian and Bulgarian numbers added.

Version:       V1.6
Date:          7th January 2007
Description:   Error with Slovenian numbers (thanks to Ales Hotko).

Version:       V1.7
Date:          10th February 2007
Description:   Romanian check digits added. Thanks to Dragu Costel for test suite.

Version:       V1.8
Date:          3rd August 2007
Description:   IE code modified to allow + and * in old format numbers. Thanks 
               to Antonin Moy of Spehere Solutions for pointing out the error.

Version:       V1.9
Date:          6th August 2007
Description:   BE code modified to make a specific check that the leading 
               character of 10 digit numbers is 0 (belts and braces).

Version:       V1.10
Date:          10th August 2007
Description:   Cypriot check digit support added.
               Check digit validation support for non-standard UK numbers

Version:       V1.11
Date:          25th September 2007
Description:   Spain check digit support for personal numbers.
               Author: David Perez Carmona
  
Parameters:    toCheck - VAT number be checked. 

This function checks the value of the parameter for a valid European VAT number. 

If the number is found to be invalid format, the function returns a value of 
false. Otherwise it returns the VAT number re-formatted.
  
Example call:
  
  if (checkVATNumber (myVATNumber)) 
      alert ("VAT number has a valid format")
  else 
      alert ("VAT number has invalid format");
                    
------------------------------------------------------------------------------*/


function removeUnwantedChars(textbox)
{
var number = textbox.value;
// Remove spaces from the VAT number to help validation
var chars = [" ","-",",","."];
for ( var i=0; i<chars.length; i++) {
while (number.indexOf(chars[i])!= -1) {
  number = number.slice (0,number.indexOf(chars[i])) + number.slice (number.indexOf(chars[i])+1);
}
}

textbox.value = number;

}

function checkVATNumber (toCheck) {
 

  // Array holds the regular expressions for the valid VAT number
  var vatexp = new Array ();
  
  // To change the default country (e.g. from the UK to Germany - DE):
  //    1.  Change the country code in the defCCode variable below to "DE".
  //    2.  Remove the question mark from the regular expressions associated 
  //        with the UK VAT number: i.e. "(GB)?" -> "(GB)"
  //    3.  Add a question mark into the regular expression associated with
  //        Germany's number following the country code: i.e. "(DE)" -> "(DE)?"
  
  var defCCode = "NL";
  
  // Note - VAT codes without the "**" in the comment do not have check digit
  // checking.

  vatexp.push (/^(AT)U(\d{8})$/);                           //** Austria
  vatexp.push (/^(BE)(\d{9,10})$/);                         //** 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 (/^(DE)(\d{9})$/);                            //** Germany 
  vatexp.push (/^(DK)((\d{8}))$/);                          //** Denmark 
  vatexp.push (/^(EE)(\d{9})$/);                            //** Estonia 
  vatexp.push (/^(EL)(\d{8,9})$/);                          //** Greece 
  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 (/^(EU)(\d{9})$/);                            //** EU-type 
  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 (/^(GB)?(\d{9})$/);                           //** UK (standard)
  vatexp.push (/^(GB)?(\d{10})$/);                          //** UK (Commercial)
  vatexp.push (/^(GB)?(\d{12})$/);                          //UK (IOM standard)
  vatexp.push (/^(GB)?(\d{13})$/);                          //UK (IOM commercial)
  vatexp.push (/^(GB)?(GD\d{3})$/);                         //** UK (Government)
  vatexp.push (/^(GB)?(HA\d{3})$/);                         //** UK (Health authority)
  vatexp.push (/^(GR)(\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 (/^(SE)(\d{10}\d[1-4])$/);                    //** Sweden

  // Load up the string to check
  var VATNumber = toCheck.toUpperCase();
  
  // Remove spaces from the VAT number to help validation
  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);
    }
  }

  // Assume we're not going to find a valid VAT number
  var valid = false;                         
  
  // Check the string against the types of VAT numbers
  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
      
	  
      // Now look at the check digits for those countries we know about.
      switch (cCode) {     
        case "AT":
          valid = ATVATCheckDigit (cNumber);
          break;        
        case "BE":
          valid = BEVATCheckDigit (cNumber);
          break;          
        case "BG":
          // The SIMA validation rules are incorrect for Bulgarian numbers.
          valid = true;
          break;             
        case "CY":
          valid = CYVATCheckDigit (cNumber);
          break;          
        case "CZ":
          valid = CZVATCheckDigit (cNumber);
          break;      
        case "DE":
          valid = DEVATCheckDigit (cNumber);
          break;       
        case "DK":
          valid = DKVATCheckDigit (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 "GR":
          valid = ELVATCheckDigit (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;
      }
            
      // Load new VAT number back into the form element
      if (valid) valid = VATNumber;
      
      // We have found that the number is valid - break from loop
      break;
    }
  }
  
  // Return with either an error or the reformatted VAT number
  return valid;
}

function ATVATCheckDigit (vatnumber) {

  // Checks the check digits of an Austrian VAT number.
  
  var total = 0;
  var multipliers = [1,2,1,2,1,2,1];
  var temp = 0;
  
  // Extract the next digit and multiply by the appropriate multiplier.  
  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;
  }  
  
  // Establish check digit.
  total = 10 - (total+4) % 10; 
  if (total == 10) total = 0;
  
  // Compare it with the last character of the VAT number. If it is the same, 
  // then it's a valid check digit.
  if (total == vatnumber.slice (7,8)) 
    return true
  else 
    return false;
}

function BEVATCheckDigit (vatnumber) {

  // Checks the check digits of a Belgium VAT number.
  
  // First character of 10 digit numbers should be 0
  if (vatnumber.length == 10 && vatnumber.slice(0,1) != "0") return false;
  
  // Nine digit numbers have a 0 inserted at the front.
  if (vatnumber.length == 9) vatnumber = "0" + vatnumber;
  
  // Modulus 97 check on last nine digits
  if (97 - vatnumber.slice (0,8) % 97 == vatnumber.slice (8,10)) 
    return true
  else 
    return false;
}

function CYVATCheckDigit (vatnumber) {

  // Checks the check digits of a Cypriot VAT number.
  
  // Extract the next digit and multiply by the counter.
  var total = 0;
  for (var i = 0; i < 8; i++) {
    var temp = Number(vatnumber.charAt(i));
    if (i % 2 == 0) {
      switch (temp) {
        case 0: temp = 1; break;
        case 1: temp = 0; break;
        case 2: temp = 5; break;
        case 3: temp = 7; break;
        case 4: temp = 9; break;
        default: temp = temp*2 + 3;
      }
    }
    total = total + temp;
  }
  
  // Establish check digit using modulus 26, and translate to char. equivalent.
  total = total % 26;
  total = String.fromCharCode(total+65);
  
  // Check to see if the check digit given is correct
  if (total == vatnumber.substr (8,1)) 
    return true 
  else 
    return false;
}

function CZVATCheckDigit (vatnumber) {

  // Checks the check digits of a Czech Republic VAT number.
  
  var total = 0;
  var multipliers = [8,7,6,5,4,3,2];
  
  // Only do check digit validation for standard VAT numbers
  if (vatnumber.length != 8) return true;
  
  // Extract the next digit and multiply by the counter.
  for (var i = 0; i < 7; i++) total = total + Number(vatnumber.charAt(i)) * multipliers[i];
  
  // Establish check digit.
  total = 11 - total % 11;
  if (total == 10) total = 0; 
  if (total == 11) total = 1; 
  
  // Compare it with the last character of the VAT number. If it is the same, 
  // then it's a valid check digit.
  if (total == vatnumber.slice (7,8)) 
    return true
  else 
    return false;
}

function DEVATCheckDigit (vatnumber) {

  // Checks the check digits of a German VAT number.
  
  var product = 10;
  var sum = 0;     
  var checkdigit = 0;                      
  for (var i = 0; i < 8; i++) {
    
    // Extract the next digit and implement perculiar algorithm!.
    sum = (Number(vatnumber.charAt(i)) + product) % 10;
    if (sum == 0) {sum = 10};
    product = (2 * sum) % 11;
  }
  
  // Establish check digit.  
  if (11 - product == 10) {checkdigit = 0} else {checkdigit = 11 - product};
  
  // Compare it with the last two characters of the VAT number. If the same, 
  // then it is a valid check digit.
  if (checkdigit == vatnumber.slice (8,9))
    return true
  else 
    return false;
}

function DKVATCheckDigit (vatnumber) {

  // Checks the check digits of a Danish VAT number.
  
  var total = 0;
  var multipliers = [2,7,6,5,4,3,2,1];
  
  // Extract the next digit and multiply by the counter.
  for (var i = 0; i < 8; i++) total = total + Number(vatnumber.charAt(i)) * multipliers[i];
  
  // Establish check digit.
  total = total % 11;
  
  // The remainder should be 0 for it to be valid..
  if (total == 0) 
    return true
  else 
    return false;
}

function EEVATCheckDigit (vatnumber) {

  // Checks the check digits of an Estonian VAT number.
  
  var total = 0;
  var multipliers = [3,7,1,3,7,1,3,7];
  
  // Extract the next digit and multiply by the counter.
  for (var i = 0; i < 8; i++) total = total + Number(vatnumber.charAt(i)) * multipliers[i];
  
  // Establish check digits using modulus 10.
  total = 10 - total % 10;
  if (total == 10) total = 0;
  
  // Compare it with the last character of the VAT number. If it is the same, 
  // then it's a valid check digit.
  if (total == vatnumber.slice (8,9))
    return true
  else 
    return false;
}

function ELVATCheckDigit (vatnumber) {

  // Checks the check digits of a Greek VAT number.
  
  var total = 0;
  var multipliers = [256,128,64,32,16,8,4,2];
  
  //eight character numbers should be prefixed with an 0.
  if (vatnumber.length == 8) {vatnumber = "0" + vatnumber};
  
  // Extract the next digit and multiply by the counter.
  for (var i = 0; i < 8; i++) total = total + Number(vatnumber.charAt(i)) * multipliers[i];
  
  // Establish check digit.
  total = total % 11;
  if (total > 9) {total = 0;};  
  
  // Compare it with the last character of the VAT number. If it is the same, 
  // then it's a valid check digit.
  if (total == vatnumber.slice (8,9)) 
    return true
  else 
    return false;
}

function ESVATCheckDigit (vatnumber) {

  // Checks the check digits of a Spanish VAT number.
  
  var total = 0; 
  var temp = 0;
  var multipliers = [2,1,2,1,2,1,2];
  var esexp = new Array ();
  esexp.push (/^[A-H]\d{8}$/);
  esexp.push (/^[N|P|Q|S]\d{7}[A-Z]$/);
  esexp.push (/^[0-9]{8}[A-Z]$/);
  var i = 0;
  
  // With profit companies
  if (esexp[0].test(vatnumber)) {
  
    // Extract the next digit and multiply by the counter.
    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;
    }   
    
    // Now calculate the check digit itself. 
    total = 10 - total % 10;
    if (total == 10) {total = 0;}
    
    // Compare it with the last character of the VAT number. If it is the same, 
    // then it's a valid check digit.
    if (total == vatnumber.slice (8,9)) 
      return true
    else 
      return false;
  }
  
  // Non-profit companies
  else if (esexp[1].test(vatnumber)) {
  
    // Extract the next digit and multiply by the counter.
    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;
    }    
    
    // Now calculate the check digit itself.
    total = 10 - total % 10;
    total = String.fromCharCode(total+64);
    
    // Compare it with the last character of the VAT number. If it is the same, 
    // then it's a valid check digit.
    if (total == vatnumber.slice (8,9)) 
      return true
    else 
      return false;
  }
	
  // Personal number (NIF)
  else if (esexp[2].test(vatnumber)) {
  	return vatnumber.charAt(8) == 'TRWAGMYFPDXBNJZSQVHLCKE'.charAt(Number(vatnumber.substring(0, 8)) % 23);
  }
	
  else return true;
}

function EUVATCheckDigit (vatnumber) {

  // We know litle about EU numbers apart from the fact that the first 3 digits 
  // represent the country, and that there are nine digits in total.
  return true;
}

function FIVATCheckDigit (vatnumber) {

  // Checks the check digits of a Finnish VAT number.
  
  var total = 0; 
  var multipliers = [7,9,10,5,8,4,2];
  
  // Extract the next digit and multiply by the counter.
  for (var i = 0; i < 7; i++) total = total + Number(vatnumber.charAt(i)) * multipliers[i];
  
  // Establish check digit.
  total = 11 - total % 11;
  if (total > 9) {total = 0;};  
  
  // Compare it with the last character of the VAT number. If it is the same, 
  // then it's a valid check digit.
  if (total == vatnumber.slice (7,8)) 
    return true
  else 
    return false;
}

function FRVATCheckDigit (vatnumber) {

  // Checks the check digits of a French VAT number.
  
  if (!(/^\d{11}$/).test(vatnumber)) return true;
  
  // Extract the last nine digits as an integer.
  var total = vatnumber.substring(2); 
  
  // Establish check digit.
  total = (total*100+12) % 97;
  
  // Compare it with the last character of the VAT number. If it is the same, 
  // then it's a valid check digit.
  if (total == vatnumber.slice (0,2)) 
    return true
  else 
    return false;
}

function HUVATCheckDigit (vatnumber) {

  // Checks the check digits of a Hungarian VAT number.
  
  var total = 0;
  var multipliers = [9,7,3,1,9,7,3];
  
  // Extract the next digit and multiply by the counter.
  for (var i = 0; i < 7; i++) total = total + Number(vatnumber.charAt(i)) * multipliers[i];
  
  // Establish check digit.
  total = 10 - total % 10; 
  if (total == 10) total = 0;
  
  // Compare it with the last character of the VAT number. If it is the same, 
  // then it's a valid check digit.
  if (total == vatnumber.slice (7,8)) 
    return true
  else 
    return false;
}

function IEVATCheckDigit (vatnumber) {

  // Checks the check digits of an Irish VAT number.
  
  var total = 0; 
  var multipliers = [8,7,6,5,4,3,2];
  
  // If the code is in the old format, we need to convert it to the new.
  if (/^\d[A-Z\*\+]/.test(vatnumber)) {
    vatnumber = "0" + vatnumber.substring(2,7) + vatnumber.substring(0,1) + vatnumber.substring(7,8);
  }
    
  // Extract the next digit and multiply by the counter.
  for (var i = 0; i < 7; i++) total = total + Number(vatnumber.charAt(i)) * multipliers[i];
  
  // Establish check digit using modulus 23, and translate to char. equivalent.
  total = total % 23;
  if (total == 0)
    total = "W"
  else
    total = String.fromCharCode(total+64);
  
  // Compare it with the last character of the VAT number. If it is the same, 
  // then it's a valid check digit.
  if (total == vatnumber.slice (7,8)) 
    return true
  else 
    return false;
}

function ITVATCheckDigit (vatnumber) {

  // Checks the check digits of an Italian VAT number.
  
  var total = 0;
  var multipliers = [1,2,1,2,1,2,1,2,1,2];
  var temp;
    
  // The last three digits are the issuing office, and cannot exceed more 201
  temp=Number(vatnumber.slice(0,7));
  if (temp==0) return false;
  temp=Number(vatnumber.slice(7,10));
  if ((temp<1) || (temp>201)) return false;
  
  // Extract the next digit and multiply by the appropriate  
  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;
  }
  
  // Establish check digit.
  total = 10 - total % 10;
  if (total > 9) {total = 0;};  
  
  // Compare it with the last character of the VAT number. If it is the same, 
  // then it's a valid check digit.
  if (total == vatnumber.slice (10,11)) 
    return true
  else 
    return false;
}

function LTVATCheckDigit (vatnumber) {

  // Checks the check digits of a Lithuanian VAT number.
  
  // Only do check digit validation for standard VAT numbers
  if (vatnumber.length != 9) return true;
  
  // Extract the next digit and multiply by the counter+1.
  var total = 0;
  for (var i = 0; i < 8; i++) total = total + Number(vatnumber.charAt(i)) * (i+1);
  
  // Can have a double check digit calculation!
  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];
  }
  
  // Establish check digit.
  total = total % 11;
  if (total == 10) {total = 0;}; 
  
  // Compare it with the last character of the VAT number. If it is the same, 
  // then it's a valid check digit.
  if (total == vatnumber.slice (8,9)) 
    return true
  else 
    return false;
}

function LUVATCheckDigit (vatnumber) {

  // Checks the check digits of a Luxembourg VAT number.
  
  if (vatnumber.slice (0,6) % 89 == vatnumber.slice (6,8)) 
    return true
  else 
    return false;
}

function LVVATCheckDigit (vatnumber) {

  // Checks the check digits of a Latvian VAT number.
  
  // Only check the legal bodies
  if ((/^[0-3]/).test(vatnumber)) return true; 
  
  var total = 0;
  var multipliers = [9,1,4,8,3,10,2,5,7,6];
  
  // Extract the next digit and multiply by the counter.
  for (var i = 0; i < 10; i++) total = total + Number(vatnumber.charAt(i)) * multipliers[i];
  
  // Establish check digits by getting modulus 11.
  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;
  
  // Compare it with the last character of the VAT number. If it is the same, 
  // then it's a valid check digit.
  if (total == vatnumber.slice (10,11)) 
    return true
  else 
    return false;
}

function MTVATCheckDigit (vatnumber) {

  // Checks the check digits of a Maltese VAT number.
  
  var total = 0;
  var multipliers = [3,4,6,7,8,9];
  
  // Extract the next digit and multiply by the counter.
  for (var i = 0; i < 6; i++) total = total + Number(vatnumber.charAt(i)) * multipliers[i];
  
  // Establish check digits by getting modulus 37.
  total = 37 - total % 37;
  
  // Compare it with the last character of the VAT number. If it is the same, 
  // then it's a valid check digit.
  if (total == vatnumber.slice (6,8) * 1) 
    return true
  else 
    return false;
}

function NLVATCheckDigit (vatnumber) {

  // Checks the check digits of a Dutch VAT number.
  
  var total = 0;                                 // 
  var multipliers = [9,8,7,6,5,4,3,2];
  
  // Extract the next digit and multiply by the counter.
  for (var i = 0; i < 8; i++) total = total + Number(vatnumber.charAt(i)) * multipliers[i];
  
  // Establish check digits by getting modulus 11.
  total = total % 11;
  if (total > 9) {total = 0;};  
  
  // Compare it with the last character of the VAT number. If it is the same, 
  // then it's a valid check digit.
  
  if (total == vatnumber.slice (8,9)) 
    return true
  else 
    return false;
}

function PLVATCheckDigit (vatnumber) {

  // Checks the check digits of a Polish VAT number.
  
  var total = 0;
  var multipliers = [6,5,7,2,3,4,5,6,7];
  
  // Extract the next digit and multiply by the counter.
  for (var i = 0; i < 9; i++) total = total + Number(vatnumber.charAt(i)) * multipliers[i];
  
  // Establish check digits subtracting modulus 11 from 11.
  total = total % 11;
  if (total > 9) {total = 0;};
  
  // Compare it with the last character of the VAT number. If it is the same, 
  // then it's a valid check digit.
  if (total == vatnumber.slice (9,10)) 
    return true
  else 
    return false;
}

function PTVATCheckDigit (vatnumber) {

  // Checks the check digits of a Portugese VAT number.
  
  var total = 0;
  var multipliers = [9,8,7,6,5,4,3,2];
  
  // Extract the next digit and multiply by the counter.
  for (var i = 0; i < 8; i++) total = total + Number(vatnumber.charAt(i)) * multipliers[i];
  
  // Establish check digits subtracting modulus 11 from 11.
  total = 11 - total % 11;
  if (total > 9) {total = 0;};
  
  // Compare it with the last character of the VAT number. If it is the same, 
  // then it's a valid check digit.
  if (total == vatnumber.slice (8,9)) 
    return true
  else 
    return false;
}

function ROVATCheckDigit (vatnumber) {

  // Checks the check digits of a Romanian VAT number.
  
  var multipliers = [7,5,3,2,1,7,5,3,2,1];
  
  // Extract the next digit and multiply by the counter.
  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];
  }  
  
  // Establish check digits by getting modulus 11.
  total = (10 * total) % 11;
  if (total == 10) total = 0; 
  
  // Compare it with the last character of the VAT number. If it is the same, 
  // then it's a valid check digit.
  if (total == vatnumber.slice (vatnumber.length-1, vatnumber.length))
    return true
  else 
    return false;
}

function SEVATCheckDigit (vatnumber) {

  // Checks the check digits of a Swedish VAT number.
  
  var total = 0;
  var multipliers = [2,1,2,1,2,1,2,1,2];
  var temp = 0;
  
  // Extract the next digit and multiply by the appropriate multiplier.
  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;
  }
  
  // Establish check digits by subtracting mod 10 of total from 10.
  total = 10 - (total % 10); 
  if (total == 10) total = 0;
  
  // Compare it with the 10th character of the VAT number. If it is the same, 
  // then it's a valid check digit.
  if (total == vatnumber.slice (9,10)) 
    return true
  else 
    return false;
}

function SKVATCheckDigit (vatnumber) {

  // Checks the check digits of a Slovak VAT number.
  
  var total = 0; 
  var multipliers = [8,7,6,5,4,3,2];
  
  // Extract the next digit and multiply by the counter.
  for (var i = 3; i < 9; i++) {
    total = total + Number(vatnumber.charAt(i)) * multipliers[i-3];
  }  
  
  // Establish check digits by getting modulus 11.
  total = 11 - total % 11;
  if (total > 9) total = total - 10;  
  
  // Compare it with the last character of the VAT number. If it is the same, 
  // then it's a valid check digit.
  if (total == vatnumber.slice (9,10)) 
    return true
  else 
    return false;
}

function SIVATCheckDigit (vatnumber) {

  // Checks the check digits of a Slovenian VAT number.
  
  var total = 0; 
  var multipliers = [8,7,6,5,4,3,2];
  
  // Extract the next digit and multiply by the counter.
  for (var i = 0; i < 7; i++) total = total + Number(vatnumber.charAt(i)) * multipliers[i];
  
  // Establish check digits by subtracting 97 from total until negative.
  total = 11 - total % 11;
  if (total > 9) {total = 0;};  
  
  // Compare the number with the last character of the VAT number. If it is the 
  // same, then it's a valid check digit.
  if (total == vatnumber.slice (7,8)) 
    return true
  else 
    return false;
}

function UKVATCheckDigit (vatnumber) {

  // Checks the check digits of a UK VAT number.
  
  var multipliers = [8,7,6,5,4,3,2];
  
  // Government departments
  if (vatnumber.substr(0,2) == 'GD') {
    if (vatnumber.substr(2,3) < 500) 
      return true 
    else 
      return false;
  }
  
  // Health authorities
  if (vatnumber.substr(0,2) == 'HA') {
    if (vatnumber.substr(2,3) > 499) 
      return true 
    else 
      return false;
  }
  
  // Standard and commercial numbers
  if (vatnumber.length == 9 || vatnumber.length == 10) {
    var total = 0;
    if (vatnumber.length == 10 && vatnumber.slice (9,10) != '3') return false;
    
    // Extract the next digit and multiply by the counter.
    for (var i = 0; i < 7; i++) total = total + Number(vatnumber.charAt(i)) * multipliers[i];
  
    // Establish check digits by subtracting 97 from total until negative.
    while (total > 0) {total = total - 97;}    
  
    // Get the absolute value and compare it with the last two characters of the
    // VAT number. If the same, then it is a valid check digit.
    total = Math.abs(total);
    if (total == vatnumber.slice (7,9)) 
      return true 
    else  
      return false;
  }
  
  // We don't check 12 and 13 digit UK numbers - not only can we not find any, 
  // but the information found on the format is contradictory.
  
  return true;
}







