//Send this a number, and this function will return the number
//to two significant decimal places.

function floor(number)
{
  return Math.floor(number*Math.pow(10,2))/Math.pow(10,2);
}


//Send this a term, interestRate (a decimal), and a balance and this function
// will return a monthly payment

function getMonthlyPayment(scheduleTerm, startingInterestRate, totalLoanAmt)
{
  return (totalLoanAmt*(startingInterestRate/12))/(1-Math.pow((1+(startingInterestRate/12)),(-1*scheduleTerm)));
}




//Send this function a loan amount and a down Payment, ant it will return
//your monthlyMI

function PMICalculator (loanAmt, downPaymentAmt)
{
  var loanAmount = new Number(loanAmt);
  var salesPrice = new Number(loanAmount + downPaymentAmt);
  var LTV = loanAmount/salesPrice;
  var PMIRate = true;
  var LTVThreshold = 0.8;
  var monthlyMI = new Number(0.0);

  if (LTV < LTVThreshold)
	{
        PMIRate = false;
    }

  if (PMIRate)
	 {
		if ((LTV < 0.85)||(LTV == 0.85))
		  {
			PMIRate = 0.0032;
		  }
		else if ((LTV < 0.90)||(LTV == 0.90))
		  {
			PMIRate = 0.0052;
		  }
		else if ((LTV < 0.95)||(LTV == 0.95))
		  {
			PMIRate = 0.0078;
		  }
		else
		  {
			PMIRate = 0.0090;
		  }

        monthlyMI = loanAmt * PMIRate/12;
	}

  return monthlyMI;
}





//Within this file lives the constructor, the calculate, and the accessor 
//methods for AmortScheduleCalculator

//Define Global Variables
var MAX_TERM = new Number(360);
var COLUMN_DELIMITER = "\t";
var ROW_DELIMITER = "\r\n";
var HEADER= "paymentNumber" + COLUMN_DELIMITER + "month" + COLUMN_DELIMITER +
            "year" + COLUMN_DELIMITER + "principal" + COLUMN_DELIMITER +
            "interest" + COLUMN_DELIMITER + "beginningBalance" + COLUMN_DELIMITER +
            "endingBalance" + COLUMN_DELIMITER + "rate" + COLUMN_DELIMITER +
            "prepaidPrincipal" + COLUMN_DELIMITER + "prepaidInterest" + COLUMN_DELIMITER +
            "prepaidBeginBalance" + COLUMN_DELIMITER + "prepaidEndBalance" + COLUMN_DELIMITER +
            "taxSavings" + COLUMN_DELIMITER + "PMI" + ROW_DELIMITER;



//accessor methods for the AmortScheduleCalculator

//accessor method for Index Range
function checkIndexRange(index)
{        
  if (index > (this.payCount-1))
    {
      return false;
    }
  else
    {
      return true;
    }
}	    

//accessor method for payCount
function getPaymentCount()
{
  return (this.payCount);
}

//accessor method for month
function getMonth(index)
{
  if(this.checkIndexRange(index))
    {
      return (month[index]);
    }
  else return 0;
}

//accessor method for year
function getYear(index)
{
  if(this.checkIndexRange(index))
    {
      return (year[index]);
    }
  else return 0;
}

//accessor method for principal
function getPrincipal(index)
{
  if(this.checkIndexRange(index))
    {
      return (principal[index]);
    }
  else return 0;
}

//accessor method for interest
function getInterest(index)
{
  if(this.checkIndexRange(index))
    {
      return (this.interest[index]);
    }
  else return 0;
}

//accessor method for interestRate
function getInterestRate(index)
{
  if(this.checkIndexRange(index))
    {
      return (this.interestRate[index]);
    }
  else return 0;
}

//accessor method for Beginning Balance
function getBeginningBalance(index)
{
  if(this.checkIndexRange(index))
    {
      return (this.beginningBalance[index]);
    }
  else return 0;
}

//accessor method for Ending Balance
function getEndingBalance(index)
{
  if(this.checkIndexRange(index))
    {
      return (this.endingBalance[index]);
    }
  else return 0;
}
    
//accessor method for prepaidPrincipal
function getPrepaidPrincipal(index)
{
  if(this.checkIndexRange(index))
    {
      return (this.prepaidPrincipal[index]);
    }
  else return 0;
}

//accessor method for prepaidInterest
function getPrepaidInterest(index)
{
  if(this.checkIndexRange(index))
    {
      return (this.prepaidInterest[index]);
    }
  else return 0;
}

//accessor method for prepaidBeginBalance
function getPrepaidBeginBalance(index)
{
  if(this.checkIndexRange(index))
    {
      return (this.prepaidBeginBalance[index]);
    }
  else return 0;
}

//accessor method for prepaidEndBalance
function getPrepaidEndBalance(index)
{
  if(this.checkIndexRange(index))
    {
      return (this.prepaidEndBalance[index]);
    }
  else return 0;
}

//accessor method for totalNormalPrincipal
function getTotalNormalPrincipal()
{
  return (this.totalNormalPrincipal);
}

//accessor method for totalNormalInterest
function getTotalNormalInterest()
{
  return (this.totalNormalInterest);
}

//accessor method for taxSavings
function getTaxSavings(index)
{
  if(this.checkIndexRange(index))
    {
      return (this.taxSavings[index]);
    }
  else return 0;
}

//accessor method for totalOwnershipSavings
function getTotalOwnershipSavings()
{
  return (this.totalOwnershipSavings);
}

//accessor method for totalPMI
function getTotalPMI()
{
  return (this.totalPMI);
}
    
//accessor method for monthlyPayment
function getMonthlyPayments()
{
  return (this.monthlyPayment);
}    

//accessor method for totalTaxSavings
function getTotalTaxSavings()
{
  return (this.totalTaxSavings);
}

//accessor method for totalPrepaidSavings
function getTotalPrepaidSavings()
{
  return (this.totalPrepaidSavings);
}

//accessor method for PMI
function getPMI(index)
{
  if(this.checkIndexRange(index))
    {
      return (this.PMI[index]);
    }
  else return 0;
}	        

//accessor method for paymentNumber
function getPaymentNumber(index)
{
  if(this.checkIndexRange(index))
    {
      return (this.paymentNumber[index]);
    }
  else return 0;
}	        

//accessor method for HEADER
function getHeader()
{        
  return HEADER;
}

//accessor method for Schedule
function getSchedule()
{        
  var tempBuffer = "";
  var i = 0;

  for (i = 0; i < payCount; i++)
    {
      tempBuffer += (this.paymentNumber[i] + COLUMN_DELIMITER +
      		     this.month[i] + COLUMN_DELIMITER +
                     this.year[i] + COLUMN_DELIMITER +
                     this.principal[i] + COLUMN_DELIMITER +
                     this.interest[i] + COLUMN_DELIMITER +
                     this.beginningBalance[i] + COLUMN_DELIMITER +
                     this.endingBalance[i] + COLUMN_DELIMITER +
                     this.interestRate[i] + COLUMN_DELIMITER +
                     this.prepaidPrincipal[i] + COLUMN_DELIMITER +
                     this.prepaidInterest[i] + COLUMN_DELIMITER +
                     this.prepaidBeginBalance[i] + COLUMN_DELIMITER +
                     this.prepaidEndBalance[i] + COLUMN_DELIMITER +
                     this.taxSavings[i] + COLUMN_DELIMITER +
                     this.PMI[i] + COLUMN_DELIMITER);
                                
       tempBuffer += ROW_DELIMITER;
     }
       
  return tempBuffer;
}	        
    
