1$(document).ready(function(){'use strict';var defaultValues={startingBalance:1000,monthlyContributions:20,termNumber:12,termUnit:'months',savingsApy:3.00,compoundingPeriod:'monthly'};var compoundingPeriodLookup={'daily':365,'monthly':12,'quarterly':4,'semi-annually':2,'annually':1};function numberify(value){return numeral(value).value();} 2function formatDollarAmt(amount){if(typeof amount==='string'){amount=numberify(amount.replace(/,/g,''))||0;} 3return new Intl.NumberFormat('en-US',{style:'decimal',minimumFractionDigits:2,maximumFractionDigits:2}).format(amount);} 4function calculateApr(apy,compoundingPeriod){var apr,r=numberify(apy)/100,n=compoundingPeriodLookup[compoundingPeriod];apr=(((Math.pow(r+1,1/n))-1)*n)*100;return apr;} 5function calculateApy(apr,compoundingPeriod){var apy,r=numberify(apr)/100,n=compoundingPeriodLookup[compoundingPeriod];apy=(Math.pow(1+r/n,n)-1)*100;return apy;} 6function calculateInterestEarned(startingBalance,totalContributions,totalSavings){var interestEarned=totalSavings-startingBalance-totalContributions;return interestEarned;} 7function calculateTotalContributions(monthlyContributionAmount,termNumber,termUnit){var numberOfMonths,totalContributionAmount;if(termUnit==='years'){numberOfMonths=termNumber*12;}else{numberOfMonths=termNumber;} 8totalContributionAmount=monthlyContributionAmount*numberOfMonths;return totalContributionAmount;} 9function calculateTotalSavings(values){var startingBalancePlusInterest,contributionsPlusInterest,totalSavings,p=numberify(values.startingBalance),pmtAmt=numberify(values.monthlyContributions),pmtsPerYr=12,r=numberify(values.interestRate)/100,n=compoundingPeriodLookup[values.compoundingPeriod],termNumber=numberify(values.termNumber),t;if(values.termUnit==='years'){t=termNumber;}else{t=termNumber/12;} 10if(r===0){totalSavings=p+(pmtAmt*pmtsPerYr*t);}else{startingBalancePlusInterest=p*(Math.pow(1+r/n,n*t));contributionsPlusInterest=pmtAmt*(pmtsPerYr/n*((Math.pow(1+r/n,n*t)-1)/(r/n)));totalSavings=startingBalancePlusInterest+contributionsPlusInterest;} 11return totalSavings;} 12if(!localStorage.sssSavingsCalcValues){localStorage.sssSavingsCalcValues=JSON.stringify(defaultValues);} 13var model={calculatorValues:JSON.parse(localStorage.sssSavingsCalcValues),resultValues:{interestEarned:0,totalContributions:0,totalSavings:0},updateLocalStorage:function(){localStorage.sssSavingsCalcValues=JSON.stringify(this.calculatorValues);}};var controller={init:function(){calculatorView.init();resultsView.init();},getCalcValues:function(){return model.calculatorValues;},updateCalcValues:function(inputValues){model.calculatorValues.startingBalance=numberify(inputValues.startingBalanceValue);model.calculatorValues.monthlyContributions=numberify(inputValues.contributionsValue);model.calculatorValues.termNumber=numberify(inputValues.termNumberValue);model.calculatorValues.termUnit=inputValues.termUnitValue;model.calculatorValues.savingsApy=numberify(inputValues.savingsApyValue);model.calculatorValues.compoundingPeriod=inputValues.compoundingPeriodValue;model.updateLocalStorage();calculatorView.render();},getResultsValues:function(){return model.resultValues;},updateResultsValues:function(){var calcValues=model.calculatorValues,resultValues=model.resultValues;model.resultValues.totalContributions=calculateTotalContributions(calcValues.monthlyContributions,calcValues.termNumber,calcValues.termUnit);model.resultValues.totalSavings=calculateTotalSavings({'startingBalance':calcValues.startingBalance,'monthlyContributions':calcValues.monthlyContributions,'interestRate':calculateApr(calcValues.savingsApy,calcValues.compoundingPeriod).toFixed(2),'compoundingPeriod':calcValues.compoundingPeriod,'termNumber':calcValues.termNumber,'termUnit':calcValues.termUnit});model.resultValues.interestEarned=calculateInterestEarned(calcValues.startingBalance,resultValues.totalContributions,resultValues.totalSavings);resultsView.render();}};var calculatorView={init:function(){this.calcInputs={'startingBalance':$('#savings-calc_starting-balance'),'contributions':$('#savings-calc_contributions'),'termNumber':$('#savings-calc_term-number'),'termUnit':$('#savings-calc_term-unit'),'savingsApy':$('#savings-calc_savings-apy'),'interestRate':$('#savings-calc_interest-rate'),'compoundingPerio
13d':$('#savings-calc_compounding-period')};this.calculateButton=$('#savings-calc_calculate-button');$('.calc-form').on('change','#savings-calc_starting-balance, #savings-calc_contributions',function(){var thisInput=$(this);thisInput.val(formatDollarAmt(thisInput.val()).replace(/-/g,''));});$('.calc-form').on('change','#savings-calc_term-number',function(){var thisInput=$(this);thisInput.val(Math.abs(Math.floor(numberify(thisInput.val())))||1);});$('.calc-form').on('change','#savings-calc_savings-apy, #savings-calc_interest-rate',function(){var thisInput=$(this);thisInput.val(Math.abs(numberify(thisInput.val())).toFixed(2));});$('.calc-form').on('change','#savings-calc_savings-apy, #savings-calc_compounding-period',(function(thisCopy){return function(){var updatedInterestRateValue=calculateApr($('#savings-calc_savings-apy').val(),$('#savings-calc_compounding-period').val()).toFixed(2);thisCopy.calcInputs.interestRate.val(updatedInterestRateValue);};})(this));$('.calc-form').on('change','#savings-calc_interest-rate',(function(thisCopy){return function(){var updatedSavingsApyValue=calculateApy($('#savings-calc_interest-rate').val(),$('#savings-calc_compounding-period').val()).toFixed(2);thisCopy.calcInputs.savingsApy.val(updatedSavingsApyValue);};})(this));this.calculateButton.on('click',(function(thisCopy){return function(){controller.updateCalcValues({'startingBalanceValue':thisCopy.calcInputs.startingBalance.val(),'contributionsValue':thisCopy.calcInputs.contributions.val(),'termNumberValue':thisCopy.calcInputs.termNumber.val(),'termUnitValue':thisCopy.calcInputs.termUnit.val(),'savingsApyValue':thisCopy.calcInputs.savingsApy.val(),'compoundingPeriodValue':thisCopy.calcInputs.compoundingPeriod.val()});controller.updateResultsValues();};})(this));this.render();},render:function(){var calcValues=controller.getCalcValues();this.calcInputs.startingBalance.val(formatDollarAmt(calcValues.startingBalance));this.calcInputs.contributions.val(formatDollarAmt(calcValues.monthlyContributions));this.calcInputs.termNumber.val(calcValues.termNumber);this.calcInputs.termUnit.val(calcValues.termUnit).trigger('change');this.calcInputs.savingsApy.val(calcValues.savingsApy.toFixed(2));this.calcInputs.interestRate.val(calculateApr(calcValues.savingsApy,calcValues.compoundingPeriod).toFixed(2));this.calcInputs.compoundingPeriod.val(calcValues.compoundingPeriod).trigger('change');}};var resultsView={init:function(){this.savingsResults=$('#savings-calc_savings-results');this.savingsResultsDL=$('<dl class="row"></dl>');this.initialDepositDT=$('<dt class="col-8">Initial Deposit</dt>');this.initialDepositDD=$('<dd class="col-4 text-right"></dd>');this.totalContributionsDT=$('<dt class="col-8">Total Contributions</dt>');this.totalContributionsDD=$('<dd class="col-4 text-right"></dd>');this.interestEarnedDT=$('<dt class="col-8">Dividend Earnings</dt>');this.interestEarnedDD=$('<dd class="col-4 text-right"></dd>');this.totalSavingsDT=$('<dt class="col-8">Total Savings</dt>');this.totalSavingsDD=$('<dd class="col-4 text-right"></dd>');},render:function(){var resultValues=controller.getResultsValues();this.interestEarnedDD.text('$'+formatDollarAmt(resultValues.interestEarned));this.totalContributionsDD.text('$'+formatDollarAmt(resultValues.totalContributions));this.initialDepositDD.text('$'+formatDollarAmt(controller.getCalcValues().startingBalance));this.totalSavingsDD.text('$'+formatDollarAmt(resultValues.totalSavings));this.savingsResultsDL.append(this.initialDepositDT,this.initialDepositDD,this.totalContributionsDT,this.totalContributionsDD,this.interestEarnedDT,this.interestEarnedDD,this.totalSavingsDT,this.totalSavingsDD);this.savingsResults.empty();this.savingsResults.append(this.savingsResultsDL);}};controller.init();$('.savings-calc-btn, [data-target="#Savings-Calculator"], [data-bs-target="#Savings-Calculator"]').on('click',function(){var thisBtn=$(this),calcValues=controller.getCalcValues();controller.updateCalcValues({'startingBalanceValue':thisBtn.data('starting-balance')!==undefined?thisBtn.data('starting-balance'):calcValues.startingBalance,'contributionsValue':thisBtn.data('contributions')!==undefined?thisBtn.data('contributions'):calcValues.monthlyContributions,'termNumberValue':thisBtn.data('term-number')!==undefined?thisBtn.data('term-number'):calcValues.termNumber,'termUnitValue':thisBtn.data('term-unit')!==undefined?thisBtn.data('term-unit'):calcValues.termUnit,'savingsApyValue':thisBtn.data('savings-apy')!==undefined?thisBtn.data('savings-apy'):calcValues.savingsApy,'compoundingPerio
13dValue':thisBtn.data('compounding-period')!==undefined?thisBtn.data('compounding-period'):calcValues.compoundingPeriod});controller.updateResultsValues();});if('URLSearchParams'in window){var queryString=window.location.search,urlParams=new URLSearchParams(queryString),calcValues=controller.getCalcValues();controller.updateCalcValues({'startingBalanceValue':urlParams.has('starting-balance')?urlParams.get('starting-balance'):calcValues.startingBalance,'contributionsValue':urlParams.has('contributions')?urlParams.get('contributions'):calcValues.monthlyContributions,'termNumberValue':urlParams.has('term-number')?urlParams.get('term-number'):calcValues.termNumber,'termUnitValue':urlParams.has('term-unit')?urlParams.get('term-unit'):calcValues.termUnit,'savingsApyValue':urlParams.has('savings-apy')?urlParams.get('savings-apy'):calcValues.savingsApy,'compoundingPeriodValue':urlParams.has('compounding-period')?urlParams.get('compounding-period'):calcValues.compoundingPeriod});controller.updateResultsValues();}});
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.