﻿(function ($) {
	var defaultSettings;

	function carousel(options) {
		var $t;
		$t = $(this);
		$t.each(function (index, element) {
			var data,
                $this,
                $items,
                $buttons,
                $pause,
                $play,
                $start,
                $timer;

			data = {
				carousel: null,
				settings: $.extend({}, defaultSettings, options),
				playing: false,
				timer: null
			};

			if (!data.settings.transitionDelay) {
				data.settings.transitionDelay = defaultSettings.transitionDelay;
			}

			//set $objects
			$this = data.carousel = $(this).data('chcfCarousel', data);
			$items = $(data.settings.itemSelector, this);
			$start = $items.eq(data.settings.start);
			$buttons = $(data.settings.buttonSelector, this);
			$play = $(data.settings.playSelector, this);
			$pause = $(data.settings.pauseSelector, this);
			$timer = $(data.settings.timerSelector, this);

			//hide all items
			//$items.hide();

			//show the start item
			selectItem(data.settings.start, data);

			//delegate the click listener to the nav buttons
			$this.delegate(data.settings.buttonSelector, 'click', data, buttonClick);

			//add the click listener to the play/pause buttons
			$play.click(data, playClick);
			$pause.click(data, pauseClick);

			//start the carousel spinning
			if (data.settings.play) {
				//play the carousel
				play(false, data);
			}
		});
		return $t;
	};

	function buttonClick(e) {
		//one of the buttons was clicked
		var index,
            $item;
		index = $(e.data.settings.buttonSelector, e.data.carousel).index(this);
		pause(e.data);
		selectItem(index, e.data);
		return false;
	}

	function playClick(e) {
		//play was clicked
		play(false, e.data);
		selectNextItem(e.data);
		return false;
	}

	function pauseClick(e) {
		//pause was clicked
		pause(e.data);
		return false;
	}

	function play(cont, data) {
		//play the carousel
		var delay, $timer, timerVal;
		if (!cont) {
			data.playing = true;
		}
		if (data.playing) {
			clearTimeout(data.timer);
			delay = data.settings.transitionDelay;
			$timer = $(data.settings.itemSelector, data.carousel).filter('.' + data.settings.activeClass).find(data.settings.timerSelector);
			timerVal = parseInt($timer.val());
			if (timerVal > 0) {
				delay = timerVal;
			}
			data.timer = setTimeout(function () { selectNextItem(data) }, delay);
			$(data.settings.playSelector, data.carousel).addClass(data.settings.activeClass);
			$(data.settings.pauseSelector, data.carousel).removeClass(data.settings.activeClass);
		}
	}
	function pause(data) {
		//pause the carousel
		if (data.playing) {
			clearTimeout(data.timer);
			data.playing = false;
			$(data.settings.playSelector, data.carousel).removeClass(data.settings.activeClass);
			$(data.settings.pauseSelector, data.carousel).addClass(data.settings.activeClass);
		}
	}
	function selectItem(index, data) {
		//select a particular item
		var $items,
            $buttons,
            $activeItem,
            $activeButton;
		$items = $(data.settings.itemSelector, data.carousel);
		$buttons = $(data.settings.buttonSelector, data.carousel);
		$activeItem = $items.eq(index);
		$activeButton = $buttons.eq(index);
		$items.stop(true, true).not($activeItem).fadeOut(data.settings.speed).removeClass(data.settings.activeClass);
		if ($activeItem.is(":visible")) {
			$activeItem.addClass(data.settings.activeClass);
		} else {
			$activeItem.delay(data.settings.speed).fadeIn(data.settings.speed, function () { play(true, data) }).addClass(data.settings.activeClass);
		}
		$buttons.not($activeButton).removeClass(data.settings.activeClass);
		$activeButton.addClass(data.settings.activeClass);
	}
	function selectNextItem(data) {
		//select the next item
		var $items,
            $activeItem,
            index;

		$items = $(data.settings.itemSelector, data.carousel);
		$activeItem = $items.filter('.' + data.settings.activeClass);
		index = $items.index($activeItem) + 1;
		if (index >= $items.length) index = 0;
		selectItem(index, data);
	}

	defaultSettings = {
		activeClass: 'selected',
		buttonSelector: '.button',
		itemSelector: '.item',
		pauseSelector: '.pause',
		play: true,
		playSelector: '.play',
		speed: 'slow',
		start: 0,
		timerSelector: '.timer',
		transitionDelay: 10000
	};

	$.fn.chcfCarousel = carousel;

})(jQuery);
