var debugMode = false;

/**
 * Converts a form to a post-string (&-delimited) so that the form can be posted by an ajax request
 * (See replaceInnerHTML / replaceInnerHTMLAsync
 */
function buildPostString(form) {
	if (typeof(form)=="undefined" || form==null || typeof(form.elements) == "undefined" || form.elements.length == 0) {
		return null;
	} 
	var postString = "";
	for (var i=0; i<form.elements.length; i++) {
		var elem = form.elements[i];		
		if (!elem.disabled) {
			if ((elem.type == "submit" && elem.name == "") || (elem.type == "file") || ((elem.type == "radio" || elem.type == "checkbox") && !elem.checked)) {
				continue;
			} 
			if (i>0) {
				postString = postString + "&";
			}								
			postString = postString + elem.name + "=" + encodeURIComponent(elem.value);
			
		}
	}
	return postString;
}

function getRequest() {

	var requestObject;
	if (window.XMLHttpRequest) {
		requestObject = new XMLHttpRequest();
	}
	else {
		try {
			requestObject = new ActiveXObject("Msxml2.XMLHTTP");

		}
		catch (e) {
			requestObject = new ActiveXObject("Microsoft.XMLHTTP");
		}
	}
	return requestObject;
}

function replaceInnerHTMLWithContent(elementId, content) {
	var partRoot = document.getElementById(elementId);
	if (partRoot) {		
		partRoot.innerHTML = content
		/* Search for script tags */
		evalJS(partRoot);
	}
}

/* Evaluate all <script>-tags inside the given element */
function evalJS(element) {
	var scripts = element.getElementsByTagName("script");
	var i;
	for(i=0; i<scripts.length; i++) {
		eval(scripts[i].text.replace(/^\s*\<\!\-\-/,""));
	}
}

/**
 *  ElementId: Zu ersetzendes Element
 *  URL: URL des AJAX-Requests
 *  errorHandler: Funktion, die im Fehlerfall aufgerufen wird
 *  formToPost: Formular-Element (nicht ID), das gesendet werden soll.
 *  stateDisplay: ID des Elements, dass das andauern des AJAX-Requests anzeigt
 *  stateDisplayContent: Inhalt, der in das stateDisplay für die Zeit des Requests eingesetzt wird.
 **/
function replaceInnerHTMLAsync(elementId, url, errorHandler, formToPost, stateDisplayId, stateDisplayContent) {
	var postString = buildPostString(formToPost);
	if (debugMode) {
		alert(postString);
		alert(url);	
		if (!confirm("AJAX?")) {
			document.location.href=url+"?"+postString;
			return false;
		}
	}
	
	var req = getRequest();
	var stateDisplay = document.getElementById(stateDisplayId);
	if (stateDisplay) { /* Update state display */
		stateDisplay.innerHTML = stateDisplayContent;
	} 

	if (postString!=null) {
		req.open("POST", url, true);
	    req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    	req.setRequestHeader("Content-length", postString.length);
	} else {
		req.open("GET", url, true);
	}
	req.setRequestHeader("X-IV-RequestSource","ajax");
	req.send(postString);
	req.onreadystatechange = function() {
		if (req.readyState == 4) {
			if (stateDisplay) {
				stateDisplay.innerHTML = "";
			}
            if (req.status == 200) {
				replaceInnerHTMLWithContent(elementId,req.responseText);
            } else if (205 == req.status) {
            	callTimeoutHandler(req);
            } else {
				callErrorHandler(errorHandler, req);
            }
        }
	}
}



function replaceInnerHTML(elementId, url, errorHandler, formToPost) {

	var postString = buildPostString(formToPost);
	var req = getRequest();
	if (postString!=null) {
		req.open("POST", url, false);
	    req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    	req.setRequestHeader("Content-length", postString.length);
	} else {
		req.open("GET", url, false);
	}
	req.setRequestHeader("X-IV-RequestSource","ajax");
	req.send(postString);	
	//alert(req.status);
	if (200 == req.status) {
		replaceInnerHTMLWithContent(elementId,req.responseText);
	} else if (205 == req.status) {
		callTimeoutHandler(req);
	} else {
		callErrorHandler(errorHandler, req);
	}
}


