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> <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> <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> <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.