var ns4 = (document.layers) ? true : false;
var ie4 = (document.all && !document.getElementById) ? true : false;
var ie5 = (document.all && document.getElementById) ? true : false;
var ns6 = (!document.all && document.getElementById) ? true : false;


if(ns4)
	document.captureEvents(Event.KEYPRESS);
	
function alert_keycode(e)
{
	// 8 is a back space, 32 is a space, and 46 is a decimal point
	if(ns4) {
		//alert(String.fromCharCode(e.which));
		//if(isNaN(String.fromCharCode(e.which))&&(e.which!=8||e.which==32)&&(e.which!=46||e.which==32))
		if(isNaN(String.fromCharCode(e.which))&&(e.which!=8||e.which==32))
			return false;
	}
	else {
		//alert(event.keyCode);
		//if(isNaN(String.fromCharCode(event.keyCode))&&(event.keyCode!=8||event.keyCode==32)&&(event.keyCode!=46||event.keyCode==32))
		if(isNaN(String.fromCharCode(event.keyCode))&&(event.keyCode!=8||event.keyCode==32))
			return false;
	}
}

document.onkeypress=alert_keycode;


function NumberFormat(Num)
{
	// Pattern match for placing the comma
	// match a group of 3 numbers preceded by any amount of numbers
	Num += '';
	var rgx = /(\d+)(\d{3})/;
	while (rgx.test(Num)) {
		Num = Num.replace(rgx, '$1' + ',' + '$2');
	}
	return Num;
}

function RemoveCommas(Numstr) 
{
	var rgx = /,/g; //search for commas globally
	//replace all matches with empty strings
	return Numstr.replace(rgx,'');
}

function NumbertoCurrency(Num)
{
	var Places=2;
	if(Places>0) {
		//alert("num " + Num + " len " + Num.toString().length + " dot " + Num.toString().lastIndexOf('.'));
		if(Num.toString().lastIndexOf('.')==-1)	{
			Num=Num.toString()+".00";
			return Num;
		}
		
		if((Num.toString().length - Num.toString().lastIndexOf('.')) > (Places+1))	{
			var Rounder=Math.pow(10,Places);
			Num=Math.round(Num*Rounder) /Rounder;
		}
		//add trailing zero if required
		if(Num.toString().charAt(Num.toString().length-2)==".")
				Num=Num.toString()+"0";
		return Num;
	}
	else { 
		if(Num.toString().charAt(Num.toString().length-2)==".")
			Num=Num.toString()+"0";
		return Math.round(Num);
	}
}

function GetRadioValue(obj)
{
	var i;
	for(i=0;i<obj.length;i++)
	{
		if(obj[i].checked==true)
		return obj[i].value;
	}
}

function Calculate()
{
	var _Sacrifice //Care Cost
	var _Salary //Pay Level	

	window.document.frm.txtSalary.value = RemoveCommas(window.document.frm.txtSalary.value.toString());
	window.document.frm.txtCareCost.value = RemoveCommas(window.document.frm.txtCareCost.value.toString());
	
	if (window.document.frm.txtCareCost.value.toString().lastIndexOf('per month')!=-1) {
		_Sacrifice = new Number(window.document.frm.txtCareCost.value.toString().substring(0,window.document.frm.txtCareCost.value.toString().length - 10));
	}
	else {
		_Sacrifice=new Number(window.document.frm.txtCareCost.value);
	}
	
	_Salary=new Number(window.document.frm.txtSalary.value); 
	
	var _ContractedOut=new Number(GetRadioValue(window.document.frm.rdoCO)); //Contracted out
	//var _Tax=new Number(GetRadioValue(window.document.frm.rdoTax)); //Tax Bracket

	//alert("sal " + _Salary + " Sac " + _Sacrifice + " Out " + _ContractedOut);

	var c=new CalculatedSavings(_Salary,_Sacrifice,_ContractedOut);
	//alert(c);

	if (ns4){
		document.layers['txtPASave'].document.writeln("<font face=verdana color=white style='font-size:12px;'>"+NumberFormat(c.PASavings)+"</font>");
		document.layers['txtPASave'].document.close();
		document.layers['txtPMSave'].document.writeln("<font face=verdana color=white style='font-size:12px;'>"+NumberFormat(c.PMSavings)+"</font>");
		document.layers['txtPMSave'].document.close();
	}
	else {
		txtPASave.innerHTML=NumberFormat(c.PASavings);
		txtPMSave.innerHTML=NumberFormat(c.PMSavings);
	}
	
	window.document.frm.txtCareCost.value=NumberFormat(Math.round(_Sacrifice)) + "";
	window.document.frm.txtSalary.value=NumberFormat(Math.round(_Salary));
}

