/**
 * This file contains the business logic for the calculators.
 * Updated: December 21, 2010
 */

// begin utility functions
function trim(text) {
    return text.replace(/^\s+|\s+$/g,"");
}
function isNumeric(text) {
    if (trim(text).length > 0 && !isNaN(text)) {
        return true;
    } else {
        return false;
    }
}
function formatCurrency(num) {
    num = num.toString().replace(/\$|\,/g,'');
    if(isNaN(num))
        num = "0";
    sign = (num == (num = Math.abs(num)));
    num = Math.floor(num*100+0.50000000001);
    cents = num%100;
    num = Math.floor(num/100).toString();
    if (cents<10)
        cents = "0" + cents;
    for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++)
        num = num.substring(0,num.length-(4*i+3))+''+num.substring(num.length-(4*i+3));
    return (((sign)?'':'-') + num + '.' + cents);
}
function addPadding(numberOfSpaces) {
    var stringOfSpaces = '';
    for (i = 0; i < numberOfSpaces; i++) {
        stringOfSpaces = stringOfSpaces + ' ';
    }
    return stringOfSpaces;
}
// end utility functions

// begin calculator business logic
function calculateRoi() {
    var purchasePrice = document.getElementById('roi_purchasePrice').value;
    var annualAppreciation = document.getElementById('roi_annualAppreciation').value;
    var downPayment = document.getElementById('roi_downPayment').value;
    var otherCost = document.getElementById('roi_otherCost').value;

    if (isNumeric(purchasePrice) && isNumeric(annualAppreciation) && isNumeric(downPayment) && isNumeric(otherCost)) {
        var appreciationRate = annualAppreciation / 100;
        var totalCost = parseFloat(downPayment) + parseFloat(otherCost);
        var result = (purchasePrice * appreciationRate) / totalCost;
        document.getElementById('roi_result').value = formatCurrency(result);
    }
}

function calculateNoi() {
    var grossIncome = document.getElementById('noi_grossIncome').value;
    var operatingExpense = document.getElementById('noi_operatingExpense').value;

    if (isNumeric(grossIncome) && isNumeric(operatingExpense)) {
        var netOperatingIncome = grossIncome - operatingExpense;
        document.getElementById('noi_netOperatingIncome').value = netOperatingIncome;
    }
}

function calculateAmortization() {
    var loanAmount = document.getElementById('amortization_loanAmount').value;
    var interestRate = document.getElementById('amortization_interestRate').value;
    var term = document.getElementById('amortization_term').value;

    if (isNumeric(loanAmount) && isNumeric(interestRate) && isNumeric(term)) {
        var x = 0;
        var multiplier = (interestRate / 1200) + 1;
        for (i = 1; i <= term; i++) {
            x = x + Math.pow(multiplier, -i);
        }
        var thePayment = loanAmount / x;

        var results = 'Monthly Payment: ' + (Math.round(thePayment * 100) / 100) + '\r\r';
        
        var currentLine;
        var currentBalance = loanAmount;
        var principalPaid;
        var interestPaid;
        var totalInterest = 0;

        results = results + 'Month   Balance     Principal   Interest    Payment     Total Interest\r';
        
        for (month = 1; month <= term; month++) {
            interestPaid = currentBalance * interestRate / 1200;
            totalInterest = totalInterest + interestPaid;
            principalPaid = thePayment - interestPaid;
            currentBalance = currentBalance - principalPaid;

            currentLine = month;
            currentLine = currentLine + addPadding(8 - currentLine.toString().length);

            currentLine = currentLine + formatCurrency(Math.round(currentBalance * 100) / 100);
            currentLine = currentLine + addPadding(20 - currentLine.length);

            currentLine = currentLine + formatCurrency(Math.round(principalPaid * 100) / 100);
            currentLine = currentLine + addPadding(32 - currentLine.length);

            currentLine = currentLine + formatCurrency(Math.round(interestPaid * 100) / 100);
            currentLine = currentLine + addPadding(44 - currentLine.length);

            currentLine = currentLine + formatCurrency(Math.round(month * thePayment * 100) / 100);
            currentLine = currentLine + addPadding(56 - currentLine.length);

            currentLine = currentLine + formatCurrency(Math.round(totalInterest * 100) / 100) + '\r';

            results = results + currentLine;
        }

        document.getElementById('amortization_results').value = results;
    }
}

