PageSourceSearch

https://www.comunideco.it/modules/mod_rokajaxsearch/js/rokajaxsearch.js

js comunideco.it collected 2026-10-02 11:47:53 UTC 34,081 bytes, 907 lines download raw bytes

1/**
2 * RokAjaxSearch Module
3 *
4 * @package		Joomla
5 * @subpackage	RokAjaxSearch Module
6 * @copyright Copyright (C) 2009 RocketTheme. All rights reserved.
7 * @license http://www.gnu.org/copyleft/gpl.html GNU/GPL, see RT-LICENSE.php
8 * @author RocketTheme, LLC
9 *
10 */
11
12var RokAjaxSearch = new Class({
13	version: "2.0 (mt 1.2)",
14	Implements: [Options, Events],
15	options: {
16		'results': null,
17		'close': null,
18		'websearch': false,
19		'blogsearch': false,
20		'imagesearch': false,
21		'videosearch': false,
22		'imagesize': 'MEDIUM',
23		'safesearch': 'MODERATE',
24		'search': null,
25		'readmore': null,
26		'noresults': null,
27		'advsearch': null,
28		'searchlink': null,
29		'advsearchlink': null,
30		'page': null,
31		'page_of': null,
32		'uribase': null,
33		'limit': null,
34		'perpage': null,
35		'ordering': null,
36		'phrase': null,
37		'keyevents': true,
38		'hidedivs': null,
39		'includelink': null,
40		'viewall': null,
41		'estimated': null,
42		'showestimated': true,
43		'showpagination': true,
44		'showcategory': true,
45		'showreadmore': true,
46		'showdescription': true,
47		'wordpress': false
48	},
49
50	initialize: function(options) {
51		this.setOptions(options);
52
53		this.timer = null;
54		this.rows = ['roksearch_odd', 'roksearch_even'];
55		this.searchphrase = this.options.phrase;
56
57		this.inputBox = document.getElements('#rokajaxsearch input.inputbox').set('autocomplete', 'off');
58		var pos = this.inputBox.getCoordinates();
59
60		var last = document.id(document.body).getLast();
61
62		if (last && last.get('id') == 'roksearch_results'){
63			this.results = last;
64		} else {
65			this.results = document.id('roksearch_results').setStyles({
66				'position': 'absolute',
67				'top': pos[0].top + pos[0].height,
68				'left': this.getLeft()
69			}).inject(document.body);
70		}
71
72		this.fx = new Fx.Tween(this.results).set('opacity', 0);
73		this.current = 0;
74
75		var self = this;
76		window.addEvent('resize', function() {
77			self.results.setStyles({'top': self.getTop(), 'left': self.getLeft()});
78		});
79
80		this.type = 'local';
81		var perpage = this.options.perpage;
82
83		if (this.options.websearch || this.options.blogsearch || this.options.imagesearch) {
84			document.getElements('#rokajaxsearch .search_options input[type=radio]').each(function(input) {
85				input.addEvent('click', function() {
86					this.type = input.value;
87					if (this.type == 'web' || this.type == 'blog' || this.type == 'images' || this.type == 'videos') {
88						this.options.perpage = 4;
89						if (this.type == 'web') this.google = new google.search.WebSearch();
90						else if (this.type == 'blog') this.google = new google.search.BlogSearch();
91						else if (this.type == 'images') {
92							this.options.perpage = 3;
93							this.google = new google.search.ImageSearch();
94							this.google.setRestriction(google.search.ImageSearch.RESTRICT_IMAGESIZE, google.search.ImageSearch['IMAGESIZE_' + this.options.imagesize]);
95						} else if (this.type == 'videos') {
96							this.options.perpage = 3;
97							this.google = new google.search.VideoSearch();
98						}
99						if (this.type != 'blog' && this.type != 'videos') this.google.setRestriction(google.search.Search.RESTRICT_SAFESEARCH, google.search.Search['SAFESEARCH_' + this.options.safesearch]);
100						this.google.setResultSetSize(google.search.Search.SMALL_RESULTSET);
101						this.google.setNoHtmlGeneration();
102						this.google.setSearchCompleteCallback(this, this.googleComplete);
103					}
104					else this.options.perpage = perpage;
105				}.bind(this));
106			}, this);
107			//.setSearchStartingCallback(this, this.googleStart);
108		}
109
110		this.addEvents();
111		this.keyEvents();
112	},
113
114	getTop: function(input) {
115		input = document.id(input ? input : this.inputBox[0]);
116		if (!input) { return; }
117		var pos = input.getCoordinates(), y = document.id('roksearch_results').getSize().y;
118		var win = document.id(window).getSize(), top;
119
120		if (win.y / 2 < pos.top + pos.height) {
121			top = pos.top + pos.height ;
122		} else {
123			top = pos.top + pos.height;
124		}
125
126		if (top < 0) top = pos.top + pos.height;
127
128		return top;
129	},
130
131	getLeft: function(input) {
132		input = document.id(input ? input : this.inputBox[0]);
133		if (!input) { return; }
134		var pos = input.getBoundingClientRect(), x = document.id('roksearch_results').getSize().x;
135		var win = document.id(window).getSize(), left;
136
137		if (win.x / 2 < pos.left + pos.width) {
138			left = pos.left + pos.width - x;
139		} else {
140			left = pos.left;
141		}
142
143		if (left < 0) left = pos.left;
144
145		return left;
146	},
147
148	googleStart: function() {
149		if (!this.inputBox.hasClass('loading')) this.inputBox.addClass('loading');
150		this.google.execute(this.inputBox.value);
151	},
152
153	googleComplete: function() {
154		var results = this.google.results;
155		var tmp = document.id('rokajaxsearch_tmp');
156//		console.log(results);
157		var ol = new Element('ol', {'class': 'list'}).inject(tmp);
158
159		if (this.type == 'web') {
160			results.each(function(res) {
161				var li = new Element('li');
162				var title_link = new Element('a', {'href': res.unescapedUrl}).set('target', '_blank').set('html', res.title);
163				var title = new Element('h4').inject(li).adopt(title_link);
164
165				var category = new Element('p').set('html', '<small><a href="'+res.url+'" target="_blank">'+res.visibleUrl+'</a></small>').inject(li);
166
167				var content = res.content;
168				content = content.replace('<b>', '<span class="highlight">').replace('</b>', '</span>');
169				var desc = new Element('div', {'class': 'description'}).set('html', content).inject(li);
170
171				li.inject(ol);
172			});
173		} else if (this.type == 'blog') {
174			results.each(function(res) {
175				var li = new Element('li');
176				var title_link = new Element('a', {'href': res.postUrl}).set('target', '_blank').set('html', res.title);
177				var title = new Element('h4').inject(li).adopt(title_link);
178
179				var category = new Element('p').set('html', '<small>by '+res.author+' - <a href="'+res.blogUrl+'" target="_blank">'+res.blogUrl+'</a></small>').inject(li);
180
181				var content = res.content;
182				content = content.replace('<b>', '<span class="highlight">').replace('</b>', '</span>');
183				var desc = new Element('div', {'class': 'description'}).set('html', content).inject(li);
184
185				li.inject(ol);
186			});
187		} else if (this.type == 'images') {
188			results.each(function(res) {
189				var li = new Element('li');
190				var title_link = new Element('a', {'href': res.url}).set('target', '_blank').set('html', res.title);
191				var title = new Element('h4').inject(li).adopt(title_link);
192
193				var category = new Element('p').set('html', '<small><a href="'+res.originalContextUrl+'" target="_blank">'+res.visibleUrl+'</a></small>').inject(li);
194
195				var content = res.content;
196				content = content.replace('<b>', '<span class="highlight">').replace('</b>', '</span>');
197				var desc = new Element('div', {'class': 'description'}).set('html', content).inject(li);
198
199				var thumb_container = new Element('div', {'class': 'google-thumb-image loading'}).inject(desc);
200				thumb_container.setStyles({
201					'width': res.tbWidth.toInt(),
202					'height': res.tbHeight.toInt()
203				});
204
205				var a = new Element('a', {'href': res.url, 'target': '_blank'}).inject(thumb_container);
206				var img = new Element('image', {
207					width: res.tbWidth.toInt(),
208					height: res.tbHeight.toInt(),
209					src: res.tbUrl
210				}).inject(a);
211
212				li.inject(ol);
213			});
214		} else if (this.type == 'videos') {
215			results.each(function(res) {
216				var li = new Element('li');
217				var title_link = new Element('a', {'href': res.playUrl}).set('target', '_blank').set('html', res.title);
218				var title = new Element('h4').inject(li).adopt(title_link);
219
220				var seconds = res.duration.toInt();
221				var duration = '00:' + ((seconds < 10) ? '0' + seconds : seconds);
222
223				if (seconds >= 60) {
224					var m = seconds / 60;
225					var s = seconds - (m * 60);
226					m = m.toInt(); s = s.toInt();
227					if (m < 10) m = '0' + m;
228					if (s < 10) s = '0' + s;
229					duration = m + ':' + s;
230
231					if (m >= 60) {
232						var h = m / 60;
233						h = h.toInt();
234						if (h < 10) h = '0' + h;
235						duration = h + duration;
236					}
237				}
238
239				var category = new Element('p').set('html', '<span class="'+res.videoType.toLowerCase()+'">Rating: '+(parseFloat(res.rating)).toFixed(2)+' | Duration: '+duration+' <small>'+res.videoType+'</small></span>').inject(li);
240
241				var desc = new Element('div', {'class': 'description'}).set('html', '').inject(li);
242
243				var thumb_container = new Element('div', {'class': 'google-thumb-image loading'}).inject(desc);
244				thumb_container.setStyles({
245					'width': res.tbWidth.toInt(),
246					'height': res.tbHeight.toInt(),
247					'text-align': 'center'
248				});
249
250				var a = new Element('a', {'href': res.url, 'target': '_blank'}).inject(thumb_container);
251				var img = new Element('image', {
252					src: res.tbUrl,
253					width: res.tbWidth.toInt(),
254					height: res.tbHeight.toInt()
255				}).inject(a);
256
257				li.inject(ol);
258			});
259		}
260
261		this.results.empty().removeClass('roksearch_results').setStyle('visibility', 'visible');
262
263		this.arrowleft = null;
264		this.arrowright = null;
265		this.selectedEl = -1;
266		this.els = [];
267
268		this.outputTableless();
269
270		tmp.empty().setStyle('visibility','visible');
271		this.inputBox.removeClass('loading');
272
273
274		var pos = this.inputBox.getCoordinates(), self = this;
275		this.results.setStyles({
276			'top': pos.top + pos.height,
277			'left': self.getLeft()
278		});
279		this.fx.start('opacity', 1);
280		this.fireEvent('loaded');
281		//console.log(this.google.cursor);*/
282	},
283
284	addEvents: function() {
285		var self = this;
286		this.inputBox.addEvents({
287
288			'keydown': function(e) {
289                clearTimeout(this.timer);
290
291				if (e.key == 'enter') e.stop();
292			},
293
294			'keyup': function(e) {
295				if (e.code == 17 || e.code == 18 || e.code == 224 || e.alt || e.control || e.meta) return false;
296				if (e.alt || e.control  || e.meta || e.key == 'esc' || e.key == 'up' || e.key == 'down' || e.key == 'left' || e.key == 'right') return true;
297				if (e.key == 'enter') e.stop();
298				if (e.key == 'enter' && self.selectedEl != -1) {
299					if (self.selectedEl || self.selectedEl == 0) location.href = self.els[self.selectedEl].getFirst('a');
300					return false;
301				}
302
303                clearTimeout(self.timer);
304
305				var lnk = self.options.searchlink.split("?")[0];
306				lnk = lnk.replace(self.options.uribase, '');
307				lnk = (lnk) ? lnk : "index.php";
308
309				var uri = self.options.uribase + lnk, input = this;
310				if (self.options.wordpress) uri = self.options.uribase + self.options.searchlink;
311
312				if (this.value == ''){
313					var splitDivs = self.options.hidedivs.split(" ");
314					self.results.empty().removeClass('roksearch_results').setStyle('visibility', 'hidden');
315
316					if (splitDivs.length > 0 && splitDivs != '') splitDivs.each(function(div){
317						document.id(div).setStyle('visibility', 'visible');
318					});
319				} else {
320					if (self.type == 'local') {
321						var exact = this.value.split('"');
322						if (exact.length >= 3) {
323							self.options.phrase = 'exact';
324						} else {
325							self.options.phrase = self.searchphrase;
326						}
327						var request = new Request({
328							url: uri,
329							method: 'get',
330							delay : 200,
331							onRequest: function() {
332								input.addClass('loading');
333							}.bind(this),
334							onSuccess: function(returns, b, c) {
335
336								var results = new Element('div', {'styles': {'display': 'none'}}).set('html', returns);
337								var tmp = document.id('rokajaxsearch_tmp');
338
339								var wrapper = results.getElement('.contentpaneopen');
340								if (wrapper) {
341									results.getChildren().each(function(div) {
342										if (div.get('class') == 'contentpaneopen' && div.id != 'page') {
343											tmp.set('html', div.innerHTML);
344										}
345									});
346								} else {
347									results.inject(document.body);
348									results.setStyles({
349										'display': 'block',
350										'position': 'absolute',
351										'top': -10000
352									});
353									wrapper = results.getElement('div.search-results') || results.getElement('div.search') || results.getElement('div[id=page]') || results.getElement('div.items');
354
355									if (!wrapper) wrapper = results.getElement('div.search');
356									results.dispose();
357									if (wrapper) {
358										var rs = wrapper.getElement('.search-results') || wrapper.getElement('.search') || wrapper.getElement('.results') || wrapper;
359										tmp.adopt(rs);
360									}
361								}
362
363
364								this.results.empty().removeClass('roksearch_results').setStyle('visibility', 'visible');
365
366								this.arrowleft = null;
367								this.arrowright = null;
368								this.selectedEl = -1;
369								this.els = [];
370
371								if (results.getElement('.contentpaneopen'))	this.outputTable();
372								else this.outputTableless();
373
374								tmp.empty().setStyle('visibility','visible');
375								input.removeClass('loading');
376
377								var pos = input.getCoordinates(), selfz = this;
378								selfz.results.setStyles({
379									'top': pos.top + pos.height,
380									'left': selfz.getLeft(input)
381								});
382
383								selfz.fx.start('opacity', 1);
384								selfz.fireEvent('loaded');
385
386							}.bind(self)
387						});
388
389						if (self.options.wordpress) {
390							self.timer = request.get.delay(500, request, [{
391								's' : this.value.replace(/\"/g, ''),
392								'task': 'search',
393								'action': 'rokajaxsearch',
394								'r' : Date.now()
395							}]);
396						} else {
397							self.timer = request.get.delay(500, request, [{
398								'type': 'raw',
399								'option' : 'com_search',
400								'view' : 'search',
401								'searchphrase' : self.options.phrase,
402								'ordering' : self.options.ordering,
403								'limit' : self.options.limit,
404								'searchword' : this.value.replace(/\"/g, ''),
405								'tmpl': 'component',
406								'r' : Date.now()
407							}]);
408						}
409					} else if (self.type != 'local') {
410						self.timer = self.googleStart.delay(500, self);
411					}
412				}
413
414				return true;
415			}
416		});
417
418		return this;
419	},
420
421	keyEvents: function() {
422		var bounds = {
423			'keyup': function(e) {
424				if (e.key == 'left' || e.key == 'right' || e.key == 'up' || e.key == 'down' || e.key == 'enter' || e.key == 'esc') {
425					e.stop();
426
427					var store = false;
428					if (e.key == 'left' && this.arrowleft) this.arrowleft.fireEvent('click');
429					else if (e.key == 'right' && this.arrowright) this.arrowright.fireEvent('click');
430					else if (e.key == 'esc' && this.close) this.close.fireEvent('click', e);
431					else if (e.key == 'down') {
432						store = this.selectedEl;
433
434						if (this.selectedEl == -1) this.selectedEl = (this.options.perpage) * this.current;
435						else if (this.selectedEl + 1 < this.els.length) this.selectedEl++;
436						else return;
437
438						if (store != -1) this.els[store].fireEvent('mouseleave');
439
440						if ((this.selectedEl/this.options.perpage).toInt() > this.current) this.arrowright.fireEvent('click', true);
441						if (this.selectedEl || this.selectedEl == 0) this.els[this.selectedEl].fireEvent('mouseenter');
442					} else if (e.key == 'up') {
443						store = this.selectedEl;
444
445						if (this.selectedEl == -1) this.selectedEl = (this.options.perpage) * this.current;
446						else if (this.selectedEl - 1 >= 0) this.selectedEl--;
447						else return;
448
449						if (store != -1) this.els[store].fireEvent('mouseleave');
450
451						if ((this.selectedEl/this.options.perpage).toInt() < this.current) this.arrowleft.fireEvent('click', true);
452						if (this.selectedEl || this.selectedEl == 0) this.els[this.selectedEl].fireEvent('mouseenter');
453					} else if (e.key == 'enter') {
454						if (this.selectedEl || this.selectedEl == 0) window.location = this.els[this.selectedEl].getElement('a');
455					}
456				}
457			}.bind(this)
458		};
459
460		if (this.options.keyevents) {
461			this.addEvent('loaded', function() {
462				document.addEvent('keyup', bounds.keyup);
463			});
464
465			this.addEvent('unloaded', function() {
466				document.removeEvent('keyup', bounds.keyup);
467			});
468		}
469	},
470
471	outputTable: function() {
472			var self = this;
473			var wrapper1 = new Element('div', {'class': 'roksearch_wrapper1'}).inject(this.results);
474			var wrapper2 = new Element('div', {'class': 'roksearch_wrapper2'}).inject(wrapper1);
475			var wrapper3 = new Element('div', {'class': 'roksearch_wrapper3'}).inject(wrapper2);
476			var wrapper4 = new Element('div', {'class': 'roksearch_wrapper4'}).inject(wrapper3);
477
478			var header = new Element('div', {'class': 'roksearch_header png'}).set('html', this.options.results).inject(wrapper4);
479			this.close = new Element('a', {'id': 'roksearch_link', 'class': 'png'}).set('href', '#').set('html', this.options.close).inject(header, 'before');
480			var splitDivs= this.options.hidedivs.split(" ");
481
482			this.close.addEvent('click', function(e) {
483				this.fireEvent('unloaded');
484
485				if (e) e.stop();
486
487				this.inputBox.set('value', '')[0].focus();
488				var self = this;
489				this.fx.start('opacity', 0).chain(function() {
490					self.results.empty().removeClass('roksearch_results');
491				});
492				//this.results.empty().removeClass('roksearch_results').setStyle('visibility', 'hidden');
493
494				if(splitDivs.length > 0 && splitDivs != '') splitDivs.each(function(div){
495					document.id(div).setStyle('visibility', 'visible');
496				});
497
498			}.bind(this));
499
500			if(splitDivs.length > 0 && splitDivs != '') splitDivs.each(function(div){
501				document.id(div).setStyle('visibility', 'hidden');
502			});
503
504			this.results.addClass('roksearch_results');
505			var searchedRestuls = document.getElements('#rokajaxsearch_tmp fieldset'),
506				splitting, container;
507
508			if (searchedRestuls.length > 0) {
509					container = new Element('div', {'class': 'container-wrapper'}).inject(wrapper4);
510					var scroller = new Element('div', {'class': 'container-scroller'}).inject(container);
511
512
513					searchedRestuls.each(function(res, i) {
514					var data = '';
515					data = res.getChildren();
516
517					if (data.length > 0){
518						data.each(function(div, j) {
519							if (div.get('tag') == "div"){
520								if (div.getChildren().length > 2 && !div.getPrevious()){
521									var suri = div.getFirst().getNext().getProperty('href');
522
523									var el = new Element('div', {'class': this.rows[i % 2] + ' png'});
524									var lnk = new Element('a').set('href', suri).inject(el);
525									var name = new Element('h3').set('html', div.getFirst().getNext().get('text')).inject(lnk);
526
527									this.els.push(el);
528									el.addEvents({
529										'mouseenter': function() {
530											this.addClass(self.rows[i % 2] + '-hover');
531											self.selectedEl = i;
532										},
533										'mouseleave': function() {
534											this.removeClass(self.rows[i % 2] + '-hover');
535											if (self.selectedEl == i) self.selectedEl = -1;
536										}
537									});
538
539									var description = '';
540									if (this.options.showdescription) description = div.getNext().innerHTML;
541									var desc = new Element('span').set('html', description).inject(lnk, 'after');
542									var br;
543
544									if(this.options.showcategory){
545										var cat = new Element('span', {'class': 'small'}).set('html', div.getChildren().getLast().get('text')).inject(lnk, 'after');
546										br = new Element('br').inject(cat, 'after');
547									}
548
549									if(this.options.showreadmore){
550										lnk = new Element('a', {'class': 'clr'}).set('href', suri).set('html', this.options.readmore).inject(desc, 'after');
551										if(this.options.showdescription) br = new Element('br').inject(desc, 'after');
552									}
553
554									var innerWrapper1 = new Element('div', {'class': 'roksearch_result_wrapper1 png'}).inject(scroller);
555									var innerWrapper2 = new Element('div', {'class': 'roksearch_result_wrapper2 png'}).inject(innerWrapper1);
556									var innerWrapper3 = new Element('div', {'class': 'roksearch_result_wrapper3 png'}).inject(innerWrapper2);
557									var innerWrapper4 = new Element('div', {'class': 'roksearch_result_wrapper4 png'}).inject(innerWrapper3);
558
559									el.inject(innerWrapper4);
560								}
561							}
562						}, this);
563					}
564				}, this);
565
566				splitting = scroller.getChildren();
567				var max = Math.max(this.options.perpage, splitting.length);
568				var min = Math.min(this.options.perpage, splitting.length);
569				var perpage = this.options.perpage;
570				this.page = [];
571				(Math.abs(max/min)).times(function(i) {
572					if (splitting[i]) this.page.push(new Element('div', {'class': 'page page-' + i}).inject(scroller).setStyle('width', scroller.getStyle('width')));
573					for (j = 0, l = perpage;j<l;j++) {
574						if (splitting[i * perpage + j]) splitting[i * perpage + j].inject(this.page[i]);
575					}
576				}.bind(this));
577
578				scroller.setStyle('width', container.getStyle('width').toInt() * Math.round(max/min) + 1000);
579			}
580
581			var name;
582			if (!searchedRestuls.length) {
583				var el = new Element('div', {'class': this.rows[0]});
584				name = new Element('h3').set('html', this.options.noresults).inject(el);
585				var lnk = new Element('a').set('href', this.options.advsearchlink).inject(name, 'after');
586				name = new Element('span', {'class': 'advanced-search'}).set('html', this.options.advsearch).inject(lnk);
587				el.inject(wrapper4);
588			} else {
589				if(this.options.includelink){
590					var limit = document.getElements('#rokajaxsearch input[name=limit]')[0];
591
592					this.bottombar = new Element('div', {'class': "roksearch_row_btm png"});
593					var lnk2 = new Element('a').set('href',"#").inject(this.bottombar);
594					name = new Element('span').set('html', this.options.viewall).inject(lnk2);
595
596					lnk2.addEvent('click', function(e) {
597						if (e) e.stop();
598						//limit.value = '';
599						document.id('rokajaxsearch').submit();
600					});
601
602					this.bottombar.inject(wrapper4);
603					if (splitting.length > this.options.perpage) {
604						this.arrowDiv = new Element('div', {'class': 'container-arrows'}).inject(this.bottombar, 'top');
605						this.arrowleft = new Element('div', {'class': 'arrow-left-disabled'}).inject(this.arrowDiv);
606						this.arrowright = new Element('div', {'class': 'arrow-right'}).inject(this.arrowDiv);
607
608						this.arrowsInit(container);
609					}
610				}
611			}
612	},
613
614	outputTableless: function() {
615			var self = this;
616			var wrapper1 = new Element('div', {'class': 'roksearch_wrapper1'}).inject(this.results);
617			var wrapper2 = new Element('div', {'class': 'roksearch_wrapper2'}).inject(wrapper1);
618			var wrapper3 = new Element('div', {'class': 'roksearch_wrapper3'}).inject(wrapper2);
619			var wrapper4 = new Element('div', {'class': 'roksearch_wrapper4'}).inject(wrapper3);
620			var header = new Element('div', {'class': 'roksearch_header png'}).set('html', this.options.results).inject(wrapper4);
621
622			if (this.type != 'local') {
623				wrapper4.addClass('google-search').addClass('google-search-' + this.type);
624				var poweredbygoogle = '<span class="powered-by-google">(powered by <a href="http://google.com" target="_blank">Google</a>)</span>';
625				header.set('html', this.options.results + poweredbygoogle);
626			}
627
628			this.close = new Element('a', {'id': 'roksearch_link', 'class': 'png'}).set('href', '#').set('html', this.options.close).inject(header, 'before');
629			var splitDivs= this.options.hidedivs.split(" ");
630
631			this.close.addEvent('click', function(e) {
632				this.fireEvent('unloaded');
633				if (e) e.stop();
634
635				this.inputBox.set('value', '')[0].focus();
636				var self = this;
637				this.fx.start('opacity', 0).chain(function() {
638					self.results.empty().removeClass('roksearch_results');
639				});
640				//this.results.empty().removeClass('roksearch_results').setStyle('visibility', 'hidden');
641
642				if(splitDivs.length > 0 && splitDivs != '') splitDivs.each(function(div){
643					document.id(div).setStyle('visibility', 'visible');
644				});
645
646			}.bind(this));
647
648			if(splitDivs.length > 0 && splitDivs != '') splitDivs.each(function(div){
649				document.id(div).setStyle('visibility', 'hidden');
650			});
651
652			this.results.addClass('roksearch_results');
653			var searchedRestuls = document.getElements('#rokajaxsearch_tmp ol.list li'),
654				splitting, container, overlayfx;
655			if (!searchedRestuls.length) searchedRestuls = document.getElements('#rokajaxsearch_tmp dl dt');
656			if (!searchedRestuls.length) searchedRestuls = document.getElements('#rokajaxsearch_tmp .item');
657
658			if (searchedRestuls.length > 0) {
659				container = new Element('div', {'class': 'container-wrapper'}).inject(wrapper4);
660				var scroller = new Element('div', {'class': 'container-scroller'}).inject(container);
661
662				searchedRestuls.each(function(res, i) {
663					var data = '';
664					data = res.getChildren();
665
666					if (data.length > 0) {
667						var suri = res.getElement('a').get('href');
668						var el = new Element('div', {'class': this.rows[i % 2] + ' png'});
669						var lnk = new Element('a').set('href', suri).inject(el);
670						if (this.type != 'local') lnk.set('target', '_blank');
671						var name = new Element('h3').set('html', (data[0].get('tag') == 'header' ? res.getElement('.title') : data[0]).get('text')).inject(lnk);
672
673						this.els.push(el);
674						el.addEvents({
675							'mouseenter': function() {
676								this.addClass(self.rows[i % 2] + '-hover');
677								self.selectedEl = i;
678							},
679							'mouseleave': function() {
680								this.removeClass(self.rows[i % 2] + '-hover');
681								if (self.selectedEl == i) self.selectedEl = -1;
682							}
683						});
684
685						var description = '';
686						if (this.options.showdescription){
687							var ddesc = res.getNext('.result-text') || data[2] || data[1];
688							description = ddesc.innerHTML;
689						}
690						var desc = new Element('span').set('html', description).inject(lnk, 'after'),
691							br;
692
693						if(this.options.showcategory){
694							var dcat = res.getNext('.result-category') || res.getElement('p.meta') || data[1];
695							if (dcat){
696								var cat = new Element('span', {'class': 'small'}).set('html', dcat.innerHTML).inject(lnk, 'after');
697								br = new Element('br').inject(cat, 'after');
698							}
699						}
700
701						if(this.options.showreadmore){
702							lnk = new Element('a', {'class': 'clr'}).set('href', suri).set('html', this.options.readmore).inject(desc, 'after');
703							if (this.type != 'local') lnk.set('target', '_blank');
704							if(this.options.showdescription) br = new Element('br').inject(desc, 'after');
705						}
706
707						var innerWrapper1 = new Element('div', {'class': 'roksearch_result_wrapper1 png'}).inject(scroller);
708						var innerWrapper2 = new Element('div', {'class': 'roksearch_result_wrapper2 png'}).inject(innerWrapper1);
709						var innerWrapper3 = new Element('div', {'class': 'roksearch_result_wrapper3 png'}).inject(innerWrapper2);
710						var innerWrapper4 = new Element('div', {'class': 'roksearch_result_wrapper4 png'}).inject(innerWrapper3);
711
712						el.inject(innerWrapper4);
713
714					}
715				}, this);
716
717				splitting = scroller.getChildren();
718				var max = Math.max(this.options.perpage, splitting.length);
719				var min = Math.min(this.options.perpage, splitting.length);
720				var perpage = this.options.perpage;
721				this.page = [];
722				(Math.abs(max/min)).times(function(i) {
723					if (splitting[i]) this.page.push(new Element('div', {'class': 'page page-' + i}).inject(scroller).setStyle('width', scroller.getStyle('width')));
724					for (j = 0, l = perpage;j<l;j++) {
725						if (splitting[i * perpage + j]) splitting[i * perpage + j].inject(this.page[i]);
726					}
727				}.bind(this));
728
729				if (this.type != 'local') {
730					var size = this.page[0].getSize();
731					this.page[0].setStyle('position', 'relative');
732					this.layer = new Element('div', {
733						'class': 'rokajaxsearch-overlay',
734						'styles': {
735							'width': size.x,
736							'height': size.y,
737							'position': 'absolute',
738							'left': 0,
739							'top': 0,
740							'display': 'block',
741							'z-index': 5
742						}
743					}).inject(this.page[0], 'top');
744					overlayfx = new Fx.Tween(this.layer, {duration: 300}).set('opacity', 0.9);
745				}
746
747				scroller.setStyle('width', container.getStyle('width').toInt() * Math.round(max/min) + 1000);
748			}
749			var name, estimated;
750
751			if (!searchedRestuls.length) {
752				var el = new Element('div', {'class': this.rows[0]});
753				name = new Element('h3').set('html', this.options.noresults).inject(el);
754				var lnk = new Element('a').set('href', this.options.advsearchlink).inject(name, 'after');
755				name = new Element('span', {'class': 'advanced-search'}).set('html', this.options.advsearch).inject(lnk);
756				el.inject(wrapper4);
757			} else {
758				if(this.options.includelink){
759					var limit = document.getElements('#rokajaxsearch input[name=limit]')[0];
760
761					this.bottombar = new Element('div', {'class': "roksearch_row_btm png"});
762					var lnk2 = new Element('a', {'class': 'viewall'}).set('href',"#").inject(this.bottombar);
763					name = new Element('span').set('html', this.options.viewall).inject(lnk2);
764
765					if (this.type != 'local') {
766						lnk2.setProperties({
767							'href': this.google.cursor.moreResultsUrl,
768							'target': '_blank'
769						});
770
771						if (this.options.showestimated)
772							estimated = new Element('span', {'class': 'estimated_res'}).set('text', '(' + this.google.cursor.estimatedResultCount + ' ' + this.options.estimated + ')').inject(lnk2, 'after');
773
774						if (this.options.showpagination) {
775							this.pagination = new Element('div', {'class': 'pagination_res'}).inject(estimated || lnk2, 'after');
776							this.pagination.set('html',
777								this.options.page + ' ' +
778								'<span class="highlight">'+(this.google.cursor.currentPageIndex + 1)+'</span>' + ' ' +
779								this.options.page_of + ' ' +
780								'<span class="highlight">'+this.google.cursor.pages.length+'</span>');
781						}
782
783					} else {
784						lnk2.addEvent('click', function(e) {
785							if (e) e.stop();
786							//limit.value = '';
787							document.id('rokajaxsearch').submit();
788						});
789					}
790
791					this.bottombar.inject(wrapper4);
792					if (splitting.length > this.options.perpage || ((this.type != 'local') && this.google.cursor.pages.length > 1)) {
793						this.arrowDiv = new Element('div', {'class': 'container-arrows'}).inject(this.bottombar, 'top');
794						this.arrowleft = new Element('div', {'class': 'arrow-left-disabled'}).inject(this.arrowDiv);
795						this.arrowright = new Element('div', {'class': 'arrow-right'}).inject(this.arrowDiv);
796
797						if (this.type != 'local') {
798							if (this.google.cursor) {
799								var current = this.google.cursor.currentPageIndex;
800								if (current > 0) this.arrowleft.removeClass('arrow-left-disabled').addClass('arrow-left');
801								if (current == 7) this.arrowright.removeClass('arrow-right').addClass('arrow-right-disabled');
802							}
803							this.arrowsGoogleInit(container);
804							overlayfx.start('opacity', 0).chain(function(){
805								overlayfx.element.setStyle('visibility', 'hidden');
806							});
807//							if (this.type == 'web') this.results.effect('opacity', {wait: true, duration: 200}).start(1);
808						} else this.arrowsInit(container);
809					}
810				}
811			}
812	},
813	arrowsGoogleInit: function(wrapper) {
814		this.arrowleft.addEvent('click', function(downkey) {
815			if (!downkey && this.selectedEl >= 0) this.els[this.selectedEl].fireEvent('mouseleave');
816			if (!downkey) this.selectedEl = -1;
817
818			var current = (this.google.cursor) ? this.google.cursor.currentPageIndex : null;
819
820			if (current - 1 <= 0) {
821				this.arrowleft.removeClass('arrow-left').addClass('arrow-left-disabled');
822				this.arrowright.removeClass('arrow-right-disabled').addClass('arrow-right');
823			}
824			else {
825				this.arrowleft.removeClass('arrow-left-disabled').addClass('arrow-left');
826				this.arrowright.removeClass('arrow-right-disabled').addClass('arrow-right');
827			}
828			if (!current) return;
829			else {
830				if (!this.inputBox.hasClass('loading')) this.inputBox.addClass('loading');
831				this.layer.setStyle('opacity', 0.9);
832				this.google.gotoPage(current - 1);
833			}
834		}.bind(this));
835
836		this.arrowright.addEvent('click', function(downkey) {
837			if (!downkey && this.selectedEl >= 0) this.els[this.selectedEl].fireEvent('mouseleave');
838			if (!downkey) this.selectedEl = -1;
839
840			var current = (this.google.cursor) ? this.google.cursor.currentPageIndex : null;
841
842			if (current + 1 >= this.google.cursor.pages.length) {
843				this.arrowleft.removeClass('arrow-left-disabled').addClass('arrow-left');
844				this.arrowright.removeClass('arrow-right').addClass('arrow-right-disabled');
845			}
846			else {
847				this.arrowleft.removeClass('arrow-left').addClass('arrow-left-disabled');
848				this.arrowright.removeClass('arrow-right-disabled').addClass('arrow-right');
849			}
850
851			if (current >= this.google.cursor.pages.length -1) return;
852			else {
853				if (this.arrowleft.hasClass('arrow-left-disabled')) this.arrowleft.removeClass('arrow-left-disabled').addClass('arrow-left');
854				if (!this.inputBox.hasClass('loading')) this.inputBox.addClass('loading');
855				this.layer.setStyle('opacity', 0.9);
856				this.google.gotoPage(current + 1);
857			}
858		}.bind(this));
859	},
860	arrowsInit: function(wrapper) {
861		this.scroller = new Fx.Scroll(wrapper, {wait: false});
862		this.arrowleft.addEvent('click', function(downkey) {
863			if (!downkey && this.selectedEl >= 0) this.els[this.selectedEl].fireEvent('mouseleave');
864			if (!downkey) this.selectedEl = -1;
865
866			if (this.current - 1 <= 0) {
867				this.arrowleft.removeClass('arrow-left').addClass('arrow-left-disabled');
868				this.arrowright.removeClass('arrow-right-disabled').addClass('arrow-right');
869			}
870			else {
871				this.arrowleft.removeClass('arrow-left-disabled').addClass('arrow-left');
872				this.arrowright.removeClass('arrow-right-disabled').addClass('arrow-right');
873			}
874
875			if (!this.current) return;
876			else {
877				if (this.current < 0) this.current = 0;
878				else this.current -= 1;
879				this.scroller.toElement(this.page[this.current]);
880			}
881		}.bind(this));
882
883		this.arrowright.addEvent('click', function(downkey) {
884			if (!downkey && this.selectedEl >= 0) this.els[this.selectedEl].fireEvent('mouseleave');
885			if (!downkey) this.selectedEl = -1;
886
887			if (this.current + 1 >= this.page.length - 1) {
888				this.arrowleft.removeClass('arrow-left-disabled').addClass('arrow-left');
889				this.arrowright.removeClass('arrow-right').addClass('arrow-right-disabled');
890			}
891			else {
892				this.arrowleft.removeClass('arrow-left').addClass('arrow-left-disabled');
893				this.arrowright.removeClass('arrow-right-disabled').addClass('arrow-right');
894			}
895
896			if (this.current >= this.page.length) return;
897			else {
898				if (this.arrowleft.hasClass('arrow-left-disabled'))
899					this.arrowleft.removeClass('arrow-left-disabled').addClass('arrow-left');
900				if (this.current >= this.page.length - 1) this.current = this.page.length - 1;
901				else this.current += 1;
902
903				this.scroller.toElement(this.page[this.current]);
904			}
905		}.bind(this));
906	}
907});

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.