PageSourceSearch

https://www.norberts.com/javascript/quicksearch.js

js norberts.com collected 2026-10-07 22:48:23 UTC 7,351 bytes, 289 lines download raw bytes

1var QuickSearch = {
2	minimum_length: 3,
3	search_delay: 125,
4	cache: new Object(),
5	init: function()
6	{
7		$('#search_query').bind("keydown", QuickSearch.on_keydown);
8		$('#search_query').bind("keyup", QuickSearch.on_keyup);
9		$('#search_query').bind("change", QuickSearch.on_change);
10		$('#search_query').blur(QuickSearch.on_blur);
11		$('#search_query').attr('autocomplete', 'off');
12
13		var scripts = document.getElementsByTagName('SCRIPT');
14		for(var i = 0; i < scripts.length; i++)
15		{
16			s = scripts[i];
17			if(s.src && s.src.indexOf('quicksearch.js') > -1)
18			{
19				QuickSearch.path = s.src.replace(/quicksearch\.js$/, '../');
20				break;
21			}
22		}
23
24	},
25
26	on_blur: function(event)
27	{
28		if(!QuickSearch.item_selected && !QuickSearch.over_all)
29		{
30			QuickSearch.hide_popup();
31		}
32	},
33
34	on_keydown: function(event)
35	{
36		if(event.keyCode == 13 && !event.altKey)
37		{
38			if(QuickSearch.selected)
39			{
40				try {
41					event.preventDefault();
42					event.stopPropagation();
43				} catch(e) { }
44				window.location = QuickSearch.selected.url;
45				return false;
46			}
47			else
48			{
49				QuickSearch.hide_popup();
50			}
51		}
52		else if(event.keyCode == 27)
53		{
54			if(document.getElementById('QuickSearch'))
55			{
56				try {
57					event.preventDefault();
58					event.stopPropagation();
59				} catch(e) { }
60			}
61			QuickSearch.hide_popup();
62		}
63	},
64
65	on_keyup: function(event)
66	{
67		if(QuickSearch.timeout)
68		{
69			clearTimeout(QuickSearch.timeout);
70		}
71
72		// Down key was pressed
73		if(event.keyCode == 40 && QuickSearch.results)
74		{
75			if(QuickSearch.selected && QuickSearch.results.length >= QuickSearch.selected.index+1)
76			{
77				QuickSearch.highlight_item(QuickSearch.selected.index+1, true);
78			}
79			if(!QuickSearch.selected && QuickSearch.results.length > 0)
80			{
81				QuickSearch.highlight_item(0, true);
82			}
83			try {
84				event.preventDefault();
85				event.stopPropagation();
86			} catch(e) { }
87			return false;
88		}
89		else if(event.keyCode == 38 && QuickSearch.results)
90		{
91			if(QuickSearch.selected && QuickSearch.selected.index > 0)
92			{
93				QuickSearch.highlight_item(QuickSearch.selected.index-1, true);
94			}
95			try {
96				event.preventDefault();
97				event.stopPropagation();
98			} catch(e) { }
99		}
100		else if(event.keyCode == 27)
101		{
102			QuickSearch.hide_popup();
103		}
104		else
105		{
106			if($('#search_query').val() == QuickSearch.last_query)
107			{
108				return false;
109			}
110			QuickSearch.selected = false;
111			if($('#search_query').val().replace(/^\s+|\s+$/g, '').length >= QuickSearch.minimum_length)
112			{
113				QuickSearch.last_query = $('#search_query').val().replace(/^\s+|\s+$/g, '');
114				if(QuickSearch.timeout)
115				{
116					window.clearTimeout(QuickSearch.timeout);
117				}
118				QuickSearch.timeout = window.setTimeout(QuickSearch.do_search, QuickSearch.search_delay);
119			}
120			else {
121				if(document.getElementById('QuickSearch'))
122				{
123					$('#QuickSearch').remove();
124				}
125			}
126		}
127	},
128
129	on_change: function(event)
130	{
131		return (QuickSearch.on_keydown(event) && QuickSearch.on_keyup(event));
132	},
133
134	do_search: function()
135	{
136		var cache_name = $('#search_query').val().length+$('#search_query').val();
137		if(QuickSearch.cache[cache_name])
138		{
139			QuickSearch.search_done(QuickSearch.cache[cache_name]);
140		}
141		else
142		{
143			$.ajax({
144				type: 'GET',
145				dataType: 'xml',
146				url: QuickSearch.path+'search.php?action=AjaxSearch&search_query='+encodeURIComponent($('#search_query').val()),
147				success: function(response) { QuickSearch.search_done(response); }
148			});
149		}
150	},
151
152	search_done: function(response)
153	{
154		// Cache results
155		var cache_name = $('#search_query').val().length+$('#search_query').val();
156		QuickSearch.cache[cache_name] = response;
157
158		if(document.getElementById('QuickSearch')) {
159			$('#QuickSearch').remove();
160		}
161
162		if ($('result', response).length > 0) {
163			var popup_container = document.createElement('TABLE');
164			popup_container.className = 'QuickSearch';
165			popup_container.id = 'QuickSearch';
166			popup_container.cellPadding = "0";
167			popup_container.cellSpacing = "0";
168			popup_container.border = "0";
169
170			var popup = document.createElement('TBODY');
171			popup_container.appendChild(popup);
172
173			var counter = 0;
174
175			$('result', response).each(
176				function()
177				{
178					var tr = $($(this).text());
179					var url = $('.QuickSearchResultName a', tr).attr('href');
180					var tmpCounter = counter;
181
182					$(tr).attr('id', 'QuickSearchResult' + tmpCounter);
183					$(tr).bind('mouseover', function() { QuickSearch.item_selected = true; QuickSearch.highlight_item(tmpCounter, false); });
184					$(tr).bind('mouseup', function() { window.location = url; });
185					$(tr).bind('mouseout', function() { QuickSearch.item_selected = false; QuickSearch.unhighlight_item(tmpCounter) });
186					$(popup).append(tr);
187
188					counter++;
189				}
190			);
191
192			// More results than we're showing?
193			var all_results_count = $('viewmoreurl', response).size();
194
195			if(all_results_count)
196			{
197				var tr = document.createElement('TR');
198				var td = document.createElement('TD');
199				tr.className = "QuickSearchAllResults";
200				tr.onmouseover = function() { QuickSearch.over_all = true; };
201				tr.onmouseout = function() { QuickSearch.over_all = false; };
202				td.colSpan = 2;
203				td.innerHTML = $('viewmoreurl', response).text();
204				tr.appendChild(td);
205				popup.appendChild(tr);
206			}
207
208			var clone = popup.cloneNode(true);
209			document.body.appendChild(clone);
210			clone.style.top = "10px";
211			clone.style.left = "10px";
212			offset_height = clone.offsetHeight;
213			offset_width = clone.offsetWidth;
214			clone.parentNode.removeChild(clone);
215
216			var offset_top = offset_left = 0;
217			var element = document.getElementById('search_query');
218			if(typeof(QuickSearchAlignment) != 'undefined' && QuickSearchAlignment == 'left') {
219				offset_left = 0;
220			}
221			else {
222				offset_left += element.offsetWidth - $('#SearchForm').width();
223			}
224
225			//offset_top = -3;
226			offset_top = 0;
227			offset_left = -51;
228			do
229			{
230				offset_top += element.offsetTop || 0;
231				offset_left += element.offsetLeft || 0;
232				element = element.offsetParent;
233			} while(element);
234
235			popup_container.style.position = "absolute";
236			popup_container.style.left = offset_left + 1 + "px";
237			popup_container.style.left = offset_left + 20 + "px";
238			popup_container.style.top = offset_top + document.getElementById('search_query').offsetHeight + "px";
239			if(typeof(QuickSearchWidth) != 'undefined') {
240				popup_container.style.width = QuickSearchWidth;
241			}
242			else {
243				popup_container.style.width = document.getElementById('SearchForm').offsetWidth - 2 + "px";
244			}
245			if($('#QuickSearch'))
246			{
247				$('#QuickSearch').remove();
248			}
249			document.body.appendChild(popup_container);
250			popup_container.style.display = '';
251		}
252		else
253		{
254			if(document.getElementById('QuickSearch'))
255			{
256				$('#QuickSearch').remove();
257			}
258		}
259	},
260
261
262	hide_popup: function()
263	{
264		$('#QuickSearch').remove();
265		QuickSearch.selected = null;
266	},
267
268	highlight_item: function(index, keystroke)
269	{
270		element = $('#QuickSearchResult'+index);
271		if(keystroke == true)
272		{
273			if(QuickSearch.selected) QuickSearch.selected.className = 'QuickSearchResult';
274			QuickSearch.selected = document.getElementById('QuickSearchResult'+index);
275		}
276		element.addClass("QuickSearchHover");
277	},
278
279	unhighlight_item: function(index)
280	{
281		element = $('#QuickSearchResult'+index);
282		element.removeClass('QuickSearchHover');
283	}
284};
285
286$(document).ready(function()
287{
288	QuickSearch.init();
289});

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.