1function handleBrokenSlider () { 2 let slider = $('.av-slider'); 3 if (!slider.hasClass('av-slider-broken')) { 4 slider.addClass('av-slider-broken'); 5 slider.find('.rangeslider-fill').css('width', '50%'); 6 slider.find('.rangeslider-handle').css('left', '50%'); 7 slider.find('.av-cta-container > a').attr('disabled', 'true').unbind(); 8 } 9} 10 11function emergencyTopbar (textsArr) { 12 var topbar = $(` 13 <div class='av-emergency-topbar'> 14 <div> 15 ${textsArr.issue} 16 <span id="av-topbar-wait-refresh">${textsArr.wait}</span> <span id="av-topbar-timer">10 ${textsArr.seconds}</span> 17 </div> 18 </div> 19 `); 20 $('#masthead').prepend(topbar); 21 let pageOffset = topbar.height() + parseInt(topbar.css('padding-top')) + parseInt(topbar.css('padding-bottom')) + parseInt($('.site-content').css('margin-top')); 22 $('.site-content').css('margin-top', pageOffset + 'px'); 23 let refreshTimer = 10; 24 let timerNode = $('#av-topbar-emergency-timer'); 25 const refreshInterval = setInterval(() => { 26 refreshTimer--; 27 timerNode.text(refreshTimer + ' ' + textsArr.seconds); 28 if (refreshTimer <= 0) { 29 clearInterval(refreshInterval); 30 $('#av-topbar-wait-refresh') 31 .text(textsArr.refresh) 32 .css('font-weight', 700) 33 .css('cursor', 'pointer') 34 .append($("<img src='/wp-content/themes/lendon.2/assets/images/arrow-right-red.svg' style='margin-left: 8px' alt='arrow right' />")) 35 .on('click', () => location.reload()); 36 37 timerNode.text(''); 38 } 39 }, 1000); 40} 41 42function floatingButtonPageMarginFix () { 43 $('#page').css('margin-bottom', window.innerWidth < 1000 ? '83px' : '0px'); 44} 45 46function getAmount () { 47 var amount = document.querySelector('.amount-display'); 48 var numericalAmount = parseInt(amount.value.replace(/ /g, '')); 49 return numericalAmount; 50} 51/* eslint-disable no-redeclare, no-unused-vars */ 52function JSObjectToJSONConverter (str) { 53 return str.replace(/(\s*?{\s*?|\s*?,\s*?)(['"])?([a-zA-Z0-9_]+)(['"])?:/g, '$1"$3":'); 54} 55 56/** 57 * Injects the inputs needed for proper calculation 58 * @param {SliderFeaturesConfig} sliderConfig 59 * @returns {void} 60 */ 61function injectProductFields (sliderConfig) { 62 if (typeof sliderConfig == 'undefined') { 63 return; 64 } 65 const $productInputsContainer = $('.product-fields'); 66 const installmentInputsHtml = `<div class='${sliderConfig.productName.toLowerCase()}'> 67 <input type="hidden" name="inst-duedate" id="inst-duedate"> 68 </div>`; 69 70 $productInputsContainer.append(installmentInputsHtml); 71} 72 73/** 74 * Enables and initializes the datepicker functionality with dynamic localization. 75 * @param {SliderFeaturesConfig} sliderConfig 76 * @returns {void} 77 */ 78function enableDatePicker (sliderConfig) { 79 if (typeof sliderConfig == 'undefined') { 80 return; 81 } 82 let lang = sliderConfig.language; 83 let timezone = sliderConfig.timezone; 84 let product = sliderConfig.productType; 85 86 let nameOfField = product == 2 ? 'inst-duedate' : 'creditline-payout-date'; 87 88 const duedateCalendar = new CF.Sliders.DueDateCalendar({ 89 translations: { 90 months: getMonthNames(lang), 91 nextMonth: avafinConfig.slider_translations['datepicker']['next_month'], 92 previousMonth: avafinConfig.slider_translations['datepicker']['previous_month'], 93 weekdays: getWeekdayNames(lang), 94 weekdaysShort: getWeekdayNames(lang, 'short'), 95 }, 96 setDefaultDate: sliderConfig.setDefaultDate, 97 product: product, 98 defaultDate: window.sessionStorage.getItem('sliderValuesFirstInstallmentDate') || null, 99 timezone: timezone, 100 selectTrigger: '#datepicker-apply-button', 101 }); 102 103 let updater = new CF.UnfinishedUpdater(); 104 105 const updateField = function () { 106 if (avafinConfig.slider_type == 'type_registration') { 107 const formatDate = (dateObj) => dateObj.toISOString().split('T')[0]; // to get smth like "1998-03-20" 108 let datePickerInput = $(`input[name='${nameOfField}']`); 109 datePickerInput.each((i, el) => { 110 $(el).attr('value', formatDate(duedateCalendar.selectedDate)); 111 }); 112 } 113 }; 114 updateField(); 115 116 const $dateContainer = $('.av-datepicker-container'); 117 const $openBtn = $('#av-datepicker-button'); 118 119 const $modal = $dateContainer.find('.datepicker-modal-container'); 120 121 const footerHtml = ` 122 <div class="datepicker-modal-footer"> 123 <button type="button" id="datepicker-apply-button" class="btn btn-primary"> 124 ${avafinConfig.slider_translations['datepicker']['confirm']} 125 </button> 126 </div>`; 127 $modal.append(footerHtml); 128 129 const headerHtml = ` 130 <div class="datepicker-modal-header">
131 <span class="datepicker-title">${avafinConfig.slider_translations['datepicker']['select_date_first_payment']}</span> 132 <button type="button" class="datepicker-close" aria-label="${avafinConfig.slider_translations['datepicker']['close']}">Ã</button> 133 </div> 134 `; 135 $modal.prepend(headerHtml); 136 137 // Ensure hidden on load 138 $dateContainer.removeClass('is-open'); 139 140 // Open/close when clicking the pencil button 141 $openBtn.on('click', function (e) { 142 e.preventDefault(); 143 e.stopPropagation(); 144 $dateContainer.toggleClass('is-open'); 145 146 if ($dateContainer.hasClass('is-open')) { 147 $('body').append('<div class="av-popup-backdrop"></div>'); 148 } else { 149 $('.av-popup-backdrop').remove(); 150 } 151 152 }); 153 154 // Close when clicking Apply 155 const $applyBtn = $('#datepicker-apply-button'); 156 157 $(document).on('click', function (e) { 158 if (!$(e.target).closest('.av-datepicker-container').length) { 159 $dateContainer.removeClass('is-open'); 160 $('.av-popup-backdrop').remove(); 161 } 162 }); 163 164 $modal.on('click', '.datepicker-close', function () { 165 $dateContainer.removeClass('is-open'); 166 $('.av-popup-backdrop').remove(); 167 }); 168 169 $applyBtn.on('click', function () { 170 updater.update(nameOfField, duedateCalendar.selectedDate.toISOString()); 171 let creditPayoutDateInput = $(`input[name='${nameOfField}']`); 172 creditPayoutDateInput.trigger('slider:changed-duedate', { 173 duedate: duedateCalendar.selectedDate, 174 }); 175 duedateCalendar.applySelectedDate(); 176 window.sessionStorage.setItem('sliderValuesFirstInstallmentDate', duedateCalendar.selectedDate); 177 updateField(); 178 179 $dateContainer.removeClass('is-open'); 180 $('.av-popup-backdrop').remove(); 181 }); 182} 183 184/** 185 * Returns an array of month names in the specified language. 186 * 187 * @param {string} language - BCP 47 language tag (e.g., 'en', 'pl', 'es'). 188 * @param {'long' | 'short' | 'narrow'} [format='long'] - The month representation format. 189 * @returns {string[]} Array containing month names from January to December. 190 */ 191function getMonthNames (language, format = 'long') { 192 const formatter = new Intl.DateTimeFormat(language, { month: 'long' }); 193 194 return Array.from({ length: 12 }, (_, monthIndex) => { 195 return formatter.format(new Date(2026, monthIndex, 1)); // fyi you can use every year, it's not relevant 196 }); 197} 198 199/** 200 * Returns an array of weekday names in the specified language. 201 * 202 * @param {string} language - BCP 47 language tag (e.g., 'en', 'pl', 'es'). 203 * @param {'long' | 'short' | 'narrow'} [format='long'] - The weekday representation format. 204 * @returns {string[]} Array containing weekday names. 205 */ 206function getWeekdayNames (language, format = 'long') { 207 const formatter = new Intl.DateTimeFormat(language, { weekday: format }); 208 209 return Array.from({ length: 7 }, (_, dayIndex) => { 210 return formatter.format(new Date(2026, 0, 5 + dayIndex)); // 5.01.2026 was a Monday 211 }); 212} 213 214/** 215 * Populates the repayment schedule modal with data from an installments array. 216 * Generates a table showing loan payment details including number, date, amounts, interest and fees. 217 * 218 * @param {SliderFeaturesConfig} sliderConfig 219 */ 220function repaymentScheduleModalPopulaton (sliderConfig) { 221 if (typeof sliderConfig == 'undefined') { 222 return; 223 } 224 let lang = sliderConfig.language; 225 let modalId = sliderConfig.repaymentSchedulePopupId; 226 let numbers = sliderConfig.repaymentScheduleNumeration; 227 228 const addCurrencyForRepaymentSchedule = (num) => { 229 if (sliderConfig.currencyPositionInvert) { 230 return `${sliderConfig.currency} ${num}`; 231 } else { 232 return `${num} ${sliderConfig.currency}`; 233 } 234 }; 235 236 $(`button[data-modal-id='${modalId}']`).on('click keydown', function () { 237 let tableString = `<table> 238 <thead> 239 <tr> 240 <td>${sliderConfig.translations.repaymentSchedule['number']}</td> 241 <td>${sliderConfig.translations.repaymentSchedule['payment_date']}</td> 242 <td>${sliderConfig.translations.repaymentSchedule['loan_amount']}</td> 243 <td>${sliderConfig.translations.repaymentSchedule['interest']}</td> 244 <td>${sliderConfig.translations.repaymentSchedule['opening_fee']}</td> 245 <td>${sliderConfig.translations.repaymentSchedule['amount_due']}</td> 246 </tr> 247 </thead> 248 <tbody> 249 `; 250 let total = 0;
251 prices.installments.forEach((installment, i) => { 252 tableString += '<tr>'; 253 let number = (numbers[i] ?? i + 1) + ' ' + sliderConfig.translations.repaymentSchedule['payment']; 254 let paymentDate = installment.date.toLocaleDateString(lang, { day: '2-digit', month: '2-digit', year: 'numeric' }); // That way it will always format it properly, I hope 255 let loanAmount = addCurrencyForRepaymentSchedule(installment.principal.toFixed(2)); 256 let interest = addCurrencyForRepaymentSchedule(installment.interest.toFixed(2)); 257 let openingFee = addCurrencyForRepaymentSchedule(installment.commission.toFixed(2)); 258 let amountDue = addCurrencyForRepaymentSchedule(installment.payment.toFixed(2)); 259 [ number, paymentDate, loanAmount, interest, openingFee, amountDue ].forEach(el => { 260 tableString += `<td>${el}</td>`; 261 }); 262 total += installment.payment; 263 264 tableString += '</tr>'; 265 }); 266 tableString += `<td></td> <td></td> <td></td> <td></td> <td></td> <td style='text-align: right'>${'$ ' + addCurrencyForRepaymentSchedule(total.toFixed(2))}</td>`; 267 tableString += '</tbody></table>'; 268 $(`div[data-modal-id='${modalId}'] .slider-modal-content`).html(tableString); 269 }); 270} 271 272/** 273 * Main loop that is dependent on loading CF Sliders Factory. 274 * Initializes date picker and payment schedules based on the configured behavior. 275 * @param {Object} cfObject - The CF object containing slider configuration data and functions from frontend 276 */ 277function avSliderMainDependentLoop (cfObject, sliderConfigs) { 278 enableDatePicker(sliderConfigs[avafinConfig.slider_behaviour_id]); 279 repaymentScheduleModalPopulaton(sliderConfigs[avafinConfig.slider_behaviour_id]); 280 281 if (avafinConfig.slider_behaviour_id === 'com_mx_tiendas_3b') { 282 let slider = cfObject.creditline.slider; 283 slider.setStaticAmount(sliderOptions.slider.creditline.amount_slider.default_value, false); 284 } 285} 286 287/** 288 * Class representing slider features configuration. 289 */ 290class SliderFeaturesConfig { 291 /** 292 * @param {Object} config 293 * @param {string} config.language - BCP 47 language tag (e.g., 'es-MX', 'es-ES'). 294 * @param {string} config.timezone - IANA timezone string (e.g., 'Europe/Madrid', 'America/Mexico_City'). 295 * @param {Object<string, any>} config.translations - Translations object. 296 * @param {string} config.repaymentSchedulePopupId - The ID or data attribute selector 297 * of the button/modal to trigger population. 298 * @param {1|2|3} config.productType - CF.product object (e.g. CF.Product.CREDITLINE) 299 * @param {string} config.productName - Product name (e.g. creditline) 300 * @param {Array<string|number>} config.repaymentScheduleNumeration - Optional array of numbers for numeration 301 */ 302 constructor ({ 303 language, 304 timezone, 305 repaymentSchedulePopupId, 306 productType, 307 productName, 308 repaymentScheduleNumeration, 309 currency, 310 currencyPositionInvert, 311 setDefaultDate, 312 }) { 313 /** @type {string} */ 314 this.language = language; 315 316 /** @type {string} */ 317 this.timezone = timezone; 318 319 /** @type {Object<string, any>} */ 320 this.translations = { 321 datepicker: avafinConfig.slider_translations['datepicker'], 322 repaymentSchedule: avafinConfig.slider_translations['repayment_schedule'], 323 }; 324 325 /** @type {string} */ 326 this.repaymentSchedulePopupId = repaymentSchedulePopupId; 327 328 /** @type {1|2|3} */ 329 this.productType = productType; 330 331 /** @type {string} */ 332 this.productName = productName; 333 334 /** @type {Array<string|number>} */ 335 this.repaymentScheduleNumeration = repaymentScheduleNumeration ?? []; 336 337 /** @type {string} */ 338 this.currency = currency; 339 340 /** @type {boolean} */ 341 this.currencyPositionInvert = currencyPositionInvert ?? false; 342 343 /** @type {function} */ 344 this.setDefaultDate = setDefaultDate; 345 } 346} 347 348const sliderFeaturesConfigs = function (CfProduct) { 349 return { 350 com_mx_crl: new SliderFeaturesConfig({ 351 language: 'es-MX', 352 timezone: 'America/Mexico_City', 353 repaymentSchedulePopupId: 'tabla-de-amortizacion', 354 productType: CfProduct.CREDITLINE, 355 productName: CfProduct.map(CfProduct.CREDITLINE), 356 repaymentScheduleNumeration: [ '1er', '2do', '3er', '4to', '5to', '6to', '7mo', '8vo', '9no', '10mo', '11vo', '12vo' ], 357 currency: '$', 358 currencyPositionInvert: true, 359 setDefaultDate: function (validDates) { 360 for (let i = 0; i < validDates.length; i++) { 361 if (validDates[i].getDate() === 15 || validDates[i].getDate() === 30) { 362 return validDates[i]; 363 } 364 } 365 }, 366 }), 367 com_mx_tiendas_3b: new SliderFeaturesConfig({ 368 language: 'es-MX', 369 timezone: 'America/Mexico_City', 370 repaymentSchedulePopupId: 'tabla-de-amortizacion', 371 productType: CfProduct.CREDITLINE, 372 productName: CfProduct.map(CfProduct.CREDITLINE), 373 repaymentScheduleNumeration: [ '1er', '2do', '3er', '4to', '5to', '6to', '7mo', '8vo', '9no', '10mo', '11vo', '12vo' ], 374 currency: '$', 375 currencyPositionInvert: true, 376 setDefaultDate: function (validDates) { 377 for (let i = 0; i < validDates.length; i++) { 378 if (validDates[i].getDate() === 15 || validDates[i].getDate() === 30) { 379 return validDates[i]; 380 } 381 } 382 }, 383 }), 384 com_es_plazos: new SliderFeaturesConfig({ 385 language: 'es-ES', 386 timezone: 'Europe/Madrid', 387 repaymentSchedulePopupId: 'tabla-de-amortizacion', 388 productType: CfProduct.INSTALLMENT, // INSTALLMENT 389 productName: CfProduct.map(CfProduct.INSTALLMENT), 390 currency: 'â¬', 391 setDefaultDate: function (validDates) { 392 // Backend validDates are from 15-40 days from now, so 15th element of array will be 30 days from now 393 return validDates[15]; 394 }, 395 }), 396 }; 397}; 398 399var prices, sf; 400//var sliderOptions = JSON.parse(JSObjectToJSONConverter(avafinConfig.options_cf_factory)); 401eval('var sliderOptions = ' + avafinConfig.options_cf_factory); 402prepareSliderVals(sliderOptions); 403 404if (avafinConfig.slider_behaviour_id === 'com_mx_tiendas_3b') { 405 const KEYS = [ 'product_key', 'product_name', 'product_cost', 'loan_amount', 'validity', 'store_name' ]; 406 const url = new URL(window.location.href); 407 const qs = new URLSearchParams(url.search); 408 let storedAny = false;
409 let everyKeyFoundInURL = true; 410 let normalized; 411 // Finding keys in URL, parsing them 412 for (let key of KEYS) { 413 let raw = qs.get(key); 414 if (raw == null) { 415 everyKeyFoundInURL = false; 416 break; 417 } 418 switch (key) { 419 case 'product_key': normalized = String(raw).trim().slice(0, 6); 420 break; 421 case 'product_name': normalized = String(raw).trim().slice(0, 50); 422 break; 423 case 'product_cost': normalized = (parseInt(raw) / 100).toFixed(2); 424 break; 425 case 'loan_amount': normalized = (parseInt(raw) / 100).toFixed(2); 426 break; 427 case 'validity': normalized = parseInt(raw); 428 break; 429 case 'store_name': normalized = String(raw).trim().slice(0, 100); 430 break; 431 } 432 if (normalized != null && normalized !== '') { 433 localStorage.setItem(key, normalized); // add key to localStorage 434 qs.delete(key); // remove from saved query string 435 storedAny = true; 436 } 437 } 438 // If keys aren't in URL check if they are in LocalStorage 439 let everyKeyFoundInLocalStorage = true; 440 if (!everyKeyFoundInURL) { 441 for (let key of KEYS) { 442 if (localStorage.getItem(key)) { 443 continue; 444 } else { 445 everyKeyFoundInLocalStorage = false; 446 break; 447 } 448 } 449 } 450 // If not in URL and not in localStorage, redirect to error page 451 if (!everyKeyFoundInLocalStorage) { 452 window.location.href = '/t3b-error'; 453 } 454 455 // If stored from URL, remove parameters from URL in browser 456 if (storedAny) { 457 url.search = qs.toString(); 458 window.history.replaceState(null, '', url.toString()); 459 } 460 461 // Showing information to user 462 const productName = localStorage.getItem('product_name'); 463 const productKey = localStorage.getItem('product_key'); 464 if (productName && document.querySelector('.av-product-param')) { 465 document.querySelector('.av-product-param').textContent = productName; 466 } 467 if (productKey && document.querySelector('.av-product-sku')) { 468 document.querySelector('.av-product-sku').textContent = productKey; 469 } 470 471 // Settings variables to CF options object 472 if (localStorage.getItem('loan_amount')) { 473 sliderOptions.slider.creditline.amount_slider = { 474 default_value: localStorage.getItem('loan_amount'), 475 initialValue: localStorage.getItem('loan_amount'), 476 }; 477 } 478} else if (avafinConfig.slider_behaviour_id === 'lv_post') { 479 const url = new URL(window.location.href); 480 const qs = new URLSearchParams(url.search); 481 /* eslint-disable no-undef, no-unused-vars */ 482 addUpdateTrackingParams({ branch_id: qs.get('branch_id') }); 483} 484var cfObject; 485//Load CF from backend or fail to emergency topbar 486try { 487 CF.AffiliateSlider.globals.scripts.worker = assetProxyData.workerPath; 488 var l = new CF.AffiliateSlider.DependencyLoader(); 489 l.load(function () { 490 sf = new CF.Sliders.Factory(sliderOptions);
491 let sliderConfigs = sliderFeaturesConfigs(CF.Product); 492 injectProductFields(sliderConfigs[avafinConfig.slider_behaviour_id]); 493 cfObject = sf.init(); 494 avSliderMainDependentLoop(cfObject, sliderConfigs); 495 }); 496} catch (error) { 497 handleBrokenSlider(); 498 emergencyTopbar(customData.translations.emergencyTopbar); 499} 500 501// Handle changing buttons and popups when clicked 502if (sliderBehaviourData('over_amount_popup')) { 503 var cta_button = sliderBehaviourData('two_cta_buttons') ? $('.av-loan-login-cta') : $('.av-loan-cta'); 504 cta_button.on('click', function (e) { 505 if (getAmount() > sliderBehaviourData('oap_amount')) { 506 e.preventDefault(); 507 $('.slider-modal-wrap[data-modal-id="confirmation"]').fadeIn(); 508 $('.slider-modal-wrap[data-modal-id="confirmation"]').css('display', 'flex'); 509 $('body').addClass('frozen'); 510 } 511 }); 512} 513if (sliderBehaviourData('below_amount_popup')) { 514 cta_button = $('.av-loan-cta'); 515 cta_button.on('click', function (e) { 516 if (getAmount() <= sliderBehaviourData('bap_amount')) { 517 e.preventDefault(); 518 $('.slider-modal-wrap[data-modal-id="login-reminder"]').fadeIn(); 519 $('.slider-modal-wrap[data-modal-id="login-reminder"]').css('display', 'flex'); 520 $('body').addClass('frozen'); 521 } 522 }); 523} 524 525if (sliderBehaviourData('reg_login_popup')) { 526 cta_button = $('.av-loan-cta'); 527 cta_button.on('click', function (e) { 528 e.preventDefault(); 529 $('.slider-modal-wrap[data-modal-id="registration-login-popup"]').fadeIn(); 530 $('.slider-modal-wrap[data-modal-id="registration-login-popup"]').css('display', 'flex'); 531 $('body').addClass('frozen'); 532 }); 533} 534 535var avSliderSwitch; // after pageload here is function for switching between rolled and unrolled slider 536// Slider initialization 537$(document).ready(function () { 538 $('.av-slider-quantity-container').each(function () { 539 var container = $(this); 540 var spanElement = container.find('span').first(); 541 var inputElement = container.find('input'); 542 543 if (inputElement.length) { 544 var number = parseInt(spanElement.text().trim().replace(/[^\d]/g, '')) || 0; 545 inputElement.val(number); 546 } 547 }); 548 549 //Floating button fix 550 $( window ).on( 'resize', function () { 551 floatingButtonPageMarginFix(); 552 }); 553 floatingButtonPageMarginFix(); 554 555 /* === REGISTRATION SLIDER FUNCTIONALITY === */ 556 if ([ 'type_registration', 'registration_pl_ep' ].includes(avafinConfig.slider_type)) { 557 var sliderUnrolled = false; 558 var $heroContainer = $('.av-hero-container'); 559 var $avSlider = $('.av-slider'); 560 var $editButton = $('.av-reg-slider-switcher'); 561 avSliderSwitch = () => { 562 $heroContainer.slideToggle({ 563 start: () => { 564 $editButton.toggleClass('av-reg-slider-switcher-active', () => sliderUnrolled); 565 }, 566 }); 567 $avSlider.slideToggle(); 568 }; 569 $('.av-reg-slider-switcher').on('click', () => avSliderSwitch()); 570 if (sliderBehaviourData('registration_slider_unroll_on_page_load')) { 571 avSliderSwitch(); 572 } 573 574 // For rangeSlider handles to behave smoothly 575 var rangeSliderHandles = Array.from(document.getElementsByClassName('rangeslider-handle')); 576 const rangeSliderObserver = new MutationObserver((mutationList) => { 577 for (const mutation of mutationList) { 578 if (rangeSliderHandles.includes(mutation.target)) { 579 let width = parseInt(mutation.target.style.left); 580 mutation.target.style.marginLeft = parseInt(-(width / 4.1)) + 'px'; 581 } 582 } 583 }); 584 rangeSliderObserver.observe(document.getElementsByClassName('av-main')[0], 585 { attributes: true, attributeFilter: [ 'style' ], subtree: true }, 586 ); 587 } 588 589 //saving promocode to session storage/cookie 590 const form = document.getElementById('promocode-form'); 591 592 if (form !== null) { 593 form.addEventListener('submit', function () { 594 const promocodeInput = document.getElementById('promocode'); 595 const promocodeValue = promocodeInput ? promocodeInput.value : ''; 596 597 if (storageAvailable('localStorage') && storageAvailable('sessionStorage')) { 598 window.sessionStorage.setItem('promocode', promocodeValue); 599 } else {
600 setCookie('promocode', promocodeValue); 601 } 602 }); 603 } 604 605 /* === Clickable headers === */ 606 $('.av-headers-clickable .av-headers-content-inside').on('click keydown', function (e) { 607 if (e.type === 'keydown' && e.originalEvent.code !== 'Tab' || e.type === 'click') { 608 window.location.href = $(this).data('href'); 609 } 610 }); 611 612 /* === Correct APR === */ 613 if ([ 'lv', 'lv_grace', 'lv_post', 'lv_product' ].includes(avafinConfig.slider_behaviour_id)) { // LV, 2 digit after comma 614 correctAPR(2); 615 } else if (![ 'pl', 'com_pl' ].includes(avafinConfig.slider_behaviour_id)) { // excluding pl and com_pl for legal reasons 616 correctAPR(); 617 } 618}); 619 620// Handling manual input if enabled 621$(document).on('blur', '.av-slider-quantity-container input.amount-display', function () { 622 var inputElement = $(this); 623 var currentValue = parseInt(inputElement.val()) || 0; 624 var roundedValue = Math.ceil(currentValue / 50) * 50; 625 626 if (currentValue % 50 === 0) { 627 roundedValue = currentValue; 628 } 629 630 inputElement.val(roundedValue); 631}); 632 633// slider:updated-summary event handling 634var refreshedButtonBool = false; 635var avSliderValuesHidden = true; 636var isDelayed = $('.loan-slider').data('is-delayed'); 637 638// const sliderSummaryDebounced = addToDataLayerDebounce({ 639// event: 'slider.summary_updated', // this is needed for initial population 640// slider: prices, 641// }, 500); 642 643const sliderSummaryDebounced = addToDataLayerDebounce(500); 644 645$(document).on('slider:updated-summary', function (event, payload) { 646 saveSliderValues(payload); 647 prices = payload.prices; 648 var sliderExceedAmount = false; 649 var animating = false; 650 651 if (avSliderValuesHidden) { 652 $('.av-box .av-slider-quantity-container').css('visibility', 'visible'); 653 $('.av-box .range-info').css('visibility', 'visible'); 654 $('.av-term-inner .bold').css('visibility', 'visible'); 655 avSliderValuesHidden = false; 656 } 657 658 if (isDelayed) { 659 setTimeout(function () { 660 if (avSliderValuesHidden) { 661 $('.av-box .av-slider-quantity-container').css('visibility', 'visible'); 662 $('.av-box .range-info').css('visibility', 'visible'); 663 $('.av-term-inner .bold').css('visibility', 'visible'); 664 avSliderValuesHidden = false; 665 } 666 }, 5000); 667 } 668 function transformSlider () { 669 if (!animating) { 670 animating = true; 671 if (sliderExceedAmount) { 672 if (sliderBehaviourData('two_cta_buttons')) { 673 $('.av-loan-cta').fadeOut(100, () => { 674 $('.av-loan-login-cta').fadeIn(100, () => { 675 animating = false; 676 }); 677 }); 678 if (!$('.av-main').hasClass('av-exceeded-amount-show')) { 679 $('.av-main').toggleClass('av-exceeded-amount-show'); 680 } 681 } 682 if ($('.exceeded_amount').text() != '' ) { 683 $('.exceeded_amount').slideDown('fast', () => { 684 animating = false; 685 }); 686 } 687 } else { 688 if (sliderBehaviourData('two_cta_buttons')) { 689 $('.av-loan-login-cta').fadeOut(100, () => { 690 $('.av-loan-cta').fadeIn(100, () => { 691 animating = false; 692 }); 693 }); 694 if ($('.av-main').hasClass('av-exceeded-amount-show')) { 695 $('.av-main').toggleClass('av-exceeded-amount-show'); 696 } 697 } 698 if ($('.exceeded_amount').text() != '' ) { 699 $('.exceeded_amount').slideUp('fast', () => { 700 animating = false; 701 }); 702 } 703 } 704 705 sliderExceedAmount = !sliderExceedAmount; 706 } 707 } 708 709 if (sliderOptions['slider']?.['payday'] && sliderOptions['slider']?.['payday']['limit_values'] == false) { 710 if (!refreshedButtonBool) { 711 if ((payload.limits_reached && sliderExceedAmount == true) || 712 (!payload.limits_reached && sliderExceedAmount == false)) { 713 transformSlider(); 714 } 715 refreshedButtonBool = true; 716 } 717 718 $(document).on('slider:changed-amount', function (event, payload) { 719 if ((payload.limits_reached && sliderExceedAmount == true) || 720 (!payload.limits_reached && sliderExceedAmount == false)) { 721 transformSlider(); 722 } 723 if (avafinConfig.slider_behaviour_id == 'com_pl') { 724 $('.apr').text(prices['loan-apr']); 725 } 726 }); 727 } 728
729 let customSliderUpdatedSummary; 730 if (avafinConfig.slider_behaviour_id == 'cz') { 731 if (typeof customSliderUpdatedSummary !== 'undefined') { 732 eval(customSliderUpdatedSummary); 733 } else { 734 var custom_total = payload.prices['loan-amount'] + payload.prices.installments[0].payment; 735 var representative_example_value_1 = payload.prices['loan-amount'] * 0.4; 736 var representative_example_value_2 = payload.prices['loan-amount'] * 0.4 / 30 * 31 + payload.prices['loan-amount']; 737 var representative_example_value_3 = representative_example_value_1 + representative_example_value_2; 738 $('.custom-total').text(custom_total.toFixed(2)); 739 $('.creditline-percent-cost').text(payload.prices['creditline-percent-principal-month'] * 100); 740 $('.representative_example_value_1').text(representative_example_value_1.toFixed(2)); 741 $('.representative_example_value_2').text(representative_example_value_2.toFixed(2)); 742 $('.representative_example_value_3').text(representative_example_value_3.toFixed(2)); 743 } 744 } 745 746 sliderSummaryDebounced({ 747 event: 'slider.summary_updated', // this is needed for initial population 748 slider: prices, 749 }); 750 751 /* === Promocode handling === */ 752 var promocode_translations = { 753 correct_code: avafinConfig.slider_translations['discount_code_added'], 754 }; 755 promocodeFormatting(promocode_translations, payload); 756 757}); 758 759document.addEventListener('DOMContentLoaded', () => { 760 setDefaults(); 761 setTimeout(setDefaults, 250); // in case slider overwrites values 762}); 763 764window.addEventListener('pageshow', () => { 765 setDefaults(); // when coming back via back/forward 766}); 767 768function setDefaults () { 769 const containers = document.querySelectorAll('.av-slider-quantity-container'); 770 771 containers.forEach(container => { 772 const amountInput = container.querySelector('input.amount-display'); 773 const termInput = container.querySelector('input.term-display'); 774 775 if (amountInput && amountInput.value === '0') { 776 amountInput.value = prices['loan-amount']; 777 amountInput.dispatchEvent(new Event('input', { bubbles: true })); 778 amountInput.dispatchEvent(new Event('change', { bubbles: true })); 779 } 780 781 if (termInput && termInput.value === '0') { 782 termInput.value = prices['loan-term']; 783 termInput.dispatchEvent(new Event('input', { bubbles: true })); 784 termInput.dispatchEvent(new Event('change', { bubbles: true })); 785 } 786 }); 787} 788 789// Adding information to DataLayer for analytics 790const pushSliderClicked = addToDataLayerDebounce(500); 791 792$('.rangeslider').click(() => 793 pushSliderClicked({ 794 event: 'slider.clicked', 795 slider: prices, 796 }), 797); 798 799$('#promocode').val(avafinConfig.promocode); 800 801const promocodeValue = avafinConfig.promocode; 802 803if (promocodeValue) { 804 if (storageAvailable('localStorage') && storageAvailable('sessionStorage')) { 805 sessionStorage.setItem('promocode', promocodeValue); 806 } else { 807 setCookie('promocode', promocodeValue); 808 } 809} else { 810 if (storageAvailable('sessionStorage')) { 811 sessionStorage.removeItem('promocode'); 812 } 813 setCookie('promocode', ''); 814}
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.