function Ajax()
{
	this.req = null;
	this.url = null;
	this.method = 'GET';
	this.async = true;
	this.status = null;
	this.statusText = '';
	this.postData = null;
	this.readyState = null;
	this.responseText = null;
	this.responseXML = null;
	this.handleResp = null;
	this.responseFormat = 'text', // 'text', 'xml', or 'object'
	this.mimeType = null;
	
	this.dataArrayHolder = new Array();
	
	this.init = function()
				{
					if (!this.req)
					{
						try
						{
							// Try to create object for Firefox, Safari, IE7, etc.
							this.req = new XMLHttpRequest();
						}
						catch (e)
						{
							try
							{
								// Try to create object for later versions of IE.
								this.req = new ActiveXObject('MSXML2.XMLHTTP');
							}
							catch (e)
							{
								try
								{
									// Try to create object for early versions of IE.
									this.req = new ActiveXObject('Microsoft.XMLHTTP');
								}
							catch (e)
							{
								// Could not create an XMLHttpRequest object.
								return false;
							}
						}
					}
				}
				return this.req;
			};
				
	this.doReq = function()
				{
					if (!this.init())
					{
						alert('Could not create XMLHttpRequest object.');
						return;
					}

					this.req.open(this.method, this.url, this.async);
					
					if (this.method == "POST")
					{
						this.req.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");
					}
					
					if (this.mimeType)
					{
						try
						{
							req.overrideMimeType(this.mimeType);
						}
						catch (e)
						{
							alert('couldn\'t override MIME type')// couldn't override MIME type -- IE6 or Opera?
						}
					}
					
					var self = this; // Fix loss-of-scope in inner function
					this.req.onreadystatechange = function()
													{
														var resp = null;
														if (self.req.readyState == 0)
														{
															//alert('uninitialized');// open has not been called yet.
														}
														
														if (self.req.readyState == 1)
														{
															//alert('loading');// send has not been called yet
														}
														
														if (self.req.readyState == 2)
														{
															//alert('loaded');// send has been called, but the response 
																			// is not yet available
														}
														
														if (self.req.readyState == 3)
														{
															//alert('interactive');// The response is being downloaded, 
																				// and the responseText property holds partial data.
														}
														
														if (self.req.readyState == 4)
														{
															switch (self.responseFormat)
															{
																case 'text':	resp = self.req.responseText;
																				break;
																case 'xml':		resp = self.req.responseXML;
																				break;
																case 'object':	resp = req;
																				break;
															}
															
															if (self.req.status >= 200 && self.req.status <= 299)
															{
																self.handleResp(resp);
															}
															else
															{
																self.handleErr(resp);
															}
														}
													};
					this.req.send(this.postData);
				};
				
	this.setMimeType = function(mimeType)
						{
							this.mimeType = mimeType;
						};
	
	this.handleErr = function()
					{
						var errorWin;
						try
						{
							errorWin = window.open('', 'errorWin');
							errorWin.document.body.innerHTML = this.responseText;
						}
						catch (e)
						{
							alert('An error occurred, but the error message cannot be '
							+ 'displayed. This is probably because of your browser\'s '
							+ 'pop-up blocker.\n'
							+ 'Please allow pop-ups from this web site if you want to '
							+ 'see the full error messages.\n'
							+ '\n'
							+ 'Status Code: ' + this.req.status + '\n'
							+ 'Status Description: ' + this.req.statusText);
						}
					};
	
	this.setHandlerErr = function(funcRef)
						{
							this.handleErr = funcRef;
						}
	
	this.setHandlerBoth = function(funcRef)
							{
								this.handleResp = funcRef;
								this.handleErr = funcRef;
							};
	
	this.abort = function()
				{
					if (this.req)
					{
						this.req.onreadystatechange = function()
														{ };
						this.req.abort();
						this.req = null;
					}
				};
				
	this.doGet = function(url, hand, format)
				{
					this.url = url;
					this.handleResp = hand;
					this.responseFormat = format || 'text';
					this.doReq();
				};
				
	this.doPost = function(url, postData, hand, format)
					{
						this.url = url;
						this.handleResp = hand;
						this.responseFormat = format || 'text';
						this.method = 'POST';
						this.postData = postData;
						this.doReq();
					};
					
					
					
					
					
					
					
					
					
					
}