function explain(explainHref, nnHref) {
	var req = getRequest();
	req.open("GET", explainHref, false);
	req.setRequestHeader("X-IV-RequestSource","ajax");
	req.send(null);
	if (200 == req.status) {
		var errors = req.responseXML.getElementsByTagName('error');
		if (errors && errors.length>0) {
			alert('Error: ' + errors[0].firstChild.data);
		}
        var topics = req.responseXML.getElementsByTagName('topic');
        if (topics.length > 0) {
	        var nnLoader = new NNLoader(nnHref);
	        var selectedNodes = new Array();
		    for (var i = 0; i < topics.length; i++) {
		    	var nodeId = topics[i].getAttribute('id')
		    	
		    	nnLoader.addStartNodeId(nodeId);
		    	
		    	if (topics[i].getAttribute('selected') == 'true') {
		    		selectedNodes.push(nodeId);
		    	}
	        }
	        
	        if (selectedNodes.length > 0) {
	        	var selectedNodesString = selectedNodes.join(';');
	        	
		        nnLoader.callback(function(nnApplet) {
		        	nnApplet.setNodesToSelect(selectedNodesString);
		        });
		    } else {
		    	nnLoader.load();
		    }
        }
		return true;
	}
	else {
		return false;
	}
}

function fireAndForget(url) {
	var req = getRequest();
	req.open("GET", url, true);
	req.setRequestHeader("X-IV-RequestSource","ajax");
	req.send(null);
	req.onreadystatechange = function() {
		if (req.readyState == 4) {
            if (req.status == 200) {
            } else if (205 == req.status) {
            	callTimeoutHandler(req);
            } else {
				callErrorHandler(errorHandler, req);
            }
        }
	}
}




var openedPopups = new Object();
var undefValue;

function registerPopup(popupId, popupElem) {
	openedPopups[popupId] = popupElem;
}

function removePopups() {
	for (var popupId in openedPopups) {
		var popupElem = openedPopups[popupId];
		if (popupElem && popupElem.parentNode) {
			popupElem.parentNode.removeChild(popupElem);
		}
	}
	openedPopups = new Object();
}

function removePopup(popupId) {
	if (openedPopups[popupId]) {
		var popupElem = openedPopups[popupId];
		if (popupElem && popupElem.parentNode) {
			popupElem.parentNode.removeChild(popupElem);
		}
		openedPopups[popupId] = undefValue;
	}
}

function parseError(xmlContent) {
	if (xmlContent.firstChild && xmlContent.firstChild.tagName=="parsererror") return true;
	if (xmlContent.parseError && xmlContent.parseError.errorCode!=0) return true;
	return false;
}


function imageTag(url) {
	return "<img src='"+url+"'>"
}

function reloadOrPopup(url, insertPopupBeforeElem, errorHandler, formToPost) {
	if (debugMode) {	
		if (!confirm("AJAX?")) {
			document.location.href=url;
			return false;
		}
	}
	var req = getRequest();
	sendReloadOrPopup(req,url,formToPost,false);
	reloadOrPopupCallback(req,insertPopupBeforeElem, errorHandler);	
}


function reloadOrPopupAsync(url, insertPopupBeforeElem, errorHandler, formToPost) {
	if (debugMode) {	
		if (!confirm("AJAX?")) {
			document.location.href=url;
			return false;
		}
	}

	showGlasspane();


	var req = getRequest();
	req.onreadystatechange = function() {
		if (req.readyState == 4) {
			hideGlasspane();
			reloadOrPopupCallback(req,insertPopupBeforeElem, errorHandler);
		}
	};
	sendReloadOrPopup(req,url,formToPost,true);
	
}

function sendReloadOrPopup(req,url,formToPost,async) {
	var postString = buildPostString(formToPost);	
	if (postString!=null) {
		req.open("POST", url, async);
	    req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    	req.setRequestHeader("Content-length", postString.length);
	} else {
		req.open("GET", url, async);
	}
	req.setRequestHeader("X-IV-RequestSource","ajax");
	req.send(postString);
}


function innerText(element) {
	var content = element.text;
	if (!content) {
		content = element.textContent;
	}
	return content;		
}

