slideshow = function(slide_holder_selector, slide_images, _options) {
  if (typeof(_options) === 'undefined') { _options = {}; }
  var options = {
    fade_speed : 500,
    slide_duration : 7000
  }
  
  var slide_holder = jQuery(slide_holder_selector);
  jQuery(slide_holder).css('position', jQuery(slide_holder).css('position') == 'absolute' ? 'absolute' : 'relative');
  var image_info = slide_images;

  if (image_info.length > 1) {
    var images = []
    var current_image_index = 0;
    var timeout;
  
    
    for (var i = 0; i < image_info.length; i++) {
      var image = new Image();
      image.is_loaded = false;
      image.onload = function() { this.is_loaded = true; }
      image.src = image_info[i].src;
      image.alt = image_info[i].alt;
      image.style.position = 'absolute';
      image.style.top = '0px';
      image.style.left = '0px';
      images.push(image);
    }


    function switch_image(index){
      var new_image = jQuery(images[index]);
      new_image.hide();
      var old_image = jQuery('img', slide_holder);
      current_image_index = index;
      slide_holder.append(new_image);
          
      function after_fade_in(){
        old_image.remove();
      }
      new_image.fadeIn(options.fade_speed, after_fade_in);
    };
  
    function next_image() {
      var new_image_index;
      if (current_image_index != images.length -1) { new_image_index = current_image_index +1; }
      else { new_image_index = 0 };
    
      if (images[new_image_index].is_loaded) { 
        switch_image(new_image_index); 
        return true; 
      }
      else { 
        return false;
      }
    };
  
    function do_slideshow(){
      if (next_image()) { timeout = setTimeout(do_slideshow, options.slide_duration); }
      else { timeout = setTimeout(do_slideshow, 100); }
    };
  
    function stop_slideshow(){
      clearTimeout(timeout);
    };
  
    timeout = setTimeout(do_slideshow, options.slide_duration);
  
    this.next_image = next_image;
    this.do_slideshow = do_slideshow;
    this.stop_slideshow = stop_slideshow;
  }
};