var oRequest = false;			// object waarin de response vaan het httprequest staat
var hFunction = false;			// de functie die uitgevoerd moet worden nadat de aanvraag is verwerkt
var hMarkFunction = false;		// de functie om eventuele fouten velden in het formulier te markeren
var aBuffer = new Array();		// een buffer voor als er aanvragen binnenkomen terwijl de vorige nog niet verwerkt zijn
var hCloseFormFunction = false;	// de functie om het formulier te sluiten
var aFormErrorFields = false;	// een array waarin alle foutgemarkeerde velden in kunnen worden opgeslagen		
var hTimeout = false;			// de handle naar de timeout
var bSite = false;				// zitten we in de site of in het beheer systeem
var iWaitCondition	= 0			// 0 = alle verzoeken zijn afgehandeld
								// 1 = verzoek is minder dan 50 miliseconden geleden verstuurd
								// 2 = verzoek is langer dan 50 miliseconden, mider lang dan 2 seconden geleden verstuurd
								// 3 = verzoek is langer dan 2 seconden geleden verstuurd
var iAjaxRetry = 0;				// aantal keren dat hetzelfde verzoek al is verzonden
var aCurrentRequest = false;	// eigenschappen van het huidige request
var iRequestCounter = 0;		// aantal verzonden verzoeken
var iRequestFailedCounter = 0;	// aantal verzoeken niet op tijd terug
var bSkipClosing = false;		// als deze op true staat wordt het formulier niet gesloten na opslaan

// document.onselectstart = new Function ("return false");

if (window.sidebar){
	document.onmousedown = disableText;
	document.onclick = enableText;
}

// -- Documented -- //

function ajaxRetry() {
	iAjaxRetry++;
	if (aCurrentRequest) {
		if (iAjaxRetry < 4) {
			hFunction = false;
			requestXML(aCurrentRequest[0], aCurrentRequest[1], aCurrentRequest[2], aCurrentRequest[3]);
		} else {
			iRequestFailedCounter++;
			// procesError("ajaxRetry", 1, "verzoek na 3 maal nog niet ontvangen");
		}
	}
}

function ajaxWait(a_iCondition) {
	if (a_iCondition < 0 || a_iCondition > 3) return procesError("ajaxWait", 1, "parameter had waarde '" + a_iCondition + "', enig toegstane waarden zijn 0, 1, 2 en 3");
	iWaitCondition = a_iCondition
	if (iWaitCondition == 0) {
		if (hTimeout) {
			clearTimeout(hTimeout);
			hFunction = false;
			hMarkFunction = false;
			oRequest = false;
			aCurrentRequest = false;
		}
		ajaxWaitCustom(0);
		iAjaxRetry = 0;
	}
	if (iWaitCondition == 1) {
		hTimeout = setTimeout("ajaxWait(2)", 50);
		ajaxWaitCustom(1);
	}
	if (iWaitCondition == 2) {
		hTimeout = setTimeout("ajaxWait(3)", 5000);
		ajaxWaitCustom(2);
	}
	if (iWaitCondition == 3) {
		ajaxRetry();
		ajaxWaitCustom(3);
	}
}

function processRequestReadyStateChange() {
	if (oRequest.readyState == 4) {
		if (oRequest.status == 200) {
			if (oRequest.responseText.substring(0, 5) == "<?xml") {
				oXML = oRequest.responseXML;
				if (getNodeValue(oXML, "login") == "true") {
					document.onmousedown = enableText;
					aBuffer == new Array();
					ajaxWait(0);
					setSystem("Login");
					return false;
				}
				if (getNodeValue(oXML, "duplicate") > 0) {
					alert(oRequest.responseText);
					return false;
				}
			}
			eval(hFunction(oRequest));
			ajaxWait(0);
			if (aBuffer.length > 0) {
				aCommand = aBuffer.shift();
				hMarkFunction = aCommand[4];
				hCloseFormFunction = aCommand[5];
				requestXML(aCommand[0], aCommand[1], aCommand[2], aCommand[3]);
			}
		} else {
			procesError("procesRequesReadyStateChange", 1, "status is ongelijk aan 200, nl " + oRequest.status);
		}
	}
}

