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.