(function($){
$.fn.extend({
	simpleScroller : function(options){
		options = $.extend({}, $.SimpleScroller.defaults, {}, options);
		
		//	Iterate over the current set of matched elements	
		return this.each(function(){
			new $.SimpleScroller(this, options);
		});
	}
});

$.SimpleScroller = function(container, options){
	// Create $ object for container element
	var $container = $(container);
	var $itemsHolder = $container.find('.item_holder');
	var $items = $itemsHolder.find('.item');
	var numItems = $items.length;
	var leftButton = $container.find('.left_nav_button');
	var rightButton = $container.find('.right_nav_button');
	//	make sure all items are on one line
	var holderWidth = (numItems+1) * options.itemWidth;
	var isScrolling = false;
	var isAutoScrolling = false;
	
	//	Check for hidden objects
	if((options.width / options.itemWidth) > numItems){
		return;
	}
	
	$itemsHolder.css('width', holderWidth);
	
	$container.bind('scrollComplete', function(){
		$container.timeout = setTimeout(function(){
			AutoScroll('right');
		}, options.autoDelay);
	});
	$container.trigger('scrollComplete');
	
	leftButton.click(function(){
		clearTimeout($container.timeout);
		$container.unbind('scrollComplete');
		if(true === isAutoScrolling){
			$container.trigger('abortScroll', [options, 'left']);
		}
		if(true === isScrolling){
			return;
		}
		Scroll('left', options);
	});
	
	rightButton.click(function(){
		clearTimeout($container.timeout);
		$container.unbind('scrollComplete');
		if(true === isAutoScrolling){
			$container.trigger('abortScroll', [options, 'right']);
		}
		if(true === isScrolling){
			return;
		}
		Scroll('right', options);
	});
	
	function Scroll(direction, options){
		isScrolling = true;
		var distance = 0;
		var $items = $itemsHolder.find('.item');
		var numItems = $items.length;
		
		$container.bind('abortScroll', {}, function(event, options, button){
			abortAutoScroll(options, button);
		});
		
		switch(direction)
		{
			case 'left':
				distance = 0;
                options.beforeClone($items[numItems-1]);
				var clone = $($items[numItems-1]).clone(true);
				$itemsHolder.prepend(clone);
				$itemsHolder.css({left : -options.itemWidth + 'px', width: holderWidth + 'px'});
				break;
			case 'right':
				distance = -(options.itemWidth);
				$itemsHolder.css({left : '0px', width: holderWidth + 'px'});
                options.beforeClone($items[0]);
				var clone = $($items[0]).clone(true);
				$itemsHolder.append(clone);
				break;
		}

        options.afterAppend(clone);
		
		$itemsHolder.animate({left: distance + 'px'}, options.speed, options.easing, function(){
			$items = $itemsHolder.find('.item');
			numItems = $items.length;
			switch(direction)
			{
				case 'left':
					distance = options.itemWidth;
					$($items[numItems-1]).remove();
					break;
				case 'right':
					distance = -(options.itemWidth);
					$($items[0]).remove();
					break;
			}
			$itemsHolder.css({left: '0px', width: holderWidth + 'px'});
			isScrolling = false;
			$container.unbind('abortScroll');
			$container.trigger('scrollComplete', [direction]);
		});
	};
	
	function AutoScroll(direction){
		isAutoScrolling = true;
		var autoOptions = $.extend({}, options, {
			speed : options.autoSpeed
			,easing : options.autoEasing
		});
		
		Scroll('right', autoOptions);
	}
	
	function abortAutoScroll(options, button){
		clearTimeout($container.timeout);
		isAutoScrolling = false;
		$itemsHolder.stop();
		//var leftPosition = new Number(parseFloat($itemsHolder.css('left')));
		var $items = $itemsHolder.find('.item');
		var numItems = $items.length;
		
		switch(button)
		{
			case 'left':
				distance = 0;
				var $removeItem = $($items[numItems-1]);
				break;
			case 'right':
				distance = -options.itemWidth;
				var $removeItem = $($items[0]);
				break;
		}
		
		$itemsHolder.animate({left : distance + 'px'}, 50, options.easing, function(){
			$removeItem.remove();
			$itemsHolder.css({left: '0px', width: holderWidth + 'px'});
			isScrolling = false;
		});
	}
};

$.SimpleScroller.defaults = {
	width: 500
	,itemWidth : 125
	,speed : 500
	,easing : 'swing'
	,autoSpeed : 8000
	,autoEasing : 'linear'
	,autoScroll : false
	,autoDelay : 0
	,direction : 'right'
    ,beforeClone : function(target) {}
    ,afterAppend : function(target) {}
};
})(jQuery);