function calculateCapRate() {
    var netOperatingIncome = document.getElementById('caprate_netOperatingIncome').value;
    var salesPrice = document.getElementById('caprate_salesPrice').value;

    if (isNumeric(netOperatingIncome) && isNumeric(salesPrice)) {
        var caprate = netOperatingIncome / salesPrice;
        document.getElementById('caprate_result').value = formatCurrency(caprate);
    }
}

function calculateFutureValue() {
    var presentValue = document.getElementById('futurevalue_presentValue').value;
    var interest = document.getElementById('futurevalue_interest').value;
    var numberOfYears = document.getElementById('futurevalue_numberOfYears').value;

    if (isNumeric(presentValue) && isNumeric(interest) && isNumeric(numberOfYears)) {
        var simpleInterestFutureValue = presentValue * (1 + ((interest / 100) * numberOfYears));
        document.getElementById('futurevalue_simpleInterestFutureValue').value = formatCurrency(simpleInterestFutureValue);

        var factor = 1 + (interest / 100);
        var compoundFactor = Math.pow(factor, numberOfYears);
        var compoundInterestFutureValue = presentValue * compoundFactor;
        document.getElementById('futurevalue_compoundInterestFutureValue').value = formatCurrency(compoundInterestFutureValue);
    }
}

function calculateGrossRent() {
    var salesPrice = document.getElementById('grossrent_salesPrice').value;
    var grossRent = document.getElementById('grossrent_grossRent').value;

    if (isNumeric(salesPrice) && isNumeric(grossRent)) {
        var grm = salesPrice / grossRent;
        document.getElementById('grossrent_result').value = formatCurrency(grm);
    }
}

function calculateCashFlow() {
    var noi = document.getElementById('cashflow_noi').value;
    var annualDebtService = document.getElementById('cashflow_annualDebtService').value;

    if (isNumeric(noi) && isNumeric(annualDebtService)) {
        var result = noi - annualDebtService;
        document.getElementById('cashflow_result').value = formatCurrency(result);
    }
}

function calculatePresentValue() {
    var futureValue = document.getElementById('presentvalue_futureValue').value;
    var annualRate = document.getElementById('presentvalue_annualRate').value;
    var timeInYears = document.getElementById('presentvalue_timeInYears').value;

    if (isNumeric(futureValue) && isNumeric(annualRate) && isNumeric(timeInYears)) {
        var factor = 1 + (annualRate / 100);
        var compoundFactor = Math.pow(factor, timeInYears);
        var result = futureValue / compoundFactor;
        document.getElementById('presentvalue_result').value = formatCurrency(result);
    }
}

function calculateLeverage() {
    var purchasePrice = document.getElementById('leverage_purchasePrice').value;
    var financedPercent = document.getElementById('leverage_financedPercent').value;
    var extraPurchaseCost = document.getElementById('leverage_extraPurchaseCost').value;
    var annualAppreciation = document.getElementById('leverage_annualAppreciation').value;

    if (isNumeric(purchasePrice) && isNumeric(financedPercent) && isNumeric(extraPurchaseCost) && isNumeric(annualAppreciation)) {
        var downPayment = purchasePrice * (1 - (financedPercent / 100));
        document.getElementById('leverage_downPayment').value = formatCurrency(downPayment);

        var totalCashInvested = parseFloat(downPayment) + parseFloat(extraPurchaseCost);
        document.getElementById('leverage_totalCashInvested').value = formatCurrency(totalCashInvested);

        var annualAppreciationValue = purchasePrice * (annualAppreciation / 100);
        document.getElementById('leverage_annualAppreciationValue').value = formatCurrency(annualAppreciationValue);

        var annualReturn = annualAppreciationValue / totalCashInvested * 100;
        document.getElementById('leverage_annualReturn').value = formatCurrency(annualReturn);
    }
}

// end calculator business logic

