/***********************************************************************************
 * Class: CFader
 * Dependencies: none
 * Description:
 *   Background fader class
 *
 ***********************************************************************************/

	// String class
	function CFader() { return this; };
	
	// Setup item colors
	CFader.setupColors = function(item) {
		if(!item.CFader_defaultColor) {
			item.CFader_defaultColor = CObject.getStyle(item, "color");
			item.CFader_defaultBGColor = CObject.getStyle(item, CFader.bgColorProperty);

			item.CFader_defaultOverColor = "#000000";
			item.CFader_defaultOverBGColor = "#FFFFFF";
		}
	}
	
	CFader.bgColorProperty = (document.all) ? "backgroundColor" : "background-color";
	CFader.interval = 80;
	CFader.fadeTime = 240;
	
	CFader.over = function(item) {
		CFader.setupColors(item);
	
		CObject.setStyle(item, CFader.bgColorProperty, item.CFader_defaultOverBGColor);
		CObject.setStyle(item, "color", item.CFader_defaultOverColor);
		
		if(item.timerID != null) {
			clearInterval(item.timerID);
			item.timerID = null;
		}
	}
	
	CFader.out = function(item) {
		if(item.timerID == null) {
			CObject.setStyle(item, CFader.bgColorProperty, item.CFader_defaultOverBGColor);
			item.timerID = setInterval("CFader.fadeOut('" + item.id + "')", CFader.interval);
		}
	}
	
	// Fade functions
	CFader.hexString = "0123456789abcdef";
	CFader.hexToBase10 = function(hex) {
		return parseInt(hex, 0x10);
	}
	
	CFader.base10ToHex = function(base10) {
		var hex;
		
		hex = CFader.hexString.substr(parseInt(base10 / 0x10, 10), 1);
		hex += CFader.hexString.substr(parseInt(base10 % 0x10, 10), 1);
	
		return hex;
	}
	
	CFader.hexToRGB = function(color, item) {
		var r, g, b, start = 0;
		
		if(color.substring(0, 3) == "rgb") {
			return color.match(/\d+/g);
		}
		else {
			if(color.substring(0, 1) == "#")
				start = 1;
			r = parseInt(color.substr(start, 2), 0x10);
			g = parseInt(color.substr(start + 2, 2), 0x10);
			b = parseInt(color.substr(start + 4, 2), 0x10);
		}
		
		return new Array(r, g, b);
	}
	
	CFader.RGBToHex = function(color) {
//		return "#" + CFader.base10ToHex(color[0]) + CFader.base10ToHex(color[1]) + CFader.base10ToHex(color[2]);
		return "rgb("+color[0]+", "+color[1]+", "+color[2]+")";
	}
	
	CFader.fadeOutStep = function(item, front) {
		if(!front) {
			colorHigh = item.CFader_defaultOverBGColor;
			colorLow = item.CFader_defaultBGColor;
			color = item.style.backgroundColor;
			item.backReached = false;
		}
		else {
			colorHigh = item.CFader_defaultOverColor;
			colorLow = item.CFader_defaultColor;
			color = item.style.color;
			item.frontReached = false;
		}
		
		var h, l, c, step, move, count;
		var high = CFader.hexToRGB(colorHigh);
		var low = CFader.hexToRGB(colorLow);
		var current = CFader.hexToRGB(color, item);
	
		var timeStep = CFader.fadeTime / parseFloat(CFader.interval);
		var reached = 0;
		
		for(i = 0; i < 3; i++) {
			h = high[i];
			l = low[i];
			c = current[i];
			
			step = (h >= l) ? 1 : -1;
			
			// Goal not reached?
			if(c * step > l * step) {
				move = (h - l) / parseFloat(timeStep);
				c -= move;
				
				count = parseInt(1 / (move - parseInt(move)));
				if(((h - c) / move) % count == 0)
					c -= step;
				
				if(c * step < l * step)
					c = l;
			}
			
			if(c == l)
				reached++;
			
			current[i] = Math.floor(c);
		}
		
		//CObject.get("debug").value += "("+current[0]+":"+current[1]+":"+current[2]+")";
		
		if(reached == 3) {
			if(front)
				item.frontReached = true;
			else
				item.backReached = true;
		}

		return CFader.RGBToHex(current);
	}
	
	CFader.fadeOut = function(item) {
		item = document.getElementById(item);
		
		CObject.setStyle(item, CFader.bgColorProperty, CFader.fadeOutStep(item, false));
		CObject.setStyle(item, "color", CFader.fadeOutStep(item, true));
		
		if(item.frontReached && item.backReached) {
			clearInterval(item.timerID);
			item.timerID = null;
		}
	}