/*global jQuery, $ */
/*
	jQuery.PictureSlides is developed by Robert Nyman, http://www.robertnyman.com
	For more information, please see http://www.robertnyman.com/picture-slides
	Released under a MIT License
 */
jQuery.PictureSlides = function () {
  var useMSFilter = false,
  slideshows = [],
  set = function (settings) {
    slideshows.push(settings);
  },

  init = function () {
    var counter = 0;
    $(".picture-slides-container").each(function () {
      var elm = $(this),

      // Element references
      settings = slideshows[counter++],
      mainImage = elm.find("." + settings.mainImageClass),
      mainImageFailedToLoad = elm.find("." + settings.mainImageFailedToLoadClass),
      imageLink = elm.find("." + settings.imageLinkClass),
      jsLink = elm.find("." + settings.jsLinkClass),
      fadeContainer = elm.find("." + settings.fadeContainerClass),
      imageTextContainer = elm.find("." + settings.imageTextContainerClass),
      previousLink = elm.find("." + settings.previousLinkClass),
      nextLink = elm.find("." + settings.nextLinkClass),
      imageCounter = elm.find("." + settings.imageCounterClass),
      startSlideShowLink = elm.find("." + settings.startSlideShowClass),
      stopSlideShowLink = elm.find("." + settings.stopSlideShowClass),
      thumbnailContainer = elm.find("." + settings.thumbnailContainerClass),
      thumbnailEvent = settings.thumbnailActivationEvent,
      thumbnailLinks,
      dimBackgroundOverlay = $("." + settings.dimBackgroundOverlayClass),

      // General image settings
      usePreloading = settings.usePreloading,
      useAltAsTooltip = settings.useAltAsTooltip,
      useTextAsTooltip = settings.useTextAsTooltip,
      images = settings.images,
      startIndex = (settings.startIndex > 0)? (settings.startIndex - 1) : settings.startIndex,
      imageIndex = startIndex,
      currentImageIndex = imageIndex,
      startSlideShowFromBeginning = settings.startSlideShowFromBeginning,
      dimBackgroundAtLoad = settings.dimBackgroundAtLoad,

      // General fade settings
      useFadingIn = settings.useFadingIn,
      useFadingOut = settings.useFadingOut,
      useFadeWhenNotSlideshow = settings.useFadeWhenNotSlideshow,
      useFadeForSlideshow = settings.useFadeForSlideshow,
      useDimBackgroundForSlideshow = settings.useDimBackgroundForSlideshow,
      loopSlideshow = settings.loopSlideshow,
      fadeTime = settings.fadeTime,
      timeForSlideInSlideshow = settings.timeForSlideInSlideshow,
      startSlideshowAtLoad = settings.startSlideshowAtLoad,
      slideshowPlaying = false,
      timer,

      // Sets main image
      setImage = function () {
        // Set main image values
        var imageItem = images[imageIndex];
        mainImage.attr({
        src : imageItem.image,
        alt : imageItem.alt
        });

        // If the alt text should be used as the tooltip
        if (useAltAsTooltip) {
          mainImage.attr("title", imageItem.alt);
        }

        // If the image text should be used as the tooltip
        if (useTextAsTooltip) {
          mainImage.attr("title", imageItem.text);
        }

        // Set image text
        if (imageTextContainer.length > 0) {
          imageTextContainer.text(imageItem.text);
        }

        // Set image link
        if (imageLink.length > 0) {
          var url = imageItem.url;
          if (typeof url !== "undefined" && url.length > 0) {
            imageLink.attr("href", imageItem.url);
          }
          else {
            imageLink.removeAttr("href");
          }
        }

        // Set image link
        if (jsLink.length > 0) {
          var click = imageItem.click;
          if (typeof url !== "undefined" && url.length > 0) {
            jsLink.attr("onClick", imageItem.click);
          }
          else {
            jsLink.removeAttr("onClick");
          }
        }

        // Set image counter values
        if (imageCounter.length > 0) {
          imageCounter.text((imageIndex + 1) + "/" + (images.length));
        }

        if (!loopSlideshow) {
          // Enabling/disabling previous link
          if (imageIndex === 0) {
            previousLink.addClass("picture-slides-disabled");
          }
          else {
            previousLink.removeClass("picture-slides-disabled");
          }

          // Enabling/disabling next link
          if (imageIndex === (images.length - 1)) {
            nextLink.addClass("picture-slides-disabled");
          }
          else {
            nextLink.removeClass("picture-slides-disabled");
          }
        }

        // Keeping a reference to the current image index
        currentImageIndex = imageIndex;

        // Adding/removing classes from thumbnail
        if (thumbnailContainer[0]) {
          thumbnailLinks.removeClass("picture-slides-selected-thumbnail");
          $(thumbnailLinks[imageIndex]).addClass("picture-slides-selected-thumbnail");
        }
      },

      // Navigate to previous image
      prev = function () {
        if (imageIndex > 0 || loopSlideshow) {
          if (imageIndex === 0) {
            imageIndex = (images.length -1);
          }
          else {
            imageIndex = --imageIndex;
          }
          if (useFadingOut && (useFadeWhenNotSlideshow || slideshowPlaying) && imageIndex !== currentImageIndex) {
            fadeContainer.stop();
            fadeContainer.fadeTo(fadeTime, 0, function () {
              setImage(imageIndex);
            });
          }
          else {
            if (useFadingIn && imageIndex !== currentImageIndex) {
              fadeContainer.css("opacity", "0");
            }
            setImage(imageIndex);
          }
        }
      },

      // Navigate to next image
      next = function (specifiedIndex) {
        if (imageIndex < (images.length -1) || typeof specifiedIndex !== "undefined" || loopSlideshow) {
          if (typeof specifiedIndex !== "undefined") {
            imageIndex = specifiedIndex;
          }
          else if (imageIndex === (images.length-1)) {
            imageIndex = 0;
          }
          else {
            imageIndex = ++imageIndex;
          }
          if (useFadingOut && (useFadeWhenNotSlideshow || slideshowPlaying) && imageIndex !== currentImageIndex) {
            fadeContainer.stop();
            fadeContainer.fadeTo(fadeTime, 0, function () {
              setImage(imageIndex);
            });
          }
          else {
            if (useFadingIn && imageIndex !== currentImageIndex) {
              fadeContainer.css("opacity", "0");
            }
            setImage(imageIndex);
          }
        }
        else {
          stopSlideshow();
        }
      },

      // Start slideshow
      startSlideshow = function () {
        slideshowPlaying = true;
        startSlideShowLink.hide();
        stopSlideShowLink.show();
        if (startSlideShowFromBeginning) {
          next(0);
        }
        clearTimeout(timer);
        timer = setTimeout(function () {
          next();
        }, timeForSlideInSlideshow);
        if (useDimBackgroundForSlideshow && dimBackgroundOverlay[0]) {
          elm.addClass("picture-slides-dimmed-background");
          dimBackgroundOverlay.show();
        }
      },

      // Stop slideshow
      stopSlideshow = function () {
        clearTimeout(timer);
        slideshowPlaying = false;
        startSlideShowLink.show();
        stopSlideShowLink.hide();
        if (useDimBackgroundForSlideshow && dimBackgroundOverlay[0]) {
          elm.removeClass("picture-slides-dimmed-background");
          dimBackgroundOverlay.hide();
        }
      };

      // Fade in/show image when it has loaded
      mainImage[0].onload = function () {
        if (useFadingIn && (useFadeWhenNotSlideshow || slideshowPlaying)) {
          fadeContainer.fadeTo(fadeTime, 1, function () {
            if (slideshowPlaying) {
              clearTimeout(timer);
              timer = setTimeout(function () {
                next();
              }, timeForSlideInSlideshow);
            }
          });
        }
        else {
          fadeContainer.css("opacity", "1");
          fadeContainer.show();
          if (slideshowPlaying) {
            clearTimeout(timer);
            timer = setTimeout(function () {
              next();
            }, timeForSlideInSlideshow);
          }
        }
        mainImageFailedToLoad.hide();
      };

      mainImage[0].onerror = function () {
        fadeContainer.css("opacity", "1");
        mainImageFailedToLoad.show();
        if (slideshowPlaying) {
          clearTimeout(timer);
          timer = setTimeout(function () {
            next();
          }, timeForSlideInSlideshow);
        }
      };

      // Previous image click
      previousLink.click(function (evt) {
        prev();
        return false;
      });

      // Next image click
      nextLink.click(function (evt) {
        next();
        return false;
      });

      // Start slideshow click
      startSlideShowLink.click(function () {
        startSlideshow();
        return false;
      });

      // Stop slideshow click
      stopSlideShowLink.click(function () {
        stopSlideshow();
        return false;
      });

      // Shows navigation links and image counter
      previousLink.show();
      nextLink.show();
      startSlideShowLink.show();
      imageCounter.show();

      // Stop slideshow click
      stopSlideShowLink.click(function () {
        stopSlideshow();
      });

      // Thumbnail references
      if (thumbnailContainer[0]) {
        thumbnailLinks = $(thumbnailContainer).find("a");
        $(thumbnailLinks[imageIndex]).addClass("picture-slides-selected-thumbnail");
        for (var i=0, il=thumbnailLinks.length, thumbnailLink; i<il; i++) {
          thumbnailLink = $(thumbnailLinks[i]);
          thumbnailLink.data("linkIndex", i);
          thumbnailLink.bind(thumbnailEvent, function (evt) {
            next($(this).data("linkIndex"));
            this.blur();
            return false;
          });
        }
      }

      // Sets initial image
      setImage();

      // If play slideshow at load
      if (startSlideshowAtLoad) {
        startSlideshow();
      }

      if (dimBackgroundAtLoad) {
        elm.addClass("picture-slides-dimmed-background");
        dimBackgroundOverlay.show();
      }

      if (usePreloading) {
        var imagePreLoadingContainer = $("<div />").appendTo(document.body).css("display", "none");
        for (var j=0, jl=images.length, image; j<jl; j++) {
          $('<img src="' + images[j].image + '" alt="" />').appendTo(imagePreLoadingContainer);
        }
      }
    });
  };
  return {
  set : set,
  init : init
  };
}();
$(document).ready(function () {
  jQuery.PictureSlides.init();
});
