var tab_action_grp = new Array();
tab_action_grp.push({ident:"task",actions:new Array("del","record")});
tab_action_grp.push({ident:"show",actions:new Array("add","edit")});
tab_action_grp.push({ident:"all",actions:new Array("add","edit","del","record")});

// *******************************************
// UTILITAIRES PHX Rules
// *******************************************
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();
		}
	});
}

function PHX_reloadRules(ctn)
{
	Behaviour.apply(ctn);
}

// *******************************************
// PHX COMPORTEMENT ET PARAMETRAGE
// *******************************************
function PHX_getdevopt(selecteur)
{
	//Recherche d'un input hidden qui porte comme nom de class "opt_ + l'id du bouton appellant", 
	//l'id de ce champ est composé de "opt_ + l'id du bouton appellant + _ + le nom du parametre"
	//sa valeur est celle de l'option de dev
	//Cette option se retrouve dans toutes les fonctions de sortie std et specifique
	var inputsh = $$(".opt_"+selecteur);
	var devopt = new Array(); 
	for(var i=0 ; i<inputsh.length ; i++)
	{
		if(inputsh[i].type!="checkbox" || inputsh[i].checked==true)
			devopt[inputsh[i].id.replace("opt_" + selecteur +"_","")] = inputsh[i].value;
	}
	return devopt;
}

function PHX_getadditionnaldevopt(btn_id,action,type)
{
	var devopt = new Array();
	tab_action_grp.each(function(val){
		if(val.actions.in_array(action)!==false)
			devopt.concat_assoc(PHX_getdevopt(val.ident + "_" + type));
	});
	devopt.concat_assoc(PHX_getdevopt(action + "_" + type ));
	if(btn_id!=""  && btn_id != action + "_" + type)
		devopt.concat_assoc(PHX_getdevopt(btn_id));
	return devopt;
}

function PHX_getposts(selecteur)
{
	//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 = $$("."+selecteur);
	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(selecteur+"_","")+"="+inputsh[i].value;
		}
	}
	return params;
}

function PHX_getadditionnalposts(btn_id,action,type)
{
	var post = "";
	//Recherche des groupes d'options
	tab_action_grp.each(function(val){
		if(val.actions.in_array(action)!==false)
		{
			post += PHX_getposts(val.ident + "_" + type);
		}
	});
	post += PHX_getposts(action + "_" + type);
	if(btn_id!="" && btn_id != action + "_" + type)
		post += PHX_getposts(btn_id);
	return post;
}

function PHX_getoption(action,type,option)
{
	//Options 'tpl', 'task', 'msg'
	if($(action + "_" + type + "_" + option))
		return $(action + "_" + type + "_" + option).value;
	else
	{
		//Recherche des groupes d'options
		var res = false;
		tab_action_grp.each(function(val){
			if(val.actions.in_array(action)!==false && !res)
				if($(val.ident + "_" + type + "_" + option))
					res = $(val.ident + "_" + type + "_" + option).value;
		});
		return res;
	}
}

function PHX_getContainer(btn_id,action,type)
{
	//Recupération du bloc de destination 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 if($(action + "_" + type + "_dest") && $($(action + "_" + type + "_dest").value))
		var blocdestination = $($(action + "_" + type + "_dest").value);
	else
		var blocdestination = $('form_' + type);
	return blocdestination;
}

function PHX_getidelem(btn_id)
{
	//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 = btn_id.split("_");
	if($(btn_id+'_'+'id'))
	{
		if($(btn_id+'_'+'id').value)
		{
			if($($(btn_id+'_'+'id').value))
			{
				//treeview case
				if($($(btn_id+'_'+'id').value).className.indexOf("phx_treeview")>-1)
					val_id = tv_getSelectedItem($($(btn_id+'_'+'id').value));
				else
					val_id = $($(btn_id+'_'+'id').value).value;	
			}
			else
			{
				if(!isNaN($(btn_id+'_'+'id').value))
					val_id = $(btn_id+'_'+'id').value;
			}
		}
	}
	else
	{
		if(tab_id.length==3)
			val_id = tab_id[2];
	}
	return val_id;
}

// *******************************************
// PHX ACTIONS : DEFINITION DES FONCTION
// *******************************************
function PHX_getFunctionName(action, type , fct)
{
	return action + "_" + type + "_"+ fct;
}

// *******************************************
// PHX ACTIONS
// *******************************************
function PHX_Fupdateliste(type,posts,tpl,blocdestination)
{
	// Recuperation des parametres?
	if(tpl && tpl!="")
		var tpl = "tpl=" + tpl;
	else
		var tpl = 'tpl=' + PHX_rules_tpl + 'liste/'+type;
	phxAjaxCall(true,urlaff,tpl+posts,PHX_Fupdateliste_callback,STD_error_handler,{action:'updateliste',type:type,blocdestination:blocdestination});
}

