function jScroller(scroller_container, scrollbar_container) {
	var self = this;
	
	this.scroll					= $('#'+scrollbar_container);
	this.container				= $('#'+scroller_container);
	this.track					= this.scroll.find('.Scrollbar-Track');
	this.up						= this.scroll.find('.Scrollbar-Up');
	this.down					= this.scroll.find('.Scrollbar-Down');
	this.handle					= this.scroll.find('.Scrollbar-Handle');
	this.content				= this.container.find('.Scroller-Container');
	
	this.container.scrollTop(0);
	
	this.moveHandle = function() {
		var offset = self.handle_height / 2;
		var top = self.container.scrollTop() / self.scroll_mul;
		self.handle.css({
			'top': top - offset
		});
	}
	this.reset = function(){
		self.scroll_height		= self.content.height();

		self.container_height	= self.container.height();
		self.track_height		= self.track.height();
		self.handle_height		= self.handle.height();
		self.track_pos			= self.track.offset();

		self.scrollTop			= self.scroll_height - self.container_height;
		self.scroll_mul			= self.scrollTop / self.track_height;

		self.track_drag			= false;
		self.track_over			= false;
		
		self.animating			= false;
		
		self.scrollTimer		= null;
		
		self.moveHandle();

		if (self.scroll_height > self.container_height) {
			self.scroll.css({'visibility':'visible'});
		} else {
			self.scroll.css({'visibility':'hidden'});
		}
	}
	
	this.track.mousedown(function(e){
		e.preventDefault();
		self.track_drag = true;
		self.track_over = true;
		self.moveContent(e);
	});
	$(document).mouseup(function(e){
		self.track_drag = false;
	});
	$(document).mousemove(function(e){
		if (self.track_drag && self.track_over) {
			self.moveContent(e);
		}
	});
	this.down.mousedown(function(e){
		e.preventDefault();
		self.container.animate({'scrollTop':'+=60'},200,function(){
			self.moveHandle();
		});
		self.scrollTimer = window.setTimeout(function(){
			self.animating = true;
			var time = ((self.scrollTop - self.container.scrollTop())/60) * 200;
			self.container.animate({'scrollTop':self.scrollTop},time);
			self.handle.animate({'top':(self.track_height - (self.handle_height / 2))+'px'},time);
		},500);
	});
	this.down.mouseup(function(){
		self.stopScroll();
	});
	this.down.mouseout(function(){
		self.stopScroll();
	});
	this.up.mousedown(function(e){
		e.preventDefault();
		self.container.animate({'scrollTop':'-=60'},200,function(){
			self.moveHandle();
		});
		self.moveHandle();
		self.scrollTimer = window.setTimeout(function(){
			self.animating = true;
			var time = (self.scrollTop/60) * 200;
			self.container.animate({'scrollTop':0},time);
			self.handle.animate({'top':'-'+(self.handle_height / 2)+'px'},time);
		},500);
	});
	this.up.mouseup(function(){
		self.stopScroll();
	});
	this.up.mouseout(function(){
		self.stopScroll();
	});
	self.container.mousewheel(function(event, delta) {
		self.container.scrollTop(self.container.scrollTop() + (delta * -30));
		self.moveHandle();
	});
	self.track.mousewheel(function(event, delta) {
		self.container.scrollTop(self.container.scrollTop() + (delta * -30));
		self.moveHandle();
	});
	self.stopScroll = function(){
		if (self.animating) {
			self.animating = false;
			self.container.stop();
			self.handle.stop();
		}
		window.clearTimeout(self.scrollTimer);
	}
	this.moveContent = function(e) {
		this.e = e;
		//var offset = self.handle_height / 2;
		var top = this.e.pageY - self.track_pos.top;

		/*if (top < offset) {
			top = 0;
		}
		if (top > (self.track_height - offset)) {
			top = self.track_height;
		}*/
		self.container.scrollTop(top * self.scroll_mul);
		self.moveHandle();
	}
	
	this.reset();
}
