var _INFOinvest_FADE_STEPS = 30;

function newFade(startColor, endColor, fadeArrayKey) {
	var fade = new Object();

	fade.fadeArrayKey = fadeArrayKey;
	
	var myRe = /#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})/i;

	if (startColor.match(myRe)) {
		fade.startingRed   = hexToDec(RegExp.$1);
		fade.startingGreen = hexToDec(RegExp.$2);
		fade.startingBlue  = hexToDec(RegExp.$3);
	}

	if (endColor.match(myRe)) {
		fade.endingRed   = hexToDec(RegExp.$1)
		fade.endingGreen = hexToDec(RegExp.$2)
		fade.endingBlue  = hexToDec(RegExp.$3)
	}

	fade.nSteps = _INFOinvest_FADE_STEPS;

	fade.deltaRed      = (fade.endingRed   - fade.startingRed)   / fade.nSteps;
	fade.deltaGreen    = (fade.endingGreen - fade.startingGreen) / fade.nSteps;
	fade.deltaBlue     = (fade.endingBlue  - fade.startingBlue)  / fade.nSteps;

	fade.currentStep   = 0;
	fade.timerID       = 0;

	fade.objects = new Object();

	fade.startFade = function() {
		this.currentStep = 0;
		clearTimeout(this.timerID);

		fade.currentRed    = fade.startingRed;
		fade.currentGreen  = fade.startingGreen;
		fade.currentBlue   = fade.startingBlue;

		this.fade();
	}

	fade.fade = function() {
		if (this.currentStep < this.nSteps) {
			var key;

			fade.currentRed   += fade.deltaRed;
			fade.currentGreen += fade.deltaGreen;
			fade.currentBlue  += fade.deltaBlue;

			for (key in this.objects) {
				if (typeof this.objects[key] == "object") {
					this.objects[key].style.background = "#" + hex(fade.currentRed) + hex(fade.currentGreen) + hex(fade.currentBlue);
				}
			}

			this.currentStep++;

			setTimeout("doFade('" + this.fadeArrayKey + "');", 100);
		}
	}

	fade.clear = function() {
		clearTimeout(this.timerID);
		this.objects = new Object();
	}

	return fade;
}

var fadeArray = new Object();
function doFade(key) {
	fadeArray[key].fade();
}

function hex(i) {
	var hexa = new Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F");
	
	i = Math.floor(i);

	if (i < 0) {
		return "00";
	} else if (i > 255) {
		return "FF";
	} else {
		return "" + hexa[Math.floor(i/16)] + hexa[i%16];
	}
}

function hexNumToDec(hexchar) {
  if (parseInt(hexchar) == hexchar) return Number(hexchar);

  hexchar = hexchar.toUpperCase();

  switch (hexchar) {
    case 'A': return 10; break;
    case 'B': return 11; break;
    case 'C': return 12; break;
    case 'D': return 13; break;
    case 'E': return 14; break;
    case 'F': return 15; break;
  }
}

function hexToDec(daHex) {
	var daDec = Number((16 * hexNumToDec(daHex.substring(0,1))) + hexNumToDec(daHex.substring(1,2)));

	return daDec;
}