// Valeurs par défaut
var TV_urlEmbranchement='lib/Treeview/embranchement.gif';
var TV_urlEmbranchementDernier='lib/Treeview/embranchementDernier.gif';
var TV_urlVertical='lib/Treeview/vertical.gif';
var TV_urlOuvert='lib/Treeview/ouvert.gif';
var TV_urlOuvertDernier='lib/Treeview/ouvertDernier.gif';
var TV_urlFerme='lib/Treeview/ferme.gif';
var TV_urlFermeDernier='lib/Treeview/fermeDernier.gif';
var TV_urlBlank='lib/Treeview/blank.gif';

// Constantes
var TV_coche=1;
var TV_cochable=2;
var TV_ouvert=4;
var TV_grise=8;


// Classe Feuille
//----------------

function Feuille(tv, pere, num, urlImage, libelle, etat)
{
	this.tv=tv;
	this.pere=pere;
	this.num=num;
	this.libelle=libelle;
	this.etat=etat;

	this.image=this.tv.GetImage(urlImage);

	this.niveau=0;
	if (this.pere != null) this.niveau=this.pere.niveau + 1;

	this.Afficher=Feuille_Afficher;
	this.GetEtat=Feuille_GetEtat;
	this.CocherDescendant=Feuille_CocherDescendant;
	this.CocherMontant=Feuille_CocherMontant;
}

function Feuille_Afficher(dernier, pereEstDernier, htmlNoeudPrecedent)
{
	t='<table cellspacing="0" cellpadding="0" border="0"><tr>\n';

	// Bandes verticales ou vides
	if (this.niveau > 1)
	{
		var b=(this.pere != null) && pereEstDernier;
		htmlNoeudPrecedent += '<td width="20"><img src="'+(b?this.tv.imgBlank.src:this.tv.imgVertical.src)+'"></td>\n';
	}
	t += htmlNoeudPrecedent;

	// Embranchement
	var img1=dernier ? this.tv.imgEmbranchementDernier : this.tv.imgEmbranchement;
	if (this.niveau != 0)
		t += '<td><img src="'+img1.src+'" width="20"></td>\n';

	// Image noeud, case à cocher, libellé
	if (this.image != null) t += '<td><img src="'+this.image.src+'"></td>\n';
	if (this.etat & TV_cochable) {
		t += '<td><input type="checkbox" id="' + (this.tv.div_id+'_case_'+this.num);
		t += (this.etat & TV_coche) ? '" checked' : '"';
		t += (this.etat & TV_grise) ? ' disabled' : '';
		t += ' onClick="'+this.tv.nomInstance+'.Cocher('+ this.num + ')" style="cursor: hand; cursor: pointer;"></td>\n';
	}
	t += '<td align="left" nowrap style="'+((this.etat&TV_grise)?this.tv.styleLibellesGrises:this.tv.styleLibelles)+'">&nbsp;'+this.libelle+'</td>\n';
	t += '</tr></table>\n';
	return t;
}

function Feuille_GetEtat()
{
	return 'F'+this.num+':'+this.etat;
}

function Feuille_CocherDescendant(cocher)
{
	estCoche=(this.etat & TV_coche);
	if (estCoche && !cocher) this.etat -= TV_coche;
	else if (!estCoche && cocher) this.etat += TV_coche;
	var cb=document.getElementById(this.tv.div_id+'_case_'+this.num);
	if (cb) cb.checked=cocher;
}

function Feuille_CocherMontant(cocher)
{
	if ((this.pere != null) && (this.pere.pere != null) && !(this.pere.etat & TV_coche))
	{
		this.pere.etat += TV_coche;
		var cb=document.getElementById(this.tv.div_id+'_case_'+this.pere.num);
		if (cb) cb.checked=true;
		this.pere.CocherMontant();
	}
}


// Classe Noeud
//--------------

