/*** DIVSHOW ***
Author: Paul Sayre
Company: SiteCrafting
Created: 2009-03-27
Updated: 2009-04-01
Version: 1.0

Usage: (items in <> are optional)

divshow[id].pause(<true/false>); // Sets the pause state (Toggles if not passed true/false)
divshow[id].random(<true/false>); // Stes the random state (Toggles if not passed true/false)
divshow[id].next(); // Transitions to the next slide
divshow[id].prev(); // Transitions to the previous slide
divshow[id].index(<index>); // Transitions to a specific slide by index (Returns current slide index if nothing is passes)
divshow[id].timeout = 10000; // Set the timeout between each slide (start on next transition)
divshow[id].speed = 750; // Sets the speed of the transition between slides

HTML: (items in <> are optional)

<div id="someid" class="divshow <random> <paused>">
	<div class="slide">
		[Slide 1 HTML]
	</div>
	<div class="slide">
		[Slide 2 HTML]
	</div>
	...
</div>

*/

var divshow = {defaults: {
	timeout: 10000,
	speed: 1000
}};

(function($){

$(function() {
	$('.divshow').each(function(index) {
		
		/***** Init *****/
		
		this.id = this.id || 'divshow-'+index;
		var pub = divshow[this.id] = {};
		var curr = 0;
		var wrapper = $(this);
		var slides = $('.slide', wrapper);
		var lastSlide = slides[0];
		var timer;
		
		// Setup default public values
		for(var key in divshow.defaults) {
			if(!divshow.defaults.hasOwnProperty(key)) continue;
			pub[key] = divshow.defaults[key];
		}
		
		// Set CSS
		slides.not(':eq('+curr+')').hide();
		slides.css({
			top: '0px',
			left: '0px',
			position: 'absolute'
		});
		
		
		
		/***** Private Controls *****/
		
		var prev = function() {
			if(wrapper.hasClass('paused') || wrapper.hasClass('inTrans')) return;
			curr = (curr - 1 + slides.length) % slides.length;
			swap();
		}
		
		var next = function() {
			if(wrapper.hasClass('paused') || wrapper.hasClass('inTrans')) return;
			curr = (curr+1) % slides.length;
			swap();
		}
		
		var goTo = function(index) {
			if(wrapper.hasClass('paused') || wrapper.hasClass('inTrans')) return;
			curr = index;
			swap();
		}
		
		var random = function() {
			if(wrapper.hasClass('paused') || wrapper.hasClass('inTrans')) return;
			if(slides.length < 2) return;
			do {
				curr = parseInt(Math.random() * slides.length);
			} while(lastSlide == slides[curr]);
			swap();
		}
		
		var swap = function() {
			if(slides.length < 2) return;
			wrapper.addClass('inTrans');
			$(lastSlide).removeClass('current-slide').fadeOut(pub.speed);
			lastSlide = slides[curr];
			$(lastSlide).addClass('current-slide').fadeIn(pub.speed, function() { wrapper.removeClass('inTrans'); });
		}
		
		var setRandom = function(setToRandom) {
			if(setToRandom === undefined) setToRandom = !wrapper.hasClass('random');
			if(setToRandom) wrapper.addClass('random');
			else wrapper.removeClass('random');
		}
		
		var setPause = function(setToPaused) {
			if(setToPaused === undefined) setToPaused = !wrapper.hasClass('paused');
			(setToPaused ? pause : unpause)();	
		}
		
		var pause = function() {
			wrapper.addClass('paused');
			clearTimeout(timer);
		}
		
		var unpause = function() {
			wrapper.removeClass('paused');
			(function() {
				var caller = arguments.callee;
				clearTimeout(timer);
				timer = setTimeout(function() {
					(wrapper.hasClass('random') ? random : next)();
					caller();
				}, pub.timeout);
			})();
		}
		
		
		
		/***** Public Controls *****/
		
		pub.prev = function() {
			unpause();
			prev();
			pause();
		};
		
		pub.next = function() {
			unpause();
			next();
			pause();
		};
		
		pub.index = function(val) {
			if(val === undefined) return curr;
			unpause();
			goTo(val);
			pause();
			return curr;
		};
		
		pub.pause = setPause;
		pub.random = setRandom;
		
		
		
		/***** Actions *****/
		
		wrapper.hover(pause, unpause);
		unpause();
	});
});

})(jQuery);
