Tek-Tips is the largest IT community on the Internet today!

Members share and learn making Tek-Tips Forums the best source of peer-reviewed technical information on the Internet!

  • Congratulations strongm on being selected by the Tek-Tips community for having the most helpful posts in the forums last week. Way to Go!

Need help modifying Autocomplete script

Status
Not open for further replies.

syedfa

Programmer
Apr 30, 2009
2
Dear fellow developers:

I have been working on an autocomplete script that I have modified to be used with JSP's/Servlets. The script is working very nicely, except for one minor issue. When the user selects from the suggestions in the drop down list, for some unexplained reason, an extra space is added to the word in the text field. Can anyone explain why this is, and how I can fix this? Also, I would like to modify this script further, such that if a user enters more than one word in the text field, the autocomplete script is activated for each word, instead of ONLY the first word.

I have added the entire code for the JavaScript file that is responsible for the autocomplete feature below.

The link from where you can download the autocomplete files is here:


a demo of the script can be found here:


FYI, I am using the version that uses XML.

Thanks to all who reply.

Below is the JavaScript code for the autocomplete file I am using:

if(typeof(bsn)=="undefined")_b=bsn={};if(typeof(_b.Autosuggest)=="undefined")_b.Autosuggest={};else alert("Autosuggest is already set!");_b.AutoSuggest=function(b,c){if(!document.getElementById)return 0;this.fld=_b.DOM.gE(b);if(!this.fld)return 0;this.sInp="";this.nInpC=0;this.aSug=[];this.iHigh=0;this.oP=c?c:{};var k,def={minchars:1,meth:"get",varname:"input",className:"autosuggest",timeout:2500,delay:500,offsety:-5,shownoresults:true,noresults:"No results!",maxheight:250,cache:true,maxentries:25};for(k in def){if(typeof(this.oP[k])!=typeof(def[k]))this.oP[k]=def[k]}var p=this;this.fld.onkeypress=function(a){return p.onKeyPress(a)};this.fld.onkeyup=function(a){return p.onKeyUp(a)};this.fld.setAttribute("autocomplete","off")};_b.AutoSuggest.prototype.onKeyPress=function(a){var b=(window.event)?window.event.keyCode:a.keyCode;var c=13;var d=9;var e=27;var f=1;switch(b){case c:this.setHighlightedValue();f=0;break;case e:this.clearSuggestions();break}return f};_b.AutoSuggest.prototype.onKeyUp=function(a){var b=(window.event)?window.event.keyCode:a.keyCode;var c=38;var d=40;var e=1;switch(b){case c:this.changeHighlight(b);e=0;break;case d:this.changeHighlight(b);e=0;break;default:this.getSuggestions(this.fld.value)}return e};_b.AutoSuggest.prototype.getSuggestions=function(a){if(a==this.sInp)return 0;_b.DOM.remE(this.idAs);this.sInp=a;if(a.length<this.oP.minchars){this.aSug=[];this.nInpC=a.length;return 0}var b=this.nInpC;this.nInpC=a.length?a.length:0;var l=this.aSug.length;if(this.nInpC>b&&l&&l<this.oP.maxentries&&this.oP.cache){var c=[];for(var i=0;i<l;i++){if(this.aSug.value.substr(0,a.length).toLowerCase()==a.toLowerCase())c.push(this.aSug)}this.aSug=c;this.createList(this.aSug);return false}else{var d=this;var e=this.sInp;clearTimeout(this.ajID);this.ajID=setTimeout(function(){d.doAjaxRequest(e)},this.oP.delay)}return false};_b.AutoSuggest.prototype.doAjaxRequest=function(b){if(b!=this.fld.value)return false;var c=this;if(typeof(this.oP.script)=="function")var d=this.oP.script(encodeURIComponent(this.sInp));else var d=this.oP.script+this.oP.varname+"="+encodeURIComponent(this.sInp);if(!d)return false;var e=this.oP.meth;var b=this.sInp;var f=function(a){c.setSuggestions(a,b)};var g=function(a){alert("AJAX error: "+a)};var h=new _b.Ajax();h.makeRequest(d,e,f,g)};_b.AutoSuggest.prototype.setSuggestions=function(a,b){if(b!=this.fld.value)return false;this.aSug=[];if(this.oP.json){var c=eval('('+a.responseText+')');for(var i=0;i<c.results.length;i++){this.aSug.push({'id':c.results.id,'value':c.results.value,'info':c.results.info})}}else{var d=a.responseXML;var e=d.getElementsByTagName('results')[0].childNodes;for(var i=0;i<e.length;i++){if(e.hasChildNodes())this.aSug.push({'id':e.getAttribute('id'),'value':e.childNodes[0].nodeValue,'info':e.getAttribute('info')})}}this.idAs="as_"+this.fld.id;this.createList(this.aSug)};_b.AutoSuggest.prototype.createList=function(b){var c=this;_b.DOM.remE(this.idAs);this.killTimeout();if(b.length==0&&!this.oP.shownoresults)return false;var d=_b.DOM.cE("div",{id:this.idAs,className:this.oP.className});var e=_b.DOM.cE("div",{className:"as_corner"});var f=_b.DOM.cE("div",{className:"as_bar"});var g=_b.DOM.cE("div",{className:"as_header"});g.appendChild(e);g.appendChild(f);d.appendChild(g);var h=_b.DOM.cE("ul",{id:"as_ul"});for(var i=0;i<b.length;i++){var j=b.value;var k=j.toLowerCase().indexOf(this.sInp.toLowerCase());var l=j.substring(0,k)+"<em>"+j.substring(k,k+this.sInp.length)+"</em>"+j.substring(k+this.sInp.length);var m=_b.DOM.cE("span",{},l,true);if(b.info!=""){var n=_b.DOM.cE("br",{});m.appendChild(n);var o=_b.DOM.cE("small",{},b.info);m.appendChild(o)}var a=_b.DOM.cE("a",{href:"#"});var p=_b.DOM.cE("span",{className:"tl"}," ");var q=_b.DOM.cE("span",{className:"tr"}," ");a.appendChild(p);a.appendChild(q);a.appendChild(m);a.name=i+1;a.onclick=function(){c.setHighlightedValue();return false};a.onmouseover=function(){c.setHighlight(this.name)};var r=_b.DOM.cE("li",{},a);h.appendChild(r)}if(b.length==0&&this.oP.shownoresults){var r=_b.DOM.cE("li",{className:"as_warning"},this.oP.noresults);h.appendChild(r)}d.appendChild(h);var s=_b.DOM.cE("div",{className:"as_corner"});var t=_b.DOM.cE("div",{className:"as_bar"});var u=_b.DOM.cE("div",{className:"as_footer"});u.appendChild(s);u.appendChild(t);d.appendChild(u);var v=_b.DOM.getPos(this.fld);d.style.left=v.x+"px";d.style.top=(v.y+this.fld.offsetHeight+this.oP.offsety)+"px";d.style.width=this.fld.offsetWidth+"px";d.onmouseover=function(){c.killTimeout()};d.onmouseout=function(){c.resetTimeout()};document.getElementsByTagName("body")[0].appendChild(d);this.iHigh=0;var c=this;this.toID=setTimeout(function(){c.clearSuggestions()},this.oP.timeout)};_b.AutoSuggest.prototype.changeHighlight=function(a){var b=_b.DOM.gE("as_ul");if(!b)return false;var n;if(a==40)n=this.iHigh+1;else if(a==38)n=this.iHigh-1;if(n>b.childNodes.length)n=b.childNodes.length;if(n<1)n=1;this.setHighlight(n)};_b.AutoSuggest.prototype.setHighlight=function(n){var a=_b.DOM.gE("as_ul");if(!a)return false;if(this.iHigh>0)this.clearHighlight();this.iHigh=Number(n);a.childNodes[this.iHigh-1].className="as_highlight";this.killTimeout()};_b.AutoSuggest.prototype.clearHighlight=function(){var a=_b.DOM.gE("as_ul");if(!a)return false;if(this.iHigh>0){a.childNodes[this.iHigh-1].className="";this.iHigh=0}};_b.AutoSuggest.prototype.setHighlightedValue=function(){if(this.iHigh){this.sInp=this.fld.value=this.aSug[this.iHigh-1].value;this.fld.focus();if(this.fld.selectionStart)this.fld.setSelectionRange(this.sInp.length,this.sInp.length);this.clearSuggestions();if(typeof(this.oP.callback)=="function")this.oP.callback(this.aSug[this.iHigh-1])}};_b.AutoSuggest.prototype.killTimeout=function(){clearTimeout(this.toID)};_b.AutoSuggest.prototype.resetTimeout=function(){clearTimeout(this.toID);var a=this;this.toID=setTimeout(function(){a.clearSuggestions()},1000)};_b.AutoSuggest.prototype.clearSuggestions=function(){this.killTimeout();var a=_b.DOM.gE(this.idAs);var b=this;if(a){var c=new _b.Fader(a,1,0,250,function(){_b.DOM.remE(b.idAs)})}};if(typeof(_b.Ajax)=="undefined")_b.Ajax={};_b.Ajax=function(){this.req={};this.isIE=false};_b.Ajax.prototype.makeRequest=function(a,b,c,d){if(b!="POST")b="GET";this.onComplete=c;this.onError=d;var e=this;if(window.XMLHttpRequest){this.req=new XMLHttpRequest();this.req.onreadystatechange=function(){e.processReqChange()};this.req.open("GET",a,true);this.req.send(null)}else if(window.ActiveXObject){this.req=new ActiveXObject("Microsoft.XMLHTTP");if(this.req){this.req.onreadystatechange=function(){e.processReqChange()};this.req.open(b,a,true);this.req.send()}}};_b.Ajax.prototype.processReqChange=function(){if(this.req.readyState==4){if(this.req.status==200){this.onComplete(this.req)}else{this.onError(this.req.status)}}};if(typeof(_b.DOM)=="undefined")_b.DOM={};_b.DOM.cE=function(b,c,d,e){var f=document.createElement(b);if(!f)return 0;for(var a in c)f[a]=c[a];var t=typeof(d);if(t=="string"&&!e)f.appendChild(document.createTextNode(d));else if(t=="string"&&e)f.innerHTML=d;else if(t=="object")f.appendChild(d);return f};_b.DOM.gE=function(e){var t=typeof(e);if(t=="undefined")return 0;else if(t=="string"){var a=document.getElementById(e);if(!a)return 0;else if(typeof(a.appendChild)!="undefined")return a;else return 0}else if(typeof(e.appendChild)!="undefined")return e;else return 0};_b.DOM.remE=function(a){var e=this.gE(a);if(!e)return 0;else if(e.parentNode.removeChild(e))return true;else return 0};_b.DOM.getPos=function(e){var e=this.gE(e);var a=e;var b=0;if(a.offsetParent){while(a.offsetParent){b+=a.offsetLeft;a=a.offsetParent}}else if(a.x)b+=a.x;var a=e;var c=0;if(a.offsetParent){while(a.offsetParent){c+=a.offsetTop;a=a.offsetParent}}else if(a.y)c+=a.y;return{x:b,y:c}};if(typeof(_b.Fader)=="undefined")_b.Fader={};_b.Fader=function(a,b,c,d,e){if(!a)return 0;this.e=a;this.from=b;this.to=c;this.cb=e;this.nDur=d;this.nInt=50;this.nTime=0;var p=this;this.nID=setInterval(function(){p._fade()},this.nInt)};_b.Fader.prototype._fade=function(){this.nTime+=this.nInt;var a=Math.round(this._tween(this.nTime,this.from,this.to,this.nDur)*100);var b=a/100;if(this.e.filters){try{this.e.filters.item("DXImageTransform.Microsoft.Alpha").opacity=a}catch(e){this.e.style.filter='progid:DXImageTransform.Microsoft.Alpha(opacity='+a+')'}}else{this.e.style.opacity=b}if(this.nTime==this.nDur){clearInterval(this.nID);if(this.cb!=undefined)this.cb()}};_b.Fader.prototype._tween=function(t,b,c,d){return b+((c-b)*(t/d))};
 
