/** 
* Exception paramètre invalide
* @member explorateur
*/
EXCEP_invalidParameter = " EXCEP_invalidParameter : le parametre en entrée est invalide";

/** 
* @class permet de réduire ou de deplier des divs comme des répertoires <br>
* utilisation : <br>
*  - les div de la page HTML doivent avoir leur id prefixé de la constante defini par OPT_chaineExplorateur <br>
*  - les fichiers images doivent se nommer tels qu'ils sont défini dans OPT_fichierFlecheDroite, OPT_fichierFlecheBas et OPT_fichierFeuille <br>
*  - les div ne doivent pas être imbriqués <br>
*  - l'initialisation se fait par la fonction _init() <br>
*  - le déroulement d'un lien par _exploreDiv()	<br>
@author : ote
@version : 1.1 (le pointeur est une mains)
*/
function Explorateur(){
	/**
	* Répertoire contenant les images ("/frameworkjs/outilsGraphique/explorateur/images/" par défaut)
	*/
	this.OPT_repImage="/frameworkjs/outilsGraphique/explorateur/images/";
	/**
	* Chaine prefixant les div de l'explorateur ("Ex_" par défaut)
	*/	
	this.OPT_chaineExplorateur="Ex_"; 
	/**
	* Caractère de séparation entre les niveau ("." par défaut)
	*/	
	this.OPT_charSeparationNiveau=".";
	/**
	* Chemin et nom du fichier fleche droite ("this.OPT_repImage + 'fleche_droite.gif'" par défaut) 
	*/
	this.OPT_fichierFlecheDroite=this.OPT_repImage + "toc-plus.png"; 
	/**
	* Chemin et nom du fichier fleche bas ("this.OPT_repImage + 'fleche_bas.gif'" par défaut) 
	*/
	this.OPT_fichierFlecheBas=this.OPT_repImage + "toc-minus.png"; 
	/**
	* Chemin et nom du fichier feuille ("this.OPT_repImage + 'carre_feuille.gif'" par défaut) 
	*/
	this.OPT_fichierFeuille=this.OPT_repImage + "toc-blank.png"; 
	/**
	* Chaine préfixant les images ("IMG" par défaut)
	*/this.prefixeImage="IMG";

/** 
* Récupere le niveau de la chaine
* @private
* @return {int} niveau 
* @param {String} chaine : nom du div
* @author : ote
* @version : 1.0
*/
	this._getLevel = function getLevel(chaine){
		chaine=chaine.substring(chaine.indexOf(this.OPT_chaineExplorateur)+this.OPT_chaineExplorateur.length, chaine.length);
		taille=0;
		while(chaine.indexOf(this.OPT_charSeparationNiveau)!=-1){
			taille++;
			chaine=chaine.substring(chaine.indexOf(this.OPT_charSeparationNiveau)+1, chaine.length);
		}
		return taille+1;
	}

/** 
* Recupere les Div interressants pour l'explorateur
* @private
* @return {Array} listeFinale : liste des div interressants
* @author : ote
* @version : 1.0
*/
	this._getExplorerDiv = function getExplorerDiv(){
		listeDiv= document.getElementsByTagName("div");
		listeFinale=new Array();
		i=0;
		while (listeDiv[i]){
			if (listeDiv[i].id.indexOf(this.OPT_chaineExplorateur)!=-1){
				listeFinale[listeFinale.length]=listeDiv[i];
			}
			i++;
		}
		return listeFinale;
	}


/** 
* Replis les divs sauf du niveau 1 
* @param {array} liste : liste des divs
* @private
* @author : ote
* @version : 1.0
*/
	this._depliNiveau1 = function depliNiveau1(liste){
		i =0;
		while (liste[i]){
			if (this._getLevel(liste[i].id)==1 ){
				liste[i].style.display='block';
			}
			else {
				liste[i].style.display='none';
			}
			liste[i].style.cursor='pointer';
			i++;
		}
	}

/** 
* Permet de savoir si le div est a deplié ou non
* @param {String} titre : nom du titre de la liste a comparer
* @param {String} name : nom du titre cliqué
* @return {boolean/int} 
* @private
* @author : ote
* @version : 1.0
*/
	this._estADeplie = function estADeplie(titre, name){
		if (this._getLevel(titre)==1) return 1; // titre de niveau 1
		if (titre==name) return 2; // le titre cliqué
		if ((this._getLevel(titre)==(this._getLevel(name)+1)) && (titre.indexOf(name)!=-1)) return 3; // titre en dessous du titre cliqué
		// si niveau juste au dessus et dans la meme branche
		titreDessus=titre.substring(0,titre.lastIndexOf(this.OPT_charSeparationNiveau));
		if ((name.indexOf(titreDessus)!=-1) ) return 4;
		return false;
	}	
/** 
* Permet de savoir si le div est a deplié ou non 
* @param {String} titre : nom du titre de la liste a comparer
* @param {String} name : nom du titre cliqué
* @return {boolean/int} 
* @private
* @author : ote
* @version : 1.0
*/
	this._estAReplie = function estAReplie(titre, name){
		if (titre==name) return false; // le titre cliqué
		if ((this._getLevel(titre)>(this._getLevel(name))) && (titre.indexOf(name)!=-1)) return true; // titre en dessous
		// si niveau juste au dessus et dans la meme branche
		titreDessus=titre.substring(0,titre.lastIndexOf(this.OPT_charSeparationNiveau));
		if ((name.indexOf(titreDessus)!=-1) ) return false;
		return false;
	}
/** 
* Permet de recuperer la bonne image pour le niveau concerné
* @private
* @param {String} numeroDiv : numero du div dans la liste
* @param {Array} liste : liste des div
* @param {name} : inutlise 
* @return {String} nom du fichier image fleche/feuille
* @author : ote
* @version : 1.0
*/
	this._selectImg=function selectImg(numeroDiv, liste, name){
		// Si c'est une feuille -> carre
		feuille=true;
		branche=false;
		j=0;
		while (liste[j]){
			if ((liste[j].id.indexOf(liste[numeroDiv].id)!=-1)&& j!=numeroDiv ){ 
				feuille=false;	// l'element n'est pas une feuille
			}
			if (j!=numeroDiv && (liste[j].style.display=='block') && (liste[j].id.indexOf(liste[numeroDiv].id)!=-1)){
				branche=true;		
			}		
			j++;
		}
		if (feuille) return this.OPT_fichierFeuille;
		if (branche) return this.OPT_fichierFlecheBas;
		return  this.OPT_fichierFlecheDroite;
	}

/** 
* Permet de deplier les différents niveaux
* @private
* @param {Array} liste : liste des div
* @param {String} name : nom du titre cliqué
* @author : ote
* @version : 1.0
*/
	this._depliNiveau=function depliNiveau(liste, name){
		i =0;
		while (liste[i]){
			if (this._estADeplie(liste[i].id, name)){
				//on active les div
				liste[i].style.display='block';
			}
			else{
				null;
				//liste[i].style.display='none';
			}
			liste[i].style.cursor='pointer';
			i++;
		}
		i =0;
		while (liste[i]){
			document.getElementById(this.prefixeImage+liste[i].id).src = this._selectImg(i, liste, name);
			i++;
		}
	}

/** 
* Permet de replié les différents niveau
* @private
* @param {Array} liste : liste des div
* @param {String} name : nom du titre cliqué
* @author : ote
* @version : 1.0
*/
	this._repliNiveau=function depliNiveau(liste, name){
		i =0;
		while (liste[i]){
			if (this._estAReplie(liste[i].id, name)){
				//on active les div
				liste[i].style.display='none';
			}
			else{
				null;
				//liste[i].style.display='none';
			}
			liste[i].style.cursor='pointer';
			i++;
		}
		i =0;
		while (liste[i]){
			document.getElementById(this.prefixeImage+liste[i].id).src = this._selectImg(i, liste, name);
			i++;
		}
	}
	
/** 
* Permet de gerer le depli lors d'un click sur un div
* @private
* @param {Array} liste : liste des div
* @author : ote
* @version : 1.0
*/
	this._addImage= function addImage(liste){
		i =0;
		while (liste[i]){
			chaineTitreDeb ="<h"+this._getLevel(liste[i].id)+">";
			chaineTitreFin="</h"+this._getLevel(liste[i].id)+">";
			
			chaineImage= "<img id='"+this.prefixeImage+liste[i].id+"' src='"+this.OPT_fichierFlecheDroite+"'	style='vertical-align:middle'>&nbsp;";
			liste[i].innerHTML=	chaineTitreDeb+ chaineImage+liste[i].innerHTML + chaineTitreFin;
			i++;
		}
	}

/** 
* Permet de savoir si le div est deplie ou pas
* @private
* @param {String} name : nom du titre cliqué
* @author : ote
* @version : 1.0
*/
	this._estDeplie = function estDeplie(name){
	if (document.getElementById(name+this.OPT_charSeparationNiveau+"1").style.display=="block")
		return true;
	else return false; 
}

/** 
* Permet de gerer le depli lors d'un click sur un div
* @param {String} name : nom du titre cliqué
* @author : ote
* @version : 1.0
*/
	this._explorDiv = function explorDiv(name){
			
		// On recupère la liste des div qui correspondent a l'explorer
		listeExplorerDiv = this._getExplorerDiv();
		// on recupere le niveau du titre
		niveauTitre=this._getLevel(name);

		if (this._estDeplie(name)){
			// on repli le div
			this._repliNiveau(listeExplorerDiv,name);
		}
		else{
			//on depli le div

			this._depliNiveau(listeExplorerDiv,name);
		}
			
	}
/**
* Initialisation de l'explorateur (repli de tous les niveau)
* @author : ote
* @version : 1.0 
*/
 	this._init = function init(){
		// On recupère la liste des div qui correspondent a l'explorer
		listeExplorerDiv = this._getExplorerDiv();
		//On repli tout sauf le niveau 1
		this._depliNiveau1(listeExplorerDiv);
		//on ajoute les images aux divs
		this._addImage(listeExplorerDiv);
	}
	
/** 
* Permet de changer les options de l'exporateur
* @param {String} chaine : prefixe permettant de selectionner les divs de l'explorateur
* @param {Char} caractere : caractere de separation entre les niveaux
* @param {String} fdroite : chemin + nom du fichier de la fleche droite
* @param {String} fbas : chemin + nom du fichier de la fleche bas
* @param {String} ffeuille : chemin + nom du fichier de l'icone feuille
* @author : ote
* @version : 1.0
*/
	this._setOption = function setOption(chaine, caractere, fdroite, fbas, ffeuille){
		if (chaine != null ) this.OPT_chaineExplorateur= chaine; 
		if (chaine != null ) this.OPT_charSeparationNiveau=caractere;
		if (chaine != null ) this.OPT_fichierFlecheDroite=fdroite;
		if (chaine != null ) this.OPT_fichierFlecheBas=fbas;
		if (chaine != null ) this.OPT_fichierFeuille=ffeuille;
		
	}

}


/**
* fonction permettant d'instantier un explorateur est de deplie le div selectionne (raccourci de _explorDiv)
* @member Explorateur
* @param name : id du div appelant
* @throws EXCEP_invalidParameter
* @author : ote
* @version : 1.0
*/
function callExplorer(name){
	if (name ==null) throw EXCEP_invalidParameter;
	myExplorer = new Explorateur();
	myExplorer._explorDiv(name);
}

/**
* fonction permettant de regrouper les divs en titre 1 lors du chargement de la page (raccourci de _init)
* @member Explorateur
* @author : ote
* @version : 1.0
*/
function initExplorer(){
	initialisation = new Explorateur();
	initialisation._init();
}


