//
// mortgagecalcs.js
//
// This library of javascript functions are used to provide some mortgage and financial calculators
// and to output the result into a named "div"
//
function formatCurrency(num) {
	var sign;
	var cents;

	num = num.toString().replace(/\$|\,/g,'');
	if(isNaN(num))
		num = "0";
	sign = (num == (num = Math.abs(num)));
	num = Math.floor(num*100+0.50000000001);
	cents = num%100;
	num = Math.floor(num/100).toString();
	if(cents<10)
		cents = "0" + cents;
	for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++)
		num = num.substring(0,num.length-(4*i+3))+','+ num.substring(num.length-(4*i+3));
	return (((sign)?'':'-') + '$' + num + '.' + cents);
}

function PF2(amount)
{
	return Number(Math.round(amount * 100) / 100).toFixed(2);
}

function PF3(amount)
{
	return Number(Math.round(amount * 1000) / 1000).toFixed(3);
}

function PDC2(amount)
{
	return formatCurrency(amount);
}

function FilterDollarAmount(amount)
{
	var newamount = new String;

	newamount = amount;
	newamount = newamount.replace(/[$, ]/g, '');
	if (newamount.length < 1) {
		newamount = '0';
	}
	return 1 * newamount.toString();
}


function FilterInterestRate(rate)
{
	var newrate = new String;
	var r = 0;

	newrate = rate;
	newrate = newrate.replace(/[%, ]/g, '');
	if (newrate.length < 1) {
		newrate = '0';
	}
	r= 1 * newrate;
	if (r >= 1) {
		r = r / 100;
	}
	return r;
}


function PMTCalc(pri, interest, years)
{
	// interest is expresed in decimal form per year
	return PF2(pri * ((interest/12)/(1-Math.pow(1+ (interest/12),-1*12*years))));

}


// This will perform BiWeeklyMortgage Calculations and display
// the results in the divname give (the ID=... of a div)
//
// The Fields/types required for calcuation are as follows:
//
//     principal -- text input (will filter out dollar signs & commas)
//                  This is the amount of the loan
//     interest  -- text input as a percent, if a % is entered it will be
//                  removed.  This is the interest rate of the loan
//     years     -- text input, should be a number between 1 and 100.
//                  The length of the loan in years
//
// The actual calculations to determine the biweekly payment amount is
// to determine the monthly payment on a standard monthly mortgage, and then
// cut it in half, and pay it 26 times a year ... effectively making one extra
// monthly payment per year.  This is how "BiWeekly" mortgages are advertised
// to consumers currently in the US.
//     
  	function BiWeeklyMortgage(formid, divid)
{
	var myform = $(formid);
	var principal = $F(myform['principal']);
	var interest = $F(myform['interest']);
	var years = $F(myform['years']);
	var resbox = $(divid);

	// Filter principal
	// Filter interest

	var results = '<div class="res_line"><span class="res_title">Biweekly Mortgage Results</span></div>';
 	results += '<div class="res_amortable"><table><tr><th class="col1">Year</th><th class="col2">Remaining Standard</th><th class="col3">Remaining Bi-Weekly</th></tr>';
	principal = FilterDollarAmount(principal);
	interest = FilterInterestRate(interest);
	years = FilterDollarAmount(years);

	if ((principal < 1) || (interest <= 0) || (interest >= 1) || (years < 1) 
		|| (years > 100)) {
		resbox.innerHTML = 
			'Please recheck the values entered for Principal, Interest, and Years';
		return;
	}

	// Actually, I suspect banks charge interest daily using 1/360ths of interest
	// but using simpler formulas for estimating payment amount
	var i = interest / 12;
	var wklyi = interest / 26;
	var pmt = Math.round(principal * (i/(1-Math.pow(1+i, -1*12*years))) * 100) / 100;
	// alert('Monthly Payment == ' + Number(pmt).toFixed(2));
	var wklypmt = Math.round(pmt / 2 * 100) / 100;
	// alert('Weekly Payment == ' + Number(wklypmt).toFixed(2));
	var balance = principal;
	var wklybalance = principal;
	var intpaid = 0;
	var wklyintpaid = 0;
	var totalpaid = 0;
	var wklytotalpaid = 0;
	var y;
	var m;
	var w;
	var periodicint = 0;
	var periodicpri = 0;
	for (y = 1; y <= years; y++) {
		// Do annual calcs by monthly
		for (m = 1; m <= 12; m++) {
			periodicint = Math.round(balance * i * 100)/100;
			balance += periodicint;
			intpaid += periodicint;
			if (balance < pmt) {
				totalpaid += balance;
				balance = 0;
			} else {
				totalpaid += pmt;
				balance -= pmt;
			}
		}

		// Do annual calcs by weekly
		for (w = 1; w <= 26; w++) {
			periodicint = Math.round(wklybalance * wklyi * 100)/100;
			wklybalance += periodicint;
			wklyintpaid += periodicint;
			if (wklybalance < wklypmt) {
				wklytotalpaid += wklybalance;
				wklybalance = 0;
			} else {
				wklytotalpaid += wklypmt;
				wklybalance -= wklypmt;
			}
		}

		if (y == years) {
			// There is a chance that there is a small amount remaining!!
			if (balance > 0) {
				totalpaid += balance;
				balance = 0;
			}
			if (wklybalance > 0) {
				wklytotalpaid += wklybalance;
				wklybalance = 0;
			}
		}
		results += '<tr><td class="col1">' + y + '</td><td class="col2">' + PDC2(balance) + '</td><td class="col3">' + PDC2(wklybalance) + '</td></tr>';
	}

	results += '</table></div><br />';

	results += '<div class="res_note"><div class="res_text1top">&nbsp;</div><div class="res_text2top">Standard</div><div class="res_text3top">Biweekly</div>';

	results += '<div class="res_text1a">Payment Amount</div><div class="res_text2a">' + PDC2(pmt) + '</div><div class="res_text3a">' + PDC2(wklypmt) + '</div>';
	results += '<div class="res_text1b">Total Paid</div><div class="res_text2b">' + PDC2(totalpaid) + '</div><div class="res_text3b">' + PDC2(wklytotalpaid) + '</div>';
	results += '<div class="res_text1a">Interest Paid</div><div class="res_text2a">' + PDC2(intpaid) + '</div><div class="res_text3a">' + PDC2(wklyintpaid) + '</div>';
	results += '<div class="res_text1b">Savings</div><div class="res_text2b">&nbsp;</div><div class="res_text3b">' + PDC2(intpaid - wklyintpaid) + '</div>';
	results += '<div class="clearfloat res_bottom"></div></div>';
	resbox.innerHTML = results;
}



