/**
 *  Helper function
 */ 



function getPercentage (value)
{
 return parseFloat(value) / 100;
}

function getTotalBankLoan (value) 
{
    return parseFloat(value) / 2;
}

function getTotal504Loan (total, amortization) 
{
    var _percentage = 50 - parseInt(amortization);
    return new Number(total * getPercentage(_percentage));
}

function getTotalEquity (total, downpaymentPercentage) 
{
    return new Number(total * getPercentage(downpaymentPercentage));
}

/**
 *  getAmortization()
 *  equation: Lr / (1 - (1 + r)^-t)
 *  
 *  L : Loan amount
 *  r : rate per period : rate / 100 / (amortization * 12)
 *  t : number of periods   (amortization * 12)
 */
function getAmortization (totalBankLoan, amortization, rate) 
{
    var _rate = getPercentage(rate);
    var r = _rate / 12;
    var dividend    = parseFloat(totalBankLoan * r);
    
    var t = parseInt(amortization) * 12;
    var divisor = (1 + r);
    divisor = Math.pow(divisor, -t);
    divisor = 1 - divisor;
    
    return new Number(dividend / divisor);
}

function getFundingFee (total504) 
{
    return new Number(parseFloat(total504) * 0.0025);
}

function getUnderwritingFee (loan, amortization, fundingFee, closingCost) 
{
    
    var sum             = parseFloat(fundingFee) + parseFloat(closingCost) + parseFloat(loan);
    var underWriting    = 0.0;
    var fee             = 0.0;
    switch (parseInt(amortization))
    {
        case 10:
                        sum = (sum / 0.99600);
            fee = sum.toNearestThousand();
            underWriting = fee * 0.004;
            break; 
        default:
                        sum = (sum / 0.99625)
            fee = sum.toNearestThousand();
            underWriting = fee * 0.00375;
    }
    return new Number(underWriting);
}

function getCdcPackageFee (totalProject, downpay)
{
    totalProject = parseInt(totalProject);
    downpay = parseInt(downpay);
        
        var percentage = 0.0;
        var packageFee = 0.0;
        
        switch (downpay)
        {
                case 10:
                        percentage = 0.4;
                        break;
                case 15:
                        percentage = 0.35;
                        break;
                case 20:
                        percentage = 0.3;
                        break;
        }
        
        packageFee = (percentage * 0.015) * totalProject;
        return packageFee;
}

function getRmiPayments(loan, fees, amortization, rmiInterest)
{
    loan            = parseFloat(loan);
    fees            = parseFloat(fees);
    amortization    = parseFloat(amortization);
    rmiInterest     = parseFloat(rmiInterest);
    
    var rmiFee = 0;
    _loan = loan + fees;
    return new Number(getAmortization(_loan, amortization, rmiInterest));
}
//  taken from original script
function put_commas(input) {
    var result, len;
    input += "";

    //get rid of any commas
    input = input.replace(',','');

    // Locate the decimal point if any.
    len = input.indexOf(".");
    if (len == -1) {
        len = input.length;
        result = ".00";
    } else if(len == 3) {
        result = input.substring(len, len+3);
    }else {
        result = input.substring(len, len+3);
    }
        
    // 3 characters at a time through the integer portion.
    while (len > 3) {
        result = input.substring(len-3, len) + result;
        result = "," + result;
        len -= 3;
    }

    //be absolutely sure it's exactly 2 decimals
    spl = result.split('.');
    if(spl.length == 2){
        if(spl[1].length > 2){
            spl[1] = spl[1].substring(0,2);
            result = spl.join('.');
        }
        else if(spl[1].length == 1){
            spl[1] = spl[1] + '0';
            result = spl.join('.');
        }
        else if(spl[1].length == 0){
            spl[1] = spl[1] + '00';
            result = spl.join('.');
        }
    }

    // Add any remaining characters.
    result = input.substring(0, len) + result;
    return result;
}

//  provide functionality in Number object to round UP to the nearest 1000
Number.prototype.toNearestThousand = function() { // num is an exponent of 10
     return (1000 * Math.floor((this + 999.99) /  1000));
};

// modified from original script commas from a passed string.
function strip_commas(input) {
    var str = input.replace(/,/gi, "");
    return new Number(str);
}

//  taken from original script

