/*!
 * (v) Carousel (v20110508)
 * Carousel with paging
 */
(function($){
	$.fn.vCarousel = function(options) {
	    var settings = {
			'step' 			: 4,			// number of item to slide at once
			'visible'		: 4,			// number of items visible
			'start' 		: 1,			// item to start with
			'time'			: 1250,			// time of the slide transition
			'cycle'			: 0,			// time between auto switch
			'equalize'		: 0,			// insert empty items to level with step multiplier
			'easing'		: 'swing'		// easing method
	    };
	
		return this.each(function() {
			if (options) $.extend(settings, options);
			
			// aliases
			var $root 			= $(this);
			var $slider 		= $root.find('.slider');
			var $item 			= $slider.find('ul li');
			var count 			= $item.size();
			var pages			= Math.ceil(count/settings.step);
			
			// equalize
			if(settings.equalize){
				var missing = pages * settings.step - count;
				count = pages * settings.step;
				for(i = 0; i < missing; i++) $slider.find('ul').append('<li class="empty"></li>');
			}
		
			// correct slider width
			var itemWidth 		= $item.outerWidth();
			var itemMargin 		= parseInt($item.css('margin-right'));
			var itemTotal 		= itemWidth + itemMargin;
			var stepWidth 		= settings.step * (itemWidth + itemMargin);
			var packWidth 		= itemTotal * count;
			var sliderWidth 	= packWidth * 5;
		
			// slider width and position
			var current = settings.start;
			$slider.width(sliderWidth).css('margin-left','-'+(packWidth * 2 + (current * itemTotal - itemTotal))+'px').show();
		
			// clone items for cycle
			$slider.find('ul').clone().appendTo($slider).clone().appendTo($slider).clone().appendTo($slider).clone().appendTo($slider);
		
			// indicators
			var indicators = '<ul class="indicators">'; 
			for(i = 0; i < count; i++) indicators += '<li'+ (i >= (current-1) && i < current + settings.visible -1 ? ' class="active"' : '') +'><a href="#i'+ (i+1) +'">'+ (i+1) +'</a></li>';
			indicators += '</ul>';
			$root.append(indicators);
			
			$root.find('ul.indicators li a').click(function(){
				if($slider.is(':animated')) return false;
				$slider.css('margin-left',(-packWidth * 2 - (current * itemTotal - itemTotal)) +'px');
			
				var next = parseInt($(this).text(),10);
				var $clicked = $(this);
			
				$slider.animate({marginLeft: (-packWidth * 2) - (next * itemTotal - itemTotal) + 'px'},settings.time,settings.easing,function(){
					current = next;
					update(current);
				});
				return false;
			});
			
			// paging			
			var page = Math.ceil(current/settings.step);
			var paging = '<ul class="paging">'; 
			for(i = 0; i < pages; i++) paging += '<li'+ (i == (page-1) ? ' class="active"' : '') +'><a href="#p'+ (i+1) +'">'+ (i+1) +'</a></li>';
			paging += '</ul>';
			$root.append(paging);
		
			$root.find('ul.paging li a').click(function(){
				if($slider.is(':animated')) return false;
				$slider.css('margin-left',(-packWidth * 2 - (current * itemTotal - itemTotal)) +'px');
			
				var next = parseInt($(this).text(),10);
				var $clicked = $(this);
			
				$slider.animate({marginLeft: (-packWidth * 2) - (next*settings.step-settings.step) * itemTotal + 'px'},settings.time,settings.easing,function(){
					current = next * settings.step - settings.step + 1;
					
					update(current);
				});
				return false;
			});

			// steps
			$root.append('<ul class="index"><li class="prev"><a href="#prev">Previous</a></li><li class="next"><a href="#next">Next</a></li></ul>');
			
			$root.find('ul.index li a').click(function(){
				if($slider.is(':animated')) return false;
				$slider.css('margin-left',(-packWidth * 2 - (current * itemTotal - itemTotal)) +'px');
			
				var direction = $(this).parent().is('.next') ? -1 : 1;
			
				$slider.animate({marginLeft: '+='+direction*stepWidth},settings.time,settings.easing,function(){
					current = current - direction * settings.step;
					if(current < 1) current = current + count;
					if(current > count) current = current - count;
				
					update(current);
				});
				return false;
			});	
			
			// paging update			
			var update = function(current) {
				var page = Math.ceil(current/settings.step);
				$root.find('ul.paging li:eq('+(page-1)+')').addClass('active').siblings().removeClass('active');
				
				var max = current - 1 + settings.visible;
				$root.find('ul.indicators li').removeClass('active').slice(current-1,current-1+settings.visible).addClass('active');
				if(max > count){
					add = max - count;
					$root.find('ul.indicators li').slice(0,0+add).addClass('active');
				}		
			};
		
			// auto cycle
			if(settings.cycle > 0){					
				var showcaseCycle = setInterval(function(){
					if($root.data('over') != 1)$root.find('ul.index li.next a').trigger('click');
				},settings.cycle+settings.time);
		
				$root.bind('mouseenter',function(){
					$(this).data('over',1);
				}).mouseleave(function() {
					$(this).data('over',0);
				});
			}
			
		});
  };
})(jQuery);
