
function AjaxClient(){
	var xmlHTTPRequest = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("MSXML2.XMLHTTP");

	var replace_pattern_list = [
		{'pattern': /!/g,	'string': '%21'},
		{'pattern': /#/g,	'string': '%23'},
		{'pattern': /\$/g,	'string': '%24'},
		{'pattern': /&/g,	'string': '%26'},
		{'pattern': /'/g,	'string': '%27'},
		{'pattern': /\(/g,	'string': '%28'},
		{'pattern': /\)/g,	'string': '%29'},
		{'pattern': /\+/g,	'string': '%2B'},
		{'pattern': /,/g,	'string': '%2C'},
		{'pattern': /\//g,	'string': '%2F'},
		{'pattern': /:/g,	'string': '%3A'},
		{'pattern': /;/g,	'string': '%3B'},
		{'pattern': /=/g,	'string': '%3D'},
		{'pattern': /\?/g,	'string': '%3F'},
		{'pattern': /@/g,	'string': '%40'},
		{'pattern': /\\/g,	'string': '%5C'},
		{'pattern': /~/g,	'string': '%7E'}
	];

	var execcuter = new Array(
		function (responseObject){},
		function (responseObject){},
		function (responseObject){},
		function (responseObject){}
	);

	var contentType = "application/x-www-form-urlencoded;charset=euc-jp";

	this.handleEvent = handleEvent;
	function handleEvent(inResponseObject){
		var responseObject = inResponseObject;
		var closure = function (){
			execcuter[responseObject.readyState](responseObject);
		}
		return closure;
	}

	this.getExeccuter = getExeccuter;
	function getExeccuter(){
		return execcuter;
	}

	this.setExeccuter = setExeccuter;
	function setExeccuter(index, inExeccuter){
		 execcuter[index] = inExeccuter;
	}

	this.setExeccuterList = setExeccuterList;
	function setExeccuterList(inExeccuterList){
		 execcuter = inExeccuterList;
	}

	this.setHandler = setHandler;
	function setHandler(){
		xmlHTTPRequest.onreadystatechange = this.handleEvent(xmlHTTPRequest);
	}

	this.open = open;
	function open(method, url, synchronizeFlag){
		this.setHandler();

		xmlHTTPRequest.open(method, url , synchronizeFlag);
		if (method == 'POST'){
			xmlHTTPRequest.setRequestHeader("Content-Type" , contentType);
		}
	}

	this.setRequestHeader = function(str) {
		contentType = str;
	}

	this.array2HTTPParam = array2HTTPParam;
	function array2HTTPParam(arr){
		var temp = new Array();
		for (key in arr){
			temp[temp.length] = this.urlEncode(key) +"="+ this.urlEncode(arr[key]);
		}

		temp = temp.join("&");
		return temp;
	}

	this.submit = submit;
	function submit(method, url, synchronizeFlag, dataArray){
		this[method](url, synchronizeFlag, dataArray);
	}

	this.post = post;
	function post(url, synchronizeFlag, dataArray){
		var data = null;
		if (dataArray != null) data = this.array2HTTPParam(dataArray);

		this.open("POST", url, synchronizeFlag);
		this.send(data);
	}

	this.get = get;
	function get(url, synchronizeFlag, dataArray){
		if (dataArray != null) url += "?"+ this.array2HTTPParam(dataArray);
		this.open("GET", url, synchronizeFlag);
		this.send(null);
	}

	this.abort = abort;
	function abort(){
		xmlHTTPRequest.abort();
	}

	this.send = send;
	function send(data){
		xmlHTTPRequest.send(data);
	}

	this.urlEncode = function (str){
		str = encodeURIComponent(str);

		for (i in replace_pattern_list) {
			replace_pattern = replace_pattern_list[i];
			str = str.replace(replace_pattern.pattern, replace_pattern.string);
		}

		return str;
	}
}
