/* 
*  jQuery Carousel plugin
*  by Zach Waugh
*  v0.1 - 6/24/2008
* 
*/

(function($){
	
$.fn.carousel = function(options) {
	var settings = $.extend({
		next: 'a.next',
		previous: 'a.previous',
		page: 'a.page',
		item: 'li',
		items: '.carousel_items',
		container: '.carousel_container',
		duration: 1000,
		padding: 3
	}, options);
	
	$(this).each(function(){
		// Get count of items
		var count = $(this).find(settings.items).find(settings.item).size();

		// Figure out how many pages are needed
		// Based on count / x, where x = items per page
	  var pages = Math.ceil(count / 4);
	
		var width = $(this).find(settings.container).innerWidth() + settings.padding;
		
		// calc max 
	  var max = (pages - 1) * width;
	  max = '-' + max + 'px';
		
		var info = {carousel: this, width: width, pages: pages, count: count, max: max};
		
		// Bind events
		$(this).find(settings.next).click(function(){
			//var carousel = $(this).parents('.carousel');

			if($(info.carousel).find(settings.items).css('left') != max)
			{ 
				slideRight(info, info.width);
			}

			return false;
		});

		$(this).find(settings.previous).click(function() {
			if ($(info.carousel).find(settings.items).css('left') != '0px')
			{
				slideLeft(info, info.width);
			}

			return false;
		});

		$(this).find(settings.page).click(function(){
			if(!$(this).hasClass('active'))
			{
				slideTo(info, $(info.carousel).find(settings.page).index(this));
			}

			return false;
		});
		
	
	});

	// Helper functions
	function slideTo(info, page)
	{
		var current_page = currentPage(info);
		if(page < current_page)
		{
			slideLeft(info, (current_page - page) * info.width);
		}
		else
		{
			slideRight(info, (page - current_page) * info.width);
		}
	}
	
	function slideLeft(info, distance)
	{
		$(info.carousel).find(settings.items).animate({left: '+=' + distance + 'px'}, settings.duration, function(){
			$(info.carousel).find(settings.next).removeClass('inactive');
			$(info.carousel).find(settings.page).removeClass('active');
			selectPage(info);
			if ($(info.carousel).find(settings.items).css('left') == '0px')
			{
				$(info.carousel).find(settings.previous).addClass('inactive');
			}
		});
	}
	
	function slideRight(info, distance)
	{
		$(info.carousel).find(settings.items).animate({left: '-=' + distance + 'px'}, settings.duration, function(){
			$(info.carousel).find(settings.previous).removeClass('inactive');
			$(info.carousel).find(settings.page).removeClass('active');
			selectPage(info);
			if ($(info.carousel).find(settings.items).css('left') == info.max) { 
				$(info.carousel).find(settings.next).addClass('inactive');
			}
		});
	}
	
	function selectPage(info)
	{
		var page = currentPage(info);
		$(info.carousel).find(settings.page).slice(page, page + 1).addClass('active');
	}
	
	function currentPage(info)
	{
		var left = $(info.carousel).find(settings.items).css('left');
		if (left == 'auto')
		{
			page = 0;
		}
		else
		{
			var position = Math.abs(left.substr(0, left.length - 2));
			var page = position / info.width;
		}

		return page;
	}
	
}
})(jQuery);