(function($) {
  //
  // plugin definition
  //
	$.fn.cyclicFade = function(options)
	{
		var opts = $.extend({}, $.fn.cyclicFade.defaults, options);
		return this.each(function() {
			$.fn.cyclicFade.doCycle(this,1,opts.repeat,opts.params,0);
		});
	};
	
	$.fn.cyclicFade.defaults = {
		repeat: 0,
		params: [{fadeout:100, stayout:300, opout:0, fadein:100, stayin:300, opin:1.0}]
	};
	
	// this function is used internally
	$.fn.cyclicFade.doCycle = function(obj,start,finish,paramsList,paramsPos) {
		if (paramsPos >= paramsList.length) {
			paramsPos = 0;
		}
		// important: params must be a local variable (var) otherwise it gets overwritten by other
		// calls to doCycle
		var params = paramsList[paramsPos];
		$(obj).fadeTo(params.fadeout, params.opout, function() {
			setTimeout(function() {
				$(obj).fadeTo(params.fadein, params.opin, function() {
					setTimeout(function(){
						if(start!=finish) {
							// increment start only if it is bounded
							if (start<finish) {
								start++;
							}
							$.fn.cyclicFade.doCycle(obj,start,finish,paramsList,paramsPos+1);
						}
					}, params.stayin)
				})
			}, params.stayout)
		});	
	};
	
})(jQuery); 


