/* Copyright (c) 1995-2008 Choice Hotels International, Inc. All Rights Reserved. */
var AutoSuggestControl=$Class.create({_ctor:function(textbox,provider,minwidth,typeahead){this.cur=-1;this.suggestions=null;this.layer=null;this.provider=provider;this.textbox=textbox;this.allow_typeahead=typeahead;this.ignore=false;this.init(minwidth)},autosuggest:function(suggestions,typeahead){if(typeahead==null)typeahead=this.allow_typeahead;this.suggestions=suggestions;if(suggestions.length>0){if(typeahead)this.typeAhead(this.provider.getItemText(suggestions[0]));this.showSuggestions(suggestions)}else this.hideSuggestions()},createDropDown:function(minwidth){this.layer=document.createElement("div");this.layer.className="suggestions";this.layer.style.visibility="hidden";this.layer.style.width=Math.max(this.textbox.offsetWidth,minwidth);this.layer.onmousedown=this.layer.onmouseup=this.layer.onmouseover=Event.handler(this._onMouseOver.bind(this));document.body.appendChild(this.layer);this.showSuggestions([]);this.hideSuggestions()},_onMouseOver:function(event,target){if(target.className!="suggestions"){while(target&&target.parentNode&&(target.parentNode.className!="suggestions"))target=target.parentNode;if(event.type=="mousedown"){for(var i=0;i<this.layer.childNodes.length;i++){if(this.layer.childNodes[i]==target){this.cur=i;this.textbox.value=this.provider.selectItem(this.suggestions[this.cur]);break}}this.hideSuggestions()}}else if(event.type=="mousedown"){if(event.x>this.layer.offsetLeft+this.layer.scrollWidth)this.layer.ignoreBlur=true}if(event.type=="mouseover")this.highlightSuggestion(target);else if(event.type!="mousedown")this.textbox.focus()},getLeft:function(){var node=this.textbox;var left=0;while(node.tagName!="BODY"){left+=node.offsetLeft;node=node.offsetParent}if(navigator&&navigator.userAgent.toLowerCase().indexOf("msie")==-1)return left;else return left+node.offsetLeft},getTop:function(){var node=this.textbox;var top=0;while(node.tagName!="BODY"){top+=node.offsetTop;node=node.offsetParent}if(navigator&&navigator.userAgent.toLowerCase().indexOf("msie")==-1)return top;else return top+node.offsetTop},_onKeyDown:function(event,target){this.ignore=false;switch(event.keyCode){case 38:;this.previousSuggestion();break;case 40:;this.nextSuggestion();break;case 13:;if((this.layer.style.visibility=="visible")&&(this.cur>=0))this.ignore=true;this.hideSuggestions();break}},_onKeyUp:function(event,target){var keycode=event.keyCode;if(keycode==8||keycode==46)this.provider.requestSuggestions(this,false);else if(keycode==27)this.hideSuggestions();else if((keycode==38)||(keycode==40)||(keycode==13)){}else if(keycode<32||(keycode>=33&&keycode<46)||(keycode>=112&&keycode<=123)){this.cur=-1}else {this.provider.requestSuggestions(this,this.allow_typeahead)}},hideSuggestions:function(){this.layer.style.visibility="hidden";if(this.iframe!=null)this.iframe.style.display="none";if(this.provider.listHidden)this.provider.listHidden()},highlightSuggestion:function(sugnode){for(var i=0;i<this.layer.childNodes.length;i++){var curnode=this.layer.childNodes[i];if(curnode==sugnode){curnode.className=curnode.realClass+" current"}else if(curnode.className.indexOf("current")>=0){curnode.className=curnode.realClass}}},currentSuggestion:function(){return (this.cur>=0)?this.suggestions[this.cur]:null},init:function(minwidth){if(window.ActiveXObject){this.iframe=document.createElement("iframe");this.iframe.setAttribute("src","javascript:false");this.iframe.setAttribute("scrolling","no");this.iframe.setAttribute("frameborder","0");this.iframe.style.display="none";this.iframe.style.zIndex=99;this.iframe.style.position="absolute";document.body.appendChild(this.iframe)}this.textbox.onkeyup=Event.handler(this._onKeyUp.bind(this));this.textbox.onkeydown=Event.handler(this._onKeyDown.bind(this));this.textbox.onblur=Event.handler(this._onBlur.bind(this));this.createDropDown(minwidth)},_onBlur:function(event,target){if(this.layer.ignoreBlur){this.layer.ignoreBlur=false;this.textbox.focus()}else this.hideSuggestions()},nextSuggestion:function(){var allnodes=this.layer.childNodes;if(allnodes.length>0&&this.cur<allnodes.length-1){var curnode=allnodes[ ++this.cur];this.highlightSuggestion(curnode);this.textbox.value=this.provider.selectItem(this.suggestions[this.cur])}},previousSuggestion:function(){var allnodes=this.layer.childNodes;if(allnodes.length>0&&this.cur>0){var curnode=allnodes[ --this.cur];this.highlightSuggestion(curnode);this.textbox.value=this.provider.selectItem(this.suggestions[this.cur])}},selectRange:function(start,len){if(this.textbox.createTextRange){var range=this.textbox.createTextRange();range.moveStart("character",start);range.moveEnd("character",len-this.textbox.value.length);range.select()}else if(this.textbox.setSelectionRange){this.textbox.setSelectionRange(start,len)}this.textbox.focus()},showSuggestions:function(suggestions){var div=null;this.layer.innerHTML="";for(var i=0;i<suggestions.length;i++){div=document.createElement("div");div.className="suggestion";this.provider.addItemDOM(div,suggestions[i]);div.realClass=div.className;this.layer.appendChild(div)}var left=this.getLeft();var top=this.getTop()+this.textbox.offsetHeight;this.layer.style.left=left+"px";this.layer.style.top=top+"px";this.layer.style.visibility="visible";if($.browser.msie){this.layer.style.height="auto";var maxheight=$(this.layer).css("max-height");this.layer.style.height=(this.layer.offsetHeight>parseInt(maxheight))?maxheight:"auto"}if(this.iframe!=null){this.iframe.style.left=left;this.iframe.style.top=top;this.iframe.style.width=this.layer.offsetWidth;this.iframe.style.height=this.layer.offsetHeight;this.iframe.style.display="inline"}if(this.provider.listVisible){this.provider.listVisible(left,top,this.layer.offsetWidth,this.layer.offsetHeight,suggestions)}},typeAhead:function(suggestion){if(this.textbox.createTextRange||this.textbox.setSelectionRange){var len=this.textbox.value.length;this.textbox.value=suggestion;this.selectRange(len,suggestion.length)}},testAndResetIgnore:function(){var ignore=this.ignore;this.ignore=false;return ignore}});