function Changeable()
	{
	// Do nothing
	}
Changeable.prototype.setEidToChange = function(eidToChange)
	{
	this.eidToChange = eidToChange;
	this.valueArray = new Array();
	this.index = 0;
	}
Changeable.prototype.getEidToChange = function()
	{
	return this.eidToChange;
	}
Changeable.prototype.change = function()
	{
	// Do nothing
	}

function ChangeableText()
	{
	Changeable.call(this);
	}
ChangeableText.prototype = new Changeable;
ChangeableText.prototype.constructor = ChangeableText;
ChangeableText.prototype.change = function()
	{
	if(this.valueArray.length > 0)
		{
		this.index = ++this.index % this.valueArray.length;
		document.getElementById(this.eidToChange).value = this.valueArray[this.index];
		}
	}
ChangeableText.prototype.addText = function(str)
	{
	this.valueArray.push(str);
	}
ChangeableText.prototype.setText = function(index)
	{
	if(index >= 0 && index < this.valueArray.length)
		{
		this.index = index;
		document.getElementById(this.eidToChange).value = this.valueArray[this.index];
		}
	}

function ChangeableImage()
	{
	Changeable.call(this);
	}
ChangeableImage.prototype = new Changeable;
ChangeableImage.prototype.constructor = ChangeableImage;
ChangeableImage.prototype.change = function()
	{
	if(this.valueArray.length > 0)
		{
		this.index = ++this.index % this.valueArray.length;
		document.getElementById(this.eidToChange).src = this.valueArray[this.index].src;
		}
	}
ChangeableImage.prototype.setImageBase = function(imageBase)
	{
	this.imageBase = imageBase;
	}
ChangeableImage.prototype.addImage = function(imageName)
	{
	var imagePath = this.imageBase + imageName;
	var image = new Image();
	image.src = imagePath
	this.valueArray.push(image);
	}
ChangeableImage.prototype.setImage = function(index)
	{
	if(index >= 0 && index < this.valueArray.length)
		{
		this.index = index;
		document.getElementById(this.eidToChange).src = this.valueArray[this.index].src;
		}
	}

function ChangeableBackground()
	{
	Changeable.call(this);
	}
ChangeableBackground.prototype = new Changeable;
ChangeableBackground.prototype.constructor = ChangeableBackground;
ChangeableBackground.prototype.change = function()
	{
	if(this.valueArray.length > 0)
		{
		this.index = ++this.index % this.valueArray.length;
		document.getElementById(this.eidToChange).style.backgroundImage = 'url(' + this.valueArray[this.index] + ')';
		}
	}
ChangeableBackground.prototype.setImageBase = function(imageBase)
	{
	this.imageBase = imageBase;
	}
ChangeableBackground.prototype.addImage = function(imageName)
	{
	var imagePath = this.imageBase + imageName;
	this.valueArray.push(imagePath);
	}
ChangeableBackground.prototype.setImage = function(index)
	{
	if(index >= 0 && index < this.valueArray.length)
		{
		this.index = index;
		document.getElementById(this.eidToChange).style.backgroundImage = "url(" + this.valueArray[this.index] + ")";
		}
	}

function Fadeable(eidToFade,fadeTime,sleepTime,opacityVal,fadeState,minOpacity,maxOpacity) 
	{
	Fadeable.count = ++Fadeable.count || 1;
	this.id = Fadeable.count;
	this.changeableArray = new Array();
	this.eidToFade = eidToFade;
	this.fadeTime = fadeTime;
	this.sleepTime = sleepTime;
	minOpacity = Math.max(minOpacity, 0.0);
	minOpacity = Math.min(minOpacity, 1.0);
	maxOpacity = Math.max(maxOpacity, 0.0);
	maxOpacity = Math.min(maxOpacity, 1.0);
	if(maxOpacity < minOpacity) 
		{
		minOpacity = 0.0;
		maxOpacity = 1.0;
		}
	this.minOpacity = minOpacity;
	this.maxOpacity = maxOpacity;
	// Make sure the opacityVal is between min and max
	opacityVal = Math.max(opacityVal, this.minOpacity);
	this.opacityVal = Math.min(opacityVal, this.maxOpacity);
	// Make sure the fadeState is consistent with opacityVal
	if(this.opacityVal == this.minOpacity) 
		{fadeState = -2;} 
	 else if(this.opacityVal == this.maxOpacity) 
		  {fadeState = 2;}
	var element = document.getElementById(this.eidToFade);
	if(element != null) 
		{
		element.FadeState = this.fadeState;
		element.style.opacity = this.opacityVal;
		element.style.filter = 'alpha(opacity = ' + (100*this.opacityVal) + ')';
		}
	}
