jQuery.fn.ScrollBox = function(settings)
{
	settings = jQuery.extend({ orientation: 'v', speed: 50, jump: 10 , prevLnk: null, nextLnk: null, container: null, box: null, onover: true, onclick: false }, settings);
	
	this.each(function(i, item)
	{
		/** Scrolling functions */
		item.ScrollBoxStartScroll = function(dir)
		{
			iid = window.setInterval(function(){ item.ScrollBoxDoScroll(dir); }, settings.speed);
			$(item).attr('ScrollBoxIntervalObject', iid);
			return false;
		}
		
		item.ScrollBoxDoScroll = function(dir)
		{
			if (settings.orientation=='v'){ oldPos = $(settings.container).css('top'); containerSize = parseInt($(item).innerHeight()); }
			if (settings.orientation=='h'){ oldPos = $(settings.container).css('left'); containerSize = parseInt($(item).innerWidth()); }
			if (!parseInt(oldPos)){ oldPos = 0; }
			newPos = parseInt(oldPos)+(dir*settings.jump);
			
			marginSize = $(item).attr('lastMargin')*2;
			
			if (newPos>0){ item.ScrollBoxStopScroll(); return; }
			if (newPos<0-$(item).attr('totalSize')+containerSize-marginSize){ item.ScrollBoxStopScroll(); return; }

			if (settings.orientation=='v'){ $(settings.container).css({'top': newPos}); }
			if (settings.orientation=='h'){ $(settings.container).css({'left': newPos}); }
		}
		
		item.ScrollBoxStopScroll = function()
		{
			iid = $(item).attr('ScrollBoxIntervalObject');
			if (iid){ window.clearInterval(iid); }
			return false;
		}
		/** End: Scrolling functions */
	
		/** Reorder items */
		pos = 0;
		margin = 0;
		
		if (settings.orientation=='v')
		{
			$(settings.box).each(function(k, bitem)
			{
				$(bitem).css({position: 'absolute', top: pos+'px'});
				margin = ($(bitem).outerHeight(true)-$(bitem).outerHeight(false))/2;
				pos += $(bitem).outerHeight(false)+margin;
			});
			$(settings.container).css({position: 'absolute', height: (pos+margin)+'px'});
		}
		
		if (settings.orientation=='h')
		{
			$(settings.box).each(function(k, bitem)
			{
				$(bitem).css({position: 'absolute', left: pos+'px'});
				margin = ($(bitem).outerWidth(true)-$(bitem).outerWidth(false))/2;
				pos += $(bitem).outerWidth(false)+margin;
			});
			$(settings.container).css({position: 'absolute', width: (pos+margin)+'px'});
		}

		$(item).attr('lastMargin', margin);
		$(item).attr('totalSize', pos);
		/** End: Reorder items */
		
		/** Link scrollers */
		$(settings.prevLnk).click(function(){ return false; });
		
		if (settings.onover)
		{
			$(settings.prevLnk).mouseover(function(){ item.ScrollBoxStartScroll(-1); return false; });
			$(settings.prevLnk).mouseout(function(){ item.ScrollBoxStopScroll(); return false; });
		}
		
		if (settings.onclick)
		{
			$(settings.prevLnk).mousedown(function(){ item.ScrollBoxStartScroll(-1); return false; });
			$(settings.prevLnk).mouseup(function(){ item.ScrollBoxStopScroll(); return false; });
		}
		
		$(settings.nextLnk).click(function(){ return false; });
		
		if (settings.onover)
		{
			$(settings.nextLnk).mouseover(function(){ item.ScrollBoxStartScroll(+1); return false; });
			$(settings.nextLnk).mouseout(function(){ item.ScrollBoxStopScroll(); return false; });
		}
		
		if (settings.onclick)
		{
			$(settings.nextLnk).mousedown(function(){ item.ScrollBoxStartScroll(+1); return false; });
			$(settings.nextLnk).mouseup(function(){ item.ScrollBoxStopScroll(); return false; });
		}
		/** End: Link scrollers */
	});
	
	return this;
}
