//          +++++++++++++++++++++++++++++++++++
//         (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 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 _max = myMathFloor(MAX_INCOME / cmb.value, 2)
    var _min = myMathCeil(MIN_INCOME / cmb.value, 2)
    var sMin = "Your " + getCmbText(f.cmbGrossIncomeFreq, "l") + "ly gross income must be between $" + _min.toLocaleString() + " and $" + _max.toLocaleString() + "."
    if (isDecimal_MinMax(field, _min, _max, sMin, true))
        return true;
    else {
        select(field)
        return false;
    }
}
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) {
    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 = "$" + formatted_toFixed1(annSal, 2, "")
    document.getElementById("lblGS2").innerHTML = document.getElementById("lblGS1").innerHTML
    document.getElementById("lblSalSac1").innerHTML = "$0.00"
    document.getElementById("lblSalSac2").innerHTML = "-$" + formatted_toFixed1(salSacDollar, 2, "")
    document.getElementById("lblTI1").innerHTML = "$" + formatted_toFixed1(taxableIncome, 2, "")
    document.getElementById("lblTI2").innerHTML = "$" + formatted_toFixed1(taxableIncomeSS, 2, "")
    document.getElementById("lblPAYE1").innerHTML = paygsign + "$" + formatted_toFixed1(persTax, 2, "")
    document.getElementById("lblPAYE2").innerHTML = paygsssign + "$" + formatted_toFixed1(persTaxSS, 2, "")
    document.getElementById("lblATC1").innerHTML = document.getElementById("lblSalSac2").innerHTML
    document.getElementById("lblATC2").innerHTML = "$0.00"
    document.getElementById("lblTHP1").innerHTML = "<B>$" + formatted_toFixed1(takeHomePay, 2, "") + "</B>";
    document.getElementById("lblTHP2").innerHTML = "<B>$" + formatted_toFixed1(takeHomePaySS, 2, "") + "</B>";
    document.getElementById("lblSGC1").innerHTML = "$" + sgcDollar.toLocaleString();
    document.getElementById("lblSGC2").innerHTML = document.getElementById("lblSGC1").innerHTML
    document.getElementById("lblCT1").innerHTML = conttaxsign + "$" + formatted_toFixed1(contribTax, 2, "")
    document.getElementById("lblCT2").innerHTML = conttaxsssign + "$" + formatted_toFixed1(contribTaxSS, 2, "")
    document.getElementById("lblSSC1").innerHTML = "$0.00"
    document.getElementById("lblSSC2").innerHTML = "$" + formatted_toFixed1(salSacDollar, 2, "")
    document.getElementById("lblATC21").innerHTML = "$" + formatted_toFixed1(salSacDollar, 2, "")
    document.getElementById("lblATC22").innerHTML = "$0.00"
    document.getElementById("lblGCC21").innerHTML = "$" + formatted_toFixed1(coConts, 2, "")
    document.getElementById("lblGCC22").innerHTML = "$0.00"
    document.getElementById("lblNETSC1").innerHTML = "<B>$" + formatted_toFixed1(netSuper, 2, "") + "</B>";
    document.getElementById("lblNETSC2").innerHTML = "<B>$" + formatted_toFixed1(netSuperSS, 2, "") + "</B>";
    document.getElementById("lblTHPS1").innerHTML = "<B>$" + formatted_toFixed1(takeHomePayNetSuper, 2, "") + "</B>";
    document.getElementById("lblTHPS2").innerHTML = "<B>$" + formatted_toFixed1(takeHomePayNetSuperSS, 2, "") + "</B>";
}
