(function($) {
	$.fn.slidershow = function(opts) {
		$.fn.slidershow.defaults = {
		    target: '#container',
		    useMask: true,
		    maskTarget: true,
		    setToTargetWidth: true,
		    useShadows: true,
		    usePageCaption: true,
		    closeButtonCaption: 'Close Slideshow',
		    slidershowZ: 50000,
		    maskZ: 49999
		};
		var opts = $.extend({}, $.fn.slidershow.defaults, opts);
		
		var target = $(opts.target);
		if (!target) return this;
    
		return this.each(function(idx) {
		    var link = this;
		    var url = $(this).attr("href") + " div.slidershow:first";
		    $('<div />').load(url, null, function(responseText, textStatus, XMLHttpRequest) {
	            if (textStatus != "success") return false;
                var slidershow = $(this).children().remove();
	            if (!slidershow.length) return false;
		        slidershow.css("z-index", opts.slidershowZ);
		        $(link).data("slidershow", slidershow);
		        slidershow.addClass("dynamic building");
	            target.append(slidershow);
	            if (opts.setToTargetWidth) slidershow.css("width", target.width());
	            slidershow.append('<a href="#" class="close">' + opts.closeButtonCaption + '</div>');
	            slidershow.children('a.close').click(function() {
	                slidershow.fadeOut("fast");
	                if (opts.useMask) (opts.maskTarget ? $(opts.target + ">div.mask") : $("body>div.mask")).fadeOut("fast", function() { $(this).remove(); });
	                return false; 
	            });
	            if (opts.useShadows) {
	                slidershow.addClass("shadowed");
                    slidershow.append('<div class="shadow top" />');
	                slidershow.append('<div class="shadow bottom" />');
	            }
	            var ul = slidershow.children("ul");
	            var liSlides = ul.children();
	            var numSlides = liSlides.length;
	            var liWidth = liSlides.outerWidth();
                var ulWidth = liWidth * numSlides;
                var sidePadding = (target.width() - liWidth) / 2;
                ul.css({
                    width: ulWidth,
                    paddingLeft: sidePadding,
                    paddingRight: sidePadding
                });
                ul.data("current", 1);
                var page = null;
                if (opts.usePageCaption && numSlides > 1) {
                    liSlides.append('<div class="page" />');
                    liSlides.each(function(idx) { $(this).children("div.page").html((idx + 1) + ' of ' + numSlides)});
	            }
                liSlides.not(":first").children(":not(img)").css("opacity", 0).end().children("img").css("opacity", 0.5);
	            if (numSlides > 1) {
	                slidershow.append('<div class="button left" />');
	                slidershow.append('<div class="button right" />');
	            }
	            var buttons = slidershow.children(".button");
	            var leftButton = buttons.filter(".left");
	            var rightButton = buttons.filter(".right");
	            leftButton.hide();
	            var buttonHeight = buttons.height();		        
	            buttons.css("top", ul.outerHeight() / 2 - buttonHeight / 2).hover(
	                function() {
	                    $(this).addClass("hover");
	                },
	                function() {
	                    $(this).removeClass("hover");
	                }
	            ).click(function() {
	                var dir = 0;
	                var current = ul.data("current");
	                if ($(this).hasClass("right")) dir = -1;
	                else if ($(this).hasClass("left")) dir = 1;
	                if (current == 1 && dir == 1 || current == numSlides && dir == -1) return;
	                var next = current + (dir * -1);
	                leftButton.toggle(next > 1);
	                rightButton.toggle(next < numSlides);
	                ul.data("current", next);
	                ul.animate({ left: ul.position().left + (liWidth * dir)}, {duration: 450, easing: "swing" });
	                ul.children(":eq(" + (next - 1) + ")").children().fadeTo(250, "1");
	                ul.children(":eq(" + (current - 1) + ")").children("img").fadeTo(250, "0.5").siblings().fadeTo(250, "0");
	            });
	            slidershow.hide().removeClass("building");
	        });
            $(this).click(function() {
                var slidershow = $(this).data("slidershow");
                if (!slidershow) return true;
                if (opts.useMask) {
                    var mask = $('<div class="mask"></div>');
                    var maskContainer = opts.maskTarget ? $(opts.target) : $("body");
                    mask.css({
                        position: "absolute",
                        top: maskContainer.css("padding-top"),
                        left: maskContainer.css("padding-left"),
                        opacity: "0",
                        width: maskContainer.width(),
                        height: maskContainer.height(),
                        zIndex: opts.maskZ
                    }).click(function() {
                        slidershow.children("a.close").click();
                    });
                    maskContainer.append(mask);
                    mask.fadeTo("fast", "0.5");//, function() { slidershow.fadeIn("fast"); });
                }
                slidershow.fadeIn("fast");
                return false; 
	        });
	    });    
    };
    $(function() {
        $("a[rel=slidershow]").slidershow();
    });
})(jQuery);