var Ajax = function() {
	this.getXHR = function() {
		var http;
		try {
			http = new XMLHttpRequest;
				this.getXHR = function() {
					return new XMLHttpRequest;
				};
		}
		catch(e) {
			var msxml = [
				'MSXML2.XMLHTTP.3.0',
				'MSXML2.XMLHTTP',
				'Microsoft.XMLHTTP'
			];
			for (var i=0, len = msxml.length; i < len; ++i) {
				try {
					http = new ActiveXObject(msxml[i]);
					this.getXHR = function() {
						return new ActiveXObject(msxml[i]);
					};
					break;
				}
				catch(e) {}
			}
		}
		return http;
	};
	var self = this;
	this.XMLHttpRequest = this.getXHR();
	this.requestHeaders = {};
	if(this.XMLHttpRequest) {
		this.setRequestHeader = function(header, value) {
			this.requestHeaders[header] = value;
		}
		this.overrideMimeType = function(type) {
			this.XMLHttpRequest.overrideMimeType(type);
		}
		this.call = function(method, uri, callback, postData) {
			this.XMLHttpRequest.abort();
			if(callback)
				this.XMLHttpRequest.onreadystatechange = function() { callback(self.XMLHttpRequest); }
			this.XMLHttpRequest.open(method, uri, true);
			for(var i in this.requestHeaders)
				this.XMLHttpRequest.setRequestHeader(i, this.requestHeaders[i]);
			this.XMLHttpRequest.send(postData || null);
			this.requestHeaders = {};
		};
	}

	return this;
}


