//  this brilliant bit of code is from david flanagan's "javascript: the definitive guide"

var http = {};

http._factories = [
	function() { return new XMLHttpRequest(); },
	function() { return new ActiveXObject("Msxml2.XMLHTTP"); },
	function() { return new ActiveXObject("Microsoft.XMLHTTP"); }
];

http._factory = null;

http.newrequest = function() {
	if (http._factory != null)  return http._factory();	
	for (var i = 0; i < http._factories.length; i++) {
		try {
			var factory = http._factories[i];
			var request = factory();
			if (request != null) {
				http._factory = factory;
				return request;
			}
		}
		catch (e) {
			continue;
		}
	}
	http._factory = function() {
		throw new Error("XMLHttpRequest is not supported");
	}
	http._factory();
};

http.encodeformdata = function(data) {
	var pairs = [];
	var regexp = /%20/g;
	for (var name in data) {
		var value = data[name].toString();
		var pair = encodeURIComponent(name).replace(regexp, "+") + '=' +
			encodeURIComponent(value).replace(regexp, "+");
		pairs.push(pair);
	}
	return pairs.join('&');
};

http._getresponse = function(request) {
	switch(request.getResponseHeader("Content-Type")) {
		case "text/xml": return request.responseXML;
		case "text/javascript":  return eval(request.responseText);
		case "application/javascript":  return eval(request.responseText);
		case "application/x-javascript": return eval(request.responseText);
		default: return request.responseText;
	}
};

http.get = function(url, callback, options) {
	var request = http.newrequest();
	var n = 0;
	var timer;
	if (options.timeout) {
		timer = setTimeOut(function() {
			request.abort();
			if (options.timeouthandler) options.timeouthandler(url);
		},
		options.timeout);
	}
	request.onreadystatechange = function() {
		if (request.readyState == 4) {
			if (timer) clearTimeout(timer);
			if (request.status == 200) {
				callback(http._getresponse(request));
			} else {
				if (options.errorhandler) {
					options.errorhandler(request.status, request.statusText);
				} else {
					callback(null);
				}
			}
		}
	}
	var target = url;
	if (options.parameters) {
		target += "?" + http.encodeformdata(options.parameters);
	}
	request.open("GET", target);
	request.send(null);
};

http.post = function(url, values, callback, errorhandler) {
	var request = http.newrequest();
	request.onreadystatechange = function() {
		if (request.readyState == 4) {
			callback(http._getresponse(request));
		} else {
			if (errorhandler) errorhandler(request.status, request.statusText);
			else callback(null);
		}
	}
	request.open("POST", url);
	request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	request.send(http.encodeformdata(values));
};