//	This slideshow downloads slide images only when requested by the controlling process
//	The purpose is to reduce the page loading time; the next slide is called when a slide
//	transition has taken place.   	Colin Williams November 2006
//	This version has all comments removed to reduce file size.  If you would like
//	to use this program, please contact me at info@swcsl.com to obtain the "documented" version
var imageList = new Array();	
var imageStatus = new Array();	
var numSlides;	
var i;
var currentTimeout, loadCount = 0, swapCount = 0;
var nextSlide = 0;	
var currentSlide = 0;	
var curState = 0;	
var delayvalue;
var imageLoadBusy0 = false, imageLoadBusy1 = false;
var imageLoad0 = 0, imageLoad1 = 0;
var nextLoadCount, modifiedSlideDelay = 0;
function initImages() {
	var slideLeft;
	var slideTop;
	if (!document.getElementsByTagName || !document.getElementById || !document.createElement || !document.createTextNode) return false;
	numSlides = photoList.length;
	for(i = 0; i < numSlides; i++) {
		imageStatus[i] = false;
	}
	nextSlide = 0;	
	fetchSlide(nextSlide);
	slideLeft = Math.floor((boxWidth - photoWidth[nextSlide]) / 2);
	slideTop = Math.floor((boxHeight - photoHeight[nextSlide]) / 2);
	var slideholder = document.getElementById("mainSlide");
	if(slideholder.getElementsByTagName("img")) {
		var images = slideholder.getElementsByTagName("img");
		slideholder.removeChild(images[0]);
	}
	slideholder.style.height = (boxHeight + 4) + "px";
	slideholder.style.width = (boxWidth + 4) + "px";
	slideholder.style.overflow = "hidden";
	var slide = document.createElement("img");
	slide.setAttribute("src",photoList[nextSlide]);
	slide.setAttribute("alt","slide show image");
	slide.style.position = "absolute";
	slide.style.top = slideTop + "px";
	slide.style.left = slideLeft + "px";
	slide.style.height = (photoHeight[nextSlide]) + "px";
	slide.style.width = (photoWidth[nextSlide]) + "px";
	slide.style.borderTop = "2px solid #C8C7D4";
	slide.style.borderLeft = "2px solid #C8C7D4";
	slide.style.borderBottom = "2px solid #91919A";
	slide.style.borderRight = "2px solid #91919A"; 
	slideholder.appendChild(slide);
	currentSlide = nextSlide;
	nextSlide = (nextSlide + 1) % numSlides;
	if (testIfLoaded(nextSlide)) {
		currentTimeout = setTimeout("timeoutSwap()", initslidedelay);
		curState = 1;
	} else {
		fetchSlide(nextSlide);
		curState = 3;
		loadCount = 0;
		delayvalue = initslidedelay;
		currentTimeout = setTimeout("timeoutLoad()", loaddelay);					
	}	
}
function timeoutLoad() {	
	switch(curState) {
		case 3: 			
			if (testIfLoaded(nextSlide)) {							
				modifiedSlideDelay = delayvalue - (loadCount * loaddelay);
				if (modifiedSlideDelay < 10) {
					modifiedSlideDelay = loaddelay;
				}
				loadCount = 0;
				curState = 1;
				currentTimeout = setTimeout("timeoutShow()", modifiedSlideDelay);
			} else {
				loadCount ++;
				currentTimeout = setTimeout("timeoutLoad()", loaddelay);
			}
			return;
		case 1:	case 2: 
			return;
		default: 
			defaultHandler('Loading Timeout');
			return;
	}
}
function timeoutSwap() {
	switch(curState) {
		case 1: case 3: 
			return;
		case 2: 
			swapCount ++;
			if (swapSlides(currentSlide, nextSlide, boxWidth, boxHeight, swapCount, swapdelay)) {
				swapCount = 0;
				currentSlide = nextSlide;
				nextSlide = (nextSlide + 1) % numSlides;  
				if (testIfLoaded(nextSlide)) {
					swapCount = 0;
					currentTimeout = setTimeout("timeoutShow()", slidedelay);
					curState = 1;
				} else {
					fetchSlide(nextSlide);
					curState = 3;
					loadCount = 0;
					delayvalue = slidedelay;
					currentTimeout = setTimeout("timeoutLoad()", loaddelay);
				}				
			} else {
				currentTimeout = setTimeout("timeoutSwap()", swapdelay);
			}
			return;
		default: 
			defaultHandler('Slide Swap Timeout');
			return;
	}
}
function timeoutShow() {
	switch(curState) {
		case 1: 
			swapCount = 0; 
			curState = 2;
			currentTimeout = setTimeout("timeoutSwap()", swapdelay);
			return;
		case 2: case 3: 
			return;
		default: 
			defaultHandler('Slide Show timeout');
			return;
	}
}
function fetchSlide(slideindex) {
	if (imageLoadBusy0 == false) {
		imageList[slideindex] = new Image();
		imageLoad0 = slideindex;
		imageLoadBusy0 = true;
		imageList[slideindex].onload = imageLoadEvt0;
	} else {
		if (imageLoadBusy1 == false) {
			imageList[slideindex] = new Image();
			imageLoad1 = slideindex;
			imageLoadBusy1 = true;
			imageList[slideindex].onload = imageLoadEvt1;
		}
	}
	imageList[slideindex].src = photoList[slideindex];
	return true;
}
function testIfLoaded(slideindex) {
	return (imageStatus[slideindex]);
}
function imageLoadEvt0() {
	imageStatus[imageLoad0] = true;
	imageLoadBusy0 = false;
}
function imageLoadEvt1() {
	imageStatus[imageLoad1] = true;
	imageLoadBusy1 = false;
}
function testIfError(slideindex) {
	if ((loadCount * loaddelay) > loadTimeout) {
		return true;
	} else {
		return false;
	}
}
function resetIdle() {
	clearTimeout(currentTimeout);
	startstopRequest = false;
	nextSlideRequest = false;
	loadCount = 0;
	swapCount = 0;
	statusMessage(" ");
	curState = 1;
}
function defaultHandler(msg) {
	resetIdle();
}
window.onload = function() {
	initImages();
	initMouse();
}
