/*
 *
 * Effect Goodness 1.0
 * Last modified on March 21, 2010
 * Paul Merchant, Eastern Washington University
 * MIT License
 *
 * Slide and/or fade the last (top) image when the container element is hovered.
 *
 */
(function($){
    $.fn.effectGoodness = function(options){
        return this.each(function(){


            // Set options for each element found

            var cont = $(this);
            var opt = options;
            opt = $.extend($.fn.effectGoodness.defaults, options);

            // Set the container size

            cont.css({
                width: opt.width + "px",
                height: opt.height + "px"
            });

            // Set my starting and destination CSS variables

            var startingVars = {
                top: 0,
                left: 0,
                opacity: 1
            }
            var destVars = {
                top: 0,
                left: 0,
                opacity: 1
            }

            // Manipulate destination CSS depending on effects

            destVars.opacity = 1 - (opt.fading * 0.01);
            destVars.left = opt.width * (opt.horizontalslide * -0.01);
            destVars.top = opt.height * (opt.verticalslide * -0.01);

            // Run the animation on container hover

            cont.find("a:first").hover(function(){
                cont.find("img:last").addClass("hovered").stop().animate({
                    top: destVars.top,
                    left: destVars.left,
                    opacity: destVars.opacity
                }, {
                    queue: false,
                    duration: opt.speed
                });
            }, function(){
                cont.find("img:last").removeClass("hovered").animate({
                    top: startingVars.top,
                    left: startingVars.left,
                    opacity: startingVars.opacity
                }, {
                    queue: false,
                    duration: opt.speed
                });
            });
        })
    };

    // Defaults

    $.fn.effectGoodness.defaults = {
        width: 400,
        height: 225,
        fading: 0,
        horizontalslide: 0,
        verticalslide: 0,
        speed: 200
    };

})(jQuery);


/*
 *
 * jquery.showcase 2.0.1x (extensively modified)
 * Original code by Eros Fratini - eros@recoding.it
 * Last modified on March 15, 2010
 * Modifications by Paul Merchant, Eastern Washington University
 * MIT License
 *
 * A great slide show plugin originally by Eros Fratini.
 * Several features have been added, tweaked, and removed.
 *
 */
