(function(a) { a.fn.extend({ autocomplete: function(b, c) { var d = typeof b == "string"; c = a.extend({}, a.Autocompleter.defaults, { url: d ? b : null, data: d ? null : b, delay: d ? a.Autocompleter.defaults.delay : 10, max: c && !c.scroll ? 10 : 150 }, c); c.highlight = c.highlight || function(e) { return e; }; c.formatMatch = c.formatMatch || c.formatItem; return this.each(function() { new a.Autocompleter(this, c); }); }, result: function(b) { return this.bind("result", b); }, search: function(b) { return this.trigger("search", [b]); }, flushCache: function() { return this.trigger("flushCache"); }, setOptions: function(b) { return this.trigger("setOptions", [b]); }, unautocomplete: function() { return this.trigger("unautocomplete"); } }); a.Autocompleter = function(k, f) { var b = { UP: 38, DOWN: 40, DEL: 46, TAB: 9, RETURN: 13, ESC: 27, COMMA: 188, PAGEUP: 33, PAGEDOWN: 34, BACKSPACE: 8 }; var s = a(k).attr("autocomplete", "off").addClass(f.inputClass); var i; var o = ""; var l = a.Autocompleter.Cache(f); var d = 0; var u; var x = { mouseDownOnSelect: false }; var q = a.Autocompleter.Select(f, k, c, x); var w; a.browser.opera && a(k.form).bind("submit.autocomplete", function() { if (w) { w = false; return false; } }); s.bind((a.browser.opera ? "keypress" : "keydown") + ".autocomplete", function(y) { u = y.keyCode; switch (y.keyCode) { case b.UP: y.preventDefault(); if (q.visible()) { q.prev(); } else { t(0, true); } break; case b.DOWN: y.preventDefault(); if (q.visible()) { q.next(); } else { t(0, true); } break; case b.PAGEUP: y.preventDefault(); if (q.visible()) { q.pageUp(); } else { t(0, true); } break; case b.PAGEDOWN: y.preventDefault(); if (q.visible()) { q.pageDown(); } else { t(0, true); } break; case f.multiple && a.trim(f.multipleSeparator) == "," && b.COMMA: case b.TAB: case b.RETURN: if (c()) { y.preventDefault(); w = true; return false; } break; case b.ESC: q.hide(); break; default: clearTimeout(i); i = setTimeout(t, f.delay); break; } }).focus(function() { d++; }).blur(function() { d = 0; if (!x.mouseDownOnSelect) { r(); } }).click(function() { if (d++ > 1 && !q.visible()) { t(0, true); } }).bind("search", function() { var y = (arguments.length > 1) ? arguments[1] : null; function z(D, C) { var A; if (C && C.length) { for (var B = 0; B < C.length; B++) { if (C[B].result.toLowerCase() == D.toLowerCase()) { A = C[B]; break; } } } if (typeof y == "function") { y(A); } else { s.trigger("result", A && [A.data, A.value]); } } a.each(g(s.val()), function(A, B) { e(B, z, z); }); }).bind("flushCache", function() { l.flush(); }).bind("setOptions", function() { a.extend(f, arguments[1]); if ("data" in arguments[1]) { l.populate(); } }).bind("unautocomplete", function() { q.unbind(); s.unbind(); a(k.form).unbind(".autocomplete"); }); function c() { var z = q.selected(); if (!z) { return false; } var y = z.result; o = y; if (f.multiple) { var A = g(s.val()); if (A.length > 1) { y = A.slice(0, A.length - 1).join(f.multipleSeparator) + f.multipleSeparator + y; } y += f.multipleSeparator; } s.val(y); v(); s.trigger("result", [z.data, z.value]); return true; } function t(A, z) { if (u == b.DEL) { q.hide(); return; } var y = s.val(); if (!z && y == o) { return; } o = y; y = h(y); if (y.length >= f.minChars) { s.addClass(f.loadingClass); if (!f.matchCase) { y = y.toLowerCase(); } e(y, j, v); } else { m(); q.hide(); } } function g(z) { if (!z) { return [""]; } var A = z.split(f.multipleSeparator); var y = []; a.each(A, function(B, C) { if (a.trim(C)) { y[B] = a.trim(C); } }); return y; } function h(y) { if (!f.multiple) { return y; } var z = g(y); return z[z.length - 1]; } function p(y, z) { if (f.autoFill && (h(s.val()).toLowerCase() == y.toLowerCase()) && u != b.BACKSPACE) { s.val(s.val() + z.substring(h(o).length)); a.Autocompleter.Selection(k, o.length, o.length + z.length); } } function r() { clearTimeout(i); i = setTimeout(v, 200); } function v() { var y = q.visible(); q.hide(); clearTimeout(i); m(); if (f.mustMatch) { s.search(function(z) { if (!z) { if (f.multiple) { var A = g(s.val()).slice(0, -1); s.val(A.join(f.multipleSeparator) + (A.length ? f.multipleSeparator : "")); } else { s.val(""); } } }); } if (y) { a.Autocompleter.Selection(k, k.value.length, k.value.length); } } function j(z, y) { if (y && y.length && d) { m(); q.display(y, z); p(z, y[0].value); q.show(); } else { v(); } } function e(z, B, y) { if (!f.matchCase) { z = z.toLowerCase(); } var A = l.load(z); if (A && A.length) { B(z, A); } else { if ((typeof f.url == "string") && (f.url.length > 0)) { var C = { timestamp: +new Date() }; a.each(f.extraParams, function(D, E) { C[D] = typeof E == "function" ? E() : E; }); a.ajax({ mode: "abort", port: "autocomplete" + k.name, dataType: f.dataType, url: f.url, data: a.extend({ q: h(z), limit: f.max }, C), success: function(E) { var D = f.parse && f.parse(E) || n(E); l.add(z, D); B(z, D); } }); } else { q.emptyList(); y(z); } } } function n(B) { var y = []; var A = B.split("\n"); for (var z = 0; z < A.length; z++) { var C = a.trim(A[z]); if (C) { C = C.split("|"); y[y.length] = { data: C, value: C[0], result: f.formatResult && f.formatResult(C, C[0]) || C[0] }; } } return y; } function m() { s.removeClass(f.loadingClass); } }; a.Autocompleter.defaults = { inputClass: "ac_input", resultsClass: "ac_results", loadingClass: "ac_loading", minChars: 1, delay: 400, matchCase: false, matchSubset: true, matchContains: false, cacheLength: 10, max: 100, mustMatch: false, extraParams: {}, selectFirst: true, formatItem: function(b) { return b[0]; }, formatMatch: null, autoFill: false, width: 0, multiple: false, multipleSeparator: ", ", highlight: function(c, b) { return c.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + b.replace(/([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi, "\\$1") + ")(?![^<>]*>)(?![^&;]+;)", "gi"), "<strong>$1</strong>"); }, scroll: true, scrollHeight: 180 }; a.Autocompleter.Cache = function(c) { var f = {}; var d = 0; function h(l, k) { if (!c.matchCase) { l = l.toLowerCase(); } var j = l.indexOf(k); if (c.matchContains == "word") { j = l.toLowerCase().search("\\b" + k.toLowerCase()); } if (j == -1) { return false; } return j == 0 || c.matchContains; } function g(j, i) { if (d > c.cacheLength) { b(); } if (!f[j]) { d++; } f[j] = i; } function e() { if (!c.data) { return false; } var k = {}, j = 0; if (!c.url) { c.cacheLength = 1; } k[""] = []; for (var m = 0, l = c.data.length; m < l; m++) { var p = c.data[m]; p = (typeof p == "string") ? [p] : p; var o = c.formatMatch(p, m + 1, c.data.length); if (o === false) { continue; } var n = o.charAt(0).toLowerCase(); if (!k[n]) { k[n] = []; } var q = { value: o, data: p, result: c.formatResult && c.formatResult(p) || o }; k[n].push(q); if (j++ < c.max) { k[""].push(q); } } a.each(k, function(r, s) { c.cacheLength++; g(r, s); }); } setTimeout(e, 25); function b() { f = {}; d = 0; } return { flush: b, add: g, populate: e, load: function(n) { if (!c.cacheLength || !d) { return null; } if (!c.url && c.matchContains) { var m = []; for (var j in f) { if (j.length > 0) { var o = f[j]; a.each(o, function(p, k) { if (h(k.value, n)) { m.push(k); } }); } } return m; } else { if (f[n]) { return f[n]; } else { if (c.matchSubset) { for (var l = n.length - 1; l >= c.minChars; l--) { var o = f[n.substr(0, l)]; if (o) { var m = []; a.each(o, function(p, k) { if (h(k.value, n)) { m[m.length] = k; } }); return m; } } } } } return null; } }; }; a.Autocompleter.Select = function(e, j, l, p) { var i = { ACTIVE: "ac_over" }; var k, f = -1, r, m = "", s = true, c, o; function n() { if (!s) { return; } c = a("<div/>").hide().addClass(e.resultsClass).css("position", "absolute").appendTo(document.body); o = a("<ul/>").appendTo(c).mouseover(function(t) { if (q(t).nodeName && q(t).nodeName.toUpperCase() == "LI") { f = a("li", o).removeClass(i.ACTIVE).index(q(t)); a(q(t)).addClass(i.ACTIVE); } }).click(function(t) { a(q(t)).addClass(i.ACTIVE); l(); j.focus(); return false; }).mousedown(function() { p.mouseDownOnSelect = true; }).mouseup(function() { p.mouseDownOnSelect = false; }); if (e.width > 0) { c.css("width", e.width); } s = false; } function q(u) { var t = u.target; while (t && t.tagName != "LI") { t = t.parentNode; } if (!t) { return []; } return t; } function h(t) { k.slice(f, f + 1).removeClass(i.ACTIVE); g(t); var v = k.slice(f, f + 1).addClass(i.ACTIVE); if (e.scroll) { var u = 0; k.slice(0, f).each(function() { u += this.offsetHeight; }); if ((u + v[0].offsetHeight - o.scrollTop()) > o[0].clientHeight) { o.scrollTop(u + v[0].offsetHeight - o.innerHeight()); } else { if (u < o.scrollTop()) { o.scrollTop(u); } } } } function g(t) { f += t; if (f < 0) { f = k.size() - 1; } else { if (f >= k.size()) { f = 0; } } } function b(t) { return e.max && e.max < t ? e.max : t; } function d() { o.empty(); var u = b(r.length); for (var v = 0; v < u; v++) { if (!r[v]) { continue; } var w = e.formatItem(r[v].data, v + 1, u, r[v].value, m); if (w === false) { continue; } var t = a("<li/>").html(e.highlight(w, m)).addClass(v % 2 == 0 ? "ac_even" : "ac_odd").appendTo(o)[0]; a.data(t, "ac_data", r[v]); } k = o.find("li"); if (e.selectFirst) { k.slice(0, 1).addClass(i.ACTIVE); f = 0; } if (a.fn.bgiframe) { o.bgiframe(); } } return { display: function(u, t) { n(); r = u; m = t; d(); }, next: function() { h(1); }, prev: function() { h(-1); }, pageUp: function() { if (f != 0 && f - 8 < 0) { h(-f); } else { h(-8); } }, pageDown: function() { if (f != k.size() - 1 && f + 8 > k.size()) { h(k.size() - 1 - f); } else { h(8); } }, hide: function() { c && c.hide(); k && k.removeClass(i.ACTIVE); f = -1; }, visible: function() { return c && c.is(":visible"); }, current: function() { return this.visible() && (k.filter("." + i.ACTIVE)[0] || e.selectFirst && k[0]); }, show: function() { var v = a(j).offset(); c.css({ width: typeof e.width == "string" || e.width > 0 ? e.width : a(j).width(), top: v.top + j.offsetHeight, left: v.left }).show(); if (e.scroll) { o.scrollTop(0); o.css({ maxHeight: e.scrollHeight, overflow: "auto" }); if (a.browser.msie && typeof document.body.style.maxHeight === "undefined") { var t = 0; k.each(function() { t += this.offsetHeight; }); var u = t > e.scrollHeight; o.css("height", u ? e.scrollHeight : t); if (!u) { k.width(o.width() - parseInt(k.css("padding-left")) - parseInt(k.css("padding-right"))); } } } }, selected: function() { var t = k && k.filter("." + i.ACTIVE).removeClass(i.ACTIVE); return t && t.length && a.data(t[0], "ac_data"); }, emptyList: function() { o && o.empty(); }, unbind: function() { c && c.remove(); } }; }; a.Autocompleter.Selection = function(d, e, c) { if (d.createTextRange) { var b = d.createTextRange(); b.collapse(true); b.moveStart("character", e); b.moveEnd("character", c); b.select(); } else { if (d.setSelectionRange) { d.setSelectionRange(e, c); } else { if (d.selectionStart) { d.selectionStart = e; d.selectionEnd = c; } } } d.focus(); }; })(jQuery);
