var PAutosuggest=Class.create({initialize:function(c,a,b){this.input=null;this.output=$(a);this.source=null;this.curPos=-1;this.size=0;this.timer=0;this.hideTimer=0;this.lastQuery="";this.data=new Array();this.selectionCB=null;this.clickedCB=null;this.navigateHandler=this.navigateCB.bindAsEventListener(this);this.queryHandler=this.queryCB.bindAsEventListener(this);this.hideHandler=this.hide.bindAsEventListener(this);this.suggestionsHandler=this.suggestionsCB.bindAsEventListener(this);this.setInput(c);this.setSource(b);this.focusHandler=this.focus.bindAsEventListener(this);this.clickHandler=this.clickCB.bindAsEventListener(this)},setInput:function(a){if(this.input!=null){this.input.stopObserving("keydown",this.navigateHandler);this.input.stopObserving("keyup",this.queryHandler);this.input.stopObserving("focus",this.queryHandler);this.input.stopObserving("blur",this.hideHandler)}this.input=$(a);this.input.observe("keydown",this.navigateHandler);this.input.observe("keyup",this.queryHandler);this.input.observe("focus",this.queryHandler);this.input.observe("blur",this.hideHandler)},setSource:function(a){if(this.source!=null){this.source.stopObserving("PSource:requestFinished",this.suggestionsHandler)}this.data=new Array();this.lastQuery="";this.curPos=-1;this.source=a;this.source.observe("PSource:requestFinished",this.suggestionsHandler)},queryCB:function(b){switch(b.keyCode){case Event.KEY_UP:case Event.KEY_DOWN:case Event.KEY_LEFT:case Event.KEY_RIGHT:if(this.output.visible()){this.input.selectionEnd=this.input.getValue().length;this.input.selectionStart=this.input.selectionEnd}break;case Event.KEY_ESC:this.hide();break;default:var c=this.input.getValue();if(this.lastQuery==c){if(this.lastQuery.length>0){this.show()}return}this.lastQuery=c;if(this.timer){clearTimeout(this.timer);this.timer=0}var a=this;this.timer=setTimeout(function(){a.source.query(c);a.timer=0},500)}},navigateCB:function(a){switch(a.keyCode){case Event.KEY_UP:this.moveUp();break;case Event.KEY_DOWN:this.moveDown();break;case Event.KEY_LEFT:this.moveLeft();break;case Event.KEY_RIGHT:this.moveRight();break;default:break}},clickCB:function(b){this.deselect();var a=b.element();if(a.tagName=="DIV"){a=a.down("span")}else{if(a.tagName=="IMG"){a=a.next("span")}}a=a.next("span");this.curPos=parseInt(a.innerHTML);this.select();if(this.clickedCB!=null){this.clickedCB(this.data[this.curPos])}},moveDown:function(){if(this.curPos>=0&&this.curPos+2>=this.size){return}this.deselect();if(this.curPos<0){this.curPos=0}else{this.curPos+=2}this.select()},moveUp:function(){if(this.curPos-2<0){return}this.deselect();this.curPos-=2;this.select()},moveLeft:function(){if(this.curPos-1<0){return}this.deselect();this.curPos-=1;this.select()},moveRight:function(){if(this.curPos+1>=this.size){return}this.deselect();this.curPos+=1;this.select()},deselect:function(){var a=this.output.down("div",this.curPos);if(a){a.removeClassName("selected")}},select:function(){var a=this.output.down("div",this.curPos);if(a){a.addClassName("selected")}if(this.selectionCB!=null){this.selectionCB(this.data[this.curPos])}},suggestionsCB:function(c){if(c.memo.code!="successful"){return}this.data=c.memo.data;this.output.update("");if(this.selectionCB!=null){this.selectionCB(null)}if(this.data.length==0){this.hide();return}var a=this.output;var d=this.clickHandler;var b=0;this.data.each(function(e){var g=new Element("div",{href:e.url}).update(e.title.ptruncate(40)+"<br/><span>"+e.description.replace("\n","<br />")+"</span>");g.insert({top:'<img src="'+e.image.source+'" height="'+e.image.height+'px" width="'+e.image.width+'px" align="left" />'});var f=new Element("span",{style:"display:none;"});f.update(b);g.insert(f);b+=1;a.insert({bottom:g});g.observe("mousedown",d)});this.size=this.data.length;this.curPos=-1;this.show()},show:function(){if(this.lastQuery==""){return}if(this.hideTimer){clearTimeout(this.hideTimer);this.hideTimer=0;return}this.output.show();var a=this.input.cumulativeOffset();this.output.setStyle({left:a.left+"px",top:(a.top+this.input.getHeight())+"px"})},focus:function(){this.input.focus();this.show()},hide:function(){var a=this.output;if(this.hideTimer){clearTimeout(this.hideTimer)}var b=this;this.hideTimer=setTimeout(function(){a.hide();b.hideTimer=0},100)}});
