function format(input,p,s) {
  if(p > 0) {
    p++;
    var rounder = "."; for(var i = 1; i < p; i++) { rounder += "0"; } rounder += "5";
    var temp = eval(input) + eval(rounder);
    var decs = "" + (temp - Math.floor(temp));
    decs = decs.substring(2,p+1);
  }
  else { temp = Math.round(input); }
  var ints = "" + Math.floor(temp);
  var output = ints.substring(ints.length,(ints.length - 1));
  for(i = 1; i < ints.length; i++) {
    if(s) { if(!(i % 3)) { output = s + output; } }
    output = ints.substring((ints.length - i),(ints.length - i - 1)) + output;
  }
  if(p > 0) { output = output + "." + decs; }
  return output;
}

function isNotNull(input,msg) {
  var err = msg + " cannot be zero or left blank.";
  if((input.value == 0) || (input.value.length == 0)) {
    alert(err);
    return false;
  }
  return true;
}

function isNumeric(input,msg) {
  var mask = "1234567890";
  var err = msg + " must contain valid numbers only.  Check that you have not entered any commas.";
  var dp = false;
  for(var i = 0; i < input.length; i++) {
    if((mask.indexOf(input.charAt(i)) == -1)) { 
      if(input.charAt(i) == '.') {
        if(dp == true) { alert(err); return false; }
        else { dp = true; }
      }
      else { alert(err); return false; }
    }
  }
  return true;
}

function checkRange(input,msg,low,high) {
  var err = msg + " must be between " + low + " and " + high + ".";
  if((input.value < low) || (input.value > high)) { alert (err); return false; }
  return true;
}

function calcMaxLoan(form) {
  if(!isNumeric(form.fAnnualIncome.value,"Annual Income")) { return false; }
  if(!isNumeric(form.fMonthlyDebt.value,"Monthly Debt")) { return false; }
  if(!isNumeric(form.fDownPayment.value,"Down Payment")) { return false; }
  if(!isNumeric(form.fInterestRate.value,"Interest Rate")) { return false; }
  if(!isNumeric(form.fLoanLength.value,"Loan Length")) { return false; }
  if(!isNotNull(form.fAnnualIncome,"Annual Income")) { return false; }
  if(!isNotNull(form.fInterestRate,"Interest Rate")) { return false; }
  if(!isNotNull(form.fLoanLength,"Loan Length")) { return false; }
  if(!checkRange(form.fInterestRate,"Interest Rate",3,20)) { return false; }
  if(!checkRange(form.fLoanLength,"Loan Length",5,30)) { return false; }
  form.fAnnualIncome.value = format(form.fAnnualIncome.value,0,0);
  form.fMonthlyDebt.value = format(form.fMonthlyDebt.value,0,0);
  form.fDownPayment.value = format(form.fDownPayment.value,0,0);
  form.fInterestRate.value = format(form.fInterestRate.value,3,0);
  form.fLoanLength.value = format(form.fLoanLength.value,0,0);
  var annualIncome = eval(form.fAnnualIncome.value);
  var monthlyDebt = eval(form.fMonthlyDebt.value);
  var downPayment = eval(form.fDownPayment.value);
  var interestRate = eval(form.fInterestRate.value);
  var loanLength = eval(form.fLoanLength.value);
  var frontEndRate = .28;
  var backEndRate = .36;
  var monthlyIncome = annualIncome / 12;
  var frontEndPITI = monthlyIncome * frontEndRate;
  var backEndPITI = (monthlyIncome * backEndRate) - monthlyDebt;
  var PITI;
  frontEndPITI < backEndPITI ? PITI = frontEndPITI : PITI = backEndPITI;
  var rateConstant = interestRate / 1200;
  var amv = (1 - Math.pow((1 + rateConstant),(-(loanLength) * 12))) / rateConstant;
  var PITIov = 1.5;
  var houseValue = 1000;
  for(var i = 0; i < 20; i++) {
    var ti = PITIov / 1200 * houseValue;
    var loanAmount = (PITI - ti) * amv;
    houseValue = loanAmount + downPayment;
  }
  var downPercent = downPayment / houseValue * 100;
  var loanToValue = (houseValue - downPayment) / houseValue * 100;
  var moPropTaxIns = houseValue * PITIov / 1200;
  if(loanToValue <= 80) { var moPMI = 0; }
  else {
    var pmi = .32;
    if (loanToValue >= 85) { pmi = .52; }
    if (loanToValue >= 90) { pmi = .78; }
    if (loanToValue >= 95) { pmi = .90; }
    PITIov += pmi;
    houseValue = 1000;
    for(i = 0; i < 20; i++) {
      ti = PITIov / 1200 * houseValue;
      loanAmount = (PITI - ti) * amv;
      houseValue = loanAmount + downPayment;
    }
    downPercent = downPayment / houseValue * 100;
    moPropTaxIns = houseValue * (PITIov - 0.5) / 1200;
    moPMI = houseValue * pmi / 1200;
    loanToValue = (houseValue - downPayment) / houseValue * 100;
  }
  var moPrincipalInterest = loanAmount / amv;
  var totalMonthly = moPrincipalInterest + moPropTaxIns + moPMI;
  if((loanAmount <= 0) || (houseValue <= 0)) {
    alert("Using the values you entered, your debt would exceed your income.");
    return false;
  }
  form.fHouseValue.value = "$" + format(houseValue,0,",");
  form.fLoanAmount.value = "$" + format(loanAmount,0,",");
  form.fDownPercent.value = format(downPercent,2,0) + "%";
  form.fLoanToValue.value = format(loanToValue,2,0) + "%";
  form.fMoPrinInt.value = "$" + format(moPrincipalInterest,2,",");
  form.fMoTaxIns.value = "$" + format(moPropTaxIns,2,",");
  form.fMoPMI.value = "$" + format(moPMI,2,",");
  form.fTotalMonthly.value = "$" + format(totalMonthly,2,",");
  return true;
}