/// <reference path="jquery-1.5.1-vsdoc.js" />

function CleanseDollar(DollarAmount)
{
	//replace comma and dollar sign if found
	//g=global replace
	var DollarSignRegex =  /[$]/g;
	var CommaSignRegex = /,/g;
	
	if (DollarSignRegex.test(DollarAmount)) {
		DollarAmount = DollarAmount.replace(DollarSignRegex,"");
	}
	
	if (CommaSignRegex.test(DollarAmount)) {
		DollarAmount = DollarAmount.replace(CommaSignRegex,"");
	}

	return DollarAmount;
}

function CalculateSalary(ComparedPay) 
{

    // Retrieve Salary amount
    AnnualSalary = parseFloat(CleanseDollar($("#CurrentSalary").val()));
    NewAnnualSalary = parseFloat(CleanseDollar($("#NewSalary").val()));
    if (isNaN(AnnualSalary)) { AnnualSalary = 0; }
	if (isNaN(NewAnnualSalary)) { NewAnnualSalary = 0; }

    // Retrieve Super amount
	SuperRate = parseFloat($("#CurrSuperText").val());
	NewSuperRate = parseFloat($("#NewSuperText").val());
    if (isNaN(SuperRate)) { SuperRate = 0; }
    if (isNaN(NewSuperRate)) { NewSuperRate = 0; }

    //convert to annual salary based on selected paytype for initial view
	AnnualSalary = ConvertToAnnualSalary(AnnualSalary, "PayType");
	NewAnnualSalary = ConvertToAnnualSalary(NewAnnualSalary, "NewPayType");
	

	if ($("#IncCurrSuperCB").attr("checked")) {
	    AnnualSuperAmount = SuperRate / (100 + SuperRate) * AnnualSalary;
	    //calculate taxable income based on annual salary
        AnnualTaxableIncome = AnnualSalary - AnnualSuperAmount;
    } else {
        AnnualTaxableIncome = AnnualSalary;
        AnnualSuperAmount = SuperRate * AnnualSalary / 100;
        AnnualSalary = AnnualSalary + AnnualSuperAmount;
    }

	if ($("#IncNewSuperCB").attr("checked")) {
	    NewAnnualSuperAmount = NewSuperRate / (100 + NewSuperRate) * NewAnnualSalary;
        //calculate taxable income based on annual salary
	    NewAnnualTaxableIncome = NewAnnualSalary - NewAnnualSuperAmount;
    } else {
        NewAnnualTaxableIncome = NewAnnualSalary;
        NewAnnualSuperAmount = NewSuperRate * NewAnnualSalary / 100;
        NewAnnualSalary = NewAnnualSalary + NewAnnualSuperAmount;
    }

	//display the salary based on selected comparison
	Salary = FormatDecimalCurrency(ComparePerPayType(AnnualSalary, ComparedPay));
	NewSalary = FormatDecimalCurrency(ComparePerPayType(NewAnnualSalary, ComparedPay));

	SuperAmount = FormatDecimalCurrency(ComparePerPayType(AnnualSuperAmount, ComparedPay));
	NewSuperAmount = FormatDecimalCurrency(ComparePerPayType(NewAnnualSuperAmount, ComparedPay));
		
	//calculate tax
	TaxAmount = FormatDecimalCurrency(ComparePerPayType(CalculateTax(AnnualTaxableIncome), ComparedPay));
	NewTaxAmount = FormatDecimalCurrency(ComparePerPayType(CalculateTax(NewAnnualTaxableIncome), ComparedPay));
	
	//Taxable Income
	TaxableIncomeAmount = Salary - SuperAmount;
	NewTaxableIncomeAmount = NewSalary - NewSuperAmount;
	
	//display the calculated current salary
	$("#GrossIncome").html(FormatCurrency(Salary));
	$("#Tax").html(FormatCurrency(TaxAmount));
	$("#Super").html(FormatCurrency(SuperAmount));
	$("#TaxableIncome").html(FormatCurrency(TaxableIncomeAmount));
	var NetIncome = Salary - TaxAmount - SuperAmount;
	$("#NetIncome").html(FormatCurrency(NetIncome));
	
	//display the calculated new salary
	$("#NewGrossIncome").html(FormatCurrency(NewSalary));
	$("#NewTax").html(FormatCurrency(NewTaxAmount));
	$("#NewSuper").html(FormatCurrency(NewSuperAmount));
	$("#NewTaxableIncome").html(FormatCurrency(NewTaxableIncomeAmount));
	var NewNetIncome = NewSalary - NewTaxAmount - NewSuperAmount;
	$("#NewNetIncome").html(FormatCurrency(NewNetIncome));
	
	//display the difference
	$("#DiffGrossIncome").html(FormatCurrency(NewSalary - Salary));
	$("#DiffTax").html(FormatCurrency(NewTaxAmount - TaxAmount));
	$("#DiffSuper").html(FormatCurrency(NewSuperAmount - SuperAmount));
	$("#DiffNetIncome").html(FormatCurrency(NewNetIncome - NetIncome));
	$("#DiffTaxableIncome").html(FormatCurrency(NewTaxableIncomeAmount - TaxableIncomeAmount));
	
	//set the style for the difference
	$("#DiffGrossIncomeRow").removeAttr("class");
	$("#DiffTaxRow").removeAttr("class");
	$("#DiffSuperRow").removeAttr("class");
	$("#DiffNetIncomeRow").removeAttr("class");
	$("#DiffTaxableIncomeRow").removeAttr("class");
	
	$("#DiffGrossIncomeRow").addClass(GetStyle(NewSalary, Salary));
	$("#DiffTaxRow").addClass(GetStyle(NewTaxAmount, TaxAmount));
	$("#DiffSuperRow").addClass(GetStyle(NewSuperAmount, SuperAmount));
	$("#DiffNetIncomeRow").addClass(GetStyle(NewNetIncome, NetIncome));
	$("#DiffTaxableIncomeRow").addClass(GetStyle(NewSalary - NewSuperAmount, Salary - SuperAmount));

 }
