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.