// jquery.innerfade.js
// Datum: 2008-02-14
// Firma: Medienfreunde Hofmann & Baldes GbR
// Author: Torsten Baldes
// Mail: t.baldes@medienfreunde.com
// Web: http://medienfreunde.com
// based on the work of Matt Oakes http://portfolio.gizone.co.uk/applications/slideshow/
// and Ralf S. Engelschall http://trainofthoughts.org/
//
// also based on jquery.animated.innerfade.js
// Datum: 2007-10-30
// Firma: OpenStudio
// Autor: Arnault PACHOT
// Mail: apachot@openstudio.fr
// Web: http://www.openstudio.fr
//
// *** modified by Greg Seifert on 5/15/2009 for ebiblefellowship.com ***
(function($) {
	$.fn.innerfade = function(options) {				
		return this.each(function() {   
			$.innerfade(this, options);
		});
	};
	
	$.innerfade = function(container, options) {		
		var settings = {		
			animationtype: 'fade',
			speed: 'normal',
			type: 'sequence',
			timeout: 2000,
			containerheight: 'auto',
			runningclass: 'innerfade',
			children: null,
			fr: null, 
			controlbox: false, 
			controlboxid: 'control-box', 
			controlbuttonspath: 'img'			
		};		
		
		if (options) $.extend(settings, options);
		if (settings.children == null) var elements = $(container).children();
		else var elements = $(container).children(settings.children);
		if (elements.length > 1) {
			settings.active = false;
			settings.paused = false;
			switch (settings.type) {
				case 'random_start':
					settings.type = 'sequence';
					settings.prev = Math.floor((Math.random()%1) * elements.length);
					settings.current = (settings.prev + 1) % elements.length;
					settings.next = (settings.current + 1) % elements.length;
					break;
				case 'shuffle':
					settings.type = 'sequence';
				case 'random':
					shuffle(elements);
				case 'sequence':
					settings.prev = elements.length - 1;
					settings.current = 0;
					settings.next = 1;
					break;
				default:
					return;
			}
			
			$(container).css('position', 'relative').css('height', (settings.containerheight == 'dynamic') ? $(elements[settings.current]).height() : settings.containerheight).addClass(settings.runningclass);
			for (var i = 0; i < elements.length; i++) {
				$(elements[i]).css('z-index', String(elements.length-i)).css('position', 'absolute').hide();
			};
			
			fandr(settings.fr, elements[settings.current]);
			settings.timer = setTimeout(function() {				
				$.innerfade.next(container, elements, settings);
			}, (settings.timeout == 'dynamic') ? getTimeout(elements[settings.current]) : settings.timeout);
			$(elements[settings.current]).show();			

			if (settings.controlbox) {
				if ($("#"+settings.controlboxid).length > 0) $("#"+settings.controlboxid).show();
				else $(container).before("<div id='"+settings.controlboxid+"'><img src='"+settings.controlbuttonspath+"/play.gif' style='display: none;' /><a class='prev-button' href='#'><img src='"+settings.controlbuttonspath+"/previous.gif' alt='previous' style='border: none;' /></a> <a class='pause-button' href='#'><img src='"+settings.controlbuttonspath+"/pause.gif' alt='pause' style='border: none;' /></a> <a class='next-button' href='#'><img src='"+settings.controlbuttonspath+"/next.gif' alt='next' style='border: none;' /></a></div>");
				$("#"+settings.controlboxid+" a.next-button").bind('click', function() { if (settings.active) return false; settings.paused = false; clearTimeout(settings.timer); $("#"+settings.controlboxid+" a.pause-button").html("<img src='"+settings.controlbuttonspath+"/pause.gif' alt='pause' style='border: none;' />"); $.innerfade.next(container, elements, settings); return false; });
				$("#"+settings.controlboxid+" a.prev-button").bind('click', function() { if (settings.active) return false; settings.paused = false; clearTimeout(settings.timer); $("#"+settings.controlboxid+" a.pause-button").html("<img src='"+settings.controlbuttonspath+"/pause.gif' alt='pause' style='border: none;' />"); settings.next = settings.prev; $.innerfade.next(container, elements, settings); return false; });
				$("#"+settings.controlboxid+" a.pause-button").bind('click', function() {										
					if (settings.active) return false;
					clearTimeout(settings.timer);
					if (!settings.paused) {
						settings.paused = true;
						$(this).html("<img src='"+settings.controlbuttonspath+"/play.gif' alt='play' style='border: none;' />");
						$(elements[settings.current]).stop().stop();						
					}
					else {
						settings.paused = false;
						$(this).html("<img src='"+settings.controlbuttonspath+"/pause.gif' alt='pause' style='border: none;' />");						
						$.innerfade.next(container, elements, settings);
					}
					return false;
				});
			}
		}
		else {
			if ($("#"+settings.controlboxid).length > 0) $("#"+settings.controlboxid).hide();
			if (elements.length == 1 && settings.containerheight == 'dynamic') $(container).css('height', $(elements[0]).height());
		}
		
		$(container).one('cancelInnerfade', function(e) {			
			settings.active = false;
			clearTimeout(settings.timer); 
			$(elements[settings.current]).stop().stop();				
			if (settings.controlbox) {
				$("#"+settings.controlboxid+" a.pause-button").html("<img src='"+settings.controlbuttonspath+"/pause.gif' alt='pause' style='border: none;' />");
				$("#"+settings.controlboxid+" a.next-button").unbind('click');
				$("#"+settings.controlboxid+" a.prev-button").unbind('click');
				$("#"+settings.controlboxid+" a.pause-button").unbind('click');				
			}			
		});		
	};

	$.innerfade.next = function(container, elements, settings) {		
		settings.active = true;
		clearTimeout(settings.timer);		
		if (settings.containerheight == 'dynamic') {			
			if ($(elements[settings.next]).height() < $(elements[settings.current]).height()) {
				var nextIndex = settings.next;
				animateDisplay($(elements[settings.current]), settings, 'hide', function() {
					$height = $(elements[nextIndex]).height();
					if ($height > 0) $(container).css('height', $height);
					fandr(settings.fr, elements[nextIndex]);						
				});
			}
			else {	
				$height = $(elements[settings.next]).height();
				if ($height > 0) $(container).css('height', $height);
				fandr(settings.fr, elements[settings.next]);
				animateDisplay($(elements[settings.current]), settings, 'hide');				
			}
		}
		else {
			fandr(settings.fr, elements[settings.next]);
			animateDisplay($(elements[settings.current]), settings, 'hide');
		}
		animateDisplay($(elements[settings.next]), settings, 'show', function() {			
			settings.active = false;
			if (settings.animationtype == 'fade') removeFilter($(this)[0]);
		});
		
		if (settings.next == settings.prev) {
			if (settings.type == 'sequence') {
				var i = settings.prev - 1;
				if (i < 0) i = elements.length - 1;
				settings.prev = i;
			}
			else {
				settings.prev = Math.floor((Math.random()%1) * elements.length);
				if (settings.next == settings.prev) settings.prev = (settings.next + 1) % elements.length;
			}
		}
		else settings.prev = settings.current;
		settings.current = settings.next;		
		if (settings.type == 'sequence') {						
			settings.next = (settings.current + 1) % elements.length;				
		}
		else {
			settings.next = Math.floor((Math.random()%1) * elements.length);
			if (settings.current == settings.next) settings.next = (settings.current + 1) % elements.length;
		}
		
		settings.timer = setTimeout(function() {			
			$.innerfade.next(container, elements, settings);
		}, (settings.timeout == 'dynamic') ? getTimeout(elements[settings.current]) : settings.timeout);
	};
})(jQuery);

