PageSourceSearch

https://miniblox.com.au/wp-content/themes/shoptimizer/assets/js/shoptimizer-dialog.js?ver=1.0.1

js miniblox.com.au collected 2026-10-04 05:21:43 UTC 3,295 bytes, 104 lines download raw bytes

1document.addEventListener('DOMContentLoaded', function() {
2  const dialogs = document.querySelectorAll('dialog.shoptimizer-modal');
3  var shoptimizerFElements = getFocusableElements();
4  var shoptimizerFFElement = shoptimizerFElements[0];
5  var shoptimizerLFElement = shoptimizerFElements[shoptimizerFElements.length - 1];
6  
7  document.addEventListener('click', event => {
8    const shoptimizertrigger = event.target.dataset.trigger;
9    if (shoptimizertrigger) {
10      const modalId = shoptimizertrigger;
11      const modalElement = document.querySelector(`[data-shoptimizermodal-id="${modalId}"]`);
12      if (modalElement) {
13        closeAllDialogs();
14        if (modalId === 'searchToggle') {
15          modalElement.show();
16          updateFocusableElements();
17          trapSearchToggleModal(modalElement);
18		  var inputElm = modalElement.querySelector('input[type="search"], input[type="text"]');
19		  if ( inputElm ) {
20			inputElm.focus();
21		  }
22        } else {
23          modalElement.showModal();
24        }
25      }
26    }
27  });
28  
29  dialogs.forEach(shoptimizerdialog => {
30    shoptimizerdialog.addEventListener('click', function(event) {
31      if (event.target === shoptimizerdialog) {
32        closeDialog(shoptimizerdialog);
33      }
34      if (event.target.closest('.shoptimizer-modal--button_close')) {
35        event.preventDefault();
36        closeDialog(shoptimizerdialog);
37      }
38    });
39    
40    // Add keydown event listener for ESC key
41    shoptimizerdialog.addEventListener('keydown', function(event) {
42      if (event.key === 'Escape') {
43        closeDialog(shoptimizerdialog);
44      }
45    });
46  });
47  
48  function closeAllDialogs() {
49    dialogs.forEach(dialog => {
50      if (dialog.open) {
51        dialog.close();
52      }
53    });
54  }
55  
56  function closeDialog(dialog) {
57    dialog.close();
58  }
59  
60  function getFocusableElements() {
61    var modalElm = document.querySelector('[data-shoptimizermodal-id="searchToggle"]');
62    if (modalElm) {
63      return modalElm.querySelectorAll('a[href], button, textarea, input[type="search"], input[type="text"], input[type="radio"], input[type="checkbox"], select');
64    } else {
65      return new Array();
66    }
67  }
68  
69  function updateFocusableElements() {
70    shoptimizerFElements = getFocusableElements();
71    shoptimizerFFElement = shoptimizerFElements[0];
72    shoptimizerLFElement = shoptimizerFElements[shoptimizerFElements.length - 1];
73  }
74  
75  function trapSearchToggleModal(element) {
76    shoptimizerFFElement.focus();
77    
78    element.addEventListener('keydown', function(e) {
79      let isTabPressed = e.key === 'Tab' || e.keyCode === 9;
80      if (!isTabPressed) {
81        return;
82      }
83      if (e.shiftKey) { 
84        if (document.activeElement === shoptimizerFFElement) {
85          shoptimizerLFElement.focus();
86          e.preventDefault();
87        }
88      } else { 
89        if (document.activeElement === shoptimizerLFElement) { 
90          shoptimizerFFElement.focus(); 
91          e.preventDefault();
92        }
93      }
94    });
95  }
96  
97  var modalContent = document.querySelector('[data-shoptimizermodal-id="searchToggle"]');
98  if (modalContent) {
99    var modalObserver = new MutationObserver(() => {
100      updateFocusableElements();
101    });
102    modalObserver.observe(modalContent, { childList: true, subtree: true });
103  }
104});

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.