var waitCursorElements = new Array();
var waitCursorElementStyles = new Array();

function showWaitCursor(elem) {	
	waitCursorElements.push(elem);
	waitCursorElementStyles.push(elem.style.cursor);
	window.setTimeout("removeWaitCursors()",2000);
	
	document.body.style.cursor = "wait";
	elem.style.cursor = "wait";
}

function removeWaitCursors() {
	while(waitCursorElements.length > 0) {
		elem = waitCursorElements.shift();
		elem.style.cursor = waitCursorElementStyles.shift();
	}
	document.body.style.cursor = "";
}

function openWindow(windowURL, windowName, width, height, x, y, isResizable, showScrollbars, showMenubar, showToolbar) 
{			
	var winParamString = 'dependent=yes,';		
	if (isResizable)
		winParamString = winParamString + 'resizable=yes,';
	else
		winParamString = winParamString + 'resizable=no,';
		
	if (showScrollbars)
		winParamString = winParamString + 'scrollbars=yes,';
	else
		winParamString = winParamString + 'scrollbars=no,';
		
	if (showMenubar)
		winParamString = winParamString + 'menubar=yes,';
	else
		winParamString = winParamString + 'menubar=no,';
		
	if (showToolbar)
		winParamString = winParamString + 'toolbar=yes,';
	else
		winParamString = winParamString + 'toolbar=no,';
					
	winParamString = winParamString + 'width=' + width + ',height=' + height + ",top="+y+",left="+x;
	var newWindow = window.open(windowURL, windowName, winParamString);
	newWindow.focus();		
	return newWindow;
}

// openCenteredWin öffnet ein Fenster zentriert auf dem Screen

function openCenteredWin (windowURL, name, width, height, isResizable, showScrollbars, showMenubar, showToolbar) 
{
	var x,y;	
	x = screen.width/2-(width/2);
	y = screen.height/2-(height/2);
	// Bei zu großen Fenstern muss verhindert werden, dass der Fensterrand außerhalb des sichtbaren Bereichs 
	// des Screen positioniert wird.
	if (x < 0)
		x = 0;
	if (y < 0)
		y = 0;
	
	newWindow = openWindow(windowURL, name, width, height, x, y, isResizable, showScrollbars, showMenubar, showToolbar);
	return newWindow;
}

// "getURLParameter" liefert den Wert des URL-Parameters mit dem angegebenen Namen zurück
// oder null, falls der Parameter nicht gefunden wird

function getURLParameter (paramName) {	
	var regexp = new RegExp(paramName);	
	var params = window.location.search;
	var index = params.search(regexp);	
	if (index > -1) {
		var valueString = params.substr(index+paramName.length+1);		
		var endpos = valueString.indexOf('&');
		if (endpos > -1) {
			return decodeURIComponent(valueString.substring(0,endpos));
		} 		
		return decodeURIComponent(valueString);
	}
	return null;
}

function openEditWindow(href, windowName) {
	return openCenteredWin(href,windowName,630,700,true,false,false,false);
}

function trim(s) {
  while (s.substring(0,1) == ' ') {
    s = s.substring(1,s.length);
  }
  while (s.substring(s.length-1,s.length) == ' ') {
    s = s.substring(0,s.length-1);
  }
  return s;
}

function getChildNodesXML(node, getNodeXMLFunction) {
	var xml = '';
	doForEach(node.childNodes, function(childNode) {
		xml = xml + getNodeXMLFunction(childNode);
	});
	return xml;
}

function innerXML(node) {
	if(node.innerXML){
		return node.innerXML;
	}else if (node.xml) {
		// collect the outer XML of all child nodes	
		return getChildNodesXML(node, function(childNode) { return childNode.xml });
	}else if(typeof XMLSerializer != "undefined"){
		// collect the serialized outer XML of the child nodes
		return getChildNodesXML(node, function(childNode) { return (new XMLSerializer()).serializeToString(childNode) });
	}
}

function doForEach(array, functor) {
	for (var i=0; i<array.length; i++) {
		functor(array[i]);
	}
}

/**
 * Funktion "positionIntoVisible" 
 * Diese Funktion verschiebt das angegebene Element, so dass dieses in dem für den Benutzer
 * gerade sichtbaren Ausschnitt der Website im Browserfenster, möglichst nah an der
 * ursprünglichen Elementposition (top/left) angezeigt wird. Funktioniert für IE und Mozilla.
 **/

function positionIntoVisible(elem) {
	var innerWidth = innerWidth ? innerWidth : document.documentElement.clientWidth;
	var innerHeight = innerHeight ? innerHeight : document.documentElement.clientHeight;
	var origX = findPosX(elem);
	var origY = findPosY(elem);
	var parentX = findPosX(elem.offsetParent);
	var parentY = findPosY(elem.offsetParent);
	var offsetToParentLeft = origX - parentX;
	var offsetToParentTop = origY - parentY;
	var visibleTop = document.documentElement.scrollTop;
	var visibleLeft = document.documentElement.scrollLeft;
	var newOffsetLeft = offsetToParentLeft;
	var newOffsetTop = offsetToParentTop;
	var rightOverhead = (origX + elem.offsetWidth) - (visibleLeft + innerWidth);	
	if (rightOverhead > 0) {
		newOffsetLeft = offsetToParentLeft - rightOverhead;
		if (newOffsetLeft * -1 > parentX) {
			newOffsetLeft = parentX * -1;
		}
		elem.style.left = newOffsetLeft + "px";
	}
	var bottomOverhead = (origY + elem.offsetHeight) - (visibleTop + innerHeight);
	if (bottomOverhead > 0) {
		newOffsetTop = offsetToParentTop - bottomOverhead;
		if (newOffsetTop * -1 > parentY) {
			newOffsetTop = parentY * -1;
		}
		elem.style.top = newOffsetTop + "px";
	}	
}

/**
 *	Liefert die absolute X-Position eines Elementes innerhalb eines Frames
 */
function findPosX(obj)
{
	var curleft = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curleft += obj.offsetLeft
			obj = obj.offsetParent;
		}
	}
	else if (obj.x)
		curleft += obj.x;
	return curleft;
}


/**
 *	Liefert die absolute Y-Position eines Elementes innerhalb eines Frames
 */
function findPosY(obj)
{
	var curtop = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curtop += obj.offsetTop
			obj = obj.offsetParent;
		}
	}
	else if (obj.y)
		curtop += obj.y;
	return curtop;
}
