Element.createClass('AutoScrollBox',
{
	defaultOptions:
	{
		node:		'div',
		body:		null,
		stepWidth:	5,
		delay:		5,
		interval:	0.01
	},
	
	setBody: function()
	{
		this.body = $class('body', this)[0];
		
		if (this.body)
		{
			this.previousButton	= $class('previousButton', this)[0];
			this.nextButton		= $class('nextButton', this)[0];
			this.list			= $tag('ul', this.body)[0];
			this.items			= $tag('li', this.list);
			this.itemNum		= this.items.length;
			this.itemWidth		= this.items[0].getOffsetWidth();
			
			this.list.setInnerHTML(this.list.getInnerHTML() + this.list.getInnerHTML());
			
			var self = this;
			
			this.pauseCallback = function()
			{
				self.pause();
			};
			
			this.resumeCallback = function()
			{
				self.resume();
			};
			
			this.scrollCallback = function()
			{
				self.scroll();
			};
			
			var mouseupListener = function ()
			{
				self.setState(false, false);
			};
			
			this.body.addEventListener('mouseover', this.pauseCallback);
			this.body.addEventListener('mouseout', this.resumeCallback);
			
			this.previousButton.addEventListener('mousedown', function ()
			{
				self.setState(true, false);
			});
			
			this.previousButton.addEventListener('mouseup', mouseupListener);
			
			this.nextButton.addEventListener('mousedown', function ()
			{
				self.setState(false, true);
			});
			
			this.nextButton.addEventListener('mouseup', mouseupListener);
			
			this.setScrollTimeout();
		}
	},
	
	setScrollTimeout: function(delay)
	{
		clearTimeout(this.timeoutId);
		this.timeoutId = setTimeout(this.scrollCallback, (delay || this.options.delay) * 1000);
	},
	
	setState: function(previous, next)
	{
		this.previousOld = this.previous;
		this.nextOld = this.next;
		this.previous = previous;
		this.next = next;
		
		this.setScrollTimeout(this.options.interval);
	},
	
	scroll: function()
	{
		var left = this.list.getStyle('left');
		
		if (this.paused && left % this.itemWidth == 0)
		{
			this.timeoutId = null;
			return;
		}
		
		if (this.previous && left >= 0)
			left = - this.itemWidth * this.itemNum;
		else if (left <= - this.itemWidth * this.itemNum)
			left = 0;
		
		var previous = this.previous;
		
		if ((this.previousOld || this.nextOld) && !(this.previous || this.next))
		{
			if (left % this.itemWidth == 0)
				this.previousOld = this.nextOld = false;
			else
				previous = this.previousOld;
		}
		
		left += (previous ? 1 : -1 ) * this.options.stepWidth;
		this.list.setStyle({left: left});
		
		var delay = this.previous || this.next || left % this.itemWidth != 0 ? this.options.interval : this.options.delay;
		this.setScrollTimeout(delay);
	},
	
	pause: function()
	{
		this.paused = true;
	},
	
	resume: function()
	{
		if (this.paused)
		{
			this.paused = false;
			
			if (!this.timeoutId)
				this.setScrollTimeout();
		}
	}
});
