From 144f16a71f7289bb891c52995061aee21e3e08f9 Mon Sep 17 00:00:00 2001 From: Andreas Unterkircher Date: Fri, 28 Mar 2008 17:02:18 +0100 Subject: remove autocomplete and use autosuggest instead Signed-off-by: Andreas Unterkircher --- autosuggest/js/bsn.AutoSuggest_2.1.3.js | 904 +++++++++++++++++++++++++++ autosuggest/js/bsn.AutoSuggest_2.1.3_comp.js | 1 + 2 files changed, 905 insertions(+) create mode 100644 autosuggest/js/bsn.AutoSuggest_2.1.3.js create mode 100644 autosuggest/js/bsn.AutoSuggest_2.1.3_comp.js (limited to 'autosuggest/js') diff --git a/autosuggest/js/bsn.AutoSuggest_2.1.3.js b/autosuggest/js/bsn.AutoSuggest_2.1.3.js new file mode 100644 index 0000000..9ab7c60 --- /dev/null +++ b/autosuggest/js/bsn.AutoSuggest_2.1.3.js @@ -0,0 +1,904 @@ +/** + * author: Timothy Groves - http://www.brandspankingnew.net + * version: 1.2 - 2006-11-17 + * 1.3 - 2006-12-04 + * 2.0 - 2007-02-07 + * 2.1.1 - 2007-04-13 + * 2.1.2 - 2007-07-07 + * 2.1.3 - 2007-07-19 + * + */ + + +if (typeof(bsn) == "undefined") + _b = bsn = {}; + + +if (typeof(_b.Autosuggest) == "undefined") + _b.Autosuggest = {}; +else + alert("Autosuggest is already set!"); + + + + + + + + + + + + +_b.AutoSuggest = function (id, param) +{ + // no DOM - give up! + // + if (!document.getElementById) + return 0; + + + + + // get field via DOM + // + this.fld = _b.DOM.gE(id); + + if (!this.fld) + return 0; + + + + + // init variables + // + this.sInp = ""; + this.nInpC = 0; + this.aSug = []; + this.iHigh = 0; + + + + + // parameters object + // + this.oP = param ? param : {}; + + // defaults + // + 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]; + } + + + // set keyup handler for field + // and prevent autocomplete from client + // + var p = this; + + // NOTE: not using addEventListener because UpArrow fired twice in Safari + //_b.DOM.addEvent( this.fld, 'keyup', function(ev){ return pointer.onKeyPress(ev); } ); + + this.fld.onkeypress = function(ev){ return p.onKeyPress(ev); }; + this.fld.onkeyup = function(ev){ return p.onKeyUp(ev); }; + + this.fld.setAttribute("autocomplete","off"); +}; + + + + + + + + + + + + + + + + +_b.AutoSuggest.prototype.onKeyPress = function(ev) +{ + + var key = (window.event) ? window.event.keyCode : ev.keyCode; + + + + // set responses to keydown events in the field + // this allows the user to use the arrow keys to scroll through the results + // ESCAPE clears the list + // TAB sets the current highlighted value + // + var RETURN = 13; + var TAB = 9; + var ESC = 27; + + var bubble = 1; + + switch(key) + { + case RETURN: + this.setHighlightedValue(); + bubble = 0; + break; + + case ESC: + this.clearSuggestions(); + break; + } + + return bubble; +}; + + + +_b.AutoSuggest.prototype.onKeyUp = function(ev) +{ + var key = (window.event) ? window.event.keyCode : ev.keyCode; + + + + // set responses to keydown events in the field + // this allows the user to use the arrow keys to scroll through the results + // ESCAPE clears the list + // TAB sets the current highlighted value + // + + var ARRUP = 38; + var ARRDN = 40; + + var bubble = 1; + + switch(key) + { + + + case ARRUP: + this.changeHighlight(key); + bubble = 0; + break; + + + case ARRDN: + this.changeHighlight(key); + bubble = 0; + break; + + + default: + this.getSuggestions(this.fld.value); + } + + return bubble; + + +}; + + + + + + + + +_b.AutoSuggest.prototype.getSuggestions = function (val) +{ + + // if input stays the same, do nothing + // + if (val == this.sInp) + return 0; + + + // kill list + // + _b.DOM.remE(this.idAs); + + + this.sInp = val; + + + // input length is less than the min required to trigger a request + // do nothing + // + if (val.length < this.oP.minchars) + { + this.aSug = []; + this.nInpC = val.length; + return 0; + } + + + + + var ol = this.nInpC; // old length + this.nInpC = val.length ? val.length : 0; + + + + // if caching enabled, and user is typing (ie. length of input is increasing) + // filter results out of aSuggestions from last request + // + var l = this.aSug.length; + if (this.nInpC > ol && l && l" + val.substring(st, st+this.sInp.length) + "" + val.substring(st+this.sInp.length); + + + var span = _b.DOM.cE("span", {}, output, true); + if (arr[i].info != "") + { + var br = _b.DOM.cE("br", {}); + span.appendChild(br); + var small = _b.DOM.cE("small", {}, arr[i].info); + span.appendChild(small); + } + + var a = _b.DOM.cE("a", { href:"#" }); + + var tl = _b.DOM.cE("span", {className:"tl"}, " "); + var tr = _b.DOM.cE("span", {className:"tr"}, " "); + a.appendChild(tl); + a.appendChild(tr); + + a.appendChild(span); + + a.name = i+1; + a.onclick = function () { pointer.setHighlightedValue(); return false; }; + a.onmouseover = function () { pointer.setHighlight(this.name); }; + + var li = _b.DOM.cE( "li", {}, a ); + + ul.appendChild( li ); + } + + + // no results + // + if (arr.length == 0 && this.oP.shownoresults) + { + var li = _b.DOM.cE( "li", {className:"as_warning"}, this.oP.noresults ); + ul.appendChild( li ); + } + + + div.appendChild( ul ); + + + var fcorner = _b.DOM.cE("div", {className:"as_corner"}); + var fbar = _b.DOM.cE("div", {className:"as_bar"}); + var footer = _b.DOM.cE("div", {className:"as_footer"}); + footer.appendChild(fcorner); + footer.appendChild(fbar); + div.appendChild(footer); + + + + // get position of target textfield + // position holding div below it + // set width of holding div to width of field + // + var pos = _b.DOM.getPos(this.fld); + + div.style.left = pos.x + "px"; + div.style.top = ( pos.y + this.fld.offsetHeight + this.oP.offsety ) + "px"; + div.style.width = this.fld.offsetWidth + "px"; + + + + // set mouseover functions for div + // when mouse pointer leaves div, set a timeout to remove the list after an interval + // when mouse enters div, kill the timeout so the list won't be removed + // + div.onmouseover = function(){ pointer.killTimeout() }; + div.onmouseout = function(){ pointer.resetTimeout() }; + + + // add DIV to document + // + document.getElementsByTagName("body")[0].appendChild(div); + + + + // currently no item is highlighted + // + this.iHigh = 0; + + + + + + + // remove list after an interval + // + var pointer = this; + this.toID = setTimeout(function () { pointer.clearSuggestions() }, this.oP.timeout); +}; + + + + + + + + + + + + + + + +_b.AutoSuggest.prototype.changeHighlight = function(key) +{ + var list = _b.DOM.gE("as_ul"); + if (!list) + return false; + + var n; + + if (key == 40) + n = this.iHigh + 1; + else if (key == 38) + n = this.iHigh - 1; + + + if (n > list.childNodes.length) + n = list.childNodes.length; + if (n < 1) + n = 1; + + + this.setHighlight(n); +}; + + + +_b.AutoSuggest.prototype.setHighlight = function(n) +{ + var list = _b.DOM.gE("as_ul"); + if (!list) + return false; + + if (this.iHigh > 0) + this.clearHighlight(); + + this.iHigh = Number(n); + + list.childNodes[this.iHigh-1].className = "as_highlight"; + + + this.killTimeout(); +}; + + +_b.AutoSuggest.prototype.clearHighlight = function() +{ + var list = _b.DOM.gE("as_ul"); + if (!list) + return false; + + if (this.iHigh > 0) + { + list.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; + + // move cursor to end of input (safari) + // + this.fld.focus(); + if (this.fld.selectionStart) + this.fld.setSelectionRange(this.sInp.length, this.sInp.length); + + + this.clearSuggestions(); + + // pass selected object to callback function, if exists + // + 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 pointer = this; + this.toID = setTimeout(function () { pointer.clearSuggestions() }, 1000); +}; + + + + + + + +_b.AutoSuggest.prototype.clearSuggestions = function () +{ + + this.killTimeout(); + + var ele = _b.DOM.gE(this.idAs); + var pointer = this; + if (ele) + { + var fade = new _b.Fader(ele,1,0,250,function () { _b.DOM.remE(pointer.idAs) }); + } +}; + + + + + + + + + + +// AJAX PROTOTYPE _____________________________________________ + + +if (typeof(_b.Ajax) == "undefined") + _b.Ajax = {}; + + + +_b.Ajax = function () +{ + this.req = {}; + this.isIE = false; +}; + + + +_b.Ajax.prototype.makeRequest = function (url, meth, onComp, onErr) +{ + + if (meth != "POST") + meth = "GET"; + + this.onComplete = onComp; + this.onError = onErr; + + var pointer = this; + + // branch for native XMLHttpRequest object + if (window.XMLHttpRequest) + { + this.req = new XMLHttpRequest(); + this.req.onreadystatechange = function () { pointer.processReqChange() }; + this.req.open("GET", url, true); // + this.req.send(null); + // branch for IE/Windows ActiveX version + } + else if (window.ActiveXObject) + { + this.req = new ActiveXObject("Microsoft.XMLHTTP"); + if (this.req) + { + this.req.onreadystatechange = function () { pointer.processReqChange() }; + this.req.open(meth, url, true); + this.req.send(); + } + } +}; + + +_b.Ajax.prototype.processReqChange = function() +{ + + // only if req shows "loaded" + if (this.req.readyState == 4) { + // only if "OK" + if (this.req.status == 200) + { + this.onComplete( this.req ); + } else { + this.onError( this.req.status ); + } + } +}; + + + + + + + + + + +// DOM PROTOTYPE _____________________________________________ + + +if (typeof(_b.DOM) == "undefined") + _b.DOM = {}; + + + +/* create element */ +_b.DOM.cE = function ( type, attr, cont, html ) +{ + var ne = document.createElement( type ); + if (!ne) + return 0; + + for (var a in attr) + ne[a] = attr[a]; + + var t = typeof(cont); + + if (t == "string" && !html) + ne.appendChild( document.createTextNode(cont) ); + else if (t == "string" && html) + ne.innerHTML = cont; + else if (t == "object") + ne.appendChild( cont ); + + return ne; +}; + + + +/* get element */ +_b.DOM.gE = function ( e ) +{ + var t=typeof(e); + if (t == "undefined") + return 0; + else if (t == "string") + { + var re = document.getElementById( e ); + if (!re) + return 0; + else if (typeof(re.appendChild) != "undefined" ) + return re; + else + return 0; + } + else if (typeof(e.appendChild) != "undefined") + return e; + else + return 0; +}; + + + +/* remove element */ +_b.DOM.remE = function ( ele ) +{ + var e = this.gE(ele); + + if (!e) + return 0; + else if (e.parentNode.removeChild(e)) + return true; + else + return 0; +}; + + + +/* get position */ +_b.DOM.getPos = function ( e ) +{ + var e = this.gE(e); + + var obj = e; + + var curleft = 0; + if (obj.offsetParent) + { + while (obj.offsetParent) + { + curleft += obj.offsetLeft; + obj = obj.offsetParent; + } + } + else if (obj.x) + curleft += obj.x; + + var obj = e; + + var curtop = 0; + if (obj.offsetParent) + { + while (obj.offsetParent) + { + curtop += obj.offsetTop; + obj = obj.offsetParent; + } + } + else if (obj.y) + curtop += obj.y; + + return {x:curleft, y:curtop}; +}; + + + + + + + + + + +// FADER PROTOTYPE _____________________________________________ + + + +if (typeof(_b.Fader) == "undefined") + _b.Fader = {}; + + + + + +_b.Fader = function (ele, from, to, fadetime, callback) +{ + if (!ele) + return 0; + + this.e = ele; + + this.from = from; + this.to = to; + + this.cb = callback; + + this.nDur = fadetime; + + 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 ieop = Math.round( this._tween(this.nTime, this.from, this.to, this.nDur) * 100 ); + var op = ieop / 100; + + if (this.e.filters) // internet explorer + { + try + { + this.e.filters.item("DXImageTransform.Microsoft.Alpha").opacity = ieop; + } catch (e) { + // If it is not set initially, the browser will throw an error. This will set it if it is not set yet. + this.e.style.filter = 'progid:DXImageTransform.Microsoft.Alpha(opacity='+ieop+')'; + } + } + else // other browsers + { + this.e.style.opacity = op; + } + + + 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) ); +}; \ No newline at end of file diff --git a/autosuggest/js/bsn.AutoSuggest_2.1.3_comp.js b/autosuggest/js/bsn.AutoSuggest_2.1.3_comp.js new file mode 100644 index 0000000..bf89be6 --- /dev/null +++ b/autosuggest/js/bsn.AutoSuggest_2.1.3_comp.js @@ -0,0 +1 @@ +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.lengthb&&l&&l"+j.substring(k,k+this.sInp.length)+""+j.substring(k+this.sInp.length);var m=_b.DOM.cE("span",{},l,true);if(b[i].info!=""){var n=_b.DOM.cE("br",{});m.appendChild(n);var o=_b.DOM.cE("small",{},b[i].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))}; \ No newline at end of file -- cgit v1.2.3-18-g5258