// Fade-in / fade-out effect
// (c) 2004 ETZel <etzel[at]land.ru>

var hexDigits = "0123456789abcdef";
function fromHex(str) { return 16 * hexDigits.indexOf(str.charAt(0)) + hexDigits.indexOf(str.charAt(1)); }

function Color(str) {
	str = str.toLowerCase();
	this.r = fromHex(str.substring(1, 3));
	this.g = fromHex(str.substring(3, 5));
	this.b = fromHex(str.substring(5, 7));
	return this;
}
function blend(c1, c2, amount) {
	var am2 = 1 - amount;
	return "rgb(" + Math.floor(c1.r * am2 + c2.r * amount) + "," + Math.floor(c1.g * am2 + c2.g * amount) + "," + Math.floor(c1.b * am2 + c2.b * amount) + ")";
}

var oFadeTimer = 0, oFades = new Array(), oFadeTable = new Array();

function fadeTick() {
	var active = false;
	for (var i = 0; i < oFades.length; i++) {
		var o = oFades[i];
		if (o.fadeDir != 0) {
			o.fadeStep += o.fadeDir;
			if (o.fadeStep <= 0 || o.fadeStep >= oFadeTable.length - 1)
				o.fadeDir = 0;
			o.style.backgroundColor = oFadeTable[o.fadeStep];
			if (o.fadeStep > 0.4 * oFadeTable.length)
				o.style.color = '#ffffff';
			else o.style.color = '#000000';
			active = active || o.FadeDir != 0;
		}
	}
	if (!active) { clearInterval(oFadeTimer); oFadeTimer = 0; }
}
function fadeIn(elt) {
	if (!elt.isFaded) {
		elt.isFaded = true;
		oFades[oFades.length] = elt;
		elt.fadeStep = 0;
	}
	if (elt.fadeStep != oFadeTable.length - 1) {
		elt.fadeDir = 1;
		if (!oFadeTimer) { oFadeTimer = setInterval(fadeTick, 30); }
	}
	else elt.fadeDir = 0;
}
function fadeOut(elt) {
	if (elt.fadeStep != 0) {
		elt.fadeDir = -1;
		if (!oFadeTimer) { oFadeTimer = setInterval(fadeTick, 30); }
	}
	else elt.fadeDir = 0;
}
function fadeInit(from, to, time) {
	from = new Color(from), to = new Color(to);
	var steps = Math.floor(time / 30);
	for (var i = 0; i < steps; i++)
		oFadeTable[i] = blend(from, to, i / (steps - 1));
}
