(function($){
	$.fn.fadegal = function(options){
		var opts = $.extend({}, $.fn.fadegal.defaults, options);
		return this.each(function(){
			$this = $(this);
			var o = $.meta ? $.extend({}, opts, $this.data()) : opts;
			
			$this.fadegal.interface(o);
			
			if($this.children("li").length < 2){ o.autoplay = false; }
			if(o.autoplay){
				$this.fadegal.wait(o.speed, o.delay, o.nav);
			}
			
			$(".fadegal-toggle").bind("click",function(){
				if($(this).hasClass("pause")){
					$(this).removeClass("pause").addClass("play");
					clearTimeout(t);
					o.autoplay = false;
				}else{
					$(this).removeClass("play").addClass("pause");
					$this.fadegal.wait(o.speed, o.delay, o.nav);
					o.autoplay = true;
				}
				return false;
			});
			
			$(".fadegal-prev").bind("click",function(){
				$.fn.fadegal.prev(o);
				return false;
			});
			$(".fadegal-next").bind("click",function(){
				$.fn.fadegal.next(o);
				return false;
			});
			$("#fadegal-navigation ul li a").bind("click",function(){
				if(! $(this).hasClass("sel")){
					clearTimeout(t);
					var curr = $this.children("li.current");
					var next = $this.children("li#" + $(this).attr("id"));
					curr.fadeOut(o.speed, function(){
						curr.removeClass("current");
						curr.children("a").removeClass("sel");
					});
					next.fadeIn(o.speed, function(){
						next.addClass("current");
						next.children("a").addClass("sel");
						$.fn.fadegal.updatenav();
					});
					if(o.autoplay) { $.fn.fadegal.wait(o.speed, o.delay, o.nav); }
				}
			});
		});
	};
	$.fn.fadegal.navigation = function(o){
		if(o.nav){
			var cont = $this.parent();
			cont.append("<div id='fadegal-navigation'><ul></ul></div>");
			var navcont = $this.next("#fadegal-navigation").children("ul");
			
			$this.children("li").each(function(index){
				($(this).hasClass("current")) ? clname = "current" : clname = "regular";
				navcont.append("<li class='" + clname + "' id='nav_" + $(this).attr("id") + "'><a id='" + $(this).attr("id") + "'></a></li>");
			});
			navcont.append("<br class='clear'>");
		}
	};
	$.fn.fadegal.controls = function(o){
		if(o.controls) {
			(! o.autoplay) ? clname = "play" : clname = "pause";
			var cont = $this.parent();
			$this.after("<div id='fadegal-controls'><a class='fadegal-prev' href='#'><div>&nbsp;</div></a><a class='fadegal-toggle " + clname + "' href='#'><div>&nbsp;</div></a><a class='fadegal-next' href='#'><div>&nbsp;</div></a></div>");
			var ctrlcont = cont.children("#fadegal-controls");
			ctrlcont.children(".fadegal-prev").width($this.width() / 4).height($this.height());
			ctrlcont.children(".fadegal-next").width($this.width() / 4).height($this.height());
			ctrlcont.children(".fadegal-toggle").width($this.width() / 2).height($this.height());
		}
	};
	$.fn.fadegal.interface = function(o){
		(! $this.hasClass("fadegal")) ? $this.addClass("fadegal") : "";
		$this.before("<div id='fadegal-container'></div>");
		$this.prev("#fadegal-container").append($this);
		var cont = $this.parent("#fadegal-container");
		cont.width($this.width());
		cont.height($this.height());
		$this.children("li").each(function(index){
			$(this).attr("id","img_" + index);
		});
		if(! $this.children("li.current").attr("id")){
			$this.children("li:first-child").addClass("current");
			$this.children("li:not(.current)").hide();
		}
		
		if($this.children("li").length > 1){
			if(o.nav){ var nav = $.fn.fadegal.navigation(o); }
			if(o.controls){ var controls = $.fn.fadegal.controls(o); }
		}
	}
	$.fn.fadegal.go = function(speed, delay, nav){
		var start = $this.children("li.current");
		var next = start.next("li");
		if(next.html() == null){
			next = $this.children("li:first-child");
		}
		start.fadeOut(speed, function(){
			start.removeClass("current");
		});
		next.fadeIn(speed, function(){
			next.addClass("current");
			if(nav){ $.fn.fadegal.updatenav(); }
		});
		$.fn.fadegal.wait(speed, delay, nav);
	}
	$.fn.fadegal.wait = function(speed, delay, nav){
		var str = "$.fn.fadegal.go(" + speed + ", " + delay + ", " + nav + ")";
		t = setTimeout(str,delay);
	}
	$.fn.fadegal.updatenav = function(){
		var curritem = $this.children("li.current");
		$("#fadegal-navigation ul li").removeClass("current").addClass("regular");
		$("#fadegal-navigation ul li a").removeClass("sel");
		$("#fadegal-navigation ul li#nav_" + curritem.attr("id")).addClass("current");
		$("#fadegal-navigation ul li#nav_" + curritem.attr("id") + " a").addClass("sel");
	}
	$.fn.fadegal.prev = function(o){
		clearTimeout(t);
		var curr = $this.children("li.current");
		var prev = curr.prev("li");
		if(prev.html() == null){
			prev = $this.children("li:last-child");
		}
		curr.fadeOut(o.speed, function(){
			curr.removeClass("current");
		});
		prev.fadeIn(o.speed, function(){
			prev.addClass("current");
			if(o.nav){ $.fn.fadegal.updatenav(); }
		});
		if(o.autoplay) { $.fn.fadegal.wait(o.speed, o.delay, o.nav); }
	}
	$.fn.fadegal.next = function(o){
		clearTimeout(t);
		var curr = $this.children("li.current");
		var next = curr.next("li");
		if(next.html() == null){
			next = $this.children("li:first-child");
		}
		curr.fadeOut(o.speed, function(){
			curr.removeClass("current");
		});
		next.fadeIn(o.speed, function(){
			next.addClass("current");
			if(o.nav){ $.fn.fadegal.updatenav(); }
		});
		if(o.autoplay) { $.fn.fadegal.wait(o.speed, o.delay, o.nav); }
	}
	$.fn.fadegal.defaults = {
		delay: 5000,
		speed: 800,
		autoplay: true,
		nav: true,
		controls: true
	};
})(jQuery);
