function chkNumber(input, min, max, fieldName, mayBeBlank) {
	msg = 'The ' + fieldName + ' field';
	if (input.value == null || input.value.length == 0) {
		if (mayBeBlank == "yes") {
			return true;
		}
		alert(msg + ' must be filled in!');
		input.focus();
		input.select();
		return false;
	}
	var str = input.value;
	for (var i = 0; i < str.length; i++) {
		var ch = str.substring(i, i + 1);
		if ((ch < "0" || "9" < ch) && ch != '.') {
			if (ch != '%' || i != str.length - 1) {
				alert(msg + ' has a non-numeric character');
				input.focus();
				input.select();
				return false;
			}
		}
	}
	var num = parseFloat(str);
	if (num < min || max < num) {
		alert(msg + ' must be between [' + min + ".." + max + "]");
		input.focus();
		input.select();
		return false;
	}
	return true;
}

function changeAmount(field) {
	var amt = field.form.amount.value == null || field.form.amount.value.length == 0 ? 0 : field.form.amount.value;
	var down = field.form.downpymt.value == null || field.form.downpymt.value.length == 0 ? 0 : field.form.downpymt.value;
	var price = field.form.purchase.value == null || field.form.purchase.value.length == 0 ? 0 : field.form.purchase.value;
	if (!chkNumber(field.form.amount, 0, 999999999, "Loan Amount", "yes") ||
		!chkNumber(field.form.purchase, 0, 999999999, "Purchase Price", "yes") ||
		!chkNumber(field.form.downpymt, 0, price, "Down Payment", "yes")) {
		return;
	}
	if (field.name == "amount") {
		if (down != 0 && price - amt >= 0) {
			field.form.downpymt.value = price - amt;
		} else {
			field.form.purchase.value = amt - -down;
		}
	} else {
		field.form.amount.value = price - down;
	}
}

function round(value, places) {
	var chars = (places == 0 ? 0 : places + 1);
	var str = "" + value;
	for (var i = 0; (str.substring(i, i + 1) != "." && i < str.length); ++i) {
	}
	if (i == 0) {
		return str;
	}
	if (i < 4) {
		return(str.substring(0, i + chars));
	}
	var retstr = "";
	for(j = 0; j < i; ++j) {
		if (j != 0 && (i-j) % 3 == 0) {
			retstr = retstr + ",";
		}
		retstr = retstr + str.substring(j, j + 1);
	}
	retstr = retstr + str.substring(i, i + chars);
	return retstr;
}

function calculatePayment(amt, rate, months) {
	if (rate <= 0) {
		return "0.00";
	}
	rate /= 1200.0;
	var power = 1.0;
	for (var i=0; ++i <= months; power *= (1 + rate)) {
	}
	return amt * (rate / (1 - (1 / power)));
}