My apologies to everyone for the original post. Here is the JavaScript file "straightened out".

if(typeof(bsn)=="undefined")
_b=bsn={};

if(typeof(_b.Autosuggest)=="undefined")
_b.Autosuggest={};

else
alert("Autosuggest is already set!");

_b.AutoSuggest=function(b,c){
if(!document.getElementById)
return 0;this.fld=_b.DOM.gE(b);

if(!this.fld)
return 0;
this.sInp="";
this.nInpC=0;
this.aSug=[];
this.iHigh=0;

this.oP=c?c:{};

var k,def={minchars:1,meth:"get",varname:"input",className:"autosuggest",timeout:2500,delay:500,offsety:-5,shownoresults:true,noresults:"No results!",maxheight:250,cache:true,maxentries:25};

for(k in def)
{
if(typeof(this.oP[k])!=typeof(def[k]))
this.oP[k]=def[k]
}

var p=this;

this.fld.onkeypress=function(a){return p.onKeyPress(a)};
this.fld.onkeyup=function(a){return p.onKeyUp(a)};this.fld.setAttribute("autocomplete","off")
};

_b.AutoSuggest.prototype.onKeyPress=function(a)
{
var b=(window.event)?window.event.keyCode:a.keyCode;
var c=13;
var d=9;
var e=27;
var f=1;

switch(b)
{
case c:
this.setHighlightedValue();
f=0;
break;

case e:
this.clearSuggestions();
break
}

return f
};