//this method is the new AmortScheduleCalculator object constructor
function AmortScheduleCalculator()
{
  //Arrays
  this.paymentNumber = new Array();
  this.month = new Array();
  this.year = new Array();
  this.principal = new Array();
  this.interest = new Array();
  this.beginningBalance = new Array();
  this.endingBalance = new Array();
  this.interestRate = new Array();
  this.prepaidPrincipal = new Array();
  this.prepaidInterest = new Array();
  this.prepaidBeginBalance = new Array();
  this.prepaidEndBalance = new Array();
  this.taxSavings = new Array();
  this.PMI = new Array();
  this.monthlyPayment = new Array();

  //Numbers
  this.payCount = new Number();
  this.totalTaxSavings = new Number();
  this.totalNormalPrincipal = new Number();
  this.totalNormalInterest = new Number();
  this.totalPMI = new Number();
  this.totalPrepaidSavings = new Number();

  //ID
  this.className = "AmortScheduleCalculator";

  //Accessor Methods
  this.checkIndexRange = checkIndexRange;
  this.getPaymentCount = getPaymentCount;
  this.getMonth = getMonth;
  this.getYear = getYear;
  this.getPrincipal = getPrincipal;
  this.getInterest = getInterest;
  this.getInterestRate = getInterestRate;
  this.getBeginningBalance = getBeginningBalance;
  this.getEndingBalance = getEndingBalance;
  this.getPrepaidPrincipal = getPrepaidPrincipal;
  this.getPrepaidInterest = getPrepaidInterest;
  this.getPrepaidBeginBalance = getPrepaidBeginBalance;
  this.getPrepaidEndBalance = getPrepaidEndBalance;
  this.getTotalNormalPrincipal = getTotalNormalPrincipal;
  this.getTotalNormalInterest = getTotalNormalInterest;
  this.getTaxSavings = getTaxSavings;
  this.getTotalOwnershipSavings = getTotalOwnershipSavings;
  this.getTotalPMI = getTotalPMI;
  this.getMonthlyPayments = getMonthlyPayments;
  this.getTotalTaxSavings = getTotalTaxSavings;
  this.getTotalPrepaidSavings = getTotalPrepaidSavings;
  this.getPMI = getPMI;
  this.getPaymentNumber = getPaymentNumber;
  this.getHeader = getHeader;
  this.getSchedule = getSchedule;
  this.calculate = AmortScheduleCalculatorCalculate;

  return this;
}

function getARMPayments(totalLoanAmt, initialRate, loanTerm, firstTerm, recurringTerm, rateCap1, rateCap2, marginRate, indexRate, payments, rates) 
{
  //Declare Local Variables
  var currentChange = new Number(0);
  var currentPeriod = new Number(0); 
  var remainingTerm = new Number(0);
  var totalChanges = new Number(0);
  var remainingBalance = new Number(0);
  var monthlyPI = new Nnmber(0);
  var monthlyRate = new Number(0);
  var rateCap = new Number(0);

  monthlyRate = initialRate/12;
  remainingBalance = totalLoanAmt;

  monthlyPI = getMonthlyPayment(loanTerm,initialRate,remainingBalance);

  var li = 0;

  // First set of payments
  for(li = 0; li < firstTerm; li++)
    {
      payments[li] = monthlyPI;
      rates[li] = monthlyRate;
      remainingBalance = remainingBalance - (monthlyPI-((monthlyRate)* remainingBalance));
    }

  // Make adjustment for every subsequent change

  remainingTerm = loanTerm - firstTerm;
  totalChanges = remainingTerm / recurringTerm;
  currentPeriod = firstTerm - 1;

  // Determine remaining payments
  for(currentChange=0; currentChange < totalChanges; currentChange++)
    {
      if (currentChange == 0 )
        {
	  rateCap = rateCap1;
	}
      else
        {
	  rateCap = rateCap2;
	}

      monthlyRate = (monthlyRate * 12 + rateCap) / 12 ;

      // Cannot exceed the index + margin
      if (monthlyRate > ( indexRate + marginRate ) / 12 )
        {
	  monthlyRate = ( indexRate + marginRate ) / 12;
        }

      // Call the external function 
      remainingTerm = loanTerm - currentPeriod - 1;

      monthlyPI = getMonthlyPayment(remainingTerm, monthlyRate*1200, remainingBalance);

      // Second set of payments
      for (li=0; li < recurringTerm; li++)
        {
	  currentPeriod = currentPeriod + 1;
	  payments[fisrtTerm + li] = monthlyPI;
	  rates[firstTerm = li] = monthlyRate;
	  remainingBalance = remainingBalance - (monthlyPI-((monthlyRate)*remainingBalance));

	  if((remainingBalance < 0)||(remainingBalance == 0))
	    {
	      remainingBalance = 0;
	      monthlyPI = 0;
	    }
        }
    }	        
}    


//this method is the transliteration of the AmortScheduleCalculator calculate method
function AmortScheduleCalculatorCalculate(totalLoanAmt, propertyValue, startingInterestRate, startingMonth, startingYear, periodStart, periodEnd, monthlyPrepaidAmt, yearlyPrepaidAmt, lumpSumPrepaidAmt, lumpSumPrepaidMonth, federalTaxRate, monthlyMI, isARM, scheduleTerm, actualTerm, firstTerm, recurringTerm, rateCap1, rateCap2, marginRate, indexRate)
{

  //Declare local variables
  var payCounter = new Number(0);
  var hasPMI = false;
  var prepaying = false;
  var normalBeginningBalance = new Number(0.0);
  var prepaidBeginningBalance = new Number(0.0);
  var normalEndingBalance = new Number(0.0);
  var prepaidEndingBalance = new Number(0.0);
  var normalInterest = new Number(0.0);
  var prepaidInterest = new Number(0.0);
  var normalPrincipal = new Number(0.0);
  var prepaidPrincipal = new Number(0.0);
  var normalPI = new Number(0.0);
  var monthlyPI = new Number(0.0);
  var monthlyPMI = new Number(0.0);
  var currMonthPMI = new Number(0.0);
  var LTV = new Number(0.0);
  var monthlyRate = new Number(0.0);
  var taxSavings = new Number(0.0);
  var tempMonthlyRate = new Number(0.0);
  var currentMonth = new Number(startingMonth); 
  var currentYear = new Number(startingYear); 
  var className = "AmortScheduleCalculator";

  var payments = new Array();
  var rates = new Array();        

  var amortSchedule = new AmortScheduleCalculator();

  var LTV = new Number (0.0);
  var monthlyRate = new Number (0.0);
  var taxSavings = new Number(0.0);
  var tempMonthlyRate = new Number(0.0);
  var paymentNumber = new Number();

  var payments = new Array();
  var rates = new Array();

  var today = new Date();


  if (actualTerm == 0)
    {
      actualTerm = scheduleTerm;
    }

  //Automatically correct the ending month if it is calculated to be greater than the loan term
  if ((periodEnd > 0) && (periodEnd > actualTerm))
    {
      periodEnd = actualTerm;
    }

  //Check for prepay information
  prepaying = (lumpSumPrepaidAmt + yearlyPrepaidAmt + monthlyPrepaidAmt) > 0;

  //DETERMINE THE MONTHLY P&I PAYMENTS
  monthlyRate = (startingInterestRate / 12);

  //Check for an Adjustable Program
  if (isARM)
    {
      getARMPayments(totalLoanAmt,startingInterestRate, scheduleTerm,firstTerm,recurringTerm,rateCap1,rateCap2,marginRate,indexRate,payments,rates);
    }
  else
    {
      //It is a fixed interestRate
      //Get the fixed monthly payments
      monthlyPI = getMonthlyPayment(scheduleTerm, startingInterestRate, totalLoanAmt);
    }

  //Loop through each payment to create the AmortScheduleCalculator 
  for (paymentNumber = 1; ((paymentNumber < actualTerm)||(paymentNumber == actualTerm)); paymentNumber++)
  {                        
    if (paymentNumber == 1)
      {
        normalBeginningBalance = totalLoanAmt;
        prepaidBeginningBalance = totalLoanAmt;
      
        //If we have a propertyValue add PMI to the monthly payment 
        if ((propertyValue > 0) && (totalLoanAmt > 0) && (monthlyMI > 0))
          {
            //Only calculate PMI if we get a propertyValue and PMI
            LTV = totalLoanAmt / propertyValue;
            currMonthPMI = (LTV > 0.80)?monthlyMI:0.0;
          }

        if (currentMonth == 0)
          {
            // Get the current month
            currentMonth = today.getMonth() + 1;
          }

        if (currentYear == 0)
          {
            // Get the current year
            currentYear = today.getFullYear;
          }
      }
    else
      {
        normalBeginningBalance = normalEndingBalance;
        prepaidBeginningBalance = prepaidEndingBalance;
                
        if ((propertyValue > 0) && (normalBeginningBalance > 0) && (monthlyMI > 0))
          { 
            //Only calculate PMI if we get a propertyValue 
	    LTV = normalBeginningBalance / propertyValue;
            currMonthPMI = (LTV > 0.80)?monthlyMI:0.0;
          }

        currentMonth++;

        if (currentMonth > 12)
          {
            currentMonth = 1;
            currentYear++;
          }
      }

    //Check for fixed or variable 
    if (monthlyPI > 0 || (payments.length == 0))
      {
        normalPI = monthlyPI;
        tempMonthlyRate = monthlyRate;
      }
    else
      {
        normalPI = payments[paymentNumber-1];
        tempMonthlyRate = rates[paymentNumber-1];
      }

    if (Math.round(normalBeginningBalance) == 0)
      {
        normalInterest = 0;
        normalPrincipal = 0;
      }
    else
      {
        normalInterest = normalBeginningBalance * tempMonthlyRate;
        normalPrincipal = normalPI - normalInterest;
        //Start calculating tax savings per month 
        if (federalTaxRate > 0)
          {
            taxSavings = normalInterest * federalTaxRate;
          }

        if (Math.round(prepaidBeginningBalance) == 0 )
          {
            prepaidInterest = 0;
            prepaidPrincipal = 0;
          }
        else
          {
            prepaidInterest = prepaidBeginningBalance * tempMonthlyRate;
            
            //Add any monthly Prepayment 
            prepaidPrincipal = normalPI + monthlyPrepaidAmt - prepaidInterest;

            //Add any yearly Prepayment 
            if (yearlyPrepaidAmt > 0 && paymentNumber % 12 == 0)
              {
                prepaidPrincipal = prepaidPrincipal + yearlyPrepaidAmt; 
              }

            //Add any Lump Sum Payment 
            if (lumpSumPrepaidMonth == paymentNumber)
              {
                prepaidPrincipal = prepaidPrincipal + lumpSumPrepaidAmt;
              }

            // Make sure we stop after the loan has been paid off
            if (prepaidPrincipal > prepaidBeginningBalance)
              {
                prepaidPrincipal = prepaidBeginningBalance;
              }
          }
      }

    normalEndingBalance = normalBeginningBalance - normalPrincipal;
    prepaidEndingBalance = prepaidBeginningBalance - prepaidPrincipal;

    if (Math.round(normalEndingBalance) == 0 )
      {
        normalEndingBalance = 0;
      }

    if (Math.round(prepaidEndingBalance) == 0 )
      {
        prepaidEndingBalance = 0;
      }
      
    if (!prepaying)
      {
        prepaidPrincipal = 0;
        prepaidInterest = 0;
        prepaidBeginningBalance = 0;
        prepaidEndingBalance = 0;
      }
            
      //Only send back result set requested by user
      if ((paymentNumber < periodStart) || (paymentNumber > periodEnd))
        {
          continue;
        }
      else
        {
          //Build an object of named arrays as the result 
          amortSchedule.paymentNumber[payCounter] = paymentNumber;
          amortSchedule.month[payCounter] = currentMonth;
          amortSchedule.year[payCounter] = currentYear;
          amortSchedule.principal[payCounter] = normalPrincipal;
          amortSchedule.interest[payCounter] = normalInterest;
          amortSchedule.beginningBalance[payCounter] = normalBeginningBalance;
          amortSchedule.endingBalance[payCounter] = normalEndingBalance;
          amortSchedule.interestRate[payCounter] = tempMonthlyRate * 12;
          amortSchedule.prepaidPrincipal[payCounter] = prepaidPrincipal;
          amortSchedule.prepaidInterest[payCounter] = prepaidInterest;
          amortSchedule.prepaidBeginBalance[payCounter] = prepaidBeginningBalance;
          amortSchedule.prepaidEndBalance[payCounter] = prepaidEndingBalance;
          amortSchedule.taxSavings[payCounter] = taxSavings;
          amortSchedule.PMI[payCounter] = currMonthPMI;
          amortSchedule.monthlyPayment[payCounter] = normalPrincipal + normalInterest + currMonthPMI;

          amortSchedule.payCount = ++payCounter;
          amortSchedule.totalTaxSavings += taxSavings;
          amortSchedule.totalNormalPrincipal += normalPrincipal; 
          amortSchedule.totalNormalInterest += normalInterest; 
          amortSchedule.totalPMI += currMonthPMI;
          amortSchedule.totalPrepaidSavings += (normalPrincipal + normalInterest) - (prepaidPrincipal + prepaidInterest);
        }            
    }
                
  return amortSchedule;        
}