function CanadianMortgagePaymentTable(formid, divid)
{
	var myform = $(formid);
	var calctype = $F(myform['calctype']);
	var amount = $F(myform['amount']);
	var interest = $F(myform['interest']);
	var years = $F(myform['years']);
	var resbox = $(divid);

	var principal = 0;
	var pmt = 0;
	var usequiv = 0;
	var totalpaid = 0;
	var intpaid = 0;

	// Filter principal
	// Filter interest

	var results = '';
	amount = FilterDollarAmount(amount);
	interest = FilterInterestRate(interest);
	years = FilterDollarAmount(years);

	if ((amount < 1) || (interest <= 0) || (interest >= 1) || (years < 1) 
		|| (years > 100)) {
		resbox.innerHTML = 
			'Please recheck the values entered for Amount, Interest, and Years';
		return;
	}

	var i = interest;
	var ipart = (Math.pow((1+i/2), 1/6) - 1);
	    ipart /= (1 - Math.pow(( Math.pow((1 + i/2), 1/6) ), -12 * years));
	if (calctype == 'Loan Amount') {
		// alert('Loan amount calculation');
		principal = amount;
		pmt = principal * ipart;
	} else {
		// alert('Payment amount Calculation');
		pmt = amount;
		principal = pmt / ipart;
	}
	
	totalpaid = pmt * 12 * years;
	intpaid = totalpaid - principal;
	usequiv = 1200 * (Math.pow((1+i/2), 1/6) - 1);

	var results = '<div class="res_line"><span class="res_title">Canadian Mortgage Payment Results</span></div><div class="res_text">';
	results += '<div class="res_text"><div class="res_text4a">Loan Amount </div><div class="res_text5a">' + PDC2(principal) + '</div>';
	results += '<div class="res_text4b">Interest Rate </div><div class="res_text5b">' + PF2(interest*100) + '</div>';
	results += '<div class="res_text4a">Length of Loan </div><div class="res_text5a">' + years + '</div>';
	results += '<div class="res_text4b">Monthly Payment Amount </div><div class="res_text5b">' + PDC2(pmt) + '</div>';
	results += '<div class="res_text4a">Total Paid </div><div class="res_text5a">' + PDC2(totalpaid) + '</div>';
	results += '<div class="res_text4b">Total Interest Paid </div><div class="res_text5b">' + PDC2(intpaid) + '</div>';
	results += '<div class="res_text4a">US Equivelant Rate </div><div class="res_text5a">' + PF2(usequiv) + '</div></div>';
	results += '<div class="clearfloat res_bottom"></div></div>';
	resbox.innerHTML = results;
}


function HowMuchCanYouAfford(formid, divid)
{
	var myform = $(formid);
	var income = FilterDollarAmount($F(myform['income']));
	var debt = FilterDollarAmount($F(myform['debt']));
	var downpayment = FilterDollarAmount($F(myform['downpayment']));
	var taxrate = (0 + $F(myform['taxrate'])) / 100;
	var insurancerate = (0 + $F(myform['insurancerate'])) / 100;
	var interest = FilterInterestRate($F(myform['interest']));
	var years = FilterDollarAmount($F(myform['years']));
	var resbox = $(divid);

	var monthlytaxrate = taxrate / 12;
	var monthlyinsurancerate = insurancerate / 12;
	var principal = 0;
	var pmt = 0;
	var results = '';
	var monthlyincome = PF2(income / 12);

	if ((income < 1) || (interest <= 0) || (interest >= 1) || (years < 1) 
		|| (years > 100)) {
		resbox.innerHTML = 
			'Please Recheck the values entered for Principal, Interest, and Years';
		return;
	}

	var maxpiti = PF2(0.28 * monthlyincome);
	var maxpitid = PF2(0.36 * monthlyincome);
	var debtratio = debt / monthlyincome;

	if (debtratio > 0.36) {
		resbox.innerHTML = 'Your current <b>Debt Ratio exceeds 36%</b>,<br>which exceeds typical conventional loan'
		                 + ' maximum PITI + long term debt.<br>Your current Debt Ratio is ' + PF2(debtratio * 100) + '%.<br />';
		return;
	}

	var results = '<div class="res_line"><span class="res_title">How Much House You Can Afford Results</span></div>';

	var maxpmt = maxpiti;
	if (debtratio > 0.08) {
		maxpmt = (0.36 - debtratio) * monthlyincome;
		results += 'Using 36% of PITI + Long Term Debt to determine how much you can afford.<br />Your current monthly debt ratio is ' + PF2(debtratio * 100) + '%.<br /><br />';
	} else {
		results += 'Using 28% of PITI to determine how much you can afford.<br /><br />';
	}

	results += '<div class="res_text4a">Maximum monthly PITI payment</div><div class="res_text5a">' + PDC2(maxpiti) + '</div>';
	results += '<div class="res_text4b">Maximum monthly PITI + Debt payment</div><div class="res_text5b">' + PDC2(maxpitid) + '</div>';

	var i = interest / 12; // monthly interest rate
	var tmpi = (i/(1-Math.pow(1+i,-1*12*years)));

	var monthlypmi = 0;
	var pri = (maxpmt - downpayment * (monthlytaxrate + monthlyinsurancerate)) / (tmpi + monthlytaxrate + monthlyinsurancerate);
	if ((downpayment / (downpayment + pri)) >= 0.20) {
		// PMI is not required
	} else {
		// PMI of 0.73 is required
		pri = (maxpmt - downpayment * (monthlytaxrate + monthlyinsurancerate)) / (tmpi + monthlytaxrate + monthlyinsurancerate + (0.0073/12));
		monthlypmi = PF2((0.0073/12) * pri);
		results += '<div class="res_text100">Your Loan-to-Value ratio exceeds 80%, so you will need to pay for PMI calculated at 0.73% of '
			    + PDC2(monthlypmi) + '</div>';
	}


	results +=	'<div style="width: 100%; height: 25px;">&nbsp;</div>';
	results +=	'<div class="res_text4a">Monthly Gross Income</div><div class="res_text5a">' + PDC2(monthlyincome) + '</div>';
	results += '<div class="res_text4b">Loan Amount of</div><div class="res_text5b">' + PDC2(pri) + '</div>';
	results += '<div class="res_text4a">Monthly Principal + Interest</div><div class="res_text5a">' + PDC2(pri * tmpi) + '</div>';
	results += '<div class="res_text4b">Monthly Taxes</div><div class="res_text5b">' + PDC2((downpayment + pri) * monthlytaxrate) + '</div>';
	results += '<div class="res_text4a">Monthly Insurance</div><div class="res_text5a">' + PDC2((downpayment + pri) * monthlyinsurancerate) + '</div>';
	if (debt > 0) {
		results += '<div class="res_text4b">Monthly Debt Payment</div><div class="res_text5b">' + PDC2(debt) + '</div>';
	results += '<div class="clearfloat res_bottom"></div>';
	}
	
	resbox.innerHTML = results;
}