function checkNumber(input,field)
{
    // blank field reset to default value.
    if (input == '') {
        alert("You must enter data for the field " + field);
        return false;
    }

    // place a warning on the status line if the field contains invalid data
    msg ="This field requires numeric data: " + input;
    var str = new String(input);
    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;
            status=msg;
        }
    }
    return true;
}


function getRmiInterest (amortization) 
{
    amortization = parseInt(amortization);
    if (10 == amortization) {
        return new Number($("#irate10").val());
    } 
    
    return new Number($("#irate20").val());
}

/** 
 *  main
 */
$(document).ready(function() {
    $("#calculate").click( function () {
        var v = $("input:radio[name=downpay]:checked").val();
        
        
        //  setup variables
        var totalProject  = strip_commas($("#totalProject").val());

        var bankLoanAmortization   = strip_commas($("#bankLoanTerm").val());    
        var bankLoanRate           = strip_commas($("#bankLoanRate").val());
        var total504LoanAmortization    = strip_commas($("input:radio[name=yearterm]:checked").val());
        var total504LoanDownPayment     = strip_commas($("input:radio[name=downpay]:checked").val());
                
        //  simple error checking
        if(bankLoanAmortization < 10) {
            alert("Loan Term must be at least 10 years!");
            return false;
        }
        
        if (!checkNumber(totalProject,"Total Project")) {
            return false;
        }
        
        if (!checkNumber(bankLoanRate,"Bank Rate")) {
            return false;
        }
        
        
        //  Structure
        var totalBankLoan   = getTotalBankLoan(totalProject);
        var total504Loan    = getTotal504Loan(totalProject, total504LoanDownPayment);
        var totalEquity     = getTotalEquity(totalProject, total504LoanDownPayment);
        //  current RMI interest rate
        var rmiInterest     = getRmiInterest(total504LoanAmortization);

        //  One time fees
        var cdcPackageFee   = getCdcPackageFee(totalProject, total504LoanDownPayment);
        var fundingFee      = getFundingFee(total504Loan);
        var closingCost     = new Number(parseFloat(strip_commas($("#legalCost").val())));
	var sbaGuarantee    = total504Loan * 0.005;

        var underWritingFee = getUnderwritingFee(total504Loan, total504LoanAmortization, fundingFee, closingCost);
        var totalFees       = parseFloat(cdcPackageFee) + parseFloat(fundingFee) + parseFloat(closingCost) + parseFloat(underWritingFee) + parseFloat(sbaGuarantee);
        
        //  payments
        var bankPayments    = getAmortization(totalBankLoan, bankLoanAmortization, bankLoanRate);
        var rmiPaymets      = getRmiPayments(total504Loan, totalFees, total504LoanAmortization, rmiInterest);
        var totalPayments   = new Number(bankPayments + rmiPaymets);
        
        //  set values
        $("#totalProject").val(put_commas(totalProject.toFixed(2)));
        $("#totalBankLoan").val(put_commas(totalBankLoan.toFixed(2)));
        $("#totalRmiloan").val(put_commas(total504Loan.toFixed(2)));
        
        $("#equilty").val(put_commas(totalEquity.toFixed(2)));
        $("#payBank").val(put_commas(bankPayments.toFixed(2)));
        $("#payRmi").val(put_commas(rmiPaymets.toFixed(2)));
        $("#payTotal").val(put_commas(totalPayments.toFixed(2)));
        
        //  fees
        $("#packageFee").val(put_commas(cdcPackageFee.toFixed(2)));
        $("#fundingFee").val(put_commas(fundingFee.toFixed(2)));
        $("#legalCost").val(put_commas(closingCost));
        $("#underWriting").val(put_commas(underWritingFee.toFixed(2)));
        $("#sbaGuarantee").val(put_commas(sbaGuarantee.toFixed(2)));
        $("#oneTimeFeesTotal").val(put_commas(totalFees.toFixed(2)));
    });
    
    
});

//  keep totalProject, bankLoanTerm, bankLoanRate a two decimal float
$("#totalProject, #bankLoanTerm, #bankLoanRate").change(function() {  
    var projectTotal = $(this).val();
    var _total = parseFloat(strip_commas(projectTotal));
    if (isNaN(_total)) {
        alert('Please use a whole number');
        $(this).val(0);
    }
});

