Livesearch = Class.create(); Livesearch.prototype = { initialize: function(searchform, targetitem, hideitem, url, searchprompt, buttonvalue) { this.searchform = searchform; this.targetitem = targetitem; this.hideitem = hideitem; this.url = url; this.searchprompt = searchprompt; this.buttonvalue = buttonvalue; this.searchfield = 's'; this.loaditem = 'searchload'; this.resetbutton = 'searchreset'; this.submitbutton = 'searchsubmit'; this.lastsearch = ''; this.t = null; // Init timeout variable this.isActive = false; Event.observe(window, "load", this.onLoading.bindAsEventListener(this)); }, onLoading: function() { if ( $(this.searchform) ) { $(this.searchform).update(''); $(this.submitbutton).hide(); $(this.loaditem).hide(); new Effect.Fade(this.resetbutton, { duration: 0, to: 0.3 }); Event.observe(this.searchfield, 'focus', this.onInputFocus.bindAsEventListener(this)); Event.observe(this.searchfield, 'blur', this.onInputBlur.bindAsEventListener(this)); Event.observe(this.searchfield, 'keyup', this.readyLivesearch.bindAsEventListener(this)); this.resetListener = this.resetLivesearch.bindAsEventListener(this); } }, onInputFocus: function() { if ($F(this.searchfield) == this.searchprompt) { $(this.searchfield).value = ''; } }, onInputBlur: function() { if ($F(this.searchfield) == '') { $(this.searchfield).value = this.searchprompt; } }, readyLivesearch: function(event) { var code = event.keyCode; if (code == Event.KEY_ESC || ((code == Event.KEY_DELETE || code == Event.KEY_BACKSPACE) && $F(this.searchfield) == '')) { this.resetLivesearch.bind(this); } else if (code != Event.KEY_RETURN) { if (this.t) clearTimeout(this.t); this.t = setTimeout(this.doLivesearch.bind(this), 400); } }, doLivesearch: function() { if ($F(this.searchfield) == this.lastsearch) return; new Effect.Fade(this.resetbutton, { duration: 0.1 }); new Effect.Appear(this.loaditem, { duration: 0.1 }); if (!this.isActive) { this.isActive = true; if ( ! $(this.hideitem) && K2.RollingArchives ) { K2.RollingArchives.saveRollingState(); } } this.lastsearch = $F(this.searchfield); var query = $(this.searchfield).serialize(); new Ajax.Updater( this.targetitem, this.url, { method: 'get', evalScripts: true, parameters: query + '&k2dynamic=1', onComplete: this.searchComplete.bind(this) }); }, searchComplete: function() { if ( $(this.hideitem) ) { $(this.hideitem).hide(); } new Effect.Fade(this.loaditem, { duration: 0.1 }); Event.observe(this.resetbutton, 'click', this.resetListener); new Effect.Appear(this.resetbutton, { duration: 0.1 }); $(this.resetbutton).style.cursor = 'pointer'; }, resetLivesearch: function() { this.isActive = false; this.lastsearch = ''; $(this.searchfield).value = this.searchprompt; Event.stopObserving(this.resetbutton, 'click', this.resetListener); new Effect.Fade(this.resetbutton, { duration: 0.1, to: 0.3 }); $(this.resetbutton).style.cursor = 'default'; if ( $(this.hideitem) ) { $(this.targetitem).hide(); $(this.hideitem).show(); $(this.targetitem).update(); } else if ( K2.RollingArchives ) { K2.RollingArchives.restoreRollingState(); } } }