// Create scrolling variable if it doesn't existif (!Scrolling) var Scrolling = {};//Scrollbar constructorScrolling.Scrollbar = function (o, s, t) {	//private variables	var self = this;	var _components = {};	var _dimensions = {};	var _temporary  = {};	var _hasTween   = t ? true : false;	var _timer, _ratio;		//public variables	this.onMouseDown   = function (){};	this.onMouseUp     = function (){};	this.onScroll      = function (){};	this.scrollAmount  = 5;	this.scrollSpeed   = 30;	this.disabled      = false;		//private functions	function initialize () {		var c = _components;		var d = _dimensions;		var g = s.getDimensions();		c.up     = findComponent("Scrollbar-Up", o);		c.down   = findComponent("Scrollbar-Down", o);		c.track  = findComponent("Scrollbar-Track", o);		c.handle = findComponent("Scrollbar-Handle", c.track);				d.trackTop     = findOffsetTop(c.track);		d.trackHeight  = c.track.offsetHeight;		d.handleHeight = c.handle.offsetHeight;		d.y = 0				if (_hasTween) t.apply(self);				addEvent(s.getContent(), "mousewheel", scrollbarWheel);		addEvent(s.getContent(), "DOMMouseScroll", scrollbarWheel);		addEvent(o, "mousedown", scrollbarClickPrimer);				self.reset();	};		function findOffsetTop (o) {		var t = 0;		if (o.offsetParent) {			while (o.offsetParent) {				t += o.offsetTop;				o  = o.offsetParent;			}		}		return t;	};		function addEvent (o, t, f) {		if (o.attachEvent) o.attachEvent('on'+ t, f);		else o.addEventListener(t, f, false);	};		function removeEvent (o, t, f) {		if (o.detachEvent) o.detachEvent('on'+ t, f);		else o.removeEventListener(t, f, false);	};		function findComponent (c, o) {		var kids = o.childNodes;		for (var i = 0; i < kids.length; i++) {			if (kids[i].className && kids[i].className.indexOf(c) >= 0) {				return kids[i];			}		}	};		function scroll (y) {		if (y < 0) y = 0;		if (y > _dimensions.trackHeight - _dimensions.handleHeight)			y = _dimensions.trackHeight - _dimensions.handleHeight;		_components.handle.style.top = y +"px";		_dimensions.y = y;				s.scrollTo(0, Math.round(_dimensions.y * _ratio));		self.onScroll();	};		function scrollbarClickPrimer (e) {		if (self.disabled) return false;				e = e?e:event;		if (!e.target) e.target = e.srcElement;				_dimensions.trackTop = findOffsetTop(_components.track);		scrollbarClick(e.target.className, e);	};		function scrollbarClick (c, e) {		var d  = _dimensions;		var t  = _temporary;		var cy = e.clientY + document.body.scrollTop;				if (c.indexOf("Scrollbar-Up") >= 0)			startScroll(-self.scrollAmount);				if (c.indexOf("Scrollbar-Down") >= 0) 			startScroll(self.scrollAmount);					if (c.indexOf("Scrollbar-Track") >= 0)			if (_hasTween) self.tweenTo((cy - d.trackTop - d.handleHeight / 2) * _ratio);			else scroll(cy - d.trackTop - d.handleHeight / 2);					if (c.indexOf("Scrollbar-Handle") >= 0) {			t.grabPoint = cy - findOffsetTop(_components.handle);			addEvent(document, "mousemove", scrollbarDrag, false);			}				t.target = e.target;		t.select = document.onselectstart;				document.onselectstart = function (){ return false; };		self.onMouseDown(e.target, c, e);				addEvent(document, "mouseup", stopScroll);	};		function scrollbarDrag (e) {		e = e?e:event;		var d = _dimensions;		var t = parseInt(_components.handle.style.top);		var v = e.clientY + document.body.scrollTop - d.trackTop;				if (v >= d.trackHeight - d.handleHeight + _temporary.grabPoint)			v = d.trackHeight - d.handleHeight;					else if (v <= _temporary.grabPoint)			v = 0;					else v = v - _temporary.grabPoint;					scroll(v);	};		function scrollbarWheel (e) {		if (self.disabled) return false;				e = e ? e : event;		var dir = 0;				if (typeof e.wheelDelta == 'undefined') {			if (e.detail > 0) dir = 1;			if (e.detail < 0) dir = -1;		} else {			if (e.wheelDelta >= 120) dir = -1;			if (e.wheelDelta <= -120) dir = 1;		}		self.scrollBy(dir * 20);				if(e.stopPropagation) e.stopPropagation();		if(e.preventDefault) e.preventDefault();		e.cancelBubble = true;		e.cancel = true;		e.returnValue = false;		return false;	};		function startScroll (y) {		_temporary.disty = y;		_timer = window.setInterval(function () {			self.scrollBy(_temporary.disty);		}, self.scrollSpeed);	};		function stopScroll (e) {		e = e?e:event;				removeEvent(document, "mousemove", scrollbarDrag);		removeEvent(document, "mouseup", stopScroll);				document.onselectstart = _temporary.select;		if (_timer) window.clearInterval(_timer);				self.onMouseUp(_temporary.target, _temporary.target.className, e);	};		//public functions	this.reset = function () {		var d = _dimensions;		var c = _components;		var g = s.getDimensions();				_ratio = (g.theight - g.vheight) / (d.trackHeight - d.handleHeight);				c.handle.ondragstart = function (){ return false; };		c.handle.onmousedown = function (){ return false; };		c.handle.style.top   = "0px";		d.y = 0;				s.reset();		scroll(0);				if (g.theight < g.vheight) {			this.disable()		} else this.enable();	};		this.scrollTo = function (y) {		scroll(y / _ratio);	};		this.scrollBy = function (y) {		scroll((s.getDimensions().y + y) / _ratio);	};		this.swapContent = function (n) {		var d = s.getDimensions		s.swapContent(n, d.vwidth, d.vheight);		initialize();	};		this.disable = function () {		this.disabled = true;		o.className  += "Scrollbar-Disabled";	};		this.enable = function () {		this.disabled = false;		o.className = o.className.replace(/Scrollbar\-Disabled/, "");	};		this.getContent = function () {		return s.getContent();	};		this.getComponents = function () {		return _components;	};		this.getDimensions = function () {		var d = s.getDimensions();		d.trackHeight  = _dimensions.trackHeight;		d.handleHeight = _dimensions.handleHeight;		d.handleY = _dimensions.y;				return d;	};		initialize();};
