var AutoComplete={
'Sources':{},
'ResultsDivShown':false,
'CurrentResult':null,
'Cache':{},
'CurrentSource':'',
'LastTimeout':0,
'LastWord':'',
'EventHandlers':[],
'AddControl':AutoComplete_AddControl,
'KeyDown':AutoComplete_KeyDown,
'SelectPrevious':AutoComplete_SelectPrevious,
'SelectNext':AutoComplete_SelectNext,
'Select':AutoComplete_Select,
'DeSelect':AutoComplete_DeSelect,
'Update':AutoComplete_Update,
'Send':AutoComplete_Send,
'AjaxComplete':AutoComplete_AjaxComplete,
'AjaxCompleteJQuery':AutoComplete_AjaxCompleteJQuery,
'AjaxCompleteHandleResponse':AutoComplete_AjaxCompleteHandleResponse,
'Show':AutoComplete_Show,
'Hide':AutoComplete_Hide,
'Submit':AutoComplete_Submit,
'Click':AutoComplete_Click,
'AddEventHandler':AutoComplete_AddEventHandler,
'RemoveEventHandler':AutoComplete_RemoveEventHandler};
var KeyEvents={
'TAB':9,
'UP':38,
'DOWN':40,
'ENTER':13,
'ESCAPE':27};
function AutoComplete_AddControl(elementId,handler,params,keyValidator){
var element=document.getElementById(elementId);
if(element.tagName.toLowerCase()!=='input'&&element.type!=='text'){
return 0;}
AutoComplete.Sources[elementId]={'handler':handler,'params':params,'keyValidator':keyValidator};
if(!!element.getAttribute('groupId')){
AutoComplete.Sources[elementId].groupId=element.getAttribute('groupId');}
else{
AutoComplete.Sources[elementId].groupId='0';}
if(!!element.getAttribute('timeout')){
AutoComplete.Sources[elementId].timeout=element.getAttribute('timeout');}
else{
AutoComplete.Sources[elementId].timeout='200';}
if(!!element.getAttribute('number')){
AutoComplete.Sources[elementId].number=parseInt(element.getAttribute('number'),10);}
else{
AutoComplete.Sources[elementId].number=5;}
if(!!element.getAttribute('searchKey')){
AutoComplete.Sources[elementId].searchKey=element.getAttribute('searchKey');}
else{
AutoComplete.Sources[elementId].searchKey='word';}
if(!!element.getAttribute('resultKey')){
AutoComplete.Sources[elementId].resultKey=element.getAttribute('resultKey');}
else{
AutoComplete.Sources[elementId].resultKey='results';}
if(!!element.getAttribute('resultDiv')){
AutoComplete.Sources[elementId].resultDiv=element.getAttribute('resultDiv');}
else{
AutoComplete.Sources[elementId].resultDiv='AutoCompleteResultsDiv';}
if(!!element.getAttribute('normalCss')){
AutoComplete.Sources[elementId].NormalCssClass=element.getAttribute('normalCss');}
else{
AutoComplete.Sources[elementId].NormalCssClass='AutoCompleteNormal';}
if(!!element.getAttribute('selectedCss')){
AutoComplete.Sources[elementId].SelectedCssClass=element.getAttribute('selectedCss');}
else{
AutoComplete.Sources[elementId].SelectedCssClass='AutoCompleteSelected';}
element.onkeydown=AutoComplete.KeyDown;
return 1;}
function AutoComplete_KeyDown(eventDetails){
eventDetails=eventDetails||window.event;
var evSource=eventDetails.target||eventDetails.srcElement;
var acSource=AutoComplete.Sources[evSource.id];
if(typeof acSource=='undefined'){
return true;}
if(AutoComplete.CurrentSource!==evSource.id){
if(AutoComplete.ResultsDivShown){
AutoComplete.Hide();}
AutoComplete.CurrentSource=evSource.id;}
else{
if(eventDetails.keyCode===KeyEvents.TAB){
if(AutoComplete.ResultsDivShown){
AutoComplete.Hide();}
return true;}}
if(AutoComplete.ResultsDivShown){
if(eventDetails.keyCode===KeyEvents.UP){
AutoComplete.SelectPrevious();
return false;}
else if(eventDetails.keyCode===KeyEvents.DOWN){
AutoComplete.SelectNext();
return false;}
else if(eventDetails.keyCode===KeyEvents.ESCAPE){
AutoComplete.Hide();
return false;}}
var element=$(evSource.id);
if(eventDetails.keyCode===KeyEvents.ENTER){
if(AutoComplete.ResultsDivShown&&!!AutoComplete.CurrentResult){
AutoComplete.Submit(AutoComplete.CurrentResult.getAttribute('realText'));
return false;}
else{
AutoComplete.Submit(element.value);
return true;}}
else if(typeof acSource.keyValidator=='function'){
var isGoodKey=acSource.keyValidator(eventDetails);
if(!isGoodKey){
return false;}}
if(AutoComplete.LastTimeout!==0){
AutoComplete.LastTimeout=window.clearTimeout(AutoComplete.LastTimeout);}
AutoComplete.LastTimeout=window.setTimeout(function(){AutoComplete.Update(element.value);},acSource.timeout);
return true;}
function AutoComplete_Update(text){
if(text.match(/^\W*$/gm)){
if(AutoComplete.ResultsDivShown){
AutoComplete.Hide();}
return;}
else if(AutoComplete.LastWord===text.toLowerCase()){
return;}
AutoComplete.Send(text);}
function AutoComplete_Submit(text){
$(AutoComplete.CurrentSource).value=text;
for(var iter=0,num=AutoComplete.EventHandlers.length;iter<num;iter++){
var handler=AutoComplete.EventHandlers[iter];
if(typeof handler=='function'){
handler({'type':'AutoComplete','target':AutoComplete.CurrentSource});}}
AutoComplete.Hide();}
function AutoComplete_Hide(){
if(!AutoComplete.ResultsDivShown){
return;}
$(AutoComplete.Sources[AutoComplete.CurrentSource].resultDiv).style.display='none';
AutoComplete.ResultsDivShown=false;
AutoComplete.LastWord='';
AutoComplete.DeSelect();
if(document.removeEventListener){
document.removeEventListener('click',AutoComplete.Click,false);}
else if(document.detachEvent){
document.detachEvent("onclick",AutoComplete.Click);}}
function AutoComplete_SelectPrevious(){
var resultsDiv=$(AutoComplete.Sources[AutoComplete.CurrentSource].resultDiv);
if(!AutoComplete.ResultsDivShown||!resultsDiv){
return;}
if(!!AutoComplete.CurrentResult&&!!AutoComplete.CurrentResult.previousSibling){
AutoComplete.Select(AutoComplete.CurrentResult.previousSibling);}
else if(!!resultsDiv.lastChild){
AutoComplete.Select(resultsDiv.lastChild);}
else{
AutoComplete.Hide();}}
function AutoComplete_SelectNext(){
var resultsDiv=$(AutoComplete.Sources[AutoComplete.CurrentSource].resultDiv);
if(!AutoComplete.ResultsDivShown||!resultsDiv){
return;}
if(!!AutoComplete.CurrentResult&&!!AutoComplete.CurrentResult.nextSibling){
AutoComplete.Select(AutoComplete.CurrentResult.nextSibling);}
else if(!!resultsDiv.firstChild){
AutoComplete.Select(resultsDiv.firstChild);}
else{
AutoComplete.Hide();}}
function AutoComplete_Select(result){
AutoComplete.DeSelect();
if(!result){
return;}
AutoComplete.CurrentResult=result;
AutoComplete.CurrentResult.className=AutoComplete.Sources[AutoComplete.CurrentSource].SelectedCssClass.toString();}
function AutoComplete_DeSelect(){
if(!AutoComplete.CurrentResult){
return;}
AutoComplete.CurrentResult.className=AutoComplete.Sources[AutoComplete.CurrentSource].NormalCssClass;
AutoComplete.CurrentResult=null;}
function AutoComplete_Send(text){
if(AutoComplete.LastTimeout!==0){
AutoComplete.LastTimeout=window.clearTimeout(AutoComplete.LastTimeout);}
if(text.match(/^\W*$/gm)){
if(AutoComplete.ResultsDivShown){
AutoComplete.Hide();}
return;}
if(AutoComplete.LastWord===text.toLowerCase()){
return;}
var obj=AutoComplete.Sources[AutoComplete.CurrentSource];
var cache=AutoComplete.Cache[obj.groupId.toLowerCase()];
AutoComplete.LastWord=text.toLowerCase();
if(typeof cache!='undefined'&&typeof cache[text.toLowerCase()]!='undefined'){
AutoComplete.Show(text);
return;}
var params={};
params[obj.searchKey]=text;
params['ele']=AutoComplete.CurrentSource;
if(window.jQuery){
jQuery.getJSON(obj.handler,params,AutoComplete.AjaxCompleteJQuery);}
else{
new Ajax.Request(obj.handler,{
method:'get',
parameters:params,
onComplete:AutoComplete.AjaxComplete});}}
function AutoComplete_AjaxCompleteJQuery(jsonObj,textStatus,transport){
return AutoComplete.AjaxCompleteHandleResponse(jsonObj);}
function AutoComplete_AjaxComplete(response){
if(!response){
return;}
var jsonObj=response.responseText.evalJSON(true);
return AutoComplete.AjaxCompleteHandleResponse(jsonObj);}
function AutoComplete_AjaxCompleteHandleResponse(jsonObj){
var ele=jsonObj['ele'];
var obj=AutoComplete.Sources[ele];
var array=jsonObj[obj.resultKey];
var word=jsonObj[obj.searchKey];
var remainingResults=obj.number;
var result='';
var html='';
while((array.length>0)&&(remainingResults>0)){
result=array.pop();
if(!result||result.match(/^\s*$/gm)){
continue;}
html+='<div realText="'+htmlEncode(result)+
'" class="'+htmlEncode(obj.NormalCssClass.toString())+
'" onclick="AutoComplete.Click();" onmouseover="AutoComplete.Select(this);" title="'+
htmlEncode(result)+'" alt="'+htmlEncode(result)+
'"><b>'+htmlEncode(result.substring(0,word.length))+'</b>'+htmlEncode(result.substring(word.length))+'</div>';
remainingResults--;}
if(typeof AutoComplete.Cache[obj.groupId.toLowerCase()]=='undefined'){
AutoComplete.Cache[obj.groupId.toLowerCase()]={};}
AutoComplete.Cache[obj.groupId.toLowerCase()][word.toLowerCase()]=html;
if(AutoComplete.LastWord===word.toLowerCase()&&AutoComplete.CurrentSource===ele){
AutoComplete.Show(word);}
else{
AutoComplete.Hide();}}
function AutoComplete_Show(word){
var obj=AutoComplete.Sources[AutoComplete.CurrentSource];
var resultsDiv=$(obj.resultDiv);
var bounds=GetBoundingRect($(AutoComplete.CurrentSource));
resultsDiv.style.left=bounds.left+'px';
resultsDiv.style.top=(bounds.top+bounds.height)+'px';
AutoComplete.DeSelect();
var groupCache=AutoComplete.Cache[obj.groupId.toLowerCase()];
resultsDiv.innerHTML=groupCache[word.toLowerCase()];
if(typeof resultsDiv.innerHTML!='string'||resultsDiv.innerHTML===''){
AutoComplete.Hide();
return;}
if(AutoComplete.ResultsDivShown===true){
return;}
AutoComplete.ResultsDivShown=true;
resultsDiv.style.display='block';
if(document.addEventListener){
document.addEventListener('click',AutoComplete.Click,false);}
else if(document.attachEvent){
document.attachEvent("onclick",AutoComplete.Click);}}
function AutoComplete_Click(eventDetails){
eventDetails=eventDetails||window.event;
var evSource=eventDetails.target||eventDetails.srcElement;
var acSource=AutoComplete.Sources[AutoComplete.CurrentSource];
if(evSource.parentNode.id===acSource.resultDiv){
AutoComplete.Submit(evSource.getAttribute('realText'));
return false;}
else if(evSource.parentNode.className===acSource.SelectedCssClass.toString()){
AutoComplete.Submit(evSource.parentNode.getAttribute('realText'));
return false;}
else if(evSource.id!==acSource.resultDiv){
AutoComplete.Hide();}
return true;}
function AutoComplete_AddEventHandler(newHandler){
if(typeof newHandler!='function'){
return;}
for(handler in AutoComplete.EventHandlers){
if(newHandler===handler){
return;}}
AutoComplete.EventHandlers.push(newHandler);}
function AutoComplete_RemoveEventHandler(oldHandler){
if(typeof oldHandler!='function'){
return;}
var index=0;
while(index<AutoComplete.EventHandlers.length){
if(AutoComplete.EventHandlers[index]===oldHandler){
AutoComplete.EventHandlers=AutoComplete.EventHandlers.splice(index,index+1);}
else{
index++;}}}
function GetBoundingRect(element){
var left=0,
top=0,
eleIter=element,
parIter=element.parentNode,
scrollOffsetTop=0;
if(!!eleIter.clientLeft&&eleIter.clientLeft>0){
left+=eleIter.clientLeft;}
while(!!eleIter){
if(!!eleIter){
if((eleIter.offsetLeft!==undefined)&&(eleIter.offsetTop!==undefined)){
left+=eleIter.offsetLeft;
top+=eleIter.offsetTop;}
eleIter=eleIter.offsetParent;}
if(!!parIter){
if(!!parIter.scrollTop){
top-=parIter.scrollTop;}
parIter=parIter.parentNode;}}
return{'left':left,'top':top,'width':element.offsetWidth,'height':element.offsetHeight};}
var htmlEncode=htmlEncode||function(text){
if(typeof text!='string'){
return;}
if(typeof encodingDiv=='undefined'){
var encodingDiv=document.createElement('div');}
var encodingNode=document.createTextNode(text);
while(encodingDiv.childNodes.length>0){
encodingDiv.removeChild(encodingDiv.childNodes[0]);}
encodingDiv.appendChild(encodingNode);
return encodingDiv.innerHTML;}