function reloadOrPopupCallback(req, insertPopupBeforeElem, errorHandler) {
	if (200 == req.status) {
		saveScrollbars();
		var xmlContent = req.responseXML;
		if (parseError(xmlContent)) {
			alert("Parse error while retrieving AJAX-Response");
			window.document = xmlContent;
		}
		var rootNode = xmlContent.firstChild;
		if (rootNode.tagName=="root") {
			var children = rootNode.childNodes;
			for (var i=0; i<children.length; i++) {
				var tagName = children[i].tagName; 
				if (tagName=="popup") {
					handlePopupNode(children[i],insertPopupBeforeElem);
				} else if(tagName=="reload") {
					handleReloadNode(children[i]);
				} else if(tagName=="closePopup") {
					handleClosePopupNode(children[i]);
				}
			}
		} else {
			alert("ReloadOrPopup-Content did not contain a <root>-node");
		}
		restoreScrollbars();
	} else {
		callErrorHandler(errorHandler, req);
	}		
}

function handlePopupNode(popupElement,insertPopupBeforeElem) {				
	var popupId = popupElement.getAttribute("id");			
	var popupContent = innerText(popupElement);
	if (popupContent) {
		var popupDiv = document.getElementById(popupId);							
		if (!popupDiv && insertPopupBeforeElem) {
			removePopup(popupId);
			var newElem = document.createElement("div");
			newElem.setAttribute("id", popupId);
			insertPopupBeforeElem.parentNode.insertBefore(newElem, insertPopupBeforeElem);
			var classValue = popupElement.getAttribute("class");
			if (classValue) {
				newElem.className = classValue;
			}							
			popupDiv = newElem;
			registerPopup(popupId, popupDiv);
		}
		popupDiv.innerHTML = popupContent;
		/* Evaluate JavaScript inside popup-div */
		evalJS(popupDiv);				
		positionIntoVisible(popupDiv);
	}
}

function handleReloadNode(reloadElement) {			
	var reloadDivId = reloadElement.getAttribute("id");
	reloadContent = innerText(reloadElement);
	//alert(reloadContent);
	if (reloadDivId && reloadDivId != '' && reloadContent) {
		replaceInnerHTMLWithContent(reloadDivId,reloadContent);
	}
}

function handleClosePopupNode(closePopupElement) {			
	var popupId = closePopupElement.getAttribute("id");
	//alert(reloadContent);
	if (popupId && popupId != '') {
		removePopup(popupId);
	}
}



function selectWithReloadOrPopup(selectHref, selectFormFieldId, errorHandler) {
	var selectFormField = document.getElementById(selectFormFieldId);
	var value = selectFormField.value;
	if (value && value != '') {
		selectHref = selectHref+'&index='+value;
		reloadOrPopupAsync(selectHref, null, errorHandler);
	}
}

function callErrorHandler(errorHandler, request) {
	if (typeof errorHandler == "undefined" || !errorHandler) {
		defaultErrorHandler(request);
	} else {
		errorHandler(request);
	}
}

function defaultErrorHandler(request) {	
	alert("Error performing ajax request: "+request.statusText);
	removePopups();
}

function callTimeoutHandler(req) {
	if (typeof ajaxTimeoutHandler == "undefined" || !ajaxTimeoutHandler) {
		defaultErrorHandler(req);
	} else {
		ajaxTimeoutHandler(req);
	}
}

function setTimeoutHandler(handler) {
	ajaxTimeoutHandler = handler;
}


/**
 *	Die Funktion "submitForm" führt ein Absenden von Formulardaten analog zum Submit-Button 
 *	durch. Vor dem Absenden des Formulars wird der Event-Handler "onsubmit" aufgerufen. Liefert 
 *  dieser true zurück, wird das Formular abgesendet. Liefert der Event-Handler false zurück, 
 *  wird das Formular nicht abgesendet.
 **/ 
function submitForm(form) {
	if (form==null) {
		return false;
	}
	if (form.onsubmit()) {
		form.submit();
	}
}

function updateAfterConfirm(text,actionURL) {
	if (!confirm(text)) {
		return false;
	}
	document.location.href = actionURL;
}

