PageSourceSearch

https://uac.org.au/wp-content/plugins/w2dc/search/plugin/resources/js/js_functions.js?ver=1.2.13

js uac.org.au collected 2026-10-04 13:20:35 UTC 112,228 bytes, 3,392 lines download raw bytes

1
2
3var wcsearch_query_string = decodeURIComponent(wcsearch_js_objects.query_string); //place default values here
4
5var wcsearch_recount_attempts = 0;
6var wcsearch_max_counters = 200;
7var wcsearch_request_processing = false;
8
9var wcsearch_do_scroll = true;
10
11(function($) {
12	"use strict";
13	
14	$(function() {
15		wcsearch_init();
16	});
17	
18	window.wcsearch_init = function() {
19		wcsearch_process_main_search_fields();
20		wcsearch_custom_input_controls();
21		wcsearch_setup_terms_separators();
22		wcsearch_sticky_scroll();
23		wcsearch_continue_recounting();
24		wcsearch_init_open_close_dep_inputs();
25		wcsearch_post_off_beforeunload();
26	}
27	
28	window.wcsearch_post_off_beforeunload = function() {
29		
30		// Prevent WP from asking confirmation to navigate away from the current post in admin.
31		if ($("#post").length) {
32			$(window).off("beforeunload");
33		}
34	}
35	
36	window.wcsearch_init_open_close_dep_inputs = function() {
37		$("form").each( function(index, form) {
38			wcsearch_open_close_dep_inputs($(form));
39		});
40	}
41	
42	window.wcsearch_is_model = function() {
43		return $(".wcsearch-search-model-wrapper").length;
44	}
45	
46	window.wcsearch_search_input = (function(input) {
47		this.input = input;
48		
49		this.get_value = function() {
50			if (this.input.is(".wcsearch-hidden-field[type=hidden]")) {
51				return { name: this.input.prop("name"), value: this.input.val() };
52			}
53			
54			if (this.input.find("[type=checkbox]").length) {
55				var checkboxes = this.input.find("[type=checkbox]");
56				
57				var checkboxes_name;
58				var selected = [];
59				checkboxes.each(function() {
60					if ($(this).is(":checked")) {
61						selected.push($(this).val());
62					}
63				    checkboxes_name = $(this).prop("name");
64				});
65				
66				if (selected.length) {
67					
68					var result = [{ name: checkboxes_name, value: selected.join(",") }];
69					
70					if (this.input.data("relation") == "AND") {
71						result.push({ name: checkboxes_name+"_relation", value: this.input.data("relation") });
72					}
73					
74					return result;
75				}
76			}
77			
78			if (this.input.find("[type=radio]:checked").length) {
79				var radio = this.input.find("[type=radio]:checked");
80				
81				return { name: radio.prop("name"), value: radio.val() };
82			}
83			
84			if (this.input.attr("data-type") == "price" || this.input.attr("data-type") == "number") {
85				
86				var slug = this.input.attr("data-slug");
87			
88				// price 2 inputs/dropdowns cahnge price input
89				if (this.input.find(".wcsearch-search-input-1, .wcsearch-search-input-2").length) {
90					
91					var min_input = this.input.find(".wcsearch-search-input-1");
92					var max_input = this.input.find(".wcsearch-search-input-2");
93					
94					var min = '';
95					if (min_input.val() && !isNaN(min_input.val())) {
96						min = min_input.val();
97					}
98					var max = '';
99					if (max_input.val() && !isNaN(max_input.val())) {
100						max = max_input.val();
101					}
102					var val = '';
103					if (min || max) {
104						val = min+'-'+max;
105					}
106					
107					this.input.find("input[name="+slug+"]").val(val); 
108				}
109				
110				// price single dropdown
111				if (this.input.find(".wcsearch-search-input-single-select").length) {
112				
113					var val = this.input.find(".wcsearch-search-input-single-select").val();
114					
115					return { name: slug, value: val };
116				}
117				
118				// price range/single slider
119				if (this.input.find("input[name="+slug+"]:not([type=radio])").length) {
120					var val = this.input.find("input[name="+slug+"]").val();
121					
122					return { name: slug, value: val };
123				}
124			}
125			
126			if (this.input.find("input[name=more_filters]").length) {
127				var val = this.input.find("input[name=more_filters]").val();
128				
129				return { name: 'more_filters', value: val };
130			}
131			
132			if (this.input.find("input[name=radius]").length) {
133				var val = this.input.find("input[name=radius]").val();
134				
135				return { name: 'radius', value: val };
136			}
137			
138			if (this.input.find("input.wcsearch-date-input").length) {
139				var val = this.input.find("input.wcsearch-date-input").val();
140				var name = this.input.find("input.wcsearch-date-input").attr("name");
141				
142				if (val != "-") {
143					return { name: name, value: val };
144				}
145			}
146			
147			if (this.input.find("input.wcsearch-search-string-input").length) {
148				var val = this.input.find("input.wcsearch-search-string-input").val();
149				var name = this.input.find("input.wcsearch-search-string-input").attr("name");
150				
151				return { name: name, value: val };
152			}
153			
154			if (this.input.find("input.wcsearch-search-terms-buttons-input").length) {
155				var val = this.input.find("input.wcsearch-search-terms-buttons-input").val();
156				var name = this.input.find("input.wcsearch-search-terms-buttons-input").attr("name");
157				
158				if (val) {
159					
160					var result = [{ name: name, value: val }];
161					
162					if (this.input.data("relation") == "AND") {
163						result.push({ name: name+"_relation", value: this.input.data("relation") });
164					}
165					
166					return result;
167				}
168			}
169			
170			if (this.input.find(".wcsearch-main-search-field").length) {
171				if (this.input.data("type") == "tax" || this.input.data("type") == "select") {
172					var tax_val = this.input.find("[id^=selected_tax]").val();
173					var tax_name = this.input.find("[id^=selected_tax]").prop("name");
174					
175					if (this.input.find("input[name='keywords'], input[name='address']").length) {
176						// both keywords/address and tax
177						
178						var field_name = '';
179						var place_id = '';
180						if (this.input.find("input[name='keywords']").length) {
181							field_name = "keywords";
182						} else if (this.input.find("input[name='address']").length) {
183							field_name = "address";
184							if (this.input.find("input[name='place_id']").length) {
185								place_id = this.input.find("input[name='place_id']").val();
186							}
187						}
188						var string_val = this.input.find("input[name="+field_name+"]").val();
189						
190						if (string_val === '') {
191							return { name: tax_name, value: tax_val };
192						}
193						
194						if (tax_val === '') {
195							if (string_val) {
196								return [{ name: field_name, value: string_val }, { name: "place_id", value: place_id }];
197							}
198						} else {
199							
200							var string_in_select;
201							// look through select, when found - it is tax term, not keywords/address
202							if (this.input.find("select option").filter(function () { return $(this).text() == string_val; }).length) {
203								string_in_select = { name: tax_name, value: tax_val };
204							}
205							
206							if (string_in_select) {
207								return string_in_select;
208							} else {
209								return [{ name: field_name, value: string_val }, { name: "place_id", value: place_id }];
210							}
211						}
212					} else {
213						// only tax
214						
215						var result = [{ name: tax_name, value: tax_val }];
216						
217						if (tax_val && this.input.data("relation") == "AND") {
218							result.push({ name: tax_name+"_relation", value: this.input.data("relation") });
219						}
220						
221						return result;
222					}
223				} else if (this.input.find("input[name='keywords'], input[name='address']").length) {
224					
225					var field_name = '';
226					var place_id = '';
227					if (this.input.find("input[name='keywords']").length) {
228						field_name = "keywords";
229					} else if (this.input.find("input[name='address']").length) {
230						field_name = "address";
231						if (this.input.find("input[name='place_id']").length) {
232							place_id = this.input.find("input[name='place_id']").val();
233						}
234					}
235					var string_val = this.input.find("input[name="+field_name+"]").val();
236					
237					return [{ name: field_name, value: string_val }, { name: "place_id", value: place_id }];
238				}
239			} else {
240				// tax range slider
241				if (this.input.has(".wcsearch-range-slider, .wcsearch-single-slider").find("input[data-tax]").length) {
242					var tax_val = this.input.find("input[data-tax]").val();
243					var tax_name = this.input.find("input[data-tax]").prop("name");
244					
245					return { name: tax_name, value: tax_val };
246				}
247			}
248			
249			if (this.input.find("select.wcsearch-selectbox-input").length) {
250				var val = this.input.find("select.wcsearch-selectbox-input").val();
251				var name = this.input.find("select.wcsearch-selectbox-input").attr("name");
252				
253				return { name: name, value: val };
254			}
255			
256			return '';
257		},
258		this.reset = function() {
259			
260			if (this.input.hasClass("wcsearch-search-input-always-closed")) {
261				return false;
262			}
263			
264			// temporarily disable submission on changes while resetting
265			wcsearch_request_processing = true;
266			
267			if (this.input.find(".wcsearch-main-search-field").length) {
268				this.input.find(".wcsearch-main-search-field").trigger("reset");
269			}
270			
271			if (this.input.find(".wcsearch-search-input-1, .wcsearch-search-input-2").length) {
272				this.input.find("input, select").val('');
273			}
274			
275			if (this.input.find("select").length) {
276				this.input.find("select").prop('selectedIndex', 0);
277			}
278			
279			if (this.input.find("[type=radio]").length) {
280				this.input.find("[type=radio]").prop('checked', false);
281				this.input.find(".wcsearch-radio-reset-btn").remove();
282			}
283			
284			if (this.input.find("[type=checkbox]").length) {
285				this.input.find("[type=checkbox]").prop('checked', false);
286			}
287			
288			if (this.input.find("input.wcsearch-date-input").length) {
289				this.input.find("input.wcsearch-date-input").trigger("reset");
290			}
291			
292			if (this.input.find("input.wcsearch-search-string-input").length) {
293				this.input.find("input.wcsearch-search-string-input").val('');
294			}
295			
296			if (this.input.find("input.wcsearch-search-terms-buttons-input").length) {
297				this.input.find("input.wcsearch-search-terms-buttons-input").val('');
298				
299				this.input.find(".wcsearch-search-term-button").removeClass("wcsearch-search-term-button-active");
300			}
301			
302			// range slider
303			if (this.input.find(".wcsearch-range-slider").length) {
304				var slider = this.input.find(".wcsearch-range-slider");
305				var options = slider.slider('option');
306				
307				slider.slider("values", [options.min, options.max]);
308				slider.slider("option", "slide")(null, { values: [options.min, options.max] });
309			}
310			
311			// single slider
312			if (this.input.find(".wcsearch-single-slider").length) {
313				var slider = this.input.find(".wcsearch-single-slider");
314				var option = slider.slider("option");
315				var input = this.input.find("input");
316				
317				if (this.input.data("default_values")) {
318					var value = this.input.data("default_values");
319				} else {
320					var value = option.min;
321				}
322				
323				slider.slider("value", value);
324				slider.slider("option", "slide")(null, { value: value });
325				input.val(value);
326			}
327			
328			wcsearch_request_processing = false;
329		},
330		this.is_opened = function() {
331			if (!this.input.hasClass("wcsearch-search-input-closed")) {
332				return true;
333			}
334		},
335		this.open = function() {
336			this.input.removeClass("wcsearch-search-input-closed");
337			this.input.addClass("wcsearch-search-input-opened");
338		},
339		this.close = function() {
340			this.input.removeClass("wcsearch-search-input-opened");
341			this.input.addClass("wcsearch-search-input-closed");
342		}
343	});
344	
345	window.wcsearch_get_luma_color = function(c) {
346		var c = c.substring(1);      // strip #
347		var rgb = parseInt(c, 16);   // convert rrggbb to decimal
348		var r = (rgb >> 16) & 0xff;  // extract red
349		var g = (rgb >>  8) & 0xff;  // extract green
350		var b = (rgb >>  0) & 0xff;  // extract blue
351
352		var luma = 0.2126 * r + 0.7152 * g + 0.0722 * b; // per ITU-R BT.709
353
354		return luma;
355	}
356	
357	window.wcsearch_sticky_scroll = function() {
358		$('.wcsearch-sticky-scroll').each(function() {
359			var element = $(this);
360			var form = element.find("form");
361			var id = form.data("id");
362			var toppadding = (form.data("toppadding")) ? form.data("toppadding") : 0;
363			
364			if (element.parents("div[class*='-map-sidebar']").length) {
365				var map_sidebar = element.parents("div[class*='-map-sidebar']");
366				var search_wrapper = map_sidebar.find(".wcsearch-search-wrapper");
367				var listings_wrapper = map_sidebar.find("div[class*='-map-sidebar-listings-wrapper']");
368				
369				if (listings_wrapper.length) {
370					var listings_wrapper_height = map_sidebar.height() - search_wrapper.outerHeight();
371					listings_wrapper.height(listings_wrapper_height);
372				}
373			} else {
374				if ($("body").hasClass("admin-bar")) {
375					toppadding = toppadding + 32;
376				}
377				
378				if ($(window).height() >= 768) {
379					if ($('.site-header.header-fixed').length) {
380						var headerHeight = $('.site-header.header-fixed').outerHeight();
381						toppadding = toppadding + headerHeight;
382					}
383				}
384	
385				if (!$("#wcsearch-scroller-anchor-"+id).length) {
386					var anchor = $("<div>", {
387						id: 'wcsearch-scroller-anchor-'+id
388					});
389					element.before(anchor);
390		
391					var background = $("<div>", {
392						id: 'wcsearch-sticky-scroll-background-'+id,
393						class: 'wcsearch-sticky-scroll-background',
394						style: {position: 'relative'}
395					});
396					element.after(background);
397				}
398					
399				window["wcsearch_sticky_scroll_toppadding_"+id] = toppadding;
400		
401				$("#wcsearch-sticky-scroll-background-"+id).position().left = element.position().left;
402				$("#wcsearch-sticky-scroll-background-"+id).position().top = element.position().top;
403				$("#wcsearch-sticky-scroll-background-"+id).width(element.width());
404				$("#wcsearch-sticky-scroll-background-"+id).height(element.height());
405	
406				var wcsearch_scroll_function = function(e) {
407					var id = e.data.id;
408					var toppadding = e.data.toppadding;
409					var b = $(document).scrollTop();
410					var d = $("#wcsearch-scroller-anchor-"+id).offset().top - toppad
410ding;
411					var c = e.data.obj;
412					var e = $("#wcsearch-sticky-scroll-background-"+id);
413					
414					c.width(c.parent().width()).css({ 'z-index': 100 });
415			
416					// .wcsearch-scroller-bottom - this is special class used to restrict the area of scroll of map canvas
417					if ($(".wcsearch-scroller-bottom").length) {
418						var f = $(".wcsearch-scroller-bottom").offset().top - (c.height() + toppadding);
419					} else {
420						var f = $(document).height();
421					}
422			
423					if (f > c.height()) {
424						if (b >= d && b < f) { // fixed
425							c.css({ position: "fixed", top: toppadding });
426							e.css({ position: "relative" });
427						} else { // unfixed
428							if (b <= d) {
429								c.stop().css({ position: "relative", top: "" });
430								e.css({ position: "absolute" });
431							}
432							if (b >= f) {
433								c.css({ position: "absolute" });
434								c.stop().offset({ top: f + toppadding });
435								e.css({ position: "relative" });
436							}
437						}
438					} else {
439						c.css({ position: "relative", top: "" });
440						e.css({ position: "absolute" });
441					}
442				};
443				
444				$("#wcsearch-sticky-scroll-background-"+id).css({ position: "relative" });
445				
446				var args = {id: id, obj: $(this), toppadding: toppadding};
447				$(window).scroll(args, wcsearch_scroll_function);
448				wcsearch_scroll_function({data: args});
449			}
450		});
451	}
452
453	window.wcsearch_create_radio_control_reset = function(item) {
454		var delete_btn = $("<span>", {
455			class: "wcsearch-radio-reset-btn wcsearch-fa wcsearch-fa-close",
456			title: wcsearch_js_objects.radio_reset_btn_title
457		}).appendTo(item);
458		
459		$(document).on("click", ".wcsearch-radio-reset-btn", function() {
460			$(this).parent().find("input").prop('checked', false);
461			$(this).parents("label").find("input").trigger("change");
462			$(this).remove();
463		});
464	}
465	$(".wcsearch-radio label input:checked").each(function() {
466		wcsearch_create_radio_control_reset($(this).parents("label"));
467	});
468	$(document).on("click", ".wcsearch-radio label", function(event) {
469		if ($(event.target).is(".wcsearch-radio-reset-btn")) {
470			return false;
471		}
472		
473		$(this).parents(".wcsearch-search-input-terms-column").parent().find(".wcsearch-radio-reset-btn").remove();
474		$(this).parents(".wcsearch-search-model-input-terms-column").parent().find(".wcsearch-radio-reset-btn").remove();
475		
476		wcsearch_create_radio_control_reset($(this));
477	});
478	window.wcsearch_custom_input_controls = function() {
479		// Custom input controls
480		$(".wcsearch-checkbox label, .wcsearch-radio label").each(function() {
481			if (!$(this).find(".wcsearch-control-indicator").length) {
482				$(this).append($("<div>").addClass("wcsearch-control-indicator"));
483			}
484		});
485		
486		var slider_input_controls = function(el) {
487			var sheet = document.createElement('style');
488			document.body.appendChild(sheet);
489			
490			var prefs = ['webkit-slider-runnable-track', 'moz-range-track', 'ms-track'];
491			
492			var id = $(el).attr('id');
493			var slider_color = $('#'+id).css("background-color");
494			var curVal = parseInt(el.value);
495			var rating = (curVal + 1) / 2;
496			var gradientVal = (curVal - 1) * 12.5;
497			var style = '';
498
499			$('.wcsearch-range-slider-labels.'+id+' li').removeClass('wcsearch-range-slider-labels-active wcsearch-range-slider-labels-selected');
500			var curLabel = $('.wcsearch-range-slider-labels.'+id).find('li:nth-child(' + curVal + ')');
501			curLabel.addClass('wcsearch-range-slider-labels-active wcsearch-range-slider-labels-selected');
502			curLabel.prevAll().addClass('wcsearch-range-slider-labels-selected');
503
504			$('.wcsearch-range-slider-value.'+id).html(rating);
505			
506			var gradient_destination = 'to right';
507			if (wcsearch_js_objects.is_rtl) {
508				gradient_destination = 'to left';
509			}
510
511			for (var i = 0; i < prefs.length; i++) {
512				style += '#'+id+'::-' + prefs[i] + '{background: linear-gradient(' + gradient_destination + ', ' + slider_color + ' 0%, ' + slider_color + ' ' + gradientVal + '%, #f0f0f0 ' + gradientVal + '%, #f0f0f0 100%)}';
513			}
514			sheet.textContent = style;
515			
516			var sum = 0;
517			$('.wcsearch-range-slider-value').each(function() {
518				sum += Number($(this).text());
519			});
520			var avg = Math.round(sum/$('.wcsearch-range-slider-value').length*10)/10;
521			var avg_percents = Math.round(((sum/$('.wcsearch-range-slider-value').length)-1)*25);
522			$('.wcsearch-progress-circle span').text(avg.toFixed(1));
523			$('.wcsearch-progress-circle').removeClass().addClass('wcsearch-progress-circle').addClass('p'+avg_percents);
524			if (avg_percents > 50) {
525				$('.wcsearch-progress-circle').addClass('wcsearch-over50');
526			}
527		}
528		$(".wcsearch-range-slider-input").each(function () {
529			slider_input_controls(this);
530		});
531		$(".wcsearch-range-slider-input").on('input', function () {
532			slider_input_controls(this);
533		});
534		$('.wcsearch-range-slider-labels li').on('click', function () {
535			var index = $(this).index();
536			var input = $(this).parents('.wcsearch-range-slider').find('.wcsearch-range-slider-input');
537			input.val(index + 1).trigger('input');
538		});
539	}
540	
541	window.wcsearch_ajax_loader_target_show = function(target, scroll_to_anchor, offest_top) {
542		if (typeof scroll_to_anchor != 'undefined' && scroll_to_anchor) {
543			if (typeof offest_top == 'undefined' || !offest_top) {
544				var offest_top = 0;
545			}
546			$('html,body').animate({scrollTop: scroll_to_anchor.offset().top - offest_top}, 'slow');
547		}
548		var target_id = target.attr("id");
549		var form_id = target.attr("data-form-id");
550		if (!$("[data-loader-id='"+target_id+"']").length) {
551			var loader = $('<div data-loader-id="'+target_id+'" class="wcsearch-ajax-target-loading"><div class="wcsearch-loader wcsearch-loader-'+form_id+'"></div></div>');
552			target.prepend(loader);
553			loader.css({
554				width: target.innerWidth(),
555				height: target.innerHeight()
556			});
557			if (target.outerHeight() > 600) {
558				loader.find(".wcsearch-loader").addClass("wcsearch-loader-max-top");
559			}
560		}
561	}
562	window.wcsearch_ajax_loader_target_hide = function(target_id) {
563		$("[data-loader-id='"+target_id+"']").remove();
564	}
565	
566	window.wcsearch_ajax_loader_show = function(msg) {
567		var overlay = $('<div id="wcsearch-ajax-loader-overlay"><div class="wcsearch-loader"></div></div>');
568	    $('body').append(overlay);
569	}
570	
571	window.wcsearch_ajax_loader_hide = function() {
572		$("#wcsearch-ajax-loader-overlay").remove();
573	}
574	
575	window.wcsearch_ajax_iloader = $("<div>", { class: 'wcsearch-ajax-iloader' }).html('<div class="rect1"></div><div class="rect2"></div><div class="rect3"></div><div class="rect4"></div><div class="rect5"></div>');
576	window.wcsearch_add_iloader_on_element = function(button) {
577		button
578		.attr('disabled', 'disabled')
579		.wrapInner('<div class="wcsearch-hidden"></div>')
580		.append(wcsearch_ajax_iloader);
581	}
582	window.wcsearch_delete_iloader_from_element = function(button) {
583		button.find(".wcsearch-hidden").contents().unwrap();
584		button.removeAttr('disabled').find(".wcsearch-ajax-iloader").remove();
585	}
586})(jQuery);
587
588(function($) {
589	"use strict";
590	
591	$(document).on("click",
592			".wcsearch-search-input-closed .wcsearch-search-input-label," +
593			".wcsearch-search-input-opened .wcsearch-search-input-label",
594	function() {
595		
596		var input = new wcsearch_search_input($(this).parents(".wcsearch-search-input"))
597		
598		if (input.is_opened()) {
599			input.close();
600		} else {
601			input.open();
602		}
603		
604		wcsearch_setup_terms_separators();
605	});
606	
607	$("body").on("change",
608			".wcsearch-search-model-input input[type=\"checkbox\"]," +
609			".wcsearch-search-model-input input[type=\"radio\"]",
610	function() {
611		var input = $(this).parents(".wcsearch-search-model-input");
612		var values = [];
613		input.find("input:checked").each(function() {
614			values.push($(this).val());
615		});
616		input.attr("data-values", values.join(','));
617		
618		wcsearch_model_update_placeholders();
619	});
620	
621	$("body").on("change",
622			".wcsearch-search-model-input input[name=\"price\"]," +
623			".wcsearch-search-model-input input[name=\"radius\"]," +
624			".wcsearch-search-model-input select",
625	function() {
626		var input = $(this).parents(".wcsearch-search-model-input");
627		var values = $(this).val();
628		
629		input.attr("data-values", values);
630		
631		wcsearch_model_update_placeholders();
632	});
633	
634	$("body").on("change",
635			".wcsearch-search-model-input select[name=field_price_min]," +
636			".wcsearch-search-model-input select[name=field_price_max]",
637	function() {
638		var input = $(this).parents(".wcsearch-search-model-input");
639		var values = [input.find("select[name=field_price_min]").val(), input.find("select[name=field_price_max]").val()];
640		input.attr("data-values", values.join('-'));
641		
642		wcsearch_model_update_placeholders();
643	});
644	
645	$("body").on("change",
646			".wcsearch-search-model-input input[id^='selected_tax']",
647	function() {
648		var input = $(this).parents(".wcsearch-search-model-input");
649		var values = $(this).val();
650		input.attr("data-values", values);
651		
652		wcsearch_model_update_placeholders();
653	});
654	
655	$("body").on("change",
656			".wcsearch-search-model-input-one-select select," +
657			".wcsearch-search-model-input-tax-select select",
658	function() {
659		var input = $(this).parents(".wcsearch-search-model-input");
660		var values = $(this).val();
661		input.attr("data-values", values);
662		
663		wcsearch_model_update_placeholders();
664	});
665	
666	$("body").on("change",
667			".wcsearch-search-model-input-range input," +
668			".wcsearch-search-model-input-single-slider input",
669	function() {
670		var input = $(this).parents(".wcsearch-search-model-input");
671		var values = $(this).val();
672		input.attr("data-values", values);
673		
674		wcsearch_model_update_placeholders();
675	});
676	
677	$("body").on("change",
678			".wcsearch-search-model-input-1," +
679			".wcsearch-search-model-input-2",
680	function() {
681		var input = $(this).parents(".wcsearch-search-model-input");
682		
683		if (input.find(".wcsearch-search-model-input-1, .wcsearch-search-model-input-2").length) {
684			
685			var min_input = input.find(".wcsearch-search-model-input-1");
686			var max_input = input.find(".wcsearch-search-model-input-2");
687			
688			var min = '';
689			if (min_input.val() && !isNaN(min_input.val())) {
690				min = min_input.val();
691			}
692			var max = '';
693			if (max_input.val() && !isNaN(max_input.val())) {
694				max = max_input.val();
695			}
696			var values = '';
697			if (min || max) {
698				values = min+'-'+max;
699			}
700			
701			input.attr("data-values", values);
702		}
703		
704		wcsearch_model_update_placeholders();
705	});
706	
707	$("body").on("click",
708			".wcsearch-search-input .wcsearch-search-term-button .wcsearch-btn," +
709			".wcsearch-search-model-input .wcsearch-search-term-button .wcsearch-btn",
710	function() {
711		if (wcsearch_is_model()) {
712			var input = $(this).parents(".wcsearch-search-model-input");
713		} else {
714			var input = $(this).parents(".wcsearch-search-input");
715		}
716		var btn_wrapper = $(this).parents(".wcsearch-search-term-button");
717		var values = '';
718		
719		if (input.data("mode") == "checkboxes_buttons") {
720			btn_wrapper.toggleClass("wcsearch-search-term-button-active");
721			
722			var selected_terms_ids = [];
723			var selected_terms = input.find(".wcsearch-search-term-button-active");
724			$.each(selected_terms, function() {
725				selected_terms_ids.push($(this).data("term-id"));
726			});
727			if (selected_terms_ids) {
728				values = selected_terms_ids.join(",");
729			}
730		} else if (input.data("mode") == "radios_buttons") {
731			if (btn_wrapper.hasClass("wcsearch-search-term-button-active")) {
732				input.find(".wcsearch-search-term-button").removeClass("wcsearch-search-term-button-active");
733			} else {
734				input.find(".wcsearch-search-term-button").removeClass("wcsearch-search-term-button-active");
735				btn_wrapper.toggleClass("wcsearch-search-term-button-active");
736				values = btn_wrapper.data("term-id");
737			}
738		} else {
739			btn_wrapper.toggleClass("wcsearch-search-term-button-active");
740			if (btn_wrapper.hasClass("wcsearch-search-term-button-active")) {
741				values = btn_wrapper.data("term-id");
742			}
743		}
744		
745		if (wcsearch_is_model()) {
746			input.attr("data-values", values);
747			
748			wcsearch_model_update_placeholders();
749		} else {
750			input.find("input.wcsearch-search-terms-buttons-input").val(values).trigger("change");
751		}
752	});
753	
754	window.wcsearch_setup_terms_separators = function() {
755		$(
756			".wcsearch-search-input-checkboxes," +
757			".wcsearch-search-input-radios," +
758			".wcsearch-search-input-checkboxes_buttons," +
759			".wcsearch-search-input-radios_buttons," +
760			".wcsearch-search-model-input-checkboxes," +
761			".wcsearch-search-model-input-checkboxes_buttons," +
762			".wcsearch-search-model-input-radios," +
763			".wcsearch-search-model-input-radios_buttons"
764		).each(function() {
765			if (wcsearch_is_model()) {
766				// model
767				var container = $(this).find(".wcsearch-search-model-input-terms-columns");
768			} else {
769				// frontend
770				var container = $(this).find(".wcsearch-search-input-terms-columns");
771			}
772			
773			var input_data = $(this).data();
774			
775			var height_limit = input_data["height_limit"];
776			if (height_limit > 0) {
777				container.css("height", "auto");
778				if (container.outerHeight() > height_limit) {
779
780					if (input_data["how_to_limit"] == "use_scroll") {
781						container.css("height", height_limit);
782					} else if (input_data["how_to_limit"] == "show_more_less") {
783						var overlay = $(this);
784						
785						container.parent().find(".wcsearch-search-separator-link").remove();
786						
787						var separator_link = $("<div />")
788						.addClass("wcsearch-search-separator-link")
789						.attr("data-status", "closed")
790						.attr("data-text-open", input_data["text_open"])
791						.attr("data-text-close", input_data["text_close"])
792						.html(input_data["text_open"]+' <span class="wcsearch-fa wcsearch-fa-chevron-down"></span>');
793							
794						container.after(separator_link[0]);
795						
796						container.css("height", height_limit);
797						container.css("overflow", "hidden");
798						
799						separator_link.on("click", function() {
800							var status = $(this).attr("data-status");
801							if (status === "closed") {
802								$(this).attr("data-status", "opened");
803							
804								var chevron = $("<span />").addClass("wcsearch-fa wcsearch-fa-chevron-up");
805								$(this).html($(this).data("text-close")+" ").append(chevron[0]);
806								container.css("overflow", "auto");
807								container.css("height", height_limit+50);
808							} else {
809								$(this).attr("data-status", "closed");
810							
811								var chevron = $("<span />").addClass("wcsearch-fa wcsearch-fa-chevron-down");
812								$(this).html($(this).data("text-open")+" ").append(chevron[0]);
813								container.css("overflow", "hidden");
814								container.css("height", height_limit);
815								container.scrollTop(0);
816							}
817						});
818					}
819				}
820			}
821		});
822	};
823	
824	var wcsearch_used_by = 'wc';
825	if ($(".wcsearch-search-form").length && $(".wcsearch-search-form").data("used_by")) {
826		wcsearch_used_by = $(".wcsearch-search-form").data("used_by");
827	} else if ($("[name='used_by']").length && $("[name='used_by']").val()) {
828		wcsearch_used_by = $("[name='used_by']").val();
829	}
830	
831	var wcsearch_submit_callback = wcsearch_js_objects.adapter_options[wcsearch_used_by].submit_callback;
832	
833	window.wcsearch_get_loop = function() {
834		var selectors = wcsearch_js_objects.adapter_options[wcsearch_used_by].loop_selector_name;
835		
836		if (!$.isArray(selectors)) {
837			selectors = [wcsearch_js_objects.adapter_options[wcsearch_used_by].loop_selector_name];
838		}
839		
840		var selected_selector;
841		$.each(selectors, function(index, selector_name) {
842			var wcsearch_loop_name = "div[id^='"+selector_name+"']";
843			
844			if ($(wcsearch_loop_name).length) {
845				selected_selector = $(wcsearch_loop_name);
846				return false;
847			}
848		});
849		
850		return selected_selector;
851	}
852	
853	window.wcsearch_add_common_fields = function(post_params, form) {
854		form.find(".wcsearch-common-field").each(function() {
855			if ($(this).attr("name").indexOf("[]") != -1) {
856				var attr_name = $(this).attr("name");
857				if (typeof post_params[attr_name] == 'undefined') {
858					post_params[attr_name] = [];
859				}
860				post_params[attr_name].push($(this).attr("value"));
861			} else {
862				post_params[$(this).attr("name")] = $(this).attr("value");
863			}
864		})
865		
866		return post_params;
867	}
868	
869	window.wcsearch_add_count_fields = function(post_params, form) {
870		post_params.count_params = [];
871		form.find(".wcsearch-count-field").each(function() {
872			post_params.count_params.push({ name: $(this).attr("name"), value: $(this).attr("value") });
873		})
874		
875		return post_params;
876	}
877	
878	window.wcsearch_only_unique = function(value, index, self) {
879		return self.indexOf(value) === index;
880	}
881	
882	window.wcsearch_get_query_string_param = function(param_name) {
883		
884		var param_value;
885		var parts = wcsearch_query_string.split('&');
886		$.each(parts, function(index, key_value) {
887			key_value = key_value.split('=');
888			if (key_value[0] == param_name) {
889				param_value = key_value[1];
890				return;
891			}
892		});
893		return param_value;
894	}
895	window.wcsearch_extend_query_string_params = function(params) {
896		
897		var parts = wcsearch_query_string.split('&');
898		for (const [key, value] of Object.entries(params)) {
899			var key_exists = false;
900			$.each(parts, function(index, key_value) {
901				key_value = key_value.split('=');
902				if (key == key_value[0]) {
903					parts[index] = key+'='+value;
904					key_exists = true;
905					return;
906				}
907			});
908			if (!key_exists) {
909				parts.push(key+'='+value);
910			}
911		}
912		parts = parts.filter(wcsearch_only_unique);
913		wcsearch_query_string = parts.join('&');
914	}
915	
916	window.wcsearch_insert_param_in_uri = function(...args) {
917
918		var hash = window.location.hash.substring(1);
919
920		if (!Array.isArray(args[0]) && args.length == 2) {
921			args = [[args[0], args[1]]];
922		}
923		
924		var parts = document.location.search.substr(1).split('&').filter(
924Boolean);
925		for (let [key, value] of args) {
926			key = encodeURIComponent(key);
927			value = encodeURIComponent(value);
928			
929			let key_exists = false;
930			$.each(parts, function(index, key_value) {
931				key_value = key_value.split('=');
932				if (key == key_value[0]) {
933					parts[index] = key+'='+value;
934					key_exists = true;
935					return;
936				}
937			});
938			if (!key_exists) {
939				parts.push(key+'='+value);
940			}
941		}
942		
943		let params = parts.join('&');
944
945		if (hash) {
946			hash = '#' + hash;
947		}
948
949		window.history.pushState("", "", "?" + params + hash);
950	}
951	
952	window.wcsearch_remove_param_from_uri = function(...args) {
953		
954		var hash = window.location.hash.substring(1);
955		
956		var parts = document.location.search.substr(1).split('&').filter(Boolean);
957		for (let key of args) {
958			key = encodeURIComponent(key);
959			
960			let _parts = parts.slice(); // copy array, do not affect splice on _parts when we do $.each
961			
962			$.each(_parts, function(index, key_value) {
963				key_value = key_value.split('=');
964				if (key == key_value[0]) {
965					parts.splice(index, 1)
966					return;
967				}
968			});
969		}
970		
971		let params = parts.join('&');
972		
973		if (hash) {
974			hash = '#' + hash;
975		}
976		
977		if (params) {
978			window.history.pushState("", "", "?" + params + hash);
979		} else {
980			// remove params from URL
981			var href = window.location.href;
982			var url  = href.split('?');
983			window.history.pushState("", "", url[0] + hash);
984		}
985		
986	}
987	
988	window.wcsearch_get_uri_param = function(param) {
989		
990		var href = window.location.href;
991		var url  = href.split('?');
992		if (url.length == 2) {
993			var parts = url[1].split('&');
994			
995			for (let key in parts) {
996				let key_value = parts[key].split('=');
997				if (param == key_value[0]) {
998					return key_value[1];
999				}
1000			};
1001		} else {
1002			return false;
1003		}
1004	}
1005	
1006	$('form.woocommerce-ordering').on("submit", function () {
1007		return false;
1008	});
1009	$(document).on("change", ".woocommerce-ordering .orderby", function(e) {
1010		
1011		// do not call request when clicking orderby without search form
1012		if ($(".wcsearch-search-form").length) {
1013			e.preventDefault();
1014			
1015			var form = $(".wcsearch-search-form");
1016			
1017			if (wcsearch_get_loop()) {
1018				var products_loop_id = wcsearch_get_loop().data("id");
1019			} else {
1020				var products_loop_id = null;
1021			}
1022			var orderby = $(this).val();
1023			
1024			wcsearch_extend_query_string_params({ orderby: orderby });
1025			var post_params = {
1026					'action': 'wcsearch_search_request',
1027					'pagination_base': wcsearch_js_objects.pagination_base,
1028					'query_string': wcsearch_query_string,
1029					'default_query': wcsearch_js_objects.default_query,
1030					'products_loop_id': products_loop_id
1031			};
1032			
1033			if (wcsearch_query_string) {
1034				window.history.pushState("", "", "?"+wcsearch_query_string);
1035			}
1036			
1037			post_params = wcsearch_add_common_fields(post_params, form);
1038			
1039			wcsearch_submit_request(post_params);
1040		}
1041	});
1042	
1043	$(document).on("click", "a.page-numbers", function(e) {
1044		
1045		// do not call request when clicking pagination without search form
1046		if ($(".wcsearch-search-form").length) {
1047			e.preventDefault();
1048			
1049			var form = $(".wcsearch-search-form");
1050			
1051			if (wcsearch_get_loop()) {
1052				var products_loop_id = wcsearch_get_loop().data("id");
1053			} else {
1054				var products_loop_id = null;
1055			}
1056			
1057			var parts = $(this).attr("href").split("/");
1058			$.each(parts, function(i, part) {
1059				if (part == 'page') {
1060					var page_num = parts[i+1];
1061					
1062					wcsearch_extend_query_string_params({ page: page_num });
1063					var post_params = {
1064							'action': 'wcsearch_search_request',
1065							'pagination_base': wcsearch_js_objects.pagination_base,
1066							'query_string': wcsearch_query_string,
1067							'default_query': wcsearch_js_objects.default_query,
1068							'products_loop_id': products_loop_id
1069					};
1070					
1071					post_params = wcsearch_add_common_fields(post_params, form);
1072					
1073					wcsearch_submit_request(post_params);
1074					
1075					return;
1076				}
1077			});
1078		}
1079	});
1080	
1081	window.wcsearch_filter_submit_params = function(search_inputs_value, form) {
1082		
1083		// check address when radius was set, remove radius when no address param
1084		var radius_parameter_passed = false;
1085		var radius_parameter_key;
1086		for (var attr in search_inputs_value) {
1087			var name = search_inputs_value[attr]['name'];
1088			
1089			if (name == 'radius') {
1090				radius_parameter_key = attr;
1091				
1092				for (var _attr in search_inputs_value) {
1093					if (search_inputs_value[_attr]['name'] == 'address') {
1094						radius_parameter_passed = true;
1095						break;
1096					}
1097				}
1098			}
1099		}
1100		if (radius_parameter_key && !radius_parameter_passed) {
1101			search_inputs_value.splice(radius_parameter_key, 1);
1102		}
1103		
1104		return search_inputs_value;
1105	}
1106	
1107	window.wcsearch_submit_form = function(form) {
1108		
1109		var form_id = form.data("id");
1110		var hash = form.data("hash");
1111		var use_ajax = true;
1112		var is_target_url = false;
1113		
1114		if (form.data("scroll-to") == 'products' && wcsearch_get_loop() && wcsearch_do_scroll) {
1115			$("html, body").animate({
1116				scrollTop: wcsearch_get_loop().offset().top
1117			});
1118		}
1119		wcsearch_do_scroll = true;
1120		
1121		if (form.data("use-ajax")) {
1122			use_ajax = true;
1123		} else {
1124			use_ajax = false;
1125		}
1126		
1127		if (form.data("target_url")) {
1128			is_target_url = true;
1129		} else {
1130			is_target_url = false;
1131		}
1132		
1133		// all_inputs -> search_inputs_value -> form_params -> URI_params -> wcsearch_query_string
1134		var all_inputs = form.find(".wcsearch-search-input, input.wcsearch-hidden-field[type=hidden]");
1135		var form_params = {};
1136		var search_inputs_value = [];
1137		
1138		all_inputs.each(function(i, _input) {
1139			var input = new wcsearch_search_input($(_input));
1140			
1141			var value_obj = input.get_value();
1142
1143			if (value_obj) {
1144				if (Array.isArray(value_obj)) {
1145					var value_arr = value_obj;
1146					$.each(value_arr, function(index, value_obj) {
1147						search_inputs_value.push(value_obj);
1148					});
1149				} else {
1150					search_inputs_value.push(value_obj);
1151				}
1152			}
1153		});
1154		
1155		search_inputs_value = wcsearch_filter_submit_params(search_inputs_value, form);
1156		
1157		for (var attr in search_inputs_value) {
1158			if (search_inputs_value[attr]['value'] != false && search_inputs_value[attr]['value'] != '') {
1159				var value = search_inputs_value[attr]['value'];
1160				var name = search_inputs_value[attr]['name'];
1161				
1162				if (typeof form_params[name] == 'undefined' || form_params[name] == null) {
1163					form_params[name] = value;
1164				} else {
1165					var parts = form_params[name].split(',');
1166					var values = value.split(",");
1167					for (var key in values) {
1168						parts.push(values[key]);
1169					}
1170					
1171					parts = parts.filter(wcsearch_only_unique);
1172					form_params[name] = parts.join(',');
1173				}
1174			}
1175		}
1176		
1177		// save order params when they already persist in URI
1178		var save_order_params = [
1179			"orderby",
1180			"order_by",
1181			"order",
1182			"page_id",
1183			"swLat",
1184			"swLng",
1185			"neLat",
1186			"neLng",
1187		];
1188		
1189		for (var param in save_order_params) {
1190			var param_name = save_order_params[param];
1191			if (wcsearch_get_uri_param(param_name)) {
1192				form_params[param_name] = wcsearch_get_uri_param(param_name);
1193			}
1194		}
1195		
1196		if (typeof gtag != 'undefined') {
1197			gtag('event', 'search_results', form_params);
1198		}
1199		
1200		var URI_params = $.param(form_params);
1201		if (URI_params) {
1202			window.history.pushState("", "", "?"+URI_params);
1203		} else {
1204			// remove params from URL
1205			var href = window.location.href;
1206			var url  = href.split('?');
1207			window.history.pushState("", "", url[0]);
1208		}
1209		
1210		wcsearch_query_string = URI_params;
1211		
1212		if (use_ajax && !is_target_url) {
1213			if (wcsearch_get_loop()) {
1214				wcsearch_get_loop().attr("data-form-id", form_id);
1215			}
1216			var post_params = {
1217					'action': 'wcsearch_search_request',
1218					'form_id': form_id,
1219					'hash': hash,
1220					'pagination_base': wcsearch_js_objects.pagination_base,
1221					'query_string': wcsearch_query_string,
1222					'default_query': wcsearch_js_objects.default_query
1223			};
1224			post_params = wcsearch_add_common_fields(post_params, form);
1225			
1226			window[wcsearch_submit_callback](post_params);
1227		} else {
1228			var form_action = $(form).attr("action");
1229			var url = new URL(form_action);
1230			$.each(form_params, function(key, value) {
1231				url.searchParams.set(key, value); // setting your param
1232			});
1233			var submit_url = url.href; 
1234			
1235			window.location.href = submit_url;
1236		}
1237	};
1238	
1239	window.wcsearch_submit_request = function(post_params) {
1240		
1241		wcsearch_request_processing = true;
1242		wcsearch_ajax_loader_target_show($("#"+wcsearch_js_objects.loop_selector_name));
1243		
1244		// paginator clicked - do not need to recount
1245		var page = wcsearch_get_query_string_param('page');
1246		if (!page) {
1247			wcsearch_recount_attempts = 0;
1248			wcsearch_recount();
1249		}
1250		
1251		$.ajax({
1252				type: "POST",
1253				url: wcsearch_js_objects.ajaxurl,
1254				data: post_params,
1255				dataType: 'JSON',
1256				success: function(response_from_the_action_function) {
1257					if (wcsearch_get_loop()) {
1258						wcsearch_get_loop().html(response_from_the_action_function.products);
1259					}
1260					
1261				},
1262				complete: function() {
1263					wcsearch_request_processing = false;
1264				}
1265		});
1266	}
1267	
1268	window.wcsearch_recount = function() {
1269		var post_params = {
1270				'action': 'wcsearch_recount_request',
1271				'query_string': wcsearch_query_string,
1272				'counters': []
1273		};
1274		
1275		var recount_items = $(".wcsearch-item-count:not(.wcsearch-item-count-no-recount)").not(".wcsearch-search-input-always-closed .wcsearch-item-count");
1276		
1277		recount_items.addClass("wcsearch-item-count-blur");
1278		recount_items.slice(0, wcsearch_max_counters).map(function(index, obj) {
1279			if ($(obj).data()) {
1280				$(obj).addClass("wcsearch-item-count-blur");
1281				post_params.counters.push($(obj).data());
1282			}
1283		});
1284		
1285		var form = $(".wcsearch-search-form");
1286		post_params = wcsearch_add_common_fields(post_params, form);
1287		post_params = wcsearch_add_count_fields(post_params, form);
1288		
1289		wcsearch_recount_request(post_params);
1290	}
1291	window.wcsearch_sort_terms_by_counter = function(input_div) {
1292		var columns = input_div.find(".wcsearch-search-input-terms-column, .wcsearch-search-model-input-terms-column");
1293		if (columns.length) {
1294			columns.each(function() {
1295				var column = $(this);
1296				var sorted_elements = [];
1297				var terms = column.find(".wcsearch-checkbox, .wcsearch-radio");
1298				
1299				terms.each(function() {
1300					var count = $(this).find(".wcsearch-item-count").text();
1301					if (count != 'xx') {
1302						sorted_elements.push([this, parseInt(count)]);
1303						$(this).remove();
1304					}
1305				});
1306				
1307				sorted_elements.sort(function(a, b) {
1308					if (input_div.data("order") == 'DESC') {
1309						return a[1] < b[1];
1310					} else {
1311						return a[1] > b[1];
1312					}
1313				});
1314				
1315				$(sorted_elements).each(function() {
1316					column.append(this[0]);
1317				});
1318			});
1319		} else {
1320			var selects = input_div.find("select.wcsearch-form-control");
1321			if (selects.length) {
1322				selects.each(function() {
1323					var select = $(this);
1324					var sorted_elements = [];
1325					var terms = select.find("option");
1326					
1327					terms.each(function() {
1328						var count = $(this).attr("data-count");
1329						if (count != '') {
1330							sorted_elements.push([this, parseInt(count)]);
1331							$(this).remove();
1332						}
1333					});
1334					
1335					sorted_elements.sort(function(a, b) {
1336						if (input_div.data("order") == 'DESC') {
1337							return a[1] < b[1];
1338						} else {
1339							return a[1] > b[1];
1340						}
1341					});
1342					
1343					$(sorted_elements).each(function() {
1344						select.append(this[0]);
1345					});
1346				});
1347			}
1348		}
1349	}
1350	window.wcsearch_recount_request = function(post_params) {
1351		
1352		if (post_params.counters.length == 0) {
1353			return false;
1354		}
1355		
1356		$.ajax({
1357				type: "POST",
1358				url: wcsearch_js_objects.ajaxurl,
1359				data: post_params,
1360				query_string: wcsearch_query_string,
1361				dataType: 'JSON',
1362				success: function(response_from_the_action_function) {
1363					if (typeof response_from_the_action_function.counters == "object" && response_from_the_action_function.counters) {
1364						
1365						$(wcsearch_dropdowns).each(function(i, dropdown) {
1366							if (typeof dropdown.input != "undefined" && dropdown.input.hasClass("ui-autocomplete-input")) {
1367								// call initialization to avoid error
1368								dropdown.input.autocomplete();
1369								if (dropdown.input.autocomplete("widget").is(":visible")) {
1370									dropdown.is_open = true;
1371									dropdown.input.autocomplete("close");
1372								} else {
1373									dropdown.is_open = false;
1374								}
1375							}
1376						});
1377						
1378						$(response_from_the_action_function.counters).each(function(index, counter_tag) {
1379							if (typeof counter_tag.counter_term_id != "undefined") {
1380								var counter_term_id = counter_tag.counter_term_id;
1381								var counter_term_tax = counter_tag.counter_term_tax;
1382								var counter_item = counter_tag.counter_item;
1383								var counter_number = counter_tag.counter_number;
1384								
1385								$(".wcsearch-item-count[data-termid='"+counter_term_id+"'][data-tax='"+counter_term_tax+"']").replaceWith($(counter_item)[0]);
1386								
1387								$(".wcsearch-search-input-tax-select[data-counter=1] option[data-termid="+counter_term_id+"][data-tax='"+counter_term_tax+"']").attr("data-count", counter_number);
1388							} else if (typeof counter_tag.counter_price != "undefined") {
1389								var counter_price = counter_tag.counter_price;
1390								var counter_item = counter_tag.counter_item;
1391								
1392								$(".wcsearch-item-price-"+counter_price).each(function() {
1393									$(this).replaceWith($(counter_item)[0]);
1394								});
1395							} else if (typeof counter_tag.counter_option != "undefined") {
1396								var counter_option = counter_tag.counter_option;
1397								var counter_item = counter_tag.counter_item;
1398								
1399								$(".wcsearch-item-option-"+counter_option).each(function() {
1400									$(this).replaceWith($(counter_item)[0]);
1401								});
1402							} else if (typeof counter_tag.counter_hours != "undefined") {
1403								var counter_hours = counter_tag.counter_hours;
1404								var counter_item = counter_tag.counter_item;
1405								
1406								$(".wcsearch-item-hours-"+counter_hours).each(function() {
1407									$(this).replaceWith($(counter_item)[0]);
1408								});
1409							} else if (typeof counter_tag.counter_ratings != "undefined") {
1410								var counter_ratings = counter_tag.counter_ratings;
1411								var counter_item = counter_tag.counter_item;
1412								
1413								$(".wcsearch-item-ratings-"+counter_ratings).each(function() {
1414									$(this).replaceWith($(counter_item)[0]);
1415								});
1416							}
1417						});
1418					}
1419
1420					if ($(".wcsearch-item-count.wcsearch-item-count-blur").length) {
1421						
1422						if (this.query_string == wcsearch_query_string) {
1423							wcsearch_continue_recounting();
1424						} else {
1425							wcsearch_recount_attempts = 0;
1426						}
1427					} else {
1428						$(".wcsearch-search-input[data-orderby='count'], .wcsearch-search-model-input[data-orderby='count']").each(function() {
1429							wcsearch_sort_terms_by_counter($(this));
1430						});
1431					}
1432				},
1433				complete: function() {
1434					$(wcsearch_dropdowns).each(function(i, dropdown) {
1435						if (typeof dropdown.input != "undefined" && dropdown.input.hasClass("ui-autocomplete-input") && dropdown.is_open) {
1436							dropdown.input.autocomplete("search", dropdown.input.val());
1437						}
1438					});
1439				}
1440		});
1441	}
1442	window.wcsearch_continue_recounting = function() {
1443		if ($(".wcsearch-item-count.wcsearch-item-count-blur").length) {
1444			var post_params = {
1445					'action': 'wcsearch_recount_request',
1446					'query_string': wcsearch_query_string,
1447					'counters': []
1448			};
1449			$(".wcsearch-item-count.wcsearch-item-count-blur:lt("+wcsearch_max_counters+")").map(function(index, obj) {
1450				post_params.counters.push($(obj).data());
1451			});
1452			
1453			var form = $(".wcsearch-search-form");
1454			post_params = wcsearch_add_common_fields(post_params, form);
1455			post_params = wcsearch_add_count_fields(post_params, form);
1456			
1457			wcsearch_recount_attempts++;
1458			if (wcsearch_recount_attempts < 20) {
1459				wcsearch_recount_request(post_params);
1460			} else {
1461				setTimeout( function() {
1462					wcsearch_recount_attempts = 0;
1463				}, 5000);
1464			}
1465		} else {
1466			wcsearch_recount_attempts = 0;
1467		}
1468	}
1469	
1470	var wcsearch_pointer_interal;
1471	window.wcsearch_show_pointer = function(form, input, message, time = 5000) {
1472		
1473		form.parent().find(".wcsearch-apply-filters-float-btn").remove();
1474		if (wcsearch_pointer_interal) {
1475			clearInterval(wcsearch_pointer_interal);
1476		}
1477		
1478		var input_top = input.offset().top;
1479		var form_top = form.offset().top;
1480		var pointer = $("<div />")
1481		.html('<span>' + message + '</span>')
1482		.addClass("wcsearch-apply-filters-float-btn")
1483		.css({ top: (input_top - form_top - 22) })
1484		.insertBefore(form)
1485		.on("click", function() {
1486			if (!wcsearch_request_processing) {
1487				wcsearch_submit_form(form);
1488				
1489				if (wcsearch_get_loop()) {
1490					$("html, body").animate({
1491						scrollTop: wcsearch_get_loop().offset().top
1492					});
1493				}
1494			}
1495		});
1496		
1497		wcsearch_pointer_interal = setInterval(function() {
1498			clearInterval(wcsearch_pointer_interal);
1499			form.parent().find(".wcsearch-apply-filters-float-btn").fadeOut(300, function() { $(this).remove() });
1500		}, time);
1501	}
1502	
1503	$(document).on("change", ".wcsearch-search-input input, .wcsearch-search-input select", function(e) {
1504		
1505		var input = $(this);
1506		var name = $(this).prop("name");
1507		var input_div = input.parents(".wcsearch-search-input");
1508		var form = input.parents("form");
1509		
1510		if (input.attr("type") == 'radio' || input.attr("type") == 'checkbox') {
1511			
1512			var use_pointer = input.parents(".wcsearch-search-input").data("use_pointer");
1513			
1514			if (use_pointer) {
1515				wcsearch_show_pointer(form, input, 'Search');
1516			}
1517		}
1518		
1519		if (!wcsearch_request_processing) {
1520			
1521			wcsearch_open_close_dep_inputs(form);
1522			
1523			// reset the same type of inputs before submit,
1524			if (wcsearch_js_objects.reset_same_inputs) {
1525				var field_slug = $(this).parents(".wcsearch-search-input").attr("data-slug");
1526				var the_same_inputs = form.find(".wcsearch-search-input[data-slug="+field_slug+"]").not(input_div);
1527				the_same_inputs.each(function(i, same_input) {
1528					var input = new wcsearch_search_input($(same_input));
1529					input.reset();
1530				});
1531			}
1532			
1533			if (!form.data("auto-submit")) {
1534				return false;
1535			}
1536			
1537			$(".wcsearch-item-count-no-recount").removeClass("wcsearch-item-count-no-recount");
1538			
1539			if (input_div.data("type") == "tax" && input_div.data("relation") == 'OR') {
1540				// do not recount self input items
1541				input_div.find(".wcsearch-item-count").addClass("wcsearch-item-count-no-recount");
1542			}
1543			
1544			wcsearch_submit_form(form);
1545		}
1546	});
1547	
1548	window.wcsearch_open_close_dep_inputs = function(form) {
1549		if (form.find(".wcsearch-search-input[data-dependency_tax]").length) {
1550			var dep_inputs = form.find(".wcsearch-search-input[data-dependency_tax]");
1551			dep_inputs.filter(Boolean); // filter empty dependency_tax=''
1552			
1553			var all_inputs = form.find(".wcsearch-search-input");
1554			
1555			dep_inputs.each( function(index, _dep_input) {
1556				
1557				var dep_input = $(_dep_input);
1558				var dep_tax = dep_input.data("dependency_tax");
1559				var dep_items = dep_input.data("dependency_items");
1560				// without "No dependency" option
1561				if (dep_tax) {
1562					var input_opened = false;
1563					
1564					all_inputs.each(function(i, _input) {
1565						var current_input_name = name;
1566						var input = new wcsearch_search_input($(_input));
1567						var value = input.get_value();
1568						
1569						if (value) {
1570							if (Array.isArray(value)) {
1571								var value_arr = value;
1572								$.each(value_arr, function(index, value) {
1573
1574									if (value) {
1575										var input_values = value.value.toString().split(",").filter(item => item);
1576										
1577										if (dep_tax == value.name) {
1578											if (typeof dep_items != "undefined") {
1579												dep_items = dep_items.toString().split(",");
1580												
1581												if ($(input_values).filter(dep_items).length) {
1582													input_opened = true;
1583													return;
1584												}
1585											} else if (input_values.length) {
1586												input_opened = true;
1587												return;
1588											}
1589										}
1590									}
1591								});
1592							} else {
1593								var input_values = value.value.toString().split(",").filter(item => item);
1594								
1595								if (dep_tax == value.name) {
1596									if (typeof dep_items != "undefined") {
1597										dep_items = dep_items.toString().split(",");
1598										
1599										if ($(input_values).filter(dep_items).length) {
1600											input_opened = true;
1601											return;
1602										}
1603									} else if (input_values.length) {
1604										input_opened = true;
1605										return;
1606									}
1607								}
1608							}
1609						}
1610					});
1611					
1612					if (input_opened) {
1613						
1614						// call wcsearch_setup_terms_separators() only when it was closed
1615						if (dep_input.parents(".wcsearch-search-placeholder").hasClass("wcsearch-search-placeholder-dependency-view-closed")) {
1616							dep_input.parents(".wcsearch-search-placeholder").removeClass("wcsearch-search-placeholder-dependency-view-closed");
1617							
1618							wcsearch_setup_terms_separators();
1619						}
1620					} else {
1621						var dep_input_reset = new wcsearch_search_input(dep_input);
1622						dep_input_reset.reset();
1623						
1624						dep_input.parents(".wcsearch-search-placeholder").addClass("wcsearch-search-placeholder-dependency-view-closed");
1625					}
1626				}
1627			});
1628		}
1629	}
1630	
1631	$(".wcsearch-search-input-button").on("click", function(e) {
1632		e.preventDefault();
1633		
1634		var form = $(this).parents("form");
1635		
1636		if (!wcsearch_request_processing) {
1637			wcsearch_submit_form(form);
1638		}
1639	});
1640	
1641	$(".wcsearch-search-input-reset-button").on("click", function(e) {
1642		e.preventDefault();
1643		
1644		wcsearch_do_scroll = false;
1645		
1646		var form = $(this).parents("form");
1647		
1648		var inputs = form.find(".wcsearch-search-input");
1649		inputs.each(function(i, _input) {
1650			var input = new wcsearch_search_input($(_input));
1651			input.reset();
1652		});
1653		
1654		wcsearch_submit_form(form);
1655		
1656		wcsearch_open_close_dep_inputs(form);
1657	});
1658	
1659	$(".wcsearch-search-input-more-filters").on("click", function(e) {
1660		e.preventDefault();
1661		
1662		var form = $(this).parents("form");
1663		
1664		wcsearch_open_close_dep_inputs(form);
1665		
1666		var inputs = form.find(".wcsearch-search-input");
1667		inputs.each(function(i, _input) {
1668			
1669			if ($(_input).parent().hasClass("wcsearch-search-placeholder-advanced-view")) {
1670				$(_input).parent().toggleClass("wcsearch-search-placeholder-advanced-view-closed");
1671			}
1672			
1673			wcsearch_setup_terms_separators();
1674		});
1675		
1676		if ($(this).data("status") == "closed") {
1677			$(this).find("input").val(1);
1678			
1679			$(this).find("span.wcsearch-fa-chevron-down")
1680			.removeClass("wcsearch-fa-chevron-down")
1681			.addClass("wcsearch-fa-chevron-up");
1682			
1683			wcsearch_insert_param_in_uri('more_filters', 1);
1684			
1685			$(this).data("status", "opened");
1686		} else {
1687			$(this).find("input").val(0);
1688			
1689			$(this).find("span.wcsearch-fa-chevron-up")
1690			.removeClass("wcsearch-fa-chevron-up")
1691			.addClass("wcsearch-fa-chevron-down");
1692			
1693			wcsearch_remove_param_from_uri('more_filters');
1694			
1695			$(this).data("status", "closed");
1696		}
1697	});
1698	
1699	window.wcsearch_sort_autocomplete_items = function(a, b) {
1700		if (typeof a.is_listing != "undefined" && a.is_listing && (typeof b.is_listing == "undefined" || !b.is_listing)) {
1701			return -1;
1702		} else if (typeof a.is_listing == "undefined" || !a.is_listing) {
1703			if (a.starts_with && !b.starts_with) {
1704				return -1;
1705			} else if (a.term_in_name && !b.term_in_name) {
1706				return 1;
1707			} else if (!a.term_in_name && b.term_in_name) {
1708				return -1;
1709			} else if (a.is_term && !b.is_term) {
1710				return 1;
1711			} else if (!a.is_term && b.is_term) {
1712				return -1;
1713			} else if (a.parents == '' && b.parents != '') {
1714				return 1;
1715			} else if (a.parents != '' && b.parents == '') {
1716				return -1;
1717			} else if (a.name > b.name) {
1718				return -1;
1719			} else if (b.name > a.name) {
1720				return 1;
1721			} else {
1722				return 0;
1723			}
1724		}
1725	}
1726	
1727	var wcsearch_dropdowns = [];
1728	
1729	window.wcsearch_process_main_search_fields = function() {
1730		if (typeof tax_keywords != "undefined") {
1731			
1732			// tax autocomplete
1733			$(".wcsearch-tax-autocomplete").tax_autocomplete().each(function(i, dropdown) {
1734				wcsearch_dropdowns.push($(dropdown).tax_autocomplete().tax_autocomplete("instance"));
1735			});
1736			
1737			// tax + keywords autocomplete
1738			$(".wcsearch-tax-keywords").tax_keywords().each(function(i, dropdown) {
1739				wcsearch_dropdowns.push($(dropdown).tax_keywords().tax_keywords("instance"));
1740			});
1741			
1742			// tax + address autocomplete
1743			$(".wcsearch-tax-address").tax_address().each(function(i, dropdown) {
1744				wcsearch_dropdowns.push($(dropdown).tax_address().tax_address("instance"));
1745			});
1746			
1747			// address autocomplete
1748			$(".wcsearch-address-autocomplete").address_autocomplete().each(function(i, dropdown) {
1749				wcsearch_dropdowns.push($(dropdown).address_autocomplete().address_autocomplete("instance"));
1750			});
1751			
1752			// heirarhical tax
1753			$(".wcsearch-heirarhical-dropdown").heirarhical_dropdown().each(function(i, dropdown) {
1754				wcsearch_dropdowns.push($(dropdown).heirarhical_dropdown().heirarhical_dropdown("instance"));
1755			});
1756			
1757			// multiselect dropdown tax
1758			$(".wcsearch-multiselect-dropdown").multiselect_dropdown().each(function(i, dropdown) {
1759				wcsearch_dropdowns.push($(dropdown).multiselect_dropdown().multiselect_dropdown("instance"));
1760			});
1761			
1762			// keywords autocomplete
1763			$(".wcsearch-keywords-autocomplete").keywords_autocomplete().each(function(i, dropdown) {
1764				wcsearch_dropdowns.push($(dropdown).keywords_autocomplete().keywords_autocomplete("instance"));
1765			});
1766		}
1767	}
1768	
1769	// search suggestions links in string fields
1770	$(document).on("click", ".wcsearch-search-input .wcsearch-search-suggestions a", function() {
1771		var input = $(this).parents(".wcsearch-search-input").find(".wcsearch-search-string-input");
1772		var value = $(this).text();
1773
1774		input.val(value)
1775		.trigger("focus")
1776		.trigger("change");
1777	});
1778	
1779	if (typeof $.ui.selectmenu != 'undefined' && typeof $.ui.autocomplete != 'undefined') {
1780		// search suggestions links in keywords/address fields
1781		$(document).on("click", ".wcsearch-search-input .wcsearch-search-suggestions a", function() {
1782			var input = $(this).parents(".wcsearch-search-input").find(".wcsearch-main-search-field");
1783			var value = $(this).text();
1784
1785			input.val(value)
1786			.trigger("focus")
1787			.trigger("change");
1788			
1789			if (input.hasClass('ui-autocomplete-input')) {
1790				input.autocomplete("search", value);
1791			}
1792		});
1793		// redirect to listing
1794		$(document).on("click", ".wcsearch-dropdowns-menu a", function() {
1795			if ($(this).attr("target") == "_blank") {
1796				window.open($(this).attr("href"), '_blank');
1797			} else {
1798				window.location = $(this).attr("href");
1799			}
1800		});
1801		// correct menu width
1802		$.ui.autocomplete.prototype._resizeMenu = function () {
1803			var ul = this.menu.element;
1804			ul.outerWidth(this.element.outerWidth());
1805		}
1806		
1807		$(document).on('change paste keyup blur', '.wcsearch-main-search-field', function() {
1808			var input = $(this);
1809			if (input.val()) {
1810				input.parent().find(".wcsearch-dropdowns-menu-button").addClass("wcsearch-fa-close");
1811			} else {
1812				input.parent().find(".wcsearch-dropdowns-menu-button").removeClass("wcsearch-fa-close");
1813			}
1814		});
1815		$(document).on('click', '.wcsearch-fa-close', function(e) {
1816			var input = $(this).parent().find('.wcsearch-main-search-field');
1817			input.trigger("reset");
1818			input.trigger("change");
1819			
1820			$(this).removeClass('wcsearch-fa-close');
1821		});
1822
1823		window.tax_keywords = $.widget("custom.tax_keywords", {
1824			wrapper: "",
1825			input: "",
1826			button: "",
1827			input_icon_class: "wcsearch-fa wcsearch-fa-search",
1828			wrapper_class: "wcsearch-dropdowns-menu-tax-keywords",
1829			cache: new Object(),
1830
1831			_create: function() {
1832				this.wrapper = $("<div>")
1833				.addClass(this.wrapper_class)
1834				.insertAfter(this.element);
1835				
1836				// move select inside wrapper
1837				this.element.appendTo(this.wrapper);
1838
1839				this.element.hide();
1840				this._createAutocomplete();
1841				this._createShowAllButton();
1842			},
1843
1844			_appendWrapper: function() {
1845				var append_to = null; // append to body
1846				
1847				if (this.element.parents(".wcsearch-sticky-scroll").length) {
1848					// append to fixed fiv
1849					append_to = this.element.parents(".wcsearch-sticky-scroll");
1850				} else {
1851					// append to search form wrapper, otherwise autocomplete menu becomes blinking on search
1852					var append_to = this.element.parents(".wcsearch-search-wrapper");
1853				}
1854				
1855				return append_to;
1856			},
1857			
1858			_autocompleteWithOptions: function(input) {
1859				input.autocomplete({
1860					delay: 300,
1861					minLength: 0,
1862					appendTo: this._appendWrapper(),
1863					source: $.proxy(this, "_source"),
1864					open: function(event, ui) {
1865						if (navigator.userAgent.match(/(iPod|iPhone|iPad)/)) {
1866							$('.ui-autocomplete').off('menufocus hover mouseover mouseenter');
1867						}
1868					}
1869				});
1870			},
1871			
1872			_autocompleteRenderItem: function(input) {
1873				var default_icon_url = this.element.data('default-icon');
1874				
1875				input.autocomplete("widget").addClass("wcsearch-dropdowns-menu");
1876				input.autocomplete("instance")._renderItem = function(ul, item) {
1877					var label = item.label;
1878					
1879					var right_side_markup = '';
1880					if (typeof item.count != "undefined") {
1881						if (item.count !== '') {
1882							right_side_markup = '<span class="wcsearch-dropdowns-menu-search-counter"><span class="wcsearch-item-count" data-termid="' + item.termid + '" data-tax="' + item.tax + '">' + item.count + '</span></span>';
1883						} else {
1884							right_side_markup = '<span class="wcsearch-dropdowns-menu-search-counter"><span class="wcsearch-item-count wcsearch-item-count-blur wcsearch-item-term-' + item.termid + '-' + item.tax + '" data-termid="' + item.termid + '" data-tax="' + item.tax + '">xx</span></span>';
1885						}
1886					}
1887					if (typeof item.note != "undefined") {
1888						right_side_markup = '<span class="wcsearch-dropdowns-menu-search-note">' + item.note + '</span>';
1889					}
1890					
1891					var item_class = "wcsearch-dropdowns-menu-search";
1892					if (typeof item.is_term != "undefined" && item.is_term) {
1893						item_class = item_class + " wcsearch-dropdowns-menu-search-term";
1894					}
1895					if (typeof item.is_listing != "undefined" && item.is_listing) {
1896						item_class = item_class + " wcsearch-dropdowns-menu-search-listing";
1897					}
1898					
1899					var item_li_class = "";
1900					if (typeof item.option != "undefined" && $(item.option).data("selected")) {
1901						item_li_class = item_li_class + " wcsearch-dropdowns-menu-selected-item";
1902					}
1903					
1904					var place_id;
1905					if (typeof item.place_id != "undefined" && item.place_id) {
1906						place_id = item.place_id;
1907					}
1908
1909					var li = $("<li>", {
1910						class: item_li_class
1911					});
1912					
1913					var wrapper = $("<div>", {
1914						html: label + right_side_markup,
1915						class: item_class,
1916						"data-place-id": place_id
1917					});
1918
1919					var icon_class = "ui-icon";
1920					var icon_url;
1921					if (item.icon) {
1922						icon_url = item.icon;
1923					} else {
1924						icon_url = default_icon_url;
1925					}
1926					$("<span>", {
1927						style: "background-image: url('" + icon_url + "'); background-size: cover;",
1928						class: icon_class
1929					})
1930					.appendTo(wrapper);
1931
1932					if (item.sublabel) {
1933						var sublabel = item.sublabel;
1934
1935						$("<span>")
1936						.html(sublabel)
1937						.addClass("wcsearch-dropdowns-menu-search-sublabel")
1938						.appendTo(wrapper);
1939					} else {
1940						wrapper.addClass("wcsearch-dropdowns-menu-search-root");
1941					}
1942		
1943					return li.append(wrapper).appendTo(ul);
1944				};
1945			},
1946			
1947			_openMobileKeyboard: function() {
1948				if (typeof this.element.data("autocomplete-name") == 'undefined' && screen.height <= 768) {
1949					return false;
1950				} else {
1951					return true;
1952				}
1953			},
1954			
1955			_createAutocomplete: function() {
1956				var selected = this.element.find("[data-selected=\"selected\"]");
1957				if (this.element.data("autocomplete-name") && this.element.data("autocomplete-value")) {
1958					var value = this.element.data("autocomplete-value");
1959				} else {
1960					var value = selected.data("name") ? selected.data("name") : "";
1961				}
1962
1963				this.input = $("<input>", {
1964							name: this.element.data("autocomplete-name") ? this.element.data("autocomplete-name") : "",
1965							readonly: this._openMobileKeyboard() ? false : true
1966				})
1967				.appendTo(this.wrapper)
1968				.val(value)
1969				.attr("placeholder", this.element.data("placeholder"))
1970				.addClass("wcsearch-form-control wcsearch-main-search-field");
1971				
1972				this._autocompleteWithOptions(this.input);
1973				this._autocompleteRenderItem(this.input);
1974
1975				var element = this.element;
1976				var input = this.input;
1977				var id = this.element.data("id");
1978
1979				this._on(input, {
1980					reset: function() {
1981						this.button.trigger("click");
1982						
1983						this.element.children("option").map(function() {
1984							$(this).removeData("selected").removeAttr("data-selected");
1985						});
1986					},
1987					autocompleteselect: function(event, ui) {
1988						this._trigger("select", event, {
1989							item: ui.item
1990						});
1991						
1992						// setup selected term in the options list
1993						this.element.children("option").map(function() {
1994							if ($(this).data("termid") == ui.item.value) {
1995								$(this).data("selected", "selected").attr("data-selected", "selected");
1996							} else {
1997								$(this).removeData("selected").removeAttr("data-selected");
1998							}
1999						});
2000
2001						if (ui.item.is_term) {
2002							var name = wcsearch_HTML_entity_decode(ui.item.name);
2003							
2004							$('#selected_tax\\['+id+'\\]').val(ui.item.value);
2005							
2006							input.val(name);
2007							
2008							$('#selected_tax\\['+id+'\\]').trigger("wcsearch:selected_tax_change");
2009							$('#selected_tax\\['+id+'\\]').trigger("change");
2010						} else {
2011							var name = wcsearch_HTML_entity_decode(ui.item.value);
2012							
2013							$('#selected_tax\\['+id+'\\]').val('');
2014
2015							input.val(name).trigger("change");
2016						}
2017						
2018						input.trigger("blur");
2019						
2020						event.preventDefault();
2021					},
2022					autocompletefocus: function(event, ui) {
2023						event.preventDefault();
2024					},
2025					click: function(event, ui) {
2026						// open list only when it already has a value
2027						if (!input.autocomplete("widget").is(":visible") && (input.val() || element.data("open-on-click"))) {
2028							
2029							// show all on click, empty search opens full list
2030							input.trigger("focusout");
2031							input.autocomplete("search", input.val());  // when click after close - it will get searched results
2032							// ------------- input.autocomplete("search", ''); - will give all results
2033								
2034							wcsearch_continue_recounting();
2035						} else {
2036							input.autocomplete("close");
2037						}
2038					},
2039					autocompletesearch: function(event, ui) {
2040						if (input.val() == '') {
2041							$('#selected_tax\\['+id+'\\]').val('');
2042							
2043							// trigger custom event
2044							$('#selected_tax\\['+id+'\\]').trigger("wcsearch:selected_tax_change");
2045						}
2046					}
2047				});
2048				
2049				$(document).on("submit", "form", function() {
2050					input.autocomplete("close");
2051				});
2052			},
2053
2054			_createShowAllButton: function() {
2055				var input = this.input,
2056				_this = this,
2057				id = this.element.data("id");
2058
2059				this.wrapper.addClass("wcsearch-has-feedback");
2060				this.button = $("<span>", {
2061					class: "wcsearch-dropdowns-menu-button wcsearch-form-control-feedback " + this.input_icon_class + (input.val() ? " wcsearch-fa-close" : "")
2062				})
2063				.appendTo(this.wrapper)
2064				.on("click", function(e) {
2065					
2066					wcsearch_do_scroll = false;
2067					
2068					input.val('');
2069					if ($('#selected_tax\\['+id+'\\]').val()) {
2070						// submit search form on input reset
2071						$('#selected_tax\\['+id+'\\]').val('');
2072						//------------- $('#selected_tax\\['+id+'\\]').trigger("change"); -  necessary trigger on double call on double call
2073						
2074						// trigger custom event
2075						$('#selected_tax\\['+id+'\\]').trigger("wcsearch:selected_tax_change");
2076					} else {
2077						input.trigger('change');
2078					}
2079					
2080					wcsearch_do_scroll = false;
2081
2082					if (_this._openMobileKeyboard()) {
2083						// -------------input.autocomplete("search", input.val()); - call submit by this
2084					} else {
2085						// Pass empty string as value to search for, displaying all results
2086						input.autocomplete("search", '');
2087					}
2088				});
2089			},
2090
2091			_source: function(request, response) {
2092				var term = $.trim(request.term).toLowerCase();
2093				var matcher = new RegExp($.ui.autocomplete.escapeRegex(term), "i");
2094				var common_array = [];
2095				
2096				this.element.children("option").map(function() {
2097					$(this).prop("count", 11);
2098					
2099					var text = $(this).text(),
2100					value = $(this).val(),
2101					name = $(this).attr("data-name"),
2102					icon = $(this).attr("data-icon"),
2103					count = $(this).attr("data-count"),
2104					termid = $(this).attr("data-termid"),
2105					tax = $(this).attr("data-tax"),
2106					note = $(this).attr("data-note"),
2107					sublabel = $(this).attr("data-sublabel"),
2108					starts_with = $(this).attr("data-name").toLowerCase().startsWith(term),
2109					term_in_name = matcher.test(name),
2110					term_in_sublabel = matcher.test(sublabel);
2111					if (this.value && (!term || term_in_name || term_in_sublabel)) {
2112						common_array.push({
2113							label: text,
2114							value: value,
2115							name: name,
2116							full_value: name + ', ' + sublabel,
2117							count: count,
2118							termid: termid,
2119							tax: tax,
2120							note: note,
2121							icon: icon,
2122							sublabel: sublabel,
2123							option: this,
2124							is_term: true,
2125							is_listing: false,
2126							term_in_name: term_in_name,
2127							starts_with: starts_with
2128						});
2129					}
2130				});
2131
2132				if (this.element.data("ajax-search") && term) {
2133					this.wrapper.find(".wcsearch-dropdowns-menu-button").addClass("wcsearch-search-input-loader");
2134
2135					if (term in this.cache) {
2136						var cache_array = this.cache[term];
2137						this.wrapper.find(".wcsearch-dropdowns-menu-button").removeClass("wcsearch-search-input-loader");
2138						common_array = cache_array.slice(0); // simply duplicate this array
2139
2140						response(common_array);
2141					} else {
2142						var do_links 		= this.input.parents(".wcsearch-search-input").data("do_links");
2143						var do_links_blank 	= this.input.parents(".wcsearch-search-input").data("do_links_blank");
2144						var orderby 		= this.input.parents(".wcsearch-search-input").data("orderby");
2145						var order 			= this.input.parents(".wcsearch-search-input").data("order");
2146						
2147						var used_by 		= this.input.parents(".wcsearch-search-input").data("used_by");
2148						
2149						var post_params = {
2150			            	action:          wcsearch_js_objects.adapter_options[used_by].keywords_search_action,
2151			            	query_string:    wcsearch_query_string,
2152			            	do_links:        do_links,
2153			            	do_links_blank:  do_links_blank,
2154			            	orderby:         orderby,
2155			            	order:           order,
2156			            	term:            term
2157			            }
2158						
2159						var form = this.input.parents("form");
2160						post_params = wcsearch_add_common_fields(post_params, form);
2161						
2162						$.ajax({
2163				        	url: wcsearch_js_objects.ajaxurl,
2164				        	type: "POST",
2165				        	dataType: "json",
2166				            data: post_params,
2167				            combobox: this,
2168				            success: function(response_from_the_action_function){
2169				            	if (response_from_the_action_function != 0 && response_from_the_action_function.listings) {
2170				            		var cache_array = [];
2171				            		response_from_the_action_function.listings.map(function(listing) {
2172				            			var starts_with = listing.name.toLowerCase().startsWith(term);
2173				            			
2174				            			var item = {
2175											label:        listing.title,      // text in option
2176											value:        listing.name,       // value depends on is_term
2177											name:         listing.name,       // text to place in input
2178											full_value:   listing.name,       // full value of the item
2179											icon:         listing.icon,
2180											sublabel:     listing.sublabel,   // sub-description
2181											option:       listing,
2182											is_term:      false,
2183											is_listing:   true,
2184											term_in_name: true,
2185											starts_with:  starts_with
2186				            			}
2187				            			common_array.push(item);
2188				            			cache_array.push(item);
2189				            		});
2190				            		common_array.sort(wcsearch_sort_autocomplete_items);
2191
2192				            		this.combobox.cache[term] = common_array;
2193				            	}
2194				            	response(common_array);
2195				            },
2196				            complete: function() {
2197				            	this.combobox.wrapper.find(".wcsearch-dropdowns-menu-button").removeClass("wcsearch-search-input-loader");
2198				            }
2199				        });
2200					}
2201				} else {
2202					if (term) {
2203						common_array.sort(wcsearch_sort_autocomplete_items);
2204					}
2205					response(common_array);
2206				}
2207			},
2208			
2209			renew_source: function(counter_term_id, counter_number) {
2210				this.cache = new Object();
2211				
2212				this.element.children("option").map(function() {
2213					if ($(this).data("termid") == counter_term_id) {
2214						if (counter_number !== false) {
2215							$(this).attr("data-count", counter_number);
2216						}
2217					}
2218				});
2219			},
2220
2221			_destroy: function() {
2222				this.wrapper.remove();
2223				this.element.show();
2224			},
2225		});
2226		
2227		window.tax_address = $.widget("custom.tax_address", tax_keywords, {
2228			wrapper: "",
2229			input: "",
2230			input_place_id: "",
2231			button: "",
2232			input_icon_class: "wcsearch-fa  wcsearch-fa-map-marker",
2233			wrapper_class: "wcsearch-dropdowns-menu-tax-autocomplete",
2234			
2235			_create: function() {
2236				this.wrapper = $("<div>")
2237				.addClass(this.wrapper_class)
2238				.insertAfter(this.element);
2239				
2240				// move select inside wrapper
2241				this.element.appendTo(this.wrapper);
2242
2243				this.element.hide();
2244				this._createAutocomplete();
2245				this._createShowAllButton();
2246			},
2247			
2248			_createShowAllButton: function() {
2249				var input = this.input,
2250				input_place_id = this.input_place_id,
2251				_this = this,
2252				id = this.element.data("id"),
2253				used_by = this.input.parents(".wcsearch-search-input").data("used_by"),
2254				enable_my_location_button = wcsearch_js_objects.adapter_options[used_by].enable_my_location_button;
2255
2256				this.wrapper.addClass("wcsearch-has-feedback");
2257				this.button = $("<span>", {
2258					class: "wcsearch-dropdowns-menu-button wcsearch-form-control-feedback" + (enable_my_location_button ? " wcsearch-get-location" : "") + " " + this.input_icon_class + (input.val() ? " wcsearch-fa-close" : "")
2259				})
2260				.appendTo(this.wrapper)
2261				.on("click", function(e) {
2262					
2263					wcsearch_do_scroll = false;
2264					
2265					if ($(this).hasClass("wcsearch-fa-close")) {
2266						input.val('');
2267						input_place_id.val('');
2268						if ($('#selected_tax\\['+id+'\\]').val()) {
2269							// submit search form on input reset
2270							$('#selected_tax\\['+id+'\\]').val('');
2271							// ------------- $('#selected_tax\\['+id+'\\]').trigger("change"); - necessary trigger on double call
2272							
2273							// trigger custom event
2274							$('#selected_tax\\['+id+'\\]').trigger("wcsearch:selected_tax_change");
2275						} else {
2276							input.trigger('change');
2277						}
2278					} else if ($(this).hasClass("wcsearch-get-location")) {
2279						var geocode_field_callback = wcsearch_js_objects.geocode_functions.geocode_field;
2280						var geocode_field_error = wcsearch_js_objects.geocode_functions.my_location_button_error;
2281						
2282						window[geocode_field_callback](input, geocode_field_error);
2283					}
2284
2285					if (_this._openMobileKeyboard()) {
2286						// ------------- input.autocomplete("search", input.val()); - call submit by this
2287					} else {
2288						// Pass empty string as value to search for, displaying all results
2289						input.autocomplete("search", '');
2290					}
2291				})
2292				.on("mouseover", function(e) {
2293					if ($(this).hasClass("wcsearch-get-location") && !$(this).hasClass("wcsearch-fa-close")) {
2294						$(this).attr("title", wcsearch_js_objects.get_my_location_title);
2295					}
2296				});
2297			},
2298			
2299			_createAutocomplete: function() {
2300				var selected = this.element.find("[data-selected=\"selected\"]");
2301				if (this.element.data("autocomplete-name") && this.element.data("autocomplete-value")) {
2302					var value = this.element.data("autocomplete-value");
2303				} else {
2304					var value = selected.data("name") ? selected.data("name") : "";
2305				}
2306
2307				this.input = $("<input>", {
2308							name: this.element.data("autocomplete-name") ? this.element.data("autocomplete-name") : "",
2309							readonly: this._openMobileKeyboard() ? false : true
2310				})
2311				.appendTo(this.wrapper)
2312				.val(value)
2313				.attr("placeholder", this.element.data("placeholder"))
2314				.addClass("wcsearch-form-control wcsearch-main-search-field");
2315				
2316				this._autocompleteWithOptions(this.input);
2317				this._autocompleteRenderItem(this.input);
2318				
2319				var place_id = this.element.data("place-id") ? this.element.data("place-id") : "";
2320				this.input_place_id = $("<input>", {
2321					type: "hidden",
2322					name: "place_id"
2323				})
2324				.appendTo(this.wrapper)
2325				.val(place_id);
2326				
2327				var element = this.element;
2328				var input = this.input;
2329				var input_place_id = this.input_place_id;
2330				var id = this.element.data("id");
2331				
2332				this._on(input, {
2333					reset: function() {
2334						
2335						wcsearch_do_scroll = false;
2336						
2337						input_place_id.val('');
2338						
2339						this.element.children("option").map(function() {
2340							$(this).removeData("selected").removeAttr("data-selected");
2341						});
2342						
2343						// do not use trigger("click"), otherwise it will click on "My location" button
2344						input.val('');
2345						if ($('#selected_tax\\['+id+'\\]').val()) {
2346							// submit search form on input reset
2347							$('#selected_tax\\['+id+'\\]').val('');
2348							$('#selected_tax\\['+id+'\\]').trigger("change");
2349							
2350							// trigger custom event
2351							$('#selected_tax\\['+id+'\\]').trigger("wcsearch:selected_tax_change");
2352						} else {
2353							input.trigger('change');
2354						}
2355						this.button.removeClass("wcsearch-fa-close");
2356						
2357						input.autocomplete("close");
2358					},
2359					autocompleteselect: function(event, ui) {
2360						this._trigger("select", event, {
2361							item: ui.item
2362						});
2363						
2364						if (typeof ui.item.place_id != "undefined") {
2365							input_place_id.val(ui.item.place_id);
2366						} else {
2367							input_place_id.val('');
2368						}
2369						
2370						if (ui.item.is_term) {
2371							var name = wcsearch_HTML_entity_decode(ui.item.name);
2372							
2373							$('#selected_tax\\['+id+'\\]').val(ui.item.value);
2374							
2375							// setup selected term in the options list
2376							this.element.children("option").map(function() {
2377								if ($(this).data("termid") == ui.item.value) {
2378									$(this).data("selected", "selected").attr("data-selected", "selected");
2379								} else {
2380									$(this).removeData("selected").removeAttr("data-selected");
2381								}
2382							});
2383							
2384							input.val(name);
2385							
2386							$('#selected_tax\\['+id+'\\]').trigger("wcsearch:selected_tax_change");
2387							$('#selected_tax\\['+id+'\\]').trigger("change");
2388						} else {
2389							var name = wcsearch_HTML_entity_decode(ui.item.value);
2390							
2391							$('#selected_tax\\['+id+'\\]').val('');
2392							
2393							input.val(name).trigger("change");
2394						}
2395						
2396						input.trigger("blur");
2397						
2398						event.preventDefault();
2399					},
2400					autocompletefocus: function(event, ui) {
2401						event.preventDefault();
2402					},
2403					click: function(event, ui) {
2404						// open list only when it already has a value
2405						if (!input.autocomplete("widget").is(":visible") && (input.val() || element.data("open-on-click"))) {
2406							if (this._openMobileKeyboard()) {
2407								input.trigger("focus");
2408								input.autocomplete("search", input.val());
2409							} else {
2410								wcsearch_do_scroll = false;
2411								input.trigger("focusout");
2412								wcsearch_do_scroll = false;
2413								input.autocomplete("search", '');
2414							}
2415							
2416							wcsearch_continue_recounting();
2417						} else {
2418							input.autocomplete("close");
2419						}
2420					},
2421					autocompletesearch: function(event, ui) {
2422						if (input.val() == '') {
2423							$('#selected_tax\\['+id+'\\]').val('');
2424							
2425							// trigger custom event
2426							$('#selected_tax\\['+id+'\\]').trigger("wcsearch:selected_tax_change");
2427						}
2428					},
2429					change: function(event, ui) {
2430						
2431						wcsearch_do_scroll = false;
2432						
2433						input_place_id.val('');
2434					}
2435				});
2436				
2437				$(document).on("submit", "form", function() {
2438					input.autocomplete("close");
2439				});
2440			},
2441			
2442			_source: function(request, response) {
2443				var term = $.trim(request.term).toLowerCase();
2444				var matcher = new RegExp($.ui.autocomplete.escapeRegex(term), "i");
2445				var common_array = [];
2446				
2447				this.element.children("option").map(function() {
2448					
2449					var text = $(this).text(),
2450					value = $(this).val(),
2451					name = $(this).attr("data-name"),
2452					icon = $(this).attr("data-icon"),
2453					count = $(this).attr("data-count"),
2454					termid = $(this).attr("data-termid"),
2455					tax = $(this).attr("data-tax"),
2456					note = $(this).attr("data-note"),
2457					sublabel = $(this).attr("data-sublabel"),
2458					place_id = $(this).attr("data-place_id"),
2459					starts_with = $(this).attr("data-name").toLowerCase().startsWith(term),
2460					term_in_name = matcher.test(name),
2461					term_in_sublabel = matcher.test(sublabel);
2462					if (this.value && (!term || term_in_name || term_in_sublabel)) {
2463						common_array.push({
2464							label: text,
2465							value: value,
2466							name: name,
2467							full_value: name + ', ' + sublabel,
2468							count: count,
2469							termid: termid,
2470							tax: tax,
2471							note: note,
2472							icon: icon,
2473							sublabel: sublabel,
2474							option: this,
2475							is_term: true,
2476							is_listing: false,
2477							term_in_name: term_in_name,
2478							starts_with: starts_with,
2479							place_id: place_id
2480						});
2481					}
2482				});
2483
2484				if (term && wcsearch_js_objects.geocode_functions) {
2485					var autocomplete_service_callback = wcsearch_js_objects.geocode_functions.autocomplete_service;
2486					var autocomplete_code = wcsearch_js_objects.geocode_functions.address_autocomplete_code;
2487					
2488					window[autocomplete_service_callback](term, autocomplete_code, common_array, response, wcsearch_collect_locations_predictions);
2489				} else {
2490					if (term) {
2491						common_array.sort(wcsearch_sort_autocomplete_items);
2492					}
2493					response(common_array);
2494				}
2495			},
2496		});
2497		
2498		window.address_autocomplete = $.widget("custom.address_autocomplete", tax_keywords, {
2499			wrapper: "",
2500			input: "",
2501			input_place_id: "",
2502			button: "",
2503			input_icon_class: "wcsearch-fa  wcsearch-fa-map-marker",
2504			wrapper_class: "wcsearch-dropdowns-menu-address-autocomplete",
2505			
2506			_create: function() {
2507				this.wrapper = this.element.parent();
2508
2509				this.element.hide();
2510				this._createAutocomplete();
2511				this._createShowAllButton();
2512			},
2513			
2514			_createShowAllButton: function() {
2515				var input = this.input,
2516				input_place_id = this.input_place_id,
2517				_this = this,
2518				id = this.element.data("id"),
2519				used_by = this.input.parents(".wcsearch-search-input").data("used_by"),
2520				enable_my_location_button = wcsearch_js_objects.adapter_options[used_by].enable_my_location_button;
2521
2522				this.wrapper.addClass("wcsearch-has-feedback");
2523				this.button = $("<span>", {
2524					class: "wcsearch-dropdowns-menu-button wcsearch-form-control-feedback" + (enable_my_location_button ? " wcsearch-get-location" : "") + " " + this.input_icon_class + (input.val() ? " wcsearch-fa-close" : "")
2525				})
2526				.appendTo(this.wrapper)
2527				.on("click", function(e) {
2528					
2529					wcsearch_do_scroll = false;
2530					
2531					if ($(this).hasClass("wcsearch-fa-close")) {
2532						input.val('');
2533						input_place_id.val('');
2534					} else if ($(this).hasClass("wcsearch-get-location")) {
2535						var geocode_field_callback = wcsearch_js_objects.geocode_functions.geocode_field;
2536						var geocode_field_error = wcsearch_js_objects.geocode_functions.my_location_button_error;
2537						
2538						window[geocode_field_callback](input, geocode_field_error);
2539					}
2540					
2541					wcsearch_do_scroll = false;
2542
2543					if (_this._openMobileKeyboard()) {
2544						// ------------- input.autocomplete("search", input.val()); - call submit by this
2545					} else {
2546						// Pass empty string as value to search for, displaying all results
2547						input.autocomplete("search", '');
2548					}
2549				})
2550				.on("mouseover", function(e) {
2551					if ($(this).hasClass("wcsearch-get-location") && !$(this).hasClass("wcsearch-fa-close")) {
2552						$(this).attr("title", wcsearch_js_objects.get_my_location_title);
2553					}
2554				});
2555			},
2556			
2557			_createAutocomplete: function() {
2558				if (this.element.data("autocomplete-name") && this.element.data("autocomplete-value")) {
2559					var value = this.element.data("autocomplete-value");
2560				} else {
2561					var value = ""
2562				}
2563				
2564				this.input = $("<input>", {
2565					name: this.element.data("autocomplete-name") ? this.element.data("autocomplete-name") : "",
2566							readonly: this._openMobileKeyboard() ? false : true
2567				})
2568				.appendTo(this.wrapper)
2569				.val(value)
2570				.attr("placeholder", this.element.data("placeholder"))
2571				.addClass("wcsearch-form-control wcsearch-main-search-field");
2572				
2573				this._autocompleteWithOptions(this.input);
2574				this._autocompleteRenderItem(this.input);
2575				
2576				var place_id = this.element.data("place-id") ? this.element.data("place-id") : "";
2577				this.input_place_id = $("<input>", {
2578					type: "hidden",
2579					name: "place_id"
2580				})
2581				.appendTo(this.wrapper)
2582				.val(place_id);
2583				
2584				var element = this.element;
2585				var input = this.input;
2586				var input_place_id = this.input_place_id;
2587				var id = this.element.data("id");
2588				
2589				this._on(input, {
2590					reset: function() {
2591						
2592						wcsearch_do_scroll = false;
2593						
2594						input_place_id.val('');
2595						
2596						this.element.children("option").map(function() {
2597							$(this).removeData("selected").removeAttr("data-selected");
2598						});
2599						
2600						// do not use trigger("click"), otherwise it will click on "My location" button
2601						input.val('');
2602						input.trigger('change');
2603						
2604						this.button.removeClass("wcsearch-fa-close");
2605						
2606						input.autocomplete("close");
2607					},
2608					autocompleteselect: function(event, ui) {
2609						this._trigger("select", event, {
2610							item: ui.item
2611						});
2612						
2613						if (typeof ui.item.place_id != "undefined") {
2614							input_place_id.val(ui.item.place_id);
2615						} else {
2616							input_place_id.val('');
2617						}
2618
2619						var name = wcsearch_HTML_entity_decode(ui.item.value);
2620						
2621						input.val(name);
2622						input.trigger('change');
2623						
2624						event.preventDefault();
2625					},
2626					autocompletefocus: function(event, ui) {
2627						event.preventDefault();
2628					},
2629					click: function(event, ui) {
2630						input.autocomplete("search", input.val());
2631					},
2632					change: function(event, ui) {
2633						
2634						wcsearch_do_scroll = false;
2635						
2636						input_place_id.val('');
2637					}
2638				});
2639				
2640				$(document).on("submit", "form", function() {
2641					input.autocomplete("close");
2642				});
2643			},
2644			
2645			_source: function(request, response) {
2646				var term = $.trim(request.term).toLowerCase();
2647				var matcher = new RegExp($.ui.autocomplete.escapeRegex(term), "i");
2648				var common_array = [];
2649				
2650				if (term) {
2651
2652					if (term in this.cache) {
2653						var cache_array = this.cache[term];
2654						common_array = cache_array.slice(0); // simply duplicate this array
2655
2656						response(common_array);
2657					} else {
2658						
2659						if (term && wcsearch_js_objects.geocode_functions) {
2660							var autocomplete_service_callback = wcsearch_js_objects.geocode_functions.autocomplete_service;
2661							var autocomplete_code = wcsearch_js_objects.geocode_functions.address_autocomplete_code;
2662							
2663							window[autocomplete_service_callback](term, autocomplete_code, common_array, response, wcsearch_collect_locations_predictions);
2664						} else {
2665							if (term) {
2666								common_array.sort(wcsearch_sort_autocomplete_items);
2667							}
2668							response(common_array);
2669						}
2670					}
2671				} else {
2672					response(common_array);
2673				}
2674			},
2675		});
2676		
2677		window.wcsearch_collect_locations_predictions = function(predictions, common_array, response) {
2678			$.map(predictions, function (prediction, i) {
2679				common_array.push({
2680					label: prediction.label,
2681					value: prediction.value,
2682					name: prediction.name,
2683					note: wcsearch_js_objects.prediction_note,
2684					icon: "",
2685					sublabel: prediction.sublabel,
2686					is_term: false,
2687					term_in_name: true,
2688					place_id: prediction.place_id
2689				});
2690			})
2691
2692			response(common_array);
2693		}
2694		
2695		window.tax_autocomplete = $.widget("custom.tax_autocomplete", tax_keywords, {
2696			wrapper: "",
2697			input: "",
2698			button: "",
2699			input_icon_class: "wcsearch-fa  wcsearch-fa-search",
2700			wrapper_class: "wcsearch-dropdowns-menu-tax-autocomplete",
2701			
2702			_source: function(request, response) {
2703				var term = $.trim(request.term).toLowerCase();
2704				var matcher = new RegExp($.ui.autocomplete.escapeRegex(term), "i");
2705				var common_array = [];
2706				
2707				this.element.children("option").map(function() {
2708					
2709					var text = $(this).text(),
2710					value = $(this).val(),
2711					name = $(this).attr("data-name"),
2712					icon = $(this).attr("data-icon"),
2713					count = $(this).attr("data-count"),
2714					termid = $(this).attr("data-termid"),
2715					tax = $(this).attr("data-tax"),
2716					note = $(this).attr("data-note"),
2717					sublabel = $(this).attr("data-sublabel"),
2718					starts_with = $(this).attr("data-name").toLowerCase().startsWith(term),
2719					term_in_name = matcher.test(name),
2720					term_in_sublabel = matcher.test(sublabel);
2721					if (this.value && (!term || term_in_name || term_in_sublabel)) {
2722						common_array.push({
2723							label: text,
2724							value: value,
2725							name: name,
2726							full_value: name + ', ' + sublabel,
2727							count: count,
2728							termid: termid,
2729							tax: tax,
2730							note: note,
2731							icon: icon,
2732							sublabel: sublabel,
2733							option: this,
2734							is_term: true,
2735							is_listing: false,
2736							term_in_name: term_in_name,
2737							starts_with: starts_with
2738						});
2739					}
2740				});
2741
2742				if (term) {
2743					common_array.sort(wcsearch_sort_autocomplete_items);
2744				}
2745				response(common_array);
2746			},
2747		});
2748		window.keywords_autocomplete = $.widget("custom.keywords_autocomplete", tax_keywords, {
2749			wrapper: "",
2750			input: "",
2751			button: "",
2752			input_icon_class: "wcsearch-fa  wcsearch-fa-search",
2753			wrapper_class: "wcsearch-dropdowns-menu-keywords-autocomplete",
2754			cache: new Object(),
2755
2756			_create: function() {
2757				this.wrapper = this.element.parent();
2758
2759				this.element.hide();
2760				this._createAutocomplete();
2761				this._createShowAllButton();
2762			},
2763			
2764			_createAutocomplete: function() {
2765				
2766				if (this.element.data("autocomplete-name") && this.element.data("autocomplete-value")) {
2767					var value = this.element.data("autocomplete-value");
2768				} else {
2769					var value = ""
2770				}
2771				
2772				this.input = $("<input>", {
2773					name: this.element.data("autocomplete-name") ? this.element.data("autocomplete-name") : "",
2774					readonly: this._openMobileKeyboard() ? false : true
2775				})
2776				.appendTo(this.wrapper)
2777				.val(value)
2778				.attr("placeholder", this.element.data("placeholder"))
2779				.addClass("wcsearch-form-control wcsearch-main-search-field");
2780				
2781				this._autocompleteWithOptions(this.input);
2782				this._autocompleteRenderItem(this.input);
2783				
2784				var input = this.input;
2785
2786				this._on(input, {
2787					reset: function() {
2788						this.button.trigger("click");
2789						
2790						this.element.children("option").map(function() {
2791							$(this).removeData("selected").removeAttr("data-selected");
2792						});
2793					},
2794					autocompleteselect: function(event, ui) {
2795						this._trigger("select", event, {
2796							item: ui.item
2797						});
2798
2799						input.val(ui.item.value);
2800						input.trigger('change');
2801
2802						event.preventDefault();
2803					},
2804					autocompletefocus: function(event, ui) {
2805						event.preventDefault();
2806					},
2807					click: function(event, ui) {
2808						input.autocomplete("search", input.val());
2809					}
2810				});
2811			},
2812			
2813			_source: function(request, response) {
2814				var term = $.trim(request.term).toLowerCase();
2815				var matcher = new RegExp($.ui.autocomplete.escapeRegex(term), "i");
2816				var common_array = [];
2817
2818				if (this.element.data("ajax-search") && term) {
2819					this.wrapper.find(".wcsearch-dropdowns-menu-button").addClass("wcsearch-search-input-loader");
2820
2821					if (term in this.cache) {
2822						var cache_array = this.cache[term];
2823						this.wrapper.find(".wcsearch-dropdowns-menu-button").removeClass("wcsearch-search-input-loader");
2824						common_array = cache_array.slice(0); // simply duplicate this array
2825
2826						response(common_array);
2827					} else {
2828						var do_links 		= this.input.parents(".wcsearch-search-input").data("do_links");
2829						var do_links_blank 	= this.input.parents(".wcsearch-search-input").data("do_links_blank");
2830						var orderby 		= this.input.parents(".wcsearch-search-input").data("orderby");
2831						var order 			= this.input.parents(".wcsearch-search-input").data("order");
2832						
2833						var used_by 		= this.input.parents(".wcsearch-search-input").data("used_by");
2834						
2835						var post_params = {
2836			            	action:          wcsearch_js_objects.adapter_options[used_by].keywords_search_action,
2837			            	query_string:    wcsearch_query_string,
2838			            	do_links:        do_links,
2839			            	do_links_blank:  do_links_blank,
2840			            	orderby:         orderby,
2841			            	order:           order,
2842			            	term:            term
2843			            }
2844						
2845						var form = this.input.parents("form");
2846						post_params = wcsearch_add_common_fields(post_params, form);
2847						
2848						$.ajax({
2849				        	url: wcsearch_js_objects.ajaxurl,
2850				        	type: "POST",
2851				        	dataType: "json",
2852				            data: post_params,
2853				            combobox: this,
2854				            success: function(response_from_the_action_function){
2855				            	if (response_from_the_action_function != 0 && response_from_the_action_function.listings) {
2856				            		var cache_array = [];
2857				            		response_from_the_action_function.listings.map(function(listing) {
2858				            			var starts_with = listing.title.toLowerCase().startsWith(term);
2859				            			
2860				            			var item = {
2861											label:        listing.title,      // text in option
2862											value:        listing.name,       // value depends on is_term
2863											name:         listing.name,       // text to place in input
2864											full_value:   listing.name,       // full value of the item
2865											icon:         listing.icon,
2866											sublabel:     listing.sublabel,   // sub-description
2867											option:       listing,
2868											is_term:      false,
2869											is_listing:   true,
2870											term_in_name: true,
2871											starts_with:  starts_with
2872										}
2873				            			common_array.push(item);
2874				            			cache_array.push(item);
2875				            		});
2876				            		common_array.sort(wcsearch_sort_autocomplete_items);
2877
2878				            		this.combobox.cache[term] = common_array;
2879				            	}
2880				            	response(common_array);
2881				            },
2882				            complete: function() {
2883				            	this.combobox.wrapper.find(".wcsearch-dropdowns-menu-button").removeClass("wcsearch-search-input-loader");
2884				            }
2885				        });
2886					}
2887				} else {
2888					if (term) {
2889						common_array.sort(wcsearch_sort_autocomplete_items);
2890					}
2891					response(common_array);
2892				}
2893			}
2894		});
2895		window.heirarhical_dropdown = $.widget("custom.heirarhical_dropdown", tax_keywords, {
2896			input_icon_class: "wcsearch-fa  wcsearch-fa-search",
2897			wrapper_class: "wcsearch-dropdowns-menu-hierarhical",
2898			placeholders: "",
2899			
2900			_createAutocomplete: function() {
2901				
2902				var wrapper = this.wrapper;
2903				var id = this.element.data('id');
2904				var name = this.element.data('tax');
2905				var placeholders = this.element.data('placeholders');
2906				var depth_level = this.element.data('depth-level');
2907				
2908				this.input_value = $("<input>", {
2909					type: 'hidden'
2910				})
2911				.addClass('wcsearch-hierarhical-menu-'+id+'-depth-level-'+depth_level)
2912				.appendTo(wrapper);
2913				var input_value = this.input_value;
2914
2915				var selected = this.element.find("[data-selected=\"selected\"]");
2916				if (this.element.data("autocomplete-name") && this.element.data("autocomplete-value")) {
2917					var value = this.element.data("autocomplete-value");
2918				} else {
2919					var value = selected.data("name") ? selected.data("name") : "";
2920				}
2921				this.input = $("<input>", {
2922						name: name,
2923						type: "text"
2924				})
2925				.appendTo(wrapper)
2926				.val(value)
2927				.attr("placeholder", placeholders)
2928				.addClass("wcsearch-form-control wcsearch-main-search-field");
2929				
2930				this._autocompleteWithOptions(this.input);
2931				this._autocompleteRenderItem(this.input);
2932				
2933				var element = this.element;
2934				var input = this.input;
2935				var tax = this.element.data('tax');
2936				
2937				this._on(input, {
2938					reset: function() {
2939						this.button.trigger("click");
2940						
2941						this.element.children("option").map(function() {
2942							$(this).removeData("selected").removeAttr("data-selected");
2943						});
2944					},
2945					autocompletechange: function(event, ui) {
2946						console.log(ui);
2947					},
2948					autocompleteselect: function(event, ui) {
2949						this._trigger("select", event, {
2950							item: ui.item
2951						});
2952
2953						if (ui.item.is_term) {
2954							var name = ui.item.name;
2955							$('#selected_tax\\['+id+'\\]').val(ui.item.value);
2956							element.val(ui.item.value);
2957							
2958							// setup selected term in the options list
2959							this.element.children("option").map(function() {
2960								if ($(this).data("termid") == ui.item.value) {
2961									$(this).data("selected", "selected").attr("data-selected", "selected");
2962								} else {
2963									$(this).removeData("selected").removeAttr("data-selected");
2964								}
2965							});
2966							
2967						} else {
2968							var name = ui.item.value;
2969							$('#selected_tax\\['+id+'\\]').val('');
2970							element.val('');
2971						}
2972						// ------------- $('#selected_tax\\['+id+'\\]').trigger("change"); - this triggers the submission twice
2973						
2974						name = wcsearch_HTML_entity_decode(name);
2975						input.val(name);
2976						input.trigger('change');
2977
2978						event.preventDefault();
2979						
2980						var selects = wrapper.parent().find('select');
2981						var curr_level = element.data('depth-level');
2982						
2983						selects.each(function(i) {
2984							if ($(this).data('depth-level') > curr_level) {
2985								$(this).parent().remove();
2986							}
2987						});
2988						
2989						input_value.val(ui.item.value);
2990						
2991						input.attr('disabled', 'disabled');
2992						
2993						var orderby = $(input).parents('.wcsearch-search-input').data("orderby");
2994						var order = $(input).parents('.wcsearch-search-input').data("order");
2995						var exact_terms = $(input).parents('.wcsearch-search-input').data("exact_terms");
2996						var hide_empty = $(input).parents('.wcsearch-search-input').data("hide_empty");
2997						
2998						var post_params = {
2999								'action': 'wcsearch_tax_hierarhical_dropdowns_hook',
3000								'parentid': ui.item.value,
3001								'tax': tax,
3002								'depth_level': depth_level+1,
3003								'placeholders': placeholders,
3004								'uID': id,
3005								'orderby': orderby,
3006								'order': order,
3007								'exact_terms': exact_terms,
3008								'hide_empty': hide_empty
3009						};
3010						
3011						var form = this.input.parents("form");
3012						post_params = wcsearch_add_common_fields(post_params, form);
3013						
3014						$.post(
3015								wcsearch_js_objects.ajaxurl,
3016								post_params,
3017								function(response_from_the_action_function) {
3018									
3019									if ($('.wcsearch-hierarhical-menu-'+id+'-depth-level-'+depth_level).length && $('.wcsearch-hierarhical-menu-'+id+'-depth-level-'+depth_level).val()) {
3020										var new_autocomplete = $(response_from_the_action_function);
3021										new_autocomplete.insertAfter(wrapper);
3022										
3023										var new_select = wrapper.parent().find('select');
3024										new_select.heirarhical_dropdown();
3025									}
3026									
3027									input.removeAttr('disabled');
3028								}
3029						);
3030					},
3031					autocompletefocus: function(event, ui) {
3032						event.preventDefault();
3033					},
3034					click: function(event, ui) {
3035						if (!input.autocomplete("widget").is(":visible")) {
3036							// show all on click
3037							input.trigger("focusout");
3038							input.autocomplete("search", '');
3039								
3040							wcsearch_continue_recounting();
3041						} else {
3042							input.autocomplete("close");
3043						}
3044					},
3045					autocompletesearch: function(event, ui) {
3046					}
3047				});
3048			},
3049			
3050			_createShowAllButton: function() {
3051				var element = this.element;
3052				var wrapper = this.wrapper;
3053				var input = this.input;
3054				var input_value = this.input_value;
3055				var id = this.element.data('id');
3056				var depth_level = this.element.data('depth-level');
3057				
3058				this.wrapper.addClass("wcsearch-has-feedback");
3059				this.button = $("<span>", {
3060					class: "wcsearch-dropdowns-menu-button wcsearch-form-control-feedback " + this.input_icon_class + (this.input.val() ? " wcsearch-fa-close" : "")
3061				})
3062				.appendTo(this.wrapper)
3063				.on("click", function(e) {
3064					
3065					wcsearch_do_scroll = false;
3066					
3067					var selects = wrapper.parent().find('select');
3068					var curr_level = element.data('depth-level');
3069					
3070					selects.each(function(i) {
3071						
3072						if ($(this).data('depth-level') > curr_level) {
3073							$(this).parent().remove();
3074						}
3075					});
3076					
3077					
3078					if (depth_level > 1) {
3079						$('#selected_tax\\['+id+'\\]').val($('.wcsearch-hierarhical-menu-'+id+'-depth-level-'+(depth_level-1)).val());
3080					} else {
3081						$('#selected_tax\\['+id+'\\]').val('');
3082					}
3083					$('#selected_tax\\['+id+'\\]').trigger("change");
3084					
3085					if ($(this).hasClass("wcsearch-fa-close")) {
3086						input.val('');
3087						$(this).removeClass('wcsearch-fa-close');
3088						
3089						element.val(0);
3090						input_value.val('');
3091					}
3092				});
3093			},
3094			
3095			_destroy: function() {
3096				this.element.show();
3097			},
3098		});
3099		
3100		window.multiselect_dropdown = $.widget("custom.multiselect_dropdown", tax_keywords, {
3101			input_icon_class: "wcsearch-fa  wcsearch-fa-search",
3102			wrapper_class: "wcsearch-dropdowns-menu-multiselect",
3103			placeholder: "",
3104			
3105			_createAutocomplete: function() {
3106				
3107				var create_item = function(input, element_id, item_id, label) {
3108					input.append(
3109						$("<div></div>")
3110						.addClass("wcsearch-dropdowns-multiselect-item")
3111						.text(label)
3112						.attr('data-id', item_id)
3113						.append(
3114								$("<div></div>")
3115								.addClass("wcsearch-fa wcsearch-fa-close wcsearch-dropdowns-multiselect-item-close")
3116								.on("click", function(event) {
3117									event.preventDefault();
3118									
3119									var item = $(this).parent();
3120									
3121									delete_item(input, element_id, item);
3122								})
3123						)
3124					);
3125					input.parent().find(".wcsearch-dropdowns-menu-button").addClass("wcsearch-fa-close");
3126				};
3127				var delete_item = function(input, element_id, item) {
3128					
3129					wcsearch_do_scroll = false;
3130					
3131					item.remove();
3132					
3133					var value = $('#selected_tax\\['+element_id+'\\]').val()
3134					.split(',')
3135					.filter(function (el) {
3136						return el != item.data('id');
3137					});
3138					$('#selected_tax\\['+element_id+'\\]').val(value.join()).trigger("change");
3139					
3140					if (value.length == 0) {
3141						placeholder.show();
3142						
3143						input.parent().find(".wcsearch-dropdowns-menu-button").removeClass("wcsearch-fa-close");
3144					}
3145				}
3146				
3147				this.placeholder = $("<div class='wcsearch-dropdowns-multiselect-placeholder'>"+this.element.data("placeholder")+"</div>");
3148
3149				this.input = $("<div></div>")
3150				.addClass("wcsearch-form-control wcsearch-main-search-field wcsearch-main-search-field-multiselect ui-autocomplete-input")
3151				.html(this.placeholder)
3152				.appendTo(this.wrapper);
3153				
3154				this._autocompleteWithOptions(this.input);
3155				this._autocompleteRenderItem(this.input);
3156
3157				var input = this.input;
3158				var id = this.element.data("id");
3159				var placeholder = this.placeholder;
3160				
3161				var selected = this.element.find("[data-selected=\"selected\"]");
3162				var values = [];
3163				$.each(selected, function() {
3164					create_item(input, id, $(this).attr("value"), $(this).text());
3165					
3166					values.push($(this).attr("value"));
3167					
3168					placeholder.hide();
3169				});
3170				$('#selected_tax\\['+id+'\\]').val(values.join(","));
3171
3172				this._on(input, {
3173					reset: function() {
3174						this.button.trigger("click");
3175						
3176						this.element.children("option").map(function() {
3177							$(this).removeData("selected").removeAttr("data-selected");
3178						});
3179					},
3180					autocompleteselect: function(event, ui) {
3181						this._trigger("select", event, {
3182							item: ui.item
3183						});
3184						
3185						// do not close on select
3186						this.clicked_selected = true;
3187
3188						if (ui.item.is_term) {
3189							var name = ui.item.name;
3190							var value = $('#selected_tax\\['+id+'\\]').val().split(',');
3191							if (value.includes(ui.item.value)) {
3192								var item = input.find(".wcsearch-dropdowns-multiselect-item[data-id='"+ui.item.value+"']");
3193								
3194								delete_item(input, id, item);
3195								
3196								return false;
3197							}
3198							value.push(ui.item.value);
3199							value = value.filter(function (el) {
3200								return el != '';
3201							});
3202							$('#selected_tax\\['+id+'\\]').val(value.join());
3203						} else {
3204							var name = ui.item.value;
3205							$('#selected_tax\\['+id+'\\]').val('');
3206						}
3207						$('#selected_tax\\['+id+'\\]').trigger("change");
3208						
3209						create_item(this.input, this.element.data("id"), ui.item.value, ui.item.label);
3210						
3211						placeholder.hide();
3212
3213						event.preventDefault();
3214					},
3215					autocompleteclose: function(event, ui) {
3216						// do not close on select
3217						if (this.clicked_selected) {
3218							input.trigger("focus");
3219							input.autocomplete("search", "");
3220							
3221							this.clicked_selected = false;
3222						}
3223					},
3224					autocompletefocus: function(event, ui) {
3225						event.preventDefault();
3226					},
3227					click: function(event, ui) {
3228						
3229						// do not open when click to remove item
3230						if ($(event.target).is(".wcsearch-dropdowns-multiselect-item-close")) {
3231							return false;
3232						}
3233						
3234						if (!input.autocomplete("widget").is(":visible")) {
3235							input.trigger("focusout");
3236							input.autocomplete("search", "");
3237							
3238							wcsearch_continue_recounting();
3239							
3240						} else {
3241							input.autocomplete("close");
3242							
3243						}
3244					}
3245				});
3246			},
3247			
3248			_createShowAllButton: function() {
3249				
3250				wcsearch_do_scroll = false;
3251				
3252				this._super();
3253				
3254				var input = this.input;
3255				var placeholder = this.placeholder;
3256				var id = this.element.data('id');
3257				
3258				if ($('#selected_tax\\['+id+'\\]').val()) {
3259					this.button.addClass("wcsearch-fa-close");
3260				}
3261				
3262				this.button.on("click", function(e) {
3263					$('#selected_tax\\['+id+'\\]').val('');
3264					$('#selected_tax\\['+id+'\\]').trigger("change");
3265					
3266					input.find(".wcsearch-dropdowns-multiselect-item").remove();
3267					
3268					placeholder.show();
3269				});
3270			},
3271
3272			_source: function(request, response) {
3273				var term = $.trim(request.term);
3274				var id = this.element.data("id");
3275				var selected_ids = $('#selected_tax\\['+id+'\\]').val().split(',');
3276				
3277				var common_array = [];
3278				
3279				var matcher = new RegExp($.ui.autocomplete.escapeRegex(term), "i");
3280				this.element.children("option").map(function() {
3281					var text = $(this).text(),
3282					value = $(this).val(),
3283					name = $(this).attr("data-name"),
3284					icon = $(this).attr("data-icon"),
3285					count = $(this).attr("data-count"),
3286					termid = $(this).attr("data-termid"),
3287					tax = $(this).attr("data-tax"),
3288					sublabel = $(this).attr("data-sublabel"),
3289					term_in_name = matcher.test(name),
3290					term_in_sublabel = matcher.test(sublabel),
3291					selected = selected_ids.includes(value) ? true : false;
3292					common_array.push({
3293						label: text,
3294						value: value,
3295						name: name,
3296						full_value: name + ', ' + sublabel,
3297						icon: icon,
3298						count: count,
3299						termid: termid,
3300						tax: tax,
3301						sublabel: sublabel,
3302						option: this,
3303						is_term: true,
3304						term_in_name: term_in_name,
3305						selected: selected
3306					});
3307				});
3308
3309				response(common_array);
3310			},
3311			
3312			_destroy: function() {
3313				this.element.show();
3314			},
3315		});
3316	}
3317
3318	$(document).on('change', '.wcsearch-tax-dropdowns-wrap select', function() {
3319		var select_box = $(this);
3320		var parent = select_box.val();
3321		var current_level = select_box.data('level');
3322		var uID = select_box.data('uid');
3323		
3324		var wrapper = select_box.parents('.wcsearch-tax-dropdowns-wrap');
3325		var tax = wrapper.data('tax');
3326		var count = wrapper.data('count');
3327		var hide_empty = wrapper.data('hide-empty');
3328
3329		wcsearch_update_tax(parent, tax, current_level, count, hide_empty, uID, function() {});
3330	});
3331
3332	function wcsearch_update_tax(parent, tax, current_level, count, hide_empty, uID, callback) {
3333		var current_level = parseInt(current_level);
3334		var next_level = current_level + 1;
3335		var prev_level = current_level - 1;
3336		var selects_length = $('#wcsearch-tax-dropdowns-wrap-'+uID+' select').length;
3337		
3338		if (parent) {
3339			$('#selected_tax\\['+uID+'\\]').val(parent).trigger('change');
3340		} else if (current_level > 1) {
3341			$('#selected_tax\\['+uID+'\\]').val($('#chainlist_'+prev_level+'_'+uID).val()).trigger('change');
3342		} else {
3343			$('#selected_tax\\['+uID+'\\]').val(0).trigger('change');
3344		}
3345
3346		var exact_terms = $('#exact_terms\\['+uID+'\\]').val();
3347
3348		for (var i=next_level; i<=selects_length; i++) {
3349			$('#wcsearch-wrap-chainlist-'+i+'-'+uID).remove();
3350		}
3351		
3352		if (parent) {
3353			var labels_source = wcsearch_js_objects['tax_dropdowns_'+uID][uID];
3354
3355			if (labels_source.titles[current_level] != undefined) {
3356				var title = labels_source.titles[current_level];
3357			} else {
3358				var title = '';
3359			}
3360
3361			$('#wcsearch-wrap-chainlist-'+current_level+'-'+uID+' select').attr('disabled', 'disabled');
3362			$.post(
3363				wcsearch_js_objects.ajaxurl,
3364				{
3365					'action': 'wcsearch_tax_dropdowns_hook',
3366					'parentid': parent,
3367					'next_level': next_level,
3368					'tax': tax,
3369					'count': count,
3370					'hide_empty': hide_empty,
3371					'title': title,
3372					'exact_terms': exact_terms,
3373					'uID': uID
3374				},
3375				function(response_from_the_action_function){
3376					if (response_from_the_action_function != 0)
3377						$('#wcsearch-tax-dropdowns-wrap-'+uID).append(response_from_the_action_function);
3378
3379					$('#wcsearch-wrap-chainlist-'+current_level+'-'+uID+' select').removeAttr('disabled');
3380					
3381					callback();
3382				}
3383			);
3384		}
3385	}
3386	
3387	function wcsearch_HTML_entity_decode(str){
3388		return $('<textarea />').html(str).text(); // HTML Entity Decode
3389	}
3390	
3391	function first(p){for(var i in p)return p[i];}
3392}(jQuery))

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.