/*
General utility functions
author: Steve Hall Novell, Inc. 2006
*/

// Dom utilities
function supportsHTTPRequest() {
	try {
		var httprequest = null;
		if(window.XMLHttpRequest) {
			try {
				httprequest = new XMLHttpRequest();
			}
			catch(e) {
				httprequest = null;
			}
		}
		else {
			try {
				httprequest = new ActiveXObject("Msxml2.XMLHTTP");
			}
			catch(e) {
				try {
					httprequest = new ActiveXObject("Microsoft.XMLHTTP");
				}
				catch(e) {
					httprequest = null;
				}
			}
		}
		if(httprequest == null) {
			return false;
		}
		else {
			return true;
		}
	}
	catch(e) {
		return false;
	}
}



// Cookie read/write/erase functions
function createCookie(name, value, days, domain) {
	if(days) {
		var date = new Date();
		date.setTime(date.getTime() + (days*24*60*60*1000));
		var expires = '; expires=' + date.toGMTString();
	}
	else {
		var expires = '';
	}
	document.cookie = name + '=' + value + expires + '; path=/'+ '; domain='+ domain;
}

function readCookie(name) {
	var namePreface = name + '=';
	var cookieArray = document.cookie.split(';');
	for(var counter=0; counter<cookieArray.length; counter++) {
		var cookie = cookieArray[counter];
		while(cookie.charAt(0) == ' ') {
			cookie = cookie.substring(1, cookie.length);
		}
		if(cookie.indexOf(namePreface) == 0) {
			return cookie.substring(namePreface.length, cookie.length);
		}
	}
	return null;
}

function eraseCookie(name) {
	createCookie(name, '', '-1');
}

function supportsCookies() {
	return navigator.cookieEnabled;
}


// String utilities
function trimEndByOne(value) {
	if(value != null) {
		if(value.length == 0) {
			return value;
		}
		else {
			return value.slice(0, (value.length - 1));
		}
	}
	else {
		return null;
	}
}

function trimBeginningByOne(value) {
	if(value != null) {
		if(value.length == 0) {
			return value;
		}
		else {
			return value.substring(1, value.length);
		}
	}
	else {
		return null;
	}
}


// Basic element retrieval functions
function getNodeById(id) {
	var element = document.getElementById(id);
	return element;
}

function getNodesByName(name) {
	var elements = document.getElementsByName(name);
	return elements;
}

function getNodesByTagName(name) {
	var elements = document.getElementsByTagName(name);
	return elements;
}


// Basic child retrieval functions
function getChildrenByType(id, type) {
	var element = document.getElementById(id);
	if(!element) return null;
	var elementChildren = new Array();
	for(var counter=0; counter<element.childNodes.length; counter++) {
		if(element.childNodes[counter].nodeType == type) {
			elementChildren.push(element.childNodes[counter]);
		}
	}
	return elementChildren;
}

function getChildrenElements(id) {
	return getChildrenByType(id, 1);
}


// Basic show/hide/toggle display style functions based on id
function hideElementById(id) {
	var element = document.getElementById(id);
	if(element != null) {
		element.style.display = 'none';
	}
}

function showElementById(id) {
	var element = document.getElementById(id);
	if(element != null) {
		element.style.display = 'block';
	}
}

function toggleElementDisplayById(id) {
	var element = document.getElementById(id);
	if(element != null) {
		if(element.style.display == 'none' || element.style.display == null) {
			showElementById(id);
		}
		else {
			hideElementById(id);
		}
	}
}

function cloakElementById(id) {
	var element = document.getElementById(id);
	if(element != null) {
		element.style.visibility = 'hidden';
	}
}

function decloakElementById(id) {
	var element = document.getElementById(id);
	if(element != null) {
		element.style.visibility = 'visible';
	}
}


// Basic show/hide/toggle display style functions based on name
function hideElementsByName(name) {
	var elements = document.getElementsByName(name);
	if(elements != null) {
		for(var counter=0; counter<elements.length; counter++) {
			if(elements[counter] != null) {
				elements[counter].style.display = 'none';
			}
		}
	}
}

function showElementsByName(name) {
	var elements = document.getElementsByName(name);
	if(elements != null) {
		for(var counter=0; counter<elements.length; counter++) {
			if(elements[counter] != null) {
				elements[counter].style.display = 'block';
			}
		}
	}
}

