/**
 * Madison.com jQuery Carousel
 *   
 * To use it:
 *   - <script src="/path/to/jquery.js"></script>
 *   - <script src="/path/to/jquery.carousel.js"></script>
 *   - In your own <script> tags: $('.Carousel').carousel();
 * 
 * Brent Theisen <btheisen@madison.com>
 * 
 */
jQuery.fn.carousel = function(options) {
	var defaultOptions = {
		direction: 'horizontal',
		previous: '.Previous',
		next: '.Next',
		container: '.CarouselContent',
		content: '.Content',
		disabledClass: 'Disabled'
	};
	options = jQuery.extend(defaultOptions, options);
	
	// If previous and/or next is a string then it is a selector relative to the carousel root
	if(typeof options.previous == 'string')
		options.previous = this.find(options.previous);
	if(typeof options.next == 'string')
		options.next = this.find(options.next);
	
	var carousel = this;
	var container = carousel.find(options.container);
	var content = carousel.find(options.content);

	var moveCoordinate = options.direction == 'horizontal' ? 'left' : 'top';

	content.css(moveCoordinate, 0);
	options.previous.addClass(options.disabledClass);

	var shiftEventHandler = function(event) {
		var containerSize = options.direction == 'horizontal' ? container.width() : container.height();
		var elementSize = options.direction == 'horizontal' ? carousel.find(options.container + ' ul li:first').width() : carousel.find(options.container + ' ul li:first').height();
		var lastPosition = carousel.find(options.container + ' ul li:last').position();
		var maxContentMovePixels = options.direction == 'horizontal' ? lastPosition.left : lastPosition.top;

		var moveTo = event.data.moveTo;
		
		content.queue(function() {
			var contentMovePixels = content.css(moveCoordinate);
			if((indexOf = contentMovePixels.indexOf('px')) != -1)
				contentMovePixels = parseInt(contentMovePixels.substring(0, indexOf));
			else
				contentMovePixels = 0;

			if((moveTo == 'previous' && contentMovePixels >= 0) || (moveTo == 'next' && contentMovePixels - containerSize < -maxContentMovePixels)) {
				jQuery(this).dequeue();
				return;
			}
			
			if(moveTo == 'previous') 
				contentMovePixels += containerSize;
			else if(moveTo == 'next') 
				contentMovePixels -= containerSize;

			var animateOptions = {};
			animateOptions[moveCoordinate] = contentMovePixels;
			content.animate(animateOptions);
			
			if(contentMovePixels >= 0)
				options.previous.addClass(options.disabledClass);
			else if(options.previous.hasClass(options.disabledClass)) 
				options.previous.removeClass(options.disabledClass);
			
			if(-contentMovePixels + containerSize > maxContentMovePixels) 
				options.next.addClass(options.disabledClass);
			else if(options.next.hasClass(options.disabledClass)) 
				options.next.removeClass(options.disabledClass);

			jQuery(this).dequeue();
		});
	}
	
	return this.each(function() {
		var carousel = jQuery(this);
		options.previous.each(function() {
			jQuery(this).bind('click', { moveTo: 'previous', 'carousel': carousel }, shiftEventHandler);
		});
		options.next.each(function() {
			jQuery(this).bind('click', { moveTo: 'next', 'carousel': carousel }, shiftEventHandler);
		});
	});
};