//Within this file lives the constructor, the calculate, and the accessor 
//methods for EstimatedClosingCosts
//Note:  I DID NOT overload the calculate function

function EstimatedClosingCosts()
{
  //Define variables
  this.className = "EstimatedClosingCosts";

  this.calculate = EstimatedClosingCostCalculate;

  return this;
}

function EstimatedClosingCostCalculate(loanAmt, loanTerm, interestRate, programPoints, downPaymentAmt, closingDate)
{

  //Define Local Variables
  var TAXSERVICEFEE = new Number(75);
  var FEETOCHARGE = new Number (350);
  var CREDITREPORTFEE = new Number(20.7);
  var APPRAISALFEE = new Number(300);
  var FLOODCERTFEE = new Number(15.5);
  var DEFAULTRATE = new Number(0.08);
  var DEFAULTLOANAMT = new Number(100000);
  var DEFAULTTERM = new Number(360);
  var DEFAULTINTERESTDAYS = new Number(15);

  var today = new Date();

  //Approximate the Loan Amount, if none passed in
  if (loanAmt == null)
    {
      var loanAmt = new Number(DEFAULTLOANAMT);
    }        
  
  //Determine LoanType and Term, if possible
  if (loanTerm == null)
    {
      var loanTerm = new Number(DEFAULTTERM);
    }
    
  //Determine Mortgage Insurance, based on LTV
  if (downPaymentAmt == null)
    {
      var downPaymentAmt = new Number(0);
    }

  if (interestRate == null)
    {
      var interestRate = new Number(DEFAULTRATE);
    }
  
  // Calculate any MI
  var monthlyMI = new Number(PMICalculator(loanAmt,downPaymentAmt));

  // 2 months prepaid MI
  var MIFee = new Number(2*monthlyMI);

  var interestDays = DEFAULTINTERESTDAYS;

  if (closingDate != null)
    {            
      interestDays = today.getDate();
    }

  var prePaidInterest = new Number(interestRate/365 * loanAmt * interestDays);
  
  // determine origination fee
  var originationFee = new Number(0);
  if (programPoints == null)
    {
      programPoints = new Number(0);
    }
  else if ((programPoints > 0.01)||(programPoints == 0.01))
    {
      originationFee = 0.01 * loanAmt;
    }

  // determine discount points
  var discountPoints = new Number(0);
  if (programPoints > .01)
    {
      discountPoints = (programPoints - 0.01) * loanAmt;
    }
  else if ((programPoints > 0)&&(programPoints < 0.01))
    {
      discountPoints = programPoints * loanAmt;
    }

  var paidByLender = new Number(0);
  if (programPoints < 0.0)
    {
      paidByLender = programPoints * loanAmt;
    }

  return (TAXSERVICEFEE + FEETOCHARGE + CREDITREPORTFEE + APPRAISALFEE + FLOODCERTFEE + paidByLender + discountPoints + originationFee + prePaidInterest + MIFee);

}








//This is the constructor, the calculate method and the accessor methods
//for the RentVsBuyCalculator

//Define global variables
var DEFAULT_INVESTMENT_RATE = new Number(0.08);

//ownership benefit accessor method
function getOwnershipBenefit()
{
  if ((this.rentingCost - this.ownershipCost) >0)
    {
      return (this.rentingCost - this.ownershipCost);
    }
  else
    {
      return 0;
    }
}

//renting cost accessor method
function getRentingCost()
{
  return this.rentingCost;
}

//ownership cost accessor method
function getOwnershipCost()
{
  return this.ownershipCost;
}

//tax savings accessor method
function getTaxSavings()
{
  return this.taxSavings;
}

//closing costs accessor method
function getClosingCosts()
{
  return this.closingCosts;
}

//gross costs accessor method
function getGrossCosts()
{
  return this.grossCosts;
}

//equity earned accessor method
function getEquityEarned()
{
  return this.equityEarned;
}

//potential savings accessor method
function getPotentialSavings()
{
  return ((this.rentingCost - this.ownershipCost) * DEFAULT_INVESTMENT_RATE);
}

