/* Script: TextboxList.Autocomplete.Binary.js TextboxList Autocomplete binary search extension Authors: Guillermo Rauch Note: TextboxList is not priceless for commercial use. See Purchase to remove this message. */ $.TextboxList.Autocomplete.Methods.binary = { filter: function(values, search, insensitive, max){ var method = insensitive ? 'toLowerCase' : 'toString', low = 0, high = values.length - 1, lastTry; search = search[method](); while (high >= low){ var mid = parseInt((low + high) / 2); var curr = values[mid][1].substr(0, search.length)[method](); var result = ((search == curr) ? 0 : ((search > curr) ? 1 : -1)); if (result < 0) { high = mid - 1; continue; } if (result > 0) { low = mid + 1; continue; } if (result === 0) break; } if (high < low) return []; var newvalues = [values[mid]], checkNext = true, checkPrev = true, v1, v2; for (var i = 1; i <= values.length - mid; i++){ if (newvalues.length === max) break; if (checkNext) v1 = values[mid + i] ? values[mid + i][1].substr(0, search.length)[method]() : false; if (checkPrev) v2 = values[mid - i] ? values[mid - i][1].substr(0, search.length)[method]() : false; checkNext = checkPrev = false; if (v1 === search) { newvalues.push(values[mid + i]); checkNext = true; } if (v2 === search) { newvalues.unshift(values[mid - i]); checkPrev = true; } if (! (checkNext || checkPrev)) break; } return newvalues; }, highlight: function(element, search, insensitive, klass){ var regex = new RegExp('(<[^>]*>)|(\\b'+ search.replace(/([-.*+?^${}()|[\]\/\\])/g,"\\$1") +')', insensitive ? 'ig' : 'g'); return element.html(element.html().replace(regex, function(a, b, c, d){ return (a.charAt(0) == '<') ? a : '' + c + ''; })); } };