
function colorHighlight(elem, startColor, highlightColor, steps, intervals, powr) {
	if (elem.bgFadeInt) window.clearInterval(elem.bgFadeInt);
	var startRGB = hexToRgb(startColor);
	var highlightRGB = hexToRgb(highlightColor);
	var actStep = 0;
	elem.bgFadeInt = window.setInterval(function() {
		elem.style.backgroundColor = "rgb("+
			easeInOut(highlightRGB.r, startRGB.r, steps, actStep, powr)+","+
			easeInOut(highlightRGB.g, startRGB.g, steps, actStep, powr)+","+
			easeInOut(highlightRGB.b, startRGB.b, steps, actStep, powr)+")";
		actStep++;
		if (actStep > steps) {
			elem.style.backgroundColor = 'rgb(' + startRGB.r + ',' + startRGB.g + ',' + startRGB.b + ')';
			window.clearInterval(elem.bgFadeInt);
		}
	}
	, intervals);
}

function hexToRgb(hex_string) {
	var default_ = null;
	if (hex_string.substr(0, 1) == '#') {
		hex_string = hex_string.substr(1);
	}
	var r;
	var g;
	var b;
	if (hex_string.length == 3) {
		r = hex_string.substr(0, 1);
		r += r;
		g = hex_string.substr(1, 1);
		g += g;
		b = hex_string.substr(2, 1);
		b += b;
	}
	else if (hex_string.length == 6) {
		r = hex_string.substr(0, 2);
		g = hex_string.substr(2, 2);
		b = hex_string.substr(4, 2);
	}
	else {
		return default_;
	}
	r = parseInt(r, 16);
	g = parseInt(g, 16);
	b = parseInt(b, 16);
	if (isNaN(r) || isNaN(g) || isNaN(b)) {
		return default_;
	}
	else {
		return {r : r, g : g, b : b};
		//return {r : r / 255, g : g / 255, b : b / 255};
	}
}

function rgbToHex(r, g, b, includeHash) {
	r = Math.round(r * 255);
	g = Math.round(g * 255);
	b = Math.round(b * 255);
	if (includeHash == undefined) {
		includeHash = true;
	}
	r = r.toString(16);
	if (r.length == 1) {
		r = '0' + r;
	}
	g = g.toString(16);
	if (g.length == 1) {
		g = '0' + g;
	}
	b = b.toString(16);
	if (b.length == 1) {
		b = '0' + b;
	}
	return ((includeHash ? '#' : '') + r + g + b).toUpperCase();
}

function easeInOut(minValue, maxValue, totalSteps, actualStep, powr) {
	var delta = maxValue - minValue;
	var stepp = minValue + (Math.pow(((1 / totalSteps) * actualStep), powr) * delta);
	return Math.ceil(stepp);
}

