jQuery.fn.flide = function(options) {
  
  var defaults = {
    slide_time      : 400,
    ease_type       : 'easeInOutExpo',
    flide_width     : 620,
    auto_play       : true,
    slide_interval  : 5000
  };
  
  var settings = $.extend({}, defaults, options);
  
  return this.each(function(){
    
    // From the jquery.easing plugin
    // http://gsgd.co.uk/sandbox/jquery/easing/jquery.easing.1.3.js
    $.fn.extend( $.easing, {
      easeInOutExpo: function (x, t, b, c, d) {
        if (t===0) return b;
        if (t===d) return b+c;
        if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b;
        return c/2 * (-Math.pow(2, -10 * --t) + 2) + b;
      }
    });
    
    var container = $(this);
    var slides = container.find('a').length;
    var flide_w = settings.flide_width * slides;
    var current_slide = 0;
    
    container.wrap('<div id="slideshow_viewport">').css('width',flide_w+'px');
    
    $('#slideshow_viewport').append('<ul id="slideshow_nav"></ul>');
    
    container.find('a').each(function(i) {
      
      $('#slideshow_nav').append('<li><a href="#">'+ (i+1) +'</a></li>');
      
    });
    
    
    // Hide nav if its only one slide
    slides === 1 ? $('#slideshow_nav').hide() : false;
    
    var nav_items = $('#slideshow_nav li');
    
    $('#slideshow_nav li:first').addClass('active');
    
    nav_items.live('click', function(e) {
      e.preventDefault();
      nav_items.removeClass('active');
      $(this).addClass('active');
      current_slide = $(this).index();
      container.animate({
        left: -(settings.flide_width*current_slide)
      }, {
        'duration': settings.slide_time,
        'queue'   : false,
        'easing'  : settings.ease_type
      });
    });
    
    nav_items.find('a').live('click', function(){
      remove_countdown();
    });
    
    function next_slide(){
      if(current_slide+1 == slides){
        nav_items.eq(0).trigger('click');
      }else{
        nav_items.eq(current_slide+1).trigger('click');
      }
    }
    
    function prev_slide(){
      if(current_slide === 0){
        nav_items.eq(slides-1).trigger('click');
      }else{
        nav_items.eq( current_slide-1 ).trigger('click');
      }
    }
    
    function check_key(e){
      switch (e.keyCode) {
        case 37: prev_slide(); remove_countdown(); break; // Left
        case 39: next_slide(); remove_countdown(); break; // Right
      }      
    }
    
    $(document).keydown(check_key);
    
    if( settings.auto_play ){
      var auto_slide = window.setInterval(function(){
        next_slide();
      }, settings.slide_interval);
      
    }
    
    function remove_countdown(){
      clearInterval(auto_slide);
      auto_slide = false;
    }
    
  });
};
