function makeRequest (url, id, form, hideImg)
{
	/*
		Deze functie stuurt een request naar <url>. Deze krijgt een antwoord
		terug en dit wordt in <id>.innerHTML gezet. Er kan optioneel een html
		formulier meegestuurd worden in <form>. Als dit het geval is wordt er
		automatisch een post request gestuurd. Zo niet, dan is het een get
		request.
		
		Voorbeeld calls:
		makeRequest("http://www.google.com/", "antwoordId");
		Dit stuurt een get request naar de url, en zet het antwoord in
		antwoordId.
		
		makeRequest("http://www.google.com/", "antwoordId",
			document.getElementById("myForm"));
		Dit stuurt een post request naar de url, en zet het antwoord in
		antwoordId.
	*/
	
	var timeOut = setTimeout("notifySlowness()", 10000); //10 seconden
	
	//Loading image (niet gebruiken wanneer je output je form vervangt, want dan faalt Internet Explorer (hard)):
	if (!hideImg)
	{
		document.getElementById(id).innerHTML = "<img src='http://www.bitcat.org/img/spin.gif' alt='Working...' style='border:none;' />";	
	}
	
	if (id == "bitContent")
	{
		document.getElementById("bitContentFileLocation").value = url;
	}
	
	var xmlHttp = null;
	try 
	{
		xmlHttp = new XMLHttpRequest();
	} 
	catch (e)
	{
		// Internet Explorer
		try 
		{
			xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
		}
		catch (e) 
		{
			xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
		}
	}
	xmlHttp.onreadystatechange = function()
	{
		if (xmlHttp.readyState == 4)
		{
			try
			{
				if (xmlHttp.status == 200)
				{
					//De target id vullen met het antwoord van de server.
					document.getElementById(id).innerHTML = xmlHttp.responseText;
					clearTimeout(timeOut);
					clearSlownessNotify();
				}
			}
			catch (e)
			{
				/* 
					Ik comment dit out omdat het af en toe voorkomt dat een AJAX call dood gaat als je er bergen door elkaar heen doet. 
					Laat maar lekker verdwijnen.
				*/
				//alert("[" + xmlHttp.status + "] Error on Ajax return call : " + e.description);
			}	
		}
	}
	
	var method = (form == null) ? "GET" : "POST";
	xmlHttp.open(method, url);
	
	if (method == "GET")
	{
		xmlHttp.send(null);
	}
	else if (method == "POST")
	{
		xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		var sendString = "";
		
		//Scan de meegeleverde form voor alle elements en zet ze in de post request.
		//IE: form.elements.length schijnt 0 te zijn en ook het benaderen van de afzonderlijke componenten lijkt niet te lukken. :(
		for (var i = 0; i < form.elements.length; i++)
		{
			//Exception voor checkboxes want anders geven die altijd "on" door. Dit moet checkbox.checked zijn, niet checkbox.value.
			if (form.elements[i].type == "checkbox")
				sendString += form.elements[i].name + "=" + form.elements[i].checked;
			else
				sendString += form.elements[i].name + "=" + form.elements[i].value.replace("&", "%26");
			if (i < form.elements.length - 1)
				 sendString += "&";
		}

		xmlHttp.send(sendString);
	}
}

