﻿function Bling(ElementId, FadeInColor, FadeOutColor, FadeInTime, FadeOutTime)
	{
	Highlight(document.getElementById(ElementId), FadeOutColor, FadeInColor, FadeInTime);
	setTimeout("Highlight(document.getElementById('" + ElementId + "'), '" + FadeInColor + "', '" + FadeOutColor + "', '" + FadeOutTime + "');", FadeInTime);
	}

function Highlight (Element, HighlightColor, FadeOutColor, FadeOutTime) 
	{
	if (Element)
		{
		Element.style.backgroundColor = HighlightColor;
		Element.Transition = new Transition (Element, FadeOutColor, FadeOutTime);
		Element.Transition.Start();
		}
	}

Transition = function (Element, Color, Duration)
	{
	this.Element  = Element;
	this.FromColor = hexColorString  (Element.style.backgroundColor).substr(1);
	this.ToColor =  hexColorString (Color).substr(1);
	this.Step = 0;
	this.Steps = 40;
    this.Interval = Duration / this.Steps;
	}

Transition.prototype.Start = function ()
	{
	var thisObj = this;
	this.timerId = setInterval (function () { thisObj.Next() }, this.Interval);
	}

Transition.prototype.Stop = function ()
	{
	clearInterval (this.timerId);
	this.Element.Transition = null;
	}

Transition.prototype.Next = function () 
	{
	var steps = this.Steps
	var step = this.Step
	
	var r0 = parseInt (this.FromColor.substr(0,2),16);
	var g0 = parseInt (this.FromColor.substr(2,2),16);
	var b0 = parseInt (this.FromColor.substr(4,2),16);

	var r1 = parseInt (this.ToColor.substr(0,2),16);
	var g1 = parseInt (this.ToColor.substr(2,2),16);
	var b1 = parseInt (this.ToColor.substr(4,2),16);

	var r_hex = DecimalToHex(Math.floor (r0 * ((this.Steps - this.Step) / this.Steps) + r1 * (this.Step / this.Steps)));
	var g_hex = DecimalToHex(Math.floor (g0 * ((this.Steps - this.Step) / this.Steps) + g1 * (this.Step / this.Steps)));
	var b_hex = DecimalToHex(Math.floor (b0 * ((this.Steps - this.Step) / this.Steps) + b1 * (this.Step / this.Steps)));

	this.Element.style.backgroundColor = "#" + r_hex + g_hex + b_hex;

	this.Step ++;

	if (this.Step > this.Steps)
		{ this.Stop(); }
	}
	
function initArray() 
	{
    this.length = initArray.arguments.length;
    for (var i = 0; i < this.length; i++)
        { this[i] = initArray.arguments[i]; }
	}

var DecimalToHexConversionArray = new initArray(0,1,2,3,4,5,6,7,8,9,'A','B','C','D','E','F');

function DecimalToHex(DecimalValue)
	{
	return ("" + DecimalToHexConversionArray[Math.floor(DecimalValue / 16)] + DecimalToHexConversionArray[DecimalValue % 16]);
	}

function hexColorString (r,g,b) {
	if (arguments.length == 1)	
		{
		var reColorHex = /#([a-f0-9]){2}([a-f0-9]){2}([a-f0-9]){2}/i ;

		if (r.match (reColorHex))
			return r

		var reColorRgb = /rgb\s*\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)/ ;

		var c
		if (c = r.match (reColorRgb))
		  return hexColorString (parseInt(c[1],10)
								,parseInt(c[2],10)
								,parseInt(c[3],10))

		return '#FF0000' // a color to indicate a problem
		}

	var r = r.toString(16); if (r.length == 1) r = '0'+r;
	var g = g.toString(16); if (g.length == 1) g = '0'+g;
	var b = b.toString(16); if (b.length == 1) b = '0'+b;

	return "#" + r + g + b
	}
