//          +++++++++++++++++++++++++++++++++++
//         (C) Copyright 2003 - 2009 Niro Solutions Pty Limited ABN 89 106 967 140
//			+++++++++++++++++++++++++++++++++++
//			Version: July 2009
//			+++++++++++++++++++++++++++++++++++
//			Original author: Miles Glisovic
//			Last update completed by: Roland Beerling
//			Modification date: 17/06/09
//			+++++++++++++++++++++++++++++++++++

var MIN_AGE = 16
var MAX_AGE = 65
var MIN_INCOME = 10000;//p.a.
var MAX_INCOME = 554938;//p.a.
var MAX_SGC_SAL = 152720; //p.a.
var SGC_RATE=0.09;
var CONCCONT50000=25000;
var CONCCONT_TRANS_CAP = 50000;
var MIN_DOLLAR = 0.01;
var MIN_PCTG = 0.01;
var MAX_PCTG = 100;//%
var initGrossIncome="";
var initGrossIncomeFreq="";
var maxConcessConts = 0;
var showSGWarning = true;
var salSacDollar = 0;

function isInt_MinMax(field,min1,max1,prompt1)
{
    var v=field.value
    var int1 = /^\d{1,7}$/;
    var reg=new RegExp(int1);
    var ret = reg.test(v);

    if(ret && v >= min1 && v <= max1)
	    return true;
    else
    {
	    select(field)
	    if(prompt1)
		    alert("Please enter a whole number between " + min1 + " and " + max1 +".")
	    return false;
    }
}

function initialise() {
    try {
        //var f=document.forms.frmName
        //f.txtGrossIncome.value=(isInt(initGrossIncome))?initGrossIncome:""
        //if(initGrossIncomeFreq!="") f.cmbGrossIncomeFreq.selectedIndex=getCmbIndex(f.cmbGrossIncomeFreq,initGrossIncomeFreq.charAt(0))
    }
    catch (e) {
        alert(e)
    }
}

function validStep1(f)
{
    var ret = false
    if( validAge(f) && validIncome(f) && validIncomeSGC(f) && validMemberCont(f) && validConcessionalContLimit(f))
	    ret = true
    return ret
}

function getMemberContPercent(f,annualSalary)
{
	if(f.rdMemberCont[0].checked)
		return (getSafeDecimalFieldValue(f.txtPctOfSalary))
	else
		return (((f.cmbDollarAmountFreq.value)*(getSafeDecimalFieldValue(f.txtDollarAmount)))/annualSalary*100)
}

function validIncome(f)
{
	var field = f.txtGrossIncome
	adjustDecimalPoint(field)
	var cmb=f.cmbGrossIncomeFreq
	var minInc=myMathCeil(MIN_INCOME/cmb.value,2)
	var maxInc=myMathFloor(MAX_INCOME/cmb.value,2)
	var fr = getCmbText(cmb,"l")
	var sMin="Your gross income must be between $" + minInc.toLocaleString() + " and $" + maxInc.toLocaleString() + " per "+ fr +"."
	return (isDecimal_MinMax(field,minInc,maxInc,sMin,true))
}

function validIncomeSGC(f)
{
	var field = f.txtGrossIncome
	var cmb=f.cmbGrossIncomeFreq
	var maxSGC=myMathFloor(MAX_SGC_SAL/cmb.value,2)
	var fr = getCmbText(cmb,"l")
	var sMin="Your gross income is greater than $" + maxSGC.toLocaleString() + " per "+ fr + " which is the limit set by the ATO where employers are only required to pay super guaranteed contributions (SGC) up to this limit. Some employers continue to pay the SGC over this maximum and others do not. This limit is also known as the 'Maximum superannuation contribution base'. This calculator makes no allowance for this limit. You can continue to use the calculator but be aware the employer contributions calculated may be incorrect if your employer has applied this limit."
	if ((getSafeDecimalFieldValue(field) > maxSGC) && showSGWarning)
	    {window.alert(sMin)
	    showSGWarning = false}
	return true
}

function validAge(f)
{
	var field = f.txtAge
	adjustDecimalPoint(field)
	var sMin="Your age must be between " + MIN_AGE.toString() + " and " + MAX_AGE.toString() + "."
	return (isDecimal_MinMax(field,MIN_AGE,MAX_AGE,sMin,true))
}

