/*
* Author Jonthan Samples - Created June 04, 2008
* This library should hold animation functions.  Functions should take a div id as an argument, and operate
* on that div. This is so that these functions can be used in general.
*/

/**
* Will close a div from bottom up, and then make it invisible.
* Speed - between 1 and 100 (slowest - fastest)
*/
 function closeDiv(speed, id, callback){

 	var gettingClosed = document.getElementById(id);
 	gettingClosed.style.overflow = "hidden";
 	var height = gettingClosed.offsetHeight;
 	if(gettingClosed.style.height != "")
 		height = parseFloat(gettingClosed.style.height);
 	//document.write(height+"<br/>");
 	if(height <= 2){
		gettingClosed.style.height = "0px";
		gettingClosed.style.margin = "0px";
		gettingClosed.style.padding = "0px";
		//gettingClosed.style.visibility = "hidden";
		//gettingClosed.style.padding = "0px";
		if(callback)
			callback();
		return;
	}
	else{
		gettingClosed.style.margin = "0px";
		gettingClosed.style.height = (height-height*(speed/100))+"px";
	
		var newMargin = gettingClosed.style.margin;
		//alert("Margin "+newMargin);
		gettingClosed.style.marginBottom = newMargin;
		
		setTimeout("closeDiv("+speed+",'"+id+"', "+callback+")",20);
	}
 }
 
 /** 
 * Will open a div to it's proper height
 * speed - between 1 and 100 (slowest - fastest)
 */
 function openDiv(speed, id, height, callback){
 	
 	var gettingOpened = document.getElementById(id);
 	gettingOpened.style.overflow = "hidden";
 	var current_height = parseInt(gettingOpened.offsetHeight);
 	//alert(current_height);
 	// First get the true height of the div
 	if(height-current_height < 5 && height-current_height > -5){
 		gettingOpened.style.height = height+"px";
 		gettingOpened.style.overflow = "";
 	 	if(callback)
 	 		callback();
 	 	return;
 	}
 	
 	var newHeight = (current_height+(height-current_height)*(speed/100))+"px";
 	//alert(newHeight);
 	gettingOpened.style.height = (current_height+(height-current_height)*(speed/100))+"px";
		
	setTimeout("openDiv("+speed+",'"+id+"',"+height+","+callback+")",20); 
 }
 
 /**
 * Will move a div from start to finish
 * Speed - between 1 and 100  (slowest - fastest)
 *
 */
 
function moveDiv(id, startX, startY, finishX, finishY, speed){
	var gettingMoved = document.getElementById(id);
	
	// First move the div to the startX, startY
	gettingMoved.style.position = "absolute";
	gettingMoved.style.left = startX+"px";
	gettingMoved.style.top = startY+"px";
	
	// Now setup recursion
	// Distance formula
	var distance = Math.sqrt(Math.pow((finishX-startX),2)+Math.pow((finishY-startY),2));
	if(distance < 5){
		gettingMoved.style.left = startX+"px";
		gettingMoved.style.top = startY+"px";
		return true;
	}
	// These vectors have a sign
	var xDistance = finishX - startX;
	var yDistance = finishY - startY;
	
	var newStartX = parseInt(startX + xDistance * ((speed)/100)); // This will get us to the end by a percentage
	var newStartY = parseInt(startY + yDistance * ((speed)/100));
	
	setTimeout("moveDiv('"+id+"', "+newStartX+", "+newStartY+", "+finishX+", "+finishY+", "+speed+")",20);
}

/**
 * Will move a div from current position to a reletive distance
 * Speed - between 1 and 100  (slowest - fastest)
 *
 */
 