function PHX_Fupdateliste_callback(res,param)
{
	if(param.blocdestination && param.blocdestination!="")
		var blocdestination = param.blocdestination;
	else
		var blocdestination = $('liste_' + param.type);
	PHX_clean_browser(blocdestination);
	blocdestination.update();
	blocdestination.update(res);
	PHX_reloadRules(blocdestination);
}

function PHX_Fsort(btn_id, type, blocdestination, devopt)
{
	var post_supp = PHX_getadditionnalposts(btn_id,"sort",type);
	phxAjaxCall(true,urlaff,'tpl=' + PHX_rules_tpl + 'form/sort/'+type+post_supp,PHX_Fadd_callback,STD_error_handler,{action:'sort',type:type,btn_id:btn_id,blocdestination:blocdestination,opt:devopt});
}

function PHX_Fsort_callback(res,param)
{
	PHX_clean_browser(param.blocdestination);
	$(param.blocdestination).update(res);
	PHX_doCallBack(res,'sort',param);
	PHX_reloadRules(param.blocdestination);
}

function PHX_Fadd(btn_id, type, blocdestination, devopt)
{
	var tpl = PHX_getoption("add", type, "tpl");
	if(!tpl)
		var tpl = PHX_rules_tpl+'form/'+type;

	var post_supp = PHX_getadditionnalposts(btn_id,"add",type);
	phxAjaxCall(true,urlaff,'tpl='+tpl+post_supp,PHX_Fadd_callback,STD_error_handler,{action:'add',type:type,btn_id:btn_id,blocdestination:blocdestination,opt:devopt});
}

function PHX_Fadd_callback(res,param)
{
	if($(param.blocdestination))
	{
		TINY_unload_all(param.blocdestination);
		PHX_clean_browser(param.blocdestination);
		$(param.blocdestination).update(res);
		PHX_doCallBack(res,'add',param);
		PHX_reloadRules(param.blocdestination);
	}
}

function PHX_Fedit(btn_id, type, blocdestination, devopt)
{
	var idelem = PHX_getidelem(btn_id);
	//Recuperation du tpl
	var tpl = PHX_getoption("edit", type, "tpl");
	if(!tpl)
		var tpl = PHX_rules_tpl+'form/'+type;
	
	if(idelem && idelem!="" && idelem!=0)
	{
		var post_supp = '&idelem'+ type +'='+ idelem
		post_supp += PHX_getadditionnalposts(btn_id,"edit",type);
		phxAjaxCall(true,urlaff,'tpl='+tpl+post_supp,PHX_Fedit_callback,STD_error_handler,{type:type,btn_id:btn_id,blocdestination:blocdestination,opt:devopt});
	}
	else
		PHX_dispusrmsg("Veuillez choisir une valeur dans la liste", class_msg_ko, {action:'edit',type:type,btn_id:btn_id,blocdestination:blocdestination,opt:devopt});
}

function PHX_Fedit_callback(res,param)
{
	TINY_unload_all(param.blocdestination);
	PHX_clean_browser(param.blocdestination);
	$(param.blocdestination).update(res);
	PHX_doCallBack(res,'edit',param);
	PHX_reloadRules(param.blocdestination);
}

function PHX_Fsortableinit(ctn_id, type, blocdestination, devopt)
{
	//Option du sortable type d'objet à trier, class à trier et id de l'element scrollé (si présent)
	var sortableObject = PHX_getoption("sortable", type, "sortobj") || 'li';
	var classname = PHX_getoption("sortable", type, "sortclass") || '';
	var scroll_element = PHX_getoption("sortable", type, "sortscroll") || 0;
	var handle_element = PHX_getoption("sortable", type, "sorthandle") || '';
	if(scroll_element!=0)
		Position.includeScrollOffsets = true

	Sortable.create(ctn_id.replace("sortableinit_","sortable_"), 
	{
		constraint:false,
		only:classname,
		handle: handle_element,
		tag:sortableObject,
		scroll:scroll_element,
		onUpdate : function() {
			PHX_executeFct("sortable_" + type);
		}
	});
}