function validMemberCont(f)
{
	var ret = false;
	if(!f.rdMemberCont[0].checked && !f.rdMemberCont[1].checked)
			alert("Please specify member contributions.")
	else
	{
		var field;
		if(f.rdMemberCont[0].checked)
		{
			field = f.txtPctOfSalary
			adjustDecimalPoint(field)
			var s1="The Member contributions Percentage of salary must be between "+MIN_PCTG+"% and "+MAX_PCTG+"%.";
			if(isDecimal_MinMax(field,MIN_PCTG,MAX_PCTG,s1,true))
				return true;
		}
		else
		{
			// calculate MAX_DOLLAR which corresponds to MAX_PCTG of groos income
			var MAX_DOLLAR = myMathFloor(((getSafeDecimalFieldValue(f.txtGrossIncome)*f.cmbGrossIncomeFreq.value)*(MAX_PCTG/100.0))/f.cmbDollarAmountFreq.value,2)
			var fr= getCmbText(f.cmbDollarAmountFreq,"l")
			field = f.txtDollarAmount
			adjustDecimalPoint(field)
			var s1="The Member contributions Dollar amount must be between $"+MIN_DOLLAR.toLocaleString()+" and $"+MAX_DOLLAR.toLocaleString()+ " per "+ fr +"."
			if(isDecimal_MinMax(field,MIN_DOLLAR,MAX_DOLLAR,s1,true))
				return true;
		}
	}
}

function validConcessionalContLimit(f)
{
SGC_RATE = getSafeDecimalFieldValue(f.txtEmployerSG)/100.0
var salSacDollar
var annSal=getSafeDecimalFieldValue(f.txtGrossIncome)*f.cmbGrossIncomeFreq.value;
var sgcDollar=myMathCeil(annSal*SGC_RATE,2)
setConcessContCap()
if(f.rdMemberCont[1].checked)
	salSacDollar=(f.cmbDollarAmountFreq.value)*getSafeDecimalFieldValue(f.txtDollarAmount)
else
	salSacDollar=myMathCeil(annSal*getSafeDecimalFieldValue(f.txtPctOfSalary)/100.0,2)

if(myMathCeil((sgcDollar+salSacDollar),2) > maxConcessConts)
{
var s11="Concessional contributions (salary sacrifice plus SG) are capped at a maximum of $"+removeDecimalPart(maxConcessConts.toLocaleString()) +" per year. To ensure your total concessional contributions fall under this maximum please enter an amount of salary sacrifice contributions equal to or less than "
	if(f.rdMemberCont[1].checked)
	{
		var contM = getMaxDollarAllowed(f, maxConcessConts, sgcDollar, annSal)
		alert(s11+"$"+contM.toLocaleString()+" per "+getCmbText(f.cmbDollarAmountFreq,"l")+".")
		select(f.txtDollarAmount)
	}
	else
	{
		var contM = getMaxPctAllowed(f, maxConcessConts, sgcDollar, annSal)
		alert(s11+contM+"%.")
		select(f.txtPctOfSalary)
	}
	return false;
}
else
	return true
}

function setConcessContCap(f){

    var currAge = getSafeDecimalFieldValue(document.forms.frmName.txtAge)
       if(currAge >= 50){
        maxConcessConts = CONCCONT_TRANS_CAP
       }else{
        maxConcessConts = CONCCONT50000
       }
       
}



