// Set up the formatters
var nf = new NumberFormat(0);
nf.setPlaces(0);
// Percentage formatter
var pf = new NumberFormat(0);

function updateCosts()
{
    updateRentCost(); 
    updateMortgagePayment();
}


function updateRentCost()
{
    var txtRent = document.getElementById('txtMonthRent');
    var txtRentIns = document.getElementById('txtRentIns');
    var spnAnnRent = document.getElementById('spnAnnualRent');
    var spnTotRentCost = document.getElementById('spnTotRentCost');
    var iRent = parseNum(txtRent);
    var iAnnRent = iRent * 12;
    var iRentIns = parseNum(txtRentIns);
    var iTotRentCost = iAnnRent + iRentIns;
    spnAnnRent.innerHTML = formatNum(iAnnRent);
    spnTotRentCost.innerHTML = formatNum(iTotRentCost);
    
    calcTotSavings();
      
}

function updateMortgagePayment()
{
    var lDownPayment = parseNum(document.getElementById('txtDownPymt'));
    var lPurPrice = parseNum(document.getElementById('txtPurchasePrice'));
    var lIntRate = parseDec(document.getElementById('txtAnnIntRate')) / 100;
    var lNumPeriods = parseNum(document.getElementById('txtMortTerm'));
    var lPayment = calculatePayment(lPurPrice, lIntRate, lNumPeriods, lDownPayment);
    
    var spnPayment = document.getElementById('spnMnthMortgagePymt');
    var spnAnnPayment = document.getElementById('spnAnnMortgagePymt');
    var spnMortgageLoanAmt = document.getElementById('spnMortgageLoanAmt');
    spnMortgageLoanAmt.innerHTML = formatNum(lPurPrice - lDownPayment);
    spnPayment.innerHTML = formatNum(lPayment);
    spnAnnPayment.innerHTML = formatNum(lPayment * 12);
   
    updateUsingSavingsCost();
    updateTotalBuyCost();
    calculateFirstYearPrincipal();
    calcIncTaxSavings();
    calcFirstYrApprec();
    calcNetHomeCost();
    calcTotSavings();
}

function updateUsingSavingsCost()
{
    var lReturnRate = parseDec(document.getElementById('txtReturnRate'));  
    var lDownPayment = parseNum(document.getElementById('txtDownPymt'));
    var lCloseCost = parseNum(document.getElementById('txtEstCloseCost'));
    
    var lUsingSavingCost = (lDownPayment + lCloseCost) * (lReturnRate / 100) ;
    
    var spnUsingSavingCost = document.getElementById('spnUsingSavingsCost');
    spnUsingSavingsCost.innerHTML = formatNum(lUsingSavingCost);
    
    updateTotalBuyCost();
}

function updateTotalBuyCost()
{
    var lSavingsCost = parseSpanNum(document.getElementById('spnUsingSavingsCost'));
    var lAnnMortPymt = parseSpanNum(document.getElementById('spnAnnMortgagePymt'));
    var lPropTaxes = parseNum(document.getElementById('txtAnnPropTaxes'));
    var lHomeIns = parseNum(document.getElementById('txtAnnHomeIns'));
    var lMaintCost = parseNum(document.getElementById('txtAnnMaintCost'));
    
    var spnTotalBuyCost = document.getElementById('spnTotalBuyCost');
    spnTotalBuyCost.innerHTML = formatNum(lSavingsCost + lPropTaxes + lHomeIns + lMaintCost + lAnnMortPymt);
    
    calcAfterTaxHomeCost();
    
}

function calculateFirstYearPrincipal()
{
    var lIntRate = parseDec(document.getElementById('txtAnnIntRate')) / 100;
    var lLoanAmt = parseSpanNum(document.getElementById('spnMortgageLoanAmt'));
    var annMortPymt = parseSpanNum(document.getElementById('spnAnnMortgagePymt'));
    
    var spnPrincReduction = document.getElementById('spnPrincReduction');
    var princRed = annMortPymt - (lLoanAmt * lIntRate);
    nf.setNumber(princRed);
    spnPrincReduction.innerHTML = formatNum(princRed);
}

function calcIncTaxSavings()
{
    var annMortPymt = parseSpanNum(document.getElementById('spnAnnMortgagePymt'));    
    var princRed = parseSpanNum(document.getElementById('spnPrincReduction'));
    var incTaxRate = parseDec(document.getElementById('txtIncTaxRate')) / 100;
           
    var spnIncTaxSavings = document.getElementById('spnIncTaxSavings');
    spnIncTaxSavings.innerHTML = formatNum( (annMortPymt - princRed) * incTaxRate); 
    
    calcPropTaxSavings();  
}

