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 isNumber(s) {
	var oneDecimal;
	s = "" + s;
	var len = s.length;
	for (var i = 0; i < len; ++i) {
		var ch = s.charAt(i);
		if (i == 0 && ch == "-") {
			continue;
		}
		if (ch == "." && !oneDecimal) {
			oneDecimal = true;
			continue;
		}
		if (ch < "0" || ch > "9") {
			return false;
		}
	}
	return true;
}

function formatNumber(n, d) {
	var base = Math.floor(n);
	var decimal = Math.round((n - base) * Math.pow(10, d));
	var unformattedBase = "" + base;
	var len = unformattedBase.length;
	var formattedBase = "";
	for (var i = 0; i < len; ++i) {
		if (i && (len - i) % 3 == 0) {
			formattedBase += ",";
		}
		formattedBase += unformattedBase.substring(i, i+1);
	}
	var formattedDecimal = "";
	if (d) {
		for (var i = 0; i < d; ++i) {
			formattedDecimal = "" + decimal % 10 + formattedDecimal;
			decimal = Math.floor(decimal / 10);
		}
		formattedDecimal = "." + formattedDecimal;
	}
	return formattedBase + formattedDecimal;
}

function computeForm(form) {
	if (!chkNumber(form.YT, 1, 50, "Years to College", "no") ||
		!chkNumber(form.PV, 0, 9999999, "Current Savings", "no") ||
		!chkNumber(form.IR, 0.01, 19.99, "Rate of Return", "no") ||
		!chkNumber(form.CT, 0, 9999999, "Current Annual Cost", "no") ||
		!chkNumber(form.CR, 0.01, 19.99, "Annual Increase", "no") ||
		!chkNumber(form.CY, 1, 50, "Years Enrolled", "no")) {
		return;
	}
	var CT = parseFloat(form.CT.value);
	var CY = parseFloat(form.CY.value);
	var PV = parseFloat(form.PV.value);
	var YT = parseFloat(form.YT.value);
	var CR = parseFloat(form.CR.value) / 100;
	var IR = parseFloat(form.IR.value) / 100;
	var PR = 0;
	var N = CY + YT;
	var M = N - (CY / 2);
	var L =  Math.pow((1 + CR),M);
	var FV = CT * CY * L;
	var NUM = FV - (PV * Math.pow((1 + IR), N));
	var O = Math.pow((1 + PR),(N));
	var P = Math.pow((1 + IR),(N));
	var Q = PV * P;
	if (Math.abs(PR-IR) < 0.0000001) {
		var DEN = N * Math.pow((1 + PR),N);
	} else {
		var DEN = (O - P) / (PR - IR) - Math.pow((1 + PR),N);
	}
	var PMT = NUM / DEN;

	var docmessage;
    docmessage = CY + " years of college will cost <strong>$" + formatNumber(FV, 2) + "</strong>.<br /><br />";
    docmessage += "The future value of your investment would be <strong>$" + formatNumber(Q, 2) + "</strong>.<br /><br />";
    docmessage += "Your yearly contribution needs to be <strong>$" + formatNumber(PMT, 2) + "</strong>.";
	result.innerHTML = docmessage;
}