
// Most formulas from http://www.amortizationer.com/amortization-formula.html
var Amortize = Class.create();

Amortize.prototype = {
  initialize: function() {
  },

  getPrincipal : function(monthly, apr, months) {
    principal = parseFloat(principal);
    apr = parseFloat(apr);
    months = parseFloat(months);
    var r = 1+(apr/1200);
    return monthly* (1 - Math.pow(r, months * -1)) / (r - 1);
  },

  getMonthlyPayment: function(principal, apr, months) {
    principal = parseFloat(principal);
    apr = parseFloat(apr);
    months = parseFloat(months);
    var r = 1+(apr/1200);
    return principal * (r - 1) / (1 - Math.pow(r, months * -1));
  },

  getPaymentPeriod : function(principal, apr, monthly) {
    principal = parseFloat(principal);
    apr = parseFloat(apr);
    monthly = parseFloat(monthly);
    var r = 1+(apr/1200);
    return -1 * (Math.log(1 - (principal * (r-1)/monthly)) / Math.log(r));
  },

  getPayoff : function(principal, apr, monthly, afterMonth) {
    principal = parseFloat(principal);
    apr = parseFloat(apr);
    monthly = parseFloat(monthly);
    afterMonth = parseFloat(afterMonth);
    var r = 1+(apr/1200);
    return (principal - (monthly * (1 - Math.pow(r, afterMonth * -1)))
         / (r-1)) * Math.pow(r, afterMonth);
  },

  getAmountOwedAfterPaymentN : function(principal, apr, monthly, afterMonth) {
    principal = parseFloat(principal);
    apr = parseFloat(apr);
    monthly = parseFloat(monthly);
    afterMonth = parseFloat(afterMonth);
    var r = 1+(apr/1200);
    return ((principal - (monthly* (1 - Math.pow(r, -1 * (afterMonth-1)) ))
         / (r-1) ) * Math.pow(r, afterMonth-1)) - monthly;
  },

  getTotalPayment : function(principal, apr, months) {
    principal = parseFloat(principal);
    apr = parseFloat(apr);
    months = parseFloat(months);
    var paymentPerMonth = this.getMonthlyPayment(principal, apr, months);
    return paymentPerMonth * months;
  },

  getTotalInterest : function(principal, apr, months) {
    principal = parseFloat(principal);
    apr = parseFloat(apr);
    months = parseFloat(months);
    var paymentPerMonth = this.getMonthlyPayment(principal, apr, months);
    return (paymentPerMonth * months) - principal;
  },

  getSavingsPayingAdditional : function(principal, apr, months, additionalMonthly) {
    principal = parseFloat(principal);
    apr = parseFloat(apr);
    months = parseFloat(months);
    additionalMonthly = parseFloat(additionalMonthly);
    var oldPaymentPerMonth = this.getMonthlyPayment(principal, apr, months);
    var newPaymentPerMonth = oldPaymentPerMonth + additionalMonthly;

    var newLastPaymentMonth = this.getPaymentPeriod(principal, apr,
                                                    newPaymentPerMonth);

    var oldTotalPayment = oldPaymentPerMonth * months;
    var newTotalPayment = newPaymentPerMonth * newLastPaymentMonth;

    var oldTotalInterest = oldTotalPayment - principal;
    var newTotalInterest = newTotalPayment - principal;

    return { oldPaymentPeriod  : months,
             newPaymentPeriod  : newLastPaymentMonth,
             periodSaving      : months - newLastPaymentMonth,

             oldMonthlyPayment        : oldPaymentPerMonth,
             newMonthlyPayment        : newPaymentPerMonth,
             monthlyPaymentDifference : newPaymentPerMonth - oldPaymentPerMonth,

             newTotalPayment   : newTotalPayment,
             oldTotalPayment   : oldTotalPayment,
             paymentDifference : oldTotalPayment - newTotalPayment,

             newTotalInterest   : newTotalInterest,
             oldTotalInterest   : oldTotalInterest,
             interestDifference : oldTotalInterest - newTotalInterest
           }
  }

};