var selectVisibilityState;
var selectElements;
function hideSelectElements() {
	selectElements = document.getElementsByTagName("select");
	selectVisibilityState = Array();
	for (var i=0; i<selectElements.length; i++) {
		selectVisibilityState[i] = selectElements[i].style.visibility;
		selectElements[i].style.visibility = "hidden";
	}
}

function restoreSelectElements() {
	for (var i=0; i<selectElements.length; i++) {
		selectVisibilityState.push(selectElements[i].style.visibility);
		selectElements[i].style.visibility = selectVisibilityState[i];
	}
	selectElements = Array();
	selectVisibilityState = Array();
}

function showGlasspane() {
	var glasspane = document.getElementById("glasspane");
	hideSelectElements();
	glasspane.style.height = document.documentElement.scrollHeight+"px";
	glasspane.style.width = document.documentElement.scrollWidth+"px";
	glasspane.style.visibility = "visible";
	var messageBox = document.getElementById("workingMessageBox");
	var innerHeight = window.innerHeight ? window.innerHeight : document.body.clientHeight ;
	var innerWidth = window.innerWidth ? window.innerWidth : document.body.clientWidth ;
	var ypos = document.documentElement.scrollTop + (innerHeight - messageBox.offsetHeight)/2;
	var xpos = document.documentElement.scrollLeft + (innerWidth - messageBox.offsetWidth)/2;
	 
	messageBox.style.left = xpos + "px";
	messageBox.style.top = ypos + "px";
	messageBox.style.visibility = "visible";
}

function hideGlasspane() {
	var glasspane = document.getElementById("glasspane");
	restoreSelectElements();
	glasspane.style.visibility = "hidden";
	glasspane.style.width="0px";
	glasspane.style.height="0px";
	var messageBox = document.getElementById("workingMessageBox");
	messageBox.style.visibility = "hidden";
}

function expandCollapseElem(targetElemId) {
	var targetElem = $(targetElemId);
	new Effect.toggle(targetElem, 'blind', {duration:0.3});
	return targetElem;
}

function expandCollapse(iconElem, targetElemId, expandedOverSrc, expandedOutSrc, collapsedOverSrc, collapsedOutSrc) {
	var targetElem = expandCollapseElem(targetElemId);
	if (!targetElem.visible()) {
		iconElem.onmouseover = function() {
			iconElem.src=expandedOverSrc;
		}
		iconElem.onmouseout = function() {
			iconElem.src=expandedOutSrc;
		}
		iconElem.src = expandedOverSrc;
			
	} else {
		iconElem.onmouseover = function() {
			iconElem.src=collapsedOverSrc;
		}
		iconElem.onmouseout = function() {
			iconElem.src=collapsedOutSrc;
		}
		iconElem.src = collapsedOverSrc;
	}
}


function deleteByDmid(deleteDmid,confirmMsg,referrerDmid) {
	if (confirm(confirmMsg)) {
		document.location.href = "deleteByDmid.skat?dmid="+deleteDmid+"&referrerDmid="+referrerDmid;
	}
}

function confirmCloseWindow(confirmMsg) {
	if (confirm(confirmMsg)) {
		window.close();		
	} 
	return false;

}



function createTooltip(elementId, tooltipClassName) {
	var tooltip = $("tooltip_"+elementId);
	new Tip(elementId,
		   	tooltip,
		    { className: tooltipClassName }
		   );
	tooltip.style.display = "block";
}	


/** 
 * Perform the given AJAX-Action (asynchronously with a wait-cursor)
 * and then reload the current page.
 * Only one action can be performed at a time. 
 **/
var reloadActive = false;
function executeActionScript(requestUrl,element,errorHandler) {
	if (reloadActive) return false;
	reloadActive = true;
	var url = document.location.href;
	showWaitCursor(element);
	var req = getRequest();
	req.onreadystatechange = function() {
		if (req.readyState == 4) {
			if (req.status == 200) {
				eval(req.responseText);
	        } else if (205 == req.status) {
	        	callTimeoutHandler(req);
	        } else {
				callErrorHandler(errorHandler, req);
				reloadActive = false;
	        }        
		}		
	};
	
	req.open("GET", requestUrl, true);
	req.setRequestHeader("X-IV-RequestSource","ajax");
	req.send(null);
		
}
