// ***************************************************************************************************************
// ***************************************************************************************************************
// Librairie fusion2
// ***************************************************************************************************************
// ***************************************************************************************************************
// Cette librairie permet la fusion de la mise en page HTML avec des données JS
// ATTENTION : nécessite dom.js pour la fonction "ajouter_evenement"
// ***************************************************************************************************************
// ***************************************************************************************************************
// code pour conserver le codage UTF-8 dans C-génie : éàè




//---------------------------------------------------------------------------------------
// NOM FONCTION : fusion2
// DESCRIPTION COURTE :	initialise la librairie fusion
// DESCRIPTION :	
//		- analyse les éléments HTML pour trouver les notations des attributs fusion2 sous forme de classe afin de les transformer en attributs normaux.
//		- supprime tous les éléments factices (ITEM_A_SUPPRIMER).
//		- traite les objets en appelant leur fonction de collecte de données
// ENTREES :
// NECESSITES :
//		le document doit être entièrement chargé
// SORTIES :
// VALEURS DE RETOUR :	
//		* 0 : aucune erreur
// AUTEUR : DANIEL Eric
// DERNIERE MODIF : 10/12/2005
// ETAT : ok
// RESTE A FAIRE :
//		*
// REMARQUES :
// VOIR AUSSI : fusion2__fusionner_par_nom fusion2__fusionner fusion2__remplacer_valeur fusion2__effacer_les_copies
//---------------------------------------------------------------------------------------
function fusion2()
{
	// --------------
	// initialisation
	// --------------
	var tableau_temporaire = new Array();
	var chaine_temporaire = "";
	var elements_a_retraiter = new Array();
	var num_element = 0;


	// ------------------------------------
	// vérification des paramètres d'entrée
	// ------------------------------------


	// ---------------------------------------------------
	// retraitement des pseudo-classe FUSION 2 en attribut
	// ---------------------------------------------------
	var liste_des_classes_a_retraiter = new Array();
	var num_classe = 0;

	// on liste tous les éléments ayant un attribut "class" (=>className en DOM)
	elements_a_retraiter = getElementsByAttribute( "className" );
	for( num_element in elements_a_retraiter )
if( typeof( elements_a_retraiter[num_element] ) != "function" )
		{

		// on liste tous les noms de classe de l'élément courant
		liste_des_classes_a_retraiter = elements_a_retraiter[num_element].className.split( " " );
		for( num_classe in liste_des_classes_a_retraiter )
if( typeof( liste_des_classes_a_retraiter[num_classe] ) != "function" )
			{

			// on extrait le début du nom de la classe courante
			tableau_temporaire = liste_des_classes_a_retraiter[num_classe].split( "__" );

			// si le nom correspond à un code "donnee" ou "objet" (suivi de "_js" pour faire la distinction avec fusion2 PHP)
			if( ( tableau_temporaire[0] == "donnee_js" )
				|| ( tableau_temporaire[0] == "objet_js" ) )
				{

				// on transforme le nom de classe en attribut "donnee" ou "objet"
				elements_a_retraiter[num_element][tableau_temporaire[0]] = liste_des_classes_a_retraiter[num_classe].substring( tableau_temporaire[0].length+2 );
				liste_des_classes_a_retraiter[num_classe] = "";
				}
			}

		// on supprime la pseudo classe de la liste des classes
		elements_a_retraiter[num_element].className = liste_des_classes_a_retraiter.join( " " );
		}


	// --------------------------------
	// suppression des ITEM_A_SUPPRIMER
	// --------------------------------
	// on liste tous les éléments avec l'attribut objet_js = ITEM_A_SUPPRIMER
	elements_a_retraiter = getElementsByAttribute( "objet_js", "ITEM_A_SUPPRIMER" );
	for( var num_element in elements_a_retraiter )
if( typeof( elements_a_retraiter[num_element] ) != "function" )
		if( typeof( elements_a_retraiter[num_element] ) != "undefined" )

			// on supprime l'élément dans la liste des fils du père de l'élément
			elements_a_retraiter[num_element].parentNode.removeChild( elements_a_retraiter[num_element] );


	// ---------------------
	// traitement des objets
	// ---------------------
	// on liste tous les éléments avec l attribut "objet_js"
	elements_a_retraiter = getElementsByAttribute( "objet_js" );
	for( num_element in elements_a_retraiter )
if( typeof( elements_a_retraiter[num_element] ) != "function" )
		elements_a_retraiter[num_element].style.display = "none";

	for( num_element in elements_a_retraiter )
if( typeof( elements_a_retraiter[num_element] ) != "function" )
		{
		// appel de la fonction de collecte de données
		try
			{
			eval( "objet__" + getAttribute( elements_a_retraiter[num_element], "objet_js" ) + "();" );
			}
		catch( ex )
			{
			}
		}


	// ---------------------
	// sortie de la fonction
	// ---------------------
	// 0 : aucune erreur
	return 0;
}