// **** remove Opacity-Filter in ie ****
function removeFilter(element) {
	if (element.style.removeAttribute) {
		element.style.removeAttribute('filter');
	}
}

// slide or fade
function animateDisplay(element, settings, display, callback) {
	if (settings.animationtype == 'slide') {
		if (display == 'hide') element.slideUp(settings.speed, callback);
		else if (display == 'show') element.slideDown(settings.speed, callback);
	}
	else if (settings.animationtype == 'fade') {
		if (display == 'hide') element.fadeOut(settings.speed, callback);
		else if (display == 'show') element.fadeIn(settings.speed, callback);
	}
}

// shuffle the array
function shuffle(a) {
	var i, j, k;
	for (i = a.length - 1; i > 0; i--) {
		j = Math.floor((Math.random()%1) * (i + 1));
		k = a[i];
		a[i] = a[j];
		a[j] = k;
	}
}

// find and replace html
function fandr(fr, element) {
	if (fr != null) $(fr.find).html($(element).find(fr.replace).html());	
}

// dynamic timeout based on word count
function getTimeout(element) {
	var wps = 2, min = 5000, max = 45000;	
	var words = $(element).text().split(' ').length;
	var timeout = Math.ceil(words / wps) * 1000;	
	if (timeout < min) timeout = min;
	else if (timeout > max) timeout = max;
	return timeout;
}

