(function (){
	jQuery.fn.infiniteCarousel = function(){
		function repeat(str,n){
			return new Array(n+1).join(str);
		}
		return this.each(function(){
			var $wrapper = jQuery('> div', this).css('overflow','hidden'),
				$slider = $wrapper.find('> ul'),
				$items = $slider.find('> li'),
				$single = $items.filter(':first'),
			
				singleHeight = 151,
				visible = Math.ceil($wrapper.innerHeight()/singleHeight),
				currentPage = 1,
				pages = Math.ceil($items.length/visible),
				timeOut = 3000;
				
				//TASKS
				
				//1. pad the pages with empty items (empty)
				if ($items.length % visible!=0){
					//pad
					$slider.append(repeat('<li class="empty" />',visible-($items.length % visible)));
					$items = $slider.find('> li');
				}
				
				//2. create the carousel padding left and 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');
				
				
				//3. reset scroll
				$wrapper.scrollTop(singleHeight*visible);
				
				//4. paging function
				function gotoPage(page){
					var dir = page < currentPage ? -1 : 1,
						n = Math.abs(currentPage - page),
						top = singleHeight * dir * visible * n;
					
					$wrapper.filter(':not(:animated)').animate({
						scrollTop : '+=' + top
					}, 800, function(){
						//if page == last page then reset position
						if(page>pages){
							$wrapper.scrollTop(singleHeight*visible);
							page = 1;
						}else if(page==0){
							$wrapper.scrollTop(singleHeight*visible*pages);
							page = pages;
						}
						currentPage = page;
					});
				};
				var times = 2;
				jQuery(document).everyTime(5000, function(i) {
					gotoPage(currentPage+1);
				});
				
				//6. bind the back and forward links
				jQuery('#scrollDown a').click(function(){
					gotoPage(currentPage - 1);
					return false;
				});
				jQuery('#scrollUp a').click(function(){
					gotoPage(currentPage + 1);
					return false;
				});
				
				
				
				// global
				window.gotoPage = gotoPage;
		});
		
	};
})(jQuery)

