function duoAutoComplete(elem,controller,dropdownId,idField){ //should eventually include, elemId,query,fields etc.. //varis below global to this object //params var suggestElem=elem; this.suggestValue=''; var suggestBoxId=dropdownId; var storageId=idField; var suggestController=controller; var object=this; //methods this.autoComplete=ac_autoComplete; this.autoComplete_res=ac_autoComplete_res; this.autoCompleteSetChosen=ac_autoCompleteSetChosen; this.autoCompleteSelect=ac_autoCompleteSelect; this.autoCompleteSetChosen=ac_autoCompleteSetChosen; this.setStorageId=ac_setStorageId; this.removeSuggest=ac_removeSuggest; this.removeSuggestBlur=ac_removeSuggestBlur; this.mouseOver=ac_mouseOver; this.mouseClick=ac_mouseClick; //setup input listener objectListen(suggestElem,'keyup', this.autoComplete); objectListen(suggestElem,'blur', this.removeSuggestBlur); function ac_autoComplete(){ if(suggestElem && suggestElem.value && this.suggestValue!=suggestElem.value){ var myConn = new XHConn(); if (myConn && elem.value!=suggestElem){ myConn.connect(suggestController+escape(suggestElem.value)+"/", "POST", "", object.autoComplete_res); } this.suggestValue=suggestElem.value; } } function ac_autoComplete_res(data){ var data=eval('('+data.responseText+')'); if(data && data.error){ alert(data.error); return; } if(data){ var Data=data.info; if (Data.length>0){ if(document.getElementById(suggestBoxId)){ var compSuggest=document.getElementById(suggestBoxId); }else{ var compSuggest=document.createElement('DIV'); compSuggest.id=suggestBoxId; var bods=document.getElementsByTagName('body'); bods[0].appendChild(compSuggest); } //setup element in the same place var xpos=getAbsX(suggestElem); var ypos=getAbsY(suggestElem)+23; compSuggest.style.left=xpos+"px"; compSuggest.style.top=ypos+"px"; compSuggest.style.display="block"; compSuggest.style.width=suggestElem.offsetWidth+"px"; var list=document.getElementById(suggestBoxId); var html=''; var Data=data.info; for (var Row in Data){ if(Data[Row].value){ html+=""+Data[Row].value+""; } } list.innerHTML=html; var listItems=document.getElementById(dropdownId).getElementsByTagName('A'); for(i=0;ilist.offsetHeight){ var selecY=getAbsY(document.getElementById(dropdownId+'Active')); var listBottom=getAbsY(list)+list.offsetHeight; list.scrollTop=selecY-getAbsY(list)-(list.offsetHeight/2)+10; } }else{ object.autoCompleteSetChosen(listItems[0]); } stopEvent(e); } if(e.keyCode==38){//if up cursor is selected var list=document.getElementById('compSuggest'); var listItems=document.getElementById(dropdownId).getElementsByTagName('A'); if(document.getElementById(dropdownId+'Active')){ var chosen=document.getElementById(dropdownId+'Active'); if(chosen.previousSibling){ object.autoCompleteSetChosen(chosen.previousSibling) }else{ object.autoCompleteSetChosen(listItems[(listItems.length-1)]); } }else{ object.autoCompleteSetChosen(listItems[0]); } //scroll up when selected above bottom of scroller var selecY=getAbsY(document.getElementById(dropdownId+'Active')); var pos1=selecY-getAbsY(list); var pos2=selecY-getAbsY(list)-(list.offsetHeight/2); document.getElementById('statusbar').innerHTML=pos1+" "+pos2; if(list.scrollTop!=(selecY-getAbsY(list))){ list.scrollTop=selecY-getAbsY(list)-(list.offsetHeight/2)+10; } stopEvent(e); } if(e.keyCode==13){ if(document.getElementById(dropdownId+'Active')){ suggestElem.value=html_unescape(document.getElementById(dropdownId+'Active').innerHTML); object.setStorageId(document.getElementById(dropdownId+'Active').className); object.removeSuggest(); } stopEvent(e); } }else{ if(e.keyCode==40){ object.autoComplete(); } } } function ac_removeSuggestBlur(){ try{ if(document.activeElement){ var elem=document.activeElement; if(elem.getAttribute('id')==suggestBoxId){ return; } } object.removeSuggest(); }catch(e){} } function ac_removeSuggest(){ //close element if(document.getElementById(suggestBoxId)){ //objectStopListen(suggestElem,'keyup', this.autoComplete); document.getElementById(suggestBoxId).parentNode.removeChild(document.getElementById(suggestBoxId)); } } function ac_autoCompleteSetChosen(elem){ if(document.getElementById(dropdownId+'Active')){ var chosen=document.getElementById(dropdownId+'Active'); chosen.removeAttribute('id'); } elem.id=dropdownId+'Active'; } function html_unescape(html){ html=html.replace(/&/i,"&"); //add more as required return html; } function ac_setStorageId(val){ if(document.getElementById(storageId)){document.getElementById(storageId).value=val;} } }//close of autocomplete object