﻿/*global alert: true */
// validate that user inputs are numbers and within the allowable range
"use strict";
var CBCDepositCalculator = {};
var i;
var ch;
var num;
CBCDepositCalculator.validate = function (input, min, max, fieldname) {
    var str = input.value;
    for (i = 0; i < str.length; i++) {
        ch = str.substring(i, i + 1);
        if ((ch < "0" || "9" < ch) && ch !== '.') {
            alert(fieldname + " contains invalid data: " + str);
            return false;
        }
    }
    num = 0 + str;
    if (num < min || max < num) {
        alert(fieldname + " is not within the allowable range [" + min + " - " + max + "]");
        return false;
    }
    input.value = str;
    return true;
};

// calculate the future value
var principal;
var interest;
var frequency;
var months;

CBCDepositCalculator.calculate = function (form) {
    // stop calculation if any required fields are empty
    if ((form.CBCDepositCalculator_months.value === null || form.CBCDepositCalculator_months.value.length === 0) ||
        (form.CBCDepositCalculator_interest.value === null || form.CBCDepositCalculator_interest.value.length === 0) ||
        (form.CBCDepositCalculator_principal.value === null || form.CBCDepositCalculator_principal.value.length === 0)) {
        form.CBCDepositCalculator_fv.value = "";
        form.CBCDepositCalculator_interest_earned.value = "";
        form.CBCDepositCalculator_apy.value = "";
        return;
    }
    // validate form fields for accurate user inputs
    if (!CBCDepositCalculator.validate(form.CBCDepositCalculator_months, 1, 999, "Number of Months") ||
        !CBCDepositCalculator.validate(form.CBCDepositCalculator_interest, 0.01, 99, "Interest Rate") ||
        !CBCDepositCalculator.validate(form.CBCDepositCalculator_principal, 1, 10000000, "Deposit Amount")) {
        form.CBCDepositCalculator_fv.value = "";
        form.CBCDepositCalculator_interest_earned.value = "";
        form.CBCDepositCalculator_apy.value = "";
        return;
    }

    principal = form.CBCDepositCalculator_principal.value;
    interest = form.CBCDepositCalculator_interest.value / 100;
    frequency = form.CBCDepositCalculator_frequency.value;
    months = form.CBCDepositCalculator_months.value;

    // calculate future value:     FV = PV * (1 + i)^t
    var fv = (principal * Math.pow((1 + interest / frequency), months / 12 * frequency)).toFixed(2);
    form.CBCDepositCalculator_fv.value = "$" + fv;

    // calculate interest earned:      FV - PV
    form.CBCDepositCalculator_interest_earned.value = "$" + (fv - principal).toFixed(2);

    // calculate APY:       APY = (1 + r/n )^n ? 1 
    form.CBCDepositCalculator_apy.value = (100 * (Math.pow((1 + interest / frequency), frequency) - 1)).toFixed(3) + "%";
};