// CPS Net Pay Calculator
// Programmed by Mike Parkinson (c)2008

// Updated 26/10/2010 - Tax bands updated

// Constants

// National Insurance
var NI_FreePay = 110.00;	// NI Freepay.
var NI_Band_Rate = 0.11;	// NI Normal rate. 
var NI_Band_Value = 844.00;	// NI Band limit.
var NI_HiBand_Rate = 0.01;	// NI High band rate.
var NI_ERate = 0.128;		// NI Employers rate.

// Tax
var TAX_FreePay = 6475.00;	// Tax free pay.
var TAX_LoRate = 37400.00;	// Tax Lo Rate band.
var TAX_NormalRate = 150000.00;	// Tax Normal Rate band.
var TAX_LoTax = 0.200;		// Lo Tax charge rate.
var TAX_NormalTax = 0.400;	// Normal Tax charge rate.
var TAX_HighTax = 0.500;	// High Tax charge rate.

var MIN_Rate = 6.65;		// Minimum rate before taxes.

// Other constants
var Sub_Over = 18.00;		// Subsistence over hours.
var Sub_Under = 5.00;		// Subsistence under hours.
var Millage_Rate = 0.40;	// Millage Exchange Rate.
var CPS_Fee = 13.50;		// CPS's Fee.

// End of constants

// Reset Form
function ResetForm()
{
	document.getElementById('txtA_Total').innerHTML = '';
	document.getElementById('txtNetPay').innerHTML = '';
}

// Update Total Work days
function UpdateWorkDays()
{
    var sA_Over = document.getElementById('txtA_Over');
    var sA_Under = document.getElementById('txtA_Under');
	var A_Over = 0;
	var A_Under = 0;

	if (!isNaN(parseFloat(sA_Over.value)))
		A_Over = parseFloat(sA_Over.value);

	if (!isNaN(parseFloat(sA_Under.value)))
		A_Under = parseFloat(sA_Under.value);

	var intTotal = A_Over + A_Under;

	if (intTotal > 0)
		document.getElementById('txtA_Total').innerHTML = intTotal;
	else
		document.getElementById('txtA_Total').innerHTML = '';
}

