/*
--------------------------------------------------------
suggest.js - Input Suggest
Version 2.0.2 (Update 2007/07/29)

- onozaty (http://www.enjoyxstudy.com)

Released under the Creative Commons License(Attribution 2.1 Japan):
 http://creativecommons.org/licenses/by/2.1/jp/

For details, see the web site:
 http://www.enjoyxstudy.com/javascript/suggest/

--------------------------------------------------------
*/
if(!Suggest){var Suggest={}}Suggest.Key={TAB:9,RETURN:13,ESC:27,UP:38,DOWN:40};Suggest.copyProperties=function(A,C){for(var B in C){A[B]=C[B]}return A};Suggest.Local=function(){this.initialize.apply(this,arguments)};Suggest.Local.prototype={initialize:function(B,D,C){this.input=this._getElement(B);this.suggestArea=this._getElement(D);this.candidateList=C;this.oldText=this.getInputText();if(arguments[3]){this.setOptions(arguments[3])}this._addEvent(this.input,"focus",this._bind(this.checkLoop));this._addEvent(this.input,"blur",this._bind(this.inputBlur));var A="keydown";if(window.opera||(navigator.userAgent.indexOf("Gecko")>=0&&navigator.userAgent.indexOf("KHTML")==-1)){A="keypress"}this._addEvent(this.input,A,this._bindEvent(this.keyEvent));this.clearSuggestArea()},interval:500,dispMax:20,listTagName:"div",prefix:false,ignoreCase:true,highlight:false,dispAllKey:false,classMouseOver:"over",classSelect:"select",hookBeforeSearch:function(){},setOptions:function(A){Suggest.copyProperties(this,A)},inputBlur:function(){this.changeUnactive();this.oldText=this.getInputText();if(this.timerId){clearTimeout(this.timerId)}this.timerId=null;setTimeout(this._bind(this.clearSuggestArea),500)},checkLoop:function(){var A=this.getInputText();if(A!=this.oldText){this.oldText=A;this.search()}if(this.timerId){clearTimeout(this.timerId)}this.timerId=setTimeout(this._bind(this.checkLoop),this.interval)},search:function(){this.clearSuggestArea();var B=this.getInputText();if(B==""||B==null){return }this.hookBeforeSearch(B);var A=this._search(B);if(A!=0){this.createSuggestArea(A)}},_search:function(E){var B=[];var A;this.suggestIndexList=[];for(var C=0,D=this.candidateList.length;C<D;C++){if((A=this.isMatch(this.candidateList[C],E))!=null){B.push(A);this.suggestIndexList.push(C);if(this.dispMax!=0&&B.length>=this.dispMax){break}}}return B},isMatch:function(B,A){if(B==null){return null}var C=(this.ignoreCase)?B.toLowerCase().indexOf(A.toLowerCase()):B.indexOf(A);if((C==-1)||(this.prefix&&C!=0)){return null}if(this.highlight){return(this._escapeHTML(B.substr(0,C))+"<strong>"+this._escapeHTML(B.substr(C,A.length))+"</strong>"+this._escapeHTML(B.substr(C+A.length)))}else{return this._escapeHTML(B)}},clearSuggestArea:function(){this.suggestArea.innerHTML="";this.suggestArea.style.display="none";this.suggestList=null;this.suggestIndexList=null;this.activePosition=null},createSuggestArea:function(A){this.suggestList=[];this.inputValueBackup=this.input.value;for(var C=0,D=A.length;C<D;C++){var B=document.createElement(this.listTagName);B.innerHTML=A[C];this.suggestArea.appendChild(B);this._addEvent(B,"click",this._bindEvent(this.listClick,C));this._addEvent(B,"mouseover",this._bindEvent(this.listMouseOver,C));this._addEvent(B,"mouseout",this._bindEvent(this.listMouseOut,C));this.suggestList.push(B)}this.suggestArea.style.display=""},getInputText:function(){return this.input.value},setInputText:function(A){this.input.value=A},keyEvent:function(A){if(!this.timerId){this.timerId=setTimeout(this._bind(this.checkLoop),this.interval)}if(this.dispAllKey&&A.ctrlKey&&this.getInputText()==""&&!this.suggestList&&A.keyCode==Suggest.Key.DOWN){this._stopEvent(A);this.keyEventDispAll()}else{if(A.keyCode==Suggest.Key.UP||A.keyCode==Suggest.Key.DOWN){if(this.suggestList&&this.suggestList.length!=0){this._stopEvent(A);this.keyEventMove(A.keyCode)}}else{if(A.keyCode==Suggest.Key.RETURN){if(this.suggestList&&this.suggestList.length!=0){this._stopEvent(A);this.keyEventReturn()}}else{if(A.keyCode==Suggest.Key.ESC){if(this.suggestList&&this.suggestList.length!=0){this._stopEvent(A);this.keyEventEsc()}}else{this.keyEventOther(A)}}}}},keyEventDispAll:function(){this.clearSuggestArea();this.oldText=this.getInputText();this.suggestIndexList=[];for(var A=0,B=this.candidateList.length;A<B;A++){this.suggestIndexList.push(A)}this.createSuggestArea(this.candidateList)},keyEventMove:function(A){this.changeUnactive();if(A==Suggest.Key.UP){if(this.activePosition==null){this.activePosition=this.suggestList.length-1}else{this.activePosition--;if(this.activePosition<0){this.activePosition=null;this.input.value=this.inputValueBackup;return }}}else{if(this.activePosition==null){this.activePosition=0}else{this.activePosition++}if(this.activePosition>=this.suggestList.length){this.activePosition=null;this.input.value=this.inputValueBackup;return }}this.changeActive(this.activePosition)},keyEventReturn:function(){this.clearSuggestArea();this.moveEnd()},keyEventEsc:function(){this.clearSuggestArea();this.input.value=this.inputValueBackup;this.oldText=this.getInputText();if(window.opera){setTimeout(this._bind(this.moveEnd),5)}},keyEventOther:function(A){},changeActive:function(A){this.setStyleActive(this.suggestList[A]);this.setInputText(this.candidateList[this.suggestIndexList[A]]);this.oldText=this.getInputText();this.input.focus()},changeUnactive:function(){if(this.suggestList!=null&&this.suggestList.length>0&&this.activePosition!=null){this.setStyleUnactive(this.suggestList[this.activePosition])}},listClick:function(B,A){this.changeUnactive();this.activePosition=A;this.changeActive(A);this.moveEnd()},listMouseOver:function(B,A){this.setStyleMouseOver(this._getEventElement(B))},listMouseOut:function(C,A){if(!this.suggestList){return }var B=this._getEventElement(C);if(A==this.activePosition){this.setStyleActive(B)}else{this.setStyleUnactive(B)}},setStyleActive:function(A){A.className=this.classSelect},setStyleUnactive:function(A){A.className=""},setStyleMouseOver:function(A){A.className=this.classMouseOver},moveEnd:function(){if(this.input.createTextRange){this.input.focus();var A=this.input.createTextRange();A.move("character",this.input.value.length);A.select()}else{if(this.input.setSelectionRange){this.input.setSelectionRange(this.input.value.length,this.input.value.length)}}},_getElement:function(A){return(typeof A=="string")?document.getElementById(A):A},_addEvent:(window.addEventListener?function(A,B,C){A.addEventListener(B,C,false)}:function(A,B,C){A.attachEvent("on"+B,C)}),_stopEvent:function(A){if(A.preventDefault){A.preventDefault();A.stopPropagation()}else{A.returnValue=false;A.cancelBubble=true}},_getEventElement:function(A){return A.target||A.srcElement},_bind:function(C){var A=this;var B=Array.prototype.slice.call(arguments,1);return function(){C.apply(A,B)}},_bindEvent:function(C){var A=this;var B=Array.prototype.slice.call(arguments,1);return function(D){D=D||window.event;C.apply(A,[D].concat(B))}},_escapeHTML:function(A){return A.replace(/\&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/\"/g,"&quot;").replace(/\'/g,"&#39;")}};Suggest.LocalMulti=function(){this.initialize.apply(this,arguments)};Suggest.copyProperties(Suggest.LocalMulti.prototype,Suggest.Local.prototype);Suggest.LocalMulti.prototype.delim=" ";Suggest.LocalMulti.prototype.keyEventReturn=function(){this.clearSuggestArea();this.input.value+=this.delim;this.moveEnd()};Suggest.LocalMulti.prototype.keyEventOther=function(A){if(A.keyCode==Suggest.Key.TAB){if(this.suggestList&&this.suggestList.length!=0){this._stopEvent(A);if(!this.activePosition){this.activePosition=0;this.changeActive(this.activePosition)}this.clearSuggestArea();this.input.value+=this.delim;if(window.opera){setTimeout(this._bind(this.moveEnd),5)}else{this.moveEnd()}}}};Suggest.LocalMulti.prototype.listClick=function(B,A){this.changeUnactive();this.activePosition=A;this.changeActive(A);this.input.value+=this.delim;this.moveEnd()};Suggest.LocalMulti.prototype.getInputText=function(){var A=this.getLastTokenPos();if(A==-1){return this.input.value}else{return this.input.value.substr(A+1)}};Suggest.LocalMulti.prototype.setInputText=function(A){var B=this.getLastTokenPos();if(B==-1){this.input.value=A}else{this.input.value=this.input.value.substr(0,B+1)+A}};Suggest.LocalMulti.prototype.getLastTokenPos=function(){return this.input.value.lastIndexOf(this.delim)};