//---------------------------------------------------------------------------------------
// NOM FONCTION : fusion2__fusionner_par_nom
// DESCRIPTION COURTE :	lance la fusion d'un objet à partir de son nom
// DESCRIPTION :	
//		lance la fusion d'un objet à partir de son nom.
// ENTREES :
//		@nom_objet (string) : nom de l'objet à dupliquer
//		@donnees (array) : donnees à utiliser pour effectuer la fusion2
// NECESSITES :
// SORTIES :
// VALEURS DE RETOUR :	
//		* 0 : aucune erreur
//		* -1 : nom_objet non fourni
//		* -2 : donnees n'est pas un tableau
// AUTEUR : DANIEL Eric
// DERNIERE MODIF : 10/12/2005
// ETAT : ok
// RESTE A FAIRE :
//		*
// REMARQUES :
// VOIR AUSSI : fusion2 fusion2__fusionner fusion2__remplacer_valeur fusion2__effacer_les_copies
//---------------------------------------------------------------------------------------
function fusion2__fusionner_par_nom( nom_objet, donnees )
{
	// --------------
	// initialisation
	// --------------
	var elements_a_retraiter = new Array();


	// ------------------------------------
	// vérification des paramètres d'entrée
	// ------------------------------------
	// vérification du paramètre nom_objet
	if( nom_objet == "" )
		// -1 : nom_objet non fourni
		return -1;
	
	// vérification du paramètre donnees
	if( ( typeof( donnees ) != "array" )
		&& ( typeof( donnees ) != "object" ) )
		// -2 : donnees n'est pas un tableau
		return -2;


	// -----------
	// traitements
	// -----------
	elements_a_retraiter = getElementsByAttribute( "objet_js", nom_objet );
	fusion2__fusionner( elements_a_retraiter[0], donnees );


	// ---------------------
	// sortie de la fonction
	// ---------------------
	// 0 : aucune erreur
	return 0;
}




