PageSourceSearch

https://waitbutwhy.com/wp-content/plugins/ajaxy-search-form/js/sf.js?ver=1.0.1

js waitbutwhy.com collected 2026-09-24 06:53:28 UTC 12,699 bytes, 395 lines download raw bytes

1(function($) {
2
3    $.fn.extend({
4        ajaxyLiveSearch: function(options, arg) {
5            if (options && typeof(options) == 'object') {
6                options = $.extend( {}, $.ajaxyLiveSearch.defaults, options );
7            }
8			else {
9				options = $.ajaxyLiveSearch.defaults;
10			}
11            // this creates a plugin for each element in
12            // the selector or runs the function once per
13            // selector.  To have it do so for just the
14            // first element (once), return false after
15            // creating the plugin to stop the each iteration 
16			if(this.is("input")){
17				this.each(function() {
18					new $.ajaxyLiveSearch.load(this, options, arg );
19				});
20				return;
21			}
22        }
23    });
24
25    $.ajaxyLiveSearch = {
26		element: null,
27		timeout: null,
28		options: null,
29		load: function( elem, options, arg ) {
30				this.element = elem;
31				this.timeout = null;
32				this.options = options;
33				if($(elem).val() == "") {
34					$(elem).val(options.text);
35				}
36				$(elem).attr('autocomplete', 'off');
37				if($('#sf_sb').length == 0){
38					$('body').append('<div id="sf_sb" class="sf_sb" style="position:absolute;display:none;width:'+ options.width + 'px;z-index:9999">'+
39											'<div class="sf_sb_cont">' +
40												'<div class="sf_sb_top"></div>' +
41												'<div id="sf_results" style="width:100%">' +
42													'<div id="sf_val" ></div>' +
43													'<div id="sf_more"></div>' +
44												'</div>' +
45												'<div class="sf_sb_bottom"></div>' +
46											'</div>' +
47										'</div>');
48				}
49				$.ajaxyLiveSearch.loadEvents(this);
50			},
51		loadResults: function(object) {
52			options = object.options;
53			elem = object.element;
54			window.sf_lastElement = elem;
55			if(jQuery(elem).val() != "")
56			{
57				jQuery("body").data("sf_results", null);
58				var loading  = 	"<li class=\"sf_lnk sf_more sf_selected\">"+
59					"<a id=\"sf_loading\" href=\"" + options.searchUrl.replace('%s', encodeURI(jQuery(elem).val())) + "\">"+
60					"</a>"+
61				"</li>";
62				jQuery("#sf_val").html("<ul>"+loading+"</ul>");
63				var pos = this.bounds(elem, options);
64				if(!pos) {
65					jQuery("#sf_sb").hide();
66					return false;
67				}
68				if(Math.ceil(pos.left) + parseInt(options.width, 10) > jQuery(window).width()) {
69					jQuery("#sf_sb").css('width', jQuery(window).width() - pos.left - 20);
70				}
71				if(options.rtl == 1) {
72					jQuery("#sf_sb").css({top:pos.bottom, left:pos.right});
73				}else{
74					jQuery("#sf_sb").css({top:pos.bottom, left:pos.left});
75				}
76				jQuery("#sf_sb").show();
77				
78				var data = { action: "ajaxy_sf", sf_value: jQuery(elem).val(), search:options.search};
79				if(options.ajaxData){
80					data = window[options.ajaxData](data);
81				}
82				if(options.search) {
83					var mresults = options.search.split(',');
84					var results = [];
85					var m = "";
86					var s = 0;
87
88					var c = [];
89					for(var kindex in mresults){
90						var dm = mresults[kindex].split(":");
91						if(dm.length == 2) {
92							if(dm[1].indexOf(jQuery(elem).val()) == 0) {
93								results[results.length] = mresults[kindex];
94							}
95						}else if(dm.length == 1){
96							if(mresults[kindex].indexOf(jQuery(elem).val()) == 0) {
97								results[results.length] = mresults[kindex];
98							}
99						}
100					}
101					
102					c = $.ajaxyLiveSearch.htmlArrayResults(results);
103					m += c[0];
104					s += c[1];
105					
106					var sf_selected = "";
107					if(s == 0)
108					{
109						sf_selected = " sf_selected";
110					}
111					m += "<li class=\"sf_lnk sf_more" + sf_selected + "\">{total} Results Found</li>";
112					
113					m = m.replace(/{search_value_escaped}/g, jQuery(elem).val());
114					m = m.replace(/{search_url_escaped}/g, options.searchUrl.replace('%s', encodeURI(jQuery(elem).val())));
115					m = m.replace(/{search_value}/g, jQuery(elem).val());
116					m = m.replace(/{total}/g, s);
117					
118					jQuery("body").data("sf_results", results);
119					
120					if(s > 0)
121					{
122						jQuery("#sf_val").html("<ul>"+m+"</ul>");
123					}
124					else
125					{
126						jQuery("#sf_val").html("<ul>"+m+"</ul>");
127					}
128					$.ajaxyLiveSearch.loadLiveEvents(object);
129					jQuery("#sf_sb").show();
130				}else{
131					jQuery.post(options.ajaxUrl, data, function(resp) { 
132						var results = eval("("+ resp + ")");
133						var m = "";
134						var s = 0;
135						for(var mindex in results)
136						{
137							var c = [];
138							for(var kindex in results[mindex]){
139								c = $.ajaxyLiveSearch.htmlResults(results[mindex][kindex], mindex, kindex);
140								m += c[0];
141								s += c[1];
142							}
143						}
144						
145						
146						
147						var sf_selected = "";
148						if(s == 0)
149						{
150							sf_selected = " sf_selected";
151						}
152						if(!options.callback) {
153							m += "<li class=\"sf_lnk sf_more" + sf_selected + "\">" + sf_templates + "</li>";
154						}
155						m = m.replace(/{search_value_escaped}/g, jQuery(elem).val());
156						m = m.replace(/{search_url_escaped}/g, options.searchUrl.replace('%s', encodeURI(jQuery(elem).val())));
157						m = m.replace(/{search_value}/g, jQuery(elem).val());
158						m = m.replace(/{total}/g, s);
159						
160						jQuery("body").data("sf_results", results);
161						
162						if(s > 0)
163						{
164							jQuery("#sf_val").html('<ul class="sf_main">'+m+'</ul>');
165						}
166						else
167						{
168							jQuery("#sf_val").html('<ul class="sf_main">'+m+'</ul>');
169						}
170						$.ajaxyLiveSearch.loadLiveEvents(object);
171						jQuery("#sf_sb").show();
172					});
173				}
174			 }
175			 else
176			 {
177				jQuery("#sf_sb").hide();
178			 }
179		},
180		bounds: function (elem, options) {
181			var offset = jQuery(elem).offset();
182			if(offset) {
183				return {top: offset.top, left: offset.left + options.leftOffset, bottom: offset.top +  jQuery(elem).innerHeight() + options.topOffset, right: offset.left - jQuery('#sf_sb').innerWidth() + jQuery(elem).innerWidth()};			
184			}
185		},
186		htmlResults: function (results, type, array_index){
187			var m = "";
188			var s = 0;	
189			if(typeof(results) != "undefined")
190			{
191				if(results.all.length > 0)
192				{
193					m += "<li class=\"sf_header\">" + results.title + "</li><li><div class=\"sf_result_container\"><ul>";
194					for(var i = 0; i < results.all.length; i ++)
195					{
196						s ++;
197						m += "<li result-type='object' index-type='" + type + "' index-array='" + array_index + "' index='" + i + "' class=\"sf_lnk "+results.class_name +"\">"+  $.ajaxyLiveSearch.replaceResults(results.all[i], results.template) + "</li>";
198					}
199					m += "</ul></div></li>";
200				}
201			}
202			return new Array(m, s);
203		},
204		htmlArrayResults: function (results){
205			var m = "";
206			var s = 0;	
207			if(typeof(results) != "undefined")
208			{
209				if(results.length > 0)
210				{
211					m += "<li><div class=\"sf_result_container\"><ul>";
212					for(var i = 0; i < results.length; i ++)
213					{
214						var md = results[i].split(':');
215						var title = "";
216						if(md.length == 2) {
217							title = md[1];
218						}else{
219							title = results[i];
220						}
221						s ++;
222						m += "<li result-type='array' index='" + i + "' class=\"sf_lnk sf_category\"><a href='javascript:;'>" + title + "</a></li>";
223					}
224					m += "</ul></div></li>";
225				}
226			}
227			return new Array(m, s);
228		},
229		replaceResults: function (results, template){
230			for(var s in results)
231			{
232				template = template.replace(new RegExp("{"+s+"}", "g"), results[s]);
233			}
234			return template;
235		},
236		loadLiveEvents: function(object){
237			var d = {object: object};
238			jQuery("#sf_val li.sf_lnk").mouseover(function(){
239				jQuery(".sf_lnk").each(function() { jQuery(this).attr("class",jQuery(this).attr("class").replace(" sf_selected" , "")); });
240				jQuery(this).attr("class", jQuery(this).attr("class") + " sf_selected");
241			});
242			if(d.object.options.callback)
243			{
244				jQuery("#sf_val li.sf_lnk").click(function(event){
245					try{
246						window[d.object.options.callback](d.object, this);
247					}catch(e){
248						alert(e);
249					}
250					return false;
251				});
252			}
253		},
254		loadEvents: function(object){
255			var d = {object: object};
256			jQuery(document).click(function(){ jQuery("#sf_sb").hide(); });
257			jQuery(window).resize(function(){ 
258				var pos = $.ajaxyLiveSearch.bounds(window.sf_lastElement, d.object.options);
259				if(pos) {
260					jQuery("#sf_sb").css({top:pos.bottom, left:pos.left});
261				}
262			});
263			
264			
265			jQuery(object.element).keyup(function(event){
266				if(event.keyCode != "38" && event.keyCode != "40" && event.keyCode != "13" && event.keyCode != "27" && event.keyCode != "39" && event.keyCode != "37")
267				{
268					var ajaxyObject = d.object;
269					if(ajaxyObject.timeout != null)
270					{
271						clearTimeout(ajaxyObject.timeout);
272					}
273					jQuery(ajaxyObject.element).attr("class", jQuery(ajaxyObject.element).attr("class").replace(" sf_focused", "") + " sf_focused");
274					//$.ajaxyLiveSearch.loadResults(d.object.element, d.object.options);
275					var l = {object:d.object};
276					ajaxyObject.timeout = setTimeout(function() { jQuery.ajaxyLiveSearch.loadResults(l.object); }, d.object.options.delay);
277				}
278			});	
279			jQuery(window).keydown(function(event){
280				if(jQuery("#sf_sb").css("display") != "none" && jQuery("#sf_sb").css("display") != "undefined" && jQuery("#sf_sb").length > 0)
281				{
282					if(event.keyCode == "38" || event.keyCode == "40")
283					{
284						if(jQuery.browser.webkit)
285						{
286							jQuery("#sf_sb").focus();
287						}
288						var s_item = null;
289						var after_s_item = null;
290						var s_sel = false;
291						var all_items = jQuery("#sf_val li.sf_lnk");
292						var s_found = false;
293						event.stopPropagation();
294						event.preventDefault();
295						for(var i = 0; i < all_items.length; i++)
296						{
297							if(jQuery(all_items[i]).attr("class").indexOf("sf_selected") >= 0 && s_found == false)
298							{
299								s_sel = true;
300								if(i < all_items.length - 1 && event.keyCode == "40")
301								{
302									jQuery(all_items[i]).attr("class",jQuery(all_items[i]).attr("class").replace(" sf_selected", ""));
303									jQuery(all_items[i+1]).attr("class", jQuery(all_items[i+1]).attr("class")+ " sf_selected");
304									i = i+1;
305									s_found = true;
306								}
307								else if(i > 0 && event.keyCode == "38")
308								{
309									jQuery(all_items[i]).attr("class",jQuery(all_items[i]).attr("class").replace(" sf_selected", ""));
310									jQuery(all_items[i-1]).attr("class", jQuery(all_items[i-1]).attr("class")+ " sf_selected");
311									i = i+1;
312									s_found = true;
313								}
314							}
315							else
316							{
317								jQuery(all_items[i]).attr("class",jQuery(all_items[i]).attr("class").replace(" sf_selected", ""));
318							}
319						}
320						if(s_sel == false)
321						{
322							if(all_items.length > 0)
323							{
324								jQuery(all_items[0]).attr("class", jQuery(all_items[0]).attr("class")+ " sf_selected");
325							}
326						}
327						//jQuery(window).unbind("keypress");
328
329					}
330					else if(event.keyCode == 27)
331					{
332						jQuery("#sf_sb").hide();
333					}
334					else if(event.keyCode == 13)
335					{
336						var b = jQuery("#sf_val li.sf_selected a").attr("href");
337						if(typeof(b) != 'undefined' && b != '')
338						{
339							if(d.object.options.callback){
340								d.object.options.callback(this);
341							}else{
342								window.location.href = b;
343							}
344							return false;
345						}
346						else
347						{
348							if(d.object.options.callback){
349								d.object.options.callback(this);
350							}
351							else if(d.object.element != null){
352								window.location.href = sf_url.replace('%s', encodeURI(jQuery(d.object).val()));
353							}
354							return false;
355						}
356					}
357				}
358			});
359			jQuery(object.element).focus(function (){
360				if(jQuery(this).val() == d.object.options.text){
361					jQuery(this).val('');
362					jQuery(this).attr('class', jQuery(this).attr('class') + ' sf_focused');
363				}
364				if(d.object.options.expand > 0){
365					jQuery(d.object.element).animate({width:d.object.options.iwidth});
366				}
367			});
368			jQuery(object.element).blur(function () {
369				if(jQuery(this).val() == ''){
370					jQuery(this).val(d.object.options.text);
371					jQuery(this).attr('class', jQuery(this).attr('class').replace(/ sf_focused/g, ''));
372				}
373				if(d.object.options.expand > 0){
374					jQuery(d.object.element).animate({width:d.object.options.expand});
375				}
376			});
377		}
378	};
379    $.ajaxyLiveSearch.defaults = {
380       delay:500, 
381	   leftOffset: 0,
382	   topOffset: 5,
383	   text: "Search For",
384	   iwidth: 180,
385	   width: 315,
386	   ajaxUrl: "",
387	   ajaxData: false, //function to extend data sent to server
388	   searchUrl: "",
389	   expand: false,
390	   callback: false,
391	   rtl: true,
392	   search: false
393    };
394
395})(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.