function Noeud(tv, pere, num, urlImage, libelle, etat)
{
	this.tv=tv;
	this.pere=pere;
	this.num=num;
	this.libelle=libelle;
	this.etat=etat;

	this.image=this.tv.GetImage(urlImage);

	this.noeudsFils=new Array();
	this.feuillesFilles=new Array();

	this.niveau=0;
	if (this.pere != null) this.niveau=this.pere.niveau+1;

	this.Afficher=Noeud_Afficher;
	this.AjouterNoeud=Noeud_AjouterNoeud;
	this.AjouterFeuille=Noeud_AjouterFeuille;
	this.Toggle=Noeud_Toggle;
	this.OuvrirFermer=Noeud_OuvrirFermer;
	this.Rechercher=Noeud_Rechercher;
	this.GetEtat=Noeud_GetEtat;
	this.CocherDescendant=Noeud_CocherDescendant;
	this.CocherMontant=Noeud_CocherMontant;
}

function Noeud_AjouterNoeud(num, urlImage, libelle, etat)
{
	n=new Noeud(this.tv, this, num, urlImage, libelle, etat);
	this.noeudsFils.push(n);
	return n;
}

function Noeud_AjouterFeuille(num, urlImage, libelle, etat)
{
	f=new Feuille(this.tv, this, num, urlImage, libelle, etat);
	this.feuillesFilles.push(f);
	return f;
}

function Noeud_Toggle()
{
	if (this.etat & TV_ouvert) this.etat -= TV_ouvert;
	else this.etat += TV_ouvert;
}

function Noeud_OuvrirFermer(ouvrir)
{
	estOuvert=(this.etat & TV_ouvert);
	if (estOuvert && !ouvrir) this.etat -= TV_ouvert;
	else if (!estOuvert && ouvrir) this.etat += TV_ouvert;

	for (var i=0; i < this.noeudsFils.length; i++)
		this.noeudsFils[i].OuvrirFermer(ouvrir);
}

function Noeud_Afficher(dernier, pereEstDernier, htmlNoeudPrecedent)
{
	if ((this.pere == null) && (this.tv.codeActionSupplementaire != ''))
		t='<table cellspacing="0" cellpadding="0" border="0" width="95%"><tr><td>\n';
	else t='';
	t += '<table cellspacing="0" cellpadding="0" border="0"><tr>\n';

	var ouvert=(this.etat & TV_ouvert);

	// Bandes verticales ou vides
	if (this.niveau > 1)
	{
		var b=(this.pere != null) && pereEstDernier;
		htmlNoeudPrecedent += '<td width="20"><img src="'+(b?this.tv.imgBlank.src:this.tv.imgVertical.src)+'"></td>\n';
	}
	t += htmlNoeudPrecedent;

	// Embranchement
	var img1=null;
	if (ouvert) img1=dernier ? this.tv.imgOuvertDernier : this.tv.imgOuvert;
	else img1=dernier ? this.tv.imgFermeDernier : this.tv.imgFerme;
	if (this.niveau != 0) t += '<td><img src="'+img1.src+'" width="20" onClick="'+this.tv.nomInstance+'.ToggleNoeud('+ this.num + ')" style="cursor: hand; cursor: pointer;""></td>\n';

	// Image noeud, case à cocher, libellé
	img1=this.image != null ? this.image : this.tv.imgNoeud;
	if (img1) t += '<td><img src="'+img1.src+'"' + (this.niveau == 0 ? ' onClick="'+this.tv.nomInstance+'.ToggleEntier();"' : '') + '" style="cursor: hand; cursor: pointer;"></td>\n';
	if (this.etat & TV_cochable) {
		t += '<td><input type="checkbox" id="' + (this.tv.div_id+'_case_'+this.num);
		t += (this.etat & TV_coche) ? '" checked' : '"';
		t += (this.etat & TV_grise) ? ' disabled' : '';
		t += ' onClick="'+this.tv.nomInstance+'.Cocher('+ this.num + ')" style="cursor: hand; cursor: pointer;"></td>\n';
	}
	t += '<td align="left" nowrap style="'+((this.etat&TV_grise)?this.tv.styleLibellesGrises:this.tv.styleLibelles)+'">&nbsp;'+this.libelle+'</td>\n';
	t += '</tr></table>\n';

	if ((this.pere == null) && (this.tv.codeActionSupplementaire != '')) t += '</td><td align="right">'+this.tv.codeActionSupplementaire+'</td></tr></table>\n';

	if (ouvert)
	{
		for(var i=0; i < this.noeudsFils.length; i++) t += this.noeudsFils[i].Afficher((i == this.noeudsFils.length-1) && (this.feuillesFilles.length == 0), dernier, htmlNoeudPrecedent);
		for(var i=0; i < this.feuillesFilles.length; i++) t += this.feuillesFilles[i].Afficher(i == this.feuillesFilles.length-1, dernier, htmlNoeudPrecedent);
	}
	return t;
}

