/***********************************************************************
CONSTANTES POUR L'OBJET NOEUD
***********************************************************************/
// Indique le nombre d'informations du noeud situées avant la liste des feuilles
var TAILLE_NOEUD = 3;
// Les différents états du noeud
var NOEUD_FERME = false;
var NOEUD_OUVERT = true;


function Noeud ()
/***********************************************************************
BUT : Crée un objet Noeud
ENTREE :
SORTIE :
Retourne un objet "noeud" non initialisé
Un noeud est
	constitué
		de plusieurs objets "feuille".
		d'un "tronc" qui fait référence à son "arbre"
		d'un "myself" qui fait référence à lui-même
		d'un "parent" qui contient l'identifiant du noeud père (0 si pas de parent, donc noeud racine)
		d'un "old_parent" qui contient l'identifiant du noeud père d'ou il vient (pour l'echange entre arbres)
			dans ce cas, -1 signifie : "pas d'ancien père", donc il n'y a pas eu d'échange
		d'un "id"
		d'un "etat" indiquant l'état ouvert ou fermé du noeud
		de méthodes
			Construire : Retourne le contenu HTML du noeud (TR) en utilisant sa liste de feuilles
	parent de 0 à n noeuds
	enfant de 0 à 1 noeud
CONTRAINTES :
RISQUES :
************************************************************************/
{
	this.id = 0;
	this.myself = this;
	this.classe = 'arbre_lvl_0';
	this.feuilles = new Array(0);
	this.contenu_debut = '';
	this.contenu_milieu = '';
	this.contenu_fin = '';
	this.tronc = '';
	this.visible = true;
	this.niveau = 0;
	this.parent = 0;
	this.etat = NOEUD_FERME;



	this.Init = function (tronc,arbre,k)
	/***********************************************************************
	BUT : Initialise l'objet Noeud
	ENTREE :
	- tronc : Objet "arbre" qui contient ce noeud
	- arbre : Liste des noeuds de l'arbre
	- k : iterateur qui permet de reperer le bon noeud dans la liste 'arbre'
	SORTIE :
	Retourne l'objet "noeud" construit et prêt à être utilisé.
	Un noeud est
		constitué
			de plusieurs objets "feuille".
			d'un "tronc" qui fait référence à son "arbre"
			d'un "myself" qui fait référence à lui-même
			d'un "parent" qui contient l'identifiant du noeud père (0 si pas de parent, donc noeud racine)
			d'un "old_parent" qui contient l'identifiant du noeud père d'ou il vient (pour l'echange entre arbres)
				dans ce cas, -1 signifie : "pas d'ancien père", donc il n'y a pas eu d'échange
			d'un "id"
			d'un "etat" indiquant l'état ouvert ou fermé du noeud
			de méthodes
				Construire : Retourne le contenu HTML du noeud (TR) en utilisant sa liste de feuilles
		parent de 0 à n noeuds
		enfant de 0 à 1 noeud
	CONTRAINTES :
	La liste des noeuds doit être un tableau de tableau,
	chacun de ces sous-tableaux est un noeud qui contient des feuilles.
	RISQUES :
	Si le tableau de noeuds est mal construit, risque de plantage pour le
	moment
	************************************************************************/
	{
		var i = 0;

		this.tronc = tronc;
		this.parent = arbre[k][0];
		this.id = arbre[k][1];
		this.etat = arbre[k][2];
		for (i=TAILLE_NOEUD;i<arbre[k].length;i++)
		{
			var feuille = new Feuille();
			feuille.Init (this,arbre[k],i);
			this.AjouterFeuille (feuille);
		}
	}



	this.AjouterFeuille = function (f)
	/***********************************************************************
	BUT : Ajoute une feuille donnée au noeud
	ENTREE :
	- f : la feuille à rajouter
	SORTIE :
	CONTRAINTES :
	- La feuille doit être une "Feuille"
	RISQUES :
	Si la feuille n'est pas une "Feuille", l'arbre peut planter
	************************************************************************/
	{
		this.feuilles[this.feuilles.length] = f;
	}



	this.Construire = function ()
	/***********************************************************************
	BUT : Construit le code HTML du noeud suivant ses informations.
	ENTREE :
	SORTIE :
	Remplit les "contenus" du noeuds, puis lance la construction de chaque
	feuille. A son tour chaque feuille se contruit.
	Le noeud est un TABLE HTML suivi d'un DIV s'il a des noeuds enfants.
	CONTRAINTES :
	RISQUES :
	Si la liste de feiulles est vide, le noeud sera vide. Si elle est mal
	construite, l'arbre peut planter.
	************************************************************************/
	{
		var i;

		this.contenu_debut = '<DIV id="a_' + this.tronc.id + 'n_' + this.id + '" class="' + this.classe + '">';
		if (this.etat == NOEUD_OUVERT)
		{
			this.contenu_milieu = '</DIV><DIV id="a_' + this.tronc.id + 's_' + this.id + '" class="arbre_noeud_ouvert">';
		}
		else
		{
			this.contenu_milieu = '</DIV><DIV id="a_' + this.tronc.id + 's_' + this.id + '" class="arbre_noeud_ferme">';
		}
		this.contenu_fin = '</DIV>';

		for (i=0;i<this.feuilles.length;i++)
		{
			this.feuilles[i].Construire();
		}
	}



	this.Afficher = function ()
	/***********************************************************************
	BUT : Affiche le noeud
	ENTREE :
	SORTIE :
	Remplit le "contenu" de l'arbre avec un noeud
	CONTRAINTES :
	RISQUES :
	************************************************************************/
	{
		if (this.visible)
		{
			this.tronc.contenu = this.tronc.contenu + this.contenu_debut;
			this.AfficherFeuilles();
			this.tronc.contenu = this.tronc.contenu + this.contenu_milieu;
			this.tronc.AfficherNoeuds(this.id);
			this.tronc.contenu = this.tronc.contenu + this.contenu_fin;
		}
	}



	this.AfficherFeuilles = function ()
	/***********************************************************************
	BUT : Affiche les feuilles du noeud
	ENTREE :
	SORTIE :
	Remplit le "contenu" de l'arbre avec les feuilles
	CONTRAINTES :
	RISQUES :
	************************************************************************/
	{
		var i;

		for (i=0;i<this.feuilles.length;i++)
		{
			this.feuilles[i].Afficher();
		}
	}



	this.VoirNoeud = function (visible)
	/***********************************************************************
	BUT : Change l'état de visibilité du noeud à son inverse, sauf si visible
	contient une valeur. Dans ce second cas, la visibilité du noeud est forcée
	à visible.
	ENTREE :
	- visible : (facultatif) indique le nouvel état du noeud
	SORTIE :
	CONTRAINTES :
	RISQUES :
	************************************************************************/
	{
		if (visible==undefined)
		{
			this.visible = !this.visible;
		}
		else
		{
			this.visible = visible;
		}
	}



	this.Copie = function ()
	/***********************************************************************
	BUT : Copie un noeud.
	ENTREE :
	SORTIE :
	- une copie du noeud
	CONTRAINTES :
	RISQUES :
	************************************************************************/
	{
		var i;
		var n = new Noeud();

		n.id = this.id;
		n.myself = n;
		n.classe = 'arbre_lvl_' + this.niveau;
		n.feuilles = new Array(0);
		n.contenu_debut = this.contenu_debut;
		n.contenu_milieu = this.contenu_milieu;
		n.contenu_fin = this.contenu_fin;
		n.tronc = this.tronc;
		n.visible = this.visible;
		n.niveau = this.niveau;
		n.parent = this.parent;
		n.etat = this.etat;
		for (i=0;i<this.feuilles.length;i++)
		{
			n.feuilles[i] = new Feuille();
			n.feuilles[i].id = this.feuilles[i].id;
			n.feuilles[i].myself = n.feuilles[i];
			n.feuilles[i].contenu = this.feuilles[i].contenu;
			n.feuilles[i].texte = this.feuilles[i].texte;
			n.feuilles[i].tige = n;
			n.feuilles[i].type = this.feuilles[i].type;
			n.feuilles[i].classe = this.feuilles[i].classe;
			n.feuilles[i].typeaction = this.feuilles[i].typeaction;
			n.feuilles[i].action = this.feuilles[i].action;
			n.feuilles[i].parametre = this.feuilles[i].parametre;
		}

		return (n);
	}



	return this;
}
