function ANZCalculator() {

	// ###############################################################################################################
	//	VARIABLES
	// ###############################################################################################################
	
	// You only need to modify the location of the XML file in the variable below, everything else can remain unchanged
	settings = {
		title: '',
		version: '',
		disclaimer: '',
		copyright: '',
		assumptions: '',
		xml: 'xml/config.xml'
	}
	
	variables = {
		maxpages: 5,
		minpages: 0,
		calcpage: 5,
		curpage: 0,
		pages: {
			page0: {
				callback: page0_Validate,
				load: page0_Load
			},
			page1: {
				callback: page1_Validate,
				load: page1_Load
			},
			page2: {
				callback: page2_Validate,
				load: page2_Load
			},
			page3: {
				callback: page3_Validate,
				load: page3_Load
			},
			page4: {
				callback: page4_Validate,
				load: page4_Load
			},
			page5: {
				load: page5_Load
			}
		}
	}
	
	xml_content = '';
	
	datafields = {}
	calcvars = {}
	vartables = {}
	
	results = {
		preTTRTax: '0',
		preTTRBal: '0',
		maxDepositAmount: '0',
		afterTax: '2',
		afterTaxAmount: '0',
		withdrawl: '0'
	}
	
	maxDeposits = {};
	
	popup = '';
	popupcontent = '';
	
	
	// ###############################################################################################################
	//	CALCULATOR FUNCTIONS
	// ###############################################################################################################
	
	function calcSG(income, pct) {
		var maxSgSal = calcvars.maxSGSalary.value;
		var sgCont = calcvars.SGContribution.value;
		var tempInc = 0;
		if(income>maxSgSal){
			tempInc = maxSgSal;
		}else{
			tempInc = income;
		}
		var temp = tempInc*(pct/100);	
		if(temp > (maxSgSal*sgCont)){
			temp = (maxSgSal*sgCont);
		}
		return temp;
	}
	
	function setPercentageContributed() {
		var sgDec = parseFloat($('#percentSG').val())/100;
		if (isNaN(sgDec)) sgDec = 0;
		var sgAmount = calcSG(GetFieldVal('grossSalary'),$('#percentSG').val());
		$('#sgDecimal').val(sgDec);
		$('#sgAmount').val(sgAmount);
	}
	
	function setPossibleIncome() {
		var sb = parseFloat(GetFieldVal('superBalance'));
		var pmi = '0.00';
		var pmx = '0.00';
		if (sb) {
			var agePct = GetTableVal('pensionValues','age',GetFieldVal('currentAge'),'min');
			var maxPensionWD = GetCalcVar('maxPensionWithdrawl');
			var tmp1 = Math.round(sb*agePct);
			var tmp2 = Math.round(sb*maxPensionWD);
			pmi = Math.round(tmp1*100)/100;
			pmx = Math.round(tmp2*100)/100;
		} else {
			pmi = '0.00';
			pmx = '0.00';
		}
		$('#possibleMinimum').val(pmi);
		$('#possibleMaximum').val(pmx);
		ValidateInput('#possibleMinimum');
		ValidateInput('#possibleMaximum');
	}

	function newSuperBal(income, sgpct, salSac, afterTax, superBal, effect, fromPension, currentYear) {
		var net = superDeposit(income, sgpct, salSac, effect, currentYear)*(1-GetCalcVar('superTaxPercent'));
		var after = afterTax;
		var growth = 0;
		var sb = afterTax+superBal+net;
		for(var a=1;a<=12;a++){
			growth = sb*(GetFieldVal('investorType')/12);
			sb += growth;
		}
		var iGrow = (superBal+net)*GetCalcVar('superIncomeGrowth');
		var tax = iGrow*GetCalcVar('superTaxPercent');
		var withdrawal = results.withdrawal;
		var coCont = 0;
		if(afterTax || afterTax > 0){
			if(fromPension){
				coCont = coContributions(income+withdrawal, sgpct, salSac, afterTax, superBal, effect);
			}else{
				coCont = coContributions(income, sgpct, salSac, afterTax, superBal, effect);
			}
		}else{
			coCont = 0;
		}
		
		return Math.round(sb+iGrow-tax);
	}
	
	
	
	function superDeposit(income, sgpct, salSac, effect, currentYear) {
		var inc = 0;
		if (effect) {
			inc = income - salSac;
		} else {
			inc = income;
		}
		var sg = calcSG(inc, sgpct);
		if(salSac || salSac > 0){
			sg += salSac
		}
		// ISSUE HERE----
		//new super deposit max changes calc
		if(GetSuperDeposit(currentYear)){
			results.maxDepositAmount = parseFloat(GetSuperDeposit(currentYear));
		}
		if(sg>results.maxDepositAmount){
			sg = results.maxDepositAmount;
		}
		return sg;
	}
	
	function coContributions(income, sgpct, salSac, afterTax, superBal, effect) {
		var a = income-salSac;
		var maxThresh = GetCalcVar('coContributionMax');
		var minThresh = GetCalcVar('coContributionMin');
		var depPct = GetCalcVar('coContributionPercent');
		var maxDep = GetCalcVar('coContributionMaxAmount');
		var reductionAmount = GetCalcVar('coContributionReductionAmount');

		if(a > maxThresh){
			return 0;
		}else if(a <= minThresh){
			return afterTax*depPct;		
		}else{
			var r = maxDep-((income-minThresh)*reductionAmount);
			if(r > 0){
				return r;
			}else{
				return 0;
			}
		}
	}
	
	function totalTaxWithRebates(income, withPension) {
		var temp1 = totalTax(income, withPension);
		var temp2 = findRebates(income, withPension);
		return temp1 - temp2;
	}

	function totalTax(income, withPension) {
		var pensionTaxable = 0;
		if (withPension) {
			pensionTaxable = getTaxablePension(GetFieldVal('superBalance', true), GetFieldVal('nominatedIncome', true), GetFieldVal('taxFreeComponentAmount', true), GetFieldVal('currentAge', true));
		} else {
			pensionTaxable = 0;
		}
		var inct = incomeTax(income+pensionTaxable)+medicareLevy(income+pensionTaxable);
		return inct;
	}
	
	function findTaxTableRow(income) {
		var ret;
		var d;
		$(vartables.taxTable).each(function(i,n) {
			var amount = n.IncomeAmount;
			if (income >= amount) {
				ret = n;
			}
			d = n;
		});
		var tr = (ret ? ret : d);
		return tr;
	}
	
	
	function findTaxBracket(income) {
		var row = findTaxTableRow(income);
		return row.bracket;
	}
	function findTaxDifference(income) {
		var row = findTaxTableRow(income);
		return income-row.IncomeAmount;
	}
	function findTaxPercent(income) {
		var row = findTaxTableRow(income);
		return row.taxPercent;
	}
	
	function getTaxablePension(superBal, widthdrawal, exempt, age) {
		var t = 0;
		if(age < GetCalcVar('pensionRebateCutoff')){
			t = ((superBal-exempt)/superBal)*widthdrawal;
		}else{
			t = 0;
		}
		return t;
	}
	
	function findRebates(income, withPension) {
		var rebate = 0;
		var pensionTaxable = 0;
		// LOW INCOME REBATE
		if (withPension) {
			pensionTaxable = getTaxablePension(GetFieldVal('superBalance', true), GetFieldVal('nominatedIncome', true), GetFieldVal('taxFreeComponentAmount', true), GetFieldVal('currentAge'));
		}else{
			pensionTaxable = 0;
		}
		var asessable = income+pensionTaxable;
		var temp = 0;
		if(asessable<=GetCalcVar('lowIncomeOffestHigh')){
			temp = GetCalcVar('lowIncomeOffset')-((asessable-GetCalcVar('maxOffsetIncomeLow'))*GetCalcVar('offsetPhaseoutPercent'));
			rebate += temp;
		}
		// PENSION REBATE
		var temp2 = 0;
		if(GetFieldVal('currentAge') < GetCalcVar('pensionRebateCutoff')){
			temp2 = pensionTaxable*GetCalcVar('pensionRebatePercent');
			rebate += temp2;
		}
		
		// MATURE AGE REBATE
		var temp1 = matureAgeRebate(income-GetFieldVal('furtherIncomeAmount'));
		rebate += temp1;
		return rebate;
	}
	
	function matureAgeRebate(income) {
		if(income<GetCalcVar('matureWorkerOffsetLow')){
			return income*GetCalcVar('matureWorkerLowOffsetPercent');
		}else if(income<GetCalcVar('matureWorkerOffMid')){
			return GetCalcVar('matureWorkerOffset');
		}else if(income<GetCalcVar('matureWorkerOffHigh')){
			return GetCalcVar('matureWorkerOffset')-((income-GetCalcVar('matureWorkerOffMid'))*GetCalcVar('matureWorkerMidOffsetPercent'));		
		}else{
			return 0;
		}
	}
	
	function incomeTax(income) {
		var temp1 = findTaxBracket(income);
		var temp2 = findTaxDifference(income);
		var temp3 = findTaxPercent(income);
		
		var ict = parseFloat(temp1)+(parseFloat(temp2)*parseFloat(temp3));
		
		return ict;
	}
	function medicareLevy(income) {
		return income*GetCalcVar('medicare');
	}
	
	function GetSuperDeposit(y) {
		var ret = false;
		$(vartables.maxSuperDeposits).each(function(i,n) {
			if (n.year == y) ret = n.amount;
		});
		return ret;
	}
	
	function netIncome(income, withPension) {
		var temp = Math.round(income-totalTaxWithRebates(income, withPension));
		return temp;
	}
	
	function calcNewSG(num, stopCall) {
		var sgPct = GetFieldVal('percentSG', true);
		var grossSal = GetFieldVal('grossSalary', true);
		var totalSalSac = GetFieldVal('totalSalSacAmount', true);
		if (num==1) {
			var sgAmount = calcSG((grossSal-totalSalSac), sgPct)
			$('#sgAmount').val(sgAmount);
		} else if(num==2) {
			var sgAmount = calcSG(grossSal, sgPct);
			$('#sgAmount').val(sgAmount);
		}
		if (!stopCall) {
			calcNetIncome();
		}
	}
	
	function totalTaxSavings() {
		return results.preTTRTax - results.postTTRTax;
	}
	
	function calcNetIncome() {
		var sgAmount = GetFieldVal('sgAmount', true);
		var pensionWithdrawal = GetFieldVal('nominatedIncome', true);
		var oldGross = GetFieldVal('totalIncome', true) - GetFieldVal('currentSalSacAmount', true);
		var newGross = GetFieldVal('totalIncome', true) - GetFieldVal('totalSalSacAmount', true);
		var pensionWithdrawal2 = 0;
		if(GetFieldVal('currentAge') < GetCalcVar('pensionRebateCutoff')) {
			pensionWithdrawal2 = getTaxablePension(GetFieldVal('superBalance', true), GetFieldVal('nominatedIncome', true), GetFieldVal('taxFreeComponentAmount', true), GetFieldVal('currentAge', true));
		}else{
			pensionWithdrawal2 = 0;		
		}
		var assessableGross = GetFieldVal('totalIncome', true) - GetFieldVal('totalSalSacAmount', true) + pensionWithdrawal2;
		$('#assessableGross').val(assessableGross);
		var salSacLessSg = GetFieldVal('totalSalSacAmount', true) + sgAmount;
		$('#salSacLessSg').val(salSacLessSg);
		var totalNetIncome = netIncome(oldGross, false);
		$('#totalNetIncome').val(totalNetIncome);
		var newNetIncome = netIncome(newGross, true) + pensionWithdrawal;
		$('#newNetIncome').val(newNetIncome);
		
		// Outputs
		calcNewSG(GetFieldVal('salSacEffect', true), true);
	}
	
	function page5_Load() {
		// Perform calculations & graph
		var d1 = new Array();
		var d2 = new Array();
		
		// PRE TTR Plots
		// --------------------------------------------
		var a = GetFieldVal('grossSalary', true);
		var b = GetFieldVal('percentSG', true);
		var c = GetFieldVal('currentSalSacAmount', true);
		var d = GetFieldVal('afterTaxAmount', true);
		var e = GetFieldVal('superBalance', true);
		var f = (GetFieldVal('salSacEffect') == 2) ? false : true;
		
		var current = GetFieldVal('currentAge', true);
		var retire = GetFieldVal('retireAge', true);
		
		var date = new Date();
		var currentYear = date.getFullYear();
		
		results.maxDepositAmount = GetCalcVar('maxSuperDeposit');
		
		var tax = 0;
	
		var oldGross = GetFieldVal('totalIncome', true) - GetFieldVal('currentSalSacAmount', true);
		
		for (var i=current; i<=retire; i++) {
			if (i > current) {
			    if(i > current+1){
				    a = a + (a * GetCalcVar('incomeGrowth'));
				    c = c + (c * GetCalcVar('incomeGrowth'));
				}
				currentYear++;
				var newBal = newSuperBal(a, b, c, d, e, f, false, currentYear);
			} else {
				var newBal = GetFieldVal('superBalance', true);
			}
			e = newBal;
			var o = [i, e];
			d2.push(o);
		}
		
		results.preTTRTax = totalTaxWithRebates(oldGross);
		results.preTTRBal = newBal;
		
		
		// POST TTR Plots
		// -------------------------------------------------
		
		var a = GetFieldVal('grossSalary', true);
		var b = GetFieldVal('percentSG',true);
		var c = GetFieldVal('totalSalSacAmount', true);
		var d = GetFieldVal('afterTaxAmount', true);
		var e = 0;
		var f = false;
		if(GetFieldVal('salSacEffect') == 2){
			f = false;
		}else{
			f = true;
		}
		var g = GetFieldVal('superBalance', true);
		
		var current = GetFieldVal('currentAge', true);
		var retire = GetFieldVal('retireAge', true);
		
		var date = new Date();
		var currentYear = date.getFullYear();
		
		results.maxDepositAmount = GetCalcVar('maxSuperDeposit');	
		
		var tax = 0;
		var newGross = GetFieldVal('totalIncome', true) - GetFieldVal('totalSalSacAmount', true);
		for(var i=current; i<=retire; i++){
			if(i>current){
			    if(i > current+1){
				    a += (a * GetCalcVar('incomeGrowth'));
				    c += (c * GetCalcVar('incomeGrowth'));
				}
				currentYear++;
			
				var newBal2 = newPenBal(g, i);
				var newBal = newSuperBal(a, b, c, d, e, f, true, currentYear);
			} else {
				var newBal = 0;
				var newBal2 = GetFieldVal('superBalance', true);
				results.withdrawal = GetFieldVal('nominatedIncome', true);
			}
			// Set the value here
			var o = [i, newBal+newBal2];
			d1.push(o);
			e = newBal;
			g = newBal2;
		}
		results.postTTRTax = totalTaxWithRebates(newGross+widthdrawalTaxable(g, GetFieldVal('taxFreeComponentAmount', true), results.withdrawal));
		results.postTTRBal = newBal+newBal2;
		
		$('#BeforeTTRNet').html("$"+GetFieldVal('totalNetIncome'));
		$('#AfterTTRNet').html("$"+GetFieldVal('newNetIncome'));
		$('#BeforeTTRSuper').html("$"+results.preTTRBal + "<div style=\"float: left; background: #9a8c7d; margin-top: 4px\">&nbsp; &nbsp;</div>");
		$('#AfterTTRSuper').html("$"+results.postTTRBal + "<div style=\"float: left; background: #f28d1d; margin-top: 4px\">&nbsp; &nbsp;</div>");	
		
		drawGraph(d1, d2);
		
		$('div.gridLabel').each(function() {
			var name = $(this).text();
			var spn = name.split('.');
			if (spn[1] > 1) {
				if (spn[1] != '00') {
					$(this).text(' ');
				} else {
					$(this).text(spn[0]+'a');
				}
			}
		});
	}
	
	function widthdrawalTaxable(balance, exempt, withdrawal) {
		return ((balance-exempt)/balance)*withdrawal;
	}
	
	function newPenBal(penBal, age) {
		var growth = 0;
		var pb = penBal;
		for(var a=1;a<=12;a++){
			growth = pb*(GetFieldVal('investorType', true)/12);
			pb += growth;
		}
		var iGrow = penBal*GetCalcVar('superIncomeGrowth');
		var withdrawal = newPenWithdrawal(penBal, age);
		return Math.round(pb+iGrow-withdrawal);
	}
	
	/*

	*/

	function newPenWithdrawal(penBal, age) {
		var w = 0;
		if(results.withdrawal){
			w = results.withdrawal;
		} else {
			w = GetFieldVal('nominatedIncome', true);
		}
		if(age>=GetCalcVar('unlimitedWithdrawlAge')){
			w = GetFieldVal('nominatedIncome', true);
		} else {
			var pctBal = Math.round(penBal*GetCalcVar('maxPensionWithdrawl', true));
			var current = GetFieldVal('currentAge', true);
			if(age > current+1){
			    var w = Math.round(w+(w*GetCalcVar('incomeGrowth', true)));
			}
			if(w>pctBal){
				w = pctBal;
			}
		}
		results.withdrawal = w;
		return w;
	}
	// ###############################################################################################################
	//	RUNTIME
	// ###############################################################################################################
	
	init();
	
	function init() {
		// Parse the XML and fill all the variables
		$.ajax({
			type: 'GET',
			url: settings.xml,
			dataType: 'xml',
			success: function(xml) {
				
				xml_content = xml;
				// Set first level app variables
				settings.title = $(xml).find('title').eq(0).text();
				settings.version = $(xml).find('version').eq(0).text();
				settings.disclaimer = $(xml).find('disclaimer').eq(0).text();
				settings.copyright = $(xml).find('copyright').eq(0).text();
				settings.assumptions = $(xml).find('assumptions').eq(0).text();
				settings.homeDisclaimer = $(xml).find('homedisclaimer').eq(0).text();
				settings.resultsDisclaimer = $(xml).find('resultsdisclaimer').eq(0).text();
				
				
				// Get all the datafields to fill the selections
				$(xml).find('datafields').find('field').each(function() {
					var ce = $(this);
					var id = ce.attr('id');
					datafields[id] = {};
					datafields[id].type = $(this).attr('type');
					
					ce.find('custom param').each(function() {
						datafields[id][$(this).attr('name')] = $(this).text();
					});

					ce.find('validation').each(function() {
						datafields[id].validation = {} 
						datafields[id].validation.output = $(this).find('output').text();
					});
				});
				
				// Get all the calcvars for reference
				$(xml).find('calcvars var').each(function() {
					var ce = $(this);
					var id = ce.attr('id');
					calcvars[id] = {};
					calcvars[id].value = ce.find('value').text();
				});
				
				// Setup the variable tables
				$(xml).find('calcvars vartable').each(function() {
					var ce = $(this);
					var id = ce.attr('id');
					vartables[id] = [];
					ce.find('row').each(function(i,n) {
						vartables[id][i] = {};
						$(this).find('column').each(function(j,k) {
							vartables[id][i][$(this).attr('id')] = $(this).text();
						});
					});
				});
				
				//$().log(datafields);
				//$().log(calcvars);
				//$().log(vartables);
			
				// Build the page
				buildPage();
			},
			error: function(XMLHttpRequest, textStatus, errorThrown) {
				//$().log("There was an error retrieving the data");
				// Error
				buildErrorPage(textStatus);
			}
		});
	}
	
	function buildErrorPage(e) {
		// Error page to go here if can't find XML
	}
	
	function toggleAssumptions() {
		var ass = $("#Assumptions").css("display");
		var calc = $("#CalculatorHolder").css("display");
		if (ass == "block") {
			$("#Assumptions").hide();
			$("#CalculatorHolder").show();
		} else {
			$("#Assumptions").show();
			$("#CalculatorHolder").hide();
		}
	}
	
	function buildPage() {
		
		// Generic settings and clicks, build in javascript so it's less intrusive in the code (and we can hide it :D)
		document.title = settings.title;
		$('#Back').css('display', 'none');
	
		// Attach events to the next/prev buttons
		$("a[rel='Next']").click(function() {
			Next();
		});
		$("a[rel='Calculate']").click(function() {
			Next();
		});
		$("a[rel='Back']").click(function() {
			Back();
		});
		
		$("#StartAgain").click(function() {
			ResetForm();
		});
		
		$('#Print').click(function() {
			window.print();
		});
		
		// Do checks on inputs
		$("input").keyup(function() {
			ValidateInput(this);
		});
		
		$("#AssumptionsLink").click(function() {
			toggleAssumptions();
		});
		$("#Assumptions").html(settings.assumptions + "<br /><a href=\"javascript:void(0)\" id=\"AssumptionsBack\">Back to TTR Calculator</a>").hide();
		
		$("#AssumptionsBack").click(function() {
			toggleAssumptions();
		});
		
		$("#HomeDisclaimer").html(settings.homeDisclaimer);
		$("#FooterDisclaimer").html(settings.homeDisclaimer);
		$("#ResultsDisclaimer").html(settings.resultsDisclaimer);
		
		// Attach notes
		
		$("a[rel*='^note']").each(function(i,n) {
			$(this).click(function() {
				var name = $(this).attr('rel');
				var name = name.split('^')[0];
				var inner = $(xml_content).find('datafields').find('field[id='+name+']').find('detailedhelp').text();
				popup = window.open("popup.html",'notehelp',
					"height=400,width=400,status=yes,toolbar=no,menubar=no,location=no,scrollbars=yes");
				inner = inner + "<a href=\"javascript: window.close()\"><img src=\"images/bg_close.gif\" alt=\"\" /></a>";
				popupcontent = inner;
				
				delay = setTimeout(loadpopupcontent,500);
			});
		});
		
		//$().log(xml_content);
		
		// PAGE 1 // ==================================================
		
		// Current Age
		for (var i = datafields.currentAge.minValue; i <= datafields.currentAge.maxValue; i++) {
			$('#currentAge').append("<option value=\""+i+"\">"+i+"</option>");
		}
		
		
		// Retire Age
		for (var i = datafields.retireAge.minValue; i <= datafields.retireAge.maxValue; i++) {
			$('#retireAge').append("<option value=\""+i+"\">"+i+"</option>");
		}
		
		
		// Further income click event
		$("#furtherIncome").click(function() {
			if ($(this).val() == "1") {
				$('#furtherIncomeAmount').attr('disabled','');
			} else {
				$('#furtherIncomeAmount').attr('disabled','disabled');
			}
		});
		
		// PAGE 2 // ==================================================
		
		// Type of investor
		$(vartables.estimatedInvestmentReturns).each(function() {
			$('#investorType').append("<option value=\""+this.returnPercent+"\">"+this.option+"</option>");
		});
		
		// Employer super contribution click event
		$("#moreSG").click(function() {
			if ($(this).val() == "1") {
				$('#percentSG').attr('disabled','');
			} else {
				$('#percentSG').attr('disabled','disabled');
			}
		});
		
		// Convert stuff when percent is entered
		$('#percentSG').keyup(function() {
			setPercentageContributed();
		});
		
		// PAGE 3 // ==================================================
		
		$('#superBalance').keyup(function() {
			setPossibleIncome();
		});
		
		$('#taxFreeComponent').click(function() {
			if ($(this).val() == "1") {
				$('#taxFreeComponentAmount').attr('disabled','');
			} else {
				$('#taxFreeComponentAmount').attr('disabled','disabled');
			}
		});
		
		// PAGE 4 // ==================================================
		
		$('#currentSalSac').click(function() {
			if ($(this).val() == "1") {
				$('#currentSalSacAmount').attr('disabled','');
				
				$('#wantSalSacHolder1').hide();
				$('#wantSalSacHolder2').hide();
				
				$('#increaseSalSacHolder1').show();
				$('#increaseSalSacHolder2').show();
			} else {
				$('#currentSalSacAmount').attr('disabled','disabled');
				
				$('#wantSalSacHolder1').show();
				$('#wantSalSacHolder2').show();
				
				$('#increaseSalSacHolder1').hide();
				$('#increaseSalSacHolder2').hide();
			}
		});
		
		$('#increaseSalSac').click(function() {
			if ($(this).val() == "1") {
				$('#increaseSalSacAmount').attr('disabled','');
			} else {
				$('#increaseSalSacAmount').attr('disabled','disabled');
			}
		});
		
		$('#wantSalSac').click(function() {
			if ($(this).val() == "1") {
				$('#wantSalSacAmount').attr('disabled','');
			} else {
				$('#wantSalSacAmount').attr('disabled','disabled');
			}
		});
		
		$('#salSacEffect').click(function() {
			checkSalSac();
		});
		$('#increaseSalSac').click(function() {
			checkSalSac();
		});
		$('#wantSalSac').click(function() {
			checkSalSac();
		});
		$('#increaseSalSacAmount').keyup(function() {
			checkSalSac();
		});
		$('#wantSalSacAmount').keyup(function() {
			checkSalSac();
		});
		
		// LOAD! //  ==================================================
		
		ResetForm();
	}
	
	function loadpopupcontent() {
		var pc = popup.document.getElementById('PopupContent');
		$(pc).html(popupcontent);
	}
	
	function checkSalSac() {
		var v = "0.00";
		if (GetFieldVal('currentSalSac') != 1) {
			v = GetFieldVal('wantSalSacAmount', true);
		} else {
			var ex = 0;
			if (GetFieldVal('increaseSalSac') == 1) {
				ex = GetFieldVal('increaseSalSacAmount', true);
			}
			v = GetFieldVal('currentSalSacAmount', true) + ex;
		}
		
		$('#totalSalSacAmount').val(v);
	}
	
	function ResetForm() {
		variables.curpage = 0;
		// Reset header and footer
		$("#Footer").css("background-image","url(images/footer.gif)");
		$("#StartAgain").hide();
		$("#Calculate").hide();
		$("#Close").hide();
		$("#CalcBack").hide();
		$("#Next").show();
		$("#Print").hide();
		
		// Reset listbox selections
		$("#retireAge")[0].selectedIndex = 0;
		$("#currentAge")[0].selectedIndex = 0;
		$("#furtherIncome")[0].selectedIndex = 0;
		$("#investorType")[0].selectedIndex = 0;
		$("#moreSG")[0].selectedIndex = 0;
		$("#taxFreeComponent")[0].selectedIndex = 0;
		$("#salSacEffect")[0].selectedIndex = 0;  
		$("#increaseSalSac")[0].selectedIndex = 0;
		$("#wantSalSac")[0].selectedIndex = 0;
		$("#currentSalSac")[0].selectedIndex = 0;
		$("#taxFreeComponent")[0].selectedIndex = 0;
		
		$('#taxFreeComponentAmount').attr('disabled','disabled');
		$('#percentSG').attr('disabled','disabled');
		
		$('#currentSalSac')[0].selectedIndex = 0;
		$('#currentSalSacAmount').val('0.00');
		
		$('#increaseSalSacAmount').val('0.00');
		$('#increaseSalSacHolder1').hide();
		$('#increaseSalSacHolder2').hide();
		$('#increaseSalSac')[0].selectedIndex = 0;
		
		$('#wantSalSacAmount').val('0.00');
		$('#wantSalSacHolder1').show();
		$('#wantSalSacHolder2').show();
		$('#wantSalSac')[0].selectedIndex = 0;
		
		$('#taxFreeComponentAmount').val('0.00');
		$('#furtherIncomeAmount').val("0.00");
		$('#grossSalary').val("0.00");
		$('#totalIncome').val("0.00");
		$('#percentSG').val("9");
		$('#sgDecimal').val("0.00");
		$('#sgAmount').val("0.00");
		$('#superBalance').val("0.00");
		$('#nominatedIncome').val("0.00");
		$('#possibleMinimum').val("0.00");
		$('#possibleMaximum').val("0.00");
		$('#totalSalSacAmount').val("0.00");
		$('#afterTaxAmount').val("0.00");
		
		// Reset the values
		results.preTTRTax = 0;
		results.preTTRBal = 0
		results.maxDepositAmount = 0;
		results.afterTax = '2';
		results.afterTaxAmount = '0';
		showPage(0);
	}
	
	// ###############################################################################################################
	//	PAGE FUNCTIONALITY
	// ###############################################################################################################
	
	function GetFieldVal(v,f) {
		var k = ($('#'+v).val()) ? (f ? parseFloat($('#'+v).val()) : $('#'+v).val()) : null;
		var k2 = (isNaN(k) ? 0 : k);
		return k2;
	}
	
	// Get a value from a vartable
	// GetTableVal(<table name>, <column>, <value>, <return column>)
	// eg. GetTableVal('pensionValues','age',55, 'min') returns 0.04
	function GetTableVal(arr, c, v, rc) {
		var rv = null;
		$(vartables[arr]).each(function(i,n) {
			if (n[c] == v) {
				rv = n[rc];
			} 
		});
		return parseFloat(rv);
	}
	
	function GetCalcVar(v) {
		return calcvars[v].value ? parseFloat(calcvars[v].value) : null;
	}
	
	function IsNull(v) {
		if ((v == null) || (v == '')) return true;
		return false;
	}
	
	function ValidateInput(inp) {
		var id = $(inp).attr('id');
		var val = $(inp).val();
		switch (datafields[id].type) {
			case "currency":
				// Do format
				var newval = parseFloat(val);
				if (!isNaN(newval) && ((val.indexOf('.') + 1) != val.length)) {
					$(inp).val(Math.round(newval*100)/100);
				}
				break;
		}
	}
	
	function Next() {
		var r = doCallback('next');
		if (r) {
			if (variables.curpage < variables.maxpages) {
				variables.curpage++;
				$('#Back').css('display','block');
				showPage(variables.curpage);
			}
			if (variables.curpage == variables.maxpages) {
				$('#Next').css('display',"none");
			}
		}
	}
	
	function Back() {
		var r = doCallback('back');
		if (r) {
			if (variables.curpage > variables.minpages) {
				variables.curpage--;
				$('#Next').css('display','block');
				showPage(variables.curpage);
			}
			if (variables.curpage == variables.minpages) {
				$('#Back').css('display',"none");
			}
		}
	}
	
	function doCallback(way) {
		// Trigger the callback function if it exists
		var ErrorMessage = "";
		$("#ErrorPanel").css('display',"none");
		if (way == 'next') {
			if (variables.pages['page'+variables.curpage]) {
				var r = variables.pages['page'+variables.curpage].callback();
				if (r.pass == false) {
					ErrorMessage = "The following error(s) occured<br />";
					$(r.errors).each(function(i,n) {
						ErrorMessage += "<span class=\"error\"><div style=\"float: left; margin-top: 1px\"><img src=\"images/cross.gif\" alt=\"Cross\" /></div> "+n+"<div class=\"clear\"></div></span>";
					});
					$("#ErrorPanel").html(ErrorMessage);
					$("#ErrorPanel").css('display','block');
				}
				return r.pass;
			}
		} else {
			return true;
		}
	}
	
	showPage = function(id) {
		var ids = [0,1,2,3,4,5];
		for (var i=0; i<=ids.length; i++) {
			if (i != id) {
				$('#Page'+i).css("display","none");
			} else {
				$('#Page'+id).css("display","block");
			}
		}
		$('#Print').hide();
		// Change the page number text
		var pn = '';
		if ((id > 0) && (id < 5)) {
			pn = id + ' of ' + (variables.maxpages - 1);
			$("#Footer").css("background-image","url(images/footer.gif)");
			$("#StartAgain").hide();
			$("#Calculate").hide();
			$("#Close").hide();
			$("#CalcBack").hide();
			if (variables.pages['page'+variables.curpage]) {
				variables.pages['page'+variables.curpage].load();
			}
		}
		if (id == 4) {
			// Show calculate / back
			$("#Next").hide();
			$("#Back").show();
			$("#Calculate").show();
		} else if (id == 5) {
			// Show start again / close
			$("#Footer").css("background-image","url(images/footer_calc.gif)");
			$("#Calculate").hide();
			$("#Back").hide();
			$("#StartAgain").show();
			$("#CalcBack").show();
			$("#Close").show();
			$("#Print").show();
			variables.pages.page5.load();
		}
		if (id == 5) {
			$('#Content').css('width', '479px');
			$('#Content').css('padding', '20px 30px 20px 10px');
		} else {
			$('#Content').css('width', '449px');
			$('#Content').css('padding', '20px 30px 20px 40px');
		}
		
		$('#PageNumbers').text(pn);
	}
	
	// Public Functions
	drawGraph = function(d1, d2) {
		var options = {
			lines: { show: true, lineWidth: 3 },
			colors: ["#9a8c7d","#f28d1d"]
		};

		$.plot($("#Graph"), [d2, d1], options);
	}
	
	function page0_Validate() {
		return { pass: true };
	}
	
	function page1_Validate() {
		var Errors = [];
		if (GetFieldVal('currentAge') >= GetFieldVal('retireAge')) {
			Errors.push(datafields.retireAge.validation.output);
		}
		if (parseFloat(GetFieldVal('grossSalary')) < 1) {
			Errors.push("You must have a salary");
		}
		if ($('#furtherIncomeAmount').attr('disabled') != true) {
			if ($('#furtherIncomeAmount').val() < 1) {
				Errors.push("Your total income must be more than $0");
			} 
		}
		if (!GetFieldVal('furtherIncome')) {
			Errors.push("Select Yes/No for do you wish to receive any income from other investments?");
		}

		var pass = true;
		if (Errors.length > 0) pass = false;
		else {
			var totInc = GetFieldVal('grossSalary', true);
			if ($('#furtherIncomeAmount').attr('disabled') != true) totInc = totInc + GetFieldVal('furtherIncomeAmount', true);
			$('#totalIncome').val(totInc);
		}
		return { pass: pass, errors: Errors };
	}
	
	function page2_Validate() {
		var Errors = [];
		if (!GetFieldVal('investorType')) {
			Errors.push("What type of investor are you?");
		}
		if ((!GetFieldVal('moreSG')) || (GetFieldVal('percentSG') < 9)) {
			Errors.push("Percentage contributed by employer cannot be less than 9%. Please ammend the Percentage contributed by employer.");
		}
		var pass = true;
		if (Errors.length > 0) {
			pass = false;
		} else {
			setPercentageContributed();
		}
		return { pass: pass, errors: Errors };
	}
	
	function page3_Validate() {
		// Req fields = superBalance taxFreeComponent taxFreeComponentAmount nominatedIncome
		var Errors = [];
		if (!GetFieldVal('superBalance') || GetFieldVal('superBalance') < 1) {
			Errors.push('You must specify your superannuation balance');
		}
		if (!GetFieldVal('taxFreeComponent')) {
			Errors.push("Does your super have a concessional component?");
		}
		if ($('#taxFreeComponentAmount').attr('disabled') != true) {
			if ($('#taxFreeComponentAmount').val() < 1) {
				Errors.push("You must specify a concessional amount");
			} 
		}
		var ni = GetFieldVal('nominatedIncome');
		if (!ni) {
			Errors.push("You must nominate an annual amount");
		} else {
			if ((parseFloat(ni) < parseFloat(GetFieldVal('possibleMinimum'))) || (parseFloat(ni) > parseFloat(GetFieldVal('possibleMaximum')))) {
				Errors.push("Your nominated amount must be more than $"+GetFieldVal('possibleMinimum')+" and less than $"+GetFieldVal('possibleMaximum'));
			}
		}
		
		var pass = true;
		if (Errors.length > 0) pass = false;
		return { pass: pass, errors: Errors };
	}
	
	function page4_Validate() {
		var Errors = [];
		var css = GetFieldVal('currentSalSac');
		if (!css) {
			Errors.push("Do you utilise salary sacrifice opportunities?");
		} else {
			if (css == 1) {
				if (!parseFloat(GetFieldVal('currentSalSacAmount'))) {
					Errors.push("How much do you sacrifice?");
				}
				
				var iss = GetFieldVal('increaseSalSac');
				if (!iss) {
					Errors.push("Do you want increase salary sacrifice contributions into super?");
				} else {
					if (iss == 1) {
						if (!parseFloat(GetFieldVal('increaseSalSacAmount'))) {
							Errors.push("You must specify an amount you want to sacrifice into super");
						}
					}
				}
			} else {	
				var wss = GetFieldVal('wantSalSac');
				if (!wss) {
					Errors.push("Do you want to salary sacrifice into super?");
				} else {
					if (wss == 1) {
						if (!parseFloat(GetFieldVal('wantSalSacAmount'))) {
							Errors.push("You must specify an amount you want to sacrifice into super");
						}
					}
				}
			}
		}
		
		if (!GetFieldVal('salSacEffect')) {
			Errors.push("Will salary sacrificing reduce employer superannuation contributions?");
		}
		
		var pass = true;
		if (Errors.length > 0) { 
			pass = false;
		} else {
			// Do the fix here
			
			if (GetFieldVal('currentSalSac') == 1) {
				var temp = GetFieldVal('currentSalSacAmount', true);
			} else {
				var temp = 0;
			}
			if (GetFieldVal('increaseSalSacAmount', true)) {
				temp += GetFieldVal('increaseSalSacAmount', true);
			} else if (GetFieldVal('wantSalSacAmount', true)) {
				temp += GetFieldVal('wantSalSacAmount', true);
			} else {
				temp += 0;
			}
			$('#totalSalSacAmount').val(temp.toString());
			calcNetIncome();
		}
		return { pass: pass, errors: Errors };
	}
	
	function page0_Load() {
	}
	
	function page1_Load() {
	}
	
	function page2_Load() {
		setPercentageContributed();
	}
	
	function page3_Load() {
	}
	
	function page4_Load() { 
	}
}