function calcResults(f)
{
var annSal=(getSafeDecimalFieldValue(f.txtGrossIncome))*f.cmbGrossIncomeFreq.value;
var sgcDollar=myMathFloor(annSal*SGC_RATE,2)
if(f.rdMemberCont[1].checked)
	salSacDollar=myMathFloor((f.cmbDollarAmountFreq.value)*getSafeDecimalFieldValue(f.txtDollarAmount),2)
else
	salSacDollar=myMathFloor(annSal*((getSafeDecimalFieldValue(f.txtPctOfSalary)/100.0)),2)

var contribTax=myMathCeil(sgcDollar*TAX_RATE_1,2)
var contribTaxSS=myMathCeil((sgcDollar + salSacDollar) * TAX_RATE_1,2)
var taxableIncome=annSal
var taxableIncomeSS=annSal-salSacDollar
	var pt1 = getPAYETax(taxableIncome)
	var md1 = getMedicareLevy(taxableIncome)
	var lito = getLowIncomeTaxOffset_2006_07(taxableIncome)
	var persTax=Math.max(myMathCeil(pt1 + md1 - lito,2),0)
pt1 = getPAYETax(taxableIncomeSS)
md1 = getMedicareLevy(taxableIncomeSS)
lito = getLowIncomeTaxOffset_2006_07(taxableIncomeSS)
var persTaxSS=Math.max(myMathCeil(pt1 + md1 - lito,2),0)
var netSalary=annSal-persTax
var netSalarySS=annSal-persTaxSS
var coConts = myRound(getCoConts(annSal, salSacDollar),2)
var takeHomePay=netSalary-salSacDollar
var takeHomePaySS=netSalarySS-salSacDollar
var netSuper=sgcDollar+salSacDollar+coConts-contribTax
var netSuperSS=sgcDollar+salSacDollar-contribTaxSS
var takeHomePayNetSuper=takeHomePay+netSuper
var takeHomePayNetSuperSS=takeHomePaySS+netSuperSS
var paygsign = (persTax!=0?'-':'&nbsp;')
var paygsssign = (persTaxSS!=0?'-':'&nbsp;')
var conttaxsign = (contribTax!=0?'-':'&nbsp;')
var conttaxsssign = (contribTaxSS!=0?'-':'&nbsp;')

document.getElementById("lblGS1").innerHTML = "$" + annSal.toLocaleString();
document.getElementById("lblGS2").innerHTML = document.getElementById("lblGS1").innerHTML
document.getElementById("lblSalSac1").innerHTML = "$0.00"
document.getElementById("lblSalSac2").innerHTML = "$" + salSacDollar.toLocaleString()
document.getElementById("lblTI1").innerHTML = "$" + taxableIncome.toLocaleString();
document.getElementById("lblTI2").innerHTML = "$" + taxableIncomeSS.toLocaleString();
document.getElementById("lblPAYE10").innerHTML = (persTax != 0 ? '-' : '&nbsp;')
document.getElementById("lblPAYE1").innerHTML = "$" + persTax.toLocaleString();
document.getElementById("lblPAYE20").innerHTML = (persTaxSS != 0 ? '-' : '&nbsp;')
document.getElementById("lblPAYE2").innerHTML = "$" + persTaxSS.toLocaleString();
document.getElementById("lblATC1").innerHTML = document.getElementById("lblSalSac2").innerHTML
document.getElementById("lblATC2").innerHTML = "$0.00"
document.getElementById("lblTHP1").innerHTML = "<B>$" + takeHomePay.toLocaleString() + "</B>";
document.getElementById("lblTHP2").innerHTML = "<B>$" + takeHomePaySS.toLocaleString() + "</B>";
document.getElementById("lblSGC1").innerHTML = "$" + sgcDollar.toLocaleString();
document.getElementById("lblSGC2").innerHTML = document.getElementById("lblSGC1").innerHTML
document.getElementById("lblConTax10").innerHTML = (contribTax != 0 ? '-' : '&nbsp;')
document.getElementById("lblConTax1").innerHTML = "$" + contribTax.toLocaleString();
document.getElementById("lblConTax20").innerHTML = (contribTaxSS != 0 ? '-' : '&nbsp;')
document.getElementById("lblConTax2").innerHTML = "$" + (contribTaxSS).toLocaleString();
document.getElementById("lblSSC1").innerHTML = "$0.00"
document.getElementById("lblSSC2").innerHTML = "$" + salSacDollar.toLocaleString();
document.getElementById("lblATC21").innerHTML = "$" + salSacDollar.toLocaleString()
document.getElementById("lblATC22").innerHTML = "$0.00"
document.getElementById("lblGCC21").innerHTML = "$" + coConts.toLocaleString()
document.getElementById("lblGCC22").innerHTML = "$0.00"
document.getElementById("lblNETSC1").innerHTML = "<B>$" + netSuper.toLocaleString() + "</B>";
document.getElementById("lblNETSC2").innerHTML = "<B>$" + netSuperSS.toLocaleString() + "</B>";
document.getElementById("lblTHPS1").innerHTML = "<B>$" + takeHomePayNetSuper.toLocaleString() + "</B>";
document.getElementById("lblTHPS2").innerHTML = "<B>$" + takeHomePayNetSuperSS.toLocaleString() + "</B>";
}



