PageSourceSearch

https://www.theboroughlancaster.co.uk/wp-content/themes/california-wp/js/live-search.js

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