(function($) {
	var defaults = {
		wait : 1600,
		startDelay : 0
	};
	
	var methods = {
		init : function(settings) {
			return this.each(function() {
				$($(this).children().toArray().reverse()).each(function(i,item){
					$(item).css({
						'z-index' : '' + i,
						'position' : 'absolute',
						'top' : '0',
						'left' : '0'
					});
				});
				$(this).fadeCycle('queueNext', settings);
			});
		},
		
		fade : function(settings) {
			return this.each(function() {
				reel = $(this).parent();
				var current = reel.find(">.current").toggleClass("current");
				if (current.next("*").toggleClass("current").length === 0) {
					reel.find(">*:first-child").toggleClass("current");
					reel.find(">*").show();
				}
				reel.fadeCycle('queueNext', settings);
			});
		},
		
		queueNext : function(settings) {
			return this.each(function() {
				var $this = $(this);
				var current = $this.find(".current");
				if (current.length === 0) {
					current = $this.find(">*:first-child").addClass("current");
				}

				var next = current.next("*");

				if (next.length === 0) {
					next = $this.find(">*:first-child");
					next.delay(settings.wait).delay(settings.startDelay).fadeIn("slow", function() {
						settings.startDelay = 0;
						$(this).fadeCycle('fade', settings);
					});
				} else {
					current.delay(settings.wait).delay(settings.startDelay).fadeOut("slow", function() {
						settings.startDelay = 0;
						$(this).fadeCycle('fade', settings);
					});
				}
			});
		}
	};

	$.fn.fadeCycle = function(method, args) {
		var settings;
		if (typeof method === 'number') {
			if(typeof args === 'number'){
				settings = {
						wait : method,
						startDelay : args
					}
			} else {
				settings = {
						wait : method
					}
			}
		} else {
			settings = args
		}

		settings = jQuery.extend(defaults, settings);

		if (methods[method]) {
			arguments[1] = settings;
			return methods[method].apply(this, Array.prototype.slice.call(
					arguments, 1));
		} else if (typeof method === 'object' || !method) {
			arguments[0] = settings;
			return methods.init.apply(this, arguments);
		} else if (typeof method === 'number') {
			if(typeof args === 'number'){
				settings = {
						wait : method,
						startDelay : args
					}
			} else {
				settings = {
						wait : method
					}
			}
			settings = jQuery.extend(defaults, settings);

			arguments[0] = settings;
			return methods.init.apply(this, arguments);
		} else {
			$.error('Method ' + method + ' does not exist in jQuery.fadeCycle');
		}
	};
})(jQuery);
