//********************************************************************//// Mortgage Calculator//// Copyright 2002, MFM Communication Software, Inc.////********************************************************************//// All page number references in the comments are to the book:// "JavaScript:  The Definitive Guide, 3rd Ed." by David Flanagan////********************************************************************//// mortcalc.js//// Basic mortgage calculator and form processing funcations.////********************************************************************//// Change History//// 2002-05-01 -- mtd// Script started////********************************************************************var cache;//********************************************************************// // CheckFloatField(field)//// Check the value of the given field to ensure it is a valid // floating point number.// //********************************************************************function CheckFloatField(field){  var val = field.value;  // Get rid of trailing zeros  if (val.indexOf(".") != -1)  {    while(val.charAt(val.length - 1) == "0")      val = val.substring(0, val.length - 1);    if (val.charAt(val.length - 1) == ".")      val = val.substring(0, val.length - 1);  }  if ("" + parseFloat(val) != val)    field.value = field.defaultValue;}//********************************************************************// // CheckIntField(field)//// Check the value of the given field to ensure it is a valid // integer.// //********************************************************************function CheckIntField(field){  var val = field.value;  if ("" + parseInt(val) != val)    field.value = field.defaultValue;}//********************************************************************// // CheckDollarField(field)//// Check the value of the given field to ensure it is a valid // dollar amount.// //********************************************************************function CheckDollarField(field){  var val = ReadDollarField(field);  if (isNaN(val))    field.value = cache;  else  {    var str = FloatToDollarString(val);    field.value = str;  }}//********************************************************************// // ReadDollarField(field)//// Helper function to parse a dollar field// //********************************************************************function ReadDollarField(field){  var str = field.value;  if (str.charAt(0) == "$")    str = str.substring(1, str.length);  var pos = str.lastIndexOf(",");  while(pos != -1)  {    str = str.substring(0, pos) + str.substring(pos + 1, str.length);    pos = str.lastIndexOf(",", pos);  }  return parseFloat(str);}//********************************************************************// // FloatToDollarString(field)//// Helper function to convert floating point numbers into dollar// strings// //********************************************************************function FloatToDollarString(val){  // Round off to nearest dollar  var str = "" + Math.round(val);  // Add commas  var pos = str.length;  pos -= 4;  while (pos >=0)  {    str = str.substring(0, pos + 1) + "," + str.substring(pos + 1, str.length);    pos -= 3;  }  return str;}//********************************************************************// // RecalcDownPay(form)//// Recalculate the down payment amount based on the monthly payment// //********************************************************************function RecalcDownPay(frm){  var annualInt = parseFloat(frm.intYear.value) / 100.0;  var monthlyInt =  annualInt / 12.0;  var months = parseInt(frm.termMonths.value);  var monthlyPay = ReadDollarField(frm.payMonth);  var price = ReadDollarField(frm.price);  var effPrinciple;  if (monthlyInt == 0)    effPrinciple = monthlyPay * months;  else    effPrinciple = monthlyPay * ((1 - Math.pow((1 + monthlyInt), -months)) /      monthlyInt);  var downpay = price - effPrinciple;  frm.downpay.value = "" + downpay;  CheckDollarField(frm.downpay);  RecalcDownPayPer(frm);  RecalcMonthlyPay(frm);}//********************************************************************// // RecalcDownPayPer(form)//// Recalculate the down payment percentage based on the down// payment amount.// //********************************************************************function RecalcDownPayPer(frm){  var price = ReadDollarField(frm.price);  var downpay = ReadDollarField(frm.downpay);  var downpayper = 100 * (downpay / price);  if ((downpayper >= 0) && (downpayper <= 100))  {    var downpayperStr = "" + downpayper;    var pos = downpayperStr.indexOf(".")    if (downpayperStr.length > (pos + 4))      downpayperStr = downpayperStr.substring(0, pos + 4);    frm.downpayper.value = downpayperStr;  }  else if (downpayper < 0)  {    frm.downpayper.value = "0";    RecalcDownPayAmount(frm);  }  else if (downpayper > 100)  {    frm.downpayper.value = "100";    RecalcDownPayAmount(frm);  }}//********************************************************************// // RecalcDownPayAmount(form)//// Recalculate the down payment amount based on the down // payment percentage// //********************************************************************function RecalcDownPayAmount(frm){  var price = ReadDollarField(frm.price);  var downpayper = ReadDollarField(frm.downpayper);  if (downpayper < 0)  {    frm.downpayper.value = "0";    RecalcDownPayAmount(frm);  }  else if (downpayper > 100)  {    frm.downpayper.value = "100";    RecalcDownPayAmount(frm);  }  else  {    var downpay = price * (downpayper / 100);    downpay = FloatToDollarString(downpay);    frm.downpay.value = "" + downpay;  }}//********************************************************************// // RecalcMonthlyPay(form)//// Recalculate the monthly payment// //********************************************************************function RecalcMonthlyPay(frm){  var principle = ReadDollarField(frm.price) - ReadDollarField(frm.downpay);  var annualInt = parseFloat(frm.intYear.value) / 100.0;  var monthlyInt = annualInt / 12;  var months = parseInt(frm.termMonths.value);  var downpay = ReadDollarField(frm.downpay) / ReadDollarField(frm.price);  var monthlyPay = principle;  if (months > 0)  {    if (monthlyInt == 0)      monthlyPay = principle / months;    else      monthlyPay = principle * ( monthlyInt / ( 1 - Math.pow((1 +  monthlyInt), -months) ) );    monthlyPay = Math.round(monthlyPay * 100) / 100;  }  var pmi = 0;  if ((downpay < .20) || (frm.downpay.value == 0) || (frm.price.value == 0))    pmi = (principle * .01) / 12.0;  var monthlyTotal = Number(pmi) + Number(monthlyPay);  frm.payMonth.value = FloatToDollarString(monthlyPay);  frm.pmi.value = FloatToDollarString(pmi);  frm.totalPay.value = FloatToDollarString(monthlyTotal);}//********************************************************************// // RecalcTermYears(form)//// Recalculate the number of years based on the number of months// //********************************************************************function RecalcTermYears(frm){  var months = parseInt(frm.termMonths.value);  var years = parseFloat(months) / 12.0;  frm.termYears.value = "" + years;  frm.termMonths.value = "" + months;}//********************************************************************// // RecalcTermMonths(form)//// Recalculate the number of months based on the number of years// //********************************************************************function RecalcTermMonths(frm){  var years = parseInt(frm.termYears.value);  var months = Math.round(years * 12.0);  years = parseFloat(months) / 12.0;  frm.termYears.value = "" + years;  frm.termMonths.value = "" + months;}//********************************************************************// // Initialize()//// Initializes the form when the page is loaded// //********************************************************************function Initialize(){  var frm = document.calcform;  CheckDollarField(frm.price);  RecalcDownPayAmount(frm);  RecalcMonthlyPay(frm);}window.onload = Initialize;