// --------------------------------------------------------------------------------------------
// Title: 		Slideshow Script
// Description:	Slideshow for website use
// Author:		A. Rychener
// Modified Date: 	- ARY: added title/test assignments (2/10/09)
// --------------------------------------------------------------------------------------------

function slide(src,link,text,target,attr) 
{
	this.src = src;
	this.link = link;
	this.text = text;
	this.target = target;
	this.timeout = 5000;
	this.attr = attr;

	//Create an image object for the slide
	if (document.images) 
	{
		this.image = new Image();
	}

	//Flag to tell when load() has already been called
	this.loaded = false;

	//--------------------------------------------------
	this.load = function() 
	{
		//This method loads the image for the slide
		if(!document.images)
		{
			return; 
		}

		if(!this.loaded) 
		{
			this.image.src = this.src;
			this.loaded = true;
		}
	}

	//--------------------------------------------------
	this.hotlink = function() 
	{
		var mywindow;

		//If this slide does not have a link, do nothing
		if (!this.link) 
			return;

		// Open the link in a separate window?
		if(this.target) 
		{
			// If window attributes are specified,
			// use them to open the new window
			if (this.attr) 
			{
				mywindow = window.open(this.link, this.target, this.attr);
			}
			else 
			{
				// If window attributes are not specified, do not use them
				// (this will copy the attributes from the originating window)
				mywindow = window.open(this.link, this.target);
			}

			// Pop the window to the front
			if (mywindow && mywindow.focus) 
				mywindow.focus();
		}
		else
		{
			// Open the link in the current window
			location.href = this.link;
		}
	}
}



