// Justin Barlow - www.netlobo.com

var HexTable = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'];
var FadeElements = new Array();
var FadeTimes = new Array();
function FadeColor(Id, StartColor, EndColor, Time, Style, Hide) {
    Style = Style || 'backgroundColor';
    Hide  = Hide  || 0;
    var timeBetweenSteps = Math.round(Math.max(Time / 300, 30));
    var FadeElementsId = FadeElements.indexOf(Id);
	if (FadeElementsId > -1) {
		for (var i = 0; i < FadeTimes[FadeElementsId].length; i++) clearTimeout(FadeTimes[FadeElementsId][i]);
	} else {
		FadeElements.push(Id);
		FadeElementsId = FadeElements.indexOf(Id);
	}
	var StartColorRGB = HexToRgb(StartColor);
	var EndColorRGB = HexToRgb(EndColor);
	var diffRGB = new Array();
	for (var i = 0; i < 3; i++) diffRGB[i] = EndColorRGB[i] - StartColorRGB[i];
	var steps = Math.ceil(Time / timeBetweenSteps);
	var Fades = new Array();
    //var style = (0 ? 'backgroundColor' : 'color');
    for (var i = 1; i <= steps; i++) {
		var changes = new Array();
		for(var j = 0; j < diffRGB.length; j++) changes[j] = StartColorRGB[j] + Math.round((diffRGB[j] / steps) * i);
        if (i == steps) {
			//Fades[i - 1] = setTimeout('document.getElementById("' + Id + '").style.backgroundColor = "' + EndColor + '";', timeBetweenSteps*(i-1));
            Fades[i - 1] = setTimeout('document.getElementById("' + Id + '").style.' + Style + ' = "' + EndColor + '";', timeBetweenSteps*(i-1));
		} else {
			//Fades[i - 1] = setTimeout('document.getElementById("' + Id + '").style.backgroundColor = "' + RgbToHex(changes) + '";', timeBetweenSteps*(i - 1));
            Fades[i - 1] = setTimeout('document.getElementById("' + Id + '").style.' + Style + ' = "' + RgbToHex(changes) + '";', timeBetweenSteps*(i - 1));
        }
	}
	FadeTimes[FadeElementsId] = Fades;
    if (Hide) setTimeout('document.getElementById("' + Id + '").style.display="none";', Hide);
}
function HexToRgb(hexVal) {
	hexVal = hexVal.toUpperCase();
	if(hexVal.substring(0, 1) == '#') hexVal = hexVal.substring(1);
	var hexArray = new Array();
	var rgbArray = new Array();
	hexArray[0] = hexVal.substring(0, 2);
	hexArray[1] = hexVal.substring(2, 4);
	hexArray[2] = hexVal.substring(4, 6);
	for (var k = 0; k < hexArray.length; k++) {
		var num = hexArray[k];
		var res = 0;
		var j = 0;
		for (var i = num.length - 1; i >= 0; i--) res += parseInt(HexTable.indexOf(num.charAt(i))) * Math.pow(16, j++);
		rgbArray[k] = res;
	}
	return rgbArray;
}
function RgbToHex(rgbArray) {
	var retval = new Array();
	for (var j = 0; j < rgbArray.length; j++) {
		var result = new Array();
		var val = rgbArray[j];
		var i = 0;
		while (val > 16) {
			result[i++] = val%16;
			val = Math.floor(val/16);
		}
		result[i++] = val%16;
		var out = '';
		for (var k = result.length - 1; k >= 0; k--) out += HexTable[result[k]];
		retval[j] = padLeft(out, '0', 2);
	}
	out = '#';
	for (var i = 0; i < retval.length; i++) out += retval[i];
    return out;
}
/*
if (!Array.prototype.indexOf) {
	Array.prototype.indexOf = function(val, fromIndex) {
		if (typeof(fromIndex) != 'number') fromIndex = 0;
		for (var index = fromIndex, len = this.length; index < len; index++) if (this[index] == val) return index;
		return -1;
	}
}
*/
function padLeft(Text, Char, Width) {
	if(Text.length >= Width) return Text;
    while(Text.length < Width) Text = Char + Text;
	return Text;
}