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