            var refinance = new Calculators.loan.Refinance(0.0850, 120000.00, 100000.00, 360, 300, 0.065, 110000.00, 95490.53, 2000.00, 360, 0.0100, 1.00, 0.2500);
            
            function plotValues(){
                var graphType = document.getElementById("chart_types").value;
                /*
                 column graphs:
                 breakeven_points
                 stacked column graphs:
                 monthly_payments
                 new_payments_by_year
                 old_payments_by_year
                 prepaid_payment_by_year
                 line graphs:
                 */
                var graphWidth = "345";
                var graphHeight = "180";
                var chart = null;
                var dataXml = "";
                switch (graphType) {
                    case "breakeven_points":
                        chart = new FusionCharts("FusionCharts/FCF_Column3D.swf", "graphId", graphWidth, graphHeight);
                        dataXml = generateBreakevenDataXml();
                        break;
                    case "monthly_payments":
                        chart = new FusionCharts("FusionCharts/FCF_StackedColumn3D.swf", "graphId", graphWidth, graphHeight);
                        dataXml = generateMonthlyDataXml();
                        break;
                    case "new_payments_by_year":
                        chart = new FusionCharts("FusionCharts/FCF_StackedColumn3D.swf", "graphId", graphWidth, graphHeight);
                        dataXml = generateNewPaymentDataXml();
                        break;
                    case "old_payments_by_year":
                        chart = new FusionCharts("FusionCharts/FCF_StackedColumn3D.swf", "graphId", graphWidth, graphHeight);
                        dataXml = generateOldPaymentDataXml();
                        break;
                    case "prepaid_payment_by_year":
                        chart = new FusionCharts("FusionCharts/FCF_StackedColumn3D.swf", "graphId", graphWidth, graphHeight);
                        dataXml = generatePrepaidPaymentDataXml();
                        break;
                }
                
                if (chart) {
                    chart.setDataXML(dataXml);
                    chart.render("graph");
                }
            };
            
            function generateBreakevenDataXml(){
                var returnXml = new Array();
                returnXml.push("<?xml version='1.0'?>\n");
                returnXml.push("<graph caption='' bgcolor='ffffff' yAxisName='Months to Breakeven' yAxisMinValue='0.0' showLegend='1' showOnTop='1' decimalPrecision='0' animation='0' showvalues='1' showanchors='0' showNames='0' hoverCapSepChar=': '>");

        var monthlyPaymentSavingsPoint = refinance.getMonthlyPaymentSavingsBreakevenPoint();
        var pmiSavingsPoint = refinance.getPmiBreakevenPoint();
        var afterTaxSavingsPoint = refinance.getAfterTaxSavingsBreakevenPoint();
        var savingsVsPrepaymentPoint = refinance.getTotalSavingsVsPrepaymentBreakevenPoint();
				returnXml.push("  <set hoverText='Savings' value='" + monthlyPaymentSavingsPoint + "' color='afd8f8' />");
				returnXml.push("  <set hoverText='PMI savings' value='" + pmiSavingsPoint + "' color='f6bd0f' />");
				returnXml.push("  <set hoverText='Total savings after taxes' value='" + afterTaxSavingsPoint + "' color='9D080D' />");
				returnXml.push("  <set hoverText='Total savings over prepayment' value='" + savingsVsPrepaymentPoint + "' color='8E468E' />");
                returnXml.push("</graph>");
                
                return returnXml.join("");
            }
            
            function generateMonthlyDataXml(){
				var oldStatement = refinance.getOriginalLoanMonthlyStatement(1);
				var newStatement = refinance.getRefinancedLoanMonthlyStatement(1);

                var returnXml = new Array();
                returnXml.push("<?xml version='1.0'?>\n");
                returnXml.push("<graph caption='' bgcolor='ffffff' xAxisName='' yAxisName='' showNames='1' showValues='1' decimalPrecision='0' formatNumberScale='0' numberPrefix='$' formatNumber='1' animation='0'>");
				returnXml.push("  <categories>");
				returnXml.push("    <category name='Current " + oldStatement.getPayment().formatted() + "' />")
				returnXml.push("    <category name='New " + newStatement.getPayment().formatted() + "' />")
				returnXml.push("  </categories>");
				returnXml.push("  <dataset seriesName='Interest' color='f6bd0f' showValues='0'>");
				returnXml.push("    <set value='" + oldStatement.getInterest().getAmount() + "' />");
				returnXml.push("    <set value='" + newStatement.getInterest().getAmount() + "' />");
				returnXml.push("  </dataset>");
				returnXml.push("  <dataset seriesName='Principal' color='afd8f8' showValues='0'>");
				returnXml.push("    <set value='" + oldStatement.getPrincipal().getAmount() + "' />");
				returnXml.push("    <set value='" + newStatement.getPrincipal().getAmount() + "' />");
				returnXml.push("  </dataset>");
				returnXml.push("  <dataset seriesName='PMI' color='8E468E' showValues='0'>");
				returnXml.push("    <set value='" + oldStatement.getPMI().getAmount() + "' />");
				returnXml.push("    <set value='" + newStatement.getPMI().getAmount() + "' />");
				returnXml.push("  </dataset>");
                returnXml.push("</graph>");
                
                return returnXml.join("");
            }
            
            function generateNewPaymentDataXml(){
                var returnXml = new Array();
                returnXml.push("<?xml version='1.0'?>\n");
                returnXml.push("<graph caption='' bgcolor='ffffff' xAxisName='' yAxisName='' showNames='1' showValues='1' decimalPrecision='0' formatNumberScale='0' numberPrefix='$' formatNumber='1' showlegend='1' animation='0'>");
				returnXml.push("  <categories>");
				var years = refinance.getRefinancedTermYears();
				for (var i = 1; i <= years; i++) {
					var showLabel = (i % 3) ? '0' : '1';
					// Always show the end points
					if (i == 1 || i == years) {
						showLabel = '1';
					}
					returnXml.push("    <category name='" + i + "' showName='" + showLabel + "'/>")
				}
				returnXml.push("  </categories>");
				returnXml.push("  <dataset seriesName='Interest' color='afd8f8' showValues='0'>");
				for (var i = 1; i <= years; i++) {
					var newStatement = refinance.getRefinancedLoanYearlyStatement(i);
					returnXml.push("    <set value='" + newStatement.getInterest().getAmount() + "' />");
				}
				returnXml.push("  </dataset>");
				
				returnXml.push("  <dataset seriesName='Principal' color='f6bd0f' showValues='0'>");
				for (var i = 1; i <= years; i++) {
					var newStatement = refinance.getRefinancedLoanYearlyStatement(i);
					returnXml.push("    <set value='" + newStatement.getPrincipal().getAmount() + "' />");
				}
				returnXml.push("  </dataset>");
				returnXml.push("  <dataset seriesName='PMI' color='7f7fff' showValues='0'>");
				for (var i = 1; i <= years; i++) {
					var newStatement = refinance.getRefinancedLoanYearlyStatement(i);
					returnXml.push("    <set value='" + newStatement.getPMI().getAmount() + "' />");
				}
				returnXml.push("  </dataset>");
                returnXml.push("</graph>");
                
                return returnXml.join("");
            }
            
            function generateOldPaymentDataXml(){
                var returnXml = new Array();
                returnXml.push("<?xml version='1.0'?>\n");
                returnXml.push("<graph caption='' bgcolor='ffffff' xAxisName='' yAxisName='' showNames='1' showValues='1' decimalPrecision='0' formatNumberScale='0' numberPrefix='$' formatNumber='1' showlegend='1' animation='0'>");
				returnXml.push("  <categories>");
				var years = refinance.getRefinancedTermYears();
				for (var i = 1; i <= years; i++) {
					var showLabel = (i % 3) ? '0' : '1';
					// Always show the end points
					if (i == 1 || i == years) {
						showLabel = '1';
					}
					returnXml.push("    <category name='" + i + "' showName='" + showLabel + "'/>")
				}
				returnXml.push("  </categories>");
				returnXml.push("  <dataset seriesName='Interest' color='afd8f8' showValues='0'>");
				for (var i = 1; i <= years; i++) {
					var oldStatement = refinance.getOriginalLoanYearlyStatement(i);
          var value = (oldStatement) ? oldStatement.getInterest().getAmount() : 0;
					returnXml.push("    <set value='" + value + "' />");
				}
				returnXml.push("  </dataset>");
				
				returnXml.push("  <dataset seriesName='Principal' color='f6bd0f' showValues='0'>");
				for (var i = 1; i <= years; i++) {
					var oldStatement = refinance.getOriginalLoanYearlyStatement(i);
          var value = (oldStatement) ? oldStatement.getPayment().getAmount() : 0;
					returnXml.push("    <set value='" + value + "' />");
				}
				returnXml.push("  </dataset>");
				returnXml.push("  <dataset seriesName='PMI' color='7f7fff' showValues='0'>");
				for (var i = 1; i <= years; i++) {
					var oldStatement = refinance.getOriginalLoanYearlyStatement(i);
          var value = (oldStatement) ? oldStatement.getPMI().getAmount() : 0;
					returnXml.push("    <set value='" + value + "' />");
				}
				returnXml.push("  </dataset>");
                returnXml.push("</graph>");
                
                return returnXml.join("");
            }
            
            function generatePrepaidPaymentDataXml(){
                var returnXml = new Array();
                returnXml.push("<?xml version='1.0'?>\n");
                returnXml.push("<graph caption='' bgcolor='ffffff' xAxisName='' yAxisName='' showNames='1' showValues='1' decimalPrecision='0' formatNumberScale='0' numberPrefix='$' formatNumber='1' showlegend='1' animation='0'>");
				returnXml.push("  <categories>");
				var years = refinance.getRefinancedTermYears();
				for (var i = 1; i <= years; i++) {
					var showLabel = (i % 3) ? '0' : '1';
					// Always show the end points
					if (i == 1 || i == years) {
						showLabel = '1';
					}
					returnXml.push("    <category name='" + i + "' showName='" + showLabel + "'/>")
				}
				returnXml.push("  </categories>");
				returnXml.push("  <dataset seriesName='Interest' color='afd8f8' showValues='0'>");
				for (var i = 1; i <= years; i++) {
					var oldStatement = refinance.getPrepaymentLoanYearlyStatement(i);
          var value = (oldStatement) ? oldStatement.getInterest().getAmount() : 0;
					returnXml.push("    <set value='" + value + "' />");
				}
				returnXml.push("  </dataset>");
				
				returnXml.push("  <dataset seriesName='Principal' color='f6bd0f' showValues='0'>");
				for (var i = 1; i <= years; i++) {
					var oldStatement = refinance.getPrepaymentLoanYearlyStatement(i);
          var value = (oldStatement) ? oldStatement.getPayment().getAmount() : 0;
					returnXml.push("    <set value='" + value + "' />");
				}
				returnXml.push("  </dataset>");
				returnXml.push("  <dataset seriesName='PMI' color='7f7fff' showValues='0'>");
				for (var i = 1; i <= years; i++) {
					var oldStatement = refinance.getPrepaymentLoanYearlyStatement(i);
          var value = (oldStatement) ? oldStatement.getPMI().getAmount() : 0;
					returnXml.push("    <set value='" + value + "' />");
				}
				returnXml.push("  </dataset>");
                returnXml.push("</graph>");
                
                return returnXml.join("");
            }
            
            function updateCalculatedBalance(checkbox){
                var balanceElement = document.getElementById("refinanced_loan_mortgage");
                if (balanceElement) {
                    if (checkbox.checked) {
                        // disable the edit field
                        balanceElement.disabled = true;
                        $("#refinanced_loan_mortgage").addClass("readonly");
                        // calculate the value to put in the edit field
                        updateCalcs(true);
                    }
                    else {
                        // enable the edit field
                        balanceElement.disabled = false;
                        $("#refinanced_loan_mortgage").removeClass("readonly");
                    }
                }
            }
            
            function updateCalcs(forced){
                var originalLoanAmount = parseFloat(document.getElementById("original_loan_amount").value.replace(/\$/g, "").replace(/,/g, ""));
                var originalAppraisedAmount = parseFloat(document.getElementById("original_appraised_value").value.replace(/\$/g, "").replace(/,/g, ""));
                var remainingYears = document.getElementById("years_remaining").value;
                var originalInterestRate = parseFloat(document.getElementById("original_interest_rate").value.replace(/%/g, "")) / 100;
                var originalTerms = document.getElementById("original_term").value;
                var incomeTaxRate = parseFloat(document.getElementById("income_tax_rate").value.replace(/%/g, "")) / 100;
                var refinancedLoanMortgage = parseFloat(document.getElementById("refinanced_loan_mortgage").value.replace(/\$/g, "").replace(/,/g, ""));
                var refinancedTerm = document.getElementById("refinanced_term").value;
                var refinancedClosingCosts = parseFloat(document.getElementById("refinanced_closing_costs").value.replace(/\$/g, "").replace(/,/g, ""));
                var refinancedAppraisedValue = parseFloat(document.getElementById("refinanced_appraised_value").value.replace(/\$/g, "").replace(/,/g, ""));
                var refinanacedInterestRate = parseFloat(document.getElementById("refinanced_interest_rate").value.replace(/%/g, "")) / 100;
                var loanOriginationRate = parseFloat(document.getElementById("loan_origination_rate").value.replace(/%/g, "")) / 100;
                var pointsPaid = document.getElementById("points_paid").value;
                
                
                if ((forced != undefined && forced == true) ||
                  originalLoanAmount != refinance.getOriginalLoanAmount().getAmount() ||
                  originalAppraisedAmount != refinance.getOriginalAppraisedValue().getAmount() ||
                  remainingYears != refinance.getOriginalPeriodsRemaining() / 12 ||
                  originalInterestRate != refinance.getOriginalInterestRate().getAmount() ||
                  originalTerms != refinance.getOriginalLoanYears() ||
                  incomeTaxRate != refinance.getIncomeTaxRate().getAmount() ||
                  refinancedLoanMortgage != refinance.getRefinancedLoanBalance().getAmount() ||
                  refinancedTerm != refinance.getRefinancedTermYears() ||
                  refinancedClosingCosts != refinance.getRefinancedOtherClosingCosts().getAmount() ||
                  refinancedAppraisedValue != refinance.getRefinancedAppraisedValue().getAmount() ||
                  refinanacedInterestRate != refinance.getRefinancedInterestRate().getAmount() ||
                  loanOriginationRate != refinance.getRefinancedLoanOriginationRate().getAmount() ||
                  pointsPaid != refinance.getRefinancedPointsPaid()
                  ) {
                  if (document.getElementById("calculate_balance").checked) {
                      refinancedLoanMortgage = 0.00;
                  }
                  refinance = new Calculators.loan.Refinance(originalInterestRate, originalAppraisedAmount, originalLoanAmount, originalTerms * 12, remainingYears * 12, refinanacedInterestRate, refinancedAppraisedValue, refinancedLoanMortgage, refinancedClosingCosts, refinancedTerm * 12, loanOriginationRate, pointsPaid, incomeTaxRate);
                  calculate();
                }
            }
            
            function calculate(){
                // Update input fields with formatted data
                document.getElementById("original_loan_amount").value = refinance.getOriginalLoanAmount().formatted();
                document.getElementById("original_appraised_value").value = refinance.getOriginalAppraisedValue().formatted();
                document.getElementById("years_remaining").value = refinance.getOriginalPeriodsRemaining() / 12;
                document.getElementById("original_interest_rate").value = refinance.getOriginalInterestRate().formatted();
                document.getElementById("original_term").value = refinance.getOriginalLoanYears();
                document.getElementById("income_tax_rate").value = refinance.getIncomeTaxRate().formatted();
                document.getElementById("refinanced_loan_mortgage").value = refinance.getRefinancedLoanBalance().formatted();
                document.getElementById("refinanced_term").value = refinance.getRefinancedTermYears();
                document.getElementById("refinanced_closing_costs").value = refinance.getRefinancedOtherClosingCosts().formatted();
                document.getElementById("refinanced_appraised_value").value = refinance.getRefinancedAppraisedValue().formatted();
                document.getElementById("refinanced_interest_rate").value = refinance.getRefinancedInterestRate().formatted();
                document.getElementById("loan_origination_rate").value = refinance.getRefinancedLoanOriginationRate().formatted();
                document.getElementById("points_paid").value = refinance.getRefinancedPointsPaid();
                
                // Update static fields
                jQuery("#origination_as_amount").val(new Calculators.type.Money(refinance.getRefinancedOtherClosingCosts().getAmount() + refinance.getRefinancedLoanOriginationRateAsAmount().getAmount() + refinance.getPointsAsAmount().getAmount()).formatted() );
                //document.getElementById("points_as_amount").innerHTML = (" = " + refinance.getPointsAsAmount().formatted());
                
                // Update the graph
                plotValues();
            }
            
            function displayReport() {
                var reportType = false;
                var reportTypeElement = document.reportForm.report_detail;

                for (var i = 0; i < reportTypeElement.length; i++) {
                    if (reportTypeElement[i].checked == true) {
                        reportType = ("monthly_schedule" == reportTypeElement[i].value);
                    }
                }
                
                var report = new Calculators.report.RefinanceReport(refinance, reportType);
                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();
            }