_b.AutoSuggest.prototype.onKeyUp=function(a)
{
var b=(window.event)?window.event.keyCode:a.keyCode;
var c=38;
var d=40;
var e=1;

switch(b)
{
case c:
this.changeHighlight(b);
e=0;
break;

case d:
this.changeHighlight(b);
e=0;
break;

default:
this.getSuggestions(this.fld.value)
}

return e
};

_b.AutoSuggest.prototype.getSuggestions=function(a)
{
if(a==this.sInp)
return 0;

_b.DOM.remE(this.idAs);

this.sInp=a;

if(a.length<this.oP.minchars)
{
this.aSug=[];
this.nInpC=a.length;
return 0
}

var b=this.nInpC;
this.nInpC=a.length?a.length:0;

var l=this.aSug.length;

if(this.nInpC>b&&l&&l<this.oP.maxentries&&this.oP.cache)
{
var c=[];
for(var i=0;i<l;i++)
{
if(this.aSug.value.substr(0,a.length).toLowerCase()==a.toLowerCase())
c.push(this.aSug)
}
this.aSug=c;

this.createList(this.aSug);

return false
}

else
{
var d=this;
var e=this.sInp;
clearTimeout(this.ajID);
this.ajID=setTimeout(function(){d.doAjaxRequest(e)},this.oP.delay)
}

return false

};

