 /**
 * Object ColorFader
 * @author               Andrea Giammarchi
 * @site		 www.devpro.it
 */
function ColorFader() {
	
	function fade(content_id, what_change, fade_speed, startColor, endColor) {
		if(intervall > 0)
			clearInterval(intervall);
		var sc = getColor(startColor);
		var ec = getColor(endColor);
		redStart = sc[0];
		greenStart = sc[1];
		blueStart = sc[2];
		redEnd = ec[0];
		greenEnd = ec[1];
		blueEnd = ec[2];
		id = content_id;
		change = what_change;
		speed = fade_speed;
		intervall = setInterval(fader, 100);
	}
	
	/** LIST OF ALL PRIVATE METHODS [ uncommented ] */	
	function hexToDigit(hex) {
		return parseInt(hex, 16);
	}
	
	function convertDigit(color) {
		var result = color.toString(16);
		if(result.length == 1)
			result = '0' + result;
		return result;
	}
	
	function digitToHex(hex) {
		var result = convertDigit(hex[0]);
		result += convertDigit(hex[1]);
		result += convertDigit(hex[2]);
		return result;
	}
	
	function getColor(color) {
		var red = 0;
		var green = 0;
		var blue = 0;
		var nc = '';
		if(color.length == 3) {
			for(var a = 0; a < color.length; a++) {
				var tmpc = color.substr(a, 1);
				nc += tmpc + '' + tmpc;
			}
		}
		else
			nc = color;
		red = hexToDigit(nc.substr(0, 2));
		green = hexToDigit(nc.substr(2, 2));
		blue = hexToDigit(nc.substr(4, 2));
		return Array(red, green, blue);
	}
	
	function chooseIncrement(x, y) {
		if((x - speed) >= y)
			x -= speed;
		else if(x > y)
			x = y;
		else if((x + speed) <= y)
			x += speed;
		else if(x < y)
			x = y;
		return x;
	}
	
	function fader() {
		var red = chooseIncrement(redStart, redEnd);
		var green = chooseIncrement(greenStart, greenEnd);
		var blue = chooseIncrement(blueStart, blueEnd);
		document.getElementById(id).style[change] = '#' + digitToHex(Array(red, green, blue));
		if(red == redEnd && green == greenEnd && blue == blueEnd) {
			clearInterval(intervall);
			intervall = 0;
			if(typeof(self.onFadeComplete) == 'function')
				self.onFadeComplete();
		}
		else {
			redStart = red;
			greenStart = green;
			blueStart = blue;
		}
	}
	
	/** DECLARATION OF PUBLIC METHOD */
	this.fade = fade;
	
	/** PRIVATE VARIABLES */
	var speed = 0;
	var intervall = 0;
	var redStart = 0;
	var greenStart = 0;
	var blueStart = 0;
	var redEnd = 0;
	var greenEnd = 0;
	var blueEnd = 0;
	var id = '';
	var change = '';
	var self = this;
}
