//*********************************************************************
//
// Mortgage Calculator
//
// Copyright (c) 2002, MFM Communication Software, Inc.
//
//*********************************************************************
//
// mortcalc.js
// $Id: mortcalc.js,v 1.5 2008/10/15 18:38:30 mdame Exp $
//
// Basic mortgage calculator and form processing funcations.
//
//*********************************************************************
//
// Tell jsjam.pl to not change these identifier and function names
//
// jsjam-keep:CheckFloatField
// jsjam-keep:CheckIntField
// jsjam-keep:CheckDollarField
// jsjam-keep:ReadDollarField
// jsjam-keep:FloatToDollarString
// jsjam-keep:RecalcDownPay
// jsjam-keep:RecalcDownPayPer
// jsjam-keep:RecalcDownPayAmount
// jsjam-keep:RecalcMonthlyPay
// jsjam-keep:RecalcTermYears
// jsjam-keep:RecalcTermMonths
// jsjam-keep:CalculatePrice
// jsjam-keep:Initialize
// jsjam-keep:calcform
// jsjam-keep:downpay
// jsjam-keep:price
// jsjam-keep:intYear
// jsjam-keep:termMonths
// jsjam-keep:termYears
// jsjam-keep:payMonth
// jsjam-keep:downpayper
// jsjam-keep:pmi
// jsjam-keep:totalPay
// jsjam-keep:cache
//
//*********************************************************************

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 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 price = ReadDollarField(frm.price);

    if (isNaN(price) || (price == 0))
    {
      frm.downpay.value = "";
    }
    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;
}


//********************************************************************
// 
// CalculatePrice(form)
//
// Calculates the minimum and maximum price based on minimum and maximum
// payments
// 
//********************************************************************
function CalculatePrice(calcForm, searchForm)
{
  var min = ReadDollarField(calcForm.minpay);
  var max = ReadDollarField(calcForm.maxpay);
  var down = ReadDollarField(calcForm.downpay);
  var rate = (calcForm.intYear.value / 100) / 12;
  var months = calcForm.termMonths.value;

  var minPrice = parseInt(((Math.pow((1 + rate), months) - 1) / (rate * Math.pow((1 + rate), months))) * min) + parseInt(down);

  var maxPrice = parseInt(((Math.pow((1 + rate), months) - 1) / (rate * Math.pow((1 + rate), months))) * max) + parseInt(down);

  searchForm.minprice.value = minPrice;
  searchForm.maxprice.value = maxPrice;
}


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


//*********************************************************************
//
// CHANGE HISTORY
//
// $Log: mortcalc.js,v $
// Revision 1.5  2008/10/15 18:38:30  mdame
// Fixed incorrect if statement in RecalcDownPayAmount()
//
// Revision 1.4  2008/10/15 18:20:48  mdame
// Added CalculatePrice() for 'Search By Payment' feature; added check for NaN on price in RecalcDownPayment() so the downpayment will be blank instead of 0
//
// Revision 1.3  2006/10/03 20:52:58  mdame
// Updated jsjam-keep settings
//
// Revision 1.2  2006/10/02 18:53:50  mdame
// Add standard header and change log
//
// Revision 1.1  2004/02/06 15:58:49  dsteinbrunner
// moved js scripts from re/common to general
//
// 2002-05-01 -- mtd
// Script started
//
//*********************************************************************