// 
 function GetStyle(NewAmount, OldAmount)
 {
	var increasedClassName = "table_right_green";
	var decreasedClassName = "table_right_red";
	var sameClassName = "table_right_black";
	
	//convert to dollar then only set new amount with 2 decimal point
	var newAmt = new String(FormatDecimalCurrency(NewAmount));
	newAmt = parseFloat(newAmt.substr(0, newAmt.lastIndexOf(".") + 3));
	
	//convert to dollar then only set old amount with 2 decimal point
	var oldAmt = new String(FormatDecimalCurrency(OldAmount));
	oldAmt = parseFloat(oldAmt.substr(0, oldAmt.lastIndexOf(".") + 3));

	if (newAmt > oldAmt) {
		className = increasedClassName;
	} else if (newAmt == oldAmt) {
		className = sameClassName;
	} else if (newAmt < oldAmt) {
		className = decreasedClassName;
	}
	
	return className;
 }
 
 function ComparePerPayType(AnnualSalary, PayType) {
     if (typeof (AnnualSalary) == "undefined") {
         AnnualSalary = 0;
     }
	if (PayType == "Year") {
		DisplayCompareText("(per annum)");
		return AnnualSalary;
	} else if (PayType == "Month") {
		DisplayCompareText("(per month)");
		return AnnualSalary / 12;	
	} else if (PayType == "Fortnight") {
		DisplayCompareText("(per fortnight)");
		return AnnualSalary / 26;	
	} else if (PayType == "Week") {
		DisplayCompareText("(per week)");
		return AnnualSalary / 52;	
	} 	
}

function DisplayCompareText(perCompareText)
{
	$("#ComparePayText").html(perCompareText);
}

function ConvertToAnnualSalary(Salary, PayTypeName) {
	PayType = $('#'+PayTypeName).val();
	if (PayType == "Year") {
		return Salary;
	} else if (PayType == "Month") {
		return Salary * 12;	
	} else if (PayType == "Fortnight") {
		return Salary * 26;	
	} else if (PayType == "Week") {
		return Salary * 52;	
	} else if (PayType == "Hour") {
		var Hours = 0;
		if (PayTypeName == "NewPayType") {
			Hours = $("#NewHoursPerWeek").val(); 
		} else {
			Hours = $("#HoursPerWeek").val(); 
		}
		return Salary * Hours * 52;	
	}
}

function CalculateTax(Salary)
{
	//Tax Bracket(MinSalary, MaxSalary, TaxAmount, TaxPercentage)
	//Based on tax rates 2010-2011
	//http://ato.gov.au/individuals/content.asp?doc=/content/12333.htm&mnu=5053&mfp=001
	var TaxBracket = new Array(
		new Array(0, 6000, 0, 0),
		new Array(6000, 37000, 0, 0.15),
		new Array(37000, 80000, 4650, 0.3),
		new Array(80000, 180000, 17550, 0.37),
		new Array(180000, 999999999999999999999, 54550, 0.45)
		);
	
 	var TaxAmount = 0;
	
	$.each(TaxBracket,
		function (index, taxItem)
		{ 
			minIncome = taxItem[0];
			maxIncome = taxItem[1];
			taxOnIncome = taxItem[2];
			taxPercentage = taxItem[3]; 
			
			//get the tax bracket range to calculate the tax amount
			if (Salary > minIncome && Salary <= maxIncome) {
				TaxAmount = taxOnIncome + taxPercentage * (Salary - minIncome);
			}
		}
	)

	return TaxAmount;	
}

function DisplayHoursPerWeek(SelectName, DivName, IsNew)
{
	if ($(SelectName).val() == "Hour" ) {
		ShowField($(DivName));
    } else {
		HideField($(DivName));
	}
}

function DisplayCompareLink(PayType)
{
	$("#SelectedPayType").html(PayType);	
	CalculateSalary(PayType); 
}

function ShowField(element) {
    $(element).show().removeAttr("disabled");
}

function HideField(element) {
    $(element).hide().attr("disabled", "disabled");
}

