var bloc_msg = "msg_display";
var bloc_msg_content = "msg_content";
var bloc_btn_confirm = "btn_confirm";
var duree_msg = 1200;
var t;
function PHX_clean_browser(ctn)
{
	var elems = $(ctn).select(".brw_unload");
	elems.each(function(item){
		if(brw_objects[item.value])
		{
			brw_objects[item.value];
			brw_objects[item.value].quit();
		}
	});
}
// *******************************************
// Attente utilisateur
// *******************************************
function PHX_show_wait()
{
	var wait = $('wait_display');
	if(wait)
		new Effect.Appear(wait);
}

function PHX_hide_wait()
{
	var wait = $('wait_display');
	wait.style.display="none";
}

// *******************************************
// MESSAGE UTILISATEUR
// *******************************************
function PHX_error_handler(err,param)
{
	//Recherche d'erreur fatal on l'affiche
	for(var i=0; i<err.length; i++)
	{
		if(err[i].level=='fatal')
		{
			PHX_dispusrmsg(err[i].msg,"msg_ko");
			PHX_hide_wait();
			return false;
		}
	}

	//Cas des multi erreur on affiche la première
	if(err.length>0)
	{
		var err = err[0];
		PHX_dispusrmsg(err.msg,"msg_ko");
		PHX_hide_wait();
		return false;
	}
	return true;
}
function PHX_userconfirm(msg,class_blocmsg,id)
{
	if($(bloc_msg) && $(bloc_msg_content))
		$(bloc_msg_content).update(msg);
	
	//Affiche les boutons
	$('bloc_btn').style.display="block";
	if(class_blocmsg != "")
		$(bloc_msg).className = class_blocmsg;
	
	//Remplace l'id du bouton ok par le bouton en cours
	btns = $$('.btn_confirm');
	btns[1].id = id.replace("confirm_","");
	
	new Effect.Appear($(bloc_msg));			
}

function PHX_dispusrmsg(msg, class_blocmsg, no_duree)
{
	var class_blocmsg = class_blocmsg || "";
	var no_duree = no_duree || false;
	
	if($(bloc_msg) && $(bloc_msg_content))
	{
		//Masque les boutons
		$('bloc_btn').style.display="none";
		if(class_blocmsg != "")
			$(bloc_msg).className = class_blocmsg;
		$(bloc_msg_content).update(msg);
		if(no_duree == true)
		{
			new Effect.Appear($(bloc_msg));			
		}else{
			new Effect.Appear($(bloc_msg), {afterFinish: function(){PHX_wait(duree_msg,"PHX_clearusrmsg");}});			
		}
	}
}

function PHX_clearusrmsg()
{
	if($(bloc_msg))
	{
		new Effect.Fade($(bloc_msg), {afterFinish: function(){PHX_stopwait();}});
	}
}
function PHX_wait(duree, fct)
{
	var fct = fct || "PHX_void";
	t = setTimeout(fct+"()",duree);
}
function PHX_stopwait()
{
	clearTimeout(t);
}
function PHX_void()
{
	//nothing to do
	PHX_stopwait();
}
// *******************************************
// PHX COMPORTEMENT ET PARAMETRAGE
// *******************************************

