var requestQueue = 0;

//Class ServerRequest
function ServerRequest(functionRequestUrl, destinationObject, destinationFunction, stateChangeFunction, method, parameters, loadingScreen)
{
	// Dit object
	var instantie = this;
	
	// Het XML HTTP object verantwoordelijk voor de client-server communicatie
	var requestObject = false;
	// Het adres, inclusief de functie (pagina), van de server die opgevraagd wordt
	var functionRequestUrl = functionRequestUrl;
	// Het object dat de ontvangen data verwerkt
	var destinationObject = destinationObject;
	// De functie die de ontvangen data verwerkt (functie uit bovenstaand object)
	var destinationFunction = destinationFunction;
	// De functie die wordt aangeroepen als de status van het XML HTTP object veranderd (functie uit bovenstaand object) (OPTIE)
	var stateChangeFunction = stateChangeFunction;
	// De methode van aanvragen: GET of POST
	var method = method;
	// De parameters van een POST aanvraag
	var parameters = parameters;
	// Loader
	var loadingScreen = loadingScreen;
	
	// Initialiseren en versturen XML HTTP object
	var init = function()
	{
		// Taal parameter toevoegen
		if (parameters.length > 0) parameters += '&';
		parameters += 'taal=' + encodeURI(eHoliday_language);
		// SessionId parameter toevoegen
		parameters += '&eHoliday_sessionId=' + encodeURI(eHoliday_sessionId);
		//
		requestObject = getAjaxHandler();
		if (method == null || method == 'GET')
		{
			method = 'GET';
			parameters = null;
		}
		
		var accountId = 1;
		if (window.eHoliday_accountId) var accountId = eHoliday_accountId;

		if (window.eHoliday_HttpRequestPostProxyPath) functionRequestUrl = eHoliday_HttpRequestPostProxyPath + functionRequestUrl;
		functionRequestUrl = functionRequestUrl + '&accountId=' + encodeURI(accountId);
		//alert(functionRequestUrl);
		requestObject.open(method, functionRequestUrl, true);
		requestObject.onreadystatechange=stateChange;
		requestObject.setRequestHeader("Cache-Control", "no-cache");
		requestObject.setRequestHeader("X_USERAGENT", "TimisAjaxApplicatie");
		if (method == 'POST')
		{
			requestObject.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
			requestObject.setRequestHeader("Content-length", parameters.length);
		}
		requestObject.send(parameters);
		if (document.getElementById('eHoliday_loadingScreen') != null && loadingScreen !== false)
		{
			loadingScreen = document.getElementById('eHoliday_loadingScreen');
		}
		else
		{
			loadingScreen = false;
		}
		setLoadingScreen(true);
	}
	
	// In geval van wijzigingen in XML HTTP Object het data verwerkende object op de hoogte brengen
	var stateChange = function()
	{
		if (stateChangeFunction != null)
		{
			destinationObject[stateChangeFunction](requestObject.readyState);
		}
		if (requestObject.readyState == 4)
		{
			// Ontvangen data van het XML HTTP object, in de vorm van JSON, omzetten naar javascript datastructuur
			//alert(requestObject.responseText);
			//document.body.innerHTML = requestObject.responseText;
			var object = eval("(" + requestObject.responseText + ")");
			destinationObject[destinationFunction](object);
			setLoadingScreen(false); 
		}
	}
	
	// AJAX request opvragen, browser afhankelijk
	var getAjaxHandler = function()
	{
		if(window.XMLHttpRequest)
		{
    		return new XMLHttpRequest(); 
		}
		else
		{ 
			var types = ['MSXML2.XMLHTTP','MSXML2.XMLHTTP.3.0','MSXML2.XMLHTTP.4.0','MSXML2.XMLHTTP.5.0','Microsoft.XMLHTTP']; 
			var i = types.length; 
			while (i--)
			{ 
				try
				{ 
					return new ActiveXObject(types[i]); 
				} 
				catch (e) 
				{} 
			} 
			return undefined; 
		}
	}
	
	// Loading screen weergeven
	var setLoadingScreen = function(setOn)
	{
		if (loadingScreen)
		{
			window.onresize = instantie.resetLoadingScreen;
			window.onscroll = instantie.resetLoadingScreen;
			if (setOn)
			{
				requestQueue++;
				instantie.resetLoadingScreen();
				loadingScreen.style.visibility = 'visible';
			}	
			else
			{
				requestQueue = requestQueue - 1;
				if (requestQueue == 0) loadingScreen.style.visibility = 'hidden';
			}
		}
	}
	
	// Positie van loading screen instellen
	this.resetLoadingScreen = function()
	{
		var windowHeight = document.documentElement.clientHeight;
		var loadingScreenHeight = loadingScreen.offsetHeight;
		var loadingScreenPosition = (((windowHeight - loadingScreenHeight) / 2) + document.documentElement.scrollTop + document.body.scrollTop) + 'px';
		loadingScreen.style.top = loadingScreenPosition;

		var windowWidth = document.documentElement.clientWidth;
		var loadingScreenWidth = loadingScreen.offsetWidth;
		var loadingScreenPosition = (((windowWidth - loadingScreenWidth) / 2) + document.documentElement.scrollLeft + document.body.scrollTop) + 'px';
		loadingScreen.style.left = loadingScreenPosition;
	}
	
	// ServerRequest onmiddelijk na aanmaken initialiseren en verzenden
	init();
}