$.fn.moveScroller = function (optn) {
	
	var obj = $(this[0]).data('scroller');
	
	if (obj){
		obj.update();
		return obj;
		
	}else{
			
		this.each (function (i, elem) {

			var defaults = {
				$layer:$(this),
				scrollSteps:25,
				overOpacity: .9,
				outOpacity: .5
			};
				
			var config 	= $.extend(defaults, optn) ;	
						
			var scroller  = new $.scroller (config);
			$(elem).data('scroller', scroller);
			
		});
	}
	
	return this;
}



$.scroller = function (config) {
	
	this.config = config;
	
	this.$layer = config.$layer;
	
	this.intervalID = null;
	
	this.so = 0;
	
	this.__construct = function () {
		
		
		
		config
			.$thumb = 
				$ ( '<div>' )
					.addClass('scroll-thumb');
		
		this
			.$layer
			.parent()
			.append(config.$thumb );
					
		
		this
			.$layer
			.scroll( this.onScroll )
			.mousewheel( this.onMouseWeel );
		
			
	}
	
	

	
	this.onMouseWeel = function (e, delta) {
		e.preventDefault();
		var offSet = config.$layer.scrollTop();
		
		if (delta < 0) {
			config.$layer.scrollTop(offSet + (config.scrollSteps * Math.abs(delta)) );
		}else{
			config.$layer.scrollTop(offSet - (config.scrollSteps * Math.abs(delta)) );			
		}
		
	}
	
	
	
	this.onScroll = function (e) {
		var offSet 		= config.$layer.scrollTop();
		var innerHeight = config.$layer[0].scrollHeight - config.$layer.innerHeight();
		
		var p_scroll = (offSet * 100) / innerHeight;
		
		var c_height = config.$layer.innerHeight() - config.$thumb.height();
		var top = (c_height * p_scroll) / 100;
		 
		config.$thumb.css('top', top);
	}
	
	
	this.update = function () {
		config.$thumb.css('top',0);
	}
	
	this.__construct();
}