function PHX_getresultupload(file)
{
	var res = file.split("{EXE_FAIL}");
	if(res.length > 1)
	{
		PHX_dispusrmsg(res[1].replace(/\{EXE_SUCCESS\}/g,''), "msg_ko");
//		PHX_dispusrmsg("Une erreur s'est produite, avez vous choisi un fichier", "msg_ko");
		return "";
	}else{
		file = file.replace(/\{EXE_SUCCESS\}/g,'');
		return file;
	}
}
function PHX_getadditionnalparams(id_btn)
{
	//Recherche d'un input hidden qui porte comme nom de class l'id du bouton appellant, 
	//l'id de ce champ est composé de l'id du bouton appellant + _ + le nom du parametre
	//sa valeur est celle du paramete
	var inputsh = $$("."+id_btn);
	var params = "";
	if(inputsh.length > 0)
	{
		for(i = 0; i < inputsh.length; i++)
		{
			if(inputsh[i].type!="checkbox" || inputsh[i].checked==true)
				params += "&" + inputsh[i].id.replace(id_btn+"_","")+"="+inputsh[i].value;
		}
	}
	return params;
}
function PHX_getidelem(id_btn)
{
	//Recherche dans l'id du bouton
	//Sinon Recherche d'un input hidden qui va donner le nom du champ qui permet le choix d'un element
	//Sa class est l'id du bouton appellant, son id est celui du bouton + _ + id
	//Sa valeur indique l'id du champ de selection
	//Sinon Utilise la valeur comme id
	//Sinon retourn vide
	var val_id = 0;
	var tab_id = id_btn.split("_");
	if(tab_id.length==3 && (!isNaN(tab_id[2])))
		val_id = tab_id[2];
	else if($(id_btn+'_'+'id'))
	{
		if($(id_btn+'_'+'id').value)
		{
			if($($(id_btn+'_'+'id').value))
			{
				//treeview case
				if($($(id_btn+'_'+'id').value).className.indexOf("phx_treeview")>-1)
					val_id = tv_getSelectedItem($($(id_btn+'_'+'id').value));
				else
					val_id = $($(id_btn+'_'+'id').value).value;	
			}
			else
			{
				if(!isNaN($(id_btn+'_'+'id').value))
					val_id = $(id_btn+'_'+'id').value;
			}
		}
	}
	
	return parseInt(val_id);
}

// *******************************************
// PHX ACTIONS : DEFINITION DES CALLBACKS
// *******************************************

function PHX_Fdefinefct(action,type)
{
	var fct = new Array();
	//
	// Definition des callbacks
	//
	if(action != "upload")
	{
		fct[0] = PHX_getCallstartName(action + "_" + type);
		fct[1] = PHX_getCallbackName(action + "_" + type);
	}
	
	return fct;
}
function PHX_getCallstart(id_btn, action)
{
	// Recherche si un champ definissant un "callStart" est defini
	// son id doit etre celui du bouton appellant sans l'action + _ + 'callstart'
	var callstart_active = 0;
	var input_givinstate = id_btn.replace(action+"_","")+'_'+'callstart';
	if($(input_givinstate))
	{
		callstart_active = $(input_givinstate).value;
	}
	return callstart_active;
}
function PHX_getCallstartName(id_btn)
{
	// Recherche de la fonction de "callstart"
	// le nom de la fonction doit etre celui du bouton + _ + 'Callstart'
	// elle doit etre chargee au moment de l'appel au code
	return id_btn+"_CallStart";
}
function PHX_getCallback(id_btn, action)
{
	// Recherche si un champ definissant un "callBack" est defini
	// son id doit etre celui du bouton appellant sans l'action + _ + 'callback'
	var callback_active = 0;
	var input_givinstate = id_btn.replace(action+"_","")+'_'+'callback';
	if($(input_givinstate))
	{
		callback_active = $(input_givinstate).value;
	}
	return callback_active;
}
function PHX_getCallbackName(id_btn)
{
	// Recherche de la fonction de "callback"
	// le nom de la fonction doit etre celui du bouton + _ + 'Callback'
	// elle doit etre chargee au moment de l'appel au code
	return id_btn+"_CallBack";
}

// *******************************************
// PHX ACTIONS
// *******************************************

function PHX_reloadRules()
{
	Behaviour.apply();
}

function PHX_getoption(action,type,option)
{
	//Options 'nomsg', 'group', 'reload', 'tpl', 'msg'
	if($(action + "_" + type + "_" + option))
		return $(action + "_" + type + "_" + option).value;
	else
		return false;
}

function PHX_Fupdateliste(type,posts,tpl,ctn)
{
	if(tpl && tpl!="")
		var tpl = "tpl=" + tpl;
	else
		var tpl = 'tpl=backoffice/liste/'+type;
	phxAjaxCall(true,urlaff,tpl+posts,PHX_Fupdateliste_callback,PHX_error_handler,{type:type,ctn:ctn});
}

function PHX_Fupdateliste_callback(response,param)
{
	if(param.ctn && param.ctn!="")
		var ctn = param.ctn;
	else
		var ctn = $('liste_' + param.type);
	ctn.update();
	ctn.update(response);
	PHX_reloadRules();
}

function PHX_Fdisappear(btn, type, blocdestination, callbackfct)
{
	//
	// Mise en display none de la cible
	//
	var cible = btn.id.replace('disappear_','');
	if($(cible))
	{
		$(cible).style.display = 'none';
	}
}