_b.AutoSuggest.prototype.doAjaxRequest=function(b)
{
if(b!=this.fld.value)
return false;

var c=this;

if(typeof(this.oP.script)=="function")

var d=this.oP.script(encodeURIComponent(this.sInp));

else var d=this.oP.script+this.oP.varname+"="+encodeURIComponent(this.sInp);

if(!d)return false;
var e=this.oP.meth;
var b=this.sInp;
var f=function(a){c.setSuggestions(a,b)};
var g=function(a){alert("AJAX error: "+a)};
var h=new _b.Ajax();h.makeRequest(d,e,f,g)
};

_b.AutoSuggest.prototype.setSuggestions=function(a,b)
{
if(b!=this.fld.value)
return false;

this.aSug=[];

if(this.oP.json)
{
var c=eval('('+a.responseText+')');
for(var i=0;i<c.results.length;i++)
{
this.aSug.push({'id':c.results.id,'value':c.results.value,'info':c.results.info})
}
}

else
{
var d=a.responseXML;
var e=d.getElementsByTagName('results')[0].childNodes;

for(var i=0;i<e.length;i++)
{
if(e.hasChildNodes())
this.aSug.push({'id':e.getAttribute('id'),
'value':e.childNodes[0].nodeValue,'info':e.getAttribute('info')})
}
}

this.idAs="as_"+this.fld.id;

this.createList(this.aSug)
};

