(function( $ ){

	$.fn.carousel = function( options ) {

		var $this = $(this);

		var settings = {
			'shown'		:	1,
			'duration'	:	500,
			'easing'	:	'easeInOutExpo',
			'loop'		:	false,
			'autoPlay'	:	false,
			'autoPlayDuration'	:	3000
		};

		if ( options ) { 
			$.extend( settings, options );
		}

		var animating = false;
		var liWidth = parseInt($this.find('.slides ul li').outerWidth(true));
		var liLength = $this.find('.slides ul li').length;
		var totalWidth = (liWidth * liLength) - (liWidth * settings['shown']);
		var numberOfSlides = Math.ceil(liLength / settings['shown']);
		var currentSlide = 1;
		var autoPlay;

		checkActive();

		// Slide Controls

		$this.find('.arrow.left a').click(function() {
			clearInterval(autoPlay);
			previousSlide();
			return false;
		});

		$this.find('.arrow.right a').click(function() {
			clearInterval(autoPlay);
			nextSlide();
			return false;
		});

		function previousSlide() {
			var slideMargin = parseInt($this.find('.slides ul').css('margin-left'));

			if (slideMargin < 0 && !animating) {
				animating = true;
				currentSlide--;
				$this.find('.slides ul').animate({
					'margin-left' : '+=' + (liWidth * settings['shown']) + 'px'
				}, settings['duration'], settings['easing'], function() {
					animating = false;
					checkActive();
				});
			} else if (!animating && settings['loop']) {
				animating = true;
				currentSlide = numberOfSlides;
				$this.find('.slides ul').animate({
					'margin-left' : (liWidth * settings['shown']) * (numberOfSlides - 1)*-1 + 'px'
				}, settings['duration'], settings['easing'], function() {
					animating = false;
					checkActive();
				});
			}

			return false;
		};

		// Next Slide

		function nextSlide() {
			var slideMargin = parseInt($this.find('.slides ul').css('margin-left'));

			if (slideMargin > totalWidth*-1 && !animating) {
				animating = true;
				currentSlide++;
				$this.find('.slides ul').animate({
					'margin-left' : '-=' + (liWidth * settings['shown']) + 'px'
				}, settings['duration'], settings['easing'], function() {
					animating = false;
					checkActive();
				});
			} else if (!animating && settings['loop']) {
				animating = true;
				currentSlide = 1;
				$this.find('.slides ul').animate({
					'margin-left' : '0px'
				}, settings['duration'], settings['easing'], function() {
					animating = false;
					checkActive();
				});
			}

			return false;
		};

		// Check to see which slide you're on

		function checkActive() {
			var slideMargin = parseInt($this.find('.slides ul').css('margin-left'));

			if (slideMargin <= totalWidth*-1) {
				$this.find('.arrow.right a').addClass('inactive');
			} else {
				$this.find('.arrow.right a').removeClass('inactive');
			}

			if (slideMargin >= 0) {
				$this.find('.arrow.left a').addClass('inactive');
			} else {
				$this.find('.arrow.left a').removeClass('inactive');
			}

			if (settings['externalNav']) {
				var externalNav = $(settings['externalNav']);
				externalNav.children('a').removeClass('active');
				externalNav.children('a:nth-child(' + currentSlide + ')').addClass('active');
			}
			
		}

		// Create external navigation if specified

		if (settings['externalNav']) {

			var externalNav = $(settings['externalNav']);

			for(var i = 0; i < numberOfSlides; i++) {
				externalNav.append('<a href="#" slide="' + i + '">Slide ' + i + '</a>');
			}

			if (settings['tooltips']) {
				var tooltips = settings['tooltips'];

				var i = 0;
				externalNav.children('a').each(function() {
					$(this).attr('alt', tooltips[i]);
					i++;
				});

				externalNav.children('a').qtip({
					content: {
						attr: 'alt'
					},
					position: {
						my: 'bottom center',
						at: 'top center'
					},
					style: {
						classes: 'ui-tooltip-shadow ui-tooltip-rounded ui-tooltip-youtube'
					}
				});
			}

			externalNav.children('a:first').addClass('active');

			externalNav.children('a').click(function() {
				if (!animating) {
					var slideTo = parseInt($(this).attr('slide'));
					animating = true;
					currentSlide = slideTo + 1;
					$this.find('.slides ul').animate({
						'margin-left' : (liWidth * settings['shown']) * (slideTo*-1) + 'px'
					}, settings['duration'], settings['easing'], function() {
						animating = false;
						checkActive();
					});
				}

				return false;
			});

		}

		// AutoPlay if enabled

		if (settings['autoPlay']) {

			autoPlay = setInterval(function() {
				nextSlide();
			}, settings['autoPlayDuration']);

		}

	};

})(jQuery);

