function ImageRandomizer(fileTemplate, imageCount) {
	this.fileTemplate = fileTemplate;
	this.imageCount   = imageCount;
	this.images       = new Array();
	this.offset       = 0;
		
	for(i = 0 ; i < imageCount ; i++) {
		this.images.push(sprintf(this.fileTemplate, i + 1));
	}
	ImageRandomizer.fisherYatesShuffle(this.images);
}
ImageRandomizer.prototype.getNextImage = function() {
	var result = null;
	var offset = this.offset;
	this.offset = (this.offset + 1) % this.imageCount;
	if(this.imageCount) {
		result = this.images[offset];
	}
	return result;
}
ImageRandomizer.fisherYatesShuffle = function(myArray) {
	var i = myArray.length;
	if(i == 0) return false;
	while(--i) {
		var j = Math.floor(Math.random() * (i + 1));
		var tempi = myArray[i];
		var tempj = myArray[j];
		myArray[i] = tempj;
		myArray[j] = tempi;
	}
}

function debugMessage(message) {
	var ts  = new Date();
	var dstring = sprintf('%02d:%02d:%02d.%03d',
		ts.getHours(),
		ts.getMinutes(),
		ts.getSeconds(),
		ts.getMilliseconds()
	);
	$('#debug_output').val(dstring+' -- '+message+'\n'+$('#debug_output').val());
}

function selectRandomImage(fileTemplate, imageCount) {
	return sprintf(fileTemplate, Math.ceil(Math.random() * imageCount));
}

var timers = Array();

function resetTimers() {
	for(i = 0 ; i < timers.length ; i++) {
		clearTimeout(timers[i]);
	}
}

function generateInterval(baseInterval, intervalStagger, fade) {
	var stagger = 0;
	if(typeof baseInterval == 'undefined' || !baseInterval) {
		baseInterval = 5 * 60 * 1000;
	}
	if(typeof intervalStagger == 'undefined' || !intervalStagger) {
		intervalStagger = 0;
	}
	if(typeof fade == 'undefined' || !fade) {
		fade = 0;
	}
	if(intervalStagger) {
		stagger = Math.round(Math.random() * (intervalStagger * 2 + 1)) - intervalStagger;
	}
	return Math.max(baseInterval + stagger + 2 * fade, 500);
}

jQuery.fn.extend({
	randomImage: function(randomizer, fade) {
		if(typeof fade == 'undefined') fade = 500;
		if(randomizer.getNextImage) {
			this.each(function() {
				var element = this;
				$(element).fadeOut(fade, function() {
					var src = randomizer.getNextImage();
					$(element).attr('src', src);
					$(element).fadeIn(fade);
				});
			});
		}
	},
	timedRandomImage: function(randomizer, baseInterval, intervalStagger, fade) {
		this.each(function() {
			var image = this;
			var interval = generateInterval(baseInterval, intervalStagger, fade);
			$(image).randomImage(randomizer, fade);
			timer = setTimeout(function() {
				$(image).timedRandomImage(randomizer, baseInterval, intervalStagger, fade);
			}, interval);
			timers.push(timer);
		});
	}
});