function MortgageCalculator(formid, divid)
{
	var myform = $(formid);
	var principal = FilterDollarAmount($F(myform['principal']));
	var interest = FilterInterestRate($F(myform['interest']));
	var years = FilterDollarAmount($F(myform['years']));
	var startmonth = FilterDollarAmount($F(myform['month']));
	var startyear = FilterDollarAmount($F(myform['year']));
	var fulltable_yn = $F(myform['fulltable_yn']);
//	var prepaymethod = Form.getInputs(formid + 'form','radio','prepaymethod').find(function(radio) { return radio.checked; }).value;
	var prepaymethod = FilterDollarAmount($F(myform['prepaymethod']));
	var prepayamount = FilterDollarAmount($F(myform['prepayamount']));
	var prepaymonth = FilterDollarAmount($F(myform['prepaymonth']));
	var resbox = $(divid);
	var MonthName = new Array('', 'January', 'February', 'March', 'April', 'May', 'June', 
	                           'July', 'August', 'September', 'October', 'November', 'December');
	                          

	var curmonth = startmonth;
	var curyear  = startyear;

	var results = '';

	var totalpaid = 0;
	var intpaid = 0;
	var curyear_pri = 0;
	var curyear_int = 0;
	var monthn = 0;


	// Actually, I suspect banks charge interest daily using 1/360ths of interest
	// but using simpler formulas for estimating payment amount
	var i = interest / 12;
	var wklyi = interest / 26;
	var pmt = Math.round(principal * (i/(1-Math.pow(1+i, -1*12*years))) * 100 + 0.5) / 100;
	var wklypmt = Math.round(pmt / 2 * 100) / 100;
	var balance = principal;
	var wklybalance = principal;
	var intpaid = 0;
	var wklyintpaid = 0;
	var totalpaid = 0;
	var wklytotalpaid = 0;
	var y;
	var m;
	var w;
	var periodicint = 0;
	var periodicpri = 0;
	var periodicpmt = 0;

	results += '<div class="clearfloat"></div>';
	results += '<div class="res_line"><span class="res_title">Mortgage Calculator Results</span></div>';
	var biweekly_yn = 0;

	// results += '<div class="res_text4a">Your Monthly Payment</div><div class="res_text5a">' + PDC2(pmt) + '</div>';
	if (prepaymethod == 1) {
		// results += '<div class="res_text4a">Plus Monthly Prepay of</div><div class="res_text5a">' + PDC2(prepayamount) + '</div>';
	} else if (prepaymethod == 2) {
		// results += '<div class="res_text4a">Plus Annual Prepay of</div><div class="res_text5a">' + PDC2(prepayamount) + '</div>';
	} else if (prepaymethod == 3) {
		// results += '<div class="res_text4a">Plus Every 6 months</div><div class="res_text5a">' + PDC2(pmt/2) + '</div>';
	} else if (prepaymethod == 4) {
		// results += '<div class="res_text4a">Plus Every 12 months</div><div class="res_text5a">' + PDC2(pmt) + '</div>';
	} else if (prepaymethod == 5) {
		// results += '<div class="res_text4a">Plus Prepay at ' + prepaymonth + ' month(s)</div><div class="res_text5a">' + PDC2(prepayamount) + '</div>';
		// results += '<div class="res_text4a">Plus Prepay at n month(s)</div><div class="res_text5a">' + PDC2(prepayamount) + '</div>';
	}
	results += '<div class="clearfloat"></div><br /><div class="res_amortable">';

	if (fulltable_yn == 'Yes') {
		results += '<table><tr><th class="col1">Year</th><th class="col2">Month</th><th class="col3">Principal</th><th class="col4">Interest</th><th class="col5">Balance</th></tr>';
	} else {
		results += '<table><tr><th class="col1">Year</th><th class="col3">Principal</th><th class="col4">Interest</th><th class="col5">Balance</th></tr>';
	}

	var annualpmt = 0;
	var annualint = 0;
	var x=1;
	while ((balance >= 0.005) && (x <= 101)) {
		x++;
		annualpmt = 0;
		annualint = 0;
		while ((curmonth <= 12) && (balance >= 0.005)) {
			monthn++;
			periodicint = Math.round(balance * i * 100)/100;
			balance += periodicint;
			intpaid += periodicint;
			periodicpmt = pmt;
			if (prepaymethod == 1) {
				periodicpmt += prepayamount;
			} else if ((prepaymethod == 2) && (curmonth == 12)) {
				periodicpmt += prepayamount;
			} else if ((prepaymethod == 3) && (monthn % 6 == 0)) {
				periodicpmt = Math.round(pmt * 150 + 0.5)/100;
			} else if ((prepaymethod == 4) && (monthn % 12 == 0)) {
				periodicpmt = Math.round(pmt * 150 + 0.5)/100;
			} else if ((prepaymethod == 5) && (monthn == prepaymonth)) {
				periodicpmt += prepayamount;
			}
			if (balance < periodicpmt) {
				periodicpmt = balance;
				totalpaid += balance;
				balance = 0;
			} else {
				totalpaid += periodicpmt;
				balance -= periodicpmt;
			}
			annualpmt += periodicpmt;
			annualint += periodicint;
			if (fulltable_yn == 'Yes') {
				results += '<tr><td class="col1">' + curyear 
					+ '</td><td class="col2">' + MonthName[curmonth]
					+ '</td><td class="col3">' + PDC2(periodicpmt-periodicint)
					+ '</td><td class="col4">' + PDC2(periodicint)
					+ '</td><td class="col5">' + PDC2(balance)
					+ '</td></tr>';
			}
			curmonth++;
		}
		curmonth = 1;

		if (fulltable_yn == 'Yes') {
			results += '<tr><td class="col1">' + curyear 
				+ '</td><td class="col2">' + 'TOTALS' 
				+ '</td><td class="col3">' + PDC2(annualpmt-annualint)
				+ '</td><td class="col4">' + PDC2(annualint)
				+ '</td><td class="col5">' + PDC2(balance)
				+ '</td></tr>';

			if (balance >= 0.005) {
				results += '</table></div>';
				results += '<div class="clearfloat"></div><br />';
				results += '<table><tr><th class="col1">Year</th><th class="col2">Month</th><th class="col3">Principal</th><th class="col4">Interest</th><th class="col5">Balance</th></tr>';
			}
		} else {
			results += '<tr><td class="col1">' + curyear 
				+ '</th><td class="col2">' + PDC2(annualpmt-annualint)
				+ '</th><td class="col3">' + PDC2(annualint)
				+ '</th><td class="col4">' + PDC2(balance)
				+ '</th></tr>';
		}
		curyear++;
	}
	results += '</table>';

	results += '</div><div class="clearfloat"></div><br /><div class="res_note">';

	results += '<div class="res_text4a">Total Paid</div><div class="res_text5a">' + PDC2(totalpaid) + '</div>';
	results += '<div class="res_text4b">Total Interest Paid</div><div class="res_text5b">' + PDC2(intpaid) + '</div>';
	results += '<div class="res_text4a">Standard Payment Amount</div><div class="res_text5a">' + PDC2(pmt) + '</div>';

	var normal_amount_paid = pmt * years * 12;
	var normal_interest_paid = normal_amount_paid - principal;
	var savings_paid = normal_amount_paid - totalpaid;
	var months_shorter = years * 12 - monthn;

	if (prepaymethod == 1) {
		results += '<div class="res_text4b">Plus Monthly Prepay of</div><div class="res_text5b">' + PDC2(prepayamount) + '</div>';
	} else if (prepaymethod == 2) {
		results += '<div class="res_text4b">Plus Annual Prepay of</div><div class="res_text5b">' + PDC2(prepayamount) + '</div>';
	} else if (prepaymethod == 3) {
		results += '<div class="res_text4b">Plus Every 6 months</div><div class="res_text5b">' + PDC2(pmt/2) + '</div>';
	} else if (prepaymethod == 4) {
		results += '<div class="res_text4b">Plus Every 12 months</div><div class="res_text5b">' + PDC2(pmt) + '</div>';
	} else if (prepaymethod == 5) {
		results += '<div class="res_text4b">Plus Prepay at ' + prepaymonth + ' month(s)</div><div class="res_text5b">' + PDC2(prepayamount) + '</div>';
		// results += '<div class="res_text4b">Plus Prepay at n month(s)</div><div class="res_text5b">' + PDC2(prepayamount) + '</div>';
	}
	if (prepaymethod != 0) {
		results += '<div class="res_text4b">Prepaying saved you</div><div class="res_text5b">' + PDC2(savings_paid) + '</div>';
		if (months_shorter >= 1) {
			results += '<div class="res_text4a">And it saved you</div><div class="res_text5a">' + months_shorter + ' Months</div>';
		}
	}

	results += '</div><div class="clearfloat"></div><br />';

	resbox.innerHTML = results;
}


