﻿
function Ajax() {
	//data members
	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.handleReadyStateChange = null;
	this.responseFormat = 'text', // 'text', 'xml', or 'object'
	this.mimeType = null;

	var me = this;

	//properties
	this.setMimeType = function(mimeType) {
		me.mimeType = mimeType;
	};
	this.setHandlerErr = function(funcRef) {
		me.handleErr = funcRef;  
	};
	this.setHandlerBoth = function(funcRef) {
		me.handleResp = funcRef;
		me.handleErr = funcRef;
	};
	//functions
	this.init = function() {
	 if (!me.req) {
		 try {
			 // Try to create object for Firefox, Safari, IE7, etc.
			 me.req = new XMLHttpRequest();
		 }
		 catch (e) {
			 try {
				 // Try to create object for later versions of IE.
				 me.req = new ActiveXObject('MSXML2.XMLHTTP');
			 }
			 catch (e) {
				 try {
					 // Try to create object for early versions of IE.
					 me.req = new ActiveXObject('Microsoft.XMLHTTP');
				 }
				 catch (e) {
					 // Could not create an XMLHttpRequest object.
					 return false;
				 }
			 }
		 }
	 }
	 return me.req;
	};

	this.doReq = function() {
		if (!me.init()) {
			alert('Could not create XMLHttpRequest object.');
			return;
		}
		me.req.open(me.method, me.url, me.async);
		if (me.mimeType) {
			try {
				req.overrideMimeType(me.mimeType);
			}
			catch (e) {
				// couldn't override MIME type  --  IE6 or Opera?
			}
		}

		var myonreadystatechange = function() {
			var resp = null;
			me.readyState = me.req.readyState;
			if(me.handleReadyStateChange)
				me.handleReadyStateChange();
			
			if (me.req.readyState == 4) {
				switch (me.responseFormat) {
					case 'text':
						resp = me.req.responseText;
						break;
					case 'xml':
						resp = me.req.responseXML;
						break;
					case 'object':
						resp = req;
						break;
				}
				if (me.req.status >= 200 && me.req.status <= 299) {
					me.handleResp(resp);
				}
				else {
					if(me.handleErr != null && me.handleErr != undefined)
						me.handleErr(resp);
				}
			} 
 		}; 
		if(me.async)
			me.req.onreadystatechange = myonreadystatechange;
		me.req.setRequestHeader('Content-Type','application/x-www-form-urlencoded;charset=UTF-8');
		//me.req.setRequestHeader('ContentEncoding', "UTF-8");
		me.req.send(me.postData);
		if(!me.async)
		{
			myonreadystatechange();
		}
	};

	// Default error handler
	this.handleErr = function() {
		var errorWin;
		try {
			errorWin = window.open('', 'errorWin');
			errorWin.document.body.innerHTML = me.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: ' + me.req.status + '\n'
					+ 'Status Description: ' + me.req.statusText);
		}
	};

	this.abort = function() {
		if (me.req) {
			me.req.onreadystatechange = function() { };
			me.req.abort();
			me.req = null;
		}
	};	

	this.doGet = function(url, hand, format) {
		me.url = url;
		me.handleResp = hand;
		me.responseFormat = format || 'text';
		me.doReq();
	};
	this.doPost = function (url, params, hand, format) {
		me.method = "POST";
		me.url = url;

		me.postData = params;
		me.handleResp = hand;
		me.responseFormat = format || "text";
		me.doReq();
	}
}
