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

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

        var config = {
          'backZIndex': 99,
          'frontZIndex': 999,
          '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'
            },
            'slide': {
              'active':  lib.baseClass + '_active',
              'caption': lib.baseClass + '_caption',
              'image':   lib.baseClass + '_image',
              'index':   lib.baseClass + '_index',
              'start':   lib.baseClass + '_start'
            }
          }
        });

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

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

        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.showThumbnails) {
            $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);

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

        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)
        }

        fader.append(controls);

        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) + ')');

          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.slideCount <= 1 || !lib.autoPlay) {
          stopFx();
        } else {
          resumeFx(1);
        }

        return this;
      });
    };

  })(jQuery);
} else {
  /* if you've made it here, the world has ended */
}