function MortgagePaymentTableCalculator(formid, divid)
{
	var myform = $(formid);
	var minpri = FilterDollarAmount($F(myform['minpri']));
	var maxpri = FilterDollarAmount($F(myform['maxpri']));
	var mininterest = FilterInterestRate($F(myform['mininterest']));
	var maxinterest = FilterInterestRate($F(myform['maxinterest']));
	var years = FilterDollarAmount($F(myform['years']));
	var resbox = $(divid);

	var results = '';
	var numcols = 9;
	var numrows = 21;

	// Make sure min <= max
	if (minpri > maxpri) {
		var tmppri = minpri;
		minpri = maxpri;
		maxpri = tmppri;
	}

	// Make sure min <= max
	if (mininterest > maxinterest) {
		var tmpinterest = mininterest;
		mininterest = maxinterest;
		maxinterest = tmpinterest;
	}

	var interest_inc = Math.round((maxinterest - mininterest) / (numcols - 1) * 100000)/100000;
	var pri_inc = Math.round((maxpri - minpri) / (numrows - 1));

	if ((interest_inc <= 0) || (pri_inc <= 0)) {
		results = 'Please select a range of interest rates and a range of loan amounts<br />';
		return;
	}

	results = '<div class="res_line"><span class="res_title">Mortgage Payment Table Calculator Results</span></div><br /><span class="res_note">Principal &amp; Interest Table for ' + years + ' Years<br />';
	results += 'For Interest Rates ' + PF3(mininterest * 100) + ' to ' + PF3(maxinterest * 100) + ' Percent</span><br /><br />';

	results += '<div class="clearfloat"></div>';
	results += '<table><th class="col1">Interest:</th>';
	
	var i = mininterest;
	var col = 2;
	while (i <= maxinterest) {
		results += '<th rowspan="2" class="col' + col + '">' + PF3(i * 100) + '%<br>&nbsp;</th>';
		i = Math.round((i+interest_inc) * 100000)/100000;
		col++;
	}
	results += '</tr><tr><th class="col1"><span class="normal">Principal:</span></th></tr>';

	col = 1;
	var p = minpri;
	while (p <= maxpri) {
		results += '<tr><td class="col' + col + '">' + PDC2(p) + '</td>';

		var i = mininterest;
		while (i <= maxinterest) {
			col++;
			var pmt = i * p;
			results += '<td class="col' + col + '">' + PDC2(PMTCalc(p, i, years)) + '</td>';
			i = Math.round((i+interest_inc) * 100000)/100000;
		}
		results += '</tr>';
		p += pri_inc;
	}
	results += '</table>';

	resbox.innerHTML = results;
}


function MortgageQualification(formid, divid)
{
	var myform = $(formid);
	var pmt = FilterDollarAmount($F(myform['pmt']));
	var tax = FilterDollarAmount($F(myform['tax']));
	var insurance = FilterDollarAmount($F(myform['insurance']));
	var debt = FilterDollarAmount($F(myform['debt']));
	var principal = FilterDollarAmount($F(myform['principal']));
	var downpayment = FilterDollarAmount($F(myform['downpayment']));

	var resbox = $(divid);
	var results = '';

	results += '<div class="clearfloat"></div><br />';
	results += '<div class="res_line"><span class="res_title">Mortgage Qualification Calculator Results</span></div><div class="res_calc6">';
	results += '<div class="clearfloat"></div>';

	var monthlytax = PF2(tax / 12);
	var monthlyinsurance = PF2(insurance / 12);
	var monthlydebt = PF2(debt);

	if ((principal < 1) || (pmt <= 0)) {
		resbox.innerHTML = 
			'Please Recheck the values entered for Payment and Sale Price';
		return;
	}
	var monthlypiti = (pmt * 1) + (monthlytax * 1) + (monthlyinsurance * 1);
	var monthlypitid = (monthlypiti * 1) + (monthlydebt * 1);

	if ((principal > 0) && (((principal - downpayment) / principal) > 0.80)) {
		monthlypiti += (0.0073 * principal / 12);
		monthlypitid += (0.0073 * principal / 12);
	}

	var piti_income = PF2(monthlypiti / 0.28 * 12);
	var pitid_income = PF2(monthlypitid / 0.36 * 12);


	results += '<div class="res_text4a">Monthly PITI</div><div class="res_text5a">' + PDC2(monthlypiti) + '</div>';
	if (monthlydebt > 0.005) {
		results += '<div class="res_text4b">Monthly PITI plus Debt Payment</div><div class="res_text5b">' + PDC2(monthlypitid) + '</div>';
	}

	results += '<div class="res_text4a">28% Qualifying annual income</div><div class="res_text5a">' + PDC2(piti_income) + '</div>';
	results += '<div class="res_text4b">36% Qualifying annual income</div><div class="res_text5b">' + PDC2(pitid_income) + '</div>';

	if (pitid_income > piti_income) {
		results += '<div class="res_text4a">So, minimum qualifying annual income</div><div class="res_text5a">' + PDC2(pitid_income) + '</div>';
	} else {
		results += '<div class="res_text4a">So, minimum qualifying annual income</div><div class="res_text5a">' + PDC2(piti_income) + '</div>';
	}


	results += '<div class="clearfloat"></div><div class="res_note">The 28% income is based on PITI (Principal, Interest, Tax, and Insurance) or more specifically,'
	         + ' the mortgage principal plus interest amount plus your monthly property tax and home'
			 + ' insurance the lender typically holds in an excrow account for you.<br /><br />';

	results += 'The 36% income is based on the PITI (Principal, Interest, Tax, and Insurance) plus any other '
	        + ' long term debt payments you pay every month.<br /><br />';

	results += 'As long as your total income (salary plus interest, rental and dividend income) meets '
	        + ' both of the two incomes, you will probably qualify.</div></div>';

	results += '<div class="clearfloat res_bottom"></div></div>';

	resbox.innerHTML = results;
}


function PrepaymentMortgageReduction(formid, divid)
{
	var myform = $(formid);
	var principal = FilterDollarAmount($F(myform['principal']));
	var pmt = FilterDollarAmount($F(myform['pmt']));
	var interest = FilterInterestRate($F(myform['interest']));
	var prepayamount = FilterDollarAmount($F(myform['prepayamount']));
	var pmtincreaseper = FilterInterestRate($F(myform['pmtincreaseper']));

	var prepaymethod = 0;
	var biweekly_yn = 0;

	var resbox = $(divid);
	var results = '';

	if (($F(myform['prepayamount']) == 'B') || ($F(myform['prepayamount']) == 'b')) {
		biweekly_yn = 1;
		prepayamount = 0;
	}

	if ((principal < 1) || (pmt <= 0) || (interest >= 1)) {
		resbox.innerHTML = 
			'Please Recheck the values entered for Principal, Payment, and Interest';
		return;
	}

	var totalpaid = 0;
	var intpaid = 0;
	var monthn = 0;
	var yearn = 0;
	var year_frac = 0.00;

	var i = interest / 12;
	var balance = principal;
	var periodicint = 0;
	var periodicpri = 0;
	var periodicpmt = 0;

	results += '<div class="clearfloat"></div>';
	results += '<div class="res_line"><span class="res_title">Prepayment Mortgage Reduction Results</span></div>';

	results += 'Starting with ' + PDC2(balance) + ' at ' + PF2(interest * 100) + '% and a payment of ' + PDC2(pmt) + '<br />';

	var biweeklypmt = PF2(pmt / 2);
	if (pmtincreaseper > 0) {
		results += 'With a monthly payment increasing ' + PF2(pmtincreaseper * 100) + '% per year.<br />';
	}
	if (prepayamount > 0.005) {
		results += 'Paying an extra ' + PDC2(prepayamount) + ' a month (' + PDC2(pmt + prepayamount) + '/month total) means:<br />';
	}
	if (biweekly_yn) {
		results += 'And an extra bi-weekly payment of ' + PDC2(biweeklypmt) + ' every 6 months.<br />';
	}

	results += '<div class="res_amortable"><table><tr><th class="col1">Month</th><th class="col2">Year</th><th class="col3">Balance</th><th class="col4">Payment</th><th class="col5">Interest</th><th class="col6">Paid Principle</th></tr>';

	yearn = 1;
	monthn = 1;
	var annualpmt = 0;
	var annualint = 0;
	while ((balance >= 0.005) && (yearn <= 101)) {
		curmonth = 1;
		annualpmt = 0;
		annualint = 0;
		while ((curmonth <= 12) && (balance >= 0.005)) {
			periodicint = Math.round(balance * i * 100)/100;
			balance += periodicint;
			intpaid += periodicint;
			periodicpmt = pmt;
			year_frac = Math.round(monthn/12 * 100)/100;

			if (pmtincreaseper > 0) {
				periodicpmt = Math.round(periodicpmt*Math.pow(1+interest, yearn-1) * 100)/100;
				biweeklypmt = Math.round(biweeklypmt*Math.pow(1+interest, yearn-1) * 100)/100;
			}

			if (prepayamount > 0) {
				periodicpmt += prepayamount;
			}

			if ((curmonth % 6 == 0) && (biweekly_yn == 1)) {
				periodicpmt += biweeklypmnt;
			}

			if (balance < periodicpmt) {
				periodicpmt = balance;
				totalpaid += balance;
				balance = 0;
			} else {
				totalpaid += periodicpmt;
				balance -= periodicpmt;
			}
			annualpmt += periodicpmt;
			annualint += periodicint;
			
			results += '<tr><td class="col1">' + monthn 
				+ '</td><td class="col2">' + year_frac
				+ '</td><td class="col3">' + PDC2(balance)
				+ '</td><td class="col4">' + PDC2(periodicpmt)
				+ '</td><td class="col5">' + PDC2(periodicint)
				+ '</td><td class="col6">' + PDC2(totalpaid - intpaid)
				+ '</td></tr>';
			curmonth++;
			monthn++;
		}
		yearn++;
	}
	if (curmonth == 13) {
		yearn++;
		curmonth = 1;
	}

	results += '</table></div>';

	results += '<div class="clearfloat"></div><br /><div class="res_note">';

	results += '<div class="res_text4a">Total Paid</div><div class="res_text5a">' + PDC2(totalpaid) + '</div>';
	results += '<div class="res_text4b">Total Interest Paid</div><div class="res_text5b">' + PDC2(intpaid) + '</div>';
	results += '<div class="res_text4a">Loan length</div><div class="res_text5a">';
	if (yearn - 2 > 0) {
		results += '' + (yearn-2) + ' year(s) ';
	}
	if (curmonth - 1 > 0) {
		results += '' + (curmonth-1) + ' month(s)</div>';
	}

	results += '<div class="clearfloat"></div><br /></div>';

	resbox.innerHTML = results;
}


