PageSourceSearch

https://www.avafin.pl/wp-content/themes/lendon.2/templates/blocks/…?ver=c21391f0a86064463b1f27ab711da2eb

js avafin.pl collected 2026-10-10 00:45:28 UTC 32,328 bytes, 814 lines download raw bytes

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>&nbsp;<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.