function Noeud_Rechercher(num)
{
	if (this.num == num) return this;
	for (var i=0; i < this.noeudsFils.length; i++)
	{
		var n=this.noeudsFils[i].Rechercher(num);
		if (n != null) return n;
	}
	for (var i=0; i < this.feuillesFilles.length; i++)
		if (this.feuillesFilles[i].num == num) return this.feuillesFilles[i];
	return null;
}

function Noeud_GetEtat()
{
	var res='N'+this.num+':'+this.etat;
	for (var i=0; i < this.noeudsFils.length; i++) res += '-'+this.noeudsFils[i].GetEtat();
	for (var i=0; i < this.feuillesFilles.length; i++) res += '-'+this.feuillesFilles[i].GetEtat();
	return res;
}

function Noeud_CocherDescendant(cocher)
{
	estCoche=(this.etat & TV_coche);
	if (estCoche && !cocher) this.etat -= TV_coche;
	else if (!estCoche && cocher) this.etat += TV_coche;

	var cb=document.getElementById(this.tv.div_id+'_case_'+this.num);
	if (cb) cb.checked=cocher;

	if (this.noeudsFils.length > 0)
		for (var i=0; i<this.noeudsFils.length; i++) this.noeudsFils[i].CocherDescendant(cocher);

	if (this.feuillesFilles.length > 0)
		for (var i=0; i<this.feuillesFilles.length; i++) this.feuillesFilles[i].CocherDescendant(cocher);
}

function Noeud_CocherMontant()
{
	if ((this.pere != null) && (this.pere.pere != null) && !(this.pere.etat & TV_coche))
	{
		this.pere.etat += TV_coche;
		var cb=document.getElementById(this.tv.div_id+'_case_'+this.pere.num);
		if (cb) cb.checked=true;
		this.pere.CocherMontant();
	}
}


// Classe Treeview
//-----------------

