function ImageRotator() {

	this.buckets = new Array();
	this.counter = 0;
	this.counters;

	this.bucketList = new Array();

	// support Array.indexOf in IE
	if (! Array.indexOf ) {
		Array.prototype.indexOf = function(obj) {
			var discovery = false;
			for ( var i = 0; i < this.length; i++ ) {
				if ( this[i] == obj ) {
					discovery = true;
					break;
				}
			}
			return discovery ? i : -1;
		}
	}
		
	this.addBucket = function(bucketName) {
		var bucketIndex = this.buckets.length;
		this.buckets[bucketIndex] = new Array();
		this.bucketList[bucketIndex] = bucketName;
		return bucketIndex;
	}

	this.addImage = function(bucketName, src) {
		var bucketIndex = this.getBucketIndex(bucketName)
		if ( bucketIndex == -1 ) 
			bucketIndex = this.addBucket(bucketName);
		
		var i = this.buckets[bucketIndex].length;
		this.buckets[bucketIndex][i] = new Image();
		this.buckets[bucketIndex][i].src = src;
	}

	this.getBucketIndex = function(bucketName) {
		return this.bucketList.indexOf(bucketName);
	}

	this.getBucketName = function(bucketIndex) {
		return this.bucketList[bucketIndex];
	}

	this.getNextBucket = function() {
		var bucketIndex = this.counter;
		this.counter++;
		if ( this.counter >= this.buckets.length ) this.counter = 0;
		return bucketIndex;
	}

	this.getNextImage = function(method) {
		var bucketIndex = this.getNextBucket();
		var bucketName = this.getBucketName(bucketIndex);
		var depth = this.buckets[bucketIndex].length;
		if ( method == 'random' ) {
			var i = Math.floor(Math.random()*depth);
		}
		else {
			var i = this.counters[bucketIndex];

			this.counters[bucketIndex]++;
			if ( this.counters[bucketIndex] >= depth ) 
				this.counters[bucketIndex] = 0;
		}

		
		if ( document.images[bucketName] )
			// if browser is ie and has a filter
			if ( document.images[bucketName].filters && 
			     document.images[bucketName].filters.length > 0 ) {
				document.images[bucketName].filters[0].apply(); 
				document.images[bucketName].src = this.buckets[bucketIndex][i].src;
				document.images[bucketName].filters[0].play();
			}
			else {
				document.images[bucketName].src = this.buckets[bucketIndex][i].src;
			}
	}


	//'random|sequential'
	this.startRotation = function(interval, method) {

		var rotator = this;

		if ( method.indexOf('sequential') != -1 ) {
			var startIndex = 0;
			if ( method.indexOf(':') != -1 ) 
				startIndex = method.split(':')[1];

			this.initCounters(startIndex);
		}

		setInterval( function() { 
			rotator.getNextImage(method); 
		}, interval );

	} 

	this.initCounters = function(startIndex) {
		this.counters = new Array(this.buckets.length);
		for ( var i = 0; i < this.buckets.length; i++ ) {
			this.counters[i] = startIndex;
		}
	}
}