function FrontEndCost(formid, divid)
{
	var myform = $(formid);
	var principal = FilterDollarAmount($F(myform['principal']));
	var interest = FilterInterestRate($F(myform['interest']));
	var apr = FilterInterestRate($F(myform['apr']));
	var years = FilterDollarAmount($F(myform['years']));

	var resbox = $(divid);
	var results = '';

	if ((principal < 1) || (interest >= 1)) {
		resbox.innerHTML = 
			'Please Recheck the values entered for Principal, Interest, and APR';
		return;
	}

	var pmt = PF2(PMTCalc(principal, interest, years));
	var principal2 = pmt / ( (apr/12) / ( 1 - Math.pow(1 + apr/12, -12*years)));
	var upfrontcost = principal - principal2;

	results += '<div class="clearfloat"></div>';
	results += '<div class="res_line"><span class="res_title">Front End Cost Results</span></div>';

	results += PDC2(principal) + ' Loan ';
	results += 'at ' + PF2(interest*100) + '% for ' + years + ' Years<br />';
	results += 'Principle &amp; Interest Monthly Payment:  ' + PDC2(pmt) + '<br />';
	results += 'But at ' + PF2(apr*100) + '% that means a loan of: ' + PDC2(principal2) + '<br />';
	results += 'So, your upfront costs are:  ' + PDC2(upfrontcost) + '<br />';

	results += '<div class="clearfloat"></div><br />';

	resbox.innerHTML = results;
}


function APRCalculator(formid, divid)
{
	var myform = $(formid);
	var principal = FilterDollarAmount($F(myform['principal']));
	var interest = FilterInterestRate($F(myform['interest']));
	var points = FilterInterestRate($F(myform['points']));
	var closingcosts = FilterDollarAmount($F(myform['closingcosts']));
	var years = FilterDollarAmount($F(myform['years']));

	var resbox = $(divid);
	var results = '';

	if ((principal < 1) || (interest >= 1)) {
		resbox.innerHTML = 
			'Please Recheck the values entered for Principal, Interest, Points, Closing Costs, and Term.';
		return;
	}

	var pmt = PF2(PMTCalc(principal, interest, years));
	var points_amount = 0;
	if (points > 0) {
		points_amount = principal * points;
	}
	var upfrontcost = points_amount + closingcosts;
	var p2 = principal + upfrontcost;
	var pmt2 = PF2(PMTCalc(p2, interest, years));

	var aprguess = interest * 1; // 0.0718
	while (PMTCalc(principal, aprguess, years) < pmt2) {
		aprguess += 0.0001;
	}

	results += '<div class="clearfloat"></div>';
	results += '<div class="res_line"><span class="res_title">APR Calculator Results</span></div>';

	results += PDC2(principal) + ' Loan '
	        + 'at ' + PF2(interest*100) + '% for ' + years + ' Years<br /><br />';
	results += '<div class="res_text4a">Principle &amp; Interest Monthly Payment</div><div class="res_text5a">' 
					+ PDC2(pmt) + '</div>';
	results += '<div class="res_text4b">With ' + PF2(points*100) + '% points</div><div class="res_text5b">' + PDC2(points_amount) + '</div>';
	results += '<div class="res_text4a">And other closing costs of</div><div class="res_text5a">' + PDC2(closingcosts) + '</div>';
	results += '<div class="res_text4b">Your total upfront costs are</div><div class="res_text5b">' + PDC2(upfrontcost) + '</div>';
	results += '<div class="res_text4a">So, the effective amount of your loan is</div><div class="res_text5a">' + PDC2(p2) + '</div>';
	results += '<div class="res_text4b">The Monthly Payment for this amount</div><div class="res_text5b">' + PDC2(pmt2) + '</div>';
	results += '<div class="res_text4a">But, the loan amount is really</div><div class="res_text5a">' + PDC2(principal) + '</div>';
	results += '<div class="res_text4b">So, the APR is actually</div><div class="res_text5b">' + PDC2(aprguess*100) + '% </div>';

	results += '<div class="clearfloat"></div><br />';

	resbox.innerHTML = results;
}


function CompoundInterestRateCalculator(formid, divid)
{
	var myform = $(formid);
	var pv = FilterDollarAmount($F(myform['pv']));
	var fv = FilterDollarAmount($F(myform['fv']));
	var years = FilterDollarAmount($F(myform['years']));

	var resbox = $(divid);
	var results = '';

	if ((pv <= 0) || (fv <= pv)) {
		resbox.innerHTML = 
			'Please Recheck the values entered for Starting and Final values and Term.';
		return;
	}

	var yield = fv / pv;
	var annualyield = Math.pow(fv/pv, 1/years) - 1;

	results += '<div class="clearfloat"></div>';
	results += '<div class="res_line"><span class="res_title">Compound Interest Rate Results</span></div>';

	results += '<div class="res_text4a">Starting Value</div><div class="res_text5a">' + PDC2(pv) + '</div>';
	results += '<div class="res_text4b">Ending Value</div><div class="res_text5b">' + PDC2(fv) + '</div>';
	results += '<div class="res_text4a">Total Yield</div><div class="res_text5a">' + PF2(yield*100) + '% </div>';
	results += '<div class="res_text4b">Over</div><div class="res_text5b">' + years + ' Years</div>';
	results += '<div class="res_text4a">Annual Yield</div><div class="res_text5a">' + PF2(annualyield*100) + '% </div>';

	results += '<div class="clearfloat"></div><br />';

	var balance = pv;
	var curyear = 1;
	var interest;
	results += '<table><tr>'
			+ '<th class="col1">Year</th>'
			+ '<th class="col2">Start</th>'
			+ '<th class="col3">Interest</th>'
		    + '<th class="col4">End</th>'
			+ '</tr>';

	while (curyear <= years) {
		results += '<tr><td class="col1">' + curyear + '</th>';
		results += '<td class="col2">' + PDC2(balance) + '</th>';
		interest = PF2(Math.round(balance * annualyield *100) / 100) * 1;
		results += '<td class="col3">' + PDC2(interest) + '</th>';
		balance = (balance * 1) + interest;
		results += '<td class="col4">' + PDC2(balance) + '</th>';
		results += '</tr>';
		curyear++;
	}
	results += '</table>';

	resbox.innerHTML = results;
}


