/* --------------------------- */
/* Based on:                   */ 
/* @author Stéphane Roucheray  */
/* @extends jquery             */
/* modified by Efinity         */
/* --------------------------- */

jQuery.fn.carousel = function(previous, next, options){

	var sliderList = jQuery(this).children()[0];
				
	if (sliderList) {
				
		var increment = jQuery(sliderList).children().outerWidth("true"),
		    elmnts = jQuery(sliderList).children(),
		    numElmts = elmnts.length,
		    sizeFirstElmnt = increment,
		    shownInViewport = Math.round(jQuery(this).width() / sizeFirstElmnt),
		    firstElementOnViewPort = 1,
		    isAnimating = false,
			ElementsInSegment = 3,
			slideOnViewPort = 1,
			slideIndex = 1,
			numberOfSlide = Math.ceil(numElmts / ElementsInSegment),
			ElementsContainerWidth,
			numberOfElementsAdded,
			currentSlide = 1,
			segmentTransition,
			$carouselControl = $('div.carousel-control'),		
			carouselControlMarkUp = "";
					
		/* set the elements container width to fit all the elements + the clone */
		ElementsContainerWidth = (numberOfSlide * ElementsInSegment * increment) + (ElementsInSegment * increment);
						
		jQuery(sliderList).css('width', ElementsContainerWidth + "px");
		
		/* count number of blank <li> need to be added and adding them */
		numberOfElementsAdded = (numberOfSlide * ElementsInSegment) - numElmts;
		
		for (i = 0; i < numberOfElementsAdded; i++)
		{
			jQuery(sliderList).append('<li>&nbsp;</li>');
		}
		
		/* clone the first x elements */
		for (i = 0; i < ElementsInSegment; i++) {			
			jQuery(sliderList).append(jQuery(elmnts[i]).clone());
		}
						
		/* adding the control */				
		
		carouselControlMarkUp = carouselControlMarkUp + "<ul class='carousel-control'>";				
		
		carouselControlMarkUp = carouselControlMarkUp + "<li class='control'><span class='arrow carousel-prev'>&laquo;</span></li>";
		//carouselControlMarkUp = carouselControlMarkUp + "<li class='control'><span class='carousel-prev'><span class='arrow'>&laquo;</span></span></li>";
		//carouselControlMarkUp = carouselControlMarkUp + "<li class='control'><a class='carousel-prev'><span class='arrow'>&laquo;</span></a></li>";
		
		carouselControlMarkUp = carouselControlMarkUp + "<li class='divider selected'><a class='carousel-page'>1</a></li>";
						
		for (i = 2; i < numberOfSlide; i++) {			
			carouselControlMarkUp = carouselControlMarkUp + "<li class='divider'><a class='carousel-page'>" + i + "</a></li>";
		}	
		
		carouselControlMarkUp = carouselControlMarkUp + "<li><a class='carousel-page'>" + numberOfSlide + "</a></li>";
		carouselControlMarkUp = carouselControlMarkUp + "<li class='total-page'>of " + numberOfSlide + "</li>";		
		
		carouselControlMarkUp = carouselControlMarkUp + "<li class='control'><span class='arrow carousel-next'>&raquo;</span></li>";				
		//carouselControlMarkUp = carouselControlMarkUp + "<li class='control'><span class='carousel-next'><span class='arrow'>&raquo;</span></span></li>";				
		//carouselControlMarkUp = carouselControlMarkUp + "<li class='control'><a class='carousel-next'><span class='arrow'>&raquo;</span></a></li>";				
		
		carouselControlMarkUp = carouselControlMarkUp + "</ul>";
				
		$carouselControl.html(carouselControlMarkUp);
						
		/* if page link is clicked */
		$('a.carousel-page').click(function()
		{	
			slideIndex = $(this).text();
									
			/* removing and adding selected class */
			$('ul.carousel-control li').removeClass('selected');
			$(this).parent().addClass('selected');	
									
			if (slideOnViewPort == slideIndex)
			{
				return false;
			}
			else
			{								
				if (!isAnimating) 
				{																												
					//jQuery(sliderList).css('left', "-" + ((slideIndex - 1) * increment * ElementsInSegment) + "px");
					
					/* slide to the selected slide & determine the direction of the sliding animation*/										
					if (slideOnViewPort < slideIndex)
					{
						segmentTransition = slideIndex - slideOnViewPort;
												
						jQuery(sliderList).animate({
							left: "-=" + (segmentTransition * ElementsInSegment * increment),					
							y: 0,
							queue: true
						}, "swing", function(){isAnimating = false;});														
					}
					else
					{													
						segmentTransition = slideOnViewPort - slideIndex;
						
						jQuery(sliderList).animate({
							left: "+=" + (segmentTransition * ElementsInSegment * increment),					
							y: 0,
							queue: true
						}, "swing", function(){isAnimating = false;});															
					}
					slideOnViewPort = slideIndex;
					isAnimating = true;
				}
			}
			
		});
		
		/* if previous button is clicked */
		jQuery(previous).click(function(event)
		{
			if (!isAnimating) 
			{																
				/* sliding */
				if (slideOnViewPort == 1) 
				{
					jQuery(sliderList).css('left', "-" + (ElementsContainerWidth - (ElementsInSegment * increment)) + "px");
					slideOnViewPort = numberOfSlide;
				}
				else 
				{
					slideOnViewPort--;
				}
								
				jQuery(sliderList).animate({
					left: "+=" + (ElementsInSegment * increment),					
					y: 0,
					queue: true
				}, "swing", function(){isAnimating = false;});
				isAnimating = true;
								
				/* removing and adding selected class */				
				if (slideOnViewPort > numberOfSlide)
				{
					currentSlide = 1;
				}
				else
				{
					currentSlide = slideOnViewPort;					
				};
				
				$('ul.carousel-control li').removeClass('selected');												
				$("a.carousel-page:contains('" + currentSlide + "')").parent().addClass('selected');								
			}
			
		});
		
		/* if next button is clicked */
		jQuery(next).click(function(event){
			if (!isAnimating) 
			{																						
				if (slideOnViewPort > numberOfSlide) 
				{
					slideOnViewPort = 2;
					jQuery(sliderList).css('left', "0px");
				}
				else
				{
					slideOnViewPort++;
				}
				
				jQuery(sliderList).animate({
					left: "-=" + (ElementsInSegment * increment),					
					y: 0,
					queue: true
				}, "swing", function(){isAnimating = false;});
				
				isAnimating = true;
																				
				/* removing and adding selected class */
				if (slideOnViewPort > numberOfSlide)
				{
					currentSlide = 1;					
				}
				else 
				{
					currentSlide = slideOnViewPort;
				};
				
				$('ul.carousel-control li').removeClass('selected');												
				$("a.carousel-page:contains('" + currentSlide + "')").parent().addClass('selected');								
			}
		});				
	}
};