//---------------------------------------------------------------------------------------
// NOM FONCTION : fusion2__fusionner
// DESCRIPTION COURTE :	lance la fusion d'un objet à partir de son pointeur
// DESCRIPTION :	
//		lance la fusion d'un objet à partir de son pointeur.
// ENTREES :
//		@mon_objet_a_copier (object) : pointeur sur l'objet à dupliquer
//		@donnees (array) : donnees à utiliser pour effectuer la fusion2
// NECESSITES :
// SORTIES :
// VALEURS DE RETOUR :	
//		* 0 : aucune erreur
//		* -1 : mon_objet_a_copier non fourni
//		* -2 : donnees n'est pas un tableau
// AUTEUR : DANIEL Eric
// DERNIERE MODIF : 10/12/2005
// ETAT : ok
// RESTE A FAIRE :
//		*
// REMARQUES :
// VOIR AUSSI : fusion2 fusion2__fusionner_par_nom fusion2__remplacer_valeur fusion2__effacer_les_copies
//---------------------------------------------------------------------------------------
function fusion2__fusionner( mon_objet_a_copier, donnees )
{
	// --------------
	// initialisation
	// --------------
	var mon_element_div = null;
	var copie_de_l_objet = null;
	var contenu_html_a_copier = "";
	var id_copie = 0;
	var num_copie = 0;
	var num_tag = 0;
	var ptr_parent = mon_objet_a_copier.parentNode;
	var ancien_display = ptr_parent.style.display;
	ptr_parent.style.display = "none";


	// ------------------------------------
	// vérification des paramètres d'entrée
	// ------------------------------------
	// vérification du paramètre mon_objet_a_copier
	if( mon_objet_a_copier == null )
		// -1 : mon_objet_a_copier non fourni
		return -1;
	
	// vérification du paramètre donnees
	if( ( typeof( donnees ) != "array" )
		&&( typeof( donnees ) != "object" ) )
		// -2 : donnees n'est pas un tableau
		return -2;


	// -----------
	// traitements
	// -----------
	// préparation de l'élément de stockage du code HTML
	mon_element_div = document.createElement( "DIV" );

	// préparation de l'élément à copier
	fusion2__effacer_les_copies( getAttribute( mon_objet_a_copier, "objet_js" ) );
	mon_objet_a_copier.style.display = "none";

	// création des copies
	for( id_copie in donnees )
		if( id_copie != "" )
			{
			num_copie++;
			donnees[id_copie]["AGAMA_NUMERO_DE_LIGNE"] = num_copie;
	
			// préparation du code HTML
			contenu_html_a_copier = mon_objet_a_copier.outerHTML;
			if( contenu_html_a_copier != "" )
				// remplacement des tags de données
				for( num_tag in donnees[id_copie] )
					{
					if( donnees[id_copie][num_tag] == null )
						donnees[id_copie][num_tag] = "";
					contenu_html_a_copier = xreplace( contenu_html_a_copier, "___:::" + num_tag + ":::___", donnees[id_copie][num_tag] );
					}
			mon_element_div.innerHTML = contenu_html_a_copier;
	
			// recréation de l environnement de la balise (pour les TD et les TR, notamment)
			if( mon_element_div.innerHTML != contenu_html_a_copier )
				{
				mon_element_div.innerHTML = "<" + mon_objet_a_copier.parentNode.tagName + ">" + contenu_html_a_copier + "</" + mon_objet_a_copier.parentNode.tagName + ">";
				if( mon_element_div.innerHTML != contenu_html_a_copier )
					mon_element_div.innerHTML = "<" + mon_objet_a_copier.parentNode.parentNode.tagName + ">" + "<" + mon_objet_a_copier.parentNode.tagName + ">" + contenu_html_a_copier + "</" + mon_objet_a_copier.parentNode.tagName + ">" + "</" + mon_objet_a_copier.parentNode.parentNode.tagName + ">";
				}
	
			// récupération du pointeur vers l objet DOM
			tableau_temporaire = mon_element_div.firstChild.firstChild.getElementsByTagName( mon_objet_a_copier.tagName );
			copie_de_l_objet = tableau_temporaire[0];
	
			// traitement des elements pour les attributs "donnees"
			fusion2__remplacer_valeur( copie_de_l_objet, donnees[id_copie] );
			tableau_temporaire = copie_de_l_objet.getElementsByTagName( "*" );
			for( num_element in tableau_temporaire )
				if( typeof( tableau_temporaire[num_element] ) != "undefined" )
					fusion2__remplacer_valeur( tableau_temporaire[num_element], donnees[id_copie] );
	
			// finalisation de l objet
			removeAttribute( copie_de_l_objet, "objet_js", "" );
			setAttribute( copie_de_l_objet, "copie_d_objet", getAttribute( mon_objet_a_copier, "objet_js" ) );
			copie_de_l_objet.style.display = "";
			mon_objet_a_copier.parentNode.insertBefore( copie_de_l_objet, mon_objet_a_copier );
			}
// debug( getAttribute( mon_objet_a_copier, "objet_js" ) + mon_objet_a_copier.parentNode.innerHTML );
ptr_parent.style.display = ancien_display;


	// ---------------------
	// sortie de la fonction
	// ---------------------
	// 0 : aucune erreur
	return 0;
}