function moveDivRel(id, howFarX, howFarY, speed, callback){
	var gettingMoved = document.getElementById(id);
	
	howFarX = parseInt(howFarX);
	howFarY = parseInt(howFarY);
	var startX = 0;
	var startY = 0;
	if(gettingMoved.style.left)
		startX = parseInt(gettingMoved.style.left);
	if(gettingMoved.style.top)
		startY = parseInt(gettingMoved.style.top);

	
	var finishX = startX+howFarX;
	var finishY = startY+howFarY;
	
	// Now setup recursion
	// Distance formula
	/*
	var distance = Math.sqrt(Math.pow((howFarX),2)+Math.pow((howFarY),2));
	// alert('id - ' + id + ' howFarY ' + howFarY + ' howFarX ' + howFarX + ' distance ' + distance);
	if(distance < 1){
		gettingMoved.style.left = (finishX)+"px";
		gettingMoved.style.top = (finishY)+"px";
		if(callback)
			callback();
		return true;
	}
	*/
	
	if (howFarX < 0)
	{
		roundX = -0.5;
	}
	else
	{
		roundX = 0.5;
	}	
	if (howFarY < 0)
	{
		roundY = -0.5;
	}
	else
	{
		roundY = 0.5;
	}	

	var stepDistanceX = parseInt((howFarX * ((speed)/100)) + roundX); // This will get us to the end by a percentage
	var stepDistanceY = parseInt((howFarY * ((speed)/100)) + roundY);
	
	// alert('id - ' + id + ' howFarY ' + howFarY + ' howFarX ' + howFarX + ' distance ' + distance);
	if(stepDistanceX == 0 && stepDistanceY == 0){
		//gettingMoved.style.left = (finishX)+"px";
		//gettingMoved.style.top = (finishY)+"px";
		if(callback)
			callback();
		return true;
	}
	else
	{
		gettingMoved.style.left = (startX+stepDistanceX)+"px";
		gettingMoved.style.top = (startY+stepDistanceY)+"px";

		setTimeout("moveDivRel('"+id+"',"+(howFarX-stepDistanceX)+", "+(howFarY-stepDistanceY)+", "+speed+","+callback+")",20);
	}
}

/**
* Function fadeDiv
* @param eleId: the element to fade
* @param opacity: 0-100 the opacity of that the div should end up at
* @param speed: 1-100 the speed with which the div should transition
*/
function fadeDiv(eleId, opacity, speed, callback){
	/*
	* /-moz-opacity:.20;
	* opacity:.20;
	* filter:alpha(opacity=20);
	*/
	if(eleId.id) eleId = eleId.id;
	var ele = document.getElementById(eleId);
	if(!ele){
		//alert("fadeDiv was passed and invalid element"); 
		return; 
	}
	if(opacity > 100) opacity = 100;
	else if(opacity < 0) opacity = 0;
	if(speed > 100) speed = 100;
	else if(speed < 1) speed = 1;
	
	var currentOpacity = 100;
	if(ele.style['-moz-opacity'])
		currentOpacity = parseFloat(ele.style['-moz-opacity'])*100;
	else if(ele.style.opacity)
		currentOpacity = parseFloat(ele.style.opacity)*100;
	else if(ele.style.filter){
		var regexp = /\(opacity=([0-9]{1,3})\)/;
		var match = ele.style.filter.match(regexp);
		if(match){
			currentOpacity = match[1];
			//alert(match[1]);
		}
	}
	
	//alert(currentOpacity);
	var gap = currentOpacity-opacity;
	var step = gap*(speed/100);
	var newCurrent = currentOpacity-step;
	
	if(newCurrent <= opacity+1 && newCurrent >= opacity-1){
		newCurrent = opacity;
	}
	ele.style['-moz-opacity'] = newCurrent/100;
	ele.style.opacity = newCurrent/100;
	//ele.style.filter = "alpha(opacity="+newCurrent+")";
	ele.style.filter = "progid:DXImageTransform.Microsoft.Alpha(opacity="+newCurrent+")";
	
	
	if(newCurrent == opacity){ 
		//alert(newCurrent);
		if(callback)
			callback(); 
		
		return; 
	}
	else 
		setTimeout("fadeDiv('"+eleId+"',"+opacity+","+speed+","+callback+")", 20);
	
}
