function activeImage( imageRef ) {
	
	var imageIdentifier = imageRef;
	if (imageRef.src != null) {
		imageIdentifier = imageRef.id;
	}
	
	var dynImage = gImageManager.getImage( imageIdentifier );
	dynImage.active();
}

function hoverImage( imageRef ) {
	
	var imageIdentifier = imageRef;
	if (imageRef.src != null) {
		imageIdentifier = imageRef.id;
	}
	
	var dynImage = gImageManager.getImage( imageIdentifier );
	dynImage.hover();
}

function normalImage( imageRef ) {
	
	var imageIdentifier = imageRef;
	if (imageRef.src != null) {
		imageIdentifier = imageRef.id;
	}
	
	var dynImage = gImageManager.getImage( imageIdentifier );
	dynImage.normal();
}



function generateDynamicImage( imageIdentifier, hover, active ) {
	
	var dynImage = new DynamicImage(imageIdentifier);
	
	if (dynImage.image != null) {
		//. successfully created the dynamic image ...
		if (hover != null) {
			
			var hoverUrl = hover;
			
			if (hover == '*') {
				// the alternate image is in the same directory as the normal state
				hoverUrl = __calc_autostate_url(dynImage, 'hover');
				dynImage.image.onmouseover = new Function ("hoverImage('" + dynImage.image.id + "');");
			}
			else if (hover.indexOf('*') == 0) {
				var relPath = hover.substring(1);
				hoverUrl = __calc_imagerelative_url(dynImage, relPath);
			}
			dynImage.setHover( hoverUrl );
		}
	
		if (active != null) {
			var activeUrl = active;
			
			if (active == "#") {
				dynImage.setHover( __calc_autostate_url(dynImage, 'active') );
				dynImage.image.onmousedown = new Function ("activeImage('" + dynImage.image.id + "');");
			}
			else if (hover.indexOf('#') == 0) {
				var relPath = active.substring(1);
				activeUrl = __calc_imagerelative_url(dynImage, relPath);
			}
			dynImage.setActive( activeUrl );
		}
		
		// now automatically set the onmouseover and onmouseout event handlers ...		
		dynImage.image.onmouseout = new Function ("normalImage('" + dynImage.image.id + "');");
		dynImage.image.onclick = new Function ("normalImage('" + dynImage.image.id + "');");

	}
}



function DynamicImageManager() {
	
	this.imagesByName = new Array();
	this.imagesById = new Array();
	
	// there's only 1 manager, so we don't need to use the
	// prototype to save RAM ...
	this.addImage = DynamicImageManager_addImage;
	this.getImage = DynamicImageManager_getImage;
}

function DynamicImageManager_addImage(dynImage) {
	
	var htmlImage = dynImage.image;
	
	if (htmlImage.name == null && htmlImage.id == null) {
		alert ("Dynamic Images cannot be used on image " +
				htmlImage.src +
				" unless it is assigned an id and/or a name");
	}
	else {
		
		if (htmlImage.name != null) {
			this.imagesByName[ htmlImage.name ] = dynImage;
		}
		if (htmlImage.id != null) {
			this.imagesById[ htmlImage.id ] = dynImage;
		}
	}
}

function DynamicImageManager_getImage(identifier) {
	
	var foundImage = null;
	if (this.imagesById[ identifier ] != null) {
		foundImage = this.imagesById[ identifier ];
	}
	else {
		foundImage = this.imagesByName[ identifier ]
	}
	
	return foundImage;
}

var gImageManager = new DynamicImageManager();






function DynamicImage (imageId) {
	
	if (imageId != null) {
		
		if (document.getElementById == null) {
			this.image = document.images[imageId];
		}
		else {
			this.image = document.getElementById(imageId);
		}
		
		if (this.image != null) {
			this.setNormal(this.image.src);
			gImageManager.addImage(this, this.image);
		}
		else {
			alert ("Error occured: can't find image " + imageId);
		}
	}
}



function DynamicImage_active() {
	if (this.activeImage != null) {
		this.image.src = this.activeImage.src;
	}
}

function DynamicImage_hover() {
	if (this.hover != null) {
		this.image.src = this.hoverImage.src;
	}
}

function DynamicImage_normal() {
	if (this.normalImage != null) {
		this.image.src = this.normalImage.src;
	}
}



function DynamicImage_setActive(src) {
	
	if (this.activeImage == null) {
		this.activeImage = new Image();
	}
	this.activeImage.src = src;
}

function DynamicImage_setHover(src) {
	
	if (this.hoverImage == null) {
		this.hoverImage = new Image();
	}
	this.hoverImage.src = src;
}

function DynamicImage_setNormal(src) {
	
	if (this.normalImage == null) {
		this.normalImage = new Image();
	}
	this.normalImage.src = src;
}


// set up the prototype
___x = new DynamicImage();

DynamicImage.prototype.active = DynamicImage_active;
DynamicImage.prototype.hover = DynamicImage_hover;
DynamicImage.prototype.normal = DynamicImage_normal;

DynamicImage.prototype.setActive = DynamicImage_setActive;
DynamicImage.prototype.setHover = DynamicImage_setHover;
DynamicImage.prototype.setNormal = DynamicImage_setNormal;



var gImageManager = new DynamicImageManager();





function __calc_autostate_url (dynImage, state) {
	
	var imgUrl = dynImage.normalImage.src;
	var imgExtension = imgUrl.substring( imgUrl.lastIndexOf('.') );
	var imgTrunk = imgUrl.substring(0, imgUrl.lastIndexOf('.'));
	
	return imgTrunk + "-" + state + imgExtension;
}

function __calc_imagerelative_url (dynImage, relativePath) {
	
	var imgUrl = dynImage.normalImage.src;
	var dirUrl = imgUrl.substring(0, imgUrl.lastIndexOf("/") + 1);
	
	return dirUrl + relativePath;
}

