// JavaScript Document

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 = addition + ( 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) );
  }
}
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] : "");
}
//-->