// Calculate the NET PAY
function Calculate_onClick()
{
    var frmCalculator = document.getElementsByTagName('form').item(0);
	//Calculate PAYE Pay
	var LtdRate = 0;
	var Quantity = 0;

	if (!isNaN(parseFloat(frmCalculator.txtRate.value)))
		LtdRate = parseFloat(frmCalculator.txtRate.value);
	if (!isNaN(parseFloat(frmCalculator.txtQty.value)))
		Quantity = parseFloat(frmCalculator.txtQty.value);

	var LtdPay = LtdRate * Quantity;
	var NI_ERfactor = NI_ERate / (1.00 + NI_ERate);

	var PAYEPay = ((NI_ERate * NI_FreePay) + LtdPay) / (1 + NI_ERate);

//alert('PAYE Pay='+PAYEPay);

	//Section A Total
	var A_Over = 0;
	var A_Under = 0;	

	if (!isNaN(parseFloat(frmCalculator.txtA_Over.value)))
		A_Over = parseFloat(frmCalculator.txtA_Over.value);
	if (!isNaN(parseFloat(frmCalculator.txtA_Under.value)))
		A_Under = parseFloat(frmCalculator.txtA_Under.value);

	var A_Total = (A_Over * Sub_Over) + (A_Under * Sub_Under);

//alert('A total = '+A_Total);

	//Section B Total
	var B_AreaValue = 0;
	var B_Nights = 0;


	B_AreaValue = parseFloat(frmCalculator.lstB_Area.value);
	if (!isNaN(parseFloat(frmCalculator.txtB_Nights.value)))
		B_Nights = parseFloat(frmCalculator.txtB_Nights.value);

	var B_Total = B_AreaValue * B_Nights;

//alert('B total = '+B_Total)

	//Section C Total
	var C_Miles = 0;
	var C_Transport = 0;
	var C_Charges = 0;
	var C_Exspenses = 0;

	if (!isNaN(parseFloat(frmCalculator.txtC_Miles.value)))
		C_Miles = parseFloat(frmCalculator.txtC_Miles.value);
	if (!isNaN(parseFloat(frmCalculator.txtC_Transport.value)))
		C_Transport = parseFloat(frmCalculator.txtC_Transport.value);
	if (!isNaN(parseFloat(frmCalculator.txtC_Charges.value)))
		C_Charges = parseFloat(frmCalculator.txtC_Charges.value);
	if (!isNaN(parseFloat(frmCalculator.txtC_Expenses.value)))
		C_Exspenses = parseFloat(frmCalculator.txtC_Expenses.value);

	var C_Total = (C_Miles * Millage_Rate) + C_Transport + C_Charges + C_Exspenses;

//alert('C total = '+C_Total);


	//Minimum Pay
	var MinPay = 0;
	if (Quantity < 8)
		MinPay=MIN_Rate * 40;
	else
		MinPay=MIN_Rate * Quantity;

	//Calculate total expense claimed
	var TotalExpense = A_Total + B_Total + C_Total;

	if (PAYEPay < (TotalExpense + MinPay)) TotalExpense = PAYEPay - MinPay;
	
//alert('Total expense = ' + TotalExpense);

	//Amount subject to Tax and NI
	var subjectToTaxNI = PAYEPay-TotalExpense;

//alert('Subject to Tax and NI = ' + subjectToTaxNI);

	//Tax Calculations
	var wklyFree = TAX_FreePay / 52;
	var wklyLoRate = TAX_LoRate / 52;
	var wklyNormalRate = (TAX_NormalRate - TAX_LoRate) / 52;
	
	var TaxableLeftOver = subjectToTaxNI - wklyFree;
	var TaxDeductions = 0.00;
	var Taxable = 0.00;
	
	//Lo Tax
	if (TaxableLeftOver < wklyLoRate)
		Taxable = TaxableLeftOver;
	else
		Taxable = wklyLoRate;
	TaxDeductions = TaxDeductions + (Taxable * TAX_LoTax);
	TaxableLeftOver = TaxableLeftOver - Taxable;

	//Normal Tax
	if (TaxableLeftOver < wklyNormalRate)
		Taxable = TaxableLeftOver;
	else
		Taxable = wklyNormalRate;
	TaxDeductions = TaxDeductions + (Taxable * TAX_NormalTax);
	TaxableLeftOver = TaxableLeftOver - Taxable;

	//High Tax
	if (TaxableLeftOver > 0)
		Taxable = TaxableLeftOver;
	else
		Taxable= 0;
	TaxDeductions =TaxDeductions + (Taxable * TAX_HighTax);

//alert('Tax Deductions = ' + TaxDeductions);

	//NI Calculations
	var NIDeductions = 0.00;
	var NIable = 0.00;

	//Low band
	if (subjectToTaxNI > NI_Band_Value)
		NIable = NI_Band_Value - NI_FreePay;
	else
		NIable = subjectToTaxNI - NI_FreePay;
	NIDeductions = NIDeductions + (NIable * NI_Band_Rate);
	if (subjectToTaxNI > NI_Band_Value)
		NIable = subjectToTaxNI - NI_Band_Value;
	else
		NIable = 0;
	NIDeductions = NIDeductions + (NIable * NI_HiBand_Rate);
	
//alert('NI Deductions = ' + NIDeductions);
	
	// Net Pay
	var NetPay = PAYEPay - TaxDeductions - NIDeductions;
	
	// Take of CPS fee
	var NetPay = NetPay - CPS_Fee;

	// Update NET Pay on form
	if (NetPay < 0) NetPay = 0
	document.getElementById('txtNetPay').innerHTML = NetPay.toFixed(0);

}
