(function($){
	$.fn.fadegal = function(options){
		//default values
		var defaults = {
			delay: 5000,
			speed: 800,
			nav: true
		};
		var opts = $.extend(defaults, options);
		
		return this.each(function(){
			var $this = $(this);
			var childcount = $this.children("li").length;
			
			if(childcount > 1){
				var start = $this.children("li.current");
				if(start.html() == null){
					$this.children("li:first-child").addClass("current");
					var start = $this.children("li.current");
					$this.children("li:not(.current)").hide();
				}
				var nextstart = start.next("li");
				if(nextstart.html() == null){
					nextstart = $this.children("li:first-child");
				}
				
				// add class "fadegal" for css styling
				(! $this.hasClass("fadegal")) ? $this.addClass("fadegal") : "";
				
				// add container div if missing, and define dimensions of list
				if($this.parent("#fadegal-container").html() == null){
					$this.before("<div id='fadegal-container'></div>");
					$this.prev("#fadegal-container").append($this);
					var cont = $this.parent("#fadegal-container");
					$this.width(cont.width()).height(cont.height());
	
					// build navigation
					if(opts.nav){
						// add indexes to images for navigation
						$this.children("li").each(function(index){
							$(this).attr("id","img_" + index);
						});
						
						// create navigation wrapper
						$this.before("<div id='fadegal-navigation'><ul></ul></div>");
						var navcont = $this.prev("#fadegal-navigation").children("ul");
						
						// iterate through all gallery elements and create navigation items
						$this.children("li").each(function(index){
							if($(this).hasClass("current")){
								clname = 'current';
							}
							else{
								clname = 'regular';
							}
							navcont.append("<li class='" + clname + "' id='nav_" + $(this).attr("id") + "'><a id='" + $(this).attr("id") + "'></a></li>");
						});
						navcont.append("<br class='clear'>");
					}
				}
				
				// fade out current first picture
				start.delay(opts.delay).fadeOut(opts.speed, function(){
					start.removeClass("current");
					
					//update navigation
					var navcont = $this.prev("#fadegal-navigation").children("ul");
					navcont.children("li").removeClass("current");
					var curritem = nextstart.attr("id");
					navcont.children("li#nav_" + curritem).addClass("current");
				});
				
				// fade in next first picture, put previous first picture in the end of the list, start recursion
				nextstart.delay(opts.delay).fadeIn(opts.speed, function(){
					nextstart.addClass("current");
					$this.fadegal(opts);
				});
			}
		});
	};
})(jQuery);
