/*---------------------------------------------------------------------
	File to contain general functions
-----------------------------------------------------------------------*/

/*-------------------------------
	Positioning Functions
---------------------------------*/
function MoveToByID(ID, x, y) {
	var node = document.getElementById(ID);
	MoveToByNode(node, x, y);
}

function MoveToByNode(node, x, y) {
	SetAbsPos(node, x, y);
}

function GetAbsXPosByID(ID) {
	var node = document.getElementById(ID);
	return GetAbsXPosByNode(node);
}

function GetAbsYPosByID(ID) {
	var node = document.getElementById(ID);
	return GetAbsYPosByNode(node);
}

function GetAbsXPosByNode(node) {
	nodeLeft = node.offsetLeft;
	while(node.offsetParent!=null) {
		nodeParent = node.offsetParent;
		nodeLeft += nodeParent.offsetLeft;
		node = nodeParent;
	}
	return nodeLeft;
}

function GetAbsYPosByNode(node) {
	nodeTop = node.offsetTop
	while(node.offsetParent!=null) {
		nodeParent = node.offsetParent;
		nodeTop += nodeParent.offsetTop;
		node = nodeParent;
	}
	return nodeTop;
}

function SetAbsPos(node, x, y) {
	SetAbsXPos(node, x);
	SetAbsYPos(node, y);
}

function SetAbsXPos(node, x) {
	node.style.position = "absolute";
	node.style.left = x + "px";
}

function SetAbsYPos(node, y) {
	node.style.position = "absolute";
	node.style.top = y + "px";
}

function GetHeightByID(ID) {
	var node = document.getElementById(ID);
	GetHeightByNode(node);
}

function GetWidthByID(ID) {
	var node = document.getElementById(ID);
	GetWidthByNode(node);
}

function GetHeightByNode(node) {
	return node.offsetHeight;
}

function GetWidthByNode(node) {
	return node.offsetWidth;
}

/*-------------------------------
	DOM Whitespace Functions
---------------------------------*/
function getFirstChild(currentNode) { 
	var checkNode = currentNode.firstChild;
	while (checkNode && checkNode.nodeType != 1) {
		checkNode = checkNode.nextSibling;
	}
	return checkNode;
}

function getNextSibling(currentNode)
{
	var checkNode = currentNode.nextSibling;
	while (checkNode && checkNode.nodeType != 1) {
		checkNode = checkNode.nextSibling;
	}
	return checkNode;
}

/*-------------------------------
	CSS Functions
---------------------------------*/
function cssClassActions(sAction,oNode,sClass1,sClass2) {
	//alert('cssClassActions: ' + sAction + ", " + oNode + ", " + sClass1 + ", " + sClass2);
	switch (sAction){
		case 'swap':
			oNode.className=!cssClassActions('check',oNode,sClass1)?oNode.className.replace(sClass2,sClass1):oNode.className.replace(sClass1,sClass2);
			break;
		case 'add':
			if(!cssClassActions('check',oNode,sClass1)){oNode.className+=oNode.className?' '+sClass1:sClass1;}
			break;
		case 'remove':
			var sRep=oNode.className.match(' '+sClass1)?' '+sClass1:sClass1;
			oNode.className=oNode.className.replace(sRep,'');
			break;
		case 'check':
			return new RegExp('\\b'+sClass1+'\\b').test(oNode.className)
			break;
	}
	return false;
}

function swapCSSBkgdImg(oNode,sImg) {
	//alert('swapCSSBkgdImg: ' + oNode.nodeName + ", " + sImg );
	oNode.style.backgroundImage = "url("+sImg+")";
}

/*-------------------------------
	Event Handler Functions
	/addEvent' modified from http://www.scottandrew.com/weblog/articles/cbs-events
---------------------------------*/
function addEvent(oNode, evType, fn, useCapture){
	if (oNode.addEventListener){
		//	W3C spec
		oNode.addEventListener(evType, fn, useCapture);
		return true;
	} else if (oNode.attachEvent){
		//	IE5 implementation
		var r = oNode.attachEvent("on"+evType, fn);
		return r;
	} else {
	    // IE 5 Mac and some others
	    oNode['on'+evType] = fn;
		return false;
	}
}

function removeEvent(oNode, evType, fn, useCapture){
	if (oNode.removeEventListener){
		//	W3C spec
		oNode.removeEventListener(evType, fn, useCapture);
		return true;
	} else if (oNode.detachEvent){
		//	IE5 implementation
		var r = oNode.detachEvent("on"+evType, fn);
		return r;
	} else {
		//alert("Handler could not be removed");
	    oNode['on'+evType] = null;
		return false;
	}
}
function TargetObj(e) {
	/*---------------
		when using above 'addEvent' function, IE does not have reference to calling object via 'this'.
		We need to take the event 'e' and find the reference calling object.
	---------------*/
	/*
	var oNode;
	if (!e) var e = window.event;
	if (e.target) oNode = e.target;
	else if (e.srcElement) oNode = e.srcElement;
	if (oNode.nodeType == 3) // defeat Safari bug
	oNode = oNode.parentNode;
	*/	
	e = e || window.event;
	if( e.target ) {
		//	W3C spec
		var oNode = e.currentTarget;
		while (oNode.nodeType != 1) {
			oNode = oNode.parentNode;
		} 
	} else if( e.srcElement ) {
		//	hack for IE using srcElement
		var oNode = e.srcElement;
	}
	return oNode;
}