/** * author: Timothy Groves - http://www.brandspankingnew.net * version: 1.2 - 2006-11-17 * 1.3 - 2006-12-04 * 2.0 - 2007-02-07 * */ var useBSNns; if (useBSNns) { if (typeof(bsn) == "undefined") bsn = {} _bsn = bsn; } else { _bsn = this; } if (typeof(_bsn.Autosuggest) == "undefined") _bsn.Autosuggest = {} function get_html_translation_table (table, quote_style) { // Returns the internal translation table used by htmlspecialchars and htmlentities // // version: 1003.2411 // discuss at: http://phpjs.org/functions/get_html_translation_table // + original by: Philip Peterson // + revised by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) // + bugfixed by: noname // + bugfixed by: Alex // + bugfixed by: Marco // + bugfixed by: madipta // + improved by: KELAN // + improved by: Brett Zamir (http://brett-zamir.me) // + bugfixed by: Brett Zamir (http://brett-zamir.me) // + input by: Frank Forte // + bugfixed by: T.Wild // + input by: Ratheous // % note: It has been decided that we're not going to add global // % note: dependencies to php.js, meaning the constants are not // % note: real constants, but strings instead. Integers are also supported if someone // % note: chooses to create the constants themselves. // * example 1: get_html_translation_table('HTML_SPECIALCHARS'); // * returns 1: {'"': '"', '&': '&', '<': '<', '>': '>'} var entities = {}, hash_map = {}, decimal = 0, symbol = ''; var constMappingTable = {}, constMappingQuoteStyle = {}; var useTable = {}, useQuoteStyle = {}; // Translate arguments constMappingTable[0] = 'HTML_SPECIALCHARS'; constMappingTable[1] = 'HTML_ENTITIES'; constMappingQuoteStyle[0] = 'ENT_NOQUOTES'; constMappingQuoteStyle[2] = 'ENT_COMPAT'; constMappingQuoteStyle[3] = 'ENT_QUOTES'; useTable = !isNaN(table) ? constMappingTable[table] : table ? table.toUpperCase() : 'HTML_SPECIALCHARS'; useQuoteStyle = !isNaN(quote_style) ? constMappingQuoteStyle[quote_style] : quote_style ? quote_style.toUpperCase() : 'ENT_COMPAT'; if (useTable !== 'HTML_SPECIALCHARS' && useTable !== 'HTML_ENTITIES') { throw new Error("Table: "+useTable+' not supported'); // return false; } entities['38'] = '&'; if (useTable === 'HTML_ENTITIES') { entities['160'] = ' '; entities['161'] = '¡'; entities['162'] = '¢'; entities['163'] = '£'; entities['164'] = '¤'; entities['165'] = '¥'; entities['166'] = '¦'; entities['167'] = '§'; entities['168'] = '¨'; entities['169'] = '©'; entities['170'] = 'ª'; entities['171'] = '«'; entities['172'] = '¬'; entities['173'] = '­'; entities['174'] = '®'; entities['175'] = '¯'; entities['176'] = '°'; entities['177'] = '±'; entities['178'] = '²'; entities['179'] = '³'; entities['180'] = '´'; entities['181'] = 'µ'; entities['182'] = '¶'; entities['183'] = '·'; entities['184'] = '¸'; entities['185'] = '¹'; entities['186'] = 'º'; entities['187'] = '»'; entities['188'] = '¼'; entities['189'] = '½'; entities['190'] = '¾'; entities['191'] = '¿'; entities['192'] = 'À'; entities['193'] = 'Á'; entities['194'] = 'Â'; entities['195'] = 'Ã'; entities['196'] = 'Ä'; entities['197'] = 'Å'; entities['198'] = 'Æ'; entities['199'] = 'Ç'; entities['200'] = 'È'; entities['201'] = 'É'; entities['202'] = 'Ê'; entities['203'] = 'Ë'; entities['204'] = 'Ì'; entities['205'] = 'Í'; entities['206'] = 'Î'; entities['207'] = 'Ï'; entities['208'] = 'Ð'; entities['209'] = 'Ñ'; entities['210'] = 'Ò'; entities['211'] = 'Ó'; entities['212'] = 'Ô'; entities['213'] = 'Õ'; entities['214'] = 'Ö'; entities['215'] = '×'; entities['216'] = 'Ø'; entities['217'] = 'Ù'; entities['218'] = 'Ú'; entities['219'] = 'Û'; entities['220'] = 'Ü'; entities['221'] = 'Ý'; entities['222'] = 'Þ'; entities['223'] = 'ß'; entities['224'] = 'à'; entities['225'] = 'á'; entities['226'] = 'â'; entities['227'] = 'ã'; entities['228'] = 'ä'; entities['229'] = 'å'; entities['230'] = 'æ'; entities['231'] = 'ç'; entities['232'] = 'è'; entities['233'] = 'é'; entities['234'] = 'ê'; entities['235'] = 'ë'; entities['236'] = 'ì'; entities['237'] = 'í'; entities['238'] = 'î'; entities['239'] = 'ï'; entities['240'] = 'ð'; entities['241'] = 'ñ'; entities['242'] = 'ò'; entities['243'] = 'ó'; entities['244'] = 'ô'; entities['245'] = 'õ'; entities['246'] = 'ö'; entities['247'] = '÷'; entities['248'] = 'ø'; entities['249'] = 'ù'; entities['250'] = 'ú'; entities['251'] = 'û'; entities['252'] = 'ü'; entities['253'] = 'ý'; entities['254'] = 'þ'; entities['255'] = 'ÿ'; } if (useQuoteStyle !== 'ENT_NOQUOTES') { entities['34'] = '"'; } if (useQuoteStyle === 'ENT_QUOTES') { entities['39'] = '''; } entities['60'] = '<'; entities['62'] = '>'; // ascii decimals to real symbols for (decimal in entities) { symbol = String.fromCharCode(decimal); hash_map[symbol] = entities[decimal]; } return hash_map;} function html_entity_decode (string, quote_style) { // Convert all HTML entities to their applicable characters // // version: 1003.2411 // discuss at: http://phpjs.org/functions/html_entity_decode // + original by: john (http://www.jd-tech.net) // + input by: ger // + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) // + revised by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) // + bugfixed by: Onno Marsman // + improved by: marc andreu // + revised by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) // + input by: Ratheous // + bugfixed by: Brett Zamir (http://brett-zamir.me) // + input by: Nick Kolosov (http://sammy.ru) // + bugfixed by: Fox // - depends on: get_html_translation_table // * example 1: html_entity_decode('Kevin & van Zonneveld'); // * returns 1: 'Kevin & van Zonneveld' // * example 2: html_entity_decode('&lt;'); // * returns 2: '<' var hash_map = {}, symbol = '', tmp_str = '', entity = ''; tmp_str = string.toString(); if (false === (hash_map = this.get_html_translation_table('HTML_ENTITIES', quote_style))) { return false; } // fix & problem // http://phpjs.org/functions/get_html_translation_table:416#comment_97660 delete(hash_map['&']); hash_map['&'] = '&'; for (symbol in hash_map) { entity = hash_map[symbol]; tmp_str = tmp_str.split(entity).join(symbol); } tmp_str = tmp_str.split(''').join("'"); return tmp_str;} _bsn.AutoSuggest = function (fldID, param) { // no DOM - give up! // if (!document.getElementById) return false; // get field via DOM // this.fld = _bsn.DOM.getElement(fldID); if (!this.fld) return false; // init variables // this.sInput = ""; this.nInputChars = 0; this.aSuggestions = []; this.iHighlighted = 0; // parameters object // this.oP = (param) ? param : {}; // defaults // if (!this.oP.minchars) this.oP.minchars = 1; if (!this.oP.method) this.oP.meth = "get"; if (!this.oP.varname) this.oP.varname = "input"; if (!this.oP.className) this.oP.className = "autosuggest"; if (!this.oP.timeout) this.oP.timeout = 2500; if (!this.oP.delay) this.oP.delay = 500; if (!this.oP.offsety) this.oP.offsety = -5; if (!this.oP.shownoresults) this.oP.shownoresults = false; if (!this.oP.noresults) this.oP.noresults = "Inga resultat!"; if (!this.oP.maxheight && this.oP.maxheight !== 0) this.oP.maxheight = 250; if (!this.oP.cache && this.oP.cache != false) this.oP.cache = false; // set keyup handler for field // and prevent autocomplete from client // var pointer = this; // NOTE: not using addEventListener because UpArrow fired twice in Safari //_bsn.DOM.addEvent( this.fld, 'keyup', function(ev){ return pointer.onKeyPress(ev); } ); this.fld.onkeypress = function(ev){ return pointer.onKeyPress(ev); } this.fld.onkeyup = function(ev){ return pointer.onKeyUp(ev); } this.fld.setAttribute("autocomplete","off"); } _bsn.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 = true; switch(key) { case RETURN: this.setHighlightedValue(); bubble = false; break; case ESC: this.clearSuggestions(); break; } return bubble; } _bsn.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 = true; switch(key) { case ARRUP: this.changeHighlight(key); bubble = false; break; case ARRDN: this.changeHighlight(key); bubble = false; break; default: this.getSuggestions(this.fld.value); } return bubble; } _bsn.AutoSuggest.prototype.getSuggestions = function (val) { // if input stays the same, do nothing // if (val == this.sInput) return false; // input length is less than the min required to trigger a request // reset input string // do nothing // if (val.length < this.oP.minchars) { this.sInput = ""; return false; } // if caching enabled, and user is typing (ie. length of input is increasing) // filter results out of aSuggestions from last request // if (val.length>this.nInputChars && this.aSuggestions.length && this.oP.cache) { var arr = []; for (var i=0;i" + output.substring(st, st+ searchWords[t].length) + "" + output.substring(st+ searchWords[t].length); } //st = artnr_trimmed.toLowerCase().indexOf( searchWords[t].toLowerCase() ); st=-1; //if(st!=-1) { output2 = text_artnr + ' ' + artnr; if(manu_artnr != null) { output2 += ', ' + text_manuartnr + ' ' + manu_artnr; } //output2 = output2.substring(0,st) + "" + output2.substring(st, st+ searchWords[t].length) + "" + output2.substring(st+ searchWords[t].length); } if(arr[i].id==0) { output = "" + val + ""; } } //output2 = output2.replace('!',artnr).replace('*',manuartnr); //output2 = output2.replace('##',text_artnr).replace('**',text_manuartnr); position=""; /* if(val=='KATEGORIER' || val=='CATEGORIES') { position='right'; } if(position=='right') { position='left'; } else { position='right'; } if(val=='VARUM?RKEN' || val=='BRANDS' || i==arr.length-1) { position=''; } */ var span = _bsn.DOM.createElement("span", {}, output, true); if (arr[i].info != "") { var br = _bsn.DOM.createElement("br", {}); span.appendChild(br); var small = _bsn.DOM.createElement("small", {}, output2, true); span.appendChild(small); } var a; if(arr[i].id == 0) { a = _bsn.DOM.createElement("div", { }); } else { a = _bsn.DOM.createElement("a", { href:"javascript:ajaxSearch('" + arr[i].id + "')" }); } var tl = _bsn.DOM.createElement("span", {className:"tl"}, " "); var tr = _bsn.DOM.createElement("span", {className:"tr"}, " "); a.appendChild(tl); a.appendChild(tr); a.appendChild(span); a.name = i+1; tester=val.toLowerCase(); if(tester.indexOf('strong>')>0) { a.onclick = function () { pointer.setHighlightedValue(); return false; } a.onmouseover = function () { pointer.setHighlight(this.name,0); } } var li = _bsn.DOM.createElement( "li", {}, a ); if(position!='') { var li = _bsn.DOM.createElement( "li", {className: position + "_li"}, a ); } ul.appendChild( li ); } // no results // if (arr.length == 0) { var li = _bsn.DOM.createElement( "li", {className:"as_warning"}, this.oP.noresults ); ul.appendChild( li ); } div.appendChild( ul ); var fcorner = _bsn.DOM.createElement("div", {className:"as_corner"}); var fbar = _bsn.DOM.createElement("div", {className:"as_bar"}); var footer = _bsn.DOM.createElement("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 = _bsn.DOM.getPos(this.fld); div.style.left = (pos.x-200) + "px"; div.style.top = ( pos.y + this.fld.offsetHeight + this.oP.offsety + 10) + "px"; div.style.width = (this.fld.offsetWidth+200) + "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.iHighlighted = 0; // remove list after an interval // var pointer = this; this.toID = setTimeout(function () { pointer.clearSuggestions() }, this.oP.timeout); } _bsn.AutoSuggest.prototype.changeHighlight = function(key) { var list = _bsn.DOM.getElement("as_ul"); if (!list) return false; var n; if (key == 40) n = this.iHighlighted + 1; else if (key == 38) n = this.iHighlighted - 1; if (n > list.childNodes.length) n = list.childNodes.length; if (n < 1) n = 1; this.setHighlight(n,key); } _bsn.AutoSuggest.prototype.setHighlight = function(n,key) { var list = _bsn.DOM.getElement("as_ul"); if (!list) return false; if (this.iHighlighted > 0) this.clearHighlight(); var mums = list.childNodes[n-1].innerHTML.toLowerCase(); ; if(mums.indexOf('strong>')>0) { if(key==40) { n++; } else { n--; } } this.iHighlighted = Number(n); list.childNodes[this.iHighlighted-1].className = "as_highlight"; this.killTimeout(); } _bsn.AutoSuggest.prototype.clearHighlight = function() { var list = _bsn.DOM.getElement("as_ul"); if (!list) return false; if (this.iHighlighted > 0) { list.childNodes[this.iHighlighted-1].className = ""; this.iHighlighted = 0; } } _bsn.AutoSuggest.prototype.setHighlightedValue = function () { if (this.iHighlighted) { this.sInput = this.fld.value = this.aSuggestions[ this.iHighlighted-1 ].value; // move cursor to end of input (safari) // this.fld.focus(); if (this.fld.selectionStart) this.fld.setSelectionRange(this.sInput.length, this.sInput.length); this.clearSuggestions(); // pass selected object to callback function, if exists // if (typeof(this.oP.callback) == "function") this.oP.callback( this.aSuggestions[this.iHighlighted-1] ); } else { moduleSearch(); } } _bsn.AutoSuggest.prototype.killTimeout = function() { clearTimeout(this.toID); } _bsn.AutoSuggest.prototype.resetTimeout = function() { clearTimeout(this.toID); var pointer = this; this.toID = setTimeout(function () { pointer.clearSuggestions() }, 1000); } _bsn.AutoSuggest.prototype.clearSuggestions = function () { this.killTimeout(); var ele = _bsn.DOM.getElement(this.idAs); var pointer = this; if (ele) { var fade = new _bsn.Fader(ele,1,0,250,function () { _bsn.DOM.removeElement(pointer.idAs) }); } } // AJAX PROTOTYPE _____________________________________________ if (typeof(_bsn.Ajax) == "undefined") _bsn.Ajax = {} _bsn.Ajax = function () { this.req = {}; this.isIE = false; } _bsn.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(); } } } _bsn.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(_bsn.DOM) == "undefined") _bsn.DOM = {} _bsn.DOM.createElement = function ( type, attr, cont, html ) { var ne = document.createElement( type ); if (!ne) return false; for (var a in attr) ne[a] = attr[a]; if (typeof(cont) == "string" && !html) ne.appendChild( document.createTextNode(cont) ); else if (typeof(cont) == "string" && html) ne.innerHTML = cont; else if (typeof(cont) == "object") ne.appendChild( cont ); return ne; } _bsn.DOM.clearElement = function ( id ) { var ele = this.getElement( id ); if (!ele) return false; while (ele.childNodes.length) ele.removeChild( ele.childNodes[0] ); return true; } _bsn.DOM.removeElement = function ( ele ) { var e = this.getElement(ele); if (!e) return false; else if (e.parentNode.removeChild(e)) return true; else return false; } _bsn.DOM.replaceContent = function ( id, cont, html ) { var ele = this.getElement( id ); if (!ele) return false; this.clearElement( ele ); if (typeof(cont) == "string" && !html) ele.appendChild( document.createTextNode(cont) ); else if (typeof(cont) == "string" && html) ele.innerHTML = cont; else if (typeof(cont) == "object") ele.appendChild( cont ); } _bsn.DOM.getElement = function ( ele ) { if (typeof(ele) == "undefined") { return false; } else if (typeof(ele) == "string") { var re = document.getElementById( ele ); if (!re) return false; else if (typeof(re.appendChild) != "undefined" ) { return re; } else { return false; } } else if (typeof(ele.appendChild) != "undefined") return ele; else return false; } _bsn.DOM.appendChildren = function ( id, arr ) { var ele = this.getElement( id ); if (!ele) return false; if (typeof(arr) != "object") return false; for (var i=0;i