PageSourceSearch

https://www.vancouvermom.ca/wp-content/plugins/w2dc/search/plugin/resources/js/js_functions.js?ver=1.2.5

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