1(function () { 2'use strict'; 3 4function initCalculator(root) { 5 var $root = $(root); 6 7 function $c(name) { return $root.find('[data-calc="' + name + '"]'); } 8 function el(name) { return $c(name)[0]; } 9 10 var currencySymbol = $c('currencySymbol').val() || ''; 11 var currency = (currencySymbol === '\u00a3') ? 'GBP' : 'EUR'; 12 var cultureValue = $c('cultureAll').val() || ''; 13 var intDebounceTime = 500; 14 var pendingRequest = null; 15 16 // Trigger initial change to load default loan values 17 $c('loansInput').trigger('change'); 18 19 var intMaxAmount = parseInt($c('RequiredLoanAmt').attr('max')); 20 var maxAmount = currencySymbol + numberWithCommas(intMaxAmount); 21 $c('MaxAmount').html(maxAmount); 22 23 // No of repayments 24 var RequiredTerm = parseInt($c('RequiredTerm').val()); 25 var noWeeklyRepayments = parseInt((RequiredTerm / 12) * 52); 26 $c('noWeeklyRepayments').html(noWeeklyRepayments); 27 $c('nofortnightlyRepayments').html(parseInt(noWeeklyRepayments / 2)); 28 $c('noFourWeeklyRepayments').html(parseInt(noWeeklyRepayments / 4)); 29 $c('noMonthlyRepayments').html(RequiredTerm); 30 31 updateCalculation(); 32 33 function updateMinTerm() { 34 var strMonths = $c('calcMonthsText').val(); 35 var strMonth = $c('calcMonthText').val(); 36 var strMonthsUse = strMonths; 37 var strYears = $c('calcYearsText').val(); 38 var strYear = $c('calcYearText').val(); 39 var strYearsUse = strYears; 40 41 var intTermInMonths = parseInt($c('RequiredTerm').attr('min')); 42 if (intTermInMonths == 1) { strMonthsUse = strMonth; } 43 var minTerm = intTermInMonths + ' ' + strMonthsUse; 44 if (intTermInMonths > 11) { 45 var intTermInYears = intTermInMonths / 12; 46 if (intTermInYears == 1) { strYearsUse = strYear; } 47 minTerm = intTermInMonths + ' ' + strMonthsUse + ' (' + intTermInYears + ' ' + strYearsUse + ')'; 48 } 49 $c('MinTerm').html(minTerm); 50 } 51 52 function updateMaxTerm() { 53 var strMonths = $c('calcMonthsText').val(); 54 var strMonth = $c('calcMonthText').val(); 55 var strMonthsUse = strMonths; 56 var strYears = $c('calcYearsText').val(); 57 var strYear = $c('calcYearText').val(); 58 var strYearsUse = strYears; 59 60 var intTermInMonths = parseInt($c('RequiredTerm').attr('max')); 61 if (intTermInMonths == 1) { strMonthsUse = strMonth; } 62 var maxTermStr = intTermInMonths + ' ' + strMonthsUse; 63 if (intTermInMonths > 11) { 64 var intTermInYears = intTermInMonths / 12; 65 if (intTermInYears == 1) { strYearsUse = strYear; } 66 maxTermStr = intTermInMonths + ' ' + strMonthsUse + ' (' + intTermInYears + ' ' + strYearsUse + ')'; 67 } 68 $c('MaxTerm').html(maxTermStr); 69 } 70 71 // Tab change 72 $root.find('[data-calc="calcInputNav"]').find('a').on('show.bs.tab', function () { 73 console.log("show.bs.tab"); 74 // Need this after calculator changes for some reason 75 $(event.target).closest('[data-calc="calcInputNav"]').children('li').removeClass('active'); 76 $(event.target).closest('li').addClass('active'); 77 }); 78 79 // Loan amount input validation 80 var tbRequiredLoanAmtInput = el('RequiredLoanAmt'); 81 82 if (tbRequiredLoanAmtInput) { 83 tbRequiredLoanAmtInput.addEventListener('keyup', debounce(function (e) { 84 var max = parseInt(tbRequiredLoanAmtInput.max); 85 var min = parseInt(tbRequiredLoanAmtInput.min); 86 var currentValue = parseInt(tbRequiredLoanAmtInput.value); 87 88 if (currentValue > max) { 89 $c('validationRequiredLoanAmt').text('The maximum loan amount is ' + currencySymbol + ' ' + max); 90 tbRequiredLoanAmtInput.value = max; 91 updateCalculation(); 92 } else if (currentValue < min) { 93 $c('validationRequiredLoanAmt').text('The minimum loan amount is ' + currencySymbol + ' ' + min); 94 updateCalculation(); 95 } else if (e.keyCode === 13) { 96 if (currentValue > max) { 97 $c('validationRequiredLoanAmt').text('The maximum loan amount is ' + currencySymbol + ' ' + max); 98 tbRequiredLoanAmtInput.value = max; 99 updateCalculation(); 100 } else if (currentValue < min) { 101 $c('validationRequiredLoanAmt').text('The minimum loan amount is ' + currencySymbol + ' ' + min); 102 tbRequiredLoanAmtInput.value = min; 103 updateCalculation(); 104 } else { 105 $c('validationRequiredLoanAmt').html(' '); 106 updateCalculation(); 107 } 108 } else { 109 $c('validationRequiredLoanAmt').html(' '); 110 updateCalculation(); 111 } 112 }, intDebounceTime)); 113 114 tbRequiredLoanAmtInput.addEventListener('keydown', function (e) { 115 var max = parseInt(tbRequiredLoanAmtInput.max); 116 var min = parseInt(tbRequiredLoanAmtInput.min); 117 var currentValue = parseInt(tbRequiredLoanAmtInput.value); 118 if (e.keyCode === 13) { 119 if (currentValue > max) { 120 $c('validationRequiredLoanAmt').text('The maximum loan amount is ' + currencySymbol + ' ' + max); 121 tbRequiredLoanAmtInput.value = max; 122 updateCalculation(); 123 } else if (currentValue < min) { 124 $c('validationRequiredLoanAmt').text('The minimum loan amount is ' + currencySymbol + ' ' + min); 125 tbRequiredLoanAmtInput.value = min; 126 updateCalculation(); 127 } else { 128 $c('validationRequiredLoanAmt').html(' '); 129 updateCalculation(); 130 } 131 } 132 }); 133 } 134 135 // Term input validation 136 var tbRequiredTermInput = el('RequiredTerm'); 137 138 if (tbRequiredTermInput) { 139 tbRequiredTermInput.addEventListener('keyup', debounce(function (e) { 140 var max = parseInt(tbRequiredTermInput.max); 141 var min = parseInt(tbRequiredTermInput.min); 142 var currentValue = parseInt(tbRequiredTermInput.value); 143 144 if (currentValue > max) { 145 $c('validationRequiredTerm').text('The maximum term is ' + max + ' months'); 146 tbRequiredTermInput.value = max; 147 updateCalculation(); 148 } else if (currentValue < min) { 149 $c('validationRequiredTerm').text('The minimum term is ' + min + ' months'); 150 updateCalculation(); 151 } else if (e.keyCode === 13) { 152 if (currentValue > max) { 153 $c('validationRequiredTerm').text('The maximum term is ' + max + ' months'); 154 tbRequiredTermInput.value = max; 155 updateCalculation(); 156 } else if (currentValue < min) { 157 $c('validationRequiredTerm').text('The minimum term is ' + min + ' months'); 158 tbRequiredTermInput.value = min; 159 updateCalculation(); 160 } else { 161 $c('validationRequiredTerm').html(' '); 162 updateCalculation(); 163 } 164 } else { 165 $c('validationRequiredTerm').html(' '); 166 updateCalculation(); 167 } 168 }, intDebounceTime)); 169 170 tbRequiredTermInput.addEventListener('keydown', function (e) { 171 var max = parseInt(tbRequiredTermInput.max); 172 var min = parseInt(tbRequiredTermInput.min); 173 var currentValue = parseInt(tbRequiredTermInput.value); 174 if (e.keyCode === 13) { 175 if (currentValue > max) { 176 $c('validationRequiredTerm').text('The maximum term is ' + max + ' months'); 177 tbRequiredTermInput.value = max; 178 updateCalculation(); 179 } else if (currentValue < min) { 180 $c('validationRequiredTerm').text('The minimum term is ' + min + ' months'); 181 tbRequiredTermInput.value = min; 182 updateCalculation(); 183 } else { 184 $c('validationRequiredTerm').html(' '); 185 updateCalculation(); 186 } 187 } 188 }); 189 } 190 191 // Handle dropdown change 192 $c('loansInput').on('change', function () { 193 var $selected = $(this).find('option:selected'); 194 var maxLoanAmt = parseInt($selected.data('max-amount')) || 50000; 195 var minLoanAmt = parseInt($selected.data('min-amount')) || 100; 196 var maxTermVal = parseInt($selected.data('max-term')) || 60; 197 var minTermVal = parseInt($selected.data('min-term')) || 1; 198 var startAmount = parseInt($selected.data('start-amount')) || 10000; 199 var startTerm = parseInt($selected.data('start-term')) || 36; 200 var loanStep = parseInt($selected.data('loan-step')) || 100; 201 var termStep = parseInt($selected.data('term-step')) || 1; 202 var terms = $selected.data('terms') || ''; 203 var applyLink = $selected.data('apply-link') || ''; 204 var applyTarget = $selected.data('apply-target') || '_self'; 205 var repApr = parseFloat($selected.data('representative-apr')) || 0; 206 207 $c('RequiredLoanAmt').attr('max', maxLoanAmt).attr('min', minLoanAmt).attr('step', loanStep).val(startAmount); 208 $c('RequiredTerm').attr('max', maxTermVal).attr('min', minTermVal).attr('step', termStep).val(startTerm); 209 210 $c('applyWeekly').attr('href', applyLink).attr('target', applyTarget); 211 $c('applyBiWeekly').attr('href', applyLink).attr('target', applyTarget); 212 $c('applyFourWeekly').attr('href', applyLink).attr('target', applyTarget); 213 $c('applyMonthly').attr('href', applyLink).attr('target', applyTarget); 214 215 if (terms) { $c('TandC').html(terms); } 216 217 $c('selectedRate').val($(this).val()); 218 219 // Max Term display 220 var strMonths = $c('calcMonthsText').val(); 221 var strMonth = $c('calcMonthText').val(); 222 var strMonthsUse = strMonths; 223 var strYears = $c('calcYearsText').val(); 224 var strYear = $c('calcYearText').val(); 225 var strYearsUse = strYears; 226 227 if (maxTermVal == 1) { strMonthsUse = strMonth; } 228 var maxTermDisplay = maxTermVal + ' ' + strMonthsUse; 229 if (maxTermVal > 11) { 230 var yrs = maxTermVal / 12; 231 if (yrs == 1) { strYearsUse = strYear; } 232 maxTermDisplay = maxTermVal + ' ' + strMonthsUse + ' (' + yrs + ' ' + strYearsUse + ')'; 233 } 234 $c('MaxTerm').html(maxTermDisplay); 235 $c('MaxAmount').html(currencySymbol + numberWithCommas(maxLoanAmt)); 236 237 $root.find('.representativeApr').html(repApr); 238 $c('loanPurposeId').val($selected.data('loan-purpose-id') || ''); 239 240 $c('validationRequiredLoanAmt').html(' '); 241 $c('validationRequiredTerm').html(' '); 242 243 updateCalculation(); 244 }); 245 246 // Step up/down â scoped to this instance 247 $root.on('click', '[data-calc-step-down]', function () { 248 $c('validationRequiredLoanAmt').html(' '); 249 $c('validationRequiredTerm').html(' '); 250 var target = $(this).attr('data-calc-step-down'); 251 var input = el(target); 252 if (input) { input.stepDown(); updateCalculation(); } 253 }); 254 255 $root.on('click', '[data-calc-step-up]', function () { 256 $c('validationRequiredLoanAmt').html(' '); 257 $c('validationRequiredTerm').html(' '); 258 var target = $(this).attr('data-calc-step-up'); 259 var input = el(target); 260 if (input) { input.stepUp(); updateCalculation(); } 261 }); 262 263 function updateCalculation() { 264 var showCents = $c('showCents').val(); 265 var cents = 0; 266 if (showCents == 'True') { cents = 2; } 267 268 var loansInput = el('loansInput'); 269 if (!loansInput) { return; } 270 var strLoanInputValue = loansInput.value; 271 var strLoanInput = strLoanInputValue.split('|')[0]; 272 var strLoanInputName = strLoanInputValue.split('|')[1]; 273 274 var amountRangeValues = findAIRRange($c('RequiredLoanAmt').val(), $c('VarCalcAIRRanges').val(), strLoanInputName); 275 var parts = amountRangeValues.split('|'); 276 var amountRangeAIR = parts[0]; 277 var amountRangeRepAIR = parts[1]; 278 var amountRangeMinTerm = parts[2]; 279 var amountRangeMaxTerm = parts[3]; 280 var amountRangeLoanPurposeID = parts[4]; 281 282 if ($c('currentAIRRangeInterest').length) { 283 $c('currentAIRRangeInterest').val(amountRangeAIR); 284 } 285 286 if (amountRangeMinTerm && amountRangeMinTerm.trim().length > 0) { 287 $c('RequiredTerm').attr('min', amountRangeMinTerm);
288 var termCurrentValueMin = $c('RequiredTerm').val(); 289 updateMinTerm(); 290 if (parseInt(termCurrentValueMin) < parseInt(amountRangeMinTerm)) { 291 $c('validationRequiredTerm').text('The minimum term is ' + amountRangeMinTerm + ' months'); 292 if (tbRequiredTermInput) { tbRequiredTermInput.value = amountRangeMinTerm; } 293 } 294 } else { 295 amountRangeMinTerm = tbRequiredTermInput ? parseInt(tbRequiredTermInput.min) : 1; 296 } 297 298 if (amountRangeMaxTerm && amountRangeMaxTerm.trim().length > 0) { 299 $c('RequiredTerm').attr('max', amountRangeMaxTerm); 300 var termCurrentValue = $c('RequiredTerm').val(); 301 updateMaxTerm(); 302 if (parseInt(termCurrentValue) > parseInt(amountRangeMaxTerm)) { 303 $c('validationRequiredTerm').text('The maximum term is ' + amountRangeMaxTerm + ' months'); 304 if (tbRequiredTermInput) { tbRequiredTermInput.value = amountRangeMaxTerm; } 305 } 306 } else { 307 amountRangeMaxTerm = tbRequiredTermInput ? parseInt(tbRequiredTermInput.max) : 60; 308 } 309 310 if (amountRangeLoanPurposeID && amountRangeLoanPurposeID.trim().length > 0) { 311 $c('loanPurposeId').val(amountRangeLoanPurposeID); 312 } 313 314 var a = { 315 RequiredLoanAmt: $c('RequiredLoanAmt').val(), 316 RequiredTerm: $c('RequiredTerm').val(), 317 SelectedRate: amountRangeAIR 318 }; 319 320 if (a.RequiredLoanAmt !== '' && a.RequiredTerm !== '' && a.SelectedRate !== '') { 321 if (pendingRequest !== null) { 322 pendingRequest.abort(); 323 } 324 325 pendingRequest = $.ajax({ 326 type: 'POST', 327 url: '/api/calculator/calculate', 328 data: a, 329 dataType: 'json', 330 success: function (e) { 331 var formatter = new Intl.NumberFormat(cultureValue, { 332 style: 'currency', 333 currency: currency, 334 minimumFractionDigits: cents, 335 maximumFractionDigits: cents 336 }); 337 338 $c('weeklyRepayment').html(e.WeeklyRepayment.toLocaleString(void 0, { minimumFractionDigits: cents, maximumFractionDigits: cents })); 339 $c('BiWeeklyRepayment').html(e.BiWeeklyRepayment.toLocaleString(void 0, { minimumFractionDigits: cents, maximumFractionDigits: cents })); 340 $c('FourWeeklyRepayment').html(e.FourWeeklyRepayment.toLocaleString(void 0, { minimumFractionDigits: cents, maximumFractionDigits: cents })); 341 $c('MonthlyRepayment').html(e.MonthlyRepayment.toLocaleString(void 0, { minimumFractionDigits: cents, maximumFractionDigits: cents })); 342 343 $c('weeklyApr').html(e.WeeklyApr + '%'); 344 $c('biWeeklyApr').html(e.BiWeeklyApr + '%'); 345 $c('FourWeeklyApr').html(e.FourWeeklyApr + '%'); 346 $c('MonthlyApr').html(e.MonthlyApr + '%'); 347 348 var reqTerm = parseInt($c('RequiredTerm').val()); 349 var wkRep = parseInt((reqTerm / 12) * 52); 350 $c('noWeeklyRepayments').html(wkRep); 351 $c('nofortnightlyRepayments').html(parseInt(wkRep / 2)); 352 $c('noFourWeeklyRepayments').html(parseInt(wkRep / 4)); 353 $c('noMonthlyRepayments').html(reqTerm); 354 355 // Term in months/years display 356 var mText = $c('calcMonthsText').val(); 357 var mSingle = $c('calcMonthText').val(); 358 var mUse = mText; 359 var yText = $c('calcYearsText').val(); 360 var ySingle = $c('calcYearText').val(); 361 var yUse = yText; 362 363 var reqMonths = parseInt($c('RequiredTerm').val()); 364 if (reqMonths == 1) { mUse = mSingle; } 365 var termDisplay = ''; 366 if (reqMonths > 11) { 367 var yrs = Math.floor(reqMonths / 12); 368 if (yrs == 1) { yUse = ySingle; } 369 var remainder = reqMonths % 12; 370 var remText = (remainder == 1) ? mSingle : mText; 371 if (remainder > 0) { 372 termDisplay = yrs + ' ' + yUse + ' and ' + remainder + ' ' + remText; 373 } else { 374 termDisplay = yrs + ' ' + yUse; 375 } 376 } else { 377 termDisplay = reqMonths + ' ' + mUse; 378 } 379 $c('RequiredTermInMonthsYears').html(termDisplay); 380 381 $c('weeklyTotal').html(formatter.format(e.WeeklyTotal)); 382 $c('BiWeeklyTotal').html(formatter.format(e.BiWeeklyTotal)); 383 $c('FourWeeklyTotal').html(formatter.format(e.FourWeeklyTotal)); 384 $c('MonthlyTotal').html(formatter.format(e.MonthlyTotal)); 385 386 var loanAmt = parseFloat($c('RequiredLoanAmt').val()); 387 $c('weeklyTotalCost').html(formatter.format(e.WeeklyTotal - loanAmt)); 388 $c('BiWeeklyTotalCost').html(formatter.format(e.BiWeeklyTotal - loanAmt)); 389 $c('FourWeeklyTotalCost').html(formatter.format(e.FourWeeklyTotal - loanAmt)); 390 $c('MonthlyTotalCost').html(formatter.format(e.MonthlyTotal - loanAmt)); 391 392 $c('spanRepresentativeAprWeekly').html(amountRangeRepAIR + '%'); 393 $c('spanRepresentativeAprBiWeekly').html(amountRangeRepAIR + '%'); 394 $c('spanRepresentativeAprFourWeekly').html(amountRangeRepAIR + '%'); 395 $c('spanRepresentativeAprMonthly').html(amountRangeRepAIR + '%'); 396 397 // Max Term in Months 398 var strMonths = $c('calcMonthsText').val(); 399 var strMonth = $c('calcMonthText').val(); 400 var strMonthsUse = strMonths; 401 var strYears = $c('calcYearsText').val(); 402 var strYear = $c('calcYearText').val(); 403 var strYearsUse = strYears; 404 405 var intTermInMonths = parseInt(amountRangeMaxTerm); 406 if (intTermInMonths == 1) { strMonthsUse = strMonth; } 407 var maxTermDisp = intTermInMonths + ' ' + strMonthsUse; 408 if (intTermInMonths > 11) { 409 var yrsM = intTermInMonths / 12; 410 if (yrsM == 1) { strYearsUse = strYear; } 411 maxTermDisp = intTermInMonths + ' ' + strMonthsUse + ' (' + yrsM + ' ' + strYearsUse + ')'; 412 } 413 $c('MaxTerm').html(maxTermDisp); 414 }, 415 complete: function () { 416 pendingRequest = null; 417 } 418 }); 419 } 420 } 421 422 // Apply button â Loan Enquiry Open Module 423 $root.find('.btnApply').on('mousedown', function () { 424 var loanPurposeId = parseInt($c('loanPurposeId').val()); 425 if (isNaN(loanPurposeId)) { return; } 426 427 var frequency = $root.find('.calcInputTab.active').attr('data-frequency'); 428 var term = parseInt($root.find('.loanRepaymentsNumber:visible').html()); 429
430 var spaInputs = { 431 inputGlobal: { 432 locale: $c('cultureAll').val(), 433 currency: $c('currencySymbol').val(), 434 cuName: $('meta[name="author"]').attr('content'), 435 assetsUri: window.location.origin + '/media/', 436 startUrl: location.href 437 }, 438 inputModule: { 439 loanAmount: parseInt($c('RequiredLoanAmt').val()), 440 loanRepayment: parseFloat($root.find('.mainRepayment:visible').html()), 441 loanFrequency: frequency, 442 loanTerm: term, 443 loanPurposeID: loanPurposeId 444 } 445 }; 446 447 localStorage.setItem('spaInputs', JSON.stringify(spaInputs)); 448 }); 449} 450 451function findAIRRange(intLoanAmtVal, strAIRFullRangeVal, strLoanInputNameVal) { 452 var result = ''; 453 if (!strAIRFullRangeVal) { return '||||'; } 454 var arrLoans = strAIRFullRangeVal.split('@@@@'); 455 456 for (var i = 0; i < arrLoans.length; i++) { 457 var arrRanges = arrLoans[i].split('####'); 458 for (var j = 0; j < arrRanges.length; j++) { 459 var parts = arrRanges[j].split('|'); 460 var from = parts[0], to = parts[1], air = parts[2], repAir = parts[3]; 461 var minTerm = parts[4], maxTerm = parts[5], purposeId = parts[6], heading = parts[7]; 462 463 if (heading == strLoanInputNameVal) { 464 if (parseInt(intLoanAmtVal) >= parseInt(from) && parseInt(intLoanAmtVal) <= parseInt(to)) { 465 result = air + '|' + repAir + '|' + minTerm + '|' + maxTerm + '|' + purposeId; 466 break; 467 } 468 if (j == 0 && parseInt(intLoanAmtVal) < parseInt(from)) { 469 result = air + '|' + repAir + '|' + minTerm + '|' + maxTerm + '|' + purposeId; 470 break; 471 } 472 if (j == (arrRanges.length - 1) && parseInt(intLoanAmtVal) > parseInt(to)) { 473 result = air + '|' + repAir + '|' + minTerm + '|' + maxTerm + '|' + purposeId; 474 break; 475 } 476 } 477 } 478 } 479 return result || '||||'; 480} 481 482function debounce(callback, wait) { 483 var timeout; 484 return function () { 485 var args = arguments; 486 var self = this; 487 clearTimeout(timeout); 488 timeout = setTimeout(function () { callback.apply(self, args); }, wait); 489 }; 490} 491 492function numberWithCommas(x) { 493 return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ','); 494} 495 496$(document).ready(function () { 497 $('[data-calc-type="varrate"]').each(function () { 498 initCalculator(this); 499 }); 500}); 501 502})();
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.