// nomInstance : nom de la variable contenant l'instance de l'objet (sert aux onClick)
// codeActionSupplementaire: code HTML localisé en haut à droite du treeview (niveau racine) ; Si '', pas d'action supplémentaire
// urlImageNoeud: Si image d'un noeud=null, utilise cette url, qui peut également=null (=> pas d'image)
function Treeview(nomInstance, div_id, hidden_etat_id, styleLibelles, styleLibellesGrises, libelleRacine, codeActionSupplementaire, urlImageRacine, urlImageNoeud)
{
	this.nomInstance=nomInstance;

	this.div=document.getElementById(div_id);
	if (!this.div)
	{
		alert('Treeview : l\'id du div est incorrect ('+div_id+')');
		return null;
	}
	this.div_id=div_id;

	this.hidden=document.getElementById(hidden_etat_id);
	if (!this.hidden)
	{
		alert('Treeview : l\'id du hidden est incorrect ('+hidden_etat_id+')');
		return null;
	}

	this.styleLibelles=styleLibelles;
	this.styleLibellesGrises=styleLibellesGrises;
	this.codeActionSupplementaire=codeActionSupplementaire;

	this.racine=null;
	this.imgNoeud=null;
	this.imgEmbranchement=null;
	this.imgEmbranchementDernier=null;
	this.imgVertical=null;
	this.imgOuvert=null;
	this.imgOuvertDernier=null;
	this.imgFerme=null;
	this.imgFermeDernier=null;
	this.imgBlank=null;

	this.urlImages=new Array();
	this.images=new Array();

	// Publiques
	this.Afficher=Treeview_Afficher;
	this.AjouterNoeud=Treeview_AjouterNoeud;
	this.AjouterFeuille=Treeview_AjouterFeuille;
	this.GetImage=Treeview_GetImage;

	// Privées
	this.Rechercher=Treeview_Rechercher;
	this.GetEtat=Treeview_GetEtat;
	this.ToggleNoeud=Treeview_ToggleNoeud;
	this.ToggleEntier=Treeview_ToggleEntier;
	this.Cocher=Treeview_Cocher;

	// Init
	this.urlImageNoeud=urlImageNoeud;
	if (urlImageNoeud != '')
	{
		this.imgNoeud=new Image;
		this.imgNoeud.src=urlImageNoeud;
	}
	this.imgEmbranchement=this.GetImage(TV_urlEmbranchement);
	this.imgEmbranchementDernier=this.GetImage(TV_urlEmbranchementDernier);
	this.imgVertical=this.GetImage(TV_urlVertical);
	this.imgOuvert=this.GetImage(TV_urlOuvert);
	this.imgOuvertDernier=this.GetImage(TV_urlOuvertDernier);
	this.imgFerme=this.GetImage(TV_urlFerme);
	this.imgFermeDernier=this.GetImage(TV_urlFermeDernier);
	this.imgBlank=this.GetImage(TV_urlBlank);

	this.racine=new Noeud(this, null, 0, urlImageRacine, libelleRacine, TV_ouvert);
	this.racine.etat=TV_ouvert;
}


function Treeview_GetImage(urlImage)
{
	if (urlImage == '') return null;
	for (var i=0; i < this.urlImages.length; i++)
		if (this.urlImages[i] == urlImage) return this.images[i];
	this.urlImages.push(urlImage);
	var im=new Image;
	im.src=urlImage;
	this.images.push(im);
	return im;
}

function Treeview_AjouterNoeud(num, urlImage, libelle, etat)
{
	return this.racine.AjouterNoeud(num, urlImage, libelle, etat);
}
function Treeview_AjouterFeuille(num, urlImage, libelle, etat)
{
	return this.racine.AjouterFeuille(num, urlImage, libelle, etat);
}


function Treeview_Rechercher(num)
{
	return this.racine.Rechercher(num);
}

function Treeview_Afficher()
{
	this.div.innerHTML=this.racine.Afficher(false, false, '');
	this.hidden.value=this.GetEtat();
}

function Treeview_GetEtat()
{
	return this.racine.GetEtat();
}

function Treeview_ToggleNoeud(num)
{
	var n=this.Rechercher(num);
	if (n != null)
	{
		n.Toggle();
		this.Afficher();
	}
}

function Treeview_ToggleEntier()
{
	if (this.racine.noeudsFils.length == 0) return;
	var b=(this.racine.noeudsFils[0].etat & TV_ouvert);
	for (var i=0; i<this.racine.noeudsFils.length; i++) this.racine.noeudsFils[i].OuvrirFermer(!b);
	this.Afficher();
}

function Treeview_Cocher(num)
{
	var n=this.Rechercher(num);

	if (!n) alert('Treeview : Pb case à cocher introuvable!');
	else
	{
		var cb=document.getElementById(this.div_id+'_case_'+n.num);
		if (cb) {
			n.CocherDescendant(cb.checked);
			if (cb.checked) n.CocherMontant();
		}
		this.hidden.value=this.GetEtat();
	}
}