function SetInitialView()
{
	//by default the form hide the calculator, if browser javascript is enabled, show the calculator
	ShowField($("#calc_layout"));
	ShowField($("#legaltext"));
	
	//hide the result
	HideField($("#calc_results"));
		
	//set the default paytype value
	$("#SelectedPayType").html("Year");

	HideField($("#SuperannuationBox"));

	CalculateSalary($("#SelectedPayType").html());		
	
	//fixed height for non IE browser
	if ($.browser.msie) {
		$("#current_salary").removeClass("current_salary").addClass("current_salary_nonIE");
	}
}

function ShowResult(valid, btn)
{
    var result = CheckValid(); // $("#SalaryCalculator .required").validator({ position: 'Bottom Centre' });
	if (result) {
		ShowField($("#calc_results"));
		CalculateSalary($("#SelectedPayType").html()); 
	}
}

function ManageSuperBox(checkBoxType)
{
    var superPercent = "9";
    if (checkBoxType == "all") {
        // this is for reset all checkboxes
        $("#CurrSuperText").val(superPercent);
        $("#NewSuperText").val(superPercent);
        $("#CurrSuperText").attr("disabled", false);
        $("#NewSuperText").attr("disabled", false);
    }
}

function CheckValid() {

    var hasErrors = false;

    if ($("#CurrentSalary").val() === '') {
        ShowField($("#advice-required-CurrentSalary"));
        hasErrors = true;
    } else {
        HideField($("#advice-required-CurrentSalary"));
    }

    if ($("#NewSalary").val() === '') {
        ShowField($("#advice-required-NewSalary"));
        hasErrors = true;
    } else {
        HideField($("#advice-required-NewSalary"));
    }

    if ($("#PayType").val() === '') {
        ShowField($("#advice-required-PayType"));
        hasErrors = true;
    }
    else {
        HideField($("#advice-required-PayType"));
    }

    if ($("#NewPayType").val() === '') {
        ShowField($("#advice-required-NewPayType"));
        hasErrors = true;
    } else {
        HideField($("#advice-required-NewPayType"));
    }

    if ($("#DivHour").attr("disabled") !== 'disabled'
        && $("#HoursPerWeek").val() === '') {
        ShowField($("#advice-required-HoursPerWeek"));
        hasErrors = true;
    } else {
        HideField($("#advice-required-HoursPerWeek"));
    }

    if ($("#NewDivHour").attr("disabled") !== 'disabled'
        && $("#NewHoursPerWeek").val() === '') {
        ShowField($("#advice-required-NewHoursPerWeek"));
        hasErrors = true;
    } else {
        HideField($("#advice-required-NewHoursPerWeek"));
    }

    return ! hasErrors;

}

$(function () {

    //set initial view
    SetInitialView();

    $("#PayType").change(function () { DisplayHoursPerWeek("#PayType", "#DivHour", false); });
    $("#NewPayType").change(function () { DisplayHoursPerWeek("#NewPayType", "#NewDivHour", true); });

    $("#btnCalculate").click(function () { ShowResult($("#btnCalculate")); });

    $("#IncCurrSuperCB").click(function () { ManageSuperBox("current"); });
    $("#IncNewSuperCB").click(function () { ManageSuperBox("new"); });

    $("#rdoYear").click(function () {
        DisplayCompareLink("Year");
    });

    $("#rdoMonth").click(function () {
        DisplayCompareLink("Month");
    });

    $("#rdoFortNight").click(function () {
        DisplayCompareLink("Fortnight");
    });

    $("#rdoWeek").click(function () {
        DisplayCompareLink("Week");
    });

    //reset the form
    $("#startAgain").click(function () {
        SetInitialView();
        $(document.forms)[0].reset();

        HideField($("#DivHour"));
        HideField($("#NewDivHour"));
        HideField($("#calc_results"));
        ManageSuperBox("all");
    });

    //if coming from flash banner
    //then process the query string, assign value to controls and validate
    //if querystring values are valid, show the result otherwise show error message

    var qString = window.location.search.substr(1, window.location.search.length).split("&");
    var hasQueryParams = 0;

    for (var i = 0; i < qString.length; i++) {
        if (escape(unescape(qString[i].split("=")[0])) == "curr_amt") {
            $("#CurrentSalary").val(qString[i].split("=")[1]);
            hasQueryParams++;
        }
        if (escape(unescape(qString[i].split("=")[0])) == "new_amt") {
            $("#NewSalary").val(qString[i].split("=")[1]);
            hasQueryParams++;
        }
        if (escape(unescape(qString[i].split("=")[0])) == "curr_paytype") {
            $("#PayType").val(qString[i].split("=")[1]);
            hasQueryParams++;
        }
        if (escape(unescape(qString[i].split("=")[0])) == "new_paytype") {
            $("#NewPayType").val(qString[i].split("=")[1]);
            hasQueryParams++;
        }

    }

    if (hasQueryParams === 4) {
        ShowResult($("#btnCalculate"));
    }
});