_b.AutoSuggest.prototype.createList=function(b)
{
var c=this;
_b.DOM.remE(this.idAs);
this.killTimeout();

if(b.length==0&&!this.oP.shownoresults)
return false;

var d=_b.DOM.cE("div",{id:this.idAs,className:this.oP.className});
var e=_b.DOM.cE("div",{className:"as_corner"});
var f=_b.DOM.cE("div",{className:"as_bar"});
var g=_b.DOM.cE("div",{className:"as_header"});

g.appendChild(e);
g.appendChild(f);
d.appendChild(g);

var h=_b.DOM.cE("ul",{id:"as_ul"});

for(var i=0;i<b.length;i++)
{
var j=b.value;
var k=j.toLowerCase().indexOf(this.sInp.toLowerCase());
var l=j.substring(0,k)+"<em>"+j.substring(k,k+this.sInp.length)+"</em>"+j.substring(k+this.sInp.length);
var m=_b.DOM.cE("span",{},l,true);

if(b.info!="")
{
var n=_b.DOM.cE("br",{});
m.appendChild(n);
var o=_b.DOM.cE("small",{},b.info);
m.appendChild(o)
}

var a=_b.DOM.cE("a",{href:"#"});
var p=_b.DOM.cE("span",{className:"tl"}," ");
var q=_b.DOM.cE("span",{className:"tr"}," ");

a.appendChild(p);a.appendChild(q);
a.appendChild(m);a.name=i+1;
a.onclick=function(){c.setHighlightedValue();return false};
a.onmouseover=function(){c.setHighlight(this.name)};
var r=_b.DOM.cE("li",{},a);
h.appendChild(r)
}

if(b.length==0&&this.oP.shownoresults)
{
var r=_b.DOM.cE("li",{className:"as_warning"},this.oP.noresults);
h.appendChild(r)
}

d.appendChild(h);

var s=_b.DOM.cE("div",{className:"as_corner"});
var t=_b.DOM.cE("div",{className:"as_bar"});
var u=_b.DOM.cE("div",{className:"as_footer"});

u.appendChild(s);
u.appendChild(t);
d.appendChild(u);

var v=_b.DOM.getPos(this.fld);

d.style.left=v.x+"px";
d.style.top=(v.y+this.fld.offsetHeight+this.oP.offsety)+"px";
d.style.width=this.fld.offsetWidth+"px";

d.onmouseover=function(){c.killTimeout()};
d.onmouseout=function(){c.resetTimeout()};

document.getElementsByTagName("body")[0].appendChild(d);

this.iHigh=0;

var c=this;
this.toID=setTimeout(function(){c.clearSuggestions()},this.oP.timeout)
};

_b.AutoSuggest.prototype.changeHighlight=function(a)
{
var b=_b.DOM.gE("as_ul");
if(!b)
return false;

var n;

if(a==40)
n=this.iHigh+1;

else if(a==38)
n=this.iHigh-1;

if(n>b.childNodes.length)
n=b.childNodes.length;

if(n<1)
n=1;

this.setHighlight(n)
};

_b.AutoSuggest.prototype.setHighlight=function(n)
{
var a=_b.DOM.gE("as_ul");

if(!a)
return false;

if(this.iHigh>0)
this.clearHighlight();

this.iHigh=Number(n);

a.childNodes[this.iHigh-1].className="as_highlight";

this.killTimeout()
};

_b.AutoSuggest.prototype.clearHighlight=function()
{
var a=_b.DOM.gE("as_ul");

if(!a)
return false;

if(this.iHigh>0)
{
a.childNodes[this.iHigh-1].className="";
this.iHigh=0
}
};

_b.AutoSuggest.prototype.setHighlightedValue=function()
{
if(this.iHigh)
{
this.sInp=this.fld.value=this.aSug[this.iHigh-1].value;
this.fld.focus();if(this.fld.selectionStart)this.fld.setSelectionRange(this.sInp.length,this.sInp.length);
this.clearSuggestions();if(typeof(this.oP.callback)=="function")this.oP.callback(this.aSug[this.iHigh-1])
}
};

_b.AutoSuggest.prototype.killTimeout=function()
{
clearTimeout(this.toID)
};

