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