// Slideshow jQuery extension
// Jason D Brown
// v1.2.0
// 19-Aug-2011
//
// Revision History:
// v1.1 Added option for next/prev arrows and easing. Also altdelay, which is the delay after a manual switch.
// v1.2 Added progress indicator option.
;(function($) {

$.fn.extend({
	slideShow : function(settings) {
		defaults = {
			'speed' : 400,
			'delay' : 4000,
			'altdelay' : 0,
			'random' : false,
			'effect' : 'fade',
			'easing' : 'swing',
			'nav' : true,
			'indicator' : true
			};
		if(!settings) settings = defaults;
		$.extend(defaults, settings);
		return this.each(function() {
			var it = $(this);
			var list = $(this).children();
			if(list.length <= 1) {return;}
			list.hide();
			$(this).data('slideShowSettings', defaults);
			$(this).data('slideShowElements', list);
			var first = Math.floor(Math.random() * list.length);
			$(this).data('slideShowIndex', first);
			$(list[first]).show();
			$(this).data('slideShowDelay', setTimeout(function() {
				it.slideShowAutoNext();
			}, defaults['delay']));
			if(defaults['nav']) {
				$('<span class="slideshow-nav-next"></span>').appendTo(it).click(function() {
					var switchto = it.data('slideShowIndex');
					var list = it.data('slideShowElements');
					switchto = (switchto + 1) % list.length;
					it.slideShowSwitch(switchto, true);
				});
				$('<span class="slideshow-nav-prev"></span>').appendTo(it).click(function() {
					var switchto = it.data('slideShowIndex');
					var list = it.data('slideShowElements');
					switchto = (switchto + list.length - 1) % list.length;
					it.slideShowSwitch(switchto, true);
				});
			}
			if(defaults['indicator']) {
				var indi = $('<span class="slideshow-indicator"></span>').appendTo(it);
				for(var n = 0; n < $(this).data('slideShowElements').length; n++) {
					$('<span></span>').appendTo(indi).data('myID', n).click(function() {
						it.slideShowSwitch($(this).data('myID'), true);
					});
				}
				it.data('slideShowIndicator', indi);
				$(':nth-child(' + (it.data('slideShowIndex')+1) + ')', indi).addClass('active');
			}
		});
	},
	slideShowAutoNext : function() {
		var switchto = this.data('slideShowIndex');
		var list = this.data('slideShowElements');
		var opts = this.data('slideShowSettings');
		if(opts['random']) {
			while(switchto == this.data('slideShowIndex')) {
				switchto = Math.floor(Math.random() * list.length);
			}
		} else {
			switchto = (switchto + 1) % list.length;
		}
		this.slideShowSwitch(switchto, false);
	},
	slideShowSwitch : function(switchto, altdelay) {
		var list = this.data('slideShowElements');
		var opts = this.data('slideShowSettings');
		if($.fn.effect) {
			var outDir = 'left';
			var inDir = 'right';
			if((switchto == (this.data('slideShowIndex') + list.length - 1) % list.length) && altdelay) {
				inDir = 'left';
				outDir = 'right';
			}
			$(list[this.data('slideShowIndex')]).hide(opts.effect, {'easing' : opts.easing, 'direction' : outDir}, opts.speed);
			$(list[switchto]).show(opts.effect, {'easing' : opts.easing, 'direction' : inDir}, opts.speed);
		} else {
			$(list[this.data('slideShowIndex')]).fadeOut(opts.speed);
			$(list[switchto]).fadeIn(opts.speed);
		}
		this.data('slideShowIndex', switchto);
		var it = this;
		$('span:nth-child(' + (switchto+1) + ')', it.data('slideShowIndicator')).addClass('active').siblings().removeClass('active');
		clearTimeout($(this).data('slideShowDelay'));
		$(this).data('slideShowDelay', setTimeout(function() {
			it.slideShowAutoNext();
		}, (altdelay && it.data('slideShowSettings')['altdelay'] != 0) ? it.data('slideShowSettings')['altdelay'] : it.data('slideShowSettings')['delay']));
	}
});

})(jQuery);