function requestXML(a_sURL, a_sContent, a_hFunction, a_bXML) {
	ajaxWait(1);
	a_sURL = 'http://www.badhotelscheveningen.nl/wrapper/wrapper.php';
	if (typeof(a_sContent) != "string") return procesError("requestXML", 2, "a_sContent is geen string (a_sContent: " + a_sContent + ")");
	if (typeof(a_hFunction) != "function") return procesError("requestXML", 2, "a_hFunction is geen functie");
	if (!hFunction) {
		iRequestCounter++;
		oRequest = false;
		aCurrentRequest = new Array(a_sURL, a_sContent, a_hFunction, a_bXML);
		if (window.XMLHttpRequest) { // Mozilla, Safari,...
		    oRequest = new XMLHttpRequest();
		} else if (window.ActiveXObject) { // IE
		    try {
		    	oRequest = new ActiveXObject("Msxml2.XMLHTTP");
			} catch (e) {
		        try {
		        	oRequest = new ActiveXObject("Microsoft.XMLHTTP");
		    	} catch (e) {}
			}
		}
		if (!oRequest) {
			alert('Cannot create XMLHTTP instance');
		}
		
		hFunction = a_hFunction;
		oRequest.onreadystatechange = processRequestReadyStateChange;
		oRequest.open('POST', a_sURL);
		
		oRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		
		oRequest.send(a_sContent);
	} else {
		aBuffer[aBuffer.length] = new Array(a_sURL, a_sContent, a_hFunction, a_bXML, hMarkFunction, hCloseFormFunction);
	}
}
						
// -- Not documented -- //

// Pre:		sClassName is de naam van de klasse waarvan het aan te maken object is
//			sFormName is de naam van het formulier waarin alle informatie staat om het object te maken
// Post:	Het object is aangemaakt
// Return:	-
// TODO:	lijkt nog nergens op
function newItem(a_sClassName, a_sFormName, a_hFunction) {
	requestXML('wrapper.php', 'action=new&sClassName=' + a_sClassName, a_hFunction);
}
						

// Pre:		sClassName is de naam van de klasse waarvan het te wijzigen object is
//			sFormName is de naam van het formulier waarin alle informatie staat om het object te maken
// Post:	Het object is gewijzigd
// Return:	-
// TODO:	lijkt nog nergens op
function editItem(a_sClassName, a_sFormName, a_hFunction, a_iId) {
	requestXML('wrapper.php', 'action=edit&sClassName=' + a_sClassName + '&iId=' + a_iId, a_hFunction);
}

// Pre:		sClassName is de naam van de klasse waarover het formulier gaat
//			sFormName is de naam van het formulier waarin alle informatie staat
// Post:	Het formulier is geconroleerd en eventueel opgeslagen
// Return:	-
function checkAndStore(sClassName, sFormName, a_hMarkFunction) {
	setWait2(true);
	aChildren = getFormFields(sFormName);
	sPost = "";
	for (iCounter = 0; iCounter < aChildren.length; iCounter++) {
		oChild = aChildren[iCounter];
		if (oChild.type != "button" && oChild.className.indexOf("ignore") == -1) {
			if (oChild.type != "checkbox") sPost += oChild.name + "=" + oChild.value + "&";
			else sPost += oChild.name + "=" + (oChild.checked ? "y" : "n") + "&";
		}
	}
	sPost += "action=check&sClassName=" + sClassName;
	hMarkFunction = a_hMarkFunction;
	requestXML('wrapper/wrapper.php', sPost, markOrStore, true);
}


