// Constructor for HTML image swappers
function ImageSwapper(element, state) {
	this.element = element;
	this.images = {};
	if (state == null) state = 0;
	this.createState(state, element.src);
	this.state = state;
}

// Create and preload the image for a new swap state
ImageSwapper.prototype.createState =
function (state, src) {
	var image = new Image();
	image.src = src;
	this.images[state] = image;
}

// Create and preload images for a set of new swap states
ImageSwapper.prototype.createStates =
function (srcs, method) {
	for (var state in srcs) {
		var src = srcs[state];
		this.createState(state, src);
	}
}

// Create and preload images for a set of new swap states, for which the
// src values are obtained by inserting prefixes before the file name in
// the current src attribute
ImageSwapper.prototype.createPrefixStates =
function (prefixes) {
	var src = this.element.src;
	var offset = src.lastIndexOf("/") + 1;
	var path = src.substr(0, offset);
	var file = src.substr(offset);
	var prefix = prefixes[this.state];
	if (prefix) path = path.substr(0, path.length - prefix.length);
	
	for (var state in prefixes) {
		prefix = prefixes[state];
		var src = path + prefix + file;
		this.createState(state, src);
	}
}

// Create and preload images for a set of new swap states, for which the
// src values are obtained by inserting suffixes before the file extension
// in the current src attribute
ImageSwapper.prototype.createSuffixStates =
function (suffixes) {
	var src = this.element.src;
	var offset = src.lastIndexOf(".");
	var path = src.substr(0, offset);
	var extension = src.substr(offset);
	var suffix = suffixes[this.state];
	if (suffix) path = path.substr(0, path.length - suffix.length);
	
	for (var state in suffixes) {
		suffix = suffixes[state];
		var src = path + suffix + extension;
		this.createState(state, src);
	}
}

// Swap the image if the new image has finished loading
ImageSwapper.prototype.swap =
function (state) {
	var image = this.images[state];
	if (image.complete == null || image.complete) {
		this.element.src = image.src;
		this.state = state;
	}
}

