// JavaScript Document

/**
* @Authors: MiB
* @Version: 1.0.0
* @Date: 2010-07-23
* @Copyright: RAGBIT GmbH - All rights reserved.
**/

function shaderClass () {
	var timeContainer = new Array();
	
	this.alphaBlend = function (fadeObject, fromAlpha, toAlpha, microseconds, killElement) {
		if (fadeObject === null) return null;
		if (typeof fadeObject != 'object') var fadeObject = document.getElementById(fadeObject);
		if (fromAlpha === null) fromAlpha = 0;
		if (toAlpha === null) toAlpha = 1;
		if (!microseconds) microseconds = 2000;
		if (killElement === null) killElement = true;
		
		if (timeContainer[fadeObject.id]) {
			for (var key in timeContainer[fadeObject.id]) {
				window.clearTimeout(timeContainer[fadeObject.id][key]);
			}
		} else timeContainer[fadeObject.id] = new Object();
		
		var currentAlpha = fromAlpha;
		var fps = 24;
		var imageTime = 1000/fps;
		var stepNum = microseconds/imageTime;
		var stepMax = stepNum + (microseconds/100);
		var currentStep = 0;
		var iteration = parseFloat((toAlpha-fromAlpha)/stepNum);
		var setAlpha;
		var timeIndex;
		
		var isIE = document.all ? true : false;
		
		//alert(isIE);
		
		while (currentStep <= stepMax && (currentAlpha <= toAlpha && fromAlpha < toAlpha || currentAlpha >= toAlpha && fromAlpha > toAlpha)) {
			currentStep = currentStep +1;
			currentAlpha = fromAlpha + (iteration * currentStep);
			if (fromAlpha < toAlpha && currentAlpha >= toAlpha || fromAlpha > toAlpha && currentAlpha <= toAlpha) currentAlpha = toAlpha;
			if (currentAlpha < 0) currentAlpha = 0.0;
			if (currentAlpha > 1) currentAlpha = 1.0;
			setAlpha = Math.round(currentAlpha*100)/100;
			timeIndex = Math.round(imageTime * currentStep);
			
			timeContainer[fadeObject.id][timeIndex] = window.setTimeout (
				(function (fadeObject, setAlpha, timeIndex) {
  				return function() {
						if (!isIE) fadeObject.style.opacity = setAlpha;
						else fadeObject.style.filter = 'Alpha(opacity='+(Math.round(setAlpha*100))+')';
  				};
				})(fadeObject, setAlpha, timeIndex), timeIndex
			);
			if (currentAlpha == toAlpha) break;
		};
		
		if (killElement) {
			timeContainer[fadeObject.id]['killElement'] = window.setTimeout (
				function () {
					fadeObject.parentNode.removeChild(fadeObject);
				}, timeIndex
			);
		};
	};
	
	this.setAlpha = function (setObject, setAlpha) {
		var isIE = document.all ? true : false;
		if (!isIE) setObject.style.opacity = setAlpha;
		else {
			setObject.style.filter = 'Alpha(opacity='+(Math.round(setAlpha*100))+')';
			setObject.style.backgroundColor = setObject.style.backgroundColor;
			// on Error: return to = 'white';
		}
	};
	
	this.fadeDisplay = function (fadeObject, toDisplay, fromAlpha, toAlpha, microseconds) {
		// using this.alphaBlend(fadeObject, fromAlpha, toAlpha, microseconds, killElement)
		if (fadeObject === null) return null;
		if (typeof fadeObject != 'object') {
			var fadeObject = document.getElementById(fadeObject);
			if (typeof fadeObject != 'object' || fadeObject === null) return null;
		}
		
		if (!toDisplay) toDisplay = fadeObject.style.display == 'none' ? 'block' : 'none';
		if (!microseconds) microseconds = 250;
		
		if (toDisplay == 'none') { // fade out: 1. fade, 2. set display
			if (fromAlpha === null || typeof fromAlpha == 'undefined') fromAlpha = 1;
			if (toAlpha === null || typeof toAlpha == 'undefined') toAlpha = 0;
			setTimeout (
				function () {
					fadeObject.style.display = toDisplay;
				}, microseconds
			);
		} else { // fade in: 1. set display, 2. fade
			if (fromAlpha === null || typeof fromAlpha == 'undefined') fromAlpha = 0;
			if (toAlpha === null || typeof toAlpha == 'undefined') toAlpha = 1;
			fadeObject.style.display = toDisplay;
		}
		this.setAlpha(fadeObject, fromAlpha);
		this.alphaBlend(fadeObject, fromAlpha, toAlpha, microseconds, false);
	}
	
	this.fadeTextColor = function (containerObject, fromColor, toColor, killElement, microseconds, step, iterationRed, iterationGreen, iterationBlue) {
		if (typeof containerObject != 'object') var containerObject = document.getElementById(containerObject);
		
		if (!fromColor) fromColor = '000000';
		if (!toColor) toColor = 'ffffff';
		if (killElement === null || typeof killElement == 'undefined') killElement = true;
		if (!microseconds) microseconds = 1000;
		if (!step) step = 0;
		step = step+1;
		
		fps = 24;
		var imageTime = Math.round(1000/fps);
		
		var fromIntColorRed = parseInt(fromColor.substring(0,2),16);
		var fromIntColorGreen = parseInt(fromColor.substring(2,4),16);
		var fromIntColorBlue = parseInt(fromColor.substring(4,6),16);
		
		var toIntColorRed = parseInt(toColor.substring(0,2),16);
		var toIntColorGreen = parseInt(toColor.substring(2,4),16);
		var toIntColorBlue = parseInt(toColor.substring(4,6),16);
		
		var stepNum = Math.round(microseconds/imageTime);
		
		if (!iterationRed) iterationRed = Math.round((toIntColorRed-fromIntColorRed)/stepNum);
		if (!iterationGreen) iterationGreen = Math.round((toIntColorGreen-fromIntColorGreen)/stepNum);
		if (!iterationBlue) iterationBlue = Math.round((toIntColorBlue-fromIntColorBlue)/stepNum);
		
		var newIntColorRed = fromIntColorRed + iterationRed;
		if (newIntColorRed < 0) newIntColorRed = 0;
		if (newIntColorRed > 255) newIntColorRed = 255;
		var newIntColorGreen = fromIntColorGreen + iterationGreen;
		if (newIntColorGreen < 0) newIntColorGreen = 0;
		if (newIntColorGreen > 255) newIntColorGreen = 255;
		var newIntColorBlue = fromIntColorBlue + iterationBlue;
		if (newIntColorBlue < 0) newIntColorBlue = 0;
		if (newIntColorBlue > 255) newIntColorBlue = 255;
		
		var newHexColorRed = newIntColorRed.toString(16);
		if (newHexColorRed.length <2) newHexColorRed = '0'+newHexColorRed;
		var newHexColorGreen = newIntColorGreen.toString(16);
		if (newHexColorGreen.length <2) newHexColorGreen = '0'+newHexColorGreen;
		var newHexColorBlue = newIntColorBlue.toString(16);
		if (newHexColorBlue.length <2) newHexColorBlue = '0'+newHexColorBlue;
		
		var changeColor = newHexColorRed+''+newHexColorGreen+''+newHexColorBlue;
		
		//alert (stepNum+','+iterationRed+','+fromIntColorRed+','+toIntColorRed+','+(fromIntColorRed-toIntColorRed)+','+Math.abs((fromIntColorRed-toIntColorRed)/stepNum)+','+changeColor);
		
		if (step<stepNum && changeColor.length == 6) {
			containerObject.style.color = '#'+changeColor;
			setTimeout(
				function () {
					shaderObj.fadeTextColor(containerObject, changeColor, toColor, killElement, microseconds, step, iterationRed, iterationGreen, iterationBlue);
				}, imageTime
			);
		} else {
			containerObject.style.color = '#'+toColor;
			if (killElement) {
				containerObject.parentNode.removeChild(containerObject);
			}
		}
		return true;
	};
	
	this.outOfShape = function (element, event) {
		var current_mouse_target = null;
		current_mouse_target = event.toElement || event.relatedTarget;
		//alert(element+' : '+current_mouse_target);
		if( current_mouse_target != null  && element != current_mouse_target ) {
			while( current_mouse_target.parentNode ) {
				if( (current_mouse_target = current_mouse_target.parentNode) == element ) {
					return false;
				}
			}
		}
		return true;
	}
}
var shaderObj = new shaderClass ();

