function isThousands(position) {
    if (Math.floor(position / 3) * 3 == position) return true;
    return false;
};

function formatMoney(theNumber, theCurrency, theThousands, theDecimal) {
    var theDecimalDigits =
Math.round((theNumber * 100) - (Math.floor(theNumber) * 100));
    theDecimalDigits = "" + (theDecimalDigits + "0").substring(0, 2);
    theNumber = "" + Math.floor(theNumber);
    var theOutput = theCurrency;
    for (x = 0; x < theNumber.length; x++) {
        theOutput += theNumber.substring(x, x + 1);
        if (isThousands(theNumber.length - x - 1) && (theNumber.length - x - 1
!= 0)) {
            theOutput += theThousands;
        };
    };
    theOutput += theDecimal + theDecimalDigits;
    return theOutput;
};

function v_number(number) {
	var digits="0123456789.£";
	if (number=="£") {return false;}
	if (number.length==0) {return false;}
	for (var i=0;i<number.length;i++){if (digits.indexOf(number.substring(i,i+1))==-1 && number.substring(i,i+1)!="."){return false;}}
}

function validate(){			
	var f_form = document.payrollform;
	var strerror = "";

	if (v_number(f_form.gmp.value)==false) {
		strerror = "> Gross pay\n";
		f_form.gmp.focus();
		f_form.gmp.select();
	}

	if (v_number(f_form.code.value)==false) {
	  if (f_form.stc.value != "BR" && f_form.stc.value != "DO" && f_form.stc.value != "NT") {
  		strerror = strerror + "> Numerical Tax code\n";
  		f_form.code.focus();
  		f_form.code.select();
    }
	}
	
	if (strerror != "") {
	  alert("Please complete the following fields correctly\nbefore resubmitting this form:\n\n" + strerror + "\nThank you.");
	  return false;
	}

  var MGP = 0;          //Monthly gross pay
  var NTC = 0;          //Numeric part of tax code
  var STC = 0;          //Special tax code
      
  var PYD = 0;          //PAYE deduction (Was Y)
  var NIEE = 0;         //National Insurance employees deduction
  var NIER = 0;         //National Insurance employers deduction
  var GP = 0;           //Gross pay
  var NP = 0;           //Net pay
  var CE = 0;           //Cost to employer
  var MTC = 0;          //Monthly tax code
  var P = 0;            //Monthly or weekly pay
  var RLT = 0;          //K code regulatory limit
  var RLTM = 50;        //K code regulatory limit multiplier
  
  var LTB = 10;         //Lower tax bracket %
  var MTB = 20;         //Middle tax bracket %
  var HTB = 40;         //Higher tax bracket %
  var LTL = 0;          //Lower tax limit
  var MTL = 2916;       //Middle tax limit
  var JTL = (LTL+MTL);  //Joint tax limit
  
  var WLTL = 0;	        //Lower tax limit - weekly
  var WMTL = 673;     //Middle tax limit - weekly
  var WJTL = (WLTL + WMTL);//Joint tax limit - weekly

  var LMGPB = 12;       //Lower monthly gross pay bracket
  var LMGPL = 602;      //Lower monthly gross pay limit
  var HMGPB = 2;        //Higher monthly gross pay bracket
  var HMGPL = 3540;     //Higher monthly gross pay limit
  
  var LWGPL = 139;      //Lower weekly gross pay limit
  var HWGPL = 817;      //Higher weekly gross pay limit

  var LMNIERB = 0;      //Lower monthly employers ni bracket
  var LMNIERL = 589;    //Lower monthly employers ni limit
  var HMNIERB = 13.8;   //Higher monthly employers ni bracket
  
  var LTS = ((LTL/100)*LTB);    //Lower tax sum
  var MTS = ((MTL/100)*MTB);    //Middle tax sum
  
// ------------------------------------------
// Take values from the form
// ------------------------------------------

  MGP = f_form.gmp.value;
  WGP = f_form.gmp.value;
  NTC = f_form.code.value;
  STC = f_form.stc.value;

// ------------------------------------------
// Calculate values required later
// ------------------------------------------

  MTC = (((10*NTC)+9)/12);

// If weekly is selected, swap the weekly values into the monthly - rest is the same
if (f_form.radWeekly.checked) {

  LTL = WLTL;        	//Lower tax limit
  MTL = WMTL;       	//Middle tax limit
  JTL = WJTL;  		    //Joint tax limit

  LTS = (WLTL/100 * LTB) // Lower tax sum
  MTS = (WMTL/100 * MTB) // Middle tax sum

  LMGPL = LWGPL;      	//Lower monthly gross pay limit
  HMGPL = HWGPL;     	//Higher monthly gross pay limit

  MTC = (((10*NTC)+9)/52);

}

// ------------------------------------------
// First, determine value for PYD
// ------------------------------------------


  if      (STC=="BR") {PYD=((MGP/100)*MTB);}
  else if (STC=="DO") {PYD=((MGP/100)*HTB);}
  else if (STC=="NT") {PYD=0;}
  else if (STC=="K")  {
    P=(((MGP-1)+1)+MTC);
    RLT=((MGP/100)*RLTM);
    if (P<=LTL)      {PYD=(P/100)*LTB;}
    else if (P<=JTL) {PYD=(((P-LTL)/100)*MTB)+LTS;}
    else             {PYD=(((P-JTL)/100)*HTB)+MTS+LTS;}
    if (PYD>RLT)     {PYD=RLT;}
  }else{
    P=MGP;
    if      (P<=MTC)       {PYD=0;}
    else if (P<=(MTC+LTL)) {PYD=((P-MTC)/100)*LTB;}
    else if (P<=(MTC+JTL)) {PYD=(((P-MTC-LTL)/100)*MTB)+LTS;}
    else                   {PYD=(((P-MTC-JTL)/100)*HTB)+MTS+LTS;}
  }

  // ------------------------------------------
  // Determine value for NIEE
  // ------------------------------------------

  if (MGP <= LMGPL) { NIEE = 0; }
  else if (MGP <= HMGPL) { NIEE = ((MGP - LMGPL) / 100) * LMGPB; }
  else { NIEE = (((HMGPL - LMGPL) / 100) * LMGPB) + (((MGP - HMGPL) / 100) * HMGPB); }

  // ------------------------------------------
  // Determine value for NIER
  // ------------------------------------------

  if (MGP <= LMNIERL) { NIER = 0; }
  else { NIER = ((MGP - LMNIERL) / 100) * HMNIERB; }

// ------------------------------------------
// Copy over other values
// ------------------------------------------

  GP = MGP;
  NP = ((MGP-PYD)-NIEE);
  CE = ((GP-1)+NIER+1);

// ------------------------------------------
// Place values into the form
// ------------------------------------------

  PYD=Math.round(PYD);
	NIEE=Math.round(NIEE);
	NP=(GP-PYD-NIEE);
	NIER=Math.round(NIER);
	CE=((GP-1)+NIER+1);

	f_form.grosspay.value = formatMoney((GP)," ",",",".");
	f_form.tax.value = formatMoney(PYD, " ", ",", ".");
	f_form.nic.value = formatMoney(NIEE, " ", ",", ".");
	f_form.net.value = formatMoney(NP, " ", ",", ".");
	f_form.enic.value = formatMoney(NIER, " ", ",", ".");
	f_form.emptotal.value = formatMoney(CE, " ", ",", ".");

	return false;
}

