﻿var elements = {};
Number.implement({
    numberFormat : function(decimals, dec_point, thousands_sep) {
        decimals = Math.abs(decimals) + 1 ? decimals : 2;
        dec_point = dec_point || '.';
        thousands_sep = thousands_sep || ',';
        var matches = /(-)?(\d+)(\.\d+)?/.exec((isNaN(this) ? 0 : this) + '');
        var remainder = matches[2].length > 3 ? matches[2].length % 3 : 0;
        return (matches[1] ? matches[1] : '') + (remainder ? matches[2].substr(0, remainder) + thousands_sep : '') + matches[2].substr(remainder).replace(/(\d{3})(?=\d)/g, "$1" + thousands_sep) + (decimals ? dec_point + (+matches[3] || 0).toFixed(decimals).substr(2) : '');
    }
});
function calculate() {
    elements.calculatorResponseBox.fade("hide");
    elements.errorBox.fade("hide");
    
    var loanAmount = elements.calculatorElements.loanAmount.value;
    var loanTerm = elements.calculatorElements.loanTerm.value;
    var loanTermType = elements.calculatorElements.loanTermType.getSelected()[0].value;
    var interestRate = elements.calculatorElements.interestRate.value;
    
    var errors = [];
    if (loanAmount == "") { errors.push("You must enter a loan amount."); } else { loanAmount = loanAmount.replace(/,/g, "").toFloat(); }
    if (isNaN(loanAmount)) { errors.push("Loan Amount must be a number."); }
    if (loanTerm == "") { errors.push("You must enter a loan term."); } else { loanTerm = loanTerm.toFloat(); }
    if (isNaN(loanTerm)) { errors.push("Loan Term must be a number."); }
    if (interestRate == "") { errors.push("You must enter an interest rate."); } else { interestRate = interestRate.toFloat(); }
    if (isNaN(interestRate)) { errors.push("Interest Rate must be a number."); }
    if (errors.length != 0) {
        if (errors.length != 1) {
            var error = "";
            errors.each(function(item, index) {
                if (index != 0) {  error += "<br />"; }
                error += item;
            });
            showError(error);
        } else { showError(errors[0]); }
    } else {
        if (loanTermType == "Years") { loanTerm = (loanTerm*12); }
        //Calculate Monthly Payment
//        var C, R, N, r;
//        C = loanAmount;
//        R = interestRate;
//        r = (R/1200);
//        N = loanTerm;
//        var firstPower = Math.pow((1 + r), N);
//        var upper = ((C * r) * firstPower);
//        var secondPower = Math.pow((1 + r), N);
//        var lower = (secondPower - 1);
//        var monthlyPayment = (upper/lower); 
        var monthlyPayment = (((loanAmount * (interestRate/1200)) * Math.pow((1 + (interestRate/1200)), loanTerm))/(Math.pow((1 + (interestRate/1200)), loanTerm) - 1));
        var totalPayment = (monthlyPayment * loanTerm);
        var totalInterest = (totalPayment - loanAmount);
        
        elements.calculatorResponseElements.monthlyPayment.getElement("span").setProperty("html", ("$" + monthlyPayment.round(2).numberFormat(2, ".", ",")));
        elements.calculatorResponseElements.totalPayment.getElement("span").setProperty("html", ("$" + totalPayment.round(2).numberFormat(2, ".", ",")));
        elements.calculatorResponseElements.totalInterest.getElement("span").setProperty("html", ("$" + totalInterest.round(2).numberFormat(2, ".", ",")));
        elements.calculatorResponseBox.fade("in");
    }
};

function showError(error) {
    elements.errorBox.setProperty("html", error);
    elements.errorBox.fade("in");
}

var doCalculation = function(event) {
    if (event.type == "click" || event.key == "enter") {
        calculate();
        event.stop();
    }
}

function initCalculator() {
    elements.errorBox = $("errors");
    elements.calculatorBox = $("calculator");
    elements.calculatorResponseBox = $("calculatorResponse");
    elements.calculatorElements = {
        loanAmount: elements.calculatorBox.getElementById("loanAmount"),
        loanTerm: elements.calculatorBox.getElementById("loanTerm"),
        loanTermType: elements.calculatorBox.getElementById("loanTermType"),
        interestRate: elements.calculatorBox.getElementById("interestRate"),
        calculateBTN: elements.calculatorBox.getElementById("calculate")
    };
    elements.calculatorResponseElements = {
        monthlyPayment: elements.calculatorResponseBox.getElementById("monthlyPayment"),
        totalPayment: elements.calculatorResponseBox.getElementById("totalPayment"),
        totalInterest: elements.calculatorResponseBox.getElementById("totalInterest")
    };
    
    elements.calculatorResponseBox.fade("hide");
    elements.errorBox.fade("hide");
    
    elements.calculatorElements.calculateBTN.addEvent("click", doCalculation);
    elements.calculatorElements.loanAmount.addEvent("keypress", doCalculation);
    elements.calculatorElements.loanTerm.addEvent("keypress", doCalculation);
    elements.calculatorElements.interestRate.addEvent("keypress", doCalculation);
    elements.calculatorElements.loanTermType.addEvent("keypress", doCalculation);
}