
// There are two objects defined in this file:
// "slide" - contains all the information for a single slide
// "slideshow" - consists of multiple slide objects and runs the slideshow

//==================================================
// slide object
//==================================================
function slide(src,link,text,window,attr) {
// This is the constructor function for the slide object.
// It is called automatically when you create a new slide object.
// For example:
// s = new slide();

  // Image URL
  this.src = src;

  // Link URL
  this.link = link;

  // Text to display
  this.text = text;

  // Name of the target window ("_blank")
  this.window = window;

  // Attributes for the target window:
  // width=n,height=n,resizable=yes or no,scrollbars=yes or no,
  // toolbar=yes or no,location=yes or no,directories=yes or no,
  // status=yes or no,menubar=yes or no,copyhistory=yes or no
  // Example: "width=200,height=300"
  this.attr = attr;

  // Create an image object for the slide
  if (document.images) {
    this.image = new Image();
  }

  // Public methods
  this.load = slide_load;
  this.hotlink = slide_hotlink;
}


function slide_load() {
// This function loads the image for the slide

  if (!document.images) { return; }

  if (!this.image.src) {
    this.image.src = this.src;
  }
}


function slide_hotlink() {
// This function jumps to the slide's link.
// If a window was specified for the slide, then it opens a new window.

  if (this.window) {

    // If window attributes are specified, use them to open the new window
    if (this.attr) {
      window.open(this.link, this.window, this.attr);

    } else {
      // If window attributes are not specified, do not use them
      // (this will copy the attributes from the originating window)
      window.open(this.link, this.window);
    }

  } else {
    // Open the hotlink in the current window
    location.href = this.link;
  }
}


//==================================================
// slideshow object
//==================================================
function slideshow( slideshowname ) {
// This is the constructor function for the slideshow object.
// It is called automatically when you create a new object.
// For example:
// ss = new slideshow("ss");

  // Name of this object
  // (required if you want your slideshow to auto-play)
  // For example, "SLIDES1"
  this.name = slideshowname;

  // When we reach the last slide, should we loop around to start the
  // slideshow again?
  this.repeat = true;

  // Number of images to pre-fetch.
  // -1 = preload all images.
  //  0 = load each image is it is used.
  //  n = pre-fetch n images ahead of the current image.
  // I recommend preloading all images unless you have large
  // images, or a large amount of images.
  this.prefetch = -1;

  // IMAGE element on your HTML page.
  // For example, document.images.SLIDES1IMG
  this.image;

  // TEXTAREA element on your HTML page.
  // For example, document.SLIDES1FORM.SLIDES1TEXT
  this.textarea;

   // Milliseconds to pause between slides
  this.timeout = 3000;

  // These are private variables
  this.slides = new Array();
  this.current = 0;
  this.timeoutid = 0;

  // Public methods
  this.add_slide = slideshow_add_slide;
  this.set_image = slideshow_set_image;
  this.set_textarea = slideshow_set_textarea;

  this.play = slideshow_play;
  this.pause = slideshow_pause;

  this.update = slideshow_update;
  this.goto_slide = slideshow_goto_slide;
  this.next = slideshow_next;
  this.previous = slideshow_previous;

  this.get_text = slideshow_get_text;
  this.display_text = slideshow_display_text;
  this.hotlink = slideshow_hotlink;

  this.save_position = slideshow_save_position;
  this.restore_position = slideshow_restore_position;

  this.noscript = slideshow_noscript;

  // Private methods
  this.loop = slideshow_loop;
  this.valid_image = slideshow_valid_image;
}


function slideshow_add_slide( slide ) {
// Add a slide to the slideshow.
// For example:
// SLIDES1.add_slide(new slide("s1.jpg", "link.html"))

  // If this version of JavaScript does not allow us to
  // change images, then we can't do the slideshow.
  if (!document.images) { return; }

  var i = this.slides.length;

  // Prefetch the slide image if necessary
  if (this.prefetch == -1) {
    slide.load();
  }

  this.slides[i] = slide;
}


function slideshow_set_textarea( textareaobject ) {
// This function configures the slideshow to use a textarea to display
// the slideshow text.

  // Set the "textarea" property of the slideshow object.
  this.textarea = textareaobject;

  // Initialize the text in the textarea
  this.display_text();
}


function slideshow_set_image( imageobject ) {
// This function configures the slideshow and tells it which image
// needs to be updated.

  // If this version of JavaScript does not allow us to
  // change images, then we can't do the slideshow.
  if (!document.images)
    return

  // Set the "image" property of the slideshow object.
  this.image = imageobject;
}


function slideshow_valid_image() {
// Returns 1 if a valid image has been set for the slideshow

  if (!this.image)
  {
    // Stop the slideshow
    this.pause;

    // Display an error message
    window.status = "Error: slideshow image not initialized for " + this.name;
        
    return 0;
  }
  else {
    return 1;
  }
}


function slideshow_hotlink() {
// This function calls the hotlink() method for the current slide.

  this.slides[ this.current ].hotlink();
}