function PHX_Fadd(btn, type, blocdestination, callbackfct)
{
	//Recuperation du tpl
	var tpl = PHX_getoption("add", type, "tpl");
	if(!tpl)
		var tpl = 'backoffice/form/'+type;
		
	var post_supp = PHX_getadditionnalparams("add_" + type ); //Recuperation de l'id du site
	if(btn.id!="add_"+type)
		post_supp += PHX_getadditionnalparams(btn.id);
	phxAjaxCall(true,urlaff,'tpl='+tpl+post_supp,PHX_Fadd_callback,PHX_error_handler,{type:type,blocdestination:blocdestination,callbackfct:callbackfct});
}

function PHX_Fadd_callback(response,param)
{
	RICHTEXT_unload("wysiwyg", "form_"+param.type);
	PHX_clean_browser(param.blocdestination);
	$(param.blocdestination).update(response);
	RICHTEXT_load("wysiwyg",false, param.blocdestination);
	PHX_doCallBack(param.callbackfct, 'add',param.type);
	PHX_reloadRules();	
}
function PHX_Fsort(btn, type, blocdestination, callbackfct)
{
	var post_supp = PHX_getadditionnalparams(btn.id);
	phxAjaxCall(true,urlaff,'tpl=backoffice/form/sort/'+type+post_supp,PHX_Fadd_callback,PHX_error_handler,{type:type,blocdestination:blocdestination,callbackfct:callbackfct});
}

function PHX_Fsort_callback(response,param)
{
	$(param.blocdestination).update(response);
	PHX_doCallBack(param.callbackfct, 'sort',param.type);
	PHX_reloadRules();
}

function PHX_Fdisp(btn, type, blocdestination, callbackfct)
{
	var tab = $$('.'+btn.id)
	if(tab.length > 0)
	{
		tab.each( function(a) {
			new Effect.Appear(a, {afterFinish: function(){		
				PHX_doCallBack(callbackfct, 'disp',type);
				PHX_reloadRules();
			}});
		})
	}	
}

function PHX_Fedit_request(btnid, type, blocdestination, callbackfct,forced_id)
{
	var forced_id = forced_id || "";
	//Recuperation du tpl
	var tpl = PHX_getoption("edit", type, "tpl");
	if(!tpl)
		var tpl = 'backoffice/form/'+type;

	//Recuperation de l'id
	if(forced_id!="")
		var idelem = forced_id;
	else
		var idelem = PHX_getidelem(btnid);
	
	if(idelem && idelem!="" && idelem!=0)
	{
		var post_supp = '&idelem'+ type +'='+ idelem
		post_supp += PHX_getadditionnalparams("edit_" + type ); //Recuperation de l'id du site
		if(btnid!="edit_"+type)
			post_supp += PHX_getadditionnalparams(btnid); //Recuperation de l'id du site
		phxAjaxCall(true,urlaff,'tpl='+tpl+post_supp,PHX_Fedit_callback,PHX_error_handler,{type:type,blocdestination:blocdestination,callbackfct:callbackfct});
	}
	else
		PHX_dispusrmsg("Veuillez choisir une valeur dans la liste", "msg_ko");
}

function PHX_Fedit_callback(response,param)
{
	RICHTEXT_unload("wysiwyg", "form_"+param.type);
	PHX_clean_browser(param.blocdestination);
	$(param.blocdestination).update(response);
	RICHTEXT_load("wysiwyg",false, param.blocdestination);
	PHX_doCallBack(param.callbackfct, 'edit',param.type);
	PHX_reloadRules();
}
function PHX_Fedit(btn, type, blocdestination, callbackfct)
{
	PHX_Fedit_request(btn.id, type, blocdestination, callbackfct);
}

