(function(a){
	function b(b,c){
		function w(a){
			if(!(g.ratio>=1)){
				o.now=Math.min(i[c.axis]-j[c.axis],Math.max(0,o.start+((k?a.pageX:a.pageY)-p.start)));
				n=o.now*h.ratio;
				g.obj.css(l,-n);
				j.obj.css(l,o.now)
			}
			return false
		}
		function v(b){
			a(document).unbind("mousemove",w);
			a(document).unbind("mouseup",v);
			j.obj.unbind("mouseup",v);
			document.ontouchmove=j.obj[0].ontouchend=document.ontouchend=null;
			return false
		}
		function u(b){
			if(!(g.ratio>=1)){
				var b=b||window.event;
				var d=b.wheelDelta?b.wheelDelta/120:-b.detail/3;
				n-=d*c.wheel;
				n=Math.min(g[c.axis]-f[c.axis],Math.max(0,n));
				j.obj.css(l,n/h.ratio);
				g.obj.css(l,-n);
				b=a.event.fix(b);
				b.preventDefault()
			}
		}
		function t(b){
			p.start=k?b.pageX:b.pageY;
			var c=parseInt(j.obj.css(l));
			o.start=c=="auto"?0:c;
			a(document).bind("mousemove",w);
			document.ontouchmove=function(b){
				a(document).unbind("mousemove");
				w(b.touches[0])
			};
			a(document).bind("mouseup",v);
			j.obj.bind("mouseup",v);
			j.obj[0].ontouchend=document.ontouchend=function(b){
				a(document).unbind("mouseup");
				j.obj.unbind("mouseup");
				v(b.touches[0])};
				return false
			}
			function s(){
				j.obj.bind("mousedown",t);
				j.obj[0].ontouchstart=function(a){
					a.preventDefault();
					j.obj.unbind("mousedown");
					t(a.touches[0]);
					return false
				};
				i.obj.bind("mouseup",w);
				if(c.scroll&&this.addEventListener){
					e[0].addEventListener("DOMMouseScroll",u,false);
					e[0].addEventListener("mousewheel",u,false)
				}else if(c.scroll){
					e[0].onmousewheel=u
				}
			}
			function r(){
				j.obj.css(l,n/h.ratio);
				g.obj.css(l,-n);
				p["start"]=j.obj.offset()[l];
				var a=m.toLowerCase();
				h.obj.css(a,i[c.axis]);
				i.obj.css(a,i[c.axis]);
				j.obj.css(a,j[c.axis])
			}
			function q(){
				d.update();
				s();
				return d
			}
			var d=this;
			var e=b;
			var f={obj:a(".viewport",b)};
			var g={obj:a(".overview",b)};
			var h={obj:a(".scrollbar",b)};
			var i={obj:a(".track",h.obj)};
			var j={obj:a(".thumb",h.obj)};
			var k=c.axis=="x",
				l=k?"left":"top",
				m=k?"Width":"Height";
			var n,
				o={start:0,now:0},
				p={};
			this.update=function(a){
				f[c.axis]=f.obj[0]["offset"+m];
				g[c.axis]=g.obj[0]["scroll"+m];
				g.ratio=f[c.axis]/g[c.axis];
				h.obj.toggleClass("disable",g.ratio>=1);
				i[c.axis]=c.size=="auto"?f[c.axis]:c.size;
				j[c.axis]=Math.min(i[c.axis],Math.max(0,c.sizethumb=="auto"?i[c.axis]*g.ratio:c.sizethumb));
				h.ratio=c.sizethumb=="auto"?g[c.axis]/i[c.axis]:(g[c.axis]-f[c.axis])/(i[c.axis]-j[c.axis]);
				n=a=="relative"&&g.ratio<=1?Math.min(g[c.axis]-f[c.axis],Math.max(0,n)):0;
				n=a=="bottom"&&g.ratio<=1?g[c.axis]-f[c.axis]:isNaN(parseInt(a))?n:parseInt(a);
				r()
			};
			return q()
		}
		a.tiny=a.tiny||{};
		a.tiny.scrollbar={
			options:{
				axis:"y",
				wheel:40,
				scroll:true,
				size:"auto",
				sizethumb:"auto"
			}
		};
		a.fn.tinyscrollbar=function(c){
			var c=a.extend({},a.tiny.scrollbar.options,c);
			this.each(function(){
				a(this).data("tsb",new b(a(this),c))
			});
			return this
		};
		a.fn.tinyscrollbar_update=function(b){
			return a(this).data("tsb").update(b)
		};
	})
(jQuery)