// Link fade script
//
// Original found uncredited on the net
// This much improved version Copyright 2004 by FMJ-Software, www.fmjsoft.com
//
// In HTML-body add:	<SCRIPT src="fade.js" language="Javascript"></SCRIPT>
// In links add:		<A ... class=fade>  // if autoFade==false
//

fadeColor = "#A0A0FF"; 	// Fade highlight color
stepIn = 11; 			// Fade in time
stepOut = 27;			// Fade out time
autoFade = true;		// false->fade <A>'s onky even when class=fade, true->fade all A's where class!=nofade
tagLevels = 3;			// Number of levels of nested tags to search 'upwards' for an <A>
fadeImgBorders = true;	// Also fade borders of <IMG>'s nested inside an <A>


document.onmouseover = onmouseover;
document.onmouseout = onmouseout;

var aaFadeIds = new Array();

function makearray(n)
{
    this.length = n;
    for (var i = 1; i <= n; i++)
        this[i] = 0;
    return this;
}

ahex = new makearray(16);
for (var i = 0; i < 10; i++)
    ahex[i] = i;
ahex[10]="a"; ahex[11]="b"; ahex[12]="c";
ahex[13]="d"; ahex[14]="e"; ahex[15]="f";

fadeColor = cstr2carr(fadeColor);

function cstr2carr(str)
{
	str = str.toLowerCase();
	var clr = new makearray(3);
	for (var i = 1; i < 7; i++){
		for (var j = 0; j < 16; j++){
			if (str.charAt(i) == ahex[j]){
				if (i&1 !=0)
					clr[Math.floor((i-1)/2)] = eval(j)*16;
				else
					clr[Math.floor((i-1)/2)] += eval(j);
			}
		}
	}
	return clr;
}

function rgb2cstr(r, g, b)
{
	if (r < 0) r = 0;
	else if (r > 255) r = 255;
	if (g < 0) g = 0;
	else if (g > 255) g = 255;
	if (b < 0) b = 0;
	else if (b > 255) b = 255;
    return "#" + ahex[Math.floor(r/16)] + ahex[r%16] + ahex[Math.floor(g/16)] + ahex[g%16] + ahex[Math.floor(b/16)] + ahex[b%16];
}


function fadeBorders(coll, dir)
{
	if (!coll || !coll.length) return;
	for (var i = 0; i < coll.length; i++) {
		var element = coll(i);
		if (element.tagName == "IMG") {
			if (!element.startColor) element.startColor = cstr2carr((element.style.borderColor) ? element.style.borderColor : element.currentStyle.borderColor);
			if (element.uniqueID) fade(dir ? element.startColor : fadeColor, dir ? fadeColor : element.startColor, element.uniqueID, dir ? stepIn : stepOut, "borderColor");
		} else {
			fadeBorders(element.children, dir);
		}
	}
}

function fadeText(element, levels, dir)
{
	if (!element) return;
	if (((element.tagName == "A") && autoFade && (element.className != "nofade")) || (element.className == "fade")) {
		if (!element.startColor) element.startColor = cstr2carr((element.style.color) ? element.style.color : element.currentStyle.color);
		if (element.uniqueID) fade(dir ? element.startColor : fadeColor, dir ? fadeColor : element.startColor, element.uniqueID, dir ? stepIn : stepOut, "color");
		if (fadeImgBorders) fadeBorders(element.children, dir);
	} else if (--levels > 0) {
		fadeText(element.parentElement, levels-1, dir);
	}
}

function onmouseover()
{
	if (!document.all) return;
	fadeText(event.srcElement, tagLevels, true);
}

function onmouseout()
{
	if (!document.all) return;
	fadeText(event.srcElement, tagLevels, false);
}


function fade(s, d, element, step, prop)
{
	var i, j;

	// If current elemt is already being faded, then clear that fade
	for (i = 0; i < aaFadeIds.length; i++) {
		
		if (aaFadeIds[i] == null) continue;
		if ((aaFadeIds[i][0] == null) || (aaFadeIds[i][0] != element) || !eval(aaFadeIds[i][0])) continue;
		
		for (j = 1; j < aaFadeIds[i].length; j++)
			clearTimeout(aaFadeIds[i][j]);

		aaFadeIds[i] = null;
	}

	// Find first empty element
	for (i = 0; i < aaFadeIds.length; i++)
		if (aaFadeIds[i] == null) 
			break;
	aaFadeIds[i] = new Array();

	// Construct fade timeout-list
	var sr = s[0]; var sg = s[1]; var sb = s[2];
	var dr = d[0]; var dg = d[1]; var db = d[2];
	
	aaFadeIds[i][0] = element;

	for (j = 0; j <= step; j++) {
		var cstr = "rgb2cstr(Math.floor(" +sr+ " *(( " +step+ " - " +j+ " )/ " +step+ " ) + " +dr+ " * (" +j+ "/" +
			step+ ")),Math.floor(" +sg+ " * (( " +step+ " - " +j+ " )/ " +step+ " ) + " +dg+ " * (" +j+ "/" +step+
			")),Math.floor(" +sb+ " * ((" +step+ "-" +j+ ")/" +step+ ") + " +db+ " * (" +j+ "/" +step+ ")))";
		aaFadeIds[i][1+j] = setTimeout("" + element + ".style." + prop + " = " + cstr + ";"
					+ ((j == step) ? (" aaFadeIds[" + i + "] = null;") : ""), j*step);
	}
}
