function phxajax_getResponsePart(response,tag)
{
	var debut = response.indexOf("{" + tag + "}");
	if(debut>-1)
	{
		var fin = response.indexOf("{/" + tag + "}");
		var tag_content = response.substring((debut+tag.length+2),fin);
		return tag_content;
	}
	return "";
}

function phxajax_treatAjaxDebug(debug_content,debug_cumul)
{
	var debug_div = "debug_ajax_ajax";
	if(debug_content!="")
	{
		if($(debug_div))
			var div_debug = $(debug_div);
		else
		{
			var div_debug = document.createElement('div');
			div_debug.setAttribute("id", debug_div);
			document.body.appendChild(div_debug);
		}
		
		if(debug_cumul)
			Element.insert(div_debug,{bottom:debug_content});
		else
			Element.update(div_debug,debug_content);
	}
}

function phxajax_cleanResponse(response,tag,content)
{
	return response.replace("{" + tag + "}" + content + "{/" + tag + "}","");
}

function phxajax_treatFatalError(content)
{
	if(content.indexOf('<b>Fatal error</b>')>-1)
	{
		var msg = content.replace("<b>Fatal error</b>","").replace("<br />","");
		var lvl='fatal';
		return {msg:msg,level:lvl,exist:true};
	}
	else
		return false;
}
function phxajax_treatAjaxError(erreur_content)
{
	var msg ="";
	var lvl ="";
	var exist = true;
	if(erreur_content.indexOf("<b>ERREUR</b>")>-1)
	{
		msg = erreur_content.replace("<b>ERREUR</b>","").replace("<br />","");
		lvl = "error";
	}
	else if(erreur_content.indexOf("<b>WARNING</b>")>-1)
	{
		msg = erreur_content.replace("<b>WARNING</b>","").replace("<br />","");
		lvl = "warning";
	}
	else if(erreur_content.indexOf("<b>INFO</b>")>-1)
	{
		msg = erreur_content.replace("<b>INFO</b>","").replace("<br />","");
		lvl = "info";
	}
	else
		return false;
	return {msg:msg,level:lvl,exist:exist};
}

function phxTreatAjaxCall(response,callback,callback_error,params)
{
	var erreur_tag = "phx_error";
	var debug_tag = "phx_debug";
	var cumul_tag = "cumulative_debug";
	var err = new Array();
	//Recuperation du flag de cumul
	if(response.indexOf("{" + cumul_tag + "}")>-1)
	{
		var debug_cumul = true;
		response = response.replace("{" + cumul_tag + "}","");
	}
	else
		var debug_cumul = false;
		
	//Traitement pour le debug ajax
	var debug_content = phxajax_getResponsePart(response,debug_tag);
	phxajax_treatAjaxDebug(debug_content,debug_cumul);
	response = phxajax_cleanResponse(response,debug_tag,debug_content);
	
	//Traitement pour les erreurs ajax
	while(response.indexOf("{"+erreur_tag+"}")>-1)
	{
		var erreur_content = phxajax_getResponsePart(response,erreur_tag);
		var phx_err = phxajax_treatAjaxError(erreur_content);
		if(phx_err!=false)
			err.push(phx_err);
		response = phxajax_cleanResponse(response,erreur_tag,erreur_content);
	}
	//Erreur fatal comme timeout excedeed
	var err_fatal = phxajax_treatFatalError(response);
	if(err_fatal!=false)
		err.push(err_fatal);
		
	if(callback_error && callback_error(err,params))
		callback(response,params);	
}

function phxAjaxCall(asynchrone,url,post,callback,callback_error,params)
{
	var params = params || "";
	var err = new Array();
	new Ajax.Request(url, {
		asynchronous: asynchrone, 
		postBody: post,
		onSuccess: function(zhr)
		{
			phxTreatAjaxCall(zhr.responseText,callback,callback_error,params);
			return;
		},
		onFailure: function(zhr)
		{
			//Fatal erreur send when a new erreur is used in prod mode
			var msg = "Une erreur inconnue s'est produite, veuillez r&eacute;essayer ult&egrave;rieurement.";
			var lvl='fatal';
			err.push({msg:msg,level:lvl,exist:true});
			if(callback_error)
				callback_error(err,params);
			return;
		}
	});
}