Fadeable.prototype.addChangeable = function(obj)
	{
	this.changeableArray.push(obj);
	}
Fadeable.prototype.delayedCall = function(curTick)
	{
	var myId = 'Fadeable'+this.id;
	window[myId] = this;
	setTimeout(function() { window[myId].animateFade(curTick); }, this.sleepTime);
	}
Fadeable.prototype.animateFade = function(lastTick) 
	{
	var curTick = new Date().getTime();
	var elapsedTicks = curTick - lastTick;
	var element = document.getElementById(this.eidToFade);
	if (this.fadeTimeLeft <= elapsedTicks) 
		{
		element.style.opacity = this.fadeState == 1 ? this.maxOpacity : this.minOpacity;
		element.style.filter = 'alpha(opacity = ' + (this.fadeState == 1 ? (100*this.maxOpacity) : this.minOpacity) + ')';
		this.opacityVal = element.style.opacity;
		this.fadeState = this.fadeState == 1 ? 2 : -2;
		return;
		}
	this.fadeTimeLeft -= elapsedTicks;
	var ratio = this.fadeTimeLeft / this.fadeTime;
	var newOpVal = 0;
	if(this.fadeState == -1) 
		{newOpVal = (this.maxOpacity-this.minOpacity)*ratio + this.minOpacity;} 
	else 
		{newOpVal = (this.minOpacity-this.maxOpacity)*ratio + this.maxOpacity;}
	element.style.opacity = newOpVal;
	element.style.filter = 'alpha(opacity = ' + (newOpVal * 100) + ')';
	this.opacityVal = newOpVal;
	this.delayedCall(curTick);
	}
Fadeable.prototype.fade = function() 
	{
	var element = document.getElementById(this.eidToFade);
	if (element == null) 
		{return;}
	if (this.fadeState == null) 
		{
		if (element.style.opacity == null || element.style.opacity == '' || element.style.opacity == '1')
			{
			this.fadeState = 2;
			this.opacityVal = this.maxOpacity;
			} 
		else 
			{
			this.fadeState = -2;
			this.opacityVal = this.minOpacity;
			}
		}
	if (this.fadeState == 1 || this.fadeState == -1) 
		{
		if (this.fadeState == -1 && this.opacityVal < this.minOpacity+0.01) 
			{
			var i=0;
			for(i=0; i<this.changeableArray.length; i++) 
				{this.changeableArray[i].change();}
			this.fadeState = 1;
			this.fadeTimeLeft = this.fadeTime - this.fadeTimeLeft;
			} 
		else if(this.fadeState == 1 && this.opacityVal > this.maxOpacity-0.01) 
			{
			this.fadeState = -1;
			this.fadeTimeLeft = this.fadeTime - this.fadeTimeLeft;
			}
		} 
	else 
		{
		if (this.fadeState == -2 && this.opacityVal < this.minOpacity+0.01) 
			{
			var i=0;
			for(i=0; i<this.changeableArray.length; i++) 
				{this.changeableArray[i].change();}
			}
		this.fadeState = this.fadeState == 2 ? -1 : 1;
		this.fadeTimeLeft = this.fadeTime;
		curTick = new Date().getTime();
		this.delayedCall(curTick);
		}
	}
