1(function( $, elementor ) { 2 3 'use strict'; 4 5 var JetSearch = { 6 7 init: function() { 8 9 var widgets = { 10 'jet-ajax-search.default': JetSearch.widgetAjaxSearch 11 }; 12 13 $.each( widgets, function( widget, callback ) { 14 elementor.hooks.addAction( 'frontend/element_ready/' + widget, callback ); 15 } ); 16 }, 17 18 widgetAjaxSearch: function( $scope ) { 19 var settings = { 20 searchClass: '.jet-ajax-search', 21 searchFormClass: '.jet-ajax-search__form', 22 fieldsHolderClass: '.jet-ajax-search__fields-holder', 23 inputClass: '.jet-ajax-search__field', 24 settingsInput: 'input[name="jet_ajax_search_settings"]', 25 submitClass: '.jet-ajax-search__submit', 26 chosenClass: '.jet-ajax-search__categories select[name="jet_ajax_search_categories"]', 27 resultsAreaClass: '.jet-ajax-search__results-area', 28 resultsHeaderClass: '.jet-ajax-search__results-header', 29 resultsFooterClass: '.jet-ajax-search__results-footer', 30 listHolderClass: '.jet-ajax-search__results-holder', 31 listClass: '.jet-ajax-search__results-list', 32 listInnerClass: '.jet-ajax-search__results-list-inner', 33 listSlideClass: '.jet-ajax-search__results-slide', 34 itemClass: '.jet-ajax-search__results-item', 35 countClass: '.jet-ajax-search__results-count', 36 messageHolderClass: '.jet-ajax-search__message', 37 fullResultsClass: '.jet-ajax-search__full-results', 38 navigationClass: '.jet-ajax-search__navigation-holder', 39 navButtonClass: '.jet-ajax-search__navigate-button', 40 bulletClass: '.jet-ajax-search__bullet-button', 41 numberClass: '.jet-ajax-search__number-button', 42 prevClass: '.jet-ajax-search__prev-button', 43 nextClass: '.jet-ajax-search__next-button', 44 activeNavClass: '.jet-ajax-search__active-button', 45 disableNavClass: '.jet-ajax-search__navigate-button-disable', 46 spinnerClass: '.jet-ajax-search__spinner-holder', 47 handlerId: 'jetSearchSettings', 48 isRtl: elementor.config.is_rtl ? elementor.config.is_rtl : $( 'body' ).hasClass( 'rtl' ) 49 }; 50 51 $scope.find( settings.searchClass ).jetAjaxSearch( settings ); 52 53 $scope.find( settings.chosenClass ).chosen( { 54 disable_search: true, 55 placeholder_text: '', 56 placeholder_text_single: '' 57 } ); 58 } 59 }; 60 61 $( window ).on( 'elementor/frontend/init', JetSearch.init ); 62 63 /** 64 * JetAjaxSearch jQuery Plugin 65 * 66 * @param args 67 */ 68 $.fn.jetAjaxSearch = function( args ) { 69 var self = this[0], 70 settings = args, 71 timer = null, 72 itemTemplate = null, 73 resultsArea = $( settings.resultsAreaClass, self ), 74 resultsHolder = $( settings.listHolderClass, resultsArea ), 75 resultsHeader = $( settings.resultsHeaderClass, resultsArea ), 76 resultsFooter = $( settings.resultsFooterClass, resultsArea ), 77 countHolder = $( settings.countClass, resultsArea ), 78 resultsList = $( settings.listClass, resultsArea ), 79 resultsListInner = $( settings.listInnerClass, resultsArea ), 80 resultsHeaderNav = $( settings.navigationClass, resultsHeader ), 81 resultsFooterNav = $( settings.navigationClass, resultsFooter ), 82 messageHolder = $( settings.messageHolderClass, resultsArea ), 83 spinner = $( settings.spinnerClass, resultsArea ), 84 data = $( self ).data( 'settings' ) || [], 85 formFocusClass = settings.searchFormClass.replace( '.', '' ) + '--focus', 86 currentPosition = 1; 87 88 if ( !self.isInit ) { 89 self.isInit = true; 90 91 /** 92 * Ajax request instance 93 */ 94 self.ajaxRequest = null; 95 96 /** 97 * Ajax settings from localized global variable 98 */ 99 self.ajaxSettings = window[ settings.handlerId ] || {}; 100 101 self.inputChangeHandler = function( event ) { 102 var value = $( event.target ).val(); 103 104 if ( 2 > value.length ) { 105 self.hideList(); 106 return false; 107 } 108 109 resultsHolder.removeClass( 'show' ); 110 self.outputMessage( '', '' ); 111 resultsListInner.css( 'transform', 'translateX(0)' ); 112 resultsList.css( 'height', 'auto' ); 113 114 if ( value ) { 115 self.showList(); 116 spinner.addClass( 'show' ); 117 118 clearTimeout( timer ); 119 timer = setTimeout( function() { 120 data.value = value; 121 data.deviceMode = elementor.getCurrentDeviceMode() ? elementor.getCurrentDeviceMode() : false;
122 self.ajaxSendData( data ); 123 }, 450 ); 124 } else { 125 self.hideList(); 126 } 127 }; 128 129 self.successCallback = function( response ) { 130 if ( ! response.success ) { 131 spinner.removeClass( 'show' ); 132 self.outputMessage( data.server_error, 'error show' ); 133 return; 134 } 135 136 var responseData = response.data, 137 error = responseData.error, 138 message = responseData.message, 139 posts = responseData.posts, 140 post = null, 141 outputHtml = '', 142 listItemHtml = '', 143 listHtml = '<div class="' + settings.listSlideClass.replace( '.', '' ) + '">%s</div>'; 144 145 resultsHolder.removeClass( 'show' ); 146 spinner.removeClass( 'show' ); 147 currentPosition = 1; 148 149 resultsListInner.html( '' ); 150 151 if ( 0 !== responseData.post_count && !error ) { 152 153 messageHolder.removeClass( 'show' ); 154 itemTemplate = wp.template( 'jet-ajax-search-results-item' ); 155 156 for ( post in posts ) { 157 listItemHtml += itemTemplate( posts[post] ); 158 159 if ( (parseInt( post ) + 1) % responseData.limit_query == 0 || parseInt( post ) === posts.length - 1 ) { 160 outputHtml += listHtml.replace( '%s', listItemHtml ); 161 listItemHtml = ''; 162 } 163 } 164 165 $( 'span', countHolder ).html( responseData.post_count ); 166 resultsListInner 167 .html( outputHtml ) 168 .data( 'columns', responseData.columns ); 169 resultsHeaderNav.html( responseData.results_navigation.in_header ); 170 resultsFooterNav.html( responseData.results_navigation.in_footer ); 171 resultsHolder.addClass( 'show' ); 172 resultsListInner.imagesLoaded( function() { 173 resultsList.css( 'height', $( settings.listSlideClass, resultsListInner ).eq(0).outerHeight() ); 174 } ); 175 176 } else { 177 self.outputMessage( message, 'show' ); 178 //self.hideList(); 179 } 180 }; 181 182 self.errorCallback = function( jqXHR ) { 183 if ( 'abort' !== jqXHR.statusText ) { 184 spinner.removeClass( 'show' ); 185 self.outputMessage( data.server_error, 'error show' ); 186 } 187 }; 188 189 self.ajaxSendData = function( sendData ) { 190 var ajaxData = { 191 action: self.ajaxSettings.action, 192 nonce: self.ajaxSettings.nonce, 193 data: sendData || {} 194 }; 195 196 self.ajaxRequest = jQuery.ajax( { 197 type: 'GET', 198 url: self.ajaxSettings.ajaxurl, 199 data: ajaxData, 200 dataType: 'json', 201 cache: false, 202 processData: true, 203 beforeSend: function( jqXHR, ajaxSettings ) { 204 if ( null !== self.ajaxRequest ) { 205 self.ajaxRequest.abort(); 206 } 207 }, 208 error: function( jqXHR, textStatus, errorThrown ) { 209 self.errorCallback( jqXHR ); 210 }, 211 success: function( response, textStatus, jqXHR ) { 212 self.successCallback( response ); 213 } 214 } ); 215 }; 216 217 self.hideList = function() { 218 resultsArea.removeClass( 'show' ); 219 }; 220 221 self.showList = function() { 222 resultsArea.addClass( 'show' ); 223 }; 224 225 self.focusHandler = function( event ) { 226 var value = event.target.value; 227 228 $( settings.searchFormClass, self ).addClass( formFocusClass ); 229 230 if ( 2 > value.length ) { 231 return; 232 } 233 234 self.showList(); 235 }; 236 237 self.blurHandler = function( event ) { 238 $( settings.searchFormClass, self ).removeClass( formFocusClass ); 239 }; 240 241 self.outputMessage = function( message, messageClass ) { 242 message = $( "<div/>" ).html( message ).text(); 243 message = message.replace( /\\*"/g, '' ); 244 messageHolder.removeClass( 'error show' ).addClass( messageClass ).html( message ); 245 }; 246 247 self.formClick = function( event ) { 248 event.stopPropagation(); 249 }; 250 251 self.clickFullResults = function() { 252 $( settings.searchFormClass, self ).submit(); 253 }; 254 255 self.changeSlide = function( number ) { 256 var currentSlide = $( settings.listSlideClass, resultsListInner ).eq( number ), 257 direction = settings.isRtl ? 1 : -1, 258 position = number * 100 * direction; 259 260 currentSlide.scrollTop( 0 ); 261 resultsListInner.css( 'transform', 'translateX(' + position + '%)' ); 262 resultsList.css( 'height', currentSlide.outerHeight() ); 263 }; 264 265 self.clickBulletHandler = function( event ) { 266 var target = $( event.target ); 267 268 currentPosition = target.data( 'number' ); 269 self.syncNavigation(); 270 271 self.changeSlide( currentPosition - 1 ); 272 }; 273 274 self.clickNavigationButtonHandler = function( event ) { 275 var target = $( event.target ), 276 direction = target.data( 'direction' ); 277 278 currentPosition = currentPosition + direction; 279 self.syncNavigation(); 280 281 self.changeSlide( currentPosition - 1 ); 282 }; 283 284 self.syncNavigation = function() { 285 var lastPosition = resultsListInner.data( 'columns' ), 286 disableClass = settings.disableNavClass.replace( '.', '' ), 287 activeClass = settings.activeNavClass.replace( '.', '' ); 288 289 $( settings.activeNavClass, self ).removeClass( activeClass ); 290 $( settings.disableNavClass, self ).removeClass( disableClass ); 291 292 $( settings.navButtonClass + '[data-number="' + currentPosition +'"]', self ).addClass( activeClass ); 293 294 if ( 1 === currentPosition ) { 295 $( settings.prevClass, self ).addClass( disableClass ); 296 } 297 298 if ( lastPosition === currentPosition ) { 299 $( settings.nextClass, self ).addClass( disableClass ); 300 } 301 }; 302 303 self.formSubmit = function( event ) { 304 var value = event.target.value; 305 306 if ( (2 > value.length || 0 === $( settings.itemClass, resultsListInner ).length) && (13 === event.keyCode || 'click' === event.type) ) { 307 return false;
308 } else { 309 if ( 13 === event.keyCode ) { 310 $( settings.searchFormClass, self ).submit(); 311 } 312 } 313 }; 314 315 self.changeHandler = function( event ) { 316 var target = $( event.target ), 317 settingsInput = $( settings.settingsInput, self ), 318 querySettings = JSON.parse( settingsInput.val() ), 319 globalQuerySettings = $( self ).data( 'settings' ); 320 321 querySettings.category__in = target.val(); 322 globalQuerySettings.category__in = target.val(); 323 324 settingsInput.val( JSON.stringify( querySettings ) ); 325 $( self ).data( 'settings', globalQuerySettings ); 326 327 self.inputChangeHandler( { target: $( settings.inputClass, self ) } ) 328 }; 329 330 self.chosenFocusHandler = function() { 331 self.hideList(); 332 }; 333 334 self.setResultsAreaWidth = function() { 335 336 if ( 'fields_holder' !== data.results_area_width_by ) { 337 return; 338 } 339 340 resultsArea.css( 'width', $( settings.fieldsHolderClass, self ).outerWidth() ); 341 }; 342 343 $( settings.inputClass, self ) 344 .on( 'input' + settings.searchClass, self.inputChangeHandler ) 345 .on( 'focus' + settings.searchClass, self.focusHandler ) 346 .on( 'blur' + settings.searchClass, self.blurHandler ) 347 .on( 'keypress' + settings.searchClass, self.formSubmit ); 348 349 $( settings.submitClass ).on( 'click' + settings.searchClass, self.clickFullResults ); 350 351 $( self ) 352 .on( 'click' + settings.searchClass, self.formClick ) 353 .on( 'touchend' + settings.searchClass, self.formClick ) 354 .on( 'click' + settings.searchClass, settings.fullResultsClass, self.clickFullResults ) 355 .on( 'click' + settings.searchClass, settings.countClass, self.clickFullResults ) 356 .on( 'click' + settings.searchClass, settings.bulletClass, self.clickBulletHandler ) 357 .on( 'click' + settings.searchClass, settings.numberClass, self.clickBulletHandler ) 358 .on( 'click' + settings.searchClass, settings.prevClass + ':not( ' + settings.disableNavClass + ' )', self.clickNavigationButtonHandler ) 359 .on( 'click' + settings.searchClass, settings.nextClass + ':not( ' + settings.disableNavClass + ' )', self.clickNavigationButtonHandler ) 360 .on( 'change', settings.chosenClass, self.changeHandler ) 361 .on( 'chosen:showing_dropdown', settings.chosenClass, self.chosenFocusHandler ); 362 363 // If after reloading the page the value of the select is not '0'. 364 if ( '0' !== $( settings.chosenClass, self ).val() ) { 365 $( settings.chosenClass, self ).trigger( 'change' ); 366 } 367 368 $( 'body' ) 369 .on( 'click' + settings.searchClass, self.hideList ) 370 .on( 'touchend' + settings.searchClass, self.hideList ); 371 372 self.setResultsAreaWidth(); 373 $( window ).on( 'resize' + settings.searchClass, self.setResultsAreaWidth ); 374 375 } else { 376 return 'is init: true'; 377 } 378 }; 379 380}( jQuery, window.elementorFrontend ));
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.