(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 O = A(this);
			O.css("overflow", "hidden");
			var X = this;
			if (A(this).parent().is(".jScrollPaneContainer")) {
				var Ac = C.maintainPosition ? O.position().top : 0;
				var L = A(this).parent();
				var d = L.innerWidth();
				var Ad = L[((L.css('boxSizing') || L.css('MozBoxSizing') || L.css('WebkitBoxSizing') || L.css('MsBoxSizing')) == 'border-box') ? 'innerHeight' : 'outerHeight']();
				var M = Ad;
				A(">.jScrollPaneTrack, >.jScrollArrowUp, >.jScrollArrowDown", L)
						.remove();
				O.css({
							top : 0
						})
			} else {
				var Ac = 0;
				this.originalPadding = O.css("paddingTop") + " "
						+ O.css("paddingRight") + " " + O.css("paddingBottom")
						+ " " + O.css("paddingLeft");
				this.originalSidePaddingTotal = (parseInt(O.css("paddingLeft")) || 0)
						+ (parseInt(O.css("paddingRight")) || 0);
				var d = O.innerWidth();
				var Ad = O.innerHeight();
				var M = Ad;
				O.wrap(A("<div></div>").attr({
							className : "jScrollPaneContainer"
						}).css({
							height : Ad + "px",
							width : d + "px"
						}));
				A(document).bind("emchange", function(Ae, Af, p) {
							O.jScrollPane(C)
						})
			}
			if (C.reinitialiseOnImageLoad) {
				var N = A.data(X, "jScrollPaneImagesToLoad") || A("img", O);
				var G = [];
				if (N.length) {
					N.each(function(p, Ae) {
						A(this).bind("load", function() {
									if (A.inArray(p, G) == -1) {
										G.push(Ae);
										N = A.grep(N, function(Ag, Af) {
													return Ag != Ae
												});
										A.data(X, "jScrollPaneImagesToLoad", N);
										C.reinitialiseOnImageLoad = false;
										O.jScrollPane(C)
									}
								}).each(function(Af, Ag) {
									if (this.complete
											|| this.complete === undefined) {
										this.src = this.src
									}
								})
					})
				}
			}
			var o = this.originalSidePaddingTotal;
			var l = {
				height : "auto",
				width : d - C.scrollbarWidth - C.scrollbarMargin - o + "px"
			};
			if (C.scrollbarOnLeft) {
				l.paddingLeft = C.scrollbarMargin + C.scrollbarWidth + "px"
			} else {
				l.paddingRight = C.scrollbarMargin + "px"
			}
			O.css(l);
			var m = O.outerHeight();
			var i = Ad / m;
			if (i < 0.99) {
				var H = O.parent();
				H.append(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"
								}))));
				var z = A(">.jScrollPaneTrack", H);
				var P = A(">.jScrollPaneTrack .jScrollPaneDrag", H);
				if (C.showArrows) {
					var g;
					var Ab;
					var S;
					var r;
					var j = function() {
						if (r > 4 || r % 4 == 0) {
							y(u + Ab * b)
						}
						r++
					};
					var K = function(p) {
						A("html").unbind("mouseup", K);
						g.removeClass("jScrollActiveArrowButton");
						clearInterval(S)
					};
					var Z = function() {
						A("html").bind("mouseup", K);
						g.addClass("jScrollActiveArrowButton");
						r = 0;
						j();
						S = setInterval(j, 100)
					};
					var Q = A("<a></a>").attr({
										href : "javascript:;",
										className : "jScrollArrowUp"
									}).css({
										width : C.scrollbarWidth + "px"
									}).html("Scroll up").bind("mousedown",
									function() {
										g = A(this);
										Ab = -1;
										Z();
										this.blur();
										return false
									}).bind("click", B);
					var J = A("<a></a>").attr({
										href : "javascript:;",
										className : "jScrollArrowDown"
									}).css({
										width : C.scrollbarWidth + "px"
									}).html("Scroll down").bind("mousedown",
									function() {
										g = A(this);
										Ab = 1;
										Z();
										this.blur();
										return false
									}).bind("click", B);
					if (C.outerArrows) {
						H.before(Q);
						H.after(J);
					} else {
						H.append(Q, J);
					}
					if (C.arrowSize) {
						M = Ad - C.arrowSize - C.arrowSize;
						z.css({
									height : M + "px",
									top : C.arrowSize + "px"
								})
					} else {
						var s = Q.height();
						C.arrowSize = s;
						M = Ad - s - J.height();
						z.css({
									height : M + "px",
									top : s + "px"
								})
					}
				}
				var w = A(this).css({
							position : "absolute",
							overflow : "visible"
						});
				var D;
				var Y;
				var b;
				var u = 0;
				var V = i * Ad / 2;
				var a = function(Ae, Ag) {
					var Af = Ag == "X" ? "Left" : "Top";
					return Ae["page" + Ag]
							|| (Ae["client" + Ag] + (document.documentElement["scroll"
									+ Af] || document.body["scroll" + Af]))
							|| 0
				};
				var f = function() {
					return false
				};
				var v = function() {
					n();
					D = P.offset(false);
					D.top -= u;
					Y = M - P[0].offsetHeight;
					b = 2 * C.wheelSpeed * Y / m
				};
				var E = function(p) {
					v();
					V = a(p, "Y") - u - D.top;
					A("html").bind("mouseup", T).bind("mousemove", h);
					if (A.browser.msie) {
						A("html").bind("dragstart", f).bind("selectstart", f)
					}
					return false
				};
				var T = function() {
					A("html").unbind("mouseup", T).unbind("mousemove", h);
					V = i * Ad / 2;
					if (A.browser.msie) {
						A("html").unbind("dragstart", f).unbind("selectstart",
								f)
					}
				};
				var y = function(Ae) {
					Ae = Ae < 0 ? 0 : (Ae > Y ? Y : Ae);
					u = Ae;
					P.css({
								top : Ae + "px"
							});
					var Af = Ae / Y;
					w.css({
								top : ((Ad - m) * Af) + "px"
							});
					O.trigger("scroll");
					if (C.showArrows) {
						Q[Ae == 0 ? "addClass" : "removeClass"]("disabled");
						J[Ae == Y ? "addClass" : "removeClass"]("disabled")
					}
				};
				var h = function(p) {
					y(a(p, "Y") - D.top - V)
				};
				var q = Math.max(Math.min(i * (Ad - C.arrowSize * 2),
								C.dragMaxHeight), C.dragMinHeight);
				P.css({
							height : q + "px"
						}).bind("mousedown", E);
				var k;
				var R;
				var I;
				var t = function() {
					if (R > 8 || R % 4 == 0) {
						y((u - ((u - I) / 2)))
					}
					R++
				};
				var Aa = function() {
					clearInterval(k);
					A("html").unbind("mouseup", Aa).unbind("mousemove", e)
				};
				var e = function(p) {
					I = a(p, "Y") - D.top - V
				};
				var U = function(p) {
					v();
					e(p);
					R = 0;
					A("html").bind("mouseup", Aa).bind("mousemove", e);
					k = setInterval(t, 100);
					t()
				};
				z.bind("mousedown", U);
				H.bind("mousewheel", function(Ae, Ag) {
							v();
							n();
							var Af = u;
							y(u - Ag * b);
							var p = Af != u;
							return !p
						});
				var F;
				var W;
				function c() {
					var p = (F - u) / C.animateStep;
					if (p > 1 || p < -1) {
						y(u + p)
					} else {
						y(F);
						n()
					}
				}
				var n = function() {
					if (W) {
						clearInterval(W);
						delete F
					}
				};
				var x = function(Af, p) {
					if (typeof Af == "string") {
						$e = A(Af, O);
						if (!$e.length) {
							return
						}
						Af = $e.offset().top - O.offset().top
					}
					H.scrollTop(0);
					n();
					var Ae = -Af / (Ad - m) * Y;
					if (p || !C.animateTo) {
						y(Ae)
					} else {
						F = Ae;
						W = setInterval(c, C.animateInterval)
					}
				};
				O[0].scrollTo = x;
				O[0].scrollBy = function(Ae) {
					var p = -parseInt(w.css("top")) || 0;
					x(p + Ae)
				};
				v();
				x(-Ac, true);
				A("*", this).bind("focus", function(Ah) {
					var Ag = A(this);
					var Aj = 0;
					while (Ag[0] != O[0]) {
						Aj += Ag.position().top;
						Ag = Ag.offsetParent()
					}
					var p = -parseInt(w.css("top")) || 0;
					var Ai = p + Ad;
					var Af = Aj > p && Aj < Ai;
					if (!Af) {
						var Ae = Aj - C.scrollbarMargin;
						if (Aj > p) {
							Ae += A(this).height() + 15 + C.scrollbarMargin
									- Ad
						}
						x(Ae)
					}
				});
				if (location.hash) {
					x(location.hash)
				}
				A(document).bind("click", function(Ae) {
							$target = A(Ae.target);
							if ($target.is("a")) {
								var p = $target.attr("href");
								if (p.substr(0, 1) == "#") {
									x(p)
								}
							}
						});
				A.jScrollPane.active.push(O[0])
			} else {
				O.css({
							height : Ad + "px",
							width : d - this.originalSidePaddingTotal + "px",
							padding : this.originalPadding
						});
				O.parent().unbind("mousewheel")
			}
		})
	};
	A.fn.jScrollPane.defaults = {
		scrollbarWidth : 27,
		scrollbarMargin : 5,
		wheelSpeed : 18,
		showArrows : false,
		arrowSize : 0,
		animateTo : false,
		dragMinHeight : 1,
		dragMaxHeight : 99999,
		animateInterval : 100,
		animateStep : 3,
		maintainPosition : true,
		scrollbarOnLeft : false,
		reinitialiseOnImageLoad : false,
		outerArrows: false
	};
	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);
