/*
 * jQuery Gallery Fader v1.1b w/thumbnails
 * ---
 * Copyright (C) 2010 MyNorth Media
 * For licensing information:
 *     michael@traversemagazine.com
 */

(function($) {
  $.fn.galleryFader = function(settings) {
    this.each(function() {
      var lib = {
        'autoPlay': true,
        'baseClass': 'fader',
        'clickDelay': 100,
        'fxDuration': 300,
        'resumeDuration': 5000,
        'showControls': true,
        'showDuration': 2000,
        'useThumbnails': false,
        'html': {
          'control': '<li><a href="#%s%i">%i</a></li>'
        }
      };

      var config = {
        'backZIndex': 1,
        'frontZIndex': 2,
        'clickTimeout': null,
        'slideCount': 0,
        'slideIndex': 1,
        'slideInt': null,
        'slideTimeout': null
      }

      if (settings.baseClass) lib.baseClass = settings.baseClass;

      $.extend(lib, settings, config, {
        'classes': {
          'base': lib.baseClass,
          'controls': {
            'base':   lib.baseClass + '_controls',
            'active': lib.baseClass + '_active',
            'thumb':  lib.baseClass + '_thumb',
            'first':  lib.baseClass + '_controls-first',
            'last':   lib.baseClass + '_controls-last'
          },
          'slide': {
            'active':  lib.baseClass + '_active',
            'caption': lib.baseClass + '_caption',
            'image':   lib.baseClass + '_image',
            'index':   lib.baseClass + '_index',
            'start':   lib.baseClass + '_start'
          }
        }
      });


      // main fader object
      var fader = $('.' + lib.classes.base);

      lib.slideCount = fader.find('ul li').length;

      // if we've only got one slide, no need for the fancy effects
      if (lib.slideCount > 1) {

        if (lib.showControls) {
          var controls = $('<div class="' + lib.classes.controls.base + '"><ul></ul></div>');


          for (var i = 0; i < lib.slideCount; i++) {
            var $control = $(lib.html.control.replace(/%s/g, lib.classes.base).replace(/%i/g, (i + 1)))

            if (lib.useThumbnails) {
              $control.html(fader.find('ul li:eq(' + i + ') img').clone().addClass(lib.classes.controls.thumb));
            }

            $control.appendTo(controls.find('ul'))
              .attr(lib.classes.slide.index, i)
              .click(function(e) {
                var clicked = $(this);
                clearTimeout(lib.clickTimeout);

                if (!clicked.hasClass(lib.classes.controls.active)) {
                  lib.clickTimeout = setTimeout(function() {
                    stopFx();
                    lib.slideIndex = clicked.attr(lib.classes.slide.index);
                    fadeIt();
                  }, lib.clickDelay);
                }
                e.preventDefault();
              });
          }

          controls.find('li:first')
            .addClass(lib.classes.controls.active)
            .addClass(lib.classes.controls.first);
          controls.find('li:last').addClass(lib.classes.controls.last);

          fader.append(controls);
        }

        $start = fader.find('.' + lib.classes.slide.start);

        // No starting class, no problem
        if ($start.get(0)) {
          $start.addClass(lib.classes.slide.active);
        } else {
          fader.find('li:eq(0)')
            .addClass(lib.classes.slide.start)
            .addClass(lib.classes.slide.active)
        }

        function fadeIt() {
          if (lib.slideIndex >= lib.slideCount) lib.slideIndex = 0;

          var old_slide = fader.find('ul:first li.' + lib.classes.slide.active);
          var new_slide = fader.find('ul:first li:eq(' + (lib.slideIndex) + ')');

          if (lib.showControls) {
            controls.find('ul li.' + lib.classes.controls.active).removeClass(lib.classes.controls.active);
            controls.find('ul li:eq(' + lib.slideIndex + ')').addClass(lib.classes.controls.active);
          }

          old_slide.css('z-index', lib.backZIndex).removeClass(lib.classes.slide.active);
          new_slide.css('z-index', lib.frontZIndex).addClass(lib.classes.slide.active).hide();

          new_slide.fadeIn(lib.fxDuration, function() {
            old_slide.hide();
          });

          lib.slideIndex++;
        };

        function resumeFx(timeoutOverride) {
          lib.slideTimeout = setTimeout(function() {
            lib.slideInt = setInterval(fadeIt, lib.showDuration);
          }, timeoutOverride || lib.resumeDuration);
        };

        function stopFx() {
          clearInterval(lib.slideInt);
          clearTimeout(lib.slideTimeout);
        };

        if (!lib.autoPlay) {
          stopFx();
        } else {
          resumeFx(1);
        }

      }

      return this;
    });
  };

})(jQuery);

