
(function(){
	$.fn.carousel = function(){
		function repeat(str, n){
			return new Array(n + 1).join(str);
		}
		return this.each(function(){
			var $wrap = $('> div', this),
				$slider = $wrap.find('> ul'),
				$items = $slider.find('> li'),
				$single = $items.filter(':first');
			
			var singleWidth = $single.outerWidth(true),
				visible = Math.ceil($wrap.innerWidth() / singleWidth),
				currentPage = 1,
				pages = Math.ceil($items.length / visible),
			    remainder = $items.length % visible;
				
			
			// Pad with empty elemnent if necessary
			
			if (remainder != 0) {
				$slider.append(repeat('<li class="empty"></li>', visible - remainder));
				$items = $slider.find('> li');
			}
			
			// Create the carousel padding left/right (cloned)
			
			$items.filter(':first').before($items.slice(-visible).clone().addClass('cloned'));
			$items.filter(':last').after($items.slice(0, visible).clone().addClass('cloned'));
			$items = $slider.find('> li');
			
			// Reset scroll position
			$wrap.scrollLeft(singleWidth * visible);
			
			// The scrolling
			function gotoPage(page){
				var dir = page < currentPage ? -1 : 1,
					n = Math.abs(currentPage - page),
					left = singleWidth * dir * visible * n;
				
				$wrap.filter(':not(:animated)').animate({
					scrollLeft : '+=' + left
				}, 500, function(){
					if (page > pages) {
						$wrap.scrollLeft(singleWidth * visible);
						page = 1;						
					}
					else if (page == 0)
					{
						$wrap.scrollLeft(singleWidth * visible * pages);						
						page = pages;
					}
					currentPage = page;
				});
			}
			
			window.gotoPage = gotoPage;
			
			// Insert back forward and page button
			$('#carousel').append('<div class="arrow" id="back"></div><div class="arrow" id="forward"></div>');
			
			// Set slider width
			//$slider.width($items.length * singleWidth);
			
			// Bind back/forward buttons
			$('div#back', this).click(function(){
				gotoPage(currentPage - 1);
			});
			
			$('div#forward', this).click(function(){
				gotoPage(currentPage + 1);
			});
		});
	};
})(jQuery);
