
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.insecure = false;
	this.message = "";
	this.saveFields = "all";
	this.addFields = null;
	this.ignoreErrors = false;
	
	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() {
	 	var obj = this;
	 	var request = obj.init();
	 	if (!request) {
	   	alert('Could not create XMLHttpRequest object.');
	   	return;
	 	}
		request.open(obj.method, obj.url, obj.async);
		if (obj.mimeType) {
		 	try {
		   	request.overrideMimeType(obj.mimeType);
		 	}
		 	catch (e) {
		   // couldn't override MIME type  --  IE6 or Opera?
		 	}
		}

		request.onreadystatechange = function() {
		 	var resp = null;		 	
		 	if (request.readyState == 4) {
		   	switch (obj.responseFormat) {
		     	case 'text':
		       	resp = request.responseText;
		       	break;
		     	case 'xml':
		       	resp = request.responseXML;
		       	break;
		     	case 'object':
		       	resp = request;
		       	break;
			   	}
			   	try{
				   	if (request.status >= 200 && request.status <= 299) {
				     	obj.handleResp(resp);
				   	} else {
				     	obj.handleErr(resp);
				   	}
			   	}catch(e){}
			   	
		 	}
		};
		if(obj.method.toUpperCase() == "POST"){
			request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;");
			if( obj.insecure === true ){
				alert(obj.message);
			}
		}
		request.send(obj.postData);
		var resp = null;
		if(obj.async == false)
			switch (obj.responseFormat) {
		     	case 'text':
		       	resp = request.responseText;
		       	break;
		     	case 'xml':
		       	resp = request.responseXML;
		       	break;
		     	case 'object':
		       	resp = request;
		       	break;
				}
			return resp; 
	};

	this.setMimeType = function(mimeType) {
	 	this.mimeType = mimeType;
	};

	this.setMessage = function(message) {
	 	this.message = message;
	};
	
	this.handleErr = function() {
		if (this.ignoreErrors == true) {
			return;
		}
	 	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.insecure = false;
	   	this.postData = null;
	   	this.saveFields = "all";
	   	this.addFields = null;
	   	this.url = null;
	 	}
	};

	this.doGet = function(url, hand, format) {
	 	this.url = url;
	 	this.handleResp = hand;
	 	this.responseFormat = format || 'text';
	 	if(this.async == false)
	 		return this.doReq();
	 	else
	 		this.doReq();
	};
	
	this.doPost = function(url, hand, format, params) {
	 	this.url = url;
	 	this.handleResp = hand;
	 	this.responseFormat = format || 'text';
	 	this.method = 'POST';
	 	this.postData = params;	 	
	 	this.doReq();
	};
	
	this.Dec2Hex = function(Dec){ 
		var hexChars = "0123456789ABCDEF";		
		var a = Dec % 16; 
		var b = (Dec - a)/16; 
		hex = "" + hexChars.charAt(b) + hexChars.charAt(a); 
		return hex; 
	}
	
	this.specialChar = function(param){
		var len = param.length;
		var arr = param.split("");
			
		for(var i = 0; i < len; i++){
			if((param.charCodeAt(i) < 48) || ((param.charCodeAt(i) > 57) && (param.charCodeAt(i) < 65)) || ((param.charCodeAt(i) > 90) && (param.charCodeAt(i) < 97)) || (param.charCodeAt(i) > 122)){
				if( param.charCodeAt(i) > 8200 ){
					this.insecure = true;
				}
				arr[i] = "%" + this.Dec2Hex(param.charCodeAt(i));
			}
		}
		return arr.join("");
	}
	
	this.saveForm = function(formName, handxml, format){
		
		var arr    = new Array();
		var form   = document.getElementById(formName);
		var len    = form.elements.length;
		var url    = form.action;
		var method = form.method;
		var name   = '';
		var j = 0;

		/*
		if( !checkRequired() ){
			return false;
		}
		*/
		
		if( this.addFields != null ){
			arr[j++] = this.addFields;
		}

		for(var i = 0; i < len; i++) {
			name = '';
			if( typeof form.elements[i].name != "undefined" ){
				name = form.elements[i].name;
				if( form.elements[i].disabled === true ) continue;
				//alert (form.elements[i].tagName);
				if(form.elements[i].tagName == "SELECT" && form.elements[i].multiple == true){
					for(var u = 0; u < form.elements[i].length; u++){
						if(form.elements[i].options[u].selected == true){
							var value = this.specialChar(form.elements[i].options[u].value);
							arr[j++] = name + "=" + value;
						}
					}
				}
				else {
					if (form.elements[i].tagName == "INPUT" && (form.elements[i].type.search(/checkbox|radio/) != -1) && !form.elements[i].checked) 
						continue;
					else {
						var value = this.specialChar(form.elements[i].value);
						arr[j++] = encodeURIComponent(name) + "=" + value;
					}
				}
			} 
		}
		//alert (arr.join("&"));
		if( method.toLowerCase() == 'post' ){
			if( arr.length > 1 ){
				this.doPost(form.action, handxml, format, ((url.indexOf("?") == -1)?"?":"&") + arr.join("&"));
			}
		} else if(method.toLowerCase() == 'get' || method.toLowerCase() == '') {
			this.doGet(form.action + ((url.indexOf("?") == -1)?"?":"&") + arr.join("&"), handxml, format);
		}
		
		return arr;
	}

	this._in_array = function(needle, arr, findkey){
		if( typeof arr != 'object' ){
			return false;
		}
		
		if( findkey == null ){
			findkey = false;
		}
		
		for( var i in arr ){
			if( (needle == arr[i]) || ((findkey) && (needle == i)) ){
				return true;
			}				
		}
		return false;
	}
}