function toggleElementsDisplayByName(name) {
	var elements = document.getElementsByName(name);
	if(elements != null) {
		for(var counter=0; counter<elements.length; counter++) {
			if(elements[counter] != null) {
				toggleElementDisplayById(elements[counter].id);
			}
		}
	}
}


// Swap image source utilities
function setImageSourceById(id, source) {
	var element = document.getElementById(id);
	if(element != null) {
		element.src = source;
	}
}

function setImageSourcesByName(name, source) {
	var elements = document.getElementsByName(name);
	if(elements != null) {
		for(var counter=0; counter<elements.length; counter++) {
			if(elements[counter] != null) {
				elements[counter].src = source;
			}
		}
	}
}


// Swap image alt/title utilities
function setImageAltById(id, text) {
	var element = document.getElementById(id);
	if(element != null) {
		element.alt = text;
	}
}

function setImageAltsByName(name, text) {
	var elements = document.getElementsByName(name);
	if(elements != null) {
		for(var counter=0; counter<elements.length; counter++) {
			if(elements[counter] != null) {
				elements[counter].alt = text;
			}
		}
	}
}

function setImageTitleById(id, text) {
	var element = document.getElementById(id);
	if(element != null) {
		element.title = text;
	}
}

function setImageTitlesByName(name, text) {
	var elements = document.getElementsByName(name);
	if(elements != null) {
		for(var counter=0; counter<elements.length; counter++) {
			if(elements[counter] != null) {
				elements[counter].title = text;
			}
		}
	}
}


// get text element utilities
function getTextById(id) {
	var element = document.getElementById(id);
	if(element != null) {
		return element.innerHTML;
	}
}




// Set element text utilities
function setTextById(id, text) {
	var element = document.getElementById(id);
	if(element != null) {
		element.innerHTML = text;
	}
}

function setTextsByName(name, text) {
	var elements = document.getElementsByName(name);
	if(elements != null) {
		for(var counter=0; counter<elements.length; counter++) {
			if(elements[counter] != null) {
				elements[counter].innerHTML = text;
			}
		}
	}
}


// Set element color utilities
function setElementBackgroundById(id, color) {
	getNodeById(id).style.backgroundColor = color;
}

function setElementForegroundById(id, color) {
	getNodeById(id).style.color = color;
}


// URL encode/decode utilities
function encodeFormData(value) {
	var mystring = encodeURI(value);
	var regexp = /\+/g;
	return mystring.replace(regexp,"%2B");
}

function decodeFormData(value) {
	return decodeURI(value);
}


// Sizing/Positioning utilities
function getCenterXById(id) {
	return Math.round(getNodeById(id).offsetWidth / 2);
}

function getCenterYById(id) {
	return Math.round(getNodeById(id).offsetHeight / 2);
}

function getXY(obj) {
	var intX = 0;
	var intY = 0;
	do { // Walk up our document tree until we find the body and add the distance from the parent to our counter.
		intX += obj.offsetLeft;
		intY += obj.offsetTop;
		var obj = obj.offsetParent;
	} while(obj.tagName != "BODY" && obj.tagName != "HTML")
	return new Array(intX,intY);
}

function getViewportCenterX() {
	return Math.round((getViewportW() / 2) + getScrollX());
}

function getViewportCenterY() {
	return Math.round((getViewportH() / 2) + getScrollY());
}

function getDocumentCenterX() {
	return Math.round(getDocumentW() / 2);
}

function getDocumentCenterY() {
	return Math.round(getDocumentH() / 2);
}

function getWById(id) {
	return Math.round(getNodeById(id).offsetWidth);
}

function getHById(id) {
	return Math.round(getNodeById(id).offsetHeight);
}

function getViewportW() {
	if(typeof(window.innerWidth) == 'number') {
		//Non-IE
		return window.innerWidth;
	} else if(document.documentElement && document.documentElement.clientWidth) {
		//IE 6+ in 'standards compliant mode'
		return document.documentElement.clientWidth;
	} else if(document.body && document.body.clientWidth) {
		//IE 4 compatible
		return document.body.clientWidth;
	}
}

