function calculate_payment(PV, IR, NP){
  var PMT = (PV * IR) / (1 - Math.pow(1 + IR, -NP))
  return round_decimals(PMT, 2)
}

function round_decimals(original_number, decimals){
  var result1 = original_number * Math.pow(10, decimals)
  var result2 = Math.round(result1)
  var result3 = result2 / Math.pow(10, decimals)
  return (result3)
}

function update_fields(){
  var amount   = document.getElementById("amount").value;
  var interest = document.getElementById("interest").value/100;
  var period   = document.getElementById("period").value;
  var payments = 12; //document.getElementById("payments").value;
  var extra    = 0; //document.getElementById("extra").value;
  var scheduled_payment = calculate_payment(amount,interest/payments,period*payments);

  var table = new Array();
  if(amount > 0 && interest > 0 && period > 0 && payments > 0){
    table = calculate_table(amount,scheduled_payment,extra,interest,payments);

    var actual_number     = table.length; // calculation here
    var total_early       = 0; // calculation here
    var total_interest    = 0; // calculation here
  
    var tabledata = "<br><table border=\"0\" width=\"455px\" cellspacing=\"0\" cellpadding=\"0\"><tr>";
    tabledata += "<td class=\"header\" height=\"40px\">Month<br/>No</td>";
    tabledata += "<td class=\"header\">Starting<br/>Balance</td>";
    tabledata += "<td class=\"header\">Total<br/>Payment</td>";
    tabledata += "<td class=\"header\">Principal</td>";
    tabledata += "<td class=\"header\">Interest</td>";
    tabledata += "<td class=\"header\" style=\"border-right: 1px solid #353535\">Closing<br/>Balance</td>";
    for(i=0; i<table.length; i++){
      
      total_early    += table[i]["extra_payment"];
      total_interest += table[i]["interest"];
      
      tabledata += "</tr><tr>";
      tabledata += "<td>" + (i+1) + "</td>";
      tabledata += "<td>" + format_currency(table[i]["beginning_balance"]) + "</td>";
      tabledata += "<td>" + format_currency(table[i]["total_payment"]) + "</td>";
      tabledata += "<td>" + format_currency(table[i]["principal"]) + "</td>";
      tabledata += "<td>" + format_currency(table[i]["interest"]) + "</td>";
      
      if(i<table.length-1)
        tabledata += "<td style=\"border-right: 1px solid #353535\">" + format_currency(table[i+1]["beginning_balance"]) + "</td>";
      else
        tabledata += "<td style=\"border-right: 1px solid #353535\">0.00</td>";
    }
    tabledata += "</tr></table>";

    document.getElementById("scheduled_payment").innerHTML = format_currency(scheduled_payment);
    document.getElementById("scheduled_number").innerHTML  = period*payments;
    document.getElementById("actual_number").innerHTML     = actual_number;
    //document.getElementById("total_early").innerHTML       = format_currency(total_early);
    document.getElementById("total_interest").innerHTML    = format_currency(total_interest);
    document.getElementById("payment_table").innerHTML     = tabledata;
  }
}


function calculate_table(total_amount,scheduled_payment,extra_payment,interest_rate,number_payments){
  var table = new Array();
  var i     = 0;
  
  total_amount = parseFloat(total_amount);
  
  if(isNaN(extra_payment) || extra_payment < 0 || extra_payment.length == 0) 
    extra_payment = 0.0;

  while(total_amount > 0){
    table[i] = new Object();
    table[i]["beginning_balance"] = total_amount;

    if(scheduled_payment + extra_payment < total_amount && extra_payment > 0)
      table[i]["extra_payment"]     = parseFloat(extra_payment);
    else if(total_amount - scheduled_payment > 0 && extra_payment > 0)
      table[i]["extra_payment"]     = parseFloat(total_amount) - parseFloat(scheduled_payment);
    else
      table[i]["extra_payment"]     = 0;

    if((scheduled_payment + extra_payment) < total_amount)
      table[i]["total_payment"] = parseFloat(scheduled_payment) + parseFloat(extra_payment);
    else
      table[i]["total_payment"] = total_amount;
        
    table[i]["interest"]  = round_decimals(total_amount * (interest_rate / number_payments),2);
    table[i]["principal"] = round_decimals(table[i]["total_payment"] - table[i]["interest"],2);

    if((scheduled_payment + extra_payment) < total_amount)
      total_amount = round_decimals(parseFloat(table[i]["beginning_balance"]) - parseFloat(table[i]["principal"]),2);
    else
      total_amount = 0;
    i++;
  }
  return table;
}

function format_currency(number){
  number = number.toString().replace(/\$|\,/g,'');
  if(isNaN(number))
    number = "0";
  
  sign = (number == (number = Math.abs(number)));
  number = Math.floor(number*100+0.50000000001);
  cents = number%100;
  number = Math.floor(number/100).toString();
  if(cents<10)
    cents = "0" + cents;
  for (var i = 0; i < Math.floor((number.length-(1+i))/3); i++)
    number = number.substring(0,number.length-(4*i+3))+','+ number.substring(number.length-(4*i+3));
  
  return (((sign)?'':'-') + number + '.' + cents);
}