// Pre:		a_oRequest.responseXML is een XML waarin de zowel de fouten van het formulier als de naam van het
//			formulier staan.
// Post:	Als er geen fouten gevonden zijn worden de waarden van het formulier opgeslagen
// 			Alse er wel fouten zijn wordt de functie waar de handle hMarkFunction heen wijst uitgevoerd. Aan deze
//			functie worden de naam van het formulier en de formuliervelden waarin de fouten staan meegegeven
// Return:	-
function markOrStore(a_oRequest) {
	oXML = a_oRequest.responseXML;
	// alert(a_oRequest.responseText);
	if (!oXML) alert("fout bij markOrStore:\n" + a_oRequest.responseText);
	sFormName = getNodeValue(oXML, "formname");
	aErrors = oXML.getElementsByTagName("error");
	if (aErrors.length == 0) {
		sClassName = getNodeValue(oXML, "classname");
		storeForm(sFormName, sClassName);
		setWait2(false);
	}
	else {
		aFields = new Array();
		aFormErrorFields = new Array();
		for (iCounter3 = 0; iCounter3 < aErrors.length; iCounter3++) {
			oError = aErrors[iCounter3];
			sId = getNodeValue(oError, "id");
			sDescription =  getNodeValue(oError, "description");
			oField = document.getElementById(sFormName + "-field-" + sId);
			if (!oField) alert(sFormName + "-field-" + sId);
			if (oField.className.indexOf("multi") > -1) {
				aExtraFields = getFormFields(oField.parentNode.id);
				for (iCounter2 = 0; iCounter2 < aExtraFields.length; iCounter2++) {
					oField = aExtraFields[iCounter2];
					sId = oField.id;
					aFields[aFields.length] = oField;
					aErrorArray = new Array(oField, sId, sDescription);
					aFormErrorFields.push(aErrorArray);
				}
			} else {
				aFields[aFields.length] = oField;
				aErrorArray = new Array(oField, sId, sDescription);
				aFormErrorFields.push(aErrorArray);
			}
		}
		eval(hMarkFunction(sFormName, aFields));
		setWait2(false);
	}
}


// Pre:		a_sData is de nieuwe content van de body
// Post:	De innerHTML van de body is nu gelijk aan a_sData
// Return:	-
function setBody(a_oRequest) {
	document.body.innerHTML = a_oRequest.responseText;
}


// Pre:		a_oContainer is een XML object met daarin de tag waarvan de waarde gezocht wordt
//			a_sTagName is de naam van de tag waarvan de waarde gezocht wordt
// Post:	-
// Return:	De waarde van de gezochte tag
function getNodeValue(a_oContainer, a_sTagName) {
	if (a_oContainer) {
		aElements = a_oContainer.getElementsByTagName(a_sTagName);
		if (aElements.length > 0) return aElements[0].childNodes[0].nodeValue;
	}
	return null;
}


// Pre:		a_aFields zijn de velden waarin de waarden niet goed zijn ingevuld
// Post:	de velden hebben de klasse 'formFieldError' gekregen
// Return:	-
// TODO:	klasse toevoegen ipv vervangen, voor als er al een klasse is
function mark(a_sFormName, a_aFields) {
	aAllFields = getFormFields(a_sFormName);
	for (iCounter = 0; iCounter < aAllFields.length; iCounter++) {
		var bError = false;
		for (iCounter2 = 0; iCounter2 < a_aFields.length; iCounter2++) {
			if (aAllFields[iCounter] == a_aFields[iCounter2]) bError = true;
		}
		if (bError) addClass(aAllFields[iCounter], 'formFieldError');
		else {
			removeClass(aAllFields[iCounter], 'formFieldError');
		}
	}
	if (a_aFields[0].className.indexOf("multi") == -1) a_aFields[0].focus();
	else a_aFields[0].parentNode.childNodes[0].focus();
}

// Pre:		a_sFormName is de id van een betaand formulier
// Post:	-
// Return:	alle velden in een formulier
function getFormFields(a_sFormName) {
	oForm = document.getElementById(a_sFormName);
	aChildren = new Array();
	if (oForm) {
		aInputs = oForm.getElementsByTagName("input");
		aSelects = oForm.getElementsByTagName("select");
		for (iCounter = 0; iCounter < aInputs.length; iCounter++) {
			sId = aInputs[iCounter].id;
			if (sId.substring(sId.length - 16) != "multiFieldSetter") aChildren.push(aInputs[iCounter]);
		}
		for (iCounter = 0; iCounter < aSelects.length; iCounter++) {
			sId = aSelects[iCounter].id;
			if (sId.substring(sId.length - 16) != "multiFieldSetter") aChildren.push(aSelects[iCounter]);
		}
	}
	return aChildren;
}


