var fadeColor = "#FFFFFF";  // color to fade text
var bgfadeColor = "#6633ff";  // color to fade background
var fadeStep = 40; // speed (delay!)

var hexa = new Array();
for(var i = 0; i < 10; i++) hexa[i] = i;
hexa[10]="a"; hexa[11]="b"; hexa[12]="c";
hexa[13]="d"; hexa[14]="e"; hexa[15]="f";

fadeColor = dehexize(fadeColor.toLowerCase());
bgfadeColor = dehexize(bgfadeColor.toLowerCase());

var faders = new Array();
var fader;
function Fader_leave() {
	if (this.left) return;
	this.left = true;
	if (!fader) fadeAll();
}
function Fader_enter() {
	this.left = false;
	if (!fader) fadeAll();
}
function Fader(elem) {
	if (elem.fader) return null;
	this.leave = Fader_leave;
	this.enter = Fader_enter;
	this.element = elem;
	this.step = 0;
	this.left = false;
	var elt = elem;
	do {
		this.start = elt.style.color;
		elt = elt.parentNode;
	} while (!this.start && elt);
	this.start = dehexize(this.start.toLowerCase());
	elt = elem;
	do {
		this.bgstart = elt.style.backgroundColor;
		elt = elt.parentNode;
	} while (!this.bgstart && elt);
	this.bgstart = dehexize(this.bgstart.toLowerCase());
	var i = 0;
	while (faders[i]) i++;
	faders[i] = this;
	if (!fader) fadeAll();
}
function fadeAll() {
	var active = 0;
	for (var i = 0; i < faders.length; i++) {
		if (!faders[i]) continue;
		var start = faders[i].start;
		var bgstart = faders[i].bgstart;
		var pos;
		if (faders[i].left) {
			pos = --(faders[i].step);
			if (pos < 0) {
				faders[i].step = pos = 0;
			}
		} else {
			if (faders[i].step >= fadeStep) continue;
			pos = faders[i].step += 3;
			if (faders[i].step > fadeStep) pos = faders[i].step = fadeStep;
		}
		setColor(Math.floor(start[0]*((fadeStep-pos)/fadeStep)+fadeColor[0]*(pos/fadeStep)),
			Math.floor(start[1]*((fadeStep-pos)/fadeStep)+fadeColor[1]*(pos/fadeStep)),
			Math.floor(start[2]*((fadeStep-pos)/fadeStep)+fadeColor[2]*(pos/fadeStep)),
			faders[i].element);
		bgsetColor(Math.floor(bgstart[0]*((fadeStep-pos)/fadeStep)+bgfadeColor[0]*(pos/fadeStep)),
			Math.floor(bgstart[1]*((fadeStep-pos)/fadeStep)+bgfadeColor[1]*(pos/fadeStep)),
			Math.floor(bgstart[2]*((fadeStep-pos)/fadeStep)+bgfadeColor[2]*(pos/fadeStep)),
			faders[i].element);
		if (pos > 0) {
			active = 1;
		}
	}
	if (active) fader = setTimeout('fadeAll()',5);
	else fader = 0;
}

function dehexize(Color){
	var colorArr = new Array();
	var regex = /rgb\(([0-9]+),([0-9]+),([0-9]+)\)/;
	var match = regex.exec(Color);
	if (match) {
		colorArr[0] = match[1];
		colorArr[1] = match[2];
		colorArr[2] = match[3];
		return colorArr;
	}

	for (i=1; i<7; i++){
		for (j=0; j<16; j++){
			if (Color.charAt(i) == hexa[j]){
				if (i%2 !=0)
					colorArr[Math.floor((i-1)/2)]=eval(j)*16;
				else
					colorArr[Math.floor((i-1)/2)]+=eval(j);
			}
		}
	}
	return colorArr;
}

function domouseover(mevent) {
	if (mevent) {
		var srcElement = mevent.target;
		if (srcElement.tagName && srcElement.tagName .toLowerCase() == 'img') return false;
		while ((!srcElement.tagName || srcElement.tagName.toLowerCase() != "a") && srcElement.parentNode) srcElement = srcElement.parentNode;
		//alert(srcElement+", "+srcElement.parentNode+", "+srcElement.firstChild+", "+srcElement.tagName.toLowerCase())
		if (srcElement.tagName.toLowerCase() == "a" && srcElement.className != "nofade") {
			if (!srcElement.fader) srcElement.fader = new Fader(srcElement);
			else srcElement.fader.enter();
			for (var i = 0; i < faders.length; i++) {
				if (faders[i] && faders[i] != srcElement.fader) faders[i].leave();
			}
			return true;
		}
	} else if (event) {
		var srcElement = event.srcElement;
		if (srcElement.tagName && srcElement.tagName .toLowerCase() == 'img') return false;
		while (srcElement.tagName.toLowerCase() != "a" && srcElement.parentElement) srcElement = srcElement.parentElement;
		if (srcElement.tagName.toLowerCase() == "a" && srcElement.className != "nofade") {
			if (!srcElement.fader) srcElement.fader = new Fader(srcElement);
			else srcElement.fader.enter();
		}
	}
}

function domouseout(mevent) {
	if (mevent) {
		var srcElement = mevent.target;
		if (srcElement.tagName && srcElement.tagName .toLowerCase() == 'img') return false;
		while ((!srcElement.tagName || srcElement.tagName.toLowerCase() != "a") && srcElement.parentNode) srcElement = srcElement.parentNode;
		if (srcElement.tagName.toLowerCase() == "a" && srcElement.className != "nofade") {
			if (srcElement.fader) srcElement.fader.leave();
			return true;
		}
	} else if (event) {
		var srcElement = event.srcElement;
		if (srcElement.tagName && srcElement.tagName .toLowerCase() == 'img') return false;
		while (srcElement.tagName.toLowerCase() != "a" && srcElement.parentElement) srcElement = srcElement.parentElement;
		if (srcElement.tagName.toLowerCase() == "a" && srcElement.className != "nofade") {
			if (srcElement.fader) srcElement.fader.leave();
		}
	}
}

document.onmouseover = domouseover;
document.onmouseout = domouseout;

function hex(i) {
    if (i < 0)
        return "00";
    else if (i > 255)
        return "ff";
    else
       return "" + hexa[Math.floor(i/16)] + hexa[i%16];
}

function bgsetColor(r, g, b, element) {
      var hr = hex(r); var hg = hex(g); var hb = hex(b);
      element.style.backgroundColor = "#"+hr+hg+hb;
}

function setColor(r, g, b, element) {
      var hr = hex(r); var hg = hex(g); var hb = hex(b);
      element.style.color = "#"+hr+hg+hb;
}

