function ajax() {
	var classObj = this ;
	
	this.passingData = null ;
	this.url = "" ;
	this.method = "GET" ;
	this.timeout = 60 ;
	this.responseType = "text" ; // text or xml
	this.callback = function () {} ;
	this.status = 0 ;
	
	/*
		Ajax Status : 
		0 : Init Value
		1 : Success Requested
		2 : Failed, Can not create XMLHttpRequest Object
		3 : Failed, Connection timeout
		4 : This service is not found in the server (http error 404)
		5 : This service encounter problem (http error 500) 
		6 : Request Cancelled
		7 : Failed, Cross Domain Is Not Allowed
	*/
	
	var http_request = false ;
	var start_time ;
	var end_time ;
	var timeout_status ;
	var request_status ;
	
	this.requestAjax = initRequest ;
	this.start = initRequest ;
	function initRequest() {
		start_time = new Date() ;
		end_time = new Date() ;
		timeout_status = false ;
		request_status = false ;
		classObj.callback = classObj.callbackFunction || function() { } ;
		classObj.responseType = classObj.responseType.toLowerCase() ;
		
		var url = classObj.url ;
		var url_post = url ;
		var url_send = null;
		if (url.indexOf('?') > 0) {
			url_post = url.substring(0,url.indexOf('?'));
			url_send = url.substring(url.indexOf('?')+1);
		} else {
			url_post = url ;
			url_send = null ;
		}
		
		http_request = false;
		if (window.XMLHttpRequest) { // Mozilla, Safari,...
			http_request = new XMLHttpRequest();
			if (http_request.overrideMimeType) {
				http_request.overrideMimeType('text/xml');
			}
		} else if (window.ActiveXObject) { // IE
			try {
				http_request = new ActiveXObject("Msxml2.XMLHTTP");
			} catch (e) {
				try {
					http_request = new ActiveXObject("Microsoft.XMLHTTP");
				} catch (e) {
				}
			}
		}
	
		if (!http_request) {
			classObj.status = 2 ;
			ajaxDone() ;
			return false;
		}
		http_request.onreadystatechange = ajaxReady ;
		try {
			if ((classObj.method).toUpperCase() == 'POST')
			{
				http_request.open('POST', url_post, true);
				http_request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
				http_request.setRequestHeader("Content-length", url_send.length);
				http_request.setRequestHeader("Connection", "close");
			} else {
				http_request.open('GET', url, true);
			}
		} catch (err) {
			var errMsg = trim(err.message) ;
			if (errMsg == "Access is denied." || errMsg == "Access to restricted URI denied") {
				classObj.status = 7 ;
				ajaxDone() ;
			} else {
				alert("-"+errMsg+"-") ;
			}
		} finally {
			http_request.send(url_send);
		}
		request_status = true ;
		checkTimer();
	}
	
	this.cancel = cancelRequest ;
	this.stop = cancelRequest ;
	function cancelRequest() {
		classObj.status = 6 ;
		http_request.abort() ;
		ajaxDone() ;
	}
	
	function ajaxReady() {
		if (http_request.readyState == 4) {
			request_status = false ;
			if (http_request.status == 200) {
				if (!timeout_status) {
					classObj.status = 1 ;
					ajaxDone() ;
				}
			} else if (http_request.status == 404) {
				//alert('This service is not found in the server, please contact this site administrator.');
				classObj.status = 4 ;
				ajaxDone() ;
			} else if (http_request.status == 500) {
				//alert('This service encounter problem, please contact this site administrator.');
				classObj.status = 5 ;
				ajaxDone() ;
			}
		}
	}
	
	function checkTimer() {
		end_time = new Date() ;
		var timer = Math.round((end_time.getTime() - start_time.getTime())/1000) ;
		if (timer > classObj.timeout) {
			var timeout_display = (timeout_status == false)?true:false;
			timeout_status = true ;
			http_request.abort() ;
			if (timeout_display) {
				classObj.status = 3 ;
				ajaxDone() ;
			}
		}
		if (request_status) {
			setTimeout(checkTimer,1000) ;
		}
	}
	
	function ajaxDone() {
		if (classObj.status == 1) {
			if (classObj.response_type == "xml") {
				classObj.callback(classObj.status,getXML(),classObj.passingData) ;
			} else {
				classObj.callback(classObj.status,getText(),classObj.passingData) ;
			}
		} else {
			if (classObj.response_type == "xml") {
				classObj.callback(classObj.status,getXML(),classObj.passingData) ;
			} else {
				var xmlDoc ;
				try { //Internet Explorer
					xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
				} catch(e) {
					xmlDoc = document.implementation.createDocument("","",null);
				}
				
				classObj.callback(classObj.status,xmlDoc,classObj.passingData) ;
			}
		}
	}
	
	function getText() {
		if (!http_request) {
		} else {
			if (!http_request.responseText) {
			} else {
				return http_request.responseText ;
			}
		}
		return "" ;
	}
	
	function getXML() {
		if (!http_request) {
		} else {
			if (!http_request.responseXML) {
			} else {
				return http_request.responseXML ;
			}
		}
		try { //Internet Explorer
			return new ActiveXObject("Microsoft.XMLDOM");
		} catch(e) {
			try { //Firefox, Mozilla, Opera, etc.
				return document.implementation.createDocument("","",null);
			} catch(e) {
				return ;
			}
		}
	}
	
	
}