// Pre:		a_sFormName is de naam van een aanwezig formulier
//			a_sClassName is de naam van de klasse waarin staat hoe de gegevens opgeslagen dienen te worden
// Post:	de gegevens uit het formulier zijn opgeslagen
// Return:	-
function storeForm(a_sFormName, a_sClassName) {
	if (bSite) {
		document.getElementById(a_sFormName).submit();
	} else {
		aChildren = getFormFields(sFormName);
		sPost = "";
		for (iCounter = 0; iCounter < aChildren.length; iCounter++) {
			oChild = aChildren[iCounter];
			if (oChild.type != "button" && oChild.className.indexOf("ignore") == -1) {
				if (oChild.type != "checkbox") sPost += oChild.name + "=" + oChild.value + "&";
				else sPost += oChild.name + "=" + (oChild.checked ? "y" : "n") + "&";
			}
		}
		sPost += "action=store&sClassName=" + a_sClassName;
		requestXML('wrapper.php', sPost, finishForm, true);
	}
}


function finishForm(a_oRequest) {
	// alert(a_oRequest.responseText);
	oXML = a_oRequest.responseXML;
	sResult = getNodeValue(oXML, "result");
	if (sResult == "true") {
		aFormErrorFields = false;
		if (!bSkipClosing) {
			if (hCloseFormFunction) {
				oXML = a_oRequest.responseXML;
				sClassName = getNodeValue(oXML, "className");
				eval(hCloseFormFunction(sClassName));
			} 	
		} else {
			bSkipClosing = false;
		}
	} else {
		alert(a_oRequest.responseText);
	}
}

function cancelForm(a_sClassName) {
	if (hCloseFormFunction) {
		eval(hCloseFormFunction(a_sClassName));
	} 	
}

function focusCheck(a_sFormName, a_sFieldId) {
	if (aFormErrorFields) {
		oErrorCell = document.getElementById(a_sFormName + "-errorDescription");
		for (iCounter = 0; iCounter < aFormErrorFields.length; iCounter++) {
			aErrorArray = aFormErrorFields[iCounter];
			if (aErrorArray[1] == a_sFieldId) {
				oErrorCell.innerHTML = aErrorArray[2];
				return true;
			}
		}
		oErrorCell.innerHTML = "&nbsp;";
	}
	return false;
}

function updateSetField(a_sCheckId, a_sFieldId) {
	oCheck = document.getElementById(a_sCheckId);
	oField = document.getElementById(a_sFieldId);
	iCurrentValue = oField.value * 1;
	iChange = Math.pow(2, oCheck.value);
	iChange = (oCheck.checked ? iChange * 1: iChange * -1);
	oField.value = iCurrentValue + iChange;	
}

function removeClass(a_oObject, a_sClass) {
	iIndex = a_oObject.className.indexOf(a_sClass);
	sOldClassName = a_oObject.className;
	iOldLength = sOldClassName.length;
	iTempLength = a_sClass.length;
	sNewClassName = "test";
	if (iIndex > -1) {
		sPre = sOldClassName.substr(0, iIndex);
		sPost = sOldClassName.substr(iIndex + iTempLength, iOldLength);
		sNewClassName = sPre + sPost;
		a_oObject.className = sNewClassName;
		return true;
	}
	return false;
}

function addClass(a_oObject, a_sClass) {
	if (a_oObject.className.indexOf(a_sClass) == -1) {
		a_oObject.className = a_oObject.className + ' ' + a_sClass;
	}
}

function addEventListener(h_oObject, h_sType, h_hFunction, h_bBubble) {
	if (h_oObject.addEventListener) {
		h_oObject.addEventListener(h_sType, h_hFunction, h_bBubble);
	} else {
		sType = "on" + h_sType;
		h_oObject.attachEvent(sType, h_hFunction);
	}
}

function getEventTarget(h_oEvent) {
	oObject = h_oEvent.target;
	if (oObject) return oObject;
	return h_oEvent.srcElement;
}

function disableText(e){
	return false;
}

function enableText(){
	return true;
}