function PHX_Fdel(btn, type, blocdestination, callbackfct)
{
	var post_supp="";

	var idelem = PHX_getidelem(btn.id);
	if(idelem && idelem!="" && idelem!=0)
	{
		post_supp += '&idelem=' + idelem;
		post_supp += PHX_getadditionnalparams(btn.id);
		
		// Recuperation d'un groupe
		var grp = PHX_getoption("record", type, "group");
		if(grp!=false)
			grp += "/";
		else
			grp = "";
		//Recuperation no message
		var no_msg = (PHX_getoption("del", type, "nomsg")=="true" || PHX_getoption("del", type, "nomsg")=="1")?true:false;
		// Recuperation d'une tache
		var task = PHX_getoption("del", type, "task");
	
		if(task===false)
			task = 'admin/'+ grp + type+'/'+type+'_supprime';
		
		phxAjaxCall(true,urltask,'tache='+task+post_supp,PHX_Fdel_request_callback,PHX_error_handler,{type:type,blocdestination:blocdestination,callbackfct:callbackfct,no_msg:no_msg});
	}
	else
		PHX_dispusrmsg("Veuillez choisir une valeur dans la liste", "msg_ko");
}

function PHX_Fdel_request_callback(response,param)
{
	var result = treatTaskMsg(response);
	if(result == true)
	{
		var returned_value = response.substring(13);
		if(param.no_msg==false)
			PHX_dispusrmsg(response.substring(13),"msg_ok");
		PHX_doCallBack(param.callbackfct, 'del',param.type,returned_value);
		PHX_reloadRules();
	}
	if(result == false)
		PHX_dispusrmsg(response.substring(11),"msg_ko");
}

function PHX_Frecord_request(type, posts, callbackfct, no_msg,grp,no_refresh,task)
{
	var no_msg = no_msg ||false;
	var grp = grp || "";
	var no_refresh = no_refresh || false;
	var task = task || false;
	if(task===false)
		task = 'admin/'+ grp + type+'/'+type+'_enregistre';
		
	phxAjaxCall(true,urltask,'tache='+task+posts,PHX_Frecord_request_callback,PHX_error_handler,{type:type,callbackfct:callbackfct,no_msg:no_msg,no_refresh:no_refresh});
}

function PHX_Frecord_request_callback(response,param)
{
	var result = treatTaskMsg(response,false,param.type);
	if(result == true)
	{
		var returned_value = response.substring(13);
		var tabreturn = returned_value.split("|");
		if(tabreturn.length==2)
		{
			returned_value = tabreturn[0];
			PHX_Fedit_request("edit_"+param.type, param.type, 'form_' + param.type, "",tabreturn[1])
		}
		if(param.no_msg==false)
			PHX_dispusrmsg(returned_value,"msg_ok");
		
		PHX_doCallBack(param.callbackfct, 'record',param.type,returned_value);
		PHX_reloadRules();
	}
	if(result == false)
	{
		PHX_dispusrmsg(response.substring(11),"msg_ko");
	}
	PHX_hide_wait();
}

function PHX_Frecord(btn, type, blocdestination, callbackfct)
{
	//Recuperation no message
	var no_msg = (PHX_getoption("record", type, "nomsg")=="true" || PHX_getoption("record", type, "nomsg")=="1")?true:false;

	// Recuperation d'un groupe
	var grp = PHX_getoption("record", type, "group");
	if(grp!=false)
		grp += "/";
	else
		grp = "";
	// Recuperation no refresh
	var no_refresh = (PHX_getoption("record", type, "norefresh")=="true" || PHX_getoption("record", type, "norefresh")=="1")?true:false;
	// Recuperation d'une tache
	var task = PHX_getoption("record", type, "task");
	
	var posts = '&idelem='+PHX_getidelem(btn.id); //Recuperation de l'id
	posts += FORM_buildpoststring(blocdestination,"record");
	posts += PHX_getadditionnalparams("record_"+type);
	if(btn.id!="record_"+type)
		posts += PHX_getadditionnalparams(btn.id);
	PHX_Frecord_request(type, posts, callbackfct,no_msg,grp,no_refresh,task);
	PHX_show_wait();
}

function PHX_Fcancel(btn, type, blocdestination, callbackfct)
{
	if($(blocdestination))
	{
		RICHTEXT_unload("wysiwyg", "form_"+type);
		PHX_clean_browser(blocdestination);
		$(blocdestination).update();		
	}else{
		var cible = btn.id.replace('cancel_','');
		if($(cible))
		{
			RICHTEXT_unload("wysiwyg", "form_"+type);
			PHX_clean_browser(cible);
			$(cible).update();
		}
	}
	PHX_doCallBack(callbackfct, 'cancel',type);
	PHX_reloadRules();
}

