/*

  simpleFade (a jQuery plugin)

  http://helloworld.free.bg/simpleFade/

  m2k 2010

*/

(function( $ ){

	$.fn.simpleFade = function(options) {



	// Fields

	var item  = this;

	var timer = null;

	var index = 0;

	var animated = false;

	

	// Properties

	var s = $.extend({

		speed    : 400, 

		duration : 5000,

		auto     : true,

		effect   : null,

		animate  : {opacity: 'hide'},

		easing   : 'swing',

		init   : null,

		onFade : null, 

		onAfterFade : null, 

		fadeTo : FadeToT,

		next   : Next,

		prev   : Prev,

		stop   : StopT,

		start  : StartT

	}, options || {});

	

	// Init

	if($.isFunction(s.init)) s.init();

	SetActive();

	OnFade(0);

	OnAfterFade(0);

	Start();

	

	// Public

	function Next() {

		if (animated) return;

		FadeTo(index == item.length-1 ? 0 : index+1);

	}

	function Prev() {

		if (animated) return;

		FadeTo(index-1 < 0 ? item.length-1 : index-1);

	}

	function FadeToT(idx) {

		if (animated || idx == index) return;

		FadeTo(idx);

	}

	

	function StartT() {

		s.auto = true;

		Start();

	}

	

	function StopT() {

		s.auto = false;

		Stop();

	}

	

	// Private

	function SetActive() {

		item.css('z-index', 1).show().eq(index).css('z-index', item.length);

	}

	

	function PrepareActive(idx) {

		item.eq(idx).css('z-index', item.length-1);

	}

	

	function Start() {

		if (!s.auto) return;

		

		timer = setInterval(function () {

			FadeTo(index == item.length-1 ? 0 : index+1);

		}, s.duration);

	}

	

	function Stop() {

		clearInterval(timer);

	}

	

	function FadeTo(idx) {

		Stop();

		PrepareActive(idx);

		Fade(idx);

	}

	

	function Fade(idx) {

		animated = true;

		if (s.effect != null) {

			item.eq(index).effect(s.effect, s.speed, function () {

				AfterFade(idx);

			});

		} else {

			var style = item.length ? item.eq(index)[0].style.cssText : '';

			item.eq(index).animate(s.animate, s.speed, s.easing, function () {

				this.style.cssText = style;

				AfterFade(idx);

			});

		}

		OnFade(idx);

	}

	

	function AfterFade(idx) {

		index = idx;

		SetActive();

		animated = false;

		OnAfterFade(idx);

		Start();

	}

	

	function OnFade(idx) {

		if($.isFunction(s.onFade)) s.onFade(idx);

	}

	function OnAfterFade(idx) {

		if($.isFunction(s.onAfterFade)) s.onAfterFade(idx);

	}

	

	return this;

	};

})( jQuery );
