(function($) {
   $.fn.extend({
      slideshow : function(opts) {
         var options = $.extend({
           duration   : 'slow',
           navigation : 'bullets',
           timer      : 8
         }, opts);

         return this.each(function() {
            var obj    = $(this),
                cur    = 0,
                slides = obj.find('li'),
                nav    = null,
                show   = function(idx) {
                   if (idx != cur) {
                     if (options.navigation) {
                        nav.find('li').removeClass('selected');
                        nav.find('a[href="#slide-' + (idx + 1) +'"]').parent('li').addClass('selected');
                     }
                     $(slides[cur]).css({'z-index' : 1});
                     $(slides[idx]).css({'z-index' : 2}).fadeIn(options.duration, function() {
                        $(slides[cur]).hide();
                        cur = idx;
                     });
                   }
                },
                interval  = 0,
                slideshow  = function() {
                   var idx = cur + 1;
                   if (idx >= slides.length)
                     idx = 0;
                  show(idx);
                };

            // Hide all slides but first
            obj.find('li:not(:first)').hide();
            obj.find('li:first').show();

            // Create nav
            if (options.navigation != false) {
               nav = $('<ol class="slideshow-navigation"></ol>');
               slides.each(function(idx) {
                  var id      = idx + 1,
                      li      = $('<li id="slide-' + id + '" class="slideshow-bullet"></li>'),
                      content = id;

                  switch (options.navigation) {
                     case 'bullets' :
                        content = '&bull;';
                        break;
                     default:
                     case 'numbers' :
                  }

                  var a  = $('<a href="#slide-' + id + '">' +  content + '</a>');

                  nav.append(li.append(a).addClass(id == 1 ? 'selected' : ''));
                  a.click(function() {
                     show(idx);
                     if (options.timer) {
                        clearInterval(interval);
                        interval = setInterval(slideshow, options.timer * 1000);
                     }
                     return false;
                  });
               });
            }

            if (options.navigation != false) {
               obj.after(nav);
            }

            if (options.timer) {
               interval = setInterval(slideshow, options.timer * 1000);
            }
         });
      }
   });
})(jQuery);