//---------------------------------------------------------------------------------------
// NOM FONCTION : fusion2__remplacer_valeur
// DESCRIPTION COURTE :	[FONCTION INTERNE] remplace tous les marqueurs de données dans une copie d'objet
// DESCRIPTION :	
//		remplace tous les marqueurs de données dans une copie d'objet.
// ENTREES :
//		@objet (object) : pointeur sur l'objet à dupliquer
//		@donnees (array) : donnees à utiliser pour effectuer la fusion2
// NECESSITES :
// SORTIES :
// VALEURS DE RETOUR :	
//		* 0 : aucune erreur
//		* -1 : objet non fourni
//		* -2 : donnees n'est pas un tableau
// AUTEUR : DANIEL Eric
// DERNIERE MODIF : 10/12/2005
// ETAT : ok
// RESTE A FAIRE :
//		*
// REMARQUES :
// VOIR AUSSI : fusion2 fusion2__fusionner_par_nom fusion2__fusionner fusion2__effacer_les_copies
//---------------------------------------------------------------------------------------
function fusion2__remplacer_valeur( objet, donnees )
{
	// --------------
	// initialisation
	// --------------


	// ------------------------------------
	// vérification des paramètres d'entrée
	// ------------------------------------
	// vérification du paramètre objet
	if( objet == null )
		// -1 : objet non fourni
		return -1;
	
	// vérification du paramètre donnees
	if( ( typeof( donnees ) != "array" )
		&&( typeof( donnees ) != "object" ) )
		// -2 : donnees n'est pas un tableau
		return -2;


	// -----------
	// traitements
	// -----------
	// si l élément contient un attribut "donnee" qui correspond à un tag
	if( ( hasAttribute( objet, "donnee_js" ) )
		&& ( typeof( donnees[getAttribute( objet, "donnee_js" )] ) != "undefined" ) )
		{

		// on remplace le contenu de l élément pour y mettre la valeur du tag
		objet.innerText = donnees[getAttribute( objet, "donnee_js" )];
		removeAttribute( objet, "donnee_js" );
		}


	// ---------------------
	// sortie de la fonction
	// ---------------------
	// 0 : aucune erreur
	return 0;
}




//---------------------------------------------------------------------------------------
// NOM FONCTION : fusion2__effacer_les_copies
// DESCRIPTION COURTE :	supprime toutes les copies d'un objet
// DESCRIPTION :	
//		supprime toutes les copies d'un objet.
// ENTREES :
//		@nom_objet (string) : nom de l'objet à dupliquer
//		@donnees (array) : donnees à utiliser pour effectuer la fusion2
// NECESSITES :
// SORTIES :
// VALEURS DE RETOUR :	
//		* 0 : aucune erreur
//		* -1 : nom_objet non fourni
// AUTEUR : DANIEL Eric
// DERNIERE MODIF : 10/12/2005
// ETAT : ok
// RESTE A FAIRE :
//		*
// REMARQUES :
// VOIR AUSSI : fusion2 fusion2__fusionner_par_nom fusion2__fusionner fusion2__remplacer_valeur
//---------------------------------------------------------------------------------------
function fusion2__effacer_les_copies( nom_objet )
{
	// --------------
	// initialisation
	// --------------
	var elements_a_retraiter = new Array();
	var num_element = 0;


	// ------------------------------------
	// vérification des paramètres d'entrée
	// ------------------------------------
	// vérification du paramètre nom_objet
	if( nom_objet == "" )
		// -1 : nom_objet non fourni
		return -1;


	// -----------
	// traitements
	// -----------
	// on liste tous les éléments ayant un attribut "copie_d_objet" à la valeur indiquée
	elements_a_retraiter = getElementsByAttribute( "copie_d_objet", nom_objet );
	for( num_element in elements_a_retraiter )
		if( typeof( elements_a_retraiter[num_element] ) != "undefined" )
			elements_a_retraiter[num_element].parentNode.removeChild( elements_a_retraiter[num_element] );


	// ---------------------
	// sortie de la fonction
	// ---------------------
	// 0 : aucune erreur
	return 0;
}




// ajout l'appel de la fonction d'initialisation à la fin du chargement de la page web
ajouter_evenement( window, 'load', fusion2 );
