function createXMLHttpRequest()
{
  var xmlHttp;
  try
  {
		// Firefox, Opera 8.0+, Safari
		xmlHttp=new XMLHttpRequest();
  }
	catch (e)
  {
    // Internet Explorer
    try
    {
      xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
    }
    catch (e)
    {
      try
      {
        xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
      }
      catch (e)
      {
        alert("Your browser does not support AJAX!");
        return false;
      }
    }
  }

	return xmlHttp;
}

var oGETRequest = new Request.HTML({ evalScripts: false, onSuccess: AnyRequestComplete, link: 'ignore' });
function GETRequest( link, soort, bestemming )
{
	var oGETRequest = new Request.HTML({ evalScripts: false, onSuccess: AnyRequestComplete, link: 'ignore' });
	//filter de soorten
	if( soort == 'inner')
		oGETRequest.setOptions( { url: link, update: bestemming } ).get();
	else
		HTTPRequest( "GET", link, soort, bestemming );
}

// Het doel van deze functie is het parsen van javascript. zowel in de oude als in de nieuwe methode
function AnyRequestComplete( responseTree, responseElements, responseHTML, responseJavaScript )
{
	var aParts = responseHTML.split('<!--scheidingsteken/-->');
	if( aParts.length > 2 )
	{
		for( var iTeller = 2; iTeller < aParts.length; iTeller++ )
		{
			aParts[1] = aParts[1] + "" + aParts[iTeller];
			aParts[iTeller] = "";
		}
	}
	if( aParts[1] != undefined )
	{
		var jscript = document.createElement('script');
		jscript.text = aParts[1];
		document.getElementsByTagName("head")[0].appendChild(jscript);
	}
	$exec( responseJavaScript );
}

/*
 * obj: het object waarbinnen gezocht wordt naar input elementen.
 */
var oPOSTRequest = new Request.HTML({ evalScripts: false, onSuccess: AnyRequestComplete, link: 'ignore' });
function POSTRequest( obj, link, soort, bestemming )
{
	var oPOSTRequest = new Request.HTML({ evalScripts: false, onSuccess: AnyRequestComplete, link: 'ignore' });
	if ( obj != null )
	{
		inputs = (document.getElementById(obj)).elements;
		var poststr = $(obj).toQueryString();
	}
	else
	{
		var poststr = "";
	}

	//filter de soorten
	if( soort == 'inner')
	{
		oPOSTRequest.setOptions( { url: link, update: bestemming, data: poststr } );
		oPOSTRequest.send();
	}
	else
		HTTPRequest( "POST", link, soort, bestemming, poststr );
}

/**
 * De volgende soorten hoe om te gaan met het bestemmingselement:
 * - inner: vervangt inner HTML van het bestemmingselement.
 * - outer: vervangt het bestemmingselement.
 * - value: van toepassing bij het input veld als bestemming.
 * - append: samen met de innerHTML van bestemming een nieuwe div aanmaken.
 * - appendinner: toevoegen aan de innerHTML van bestemming.
 */
function HTTPRequest( requesttype, link, soort, bestemming, parameters )
{
	var xmlHttp = createXMLHttpRequest();

	xmlHttp.onreadystatechange=function()
	{
		if(xmlHttp.readyState==4)
		{
			var aParts = (xmlHttp.responseText).split('<!--scheidingsteken/-->');
			if( aParts.length > 2 )
			{
				for( var iTeller = 2; iTeller < aParts.length; iTeller++ )
				{
					aParts[1] = aParts[1] + "" + aParts[iTeller];
					aParts[iTeller] = "";
				}
			}
			if( typeof(bestemming) == 'string' )
			{
				var bestemmingsvak = document.getElementById(bestemming);
			}
			else
			{
				var bestemmingsvak = bestemming;
			}

			if( soort == "inner" )
			{
				bestemmingsvak.innerHTML = "";
				var output = document.createElement('div');
				output.innerHTML = aParts[0];
				bestemmingsvak.appendChild(output);

				if( aParts[1] != undefined )
				{
					var jscript = document.createElement('script');
					jscript.text = aParts[1];
					bestemmingsvak.appendChild(jscript);
				}
			}
			else if( soort == "outer" )
			{
				var output = document.createElement('div');
				output.name = "content_replace";
				output.innerHTML = aParts[0];

				if( aParts[1] != undefined )
				{
					var jscript = document.createElement('script');
					jscript.text = aParts[1];
					bestemmingsvak.appendChild(jscript);
				}

				if( bestemmingsvak.parentNode.name != undefined && bestemmingsvak.parentNode.name == "content_replace" )
				{
					bestemmingsvak = bestemmingsvak.parentNode;
				}

				bestemmingsvak.parentNode.replaceChild(output, bestemmingsvak);
			}
			else if( soort == "value" )
			{
				bestemmingsvak.value = aParts[0];

				//Scripts voor losse velden staan altijd in een div met een speciaal ID die refereert naar het veld waar het bij hoort.
				//Standaard bestaat die div niet, maar als deze wel bestaat, moet deze eerst verwijderd worden.
				if( document.getElementById(bestemming + '_script') != undefined )
				{
					document.getElementById(bestemming + '_script').removeNode( true );
				}

				if( aParts[1] != undefined )
				{
					var output = document.createElement('div');
					output.setAttribute( 'id', bestemming + '_script' );
					var jscript = document.createElement('script');
					jscript.text = aParts[1];
					output.appendChild( jscript );
					document.body.appendChild( output );
				}
			}
			else if( soort =="append" )
			{
				var i = 0;
				while( i < bestemmingsvak.childNodes.length )
				{
					if( bestemmingsvak.childNodes.item(i).tagName == 'div' )
					{
						aParts[0] = bestemmingsvak.childNodes.item(i).innerHTML + aParts[0];
					}
					i++;
				}
				bestemmingsvak.innerHTML = "";

				var output = document.createElement('div');
				output.innerHTML = aParts[0];
				bestemmingsvak.appendChild(output);

				if( aParts[1] != undefined )
				{
					var jscript = document.createElement('script');
					jscript.text = aParts[1];
					bestemmingsvak.appendChild(jscript);
				}
			}
			else if( soort == "appendinner" )
			{
				aParts[0] = bestemmingsvak.innerHTML + aParts[0];
				bestemmingsvak.innerHTML = "";

				var output = document.createElement('div');
				output.innerHTML = aParts[0];
				bestemmingsvak.appendChild(output);

				if( aParts[1] != undefined )
				{
					var jscript = document.createElement('script');
					jscript.text = aParts[1];
					bestemmingsvak.appendChild(jscript);
				}
			}
			else
			{
				//document.getElementById(bestemming).innerHTML = xmlHttp.responseText;
			}
		}
	}

	if( requesttype == "POST" )
	{
		xmlHttp.open('POST', link, true);
    xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    xmlHttp.setRequestHeader("Content-length", parameters.length);
    xmlHttp.setRequestHeader("Connection", "close");
    xmlHttp.send(parameters);
	}
	else
	{
		xmlHttp.open("GET", link, true);
		xmlHttp.send(null);
	}
}