//Copyright © 2002 - 2010 PracticeWEB Ltd
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 round_to_pence(num){
  return Math.floor(num * 100)/100;
}

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 != "D1" && 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;
	}

// ----------------------------------------------------
// Payroll Calculator written by Phil Collins of redweb
// v1.1  - Changes to formula. Addition of variable.
// 07/07   Changes to error reports and addition of
//         reset button on form.
// v1.0  - Initial coding taken from Anthony.
// 03/07
// ----------------------------------------------------

// ------------------------------------------
// Setup variables and enter default values
// ------------------------------------------

  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 ATB = 50;         //Additional tax bracket %
  
  var LTL = 0;        //Lower tax limit
  var MTL = 2916.67;       //Middle tax limit
  var HTL = 12500;//9583.33; 		//Higher tax limit
  /* var JTL = (LTL+MTL);  //Joint tax limit
  var FTL = (LTL+MTL+HTL);  //Full tax limit */
  
  var WLTL = 0;	//Lower tax limit - weekly
  var WMTL = 673.08;	//Middle tax limit - weekly
  var WHTL = 2884.62;//2211.54;	//Higher tax limit - weekly
  /* var WJTL = (WLTL + WMTL);//Joint tax limit - weekly
  var WFTL = (WLTL + WMTL + WHTL);//Full tax limit - weekly
 */
  /* var LTS = ((LTL/100)*LTB);    //Lower tax sum
  var MTS = ((MTL/100)*MTB);    //Middle tax sum
  var HTS = ((HTL/100)*HTB);    //Higher tax sum */


  // these are for NI contribution calculations
  var LMGPB = 12;       //Lower monthly gross pay bracket
  var LMGPL = 602;      //Primary threshold - monthly
  var ST_M = 589;       //Secondary threshold - monthly
  var HMGPL = 3540;     //Upper earnings limit - monthly
  var EHNIR = 2;        // employees_higher_ni_rate
  
  var LWGPL = 139;      //Primary threshold - weekly
  var ST_W = 136;       //Secondary threshold - weekly
  var HWGPL = 817;     //Upper earnings limit - weekly
  
  var NIERP = 13.8;     //National Insurance employers deduction percentage
  
 
// ------------------------------------------
// Take values from the form
// ------------------------------------------

  MGP = f_form.gmp.value;
  MGP = MGP * 1;
  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
  HTL = WHTL;       	//Higher tax limit
  /* JTL = WJTL;  		//Joint tax limit
  FTL = WFTL;  		//Full tax limit */

  /* LTS = (WLTL/100 * LTB); // Lower tax sum
  MTS = (WMTL/100 * MTB); // Middle tax sum
  HTS = (WHTL/100 * HTB); // Higher tax sum */

  LMGPL = LWGPL;      	//Lower monthly gross pay limit
  HMGPL = HWGPL;     	//Higher monthly gross pay limit
  ST_M = ST_W;     	//secondary threshold

  MTC = (((10*NTC)+9)/52);

}
//MTC = Math.round(MTC);



// ------------------------------------------
// First, determine value for PYD
// ------------------------------------------


  if      (STC=="BR") {PYD=((MGP/100)*MTB);}
  else if (STC=="DO") {PYD=((MGP/100)*HTB);}
  else if (STC=="D1") {PYD=((MGP/100)*ATB);}
  else if (STC=="NT") {PYD=0;}
  else if (STC=="K")  {
    P = MGP + MTC;
    
    
    var at_MTB = Math.min(MTL, P);
    //P = Math.max(0, P-MTL); // Left after MTL
    
    var at_HTB = Math.max(0, Math.min(HTL, P) - MTL);
    var at_ATB = Math.max(0, P-HTL); // Left after HTL
        
    PYD = round_to_pence(at_MTB * MTB/100) + round_to_pence(at_HTB * HTB/100) + round_to_pence(at_ATB * ATB/100);
    
    //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 if (P<=FTL) {PYD=(((P-JTL)/100)*HTB)+MTS+LTS;}
    else             {PYD=(((P-FTL)/100)*ATB)+MTS+LTS+HTS;} */
    if (PYD>RLT)     {PYD=RLT;}
  }else{
    P=Math.max(0, MGP - MTC);
    
    //var at_0 = Math.min(MTC, P); 
    //P = P-MTC // allowance from MTC
    
    //var at_LTB = Math.max(0, Math.min(LTL, P) - at_0);
    //P = Math.max(0, P-LTL); // Left after LTL
    
    var at_MTB = Math.min(MTL, P);
    //P = Math.max(0, P-MTL); // Left after MTL
    
    var at_HTB = Math.max(0, Math.min(HTL, P) - MTL);
    var at_ATB = Math.max(0, P-HTL); // Left after HTL
        
    PYD = round_to_pence(at_MTB * MTB/100) + round_to_pence(at_HTB * HTB/100) + round_to_pence(at_ATB * ATB/100);
    /*
    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 if (P<=(MTC+FTL)) {PYD=(((P-MTC-JTL)/100)*HTB)+MTS+LTS;}
    else                   {PYD=(((P-MTC-FTL)/100)*ATB)+MTS+LTS+HTS;}
    */
  }
    
  //PYD=Math.round(PYD*100.0)/100;
  PYD= new Number(PYD);
// ------------------------------------------
// Determine value for NIEE
// ------------------------------------------

  if      (MGP<=LMGPL) {NIEE=0;}
  else if (MGP<=HMGPL) {NIEE=((MGP-LMGPL)/100)*LMGPB;}
  else                 {NIEE=(((HMGPL-LMGPL)/100)*LMGPB)+(EHNIR*(MGP-HMGPL)/100);}

	//NIEE=Math.round(NIEE*100.0)/100;
  NIEE = new Number(NIEE);
// ------------------------------------------
// Determine value for NIER
// ------------------------------------------

  if (MGP<=ST_M) {NIER=0;}
  else            {NIER=((MGP-ST_M)/100)*NIERP;}
	//NIER=Math.ceil(NIER*100.0)/100;
  NIER=new Number(NIER);
// ------------------------------------------
// Copy over other values
// ------------------------------------------

  GP = new Number(MGP);
  NP = ((MGP-PYD)-NIEE);
	//NP=Math.round(NP*100.0)/100;
  NP= new Number(NP);
  CE = ((GP-1)+ (NIER+1));
  CE=new Number(CE);

// ------------------------------------------
// Place values into the form
// ------------------------------------------
  
	f_form.grosspay.value="£"+ GP.toFixed(2);
	f_form.tax.value="£"+PYD.toFixed(2);
	f_form.nic.value="£"+NIEE.toFixed(2);
	f_form.net.value="£"+NP.toFixed(2);
	f_form.enic.value="£"+NIER.toFixed(2);
	f_form.emptotal.value="£"+CE.toFixed(2);

	return false;
}