function CalculatedSavings(sal,sac,co)
{
	var PASavings;
	var PMSavings;
	var _Salary=new Number(sal);//Pay Level
	var _Sacrifice=new Number(sac);//Care Cost Monthly
	var _ContractedOut=new Number(co);//Contracted out
	//var _TaxBand=new Number(tax);//Tax Band

	//var SalLessCare=new Number(_Salary-_Sacrifice);
	//alert("sac " + _Sacrifice);

	var p=new PayableMonies(_Salary,0,_ContractedOut);
	var pc4=new PayableMonies(_Salary,_Sacrifice,_ContractedOut)

	//alert(p.TotalToPay);
	//alert(pc4.TotalToPay);

	this.PASavings=new Number(Math.round(p.TotalToPay-pc4.TotalToPay));
	this.PMSavings=Math.round(this.PASavings/12);

}

function PayableMonies(Salary,CareVal,ContractedOut)
{
	var LowerNIToPay;
	var HigherNIToPay;
	var LowRateTaxToPay;
	var BasicRateTaxToPay;
	var HighRateTaxToPay;
	var TotalToPay;
	var BaseFigure;
	var TaxToPay;


	var PERSONAL_ALLOWANCE=new Number(7545);



	var HIGH_RATE_NI_THRESHOLD=new Number(42484);// 2011-2012 UEL (£817) * 52
	var PRIMARY_NI_THRESHOLD=new Number(5304);// 2011-2012 LEL (£102) * 52

	var LOWER_NI_RATE_CONTRACTEDIN =new Number(0.12); // 11%
	var LOWER_NI_RATE_CONTRACTEDOUT_REBATE =new Number(0.016); // 2011-2012 = 1.6%
	var LOWER_NI_RATE_CONTRACTEDOUT =new Number(LOWER_NI_RATE_CONTRACTEDIN-LOWER_NI_RATE_CONTRACTEDOUT_REBATE);

	var HIGH_NI_RATE=new Number(0.02); // 2%

	var _UseNIRate;


	var TAX_RATE_BASIC=new Number(0.20); // 20%
	var TAX_RATE_HIGH=new Number(0.40); // 40%
	var TAX_RATE_ADDITIONAL=new Number(0.50); // 50%

	var HIGH_RATE_THRESHOLD=new Number(35000); // Under this is for 20%
	var ADDITIONAL_RATE_THRESHOLD=new Number(150000); // Under this but over HIGH_RATE_THRESHOLD is 40%, over this is 50%




	var MAX_FREE_CARE = new Number(2915); // Maximum yearly free sacrifice

	if(Salary>ADDITIONAL_RATE_THRESHOLD)
		{
			var MAX_FREE_CARE = new Number(1166); // Maximum yearly free sacrifice for additional rate tax payer
		}
	else
		{

			if(Salary>HIGH_RATE_THRESHOLD)
				{
					var MAX_FREE_CARE = new Number(1484); // Maximum yearly free sacrifice for high rate tax payer
				}
			else
				{	
					var MAX_FREE_CARE = new Number(2915); // Maximum yearly free sacrifice for basic rate tax payer
				}
		}


	CareVal = CareVal * 12
		// Maximum Tax free yearly sacrifice 
	if (CareVal > MAX_FREE_CARE)
		CareVal = MAX_FREE_CARE;


	



	if(ContractedOut==1)
		_UseNIRate=new Number(LOWER_NI_RATE_CONTRACTEDOUT);
	else
		_UseNIRate=new Number(LOWER_NI_RATE_CONTRACTEDIN);
		
	//alert(_UseNIRate);	




 

	var SalLessCare=new Number(Salary-CareVal);

	var TaxableIncome=new Number(Salary-CareVal-PERSONAL_ALLOWANCE);



	//Lower Rate NI to pay


	if (SalLessCare-PRIMARY_NI_THRESHOLD >=0)
		{

			if(SalLessCare-HIGH_RATE_NI_THRESHOLD>=0)
				this.LowerNIToPay=new Number((HIGH_RATE_NI_THRESHOLD-PRIMARY_NI_THRESHOLD)*_UseNIRate);
			else
				this.LowerNIToPay=new Number((SalLessCare-PRIMARY_NI_THRESHOLD)*_UseNIRate);	
		}
	else
		{
			this.LowerNIToPay=new Number(0);	
		}



	//Higher Rate NI to pay
	if(SalLessCare-HIGH_RATE_NI_THRESHOLD>0)
		this.HigherNIToPay=new Number((SalLessCare-HIGH_RATE_NI_THRESHOLD)*HIGH_NI_RATE);
	else
		this.HigherNIToPay=new Number(0);
	

	//Tax to Pay

	if(TaxableIncome>0)

		{			
			if(TaxableIncome<=HIGH_RATE_THRESHOLD)
				{
					// Basic rate taxpayer

					this.TaxToPay=new Number(TaxableIncome*TAX_RATE_BASIC);
				}
	
			else 	
				{	

					if(TaxableIncome<=ADDITIONAL_RATE_THRESHOLD)
						{
							// High rate tax payer

							this.TaxToPay=new Number((HIGH_RATE_THRESHOLD*TAX_RATE_BASIC)+((TaxableIncome-HIGH_RATE_THRESHOLD)*TAX_RATE_HIGH));
						}
					else
						{

							// Additional rate tax payer

							this.TaxToPay=new Number((HIGH_RATE_THRESHOLD*TAX_RATE_BASIC)+((ADDITIONAL_RATE_THRESHOLD-HIGH_RATE_THRESHOLD)*TAX_RATE_HIGH)+((TaxableIncome-ADDITIONAL_RATE_THRESHOLD)*TAX_RATE_ADDITIONAL));
						}

				}
		
		}
	else
		{
			
			//No tax to pay

			this.TaxToPay=0;
		}

		
	//Total
	this.TotalToPay=new Number(this.LowerNIToPay+this.HigherNIToPay+this.TaxToPay);

	//var s=new String();
	//s+="Lower NI to Pay "+this.LowerNIToPay;
	//s+="\nHigher NI to Pay "+this.HigherNIToPay;
	//s+="\nLower Tax to Pay "+this.LowRateTaxToPay;
	//s+="\nBasic Tax to Pay "+this.BasicRateTaxToPay;
	//s+="\nHigher Tax to Pay "+this.HighRateTaxToPay;;
	//s+="\nTotal to Pay "+this.TotalToPay;
	//alert(s);
}


function ResetVals()
{
	window.document.frm.txtSalary.value="0";
	window.document.frm.rdoCO[0].checked=true;
	//window.document.frm.rdoTax[0].checked=true;
	window.document.frm.txtCareCost.value="0";
	//reset the divs and layers
	if (ns4){
		document.layers['txtPASave'].document.writeln("");
		document.layers['txtPASave'].document.close();
		document.layers['txtPMSave'].document.writeln("");
		document.layers['txtPMSave'].document.close();
	}
	else{
		txtPASave.innerHTML="";
		txtPMSave.innerHTML="";
	}
}




