// JavaScript Document

function easeInOut(minValue, maxValue, totalSteps, actualStep, powr) {
 	//CALCULATE THE TOTAL CHANGE
	var delta = maxValue - minValue; 
	var stepp = minValue+(Math.pow(((1 / totalSteps) * actualStep), powr) * delta); 
	return Math.ceil(stepp) 
	}

///////WIDTH CHANGE//////
	function changeWidth(obj, start, end, steps, pausetime, power){ 
			if (!obj.widthCurrent){
				 obj.widthCurrent = start; //if no memory is set, set it first;
				 obj.widthBegin = obj.widthCurrent;
				 }
			doWidthChange(obj, obj.widthCurrent, end, steps, pausetime, power); 
			} 
		//GENERIC PROPERTY RESTORE
		function restoreWidth(obj, start, end, steps, pausetime, power){ 
			if (!obj.widthCurrent) return; 
			doWidthChange(obj, obj.widthCurrent, obj.widthBegin, steps, pausetime, power); 
			}	
		function doWidthChange(obj, start, end, steps, pausetime, powr) { 
			if (obj.widthMem)
			window.clearInterval(obj.widthMem);
			var actStep = 0;
			obj.widthMem = window.setInterval(
				function() { 
				  //CALCULATE NEW PROPERTY VALUE
				  obj.widthCurrent = easeInOut(start,end,steps,actStep,powr);
				  //CHANGE OBJECT PROPERTY
				  obj.style.width = obj.widthCurrent + "px"; 
				  //CHANGE CURRENT STEP			  
				  actStep++;
				  //CANCEL ANIMATION IF WE HAVE REACHED THE END
				  if (actStep > steps) window.clearInterval(obj.widthMem);
				} 
				, pausetime)
		}

/////OPACITY CHANGE/////
		function changeOpac(obj, start, end, steps, pausetime, power){ 
			if (!obj.opacCurrent){
				 obj.opacCurrent = start; //if no memory is set, set it first;
				 obj.opacBegin = obj.opacCurrent;
				 }
			doOpacChange(obj, obj.opacCurrent, end, steps, pausetime, power); 
			} 
		function restoreOpac(obj, start, end, steps, pausetime, power){ 
			if (!obj.opacCurrent) return; 
			doOpacChange(obj, obj.opacCurrent, obj.opacBegin, steps, pausetime, power); 
			}
		function doOpacChange(obj, start, end, steps, pausetime, powr) { 
			if (obj.opacMem)
				window.clearInterval(obj.opacMem);
			var actStep = 0;
			obj.opacMem = window.setInterval(
				function() { 
				  //CALCULATE NEW PROPERTY VALUE
				  obj.opacCurrent = easeInOut(start, end, steps, actStep, powr);
				  //CHANGE OBJECT PROPERTY
					 
					  // IE/Win
					  obj.style.filter="progid:DXImageTransform.Microsoft.Alpha(opacity=" + obj.opacCurrent + ");";
					  // Safari<1.2, Konqueror
					  obj.style.KHTMLOpacity = obj.opacCurrent/100;
					  // Older Mozilla and Firefox
					  obj.style.MozOpacity = obj.opacCurrent/100;
					  // Safari 1.2, newer Firefox and Mozilla, CSS3
					  obj.style.opacity = obj.opacCurrent/100;
					  
				  //CHANGE CURRENT STEP			  
				  actStep++;
				  //CANCEL ANIMATION IF WE HAVE REACHED THE END
				  if (actStep > steps) window.clearInterval(obj.opacMem);
				} 
				, pausetime)
		}
		
///////COLOR CHANGE//////
function changeColor(obj, start, end, steps, pausetime, power){ 
	if (!obj.colorCurrent){
		 obj.colorCurrent = start; //if no memory is set, set it first;
		 obj.colorBegin = obj.colorCurrent;
		 }
	doColorChange(obj, obj.colorCurrent, end, steps, pausetime, power); 
	} 
function restoreColor(obj, start, end, steps, pausetime, power){ 
	if (!obj.colorCurrent) return; 
	doColorChange(obj, start, end, steps, pausetime, power); 
	}	
function doColorChange(obj, start, end, steps, pausetime, powr) { 
	if (obj.colorMem)
		window.clearInterval(obj.colorMem);
	var actStep = 0;

	var redChange = HexToR(end) - HexToR(start);
	var greenChange = HexToG(end) - HexToG(start);
	var blueChange = HexToB(end) - HexToB(start);	

	obj.colorMem = window.setInterval(
		function() { 
			obj.redCurrent = easeInOut(HexToR(start), HexToR(end), steps, actStep, powr);
			obj.greenCurrent = easeInOut(HexToG(start), HexToG(end), steps, actStep, powr);
			obj.blueCurrent = easeInOut(HexToB(start), HexToB(end), steps, actStep, powr);
					   
			obj.style['backgroundColor']  = 'rgb('+parseInt(obj.redCurrent)+','+parseInt(obj.greenCurrent)+','+parseInt(obj.blueCurrent)+')';      
			
			actStep++;
	
			if (actStep > steps) window.clearInterval(obj.colorMem);
			} 
		, pausetime)
	}
function HexToR(h) {return parseInt((cutHex(h)).substring(0,2),16)}
function HexToG(h) {return parseInt((cutHex(h)).substring(2,4),16)}
function HexToB(h) {return parseInt((cutHex(h)).substring(4,6),16)}
function cutHex(h) {return (h.charAt(0)=="#") ? h.substring(1,7):h}
