// JavaScript Document

/* runOnRequestComplete:
 * 
 * Wanneer runOnRequestComplete is gezet, dient ajax.loadContent te worden aangeroepen
 * door die functie
 */
 
/* disableRunOnEvents:
 * 
 * Als disableRunOnEvents true is, worden de runOn events niet uitgevoerd tijdens de request.
 * Echter wordt deze aan het einde van de request automatisch weer aangezet
 * Deze moet dus altijd gezet worden ingesteld voor de request als de event moeten worden uitgeschakeld
 *
 * Een permanentere oplossing is het uitzetten van de runOn Enabled variabelen
 */

function initAjax() {
	ajax = new Ajax();
}

function Ajax() {
	// Properties
	this.busy = false;
	this.runScripts = true;
	
	this.disableRunOnEvents = false
	this.runOnStartEnabled = false;
	this.runOnErrorEnabled = false;
	this.runOnCompleteEnabled = false;

	this.alertOnError = true;
	this.errorString = "";
	
	this.xmlhttp = false;
	this.serverPage = "";
	this.response;
	this.destObject = null;
	this.runScriptsObject = null;
	
	// Methodes
	this.requestPage = requestPage;
	this.requestPageToDiv = requestPageToDiv;
	this.submitForm = submitForm;
	
	this.runOnStart = null;
	this.runOnError = null;
	this.runOnComplete = null;
	
}

function requestPageToDiv(pagina, objectId, poststr) {
	// Bestemming element ophalen
	this.destObject = document.getElementById(objectId);
	if (this.destObject == null) {
		this.errorString = "Element with id = " + objectId + " could not be found";
		if (this.alertOnError) alert(this.errorString);
		return false;
	}
	
	this.requestPage(pagina, poststr);
}

function requestPage(pagina, poststr) {

	// Controleren of er een request in behandeling is
	if (this.busy == false) {
		// Aangeven dat er een request in behandeling is
		this.busy = true;
		
		// Eventuel runOnStart functie uivoeren
		if (!this.disableRunOnEvents && this.runOnStartEnabled && this.runOnStart != null) this.runOnStart();
		
		// Pagina instellen en timestamp toevoegen aan op te halen pagina, ivm cache
		this.serverPage = pagina;
		this.serverPage += (this.serverPage.indexOf(".php?") >= 0) ? "&ts=" + (new Date()).getTime() : "?ts=" + (new Date()).getTime();
		
		// XMLHttp object ophalen
		this.xmlhttp = getXMLHttp();
		
		// Bepalen of request als get of post moet worden verstuurd
		// en xmlhttp object daarop pagina laten openen
		if ((typeof poststr) == 'undefined') {
			this.xmlhttp.open("GET", this.serverPage);
		} else {
			this.xmlhttp.open("POST", this.serverPage, true);
			this.xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		}
		
		// Functie op onreadystatechange event
		this.xmlhttp.onreadystatechange = function(e) {
			// Status van request controleren
			if (ajax.xmlhttp.readyState == 4 && ajax.xmlhttp.status == 200) {
				// Responsetext laden
				ajax.response = ajax.xmlhttp.responseText;
				
				// Response in div laden, mits gedefinieerd
				if (ajax.destObject != null) ajax.destObject.innerHTML = ajax.response;

				// Controleren of scripts moeten worden uitgevoerd
				if (ajax.runScripts) ajax.runScriptsObject = ajax.destObject;
				
				ajax.destObject = null;
				ajax.busy = false;
				
				// Scripts uitvoeren
				if (ajax.runScriptsObject != null) {
					scripts = ajax.runScriptsObject.getElementsByTagName("script");
					
					for (i=0;i < (scripts.length) ; i++) {
						if (scripts[i].getAttribute("type") == "text/javascript") eval(scripts[i].text);
					}
				}
				ajax.runScriptsObject = null;
				
				
				// Eventuele runOnComplete functie uitvoeren
				if (!ajax.disableRunOnEvents && ajax.runOnCompleteEnabled && ajax.runOnComplete != null) ajax.runOnComplete();
				
			} else if (ajax.xmlhttp.readyState == 4) {
				switch (ajax.xmlhttp.status) {
					case 403:
						ajax.errorString = "The requested page is forbidden (403)";
						break;
					case 404:
						ajax.errorString = "The requested page could not be found (404)";
						break;
					default:
						ajax.errorString = "The request could not be completed succesfully (" + ajax.xmlhttp.status + ")";
						break;
				}
				
				if (ajax.alertOnError) alert(ajax.errorString);
				if (!ajax.disableRunOnEvents && ajax.runOnErrorEnabled && ajax.runOnError != null) ajax.runOnError();
				if (!ajax.disableRunOnEvents && ajax.runOnCompleteEnabled && ajax.runOnComplete != null) ajax.runOnComplete();
				
				ajax.busy = false;
			}
		}
		
		// Request Versturen
		ajax.xmlhttp.send((poststr == 'undefined') ? null : poststr);
	}
	return false;
}


function submitForm(pagina, form, objectId) {
	// Bestemming element ophalen mits gedefinieerd
	this.destObject = (objectId != 'undefined') ? document.getElementById(objectId) : null;

	// String samenstellen van de objecten in het formulier
	var str = "";
	
	for (var i = 0; i < form.elements.length; i++)
		str += form.elements[i].name + "=" + escape(form.elements[i].value) + "&";
	
	ajax.requestPage(pagina, str);
}


// Functie om een XMLHttp object te krijgen
function getXMLHttp() {
	var xmlhttp;
	
	try {
		// Als javascript versie > 5
		xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
	} catch (e) {
		// Anders ouder ActiveX object gebruiken
		try {
			// Als we Internet Explorer gebruiken
			xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
		} catch (E) {
			// Anders een javascript instantie van het object aanmaken
			xmlhttp = (typeof XMLHttpRequest != 'undefined') ? new XMLHttpRequest() : false;
		}
	}
	
	return xmlhttp;
}
