function createRequest() {
  var req =  false;
  if(window.XMLHttpRequest) {
    try {
      req = new XMLHttpRequest();
    } catch(e) {}
    // branch for IE/Windows ActiveX version
  } else if(window.ActiveXObject) {
    try {
      req = new ActiveXObject("Microsoft.XMLHTTP");
    } catch(e) {
      try {
        req = new ActiveXObject("Msxml2.XMLHTTP");
      } catch(e) {}
    }
  }
  return req;
}


var GET_METHOD = 'GET';
var POST_METHOD = 'POST';
var PUT_METHOD = 'PUT';
var DELETE_METHOD = 'DELETE';


function AjaxRequest(url, method, okHandler, data) {
	this.url = url;
	if(method && '' != method)
		this.method = method;
	else
		this.method = GET_METHOD;
	if(okHandler)
		this.okHandler = okHandler;
	if(data)
		this.data = data;
}

AjaxRequest.prototype.setURL = function setURL(url) {
	this.url = url;
}

AjaxRequest.prototype.getURL = function getURL() {
	return this.url;
}

AjaxRequest.prototype.setMethod = function setMethod(method) {
	if(method && '' != method)
		this.method = method;
	else
		this.method = GET_METHOD;
}

AjaxRequest.prototype.getMethod = function getMethod() {
	return this.method;
}

AjaxRequest.prototype.setHandler = function setHandler(handler) {
	this.handler = handler;
}

AjaxRequest.prototype.getHandler = function getHandler() {
	return this.handler;
}

AjaxRequest.prototype.setOkHandler = function setOkHandler(okHandler) {
	this.okHandler = okHandler;
}

AjaxRequest.prototype.getOkHandler = function getOkHandler() {
	return this.okHandler;
}

AjaxRequest.prototype.setErrorHandler = function setErrorHandler(errorHandler) {
	this.errorHandler = errorHandler;
}

AjaxRequest.prototype.getErrorHandler = function getErrorHandler() {
	return this.errorHandler;
}

AjaxRequest.prototype.setData = function setData(data) {
	this.data = data;
}

AjaxRequest.prototype.addData = function addData(data) {
	if(data == null || '' == data)
		return;
		
	if(this.data != null) {
		this.data += '&';
		if(data.charAt(0) == '&')
			this.data += data.substr(1);
		else
			this.data += data;
	} else {
		this.data = data;
	}
}

AjaxRequest.prototype.addDataParameter = function addDataParameter(name, value) {
	if(name == null || '' == name)
		return;
		
	if(this.data != null) {
		this.data += '&';
		this.data += name + '=';
		this.data += encodeURIComponent(value);
	} else {
		this.data = name + '=' + encodeURIComponent(value);
	}
}

AjaxRequest.prototype.getData = function getData() {
	return this.data;
}

AjaxRequest.prototype.setHeaders = function setHeaders(headerNames, headerValues) {
	this.headerNames = headerNames;
	this.headerValues = headerValues;
}

AjaxRequest.prototype.getResponse = function getResponse() {
	return this.response;
}

function AjaxResponse(request, responseText, responseXML) {
	this.request = request;
	if(responseText)
		this.responseText = responseText;
	if(responseXML)
		this.responseXML = responseXML;
}

AjaxResponse.prototype.setRequest = function setRequest(request) {
	this.request = request;
}

AjaxResponse.prototype.getRequest = function getRequest() {
	return this.request;
}

AjaxResponse.prototype.getResponseText = function getResponseText() {
	if(this.responseText == null)
		this.responseText = this.request.responseText;
	return this.responseText;
}

AjaxResponse.prototype.getResponseXML = function getResponseXML() {
	if(this.responseXML == null)
		this.responseXML = this.request.responseXML;
	return this.responseXML;
}

AjaxResponse.prototype.getReadyState = function getReadyState() {
	return this.request.readyState;
}

AjaxResponse.prototype.getStatus = function getStatus() {
	return this.request.status;
}

AjaxRequest.prototype.send = function send() {
	if(this.url == null)
		return;
	
	var req = createRequest();
	if(req) {
		var ths = this;
		req.onreadystatechange = function() {
			if(ths.handler != null)
				ths.handler(new AjaxResponse(req));
			if(req.readyState == 4) {
				if(req.status == 200) {
					if(ths.okHandler != null) {
						ths.okHandler(new AjaxResponse(req, req.responseText));
					}
					
				} else {
					if(ths.errorHandler)
						ths.errorHandler('There was a problem with your request.', new AjaxResponse(req));
				}
			}
		}
		
		req.open(this.method, this.url, true);
		
		if(this.headerNames) {
			var hlen = this.headerNames.length;
			for(var i = 0; i<hlen; i++) {
				req.setRequestHeader(this.headerNames[i], this.headerValues[i]);
			}
		}
		
		if(this.method == GET_METHOD)
			req.send(null);
		else
			req.send(this.data);
	} else {
		if(this.errorHandler)
			this.errorHandler("Can't create Ajax request.");
	}
}

AjaxRequest.prototype.sendURLEncodedPostData = function sendURLEncodedPostData(data, okHandler, errorHandler) {
	this.setMethod(POST_METHOD);
		
	this.sendURLEncodedData(data, okHandler, errorHandler);
}

AjaxRequest.prototype.sendURLEncodedData = function sendURLEncodedData(data, okHandler, errorHandler) {
	var headerNames = new Array('Content-Type');
	var headerValues = new Array('application/x-www-form-urlencoded');
	this.setHeaders(headerNames, headerValues);
	
	if(data)
		this.setData(data);
	if(okHandler)
		this.setOkHandler(okHandler);
	if(errorHandler)
		this.setOkHandler(errorHandler);
	
	this.send();
}
///////////////////////
function alertAjaxErrorHandler(message, ajaxResponse) {
	alert(message + " : " + ajaxResponse.getRequest().status);
}