function PHX_Fconfirm(btn, type, blocdestination, callbackfct, action)
{
	var post_supp="";
	var tab_id = btn.id.split("_");
	var post_supp="";
	var idelem = PHX_getidelem(btn.id);
	var tpl = PHX_getoption("confirm_"+action, type, "tpl");
	if(idelem && idelem!="" && idelem!=0 && tpl != false)
	{
		post_supp += '&idelem=' + idelem;
		post_supp += PHX_getadditionnalparams(btn.id);
		phxAjaxCall(true,urlaff,'tpl='+tpl+post_supp,PHX_Fconfirm_request_callback,PHX_error_handler,{btnid:btn.id});
	}
	else
	{
		var msg  = PHX_getoption(tab_id[1],tab_id[2],'msg');
		if(msg && msg!="")
			PHX_userconfirm(msg,"msg_ask",btn.id);
		else
			alert("Erreur pas de message de confirmation pour : " + tab_id[1] + " " +  tab_id[2]);
	}
}

function PHX_Fconfirm_request_callback(response,param)
{
	PHX_userconfirm(response,"msg_ask",param.btnid);
}

function PHX_Fupload()
{
	//nothing to do
	PHX_reloadRules();
	return true;
}

// *******************************************
// PHX ACTIONS : EXECUTION
// *******************************************

function PHX_executeFct(action, btn, type, blocdestination, action2)
{
	var functions = PHX_Fdefinefct(action,type);
	var callstartfct = functions[0]; 
	var callbackfct = functions[1];

	PHX_doCallStart(callstartfct, action , type);
	window['PHX_F'+action](btn, type, blocdestination, callbackfct, action2);
}
function PHX_doCallStart(callstartfct, action, type)
{
	if(callstartfct != "" && callstartfct != "undefined" && action != "upload")
	{
		//alert("callstartfct = "+callstartfct);
		if(window[callstartfct])
		{
			//alert("callstartfct = FOUND");
			window[callstartfct](action,type);								
		}
	}
}
function PHX_doCallBack(callbackfct, action, type,response)
{
	if(callbackfct != "" && callbackfct != "undefined" && action != "upload")
	{
		//alert("callbackfct = "+callbackfct);
		if(window[callbackfct])
		{
			//alert("callbackfct = FOUND");
			window[callbackfct](action,type,response);
		}
	}
}

// *******************************************
// GESTIONNAIRE DES FONCTIONS PHX
// *******************************************
function PHX_handler(btn)
{
	var tabelems = btn.id.split('_');
	var action2 = "";
	if(tabelems[0] == 'confirm')
	{
		var action = tabelems[0];
		action2 = tabelems[1];
		var type = tabelems[2];
	}
	else
	{
		var action = tabelems[0];
		var type = tabelems[1];
	}
	var form = btn.id.replace(action,"");

	//Recupération du bloc de destinaition soit spécifié, soit avec un form + type + id soit avec form + type
	if($(btn.id + "_dest") && $($(btn.id + "_dest").value))
		var blocdestination = $(btn.id + "_dest").value;
	else if($(btn.id.replace(action,'form')))
		var blocdestination = btn.id.replace(action,'form');
	else
		var blocdestination = 'form_' + type;
	
	//Dans le cas des disp ou des uploads, le type du formulaire principal est sans importance
	if(($(blocdestination) && (action != "disp" && action != "upload")) || (action == "disp") || (action == "upload") || (action == "disappear") || (action == "cancel") ||(action == "del") || (action == "confirm") || (action == "edit"))
	{
		if(type != null && type != 'undefined' && type != '')
		{
			if(window['PHX_F'+action])
			{
				PHX_executeFct(action, btn, type, blocdestination, action2);
			}else{
				alert("No action for '"+action+"'");
			}
		}else{
			alert("No type");
		}
	}else{
		alert("No dest");
	}
}

// *******************************************
// REGLES COMPORTEMENT
// *******************************************
var myrules = {
	//Operations d'administration
	'.adm_btn': function(btn) {
		btn.onclick = function(){
			PHX_handler(btn);
		}	
	},
	'.adm_dblclick': function(btn) {
		btn.ondblclick = function(){
			PHX_handler(btn);
		}	
	},
	'.form_popup' : function(popup)
	{
		new Draggable(popup);
	}
};
// *******************************************
//
// REGLES COMPORTEMENT ENREGISTREMENT
//
// *******************************************
Behaviour.register(myrules);
