/* loan calculations  copyright 2002-2006 M Knoyle */

  var pv,rate,n,pmt;                                              //
  var loanmo,loanyr,pmtmo,pmtyr;                   // declare global variables
  var npaid,balance,payments,totalint,r;          //
  
function currency(money)                   // function to display currency
{ var tempStr = "";var  pos = 0; var dollars = 0; var cents = 0; var retval = 0; var i = 0;
  var moneyStr=""+Math.abs(Math.round(money*100))/100 ;
  if (moneyStr.indexOf(".") == -1) {moneyStr += ".00" ;} // Force 2 decimal places
  dollars = moneyStr.substr(0,moneyStr.indexOf(".")) ;   // Separate dollars and cents
  cents = moneyStr.substr(moneyStr.indexOf(".")) ;
  while (cents.length < 3) {cents += "0" ;}       // show pennies
  for (i=dollars.length-1; i>=0; i--)                    // insert commas
  {                                                      // check right to left
  if (pos == 3) {tempStr += "," + dollars.charAt(i) ; pos=1; }
  else {tempStr += dollars.charAt(i) ; pos++ ; }
  }
  dollars = "";                                          // Put result back in dollars
  for (i=tempStr.length-1; i>=0; i--)      // normalize left to right
  { dollars += tempStr.charAt(i) ; }
  retval = dollars + cents ;
  if (money < 0) {retval = "("+retval+")"; }
  return "$"+retval;
} 

function fix(testval)                      //Ignore non numeric characters 
{var charToTest = ""; var fixedval = ""; var i = 0;
 testval = testval.toString() ;
 if (testval != "")
 {for (i=0; i < testval.length; i++)
  { charToTest = testval.substr(i, 1) ;
   if (charToTest>="0"&&charToTest<="9"||charToTest==".") {fixedval += charToTest;}
  }
 }
 return fixedval;
}

function loancalc(form)
 {
   var estimate = 0; var valid = 0;
   pv         = fix(form.pv.value)  ;      // present value 
   rate       = fix(form.rate.value);      // annual interest rate
   n          = fix(form.n.value)   ;      // term
   pmt        = fix(form.pmt.value) ;      // payment amount
   loanmo     = form.loanmo.value   ;      // month loan originated
   loanyr     = form.loanyr.value   ;      // year loan originated
   pmtmo      = form.pmtmo.value    ;      // month chosen for info
   pmtyr      = form.pmtyr.value    ;      // year chosen for info
   npaid      = form.npaid.value    ;      // number of payments made
   balance    = form.balance.value  ;      // balance remaining
   payments   = form.payments.value ;      // total of all payments
   totalint   = form.totalint.value ;      // total interest
   r = Math.round(rate/100/12*1000000)/1000000; // rate per period rounded to 6 places
 
  if (totalint!=="") {totalint = 0; payments = 0 ;}
  if (pmt!==""&&r!==""&&n!==""&&pv=="")       // Calculate the Present Value.
   {form.pv.value = Math.round(pmt * (1- Math.pow(r+1,-n))/r*100)/100 ;}

  if ((r==""||r===0)&&pv!==""&&pmt!==""&&n!==""&&(n*pmt)>pv)  // Calculate r (rate per period)
   { estimate=pmt/pv ;
     r= pmt/pv * (1- Math.pow(1+estimate,-n)) ;
     while(r != estimate) // loop until estimate doesn't change.(modified Newton iteration)
      {estimate=r ;
       r=Math.floor(pmt/pv * (1- Math.pow(1+estimate,-n))*1000000)/1000000 ; }
   }

  if ((rate=="")&&pv!==""&&pmt!==""&& n!=="") //Calculate rate (annual interest rate)
  {form.rate.value = Math.round(r * 100 * 12 *1000000)/1000000 ;}

  if (rate!==""&&pv!==""&&pmt!==""&& n==""||isNaN(n))   //Calculate n (term of the loan)
   {form.n.value = Math.round(Math.log(pmt/(pmt-(pv*r)))/Math.log(r+1)*10)/10;}

  if (n!==""&&r!==""&&pv!==""&&pmt==""||isNaN(pmt))       //Calculate payment
   {form.pmt.value = Math.round( fix(pv) * r/( 1- Math.pow((r+1),-n) )*100 )/100 ;}

  if (pmt!==""&&n!=="")                      //Calculate payments (total of all payments)
   {form.payments.value = Math.round(pmt*n*100)/100 ;}

  if (pmt!==""&&n!==""&&pv!=="")              //Calculate totalint (total of all interest)
   {form.totalint.value = Math.round(((pmt * n) - pv)*100)/100 ;}

  if (pmtmo!="mo"&&pmtyr!="year")          //Calculate number of payments made
   {if ((pmtmo-loanmo)+((pmtyr-loanyr)*12) > 0)
      {form.npaid.value=(pmtmo-loanmo)+((pmtyr-loanyr)*12) ;}
      else
      {form.npaid.value=""; form.balance.value=""; alert("Payment cannot be made\nbefore the loan was made!") ;}
   }

  if (npaid>0&&n!=="")       //Calculate remaining balance after recent payment
   {form.balance.value=Math.round(pmt*((1-Math.pow((r+1),(npaid-n)))/r*100))/100 ;
    if (balance<0&&npaid!=="")
     {alert("Loan was paid in full "+(npaid-n)+" payments ago.") ;
      form.balance.value="";form.npaid.value="";form.pmtmo.value="";form.pmtyr.value="";
      form.pmtmo.focus() ;}
   }

  if (pv!==""&&n!==""&&pmt!=="")              //Payment validation
   { if ((n*pmt)<pv||(pv*r)>pmt)
     { alert("Insufficient\n Payment!") ;}
     if (rate!==""&&pv!==0)
     { valid = Math.round( fix(pv) * r/( 1- Math.pow((r+1),-n) )*100 )/100 ;
                                                                         // Allow tolerance of 0.50
       if (Math.abs(pmt-(valid+0)) > 0.5)
       {
       alert("The payment amount that you entered is not valid given the other values. Delete the payment amount and click calculate. ") ;
       }
     }

    
   }
 return;
 }