function DeferredPaymentCalculator(formid, divid)
{
	var myform = $(formid);
	var days = FilterDollarAmount($F(myform['days']));
	var interest = FilterInterestRate($F(myform['interest']));
	var principal = FilterDollarAmount($F(myform['principal']));
	var months = FilterDollarAmount($F(myform['months']));

	var resbox = $(divid);
	var results = '';

	if ((principal <= 0) || (interest > 1)) {
		resbox.innerHTML = 
			'Please Recheck the values entered for Interest, Principal, and Term.';
		return;
	}

	var newbalance = 1 * PF2(principal * Math.pow(1 + interest/360, days));
	var pmt = 1 * PF2(PMTCalc(newbalance, interest, months/12));

	results += '<div class="clearfloat"></div>';
	results += '<div class="res_line"><span class="res_title">Deferred Payment Calculator Results</span></div>';

	results += '<div class="res_text4a">Starting Balance</div><div class="res_text5a">' + PDC2(newbalance) + '</div>';
	results += '<div class="res_text4b">Payment</div><div class="res_text5b">' + PDC2(pmt) + '</div>';

	results += '<div class="clearfloat"></div><br />';

	resbox.innerHTML = results;
}


function LoanPaymentCalculator(formid, divid)
{
	var myform = $(formid);
	var principal = FilterDollarAmount($F(myform['principal']));
	var interest = FilterInterestRate($F(myform['interest']));
	var years = FilterDollarAmount($F(myform['years']));

	var resbox = $(divid);
	var results = '';

	if ((principal <= 0) || (interest > 1)) {
		resbox.innerHTML = 
			'Please Recheck the values entered for Interest, Principal, and Term.';
		return;
	}

	var pmt = 1 * PF2(PMTCalc(principal, interest, years));

	results += '<div class="clearfloat"></div>';
	results += '<div class="res_line"><span class="res_title">Loan Payment Calculator Results</span></div>';

	results += '<div class="res_text">Your monthly payment for <b>' + years + '</b> years</div>';
	results += '<div class="res_text">for an interest rate of <b>' + PF2(interest*100) + '%</b> </div>';
	results += '<div class="res_text">on a loan amount of <b>' + PDC2(principal) + '</b></div>';
	results += '<div class="res_text">is <b>' + PDC2(pmt) + '</b> a month.</div>';

	results += '<div class="clearfloat"></div><br />';

	resbox.innerHTML = results;
}


function HowLongWillItLastCalculator(formid, divid)
{
	var myform = $(formid);
	var principal = FilterDollarAmount($F(myform['principal']));
	var minpmt = FilterDollarAmount($F(myform['minpmt']));
	var maxpmt = FilterDollarAmount($F(myform['maxpmt']));
	var interest = FilterInterestRate($F(myform['interest']));

	var resbox = $(divid);
	var results = '';

	if ((principal <= 0) || (interest > 1)) {
		resbox.innerHTML = 
			'Please Recheck the values entered for Interest, Principal, and Payments.';
		return;
	}

	var minmonths = 0;
	var mininterest = 0;

	var balance = principal;
	var x = 0;
	var periodicint = 0;
	var periodicpmt = 0;
	var i = interest / 12;
	var intpaid = 0;
	var totalpaid = 0;
	var pmt = minpmt;
	while ((balance >= 0.005) && (x < 5000)) {
		minmonths++;
		periodicint = Math.round(balance * i * 100)/100;
		balance += periodicint;
		intpaid += periodicint;
		periodicpmt = pmt;

		if (balance < periodicpmt) {
			periodicpmt = balance;
			totalpaid += balance;
			balance = 0;
		} else {
			totalpaid += periodicpmt;
			balance -= periodicpmt;
		}
	}
	mininterest = intpaid;

	// Reset values & try with maxpmt amount
	var maxmonths = 0;
	var maxinterest = 0;
	balance = principal;
	x = 0;
	periodicint = 0;
	periodicpmt = 0;
	intpaid = 0;
	totalpaid = 0;
	pmt = maxpmt;
	while ((balance >= 0.005) && (x < 5000)) {
		maxmonths++;
		periodicint = Math.round(balance * i * 100)/100;
		balance += periodicint;
		intpaid += periodicint;
		periodicpmt = pmt;

		if (balance < periodicpmt) {
			periodicpmt = balance;
			totalpaid += balance;
			balance = 0;
		} else {
			totalpaid += periodicpmt;
			balance -= periodicpmt;
		}
	}
	maxinterest = intpaid;


	results += '<div class="clearfloat"></div>';
	results += '<div class="res_line"><span class="res_title">How Long Will It Last? - Loan Calculator Results</span></div>';

	results += 'Using the minimum payment, it will take ' + minmonths + ' months (' + PF2(minmonths/12) + ' years) to pay off your loan.<br />';
	results += 'Total interest: ' + PDC2(mininterest) + ' (' + PDC2(mininterest/minmonths) + ' average per month)<br /><br />';
	results += 'Using the maximum payment, it will take ' + maxmonths + ' months (' + PF2(maxmonths/12) + ' years) to pay off your loan.<br />';
	results += 'Total interest: ' + PDC2(maxinterest) + ' (' + PDC2(maxinterest/maxmonths) + ' average per month)<br /><br />';
	results += '<div class="clearfloat"></div><br />';

	resbox.innerHTML = results;
}


function NominalAndEffectiveInterestRateCalculator(formid, divid)
{
	var myform = $(formid);
	var fv = FilterDollarAmount($F(myform['fv']));
	var pv = FilterDollarAmount($F(myform['pv']));
	var years = FilterDollarAmount($F(myform['years']));
	var n = FilterDollarAmount($F(myform['n']));

	var resbox = $(divid);
	var results = '';

	if ((pv < 0) || (fv <= pv) || (n <= 0) || (years <= 0)) {
		resbox.innerHTML = 
			'Please Recheck the values entered for Values, Years, and Compound Periods.';
		return;
	}

	var yield = fv/pv;
	var r = Math.pow(fv/pv, 1/years) - 1;
	var i = n * (Math.pow(r+1,1/n)-1);

	results += '<div class="clearfloat"></div>';
	results += '<div class="res_line"><span class="res_title">Nominal and Effective Interest Rate Results</span></div>';

	results += 'To accumulate a future balance of: ' + PDC2(fv) + '<br />';
	results += 'Given a current amount of: ' + PDC2(pv) + '<br />';
	results += 'over ' + years + ' years, compounded ' + n + ' times a year (' + (n*years) + ' total periods)<br /><br />';
	results += 'The following rates are required:<br />';
	results += 'Required Nominal rate is: ' + PF2(i*100) + '% <br />';
	results += 'Required Effective rate is: ' + PF2(r*100) + '% <br />';

	results += '<div class="clearfloat"></div><br />';

	resbox.innerHTML = results;
}


