/*  AutoAssist - Ajax AutoComplete Component, Version 0.8
 *  (c) Cheng Guangnan <chenggn@capxous.com>
 *  For details, see http://capxous.com/autoassist */


var isOpera=navigator.userAgent.indexOf('Opera')>-1;var isIE=navigator.userAgent.indexOf('MSIE')>1&&!isOpera;var isMoz=navigator.userAgent.indexOf('Mozilla/5.')==0&&!isOpera;var AutoAssistClass={selectEvent:'onSelect',indexAttribute:'aa_index',instances:new Array(),$E:function(tag){return document.createElement(tag);},$I:function(element){Element.hide(element);document.body.appendChild(element);},style:{container:'aa',highlight:'aa_highlight',waiting:'aa_wait'},findPopup:function(event){var element=Event.element(event);while(element.parentNode&&!element.aa_obj){element=element.parentNode;}
return element.parentNode?element:null;},isSelectable:function(node){return(node.nodeType==1)&&(node.getAttribute(AutoAssistClass.selectEvent));},findSelectable:function(event,popup){var element=Event.element(event);while(element.parentNode&&(element!=popup)&&(!AutoAssistClass.isSelectable(element))){element=element.parentNode;}
return(element.parentNode&&(element!=popup))?element:null;},onClick:function(event){var element=Event.element(event);var popup=AutoAssistClass.findPopup(event);if(popup){var selectable=AutoAssistClass.findSelectable(event,popup);if(selectable){popup.aa_obj.index=selectable.getAttribute(AutoAssistClass.indexAttribute);popup.aa_obj.select();}else{while(element.parentNode&&(element!=popup)&&(element.tagName.toUpperCase()!="A")){element=element.parentNode;}
if(element.parentNode&&(element!=popup)){popup.aa_obj.doRequest(element.getAttribute("ajaxHref"));Event.stop(event);}}}else{for(var i=0;i<AutoAssistClass.instances.length;i++){var instance=AutoAssistClass.instances[i];if((instance.txtBox!=element)&&(instance.visible)){instance.hide();}}}},onMouseOver:function(event){var element=Event.element(event);var popup=AutoAssistClass.findPopup(event);if(popup){var selectable=AutoAssistClass.findSelectable(event,popup);if(selectable){popup.aa_obj.highlight(selectable.getAttribute(AutoAssistClass.indexAttribute));}}},onUnload:function(event){for(var i=0;i<AutoAssistClass.instances.length;i++){AutoAssistClass.instances[i].dispose();}
AutoAssistClass.instances=null;}}
Event.observe(window,'unload',AutoAssistClass.onUnload);Object.extend(Event,{KEY_PAGE_UP:33,KEY_PAGE_DOWN:34,KEY_END:35,KEY_HOME:36,KEY_INSERT:45,KEY_SHIFT:16,KEY_CTRL:17,KEY_ALT:18})
var AutoAssist=Class.create();AutoAssist.prototype={visible:false,complete:false,initialize:function(txtBox,getURL){this.txtBox=$(txtBox);if((this.txtBox==null)||(getURL==null)||(typeof getURL!='function')){return;}
this.txtBox.setAttribute('autocomplete','off');this.onkeydownBind=this.onkeydown.bindAsEventListener(this);this.prepareRequestBind=this.prepareRequest.bind(this);Event.observe(this.txtBox,'keydown',this.onkeydownBind);Event.observe(this.txtBox,'dblclick',this.prepareRequestBind);this.timeoutId=0;this.getURL=getURL;if(isIE){this.iframe=AutoAssistClass.$E('iframe');this.iframe.src='javascript:false;';this.iframe.style.position='absolute';this.iframe.style.margin='1px 0 0 0';this.iframe.style.padding='0';AutoAssistClass.$I(this.iframe);}
this.buffer=AutoAssistClass.$E('div');this.popup=AutoAssistClass.$E('div');this.popup.aa_obj=this;Element.addClassName(this.popup,AutoAssistClass.style.container);AutoAssistClass.$I(this.popup);this.index=-1;this.size=-1;AutoAssistClass.instances.push(this);if(AutoAssistClass.instances.length==1){Event.observe(document,'click',AutoAssistClass.onClick);Event.observe(document,'mouseover',AutoAssistClass.onMouseOver);}},dispose:function(){Event.stopObserving(this.txtBox,'keydown',this.onkeydownBind);Event.stopObserving(this.txtBox,'dblclick',this.prepareRequestBind);this.txtBox=null;this.getURL=null;this.popup.aa_obj=null;this.popup=null;this.buffer=null;this.iframe=null;this.currentRequest=null;for(var i=0;(this.children)&&(i<this.children.length);i++){this.children[i].removeAttribute(AutoAssistClass.indexAttribute);}
this.children=null;AutoAssistClass.instances=AutoAssistClass.instances.without(this);if(!AutoAssistClass.instances.length){Event.stopObserving(document,'click',AutoAssistClass.onClick);Event.stopObserving(document,'mouseover',AutoAssistClass.onMouseOver);}},onkeydown:function(event){var keyCode=event.keyCode;if((this.complete)&&((keyCode==Event.KEY_UP)||(keyCode==Event.KEY_DOWN))){(keyCode==Event.KEY_UP)?this.up():this.down();if(!this.visible){this.show();}
Event.stop(event);return;}
switch(keyCode){case Event.KEY_TAB:case Event.KEY_LEFT:case Event.KEY_RIGHT:case Event.KEY_PAGE_UP:case Event.KEY_PAGE_DOWN:case Event.KEY_END:case Event.KEY_HOME:case Event.KEY_INSERT:case Event.KEY_SHIFT:case Event.KEY_CTRL:case Event.KEY_ALT:case Event.KEY_UP:case Event.KEY_DOWN:return;case Event.KEY_ESC:this.hide();return;case Event.KEY_RETURN:if(this.visible){this.select();return;}
default:if(this.timeoutId!=0){clearTimeout(this.timeoutId);}
this.timeoutId=setTimeout(this.prepareRequest.bind(this),360);this.hide();}},select:function(){if(this.currentNode()){var stat=this.currentNode().getAttribute(AutoAssistClass.selectEvent);try{eval(stat);}catch(e){};this.hide();}},currentNode:function(){return this.children?this.children[this.index]:null;},highlight:function(index){if(this.currentNode()){Element.removeClassName(this.currentNode(),AutoAssistClass.style.highlight);}
this.index=index;if(this.currentNode()){Element.addClassName(this.currentNode(),AutoAssistClass.style.highlight);}},up:function(){if(this.index>-1)this.highlight(this.index-1);},down:function(){if(this.index<this.size-1)this.highlight(this.index+1);},preRequest:function(){if(this.txtBox.value.length==0)return false;return true;},prepareRequest:function(){this.doRequest();},doRequest:function(url){if(this.preRequest()){var updaterOptions={method:'get',onComplete:this.onComplete.bind(this),onFailure:this.onFailure.bind(this)}
if(url){if(url.charAt(0)=="&"){url=this.getURL()+url;}
this.onLoading(true);}else{url=this.getURL();this.onLoading();}
url=encodeURI(url);this.currentRequest=new Ajax.Updater(this.buffer,url,updaterOptions);}},onException:function(){},onFailure:function(transport){},onLoading:function(){this.complete=false;this.size=0;this.index=-1;if(!arguments[0]){this.hide();this.popup.innerHTML='';}
this.buffer.innerHTML='';Element.addClassName(this.txtBox,AutoAssistClass.style.waiting);},onComplete:function(){setTimeout(this.updateContent.bind(this,arguments[0]),10);},updateContent:function(){var tx=((this.currentRequest==null)||(this.currentRequest.transport==arguments[0]));if(tx){this.complete=true;this.popup.innerHTML=this.buffer.innerHTML;this.size=0;this.index=-1;this.children=new Array();for(var i=0;i<this.popup.childNodes.length;i++){var child=this.popup.childNodes[i];if(AutoAssistClass.isSelectable(child)){child.setAttribute(AutoAssistClass.indexAttribute,this.size);this.children.push(child);this.size++;}}
this.down();this.show();Element.removeClassName(this.txtBox,AutoAssistClass.style.waiting);}},show:function(){var popupStyle=this.popup.style;var width=this.txtBox.offsetWidth;if(isMoz||(isIE&&(document.compatMode!='BackCompat'))){var style=isMoz?getComputedStyle(this.popup,null):this.popup.currentStyle;var offset=parseInt(style.borderLeftWidth)+parseInt(style.borderRightWidth)+parseInt(style.paddingLeft)+parseInt(style.paddingRight);width=width-offset;}
popupStyle.width=width+'px';var position=Position.cumulativeOffset(this.txtBox);popupStyle.top=position[1]+this.txtBox.offsetHeight+'px';popupStyle.left=position[0]+'px';popupStyle.height="auto";popupStyle.position='absolute';Element.show(this.popup);if(isIE){var iframeStyle=this.iframe.style;iframeStyle.width=popupStyle.width;iframeStyle.top=popupStyle.top;iframeStyle.left=popupStyle.left;iframeStyle.height=Element.getHeight(this.popup)+'px';Element.show(this.iframe);}
this.visible=true;},hide:function(){if(this.visible){Element.hide(this.popup);if(isIE){Element.hide(this.iframe);}
this.visible=false;}}}