/*
 * jQuery Gallery Fader v421.3.0b (whatever)
 * ---
 * 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,
        'showDuration': 2000,
        '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'
          },
          'slide': {
            'active': lib.baseClass + '_active',
            'caption': lib.baseClass + '_caption',
            'image': lib.baseClass + '_image',
            'index': lib.baseClass + '_index',
            'start': lib.baseClass + '_start'
          }
        }
      });

      var fader    = $('.' + lib.classes.base);
      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++) {
        $(lib.html.control.replace(/%s/g, lib.classes.base).replace(/%i/g, (i + 1)))
          .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.autoPlay) {
        stopFx();
      } else {
        resumeFx(1);
      }

      return this;
    });
  };

})(jQuery);