function slideshow( slideshowname ) 
{
	this.name = slideshowname;

	this.repeat = true;
	this.prefetch = -1;
	this.image;
	this.textid;
	this.textarea;
	this.titleid;
	this.timeout = 10000;

	this.slides = new Array();
	this.current = 0;
	this.timeoutid = 0;

	this.add_slide = function(slide) 
	{
		var i = this.slides.length;
  
    		// Prefetch the slide image if necessary
    		if (this.prefetch == -1) 
    		{
      			slide.load();
    		}
    		
    		this.slides[i] = slide;
  	}

	//--------------------------------------------------
	this.play = function(timeout) 
	{
    	  	// Make sure we're not already playing
    		this.pause();
  
    		if (timeout) 
    		{
      			this.timeout = timeout;
    		}
  
    		if (typeof this.slides[ this.current ].timeout != 'undefined') 
    		{
      			timeout = this.slides[ this.current ].timeout;
    		}
    		else
    		{
      			timeout = this.timeout;
    		}
		
		this.timeoutid = setTimeout( this.name + ".loop()", timeout);
  	}

  	//--------------------------------------------------
  	this.pause = function() 
  	{
    		// This method stops the slideshow if it is automatically running.
      		if (this.timeoutid != 0) 
      		{
      			clearTimeout(this.timeoutid);
      			this.timeoutid = 0;
    		}
  	}

	//--------------------------------------------------
  	this.update = function() 
  	{
    		// This method updates the slideshow image on the page
    		// Make sure the slideshow has been initialized correctly
    		if (! this.valid_image())
    		{
    			return; 
    		}
  
    		// Call the pre-update hook function if one was specified
    		if (typeof this.pre_update_hook == 'function')
    		{
      			this.pre_update_hook();
    		}

    		// Convenience variable for the current slide
    		var slide = this.slides[ this.current ];

    		// Determine if the browser supports filters
    		var dofilter = false;
    		if (this.image && typeof this.image.filters != 'undefined' && typeof this.image.filters[0] != 'undefined') 
    		{
      			dofilter = true;
    		}

    		// Load the slide image if necessary
    		slide.load();
  
    		// Apply the filters for the image transition
    		if (dofilter) 
    		{
			// If the user has specified a custom filter for this slide,
	      		// then set it now
			if (slide.filter && this.image.style && this.image.style.filter) 
			{
				this.image.style.filter = slide.filter;
			}
	      
	      		this.image.filters[0].Apply();
		}

		// Update the image.
		this.image.src = slide.image.src;

		// Play the image transition filters
		if (dofilter) 
		{
	      		this.image.filters[0].Play();
	    	}

		// Update the text
	    	this.display_text();
	    
	    	// Update the title
	    	this.display_title();

	    	// Call the post-update hook function if one was specified
	    	if(typeof this.post_update_hook == 'function') 
	    	{
	      		this.post_update_hook();
	    	}
	
		// Do we need to pre-fetch images?
	    	if(this.prefetch > 0) 
	    	{
	      		var next, prev, count;

	      		// Pre-fetch the next slide image(s)
			next = this.current;
			prev = this.current;
			count = 0;

			do 
			{
			        // Get the next and previous slide number
	        		// Loop past the ends of the slideshow if necessary
	        		if(++next >= this.slides.length) 
	        			next = 0;
        
	        		if(--prev < 0)
	        			prev = this.slides.length - 1;

				// Preload the slide image
				this.slides[next].load();
				this.slides[prev].load();

				// Keep going until we have fetched
				// the designated number of slides
			}
			while(++count < this.prefetch);
		}
	}

	//--------------------------------------------------
	this.goto_slide = function(n) 
	{
		if (n == -1) 
		{
	      		n = this.slides.length - 1;
	    	}

	    	if (n < this.slides.length && n >= 0) 
	    	{
	      		this.current = n;
	    	}

	    	this.update();
	}

	//--------------------------------------------------
  	this.goto_random_slide = function(include_current) 
  	{
		var i;

		// Make sure there is more than one slide
    		if (this.slides.length > 1) 
    		{
			// Generate a random slide number,
      			// but make sure it is not the current slide
      			do
      			{
        			i = Math.floor(Math.random()*this.slides.length);
      			}
      			while (i == this.current);
 
      			// Display the slide
      			this.goto_slide(i);
    		}
  	}

	//--------------------------------------------------
  	this.next = function() 
  	{
    		// This method 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();
  	}

	//--------------------------------------------------
  	this.previous = function() 
  	{
    		// This method 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();
  	}

  	//--------------------------------------------------
  	this.shuffle = function() 
  	{
    		// This method randomly shuffles the order of the slides.
		var i, i2, slides_copy, slides_randomized;

		// Create a copy of the array containing the slides
		// in sequential order
		slides_copy = new Array();

		for (i = 0; i < this.slides.length; i++) 
		{
      			slides_copy[i] = this.slides[i];
    		}

    		// Create a new array to contain the slides in random order
    		slides_randomized = new Array();

		do 
		{
			// Pick a random slide from those that remain
      			i = Math.floor(Math.random()*slides_copy.length);

      			// Add the slide to the end of the randomized array
      			slides_randomized[ slides_randomized.length ] = slides_copy[i];

      			// Remove the slide from the sequential array,
			// so it cannot be chosen again
			for (i2 = i + 1; i2 < slides_copy.length; i2++) 
			{
        			slides_copy[i2 - 1] = slides_copy[i2];
      			}
       			slides_copy.length--;

      			// Keep going until we have removed all the slides

		}
		while (slides_copy.length);

    		// Now set the slides to the randomized array
    		this.slides = slides_randomized;
  	}

	//--------------------------------------------------
	this.get_text = function() 
	{
    		// This method returns the text of the current slide
  
    		return(this.slides[ this.current ].text);
  	}

	//--------------------------------------------------
	this.get_all_text = function(before_slide, after_slide) 
	{
		all_text = "";
  
    		// Loop through all the slides in the slideshow
    		for (i=0; i < this.slides.length; i++) 
    		{
    			slide = this.slides[i];
			
			if (slide.text) 
			{
        			all_text += before_slide + slide.text + after_slide;
     			}
		}
 
		return(all_text);
	}

	//--------------------------------------------------
	this.display_text = function(text) 
	{
    		// Display the text for the current slide
  
    		// If the "text" arg was not supplied (usually it isn't),
    		// get the text from the slideshow
    		if (!text) 
    		{
      			text = this.slides[ this.current ].text;
    		}
  
    		// If a textarea has been specified,
    		// then change the text displayed in it
    		if(this.textarea && typeof this.textarea.value != 'undefined') 
    		{
      			this.textarea.value = text;
    		}

    		// If a text id has been specified,
    		// then change the contents of the HTML element
    		if (this.textid) 
    		{
			r = this.getElementById(this.textid);
      			if(!r)
      			{
      				return false; 
      			}
      
      			if(typeof r.innerHTML == 'undefined')
      			{
      				return false; 
      			}

      			// Update the text
      			r.innerHTML = text;
    		}

	}


	//--------------------------------------------------
	this.display_title = function(title) 
	{
    		// Display the text for the current slide
  
		// If the "title" arg was not supplied (usually it isn't),
		// get the title from the slideshow

		if (!title) 
		{
      			title = this.slides[ this.current ].title;
    		}
  
    		// If a title id has been specified,
    		// then change the contents of the HTML element
    		if (this.titleid) 
    		{
			r = this.getElementById(this.titleid);
      			if (!r)
      			{
      				return false; 
      			}
      
      			if(typeof r.innerHTML == 'undefined')
      			{
      				return false; 
      			}

      			// Update the title
      			r.innerHTML = title;
    		}
	}

	//--------------------------------------------------
	this.hotlink = function() 
	{
    		// This method calls the hotlink() method for the current slide.
  		this.slides[ this.current ].hotlink();
  	}

	//--------------------------------------------------
  	this.save_position = function(cookiename) 
  	{
		if(!cookiename) 
		{
			cookiename = this.name + '_slideshow';
		}

		document.cookie = cookiename + '=' + this.current;
	}


	//--------------------------------------------------
	this.restore_position = function(cookiename) 
	{
		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 = parseInt(unescape(document.cookie.substring(offset, end)));
        		}
     		}
  	}

	//--------------------------------------------------
	this.noscript = function() 
	{
		$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>');
	}

	//--------------------------------------------------
	this.loop = function() 
	{

    		// Make sure the next slide image has finished loading
    		if(this.current < this.slides.length - 1) 
    		{
      			next_slide = this.slides[this.current + 1];
      			
      			if (next_slide.image.complete == null || next_slide.image.complete) 
      			{
        			this.next();
      			}
    		}
    		else
    		{
    			// we're at the last slide
      			this.next();
    		}
    
    		// Keep playing the slideshow
    		this.play( );
  	}

	//--------------------------------------------------
	this.valid_image = function() 
	{
    		// Returns 1 if a valid image has been set for the slideshow
  
    		if(!this.image)
    		{
    			return false;
    		}
    		else 
    		{
      			return true;
    		}
  	}

  	//--------------------------------------------------
  	this.getElementById = function(element_id) 
  	{
    		// This method returns the element corresponding to the id

    		if (document.getElementById) 
    		{
      			return document.getElementById(element_id);
    		}
    		else if(document.all) 
    		{
      			return document.all[element_id];
    		}
    		else if(document.layers) 
    		{
      			return document.layers[element_id];
    		}
    		else
    		{
      			return undefined;
    		}
  	}
  
  	this.set_image = function(imageobject) 
  	{
    		if (!document.images)
    			return;
    
    		this.image = imageobject;
  	}

	//--------------------------------------------------
	this.set_textarea = function(textareaobject) 
	{
		this.textarea = textareaobject;
    		this.display_text();
  	}

  	//--------------------------------------------------
  	this.set_textid = function(textidstr) 
  	{
    		this.textid = textidstr;
    		this.display_text();
  	}
  

	//--------------------------------------------------
	this.set_titleid = function(titleidstr) 
	{
    		this.titleid = titleidstr;
    		this.display_title();
  	}
}
