/****

Events:

onOpen ()
onRequest ()
onSend ()
onFragment (frag)
onReceive (data)
onDone ()
onError (status)

****/

// check for 'xwp' namespace
if (!namespace.exists('xwp'))
	namespace.create('xwp');

xwp.xmlhttp = function () {
	var self = this;
	
	self.busy = false;

	try {
		self.http = new ActiveXObject("Msxml2.XMLHTTP");
	} catch (e) {
		try {
			self.http = new ActiveXObject("Microsoft.XMLHTTP");
		} catch (e) {
			try {
				self.http = new XMLHttpRequest();
			} catch (e) {
				try  {
					self.http = window.createRequest();
				} catch (e) {
					self.http = null;
				}
			}
		}
	}

	self._response = function () {
		if (!self.busy)
			return;
		if (self.http.readyState >= 2 && typeof(self.http.status) != 'undefined' && self.http.status != 200) {
			self.busy = false;
			self._callback('onError', {code : self.http.status, text : self.http.statusText});
			self._callback('onDone');
			return false;
		}
		switch (self.http.readyState) {
			case 1:
				self._callback('onRequest');
				break;
			case 2:
				self._callback('onSend');
				break;
			case 3:
				self._callback('onFragment', self.http.responseText.substr(self.data.length));
				self.data = self.http.responseText;
				break;
			case 4:
				self.data = self.http.responseText;
				self._callback('onReceive', self.data);
				self.http.abort();
				self.busy = false;
				self._callback('onDone');
				break;
		}
	};

	self.open = function (url, method, data) {
		method = (method ? method : 'get');
		data = (data ? data : '');

		if (!self.http || self.busy == true)
			return false;

		self.busy = true;
		self.data = "";
		self.http.onreadystatechange = self._response;
		
		self._callback('onOpen');
		
		self.http.open(method.toUpperCase(), url.replace(/#.*$/, ''));
		self.http.setRequestHeader('encoding', 'UTF-8');
		if (method.toUpperCase() == 'POST')
			self.http.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;');
		self.http.send(data);
		return true;
	};
	
	self.close = function () {
		self.http.abort();
		self.data = '';
		self.busy = false;
	};
	
	self._callback = function (func, arg1) {
		if (self[func])
			self[func](arg1);
	};

	self.onError = function (status) {
		alert("XMLHTTP Error: " + status.code + " " + status.text);
	};

};
