PageSourceSearch

https://heartlandcu.ie/Scripts/calculatorInputVarRate.js?v=936hc88oOA5eTQp-vRrxx3mFHO_TmN0dV3CLNUj7cRU

js heartlandcu.ie collected 2026-10-02 01:55:42 UTC 20,214 bytes, 502 lines download raw bytes

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.