1/* Javascript Document */ 2if ( commercekit_ajs.ajax_search == 1 ) { 3 function ckit_ajax_search(){ 4 var minChar = commercekit_ajs.char_count; 5 var maxHeight = 600; 6 var deferRequestBy = 200; 7 var cSuggestions = {}; 8 var cViewAlls = {}; 9 var inputs = document.querySelectorAll('input[type="search"]'); 10 inputs.forEach(function(input){ 11 var searchWidget = input.closest('.widget_search'); 12 var productWidget = input.closest('.woocommerce.widget_product_search'); 13 if( !searchWidget && !productWidget ) return false; 14 var currentRequest = null; 15 var currentCancel = null; 16 var currentValue = ''; 17 var iwidth = input.offsetWidth; 18 var form = input.closest('form'); 19 form.insertAdjacentHTML('beforeend', '<div class="commercekit-ajs-results" style="width: '+iwidth+'px;"><div class="commercekit-ajs-suggestions" style="position: absolute; display: none; z-index: 9999; width: '+iwidth+'px;"></div><div class="commercekit-ajs-view-all-holder" style="display: none;"></div></div>'); 20 input.setAttribute('autocomplete', 'off'); 21 input.classList.add('commercekit-ajax-search'); 22 23 if( commercekit_ajs.layout == 'product' ){ 24 var post_type = form.querySelector('input[name="post_type"]'); 25 if( post_type ){ 26 post_type.value = 'product'; 27 } else { 28 var hidinput = document.createElement('input'); 29 hidinput.setAttribute('type', 'hidden'); 30 hidinput.setAttribute('name', 'post_type'); 31 hidinput.setAttribute('value', 'product'); 32 input.parentNode.insertBefore(hidinput, input.nextSibling); 33 } 34 } else { 35 var post_type = form.querySelector('input[name="post_type"]'); 36 if( post_type ){ 37 post_type.parentNode.removeChild(post_type); 38 } 39 } 40 41 form.addEventListener('submit', function(e){ 42 var formsugg = form.querySelector('.commercekit-ajs-suggestions'); 43 var active = formsugg.querySelector('.active'); 44 if( active ){ 45 e.preventDefault(); 46 active.querySelector('a').click(); 47 return false; 48 } 49 }); 50 input.addEventListener('keyup', function(e){ 51 formresult = form.querySelector('.commercekit-ajs-results'); 52 formsugg = form.querySelector('.commercekit-ajs-suggestions'); 53 formall = form.querySelector('.commercekit-ajs-view-all-holder'); 54 var code = (e.keyCode || e.which); 55 if (code === 37 || code === 38 || code === 39 || code === 40 || code === 27 || code === 13 || input.value.length < minChar ) { 56 if( code === 27 ) { 57 clearTimeout(currentRequest); 58 ckCloseAllSuggestions(); 59 } else if( code === 38 || code === 40 || code === 13 ) { 60 var result = ckAjaxSearchKeyboardAccess(code, formsugg, input); 61 if( result == false ){ 62 e.preventDefault(); 63 return; 64 } 65 } else { 66 return; 67 } 68 } else { 69 clearTimeout(currentRequest); 70 ckCloseAllSuggestions(); 71 formsugg.innerHTML = ''; formsugg.style.display = 'none'; 72 formall.innerHTML = ''; formall.style.display = 'none'; 73 74 if( cSuggestions[input.value] !== undefined ){ 75 formsugg.innerHTML = cSuggestions[input.value]; 76 formsugg.style.display = 'block'; 77 formall.innerHTML = cViewAlls[input.value]; 78 if( cViewAlls[input.value] != '' ){ 79 formall.style.display = 'block'; 80 ckPrepareSuggestionsHeight(input, form, formall, formresult, formsugg); 81 } else { 82 ckPrepareSuggestionsHeight(input, form, null, formresult, formsugg); 83 } 84 } else { 85 if( currentValue == input.value ){ 86 return; 87 } 88 currentRequest = setTimeout(function(){ 89 currentValue = input.value; 90 input.setAttribute('style', 'background-image: url(' + commercekit_ajs.loader_icon + '); background-repeat: no-repeat; background-position:50% 50%;'); 91 var url = commercekit_ajs.ajax_url + '=' + commercekit_ajs.action+'&query='+input.value; 92 if( currentCancel ){ 93 currentCancel.abort(); 94 } 95 currentCancel = new AbortController(); 96 fetch(url, {signal: currentCancel.signal}).then(response => response.json()).then(json => { 97 input.setAttribute('style', 'background-image: none; background-repeat: no-repeat; background-position:50% 50%;'); 98 var html = ''; 99 var canViewAll = true; 100 var noResult = 0; 101 if( json.suggestions.length == 0 ) { 102 html = '<div class="autocomplete-no-suggestion">'+commercekit_ajs.no_results_text+'</div>'; 103 cSuggestions[input.value] = html; 104 cViewAlls[input.value] = ''; 105 canViewAll = false;
106 noResult = 1; 107 } else { 108 json.suggestions.forEach(suggestion => { 109 html += '<div class="autocomplete-suggestion">'+suggestion.data+'</div>'; 110 }); 111 cSuggestions[input.value] = html; 112 cViewAlls[input.value] = json.view_all_link; 113 } 114 formsugg.innerHTML = cSuggestions[input.value]; 115 formsugg.style.display = 'block'; 116 if( canViewAll ) { 117 formall.innerHTML = cViewAlls[input.value]; 118 formall.style.display = 'block'; 119 ckPrepareSuggestionsHeight(input, form, formall, formresult, formsugg); 120 } else { 121 ckPrepareSuggestionsHeight(input, form, null, formresult, formsugg); 122 } 123 var url2 = commercekit_ajs.ajax_url + '=commercekit_search_counts&query='+input.value+'&no_result='+noResult; 124 fetch(url2).then(response => response.json()).then(json => {}).catch(function(e){}); 125 }).catch(function(e){}); 126 }, deferRequestBy); 127 } 128 } 129 }); 130 input.addEventListener('focus', function(e){ 131 var input = e.target; 132 if( input.classList.contains('commercekit-ajax-search') && input.value.length >= commercekit_ajs.char_count ){ 133 var form = input.closest('form'); 134 var formresult = form.querySelector('.commercekit-ajs-results'); 135 var formsugg = form.querySelector('.commercekit-ajs-suggestions'); 136 var formall = form.querySelector('.commercekit-ajs-view-all-holder'); 137 if( formsugg.querySelectorAll('.autocomplete-suggestion').length > 0 ){ 138 ckCloseAllSuggestions(); 139 if( !formall ) formall = null; 140 if( formsugg ) formsugg.style.display = 'block'; 141 if( formall ) formall.style.display = 'block'; 142 ckPrepareSuggestionsHeight(input, form, formall, formresult, formsugg) 143 } else { 144 var keyup = new Event('keyup'); 145 input.dispatchEvent(keyup); 146 } 147 } 148 }); 149 }); 150 document.onclick = function(e){ 151 if( !e.target.classList.contains('commercekit-ajs-suggestions') && !e.target.classList.contains('commercekit-ajax-search') ){ 152 ckCloseAllSuggestions(); 153 } 154 } 155 } 156 ckit_ajax_search(); 157} 158function ckCloseAllSuggestions(){ 159 document.querySelectorAll('.commercekit-ajs-results').forEach(function(results){ 160 results.style.height = '0px'; 161 }); 162 document.querySelectorAll('.commercekit-ajs-suggestions').forEach(function(suggestion){ 163 suggestion.style.display = 'none'; 164 }); 165 document.querySelectorAll('.commercekit-ajs-view-all-holder').forEach(function(viewall){ 166 viewall.style.display = 'none'; 167 }); 168} 169function ckPrepareSuggestionsHeight(input, form, formall, formresult, formsugg){ 170 var $height = 0; 171 form.querySelectorAll('.autocomplete-suggestion, .autocomplete-no-suggestion').forEach(function(list){ 172 $height += list.offsetHeight; 173 }); 174 if( formall ){ 175 $height += formall.offsetHeight; 176 } 177 formresult.style.height = $height+'px'; 178 formresult.style.width = input.offsetWidth+'px'; 179 formsugg.style.width = input.offsetWidth+'px'; 180 var oresult = form.querySelector('.commercekit-ajs-other-result'); 181 if( oresult ){ 182 oresult.parentNode.classList.add('commercekit-ajs-other-result-wrap'); 183 } 184} 185function ckAjaxSearchKeyboardAccess(code, formsugg, input){ 186 input.selectionStart = input.selectionEnd = input.value.length; 187 if( formsugg.style.display == 'block' ){ 188 var active = formsugg.querySelector('.active'); 189 if( ! active ){ 190 if( !formsugg.firstChild.classList.contains('commercekit-ajs-other-result-wrap')){ 191 active = formsugg.firstChild; 192 } else { 193 if( formsugg.firstChild.nextSibling ) 194 active = formsugg.firstChild.nextSibling; 195 } 196 } else { 197 if( code === 38 ){ 198 active.classList.remove('active'); 199 if( active.previousSibling ){ 200 if( !active.previousSibling.classList.contains('commercekit-ajs-other-result-wrap')){ 201 active = active.previousSibling; 202 } else { 203 if( active.previousSibling.previousSibling ){ 204 active = active.previousSibling.previousSibling; 205 } else if( formsugg.lastChild ) { 206 active = formsugg.lastChild; 207 } 208 } 209 } else if( formsugg.lastChild ) { 210 active = formsugg.lastChild; 211 } 212 } 213 if( code === 40 ){ 214 active.classList.remove('active'); 215 if( active.nextSibling ){ 216 if( !active.nextSibling.classList.contains('commercekit-ajs-other-result-wrap')){ 217 active = active.nextSibling; 218 } else { 219 if( active.nextSibling.nextSibling ){ 220 active = active.nextSibling.nextSibling; 221 } else if( formsugg.firstChild ){ 222 active = formsugg.firstChild; 223 } 224 } 225 } else if( formsugg.firstChild ){ 226 active = formsugg.firstChild; 227 } 228 } 229 } 230 if( ( code === 38 || code === 40 ) && active ){ 231 active.classList.add('active'); 232 } else if( code === 13 && active ) { 233 return false;
234 } 235 return true; 236 } 237} 238function ckAdjustSuggestionsHeight(img){ 239 var $height = 0; 240 var form = img.closest('form'); 241 var formresult = form.querySelector('.commercekit-ajs-results'); 242 var formall = form.querySelector('.commercekit-ajs-view-all-holder'); 243 form.querySelectorAll('.autocomplete-suggestion, .autocomplete-no-suggestion').forEach(function(list){ 244 $height += list.offsetHeight; 245 }); 246 if( formall.style.display == 'block' ){ 247 $height += formall.offsetHeight; 248 } 249 formresult.style.height = $height+'px'; 250}
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.