Fade.INTERVAL_LENGTH = 30;
 
function Fade(target, duration, startOpacity, endOpacity) {
	this.target = target;
 
	if (typeof target != 'object' || target.constructor != Array) {
		this.target = new Array(1);
		this.target[0] = target;
	}
 
	this.startOpacity = startOpacity;
	if (this.startOpacity == null) {
		this.startOpacity = 0;
	}
	this.endOpacity = endOpacity;
	if (this.endOpacity == null) {
		this.endOpacity =  1;
	}
 
	duration = duration ? duration : 500;
	this.numIntervals = (duration / Fade.INTERVAL_LENGTH);
	this.step = (this.endOpacity - this.startOpacity) / this.numIntervals;
 
	this.updateOpacity(this.startOpacity);
	this.currentOpacity = this.startOpacity;
}
 
Fade.prototype.registerCallback = function(functionRef) {
	this.callback = functionRef;
}
 
Fade.prototype.start = function() {
	var obj = this;
	var functionReference = this.increment;
	var callback = function() { functionReference.call(obj) };
	this.interval = setInterval(callback, Fade.INTERVAL_LENGTH);
}
 
Fade.prototype.stop = function() {
	clearInterval(this.interval);
}
 
Fade.prototype.end = function() {
	clearInterval(this.interval);
	this.updateOpacity(this.endOpacity);
	this.currentOpacity = this.endOpacity;
	if (this.callback) {
		this.callback();
		this.callback = null;
	}
}
 
Fade.prototype.cancel = function() {
	clearInterval(this.interval);
	this.updateOpacity(this.startOpacity);
	this.currentOpacity = this.startOpacity;
}
 
Fade.prototype.increment = function() {
	this.numIntervals --;
	if (this.numIntervals > 0) {
		this.currentOpacity += this.step;
		this.updateOpacity(this.currentOpacity);
	} else {
		this.end();	
	}
}
 
Fade.prototype.getOpacity = function() {
	return this.currentOpacity;
}
 
Fade.prototype.updateOpacity = function(opacityValue) {
	for (i = 0; i < this.target.length; i++) {
		if (isIE()) {
			if (!this.target[i].style.filter) {
				this.target[i].style.filter = "alpha(opacity=" + (opacityValue * 100) + ")";
			} else {
				this.target[i].filters.item("alpha").opacity = opacityValue * 100;
			}
		} else {
			this.target[i].style["opacity"] = opacityValue;
			this.target[i].style["-moz-opacity"] = opacityValue;
		}
	}
}
 
function isIE() {
	return !window.addEventListener;
}