(function($){
    $.fn.showcase = function(options){
        var $container = this, opt = $.extend({}, $.fn.showcase.defaults, options);
        if (options && options.css) {
            opt.css = $.extend({}, $.fn.showcase.defaults.css, options.css);
        }
        if (options && options.animation) {
            opt.animation = $.extend({}, $.fn.showcase.defaults.animation, options.animation);
            if (!/horizontal-slider|vertical-slider|fade/.test(opt.animation.type)) {
                opt.animation.type = "horizontal-slider";
            }
        }
        if (options && options.navigator) {
            opt.navigator = $.extend({}, $.fn.showcase.defaults.navigator, options.navigator);
            if (!/top-left|top-right|bottom-left|bottom-right/.test(opt.navigator.position)) {
                opt.navigator.position = "top-right";
            }
            if (!/horizontal|vertical/.test(opt.navigator.orientation)) {
                opt.navigator.orientation = "horizontal";
            }
            if (options.navigator.css) {
                opt.navigator.css = $.extend({}, $.fn.showcase.defaults.navigator.css, options.navigator.css);
            }
            if (options.navigator.item) {
                opt.navigator.item = $.extend({}, $.fn.showcase.defaults.navigator.item, options.navigator.item);
                opt.navigator.item.cssHover = $.extend({}, $.fn.showcase.defaults.navigator.item.css, $.fn.showcase.defaults.navigator.item.cssHover);
                opt.navigator.item.cssSelected = $.extend({}, $.fn.showcase.defaults.navigator.item.css, $.fn.showcase.defaults.navigator.item.cssSelected);
                if (options.navigator.item.css) {
                    opt.navigator.item.css = $.extend({}, $.fn.showcase.defaults.navigator.item.css, options.navigator.item.css);
                    opt.navigator.item.cssHover = $.extend({}, $.fn.showcase.defaults.navigator.item.cssHover, options.navigator.item.css);
                    opt.navigator.item.cssSelected = $.extend({}, $.fn.showcase.defaults.navigator.item.cssSelected, options.navigator.item.css);
                }
                if (options.navigator.item.cssHover) {
                    opt.navigator.item.cssHover = $.extend({}, $.fn.showcase.defaults.navigator.item.cssHover, options.navigator.item.cssHover);
                }
                if (options.navigator.item.cssSelected) {
                    opt.navigator.item.cssSelected = $.extend({}, $.fn.showcase.defaults.navigator.item.cssSelected, options.navigator.item.cssSelected);
                }
            }
        }
        if (options && options.titleBar) {
            opt.titleBar = $.extend({}, $.fn.showcase.defaults.titleBar, options.titleBar);
            if (!/bottom|top/.test(opt.titleBar.position)) {
                opt.titleBar.position = "bottom";
            }
            if (options.titleBar.css) {
                opt.titleBar.css = $.extend({}, $.fn.showcase.defaults.titleBar.css, options.titleBar.css);
            }
        }

        // Load images
        if (opt.images.length != 0) {
            for (var i in opt.images) {
                var img = new Image();
                img.src = opt.images[i].url;
                img.alt = opt.images[i].description || "";
                if (opt.images[i].link) {
                    var $link = $("<a />").attr({
                        "href": opt.images[i].link || "#",
                        "target": opt.images[i].target || "_self"
                    });
                }
                else {
                    var $link = $("<a />");
                }
                $link.append(img);
                $container.append($link);
            }
        }

        // Check if first image is loaded
        if ($container.find("img:first")[0].complete) {
            $.fn.showcase.start($container, opt);
        }
        else {
            $container.find("img:first").load(function(){
                $.fn.showcase.start($container, opt);
            });
        }
    }

    // Start showcase
    $.fn.showcase.start = function($container, opt){
        var index = 0;
        var nImages = $container.find("img").length;
        var $fi = $container.find("img:first");
        var imagesize = {
            width: $fi.removeAttr("width").width(),
            height: $fi.removeAttr("height").height()
        };
        opt.css.width = imagesize.width;
        opt.css.height = imagesize.height;

        // setup container
        $container.css(opt.css).find("a").css({
            position: "absolute",
            top: "0",
            left: "0"
        }).find("img").css("border", "0px");

        // setup navigator
        var $slider = $("<div id='slider' />").css({
            position: "absolute"
        });
        var $divNavigator = $("<div id='navigator' />").css(opt.navigator.css);

        switch (opt.navigator.position) {
            case "top-left":
                $divNavigator.css({
                    top: "0px",
                    left: "0px"
                });
                break;
            case "top-right":
                $divNavigator.css({
                    top: "0px",
                    right: "0px"
                });
                break;
            case "bottom-left":
                $divNavigator.css({
                    bottom: "0px",
                    left: "0px"
                });
                break;
            case "bottom-right":
                $divNavigator.css({
                    bottom: "0px",
                    right: "0px"
                });
                break;
        }

        $container.find("a").wrapAll($slider).each(function(i){
            switch (opt.animation.type) {
                case "horizontal-slider":
                    $(this).css("left", i * imagesize.width);
                    break;
                case "vertical-slider":
                    $(this).css("top", i * imagesize.height);
                    break;
                case "fade":
                    $(this).css({
                        top: "0",
                        left: "0",
                        opacity: 1,
                        "z-index": 1000 - i
                    });
                    break;
            }

            // Create navigation bar item
            var $navElement = $("<a href='#'>" + (opt.navigator.showNumber ? (i + 1) : "") + "</a>").css({
                display: "block",
                "text-decoration": "none"
            }).click(function(){
                if (opt.animation.autoCycle) {
                    clearInterval(opt.animation.intervalID);
                }
                $.fn.showcase.showImage(i, $container, imagesize, opt);
                index = i;
                if (opt.animation.autoCycle) {
                    opt.animation.intervalID = showcaseCycler(index, nImages, $container, imagesize, opt);
                }
                return false;
            }).hover(function(){
                if (!$(this).data("selected")) {
                    if (opt.navigator.item.cssClassHover) {
                        $(this).addClass(opt.navigator.item.cssClassHover);
                    }
                    else {
                        $(this).css(opt.navigator.item.cssHover);
                    }
                }
            }, function(){
                if (!$(this).data("selected")) {
                    if (opt.navigator.item.cssClassHover) {
                        $(this).removeClass(opt.navigator.item.cssClassHover);
                    }
                    else {
                        $(this).css(opt.navigator.item.css);
                    }
                }
            }).appendTo($divNavigator);
            if (opt.navigator.item.cssClass) {
                $navElement.attr("class", opt.navigator.item.cssClass);
            }
            else {
                $.extend({}, $navElement.css, opt.navigator.item);
                $navElement.css(opt.navigator.item.css);
            }
            switch (opt.navigator.orientation) {
                case "horizontal":
                    $navElement.css("float", "left");
                    break;
                case "vertical":
                    $navElement.css("float", "none");
                    break;
            }
        });
        if (opt.navigator.autoHide) {
            $divNavigator.css("opacity", 0);
        }
        $container.append($divNavigator).hover(function(){
            if (opt.titleBar.autoHide && opt.titleBar.enabled) {
                $($titleBar).stop().animate({
                    opacity: opt.titleBar.css.opacity,
                    left: 0,
                    right: 0,
                    height: opt.titleBar.css.height
                }, 250);
            }
            if (opt.navigator.autoHide) {
                $($divNavigator).stop().animate({
                    opacity: 1
                }, 250);
            }
            $(this).data("isMouseHover", true);
        }, function(){
            if (opt.titleBar.autoHide && opt.titleBar.enabled) {
                $titleBar.stop().animate({
                    opacity: 0,
                    height: "0px"
                }, 400);
            }
            if (opt.navigator.autoHide) {
                $divNavigator.stop().animate({
                    opacity: 0
                }, 250);
            }
            $(this).data("isMouseHover", false);
        });

        // Create titleBar
        if (opt.titleBar.enabled) {
            var $a = $("<a />").html("<span>" + $container.find("a:first img").attr("alt") + "</span>");
            var $titleBar = $("<div id='subBar' />").html($a);
            $titleBar.css({
                opacity: 0.50,
                width: "100%",
                overflow: "hidden",
                "z-index": 10002,
                position: "absolute"
            });
            if (opt.titleBar.position == "top") {
                $titleBar.css("top", "0");
            }
            else {
                $titleBar.css("bottom", "0");
            }
            if (opt.titleBar.cssClass) {
                $titleBar.attr("class", opt.titleBar.cssClass);
            }
            else {
                $titleBar.css(opt.titleBar.css);
                $("a", $titleBar).css("color", opt.titleBar.css.color);
                $("a", $titleBar).css("text-decoration", "none");
            }
            if (opt.titleBar.autoHide) {
                $titleBar.css({
                    "height": "0px",
                    "opacity": 0
                });
            }
            $titleBar.appendTo($container);
        }

        // set first image as selected
        $.fn.showcase.setNavigationItem(0, $container, opt);

        // startup cycling
        if (opt.animation.autoCycle) {
            opt.animation.intervalID = showcaseCycler(index, nImages, $container, imagesize, opt);
        }
    }
    var showcaseCycler = function(index, nImages, $container, imagesize, opt){
        return setInterval(function(){
            if (!$container.data("stopped")) {
                if (!$container.data("isMouseHover") || !opt.animation.stopOnHover) {
                    if ((index != nImages) || opt.animation.loop) {
                        $.fn.showcase.showImage(++index % nImages, $container, imagesize, opt);
                    }
                    // Stop cycling after one time through if loop is false
                    else {
                        opt.animation.autoCycle = false;
                        return true;
                    }

                }
            }
        }, opt.animation.interval);
    };
    $.fn.showcase.showImage = function(i, $container, imagesize, opt){
        var $a = $container.find("a");
        var $a_this = $container.find("a").eq(i);
        switch (opt.animation.type) {
            case "horizontal-slider":
                $container.find("#slider").stop().animate({
                    left: -(i * imagesize.width)
                }, opt.animation.speed, opt.animation.easefunction);
                break;
            case "vertical-slider":
                $container.find("#slider").stop().animate({
                    top: -(i * imagesize.height)
                }, opt.animation.speed, opt.animation.easefunction);
                break;
            case "fade":
                $container.css({
                    "z-index": "1001"
                });
                if ($a_this.css("z-index") != "1000") {
                    $a_this.css({
                        "z-index": "1000",
                        opacity: 0
                    });
                    $a.not($a_this).each(function(){
                        if ($(this).css("z-index") != "auto")
                            $(this).css("z-index", parseInt($(this).css("z-index"), 10) - 1);
                    });
                    $a_this.stop().animate({
                        opacity: 1
                    }, opt.animation.speed, opt.animation.easefunction);
                }
                break;
        }

        if (opt.titleBar.enabled) {
            if ($a_this.attr("href")) {
                $("#subBar a", $container).attr({
                    "href": $a_this.attr("href"),
                    "target": $a_this.attr("target")
                });
            }
            else {
                $container.find("#subBar a").removeAttr("href");
            }
        }

        $("#subBar span", $container).html($a_this.find("img").attr("alt"));
        // Setting selected navigationItem
        $.fn.showcase.setNavigationItem(i, $container, opt);
    };

    // Highlight the navigationItem related to image
    $.fn.showcase.setNavigationItem = function(i, $container, opt){
        if (opt.navigator.item.cssClassSelected) {
            $container.find("#navigator a").removeClass(opt.navigator.item.cssClassSelected).data("selected", false);
            $container.find("#navigator a").eq(i).addClass(opt.navigator.item.cssClassSelected).data("selected", true);
        }
        else {
            if (opt.navigator.item.cssClass) {
                $container.find("#navigator a").eq(i).css(opt.navigator.item.cssSelected).data("selected", true);
            }
            else {
                $container.find("#navigator a").css(opt.navigator.item.css).data("selected", false);
                $container.find("#navigator a").eq(i).css(opt.navigator.item.cssSelected).data("selected", true);
            }
        }
    };
    $.fn.showcase.defaults = {
        images: [],
        css: {
            position: "relative",
            overflow: "hidden",
            border: "none",
            width: "",
            height: ""
        },
        animation: {
            autoCycle: true,
            stopOnHover: false,
            interval: 5000,
            speed: 500,
            easefunction: "swing",
            type: "fade",
            loop: false
        },
        navigator: {
            css: {
                border: "none",
                padding: "5px 7px",
                margin: "0px",
                position: "absolute",
                "z-index": 1000
            },
            position: "top-right",
            orientation: "horizontal",
            autoHide: false,
            showNumber: false,
            item: {
                cssClass: null,
                cssClassHover: null,
                cssClassSelected: null,
                css: {
                    color: "#000",
                    "text-decoration": "none",
                    "text-align": "center",
                    width: "10px",
                    height: "10px",
                    lineHeight: "10px",
                    verticalAlign: "middle",
                    backgroundColor: "#666",
                    margin: "0px 0px 3px 4px",
                    border: "solid 1px #fff"
                },
                cssHover: {
                    backgroundColor: "#222",
                    border: "solid 1px #fff"
                },
                cssSelected: {
                    backgroundColor: "#a80810",
                    border: "solid 1px #fff"
                }
            }
        },
        titleBar: {
            enabled: false,
            autoHide: false,
            position: "bottom",
            cssClass: null,
            css: {
                opacity: 0.50,
                color: "#fff",
                backgroundColor: "#000",
                height: "2.5em",
                padding: "0px 10px",
                fontWeight: "bold",
                fontSize: "1.25em"
            }

        }
    };
})(jQuery);