function calcPropTaxSavings()
{
    var incTaxRate = parseDec(document.getElementById('txtIncTaxRate')) / 100;
    var lPropTaxes = parseNum(document.getElementById('txtAnnPropTaxes'));
    
    var spnPropTaxSavings = document.getElementById('spnPropTaxSavings');
    spnPropTaxSavings.innerHTML = formatNum( lPropTaxes * incTaxRate );
    
    updateTotalBuyCost();
    calcTotAdjustments();
}

function calcTotAdjustments()
{
    var princRed = parseSpanNum(document.getElementById('spnPrincReduction'));
    var incTaxSavings = parseSpanNum(document.getElementById('spnIncTaxSavings'));
    var propTaxSavings = parseSpanNum(document.getElementById('spnPropTaxSavings')); 
    
    var spnTotAdjusts = document.getElementById('spnTotAdjusts');
    spnTotAdjusts.innerHTML = formatNum(princRed + incTaxSavings + propTaxSavings);
    
    calcAfterTaxHomeCost();
}

function calcAfterTaxHomeCost()
{
    var totAdjust = parseSpanNum(document.getElementById('spnTotAdjusts'));
    var totBuyCost = parseSpanNum(document.getElementById('spnTotalBuyCost'));
    
    var spnAnnAfterTaxCost = document.getElementById('spnAnnAfterTaxCost');
    spnAnnAfterTaxCost.innerHTML = formatNum(totBuyCost - totAdjust);
    
    calcNetHomeCost();
    
}

function calcFirstYrApprec()
{
    var annApprec = parseDec(document.getElementById('txtAnnApprec')) / 100;
    var lPurPrice = parseNum(document.getElementById('txtPurchasePrice'));
    
    var spnEstApprec = document.getElementById('spnEstApprec');
    spnEstApprec.innerHTML = formatNum( lPurPrice * annApprec ); 
    
    calcNetHomeCost();   
}

function calcNetHomeCost()
{
    var aftTaxCost = parseSpanNum(document.getElementById('spnAnnAfterTaxCost'));
    var estApprec = parseSpanNum(document.getElementById('spnEstApprec'));
    
    var spnNetAnnCost = document.getElementById('spnNetAnnCost');
    spnNetAnnCost.innerHTML = formatNum( aftTaxCost - estApprec );
    
    calcTotSavings();
}

function calcTotSavings()
{
    var netHomeCost = parseSpanNum(document.getElementById('spnNetAnnCost'));
    var netRentCost = parseSpanNum(document.getElementById('spnTotRentCost'));
    
    var netSavings = 0;
    if (netHomeCost < netRentCost) 
    {
        netSavings = netRentCost - netHomeCost;
    } 
    else
    {
        netSavings = (netHomeCost - netRentCost) * -1;
    }
    
    var spnAnnSavings = document.getElementById('spnAnnSavings');
    spnAnnSavings.innerHTML = formatNum(netSavings); 
    
    var spnTopSavings = document.getElementById('spnTopSavings');
    spnTopSavings.innerHTML = formatNum(netSavings);
}

// Financial functions
function calculatePayment( presValue, intRate, numYears, downPayment) 
{
    var princ = presValue - downPayment
    var intRate = intRate / 12;
    var months = numYears * 12;
    var payment = Math.floor((princ * intRate)/(1-Math.pow(1+intRate,(-1*months)))*100)/100;
    return payment;
}

// Number formatters
function validateNumber( obj ) 
{
    obj.value = formatNum(parseNum(obj));   
}

function validatePercent( obj )
{
    obj.value = formatDec(parseDec(obj));   
}   

function formatNum( num )
{
    if (num < 0)
    {
        nf.setNumber(num * -1);
        return '<span style="color:red;">(' + nf.toFormatted() + ')</span>';
    }
    else
    {
        nf.setNumber(num);
        return nf.toFormatted();
    }
}

function formatDec( num )
{
    pf.setNumber(num);
    return pf.toFormatted();
}

function parseNum( obj )
{
    nf.setNumber(strip(obj.value));
    return nf.toUnformatted();
}

function parseSpanNum( obj )
{
    nf.setNumber(strip(obj.innerHTML));
    if (obj.innerHTML.indexOf('(') != -1)
    {
        // negative num
        return nf.toUnformatted() * -1;
    }
    else
    {
        return nf.toUnformatted();
    }
}

function parseDec( obj )
{
    pf.setNumber(strip(obj.value));
    return pf.toUnformatted();
}

function parseSpanDec( obj )
{
    pf.setNumber(strip(obj.innerHTML));
    return pf.toUnformatted();
}

function strip( sValue )
{
    sValue = sValue.replace( /[^0-9.]/g, '');
    return sValue;   
}