_b.AutoSuggest.prototype.resetTimeout=function()
{
clearTimeout(this.toID);
var a=this;
this.toID=setTimeout(function(){a.clearSuggestions()},1000)
};

_b.AutoSuggest.prototype.clearSuggestions=function()
{
this.killTimeout();
var a=_b.DOM.gE(this.idAs);
var b=this;
if(a)
{
var c=new _b.Fader(a,1,0,250,function()
{
_b.DOM.remE(b.idAs)})
}
};

if(typeof(_b.Ajax)=="undefined")
_b.Ajax={};

_b.Ajax=function()
{
this.req={};
this.isIE=false
};

_b.Ajax.prototype.makeRequest=function(a,b,c,d)
{
if(b!="POST")
b="GET";

this.onComplete=c;
this.onError=d;

var e=this;

if(window.XMLHttpRequest)
{
this.req=new XMLHttpRequest();
this.req.onreadystatechange=function(){e.processReqChange()};
this.req.open("GET",a,true);
this.req.send(null)
}
else if(window.ActiveXObject)
{
this.req=new ActiveXObject("Microsoft.XMLHTTP");
if(this.req)
{
this.req.onreadystatechange=function(){e.processReqChange()};
this.req.open(b,a,true);
this.req.send()
}
}
};

_b.Ajax.prototype.processReqChange=function()
{
if(this.req.readyState==4)
{
if(this.req.status==200)
{
this.onComplete(this.req)
}

else
{
this.onError(this.req.status)
}
}
};

if(typeof(_b.DOM)=="undefined")
_b.DOM={};

_b.DOM.cE=function(b,c,d,e)
{
var f=document.createElement(b);
if(!f)
return 0;

for(var a in c)
f[a]=c[a];

var t=typeof(d);

if(t=="string"&&!e)
f.appendChild(document.createTextNode(d));

else if(t=="string"&&e)
f.innerHTML=d;

else if(t=="object")
f.appendChild(d);
return f
};

_b.DOM.gE=function(e)
{
var t=typeof(e);

if(t=="undefined")
return 0;

else if(t=="string")
{
var a=document.getElementById(e);

if(!a)
return 0;

else if(typeof(a.appendChild)!="undefined")
return a;

else return 0
}

else if(typeof(e.appendChild)!="undefined")
return e;

else return 0
};

_b.DOM.remE=function(a)
{
var e=this.gE(a);

if(!e)
return 0;

else if(e.parentNode.removeChild(e))
return true;

else
return 0
};

_b.DOM.getPos=function(e)
{
var e=this.gE(e);
var a=e;
var b=0;
if(a.offsetParent)
{
while(a.offsetParent)
{
b+=a.offsetLeft;
a=a.offsetParent
}
}

else if(a.x)
b+=a.x;

var a=e;
var c=0;

if(a.offsetParent)
{
while(a.offsetParent)
{
c+=a.offsetTop;
a=a.offsetParent
}
}

else if(a.y)
c+=a.y;

return{x:b,y:c}
};

if(typeof(_b.Fader)=="undefined")
_b.Fader={};

_b.Fader=function(a,b,c,d,e)
{
if(!a)
return 0;

this.e=a;
this.from=b;
this.to=c;
this.cb=e;
this.nDur=d;
this.nInt=50;
this.nTime=0;

var p=this;
this.nID=setInterval(function(){p._fade()},this.nInt)
};

_b.Fader.prototype._fade=function()
{
this.nTime+=this.nInt;
var a=Math.round(this._tween(this.nTime,this.from,this.to,this.nDur)*100);
var b=a/100;

if(this.e.filters)
{
try
{
this.e.filters.item("DXImageTransform.Microsoft.Alpha").opacity=a
}
catch(e)
{
this.e.style.filter='progid:DXImageTransform.Microsoft.Alpha(opacity='+a+')'
}
}

else
{
this.e.style.opacity=b
}

if(this.nTime==this.nDur)
{
clearInterval(this.nID);

if(this.cb!=undefined)
this.cb()
}
};

_b.Fader.prototype._tween=function(t,b,c,d)
{
return b+((c-b)*(t/d))
};
 
Status
Not open for further replies.

Part and Inventory Search

Sponsor

Back
Top