function makeMultiRequest (urls, ids, forms, hideImgs)
{
	/*
		Dit is een aangepaste versie van makeRequest. De 3 parameters zijn 
		arrays. Het idee is dat de methode meerdere requests kan doen, maar deze 
		puur in seriele volgorde uitvoert, dus niet simultaan. Dit wordt 
		bijvoorbeeld gebruikt in het login script, waarbij ook de content 
		refresht moet worden, maar wel met de correcte data. De functie is 
		recursief, en de recursieve aanroep vindt plaats wanneer zijn voorganger 
		succesvol is geweest.
		
		Parameters:
		- urls: een array van url's die in de respectievelijke ids moeten worden
		        gezet.
		- ids: een array van ids, die de elementen voorstellen waar uiteindelijk
		       de antwoorden van de urls in komen.
		- forms: er is ook POST support. Dat is deze array van forms.
		         De GET requests geef je gewoon aan door NULL elementen in
		         deze array te doen, in plaats van forms.
		- hideImgs: een array van booleans die aangeeft of er een loading image
		            moet worden weergegeven (per id dus.)
	*/
	
	/*
		Stopconditie: De functie gaat in recursie op de arrays min hun eerste
		elementen. Op een gegeven moment zijn de arrays leeg (tegelijkertijd als
		ze een geode input hebben gehad. Zo niet, dan gaat het ook goed.) en dan
		stopt de functie.
	*/
	if (urls.length > 0 && ids.length > 0 && forms.length > 0 && hideImgs.length > 0)
	{
		//Loading image (niet gebruiken wanneer je output je form vervangt, want dan faalt Internet Explorer (hard)):
		if (!hideImgs[0])
		{
			document.getElementById(ids[0]).innerHTML = "<img src='http://www.bitcat.org/img/spin.gif' alt='Working...' style='border:none;' />";	
		}
		
		for (var i = 0; i < ids.length; i++)
		{
			if (ids[i] == "bitContent")
			{
				document.getElementById("bitContentFileLocation").value = urls[i];
			}
		}
	
		var xmlHttp = null;
		try 
		{
			xmlHttp = new XMLHttpRequest();
		} 
		catch (e)
		{
			// Internet Explorer
			try 
			{
				xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
			}
			catch (e) 
			{
				xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
			}
		}
		xmlHttp.onreadystatechange = function()
		{
			if (xmlHttp.readyState == 4)
			{
				try
				{
					if (xmlHttp.status == 200)
					{
						//De target id vullen met het antwoord van de server.
						document.getElementById(ids[0]).innerHTML = xmlHttp.responseText;

						//Recursieve aanroep op de andere targets in de arrays:
						urls.shift();
						ids.shift();
						forms.shift();
						hideImgs.shift();
						makeMultiRequest(urls, ids, forms, hideImgs);
					}
				}
				catch (e)
				{
					/* 
						Ik comment dit out omdat het af en toe voorkomt dat een AJAX call dood gaat als je er bergen door elkaar heen doet. 
						Laat maar lekker verdwijnen.
					*/
					//alert("[" + xmlHttp.status + "] Error on Ajax return call : " + e.description);

					//Bij een error, toch nog een recursieve aanroep op de andere targets in de arrays:
					urls.shift();
					ids.shift();
					forms.shift();
					hideImgs.shift();
					makeMultiRequest(urls, ids, forms, hideImgs);
				}	
			}
		}
		
		var method = (forms[0] == null) ? "GET" : "POST";
		xmlHttp.open(method, urls[0]);
		
		if (method == "GET")
		{
			xmlHttp.send(null);
		}
		else if (method == "POST")
		{
			xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
			var sendString = "";
			
			//Scan de meegeleverde form voor alle elements en zet ze in de post request.
			//IE: form.elements.length schijnt 0 te zijn en ook het benaderen van de afzonderlijke componenten lijkt niet te lukken. :(
			for (var i = 0; i < forms[0].elements.length; i++)
			{
				//Exception voor checkboxes want anders geven die altijd "on" door. Dit moet checkbox.checked zijn, niet checkbox.value.
				if (forms[0].elements[i].type == "checkbox")
					sendString += forms[0].elements[i].name + "=" + forms[0].elements[i].checked;
				else
					sendString += forms[0].elements[i].name + "=" + forms[0].elements[i].value.replace("&", "%26");
				if (i < forms[0].elements.length - 1)
					 sendString += "&";
			}
			
			xmlHttp.send(sendString);
		}
	}
}

function notifySlowness ()
{
	slownessArea = document.getElementById("notifySlowness");
	slownessArea.innerHTML = "<br /><br /><div class='noClickButton'><span class='warningMessage'>This seems to be taking longer than usual.</span></div>";
}

function clearSlowlessNotify ()
{
	slownessArea = document.getElementById("notifySlowness");
	slownessArea.innerHTML = "";
}