function ajax(){
	this.responseObject = null;
	this.onload = null;
	this.onerror = function(){
		alert(this.request.status);
	}
	
	if (window.XMLHttpRequest) { // Mozilla, Safari,...
		this.request = new XMLHttpRequest();
		if (this.request.overrideMimeType) {
			this.request.overrideMimeType('text/xml');
		}
	} else if (window.ActiveXObject) { // IE
		try {
			this.request = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try {
				this.request = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e) {}
		}
	};
	
	this.error = !this.request;
	
	this.send = function(aMethod, aUrl, aParams){
		if(this.error){
			return;
		}
		inProgress = true;

		this.request.onreadystatechange = this.bind(this, this.onreadystatechange);
		this.request.open(aMethod, aUrl, true);
		this.request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		this.request.send(aParams);
	};
	
	
	this.bind = function(object, method){
		return function(){
			return method.apply(object, arguments);
		}
	};
	
	this.onreadystatechange = function(){
		if(this.request.readyState == 4){
			if(this.request.status == 200){
				inProgress = false;
				stopLoader();
				if(window.ActiveXObject && this.request.responseXML.lastChild==null && this.request.responseText.indexOf("<")==0){
					this.request = {responseXML:null, responseText:this.request.responseText};
					this.request.responseXML = this.ieParse();
				}
				try{
					this.request.responseObject = eval(this.request.responseText);
				}catch(e){}
//				if(this.request.responseXML!=null)
//					this.responseObject = this.unserialize(this.request.responseXML.lastChild);
				if(!this.onfail()){
					if(this.onload)
						this.onload();
				}else{
					if(this.onfailed)
						this.onfailed();
				}
			}else{
				if(this.onerror)
					this.onerror(this.request.status);
			}
		}
	};
	
	this.onfail = function(){
		if(this.request.responseText.indexOf("<")!=0)
			return false;
		if(window.ActiveXObject && this.request.responseXML==null){
			var lStr = "PARSER_ERROR\n";
			lStr += this.request.responseText;
			alert(lStr);
			return true;
		}else{
			var lFirst = this.request.responseXML.firstChild;
			if(lFirst==null 
				|| lFirst.nodeName==null 
				|| lFirst.nodeName=="parsererror"){
				var lStr = "PARSER_ERROR\n";
				lStr += (lFirst!=null && lFirst.textContent!=null)?"\n"+lFirst.textContent:"";
				alert(lStr);
				return true;
			}
			var lErrors = this.request.responseXML.getElementsByTagName("error");
			var lStr = "";
			for(var i=0; i<lErrors.length; i++){
				lStr += I18N.getKey(lErrors[i].firstChild.nodeValue) + "\n";
			}
			if(lErrors.length>0)
				alert(lStr);
			return (lErrors.length>0);
		}
	}
	
	this.getArray = function(aPath){
		var lName = aPath.split(".");
		var lObject = this.responseObject
		for(var i=0; i<lName.length; i++){
			if(lObject[lName[i]]!=null){
				lObject = lObject[lName[i]];
			}else{
				return [];
			}
		}
		if(lObject!=null && typeof(lObject.push) == "undefined"){
			return [lObject];
		}else{
			if(lObject!=null){
				return lObject;
			}else{
				return []
			}
		}
	}
	
	this.unserialize = function(aXML){
		var lObject = {};
		if(aXML==null) return null;
		if(aXML.nodeName==null || aXML.nodeName=="parsererror") return null;
		if(aXML.attributes.length==0 && !aXML.hasChildNodes()) return "";
		
		for(var a=0; a<aXML.attributes.length; a++){
			lObject[aXML.attributes[a].nodeName] = aXML.attributes[a].nodeValue;
		}
		for(var i=0; i<aXML.childNodes.length; i++){
			var lNodeName = aXML.childNodes[i].nodeName;
			if(lObject[lNodeName]!=null && typeof(lObject[lNodeName].push)=="undefined"){ 
				var lValue = lObject[lNodeName];
				lObject[lNodeName] = new Array();
				lObject[lNodeName].push(lValue);
			}
			if(aXML.childNodes[i].firstChild && aXML.childNodes[i].firstChild.nodeType==3){
				var lValue = "";
				for(var j=0;j<aXML.childNodes[i].childNodes.length; j++){
					if(aXML.childNodes[i].childNodes[j].nodeType==3)
						lValue += aXML.childNodes[i].childNodes[j].nodeValue;
				}
				if(lObject[lNodeName]!=null)
					lObject[lNodeName].push(lValue);
				else
					lObject[lNodeName] = lValue;
			}else if(aXML.childNodes[i].nodeType==1){
				if(lObject[lNodeName]!=null)
					lObject[lNodeName].push(this.unserialize(aXML.childNodes[i]));
				else
					lObject[lNodeName] = this.unserialize(aXML.childNodes[i]);
			}
		}
		return lObject;
	};

	this.ieParse = function(){
		var xmlDocument = new ActiveXObject("Microsoft.XMLDOM");
		xmlDocument.async = "false";
		xmlDocument.loadXML(this.request.responseText);
		return xmlDocument.firstChild;
	}
}
