var Slideshow = function() {
   
   var slide_interval = 8000;
   var playing = true;
   var number_of_slides;
   var last_slide = 0;
   var transitioning = false;
   var queued_slide = null;
   
   var go_to_slide = function(slide_num) {
     slide_num = slide_num%number_of_slides;
         
     if (slide_num == last_slide) return;
     
     if (transitioning) {
       queued_slide = slide_num;
       return false
     }
     transitioning = true;
 
     var slide_to_hide = els[last_slide];
     var slide_to_show = els[slide_num];
     last_slide = slide_num;
     
     var image_to_hide = slide_to_hide.getElementsByTagName('img')[0];
     var text_to_hide = slide_to_hide.getElementsByTagName('div')[0];
     var image_to_show = slide_to_show.getElementsByTagName('img')[0];
     var text_to_show = slide_to_show.getElementsByTagName('div')[0];
 
 
     // move old slide to the front
     $(slide_to_hide).setStyle({
       zIndex: 9998
     });
 
     // move new slide to the back
     $(slide_to_show).setStyle({
       zIndex: 9997
     })
 
     // make sure the new text is hidden and the new image and slide are show
     // so that when the old slide (in front) fades out the new slide is visible
     // along with it's image (but not it's text... that fades in later)
     $(text_to_show).hide();
     $(image_to_show).show().setOpacity(1);
     $(slide_to_show).show();
 
     var cleanup = function() {
       transitioning = false;
       transition_completed();
       setTimeout(function() {
         if (playing) go_to_slide(slide_num + 1);
       }, slide_interval);
     }
 
     if (Prototype.Browser.IE) {
       new Effect.BlindUp(text_to_hide, {duration: .3, queue: 'end'});
       new Effect.Fade(image_to_hide, {duration: .5, queue: 'end'});
       new Effect.BlindDown(text_to_show, {duration: .8, queue: 'end', afterFinish: cleanup});
     } else {
       new Effect.Fade(text_to_hide, {duration: .3, queue: 'end'});
       new Effect.Fade(image_to_hide, {duration: .5, queue: 'end'});
       new Effect.Appear(text_to_show, {duration: .8, queue: 'end', afterFinish: cleanup});
     }
     
   }
   
 
   // Private
   var els = [];
 
   
   var start = function() {
     els = $$('#Slideshow .slide');
     number_of_slides = els.length;
 
     build_nav();
 
     setTimeout(function() { 
       if (playing) go_to_slide(1); 
     }, slide_interval);
 
   }
 
   var build_nav = function(slide) {
     
     var nav = document.createElement('div');
     nav.id = 'SlideshowNavigation';
     var html_string = '<a class="previousSlide" href="javascript:;" onclick="Slideshow.previous()"></a><a class="nextSlide" href="javascript:;" onclick="Slideshow.next()"></a>';
     
     nav.innerHTML = html_string;
     
     
     
     $(nav).hide();
     $('Slideshow').appendChild(nav);
         
     $$('#SlideshowNavigation a').each(function(link) {
       link.onmousedown = function() { $(this).addClassName('active'); }
       link.onmouseup = function() { $(this).removeClassName('active'); }
     });
         
     Prototype.Browser.IE ? $(nav).show() : new Effect.Appear(nav);
     
   }  
   
   var transition_completed = function() {
     if (queued_slide != null) go_to_slide(queued_slide);
     queued_slide = null;
   }
  
   
   var next = function() {
     go_to_slide(last_slide + 1);
   }
   
   
   var previous = function() {
     last_slide <= 0 ? go_to_slide(number_of_slides - 1) : go_to_slide(last_slide - 1);
   }
   
   Event.observe(window, 'load', start);
   return {
     next: next,
     previous: previous
   }
}();