//this method is the new AmortScheduleCalculator object constructor
function RentVsBuyCalculator()
{
  //variables
  this.rentingCost = new Number();
  this.ownershipCost = new Number();
  this.taxSavings = new Number();
  this.closingCosts = new Number();
  this.equityEarned = new Number();
  this.grossCosts = new Number();
  this.className = "RentVsBuyCalculator";

  //methods
  this.getOwnershipBenefit = getOwnershipBenefit;
  this.getRentingCost = getRentingCost;
  this.getTaxSavings = getTaxSavings;
  this.getClosingCosts = getClosingCosts;
  this.getGrossCosts = getGrossCosts;
  this.getEquityEarned = getEquityEarned;
  this.getPotentialSavings = getPotentialSavings;
  this.calculate = RentVsBuyCalculatorCalculate;
  
  return this;
}



// this is the calculate method
function RentVsBuyCalculatorCalculate (salesPrice, interestRate, loanAmt, loanTerm, monthlyMI, federalTaxRate, appreciationRate, discountPoints, expectedYearsToOwn, monthlyRent, annualRentIncrease, annualPropertyTax, annualMiscOwnershipFees, annualMiscRentalFees)
{
  var totalAppreciation = new Number(0);
  var totalPrincipalPaid = new Number(0);
  var totalInterestPaid = new Number(0);
  var totalPMI = new Number(0);
  var year = new Number(0);

  var rvb = new RentVsBuyCalculator();

  var amort = new AmortScheduleCalculator();
  amort = amort.calculate(loanAmt,salesPrice,interestRate,0,0,1,expectedYearsToOwn*12,0,0,0,0,federalTaxRate,monthlyMI,false,loanTerm,loanTerm,0,0,0,0,0,0);

  totalPrincipalPaid = amort.getTotalNormalPrincipal();        
  totalInterestPaid = amort.getTotalNormalInterest();        
  totalPMI = amort.getTotalPMI();        
  var annualRent = monthlyRent * 12;

  // Forcast appreciation/increases
    for (year = 0; year < expectedYearsToOwn; year++)
      {
        // Calculate all of the rental costs for the term expected
        rvb.rentingCost += annualRent;
        annualRent += annualRent * annualRentIncrease;
                 
        // Calculate the annual appreciation in equity
        if (year > 0)
          {
            totalAppreciation += salesPrice * appreciationRate;
          }
      }

  rvb.rentingCost += (annualMiscRentalFees * expectedYearsToOwn);

  rvb.equityEarned = (salesPrice + totalAppreciation + totalPrincipalPaid - loanAmt);


  // Calculate annual property tax if not passed, use 1.5% as default
  //   if (annualPropertyTax == 0)
  //       annualPropertyTax = ( salesPrice * DEFAULT_PROPERTY_TAX_RATE );

  // Calculate total tax savings (interest, property tax, closing costs)
  var totalPropertyTax = new Number(annualPropertyTax * expectedYearsToOwn);

  rvb.taxSavings = amort.getTotalTaxSavings() + (totalPropertyTax * federalTaxRate) + (discountPoints * loanAmt * federalTaxRate);

  // Get closing costs
  var closingTemp = new EstimatedClosingCosts();
  
  rvb.closingCosts = closingTemp.calculate(loanAmt, loanTerm, interestRate, discountPoints, (salesPrice - loanAmt));

  rvb.ownershipCost = (totalInterestPaid + totalPrincipalPaid + totalPMI + totalPropertyTax + rvb.closingCosts + (annualMiscOwnershipFees * expectedYearsToOwn)) - (rvb.taxSavings + rvb.equityEarned);
                                
  rvb.grossCosts= (totalInterestPaid + totalPrincipalPaid + totalPMI + totalPropertyTax + rvb.closingCosts + (annualMiscOwnershipFees * expectedYearsToOwn));

  return rvb;
}









//Send this function a string and if it needs comman and zeroes appropriately
//it will send them back with commas and decimals

function commasDecimals(fixit)
{

var tempString = "";

  //MAKE SURE THAT THE LAST 3 DIGITS = ".00"
  if ((fixit.indexOf('.') == (fixit.length - 2))&&(fixit.length != 1))
    {
      fixit += "0";
    }
  else if ((fixit.indexOf('.') == (fixit.length - 1))&&(fixit.length != 1))
    {
      fixit += "00";
    }
  else if (fixit.indexOf('.') == -1 )
    {
      fixit += ".00";
    }

  //Now, Add commas
  if (fixit.substring(fixit.indexOf('.'),0).length > 3)
    {
      //Add first comma, based on length of number from decimal
      tempString = fixit.substring(fixit.indexOf('.')-3,0) + "," + fixit.substring(fixit.length,fixit.indexOf('.')-3);
      fixit = tempString;

      //Now add more commas while necessary, based on length of number from first visible comma in the string
      while (fixit.indexOf(",") > 3)
        {
          tempString = fixit.substring(fixit.indexOf(',')-3,0) + "," + fixit.substring(fixit.length,fixit.indexOf(',')-3);
          fixit = tempString;
        }
    }

  //remove potential error "-," for negative numbers a multiple of 3 digits in length
  if ((fixit.indexOf('-') == 0)&&(fixit.indexOf(',') == 1))
    {
      tempString = "-" + (fixit.substring(fixit.length,fixit.indexOf(',')+1));
      fixit = tempString;
    }

  //Fix requested by Jennifer Kohl - remove everything decimal and after - this is what is done in the application
  tempString = fixit.substring(0,fixit.indexOf('.'));
  fixit = tempString;

    return fixit;
}













