(function(a) {
	a.jScrollPane = {
		active: []
	};
	a.fn.jScrollPane = function(c) {
		c = a.extend({},
		a.fn.jScrollPane.defaults, c);
		var b = function() {
			return false;
		};
		return this.each(function() {
			var t = a(this);
			var E = this;
			var an = 0;
			var L;
			var ao;
			var r;
			var ad = c.topCapHeight;
			var j;
			if (a(this).parent().is(".jScrollPaneContainer")) {
				j = a(this).parent();
				an = c.maintainPosition ? t.position().top : 0;
				var q = a(this).parent();
				L = q.innerWidth();
				ao = q.outerHeight();
				a(">.jScrollPaneTrack, >.jScrollArrowUp, >.jScrollArrowDown, >.jScrollCap", q).remove();
				t.css({
					top: 0
				});
			} else {
				t.data("originalStyleTag", t.attr("style"));
				t.css("overflow", "hidden");
				this.originalPadding = t.css("paddingTop") + " " + t.css("paddingRight") + " " + t.css("paddingBottom") + " " + t.css("paddingLeft");
				this.originalSidePaddingTotal = (parseInt(t.css("paddingLeft")) || 0) + (parseInt(t.css("paddingRight")) || 0);
				L = t.innerWidth();
				ao = t.innerHeight();
				j = a("<div></div>").attr({
					className: "jScrollPaneContainer"
				}).css({
					height: ao + "px",
					width: L + "px"
				});
				if (c.enableKeyboardNavigation) {
					j.attr("tabindex", c.tabIndex);
				}
				t.wrap(j);
				j = t.parent();
				a(document).bind("emchange", function(ap, aq, p) {
					t.jScrollPane(c);
				});
			}
			r = ao;
			if (c.reinitialiseOnImageLoad) {
				var s = a.data(E, "jScrollPaneImagesToLoad") || a("img", t);
				var i = [];
				if (s.length) {
					s.each(function(p, ap) {
						a(this).bind("load readystatechange", function() {
							if (a.inArray(p, i) == -1) {
								i.push(ap);
								s = a.grep(s, function(at, ar) {
									return at != ap;
								});
								a.data(E, "jScrollPaneImagesToLoad", s);
								var aq = a.extend(c, {
									reinitialiseOnImageLoad: false
								});
								t.jScrollPane(aq);
							}
						}).each(function(aq, ar) {
							if (this.complete || this.complete === undefined) {
								this.src = this.src;
							}
						});
					});
				}
			}
			var Y = this.originalSidePaddingTotal;
			var aj = L - c.scrollbarWidth - c.scrollbarMargin - Y;
			var U = {
				height: "auto",
				width: aj + "px"
			};
			if (c.scrollbarOnLeft) {
				U.paddingLeft = c.scrollbarMargin + c.scrollbarWidth + "px";
			} else {
				U.paddingRight = c.scrollbarMargin + "px";
			}
			t.css(U);
			var W = t.outerHeight();
			var R = ao / W;
			var V = R < 0.99;
			j[V ? "addClass" : "removeClass"]("jScrollPaneScrollable");
			if (V) {
				j.append(a("<div></div>").addClass("jScrollCap jScrollCapTop").css({
					height: c.topCapHeight
				}), a("<div></div>").attr({
					className: "jScrollPaneTrack"
				}).css({
					width: c.scrollbarWidth + "px"
				}).append(a("<div></div>").attr({
					className: "jScrollPaneDrag"
				}).css({
					width: c.scrollbarWidth + "px"
				}).append(a("<div></div>").attr({
					className: "jScrollPaneDragTop"
				}).css({
					width: c.scrollbarWidth + "px"
				}), a("<div></div>").attr({
					className: "jScrollPaneDragBottom"
				}).css({
					width: c.scrollbarWidth + "px"
				}))), a("<div></div>").addClass("jScrollCap jScrollCapBottom").css({
					height: c.bottomCapHeight
				}));
				var ak = a(">.jScrollPaneTrack", j);
				var u = a(">.jScrollPaneTrack .jScrollPaneDrag", j);
				var am;
				var g = [];
				var aa;
				var S = function() {
					if (aa > 4 || aa % 4 == 0) {
						ai(af + am * I);
					}
					aa++;
				};
				if (c.enableKeyboardNavigation) {
					j.bind("keydown.jscrollpane", function(p) {
						switch (p.keyCode) {
						case 38:
							am = -1;
							aa = 0;
							S();
							g[g.length] = setInterval(S, 100);
							return false;
						case 40:
							am = 1;
							aa = 0;
							S();
							g[g.length] = setInterval(S, 100);
							return false;
						case 33:
						case 34:
							return false;
						default:
						}
					}).bind("keyup.jscrollpane", function(ap) {
						if (ap.keyCode == 38 || ap.keyCode == 40) {
							for (var p = 0; p < g.length; p++) {
								clearInterval(g[p]);
							}
							return false;
						}
					});
				}
				if (c.showArrows) {
					var P;
					var y;
					var o = function(p) {
						a("html").unbind("mouseup", o);
						P.removeClass("jScrollActiveArrowButton");
						clearInterval(y);
					};
					var H = function() {
						a("html").bind("mouseup", o);
						P.addClass("jScrollActiveArrowButton");
						aa = 0;
						S();
						y = setInterval(S, 100);
					};
					j.append(a("<a></a>").attr({
						href: "javascript:;",
						className: "jScrollArrowUp",
						tabindex: -1
					}).css({
						width: c.scrollbarWidth + "px",
						top: c.topCapHeight + "px"
					}).html("Scroll up").bind("mousedown", function() {
						P = a(this);
						am = -1;
						H();
						this.blur();
						return false;
					}).bind("click", b), a("<a></a>").attr({
						href: "javascript:;",
						className: "jScrollArrowDown",
						tabindex: -1
					}).css({
						width: c.scrollbarWidth + "px",
						bottom: c.bottomCapHeight + "px"
					}).html("Scroll down").bind("mousedown", function() {
						P = a(this);
						am = 1;
						H();
						this.blur();
						return false;
					}).bind("click", b));
					var v = a(">.jScrollArrowUp", j);
					var m = a(">.jScrollArrowDown", j);
				}
				if (c.arrowSize) {
					r = ao - c.arrowSize - c.arrowSize;
					ad += c.arrowSize;
				} else {
					if (v) {
						var ab = v.height();
						c.arrowSize = ab;
						r = ao - ab - m.height();
						ad += ab;
					}
				}
				r -= c.topCapHeight + c.bottomCapHeight;
				ak.css({
					height: r + "px",
					top: ad + "px"
				});
				var ag = a(this).css({
					position: "absolute",
					overflow: "visible"
				});
				var d;
				var F;
				var I;
				var af = 0;
				var C = R * ao / 2;
				var G = function(ap, ar) {
					var aq = ar == "X" ? "Left" : "Top";
					return ap["page" + ar] || (ap["client" + ar] + (document.documentElement["scroll" + aq] || document.body["scroll" + aq])) || 0;
				};
				var O = function() {
					return false;
				};
				var ae = function() {
					X();
					d = u.offset(false);
					d.top -= af;
					F = r - u[0].offsetHeight;
					I = 2 * c.wheelSpeed * F / W;
				};
				var e = function(p) {
					ae();
					C = G(p, "Y") - af - d.top;
					a("html").bind("mouseup", z).bind("mousemove", Q);
					if (a.browser.msie) {
						a("html").bind("dragstart", O).bind("selectstart", O);
					}
					return false;
				};
				var z = function() {
					a("html").unbind("mouseup", z).unbind("mousemove", Q);
					C = R * ao / 2;
					if (a.browser.msie) {
						a("html").unbind("dragstart", O).unbind("selectstart", O);
					}
				};
				var ai = function(ap) {
					j.scrollTop(0);
					ap = ap < 0 ? 0 : (ap > F ? F : ap);
					af = ap;
					u.css({
						top: ap + "px"
					});
					var aq = ap / F;
					t.data("jScrollPanePosition", (ao - W) * -aq);
					ag.css({
						top: ((ao - W) * aq) + "px"
					});
					t.trigger("scroll");
					if (c.showArrows) {
						v[ap == 0 ? "addClass" : "removeClass"]("disabled");
						m[ap == F ? "addClass" : "removeClass"]("disabled");
					}
				};
				var Q = function(p) {
					ai(G(p, "Y") - d.top - C);
				};
				var Z = Math.max(Math.min(R * (ao - c.arrowSize * 2), c.dragMaxHeight), c.dragMinHeight);
				u.css({
					height: Z + "px"
				}).bind("mousedown", e);
				var T;
				var w;
				var l;
				var ac = function() {
					if (w > 8 || w % 4 == 0) {
						ai((af - ((af - l) / 2)));
					}
					w++;
				};
				var al = function() {
					clearInterval(T);
					a("html").unbind("mouseup", al).unbind("mousemove", N);
				};
				var N = function(p) {
					l = G(p, "Y") - d.top - C;
				};
				var A = function(p) {
					ae();
					N(p);
					w = 0;
					a("html").bind("mouseup", al).bind("mousemove", N);
					T = setInterval(ac, 100);
					ac();
					return false;
				};
				ak.bind("mousedown", A);
				j.bind("mousewheel", function(ap, ar) {
					ar = ar || (ap.wheelDelta ? ap.wheelDelta / 120 : (ap.detail) ? -ap.detail / 3 : 0);
					ae();
					X();
					var aq = af;
					ai(af - ar * I);
					var p = aq != af;
					return !p;
				});
				var f;
				var D;

				function J() {
					var p = (f - af) / c.animateStep;
					if (p > 1 || p < -1) {
						ai(af + p);
					} else {
						ai(f);
						X();
					}
				}
				var X = function() {
					if (D) {
						clearInterval(D);
						delete f;
					}
				};
				var ah = function(at, p) {
					if (typeof at == "string") {
						try {
							$e = a(at, t);
						} catch(ar) {
							return;
						}
						if (!$e.length) {
							return;
						}
						at = $e.offset().top - t.offset().top;
					}
					X();
					var aq = W - ao;
					at = at > aq ? aq : at;
					t.data("jScrollPaneMaxScroll", aq);
					var ap = at / aq * F;
					if (p || !c.animateTo) {
						ai(ap);
					} else {
						j.scrollTop(0);
						f = ap;
						D = setInterval(J, c.animateInterval);
					}
				};
				t[0].scrollTo = ah;
				t[0].scrollBy = function(ap) {
					var p = -parseInt(ag.css("top")) || 0;
					ah(p + ap);
				};
				ae();
				ah(-an, true);
				a("*", this).bind("focus", function(at) {
					var ar = a(this);
					var av = 0;
					while (ar[0] != t[0]) {
						av += ar.position().top;
						ar = ar.offsetParent();
					}
					var p = -parseInt(ag.css("top")) || 0;
					var au = p + ao;
					var aq = av > p && av < au;
					if (!aq) {
						var ap = av - c.scrollbarMargin;
						if (av > p) {
							ap += a(this).height() + 15 + c.scrollbarMargin - ao;
						}
						ah(ap);
					}
				});
				if (c.observeHash) {
					if (location.hash && location.hash.length > 1) {
						setTimeout(function() {
							ah(location.hash);
						},
						a.browser.safari ? 100 : 0);
					}
					a(document).bind("click", function(ap) {
						$target = a(ap.target);
						if ($target.is("a")) {
							var p = $target.attr("href");
							if (p && p.substr(0, 1) == "#" && p.length > 1) {
								setTimeout(function() {
									ah(p, !c.animateToInternalLinks);
								},
								a.browser.safari ? 100 : 0);
							}
						}
					});
				}

				function B(p) {
					a(document).bind("mousemove.jScrollPaneDragging", x);
					a(document).bind("mouseup.jScrollPaneDragging", n);
				}
				var M;
				var h;

				function K() {
					direction = M < 0 ? -1 : 1;
					t[0].scrollBy(M / 2);
				}

				function k() {
					if (h) {
						clearInterval(h);
						h = undefined;
					}
				}

				function x(aq) {
					var ar = t.parent().offset().top;
					var p = ar + ao;
					var ap = G(aq, "Y");
					M = ap < ar ? ap - ar : (ap > p ? ap - p : 0);
					if (M == 0) {
						k();
					} else {
						if (!h) {
							h = setInterval(K, 100);
						}
					}
				}

				function n(p) {
					a(document).unbind("mousemove.jScrollPaneDragging").unbind("mouseup.jScrollPaneDragging");
					k();
				}
				j.bind("mousedown.jScrollPane", B);
				a.jScrollPane.active.push(t[0]);
			} else {
				t.css({
					height: ao + "px",
					width: L - this.originalSidePaddingTotal + "px",
					padding: this.originalPadding
				});
				t[0].scrollTo = t[0].scrollBy = function() {};
				t.parent().unbind("mousewheel").unbind("mousedown.jScrollPane").unbind("keydown.jscrollpane").unbind("keyup.jscrollpane");
			}
		});
	};
	a.fn.jScrollPaneRemove = function() {
		a(this).each(function() {
			$this = a(this);
			var b = $this.parent();
			if (b.is(".jScrollPaneContainer")) {
				$this.css({
					top: "",
					height: "",
					width: "",
					padding: "",
					overflow: "",
					position: ""
				});
				$this.attr("style", $this.data("originalStyleTag"));
				b.after($this).remove();
			}
		});
	};
	a.fn.jScrollPane.defaults = {
		scrollbarWidth: 10,
		scrollbarMargin: 5,
		wheelSpeed: 18,
		showArrows: false,
		arrowSize: 0,
		animateTo: false,
		dragMinHeight: 1,
		dragMaxHeight: 99999,
		animateInterval: 100,
		animateStep: 3,
		maintainPosition: true,
		scrollbarOnLeft: false,
		reinitialiseOnImageLoad: false,
		tabIndex: 0,
		enableKeyboardNavigation: true,
		animateToInternalLinks: false,
		topCapHeight: 0,
		bottomCapHeight: 0,
		observeHash: true
	};
	a(window).bind("unload", function() {
		var c = a.jScrollPane.active;
		for (var b = 0; b < c.length; b++) {
			c[b].scrollTo = c[b].scrollBy = null;
		}
	});
})(jQuery);

