/*****************************************
DYNAMIC GRADIENT BACKGROUNDS v2.0_20080522

Usage:
Give the elements you want to have a gradient background a class like this...
	class="gradient 000000 ffffff horizontal"

	^ additional classes can be added to the end after the 'direction'

>> Updated by gdibble[aht]gmail[doht]com
   Thanx steve[aht]slayeroffice[doht]com for original-code
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */

// DISABLED: _addLoadEvent(createGradient)
// or w/o helper: window.addEventListener?window.addEventListener("load",createGradient,false):window.attachEvent("onload",createGradient);

// Initiate Immediately:
createGradient();


/* Dynamic Gradients Generator */
function createGradient() {

	var debugMsgsOn = false; //enable to view debug sizing information

	if (!document.getElementById) return; //fail if old-browser
	
	objArray = _getGradientObjects();
	if (!objArray.length) return;
	
	for (i=0; i < objArray.length; i++) {
		params = objArray[i].className.split(" ");
		//for IE, use filter
		if (document.all && !window.opera) {
			objArray[i].style.width = objArray[i].offsetWidth + "px";
			params[3] == "horizontal" ? gType = 1 : gType = 0;
			objArray[i].style.filter = "progid:DXImageTransform.Microsoft.Gradient(GradientType="+gType+",StartColorStr=\"#" + params[1] + "\",EndColorStr=\"#" + params[2] + "\")";
		}
		//otherwise dynamically generate color-flow blocks
		else {
			colorArray = _createColorPath(params[1],params[2]);
			x=0; y=0;
			//set step amount
			if (params[3] == "horizontal") {
				w = objArray[i].offsetWidth/colorArray.length; //Math.round() - NOT NEEDED: causes height issues
				if (!w) w = 1;
				h = objArray[i].offsetHeight;
			}
			else { // "vertical"
				h = objArray[i].offsetHeight/colorArray.length; //Math.round() - NOT NEEDED: causes height issues
				if (!h) h = 1;
				w = objArray[i].offsetWidth;
			}
			_makeGrandParent(objArray[i]);
			//stack color-flow blocks
			tmpDOM = document.createDocumentFragment();
			var tV = 0; //debugMsg
			for (p=0; p < colorArray.length; p++) { //loop through colorArray to build all blocks
				//create block
				g = document.createElement("div");
				g.setAttribute("style","position:absolute;z-index:0;top:" + y + "px;left:" + x + "px;height:" + h + "px;width:" + w + "px;background-color:rgb(" + colorArray[p][0] + "," + colorArray[p][1] + "," + colorArray[p][2] + ");");
				//increment
				params[3] == "horizontal" ? x += w : y += h;
				//prepare color-flow block
				tmpDOM.appendChild(g);
				params[3] == "horizontal" ? tV += h : tV += w; //debugMsg
				//if dimension exceeds, stop
				if (y >= objArray[i].offsetHeight || x >= objArray[i].offsetWidth) {
					if (debugMsgsOn) alert('y: ' + y + '\nx: ' + x); //debugMsg
					break;
				}
			}
			var offsetDim = params[3] == "horizontal" ? objArray[i].offsetHeight : objArray[i].offsetWidth; //debugMsg
			if (debugMsgsOn) alert('before: ' + offsetDim + '\nafter: ' + tV.toString().substr(0,tV.toString().length-2)); //debugMsg
			//attach color-flow block
			objArray[i].appendChild(tmpDOM);
			tmpDOM = null; //reset
		}
	}
}

/* -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */

// Get Gradient Objects
function _getGradientObjects() {
	a = document.getElementsByTagName("*");
	objs = new Array();
	for (i=0; i < a.length; i++) {
		c = a[i].className;
		if (c != "") if (c.indexOf("gradient") == 0) objs[objs.length] = a[i];
	}

	return objs;
}

// Return ColorPath for color range
function _createColorPath(color1,color2) {
	colorPath = new Array();
	colorPercent = 1.0;
	do {
		colorPath[colorPath.length] = _setColorHue(_longHexToDec(color1), colorPercent, _longHexToDec(color2));
		colorPercent-=.01;
	}
	while (colorPercent > 0);

	return colorPath;
}

// Return Color Hue
function _setColorHue(originColor, opacityPercent, maskRGB) {
	returnColor = new Array();
	for (w=0; w < originColor.length; w++) returnColor[w] = Math.round(originColor[w]*opacityPercent) + Math.round(maskRGB[w]*(1.0-opacityPercent));

	return returnColor;
}

// Return Hex-To-Dec
function _longHexToDec(longHex) {return new Array(_toDec(longHex.substring(0,2)),_toDec(longHex.substring(2,4)),_toDec(longHex.substring(4,6)))}

// Return To-Dec
function _toDec(hex) {return parseInt(hex,16)}

// Make Grand-Parent block or inline element
function _makeGrandParent(obj) {
	disp = document.defaultView.getComputedStyle(obj,'').display;
	disp == "block" ? nSpan = document.createElement("div") : nSpan = document.createElement("span");
	mHTML = obj.innerHTML;
	obj.innerHTML = "";
	nSpan.innerHTML = mHTML;
	nSpan.setAttribute("style", "position:relative;z-index:10;");
	obj.appendChild(nSpan);
}