/*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),
          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 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();
});
