PageSourceSearch

https://shopingholicari.rs/wp-content/plugins/jet-search/assets/js/jet-search.js?ver=2.1.4

js shopingholicari.rs collected 2026-10-08 23:39:04 UTC 12,694 bytes, 380 lines download raw bytes

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.