
// format floating point number to show dollars and cents
function currency2str(f)
{
    var str = "";
    var pos = 1;

    if (f < 0) // negative number
    {
        f = -f
        pos = 0;
    }  

    // extract dollars and cents
    var dollars = Math.floor(f);
    var cents   = Math.round(100*(f - dollars));
    if (cents == 100) 
    {
        dollars += 1;
        cents = 0;
    }

    if (pos == 0) str += "("; // show as negative

    if (cents == 0)
        str += dollars + ".00";
    else if (cents < 10)
        str += dollars + ".0" + cents;
    else
        str += dollars + "." + cents;

    if (pos == 0) str += ")"; // show as negative

    return str;
}

// compute the size of a periodic payment to amortize a loan
function monthly_payment( p, apr, n )
{
    var i = apr/1200;
    var m = p*i*Math.pow((1 + i), n)/(Math.pow((1 + i), n) - 1);

    return (0.01*Math.ceil(100*m));   // round up
}

// total interest and payment size for a loan
function compute1()
{
    var calc = document.getElementById("calc")
    var principal = parseFloat(calc.principal.value);
    var int_rate  = parseFloat(calc.interestrate.value);
    var months1   = parseInt(calc.months1.value);
    var payment   = monthly_payment( principal, int_rate, months1 );
    var interest  = parseFloat("0");

    // compute total interest paid
    while (principal > 0.0)
    {
        var ip    = 0.01*Math.round(principal*int_rate/12);
        principal = principal + ip - payment;
        interest += ip;
    }

    calc.payment.value   = currency2str(payment);
    calc.interest1.value = currency2str(interest);
}

// interest and principal of each payment in a separate window
function listing1()
{
    var calc = document.getElementById("calc")
    var principal = parseFloat(calc.principal.value);
    var int_rate  = parseFloat(calc.interestrate.value);
    var months1   = parseInt(calc.months1.value);
    var payment   = monthly_payment( principal, int_rate, months1 );
    var count     = parseInt("0");

    msgWindow=window.open("","msgWindow","toolbar=no,status=no,menubar=yes,scrollbars=yes,width=550,height=400");
    msgWindow.document.open();
    msgWindow.document.writeln("<html><head><title>Principal and interest listing</title></head>");
    msgWindow.document.writeln("<body>");
    msgWindow.document.writeln("<br>");
    msgWindow.document.writeln("Payment = $" + currency2str(payment));
    msgWindow.document.writeln('<table border="1" cellpadding="1" cellspacing="1">');
    msgWindow.document.writeln("<tr><th>Month</th><th>Principal</th><th>Interest</th><th>Balance</th></tr>");

    while (principal > 0.0)
    {
        var ip      = 0.01 * Math.round(principal*int_rate/12);
        if (payment > principal + ip) payment = principal + ip; 
        var pp      = payment - ip;
        var principal = principal + ip - payment;
        count++;

        msgWindow.document.write("<tr><td>");
        msgWindow.document.write(count) + "</td>";
        msgWindow.document.write("<td align=right>" + currency2str(pp) + "</td>");
        msgWindow.document.write("<td align=right>" + currency2str(ip) + "</td>");
        msgWindow.document.write("<td align=right>" + currency2str(principal) + "</td>");
        msgWindow.document.writeln("</tr>");
    }

    msgWindow.document.write("</table>");
    msgWindow.document.write("</body></html>");
    msgWindow.document.close();
}

// number of payments and total interest with extra principal
function compute2()
{
    var calc = document.getElementById("calc")
    var principal = parseFloat(calc.principal.value);
    var int_rate  = parseFloat(calc.interestrate.value);
    var months1   = parseInt(calc.months1.value);
    var payment   = monthly_payment( principal, int_rate, months1 );
    var extra     = parseFloat(calc.extra.value);
    var interest  = parseFloat("0");
    var count     = parseInt("0");

    if (isNaN(extra)) extra = parseFloat("0");

    while (principal > 0.0)
    {
        var ip    = 0.01*Math.round(principal*int_rate/12);
        principal = principal + ip - (payment + extra);
        interest += ip;
        count++;
    }

    calc.payment.value   = currency2str(payment);
    calc.interest2.value = currency2str(interest);
    calc.months2.value   = count;
}

// interest and principal of each payment in a separate window
function listing2()
{
    var calc = document.getElementById("calc")
    var principal = parseFloat(calc.principal.value);
    var int_rate  = parseFloat(calc.interestrate.value);
    var months1   = parseInt(calc.months1.value);
    var payment   = monthly_payment( principal, int_rate, months1 );
    var extra     = parseFloat(calc.extra.value);
    var count     = parseInt("0");

    if (isNaN(extra)) extra = parseFloat("0");

    msgWindow=window.open("","msgWindow","toolbar=no,status=no,menubar=yes,scrollbars=yes,width=550,height=400,resizable=yes");
    msgWindow.document.open();
    msgWindow.document.writeln("<html><head><title>Principal and interest listing</title></head>");
    msgWindow.document.writeln("<body>");
    msgWindow.document.writeln("<br>");
    msgWindow.document.writeln("Payment = $" + currency2str(payment) + " + " + currency2str(extra));
    msgWindow.document.writeln('<table border="1" cellpadding="1" cellspacing="1">');
    msgWindow.document.writeln("<tr><th>Month</th><th>Principal</th><th>Interest</th><th>Balance</th></tr>");

    while (principal > 0.0)
    {
        var ip = 0.01 * Math.round(principal*int_rate/12);

        // last payments
        if (payment > principal + ip)
        {  
            payment = principal + ip; 
            extra   = 0.0;
        }
        else if (extra > principal + ip - payment)
            extra = principal + ip - payment;

        var pp = (payment + extra) - ip;
        var principal = principal + ip - (payment + extra);
        count++;

        msgWindow.document.write("<tr><td>");
        msgWindow.document.write(count) + "</td>";
        msgWindow.document.write("<td align=right>" + currency2str(pp) + "</td>");
        msgWindow.document.write("<td align=right>" + currency2str(ip) + "</td>");
        msgWindow.document.write("<td align=right>" + currency2str(principal) + "</td>");
        msgWindow.document.writeln("</tr>");
    }

    msgWindow.document.write("</table>");
    msgWindow.document.write("</body></html>");
    msgWindow.document.close();
}
