/*
 rotator.js : Created on 5/10/2007 by Tim Walker
 Purpose: To rotate a set of images on a page with a given interval.
 
 Usage:
	-Include this script into the <head> of the page.
		e.g. <script type="text/javascript" src="js/rotator.js"></script>
		
	-Add an image tag with an id attribute somewhere within the <body>
		e.g. <body>....<img src="images/a.jpg" id="currentrotator" alt="" />...</body>
		
	-After the image tag, create a Rotator object (setting it's properties in the constructor),
		and attach it's init method to the body load using inline javascript.
		e.g.
			<img src="images/a.jpg" id="currentrotator" alt="" />
			<script type="text/javascript">
				var myRotator = new Rotator({
					imgRotators:['img/rotators/rotatingphoto1.gif', 'img/rotators/rotatingphoto2.gif', 'img/rotators/rotatingphoto3.gif'], 
					delay:4000, 
					rotatorID:'currentrotator'
				});
				addEvent(window, 'load', myRotator.init);			
			</script>
*/
function Rotator(oArg){
	var hasArgs = (typeof oArg!='undefined')?true:false;
	
	//private properties
	var o = this;// scope protection for this
	o.imgIndex = 0;
	o.intervalID = 0;
	
	// public properties
	o.delay = (hasArgs && oArg.delay)? oArg.delay : 4000;// delay between image rotation
	o.rotatorID = (hasArgs && oArg.rotatorID)? oArg.rotatorID : 'currentrotator';// ID of <img> to swap
	o.imgRotators = (hasArgs && oArg.imgRotators)? oArg.imgRotators : ['images/rotatingphoto1.gif', 'img/rotatingphoto2.gif'];// Array of image paths
	
	// methods
	o.setRotator = function(imgSrc){
		var elCurRot = document.getElementById(o.rotatorID);
		if(elCurRot == null){return;}
		elCurRot.src = imgSrc;
	}
	o.rotate = function(){
		// set the index
		o.imgIndex++;
		if(o.imgIndex >= o.imgRotators.length){o.imgIndex = 0;}
		// set the rotator
		o.setRotator(o.imgRotators[o.imgIndex]);
	}
	o.stop = function(){
			clearInterval(o.intervalID);
	}
	o.init = function(){
		if(!document.getElementById){return;}
		
		var elCurRot = document.getElementById(o.rotatorID);
		if(elCurRot == null || o.imgRotators.length == 1){
			return;
		}
		else{
			o.setRotator(o.imgRotators[0]);
			o.intervalID = setInterval(o.rotate, o.delay);
		}
	}
}

// event handling
function array_search(val, arr)
{
	var i = arr.length;
	while (i--)
		if (arr[i] && arr[i] === val) break;
	return i;
}

function addEvent(obj, evType, fn){
	var evTypeRef = '__' + evType;
	if (obj[evTypeRef])
	{
		if (array_search(fn, obj[evTypeRef]) > -1) return;
	}
	else
	{
		obj[evTypeRef] = [];
		if (obj['on'+evType]) obj[evTypeRef][0] = obj['on'+evType];
		obj['on'+evType] = handleEvent;
	}
	obj[evTypeRef][obj[evTypeRef].length] = fn;
}

function handleEvent(e)
{
	e = e || window.event;
	var evTypeRef = '__' + e.type, retValue = true;
	for (var i = 0, j = this[evTypeRef].length; i < j; i++)
	{
		if (this[evTypeRef][i])
		{
			this.__fn = this[evTypeRef][i];
			retValue = this.__fn(e) && retValue;
		}
	}
	if (this.__fn) try { delete this.__fn; } catch(e) { this.__fn = null; }
	return retValue;
}