<!--
	//Declaration of Global Variables
	var currentMonthlyRent = new Number(0);
	var expectedYearlyRentIncrease = new Number(0);
	var federalIncomeTaxBracket = new Number(0);
	var termOfLoanInYears = new Number(0);
	var loanRate = new Number(0);
	var expectToBorrow = new Number(0);
	var expectedPropertyPurchasePrice = new Number(0);
	var estimatedAnnualAppreciation = new Number(0);
	var yearlyPropertyTaxes = new Number(0);
	var plannedYearsToOccupy = new Number (0);
	var downPayment = new Number(0);
	var discountPoints = new Number(0);
	var annualMiscOwnershipFees = new Number(0.0);
	var annualMiscRentalFees = new Number(0.0);
	
	//Declare results variables
	var estimatedCostsOfRenting, estimatedGrossCostsOfBuying, estimatedTaxRelatedSavings, estimatedIncreasedEquity, estimatedNetCostsOfBuying, estimatedTotalSavings, estimatedInvestmentRelatedSavings = "";
	
	
	function calculate2()
	{
	
	  //Set variables to current values, overstate Numbers (parseInt or parseFloat) as .value is a string
	  currentMonthlyRent = parseInt(document.rentvsbuy.rent_buy_monthly_rent.value);
	
	  termOfLoanInYears = parseInt(document.rentvsbuy.rent_buy_loan_term.options[document.rentvsbuy.rent_buy_loan_term.selectedIndex].value);
	  expectToBorrow = parseInt(document.rentvsbuy.rent_buy_loan_amount.value);
	  expectedPropertyPurchasePrice = parseInt(document.rentvsbuy.rent_buy_purchase_price.value);
	  yearlyPropertyTaxes = parseInt(document.rentvsbuy.rent_buy_property_taxes.value);
	  plannedYearsToOccupy = parseInt(document.rentvsbuy.rent_buy_years_home.value);
	  downPayment = expectedPropertyPurchasePrice - expectToBorrow;
	
	  //set these next few to decimals
	  expectedYearlyRentIncrease = parseFloat((document.rentvsbuy.rent_buy_expected_increase.value)/100);
	  federalIncomeTaxBracket = parseFloat((document.rentvsbuy.rent_buy_tax_bracket.options[document.rentvsbuy.rent_buy_tax_bracket.selectedIndex].value)/100);
	  loanRate = parseFloat((document.rentvsbuy.rent_buy_interest_rate.value)/100);
	  estimatedAnnualAppreciation = parseFloat((document.rentvsbuy.rent_buy_annual_appreciation.options[document.rentvsbuy.rent_buy_annual_appreciation.selectedIndex].value)/100);
	
	  var RBCalc = new RentVsBuyCalculator();
	  RBCalc = RBCalc.calculate(expectedPropertyPurchasePrice, loanRate, expectToBorrow, termOfLoanInYears*12, PMICalculator(expectToBorrow,downPayment), federalIncomeTaxBracket, estimatedAnnualAppreciation, discountPoints, plannedYearsToOccupy, currentMonthlyRent, expectedYearlyRentIncrease, yearlyPropertyTaxes, annualMiscOwnershipFees, annualMiscRentalFees);
	
	
	  estimatedGrossCostsOfBuying = (floor(RBCalc.getGrossCosts()).toString());
	  estimatedCostsOfRenting = (floor(RBCalc.getRentingCost()).toString());
	  estimatedTaxRelatedSavings = (floor(RBCalc.getTaxSavings()).toString());
	  estimatedIncreasedEquity = (floor(RBCalc.getEquityEarned()).toString());
	  estimatedNetCostsOfBuying = (floor(estimatedGrossCostsOfBuying - estimatedTaxRelatedSavings - estimatedIncreasedEquity).toString());
	  estimatedTotalSavings = (floor(RBCalc.getOwnershipBenefit()).toString());
	  estimatedInvestmentRelatedSavings = (floor(RBCalc.getPotentialSavings()).toString());
	  closingCosts = (floor(RBCalc.getClosingCosts()).toString());
	
	}
	
	//Browsercheck
	var ie = document.all?1:0;
	var n = document.layers?1:0;
	//This checks for Netscape 6.2 or Greater
	var gecko = ((navigator.appName == "Netscape")&&((navigator.appVersion.substring(0,3)==5)||(navigator.appVersion.substring(0,3)>5)))?1:0;
	
	function makeChangeResultsObj(obj)
	{
	    this.writeref = (n) ? eval('document.'+ obj +'.document') : eval(obj);
	    this.writeIt = b_writeIt;
	}
	
	function b_writeIt(text)
	{
	  if(n)
	    {
	      this.writeref.write(text);
	      this.writeref.close();
	    }
	  else if(ie)
	    {
	     this.writeref.innerHTML=text;
	    }
	
	  //ADDED FOR 6.X COMPLIANCE - NEW CHANGE METHODf
	  else if(gecko)
	    {
	     this.innerHTML=text;
	    }
	}
	
	function showResults()
	{
	
	  estimatedCostsOfRenting = commasDecimals(estimatedCostsOfRenting);
	  estimatedGrossCostsOfBuying = commasDecimals(estimatedGrossCostsOfBuying);
	  estimatedTaxRelatedSavings = commasDecimals(estimatedTaxRelatedSavings);
	  estimatedIncreasedEquity = commasDecimals(estimatedIncreasedEquity);
	  estimatedNetCostsOfBuying = commasDecimals(estimatedNetCostsOfBuying);
	  estimatedTotalSavings = commasDecimals(estimatedTotalSavings);
	  estimatedInvestmentRelatedSavings = commasDecimals(estimatedInvestmentRelatedSavings);
	
	
		//BUILDS RESULTS
		var changeMsg =
		"<hr><TABLE border=0 CELLPADDING=\"5\" CELLSPACING=\"0\" WIDTH=\"0\">" +
		"  <TR>" +
		"    <TD colspan=3 CLASS=\"inside\" HEIGHT=\"30\" VALIGN=\"MIDDLE\" align=\"center\"><FONT CLASS=\"results\"><B>&nbsp;Results</B></FONT></TD>" +
		"  </TR>" +
		"  <TR>" +
		"    <TD colspan=3 HEIGHT=\"30\" VALIGN=\"MIDDLE\"><FONT CLASS=\"basic\">Based on the information you provided, the following represents your costs and savings over the next " + termOfLoanInYears + " years.</FONT><br><br></TD>" +
		"  </TR>" +
		"  <TR>" +
		"    <TD VALIGN=\"MIDDLE\" align=\"right\"><FONT CLASS=\"basic\">Costs of renting for " +plannedYearsToOccupy + " years:</FONT></TD>" +
		"    <TD COLSPAN=\"3\" ALIGN=\"left\"><FONT CLASS=\"basic\">$" + estimatedCostsOfRenting + "</FONT></TD>" +
		"  </TR>" +
		"  </TR>" +
		"  <TR>" +
		"    <TD VALIGN=\"MIDDLE\" align=\"right\"><FONT CLASS=\"basic\">Gross costs of buying:<br>(includes $" + closingCosts + " in closing costs)</FONT></TD>" +
		"    <TD VALIGN=\"MIDDLE\" align=\"LEFT\"><FONT CLASS=\"basic\">$" + estimatedGrossCostsOfBuying + "</FONT></TD>" +
		"  </TR>" +
		"  <TR>" +
		"    <TD VALIGN=\"MIDDLE\" align=\"right\"><FONT CLASS=\"basic\">Amount of tax related savings:</FONT></TD>" +
		"    <TD VALIGN=\"MIDDLE\" align=\"LEFT\"><FONT CLASS=\"basic\">$" + estimatedTaxRelatedSavings + "</FONT></TD>" +
		"  </TR>" +
		"  <TR>" +
		"    <TD VALIGN=\"MIDDLE\" align=\"right\"><FONT CLASS=\"basic\">Amount in increased equity:</FONT></TD>" +
		"    <TD VALIGN=\"MIDDLE\" align=\"LEFT\"><FONT CLASS=\"basic\">$" + estimatedIncreasedEquity + "</FONT></TD>" +
		"  </TR>" +
		"  <TR>" +
		"    <TD VALIGN=\"MIDDLE\" align=\"right\"><FONT CLASS=\"basic\">Net costs of buying:</FONT></TD>" +
		"    <TD VALIGN=\"MIDDLE\" align=\"LEFT\"><FONT CLASS=\"basic\">$" + estimatedNetCostsOfBuying + "</FONT></TD>" +
		"  </TR>" +
		"  <TR>" +
		"    <TD VALIGN=\"MIDDLE\" align=\"right\"><FONT CLASS=\"basic\"><B>Total savings:</B><br><font size=1>(not including investment related savings)</font></FONT></TD>" +
		"    <TD VALIGN=\"MIDDLE\" align=\"LEFT\"><FONT CLASS=\"basic\">$" + estimatedTotalSavings + "</FONT></TD>" +
		"  </TR>" +
		"  <TR>" +
		"    <TD VALIGN=\"MIDDLE\" align=\"right\"><FONT CLASS=\"basic\">Investment related savings<br><font size=1>(negative means you should keep renting)</font>:</FONT></TD>" +
		"    <TD VALIGN=\"MIDDLE\" align=\"LEFT\"><FONT CLASS=\"basic\">$" + estimatedInvestmentRelatedSavings + "</FONT></TD>" +
		"  </TR>" +
		"</TABLE>";
	
	    if(ie || n)
	    {
	      oMessage=new makeChangeResultsObj('objResults');
	      oMessage.writeIt(changeMsg);
	    }
	
	      //ADDED FOR 6.X COMPLIANCE - NEW CHANGE METHOD
	    else if (gecko)
	    {
	      var results = document.getElementById("objResults");
	      results.writeIt = b_writeIt;
	      results.writeIt(changeMsg);
	    }
	}
	
	
	function isBlank(data)
	{
	  if (data.length == 0)
	      return 1;
	
	  for (i = 0; i < (data.length); i++)
	    {
	      if (data.charAt(i) != " ")
	        return 0;
	    }
	
	  return 1;
	}
	
	function isNumOnly(data)
	{
	  var i = new Number(data.length);
	  var j = new Number(0);
	  var k = new Number();
	
	  for (j=0; j<i; j++)
	    {
	      if ((isNaN(data.charAt(j)) == true))
		    return 0;
	    }
	    return 1;
	}
	
	function isInvalidCharacter(data)
	{
	  for (i=0; i<data.length; i++)
	    {
	      if ((data.charAt(i)=="~")||(data.charAt(i)=="!")||(data.charAt(i)=="@")||(data.charAt(i)=="#")
	        ||(data.charAt(i)=="$")||(data.charAt(i)=="%")||(data.charAt(i)=="^")||(data.charAt(i)=="&")
	        ||(data.charAt(i)=="*")||(data.charAt(i)=="(")||(data.charAt(i)==")")||(data.charAt(i)=="_")
	        ||(data.charAt(i)=="+")||(data.charAt(i)=="=")||(data.charAt(i)=="{")||(data.charAt(i)=="[")
	        ||(data.charAt(i)=="|")||(data.charAt(i)=="<")||(data.charAt(i)==",")||(data.charAt(i)==">")
	        ||(data.charAt(i)=="}")||(data.charAt(i)=="]")||(data.charAt(i)=="?")||(data.charAt(i)=="/"))
	        {
	          return 1;
	        }
	    }
	  return 0;
	}
	
	function isAlphaOnly(data, characterTest, spaceTest)
	{
	  i = new Number(data.length);
	  j = new Number(0);
	
	  if (characterTest == 0)
	    {
	      if (isInvalidCharacter(data) == 1)
	          return 0;
	    }
	
	  if (spaceTest == 0)
	    {
	      for (j=0; j<i; j++)
	        {
	          if (data.charAt(j) == " ")
	              return 0;
	        }
	    }
	
	  for (j=0; j<i; j++)
	    {
	      if (isNaN(data.charAt(j)) == false)
		  return 0;
	    }
	  if ((j==i)&&(i!=0))
	      return 1;
	}
	
	function isExactLength(data, num)
	{
	
	  var howLong = new Number(data.length);
	  var rightLength = new Number(num);
	
	  return ((howLong < rightLength)||(howLong > rightLength));
	}
	
	
	function isMinAndMaxLength(data, min, max)
	{
	  var minimum = new Number(min);
	  var maximum = new Number(max);
	
	  return ((data.length < minimum) || (data.length > maximum));
	}
	
	
	function isBetweenMinAndMax(data, min, max)
	{
	  return ((data < min)||(data > max));
	}

	function checkForm(form)
	{
	  var errorMsg = "";
	  var i;
	  var message = new Array();
	  var inputs = new Array(form.length);
	
	  var rent, annualincrease, interestrate, loanamount, purchaseprice, propertytax,
	      yearsinhome = "";
	
	  for (i = 0; i < form.length; i++)
	    {
	       inputs[i] = form.elements[i].name;
	    }
	
	  for (i = 0; i < form.length; i++)
	    {
	      if (inputs[i] == "rent_buy_monthly_rent")
	          rent = i;
	      else if (inputs[i] == "rent_buy_expected_increase")
	          annualincrease = i;
	      else if (inputs[i] == "rent_buy_interest_rate")
	          interestrate = i;
	      else if (inputs[i] == "rent_buy_loan_term")
	          loanterm = i;
	      else if (inputs[i] == "rent_buy_loan_amount")
	          loanamount = i;
	      else if (inputs[i] == "rent_buy_purchase_price")
	          purchaseprice = i;
	      else if (inputs[i] == "rent_buy_property_taxes")
	          propertytax = i;
	      else if (inputs[i] == "rent_buy_years_home")
	          yearsinhome = i;
	    }
	
	
	  message[0] = "Please enter your monthly rent.\n";
	  message[1] = "Your monthly rent should be free of special characters or letters.\n";
	  message[2] = "Your monthly rent should be greater than $0 and less than $1,000,000,000.\n";
	  message[3] = "Please enter your expected annual rent increase.\n";
	  message[4] = "The value for expected annual rent increase should be free of special characters or\n" +
	               "letters.\n";
	  message[5] = "Your expected annual rent increase should be between 0% and 10%.\n";
	  message[6] = "Please enter an interest rate.\n";
	  message[7] = "Your interest rate value should be free of special characters or letters.\n";
	  message[8] = "Your interest rate value should be greater than 0% and less than 51%.\n";
	  message[9] = "Please enter a value for loan amount.\n";
	  message[10] = "Your loan amount should be free of special characters or letters.\n";
	  message[11] = "Your loan amount should be greater than $20000.\n";
	  message[12] = "Please enter a value for purchase price.\n";
	  message[13] = "Your purchase price should be free of special characters or letters.\n";
	  message[14] = "Your purchase price should be greater than or equal to \n" +
			"your loan amount and less than $1,000,000,000.\n";
	  message[15] = "Your purchase price should be greater than or equal to your loan amount.\n";
	  message[16] = "Your proposed property taxes should be free of letters and special characters.\n";
	  message[17] = "The value of your proposed property taxes must be a minimum of $0 and\n" +
	                "less than or equal to $1,000,000,000.\n";
	  message[18] = "Please enter the number of years you plan to be in your home.\n";
	  message[19] = "The number of years you plan to be in this home should be\n" +
			"free of letters or special characters.\n";
	  message[20] = "The number of years you plan to be in this home should be greater\n" +
	                "than 0 and less than or equal to the term of the loan.\n";
	
	
	  if (isBlank(form.elements[rent].value) == 1)
	      errorMsg += message[0];
	  else if (isNaN(form.elements[rent].value) == true)
	      errorMsg += message[1];
	  else if ((form.elements[rent].value <= 0)||(form.elements[rent].value >= 1000000000))
	      errorMsg += message[2];
	
	  if (isBlank(form.elements[annualincrease].value) == 1)
		  errorMsg += message[3];
	  else if (isNaN(form.elements[annualincrease].value) == true)
	          errorMsg += message[4];
	  else if (isBetweenMinAndMax(form.elements[annualincrease].value, 0, 10) == 1)
	          errorMsg += message[5];
	
	
	  if (isBlank(form.elements[interestrate].value) == 1)
	      errorMsg += message[6];
	  else if (isNaN(form.elements[interestrate].value) == true)
	      errorMsg += message[7];
	  else if ((form.elements[interestrate].value <= 0)||(form.elements[interestrate].value >= 51))
	      errorMsg += message[8];
	
	  if (isBlank(form.elements[loanamount].value) == 1)
	      errorMsg += message[9];
	  else if (isNaN(form.elements[loanamount].value) == true)
	      errorMsg += message[10];
	  else if ((form.elements[loanamount].value < 20000)||(form.elements[loanamount].value >= 1000000000))
	      errorMsg += message[11];
	  else
	      var lamount = new Number(form.elements[loanamount].value);
	
	  if (isBlank(form.elements[purchaseprice].value) == 1)
	      errorMsg += message[12];
	  else if (isNaN(form.elements[purchaseprice].value) == true)
	      errorMsg += message[13];
	  else if ((form.elements[purchaseprice].value < 20000)||(form.elements[purchaseprice].value > 1000000000))
	      errorMsg += message[14];
	  else
	      var pprice = new Number(form.elements[purchaseprice].value);
	
	  if((isBlank(form.elements[loanamount].value) == 0)&&(isNaN(form.elements[loanamount].value) == false)&&(form.elements[loanamount].value > 0)&&(form.elements[loanamount].value < 1000000000)&&(isBlank(form.elements[purchaseprice].value) == 0)&&(isNaN(form.elements[purchaseprice].value) == false)&&(form.elements[purchaseprice].value >= 20000)&&(form.elements[purchaseprice].value <= 1000000000)&&(lamount > pprice))
	      errorMsg += message[15];
	
	  if (isBlank(form.elements[propertytax].value) == 0)
	    {
	      if (isNaN(form.elements[propertytax].value) == true)
	          errorMsg += message[16];
	      else if ((form.elements[propertytax].value < 0)||(form.elements[propertytax].value > 1000000000))
	          errorMsg += message[17];
	    }
	
	var yrsinhome = new Number(form.elements[yearsinhome].value);
	
	  if (isBlank(form.elements[yearsinhome].value) == 1)
	      errorMsg += message[18];
	  else if (isNaN(form.elements[yearsinhome].value) == true)
	      errorMsg += message[19];
	  else if (form.elements[yearsinhome].value <= 0)
	      errorMsg += message[20];
	  else if (yrsinhome > form.elements[loanterm].options[form.elements[loanterm].selectedIndex].value)
	      errorMsg += message[20];
	
	//No need to return anything here
	  if (errorMsg.length == 0)
	    {
	//If there's no error message, calculate
	      calculate2();
	      showResults();
	      return true;
	    }
	  else
	    {
	//If there's an error message, just show it
	      alert("Before continuing, the following fields require attention:\n\n" + errorMsg);
	      return false;
	    }
	
	}

