PageSourceSearch

https://www.buzzsneakers.sk/nb-public/themes/nbshop5_v5_8/_static/…/nbshop.accessibility.js?ver=1008_7.1

js buzzsneakers.sk collected 2026-10-06 20:00:32 UTC 15,500 bytes, 411 lines download raw bytes

1function NBAccessibility(){}
2let modelNBAccessibility = new NBAccessibility();
3
4NBAccessibility.prototype.trapFocus = function (container){
5
6    if($(container).length == 0) {
7        return false;
8    }
9
10    let focusableSelectors = 'a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, [tabindex="0"]';
11    let focusableElements = $(container).find(focusableSelectors).filter(':visible');
12    let first = focusableElements[0];
13    let last = focusableElements[focusableElements.length - 1];
14
15    $(container).on('keydown', function (e) {
16        if (e.key === 'Tab') {
17            if (e.shiftKey) {
18                if (document.activeElement === first) {
19                    e.preventDefault();
20                    last.focus();
21                }
22            } else {
23                if (document.activeElement === last) {
24                    e.preventDefault();
25                    first.focus();
26                }
27            }
28        }
29    });
30
31    first.focus();
32}
33NBAccessibility.prototype.visibleElement = function (el){
34    if(el.length == 0) {
35        return false;
36    }
37    el.each(function() {
38        if($(this).is(':visible')){
39            $(this).attr('tabindex','0');
40        }else{
41            $(this).attr('tabindex','-1');
42        }
43    })
44
45}
46NBAccessibility.prototype.hoverCards = function (){
47    let card = '.product-item';
48    $(card).each(function (){
49        $(this).on('focusin', function () {
50            $(this).addClass('nb-element-hover');
51            modelNBAccessibility.visibleElement($(this).find('a'));
52            modelNBAccessibility.visibleElement($(this).find('button'));
53            modelNBAccessibility.visibleElement($(this).find('div[tabindex="-1"]'));
54        });
55        $(this).on('focusout', function () {
56            if (!$(this).has(document.activeElement).length) {
57                $(card).removeClass('nb-element-hover');
58            }
59        });
60    })
61}
62NBAccessibility.prototype.clickWithKeyboard = function (el, preventDefault= false){
63    if($(el).length == 0) {
64        return false;
65    }
66    $(el).each(function () {
67        $(this).off('keydown').on('keydown', function (e) {
68            if (e.key === 'Enter') {
69                if(preventDefault){
70                    e.preventDefault();
71                }
72                $(this).click();
73                e.stopPropagation();
74            }
75        });
76    })
77
78}
79NBAccessibility.prototype.openSearchWithEnter = function (el){
80    if($(el).length == 0) {
81        return false;
82    }
83    $(el).each(function () {
84        $(this).off('keydown').on('keydown', function (e) {
85            if (e.key === 'Enter') {
86                if($(el).find('.autocomplete-wrapper.hidden').length !== 0){
87                    e.preventDefault();
88                }
89                $(this).click();
90                e.stopPropagation();
91            }
92        });
93    })
94}
95NBAccessibility.prototype.checkWithKeyboard = function (){
96    let $el = 'input[type="checkbox"]';
97    modelNBAccessibility.clickWithKeyboard($el, true)
98}
99
100NBAccessibility.prototype.focusInActiveTabOnly = function (tabContent){
101    if(tabContent.length == 0) {
102        return false;
103    }
104    tabContent.each(function() {
105        if(!$(this).hasClass('active')) {
106            $(this).find('a').attr('tabindex','-1');
107            $(this).find('button').attr('tabindex','-1');
108            let divWithTabindex = $(this).find('div');
109            divWithTabindex.each(function () {
110                if($(this).attr("tabindex") == "0") {
111                    $(this).attr('tabindex','-1');
112                }
113            })
114        } else {
115            $(this).find('a:visible').attr('tabindex','0');
116            $(this).find('button:visible').attr('tabindex','0');
117            let divWithTabindex = $(this).find('div:visible');
118            divWithTabindex.each(function () {
119                if($(this).attr("tabindex") == "1") {
120                    $(this).attr('tabindex','0');
121                }
122
123            })
124        }
125    })
126}
127
128NBAccessibility.prototype.focusInActiveTabOnlyOnClick = function (){
129    let tabs = $('[data-toggle="tab"]');
130
131    tabs.each(function () {
132        let tabsContent = $(this).closest('.block').find('.tab-pane');
133        setTimeout(function () {
134            modelNBAccessibility.focusInActiveTabOnly(tabsContent);
135        },300);
136        $(this).click(function () {
137            setTimeout(function () {
138                modelNBAccessibility.focusInActiveTabOnly(tabsContent);
139            },300);
140        })
141    })
142}
143
144NBAccessibility.prototype.showMenuDropdown = function (element, dropdownNav, icon) {
145    document.querySelectorAll(element).forEach(menuItem => {
146
147        const iconBtn = menuItem.querySelector(icon);
148        const dropdown = menuItem.querySelector(dropdownNav);
149
150        if(dropdown) {
151
152            iconBtn.setAttribute("tabindex", "0");
153
154            modelNBAccessibility.clickWithKeyboard(iconBtn);
155            iconBtn.addEventListener('click', (e) => {
156                e.preventDefault();
157
158                const isOpen = dropdown.classList.contains('menu-item-in-focus');
159
160                if (!isOpen) {
161                    menuItem.classList.add('menu-item-in-focus');
162                    const firstItem = dropdown.querySelector('a, button, [tabindex="0"]');
163                    if (firstItem) firstItem.focus();
164                }
165            });
166
167            menuItem.addEventListener('focusout', () => {
168                setTimeout(() => {
169                    if (!menuItem.contains(document.activeElement)) {
170                        menuItem.classList.remove('menu-item-in-focus');
171                    }
172                }, 0);
173            });
174        }
175    });
176};
177NBAccessibility.prototype.focusFirstElementInStep = function () {
178    const activeStep = document.querySelector('div[data-is-step]:not(.hidden-step)');
179    if (!activeStep) return;
180
181    const focusableSelectors = 'input, select, textarea, button, a[href], [tabindex]:not([tabindex="-1"])';
182    const focusableElements = Array.from(activeStep.querySelectorAll(focusableSelectors))
183        .filter(el => !el.disabled && el.offsetParent !== null);
184
185    if (focusableElements.length > 0) {
186        focusableElements[0].focus();
187    }
188}
189NBAccessibility.prototype.focusFirstElementInStepOnBtnClick = function () {
190    document.querySelectorAll('.next-button-step a, .prev-btn a').forEach(btn => {
191        btn.addEventListener('click', () => {
192            modelNBAccessibility.focusFirstElementInStep();
193        });
194    });
195}
196
197NBAccessibility.prototype.initCartFunctions = function () {
198    modelNBAccessibility.clickWithKeyboard('.nbf-change-size');
199    modelNBAccessibility.clickWithKeyboard('.popup-sizes-wrapper .size-item');
200    modelNBAccessibility.clickWithKeyboard('.group-type-payment-title');
201    modelNBAccessibility.clickWithKeyboard('input[type="radio"]');
202    modelNBAccessibility.clickWithKeyboard('.carrier-li');
203    modelNBAccessibility.clickWithKeyboard('.payment-li');
204    modelNBAccessibility.clickWithKeyboard('.product-item-remove');
205    modelNBAccessibility.clickWithKeyboard('.openCartModalDescription');
206    modelNBAccessibility.clickWithKeyboard('.openCartModal');
207    modelNBAccessibility.clickWithKeyboard('.loyalty-card-types .card-item');
208    modelNBAccessibility.clickWithKeyboard('.loyalty-card-types .apply-another-ticket');
209    modelNBAccessibility.focusInActiveTabOnly($('.tab-pane'));
210    modelNBAccessibility.focusFirstElementInStepOnBtnClick();
211
212
213    $(window).on('initCartOnePage',function (){
214        modelNBAccessibility.checkWithKeyboard();
215        modelNBAccessibility.clickWithKeyboard('.nbf-change-size');
216        modelNBAccessibility.clickWithKeyboard('.popup-sizes-wrapper .size-item');
217        modelNBAccessibility.visibleElement($('.tab-pane a'));
218        modelNBAccessibility.clickWithKeyboard('input[type="radio"]');
219        modelNBAccessibility.focusInActiveTabOnly($('.tab-pane'));
220        modelNBAccessibility.clickWithKeyboard('.product-item-remove');
221        modelNBAccessibility.clickWithKeyboard('.loyalty-card-types .card-item');
222        modelNBAccessibility.clickWithKeyboard('.loyalty-card-types .apply-another-ticket');
223        modelNBAccessibility.clickWithKeyboard('.carrier-li');
224        modelNBAccessibility.clickWithKeyboard('.payment-li');
225        modelNBAccessibility.clickWithKeyboard('.add-gift-card');
226        modelNBAccessibility.focusFirstElementInStepOnBtnClick();
227        modelNBAccessibility.clickWithKeyboard('.group-type-payment-title');
228    });
229
230    $(window).on('paketomat_stores_for_cart_load',function (){
231        modelNBAccessibility.clickWithKeyboard('.item-button');
232    });
233    $('#cart_store_modal').on('shown.bs.modal', function(){
234        modelNBAccessibility.clickWithKeyboard('.item-button');
235    });
236}
237
238NBAccessibility.prototype.initProductDetailFunctions = function () {
239    modelNBAccessibility.clickWithKeyboard('.filters-choice');
240    modelNBAccessibility.clickWithKeyboard('.product-quantity-arrows i');
241    modelNBAccessibility.clickWithKeyboard('.one-day-delivery a');
242
243    $(window).on('storeAvailabilityLoaded checkSizeAvailabilityInSapCar',function (){
244        modelNBAccessibility.clickWithKeyboard('.productstate-product .product-attributes li');
245        modelNBAccessibility.clickWithKeyboard('.stores-wrapper .map-link');
246    });
247
248    $(window).on("lastviewedproducts_load", function () {
249        modelNBAccessibility.hoverCards();
250        modelNBAccessibility.clickWithKeyboard('.favorite');
251        modelNBAccessibility.clickWithKeyboard('.btn-sizes');
252    });
253}
254
255NBAccessibility.prototype.initProductListFunctions = function () {
256    modelNBAccessibility.clickWithKeyboard('.filters-wrapper .filter-group .headline-wrapper');
257    modelNBAccessibility.clickWithKeyboard('.tags .item');
258    modelNBAccessibility.clickWithKeyboard('.reset-tag-wrapper');
259
260
261    $(window).on('loadproductsevent',function (){
262        modelNBAccessibility.hoverCards();
263        modelNBAccessibility.clickWithKeyboard('.btn-sizes');
264        modelNBAccessibility.clickWithKeyboard('.favorite');
265        modelNBAccessibility.visibleElement($('.product-item .favorite'));
266        modelNBAccessibility.clickWithKeyboard('.product-attributes-wrapper .product-attributes li');
267        modelNBAccessibility.checkWithKeyboard();
268        modelNBAccessibility.clickWithKeyboard('.tags .item');
269        modelNBAccessibility.clickWithKeyboard('.filters-wrapper .filter-group .headline-wrapper');
270        modelNBAccessibility.clickWithKeyboard('.reset-tag-wrapper');
271    });
272}
273
274NBAccessibility.prototype.initBrandPageFunctions = function () {
275    modelNBAccessibility.clickWithKeyboard('.attribute-letters-list .item');
276    modelNBAccessibility.clickWithKeyboard('.attribute-letters-list .show-all-brands');
277}
278
279NBAccessibility.prototype.initBasicFunctions = function () {
280    modelNBAccessibility.hoverCards();
281    modelNBAccessibility.checkWithKeyboard();
282    modelNBAccessibility.clickWithKeyboard('.btn-sizes');
283    modelNBAccessibility.clickWithKeyboard('.product-attributes-wrapper .product-attributes li');
284    modelNBAccessibility.clickWithKeyboard('.autocomplete-close');
285    modelNBAccessibility.openSearchWithEnter('.autocomplete-button');
286    modelNBAccessibility.clickWithKeyboard('.favorite');
287    modelNBAccessibility.clickWithKeyboard('.product-item-remove');
288    modelNBAccessibility.clickWithKeyboard('.country-menu .choose-country');
289    modelNBAccessibility.clickWithKeyboard('.sidebar-country-menu .close');
290    modelNBAccessibility.showMenuDropdown('.wsmenu-list li', '.wsmegamenu', '.show-menu-with-keybord');
291    modelNBAccessibility.showMenuDropdown('.nav-main li', '.nav-main-dropdown-wrapper', '.show-menu-with-keybord');
292    modelNBAccessibility.visibleElement($('.product-item a'));
293    modelNBAccessibility.visibleElement($('.product-item .favorite'));
294    modelNBAccessibility.focusInActiveTabOnlyOnClick();
295
296
297    modelNBAccessibility.clickWithKeyboard('.close-mini-cart');
298
299    $('.modal').on('shown.bs.modal', function(){
300        modelNBAccessibility.trapFocus('.modal');
301    });
302
303    $(window).on('searchSuggestAutocomplateNew',function (){
304        modelNBAccessibility.trapFocus('#search-form');
305
306    });
307
308    $(window).on('home-tabs_blockLoaded home-product-list',function (){
309        modelNBAccessibility.hoverCards();
310        modelNBAccessibility.clickWithKeyboard('.favorite');
311        modelNBAccessibility.visibleElement($('.product-item a'));
312        modelNBAccessibility.focusInActiveTabOnlyOnClick();
313    });
314
315    $(window).on("productQuickViewOnModal", function () {
316        modelNBAccessibility.hoverCards();
317        modelNBAccessibility.clickWithKeyboard('.favorite');
318        modelNBAccessibility.clickWithKeyboard('.btn-sizes');
319    });
320}
321
322NBAccessibility.prototype.initStorePageFunctions = function () {
323    modelNBAccessibility.clickWithKeyboard('.stores-list .store-item');
324}
325
326NBAccessibility.prototype.initOrderStatusFunctions = function () {
327    modelNBAccessibility.clickWithKeyboard('.split-order-tabs .item');
328}
329
330NBAccessibility.prototype.initReturnPageFunctions = function () {
331    modelNBAccessibility.clickWithKeyboard('.return-step-buttons .return-step-button');
332
333    $(window).on('load_return_content',function (){
334        modelNBAccessibility.checkWithKeyboard();
335        modelNBAccessibility.clickWithKeyboard('.return-method-box');
336    });
337    $(window).on('returnReasonLoaded',function (){
338        modelNBAccessibility.clickWithKeyboard('.return-reason-item');
339    });
340    $(window).on('mapLoaded',function (){
341        modelNBAccessibility.clickWithKeyboard('#return_stores_btn');
342    });
343    $(window).on('courierServiceLoaded',function (){
344        modelNBAccessibility.clickWithKeyboard('#return_modal .courier-service-item');
345    });
346}
347
348let lastFocusedElement;
349NBAccessibility.prototype.handleFocusAfterModalClose = function () {
350
351    $(document).on('show.bs.modal', '.modal', function () {
352        lastFocusedElement = document.activeElement;
353    });
354
355    $('#myModal').on('hidden.bs.modal', function () {
356        if (!lastFocusedElement) return;
357
358        const focusableSelectors = 'a, button, input, select, textarea, [tabindex]:not([tabindex="-1"])';
359        const $focusable = $(focusableSelectors).filter(':visible:not([disabled])');
360
361        const index = $focusable.index(lastFocusedElement);
362        const $next = $focusable.eq(index + 1);
363
364        if ($next.length) {
365            $next.focus();
366        }
367
368        lastFocusedElement = null;
369    });
370
371}
372
373$(document).ready(function (){
374
375    modelNBAccessibility.initBasicFunctions();
376
377    //listing proizvoda
378    if(nb_type_page == 'product_list') {
379        modelNBAccessibility.initProductListFunctions();
380    }
381
382    //detalj proizvoda
383    if(nb_type_page == 'product') {
384        modelNBAccessibility.initProductDetailFunctions();
385    }
386
387    //korpa
388    if(nb_type_page == 'cart') {
389        modelNBAccessibility.initCartFunctions();
390    }
391
392    //radnje na mapi
393    if($('body').hasClass('uc-store_listing')) {
394        modelNBAccessibility.initStorePageFunctions();
395    }
396
397    //status porudzbine
398    if($('body').hasClass('uc-view_order_status')) {
399        modelNBAccessibility.initOrderStatusFunctions();
400    }
401
402    //brendovi
403    if($('body').hasClass('uc-attribute_list')) {
404        modelNBAccessibility.initBrandPageFunctions();
405    }
406
407    //povrati
408    if($('body').hasClass('uc-return_page')) {
409        modelNBAccessibility.initReturnPageFunctions();
410    }
411})

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.