/*! Carousel v1 <http://nvinteractive.co.nz>
	Copyright (c) NV Interactive
	
	References:
		jquery-1.2.6.js
		
	Release Notes:

	Usage:
		Carousel list items must be a fixed width.
		
*/

nv_carousel = function(){
	
	var SPEED = 500;
	var AUTODELAY = 5000;
	var AUTORESTART = 2000;
	
	var init = function(){		
		$(".carousel").each(setupCarousel);
	}
	
	var setupCarousel = function(){
		//Check that we have enough items
		var li = $("li", this);
		var w = li.length * li.width();				
		if(w <= $("ul", this).width() ) return;
		
		//Randomise
		$( $("li", this).each( function(){ this.order = Math.random(); }  ).get().sort( carouselSort ) ).appendTo( $("ul", this) );

		
		$("ul", this).width(w + li.width())
		
		$(this).append('<div class="prev"></div><div class="next"></div>');
		
		$("li:first", this).addClass("active");
		$(".next", this).bind("click", {carousel: this, direction: 1}, navigate);
		$(".prev", this).bind("click", {carousel: this, direction: -1}, navigate);
		
		startAuto(this);
	
	}
	
	var carouselSort = function(a, b)
	{
	   var first = a.order;
	   var second = b.order;
	   
	   if (first == second)
		  return 0;
	   if (first < second)
		  return -1;
	   else
		  return 1; 
	}

	
	var startAuto = function(e){		
		var i = setInterval(function(){ auto(e) }, AUTODELAY);
		$(e).data("carousel-interval", i);	
	}
	
	var auto = function(e){
		navigate( {data: {carousel: e, direction: 1, auto: true}} );
	}
	
	var navigate = function(evt){
		
		
				
		var carousel = evt.data.carousel;

		if(!evt.data.auto){
			clearInterval( $(carousel).data("carousel-interval") );
			clearTimeout( $(carousel).data("carousel-timeout") );
			
			var i = setTimeout(function(){ startAuto(carousel) }, AUTORESTART);
			$(carousel).data("carousel-timeout", i);
		}

		//Abort if already animating

		if($("ul:animated", carousel).length > 0)return;
		
		var ul = $("ul", carousel);
				
		var x = ul.position().left;
		var active = $(".active", carousel);
		
		if(evt.data.direction == 1){
			var target = active.next();
			var callback = updateAfterNext;
		}else{

			$("li:last", ul).prependTo(ul);
			ul.css("left", 0 - $(".active", ul).position().left);
			var callback = updateAfterPrev;
			var target = active.prev();
		}
		
		if(target.length==0)return;
		var targetx = 0 - target.position().left;		
		
		ul.animate({left: targetx}, SPEED, callback);
		
		target.addClass("active");
		active.removeClass("active");
		
	}
	
	var updateAfterNext = function(){
		var ul = $(this);
		$("li:first", ul).appendTo(ul);
		ul.css("left", 0 - $(".active", ul).position().left);
	}
	
	var updateAfterPrev = function(){
	}	
	
	return {
	/* Public API
	*/
	init: init
	}
		
}();

$(document).ready(nv_carousel.init);