function computeForm(form,name,ismort /* ismort is true for CMORT, false for CLOAN */) {
	if (!chkNumber(form.amount, 1000, 999999999, "Loan Amount", "no") ||
		!chkNumber(form.rate, 0.01, 19.99, "Interest Rate", "no") ||
		!chkNumber(form.months, 1, 72, "Number of Months", "no") ||
		!chkNumber(form.years, 1, 50, "Number of Years", "no") ||
		!chkNumber(form.cap, 0, 10, "ARM Cap", "yes")) {
		return;
	}
	if (form.rate.value < 1.0) {
		form.rate.value = form.rate.value * 100;
	}
	var months = ismort ? form.years.value * 12 : form.months.value;
	var monthpay = calculatePayment(form.amount.value, form.rate.value, months);
	var docmessage;
    docmessage = "Your monthly payment will be <strong>$" + round(monthpay, 2) + "</strong>.<br /><br />";
    docmessage = docmessage + "Your total payments will be <strong>$" + round(monthpay * months,2) + "</strong>.<br /><br />";
    docmessage = docmessage + "Your total interest paid will be <strong>$" + round((monthpay * months) - form.amount.value, 2) + "</strong>.<br /><br />";
	if (form.cap.value != null && form.cap.value.length != 0 && form.cap.value != 0) {
		if (form.cap.value < 1.0) {
			form.cap.value = form.cap.value * 100;
		}
		docmessage = docmessage + "With an Adjustable Rate Mortgage and a lifetime cap of +/-" + form.cap.value + "%:<ul>";
        docmessage = docmessage + "<li>Your lowest possible monthly payment would be <strong>$" + round(calculatePayment(form.amount.value,
																									form.rate.value - form.cap.value,
																									months), 2) + "</strong></li>";
		docmessage = docmessage + "Your highest possible monthly payment would be <strong>$" + round(calculatePayment(form.amount.value,
																													  form.rate.value - -form.cap.value,
																													  months), 2) + "</strong></li></ul>";
	}
	docmessage = docmessage + "<p align=\"center\"><strong>Amortization schedule (at " + form.rate.value + "%):</strong></p>";
	docmessage = docmessage + "<table border=\"0\" cellpadding=\"3\" cellspacing=\"1\" align=\"center\">";
	docmessage = docmessage + "<tr><td width=\"25%\" align=\"center\" bgcolor=\"#C6D9EC\">" + (ismort ? "Year" : "Month") + "</td>";
	docmessage = docmessage + "<td width=\"25%\" align=\"center\" bgcolor=\"#ACC8E3\">Principal Paid</td>";
	docmessage = docmessage + "<td width=\"25%\" align=\"center\" bgcolor=\"#C6D9EC\">Interest Paid</td>";
	docmessage = docmessage + "<td width=\"25%\" align=\"center\" bgcolor=\"#ACC8E3\">Remaining Balance</td></tr>";
	var k = form.rate.value / 1200;
	var m = 1;
	var y = 1;
	var bal = form.amount.value;
	var pp = 0;
	var ip = 0;
	var yip = 0;
	var ypp = 0;
	var i = 0;
	for(i = 0; ++i <= months;) {
		ip = bal * k;
		yip += ip;
		pp = monthpay - ip;
		ypp += pp;
		bal -= i == months ? bal : pp;
		if (!ismort) {
			docmessage = docmessage + "<tr><td width=\"25%\" align=\"center\" bgcolor=\"#ACC8E3\">" + i + "</td>";
			docmessage = docmessage + "<td width=\"25%\" align=\"center\" bgcolor=\"#6699CC\">$" + round(pp, 2) + "</td>";
			docmessage = docmessage + "<td width=\"25%\" align=\"center\" bgcolor=\"#ACC8E3\">$" + round(ip, 2) + "</td>";
			docmessage = docmessage + "<td width=\"25%\" align=\"center\" bgcolor=\"#6699CC\">$" + round(bal, 2) + "</td></tr>";
		}
		if (m++ == 12) {
			if (ismort) {
				docmessage = docmessage + "<tr><td width=\"25%\" align=\"center\" bgcolor=\"#ACC8E3\">" + y + "</td>";
				docmessage = docmessage + "<td width=\"25%\" align=\"center\" bgcolor=\"#6699CC\">$" + round(ypp, 2) + "</td>";
				docmessage = docmessage + "<td width=\"25%\" align=\"center\" bgcolor=\"#ACC8E3\">$" + round(yip, 2) + "</td>";
				docmessage = docmessage + "<td width=\"25%\" align=\"center\" bgcolor=\"#6699CC\">$" + round(bal, 2) + "</td></tr>";
            } else {
				docmessage = docmessage + "<tr><th colspan=\"4\" align=\"center\">Interest paid in year " + y + " is $" + round(yip, 2) + "</th></tr>";
			}
			yip = 0;
			ypp = 0;
			m = 1;
			++y;
		}
	}
	if (!ismort && m != 1) {
		docmessage = docmessage + "<tr><th colspan=\"4\" align=\"center\">Interest paid for year " + y + " is $" + round(yip, 2) + "</th></tr>";
    }
	docmessage = docmessage + "</table>";
	result.innerHTML = docmessage;
}