function SavingsCalculator(formid, divid)
{
	var myform = $(formid);
	var initial = FilterDollarAmount($F(myform['initial']));
	var deposit = FilterDollarAmount($F(myform['deposit']));
	var freq = FilterDollarAmount($F(myform['freq']));
	var interest = FilterInterestRate($F(myform['interest']));
	var years = FilterDollarAmount($F(myform['years']));

	var resbox = $(divid);
	var results = '';

	if ((initial < 0) || (deposit < 0) || (interest > 1)) {
		resbox.innerHTML = 
			'Please Recheck the values entered for Inital Amount, Deposit, Interest, and Years.';
		return;
	}

	var balance = initial * 1;
	var curyear = 1;
	var curmonth = 1;

	results += '<div class="clearfloat"></div>';
	results += '<div class="res_line"><span class="res_title">Savings Calculator Results</span></div>';
	results += '<table><tr>'
	        + '<th class="col1">Year</th>'
	        + '<th class="col2">Balance</th>'
			+ '</tr>';

	while (curyear <= years) {
		curmonth = 1;
		while (curmonth <= 12) {
			// Apply Interest before adding deposit
			if (freq == 12) {
				balance = 1 * PF2(balance * (1+interest/freq));
			} else if ((freq == 4) && (curmonth % 3 == 0)) {
				balance = 1 * PF2(balance * (1+interest/freq));
			} else if ((freq == 2) && (curmonth % 6 == 0)) {
				balance = 1 * PF2(balance * (1+interest/freq));
			} else if ((freq == 1) && (curmonth % 12 == 0)) {
				balance = 1 * PF2(balance * (1+interest/freq));
			}
			balance += 1 * deposit;
			curmonth++;
		}

		results += '<tr>'
	        + '<td class="col1">' + curyear + '</td>'
	        + '<td class="col2">' + PDC2(balance) + '</td>'
			+ '</tr>';
		curyear++;
	}
	results += '</table>';
		
	results += '<div class="clearfloat"></div><br />';
	results += '<div class="res_text4a">Final Savings Balance</div><div class="res_text5a">' + PDC2(balance) + '</div>';
	results += '<div class="clearfloat"></div><br />';

	resbox.innerHTML = results;
}


function FutureValueAnnuityCalculator(formid, divid)
{
	var myform = $(formid);
	var initial = FilterDollarAmount($F(myform['initial']));
	var deposit = FilterDollarAmount($F(myform['deposit']));
	var years = FilterDollarAmount($F(myform['years']));
	var annualyield = FilterInterestRate($F(myform['annualyield']));
	var inflation = FilterInterestRate($F(myform['inflation']));
	var increase = FilterInterestRate($F(myform['increase']));
	var withdrawal = FilterDollarAmount($F(myform['withdrawal']));

	var resbox = $(divid);
	var results = '';

	if ((initial < 0) || (deposit < 0) || (annualyield > 1)) {
		resbox.innerHTML = 
			'Please Recheck the values entered for Beginning Balance, Contributions, Term, and Rates.';
		return;
	}

	var balance = initial * 1;
	var curyear = 1;

	var i = 12 * (Math.pow(annualyield+1,1/12)-1);

	results += '<div class="clearfloat"></div>';
	results += '<div class="res_line"><span class="res_title">Future Value/Annuity Calculator Results</span></div>';
	results += '<table><tr>'
	        + '<th class="col1">Year</th>'
	        + '<th class="col2">Monthly Contribution</th>'
	        + '<th class="col3">Actual Balance</th>'
	        + '<th class="col4">Current Dollar Balance</th>'
			+ '</tr>';
	var curmonthly = deposit;
	var curmonth = 1;
	while (curyear <= years) {
		curmonth = 1;
		while (curmonth <= 12) {
			balance = Math.round(balance * (1 + i/12)*100)/100;
			balance = balance + curmonthly;
			curmonth++;
		}

		results += '<tr>'
	        + '<td class="col1">' + curyear + '</td>'
	        + '<td class="col2">' + PDC2(curmonthly) + '</td>'
	        + '<td class="col3">' + PDC2(balance) + '</td>'
	        + '<td class="col4">' + PDC2(balance/Math.pow(1+inflation,curyear)) + '</td>'
			+ '</tr>';
		curyear++;
		if (curyear <= years) {
			curmonthly = 1 * PF2(curmonthly * (1 + increase));
		}
	}
	results += '</table>';
	results += '<div class="clearfloat"></div><br />';

	results += '<div class="res_text">At this time:</div>';
	results += '<div class="res_text">Your last monthly contribution was ' + PDC2(curmonthly) + '</div>';

	var fwd = 1 * PF2(withdrawal * Math.pow(1 + inflation, years));
	results += '<div class="res_text">Your current required withdrawal is ' + PDC2(fwd) + '</div>';
	results += '<div class="clearfloat"></div><br />';

	results += "<div class='res_text'>Let's start taking money out and see how long it lasts:</div>";

	if (annualyield > 0.06) {
		results += "<div class='res_text'>Let's say you will NOT be able to maintain annual interest of more than 6% once you start taking out money. ";
		results += 'I am taking your yield down to 6%</div>';

		// Reset/recalculate interest rates
		annualyield = 0.06;
		i = 12 * (Math.pow(annualyield+1,1/12)-1);
	}

	results += '<div class="clearfloat"></div><br />';

	results += '<table><tr>'
	        + '<th class="col1">Year</th>'
	        + '<th class="col2">Balance</th>'
	        + '<th class="col3">Annual Withdrawal</th>'
			+ '</tr>';

	curyear = 1;
	var annualwd = 0;
	while ((balance >= 0.005) && (curyear < 100)) {
		curmonth = 1;
		annualwd = 0;
		while ((curmonth <= 12) && (balance > 0)) {
			balance = Math.round(balance * (1 + i/12)*100)/100;
			if (balance >= fwd) {
				balance -= fwd;
				annualwd += fwd;
			} else {
				annualwd = balance;
				balance = 0;
			}
			curmonth++;
		}
		results += '<tr>'
	        + '<td class="col1">' + curyear + '</th>'
	        + '<td class="col2">' + PDC2(balance) + '</th>'
	        + '<td class="col3">' + PDC2(annualwd) + '</th>'
			+ '</tr>';
		curyear++;
		fwd = 1 * PF2(withdrawal * Math.pow(1 + inflation, years + curyear - 1));
	}
	results += '</table>';

	results += '<div class="clearfloat"></div><br />';
	resbox.innerHTML = results;
}


function HowMuchToRetireCalculator(formid, divid)
{
	var myform = $(formid);
	var income = FilterDollarAmount($F(myform['income']));
	var yrtoretire = FilterDollarAmount($F(myform['yrtoretire']));
	var years = FilterDollarAmount($F(myform['years']));
	var inflation = FilterInterestRate($F(myform['inflation']));
	var annualyield = FilterInterestRate($F(myform['annualyield']));

	var resbox = $(divid);
	var results = '';

	if ((income < 0) || (yrtoretire < 0) || (annualyield > 1) || (inflation > 1) || (years < 0)) {
		resbox.innerHTML = 
			'Please Recheck the values entered for Income, Rates, and Terms.';
		return;
	}

	var need = 0;
	var curyear = years;
	while (curyear >= 1) {
		curwd = income * Math.pow(1+inflation, yrtoretire+curyear-1);
		need = need / (1+annualyield) + curwd;
		curyear--;
	}

	results += '<div class="clearfloat"></div>';
	results += '<div class="res_line"><span class="res_title">How Much to Retire Results</span></div>';

	results += 'You will need ' + PDC2(need) + '<br />';

	results += '<div class="clearfloat"></div><br />';

	results += '<table><tr>'
	        + '<th class="col1">Year</th>'
	        + '<th class="col2">Beginning Balance</th>'
	        + '<th class="col3">Withdrawal</th>'
	        + '<th class="col4">Interest</th>'
	        + '<th class="col5">Ending Balance</th>'
			+ '</tr>';

	curyear = 1;
	var interest;
	
	while (curyear <= years) {

		results += '<tr>'
	        + '<td class="col1">' + curyear + '</td>'
	        + '<td class="col2">' + PDC2(need) + '</td>';

		curwd = income * Math.pow(1+inflation, yrtoretire+curyear-1);
		interest = (need - curwd) * (1 * annualyield);
		need = need - curwd + interest;
		results += '<td class="col3">' + PDC2(curwd) + '</td>'
	        + '<td class="col4">' + PDC2(interest) + '</td>'
	        + '<td class="col5">' + PDC2(need) + '</td>'
			+ '</tr>';
		curyear++;
	}
	results += '</table>';
		
	results += '<div class="clearfloat"></div><br />';

	resbox.innerHTML = results;
}