function getViewportH() {
	if( typeof( window.innerHeight ) == 'number' ) {
		//Non-IE
		return window.innerHeight;
	} else if(document.documentElement && document.documentElement.clientHeight) {
		//IE 6+ in 'standards compliant mode'
		return document.documentElement.clientHeight;
	} else if(document.body && document.body.clientHeight) {
		//IE 4 compatible
		return document.body.clientHeight;
	}
}

function getDocumentW() {
	return Math.max(getScrollW()+getScrollX(), getViewportW());
}

function getDocumentH() {
	return Math.max(getScrollH()+getScrollY(), getViewportH());
}

function getScrollW() {
	return Math.round(document.body.scrollWidth);
}

function getScrollH() {
	return Math.round(document.body.scrollHeight);
}

function getScrollX() {
	return Math.max(Math.round(document.body.scrollLeft), Math.round(document.documentElement.scrollLeft));
}

function getScrollY() {
	return Math.max(Math.round(document.body.scrollTop), Math.round(document.documentElement.scrollTop));
}

function setWPXById(id, w) {
	getNodeById(id).style.width = w + 'px';
}

function setHPXById(id, h) {
	getNodeById(id).style.height = h + 'px';
}

function setWPCTById(id, w) {
	getNodeById(id).style.width = w + '%';
}

function setHPCTById(id, h) {
	getNodeById(id).style.height = h + '%';
}

function getXById(id) {
	return Math.round((getNodeById(id).offsetLeft));
}

function getYById(id) {
	return Math.round((getNodeById(id).offsetTop));
}

function setXPXById(id, x) {
	getNodeById(id).style.left = x + 'px';
}

function setYPXById(id, y) {
	getNodeById(id).style.top = y + 'px';
}

function centerElementOnViewportById(id, offsetW, offsetH) {
	var modLeft = (offsetW != null) ? (getViewportCenterX() + offsetW) - getCenterXById(id) : getViewportCenterX() - getCenterXById(id);
	var modTop = (offsetH != null) ? (getViewportCenterY() + offsetH) - getCenterYById(id) : getViewportCenterY() - getCenterYById(id);

	var element = getNodeById(id);
	element.style.left = Math.round(Math.max(0, modLeft)) + 'px';
	element.style.top = Math.round(Math.max(0, modTop)) + 'px';
}

function centerElementOnDocumentById(id, offsetW, offsetH) {
	var modLeft = (offsetW != null) ? (getDocumentCenterX() + offsetW) - getCenterXById(id) : getDocumentCenterX() - getCenterXById(id);
	var modTop = (offsetH != null) ? (getDocumentCenterY() + offsetH) - getCenterYById(id) : getDocumentCenterY() - getCenterYById(id);
	getNodeById(id).style.left = Math.round(Math.max(0, modLeft)) + 'px';
	getNodeById(id).style.top = Math.round(Math.max(0, modTop)) + 'px';
}

function setElementSizeToViewportById(id) {
	if(getNodeById(id) != null) {
		setWPXById(id, getViewportW());
		setHPXById(id, getViewportH());
	}
}

function setElementSizeToDocumentById(id) {
	if(getNodeById(id) != null) {
		setWPXById(id, Math.max(getViewportW(), getDocumentW()));
		setHPXById(id, Math.max(getViewportH(), getDocumentH()));
	}
}


// Enable/Disable utilities
function enableNodeById(id) {
	getNodeById(id).disabled = false;
}

function disableNodeById(id) {
	getNodeById(id).disabled = true;
}

function toggleDisableNodeById(id) {
	var node = getNodeById(id);
	node.disabled = ( node.disabled == true ) ? false : true;
}


