jQuery.fn.scroll = function()
{
	
	this.each(function()
	{
		var scrollbox = $(this);
		var scrollbox_offset = scrollbox.offset();
		var scrollbox_width = scrollbox.width();
		var scroll_position = 0;

		var extent = 0;
		//var range = (scrollbox_width - 100)/2;
		var range = 200;
		var timer = null;
		var slowdown_timer = null;


		var original_scrollbox_content = scrollbox.html();

		var scrollbox_new_content = "<span class='scrollbox_content' style=''>" + original_scrollbox_content + "<\/span>";
		scrollbox.html(scrollbox_new_content);
		var content_length = scrollbox.find(':first-child').width();

		var scrollbox_new_content = "<span class='scrollbox_content' style=''>" + original_scrollbox_content + original_scrollbox_content + original_scrollbox_content + "<\/span>";
		scrollbox.html(scrollbox_new_content);
		var content_length = Math.round(scrollbox.find(':first-child').width() / 3);

		var total_width = 0;
		scrollbox.find(':first-child').children().each(function()
		{
			total_width += $(this).width();
		});


		var scroll_position = content_length;

		scrollbox.mousemove(function(event)
		{
			var mouse_x = Math.round(event.pageX - scrollbox_offset.left);

			if (mouse_x < range) extent = mouse_x - range;
			else if (mouse_x > scrollbox_width - range) extent = mouse_x + range - scrollbox_width;
			else extent = 0;
			
			var out = mouse_x + ' : ' + scrollbox_width;
		});
		
		scrollbox.mouseenter(function()
		{
			content_length = Math.round(scrollbox.find(':first-child').width() / 3);

			if (slowdown_timer != null)
			{
				clearInterval(slowdown_timer);
				slowdown_timer = null;
			}
			
			if (timer == null)
			timer = setInterval(function()
			{
				if (extent == 0) return;
				
				var tmp = extent*2.5/range;
				var speed = tmp*tmp*tmp;

				scroll_position += Math.round(speed);
				if (scroll_position < content_length) scroll_position += content_length;
				if (scroll_position > content_length) scroll_position -= content_length;
				scrollbox.scrollLeft(scroll_position);
			}, 20);
		});
		
		scrollbox.mouseleave(function()
		{
			slowdown_timer = setInterval(function()
			{
				
				extent = extent/1.05;
				////debug("extent slowdown: " + extent);
				if (Math.abs(extent) < 1)
				{
					clearInterval(slowdown_timer);
					slowdown_timer = null;

					clearInterval(timer);
					timer = null;
					
					extent = 0;
				}
				
			}, 20);
		});


	});
	
	return this;
	
}

$(document).ready(function()
{
	$('.scrollbox').scroll();
});