function PHX_Fsortable(ctn_id, type, blocdestination, devopt)
{
	var nomTask = type.replace(new RegExp("_.+$", "gi"), "");
	// Recuperation d'une tache
	var task = PHX_getoption("sortable", type, "task");
	if(task===false)
		task = PHX_rules_task + type+'/'+type+'_sort';
		
	chURL = 'tache=' + task;
	chOrdre = Sortable.sequence(ctn_id).join(","); 
	var chPOST = chURL+"&ordre="+chOrdre;
	phxAjaxCall(true,urltask,chPOST,PHX_Fsortable_callback,STD_error_handler,{action:'sortable',type:type,ctn_id:ctn_id,blocdestination:blocdestination,opt:devopt});
}

function PHX_Fsortable_callback(res,param)
{
	var oRes = eval('(' + res + ')');
	if(oRes.res === true)
		PHX_doCallBack(oRes,'sortable',param);
}

function PHX_Frecord(btn_id, type, blocdestination, devopt)
{
	// Recuperation d'une tache
	var task = PHX_getoption("record", type, "task");
	if(task===false)
		task = PHX_rules_task + type+'/'+type+'_enregistre';
	
	var post_supp="";
	//Recuperation de l'id
	var idelem = PHX_getidelem(btn_id);
	if(idelem && idelem!="" && idelem!=0)
		post_supp = '&idelem=' + idelem; 
	post_supp += FORM_buildpoststring(blocdestination,"record");
	post_supp += PHX_getadditionnalposts(btn_id,"record",type);

	phxAjaxCall(true,urltask,'tache='+task+post_supp,PHX_Frecord_callback,STD_error_handler,{action:'record',type:type,btn_id:btn_id,blocdestination:blocdestination,opt:devopt});
}

function PHX_Frecord_callback(res,param)
{
	var oRes = eval('(' + res + ')');
	if(oRes.res === true)
		PHX_doCallBack(oRes,'record',param);
	else 
	{
		if(oRes.res === false)
			PHX_dispusrmsg(oRes.msg,class_msg_ko,param);
		else
			FORM_treatTaskMsg(oRes,param.blocdestination,param.type);
		STD_hide_wait();
	}
}

function PHX_Fdel(btn_id, type, blocdestination, devopt)
{
	var idelem = PHX_getidelem(btn_id);
	if(idelem && idelem!="" && idelem!=0)
	{
		var post_supp = '&idelem=' + idelem;
		post_supp += PHX_getadditionnalposts(btn_id,"del",type);

		// Recuperation d'une tache
		var task = PHX_getoption("del", type, "task");
		if(task===false)
			task = PHX_rules_task + type+'/'+type+'_supprime';
		phxAjaxCall(true,urltask,'tache='+task+post_supp,PHX_Fdel_callback,STD_error_handler,{action:'del',type:type,btn_id:btn_id,blocdestination:blocdestination,opt:devopt});
	}
	else
		PHX_dispusrmsg("Veuillez choisir une valeur dans la liste", class_msg_ko,{type:type,btn_id:btn_id,blocdestination:blocdestination,opt:devopt});
}

function PHX_Fdel_callback(res,param)
{
	var oRes = eval('(' + res + ')');
	if(oRes.res == true)
		PHX_doCallBack(oRes,'del',param);
	else if(oRes.res == false)
	{
		PHX_dispusrmsg(oRes.msg,class_msg_ko,param);
		STD_hide_wait();
	}
}

function PHX_Fcancel(btn_id, type, blocdestination, devopt)
{
	if(blocdestination)
	{
		TINY_unload_all(blocdestination);
		PHX_clean_browser(blocdestination);
		blocdestination.update();		
	}else{
		var cible = btn_id.replace('cancel_','');
		if($(cible))
		{
			TINY_unload_all($(cible));
			PHX_clean_browser($(cible));
			$(cible).update();
		}
	}
	PHX_doCallBack('','cancel',{action:'cancel',type:type,btn_id:btn_id,blocdestination:blocdestination,opt:devopt});
}

function PHX_Fconfirm(btn_id, type, blocdestination, devopt)
{
	var post_supp="";
	var tab_id = btn_id.split("_");
	var action = tab_id[0] + "_" + tab_id[1];
	var post_supp="";
	var tpl = PHX_getoption(action, type, "tpl");
	if(tpl != false)
	{
		var idelem = PHX_getidelem(btn_id);
		post_supp += '&idelem=' + idelem;
		post_supp += PHX_getadditionnalposts(btn_id,action,type);
		phxAjaxCall(true,urlaff,'tpl='+tpl+post_supp,PHX_Fconfirm_callback,STD_error_handler,{action:action,type:type,btn_id:btn_id,blocdestination:blocdestination,opt:devopt});
	}
	else
	{
		var msg  = PHX_getoption(tab_id[1],tab_id[2],'msg');
		if(msg && msg!="")
			PHX_userconfirm(msg,class_msg_ask,{action:action,type:type,btn_id:btn_id,blocdestination:blocdestination,opt:devopt});
		else
			alert("Erreur pas de message de confirmation pour : " + tab_id[1] + " " +  tab_id[2]);
	}
}