function amort(form)                  //Show amortization table in a new window.
{ var paydte,mo,yr,pmtNum,toInt,toPrin,remainingBal,limit;
  var intpaid=0; var ytdInt=0; var ytdPrin=0; var totalInterest=0; var totalPaid=0;
  var months=["Jan ","Feb ","Mar ","Apr ","May ","Jun ","Jul ","Aug ","Sep ","Oct ","Nov ","Dec ","Dec "] ;
  var amortwindow=open('','','top=30,left=100,height=480,width=600,scrollbars=yes,location=no,status=no,resizable=yes,toolbar=yes,menubar=yes') ;
  amortwindow.document.open("text/html","replace") ;
  amortwindow.document.writeln("<head><title>Amortization Table<\/title>") ;
  amortwindow.document.writeln("<link rel='stylesheet' href='loancalc.css' type='text/css'>") ;
  amortwindow.document.writeln("<\/head>") ;
  amortwindow.document.writeln("<body class='tocenter'>") ;

  amortwindow.document.writeln("<button type='button' onclick='window.print()'>Print Amortization<\/button>&nbsp;") ; 

  amortwindow.document.writeln("<button type='button' onclick='window.close()'>Close this Window<\/button><br \/>") ;
  
  if(isNaN(pv)) {pv=0; rate=0; n=0; npaid=0; pmt=0;} // If PV is not a number, initialize all of the variables.

  amortwindow.document.write("<br><table class='litecolor'>") ;
  amortwindow.document.write("<tr class='gray'><td class='toright' colspan=2><b>Amount Borrowed:&nbsp;&nbsp;&nbsp;"+currency(pv)+"<\/b><\/td>") ;
  amortwindow.document.write("<td class='toright' colspan=2><b>Annual Interest Rate:&nbsp;&nbsp;&nbsp;"+rate+"%<\/b><\/td><\/tr>") ;
  amortwindow.document.write("<tr class='gray'><td class='toright' colspan=2><b>Total Number of Payments:&nbsp;&nbsp;&nbsp;"+n+"<\/b><\/td>") ;
  amortwindow.document.write("<td class='toright' colspan=2><b>Payment Amount:&nbsp;&nbsp;&nbsp;"+currency(pmt)+"<\/b><\/td><\/tr>") ;
  amortwindow.document.write("<\/b><\/table>") ;

  amortwindow.document.writeln("<br><table class='litecolor'><b>") ;
  amortwindow.document.writeln("<tr><td width=15% class='toright'><b>Date<\/b><\/td><td class='toright'><b>Paid To Interest<\/b><\/td><td class='toright'><b>Paid To Principal<\/b><\/td><td width=30% class='toright'><b>Remaining Balance<\/b><\/td><\/tr>") ;

  remainingBal = pv;
  if (npaid>0)              // if dates are given, use date info to limit the amortization
   {limit=npaid;
    mo=loanmo-0; yr=loanyr-0;
    amortwindow.document.writeln("<tr><td class='toright'><b>"+months[mo-1]+yr+"<\/b><\/td><td class='toright'><b>&nbsp;<\/b><\/td><td class='toright'><b>&nbsp;<\/b><\/td><td class='toright'><b>"+currency(pv-0)+"<\/b><\/td><\/tr>") ;
   }
   else                     // if no dates are given, amortize the entire table
   {limit=n;
    mo=""; yr="";
    if (isNaN(pv)) {pv=0;}
    amortwindow.document.writeln("<tr><td class='toright'><b>&nbsp;<\/b><\/td><td class='toright'><b>&nbsp;<\/b><\/td><td class='toright'><b>&nbsp;<\/b><\/td><td class='toright'><b>"+currency(pv)+"<\/b><\/td><\/tr>") ;
   }
                            // This loop writes data to the amortization table
  for (pmtNum=1; pmtNum<=limit ; pmtNum++)
  { if (npaid==""||npaid===0||isNaN(npaid))  // no dates so use payment numbers
    {paydte=pmtNum;}
    else
        {if ((mo+=1)>12)    // If next month is greater than Dec., next mo is Jan. of next year.
     {
         mo=1; yr+=1;
     }
     paydte=months[mo-1]+yr;  // Concatenate alpha month and year         
    }
         
    intpaid += (toInt=Math.round(remainingBal*r*100)/100) ;
    toPrin = pmt-toInt ;
    remainingBal -= toPrin ;

      if (pmtNum==n&&pv!==0)      // Final payment adjustment.
      {toPrin += remainingBal; 
       toInt  -= remainingBal;
       remainingBal = 0;
      }

    ytdInt += toInt ;
    ytdPrin += toPrin ;

    amortwindow.document.writeln("<tr><td class='toright'><b>"+paydte+"<\/b><\/td><td class='toright'><b>"+currency(toInt)+"<\/b><\/td><td class='toright'><b>"+currency(toPrin)+"<\/b><\/td><td class='toright'><b>"+currency(remainingBal)+"<\/b><\/td><\/tr>") ;

    if (yr!==""&&mo==12||pmtNum==limit&&npaid)  // Show YTD interest and principal
    {amortwindow.document.writeln("<tr class='gray'><td class='toright'><\/td><td class='toright'><b>YTD Interest Paid "+currency(ytdInt)+"<\/b><\/td><td class='toright'><b>YTD Principal Paid "+currency(ytdPrin)+"<\/b><\/td><td class='toright'>&nbsp;<\/td><\/tr>") ;
    totalInterest += ytdInt ; ytdInt = 0 ;
    totalPaid += ytdPrin ; ytdPrin = 0 ;
    }
    else
    {if (npaid=="")
      {totalInterest += toInt ; totalPaid += toPrin ;}
    }
  }
  amortwindow.document.write("<tr class='gray'><td><\/td><td class='toright'><b>Total Interest Paid:&nbsp;&nbsp;&nbsp;"+currency(totalInterest)+"<\/b><\/td>") ;
  amortwindow.document.write("<td class='toright'><b>Total Principal Paid:&nbsp;&nbsp;&nbsp;"+currency(totalPaid)+"<\/b><\/td><td><\/td><\/tr>") ;
  amortwindow.document.write("<\/table><br \/>") ;
  amortwindow.document.writeln("<button type='button' onclick='window.print()'>Print Amortization<\/button>&nbsp;") ;
  amortwindow.document.writeln("<button type='button' onclick='window.close()'>Close this Window<\/button><br \/>") ;
  amortwindow.document.writeln("<\/body>") ;
  amortwindow.document.close() ;
}


                                           // end of loancalc.js



