jQuery.fn.scrollows = function (local_conf) {
jQuery(this).each(function(){

	//
	var def = {};
	
	def.scrollowsClass = 'scrollows';
	def.scrollowsActiveClass = 'scrollows-active';
	def.wrapperClass = 'scrollows-wrapper';
	def.contentClass = 'scrollows-content';
	
	def.scrollUpClass = 'scrollows-scrollup';
	def.scrollDownClass = 'scrollows-scrolldown';

	//
	var conf = {};

	conf.scrollUpText = 'up';
	conf.scrollDownText = 'down';
	
	conf.frequency = 20;
	
	conf.step = 10;
	conf.runStep = 20;
	
	//
	var thisJQ = jQuery(this);
	var wrapperJQ = jQuery([]);
	var contentJQ = jQuery([]);
	
	var scrollUpJQ = jQuery([]);
	var scrollDownJQ = jQuery([]);
	
	var scrollTimeout = null;
	
	/*
	 * 
	 */
	var init = function (local_conf) {
		//
		conf = jQuery.extend(conf, local_conf);
		
		//
		thisJQ
			.addClass(def.scrollowsClass)
			.css('overflow', 'hidden');
		
		//
		thisJQ.wrapInner('<div />');

		wrapperJQ = thisJQ.children().eq(0)
			.css('overflow', 'hidden')
			.addClass(def.wrapperClass);

		//
		wrapperJQ.wrapInner('<div />');

		contentJQ = wrapperJQ.children().eq(0)
			.addClass(def.contentClass);
		
		//
		jQuery(window).load(function(){
			wrapperJQ
				.css('width', thisJQ.outerWidth() + 'px')
				.css('height', thisJQ.outerHeight() + 'px')
	
			if(thisJQ.outerHeight() < contentJQ.outerHeight()) {
				//
				thisJQ.addClass(def.scrollowsActiveClass);
				
				//
				scrollUpJQ = jQuery('<div />')
					.addClass(def.scrollUpClass)
					.appendTo(thisJQ);
				
				jQuery('<a />')
					.attr('href', '#')
					.text(conf.scrollUpText)
					.click(function(){
						return false;
					})
					.mouseover(function(){
						scrollUpStart(conf.step);
					})
					.mouseout(function(){
						scrollUpStop();
					})
					.mousedown(function(){
						scrollUpStart(conf.runStep);
					})
					.mouseup(function(){
						scrollUpStop();
					})
					.appendTo(scrollUpJQ);
	
				scrollDownJQ = jQuery('<div />')
					.addClass(def.scrollDownClass)
					.appendTo(thisJQ);
				
				jQuery('<a />')
					.attr('href', '#')
					.text(conf.scrollDownText)
					.click(function(){
						return false;
					})
					.mouseover(function(){
						scrollDownStart(conf.step);
					})
					.mouseout(function(){
						scrollDownStop();
					})
					.mousedown(function(){
						scrollDownStart(conf.runStep);
					})
					.mouseup(function(){
						scrollDownStop();
					})
					.appendTo(scrollDownJQ);
			}
		});
	}
	
	/**
	 * 
	 */
	var scrollUp = function (step) {
		wrapperJQ.scrollTo('-=' + step);
	}
	
	/**
	 * 
	 */
	var scrollUpStart = function (step) {
		scrollUpStop();
		scrollUp(step);
		
		scrollTimeout = setTimeout(
			function(){
				scrollUpStart(step);
			},
			1000 / conf.frequency);
	}
	
	/**
	 * 
	 */
	var scrollUpStop = function () {
		clearTimeout(scrollTimeout);
	}
	
	/**
	 * 
	 */
	var scrollDown = function (step) {
		wrapperJQ.scrollTo('+=' + step);
	}
	
	/**
	 * 
	 */
	var scrollDownStart = function (step) {
		scrollDownStop();
		scrollDown(step);
		
		scrollTimeout = setTimeout(
			function(){
				scrollDownStart(step);
			},
			1000 / conf.frequency);
	}
	
	/**
	 * 
	 */
	var scrollDownStop = function () {
		clearTimeout(scrollTimeout);
	}

	//
	jQuery(document).ready(function(){
		init(local_conf);
	});

});
}