// Mouse Move/Drag/Drop utilities
function captureMouseMove(evt) {
	setElementSizeToDocumentById('canopyContainer');
	if(document.dragdropObj != null) {
		var dragobj = document.dragdropObj;
		var crntX = evt.clientX + getScrollX();
		var crntY = evt.clientY + getScrollY();
		var xdiff = crntX - dragobj.startMouseX;
		var ydiff = crntY - dragobj.startMouseY;
		if(!(Math.abs(xdiff) > 2 || Math.abs(ydiff) > 2)) return false; // if position hasn't moved at least 2 pixels don't drag yet
		
		// move drag container
		with(dragobj.dragee.style) {
			left = Math.max(0, dragobj.startX + xdiff) + 'px';
			top = Math.max(0, dragobj.startY + ydiff) + 'px';
		}
		if(!dragobj.active) {
			dragobj.active = true;
			if(dragobj.drop) dragobj.dragee.style.display = 'block';
		}
		deselectAllText();

		// check to see if over drop zone
		if(dragobj.drop) {
			var dropTargets = getDropTargetNodes();
			for(var i=dropTargets.length-1; i>=0; i--) { // reverse loop for speed
				if(dropTargets[i].style.display!='none') { // filter hidden drop targets
					var objPos = getXY(dropTargets[i]);
					var dropTargetX1 = objPos[0];
					var dropTargetY1 = objPos[1];
					var dropTargetX2 = dropTargetX1 + dropTargets[i].offsetWidth;
					var dropTargetY2 = dropTargetY1 + dropTargets[i].offsetHeight;
					if((crntX > dropTargetX1 && crntX < dropTargetX2) && (crntY > dropTargetY1 && crntY < dropTargetY2)) {
						if(dragobj.selectedTarget && dragobj.selectedTarget != dropTargets[i]) {
							dragobj.selectedTarget.className = dragobj.selectedTarget.className.replace("selectedDropTarget","");
						}
						if(dropTargets[i].className.indexOf("selectedDropTarget") < 0) {
							dragobj.selectedTarget = dropTargets[i];
							dropTargets[i].className += " selectedDropTarget";
						}
						break;
					}
					else if(dragobj.selectedTarget && dragobj.selectedTarget == dropTargets[i]) {
						dragobj.selectedTarget = null;
						dropTargets[i].className = dropTargets[i].className.replace("selectedDropTarget","");
					}
				}
			}
		}
	}
}

function captureMouseUp(evt) {
	var resizeOverlay = document.getElementById("resizeOverlay");
	if(resizeOverlay && resizeOverlay.resizing == true) {
		resizeOverlay.style.visibility = "hidden";
		resizeOverlay.resizing = false;
		return;
	}
	if(document.dragdropObj != null) {
		deselectAllText();
		if(document.dragdropObj.drop) {
			if(document.dragdropObj.active) {
				document.dragdropObj.dragee.style.display = 'none';
				var dropTargets = getDropTargetNodes();
				for(var counter=0; counter<dropTargets.length; counter++) {
					var evtClientX = evt.clientX + getScrollX();
					var evtClientY = evt.clientY + getScrollY();
					if(dropTargets[counter].style.display!='none') {
						var objPos = getXY(dropTargets[counter]);
						var dropTargetX1 = objPos[0];
						var dropTargetY1 = objPos[1];
						
						var dropTargetX2 = dropTargetX1 + dropTargets[counter].offsetWidth;
						var dropTargetY2 = dropTargetY1 + dropTargets[counter].offsetHeight;
						var wasInside = false;
						if((evtClientX > dropTargetX1 && evtClientX < dropTargetX2) && (evtClientY > dropTargetY1 && evtClientY < dropTargetY2)) {
							document.dragee = document.dragdropObj.dragee;
							document.dropee = dropTargets[counter];
							var dropAction = eval(dropTargets[counter].getAttribute('dropAction'));
							dropAction();
							wasInside = true;
							break;
						}
					}
				}
			}
		}
		document.dragdropObj = null;
		setTextById('dragee', '');
	}
}

function captureMouseDown(evt) {
}

