//********************************************************************
//
// 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;

