function Ajax()
{
	var self = this;
	
	//private
	self.m_error = false;
	self.m_ret = "";
	self.m_msg = "";
	self.m_req =null;
	self.m_busy=0;
	self.callBack = null;
	
	// public
	self.isError = function()
	{
		self.testReturn();
		return self.m_error;
	}
	self.setCallBackFct = function(_f)
	{
		self.callBack = _f;
	}	
	self.getMsg = function()
	{
		return self.m_msg;
	}	
	self.getRet = function()
	{
		return self.m_ret;
	}
	self.getXmlAnswer = function ()
	{
		if ((self.m_req) && (self.m_req.responseXML))
			return self.m_req.responseXML;
		else 
			return null;
	}
	
	// private
	self.stopCurrentReq = function()
	{
		if (self.m_req) {
			self.m_req.abort();
			delete self.m_req;
			self.m_req=null;
		}
	}
		
	// httpRequest: page: page, method: ["GET"|"POST"], param parameter
	// ex: httpRequest('save.php','POST','alain=subtitle^start_time^end_time^index^line^index^p_word^word_index^segment_index^index');	
	self.httpRequest = function(page, method, param) 
	{
		//LDF("httpRequest");
		var argv=this.httpRequest.arguments;
		var argc=this.httpRequest.arguments.length;
		var b_asychro=(argc >3) ? argv[3] : true;
		
		//LOGDEBUG("1page:"+page);
		//LOGDEBUG("2param:"+param);
		//LOGDEBUG("3method:"+method);
		// to avoid the SAME USER send a requet before the previous one has finished
		////LOGDEBUG("self.m_busy:"+self.m_busy);
		if (self.m_busy > 0) {
			// after 3 times we let the paket go in as perhaps there's a network problem for the previous answer
			if (self.m_busy > 3) {
				self.stopCurrentRequest();
				self.m_busy = 0; // re init		
			}
			else { //stop packet
				//LOGDEBUG("Page not free:",2);
				//LDB("httpRequest");
				return;
			}
		}
		self.m_busy++;
		
		if (self.m_req) {
			delete self.m_req;
			self.m_req = null;
		}
		if (window.XMLHttpRequest) {		// 	mozilla, safari
			self.m_req = new XMLHttpRequest();
		}
		else { 
			self.m_req = new ActiveXObject("Microsoft.XMLHTTP");	
		}
		if (self.m_req) {
			//LOGDEBUG("self.m_req.readyState:"+self.m_req.readyState,2);
			// Set handler for state change notification
			self.m_req.onreadystatechange = self.processReqChange;
			
			if (method=="GET") {
				LOGDEBUG("get method");
				if (param.length>510) {
					self.stopCurrentReq();
					//LDB("httpRequest");
					throw new Error("You cannot send a request size > 512 with GET method. Use POST instead.");
					return;
				}
				else {
					var request = page + "?" + param;
					//LOGDEBUG("open");
					self.m_req.open(method, request, b_asychro);
					//LOGDEBUG("send");
					self.m_req.send("");
				}
			} 
			
			else if (method=="POST") {
				//LOGDEBUG("open");
				self.m_req.open(method, page, b_asychro);
				//LOGDEBUG("header");
				self.m_req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
				//self.m_req.send('arg1=val1&arg2=val2&arg3=val3');
				//LOGDEBUG("send");
				self.m_req.send(param);
			} 
			else {
				self.stopCurrentReq();
				//LDB("httpRequest");
				throw new Error("Method: "+method+" unknow");
				return;
			}		
		}
		else {
			//LOGDEBUG("Unable to get XMLHttpRequest object");
			self.m_busy--;
			//LDB("httpRequest");
			return;
			//throw new Error("Unable to get XMLHttpRequest object");
		}
		if (!b_asychro) self.callBack();
		//LDB("httpRequest");
		//DISABLE_DEBUG();
	}
	// onreadystatechange handler
	self.processReqChange = function() 
	{
		//LOGDEBUG("processReqChange");
		if (self.m_req.readyState == 4) {
			// Only if "OK"
			if (self.m_req.status == 200) {
				////LOGDEBUG("status OK");
				self.callBack();
			}
			else {
				self.m_busy--;
				stopCurrentReq();
				//LOGDEBUG("Error retrieving XML data:\n"+ self.m_req.stateText);
				return;
				//throw new Error("Error retrieving XML data:\n"+ self.m_req.stateText);
			}
		}
	}
	// return the returned XML tag value of "status" 
	// return "ERROR .... " if not
	
	
	
	self.testReturn = function()
	{
	// the target page work is done
		var parent = self.m_req.responseXML;
		//LOGDEBUG("Parent:"+parent);DEBUGNODE(parent);		
		if (!parent){
			self.m_error = true;
			self.m_msg = "AJAX ERROR: No answer object";
			//LOGDEBUG(self.m_msg);
			return;
		}
		else {
			//LOGDEBUG("get List coucou");
			var list = parent.getElementsByTagName("result");
			if ((list==null) || (list.length==0)) {
				self.m_error = true;
				self.m_msg = "AJAX ERROR: the return is not an well formed xml document : result empty";
				//LOGDEBUG(self.m_msg);
				return;
			}
				if (list!=null) {
				//LOGDEBUG("list.length: "+list.length);
			}
			
			//LOGDEBUG("list.childNodes: "+list.childNodes);
			var nodeResult = list[0];		//nod result
			//LOGDEBUG(" nodeResult.nodeName: "+nodeResult.nodeName+"\n nodeResult.length: "+nodeResult.length+"\n nodeResult.childNodes: "+nodeResult.childNodes+ "\n nodeResult.childNodes.length: "+nodeResult.childNodes.length);
			
			var status ="ERROR";
			var progress ="";
				
			for (var i = 0; i < nodeResult.childNodes.length; ++i) {
				var node = nodeResult.childNodes[i];
				//LOGDEBUG(" node.nodeName: "+node.nodeName+"\n node.length: "+node.length+"\n node.childNodes: "+node.childNodes+ "\n node.childNodes.length: "+node.childNodes.length);
				
				if (node.childNodes.length) {
					switch (node.nodeName) {
						case "status":
							//LOGDEBUG("status found");
							status = node.firstChild.nodeValue;
							
							//LOGDEBUG("node.attributes.length:"+node.attributes.length);
							for (var j = 0; j < node.attributes.length; ++j) {
								if (node.childNodes.length) {
									//LOGDEBUG("node.attributes.name[j]:"+node.attributes[j].name);
									//LOGDEBUG("node.attributes.value:[j]"+node.attributes[j].value);
								}
							}
							
							//LOGDEBUG("value:"+status);
							break;
						case "progress":
							//LOGDEBUG("progress found");
							progress = node.firstChild.nodeValue;
							//LOGDEBUG("value:"+progress);
							break;
						default :
							break;
					}
				}	
			}
			//LOGDEBUG("end status found");
			if (status=="ERROR") {
				self.m_error = true;
			}
			else {
				self.m_error = false;
			}
			self.m_ret = status;
			self.m_msg = progress;
			
			self.m_busy--;
			return;
		}
		if (self.m_req) {
			delete self.m_req;
			self.m_req = null;
		}
		//LOGDEBUG("END targetPageWorkDone");
	}
}