/**
 * --------------------------------------------------------------------
 * jQuery-Plugin "Image Cross-Fader"
 * http://code.google.com/p/jquery-imagecrossfader/
 * Version: 1.2.0, 2009-08-27
 * by Christophe DELIENS (G2F - GET2FUTURE)
 * modified by Nico Schefer, 2011: - added smooth transition without blackout, added addtional text do display in relation with the image (relText)
 *
 * Copyright (c) 2009 Christophe DELIENS
 * Licensed under the MIT Licence (http://www.opensource.org/licenses/mit-license.php)
 */
(function($) {
	// TODO: defining "global" variables prevents this plugin from being usable with multiple instances
	var timerId = null;
	var imageItems = Array();
	var nextIndex = 0;
	var mouseOnContainer = false;
	var settings = null;
	var $me = null;

	$.fn.imageCrossFader = function(options) {
		settings = $.extend($.fn.imageCrossFader.defaults, options);
		
		return this.each(function() {
			$me = $(this);
			
			// finding items
			var items = $me.find('ul li');
			var itemsCount = items.size();
			imageItems = Array(itemsCount);

			// we have our items, emptying the container
			$me.empty().show();
			
			// binding mouse events
			if (settings.pauseOnHover) {
				$me.mouseenter(function() {
					mouseOnContainer = true;
					deleteTimer();
				}).mouseleave(function() {
					mouseOnContainer = false;
					createTimer();
				});
			}
			
			if (settings.index) {
				// building items index container
				var itemsIndex = $('<div></div>').attr('class', 'index').appendTo($me);
			}
			
			
			for (i = 0; i < itemsCount; ++i){
				// building imageCrossFader array
				imageItems[i] = $(items[i]).html();
				
				if (settings.index){
					// adding new index for current item
					$('<p></p>').text(i+1).attr('rel', i).click(function() {
						showItem(imageItems[$(this).attr('rel')]);
						deleteTimer();
						settings.delay = -1;
						return false;
					}).appendTo($(itemsIndex));
				}
				
			}
			
			// initiating imageCrossFader with first item
			showItem(imageItems[0]);
		});
	};
	
	$.fn.showItem = function(index){
		showItem(imageItems[index]);
	};
	
	$.fn.showItemSrc = function(imgSrc){
		showItem("<img src=\""+imgSrc+"\">");
	};

	$.fn.imageCrossFader.defaults = {
		fadeIn: 600,
		fadeOut: 200,
		delay: 3000,
		pauseOnHover: false,
		index: false,
		relTextSrcId: false,
		relTextTargetId: false
	};
	
	function showItem(imgHTML){
		// clearing current running timer
		deleteTimer();
		
		currentIndex = parseInt(array_search(imgHTML,imageItems));
		
		//prepare: set new image as background to prevent fading to black/white during the transition
		$me.css('background-image','url('+ $(imgHTML).attr('src')+')');
		
		// crossfading in new item
		$me.find('div.item').fadeOut(settings.fadeOut, function() {
			$(this).remove();
		});
		$('<div></div>').attr('class', 'item').append(imgHTML).appendTo($me).fadeIn(settings.fadeIn).css('z-index','0');
		
		
		if (settings.index) {
			// "selecting" current item index
			$me.find('div.index p').removeClass('selected');
			$me.find('div.index p[rel=' + currentIndex + ']').addClass('selected');
		}
		
		//set related text
		if(settings.relTextSrcId){
			//copy current source text to target
			$(settings.relTextTargetId).html($(settings.relTextSrcId+currentIndex).html());
		}
		
		// next index math
		nextIndex =currentIndex+1;
		if (nextIndex >= imageItems.length) {
			nextIndex = 0;
		}
		
		if (!mouseOnContainer) {
			createTimer();
		}
	}
	
	function createTimer() {
		if(settings.delay <0) return;
		
		// setting timer for next item display
		timerId = window.setTimeout(function() {
			showItem(imageItems[nextIndex]);
		}, settings.delay);
	}
	
	function deleteTimer() {
		if(settings.delay <0) return;
		
		if (timerId != null) {
			window.clearTimeout(timerId);
		}
	}
	
	function array_search(needle, haystack) {
	    var key;
	    for (key in haystack) {
	        if (haystack[key] == needle) {
	        	return key;
	        }
	    }
	    return false;
	}


})(jQuery);
