
var YEARLY_INTEREST_RATE = 0.228; // 22.8%
var MONTHLY_INTEREST_RATE = 0.0165; // 1.65%
var START_FEE_RATE = 0.08;  // 8.0%
var START_FEE_MINIMUM = 240.0;
var START_FEE_MAXIMUM = 4000.0;
var BILLING_FEE = 20.0;

function calculateLoanAmount(sum) {
  return sum + calculateStartFee(sum);
}

function calculateMonthlyPayment(sum, period) {
  return BILLING_FEE + 
     calculateLoanAmount(sum) *
     (MONTHLY_INTEREST_RATE / (1 - Math.pow(1 + MONTHLY_INTEREST_RATE, -(period * 12))));
}

function calculateStartFee(sum) {
  return Math.min(Math.max(sum * START_FEE_RATE, START_FEE_MINIMUM), START_FEE_MAXIMUM);
}

function calculateTotalPayment(sum, period) {
  return calculateMonthlyPayment(sum, period) * period * 12;
}

function calculateTotalLoanAmount(sum) {
  return sum + calculateStartFee(sum);
}

function calculateYearlyCostPct(sum, period) {
  return calculateAop(sum, period);
}

function backdisc(sum, period, rate) {
  //årlig rente, loebetid i år var
  n = 12*period;
  
  //månedlige afdrag 
  m_rente = (Math.pow((rate+1),(1/12)))-1;

  var payment = calculateMonthlyPayment(sum, period);
  var result = 0;
  
  for (i = 0; i < n; i++) {
    result = result + payment * Math.pow((1 + rate), -(i+1));
  }

  return result;
} 

function calculateAop(sum, period) {
  var y = calculateMonthlyPayment(sum, period);

  var r1 = YEARLY_INTEREST_RATE;
  var r2 = YEARLY_INTEREST_RATE * 2;

  var p1 = backdisc(sum, period, r1);
  var p2 = backdisc(sum, period, r2);

  while (p1 < sum) {
    r1 = r1 / 2;
    p1 = backdisc(sum, period, r1);
  }
  
  while (p2 > sum) {
    r2 = r2 * 2;
    p2 = backdisc(sum, period, r2);
  }

  var r = (r1 + r2)/2;
  var cont = true;
  
  while(cont) {
    r = (r1 + r2)/2;
    if (Math.round(backdisc(sum, period, r)*1000000) == Math.round(sum*1000000)) {
      cont = false;
    } else {
      if (backdisc(sum, period, r) < sum)
        r2 = r;
      else
        r1 = r;
    }
  }
  
  return Math.pow(1 + r, 12) - 1;
} 

function updateMonthlyPayment() {
  var sum = parseInt($("loanSum").getValue());
  var period = parseInt($("loanPeriod").getValue()); // In years
  var amount = calculateTotalLoanAmount(sum, period);
  var monthlyPayment = calculateMonthlyPayment(sum, period);
  var yearlyCostPct = calculateYearlyCostPct(sum, period) * 100;

  sum = new NumberFormat(sum);
  sum.setSeparators(true, '.', ',');

  amount = new NumberFormat(amount);
  amount.setSeparators(true, '.', ',');

  monthlyPayment = new NumberFormat(monthlyPayment);
  monthlyPayment.setSeparators(true, '.', ',');

  $("loanMonthlyPaymentResult").update(monthlyPayment.toFormatted());
  $("loanSumResult").update(sum.toFormatted());
  $("loanAmountResult").update(amount.toFormatted());
  $("loanPeriodResult").update(period * 12);
  $("loanYearlyCostPct").update(yearlyCostPct.toFixed(2));
}

function updateLoanInformation() {
  updateMonthlyPayment();

  new Effect.Highlight("loanMonthlyPaymentCell", {
      'restorecolor': '#D2D2D2',
      'endcolor':     '#D2D2D2'
  });

  new Effect.Highlight("loanYearlyCostPctCell", {
      'restorecolor': '#D2D2D2',
      'endcolor':     '#D2D2D2'
  });
}

Event.observe(window, 'load', function() {
  Event.observe("loanSum", "change", updateLoanInformation);
  Event.observe("loanSum", "keyup", updateMonthlyPayment);
  Event.observe("loanPeriod", "change", updateLoanInformation);
  Event.observe("loanPeriod", "keyup", updateMonthlyPayment);

  updateMonthlyPayment();
});