function slideshow_update() {
// This function updates the slideshow image on the page

  // Make sure the slideshow has been initialized correctly
  if (! this.valid_image()) { return; }

  // Load the slide image if necessary
  this.slides[ this.current ].load();

  // Pre-fetch the next slide image(s) if necessary
  if (this.prefetch > 0) {
    for (i = this.current + 1;
         i <= (this.current + this.prefetch) && i < this.slides.length;
         i++) {
      this.slides[i].load();
    }
  }

  // Update the image.
  this.image.src = this.slides[ this.current ].image.src;

  // Update the text
  this.display_text();
}


function slideshow_goto_slide(n) {
// This function jumpts to the slide number you specify.
// If you use slide number -1, then it jumps to the last slide.
// You can use this to make links that go to a specific slide,
// or to go to the beginning or end of the slideshow.
// Thanks to Lennart Groetzbach (lennartg@web.de) for this code.
// Examples:
// <a href="javascript:myslides.goto_slide(0)">First</a>
// <a href="javascript:myslides.goto_slide(-1)">Last</a>
// <a href="javascript:myslides.goto_slide(5)">Catching a Fish</a>

  if (n == -1) {
    n = this.slides.length - 1;
  }

  if (n < this.slides.length && n >= 0) {
    this.current = n;
  }

  this.update();
}


function slideshow_next( ) {
// This function advances to the next slide.

  // Increment the image number
  if (this.current < this.slides.length - 1) {
    this.current++;
  } else if (this.repeat) {
    this.current = 0;
  }

  this.update();
}


function slideshow_previous( ) {
// This function goes to the previous slide.

  // Decrement the image number
  if (this.current > 0) {
    this.current--;
  } else if (this.repeat) {
    this.current = this.slides.length - 1;
  }

  this.update();
}


function slideshow_display_text(text) {
// This function displays text in the textarea.

  // If a textarea has been specified,
  // then this function changes the text displayed in it
  if (this.textarea) {

    if (text) {
      this.textarea.value = text;
    } else {
      this.textarea.value = this.slides[ this.current ].text;
    }
  }
}


function slideshow_get_text() {
// This function returns the text of the current slide

  return(this.slides[ this.current ].text);
}


function slideshow_loop( ) {
// This function is for internal use only.
// This function gets called automatically by a JavaScript timeout.
// It advances to the next slide, then sets the next timeout.

  // Go to the next image
  this.next( );

  // Keep playing the slideshow
  this.play( );
}


function slideshow_play(timeout) {
// This function implements the automatically running slideshow.

  // Make sure we're not already playing
  this.pause();

  // If a new timeout was specified (optional)
  // set it here
  if (timeout) {
    this.timeout = timeout;
  }

  // After the timeout, call this.loop()
  this.timeoutid = setTimeout( this.name + ".loop()", this.timeout);
}


function slideshow_pause( ) {
// This function stops the slideshow if it is automatically running.

  if (this.timeoutid != 0)
  {
    clearTimeout(this.timeoutid);
    this.timeoutid = 0;
  }
}


function slideshow_save_position(cookiename) {
// Saves the position of the slideshow in a cookie,
// so when you return to this page, the position in the slideshow
// won't be lost.

  if (!cookiename) {
    cookiename = this.name + '_slideshow';
  }

  document.cookie = cookiename + '=' + this.current;
}


function slideshow_restore_position(cookiename) {
// If you previously called slideshow_save_position(),
// returns the slideshow to the previous state.

  //Get cookie code by Shelley Powers

  if (!cookiename) {
    cookiename = this.name + '_slideshow';
  }

  var search = cookiename + "=";

  if (document.cookie.length > 0) {
    offset = document.cookie.indexOf(search);
    // if cookie exists
    if (offset != -1) { 
      offset += search.length;
      // set index of beginning of value
      end = document.cookie.indexOf(";", offset);
      // set index of end of cookie value
      if (end == -1) end = document.cookie.length;
      this.current = unescape(document.cookie.substring(offset, end));
      }
   }
}


function slideshow_noscript() {
// This function is not for use as part of your slideshow,
// but you can call it to get a plain HTML version of the slideshow
// images and text.
// You should copy the HTML and put it within a NOSCRIPT element, to
// give non-javascript browsers access to your slideshow information.
// This also ensures that your slideshow text and images are indexed
// by search engines.

  $html = "\n";

  // Loop through all the slides in the slideshow
  for (i=0; i < this.slides.length; i++) {

    slide = this.slides[i];

    $html += '<P>';

    if (slide.link) {
      $html += '<a href="' + slide.link + '">';
    }

    $html += '<img src="' + slide.src + '" ALT="slideshow image">';

    if (slide.link) {
      $html += '</a>';
    }

    if (slide.text) {
      $html += "<BR>\n" + slide.text;
    }

    $html += '</P>' + "\n\n";
  }

  // Make the HTML browser-safe
  $html = $html.replace(/\&/g, "&amp;" );
  $html = $html.replace(/</g, "&lt;" );
  $html = $html.replace(/>/g, "&gt;" );

  return('<pre>' + $html + '</pre>');
}
