// Removes leading and ending whitespaces
String.prototype.trim = function () {
	var reRightTrim	= /((\s*\S+)*)\s*/;
	var reLeftTrim	= /\s*((\S+\s*)*)/;
	var sString		= this;
	sString			=  sString.replace(reRightTrim, "$1");
	sString			=  sString.replace(reLeftTrim, "$1");
	return sString;
}

Slideshow								= {
	// customise with these settings
	nTimeInterval: 10000,								// speed of playing slideshow in millisecond
	bStartAsPlaying: true,								// true - initialise slideshow with items playing
														// false - initialise slideshow with items paused at first slide
	sContainerID: 'slideshowContainer',					// id value of the slideshow container
	sItemTag: 'div',									// tag that contains each slide (eg div, img, a)
	sItemClass: 'slideshowItem',						// class of the slides
	sControlContainerID: 'sliderGroup',					// id of the controls container
	sPreviousID: 'previous',							// id of the previous slide button/link
	sPlayID: 'play',									// id of the play slides button/link
	sPauseID: 'pause',									// id of the pause slides button/link
	sNextID: 'next',									// id of the next slide button/link
	sHideClass: 'hide',									// class is used to hide elements
	
	sSlideNumberTag: 'a',								// tag that contains each slide number button (eg div, img, a)
	sSlideNumberClass: 'sliderButton',					// class of the navigate by slide number buttons
	sSlideNumberCurrentClass: 'sliderButtonCurrent',	// class of the navigate by slide number current button
	sSlideNumberIDPrefix: 'sliderNumber',				// prefix of the ID for each slide number button
	
	// don't alter below here
	aSlides: new Array(),								// array of slide divs to show
	aSlideNumbers: new Array(),							// array of slide numbers
	nCurrentSlide: 0,									// slide currently showing 
	oInterval: '',										// object for slideshow interval
	bIntervalOn: false,									// if interval is running or if is paused
	
	init:function() {
		// test that have required functionality
		if(!document.getElementById||!document.createTextNode){return;}
		if(!document.getElementsByTagName||!document.getElementById){return;}
		
		// get slideshow container
		var oContainer							= document.getElementById(Slideshow.sContainerID);
		if (oContainer) {
			
			// get an array of the slides in the slideshow
			Slideshow.aSlides					= DOMUtils.getElementsByClassName(oContainer, Slideshow.sItemTag, Slideshow.sItemClass);
			var oControls						= document.getElementById(Slideshow.sControlContainerID);
			var oPrevious						= document.getElementById(Slideshow.sPreviousID);
			var oPlay							= document.getElementById(Slideshow.sPlayID);
			var oPause							= document.getElementById(Slideshow.sPauseID);
			var oNext							= document.getElementById(Slideshow.sNextID);
			Slideshow.aSlideNumbers				= DOMUtils.getElementsByClassName(oControls, Slideshow.sSlideNumberTag, Slideshow.sSlideNumberClass);
			
			if (Slideshow.aSlides.length > 0) {
				// show container and first slide
				Slideshow.show(oContainer);
				Slideshow.show(Slideshow.aSlides[Slideshow.nCurrentSlide]);			
				
				// if there is more than one slide
				if (Slideshow.aSlides.length > 1) {
					// show slide controls
					if (oControls) {
						Slideshow.show(oControls);
						
						if (oPrevious) {
							Slideshow.show(oPrevious);
							oPrevious.onclick	= function() {Slideshow.previousSlide(); return false;}
						}
						if (oNext) {
							Slideshow.show(oNext);
							oNext.onclick		= function() {Slideshow.nextSlide(); return false;}
						}
						
						if (oPlay && oPause) {
							oPlay.onclick		= function() {
								Slideshow.playSlides();
								Slideshow.show(oPause);
								Slideshow.hide(oPlay);
								return false;
							}
							oPause.onclick		= function() {
								Slideshow.pauseSlides();
								Slideshow.show(oPlay);
								Slideshow.hide(oPause);
								return false;
							}
							if (Slideshow.bStartAsPlaying) {
								Slideshow.playSlides();
								Slideshow.show(oPause);
								Slideshow.hide(oPlay);
							} else {
								Slideshow.pauseSlides();
								Slideshow.show(oPlay);
								Slideshow.hide(oPause);
							}
						} else if (Slideshow.bStartAsPlaying) {
							Slideshow.playSlides();
						}
						
						// activate slide count buttons
						// start loop from 1, because slide numbers on page will use 1 as part of ID
						if (Slideshow.aSlideNumbers && Slideshow.aSlideNumbers.length > 1) {
							for (i = 0; i < Slideshow.aSlideNumbers.length; i++) {
								Slideshow.aSlideNumbers[i].onclick	= function() {
									Slideshow.pauseSlides();
									Slideshow.show(oPlay);
									Slideshow.hide(oPause);														
									aBar			= this.id.split(Slideshow.sSlideNumberIDPrefix);
									nSlideNumber	= parseInt(aBar[1]);
									Slideshow.toSlideNumber(nSlideNumber);
									return false;
								}
							}
							Slideshow.highlightCurrentSlideNumber();
						}
					}
				}
			}
		}
	},
	
	show:function(oElement) {
		while (oElement.className.indexOf(Slideshow.sHideClass) != -1) {
			oElement.className	= oElement.className.replace(Slideshow.sHideClass, '');
			oElement.className	= oElement.className.trim();
		}
	},
	
	hide:function(oElement) {
		oElement.className		= oElement.className.trim();
		oElement.className		= oElement.className + ' ' + Slideshow.sHideClass;
	},
	
	playSlides:function() {
		Slideshow.oInterval 	= setInterval("Slideshow.nextSlide()", Slideshow.nTimeInterval);
		Slideshow.bIntervalOn	= true;
	},
	
	pauseSlides:function() {
		clearInterval(Slideshow.oInterval);
		Slideshow.bIntervalOn	= false;
	},
	
	resetInterval:function() {
		if (Slideshow.bIntervalOn) {
			clearInterval(Slideshow.oInterval);
			Slideshow.oInterval	= setInterval("Slideshow.nextSlide()", Slideshow.nTimeInterval);
		}
	},
	
	previousSlide:function() {
		Slideshow.hide(Slideshow.aSlides[Slideshow.nCurrentSlide]);
		
		if (Slideshow.nCurrentSlide == 0) {
			// at the beginning of the slideshow array, start from end
			Slideshow.nCurrentSlide		= Slideshow.aSlides.length - 1;
		} else {
			// show previous slide in array
			Slideshow.nCurrentSlide--;
		}
		
		Slideshow.show(Slideshow.aSlides[Slideshow.nCurrentSlide]);
		Slideshow.highlightCurrentSlideNumber();
		Slideshow.resetInterval();
	},
	
	nextSlide:function() {
		Slideshow.hide(Slideshow.aSlides[Slideshow.nCurrentSlide]);
		
		if ((Slideshow.nCurrentSlide + 1) == Slideshow.aSlides.length) {
			// at the end of the slideshow array, start from begining
			Slideshow.nCurrentSlide		= 0;
		} else {
			// show next slide in array
			Slideshow.nCurrentSlide++;
		}
		
		Slideshow.show(Slideshow.aSlides[Slideshow.nCurrentSlide]);
		Slideshow.highlightCurrentSlideNumber();
		Slideshow.resetInterval();
	},
	
	toSlideNumber:function(nSlideNumber) {
		Slideshow.hide(Slideshow.aSlides[Slideshow.nCurrentSlide]);
		
		if (nSlideNumber <= Slideshow.aSlides.length && nSlideNumber > 0) {
			Slideshow.nCurrentSlide		= nSlideNumber - 1;
		} else {
			Slideshow.nCurrentSlide		= 0;
		}
		
		Slideshow.show(Slideshow.aSlides[Slideshow.nCurrentSlide]);
		Slideshow.highlightCurrentSlideNumber();
	},
	
	highlightCurrentSlideNumber:function() {
		for (i = 0; i < Slideshow.aSlideNumbers.length; i++) {
			if (Slideshow.nCurrentSlide == i) {
				Slideshow.aSlideNumbers[i].className = Slideshow.sSlideNumberCurrentClass;
			} else {
				Slideshow.aSlideNumbers[i].className = Slideshow.sSlideNumberClass;
			}
		}
	}
}

WindowListener.add("load","Slideshow.init()");
