function Ajax() 
{
    this.req = null;
    this.url = null;
    this.status = null;
    this.statusText = '';
    this.method = 'GET';
    this.async = true;
    this.dataPayload = null;
    this.readyState = null;
    this.responseText = null;
    this.responseXML = null;
    this.handleResp = null;
    this.responseFormat = 'text', // 'text', 'xml', 'object'
    this.mimeType = null;
    this.headers = [];

    this.setMimeType = function(mimeType) 
    {
	this.mimeType = mimeType;
    };
    
    this.setHandlerResp = function(funcRef) 
    {
	this.handleResp = funcRef;
    };
    
    this.setHandlerErr = function(funcRef) 
    {
	this.handleErr = funcRef; 
    };
    
    this.setHandlerBoth = function(funcRef) 
    {
	this.handleResp = funcRef;
	this.handleErr = funcRef;
    };
    
    this.setRequestHeader = function(headerName, headerValue) 
    {
	this.headers.push(headerName + ': ' + headerValue);
    };

    this.init = function() 
    {
	var i = 0;
	var reqVariants = [ 
	    function() { return new XMLHttpRequest(); },
	    function() { return new ActiveXObject('Msxml2.XMLHTTP') },
	    function() { return new ActiveXObject('Microsoft.XMLHTTP' )} ];
      
	while (!this.req && (i < reqVariants.length)) {
	    try { 
		this.req = reqVariants[i++]();
	    } 
	    catch(e) {}
	}
	
	return true;
    };
  
    this.doGet = function(url, hand, format) 
    {
	this.url = url;
	this.handleResp = hand;
	this.responseFormat = format || 'text';
	this.doReq();
    };
    
    this.doPost = function(url, dataPayload, hand, format) 
    {
	this.url = url;
	this.dataPayload = dataPayload;
	this.handleResp = hand;
	this.responseFormat = format || 'text';
	this.method = 'POST';
	this.doReq();
    };
    
    this.doReq = function() 
    {
	var self = null;
	var req = null;
	var headArr = [];
    
	if (!this.init()) {
	    alert('The browser does not support XMLHttpRequest object.');
	    return;
	}
	req = this.req;
	req.open(this.method, this.url, this.async);
	if (this.method == "POST") {
	    this.req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	    req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	}
	self = this;

	req.onreadystatechange = function() 
	{
	    var resp = null;
	    self.readyState = req.readyState;
	    if (req.readyState == 4) {
		self.status = req.status;
		self.statusText = req.statusText;
		self.responseText = req.responseText;
		self.responseXML = req.responseXML;
        
		switch(self.responseFormat) {
		case 'text':
		    resp = self.responseText;
		    break;
		case 'xml':
		    resp = self.responseXML;
		    break;
		case 'object':
		    resp = req;
		    break;
		}
    
		if (self.status > 199 && self.status < 300) {
		    if (!self.handleResp) {
			alert('No response handler defined ' +
			    'for this XMLHttpRequest object.');
			return;
		    }
		    else {
			self.handleResp(resp);
		    }
		}
		else {
		    self.handleErr(resp);
		}
	    }
	}
	req.send(this.dataPayload);
    };
    
    this.abort = function() 
    {
	if (this.req) {
	    this.req.onreadystatechange = function() { };
	    this.req.abort();
	    this.req = null;
	}
    };
    
    this.handleErr = function() 
    {
	var errorWin;
	// Create new window and display error
	try {
	    errorWin = window.open('', 'errorWin');
	    errorWin.document.body.innerHTML = this.responseText;
	}
	// If pop-up gets blocked, inform user
	catch(e) {
	    alert('An error occurred, but the error message cannot be' +
		' displayed because of your browser\'s pop-up blocker.\n' +
		'Please allow pop-ups from this Web site.');
	}
    };
      
}

