ScrollBars = {
	areas: [],
	SCROLL_AMOUNT: 10,
	WHEEL_SCROLL_AMOUNT: 15,
	scrollInterval: null,
	currentButton: null,
	
	EVENT_NAMES: [
		'uppress',
		'uprelease',
		'downpress',
		'downrelease',
		'upmouseout',
		'downmouseout'
	],
	
	doMouseWheel: function(e,ele) {
		var c = ele.contentDiv;
		if (e.delta > 0 && c.scrollTop > 0) {
			c.scrollTop -= Math.min(e.delta * this.WHEEL_SCROLL_AMOUNT,c.scrollTop);
		} 
		else if (e.delta < 0 && c.scrollTop < c.scrollHeight - c.offsetHeight) {
			c.scrollTop += Math.min(-e.delta * this.WHEEL_SCROLL_AMOUNT,c.scrollHeight - c.scrollTop);
		}
		this.updateThumb(c);
		e.cancel();
	},

	doScrollUp: function() {
		if (!this.scrolling) return;
		var c = this.currentButton.contentDiv;
		if (c.scrollTop > 0) {
			c.scrollTop -= Math.min(this.SCROLL_AMOUNT,c.scrollTop);
			setTimeout(this.doScrollUp.inScope(this),this.scrollInterval);
			if (this.scrollInterval > 40) {
				this.scrollInterval = 30;
			}
		}
		this.updateThumb(c);
	},
	
	doScrollDown: function() {
		if (!this.scrolling) return;
		var c = this.currentButton.contentDiv;
		if (c.scrollTop < c.scrollHeight - c.offsetHeight) {
			c.scrollTop += Math.min(this.SCROLL_AMOUNT,c.scrollHeight - c.scrollTop);
			setTimeout(this.doScrollDown.inScope(this),this.scrollInterval);
			if (this.scrollInterval > 40) {
				this.scrollInterval = 30;
			}
		}
		this.updateThumb(c);
	},

	doUpPress: function(e, ele, userdata) {
		this.currentButton = userdata;
		this.scrolling = true;
		this.scrollInterval = 200;
		this.doScrollUp();
		e.cancel();
	},
	
	doDownPress: function(e, ele, userdata) {
		this.currentButton = userdata;
		this.scrolling = true;
		this.scrollInterval = 200;
		this.doScrollDown();
		e.cancel();
	},
	
	doUpRelease: function(e, ele, userdata) {
		this.scrolling = false;
	},

	doDownRelease: function(e, ele, userdata) {
		this.scrolling = false;
	},
	
	registerButtonEvents: function(ele) {
		this.unregisterButtonEvents(ele);
		ele.handlerIds['uppress'] = EventMan.addEvent(ele.upButton,"mousedown",this.doUpPress,{scope: this, userdata: ele});
		ele.handlerIds['downpress'] = EventMan.addEvent(ele.downButton,"mousedown",this.doDownPress,{scope: this, userdata: ele});
		ele.handlerIds['uprelease'] = EventMan.addEvent(ele.upButton,"mouseup",this.doUpRelease,{scope: this, userdata: ele});
		ele.handlerIds['downrelease'] = EventMan.addEvent(ele.downButton,"mouseup",this.doDownRelease,{scope: this, userdata: ele});
		ele.handlerIds['upmouseout'] = EventMan.addEvent(ele.upButton,"mouseout",this.doUpRelease,{scope: this, userdata: ele});
		ele.handlerIds['downmouseout'] = EventMan.addEvent(ele.downButton,"mouseout",this.doDownRelease,{scope: this, userdata: ele});
	},

	unregisterButtonEvents: function(ele) {
		for (var i = 0, len = this.EVENT_NAMES.length; i < len; i++) {
			var ename = this.EVENT_NAMES[i];
			if (ele.handlerIds[ename] !== undefined) {
				EventMan.removeEvent(ele.handlerIds[ename]);
				ele.handlerIds[ename] = undefined;
			}
		}
	},
	
	registerMouseWheelEvent: function(ele) {
		this.unregisterMouseWheelEvent(ele);
		ele.handlerIds['wheel'] = EventMan.addEvent(ele,"mousewheel",this.doMouseWheel,{scope: this});
	},
	
	unregisterMouseWheelEvent: function(ele) {
		if (ele.handlerIds['wheel'] !== undefined) {
			EventMan.removeEvent(ele.handlerIds['wheel']);
			ele.handlerIds['wheel'] = undefined;
		}
	},
	
	replaceBars: function() {
		for (var i = 0, len = this.areas.length; i < len; i++) {
			var ele = this.areas[i];
			ele.scrollDiv = document.createElement("div");
			ele.scrollDiv.className = "scrollarea";
			ele.appendChild(ele.scrollDiv);
			ele.upButton = document.createElement("img");
			ele.upButton.className = "uparrow";
			ele.upButton.src = "/images/scroll/arrow_up.gif";
			ele.scrollDiv.appendChild(ele.upButton);
			ele.downButton = document.createElement("img");
			ele.downButton.className = "downarrow";
			ele.downButton.src = "/images/scroll/arrow_down.gif";
			ele.scrollDiv.appendChild(ele.downButton);
			ele.thumb = document.createElement("img");
			ele.thumb.className= "scrollthumb";
			ele.thumb.src = "/images/scroll/thumb.gif";
			ele.scrollDiv.appendChild(ele.thumb);
		}
	},

	updateThumb: function(ele) {
		var scrollrange = ele.scrollHeight - ele.offsetHeight;
		if (scrollrange > 0) {
			var pos = 1 - ((scrollrange - ele.scrollTop) / scrollrange);
			var thumbPos = pos * (ele.offsetHeight - 60) + 20;
			ele.parentNode.thumb.style.top = thumbPos + "px";
		}
	},
	
	update: function() {
		for (var i = 0, len = this.areas.length; i < len; i++) {
			var ele = this.areas[i];
			ele.contentDiv.firstChild.style.width = ele.contentDiv.offsetWidth + "px";
			if (ele.contentDiv.offsetHeight < ele.contentDiv.scrollHeight) {
				ele.scrollDiv.style.visibility = "visible";
				ele.contentDiv.firstChild.style.width = ele.contentDiv.offsetWidth - 20 + "px";
				this.registerButtonEvents(ele);
				this.registerMouseWheelEvent(ele);
			} else {
				ele.scrollDiv.style.visibility = "hidden";
				this.unregisterButtonEvents(ele);
				this.unregisterMouseWheelEvent(ele);
			}
			ele.style.visibility = "visible";
			this.updateThumb(ele.contentDiv);
		}
	},

	resetAreas: function(left,right) {
		if (left === undefined) left = true;
		if (right === undefined) right = true;
		if (left) {
			var ele = this.areas[0];
			ele.style.visibility = "hidden";
			ele.contentDiv.scrollTop = 0;
		}
		if (right) {
			var ele = this.areas[1];
			ele.style.visibility = "hidden";
			ele.contentDiv.scrollTop = 0;
		}
	},

	init: function() {
		this.areas.push($("leftcol"));
		this.areas.push($("rightcol"));
		for (var i = 0, len = this.areas.length; i < len; i++) {
			this.areas[i].handlerIds = {};
		}
		$("leftcol").contentDiv = $("leftcol").firstChild;
		$("rightcol").contentDiv = $("rightcol").firstChild;
		this.replaceBars();
	}
}

document.write('<link type="text/css" href="styles/scrollbars.css" rel="stylesheet" media="all" />');