AE.namespace('AE.widget.intelligentSearch');AE.widget.intelligentSearch=function(){this.inputEl=null;this.jsonData=[];this._defConfig={url:'',inputElId:'',listCssClass:'intelligentList',listCssStyle:'left:0px;top:0px;width:200px;height:auto;z-index:100',keyWordClass:'',listItemNum:10,requestDelay:0.3,enableResultCount:1,returnVarName:'intelSearchData',isNeedSubmit:true};this.init=function(userConfig){this._defConfig=YL.merge(this._defConfig,userConfig);this.inputEl=get(this._defConfig.inputElId);this.requestFilter=YL.merge(this.requestFilter,{});this.UIController=YL.merge(this.UIController,{});this.requestHander=YL.merge(this.requestHander,{});this.dataParser=YL.merge(this.dataParser,{});this.requestFilter.init(this);this.UIController.init(this);};this.initOnActive=function(){if(this.requestHander.requestCount==0&&!this.dataParser.isInit){this.requestHander.init(this);this.dataParser.init(this);this.UIController.initEvts();return true;}
return false;};};AE.widget.intelligentSearch.prototype={requestFilter:{_keyMap:new Array(146),_parent:null,isPass:false,isFilterKey:false,init:function(scope){var keyVal='9|13|16|17|18|19|20|27|32|33|34|35|36|37|38|39|40|44|45|91|92|93|112|113|114|115|116|117|118|119|120|121|122|123|145';var tempK=keyVal.split('\|');for(var i=0,j=tempK.length;i<j;i++){this._keyMap[tempK[i]]=1;}
this._parent=scope;},verify:function(inputEl){this.isPass=!(this.emptyRequst(inputEl.value)||this.isFilterKey||this.sameQuery(inputEl.value));},checkFuncKey:function(e){var keyVal=e.keyCode||0;this.isFilterKey=(this._keyMap[keyVal]==1);if(!this.isFilterKey){this._parent.requestHander.disabled=false;}},emptyRequst:function(inputVal){if(trim(inputVal)==''){this._parent.UIController.hideList();return true;}
return false;},sameQuery:function(inputVal){var P=this._parent,qHander=P.requestHander;if(trim(inputVal)==qHander.previousQuery){if(qHander.returnDataLength>0){P.UIController.displayList();return true;}}
return false;}},requestHander:{_parent:null,_timer:null,_processor:null,_isLoading:false,disabled:false,requestCount:0,previousQuery:'',returnDataLength:0,init:function(scope){this._parent=scope;},send:function(){var _self=this,P=this._parent,config=P._defConfig,filter=P.requestFilter;var inputEl=P.dataParser.HTMLElements.inputEl;if(this.disabled||this._isLoading||!!this._timer){return;};filter.verify(inputEl);if(filter.isPass){_self.requestCount++;_self._isLoading=true;_self._processor=YAHOO.util.Get.script(_self._buildURL(inputEl.value),{onSuccess:_self._onSuccess,onFailure:_self._onFailure,onTimeout:_self._onTimeout,scope:_self,data:inputEl.value,insertBefore:P.inputEl,timeout:3000});}},_onSuccess:function(o){var P=this._parent;P.jsonData=window[P._defConfig.returnVarName];if(!YL.isArray(P.jsonData)||P.jsonData.length==0||trim(P.inputEl.value)==''){P.UIController.hideList();}else{P.dataParser.update(this._parent);P.UIController.displayList();}
this.returnDataLength=P.jsonData.length;this.previousQuery=o.data;this._isLoading=false;P.jsonData=[];o.purge();},_onFailure:function(o){this._parent.UIController.hideList();this._isLoading=false;},_onTimeout:function(o){this._parent.UIController.hideList();this._isLoading=false;},_buildURL:function(searchStr){var config=this._parent._defConfig,param='',baseUrl=config.url;if(baseUrl.indexOf('?')!=-1){var urlArray=baseUrl.split('?');baseUrl=urlArray[0];param='&'+urlArray[1];}
return(baseUrl+'?keyword='+encodeURIComponent(searchStr)+'&'+'varname='+config.returnVarName+'&'+'__number='+config.enableResultCount+'&'+'time='+(new Date()).getTime()+param);}},dataParser:{_parent:null,isInit:false,HTMLElements:{docEl:document,inputEl:null,listBox:null,iframeMask:null,showBtn:null,hideBtn:null,optionList:[]},init:function(scope){var P=scope,config=P._defConfig,inputEl=P.inputEl,els=this.HTMLElements;this._parent=P;els.inputEl=inputEl;els.iframeMask=this._insertHTMLAfter(els.inputEl,this._buildHTML(config.listCssClass,config.listItemNum));els.listBox=YUD.getNextSibling(els.iframeMask);this._initHTMLElements(els.listBox);this._formatHTML();this.isInit=true;},update:function(parentScope){var P=this._parent,config=P._defConfig,els=this.HTMLElements,optionList=els.optionList;var jsonData=P.jsonData;if(!this.isInit){this.init(parentScope)};for(i=0,j=optionList.length;i<j;i++){var option=optionList[i],numHtml='',txtHtml='';if(i<jsonData.length){if(config.keyWordClass!=''){txtHtml=this._boldKeyWords(jsonData[i].keywords,trim(els.inputEl.value),config.keyWordClass);}else{txtHtml=jsonData[i].keywords;}
if(config.enableResultCount==1&&jsonData[i].count){numHtml='<span class="s">'+jsonData[i].count+'</span>';}
option.innerHTML=numHtml+txtHtml;YUD.setStyle(option,'display','');}else{YUD.setStyle(option,'display','none');}}},_buildHTML:function(skinClass,itemNum){var html='<iframe frameborder="0" src="about:blank" scrolling="no" class="intelligentIframeMask" style="visibility:hidden;"></iframe>'+'<div class="'+skinClass+'" style="visibility:hidden;">'+'<div class="showSearchSuggestion" style="display:none;">Search Suggestions</div>'+'<div><div class="intelligentListTitle"><span>Hide</span>Search Suggestions</div>';for(var i=0;i<itemNum;i++){html+='<p id="listItem'+i+'">&nbsp;</p>';};html+='</div></div>';return html;},_insertHTMLAfter:function(el,html){if(el.insertAdjacentHTML){el.insertAdjacentHTML('AfterEnd',html);}else{var range=el.ownerDocument.createRange(),frag;range.setStartAfter(el);frag=range.createContextualFragment(html);el.parentNode.insertBefore(frag,el.nextSibling)}
return el.nextSibling;},_initHTMLElements:function(container){var els=this.HTMLElements,optionList=[];els.showBtn=container.firstChild;els.hideBtn=YUD.getFirstChild(YUD.getNextSibling(els.showBtn));optionList=container.getElementsByTagName('p');for(var i=0,j=optionList.length;i<j;i++){var option=optionList[i];}
els.optionList=optionList;},_formatHTML:function(){var P=this._parent,config=P._defConfig,els=this.HTMLElements;var listBox=els.listBox,ifmMask=els.iframeMask,hideBtn=els.hideBtn;if(!config.listCssStyle||config.listCssStyle==''){return;}
config.listCssStyle=config.listCssStyle.replace(/\s/ig,'');var styles=config.listCssStyle.split('\;');for(var i=0;i<styles.length;i++){var styleItem=styles[i].split('\:'),styleName=styleItem[0],styleValue=styleItem[1];switch(styleName.toLowerCase()){case'z-index':YUD.setStyle(listBox,styleName,styleValue);YUD.setStyle(ifmMask,'z-index',YUD.getStyle(listBox,'z-index')-1);break;case'top':case'left':case'width':case'height':YUD.setStyle([listBox,ifmMask],styleName,styleValue);break;default:YUD.setStyle(listBox,styleName,styleValue);}}
listBox.orgWidth=listBox.clientWidth+'px';},_boldKeyWords:function(str,keyWord,css){if(!keyWord)return str;return str.replace(keyWord,'<span class="'+css+'">'+keyWord+'</span>');}},UIController:{_els:{},_parent:null,_currentListItemIndex:-1,isOptionBoxOpen:false,isOptionListOpen:true,init:function(scope){this._parent=scope;var inputEl=get(scope._defConfig.inputElId);YUE.on(inputEl,'click',this._inputElOnClick,this);YUE.on(inputEl,'keydown',this._inputElOnKeydown,this);},initEvts:function(){if(!this._parent||!this._parent.dataParser.isInit){return;}
this._els=this._parent.dataParser.HTMLElements;this.bindListeners(this._evtsMap);},_evtsMap:[['docEl','click','_documentOnClick'],['inputEl','keyup','_inputElOnKeyup'],['inputEl','paste','_inputElOnKeyup'],['showBtn','click','_showBtnOnClick'],['hideBtn','click','_hideBtnOnClick'],['optionList','click','_optionOnClick'],['optionList','mouseover','_optionOnMouseover']],bindListeners:function(evtsMap){for(var i=0;i<evtsMap.length;i++){var evtDef=evtsMap[i];var el=evtDef[0],evt=evtDef[1],fname=evtDef[2];YUE.on(this._els[el],evt,this[fname],this);}},_inputElOnKeyup:function(e,scope){scope._parent.requestHander.send();},_inputElOnKeydown:function(e,scope){var P=scope._parent,filter=P.requestFilter
filter.checkFuncKey(e);if(!filter.isFilterKey){P.initOnActive();}
if(scope.isOptionListOpen){scope.moveListItem(e.keyCode);}},_inputElOnClick:function(e,scope){YUE.stopEvent(e);var P=scope._parent,initStatus=P.initOnActive();P.requestFilter.isFilterKey=false;P.requestHander.send();},_documentOnClick:function(e,scope){if(scope.isOptionBoxOpen){scope.hideList();}},_showBtnOnClick:function(e,scope){YUE.stopEvent(e);YUD.setStyle(scope._els.hideBtn,'display','');YUD.setStyle(YUD.getNextSibling(this),'display','');YUD.setStyle(this,'display','none');scope.displayList(scope._els.listBox.orgWidth);scope.isOptionListOpen=true;},_hideBtnOnClick:function(e,scope){YUE.stopEvent(e);YUD.setStyle(scope._els.showBtn,'display','');YUD.setStyle(this.parentNode,'display','none');YUD.setStyle(this,'display','none');scope.isOptionListOpen=false;scope.hideList('auto');},_optionOnClick:function(e,scope){var inx=this.id.replace('listItem','');var config=scope._parent._defConfig;YUE.stopEvent(e);scope.setInputElValue(scope._els.optionList[inx]);if(config.isNeedSubmit&&config.isNeedSubmit==true){scope.submitSelect(scope._els.inputEl.form);}
scope.hideList();},_optionOnMouseover:function(e,scope){var inx=this.id.replace('listItem','');YUE.stopEvent(e);scope.transListItem(inx);scope.setListItemIndex(inx);},displayList:function(w){var els=this._els;if(!!w){YUD.setStyle(els.listBox,'width',w);}
this.syncMaskWH();if(this.isOptionBoxOpen){return;}
YUD.setStyle(els.listBox,'visibility','visible');YUD.setStyle(els.iframeMask,'visibility','visible');this.isOptionBoxOpen=true;},hideList:function(w){var els=this._els;if(!!w){YUD.setStyle(els.listBox,'width',w);}
if(!this.isOptionBoxOpen){return;}
YUD.setStyle(els.listBox,'visibility','hidden');YUD.setStyle(els.iframeMask,'visibility','hidden');YUD.removeClass(els.optionList,'current');this.isOptionBoxOpen=false;this._currentListItemIndex=-1;},moveListItem:function(kCode){var optionList=this._els.optionList;var inx=this._currentListItemIndex;var dLen=this._parent.requestHander.returnDataLength;if(dLen<=0||(kCode!=38&&kCode!=40)){return;}
if(kCode==38){inx--;if(inx<0)inx=dLen-1;}else if(kCode==40){inx++;if(inx>=dLen)inx=0;}
this.transListItem(inx);this.setListItemIndex(inx);this.setInputElValue(optionList[inx]);},transListItem:function(nextInx){var prevInx=this._currentListItemIndex;if(prevInx>=0){YUD.removeClass(this._els.optionList[prevInx],'current');}
YUD.addClass(this._els.optionList[nextInx],'current');},submitSelect:function(f){if(this._els.inputEl.value.replace(/\s/g,'')!=''){f.submit();}},setListItemIndex:function(inx){this._currentListItemIndex=parseInt(inx);},setInputElValue:function(option){var _self=this,val=option.innerText||option.textContent;var numEl=YUD.getElementsByClassName('s','span',option);if(numEl.length==1){numEl=numEl[0];val=val.replace(numEl.innerText||numEl.textContent,'');}
this._parent.requestHander.disabled=true;this._els.inputEl.value=val;},syncMaskWH:function(){var listBox=this._els.listBox;var ifmMask=this._els.iframeMask;YUD.setStyle(ifmMask,'width',listBox.offsetWidth+'px');YUD.setStyle(ifmMask,'height',listBox.offsetHeight+'px');}}};