function startDragDrop(evt, source, dragee, drop) {
	var groupPane = getNodeById('groupPane');
	if(groupPane && groupPane.isHidden) return; // if groups are hidden don't drag

	// filter left mouse click
	if(document.all) var clckBtn = window.event.button;
	else var clckBtn = evt.which;
	if(clckBtn != 1) return;
	
	// create drag object
	var scrollX = getScrollX();
	var scrollY = getScrollY();
	var dragdropObj = new Object();
	dragdropObj.active = false;
	dragdropObj.drop = drop;
	dragdropObj.dragee = getNodeById(dragee);
	dragdropObj.startMouseX = Math.round(evt.clientX + getScrollX());
	dragdropObj.startMouseY = Math.round(evt.clientY + getScrollY());
	var tblPos = getXY((drop) ? source.parentNode.parentNode : source);
	dragdropObj.startX = tblPos[0];
	dragdropObj.startY = tblPos[1];
	document.dragdropObj = dragdropObj;
	
	if(drop) {
		if(isIE) dragdropObj.dragee.style.filter = "alpha(opacity=30)"; // IE does it own transparency model - include it with js so css validates
		// remove current content from drag layer
		while(dragdropObj.dragee.childNodes.length > 0) {
			dragdropObj.dragee.removeChild(dragdropObj.dragee.childNodes[0]);
		}

		// add base table to drag layer
		var table = document.createElement("table");
		table.id = "dragtable";
		table.appendChild(source.parentNode.parentNode.getElementsByTagName("thead")[0].cloneNode(true));
		var tbody = document.createElement("tbody");
		table.appendChild(tbody);
		dragdropObj.dragee.appendChild(table);

		// set table width (bugs appear if not fixed width)
		var gridContainer = getNodeById('gridContainer');
		if(!gridContainer) {
			gridContainer = source.parentNode.parentNode.parentNode;
		}
		table.style.width = getWById(gridContainer.id) + "px";
		

		// add rows to drag layer
		var sourceContainerChildren = source.parentNode.childNodes;
		var rowCount = sourceContainerChildren.length;
		for(var counter=0; counter<rowCount; counter++) {
			if(sourceContainerChildren[counter].nodeType == 1) {
				if(sourceContainerChildren[counter].selected == true || sourceContainerChildren[counter] == source) {
					var siblingClone = sourceContainerChildren[counter].cloneNode(true);
					testvar = dragdropObj.dragee.getElementsByTagName('tbody').length;
					dragdropObj.dragee.getElementsByTagName('tbody')[0].appendChild(siblingClone);
				}
				else {
					var tr = document.createElement("tr");
					var td = document.createElement("td");
					tr.className = "dummy";
					td.innerHTML = "<span class=\"listIcon\"></span><span>&nbsp;</span>";
					tr.appendChild(td);
					dragdropObj.dragee.getElementsByTagName('tbody')[0].appendChild(tr);
				}
			}
		}
	}
}

function captureResize(evt) {
	setElementSizeToDocumentById('canopyContainer');
}

function registerDropTargets() {
	if(document.dropTargets == null) {
		document.dropTargets = new Array();
	}
	for(var counterA=0; counterA<arguments.length; counterA++) {
		var doRegister = true;
		for(var counterB=0; counterB<document.dropTargets.length; counterB++) {
			if(arguments[counterA] == document.dropTargets[counterB]) {
				doRegister = false;
			}
		}
		if(doRegister) {
			document.dropTargets.push(arguments[counterA]);
		}
	}
}

function getDropTargetNodes() {
	if(document.dropTargets == null) {
		document.dropTargets = new Array();
	}
	var dropTargetNodes = new Array();
	for(var counter=0; counter<document.dropTargets.length; counter++) {
		if(getNodeById(document.dropTargets[counter]) != null) {	
			dropTargetNodes.push(getNodeById(document.dropTargets[counter]));
		}
	}
	return dropTargetNodes;
}


// Strings, text range and context utilities
function getString(key) {
	var value = strings[key];	
	if(!value) {
		value = '*' + key + '*';
	}	
	return value;
}

function deselectAllText() {
	var selObj = null;
	try {
		selObj = getSelection();
	}
	catch(e) {
		try {			
			selObj = document.selection;
		}
		catch(e) {
			try {
				selObj = document.getSelection();
			}
			catch(e) {
				selObj = null;
			}
		}
	}
	if(selObj != null) {
		try {
			selObj.removeAllRanges();
		}
		catch(e) {
			try {
				selObj.empty();
			}
			catch(e) {
				selObj = null;
			}
		}
	}
}

// Form utilities
function submitFormOnEnter(field,event) {
	var keyCode = event.keyCode ? event.keyCode : event.which ? event.which : event.charCode;
	if(keyCode == 13) {
		field.form.submit();
	}
}

function selectSingleDropdownbyValue(obj, val) {
	for(var counter=0; counter<obj.options[counter]; counter++) {
		if(obj.options[counter].value == val) {
			obj.options[counter].selected = true;
		}
	}
}