function PHX_Fconfirm_callback(res,param)
{
	PHX_userconfirm(res.msg,class_msg_ask,param);
}

function PHX_Fdisappear(btn, type, blocdestination, callbackfct)
{
	var cible = btn.replace('disappear_','');
	if($(cible))
		$(cible).style.display = 'none';
}

// *******************************************
// PHX ACTIONS : HANDLER
// *******************************************
var fct_callstart="CallStart" ;
var fct_callback="CallBack";
var fct_callusermsg="UserMsg";
var fct_calluserconfirm="UserConfirm";
var class_msg_ok = "msg_ok";
var class_msg_ko = "msg_ko";
var class_msg_ask = "msg_ask"; 

function PHX_executeFct(btn_id)
{
	var tabelems = btn_id.split('_');
	if(tabelems[0] == 'confirm')
	{
		var action = tabelems[0];
		var type = tabelems[2];
		var devopt = PHX_getadditionnaldevopt(btn_id, tabelems[0]+ "_" + tabelems[1], type);
	}
	else
	{
		var action = tabelems[0];
		var type = tabelems[1];
		var devopt = PHX_getadditionnaldevopt(btn_id,action,type);
	}
	
	var blocdestination = PHX_getContainer(btn_id,action,type);

	var resCallStart = PHX_doCallStart(btn_id, action, type, devopt)
	if(resCallStart!==false)
	{
		devopt = resCallStart.opt;
		window['PHX_F' + action](btn_id, type, blocdestination, devopt);
	}
}
function PHX_doCallStart(btn_id, action, type, devopt)
{
	var callstartfct = PHX_getFunctionName(action, type, fct_callstart); 
	if(callstartfct != "" && callstartfct != "undefined" && window[callstartfct])
		return window[callstartfct]({action:action,type:type,btn_id:btn_id,opt:devopt});								
	else if(window["STD_F" + action + "_" + fct_callstart])
		return window["STD_F" + action + "_" + fct_callstart]({action:action,type:type,btn_id:btn_id,opt:devopt});
	else
		return window["STD_" + fct_callstart]({action:action,type:type,btn_id:btn_id,opt:devopt});
	return true;
}

function PHX_doCallBack(res,action,param)
{
	var callbackfct = PHX_getFunctionName(action, param.type, fct_callback);
	if(callbackfct != "" && callbackfct != "undefined" && window[callbackfct])
		window[callbackfct](res,param);
	else if(window["STD_F" + action + "_" + fct_callback])
		window["STD_F" + action + "_" + fct_callback](res,param);
	else
		window["STD_" + fct_callback](res,{action:action,type:type,btn_id:btn_id,opt:devopt});
}

function PHX_dispusrmsg(msg,class_blocmsg,param)
{
	var usermsgfct = PHX_getFunctionName(param.action, param.type, fct_callusermsg);
	if(usermsgfct != "" && usermsgfct != "undefined" && window[usermsgfct])
		window[usermsgfct](msg,class_blocmsg,param);
	else
		window["STD_" + fct_callusermsg](msg,class_blocmsg,param);
}

function PHX_userconfirm(msg,class_blocmsg,param)
{
	var userconfirmfct = PHX_getFunctionName(param.action, param.type, fct_calluserconfirm);
	if(userconfirmfct != "" && userconfirmfct != "undefined" && window[userconfirmfct])
		window[userconfirmfct](msg,class_blocmsg,param);
	else
		window["STD_" + fct_calluserconfirm](msg,class_blocmsg,param);
}

// *******************************************
// REGLES COMPORTEMENT
// *******************************************

var myrules = {
	//Operations d'administration
	'.adm_btn': function(btn) {
		btn.onclick = function(){
			PHX_executeFct(btn.id);
		}	
	},
	'.adm_dblclick': function(btn) {
		btn.ondblclick = function(){
			PHX_executeFct(btn.id);
		}	
	},
	'.adm_onchange': function(btn) {
		btn.onchange = function(){
			PHX_executeFct(btn.id);
		}	
	},
	'.adm_onblur': function(btn) {
		btn.onblur = function(){
			PHX_executeFct(btn.id);
		}	
	},
	'.adm_sortable': function(ctn) {
		//id du genre sortable_type
		PHX_executeFct(ctn.id.replace("sortable_","sortableinit_"));
	}
};
// *******************************************
//
// REGLES COMPORTEMENT ENREGISTREMENT
//
// *******************************************
Behaviour.register(myrules);
