/**
 * Quote Rotator - Simple jQuery plugin which cause a set of list
 * items to fade-in and fade-out. 
 * 
 * Homepage: http://coryschires.com/jquery-quote-rotator-plugin/
 * Source Code: https://github.com/coryschires/quote-rotator
 * 
 * Copyright (c) 2011 Cory Schires (coryschires.com)
 * Dual licensed under the MIT and GPL licenses:
 * http://www.opensource.org/licenses/mit-license.php
 * http://www.gnu.org/licenses/gpl.html
 *
 * Version: 1.0.0
 */

(function($) {

  $.quote_rotator = {
    defaults: {
      rotation_speed: 14000,
      pause_on_hover: true,
      randomize_first_quote: false,
      buttons: false
    }
  }

  $.fn.extend({
    quote_rotator: function(config) {
      
      var config = $.extend({}, $.quote_rotator.defaults, config);
      
      return this.each(function() {
        var rotation;
        var quote_list = $(this);
        var list_items = quote_list.find('li');
        var rotation_active = true;
        var rotation_speed = config.rotation_speed < 2000 ? 2000 : config.rotation_speed;
        
        var add_active_class = function() {
          var active_class_not_already_applied = quote_list.find('li.active').length === 0;
          if (config.randomize_first_quote) {
            var random_list_item = $(list_items[Math.floor( Math.random() * (list_items.length) )]);
            random_list_item.addClass('active');
          } else if (active_class_not_already_applied) {
              quote_list.find('li:first').addClass('active');
          }
        }();
        
        var get_next_quote = function(quote) {
          return quote.next('li').length ? quote.next('li') : quote_list.find('li:first');
        }
        
        var get_previous_quote = function(quote) {
          return quote.prev('li').length ? quote.prev('li') : quote_list.find('li:last');
        }
        
        var rotate_quotes = function(direction) {
          var active_quote = quote_list.find('li.active');
          var next_quote = direction === 'forward' ? get_next_quote(active_quote) : get_previous_quote(active_quote)
          
          active_quote.animate({
            opacity: 0
          }, 1000, function() {
            active_quote.hide();
            list_items.css('opacity', 1);
            next_quote.fadeIn(1000);
          });
          
          active_quote.removeClass('active');
          next_quote.addClass('active');
        };
        
        var start_automatic_rotation = function() {
          rotation = setInterval(function() {
            if (rotation_active) { rotate_quotes('forward'); }
          }, rotation_speed);
        };

        var pause_rotation_on_hover = function() {
          quote_list.hover(function() {
            rotation_active = false;
          }, function() {
            rotation_active = true;
          });
        };
        
        var include_next_previous_buttons = function() {
          quote_list.append(
            '<div class="qr_buttons">\
              <button class="qr_previous">'+ config.buttons.previous +'</button>\
              <button class="qr_next">'+ config.buttons.next +'</button>\
            </div>'
          );
          quote_list.find('button').click(function() {
            clearInterval(rotation);
            rotate_quotes( $(this).hasClass('qr_next') ? 'forward' : 'backward' );
            start_automatic_rotation();
          });
        };
        
        if (config.buttons) { include_next_previous_buttons(); }
        if (config.pause_on_hover) { pause_rotation_on_hover(); }
        
        list_items.not('.active').hide();
        
        start_automatic_rotation();
      })
    }
  })

})(jQuery);
