function Event()
{
	this.addEventListener		= addEventListener;
	this.removeEventListener	= removeEventListener;
	this.dispatchEvent			= dispatchEvent;
	var events = {};

	function addEventListener(type, listener)
	{
		if (typeof listener != "function"){throw new Error("Er wordt niet geluisterd");}
		if (typeof events[type] == "undefined"){events[type] = [];}
		events[type].push(listener);
	}
	function removeEventListener(type, listener)
	{
		if (events[type] != undefined){for (var i = 0; i < events[type].length; i++){if (events[type][i] == listener){delete events[type][i];break;}}}
	}
	function dispatchEvent(event)
	{if (event.constructor != DefaultEvent){throw new Error("geen DefaultEvent");}var type = event.type;if (events[type] != undefined)
	{for (var i = 0; i < events[type].length; i++){events[type][i](event);}}}}
function DefaultEvent(type, target)
{
	this.type	= type;
	this.target	= target;
}
function Socket()
{
	Event.call(this);
	var self			= this,
		socket			= null,
		requestHeaders	= {};
	this.request			= request;
	this.getStatus			= getStatus;
	this.getStatusText		= getStatusText;
	this.getResponseText	= getResponseText;
	this.getResponseXML		= getResponseXML;
	this.setRequestHeader	= setRequestHeader;
	this.getResponseHeader	= getResponseHeader;
	try
	{
		socket = new XMLHttpRequest();
	} 
	catch (exception)
	{
	}
	var xmlImplementations = ["MSXML2.XMLHTTP.6.0", "MSXML2.XMLHTTP.3.0"];

	for (var i = 0; i < xmlImplementations.length; i++) 
	{
		try
		{
			socket = new ActiveXObject(xmlImplementations[i]);
		} 
		catch (exception)
		{}
	}
	function request(URI, parameters, asynchronous, post)
	{
		if (typeof URI != "string")
		{
			throw new Error("URI is missing or not a string");
		}
		if (post == true && (parameters == undefined || parameters == null))
		{
			throw new Error("parameters is missing or not an object");
		}
		if (typeof asynchronous != "boolean")
		{
			asynchronous = true;
		}
		if (typeof post != "boolean")
		{
			post = false;
		}
		if (socket.readyState != 0)
		{
			socket.abort();
		}
		var requestData = "";
		if (parameters != undefined && parameters != null) 
		{
			if (typeof parameters == "object")
			{
				if (post == false) 
				{
					if (URI.indexOf("?") == -1)
					{
						requestData = "?";
					}
					else 
					{
						requestData = "&";
					}
				}
				for (var parameter in parameters)
				{
					requestData += encodeURIComponent(parameter) + "=" + encodeURIComponent(parameters[parameter]) + "&";
				}
				requestData = requestData.substring(0, requestData.length - 1);
			}
			else
			{
				throw new Error("Invalid argument: parameters is not an object");
			}
		}
		socket.onreadystatechange = function()
		{
			switch (socket.readyState)
			{
				case 0:
					self.dispatchEvent(new DefaultEvent(Socket.NIETGEINITIALISEERD, self));
					break;
				case 1:
					self.dispatchEvent(new DefaultEvent(Socket.OPEN, self));
					break;
				case 2:
					self.dispatchEvent(new DefaultEvent(Socket.VERZONDEN, self));
					break;
				case 3:
					self.dispatchEvent(new DefaultEvent(Socket.ONTVANGEN, self));
					break;
				case 4:
					self.dispatchEvent(new DefaultEvent(Socket.GELADEN, self));
			}
		}
		if (post == true)
		{
			socket.open("POST", URI, asynchronous);
			socket.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
			socket.setRequestHeader("Content-Length", requestData.length);
			socket.send(requestData);
		}
		else
		{
			socket.open("GET", URI + requestData, asynchronous);
			for (var name in requestHeaders)
			{
				socket.setRequestHeader(name, requestHeaders[name]);
			}
			socket.send(null);
		}
	}
	function getStatus()
	{
		return socket.status;
	}
	function getStatusText()
	{
		return socket.statusText;
	}
	function getResponseText()
	{
		return socket.responseText;
	}
	function getResponseXML()
	{
		return socket.responseXML;
	}
	function setRequestHeader(name, value)
	{
		requestHeaders[name] = value;
	}
	function getResponseHeader(name)
	{
		return socket.getResponseHeader(name);
	}
}
Socket.prototype = new Event();
Socket.NIETGEINITIALISEERD	= "nietgeinitialiseerd";
Socket.OPEN					= "open";
Socket.VERZONDEN			= "verzonden";
Socket.ONTVANGEN			= "ontvangen";
Socket.GELADEN				= "geladen";