// layers.js
// Danny Sauer, 12-5-2000
//  provides some functions for giving feedback, including moving layers
//  to overlap each other, and inserting newlines.  Maybe this should be
//  merged in with quizzes.js or something...
// 12-14-2000
//  modified to be more of a general-purpose library...
// 10/26/2001
//  modified to work with mozilla better
//  added calculation of missing properties

// based on PHPMyAdmin and ua.js, sortof
var agent=navigator.userAgent.toLowerCase();
var isIE=(agent.indexOf('msie') != -1) ? true : false;
var isDOM=(typeof(document.getElementById) != 'undefined' && !isIE) ? true : false;
var isNav4=(agent.indexOf('mozilla') != -1 && !isDOM && !isIE) ? true : false;

// returns left position
function getLeft(daObj){
	var returnVal;
	// set left if auto-calculated (left=0) or if not specified in-line/with style sheet
	if(isDOM){
		if(typeof(daObj.style.left)=='undefined' || daObj.style.left==''){
			daObj.style.left = 
				document.defaultView.getComputedStyle(daObj, '').getPropertyValue('left');
		}
		returnVal = parseInt(daObj.style.left);
	}
	else if(isNav4){ returnVal = daObj.left; } // daObj.pageY if undef
	else{ returnVal = daObj.style.pixelLeft; } // daObj.offsetLeft if undef
	return returnVal;
}

// sets left position
function setLeft(daObj, newLeft){
	if(isDOM){ daObj.style.left = newLeft + 'px'; }
	else if(isNav4){ daObj.left = newLeft; }
	else{ daObj.style.pixelLeft = newLeft; }
}

// returns top position
function getTop(daObj){
	var returnVal;
	if(isDOM){
		if(typeof(daObj.style.top)=='undefined' || daObj.style.top==''){
			daObj.style.top = 
				document.defaultView.getComputedStyle(daObj, '').getPropertyValue('top');
		}
		returnVal = parseInt(daObj.style.top);
	}
	else if(isNav4){ returnVal = daObj.top; } // daObj.pageX if undef
	else{ returnVal = daObj.style.pixelTop; } // daObj.offsetTop if undef
	return returnVal;
}

// sets top position
function setTop(daObj, newTop){
	if(isDOM){ daObj.style.top = newTop + 'px'; }
	else if(isNav4){ daObj.top = newTop; }
	else{ daObj.style.pixelTop = newTop; }
}

// gets object height
function getObjHeight(daObj){
	var returnVal;
	if(isDOM){
		if(typeof(daObj.style.height) == 'undefined' || daObj.style.height==''){
			daObj.style.height = 
				document.defaultView.getComputedStyle(daObj, '').getPropertyValue('height');
		}
		returnVal = parseInt(daObj.style.height);
	}else if(isIE){ returnVal = daObj.clientHeight; // daObj.offsetHeight if undef
	}else{ returnVal = daObj.clip.height; } // daObj.clip.height if undef
	return returnVal;
}

// gets object width
function getObjWidth(daObj){
	var returnVal;
	if(isDOM){
		if(typeof(daObj.style.width) == 'undefined' || daObj.style.width==''){
			daObj.style.width = 
				document.defaultView.getComputedStyle(daObj, '').getPropertyValue('width');
		}
		returnVal = parseInt(daObj.style.width);
	}else if(isIE){ returnVal = daObj.clientWidth; // daObj.offsetWidth if undef
	}else{ returnVal = daObj.clip.width; } // daObj.clip.width if undef
	return returnVal;
}

// returns window's innner width
function getWindowWidth(){
	var returnVal = isIE ? document.body.clientWidth : window.innerWidth;
	return returnVal;
}

// returns window's innner height
function getWindowHeight(){
	var returnVal = isIE ? document.body.clientHeight : window.innerHeight;
	return returnVal;
}

// return an object for a string or an object (just in case)
function getObject(daName){
	var daObj;
	if(typeof(daName) == "string"){
		if(isDOM){
			daObj = document.getElementById(daName);
		}else if(isIE){
			daObj = eval("document.all." + daName);
		}else{
			daObj = eval("document." + daName);
		}
	}else{
		daObj = daName;
	}
	return daObj;
}

// shows an object
function show(daObj){
	var Obj = getObject(daObj);
	if(isNav4){
		Obj.visibility = 'visible';
	}else{
		Obj.style.visibility = 'visible';
	}
}

// hides an object
function hide(daObj){
	var Obj = getObject(daObj);
	if(isNav4){
		Obj.visibility = 'hidden';
	}else{
		Obj.style.visibility = 'hidden';
	}
}

// true if hidden, false if shown
function isHidden(daObj){
	var Obj = getObject(daObj);
	if(isNav4){
		returnVal = (Obj.visibility == 'hidden');
	}else{
		returnVal = (Obj.style.visibility == 'hidden');
	}
	return returnVal;
}

// moxes an object to a new coordinate (left, top) AKA (x, y)
function moveObjTo(daObj, newLeft, newTop){
	daObject = getObject(daObj);
	setLeft(daObject, newLeft);
	setTop(daObject, newTop);
}

// center an object in the screen
function moveToCenter(daObject){
	daObject = getObject(daObject);
	daHeight = getObjHeight(daObject);
	daWidth = getObjWidth(daObject);
	winHeight = getWindowHeight(daObject);
	winWidth = getWindowWidth(daObject);
	midLeft = (winWidth - daWidth) / 2;
	midTop = (winHeight - daHeight) / 2;
	moveObjTo(daObject, midLeft, midTop);
}

// locate topObj directly above topObj (alight upper left corners)
function overlayWith(bottomObj, topObj){
	var bottomO = getObject(bottomObj);
	var topO = getObject(topObj);
//	bottomO.moveBelow(topO);
	bottomO.zIndex = topO.zIndex - 1;
	newLeft = isNav4 ? bottomO.left : bottomO.pixelLeft;
	newTop = isNav4 ? bottomO.top : bottomO.pixelTop;
	moveObjTo(topO, newLeft, newTop);
}

// overlays with, then shows the lower and hides the upper
function overlayAndToggle(newBott, newTop){
	overlayWith(newBott, newTop);
	hide(newBott);
	show(newTop);
}

// overlays and toggles after moving to center
function overlayAndCenter(newBott, newTop){
	moveToCenter(newTop); // think about this - moving it twice?  Why? :)
	moveToCenter(newBott);
	overlayAndToggle(newBott, newTop);
}