function PrepaymentVSInvestmentCalculator(formid, divid)
{
        var myform = $(formid);
        var extra = FilterDollarAmount($F(myform['extra']));
        var pmt = FilterDollarAmount($F(myform['pmt']));
        var interest = FilterInterestRate($F(myform['interest']));
        var balance = FilterDollarAmount($F(myform['balance']));
        var deductible_yn = FilterDollarAmount($F(myform['deductible_yn']));
        var investrate = FilterInterestRate($F(myform['investrate']));
        var taxrate = FilterInterestRate($F(myform['taxrate']));
        var taxable_yn = FilterDollarAmount($F(myform['taxable_yn'])); 

        var resbox = $(divid);
        var results = '';

        if ((extra < 0) || (pmt < 0) || (interest > 1) || (balance <= 0) || (taxrate > 1)) {
                resbox.innerHTML = 
                        'Please Recheck the values entered for Amounts, Rates, and Terms.';
                return;
        }

        results += '<div class="clearfloat"></div>';
        results += '<div class="res_line"><span class="res_title">Prepayment vs. Investment - A Scenario Results</span></div>';

        results += '<table><tr><th colspan="4">Prepaying</th><th colspan="4">Investing</th></tr>';
        results += '<tr><th>Month</th>'
                 + '<th>Loan Bal (P)</th>'
                 + '<th>Int Paid (P)</th>'
                 + '<th>Tax Ded (P)</th>'
                 + '<th>Loan Bal (I)</th>'
                 + '<th>Int Paid (I)</th>'
                 + '<th>Tax Ded (I)</th>'
                 + '<th>Inv Bal (I)</th>'
                         '</tr>';


        var curmonth = 1;
        var pmonth = 0;
        var imonth = 0;
 
        var pbalance = balance;
        var ibalance = balance;

        var pintperiod = 0;
        var pinttotal = 0;
        var ptaxdedperiod = 0;
        var ptaxdedtotal = 0;
        var ptotalpaid = 0;

        var iintperiod = 0;
        var iinttotal = 0;
        var itaxdedperiod = 0;
        var itaxdedtotal = 0;
        var invbalance = 0;
        var itotalpaid = 0;
        var invintperiod = 0;
        var invintannual = 0;
        var invinttotal = 0;
        var itax = 0;
        var itaxtotal = 0;
        var endp_ibalance = 0;
        var endp_invbalance = 0; 

        var doneprinting_yn = 0;
        while ((pbalance >= 0.005) || (ibalance >= 0.005)) {

                pintperiod = Math.round(pbalance * interest / 12 * 100) / 100;

                pinttotal += pintperiod;
                pbalance += pintperiod;

                if (deductible_yn == 1) {
                        ptaxdedperiod = Math.round(pintperiod * taxrate/12 * 100)/100;
                        ptaxdedtotal += ptaxdedperiod;
                }

                if (pbalance >= (pmt + extra)) {
                        pbalance = pbalance - pmt - extra;
                        ptotalpaid += pmt + extra;
                        pmonth++;
                } else if (pbalance >= 0.005) {
                        ptotalpaid += pbalance;
                        pbalance = 0;
                        pmonth++;
                } else {
                        // pbalance already 0
                }

                 iintperiod = Math.round(ibalance * interest / 12 * 100) / 100;
                iinttotal += iintperiod;
                ibalance += iintperiod;
                if (deductible_yn == 1) {
                        itaxdedperiod = Math.round(iintperiod * taxrate/12 * 100)/100;
                        itaxdedtotal += itaxdedperiod;
                }
                if (ibalance >= pmt) {
                        ibalance = ibalance - pmt;
                        itotalpaid += pmt;
                        imonth++;
                } else if (ibalance >= 0.005) {
                        itotalpaid += ibalance;
                        ibalance = 0;
                        imonth++;
                } else {
                        // ibalance already 0
                }

                invintperiod = Math.round(invbalance * investrate/12 * 100)/100;
                invintannual += invintperiod;
                invinttotal += invintperiod;
                invbalance = invbalance + invintperiod;
                invbalance += extra;

                results += '';

                if (doneprinting_yn == 0) {
                        results += '<tr><td>' + curmonth + '</td>'
                                 + '<td>' + PDC2(pbalance) + '</td>'
                                 + '<td>' + PDC2(pintperiod) + '</td>'
                                 + '<td>' + PDC2(ptaxdedperiod) + '</td>'
                                 + '<td>' + PDC2(ibalance) + '</td>'
                                 + '<td>' + PDC2(iintperiod) + '</td>'
                                 + '<td>' + PDC2(itaxdedperiod) + '</td>'
                                 + '<td>' + PDC2(invbalance) + '</td>'
                                 '</tr>';
                }
 

                if (curmonth % 12 == 0) {
                        if (taxable_yn == 1) {
                                // calc tax on investment interest for the year
                                // and subtract it from ibalance
                                // display annual investment tax (itax)
 

                                itax = Math.round(invintannual * taxrate * 100)/100;
                                invbalance = invbalance - itax;
                                itaxtotal = itaxtotal + itax;
                                if (doneprinting_yn == 0) {
                                        results += '<tr><td class="res_tax">TAX</td>'
                                                 + '<td class="res_tax">&nbsp;</td>'
                                                 + '<td class="res_tax">&nbsp;</td>'
                                                 + '<td class="res_tax">&nbsp;</td>'
                                                 + '<td class="res_tax">&nbsp;</td>'
                                                 + '<td class="res_tax">&nbsp;</td>'
                                                 + '<td class="res_tax">&nbsp;</td>'
                                                 + '<td class="res_tax">' + PDC2(itax) + '</td>'
                                                 '</tr>';
                                }
                                itax = 0;
                                invintannual = 0;
                        }
                }
 

                // Output row
                curmonth++;
                if ((pbalance <= 0.005) && (doneprinting_yn == 0)) {
                        doneprinting_yn = 1;
                        endp_ibalance = ibalance;
                        endp_invbalance = invbalance;
                }
        }

        results += '</table>';

        results += '<div class="clearfloat"></div><br />';
        results += '<table><tr><th>&nbsp;</th><th>Prepay</th><th>Invest</th></tr>';
        results += '<tr><td>Total Interest (' + PF2(pmonth/12) + ' yrs)</td><td>' + PDC2(pinttotal) + '</td><td>' + PDC2(iinttotal) + '</td></tr>';
        results += '<tr><td>Loan Payback Time (Years)</td><td>' + PF2(pmonth/12) + '</td><td>' + PF2(imonth/12) + '</td></tr>';
        results += '</table>';

        results += '<div class="clearfloat"></div><br />';
        if (endp_ibalance < endp_invbalance) {
                results += 'In your case, it is wiser to invest than prepay.<br />';
        } else {
                results += 'In your case, it is wiser to prepay than invest.<br />';
        }
        results += 'Investing Loan Balance at ' + pmonth + ' months was ' + PDC2(endp_ibalance) + '<br />';
        results += 'Investment Balance at ' + pmonth + ' months was ' + PDC2(endp_invbalance) + '<br />';

        results += '<div class="clearfloat"></div><br />';
        resbox.innerHTML = results;
}