//-->

<!--
String.prototype.replace = stringReplace;

function stringReplace(findText, replaceText) {
	var originalString = new String(this);
	var len = findText.length;
	var pos = 0;
	pos = originalString.indexOf(findText);
	while (pos != -1) {
		preString = originalString.substring(0,pos);
		postString = originalString.substring(pos+len, originalString.length);
		originalString = preString + replaceText + postString;
		pos = originalString.indexOf(findText);
	}
	return originalString;
}

function isBlank(data)
{
  if (data.length == 0)
      return 1;

  for (i = 0; i < (data.length); i++)
    {
      if (data.charAt(i) != " ")
        return 0;
    }

  return 1;
}

function calculate() 
{
	fm = document.affordabilityForm;

//Validations
  var message = new Array();
  var errorMsg = "";
  
  message[0] = "Please enter the Monthly Net Income.\n";
  message[1] = "The Monthly Net Income should be free of special\n characters or letters.\n";
  message[2] = "The Additional Monthly Income should be free of special\n characters or letters.\n";
  message[3] = "The Monthly Debt should be free of special\n characters or letters.\n";
  message[4] = "The Expected Down Payment should be free of special\n characters or letters.\n";
  message[5] = "Please enter the Interest Rate.\n";
  message[6] = "The Interest Rate should be free of special\n characters or letters.\n";
  
  if (isBlank(fm.in1.value) == 1)
	errorMsg = errorMsg + message[0];
  else if (isNaN(fm.in1.value) == true)
	errorMsg = errorMsg + message[1];
	
  if (isBlank(fm.in2.value) == 0 && isNaN(fm.in2.value) == true)
	errorMsg = errorMsg + message[2];

  if (isBlank(fm.in3.value) == 0 && isNaN(fm.in3.value) == true)
	errorMsg = errorMsg + message[3];

  if (isBlank(fm.in4.value) == 0 && isNaN(fm.in4.value) == true)
	errorMsg = errorMsg + message[4];

  if (isBlank(fm.in9.value) == 1)
	errorMsg = errorMsg + message[5];
  else if (isNaN(fm.in9.value) == true)
	errorMsg = errorMsg + message[6];

  if (errorMsg.length != 0)
  {
	alert("Before continuing, the following fields require attention:\n\n" + errorMsg);
	return;
  }
//End of Validations


	var tempVar1 = new String(fm.in1.value);
	var tempVar2 = new String(fm.in2.value);
	var tempVar3 = new String(fm.in3.value);
	var tempVar4 = new String(fm.in4.value);
	var tempVar7 = new String("0");
	var tempVar9 = new String(fm.in9.value);

	tempVar1 = tempVar1.replace(",", "");
	tempVar2 = tempVar2.replace(",", "");
	tempVar3 = tempVar3.replace(",", "");
	tempVar4 = tempVar4.replace(",", "");
	tempVar7 = tempVar7.replace(",", "");
	tempVar9 = tempVar9.replace(",", "");

	var vin1 = new Number (tempVar1);
	var vin2 = new Number (tempVar2);
	var vin3 = new Number (tempVar3);
	var vin4 = new Number (tempVar4);
	var vin6 = new Number (.01);
	var vin7 = new Number ((tempVar7)/100);
	var vin8 = new Number (fm.in8.options[fm.in8.selectedIndex].value);
	var vin9 = new Number ((tempVar9)/100);

	var tmpay = 0;

	var a = (vin1.valueOf() + vin2.valueOf()) * 0.28;
	var b = (vin1.valueOf() + vin2.valueOf()) * 0.36 - vin3.valueOf();
	var tmpay = Math.min(a.valueOf(),b.valueOf());

 if (vin4.valueOf() >=0 && vin4.valueOf()<=15000) {
 var ltv = 0.95 ;
 } else if (vin4.valueOf() >=15001 && vin4.valueOf()<=30000) {
 var ltv = 0.90 ;
 } else if (vin4.valueOf() >=30001 && vin4.valueOf()<= 49999) {
 var ltv = 0.85 ;
 } else if (vin4.valueOf() >=50000) {
 var ltv = 0.80 ;
 }
 var lookup = 0;
 if (ltv == 0.95) {
  if (vin8==15) lookup = 0.0077;
  if (vin8==20) lookup = 0.0081;
  if (vin8==30) lookup = 0.0090;
 } else if (ltv == 0.90) {
  if (vin8==15) lookup = 0.0056;
  if (vin8==20) lookup = 0.0065;
  if (vin8==30) lookup = 0.0078;
 } else if (ltv == 0.85) {
  if (vin8==15) lookup = 0.0023;
  if (vin8==20) lookup = 0.0037;
  if (vin8==30) lookup = 0.0052;
 } else if (ltv == 0.80) {
 }

 var vout2 = 
  (  tmpay.valueOf() - (  vin4.valueOf() * ( (vin6.valueOf() + vin7.valueOf()) / 12 ) ) )
/
  (  (  (vin9.valueOf() / 12)
      / (  (1 - Math.pow((1 + (vin9.valueOf()/12)),-(vin8.valueOf() * 12)) ) )
     ) 
   + ( (vin7.valueOf() + vin6.valueOf() + lookup.valueOf())/12 )
  );

 if (vout2 < 0) {
 fm.out1.value = 0.00;
 fm.out2.value = 0.00;
 //fm.out3.value = 0.00;
 fm.out4.value = 0.00;
 fm.out5.value = 0.00;
 fm.out7.value = 0.00;
 }
 else {
 var tmparr = vout2.valueOf().toString().split(".");
 if (tmparr[1] != null) {
  var tmpdec = tmparr[1].substring(0,2);
 } else {
  var tmpdec = "00";
 }
 if (tmparr[0].length < 4) {
  fm.out2.value = tmparr[0] + "." + tmpdec;
 } 
 if (tmparr[0].length == 4) {
  var tmpnum1 = tmparr[0].substring(0,1);
  var tmpnum2 = tmparr[0].substring(1,4);
  fm.out2.value = tmpnum1 + "," + tmpnum2 + "." + tmpdec;
 } 
 if (tmparr[0].length == 5) {
  var tmpnum1 = tmparr[0].substring(0,2);
  var tmpnum2 = tmparr[0].substring(2,5);
  fm.out2.value = tmpnum1 + "," + tmpnum2 + "." + tmpdec;
 } 
 if (tmparr[0].length == 6) {
  var tmpnum1 = tmparr[0].substring(0,3);
  var tmpnum2 = tmparr[0].substring(3,6);
  fm.out2.value = tmpnum1 + "," + tmpnum2 + "." + tmpdec;
 } 
 if (tmparr[0].length == 7) {
  var tmpnum1 = tmparr[0].substring(0,1);
  var tmpnum2 = tmparr[0].substring(1,4);
  var tmpnum3 = tmparr[0].substring(4,7);
  fm.out2.value = tmpnum1 + "," + tmpnum2 + "," + tmpnum3 + "." + tmpdec;
 } 
 if (tmparr[0].length == 8) {
  var tmpnum1 = tmparr[0].substring(0,2);
  var tmpnum2 = tmparr[0].substring(2,5);
  var tmpnum3 = tmparr[0].substring(5,8);
  fm.out2.value = tmpnum1 + "," + tmpnum2 + "," + tmpnum3 + "." + tmpdec;
 }
 vout1 = vout2.valueOf() + vin4.valueOf();
 var tmparr = vout1.valueOf().toString().split(".");
 if (tmparr[1] != null) {
  var tmpdec = tmparr[1].substring(0,2);
 } else {
  var tmpdec = "00";
 }
 if (tmparr[0].length < 4) {
  fm.out1.value = tmparr[0] + "." + tmpdec;
 } 
 if (tmparr[0].length == 4) {
  var tmpnum1 = tmparr[0].substring(0,1);
  var tmpnum2 = tmparr[0].substring(1,4);
  fm.out1.value = tmpnum1 + "," + tmpnum2 + "." + tmpdec;
 } 
 if (tmparr[0].length == 5) {
  var tmpnum1 = tmparr[0].substring(0,2);
  var tmpnum2 = tmparr[0].substring(2,5);
  fm.out1.value = tmpnum1 + "," + tmpnum2 + "." + tmpdec;
 } 
 if (tmparr[0].length == 6) {
  var tmpnum1 = tmparr[0].substring(0,3);
  var tmpnum2 = tmparr[0].substring(3,6);
  fm.out1.value = tmpnum1 + "," + tmpnum2 + "." + tmpdec;
 } 
 if (tmparr[0].length == 7) {
  var tmpnum1 = tmparr[0].substring(0,1);
  var tmpnum2 = tmparr[0].substring(1,4);
  var tmpnum3 = tmparr[0].substring(4,7);
  fm.out1.value = tmpnum1 + "," + tmpnum2 + "," + tmpnum3 + "." + tmpdec;
 } 
 if (tmparr[0].length == 8) {
  var tmpnum1 = tmparr[0].substring(0,2);
  var tmpnum2 = tmparr[0].substring(2,5);
  var tmpnum3 = tmparr[0].substring(5,8);
  fm.out1.value = tmpnum1 + "," + tmpnum2 + "," + tmpnum3 + "." + tmpdec;
 }
 var vout3 = vout2.valueOf() * ((vin9.valueOf()/12)/(1-Math.pow(1+(vin9.valueOf()/12),-(vin8.valueOf()*12))));
 var tmparr = vout3.valueOf().toString().split(".");
 if (tmparr[1] != null) {
  var tmpdec = tmparr[1].substring(0,2);
 } else {
  var tmpdec = "00";
 }
 /*if (tmparr[0].length < 4) {
  fm.out3.value = tmparr[0] + "." + tmpdec;
 } */
 if (tmparr[0].length == 4) {
  var tmpnum1 = tmparr[0].substring(0,1);
  var tmpnum2 = tmparr[0].substring(1,4);
  //fm.out3.value = tmpnum1 + "," + tmpnum2 + "." + tmpdec;
 } 
 if (tmparr[0].length == 5) {
  var tmpnum1 = tmparr[0].substring(0,2);
  var tmpnum2 = tmparr[0].substring(2,5);
  //fm.out3.value = tmpnum1 + "," + tmpnum2 + "." + tmpdec;
 } 
 if (tmparr[0].length == 6) {
  var tmpnum1 = tmparr[0].substring(0,3);
  var tmpnum2 = tmparr[0].substring(3,6);
  //fm.out3.value = tmpnum1 + "," + tmpnum2 + "." + tmpdec;
 } 
 if (tmparr[0].length == 7) {
  var tmpnum1 = tmparr[0].substring(0,1);
  var tmpnum2 = tmparr[0].substring(1,4);
  var tmpnum3 = tmparr[0].substring(4,7);
  //fm.out3.value = tmpnum1 + "," + tmpnum2 + "," + tmpnum3 + "." + tmpdec;
 } 
 if (tmparr[0].length == 8) {
  var tmpnum1 = tmparr[0].substring(0,2);
  var tmpnum2 = tmparr[0].substring(2,5);
  var tmpnum3 = tmparr[0].substring(5,8);
  //fm.out3.value = tmpnum1 + "," + tmpnum2 + "," + tmpnum3 + "." + tmpdec;
 }
 var vout4 = vout2.valueOf() * (lookup.valueOf()/12);
 var tmparr = vout4.valueOf().toString().split(".");
 if (tmparr[1] != null) {
  var tmpdec = tmparr[1].substring(0,2);
 } else {
  var tmpdec = "00";
 }
 if (tmparr[0].length < 4) {
  fm.out4.value = tmparr[0] + "." + tmpdec;
 } 
 if (tmparr[0].length == 4) {
  var tmpnum1 = tmparr[0].substring(0,1);
  var tmpnum2 = tmparr[0].substring(1,4);
  fm.out4.value = tmpnum1 + "," + tmpnum2 + "." + tmpdec;
 } 
 if (tmparr[0].length == 5) {
  var tmpnum1 = tmparr[0].substring(0,2);
  var tmpnum2 = tmparr[0].substring(2,5);
  fm.out4.value = tmpnum1 + "," + tmpnum2 + "." + tmpdec;
 } 
 if (tmparr[0].length == 6) {
  var tmpnum1 = tmparr[0].substring(0,3);
  var tmpnum2 = tmparr[0].substring(3,6);
  fm.out4.value = tmpnum1 + "," + tmpnum2 + "." + tmpdec;
 } 
 if (tmparr[0].length == 7) {
  var tmpnum1 = tmparr[0].substring(0,1);
  var tmpnum2 = tmparr[0].substring(1,4);
  var tmpnum3 = tmparr[0].substring(4,7);
  fm.out4.value = tmpnum1 + "," + tmpnum2 + "," + tmpnum3 + "." + tmpdec;
 } 
 if (tmparr[0].length == 8) {
  var tmpnum1 = tmparr[0].substring(0,2);
  var tmpnum2 = tmparr[0].substring(2,5);
  var tmpnum3 = tmparr[0].substring(5,8);
  fm.out4.value = tmpnum1 + "," + tmpnum2 + "," + tmpnum3 + "." + tmpdec;
 }

 var vout5 = vout1.valueOf() * (vin6.valueOf()/12);

 var tmparr = vout5.valueOf().toString().split(".");
 if (tmparr[1] != null) {
  var tmpdec = tmparr[1].substring(0,2);
 } else {
  var tmpdec = "00";
 }
 if (tmparr[0].length < 4) {
  fm.out5.value = tmparr[0] + "." + tmpdec;
 } 
 if (tmparr[0].length == 4) {
  var tmpnum1 = tmparr[0].substring(0,1);
  var tmpnum2 = tmparr[0].substring(1,4);
  fm.out5.value = tmpnum1 + "," + tmpnum2 + "." + tmpdec;
 } 
 if (tmparr[0].length == 5) {
  var tmpnum1 = tmparr[0].substring(0,2);
  var tmpnum2 = tmparr[0].substring(2,5);
  fm.out5.value = tmpnum1 + "," + tmpnum2 + "." + tmpdec;
 } 
 if (tmparr[0].length == 6) {
  var tmpnum1 = tmparr[0].substring(0,3);
  var tmpnum2 = tmparr[0].substring(3,6);
  fm.out5.value = tmpnum1 + "," + tmpnum2 + "." + tmpdec;
 } 
 if (tmparr[0].length == 7) {
  var tmpnum1 = tmparr[0].substring(0,1);
  var tmpnum2 = tmparr[0].substring(1,4);
  var tmpnum3 = tmparr[0].substring(4,7);
  fm.out5.value = tmpnum1 + "," + tmpnum2 + "," + tmpnum3 + "." + tmpdec;
 } 
 if (tmparr[0].length == 8) {
  var tmpnum1 = tmparr[0].substring(0,2);
  var tmpnum2 = tmparr[0].substring(2,5);
  var tmpnum3 = tmparr[0].substring(5,8);
  fm.out5.value = tmpnum1 + "," + tmpnum2 + "," + tmpnum3 + "." + tmpdec;
 }
 var vout7 = vout3.valueOf() + vout4.valueOf() + vout5.valueOf();
 var tmparr = vout7.valueOf().toString().split(".");
 if (tmparr[1] != null) {
  var tmpdec = tmparr[1].substring(0,2);
 } else {
  var tmpdec = "00";
 }
 if (tmparr[0].length < 4) {
  fm.out7.value = tmparr[0] + "." + tmpdec;
 } 
 if (tmparr[0].length == 4) {
  var tmpnum1 = tmparr[0].substring(0,1);
  var tmpnum2 = tmparr[0].substring(1,4);
  fm.out7.value = tmpnum1 + "," + tmpnum2 + "." + tmpdec;
 } 
 if (tmparr[0].length == 5) {
  var tmpnum1 = tmparr[0].substring(0,2);
  var tmpnum2 = tmparr[0].substring(2,5);
  fm.out7.value = tmpnum1 + "," + tmpnum2 + "." + tmpdec;
 } 
 if (tmparr[0].length == 6) {
  var tmpnum1 = tmparr[0].substring(0,3);
  var tmpnum2 = tmparr[0].substring(3,6);
  fm.out7.value = tmpnum1 + "," + tmpnum2 + "." + tmpdec;
 } 
 if (tmparr[0].length == 7) {
  var tmpnum1 = tmparr[0].substring(0,1);
  var tmpnum2 = tmparr[0].substring(1,4);
  var tmpnum3 = tmparr[0].substring(4,7);
  fm.out7.value = tmpnum1 + "," + tmpnum2 + "," + tmpnum3 + "." + tmpdec;
 } 
 if (tmparr[0].length == 8) {
  var tmpnum1 = tmparr[0].substring(0,2);
  var tmpnum2 = tmparr[0].substring(2,5);
  var tmpnum3 = tmparr[0].substring(5,8);
  fm.out7.value = tmpnum1 + "," + tmpnum2 + "," + tmpnum3 + "." + tmpdec;
 }
 }
}
//-->
