PageSourceSearch

https://www.mortgagenewsdaily.com/js/calc.js?v=bjnlegtL3JOceURNU3ycRHhnuWpxhy0mc5ns0ei6SYM

js mortgagenewsdaily.com collected 2026-09-24 17:15:55 UTC 158,356 bytes, 2,880 lines download raw bytes

1var CountUp;
2var mnd;
3(function (mnd) {
4    var calculators;
5    (function (calculators) {
6        if (window['Highcharts']) {
7            Highcharts.setOptions({
8                lang: {
9                    thousandsSep: ','
10                }
11            });
12        }
13        var payments_per_year = 12;
14        var PaymentFrequency;
15        (function (PaymentFrequency) {
16            PaymentFrequency[PaymentFrequency["Monthly"] = 0] = "Monthly";
17            PaymentFrequency[PaymentFrequency["BiWeekly"] = 1] = "BiWeekly";
18            PaymentFrequency[PaymentFrequency["AcceleratedBiWeekly"] = 2] = "AcceleratedBiWeekly";
19        })(PaymentFrequency = calculators.PaymentFrequency || (calculators.PaymentFrequency = {}));
20        var MortgageProductType;
21        (function (MortgageProductType) {
22            MortgageProductType[MortgageProductType["ThirtyFixed"] = 1] = "ThirtyFixed";
23            MortgageProductType[MortgageProductType["FifteenFixed"] = 2] = "FifteenFixed";
24            MortgageProductType[MortgageProductType["ThirtyFha"] = 3] = "ThirtyFha";
25            MortgageProductType[MortgageProductType["ThirtyJumbo"] = 4] = "ThirtyJumbo";
26            MortgageProductType[MortgageProductType["FiveOneArm"] = 5] = "FiveOneArm";
27            MortgageProductType[MortgageProductType["OneArm"] = 6] = "OneArm";
28            MortgageProductType[MortgageProductType["ThirtyVa"] = 7] = "ThirtyVa";
29        })(MortgageProductType = calculators.MortgageProductType || (calculators.MortgageProductType = {}));
30        var PaymentDetails = /** @class */ (function () {
31            function PaymentDetails() {
32                this.paymentExtraAmount = 0;
33                this.oneTimeExtraAmount = 0;
34                this.paymentFrequency = PaymentFrequency.Monthly;
35                this.monthlyMip = 0;
36                this.upfrontMip = 0;
37                this.totalMip = 0;
38                this.monthlyPmi = 0;
39                this.totalPmi = 0;
40            }
41            Object.defineProperty(PaymentDetails.prototype, "payment", {
42                get: function () {
43                    var fixedPayment = this.monthlyMip + this.monthlyPmi;
44                    switch (this.paymentFrequency) {
45                        case PaymentFrequency.BiWeekly:
46                        case PaymentFrequency.AcceleratedBiWeekly:
47                            return (this.monthlyPayment / 2) + (fixedPayment / 2);
48                    }
49                    return this.monthlyPayment + fixedPayment;
50                },
51                enumerable: false,
52                configurable: true
53            });
54            Object.defineProperty(PaymentDetails.prototype, "total", {
55                get: function () {
56                    return this.interest + this.principal + this.totalMip + this.totalPmi + this.upfrontMip;
57                },
58                enumerable: false,
59                configurable: true
60            });
61            Object.defineProperty(PaymentDetails.prototype, "combinedTotalMip", {
62                get: function () {
63                    return this.totalMip + this.upfrontMip;
64                },
65                enumerable: false,
66                configurable: true
67            });
68            return PaymentDetails;
69        }());
70        var Payment = /** @class */ (function () {
71            function Payment() {
72                this.mip = 0;
73                this.pmi = 0;
74            }
75            Object.defineProperty(Payment.prototype, "basePayment", {
76                get: function () {
77                    return this.principalInterest + this.mip + this.pmi;
78                },
79                enumerable: false,
80                configurable: true
81            });
82            Object.defineProperty(Payment.prototype, "totalPayment", {
83                get: function () {
84                    return this.principalInterest + this.insurance + this.hoa + this.tax + this.mip + this.pmi;
85                },
86                enumerable: false,
87                configurable: true
88            });
89            return Payment;
90        }());
91        var AmortizationSchedule = /** @class */ (function () {
92            function AmortizationSchedule() {
93            }
94            return AmortizationSchedule;
95        }());
96        var PaymentInput = /** @class */ (function () {
97            function PaymentInput() {
98                this.paymentExtraAmount = 0;
99                this.paymentFrequency = PaymentFrequency.Monthly;
100                this.oneTimeExtraAmount = 0;
101            }
102            Object.defineProperty(PaymentInput.prototype, "numPayments", {
103                get: function () {
104                    return this.years * this.paymentsPerYear;
105                },
106                enumerable: false,
107                configurable: true
108            });
109            Object.defineProperty(PaymentInput.prototype, "paymentRate", {
110                get: function () {
111                    return this.rate / 100 / this.interestPeriodsPerYear;
112                },
113                enumerable: false,
114                configurable: true
115            });
116            Object.defineProperty(PaymentInput.prototype, "paymentInsurance", {
117                get: function () {
118                    return this.insurance / this.paymentsPerYear;
119                },
120                enumerable: false,
121                configurable: true
122            });
123            Object.defineProperty(PaymentInput.prototype, "paymentTax", {
124                get: function () {
125                    return this.tax / this.paymentsPerYear;
126                },
127                enumerable: false,
128                configurable: true
129            });
130            Object.defineProperty(PaymentInput.prototype, "paymentHoa", {
131                get: function () {
132                    return this.hoa / this.paymentsPerYear;
133                },
134                enumerable: false,
135                configurable: true
136            });
137            Object.defineProperty(PaymentInput.prototype, "paymentsPerYear", {
138                get: function () {
139                    switch (this.paymentFrequency) {
140                        case PaymentFrequency.Monthly:
141                            return 12;
142                        case PaymentFrequency.BiWeekly:
143                        case PaymentFrequency.AcceleratedBiWeekly:
144                            return 26;
145                    }
146                    return 0;
147                },
148                enumerable: false,
149                configurable: true
150            });
151            Object.defineProperty(PaymentInput.prototype, "interestPeriodsPerYear", {
152                get: function () {
153                    switch (this.paymentFrequency) {
154                        case PaymentFrequency.Monthly:
155                            return 12;
156                        case PaymentFrequency.BiWeekly:
157                            return 26;
158                        case PaymentFrequency.AcceleratedBiWeekly:
159                            return 24;
160                    }
161                    return 0;
162                },
163                enumerable: false,
164                configurable: true
165            });
166            Object.defineProperty(PaymentInput.prototype, "startDate", {
167                get: function () {
168                    var startDate = new Date();
169                    startDate.setHours(0, 0, 0, 0);
170                    if (this.monthStart != null && this.yearStart != null) {
171                        if (this.monthStart < 1 || this.monthStart > 12) {
172                            this.monthStart = startDate.getMonth();
173                        }
174                        if (this.yearStart < 1970) {
175                            this.yearStart = startDate.getFullYear();
176                        }
177                        startDate = new Date(this.yearStart, this.monthStart - 1);
178                    }
179                    return startDate;
180                },
181                enumerable: false,
182                configurable: true
183            });
184            PaymentInput.prototype.getPaymentDate = function (paymentNumber) {
185                if (this.startDate == null) {
186                    return null;
187                }
188                var paymentDate = new Date(this.startDate.getTime());
189                switch (this.paymentFrequency) {
190                    case PaymentFrequency.Monthly:
191                        paymentDate.setMonth(paymentDate.getMonth() + paymentNumber);
192                        break;
193                    case PaymentFrequency.BiWeekly:
194                    case PaymentFrequency.AcceleratedBiWeekly:
195                        paymentDate.setDate(paymentDate.getDate() + (paymentNumber * 14));
196                        break;
197                }
198                return paymentDate;
199            };
200            return PaymentInput;
201        }());
202        var ExtraPaymentDetails = /** @class */ (function () {
203            function ExtraPaymentDetails() {
204            }
205            Object.defineProperty(ExtraPaymentDetails.prototype, "startDate", {
206                get: function () {
207                    var startDate = new Date();
208                    startDate.setHours(0, 0, 0, 0);
209                    if (this.monthStart != null && this.yearStart != null) {
210                        if (this.monthStart < 1 || this.monthStart > 12) {
211                            this.monthStart = startDate.getMonth();
212                        }
213                        if (this.yearStart < 1970) {
214                            this.yearStart = startDate.getFullYear();
215                        }
216                        startDate = new Date(this.yearStart, this.monthStart - 1);
217                    }
218                    return startDate;
219                },
220                enumerable: false,
221                configurable: true
222            });
223            return ExtraPaymentDetails;
224        }());
225        calculators.ExtraPaymentDetails = ExtraPaymentDetails;
226        var ExtraPaymentFrequency;
227        (function (ExtraPaymentFrequency) {
228            ExtraPaymentFrequency[ExtraPaymentFrequency["OneTime"] = 0] = "OneTime";
229            ExtraPaymentFrequency[ExtraPaymentFrequency["WithPayment"] = 1] = "WithPayment";
230            ExtraPaymentFrequency[ExtraPaymentFrequency["Quarterly"] = 2] = "Quarterly";
231            ExtraPaymentFrequency[ExtraPaymentFrequency["Annually"] = 3] = "Annually";
232        })(ExtraPaymentFrequency = calculators.ExtraPaymentFrequency || (calculators.ExtraPaymentFrequency = {}));
233        var FhaAdjustment = /** @class */ (function () {
234            function FhaAdjustment() {
235            }
236            return FhaAdjustment;
237        }());
238        calculators.FhaAdjustment = FhaAdjustment;
239        var FhaMipRate = /** @class */ (function () {
240            function FhaMipRate() {
241            }
242            return FhaMipRate;
243        }());
244        calculators.FhaMipRate = FhaMipRate;
245        var FhaMipDuration = /** @class */ (function () {
246            function FhaMipDuration() {
247            }
248            return FhaMipDuration;
249        }());
250        calculators.FhaMipDuration = FhaMipDuration;
251        var FhaUpmipRate = /** @class */ (function () {
252            function FhaUpmipRate() {
253            }
254            return FhaUpmipRate;
255        }());
256        calculators.FhaUpmipRate = FhaUpmipRate;
257        var PmiAdjustment = /** @class */ (function () {
258            function PmiAdjustment() {
259            }
260            return PmiAdjustment;
261        }());
262        calculators.PmiAdjustment = PmiAdjustment;
263        var PmiRate = /** @class */ (function () {
264            function PmiRate() {
265            }
266            return PmiRate;
267        }());
268        calculators.PmiRate = PmiRate;
269        var AmortizationSettings = /** @class */ (function () {
270            function AmortizationSettings() {
271            }
272            return AmortizationSettings;
273        }());
274        var CompareSettings = /** @class */ (function () {
275            function CompareSettings() {
276            }
277            return CompareSettings;
278        }());
279        var EarlyPayoffSettings = /** @class */ (function () {
280            function EarlyPayoffSettings() {
281            }
282            return EarlyPayoffSettings;
283        }());
284        var RateTrackerSummarySettings = /** @class */ (function () {
285            function RateTrackerSummarySettings() {
286            }
287            return RateTrackerSummarySettings;
288        }());
289        function calcSimplePayment(input) {
290            var monthsPerYear = 12;
291            var monthlyPaymentRate = input.rate / 100 / monthsPerYear;
292            var monthlyNumPayments = input.years * monthsPerYear;
293            var monthlyPaymentAmount = monthlyPaymentRate === 0 ? input.amount / monthlyNumPayments :
294                input.amount * monthlyPaymentRate * (Math.pow(1 + monthlyPaymentRate, monthlyNumPayments)) / (Math.pow(1 + monthlyPaymentRate, monthlyNumPayments) - 1);
295            var total = monthlyPaymentAmount * monthlyNumPayments;
296            var startDate = new Date();
297            startDate.setHours(0, 0, 0, 0);
298            if (input.monthStart != null && input.yearStart != null) {
299                startDate = new Date(input.yearStart, input.monthStart - 1);
300            }
301            var payoffDate = input.getPaymentDate(input.numPayments);
302            //new Date(startDate.getFullYear(), startDate.getMonth());
303            //payoffDate.setMonth(payoffDate.getMonth() + input.numPayments);
304            var paymentInfo = new PaymentDetails();
305            paymentInfo.interest = total - input.amount;
306            paymentInfo.principal = input.amount;
307            paymentInfo.monthlyPayment = monthlyPaymentAmount;
308            paymentInfo.startDate = startDate;
309            paymentInfo.payoffDate = payoffDate;
310            paymentInfo.paymentExtraAmount = input.paymentExtraAmount;
311            paymentInfo.paymentFrequency = input.paymentFrequency;
312            paymentInfo.oneTimeExtraAmount = input.oneTimeExtraAmount;
313            paymentInfo.extraPayments = input.extraPayments;
314            return paymentInfo;
315        }
316        function numberWithCommas(x, decimals) {
317            if (decimals === void 0) { decimals = 0; }
318            return x.toFixed(decimals).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
319        }
320        calculators.numberWithCommas = numberWithCommas;
321        function isNumeric(evt) {
322            var charCode = (evt.which) ? evt.which : evt.keyCode;
323            if (charCode != 46 && charCode > 31 && (charCode < 48 || charCode > 57)) {
324                return false;
325            }
326            else {
327                // If the number field already has . then don't allow to enter . again.
328                if (evt.target.value.search(/\./) > -1 && charCode === 46) {
329                    return false;
330                }
331                return true;
332            }
333        }
334        function isInteger(evt) {
335            var charCode = (evt.which) ? evt.which : evt.keyCode;
336            if (charCode > 31 && (charCode < 48 || charCode > 57)) {
337                return false;
338            }
339        }
340        function getFloat(input) {
341            if (input != null && input.length > 0) {
342                return parseFloat(input.replace(/,/g, ''));
343            }
344            return 0;
345        }
346        function getInt(input) {
347            if (input != null && input.length > 0) {
348                return parseInt(input.replace(/,/g, ''));
349            }
350            return 0;
351        }
352        function getMipPayments(fhaAdjustment, loanAmount, numYears, paymentFrequency) {
353            if (paymentFrequency === void 0) { paymentFrequency = PaymentFrequency.Monthly; }
354            var payments = [];
355            if (!fhaAdjustment || !fhaAdjustment.mipRate || !fhaAdjustment.mipRate.rate) {
356                return payments;
357            }
358            var yearlyPayments = 12.0;
359            if (paymentFrequency == PaymentFrequency.BiWeekly || paymentFrequency == PaymentFrequency.AcceleratedBiWeekly) {
360                yearlyPayments = 24.0;
361            }
362            var yearlyMip = loanAmount * fhaAdjustment.mipRate.rate;
363            var paymentMip = yearlyMip / yearlyPayments;
364            var mipPaymentDurationYears = numYears;
365            if (fhaAdjustment.mipDuration) {
366                if (fhaAdjustment.mipDuration.cancelYears) {
367                    mipPaymentDurationYears = fhaAdjustment.mipDuration.cancelYears;
368                }
369            }
370            var numPayments = mipPaymentDurationYears * yearlyPayments;
371            for (var i = 0; i < numPayments; i++) {
372                payments.push(paymentMip);
373            }
374            return payments;
375        }
376        function getPmiPayment(pmiAdjustment, loanAmount, paymentFrequency) {
377            if (paymentFrequency === void 0) { paymentFrequency = PaymentFrequency.Monthly; }
378            var yearlyPayments = 12.0;
379            if (paymentFrequency == PaymentFrequency.BiWeekly || paymentFrequency == PaymentFrequency.AcceleratedBiWeekly) {
380                yearlyPayments = 24.0;
381            }
382            return loanAmount * pmiAdjustment.pmiRate.rate / yearlyPayments;
383        }
384        function setupSimpleRateCalc(selector) {
385            var $calc = $(selector);
386            if ($calc.length === 0) {
387                return;
388            }
389            var $amt = $calc.find('.rate-calc-amount');
390            var $rate = $calc.find('.rate-calc-rate');
391            var $years = $calc.find('.rate-calc-years');
392            var fifteenDefaultRate = $rate.data('default-fifteen');
393            var thirtyDefaultRate = $rate.data('default-thirty');
394            var $resultInterest = $calc.find('.result.result-interest');
395            var $resultTotal = $calc.find('.result.result-total');
396            var $resultMonthly = $calc.find('.result.result-monthly');
397            var displayResult = function (calcResults) {
398                $resultInterest.html('$' + numberWithCommas(calcResults.interest));
399                $resultTotal.html('$' + numberWithCommas(calcResults.total));
400                $resultMonthly.html('$' + numberWithCommas(calcResults.monthlyPayment));
401                $resultInterest.addClass('updated');
402                $resultTotal.addClass('updated');
403                $resultMonthly.addClass('updated');
404                setTimeout(function () {
405                    $resultInterest.removeClass('updated');
406                    $resultTotal.removeClass('updated');
407                    $resultMonthly.removeClass('updated');
408                }, 1000);
409            };
410            var cleanVals = function () {
411                var amt = parseInt($amt.val().replace(/,/g, ''));
412                $amt.val(numberWithCommas(amt));
413            };
414            var doCalc = function () {
415                cleanVals();
416                var input = new PaymentInput();
417                input.amount = parseInt($amt.val().replace(/,/g, ''));
418                input.homeValue = 0;
419                input.rate = parseFloat($rate.val());
420                input.years = parseInt($years.val());
421                displayResult(calcSimplePayment(input));
422            };
423            var changeYears = function () {
424                if ($years.val() == "15") {
425                    $rate.val(fifteenDefaultRate);
426                }
427                else {
428                    $rate.val(thirtyDefaultRate);
429                }
430                doCalc();
431            };
432            $amt.on('change', doCalc);
433            $amt.on('keypress', isNumeric);
434            $rate.on('change', doCalc);
435            $rate.on('keypress', isNumeric);
436            $years.on('change', changeYears);
437            doCalc();
438        }
439        calculators.setupSimpleRateCalc = setupSimpleRateCalc;
440        function getAmortizationSchedule(input) {
441            var paymentInfo = calcSimplePayment(input);
442            var payments = Array();
443            var paymentPrincipal = 0;
444            var paymentInterest = 0;
445            var totalPrincipal = 0;
446            var totalMip = 0;
447            var totalPmi = 0;
448            var balance = input.amount;
449            var totalInterest = 0;
450            var payment = 0;
451            var extraPayments = getExtraPayments(input);
452            var startDate = new Date();
453            startDate.setHours(0, 0, 0, 0);
454            var mipPayments = input.fhaAdjustment ? getMipPayments(input.fhaAdjustment, input.amount, input.years, input.paymentFrequency) : [];
455            var upMip = input.fhaAdjustment && input.fhaAdjustment.upmipRate ? input.amount * input.fhaAdjustment.upmipRate.rate : 0;
456            var numMipPayments = mipPayments.length;
457            var pmiPayments = [];
458            if (input.monthStart != null && input.yearStart != null) {
459                startDate = new Date(input.yearStart, input.monthStart - 1);
460            }
461            var pmiPayment = 0;
462            if (input.includePmi && input.pmiAdjustment && input.pmiAdjustment.pmiRate && input.pmiAdjustment.pmiRate.rate) {
463                pmiPayment = getPmiPayment(input.pmiAdjustment, input.amount, input.paymentFrequency);
464            }
465            for (var i = 1; i <= input.numPayments; i++) {
466                if (balance <= 0) {
467                    break;
468                }
469                paymentInterest = balance * input.paymentRate;
470                payment = paymentInfo.payment;
471                //let extraAmount = input.paymentExtraAmount;
472                var extraAmount = extraPayments[i] || 0;
473                if (balance > payment) {
474                    paymentPrincipal = paymentInfo.payment + extraAmount - paymentInterest;
475                }
476                else {
477                    paymentPrincipal = balance;
478                    payment = paymentInterest + paymentPrincipal;
479                }
480                var paymentDate = input.getPaymentDate(i);
481                //new Date(startDate.getFullYear(), startDate.getMonth());
482                //paymentDate.setMonth(paymentDate.getMonth() + i);
483                //if (i == 1 && input.oneTimeExtraAmount > 0 && balance > paymentPrincipal) {
484                //    paymentPrincipal += input.oneTimeExtraAmount;
485                //    extraAmount += input.oneTimeExtraAmount;
486                //}
487                balance -= paymentPrincipal; // + input.monthlyExtraPayment;
488                totalInterest += paymentInterest;
489                totalPrincipal += paymentPrincipal;
490                var newLtv = balance / input.amount;
491                if (balance <= 0) {
492                    balance = 0;
493                    var monthlyPayment = paymentInfo.monthlyPayment;
494                    paymentInfo = new PaymentDetails();
495                    paymentInfo.interest = totalInterest;
496                    paymentInfo.principal = totalPrincipal;
497                    paymentInfo.monthlyPayment = monthlyPayment;
498                    paymentInfo.startDate = startDate;
499                    paymentInfo.payoffDate = paymentDate;
500                    paymentInfo.paymentExtraAmount = input.paymentExtraAmount;
501                    paymentInfo.paymentFrequency = input.paymentFrequency;
502                    paymentInfo.oneTimeExtraAmount = input.oneTimeExtraAmount;
503                    paymentInfo.extraPayments = input.extraPayments;
504                }
505                var crntPayment = new Payment();
506                crntPayment.paymentNumber = i;
507                crntPayment.principal = paymentPrincipal;
508                crntPayment.interest = paymentInterest;
509                crntPayment.insurance = input.paymentInsurance;
510                crntPayment.tax = input.paymentTax;
511                crntPayment.hoa = input.paymentHoa;
512                crntPayment.principalInterest = payment;
513                crntPayment.balance = balance;
514                crntPayment.paymentDate = paymentDate;
515                crntPayment.totalInterest = totalInterest;
516                crntPayment.totalPrincipal = totalPrincipal;
517                crntPayment.extraAmount = extraAmount;
518                if (pmiPayment > 0 && newLtv > .80) {
519                    pmiPayments.push(pmiPayment);
520                    crntPayment.pmi = pmiPayment;
521                    totalPmi += pmiPayment;
522                }
523                if (numMipPayments > i) {
524                    crntPayment.mip = mipPayments[i];
525                    totalMip += mipPayments[i];
526                }
527                crntPayment.totalMip = totalMip;
528                crntPayment.totalPmi = totalPmi;
529                payments.push(crntPayment);
530                if (balance <= 0) {
531                    break;
532                }
533            }
534            if (numMipPayments > 0) {
535                paymentInfo.monthlyMip = mipPayments[0];
536                paymentInfo.totalMip = mipPayments.reduce(function (sum, current) { return sum + current; }, 0);
537            }
538            if (pmiPayments.length > 0) {
539                paymentInfo.monthlyPmi = pmiPayment;
540                paymentInfo.totalPmi = pmiPayments.reduce(function (sum, current) { return sum + current; }, 0);
541            }
542            paymentInfo.upfrontMip = upMip;
543            return {
544                paymentInfo: paymentInfo,
545                payments: payments
546            };
547        }
548        calculators.getAmortizationSchedule = getAmortizationSchedule;
549        function getExtraPayments(input) {
550            var payments = [];
551            if (input.extraPayments == null || input.extraPayments.length == 0) {
552                return payments;
553            }
554            var yearlyPayments = 12.0;
555            if (input.paymentFrequency == PaymentFrequency.BiWeekly || input.paymentFrequency == PaymentFrequency.AcceleratedBiWeekly) {
556                yearlyPayments = 24.0;
557            }
558            input.extraPayments.forEach(function (ep, i, arr) {
559                var startPayment = 1;
560                if (input.startDate != ep.startDate) {
561                    startPayment = getDayDifference(ep.startDate, input.startDate) / (365.25 / yearlyPayments);
562                    if (startPayment < 1) {
563                        startPayment = 1;
564                    }
565                }
566                var totalPayments = input.years * yearlyPayments;
567                var interval = 0;
568                switch (ep.frequency) {
569                    case ExtraPaymentFrequency.Annually:
570                        interval = yearlyPayments;
571                        break;
572                    case ExtraPaymentFrequency.Quarterly:
573                        interval = yearlyPayments / 3;
574                        break;
575                    case ExtraPaymentFrequency.WithPayment:
576                        interval = 1;
577                        break;
578                    case ExtraPaymentFrequency.OneTime:
579                        payments[startPayment] = (payments[startPayment] || 0) + ep.amount;
580                }
581                if (interval > 0) {
582                    for (var i = startPayment; i <= totalPayments; i += interval) {
583                        payments[i] = (payments[i] || 0) + ep.amount;
584                    }
585                }
586            });
587            return payments;
588        }
589        calculators.getExtraPayments = getExtraPayments;
590        function getDayDifference(d1, d2) {
591            var diffInTime = d1.getTime() - d2.getTime();
592            return diffInTime / (1000 * 3600 * 24);
593        }
594        calculators.getDayDifference = getDayDifference;
595        function setupAmortizationRateCalc(selector, settings) {
596            var $calc = $(selector);
597            $calc.find('[data-toggle="popover"]').popover({
598                trigger: 'focus',
599                placement: 'top'
600            });
601            var $hp = $calc.find('.rate-calc-price');
602            var $dpAmt = $calc.find('.rate-calc-dp-amt');
603            var $dpPct = $calc.find('.rate-calc-dp-pct');
604            var $productType = $calc.find('.rate-calc-product');
605            var $amt = $calc.find('.rate-calc-amount');
606            var $rate = $calc.find('.rate-calc-rate');
607            var $years = $calc.find('.rate-calc-years');
608            var $insurance = $calc.find('.rate-calc-ins');
609            var $taxAmt = $calc.find('.rate-calc-tax-amt');
610            var $hoa = $calc.find('.rate-calc-hoa');
611            var $startMonth = $calc.find('.rate-calc-month');
612            var $startYear = $calc.find('.rate-calc-year');
613            var $includePmi = $calc.find('.rate-calc-pmi');
614            var $pmiRate = $calc.find('.rate-calc-pmirate');
615            var $mipRate = $calc.find('.rate-calc-miprate');
616            var $resultPayoffDate = $calc.find('.result.result-payoff-date');
617            var $resultInterest = $calc.find('.result.result-interest');
618            var $resultPrincipal = $calc.find('.result.result-principal');
619            var $resultTotal = $calc.find('.result.result-total');
620            var $resultMonthly = $calc.find('.result.result-monthly-total');
621            var $resultMonthlyPI = $calc.find('.result.result-monthly-pi');
622            var $resultMonthlyTax = $calc.find('.result.result-monthly-tax');
623            var $resultMonthlyIns = $calc.find('.result.result-monthly-ins');
624            var $resultMonthlyHoa = $calc.find('.result.result-monthly-hoa');
625            var $chartMonthlyBreakdown = $calc.find('.month-breakdown-chart');
626            var $chartAmortization = $calc.find('.amortization-chart');
627            var $resultAmortizationTable = $calc.find('table.result.result-amortization');
628            var monthlyRowTemplate = _.template(settings.monthlyRowTemplate ? settings.monthlyRowTemplate : "");
629            var yearlyRowTemplate = _.template(settings.yearlyRowTemplate ? settings.yearlyRowTemplate : "");
630            var displayResult = function (amortizationresults) {
631                $resultPayoffDate.html(mnd.utilities.formatDate(amortizationresults.paymentInfo.payoffDate, 'MMM YYYY'));
632                $resultInterest.html('$' + numberWithCommas(amortizationresults.paymentInfo.interest));
633                $resultTotal.html('$' + numberWithCommas(amortizationresults.paymentInfo.total));
634                $resultPrincipal.html('$' + numberWithCommas(amortizationresults.paymentInfo.principal));
635                var paymentResult = amortizationresults.payments[0];
636                $resultMonthly.html('$' + numberWithCommas(paymentResult.totalPayment, 2));
637                $resultMonthlyPI.html('$' + numberWithCommas(paymentResult.principalInterest, 2));
638                $resultMonthlyTax.html('$' + numberWithCommas(paymentResult.tax, 2));
639                $resultMonthlyIns.html('$' + numberWithCommas(paymentResult.insurance, 2));
640                $resultMonthlyHoa.html('$' + numberWithCommas(paymentResult.hoa, 2));
641                $resultTotal.addClass('updated');
642                $resultMonthly.addClass('updated');
643                setTimeout(function () {
644                    $resultTotal.removeClass('updated');
645                    $resultMonthly.removeClass('updated');
646                }, 1000);
647                var tableBody = $resultAmortizationTable.find('tbody');
648                tableBody.empty();
649                if (settings.showTable) {
650                    _.each(amortizationresults.payments, function (payment, i) {
651                        if (settings.showMonthly) {
652                            tableBody.append(monthlyRowTemplate(payment));
653                        }
654                        if (settings.showYearly && (i + 1) % 12 == 0) {
655                            tableBody.append(yearlyRowTemplate(payment));
656                        }
657                    });
658                }
659                var animations = settings.disableAnimation === true ? false : true;
660                var pieChart = null;
661                if (settings.showPieChart && $chartMonthlyBreakdown.length > 0) {
662                    var chartData = [
663                        {
664                            name: 'Principal',
665                            y: paymentResult.principal,
666                        }, {
667                            name: 'Interest',
668                            y: paymentResult.interest,
669                        }, {
670                            name: 'Taxes',
671                            y: paymentResult.tax
672                        }, {
673                            name: 'HOA',
674                            y: paymentResult.hoa
675                        }, {
676                            name: 'Insurance',
677                            y: paymentResult.insurance
678                        }, {
679                            name: 'PMI',
680                            y: amortizationresults.paymentInfo.monthlyPmi,
681                            visible: amortizationresults.paymentInfo.monthlyPmi > 0
682                        }, {
683                            name: 'MIP',
684                            y: amortizationresults.paymentInfo.monthlyMip,
685                            visible: amortizationresults.paymentInfo.monthlyMip > 0
686                        }
687                    ];
688                    if (pieChart != null) {
689                        pieChart.series[0].setData(chartData, true, false);
690                    }
691                    else {
692                        pieChart = Highcharts.chart($chartMonthlyBreakdown.prop('id'), {
693                            chart: {
694                                plotBackgroundColor: null,
695                                plotBorderWidth: null,
696                                plotShadow: false,
697                                type: 'pie',
698                                animation: animations,
699                                margin: [10, 0, 10, 0],
700                                spacing: [0, 0, 0, 0],
701                                styledMode: true
702                            },
703                            title: {
704                                text: null
705                            },
706                            tooltip: {
707                                animation: animations,
708                                pointFormat: '<b>${point.y:.2f}</b>'
709                            },
710                            credits: {
711                                enabled: false
712                            },
713                            series: [{
714                                    name: 'Breakdown',
715                                    data: chartData
716                                }],
717                            plotOptions: {
718                                series: {
719                                    animation: animations
720                                },
721                                pie: {
722                                    size: '80%',
723                                    //slicedOffset: 0,
724                                    //startAngle: -30,
725                                    dataLabels: {
726                                        enabled: true,
727                                        //distance: 5,
728                                        connectorWidth: 0,
729                                        //crop: false,
730                                        //format: ,
731                                        formatter: function () {
732                                            var marginTop = 0;
733                                            var marginLeft = 0;
734                                            if (this.point.name == "Interest") {
735                                              marginTop = -25;
736                                            }
737                                            //if (this.point.name == "HOA") {
738                                            //    marginLeft = -25;
739                                            //}
740                                            //if (this.point.name == "Principal") {
741                                            //  marginLeft = 20;
742                                            //}
743                                            //if (this.point.name == "Taxes") {
744                                            //    marginLeft = 20;
745                                            //    marginTop = 40;
746                                            //}
747                                            //if (this.point.name == "Insurance") {                                                
748                                            //    marginLeft = 50;
749                                            //}
750                                            return "<div class=\"\" style=\"font-weight: normal;text-align:right;margin-top: ".concat(marginTop, "px;margin-left: ").concat(marginLeft, "px;\">\n                                <i class=\"fa fa-circle highcharts-color-").concat(this.point.x, "\"></i>&nbsp;&nbsp;<span style=\"color:#9A9999;font-size:12px;\">").concat(this.point.name, "</span>\n                                <div style=\"color:#000;font-size:15px;\">$").concat(Highcharts.numberFormat(this.y, 0), "</div>\n                              </div>");
751                                        },
752                                        useHTML: true
753                                        //style: {
754                                        //  fontWeight: 'bold',
755                                        //  color: 'white'
756                                        //}
757                                    },
758                                }
759                            }
760                        });
761                    }
762                }
763                var amortizationChart = null;
764                if (settings.showChart && $chartAmortization.length > 0) {
765                    var principalData_1 = [];
766                    var interestData_1 = [];
767                    var balanceData_1 = [];
768                    _.each(amortizationresults.payments, function (payment) {
769                        principalData_1.push([payment.paymentDate.getTime(), payment.totalPrincipal]);
770                        interestData_1.push([payment.paymentDate.getTime(), payment.totalInterest]);
771                        balanceData_1.push([payment.paymentDate.getTime(), payment.balance]);
772                    });
773                    if (amortizationChart != null) {
774                        amortizationChart.series[0].setData(principalData_1, false, false);
775                        amortizationChart.series[1].setData(interestData_1, false, false);
776                        amortizationChart.series[2].setData(balanceData_1, true, false);
777                    }
778                    else {
779                        amortizationChart = Highcharts.chart($chartAmortization.prop('id'), {
780                            chart: {
781                                animation: animations,
782                                styledMode: true
783                            },
784                            title: {
785                                text: null
786                            },
787                            xAxis: {
788                                type: 'datetime'
789                            },
790                            credits: {
791                                enabled: false
792                            },
793                            tooltip: {
794                                xDateFormat: '%B %Y',
795                                shared: true,
796                                valuePrefix: '$',
797                                animation: animations,
798                                valueDecimals: 2
799                            },
800                            legend: {
801                                enabled: true
802                            },
803                            series: [{
804                                    name: 'Total Principal',
805                                    data: principalData_1,
806                                    type: 'column'
807                                }, {
808                                    name: 'Total Interest',
809                                    data: interestData_1,
810                                    type: 'column'
811                                }, {
812                                    name: 'Balance',
813                                    data: balanceData_1
814                                }],
815                            plotOptions: {
816                                column: {
817                                    stacking: 'normal'
818                                },
819                                series: {
820                                    animation: animations
821                                }
822                            }
823                        });
824                    }
825                }
826            };
827            var cleanVals = function () {
828                $hp.val(numberWithCommas(getFloat($hp.val())));
829                $dpAmt.val(numberWithCommas(getFloat($dpAmt.val())));
830                $amt.val(numberWithCommas(getFloat($amt.val())));
831                $insurance.val(numberWithCommas(getFloat($insurance.val())));
832                $hoa.val(numberWithCommas(getFloat($hoa.val())));
833                $taxAmt.val(numberWithCommas(getFloat($taxAmt.val())));
834            };
835            var doCalc = function () {
836                var input = new PaymentInput();
837                input.amount = getFloat($amt.val());
838                input.homeValue = getFloat($hp.val());
839                input.rate = getFloat($rate.val());
840                input.years = parseInt($years.val());
841                input.insurance = getFloat($insurance.val());
842                input.tax = getFloat($taxAmt.val());
843                input.hoa = getFloat($hoa.val());
844                input.monthStart = parseInt($startMonth.val());
845                input.yearStart = parseInt($startYear.val());
846                input.productType = parseInt($productType.val());
847                input.includePmi = parseInt($includePmi.val()) == 1;
848                var mipRate = getFloat($mipRate.val());
849                if (mipRate) {
850                    input.fhaAdjustment = new FhaAdjustment();
851                    input.fhaAdjustment.mipRate = new FhaMipRate;
852                    input.fhaAdjustment.mipRate.rate = mipRate;
853                }
854                if (input.includePmi) {
855                    var pmiRate = getFloat($pmiRate.val());
856                    if (pmiRate) {
857                        input.pmiAdjustment = new PmiAdjustment();
858                        input.pmiAdjustment.pmiRate = new PmiRate();
859                        input.pmiAdjustment.pmiRate.rate = pmiRate;
860                    }
861                }
862                //let input = new PaymentInput(getFloat($amt.val()),
863                //  getFloat($hp.val()),
864                //  getFloat($rate.val()),
865                //  parseInt($years.val()),
866                //  getFloat($insurance.val()),
867                //  getFloat($taxAmt.val()),
868                //  getFloat($hoa.val()),
869                //  parseInt($startMonth.val()),
870                //  parseInt($startYear.val()));
871                cleanVals();
872                displayResult(getAmortizationSchedule(input));
873            };
874            $hp.on('change', function () {
875                var hp = getFloat($hp.val());
876                var dpPct = getFloat($dpPct.val());
877                var dpAmt = hp * dpPct / 100;
878                $dpAmt.val(numberWithCommas(dpAmt));
879                $amt.val(numberWithCommas(hp - dpAmt));
880                doCalc();
881            });
882            $hp.on('keypress', isNumeric);
883            $dpAmt.on('change', function () {
884                var hp = getFloat($hp.val());
885                var dpAmt = getFloat($dpAmt.val());
886                var dpPct = dpAmt / hp * 100;
887                $dpPct.val(dpPct.toFixed(2));
888                $amt.val(numberWithCommas(hp - dpAmt));
889                doCalc();
890            });
891            $dpAmt.on('keypress', isNumeric);
892            $dpPct.on('change', function () {
893                var hp = getFloat($hp.val());
894                var dpPct = getFloat($dpPct.val());
895                var dpAmt = hp * dpPct / 100;
896                $dpAmt.val(numberWithCommas(dpAmt));
897                $amt.val(numberWithCommas(hp - dpAmt));
898                doCalc();
899            });
900            $dpPct.on('keypress', isNumeric);
901            $amt.on('change', function () {
902                var hp = getFloat($hp.val());
903                var amt = getFloat($amt.val());
904                var dpAmt = (hp - amt);
905                var dpPct = dpAmt / hp * 100;
906                $dpPct.val(dpPct.toFixed(2));
907                $dpAmt.val(numberWithCommas(dpAmt));
908                doCalc();
909            });
910            $amt.on('keypress', isNumeric);
911            $rate.on('change', doCalc);
912            $rate.on('keypress', isNumeric);
913            $years.on('change', doCalc);
914            $insurance.on('change', doCalc);
915            $insurance.on('keypress', isNumeric);
916            $taxAmt.on('change', doCalc);
917            $taxAmt.on('keypress', isNumeric);
918            $hoa.on('change', doCalc);
919            $hoa.on('keypress', isNumeric);
920            $startMonth.on('change', doCalc);
921            $startYear.on('change', doCalc);
922            doCalc();
923        }
924        calculators.setupAmortizationRateCalc = setupAmortizationRateCalc;
925        function setupCompareRateCalc(selector, settings) {
926            var $calc = $(selector);
927            $calc.find('[data-toggle="popover"]').popover({
928                trigger: 'focus',
929                placement: 'top'
930            });
931            var $amt = $calc.find('.rate-calc-amount');
932            var $rate1 = $calc.find('.rate-calc-rate-1');
933            var $years1 = $calc.find('.rate-calc-years-1');
934            var $rate2 = $calc.find('.rate-calc-rate-2');
935            var $years2 = $calc.find('.rate-calc-years-2');
936            var $resultMonthlyPI1 = $calc.find('.result.result-monthly-pi-1');
937            var $resultInterest1 = $calc.find('.result.result-interest-1');
938            var $resultPrincipal1 = $calc.find('.result.result-principal-1');
939            var $resultTotal1 = $calc.find('.result.result-total-1');
940            var $resultMonthlyPI2 = $calc.find('.result.result-monthly-pi-2');
941            var $resultInterest2 = $calc.find('.result.result-interest-2');
942            var $resultPrincipal2 = $calc.find('.result.result-principal-2');
943            var $resultTotal2 = $calc.find('.result.result-total-2');
944            var $resultMonthlyDifference1 = $calc.find('.result.result-difference-monthly-1');
945            var $resultMonthlyDifference2 = $calc.find('.result.result-difference-monthly-2');
946            var $resultTotalDifference1 = $calc.find('.result.result-difference-total-1');
947            var $resultTotalDifference2 = $calc.find('.result.result-difference-total-2');
948            var $chartCompare = $calc.find('.compare-chart');
949            var displayResult = function (calc1Results, calc2Results) {
950                $resultMonthlyPI1.html('$' + numberWithCommas(calc1Results.paymentInfo.monthlyPayment));
951                $resultInterest1.html('$' + numberWithCommas(calc1Results.paymentInfo.interest));
952                $resultPrincipal1.html('$' + numberWithCommas(calc1Results.paymentInfo.principal));
953                $resultTotal1.html('$' + numberWithCommas(calc1Results.paymentInfo.total));
954                $resultMonthlyPI2.html('$' + numberWithCommas(calc2Results.paymentInfo.monthlyPayment));
955                $resultInterest2.html('$' + numberWithCommas(calc2Results.paymentInfo.interest));
956                $resultPrincipal2.html('$' + numberWithCommas(calc2Results.paymentInfo.principal));
957                $resultTotal2.html('$' + numberWithCommas(calc2Results.paymentInfo.total));
958                var monthlyDiff = calc2Results.paymentInfo.monthlyPayment - calc1Results.paymentInfo.monthlyPayment;
959                var totalDiff = calc2Results.paymentInfo.total - calc1Results.paymentInfo.total;
960                if (monthlyDiff > 0) {
961                    $resultMonthlyDifference1.html('');
962                    $resultMonthlyDifference2.html('+$' + numberWithCommas(Math.abs(monthlyDiff))).addClass('updated');
963                }
964                else {
965                    $resultMonthlyDifference2.html('');
966                    $resultMonthlyDifference1.html('+$' + numberWithCommas(Math.abs(monthlyDiff))).addClass('updated');
967                }
968                if (totalDiff > 0) {
969                    $resultTotalDifference1.html('');
970                    $resultTotalDifference2.html('+$' + numberWithCommas(Math.abs(totalDiff))).addClass('updated');
971                }
972                else {
973                    $resultTotalDifference2.html('');
974                    $resultTotalDifference1.html('+$' + numberWithCommas(Math.abs(totalDiff))).addClass('updated');
975                }
976                setTimeout(function () {
977                    $resultMonthlyDifference1.removeClass('updated');
978                    $resultMonthlyDifference2.removeClass('updated');
979                    $resultTotalDifference1.removeClass('updated');
980                    $resultTotalDifference2.removeClass('updated');
981                }, 1000);
982                var animations = settings.disableAnimation === true ? false : true;
983                var compareChart = null;
984                if (settings.showChart && $chartCompare.length > 0) {
985                    var loan1Data_1 = [];
986                    //let loan1PrincipalData = [];
987                    //let loan1InterestData = [];
988                    var loan2Data_1 = [];
989                    //let loan2PrincipalData = [];
990                    //let loan2InterestData = [];
991                    _.each(calc1Results.payments, function (payment, i) {
992                        if (settings.showMonthly || (settings.showYearly && (i + 1) % 12 == 0)) {
993                            loan1Data_1.push([payment.paymentDate.getTime(), payment.totalPrincipal + payment.totalInterest]);
994                            //loan1PrincipalData.push([payment.paymentDate.getTime(), payment.totalPrincipal]);
995                            //loan1InterestData.push([payment.paymentDate.getTime(), payment.totalInterest]);
996                        }
997                    });
998                    _.each(calc2Results.payments, function (payment, i) {
999                        if (settings.showMonthly || (settings.showYearly && (i + 1) % 12 == 0)) {
1000                            loan2Data_1.push([payment.paymentDate.getTime(), payment.totalPrincipal + payment.totalInterest]);
1001                            //loan2PrincipalData.push([payment.paymentDate.getTime(), payment.totalPrincipal]);
1002                            //loan2InterestData.push([payment.paymentDate.getTime(), payment.totalInterest]);
1003                        }
1004                    });
1005                    if (compareChart != null) {
1006                        compareChart.series[0].setData(loan1Data_1, false, false);
1007                        //compareChart.series[0].setData(loan1PrincipalData, false, false);
1008                        //compareChart.series[1].setData(loan1InterestData, false, false);                        
1009                        compareChart.series[1].setData(loan2Data_1, true, false);
1010                        //compareChart.series[2].setData(loan2PrincipalData, false, false);
1011                        //compareChart.series[3].setData(loan2InterestData, true, false);  
1012                    }
1013                    else {
1014                        compareChart = Highcharts.chart($chartCompare.prop('id'), {
1015                            chart: {
1016                                animation: animations,
1017                                styledMode: true
1018                            },
1019                            title: {
1020                                text: null
1021                            },
1022                            xAxis: {
1023                                type: 'datetime'
1024                            },
1025                            yAxis: {
1026                                title: {
1027                                    text: 'Total Principal and Interest'
1028                                }
1029                            },
1030                            credits: {
1031                                enabled: false
1032                            },
1033                            tooltip: {
1034                                xDateFormat: '%B %Y',
1035                                shared: true,
1036                                valuePrefix: '$',
1037                                valueDecimals: 2,
1038                                animation: animations,
1039                                useHTML: !animations,
1040                                headerFormat: '<span style="font-size: 12px;font-weight: bold;">Total Principal and Interest</span><br /><span style="font-size: 10px">{point.key}</span><br/>'
1041                            },
1042                            legend: {
1043                                enabled: true
1044                            },
1045                            series: [{
1046                                    name: 'Loan 1',
1047                                    data: loan1Data_1,
1048                                    type: 'areaspline'
1049                                }, {
1050                                    name: 'Loan 2',
1051                                    data: loan2Data_1,
1052                                    type: 'areaspline'
1053                                }],
1054                            //series: [{
1055                            //    name: 'Loan 1 Principal',
1056                            //    data: loan1PrincipalData,
1057                            //    type: 'areaspline',
1058                            //    stack: 'loan1'
1059                            //}, {
1060                            //    name: 'Loan 1 Interest',
1061                            //    data: loan1InterestData,
1062                            //    type: 'areaspline',
1063                            //    stack: 'loan1'
1064                            //}, {
1065                            //    name: 'Loan 2 Principal',
1066                            //    data: loan2PrincipalData,
1067                            //    type: 'areaspline',
1068                            //    stack: 'loan2'
1069                            //}, {
1070                            //    name: 'Loan 2 Interest',
1071                            //    data: loan2InterestData,
1072                            //    type: 'areaspline',
1073                            //    stack: 'loan2'
1074                            //}],
1075                            plotOptions: {
1076                                areaspline: {
1077                                    //stacking: 'normal',
1078                                    fillOpacity: 0.5
1079                                },
1080                                series: {
1081                                    animation: animations
1082                                }
1083                            }
1084                        });
1085                    }
1086                    var pointIndex = (compareChart.series[0].points.length < compareChart.series[1].points.length
1087                        ? compareChart.series[0].points.length
1088                        : compareChart.series[1].points.length) - 1;
1089                    var points = [
1090                        compareChart.series[0].points[pointIndex], compareChart.series[1].points[pointIndex]
1091                    ];
1092                    //var pointIndex = (compareChart.series[0].points.length < compareChart.series[3].points.length
1093                    //    ? compareChart.series[0].points.length
1094                    //    : compareChart.series[3].points.length) - 1;                    
1095                    //var points = [
1096                    //    compareChart.series[0].points[pointIndex], compareChart.series[1].points[pointIndex],
1097                    //    compareChart.series[2].points[pointIndex], compareChart.series[3].points[pointIndex]
1098                    //];                    
1099                    compareChart.tooltip.refresh(points);
1100                }
1101            };
1102            var cleanVals = function () {
1103                $amt.val(numberWithCommas(getFloat($amt.val())));
1104            };
1105            var doCalc = function () {
1106                var calc1 = new PaymentInput();
1107                calc1.amount = getFloat($amt.val());
1108                calc1.homeValue = getFloat($amt.val());
1109                calc1.rate = getFloat($rate1.val());
1110                calc1.years = parseInt($years1.val());
1111                var calc2 = new PaymentInput();
1112                calc2.amount = getFloat($amt.val());
1113                calc2.homeValue = getFloat($amt.val());
1114                calc2.rate = getFloat($rate2.val());
1115                calc2.years = parseInt($years2.val());
1116                cleanVals();
1117                displayResult(getAmortizationSchedule(calc1), getAmortizationSchedule(calc2));
1118            };
1119            _.each([$amt, $rate1, $years1, $rate2, $years2], function (input) {
1120                input.on('change', doCalc);
1121                input.on('keypress', isNumeric);
1122            });
1123            doCalc();
1124        }
1125        calculators.setupCompareRateCalc = setupCompareRateCalc;
1126        function setupMultipleRateCalc(selector) {
1127            var $amt = $(selector);
1128            if ($amt.length === 0) {
1129                return;
1130            }
1131            var $targets = $($amt.data('calc-target'));
1132            if ($targets.length === 0) {
1133                return;
1134            }
1135            var cleanVals = function () {
1136                var amt = parseInt($amt.val().replace(/,/g, ''));
1137                if (isNaN(amt)) {
1138                    $amt.val('');
1139                    return;
1140                }
1141                $amt.val(numberWithCommas(amt));
1142            };
1143            var options = {
1144                decimalPlaces: 0,
1145                prefix: '$',
1146                suffix: ' / mo'
1147            };
1148            var doCalc = function () {
1149                cleanVals();
1150                var loanAmount = $amt.val().replace(/,/g, '');
1151                var maxAmount = $amt.data('max');
1152                if (maxAmount && loanAmount && Number(loanAmount) > Number(maxAmount)) {
1153                    loanAmount = maxAmount;
1154                    $amt.val(numberWithCommas(loanAmount));
1155                }
1156                $targets.each(function (i, option) {
1157                    var $opt = $(option);
1158                    if (isNaN(loanAmount) || loanAmount == 0) {
1159                        $opt.html('$ -- / mo');
1160                        return;
1161                    }
1162                    var input = new PaymentInput();
1163                    input.amount = loanAmount;
1164                    input.rate = parseFloat($opt.data('calc-rate'));
1165                    input.years = parseInt($opt.data('calc-years'));
1166                    var payment = calcSimplePayment(input);
1167                    var existing = parseInt($opt.data('calc-payment'));
1168                    if (isNaN(existing)) {
1169                        existing = 0;
1170                    }
1171                    $opt.data('calc-payment', payment.monthlyPayment);
1172                    var cu = new CountUp(option, existing, payment.monthlyPayment, 0, 0, options);
1173                    if (!cu.error) {
1174                        cu.start();
1175                    }
1176                    //else {
1177                    //  console.log(cu.error);
1178                    //}          
1179                });
1180                $('.track-rates').prop('href', '/rate-tracker/#/populate?la=' + loanAmount);
1181            };
1182            $amt.on('keyup', _.debounce(doCalc, 300));
1183            doCalc();
1184        }
1185        calculators.setupMultipleRateCalc = setupMultipleRateCalc;
1186        function setupExtraPaymentCalc(selector, settings) {
1187            var $calc = $(selector);
1188            $calc.find('[data-toggle="popover"]').popover({
1189                trigger: 'focus',
1190                placement: 'top'
1191            });
1192            var $amt = $calc.find('.rate-calc-amount');
1193            var $rate = $calc.find('.rate-calc-rate');
1194            var $years = $calc.find('.rate-calc-years');
1195            var $extraPayment = $calc.find('.rate-calc-extra-payment');
1196            var $desiredLengthYears = $calc.find('.rate-calc-desired-years');
1197            var $startMonth = $calc.find('.rate-calc-month');
1198            var $startYear = $calc.find('.rate-calc-year');
1199            //let $paymentFrequency = $calc.find('.rate-calc-payment-frequency');
1200            var $epType = $calc.find('.rate-calc-ep-type');
1201            var $epTypes = $calc.find('.rate-calc-ep-types');
1202            var $resultOrigPayoffDate = $calc.find('.result.result-payoff-date-orig');
1203            var $resultOrigInterest = $calc.find('.result.result-interest-orig');
1204            var $resultOrigMonthlyPI = $calc.find('.result.result-monthly-pi-orig');
1205            var $resultExtraPayment = $calc.find('.result.result-monthly-p-extra');
1206            var $resultNewMonthlyPI = $calc.find('.result.result-monthly-pi-new');
1207            var $resultNewPayoffDate = $calc.find('.result.result-payoff-date-new');
1208            var $resultNewInterest = $calc.find('.result.result-interest-new');
1209            var $resultInterestSaved = $calc.find('.result.result-interest-saved');
1210            var $resultTimeSaved = $calc.find('.result.result-payoff-date-saved');
1211            var $resultPaymentFrequency = $calc.find('.result.result-payment-frequency');
1212            var $resultEpType = $calc.find('.result.result-ep-type');
1213            var $chartCompareAmortization = $calc.find('.amortization-compare-chart');
1214            var displayResult = function (origResults, extraResults) {
1215                $resultOrigPayoffDate.html(mnd.utilities.formatDate(origResults.paymentInfo.payoffDate, 'MMM YYYY'));
1216                $resultOrigMonthlyPI.html('$' + numberWithCommas(origResults.paymentInfo.monthlyPayment));
1217                $resultOrigInterest.html('$' + numberWithCommas(origResults.paymentInfo.interest));
1218                $resultNewPayoffDate.html(mnd.utilities.formatDate(extraResults.paymentInfo.payoffDate, 'MMM YYYY'));
1219                if (extraResults.payments != null && extraResults.payments.length > 0) {
1220                    var firstPayment = extraResults.payments[0];
1221                    $resultExtraPayment.html('$' + numberWithCommas(firstPayment.extraAmount));
1222                    $resultNewMonthlyPI.html('$' + numberWithCommas(firstPayment.principalInterest + firstPayment.extraAmount)).addClass('updated');
1223                }
1224                else {
1225                    $resultExtraPayment.html('$0');
1226                    $resultNewMonthlyPI.html('$' + numberWithCommas(extraResults.paymentInfo.monthlyPayment + extraResults.paymentInfo.paymentExtraAmount)).addClass('updated');
1227                }
1228                //$resultNewMonthlyPI.html('$' + numberWithCommas(extraResults.paymentInfo.monthlyPayment + extraResults.paymentInfo.paymentExtraAmount)).addClass('updated');
1229                $resultNewInterest.html('$' + numberWithCommas(extraResults.paymentInfo.interest));
1230                $resultInterestSaved.html('$' + numberWithCommas(origResults.paymentInfo.interest - extraResults.paymentInfo.interest)).addClass('updated');
1231                $resultPaymentFrequency.html(formatFrequency(extraResults.paymentInfo.paymentFrequency));
1232                switch ($epType.val()) {
1233                    case "1":
1234                        $resultEpType.html('Monthly');
1235                        break;
1236                    case "2":
1237                        $resultEpType.html('Bi-Weekly');
1238                        break;
1239                    case "3":
1240                        $resultEpType.html('One Time');
1241                        break;
1242                }
1243                var dateDiff = moment.duration(moment(origResults.paymentInfo.payoffDate)
1244                    .diff(moment(extraResults.paymentInfo.payoffDate)));
1245                $resultTimeSaved.html(dateDiff.asDays() > 0 ? dateDiff.humanize() : '--').addClass('updated');
1246                setTimeout(function () {
1247                    $resultNewMonthlyPI.removeClass('updated');
1248                    $resultInterestSaved.removeClass('updated');
1249                    $resultTimeSaved.removeClass('updated');
1250                }, 1000);
1251                var compareChart = null;
1252                if (settings.showChart && $chartCompareAmortization.length > 0) {
1253                    var origData_1 = [];
1254                    var newData_1 = [];
1255                    _.each(origResults.payments, function (payment, i) {
1256                        if (settings.showMonthly || (settings.showYearly && (i + 1) % 12 == 0)) {
1257                            origData_1.push([payment.paymentDate.getTime(), payment.balance]);
1258                        }
1259                    });
1260                    _.each(extraResults.payments, function (payment, i) {
1261                        if (settings.showMonthly || (settings.showYearly && (i + 1) % 12 == 0)) {
1262                            newData_1.push([payment.paymentDate.getTime(), payment.balance]);
1263                        }
1264                    });
1265                    var animations = settings.disableAnimation === true ? false : true;
1266                    if (compareChart != null) {
1267                        compareChart.series[0].setData(origData_1, false, false);
1268                        compareChart.series[1].setData(newData_1, true, false);
1269                    }
1270                    else {
1271                        compareChart = Highcharts.chart($chartCompareAmortization.prop('id'), {
1272                            chart: {
1273                                animation: animations,
1274                                styledMode: true
1275                            },
1276                            title: {
1277                                text: null
1278                            },
1279                            xAxis: {
1280                                type: 'datetime'
1281                            },
1282                            yAxis: {
1283                                title: {
1284                                    text: 'Mortgage Balance'
1285                                }
1286                            },
1287                            credits: {
1288                                enabled: false
1289                            },
1290                            tooltip: {
1291                                xDateFormat: '%B %Y',
1292                                shared: true,
1293                                valuePrefix: '$',
1294                                valueDecimals: 0,
1295                                animation: animations,
1296                                headerFormat: '<span style="font-size: 12px;font-weight: bold;">Remaining Balance</span><br /><span style="font-size: 10px">{point.key}</span><br/>'
1297                            },
1298                            legend: {
1299                                enabled: true
1300                            },
1301                            series: [{
1302                                    name: 'Original',
1303                                    data: origData_1,
1304                                    type: 'line'
1305                                }, {
1306                                    name: 'With Extra Payments',
1307                                    data: newData_1,
1308                                    type: 'line'
1309                                }],
1310                            plotOptions: {
1311                                series: {
1312                                    animation: animations
1313                                }
1314                            }
1315                        });
1316                    }
1317                }
1318            };
1319            var cleanVals = function () {
1320                $amt.val(numberWithCommas(getFloat($amt.val())));
1321                $extraPayment.val(numberWithCommas(getFloat($extraPayment.val())));
1322            };
1323            var doCalc = function () {
1324                var amt = getFloat($amt.val());
1325                var extraPayment = getFloat($extraPayment.val());
1326                if (extraPayment > amt) {
1327                    extraPayment = amt;
1328                    $extraPayment.val(numberWithCommas(extraPayment));
1329                }
1330                var calc1 = new PaymentInput();
1331                calc1.amount = amt;
1332                calc1.homeValue = getFloat($amt.val());
1333                calc1.rate = getFloat($rate.val());
1334                calc1.years = parseInt($years.val());
1335                calc1.monthStart = parseInt($startMonth.val());
1336                calc1.yearStart = parseInt($startYear.val());
1337                var calc2 = new PaymentInput();
1338                calc2.amount = amt;
1339                calc2.homeValue = getFloat($amt.val());
1340                calc2.rate = getFloat($rate.val());
1341                calc2.years = parseInt($years.val());
1342                calc2.monthStart = parseInt($startMonth.val());
1343                calc2.yearStart = parseInt($startYear.val());
1344                calc2.paymentFrequency = PaymentFrequency.Monthly;
1345                //calc2.paymentFrequency = parseInt($paymentFrequency.val());
1346                //calc2.paymentExtraAmount = extraPayment;
1347                var monthlyExtraPayment = new ExtraPaymentDetails();
1348                monthlyExtraPayment.monthStart = calc2.monthStart;
1349                monthlyExtraPayment.yearStart = calc2.yearStart;
1350                monthlyExtraPayment.amount = extraPayment;
1351                switch ($epType.val()) {
1352                    case "1":
1353                        monthlyExtraPayment.frequency = ExtraPaymentFrequency.WithPayment;
1354                        break;
1355                    case "2":
1356                        monthlyExtraPayment.frequency = ExtraPaymentFrequency.WithPayment;
1357                        calc2.paymentFrequency = PaymentFrequency.BiWeekly;
1358                        break;
1359                    case "3":
1360                        monthlyExtraPayment.frequency = ExtraPaymentFrequency.OneTime;
1361                        break;
1362                }
1363                calc2.extraPayments = [monthlyExtraPayment];
1364                cleanVals();
1365                displayResult(getAmortizationSchedule(calc1), getAmortizationSchedule(calc2));
1366            };
1367            _.each([$amt, $rate], function (input) {
1368                input.on('change', doCalc);
1369                input.on('keypress', isNumeric);
1370            });
1371            _.each([$years, $startMonth, $startYear, $extraPayment, $epType], function (input) {
1372                input.on('change', doCalc);
1373            });
1374            $extraPayment.on('keypress', isNumeric);
1375            //$extraPayment.on('change', () => {
1376            //    let amt = getFloat($amt.val());
1377            //    let extraPayment = getFloat($extraPayment.val());
1378            //    if (extraPayment > amt) {
1379            //        extraPayment = amt;
1380            //        $extraPayment.val(numberWithCommas(extraPayment));
1381            //    }
1382            //    let input1 = new PaymentInput();
1383            //    input1.amount = amt;
1384            //    input1.homeValue = getFloat($amt.val());
1385            //    input1.rate = getFloat($rate.val());
1386            //    input1.years = parseInt($years.val());
1387            //    input1.monthStart = parseInt($startMonth.val());
1388            //    input1.yearStart = parseInt($startYear.val());
1389            //    let input2 = new PaymentInput();
1390            //    input2.amount = amt;
1391            //    input2.homeValue = getFloat($amt.val());
1392            //    input2.rate = getFloat($rate.val());
1393            //    input2.years = parseInt($years.val());
1394            //    input2.monthStart = parseInt($startMonth.val());
1395            //    input2.yearStart = parseInt($startYear.val());
1396            //    //input2.paymentExtraAmount = extraPayment;
1397            //    input2.paymentFrequency = parseInt($paymentFrequency.val());
1398            //    var monthlyExtraPayment = new ExtraPaymentDetails();
1399            //    monthlyExtraPayment.amount = extraPayment;
1400            //    monthlyExtraPayment.frequency = ExtraPaymentFrequency.WithPayment;
1401            //    monthlyExtraPayment.monthStart = input2.monthStart;
1402            //    monthlyExtraPayment.yearStart = input2.yearStart;
1403            //    input2.extraPayments = [monthlyExtraPayment];
1404            //    let calc1 = getAmortizationSchedule(input1);
1405            //    let calc2 = getAmortizationSchedule(input2);
1406            //    let numberYears = Math.floor(calc2.payments.length / input2.paymentsPerYear);
1407            //    $desiredLengthYears.val(Math.round(numberYears));
1408            //    cleanVals();
1409            //    displayResult(calc1, calc2);
1410            //});
1411            //$desiredLengthYears.on('keypress', isInteger);
1412            //$desiredLengthYears.on('change', () => {
1413            //    let loanYears = getInt($years.val());
1414            //    let desiredYears = getInt($desiredLengthYears.val());
1415            //    if (desiredYears > loanYears) {
1416            //        desiredYears = loanYears;
1417            //        $desiredLengthYears.val(desiredYears);
1418            //    }
1419            //    let amt = getFloat($amt.val());
1420            //    let calc1Input = new PaymentInput();
1421            //    calc1Input.amount = amt;
1422            //    calc1Input.homeValue = getFloat($amt.val());
1423            //    calc1Input.rate = getFloat($rate.val());
1424            //    calc1Input.years = loanYears;
1425            //    let calc1 = calcSimplePayment(calc1Input);
1426            //    let calc2Input = new PaymentInput();
1427            //    calc2Input.amount = amt;
1428            //    calc2Input.homeValue = getFloat($amt.val());
1429            //    calc2Input.rate = getFloat($rate.val());
1430            //    calc2Input.years = desiredYears;
1431            //    let calc2 = calcSimplePayment(calc2Input);
1432            //    let extraPayment = calc2.monthlyPayment - calc1.monthlyPayment;
1433            //    $extraPayment.val(numberWithCommas(extraPayment));
1434            //    doCalc();
1435            //});
1436            $epTypes.on('click', 'a[data-toggle="pill"]', function (e) {
1437                var pill = $(e.currentTarget);
1438                var epType = pill.data('ep-type');
1439                $epType.val(epType);
1440                switch (epType.toString()) {
1441                    case "1":
1442                        $extraPayment.val(numberWithCommas(250));
1443                        break;
1444                    case "2":
1445                        $extraPayment.val(numberWithCommas(0));
1446                        break;
1447                    case "3":
1448                        $extraPayment.val(numberWithCommas(10000));
1449                        break;
1450                }
1451                $epType.trigger('change');
1452            });
1453            doCalc();
1454        }
1455        calculators.setupExtraPaymentCalc = setupExtraPaymentCalc;
1456        function setupRateTrackerSummary(selector, settings) {
1457            var $calc = $(selector);
1458            $calc.find('[data-toggle="popover"]').popover({
1459                trigger: 'focus',
1460                placement: 'top'
1461            });
1462            var $includePmi = $calc.find('.rate-calc-pmi');
1463            var $amtOrig = $calc.find('.rate-calc-amount-orig');
1464            var $rateOrig = $calc.find('.rate-calc-rate-orig');
1465            var $yearsOrig = $calc.find('.rate-calc-years-orig');
1466            var $ptOrig = $calc.find('.rate-calc-product-orig');
1467            var $taxOrig = $calc.find('.rate-calc-tax-orig');
1468            var $insOrig = $calc.find('.rate-calc-ins-orig');
1469            var $hoaOrig = $calc.find('.rate-calc-hoa-orig');
1470            var $pmiRateOrig = $calc.find('.rate-calc-pmirate-orig');
1471            var $mipRateOrig = $calc.find('.rate-calc-miprate-orig');
1472            var $upMipRateOrig = $calc.find('.rate-calc-upmiprate-orig');
1473            var $mipDurationCancelYearsOrig = $calc.find('.rate-calc-mipduration-cancelyears-orig');
1474            var $mipDurationCancelLtvOrig = $calc.find('.rate-calc-mipduration-cancelltv-orig');
1475            var $amt1 = $calc.find('.rate-calc-amount-1');
1476            var $rate1 = $calc.find('.rate-calc-rate-1');
1477            var $years1 = $calc.find('.rate-calc-years-1');
1478            var $pt1 = $calc.find('.rate-calc-product-1');
1479            var $pmiRate1 = $calc.find('.rate-calc-pmirate-1');
1480            var $mipRate1 = $calc.find('.rate-calc-miprate-1');
1481            var $upMipRate1 = $calc.find('.rate-calc-upmiprate-1');
1482            var $mipDurationCancelYears1 = $calc.find('.rate-calc-mipduration-cancelyears-1');
1483            var $mipDurationCancelLtv1 = $calc.find('.rate-calc-mipduration-cancelltv-1');
1484            var $amt2 = $calc.find('.rate-calc-amount-2');
1485            var $rate2 = $calc.find('.rate-calc-rate-2');
1486            var $years2 = $calc.find('.rate-calc-years-2');
1487            var $pt2 = $calc.find('.rate-calc-product-2');
1488            var $pmiRate2 = $calc.find('.rate-calc-pmirate-2');
1489            var $mipRate2 = $calc.find('.rate-calc-miprate-2');
1490            var $upMipRate2 = $calc.find('.rate-calc-upmiprate-2');
1491            var $mipDurationCancelYears2 = $calc.find('.rate-calc-mipduration-cancelyears-2');
1492            var $mipDurationCancelLtv2 = $calc.find('.rate-calc-mipduration-cancelltv-2');
1493            var $amtep = $calc.find('.rate-calc-amount-ep');
1494            var $rateep = $calc.find('.rate-calc-rate-ep');
1495            var $yearsep = $calc.find('.rate-calc-years-ep');
1496            var $pmiRateep = $calc.find('.rate-calc-pmirate-ep');
1497            var $mipRateep = $calc.find('.rate-calc-miprate-ep');
1498            var $upMipRateep = $calc.find('.rate-calc-upmiprate-ep');
1499            var $mipDurationCancelYearsep = $calc.find('.rate-calc-mipduration-cancelyears-ep');
1500            var $mipDurationCancelLtvep = $calc.find('.rate-calc-mipduration-cancelltv-ep');
1501            var $empep = $calc.find('.rate-calc-emp-ep');
1502            var $otepep = $calc.find('.rate-calc-otep-ep');
1503            var $bwep = $calc.find('.rate-calc-bw-ep');
1504            var $resultMonthlyPIOrig = $calc.find('.result.result-monthly-pi-orig');
1505            var $resultInterestOrig = $calc.find('.result.result-interest-orig');
1506            var $resultPrincipalOrig = $calc.find('.result.result-principal-orig');
1507            var $resultFirstPaymentDateOrig = $calc.find('.result.result-first-payment-date-orig');
1508            var $resultPayoffDateOrig = $calc.find('.result.result-payoff-date-orig');
1509            var $resultMonthlyPrincipalOrig = $calc.find('.result.result-monthly-principal-orig');
1510            var $resultMonthlyInterestOrig = $calc.find('.result.result-monthly-interest-orig');
1511            var $resultMonthlyTaxOrig = $calc.find('.result.result-monthly-tax-orig');
1512            var $resultMonthlyInsOrig = $calc.find('.result.result-monthly-ins-orig');
1513            var $resultMonthlyHoaOrig = $calc.find('.result.result-monthly-hoa-orig');
1514            var $resultMonthlyTotal = $calc.find('.result.result-monthly-total-orig');
1515            var $resultMonthlyPmiOrig = $calc.find('.result.result-monthly-pmi-orig');
1516            var $resultMonthlyMipOrig = $calc.find('.result.result-monthly-mip-orig');
1517            var $resultPmiOrig = $calc.find('.result.result-pmi-orig');
1518            var $resultMipOrig = $calc.find('.result.result-mip-orig');
1519            var $resultTotalOrig = $calc.find('.result.result-total-orig');
1520            var $resultMonthlyPI1 = $calc.find('.result.result-monthly-pi-1');
1521            var $resultInterest1 = $calc.find('.result.result-interest-1');
1522            var $resultPrincipal1 = $calc.find('.result.result-principal-1');
1523            var $resultMonthlyPmi1 = $calc.find('.result.result-monthly-pmi-1');
1524            var $resultMonthlyMip1 = $calc.find('.result.result-monthly-mip-1');
1525            var $resultPmi1 = $calc.find('.result.result-pmi-1');
1526            var $resultMip1 = $calc.find('.result.result-mip-1');
1527            var $resultTotal1 = $calc.find('.result.result-total-1');
1528            var $resultMonthlyPI2 = $calc.find('.result.result-monthly-pi-2');
1529            var $resultInterest2 = $calc.find('.result.result-interest-2');
1530            var $resultPrincipal2 = $calc.find('.result.result-principal-2');
1531            var $resultMonthlyPmi2 = $calc.find('.result.result-monthly-pmi-2');
1532            var $resultMonthlyMip2 = $calc.find('.result.result-monthly-mip-2');
1533            var $resultPmi2 = $calc.find('.result.result-pmi-2');
1534            var $resultMip2 = $calc.find('.result.result-mip-2');
1535            var $resultTotal2 = $calc.find('.result.result-total-2');
1536            var $resultPayoffDateEp = $calc.find('.result.result-payoff-date-ep');
1537            var $resultTimeSavedEp = $calc.find('.result.result-time-saved-ep');
1538            var $resultTimeSavedPctEp = $calc.find('.result-time-saved-pct-ep');
1539            var $resultInterestEp = $calc.find('.result.result-interest-ep');
1540            var $resultInterestSavedEp = $calc.find('.result.result-interest-saved-ep');
1541            var $resultInterestSavedPctEp = $calc.find('.result-interest-saved-pct-ep');
1542            var $resultDescriptionEp = $calc.find('.result.result-description-ep');
1543            var $resultMonthlyDifferenceOrig = $calc.find('.result.result-difference-monthly-orig');
1544            var $resultMonthlyDifference1 = $calc.find('.result.result-difference-monthly-1');
1545            var $resultMonthlyDifference2 = $calc.find('.result.result-difference-monthly-2');
1546            var $resultTotalDifferenceOrig = $calc.find('.result.result-difference-total-orig');
1547            var $resultTotalDifference1 = $calc.find('.result.result-difference-total-1');
1548            var $resultTotalDifference2 = $calc.find('.result.result-difference-total-2');
1549            var $resultAmortizationTable = $calc.find('table.result.result-amortization');
1550            var monthlyRowTemplate = _.template(settings.monthlyRowTemplate ? settings.monthlyRowTemplate : "");
1551            var yearlyRowTemplate = _.template(settings.yearlyRowTemplate ? settings.yearlyRowTemplate : "");
1552            var $chartCompare = $calc.find('.compare-chart');
1553            var $chartAmortization = $calc.find('.amortization-chart');
1554            var $chartBreakdown = $calc.find('.month-breakdown-chart');
1555            var $chartEarlyPayoff = $calc.find('.calc-early-payoff-chart');
1556            var includePmi = parseInt($includePmi.val()) == 1;
1557            var displayResult = function (origResults, calc1Results, calc2Results, epResults) {
1558                $resultMonthlyPIOrig.html('$' + numberWithCommas(origResults.paymentInfo.payment));
1559                $resultInterestOrig.html('$' + numberWithCommas(origResults.paymentInfo.interest));
1560                $resultPrincipalOrig.html('$' + numberWithCommas(origResults.paymentInfo.principal));
1561                var firstPayment = null;
1562                if (origResults.payments && origResults.payments.length) {
1563                    firstPayment = origResults.payments[0];
1564                    $resultMonthlyPrincipalOrig.html('$' + numberWithCommas(firstPayment.principal));
1565                    $resultMonthlyInterestOrig.html('$' + numberWithCommas(firstPayment.interest));
1566                    $resultMonthlyTaxOrig.html('$' + numberWithCommas(firstPayment.tax));
1567                    $resultMonthlyInsOrig.html('$' + numberWithCommas(firstPayment.insurance));
1568                    $resultMonthlyHoaOrig.html('$' + numberWithCommas(firstPayment.hoa));
1569                    $resultMonthlyTotal.html('$' + numberWithCommas(firstPayment.totalPayment));
1570                }
1571                $resultFirstPaymentDateOrig.html(mnd.utilities.formatDate(origResults.paymentInfo.startDate, 'MMM YYYY'));
1572                $resultPayoffDateOrig.html(mnd.utilities.formatDate(origResults.paymentInfo.payoffDate, 'MMM YYYY'));
1573                $resultMonthlyPmiOrig.html('$' + numberWithCommas(origResults.paymentInfo.monthlyPmi));
1574                if (origResults.paymentInfo.monthlyPmi <= 0) {
1575                    $resultMonthlyPmiOrig.closest('.info-row').hide();
1576                }
1577                $resultMonthlyMipOrig.html('$' + numberWithCommas(origResults.paymentInfo.monthlyMip));
1578                if (origResults.paymentInfo.monthlyMip <= 0) {
1579                    $resultMonthlyMipOrig.closest('.info-row').hide();
1580                }
1581                $resultPmiOrig.html('$' + numberWithCommas(origResults.paymentInfo.totalPmi));
1582                $resultMipOrig.html('$' + numberWithCommas(origResults.paymentInfo.combinedTotalMip));
1583                $resultTotalOrig.html('$' + numberWithCommas(origResults.paymentInfo.total));
1584                $resultMonthlyPI1.html('$' + numberWithCommas(calc1Results.paymentInfo.payment));
1585                $resultInterest1.html('$' + numberWithCommas(calc1Results.paymentInfo.interest));
1586                $resultPrincipal1.html('$' + numberWithCommas(calc1Results.paymentInfo.principal));
1587                $resultMonthlyPmi1.html('$' + numberWithCommas(calc1Results.paymentInfo.monthlyPmi));
1588                $resultMonthlyMip1.html('$' + numberWithCommas(calc1Results.paymentInfo.monthlyMip));
1589                $resultPmi1.html('$' + numberWithCommas(calc1Results.paymentInfo.totalPmi));
1590                $resultMip1.html('$' + numberWithCommas(calc1Results.paymentInfo.combinedTotalMip));
1591                $resultTotal1.html('$' + numberWithCommas(calc1Results.paymentInfo.total));
1592                $resultMonthlyPI2.html('$' + numberWithCommas(calc2Results.paymentInfo.payment));
1593                $resultInterest2.html('$' + numberWithCommas(calc2Results.paymentInfo.interest));
1594                $resultPrincipal2.html('$' + numberWithCommas(calc2Results.paymentInfo.principal));
1595                $resultMonthlyPmi2.html('$' + numberWithCommas(calc2Results.paymentInfo.monthlyPmi));
1596                $resultMonthlyMip2.html('$' + numberWithCommas(calc2Results.paymentInfo.monthlyMip));
1597                $resultPmi2.html('$' + numberWithCommas(calc2Results.paymentInfo.totalPmi));
1598                $resultMip2.html('$' + numberWithCommas(calc2Results.paymentInfo.combinedTotalMip));
1599                $resultTotal2.html('$' + numberWithCommas(calc2Results.paymentInfo.total));
1600                $resultPayoffDateEp.html(mnd.utilities.formatDate(epResults.paymentInfo.payoffDate, 'MMM YYYY'));
1601                var timeSaved = formatDuration(getMinutesSaved(origResults, epResults));
1602                $resultTimeSavedEp.html(timeSaved);
1603                var minutesSavedPct = (1 - getMinutesSavedPct(origResults, epResults)) * 100;
1604                $resultTimeSavedPctEp.css({ 'width': minutesSavedPct.toFixed(2) + '%' });
1605                $resultInterestEp.html('$' + numberWithCommas(epResults.paymentInfo.interest));
1606                $resultInterestSavedEp.html('$' + numberWithCommas(getInterestSaved(origResults, epResults)));
1607                var interestSavedPct = (1 - getInterestSavedPct(origResults, epResults)) * 100;
1608                $resultInterestSavedPctEp.css({ 'width': interestSavedPct.toFixed(2) + '%' });
1609                var epText = '';
1610                if (epResults.paymentInfo.paymentFrequency == PaymentFrequency.BiWeekly) {
1611                    if (epResults.paymentInfo.paymentExtraAmount > 0) {
1612                        epText = 'Paying <span class="val">$' + epResults.paymentInfo.paymentExtraAmount.toFixed(0) + '</span> extra bi-weekly can ';
1613                    }
1614                    else {
1615                        epText = 'Paying bi-weekly will ';
1616                    }
1617                }
1618                else {
1619                    if (epResults.paymentInfo.paymentExtraAmount > 0) {
1620                        epText = 'Paying <span class="val">$' + epResults.paymentInfo.paymentExtraAmount.toFixed(0) + '</span> extra each month can ';
1621                    }
1622                    else {
1623                        epText = 'A one time extra payment of <span class="val">$' + epResults.paymentInfo.oneTimeExtraAmount.toFixed(0) + '</span> can ';
1624                    }
1625                }
1626                epText += 'save you <span class="val">' + timeSaved + '</span>, and save you <span class="val">' + (100 - interestSavedPct).toFixed(0) + '%</span> on interest paid';
1627                $resultDescriptionEp.html(epText);
1628                if (origResults.paymentInfo.monthlyPmi <= 0 && calc1Results.paymentInfo.monthlyPmi <= 0 && calc2Results.paymentInfo.monthlyPmi <= 0) {
1629                    $resultPmi1.closest('.info-row').hide();
1630                }
1631                if (origResults.paymentInfo.monthlyMip <= 0 && calc1Results.paymentInfo.monthlyMip <= 0 && calc2Results.paymentInfo.monthlyMip <= 0) {
1632                    $resultMip1.closest('.info-row').hide();
1633                }
1634                if (origResults.paymentInfo.monthlyPmi <= 0) {
1635                    $('.total-cost').find('.result-pmi-orig').closest('.info-row').hide();
1636                }
1637                if (origResults.paymentInfo.monthlyMip <= 0) {
1638                    $('.total-cost').find('.result-mip-orig').closest('.info-row').hide();
1639                }
1640                $resultMonthlyDifferenceOrig.html('');
1641                $resultTotalDifferenceOrig.html('');
1642                var monthlyDiff1 = calc1Results.paymentInfo.payment - origResults.paymentInfo.payment;
1643                var totalDiff1 = calc1Results.paymentInfo.total - origResults.paymentInfo.total;
1644                $resultMonthlyDifference1.html((monthlyDiff1 > 0 ? '+' : '') + '$' + numberWithCommas(monthlyDiff1)).addClass('updated');
1645                $resultTotalDifference1.html((totalDiff1 > 0 ? '+' : '') + '$' + numberWithCommas(totalDiff1)).addClass('updated');
1646                var monthlyDiff2 = calc2Results.paymentInfo.payment - origResults.paymentInfo.payment;
1647                var totalDiff2 = calc2Results.paymentInfo.total - origResults.paymentInfo.total;
1648                $resultMonthlyDifference2.html((monthlyDiff2 > 0 ? '+' : '') + '$' + numberWithCommas(monthlyDiff2)).addClass('updated');
1649                $resultTotalDifference2.html((totalDiff2 > 0 ? '+' : '') + '$' + numberWithCommas(totalDiff2)).addClass('updated');
1650                setTimeout(function () {
1651                    $resultMonthlyDifferenceOrig.removeClass('updated');
1652                    $resultMonthlyDifference1.removeClass('updated');
1653                    $resultMonthlyDifference2.removeClass('updated');
1654                    $resultTotalDifferenceOrig.removeClass('updated');
1655                    $resultTotalDifference1.removeClass('updated');
1656                    $resultTotalDifference2.removeClass('updated');
1657                }, 1000);
1658                var tableBody = $resultAmortizationTable.find('tbody');
1659                tableBody.empty();
1660                if (settings.showTable) {
1661                    _.each(origResults.payments, function (payment, i) {
1662                        if (settings.showMonthly) {
1663                            tableBody.append(monthlyRowTemplate(payment));
1664                        }
1665                        if (settings.showYearly && (i + 1) % 12 == 0) {
1666                            tableBody.append(yearlyRowTemplate(payment));
1667                        }
1668                    });
1669                }
1670                var animations = settings.disableAnimation === true ? false : true;
1671                var compareChart = null;
1672                if (settings.showChart && $chartCompare.length > 0) {
1673                    var origLoanData_1 = [];
1674                    var loan1Data_2 = [];
1675                    var loan2Data_2 = [];
1676                    _.each(origResults.payments, function (payment, i) {
1677                        if (settings.showMonthly || (settings.showYearly && (i + 1) % 12 == 0)) {
1678                            origLoanData_1.push([payment.paymentDate.getTime(), payment.totalPrincipal + payment.totalInterest]);
1679                        }
1680                    });
1681                    _.each(calc1Results.payments, function (payment, i) {
1682                        if (settings.showMonthly || (settings.showYearly && (i + 1) % 12 == 0)) {
1683                            loan1Data_2.push([payment.paymentDate.getTime(), payment.totalPrincipal + payment.totalInterest]);
1684                        }
1685                    });
1686                    _.each(calc2Results.payments, function (payment, i) {
1687                        if (settings.showMonthly || (settings.showYearly && (i + 1) % 12 == 0)) {
1688                            loan2Data_2.push([payment.paymentDate.getTime(), payment.totalPrincipal + payment.totalInterest]);
1689                        }
1690                    });
1691                    if (compareChart != null) {
1692                        compareChart.series[0].setData(origLoanData_1, false, false);
1693                        compareChart.series[1].setData(loan1Data_2, false, false);
1694                        compareChart.series[2].setData(loan2Data_2, false, false);
1695                    }
1696                    else {
1697                        compareChart = Highcharts.chart($chartCompare.prop('id'), {
1698                            chart: {
1699                                animation: animations,
1700                                styledMode: true
1701                            },
1702                            title: {
1703                                text: null
1704                            },
1705                            xAxis: {
1706                                type: 'datetime'
1707                            },
1708                            yAxis: {
1709                                title: {
1710                                    text: 'Total Principal and Interest'
1711                                }
1712                            },
1713                            credits: {
1714                                enabled: false
1715                            },
1716                            tooltip: {
1717                                xDateFormat: '%B %Y',
1718                                shared: true,
1719                                valuePrefix: '$',
1720                                valueDecimals: 2,
1721                                animation: animations,
1722                                useHTML: !animations,
1723                                headerFormat: '<span style="font-size: 12px;font-weight: bold;">Total Principal and Interest</span><br /><span style="font-size: 10px">{point.key}</span><br/>'
1724                            },
1725                            legend: {
1726                                enabled: true
1727                            },
1728                            series: [{
1729                                    name: 'Your Loan',
1730                                    data: origLoanData_1,
1731                                    type: 'areaspline'
1732                                }, {
1733                                    name: 'Loan 1',
1734                                    data: loan1Data_2,
1735                                    type: 'line'
1736                                }, {
1737                                    name: 'Loan 2',
1738                                    data: loan2Data_2,
1739                                    type: 'line'
1740                                }],
1741                            plotOptions: {
1742                                areaspline: {
1743                                    //stacking: 'normal',
1744                                    fillOpacity: 0.5
1745                                },
1746                                series: {
1747                                    animation: animations
1748                                }
1749                            }
1750                        });
1751                    }
1752                }
1753                var amortizationChart = null;
1754                if (settings.showChart && $chartAmortization.length > 0) {
1755                    var principalData_2 = [];
1756                    var interestData_2 = [];
1757                    var balanceData_2 = [];
1758                    _.each(calc1Results.payments, function (payment) {
1759                        principalData_2.push([payment.paymentDate.getTime(), payment.totalPrincipal]);
1760                        interestData_2.push([payment.paymentDate.getTime(), payment.totalInterest]);
1761                        balanceData_2.push([payment.paymentDate.getTime(), payment.balance]);
1762                    });
1763                    if (amortizationChart != null) {
1764                        amortizationChart.series[0].setData(principalData_2, false, false);
1765                        amortizationChart.series[1].setData(interestData_2, false, false);
1766                        amortizationChart.series[2].setData(balanceData_2, true, false);
1767                    }
1768                    else {
1769                        amortizationChart = Highcharts.chart($chartAmortization.prop('id'), {
1770                            chart: {
1771                                animation: animations,
1772                                spacing: [20, 10, 0, 10],
1773                                styledMode: true
1774                            },
1775                            title: {
1776                                text: null
1777                            },
1778                            xAxis: {
1779                                type: 'datetime'
1780                            },
1781                            yAxis: {
1782                                title: {
1783                                    text: null
1784                                }
1785                            },
1786                            credits: {
1787                                enabled: false
1788                            },
1789                            tooltip: {
1790                                xDateFormat: '%B %Y',
1791                                shared: true,
1792                                valuePrefix: '$',
1793                                animation: animations,
1794                                valueDecimals: 2
1795                            },
1796                            legend: {
1797                                enabled: true,
1798                                margin: 0,
1799                                padding: 3
1800                            },
1801                            series: [{
1802                                    name: 'Total Principal',
1803                                    data: principalData_2,
1804                                    type: 'column'
1805                                }, {
1806                                    name: 'Total Interest',
1807                                    data: interestData_2,
1808                                    type: 'column'
1809                                }, {
1810                                    name: 'Balance',
1811                                    data: balanceData_2,
1812                                    type: 'line'
1813                                }],
1814                            plotOptions: {
1815                                column: {
1816                                    stacking: 'normal'
1817                                },
1818                                series: {
1819                                    animation: animations
1820                                }
1821                            }
1822                        });
1823                    }
1824                }
1825                var pieChart = null;
1826                if (settings.showPieChart && $chartBreakdown.length > 0 && firstPayment) {
1827                    var chartData = [
1828                        { name: 'Principal', y: firstPayment.principal, visible: firstPayment.principal > 0 },
1829                        { name: 'Interest', y: firstPayment.interest, visible: firstPayment.interest > 0 },
1830                        { name: 'Taxes', y: firstPayment.tax, visible: firstPayment.tax > 0 },
1831                        { name: 'Insurance', y: firstPayment.insurance, visible: firstPayment.insurance > 0 },
1832                        { name: 'HOA', y: firstPayment.hoa, visible: firstPayment.hoa > 0 },
1833                        { name: 'PMI', y: firstPayment.pmi, visible: firstPayment.pmi > 0 },
1834                        { name: 'MIP', y: firstPayment.mip, visible: firstPayment.mip > 0 }
1835                    ];
1836                    if (pieChart != null) {
1837                        pieChart.series[0].setData(chartData, true, false);
1838                    }
1839                    else {
1840                        pieChart = Highcharts.chart($chartBreakdown.prop('id'), {
1841                            chart: {
1842                                plotBackgroundColor: null,
1843                                plotBorderWidth: null,
1844                                plotShadow: false,
1845                                type: 'pie',
1846                                animation: animations,
1847                                margin: [0, 0, 0, 0],
1848                                spacing: [0, 0, 0, 0],
1849                                styledMode: true
1850                            },
1851                            title: {
1852                                text: null
1853                            },
1854                            tooltip: {
1855                                animation: animations,
1856                                pointFormat: '<b>${point.y:.2f}</b>'
1857                            },
1858                            credits: {
1859                                enabled: false
1860                            },
1861                            series: [{
1862                                    name: 'Breakdown',
1863                                    data: chartData
1864                                }],
1865                            plotOptions: {
1866                                series: {
1867                                    animation: animations
1868                                },
1869                                pie: {
1870                                    size: '100%',
1871                                    slicedOffset: 0,
1872                                    startAngle: -30,
1873                                    dataLabels: {
1874                                        enabled: false,
1875                                        //format: ,                      
1876                                        //style: {
1877                                        //  fontWeight: 'bold',
1878                                        //  color: 'white'
1879                                        //}
1880                                    },
1881                                }
1882                            }
1883                        });
1884                    }
1885                }
1886                var earlyPayoffChart = null;
1887                if (settings.showChart && $chartEarlyPayoff.length > 0) {
1888                    var origData_2 = [];
1889                    var newData_2 = [];
1890                    _.each(origResults.payments, function (payment, i) {
1891                        if (settings.showMonthly || (settings.showYearly && (i + 1) % 12 == 0)) {
1892                            origData_2.push([payment.paymentDate.getTime(), payment.balance]);
1893                        }
1894                    });
1895                    _.each(epResults.payments, function (payment, i) {
1896                        if (settings.showMonthly || (settings.showYearly && (i + 1) % 12 == 0)) {
1897                            newData_2.push([payment.paymentDate.getTime(), payment.balance]);
1898                        }
1899                    });
1900                    if (earlyPayoffChart != null) {
1901                        earlyPayoffChart.series[0].setData(origData_2, false);
1902                        earlyPayoffChart.series[1].setData(newData_2, true);
1903                    }
1904                    else {
1905                        earlyPayoffChart = Highcharts.chart($chartEarlyPayoff.prop('id'), {
1906                            chart: {
1907                                animation: animations,
1908                                styledMode: true
1909                            },
1910                            title: {
1911                                text: null
1912                            },
1913                            xAxis: {
1914                                type: 'datetime'
1915                            },
1916                            yAxis: {
1917                                title: {
1918                                    text: 'Mortgage Balance'
1919                                }
1920                            },
1921                            credits: {
1922                                enabled: false
1923                            },
1924                            tooltip: {
1925                                xDateFormat: '%B %d, %Y',
1926                                shared: true,
1927                                valuePrefix: '$',
1928                                valueDecimals: 0,
1929                                animation: animations,
1930                                headerFormat: '<span style="font-size: 12px;font-weight: bold;">Remaining Balance</span><br /><span style="font-size: 10px">{point.key}</span><br/>'
1931                            },
1932                            legend: {
1933                                enabled: true
1934                            },
1935                            series: [{
1936                                    name: 'Original',
1937                                    data: origData_2,
1938                                    type: 'area'
1939                                }, {
1940                                    name: 'With Extra Payments',
1941                                    data: newData_2,
1942                                    type: 'line'
1943                                }],
1944                            plotOptions: {
1945                                series: {
1946                                    animation: animations
1947                                }
1948                            }
1949                        });
1950                    }
1951                }
1952            };
1953            var cleanVals = function () {
1954                $amtOrig.val(numberWithCommas(getFloat($amtOrig.val())));
1955                $amt1.val(numberWithCommas(getFloat($amt1.val())));
1956                $amt2.val(numberWithCommas(getFloat($amt2.val())));
1957            };
1958            var doCalc = function () {
1959                var calcOrig = new PaymentInput();
1960                calcOrig.amount = getFloat($amtOrig.val());
1961                calcOrig.homeValue = getFloat($amtOrig.val());
1962                calcOrig.rate = getFloat($rateOrig.val());
1963                calcOrig.years = parseInt($yearsOrig.val());
1964                calcOrig.tax = getFloat($taxOrig.val());
1965                calcOrig.insurance = getFloat($insOrig.val());
1966                calcOrig.hoa = getFloat($hoaOrig.val());
1967                calcOrig.includePmi = includePmi;
1968                var origMipRate = getFloat($mipRateOrig.val());
1969                if (origMipRate) {
1970                    calcOrig.fhaAdjustment = new FhaAdjustment();
1971                    calcOrig.fhaAdjustment.mipRate = new FhaMipRate();
1972                    calcOrig.fhaAdjustment.mipRate.rate = origMipRate;
1973                    calcOrig.fhaAdjustment.upmipRate = new FhaUpmipRate();
1974                    calcOrig.fhaAdjustment.upmipRate.rate = getFloat($upMipRateOrig.val());
1975                    calcOrig.fhaAdjustment.mipDuration = new FhaMipDuration();
1976                    calcOrig.fhaAdjustment.mipDuration.cancelLtv = getFloat($mipDurationCancelLtvOrig.val());
1977                    calcOrig.fhaAdjustment.mipDuration.cancelYears = getFloat($mipDurationCancelYearsOrig.val());
1978                }
1979                if (calcOrig.includePmi) {
1980                    var origPmiRate = getFloat($pmiRateOrig.val());
1981                    if (origPmiRate) {
1982                        calcOrig.pmiAdjustment = new PmiAdjustment();
1983                        calcOrig.pmiAdjustment.pmiRate = new PmiRate();
1984                        calcOrig.pmiAdjustment.pmiRate.rate = origPmiRate;
1985                    }
1986                }
1987                var calc1 = new PaymentInput();
1988                calc1.amount = getFloat($amt1.val());
1989                calc1.homeValue = getFloat($amt1.val());
1990                calc1.rate = getFloat($rate1.val());
1991                calc1.years = parseInt($years1.val());
1992                calc1.includePmi = calcOrig.includePmi;
1993                var mipRate1 = getFloat($mipRate1.val());
1994                if (mipRate1) {
1995                    calc1.fhaAdjustment = new FhaAdjustment();
1996                    calc1.fhaAdjustment.mipRate = new FhaMipRate;
1997                    calc1.fhaAdjustment.mipRate.rate = mipRate1;
1998                    calc1.fhaAdjustment.upmipRate = new FhaUpmipRate();
1999                    calc1.fhaAdjustment.upmipRate.rate = getFloat($upMipRate1.val());
2000                    calc1.fhaAdjustment.mipDuration = new FhaMipDuration();
2001                    calc1.fhaAdjustment.mipDuration.cancelLtv = getFloat($mipDurationCancelLtv1.val());
2002                    calc1.fhaAdjustment.mipDuration.cancelYears = getFloat($mipDurationCancelYears1.val());
2003                }
2004                if (calc1.includePmi) {
2005                    var pmiRate1 = getFloat($pmiRate1.val());
2006                    if (pmiRate1) {
2007                        calc1.pmiAdjustment = new PmiAdjustment();
2008                        calc1.pmiAdjustment.pmiRate = new PmiRate();
2009                        calc1.pmiAdjustment.pmiRate.rate = pmiRate1;
2010                    }
2011                }
2012                var calc2 = new PaymentInput();
2013                calc2.amount = getFloat($amt2.val());
2014                calc2.homeValue = getFloat($amt2.val());
2015                calc2.rate = getFloat($rate2.val());
2016                calc2.years = parseInt($years2.val());
2017                calc2.includePmi = calcOrig.includePmi;
2018                var mipRate2 = getFloat($mipRate2.val());
2019                if (mipRate2) {
2020                    calc2.fhaAdjustment = new FhaAdjustment();
2021                    calc2.fhaAdjustment.mipRate = new FhaMipRate;
2022                    calc2.fhaAdjustment.mipRate.rate = mipRate2;
2023                    calc2.fhaAdjustment.upmipRate = new FhaUpmipRate();
2024                    calc2.fhaAdjustment.upmipRate.rate = getFloat($upMipRate2.val());
2025                    calc2.fhaAdjustment.mipDuration = new FhaMipDuration();
2026                    calc2.fhaAdjustment.mipDuration.cancelLtv = getFloat($mipDurationCancelLtv2.val());
2027                    calc2.fhaAdjustment.mipDuration.cancelYears = getFloat($mipDurationCancelYears2.val());
2028                }
2029                if (calc2.includePmi) {
2030                    var pmiRate2 = getFloat($pmiRate2.val());
2031                    if (pmiRate2) {
2032                        calc2.pmiAdjustment = new PmiAdjustment();
2033                        calc2.pmiAdjustment.pmiRate = new PmiRate();
2034                        calc2.pmiAdjustment.pmiRate.rate = pmiRate2;
2035                    }
2036                }
2037                var calcEp = new PaymentInput();
2038                calcEp.amount = getFloat($amtep.val());
2039                calcEp.homeValue = getFloat($amtep.val());
2040                calcEp.rate = getFloat($rateep.val());
2041                calcEp.years = parseInt($yearsep.val());
2042                calcEp.includePmi = calcOrig.includePmi;
2043                calcEp.paymentFrequency = parseInt($bwep.val()) == 1 ? PaymentFrequency.BiWeekly : PaymentFrequency.Monthly;
2044                calcEp.paymentExtraAmount = getFloat($empep.val());
2045                calcEp.oneTimeExtraAmount = getFloat($otepep.val());
2046                var mipRateEp = getFloat($mipRateep.val());
2047                if (mipRateEp) {
2048                    calcEp.fhaAdjustment = new FhaAdjustment();
2049                    calcEp.fhaAdjustment.mipRate = new FhaMipRate;
2050                    calcEp.fhaAdjustment.mipRate.rate = mipRateEp;
2051                    calcEp.fhaAdjustment.upmipRate = new FhaUpmipRate();
2052                    calcEp.fhaAdjustment.upmipRate.rate = getFloat($upMipRateep.val());
2053                    calcEp.fhaAdjustment.mipDuration = new FhaMipDuration();
2054                    calcEp.fhaAdjustment.mipDuration.cancelLtv = getFloat($mipDurationCancelLtvep.val());
2055                    calcEp.fhaAdjustment.mipDuration.cancelYears = getFloat($mipDurationCancelYearsep.val());
2056                }
2057                if (calcEp.includePmi) {
2058                    var pmiRateEp = getFloat($pmiRateep.val());
2059                    if (pmiRateEp) {
2060                        calcEp.pmiAdjustment = new PmiAdjustment();
2061                        calcEp.pmiAdjustment.pmiRate = new PmiRate();
2062                        calcEp.pmiAdjustment.pmiRate.rate = pmiRateEp;
2063                    }
2064                }
2065                cleanVals();
2066                displayResult(getAmortizationSchedule(calcOrig), getAmortizationSchedule(calc1), getAmortizationSchedule(calc2), getAmortizationSchedule(calcEp));
2067            };
2068            //_.each([$amtOrig, $rateOrig, $yearsOrig, $rate1, $years1, $rate2, $
2068years2], (input) => {
2069            //  input.on('change', doCalc);
2070            //  input.on('keypress', isNumeric);
2071            //});
2072            doCalc();
2073        }
2074        calculators.setupRateTrackerSummary = setupRateTrackerSummary;
2075        function setupSocialImage(selector, settings) {
2076            var $calc = $(selector);
2077            $calc.find('[data-toggle="popover"]').popover({
2078                trigger: 'focus',
2079                placement: 'top'
2080            });
2081            var $hp = $calc.find('.rate-calc-price');
2082            var $dpAmt = $calc.find('.rate-calc-dp-amt');
2083            var $dpPct = $calc.find('.rate-calc-dp-pct');
2084            var $amt = $calc.find('.rate-calc-amount');
2085            var $rate = $calc.find('.rate-calc-rate');
2086            var $years = $calc.find('.rate-calc-years');
2087            var $insurance = $calc.find('.rate-calc-ins');
2088            var $taxAmt = $calc.find('.rate-calc-tax-amt');
2089            var $hoa = $calc.find('.rate-calc-hoa');
2090            var $startMonth = $calc.find('.rate-calc-month');
2091            var $startYear = $calc.find('.rate-calc-year');
2092            var $productType = $calc.find('.rate-calc-product');
2093            var $includePmi = $calc.find('.rate-calc-pmi');
2094            var $pmiRate = $calc.find('.rate-calc-pmirate');
2095            var $mipRate = $calc.find('.rate-calc-miprate');
2096            var $upMipRate = $calc.find('.rate-calc-upmiprate');
2097            var $mipDurationCancelYears = $calc.find('.rate-calc-mipduration-cancelyears');
2098            var $mipDurationCancelLtv = $calc.find('.rate-calc-mipduration-cancelltv');
2099            var $chartMonthlyBreakdown = $calc.find('.month-breakdown-chart');
2100            var $chartAmortization = $calc.find('.amortization-chart');
2101            var displayResult = function (amortizationresults) {
2102                var animations = settings.disableAnimation === true ? false : true;
2103                var pieChart = null;
2104                var paymentResult = amortizationresults.payments[0];
2105                if (settings.showPieChart && $chartMonthlyBreakdown.length > 0) {
2106                    var chartData = [
2107                        { name: 'Principal', y: paymentResult.principal, visible: paymentResult.principal > 0 },
2108                        { name: 'Interest', y: paymentResult.interest, visible: paymentResult.interest > 0 },
2109                        { name: 'Taxes', y: paymentResult.tax, visible: paymentResult.tax > 0 },
2110                        { name: 'Insurance', y: paymentResult.insurance, visible: paymentResult.insurance > 0 },
2111                        { name: 'HOA', y: paymentResult.hoa, visible: paymentResult.hoa > 0 },
2112                        { name: 'PMI', y: paymentResult.pmi, visible: paymentResult.pmi > 0 },
2113                        { name: 'MIP', y: paymentResult.mip, visible: paymentResult.mip > 0 }
2114                    ];
2115                    if (pieChart != null) {
2116                        pieChart.series[0].setData(chartData, true, false);
2117                    }
2118                    else {
2119                        pieChart = Highcharts.chart($chartMonthlyBreakdown.prop('id'), {
2120                            chart: {
2121                                plotBackgroundColor: null,
2122                                plotBorderWidth: null,
2123                                plotShadow: false,
2124                                type: 'pie',
2125                                animation: animations,
2126                                margin: [0, 0, 0, 0],
2127                                spacing: [0, 0, 0, 0],
2128                                styledMode: true
2129                            },
2130                            title: {
2131                                text: null
2132                            },
2133                            tooltip: {
2134                                animation: animations,
2135                                pointFormat: '<b>${point.y:.2f}</b>'
2136                            },
2137                            credits: {
2138                                enabled: false
2139                            },
2140                            series: [{
2141                                    name: 'Breakdown',
2142                                    data: chartData
2143                                }],
2144                            plotOptions: {
2145                                series: {
2146                                    animation: animations
2147                                },
2148                                pie: {
2149                                    size: '90%',
2150                                    slicedOffset: 0,
2151                                    startAngle: -30,
2152                                    dataLabels: {
2153                                        enabled: false,
2154                                        distance: 6,
2155                                        connectorWidth: 0,
2156                                        //format: ,
2157                                        formatter: function () {
2158                                            var marginTop = 0;
2159                                            var marginLeft = 0;
2160                                            if (this.point.name == "Interest") {
2161                                                //marginTop = -20;
2162                                                //marginLeft = -8;
2163                                            }
2164                                            if (this.point.name == "Principal") {
2165                                                //marginLeft = 20;
2166                                            }
2167                                            if (this.point.name == "HOA") {
2168                                                //marginLeft = 4;
2169                                            }
2170                                            if (this.point.name == "Taxes") {
2171                                                //marginLeft = 20;
2172                                            }
2173                                            if (this.point.name == "Insurance") {
2174                                                //marginTop = -10;
2175                                            }
2176                                            return "<div class=\"\" style=\"font-weight: normal;text-align:right;margin-top: ".concat(marginTop, "px;margin-left: ").concat(marginLeft, "px;\">\n                                <i class=\"fa fa-circle highcharts-color-").concat(this.point.x, "\"></i>&nbsp;&nbsp;<span style=\"color:#9A9999;font-size:12px;\">").concat(this.point.name, "</span>\n                                <div style=\"color:#000;font-size:15px;\">$").concat(Highcharts.numberFormat(this.y, 0), "</div>\n                              </div>");
2177                                        },
2178                                        useHTML: true
2179                                        //style: {
2180                                        //  fontWeight: 'bold',
2181                                        //  color: 'white'
2182                                        //}
2183                                    },
2184                                }
2185                            }
2186                        });
2187                    }
2188                }
2189                var amortizationChart = null;
2190                if (settings.showChart && $chartAmortization.length > 0) {
2191                    var principalData_3 = [];
2192                    var interestData_3 = [];
2193                    var balanceData_3 = [];
2194                    _.each(amortizationresults.payments, function (payment) {
2195                        principalData_3.push([payment.paymentDate.getTime(), payment.totalPrincipal]);
2196                        interestData_3.push([payment.paymentDate.getTime(), payment.totalInterest]);
2197                        balanceData_3.push([payment.paymentDate.getTime(), payment.balance]);
2198                    });
2199                    if (amortizationChart != null) {
2200                        amortizationChart.series[0].setData(principalData_3, false, false);
2201                        amortizationChart.series[1].setData(interestData_3, false, false);
2202                        amortizationChart.series[2].setData(balanceData_3, true, false);
2203                    }
2204                    else {
2205                        amortizationChart = Highcharts.chart($chartAmortization.prop('id'), {
2206                            chart: {
2207                                animation: animations,
2208                                margin: [5, 0, 20, 50],
2209                                styledMode: true
2210                            },
2211                            title: {
2212                                text: null
2213                            },
2214                            xAxis: {
2215                                type: 'datetime'
2216                            },
2217                            yAxis: {
2218                                title: {
2219                                    text: null
2220                                },
2221                                tickPixelInterval: 30,
2222                                endOnTick: false
2223                            },
2224                            credits: {
2225                                enabled: false
2226                            },
2227                            tooltip: {
2228                                xDateFormat: '%B %Y',
2229                                shared: true,
2230                                valuePrefix: '$',
2231                                animation: animations,
2232                                valueDecimals: 2
2233                            },
2234                            legend: {
2235                                enabled: false
2236                            },
2237                            series: [{
2238                                    name: 'Total Principal',
2239                                    data: principalData_3,
2240                                    type: 'column'
2241                                }, {
2242                                    name: 'Total Interest',
2243                                    data: interestData_3,
2244                                    type: 'column'
2245                                }, {
2246                                    name: 'Balance',
2247                                    data: balanceData_3
2248                                }],
2249                            plotOptions: {
2250                                column: {
2251                                    stacking: 'normal',
2252                                    //pointPadding: 0,
2253                                    //borderWidth:0,
2254                                    //shadow: false,
2255                                    animation: animations
2256                                },
2257                                series: {
2258                                    animation: animations
2259                                }
2260                            }
2261                        });
2262                    }
2263                }
2264            };
2265            var input = new PaymentInput();
2266            input.amount = getFloat($amt.val());
2267            input.homeValue = getFloat($hp.val());
2268            input.rate = getFloat($rate.val());
2269            input.years = parseInt($years.val());
2270            input.insurance = getFloat($insurance.val());
2271            input.tax = getFloat($taxAmt.val());
2272            input.hoa = getFloat($hoa.val());
2273            input.monthStart = parseInt($startMonth.val());
2274            input.yearStart = parseInt($startYear.val());
2275            input.productType = parseInt($productType.val());
2276            var mipRate = getFloat($mipRate.val());
2277            if (mipRate) {
2278                input.fhaAdjustment = new FhaAdjustment();
2279                input.fhaAdjustment.mipRate = new FhaMipRate;
2280                input.fhaAdjustment.mipRate.rate = mipRate;
2281                input.fhaAdjustment.upmipRate = new FhaUpmipRate();
2282                input.fhaAdjustment.upmipRate.rate = getFloat($upMipRate.val());
2283                input.fhaAdjustment.mipDuration = new FhaMipDuration();
2284                input.fhaAdjustment.mipDuration.cancelLtv = getFloat($mipDurationCancelLtv.val());
2285                input.fhaAdjustment.mipDuration.cancelYears = getFloat($mipDurationCancelYears.val());
2286            }
2287            var pmiRate = getFloat($pmiRate.val());
2288            if (pmiRate) {
2289                input.pmiAdjustment = new PmiAdjustment();
2290                input.pmiAdjustment.pmiRate = new PmiRate();
2291                input.pmiAdjustment.pmiRate.rate = pmiRate;
2292            }
2293            input.includePmi = parseInt($includePmi.val()) == 1;
2294            var schedule = getAmortizationSchedule(input);
2295            displayResult(schedule);
2296        }
2297        calculators.setupSocialImage = setupSocialImage;
2298        function setupAmortizationImage(selector, settings) {
2299            var $calc = $(selector);
2300            $calc.find('[data-toggle="popover"]').popover({
2301                trigger: 'focus',
2302                placement: 'top'
2303            });
2304            var $hp = $calc.find('.rate-calc-price');
2305            var $dpAmt = $calc.find('.rate-calc-dp-amt');
2306            var $dpPct = $calc.find('.rate-calc-dp-pct');
2307            var $amt = $calc.find('.rate-calc-amount');
2308            var $rate = $calc.find('.rate-calc-rate');
2309            var $years = $calc.find('.rate-calc-years');
2310            var $insurance = $calc.find('.rate-calc-ins');
2311            var $taxAmt = $calc.find('.rate-calc-tax-amt');
2312            var $hoa = $calc.find('.rate-calc-hoa');
2313            var $startMonth = $calc.find('.rate-calc-month');
2314            var $startYear = $calc.find('.rate-calc-year');
2315            var $productType = $calc.find('.rate-calc-product');
2316            var $includePmi = $calc.find('.rate-calc-pmi');
2317            var $pmiRate = $calc.find('.rate-calc-pmirate');
2318            var $mipRate = $calc.find('.rate-calc-miprate');
2319            var $chartMonthlyBreakdown = $calc.find('.month-breakdown-chart');
2320            var $chartAmortization = $calc.find('.amortization-chart');
2321            var displayResult = function (amortizationresults) {
2322                var animations = settings.disableAnimation === true ? false : true;
2323                var pieChart = null;
2324                var paymentResult = amortizationresults.payments[0];
2325                if (settings.showPieChart && $chartMonthlyBreakdown.length > 0) {
2326                    var chartData = [
2327                        { name: 'Principal', y: paymentResult.principal, visible: paymentResult.principal > 0 },
2328                        { name: 'Interest', y: paymentResult.interest, visible: paymentResult.interest > 0 },
2329                        { name: 'Taxes', y: paymentResult.tax, visible: paymentResult.tax > 0 },
2330                        { name: 'Insurance', y: paymentResult.insurance, visible: paymentResult.insurance > 0 },
2331                        { name: 'HOA', y: paymentResult.hoa, visible: paymentResult.hoa > 0 },
2332                        { name: 'PMI', y: paymentResult.pmi, visible: paymentResult.pmi > 0 },
2333                        { name: 'MIP', y: paymentResult.mip, visible: paymentResult.mip > 0 }
2334                    ];
2335                    if (pieChart != null) {
2336                        pieChart.series[0].setData(chartData, true, false);
2337                    }
2338                    else {
2339                        pieChart = Highcharts.chart($chartMonthlyBreakdown.prop('id'), {
2340                            chart: {
2341                                plotBackgroundColor: null,
2342                                plotBorderWidth: null,
2343                                plotShadow: false,
2344                                type: 'pie',
2345                                animation: animations,
2346                                margin: [0, 0, 0, 0],
2347                                spacing: [0, 0, 0, 0],
2348                                styledMode: true
2349                            },
2350                            title: {
2351                                text: null
2352                            },
2353                            tooltip: {
2354                                animation: animations,
2355                                pointFormat: '<b>${point.y:.2f}</b>'
2356                            },
2357                            credits: {
2358                                enabled: false
2359                            },
2360                            series: [{
2361                                    name: 'Breakdown',
2362                                    data: chartData
2363                                }],
2364                            plotOptions: {
2365                                series: {
2366                                    animation: animations
2367                                },
2368                                pie: {
2369                                    size: '90%',
2370                                    slicedOffset: 0,
2371                                    //startAngle: -30,
2372                                    dataLabels: {
2373                                        enabled: false,
2374                                        distance: 6,
2375                                        connectorWidth: 0,
2376                                        //format: ,
2377                                        formatter: function () {
2378                                            var marginTop = 0;
2379                                            var marginLeft = 0;
2380                                            if (this.point.name == "Interest") {
2381                                                //marginTop = -20;
2382                                                //marginLeft = -8;
2383                                            }
2384                                            if (this.point.name == "Principal") {
2385                                                //marginLeft = 20;
2386                                            }
2387                                            if (this.point.name == "HOA") {
2388                                                //marginLeft = 4;
2389                                            }
2390                                            if (this.point.name == "Taxes") {
2391                                                //marginLeft = 20;
2392                                            }
2393                                            if (this.point.name == "Insurance") {
2394                                                //marginTop = -10;
2395                                            }
2396                                            return "<div class=\"\" style=\"font-weight: normal;text-align:right;margin-top: ".concat(marginTop, "px;margin-left: ").concat(marginLeft, "px;\">\n                                <i class=\"fa fa-circle highcharts-color-").concat(this.point.x, "\"></i>&nbsp;&nbsp;<span style=\"color:#9A9999;font-size:12px;\">").concat(this.point.name, "</span>\n                                <div style=\"color:#000;font-size:15px;\">$").concat(Highcharts.numberFormat(this.y, 0), "</div>\n                              </div>");
2397                                        },
2398                                        useHTML: true
2399                                        //style: {
2400                                        //  fontWeight: 'bold',
2401                                        //  color: 'white'
2402                                        //}
2403                                    },
2404                                }
2405                            }
2406                        });
2407                    }
2408                }
2409                var amortizationChart = null;
2410                if (settings.showChart && $chartAmortization.length > 0) {
2411                    var principalData_4 = [];
2412                    var interestData_4 = [];
2413                    var balanceData_4 = [];
2414                    _.each(amortizationresults.payments, function (payment) {
2415                        principalData_4.push([payment.paymentDate.getTime(), payment.totalPrincipal]);
2416                        interestData_4.push([payment.paymentDate.getTime(), payment.totalInterest]);
2417                        balanceData_4.push([payment.paymentDate.getTime(), payment.balance]);
2418                    });
2419                    if (amortizationChart != null) {
2420                        amortizationChart.series[0].setData(principalData_4, false, false);
2421                        amortizationChart.series[1].setData(interestData_4, false, false);
2422                        amortizationChart.series[2].setData(balanceData_4, true, false);
2423                    }
2424                    else {
2425                        amortizationChart = Highcharts.chart($chartAmortization.prop('id'), {
2426                            chart: {
2427                                animation: animations,
2428                                margin: [5, 0, 20, 50],
2429                                styledMode: true
2430                            },
2431                            title: {
2432                                text: null
2433                            },
2434                            xAxis: {
2435                                type: 'datetime'
2436                            },
2437                            yAxis: {
2438                                title: {
2439                                    text: null
2440                                },
2441                                tickPixelInterval: 30,
2442                                endOnTick: false
2443                            },
2444                            credits: {
2445                                enabled: false
2446                            },
2447                            tooltip: {
2448                                xDateFormat: '%B %Y',
2449                                shared: true,
2450                                valuePrefix: '$',
2451                                animation: animations,
2452                                valueDecimals: 2
2453                            },
2454                            legend: {
2455                                enabled: false
2456                            },
2457                            series: [{
2458                                    name: 'Total Principal',
2459                                    data: principalData_4,
2460                                    type: 'column'
2461                                }, {
2462                                    name: 'Total Interest',
2463                                    data: interestData_4,
2464                                    type: 'column'
2465                                }, {
2466                                    name: 'Balance',
2467                                    data: balanceData_4
2468                                }],
2469                            plotOptions: {
2470                                column: {
2471                                    stacking: 'normal',
2472                                    //pointPadding: 0,
2473                                    //borderWidth:0,
2474                                    //shadow: false,
2475                                    animation: animations
2476                                },
2477                                series: {
2478                                    animation: animations
2479                                }
2480                            }
2481                        });
2482                    }
2483                }
2484            };
2485            var input = new PaymentInput();
2486            input.amount = getFloat($amt.val());
2487            input.homeValue = getFloat($hp.val());
2488            input.rate = getFloat($rate.val());
2489            input.years = parseInt($years.val());
2490            input.insurance = getFloat($insurance.val());
2491            input.tax = getFloat($taxAmt.val());
2492            input.hoa = getFloat($hoa.val());
2493            input.monthStart = parseInt($startMonth.val());
2494            input.yearStart = parseInt($startYear.val());
2495            input.productType = parseInt($productType.val());
2496            var mipRate = getFloat($mipRate.val());
2497            if (mipRate) {
2498                input.fhaAdjustment = new FhaAdjustment();
2499                input.fhaAdjustment.mipRate = new FhaMipRate;
2500                input.fhaAdjustment.mipRate.rate = mipRate;
2501            }
2502            var pmiRate = getFloat($pmiRate.val());
2503            if (pmiRate) {
2504                input.pmiAdjustment = new PmiAdjustment();
2505                input.pmiAdjustment.pmiRate = new PmiRate();
2506                input.pmiAdjustment.pmiRate.rate = pmiRate;
2507            }
2508            input.includePmi = parseInt($includePmi.val()) == 1;
2509            var schedule = getAmortizationSchedule(input);
2510            displayResult(schedule);
2511        }
2512        calculators.setupAmortizationImage = setupAmortizationImage;
2513        function setupCompareImage(selector, settings) {
2514            var $calc = $(selector);
2515            $calc.find('[data-toggle="popover"]').popover({
2516                trigger: 'focus',
2517                placement: 'top'
2518            });
2519            var $amt = $calc.find('.rate-calc-amount');
2520            var $rate1 = $calc.find('.rate-calc-rate-1');
2521            var $years1 = $calc.find('.rate-calc-years-1');
2522            var $rate2 = $calc.find('.rate-calc-rate-2');
2523            var $years2 = $calc.find('.rate-calc-years-2');
2524            var $chartCompare = $calc.find('.compare-chart');
2525            var displayResult = function (calc1Results, calc2Results) {
2526                var animations = settings.disableAnimation === true ? false : true;
2527                var compareChart = null;
2528                if (settings.showChart && $chartCompare.length > 0) {
2529                    var loan1Data_3 = [];
2530                    //let loan1PrincipalData = [];
2531                    //let loan1InterestData = [];
2532                    var loan2Data_3 = [];
2533                    //let loan2PrincipalData = [];
2534                    //let loan2InterestData = [];
2535                    _.each(calc1Results.payments, function (payment, i) {
2536                        if (settings.showMonthly || (settings.showYearly && (i + 1) % 12 == 0)) {
2537                            loan1Data_3.push([payment.paymentDate.getTime(), payment.totalPrincipal + payment.totalInterest]);
2538                            //loan1PrincipalData.push([payment.paymentDate.getTime(), payment.totalPrincipal]);
2539                            //loan1InterestData.push([payment.paymentDate.getTime(), payment.totalInterest]);
2540                        }
2541                    });
2542                    _.each(calc2Results.payments, function (payment, i) {
2543                        if (settings.showMonthly || (settings.showYearly && (i + 1) % 12 == 0)) {
2544                            loan2Data_3.push([payment.paymentDate.getTime(), payment.totalPrincipal + payment.totalInterest]);
2545                            //loan2PrincipalData.push([payment.paymentDate.getTime(), payment.totalPrincipal]);
2546                            //loan2InterestData.push([payment.paymentDate.getTime(), payment.totalInterest]);
2547                        }
2548                    });
2549                    console.log('loan 1 data', loan1Data_3);
2550                    console.log('loan 2 data', loan2Data_3);
2551                    if (compareChart != null) {
2552                        compareChart.series[0].setData(loan1Data_3, false, false);
2553                        //compareChart.series[0].setData(loan1PrincipalData, false, false);
2554                        //compareChart.series[1].setData(loan1InterestData, false, false);                        
2555                        compareChart.series[1].setData(loan2Data_3, true, false);
2556                        //compareChart.series[2].setData(loan2PrincipalData, false, false);
2557                        //compareChart.series[3].setData(loan2InterestData, true, false);  
2558                    }
2559                    else {
2560                        compareChart = Highcharts.chart($chartCompare.prop('id'), {
2561                            chart: {
2562                                animation: animations,
2563                                margin: [20, 10, 35, 45],
2564                                spacing: [0, 0, 0, 0],
2565                                styledMode: true
2566                            },
2567                            title: {
2568                                text: null
2569                            },
2570                            xAxis: {
2571                                type: 'datetime'
2572                            },
2573                            yAxis: {
2574                                title: {
2575                                    text: null
2576                                }
2577                            },
2578                            credits: {
2579                                enabled: false
2580                            },
2581                            tooltip: {
2582                                xDateFormat: '%B %Y',
2583                                shared: true,
2584                                valuePrefix: '$',
2585                                valueDecimals: 2,
2586                                animation: animations,
2587                                useHTML: !animations,
2588                                headerFormat: '<span style="font-size: 12px;font-weight: bold;">Total Principal and Interest</span><br /><span style="font-size: 10px">{point.key}</span><br/>'
2589                            },
2590                            legend: {
2591                                enabled: true,
2592                                verticalAlign: 'top',
2593                                useHTML: !animations
2594                            },
2595                            series: [{
2596                                    name: 'Loan 1',
2597                                    data: loan1Data_3,
2598                                    type: 'areaspline'
2599                                }, {
2600                                    name: 'Loan 2',
2601                                    data: loan2Data_3,
2602                                    type: 'areaspline'
2603                                }],
2604                            //series: [{
2605                            //    name: 'Loan 1 Principal',
2606                            //    data: loan1PrincipalData,
2607                            //    type: 'areaspline',
2608                            //    stack: 'loan1'
2609                            //}, {
2610                            //    name: 'Loan 1 Interest',
2611                            //    data: loan1InterestData,
2612                            //    type: 'areaspline',
2613                            //    stack: 'loan1'
2614                            //}, {
2615                            //    name: 'Loan 2 Principal',
2616                            //    data: loan2PrincipalData,
2617                            //    type: 'areaspline',
2618                            //    stack: 'loan2'
2619                            //}, {
2620                            //    name: 'Loan 2 Interest',
2621                            //    data: loan2InterestData,
2622                            //    type: 'areaspline',
2623                            //    stack: 'loan2'
2624                            //}],
2625                            plotOptions: {
2626                                areaspline: {
2627                                    //stacking: 'normal',
2628                                    fillOpacity: 0.5
2629                                },
2630                                series: {
2631                                    animation: animations
2632                                }
2633                            }
2634                        });
2635                    }
2636                    //var pointIndex = (compareChart.series[0].points.length < compareChart.series[1].points.length
2637                    //  ? compareChart.series[0].points.length
2638                    //  : compareChart.series[1].points.length) - 1;
2639                    //var points = [
2640                    //  compareChart.series[0].points[pointIndex], compareChart.series[1].points[pointIndex]
2641                    //];
2642                    //var pointIndex = (compareChart.series[0].points.length < compareChart.series[3].points.length
2643                    //    ? compareChart.series[0].points.length
2644                    //    : compareChart.series[3].points.length) - 1;                    
2645                    //var points = [
2646                    //    compareChart.series[0].points[pointIndex], compareChart.series[1].points[pointIndex],
2647                    //    compareChart.series[2].points[pointIndex], compareChart.series[3].points[pointIndex]
2648                    //];                    
2649                    //compareChart.tooltip.refresh(points);
2650                }
2651            };
2652            var calc1 = new PaymentInput();
2653            calc1.amount = getFloat($amt.val());
2654            calc1.homeValue = getFloat($amt.val());
2655            calc1.rate = getFloat($rate1.val());
2656            calc1.years = parseInt($years1.val());
2657            var calc2 = new PaymentInput();
2658            calc2.amount = getFloat($amt.val());
2659            calc2.homeValue = getFloat($amt.val());
2660            calc2.rate = getFloat($rate2.val());
2661            calc2.years = parseInt($years2.val());
2662            displayResult(getAmortizationSchedule(calc1), getAmortizationSchedule(calc2));
2663        }
2664        calculators.setupCompareImage = setupCompareImage;
2665        function setupExtraPaymentImage(selector, settings) {
2666            var $calc = $(selector);
2667            $calc.find('[data-toggle="popover"]').popover({
2668                trigger: 'focus',
2669                placement: 'top'
2670            });
2671            var $amt = $calc.find('.rate-calc-amount');
2672            var $rate = $calc.find('.rate-calc-rate');
2673            var $years = $calc.find('.rate-calc-years');
2674            var $extraPayment = $calc.find('.rate-calc-extra-payment');
2675            var $desiredLengthYears = $calc.find('.rate-calc-desired-years');
2676            var $startMonth = $calc.find('.rate-calc-month');
2677            var $startYear = $calc.find('.rate-calc-year');
2678            var $chartCompareAmortization = $calc.find('.amortization-compare-chart');
2679            var displayResult = function (origResults, extraResults) {
2680                var dateDiff = moment.duration(moment(origResults.paymentInfo.payoffDate)
2681                    .diff(moment(extraResults.paymentInfo.payoffDate)));
2682                var compareChart = null;
2683                if (settings.showChart && $chartCompareAmortization.length > 0) {
2684                    var origData_3 = [];
2685                    var newData_3 = [];
2686                    _.each(origResults.payments, function (payment, i) {
2687                        if (settings.showMonthly || (settings.showYearly && (i + 1) % 12 == 0)) {
2688                            origData_3.push([payment.paymentDate.getTime(), payment.balance]);
2689                        }
2690                    });
2691                    _.each(extraResults.payments, function (payment, i) {
2692                        if (settings.showMonthly || (settings.showYearly && (i + 1) % 12 == 0)) {
2693                            newData_3.push([payment.paymentDate.getTime(), payment.balance]);
2694                        }
2695                    });
2696                    var animations = settings.disableAnimation === true ? false : true;
2697                    if (compareChart != null) {
2698                        compareChart.series[0].setData(origData_3, false, false);
2699                        compareChart.series[1].setData(newData_3, true, false);
2700                    }
2701                    else {
2702                        compareChart = Highcharts.chart($chartCompareAmortization.prop('id'), {
2703                            chart: {
2704                                animation: animations,
2705                                margin: [20, 10, 35, 45],
2706                                spacing: [0, 0, 0, 0],
2707                                styledMode: true
2708                            },
2709                            title: {
2710                                text: null
2711                            },
2712                            xAxis: {
2713                                type: 'datetime'
2714                            },
2715                            yAxis: {
2716                                title: {
2717                                    text: null
2718                                }
2719                            },
2720                            credits: {
2721                                enabled: false
2722                            },
2723                            tooltip: {
2724                                xDateFormat: '%B %Y',
2725                                shared: true,
2726                                valuePrefix: '$',
2727                                valueDecimals: 0,
2728                                animation: animations,
2729                                headerFormat: '<span style="font-size: 12px;font-weight: bold;">Remaining Balance</span><br /><span style="font-size: 10px">{point.key}</span><br/>'
2730                            },
2731                            legend: {
2732                                enabled: true,
2733                                verticalAlign: 'top',
2734                                useHTML: !animations
2735                            },
2736                            series: [{
2737                                    name: 'Original',
2738                                    data: origData_3,
2739                                    type: 'line'
2740                                }, {
2741                                    name: 'With Extra Payments',
2742                                    data: newData_3,
2743                                    type: 'line'
2744                                }],
2745                            plotOptions: {
2746                                series: {
2747                                    animation: animations
2748                                }
2749                            }
2750                        });
2751                    }
2752                }
2753            };
2754            var amt = getFloat($amt.val());
2755            var extraPayment = getFloat($extraPayment.val());
2756            if (extraPayment > amt) {
2757                extraPayment = amt;
2758                $extraPayment.val(numberWithCommas(extraPayment));
2759            }
2760            var calc1 = new PaymentInput();
2761            calc1.amount = amt;
2762            calc1.homeValue = getFloat($amt.val());
2763            calc1.rate = getFloat($rate.val());
2764            calc1.years = parseInt($years.val());
2765            calc1.monthStart = parseInt($startMonth.val());
2766            calc1.yearStart = parseInt($startYear.val());
2767            var calc2 = new PaymentInput();
2768            calc2.amount = amt;
2769            calc2.homeValue = getFloat($amt.val());
2770            calc2.rate = getFloat($rate.val());
2771            calc2.years = parseInt($years.val());
2772            calc2.monthStart = parseInt($startMonth.val());
2773            calc2.yearStart = parseInt($startYear.val());
2774            calc2.paymentExtraAmount = extraPayment;
2775            displayResult(getAmortizationSchedule(calc1), getAmortizationSchedule(calc2));
2776        }
2777        calculators.setupExtraPaymentImage = setupExtraPaymentImage;
2778        function getAmortizationCalcParametersForQs(selector) {
2779            var $calc = $(selector);
2780            var $hp = $calc.find('.rate-calc-price');
2781            var $amt = $calc.find('.rate-calc-amount');
2782            var $rate = $calc.find('.rate-calc-rate');
2783            var $years = $calc.find('.rate-calc-years');
2784            var $insurance = $calc.find('.rate-calc-ins');
2785            var $taxAmt = $calc.find('.rate-calc-tax-amt');
2786            var $hoa = $calc.find('.rate-calc-hoa');
2787            var $startMonth = $calc.find('.rate-calc-month');
2788            var $startYear = $calc.find('.rate-calc-year');
2789            return "hp=".concat(getFloat($hp.val()), "&ir=").concat(getFloat($rate.val()), "&y=").concat($years.val(), "&la=").concat(getFloat($amt.val()), "&sm=").concat(getFloat($startMonth.val()), "&sy=").concat(getFloat($startYear.val()), "&i=").concat(getFloat($insurance.val()), "&t=").concat(getFloat($taxAmt.val()), "&hoa=").concat(getFloat($hoa.val()));
2790        }
2791        calculators.getAmortizationCalcParametersForQs = getAmortizationCalcParametersForQs;
2792        function getCompareCalcParametersForQs(selector) {
2793            var $calc = $(selector);
2794            var $amt = $calc.find('.rate-calc-amount');
2795            var $rate1 = $calc.find('.rate-calc-rate-1');
2796            var $years1 = $calc.find('.rate-calc-years-1');
2797            var $rate2 = $calc.find('.rate-calc-rate-2');
2798            var $years2 = $calc.find('.rate-calc-years-2');
2799            return "la=".concat(getFloat($amt.val()), "&r1=").concat(getFloat($rate1.val()), "&y1=").concat($years1.val(), "&r2=").concat(getFloat($rate2.val()), "&y2=").concat($years2.val());
2800        }
2801        calculators.getCompareCalcParametersForQs = getCompareCalcParametersForQs;
2802        function getExtraPaymentCalcParametersForQs(selector) {
2803            var $calc = $(selector);
2804            var $amt = $calc.find('.rate-calc-amount');
2805            var $rate = $calc.find('.rate-calc-rate');
2806            var $years = $calc.find('.rate-calc-years');
2807            var $extraPayment = $calc.find('.rate-calc-extra-payment');
2808            var $extraPaymentType = $calc.find('.rate-calc-ep-type');
2809            return "la=".concat(getFloat($amt.val()), "&r=").concat(getFloat($rate.val()), "&y=").concat($years.val(), "&ep=").concat(getFloat($extraPayment.val()), "&ept=").concat($extraPaymentType.val());
2810        }
2811        calculators.getExtraPaymentCalcParametersForQs = getExtraPaymentCalcParametersForQs;
2812        function formatDuration(minutes) {
2813            if (minutes == 0) {
2814                return '--';
2815            }
2816            var duration = moment.duration(minutes, 'second');
2817            var retVal = '';
2818            if (duration.years() > 0) {
2819                retVal += "".concat(duration.years(), " year");
2820                if (duration.years() > 1) {
2821                    retVal += 's';
2822                }
2823            }
2824            if (duration.months() > 0) {
2825                if (retVal.length > 0) {
2826                    retVal += ', ';
2827                }
2828                retVal += "".concat(duration.months(), " month");
2829                if (duration.months() > 1) {
2830                    retVal += 's';
2831                }
2832            }
2833            return retVal;
2834        }
2835        calculators.formatDuration = formatDuration;
2836        function formatFrequency(frequency) {
2837            if (typeof (frequency) == 'string') {
2838                frequency = parseInt(frequency);
2839            }
2840            switch (frequency) {
2841                case PaymentFrequency.AcceleratedBiWeekly:
2842                case PaymentFrequency.BiWeekly:
2843                    return "Bi-Weekly";
2844                case PaymentFrequency.Monthly:
2845                    return "Monthly";
2846            }
2847            return "";
2848        }
2849        calculators.formatFrequency = formatFrequency;
2850        function getMinutesSaved(originalLoan, newLoan) {
2851            if (originalLoan == null || originalLoan.paymentInfo == null || newLoan == null || newLoan.paymentInfo == null) {
2852                return 0;
2853            }
2854            var msDate = Math.abs(originalLoan.paymentInfo.payoffDate.getTime() - newLoan.paymentInfo.payoffDate.getTime());
2855            return msDate / 1000;
2856        }
2857        function getMinutesSavedPct(originalLoan, newLoan) {
2858            var timeSaved = getMinutesSaved(originalLoan, newLoan);
2859            if (timeSaved <= 0) {
2860                return 0;
2861            }
2862            var originalLength = Math.abs(originalLoan.paymentInfo.payoffDate.getTime() - originalLoan.paymentInfo.startDate.getTime());
2863            return timeSaved / (originalLength / 1000);
2864        }
2865        function getInterestSaved(originalLoan, newLoan) {
2866            if (originalLoan == null || originalLoan.paymentInfo == null || newLoan == null || newLoan.paymentInfo == null) {
2867                return 0;
2868            }
2869            return originalLoan.paymentInfo.interest - newLoan.paymentInfo.interest;
2870        }
2871        function getInterestSavedPct(originalLoan, newLoan) {
2872            var interestSaved = getInterestSaved(originalLoan, newLoan);
2873            if (interestSaved <= 0) {
2874                return 0;
2875            }
2876            return interestSaved / originalLoan.paymentInfo.interest;
2877        }
2878    }
2878)(calculators = mnd.calculators || (mnd.calculators = {}));
2879})(mnd || (mnd = {}));
2880//# sourceMappingURL=calc.js.map

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.