 (function ($) {
   $.fn.fadeTransition = function(options) {
	var options = $.extend({pauseTime: 5000, transitionTime: 2000, ignore: null, delayStart: 0, pauseNavigation: false}, options);
	var transitionObject;

	Trans = function(obj) {
	  var timer = null;
	  var current = 0;
	  var els = (options.ignore)?$("> *:not(" + options.ignore + ")", obj):$("> *", obj);
	  $(obj).css("position", "relative");
	  els.css("display", "none").css("left", "0").css("top", "0").css("position", "absolute");
	  
	  if (options.delayStart > 0) {
	    setTimeout(showFirst, options.delayStart);
	  }
	  else
	    showFirst();

	  function showFirst() {
	    if (options.ignore) {
		 $(options.ignore, obj).fadeOut(options.transitionTime);
		 $(els[current]).fadeIn(options.transitionTime);
	    }
	    else {
		 $(els[current]).css("display", "block");
	    }
	  }

	  function transition(next) {
	    $(els[current]).fadeOut(options.transitionTime);
	    $(els[next]).fadeIn(options.transitionTime);
	    current = next;
	    cue();
	  };

	  function cue() {
	    if ($("> *", obj).length < 2) return false;
	    if (timer) clearTimeout(timer);
	    if (!options.pauseNavigation) {
		 timer = setTimeout(function() { transition((current + 1) % els.length | 0)} , options.pauseTime);
	    }
	  };
	  
	  this.showItem = function(item) {
	    if (timer) clearTimeout(timer);
	    transition(item);
	  };

	  cue();
	}

	this.showItem = function(item) {
	  transitionObject.showItem(item);
	};

	return this.each(function() {
	  transitionObject = new Trans(this);
	});
   }

 })(jQuery);
