var Pulse = new Object;

Pulse.timer = new Array();
Pulse.counter = new Array();
Pulse.handle = new Array();

Pulse.Do = function (handle, property, startcolor, endcolor, steps) {
	Pulse.handle.push(handle);
	Pulse.counter.push(0);
	id=Pulse.handle.length - 1;

	red = HexToDec(startcolor.substr(0,2));
	green = HexToDec(startcolor.substr(2,2));
	blue = HexToDec(startcolor.substr(4,2));

	redend = HexToDec(endcolor.substr(0,2));
	greenend = HexToDec(endcolor.substr(2,2));
	blueend = HexToDec(endcolor.substr(4,2));

	redstep = (redend - red) / steps;
	greenstep = (greenend - green) / steps;
	bluestep = (blueend - blue) / steps;

	Pulse.timer[id] = window.setInterval("Pulse.Actual("+id+",'"+property+"',"+steps+","+red+","+green+","+blue+","+redstep+","+greenstep+","+bluestep+")", 20);
}

Pulse.Actual = function (id, property, steps, red, green, blue, redstep, greenstep, bluestep){
	if (Pulse.counter[id] < steps)
	{
		Pulse.counter[id]++;

		newred = String(red + Math.ceil(redstep * Pulse.counter[id]));
		newgreen = String(green + Math.ceil(greenstep * Pulse.counter[id]));
		newblue = String(blue + Math.ceil(bluestep * Pulse.counter[id]));

		newcolor = "rgb(" + newred + ", " + newgreen + ", " + newblue +")";
		
		if (property == "color")
		{
			Pulse.handle[id].style.color = newcolor;
		} else if (property == "backgroundColor")
		{
			Pulse.handle[id].style.backgroundColor = newcolor;
		}
	} else {
		Pulse.counter[id]=0;
		window.clearInterval(Pulse.timer[id]);
	}
}

function DecToHex(input) {
  var hex = Number(input).toString(16);
  hex = "000000".substr(0, 6 - hex.length) + hex; 
  return hex;
}

function HexToDec(input) { 
	return parseInt(input, 16);
}

/////////////////////////
// OLD BROWSER SUPPORT //
/////////////////////////

// source: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/indexOf
// date: 2011-11-12
if (!Array.prototype.indexOf) {  
	Array.prototype.indexOf = function (searchElement /*, fromIndex */ ) {  
		"use strict";  
		if (this === void 0 || this === null) {  
			throw new TypeError();  
		}  
		var t = Object(this);  
		var len = t.length >>> 0;  
		if (len === 0) {  
			return -1;  
		}  
		var n = 0;  
		if (arguments.length > 0) {  
			n = Number(arguments[1]);  
			if (n !== n) { // shortcut for verifying if it's NaN  
				n = 0;  
			} else if (n !== 0 && n !== Infinity && n !== -Infinity) {  
				n = (n > 0 || -1) * Math.floor(Math.abs(n));  
			}  
		}  
		if (n >= len) {  
			return -1;  
		}  
		var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0);  
		for (; k < len; k++) {  
			if (k in t && t[k] === searchElement) {  
				return k;  
			}  
		}  
		return -1;  
	}  
}
