/** *** jQuery plugin ***
 * ****  fadeTicker  ****
 ***********************
 * Mostra un elemento alla volta di una lista, usando un effetto di dissolvenza per la transizione.
 * Opzioni disponibili:
 * - timeout: tempo di visualizzazione di un elemento (tempi di fadein e fadeout esclusi).
 * - fadeTime: durata degli effetti di fadeIn e fadeOut. Se impostato a 0, non viene effettuata la dissolvenza ma una transizione secca.
 * - circular: definisce se ricominciare dal primo elemento una volta arrivati alla fine.
 * - stopOnMouseOver: indica se il ticker deve interrompere le transizioni quando il mouse passa sopra la lista.
 *
 * Es:
 * $('.ticker').fadeTicker({timeout: 3000, fadeTime: 250});
 *
 * *** TODO ***
 * Modificare l'ul mettendoci intorno un div di dimensioni fissate
 * pari a un singolo elemento (come fanno jCarouselLite e jScrollPane).
 * Questa modifica introduce la dipendenza dal plugin dimensions.
 */
;(function($) {
$.fn.fadeTicker = function(opts) {
	opts = $.extend(
		{
			timeout: 3000,
			fadeTime: 500,
			circular: true,
			stopOnMouseOver: true,
			itemsSelector: '>li'
		},
		opts || {});

	return this.each(function() {
		var items = $(opts.itemsSelector, this);
		if (items.length<0) {
			return;
		}
		var currItem = 0;
		var timeout = false;
		var isActive = true;

		items.hide();
		//alert('FadeTicker\n1\n'+items.get());return false;
		$(items[currItem]).show();
		
		

		/* fade out current item */
		function goNext() {
			if (opts.fadeTime > 0) {
				$(items[currItem]).fadeOut(opts.fadeTime, fadeInNext);
			} else {
				$(items[currItem]).hide();
				fadeInNext();
			}
		};
		/* fade in next item, then make it current */
		function fadeInNext() {
			if (opts.circular) {
				currItem = (currItem + 1) % items.length;
				if (opts.fadeTime > 0) {
					$(items[currItem]).fadeIn(opts.fadeTime, currentDone);
				} else {
					$(items[currItem]).show()
					currentDone();
				}
			} else {
				currItem++;
				if (currItem < items.length) {
					if (opts.fadeTime > 0) {
						$(items[currItem]).fadeIn(opts.fadeTime);
					} else {
						$(items[currItem]).show();
					}
				}
			}
		}
		/* schedule next fade, if ticker is active */
		function currentDone() {
			if (isActive) {
				if (timeout) {
					window.clearTimeout(timeout);
				}
				timeout = window.setTimeout(goNext, opts.timeout);
			}
		}
		/* stop/restart when mouse moves in/out */
		if (opts.stopOnMouseOver) {
			$(this).hover( function() { /* mouse in */
					isActive = false;
					if (timeout) {
						window.clearTimeout(timeout);
					}
					timeout = false;
				},
				function() { /* mouse out */
					isActive = true;
					currentDone();
				}
			);
		}
		isActive = true;
		// start timer
		currentDone();
	});
}
})(jQuery);

