var fadeOnTime; /* fade on, in milliseconds */
var showTime; /* hold time */
var fadeOffTime; /* time to fade off */
var refreshRate; /* time between updates */

var fadeElements = [];
var sTime;
var interval;
var imageId;
var cTime;

function setOpacity (element, opacity) {
	opacity = (opacity == 1)?0.99999:opacity;
	// IE/Win
	element.style.filter = "alpha(opacity:"+(opacity*100)+")";

	// Safari<1.2, Konqueror
	element.style.KHTMLOpacity = opacity;

	// Older Mozilla and Firefox
	element.style.MozOpacity = opacity;

	// Safari 1.2, newer Firefox and Mozilla, CSS3
	element.style.opacity = opacity;
}

function doFade(transOn, displayTime, transOff, refresh, tagName) {
	fadeOnTime = transOn;
	fadeOffTime = transOff;
	showTime = displayTime;
	refreshRate = refresh;
	interval = fadeOnTime + showTime + fadeOffTime;
	
	var elements = document.getElementsByTagName(tagName);
	for (var i = 0; i < elements.length; i++) {

		var element = elements[i];
		var zIndex = parseInt(element.style.zIndex);
		if (element.className.indexOf('fade') == -1 && (zIndex <= 100 || zIndex >= 200)){continue;}
		var fadeIndex = zIndex - 101;
		fadeElements[fadeIndex] = element;
	}
	cTime = interval * fadeElements.length;
	sTime = new Date().getTime();
	tick();
}

function tick() {
	/* t increments from 0 to cTime */
	var t = ((new Date().getTime()) - sTime) % cTime;
	var imageId = Math.floor(t / interval);
	var imageStage = t % interval;
	for (var i = 0; i < fadeElements.length; i++) {
		if (i == imageId) {
			fadeElements[imageId].style.visibility = 'visible';
			if (imageStage < fadeOnTime) {
				setOpacity(fadeElements[imageId],imageStage / fadeOnTime);
			} else if (imageStage < (fadeOnTime + showTime)) {
				setOpacity(fadeElements[imageId],1);
			} else {
				setOpacity(fadeElements[imageId],(interval - imageStage) / fadeOffTime);
			}
		} else {
			fadeElements[i].style.visibility = 'hidden';
		}
	}
	
	setTimeout('tick()', refreshRate);
}
