/* parameters */

var P = 0;		// principal (initial amount of loan)
var I = 0;		// annual interest rate (1 to 100 percent)
var L = 0;		// amortized length of loan in years
var DP = 0;		// down payment
var PT = 0;		// property taxes
var IP = 0;		// annual insurance premium
var PP = 0;		// monthly principal pre-payment
var J = 0;		// monthly interest in decimal form
var N = 0;		// amortized length of loan in months
var M = 0;		// total monthly payment

/* functions */

function mort_calc (formname, pField, iField, lField, dpField, ptField, ipField, ppField, showATField, outObj) {
	// make sure form is valid
	var mortForm = eval ("document." + formname);
	if (!mortForm) {
		alert ("Mortgage Calculator: invalid form: '" + formname + "'");
		return;
	}
	// make sure fields are valid
	var pObj = eval ("mortForm." + pField);
	var iObj = eval ("mortForm." + iField);
	var lObj = eval ("mortForm." + lField);
	var dpObj = eval ("mortForm." + dpField);
	var ptObj = eval ("mortForm." + ptField);
	var ipObj = eval ("mortForm." + ipField);
	var ppObj = eval ("mortForm." + ppField);
	var showATObj = eval ("mortForm." + showATField);
	if (!pObj || !iObj || !lObj || !dpObj || !ptObj || !ipObj || !ppObj || !showATObj) {
		alert ("Mortgage Calculator: invalid form field encountered.");
		return;
	}
	var outEl = document.getElementById(outObj);
	if (!outEl) {
		alert ("Mortgage Calculator: invalid output element.");
		return;
	}
	// get form objects
	P = pObj.value;
	I = iObj.value;
	L = lObj.value;
	DP = dpObj.value;
	PT = ptObj.value;
	IP = ipObj.value;
	PP = ppObj.value;
	// get principal and validate
	if (P.length == 0) {
		alert ("Please enter a principal loan balance.");
		return;
	}
	P = parseFloat (P);
	if (isNaN(P) || P <= 0) {
		alert ("Principal loan balance is invalid.");
		return;
	}
	// get interest rate and validate
	if (I.length == 0) {
		alert ("Please enter an annual interest rate.");
		return;
	}
	I = parseFloat (I);
	if (isNaN(I) || I < 0 || I > 100) {
		alert ("Annual interest rate is invalid.");
		return;
	}
	// get amortization period and validate
	if (L.length == 0) {
		alert ("Please enter an amortization length.");
		return;
	}
	L = parseInt (L);
	if (isNaN(L)) {
		alert ("Amortization length is invalid.");
		return;
	}
	// get down payment and validate
	if (DP.length == 0)
		DP = 0;
	else {
		DP = parseFloat (DP);
		if (isNaN(DP)) {
			alert ("Down payment is invalid.");
			return;
		}
		else if (DP >= P) {
			alert ("Down payment is too large.");
			return;
		}
	}
	// get property tax and validate
	if (PT.length == 0)
		PT = 0;
	else {
		PT = parseFloat (PT);
		if (isNaN(PT)) {
			alert ("Property Tax is invalid.");
			return;
		}
	}
	// get insurance premium and validate
	if (IP.length == 0)
		IP = 0;
	else {
		IP = parseFloat (IP);
		if (isNaN(IP)) {
			alert ("Monthly insurance premium is invalid.");
			return;
		}
	}
	// get principal pre-payment and validate
	if (PP.length == 0)
		PP = 0;
	else {
		PP = parseFloat (PP);
		if (isNaN(PP)) {
			alert ("Monthly principal pre-payment is invalid.");
			return;
		}
	}
	// adjust principal by down payment
	P -= DP;
	// calculate additional parameters
	J = (I == 0) ? 0 : (I / 1200);
	N = (L * 12);
	// calculate monthly payment
	M = (J == 0) ? 0 : (P * (J / (1 - Math.pow((1 + J), -N))));
	// output totals
	outEl.innerHTML = "";
	outEl.style.display = "";
	mort_dispData (outEl);
	// if selected, output amortization table
	if (showATObj.options[showATObj.selectedIndex].value == "yes") {
		outEl.innerHTML += "<br /><br />";
		mort_dispTable (outEl);
	}
}
function mort_dispData (el) {
	var dispM = M;
	if (PT > 0)
		dispM += (PT / 12);
	if (IP > 0)
		dispM += (IP / 12);
	var output = "<b>Results:</b><br /><br />";
	output += "<table border=\"0\" cellspacing=\"0\" cellpadding=\"2\">";
	output += "<tr><td>Price:</td><td>" + mort_strToMoney(P+DP) + "</td></tr>";
	output += "<tr><td>Down Payment:</td><td>" + mort_strToMoney(DP) + "</td></tr>";
	output += "<tr><td>Rate:</td><td>" + I + "%</td></tr>";
	output += "<tr><td>Term:</td><td>" + L + " years</td></tr>";
	output += "<tr><td>Taxes:</td><td>" + mort_strToMoney(PT) + "</td></tr>";
	output += "<tr><td>Insurance:</td><td>" + mort_strToMoney(IP) + "</td></tr>";
	output += "<tr><td colspan=\"2\">&nbsp;</td></tr>";
	output += "<tr><td>Calculated Monthly Payment:</td><td>" + mort_strToMoney(dispM) + "</td></tr>";
	output += "</table>";
	// write output
	el.innerHTML += output;
}
function mort_dispTable (el) {
	// month array
	var months = new Array ("Jan", "Feb", "Mar", "Apr", "May", "June", "July", "Aug", "Sept", "Oct", "Nov", "Dec");
	// get the current month and year
	var today = new Date ();
	var curMonth = today.getMonth ();
	var curYear = today.getFullYear ();
	// begin loop
	var curP = P;
	var totalH = 0;
	var totalC = 0;
	var gTotalH = 0;
	var output = "<table width=\"100%\" cellspacing=\"0\" cellpadding=\"2\">";
	while (curP > 0) {
		// calculate new params
		var H = curP * J;		// current monthly interest
		var C = M - H + PP;		// current monthly principal (adjusted for pre-payment)
		var Q = curP - C;		// new balance of principal
		// generate output
		if (curP == P || curMonth == 0) {
			output += "<tr><td colspan=\"4\">The following mortgage would result for " + curYear + "</td></tr>";
			output += "<tr><td><b>Month</b></td><td><b>Principal</b></td><td><b>Interest</b></td><td><b>Balance</b></td></tr>";
			output += "<tr><td colspan=\"4\"><hr></td></tr>";
		}
		output += "<tr>";
		output += "<td>" + months[curMonth] + "</td>";
		output += "<td>" + mort_strToMoney(C) + "</td>";
		output += "<td>" + mort_strToMoney(H) + "</td>";
		output += "<td>" + mort_strToMoney(Q) + "</td>";
		output += "</tr>";
		// update balance and totals
		curP = Q;
		totalH += H;
		totalC += C;
		gTotalH += H;
		// increment month and year
		curMonth += 1;
		if (curMonth == 12) {
			curMonth = 0;
			output += "<tr><td colspan=\"4\"><hr></td></tr>";
			output += "<tr><td colspan=\"4\">For " + curYear + ", total interest is " + mort_strToMoney(totalH) + ", total principal is " + mort_strToMoney(totalC) + "</td></tr>";
			output += "<tr><td colspan=\"4\">&nbsp;</td></tr>";
			curYear++;
			totalH = 0;
			totalC = 0;
		}
	}
	if (curMonth != 0) {
		output += "<tr><td colspan=\"4\"><hr></td></tr>";
		output += "<tr><td colspan=\"4\">For " + curYear + ", total interest is " + mort_strToMoney(totalH) + ", total principal is " + mort_strToMoney(totalC) + "</td></tr>";
		output += "<tr><td colspan=\"4\">&nbsp;</td></tr>";
	}
	output += "<tr><td colspan=\"4\">Total paid interest: " + mort_strToMoney(gTotalH) + "</td></tr>";
	output += "</table>";
	// write output
	el.innerHTML += output;
}
function mort_strToMoney (value) {
	if (value <= 0)
		return "$0";
	var tempStr = value.toString ();
	var x = tempStr.split('.');
	var x1 = x[0];
	if (x.length > 1) {
		var dec = x[1].substr(0,2);
		if (dec.length == 1)
			dec += "0";
		var x2 = "." + dec;
	}
	else
		var x2 = "";
	var rgx = /(\d+)(\d{3})/;
	while (rgx.test(x1))
		x1 = x1.replace(rgx, '$1' + ',' + '$2');
	return '$' + x1 + x2;
}

