
function computeLoan(f) {
	 var errorMessage = "";
	 var principal = stringToNumber(f.amount.value);
	 var rate = stringToNumber(f.rate.value);
	 var years = stringToNumber(f.term.value);
//	 var addition = stringToNumber(f.additional.value);

	 if (principal == null || isNaN(principal) || principal <= 0) { errorMessage += "Please enter a positive number for the loan amount.\n"; }
	 if (rate == null || isNaN(rate) || rate <= 0) { errorMessage += "Please enter a positive number for the interest rate.\n"; }
	 if (years == null || isNaN(years) || years <= 0) { errorMessage += "Please enter a positive number for the term.\n"; }
//	 if (addition == null || isNaN(addition) || addition < 0) { errorMessage += "Please enter 0 or a positive number for the additional monthly payment.\n"; }

	 if (errorMessage != "") {
			 alert(errorMessage);
			 setLoanCalcResults(f,"","","","");
	} else {
		var period = 12;
		 var interest = rate / (period * 100);
		 var periods = years * period;
		var periodPayment = ( principal * ( interest / ( 1 - Math.pow( (1 + interest) , (0 - periods) ) ) ) );
		periods = 0 - ( Math.log( 1 - (interest * principal / periodPayment) ) / Math.log(1 + interest) );
		 var interest_total = (periodPayment * periods) - principal;
		 setLoanCalcResults( f, periodPayment, interest_total, (interest_total / periods), (periods / period) );
	 }
	return false;
}

function setLoanCalcResults(f, payment, interest, interest_avg, years) {
	f.monthly_payment.value = (payment == "") ? "" : commify(Math.round(payment * 100) / 100);
	f.total_interest.value = (interest == "") ? "" : commify(Math.round(interest * 100) / 100);
	f.average_monthly_interest.value = (interest_avg == "") ? "" : commify(Math.round(interest_avg * 100) / 100);
	f.num_of_years.value = (years == "") ? "" : commify(Math.round(years * 100) / 100);
}

function stringToNumber(numIn) {
	var numOut = numIn.toString().replace(/[$\,\%\+]/g,'');
	var decimalCount = 0;
	var invalidCount = 0;
	for (var i = 0; i < numOut.length; i++) {
		 var oneChar = numOut.charAt(i);
			 if (oneChar == ".") { 
				 decimalCount++; 
			 }
			else if (oneChar < "0" || oneChar > "9") { 
				invalidCount++;
			}
	 }
		 if (decimalCount > 1 || invalidCount > 0) { 
			return null; 
		 }
		else { 
			return parseFloat(numOut);
		}
}

function commify(numIn) {
	 var parts = numIn.toString().split(".");
	 var temp = "";
	 
	 while(parts[0].length > 3) {
		 temp = "," + parts[0].match(/\d{3}$/)[0] + temp;
		 parts[0] = parts[0].replace(/\d{3}$/,"");
	 }
	 if (parts.length < 2) {
		 parts[1] = "00";
	}
	 while(parts[1].length < 2) { 
		 parts[1] += "0";
	 }
	 return parts[0] + temp + (parts.length == 2 ? "." + parts[1] : "");
}
