// JavaScript Document
//  Monthly Loan Payment Calculator
// ERROR CHECKING

function checkNumber(input, min, max, msg)
{
    msg = msg + " field has invalid data: " + input.value;

    var str = input.value;

    for (var i = 0; i < str.length; i++) {

        var ch = str.substring(i, i + 1);

        if ((ch < "0" || "9" < ch) && ch != '.') {

            alert(msg); return false;
        };
    };

    var num = 0 + str;

    if (num < min || max < num) {

        alert(msg + " not in range [" + min + ".." + max + "]");

        return false;
    }

    input.value = str;

    return true;
}

// ROUND NUMBERS

function Round(n)
{
    var pennies, strPennies;

    pennies     = n * 100;
    pennies     = Math.round(pennies);
    strPennies  = "" + pennies;
    len         = strPennies.length;

    return strPennies.substring(0, len - 2) + "." + strPennies.substring(len - 2, len);
}

// CALCULATE AND VALIDATE FORM

var fields      = new String('f6,f8,f10,f12,f14').split(',');

function isUndefined(field)
{
    return ((field == undefined) ? true : false);
}

function computeForm(form)
{
    var field;

    for (var i = 0; i < fields.length; i++) {

        if (!isUndefined(form[fields[i]]) && (form[fields[i]].value == null || form[fields[i]].value.length == 0)) { return; }
    };

    if ((!isUndefined(form['f6'])   && (!checkNumber(form.f6, 1000, 60000, "Amount of Loan")))||
        (!isUndefined(form['f8'])   && (!checkNumber(form.f8, 0, 10, "Fee"))) ||
        (!isUndefined(form['f10'])  && (!checkNumber(form.f10, 0, 10, "Years of Deferral (if any)"))) ||
        (!isUndefined(form['f12'])  && (!checkNumber(form.f12, 0, 20, "Repayment Terms - Years"))) ||
        (!isUndefined(form['f14'])  && (!checkNumber(form.f14, .01, 10.5, "Interest Rate")))) {

        form.monthly.value = "Invalid";

        return;
    };

    var F       = parseFloat(form.f8.value) / 100;
    var I       = parseFloat(form.f14.value) / 1200;
    var L       = parseFloat(form.f6.value);

    // this is the removal of deferral years;
    // ---
    // as 0, deferral trickles down to set B to one, which changes G to essentially calculate as (A * C);
    // to reinstate deferral years, assign it's value properly and enable the field (commented out):

    var D       = 0; // var D = parseFloat(form.f10.value);

    // ---

    var R       = parseFloat(form.f12.value) * 12;

    var Vr = Math.pow((1 + I), -R);

    var A = L / (1 - F);
    var B = I / (1 - Vr);
    var C = Math.pow((1 + I), D);
    var P = A * B * C;
        if (P < 25) {
        P = 25;
        }

form.monthly.value = Round(P);
};


// CLEAR FORM

function clearForm(form)
{
    for (var i = 0; i < fields.length; i++) {

        if (!isUndefined(form[fields[i]])) { form[fields[i]].value = ''; }
    };
};