			var amortizingLoan = new Calculators.loan.UnknownLoanVariable(0.09, 60);
			amortizingLoan.findMonthlyPayment(100000.00);
			
			function plotValues(){
				var graphType = null;
				var graphTypeElement = document.subForm.graph_method;
				for (var i = 0; i < graphTypeElement.length; i++) {
					if (graphTypeElement[i].checked == true) {
						graphType = graphTypeElement[i].value;
					}
				}
				
				var graphWidth = "310";
				var graphHeight = "250";
				var chart = null;
				var dataXml = "";
				
				switch (graphType) {
					case "balances":
						chart = new FusionCharts("FusionCharts/FCF_Line.swf", "graphId", graphWidth, graphHeight);
						dataXml = generateBalancesDataXml();
						break;
					case "payments":
						chart = new FusionCharts("FusionCharts/FCF_StackedColumn3D.swf", "graphId", graphWidth, graphHeight);
						dataXml = generatePaymentsDataXml();
						break;
				}
                
        if (chart) {
          chart.setDataXML(dataXml);
          chart.render("graph_content");
        }
			}
			
			function generateBalancesDataXml() {
				var returnXml = new Array();
				returnXml.push("<?xml version='1.0'?>\n");
				
				returnXml.push("<graph caption='Payment Balances' xAxisName='Payment Number' formatNumberScale='0' decimalPrecision='0' " + 
				"numberPrefix='$' showNames='1' showValues='0' rotateNames='0' anchorAlpha='0' showColumnShadow='0' animation='0'>")
				
				var loan = amortizingLoan.getLoan();
				var end = loan.getNper();
				for (var i = 1; i < end; ++i) {
					var showname = "showname='0'";
					if (i == 1 || i == end || (i % 5 == 0)) {
						showname = "showname='1'";
					}
					var monthly = loan.getMonthlyStatement(i);
					var balance = monthly.getBalance().getAmount();
					returnXml.push("<set name='" + i + "' value='" + balance + "' showvalue='0' " + showname + " color='afd8f8'/>");
				}
				
				returnXml.push("</graph>");
				return returnXml.join("");
			}
			
			function generatePaymentsDataXml() {
				var returnXml = new Array();
				returnXml.push("<?xml version='1.0'?>\n");
				
				returnXml.push("<graph caption='Principal and Interest by Payment' xAxisName='Payment Number' formatNumberScale='0' decimalPrecision='0' " + 
				"numberPrefix='$' showlegend='1' showNames='1' showValues='0' rotateNames='0' anchorAlpha='0' showColumnShadow='0' animation='0'>")
				
				var loan = amortizingLoan.getLoan();
				var end = loan.getNper();
				returnXml.push("<categories>");
				for (var i = 1; i < end; ++i) {
					var showname = "showname='0'";
					if (i == 1 || i == end || (i % 5 == 0)) {
						showname = "showname='1'";
					}
					var monthly = loan.getMonthlyStatement(i);
					var balance = monthly.getBalance().getAmount();
					returnXml.push("<category name='" + i + "' showvalue='0' " + showname + " />");
				}
				returnXml.push("</categories>");
				
				returnXml.push("  <dataset seriesName='Interest' color='afd8f8' showValues='0'>");
				for (var i = 1; i < end; ++i) {
					var monthly = loan.getMonthlyStatement(i);
					var balance = monthly.getInterest().getAmount();
					returnXml.push("    <set value='" + balance + "' />");
				}
				returnXml.push("  </dataset>");
				
				returnXml.push("  <dataset seriesName='Principal' color='f6bd0f' showValues='0'>");
				for (var i = 1; i < end; ++i) {
					var monthly = loan.getMonthlyStatement(i);
					var principal = monthly.getPrincipal().getAmount();
					returnXml.push("    <set value='" + principal + "' />");
				}
				returnXml.push("  </dataset>");
				
				returnXml.push("</graph>");
				return returnXml.join("");
			}
			
      function updateCalculatedBalance(target) {
        if (target.value == "calc_payment") {
					document.getElementById("payment").disabled = true;
					$("#payment").addClass("readonly");
					document.getElementById("amount").disabled = false;
					$("#amount").removeClass("readonly");
					document.getElementById("amount").focus();
					document.getElementById("amount").select();
        }
        else {
					document.getElementById("payment").disabled = false;
					$("#payment").removeClass("readonly");
					document.getElementById("amount").disabled = true;
					$("#amount").addClass("readonly");
					document.getElementById("payment").focus();
					document.getElementById("payment").select();
        }
      }

			function updateCalcs(){
				var periods = document.getElementById("periods").value;
				var interestRate = parseFloat(document.getElementById("interest_rate").value.replace(/%/g, "")) / 100;
				var amount = parseFloat(document.getElementById("amount").value.replace(/\$/g, "").replace(/,/g, ""));
				var payment = parseFloat(document.getElementById("payment").value.replace(/\$/g, "").replace(/,/g, ""));

        if (periods != amortizingLoan.getPeriods() ||
            interestRate != amortizingLoan.getInterestRate().getAmount() ||
            amount != amortizingLoan.getLoanAmount().getAmount() ||
            payment != amortizingLoan.getMonthlyPayment().getAmount()) {

    			amortizingLoan = new Calculators.loan.UnknownLoanVariable(interestRate, periods);

          var calcType = null;
          var calcTypeElement = document.subForm.calc_types;
          for (var i = 0; i < calcTypeElement.length; i++) {
            if (calcTypeElement[i].checked == true) {
              calcType = calcTypeElement[i].value;
            }
          }
				
		    	if (calcType == "calc_payment") {
				    amortizingLoan.findMonthlyPayment(amount);
    			}
		    	else {
				    amortizingLoan.findLoanAmount(payment);
    		  }
				
		  		calculate();
        }
			}
			
			function calculate(){
                var calcType = null;
                var calcTypeElement = document.subForm.calc_types;
                for (var i = 0; i < calcTypeElement.length; i++) {
                    if (calcTypeElement[i].checked == true) {
                        calcType = calcTypeElement[i].value;
                    }
                }
				
				// Update form fields
				document.getElementById("payment").value = amortizingLoan.getMonthlyPayment().formatted();
				document.getElementById("amount").value = amortizingLoan.getLoanAmount().formatted();
				document.getElementById("periods").value = amortizingLoan.getPeriods();
				document.getElementById("interest_rate").value = amortizingLoan.getInterestRate().formatted();
				
				// Update static fields
				var stmt = amortizingLoan.getLoan().getTotalStatement();
				var total = stmt.getInterest().add(stmt.getPrincipal());

				jQuery("#static_amount").val(amortizingLoan.getLoanAmount().formatted());
				jQuery("#static_total_payments").val(total.formatted());
				jQuery("#static_total_interest").val(stmt.getInterest().formatted());
				
				// Update the graph
				plotValues();
			}
			
			function displayReport(){
				var report = new Calculators.report.LoanReport(amortizingLoan.getLoan());
				var WINDOW_OPTIONS = "toolbar=no, menubar=no, resizable=yes, scrollbars=yes";
				var reportWindow = window.open("", "_new", WINDOW_OPTIONS);
				reportWindow.document.write(report.getHtmlReport());
				reportWindow.document.close();
			}
		
