/**
*@addtogroup COMPOSANT
*
*Comp_Tableau
*Script permettant de gérer les effets sur les tableaux.
*
*@author François Béliveau <fbeliveau@mexup-soft.com>
*@copyright 2006 MEXUP <http://www.mexup-soft.com>
*@license GNU General Public License <http://www.gnu.org/copyleft/gpl.html>
*@version 0.1.1
*/
function Comp_Tableau()
{
	//singleton
	obj_Pointeur = this.constructor;
	if(obj_Pointeur.obj_Instance == undefined)
	{
		//propriétés
		this.bool_Compatible = null;
		this.array_Requis = new Array(
			document.getElementById,
			document.getElementsByTagName,
			Bib_Elements.get_ElementsByClassName,
			Bib_Elements.get_Cible,
			Bib_Elements.set_Action,
			Bib_Elements.unset_Action,
			Bib_Elements.exec_StopAction
		);

		this.str_ClasseLignePaire = 'ligne_paire';
		this.str_ClasseLigneImpaire = 'ligne_impaire';
		this.str_ClasseLigneActive = 'ligne_active';
		this.str_ClasseLigneFermer = 'ligne_fermer';
		this.str_ClasseLigneOuverte = 'ligne_ouverte';
		this.str_ClasseSpecial = 'tableauspecial';
		this.str_ClasseSpecialActive = 'comp_tableauspecial';
		this.str_ClasseContenuSpecial = 'special';

		this.str_UrlImageTheme = null;
		this.str_ClasseColonneCheckBox = 'colonne_checkbox';
		this.str_ImageToutCocher = 'toutselectionner_colonne.png';
		this.str_ToutCocher = 'Tout sélectionner';
		this.str_TitreToutCocher = 'Sélectionner toutes les cases de cette colonne';
		this.str_ImageToutDecocher = 'toutdeselectionner_colonne.png';
		this.str_ToutDecocher = 'Tout déselectionner';
		this.str_TitreToutDecocher = 'Déselectionner toutes les cases de cette colonne';
		this.str_ImageInverserSelection = 'inverserselection_colonne.png';
		this.str_InverserSelection = 'Inverser';
		this.str_TitreInverserSelection = 'Inverser la sélection des cases de cette colonne';


		obj_Pointeur.obj_Instance = this;
	}
	else
		return obj_Pointeur.obj_Instance;
}

/*------------------------------------------------------------
METHODES PRIVEES
------------------------------------------------------------*/

/**
*check_Compatible
*Spécifit si le navigateur du client est compatible ou non avec le code de la classe.
*Un système de "cache" est utilisé pour stocker le résultat dans une variable.
*Ce qui permet d'appeler autant de fois que l'on souhaite la fonction sans pour autant refaire le test complètement
*
*@return     boolean
*/
Comp_Tableau.prototype.check_Compatible = function()
{
	if(this.bool_Compatible != true && this.bool_Compatible != false)
	{
		this.bool_Compatible = true;
		try
		{
			var int_NbRequis = this.array_Requis.length - 1;
			for(var int_I = 0; int_I<int_NbRequis; int_I++)
			{
				if(!this.array_Requis[int_I])
				{
					this.bool_Compatible = false;
					break;
				}
			}
		}
		catch(obj_Erreur)
		{
			this.bool_Compatible = false;
		}
	}
	return this.bool_Compatible;
};

/**
*get_UrlImageTheme
*Retourne l'url du dossier image du theme en cours.
*
*@return     void
*/
Comp_Tableau.prototype.get_UrlImageTheme = function()
{
	if(this.str_UrlImageTheme === null)
	{
		this.str_UrlImageTheme = '';
		var int_NbCss = document.styleSheets.length;
		for(var int_I=0; int_I < int_NbCss; int_I++)
		{
			var str_UrlCss = document.styleSheets[int_I].href;
			var int_IndiceSlash = str_UrlCss.lastIndexOf('/');
			var str_FichierCss = str_UrlCss;
			if(int_IndiceSlash > 0)
			{
				int_IndiceSlash += 1;
				var int_Longueur = str_UrlCss.length
				str_FichierCss = str_UrlCss.substring(int_IndiceSlash, int_Longueur);
			}

			if(str_FichierCss === 'style.css')
			{
				this.str_UrlImageTheme = str_UrlCss.substring(0, int_IndiceSlash)+'images/';
				break;
			}
		}
	}
	return this.str_UrlImageTheme;
}

/**
*exec_OuvrirFermer
*Ouvre ou femer une ligne.
*
*@param     object[Evenement]
*
*@return     boolean
*/
Comp_Tableau.prototype.exec_OuvrirFermer = function(obj_Evenement)
{
	var obj_Cible = Bib_Elements.get_Cible(obj_Evenement);
	//on remonte jusqu'au conteneur tbody
	var obj_Tbody = obj_Cible;
	while(obj_Tbody && obj_Tbody.nodeName.toLowerCase() != 'tbody')
	{
		obj_Tbody = obj_Tbody.parentNode;
	}
	if(obj_Tbody)
	{
		var array_Fermer = Bib_Elements.get_ElementsByClassName(obj_Tbody, 'tr', 'ligne_fermer');
		if(array_Fermer.length === 1)
		{
			array_Fermer[0].className = 'ligne_ouverte';
		}
		else
		{
			var array_Ouvert = Bib_Elements.get_ElementsByClassName(obj_Tbody, 'tr', 'ligne_ouverte');
			if(array_Ouvert.length === 1)
			{
				array_Ouvert[0].className = 'ligne_fermer';
			}
		}
	}
	//return Bib_Elements.exec_StopAction(obj_Evenement);
}

/**
*exec_ToutCocher
*Coche toutes les cases à cocher de la colonne.
*
*@param     object[Evenement]
*
*@return     boolean
*/
Comp_Tableau.prototype.exec_ToutCocher = function(obj_Evenement)
{
	var obj_Cible = Bib_Elements.get_Cible(obj_Evenement);
	var obj_Tableau = obj_Cible;
	while(obj_Tableau && obj_Tableau.nodeName.toLowerCase() != 'table')
	{
		obj_Tableau = obj_Tableau.parentNode;
	}

	var int_NbCorps = obj_Tableau.tBodies.length;
	for(var int_I = 0; int_I < int_NbCorps; int_I++)
	{
		var int_NbLignes = obj_Tableau.tBodies[int_I].rows.length;
		for(var int_Y = 0; int_Y < int_NbLignes; int_Y++)
		{
			var int_NbColonnes = obj_Tableau.tBodies[int_I].rows[int_Y].cells.length;
			if(int_NbColonnes > 0)
			{
				var array_Input = obj_Tableau.tBodies[int_I].rows[int_Y].cells[0].getElementsByTagName('input');
				if(array_Input.length > 0 && array_Input[0].type == 'checkbox')
					array_Input[0].checked = true;//array_Input[0].setAttribute('checked', 'checked');
			}
		}
	}

	return Bib_Elements.exec_StopAction(obj_Evenement);
}

/**
*exec_ToutDecocher
*Décoche toutes les cases à cocher de la colonne.
*
*@param     object[Evenement]
*
*@return     boolean
*/
Comp_Tableau.prototype.exec_ToutDecocher = function(obj_Evenement)
{
	var obj_Cible = Bib_Elements.get_Cible(obj_Evenement);
	var obj_Tableau = obj_Cible;
	while(obj_Tableau && obj_Tableau.nodeName.toLowerCase() != 'table')
	{
		obj_Tableau = obj_Tableau.parentNode;
	}

	var int_NbCorps = obj_Tableau.tBodies.length;
	for(var int_I = 0; int_I < int_NbCorps; int_I++)
	{
		var int_NbLignes = obj_Tableau.tBodies[int_I].rows.length;
		for(var int_Y = 0; int_Y < int_NbLignes; int_Y++)
		{
			var int_NbColonnes = obj_Tableau.tBodies[int_I].rows[int_Y].cells.length;
			if(int_NbColonnes > 0)
			{
				var array_Input = obj_Tableau.tBodies[int_I].rows[int_Y].cells[0].getElementsByTagName('input');
				if(array_Input.length > 0 && array_Input[0].type == 'checkbox')
					array_Input[0].checked = false;//array_Input[0].removeAttribute('checked', false);
			}
		}
	}

	return Bib_Elements.exec_StopAction(obj_Evenement);
}

/**
*exec_InverserSelection
*Inverse la sélection des cases à cocher de la colonne.
*
*@param     object[Evenement]
*
*@return     boolean
*/
Comp_Tableau.prototype.exec_InverserSelection = function(obj_Evenement)
{
	var obj_Cible = Bib_Elements.get_Cible(obj_Evenement);

	var obj_Tableau = obj_Cible;
	while(obj_Tableau && obj_Tableau.nodeName.toLowerCase() != 'table')
	{
		obj_Tableau = obj_Tableau.parentNode;
	}

	var int_NbCorps = obj_Tableau.tBodies.length;
	for(var int_I = 0; int_I < int_NbCorps; int_I++)
	{
		var int_NbLignes = obj_Tableau.tBodies[int_I].rows.length;
		for(var int_Y = 0; int_Y < int_NbLignes; int_Y++)
		{
			var int_NbColonnes = obj_Tableau.tBodies[int_I].rows[int_Y].cells.length;
			if(int_NbColonnes > 0)
			{
				var array_Input = obj_Tableau.tBodies[int_I].rows[int_Y].cells[0].getElementsByTagName('input');
				if(array_Input.length > 0 && array_Input[0].type == 'checkbox')
				{
					if(array_Input[0].checked)
						array_Input[0].checked = false;
					else
						array_Input[0].checked = true;
				}
			}
		}
	}

	return Bib_Elements.exec_StopAction(obj_Evenement);
}

/**
*set_LigneActive
*Rend active une ligne.
*
*@param     object[Evenement]
*
*@return     boolean
*/
Comp_Tableau.prototype.set_LigneActive = function(obj_Evenement)
{
	var obj_Cible = Bib_Elements.get_Cible(obj_Evenement);
	var obj_Temp = new Comp_Tableau();
	obj_Cible.className = obj_Temp.str_ClasseLigneActive;
}

/**
*set_LignePaire
*Désactive une ligne paire.
*
*@param     object[Evenement]
*
*@return     boolean
*/
Comp_Tableau.prototype.set_LignePaire = function(obj_Evenement)
{
	var obj_Cible = Bib_Elements.get_Cible(obj_Evenement);
	var obj_Temp = new Comp_Tableau();
	obj_Cible.className = obj_Temp.str_ClasseLignePaire;
}

/**
*set_LigneImpaire
*Désactive une ligne paire.
*
*@param     object[Evenement]
*
*@return     boolean
*/
Comp_Tableau.prototype.set_LigneImpaire = function(obj_Evenement)
{
	var obj_Cible = Bib_Elements.get_Cible(obj_Evenement);
	var obj_Temp = new Comp_Tableau();
	obj_Cible.className = obj_Temp.str_ClasseLigneImpaire;
}

/*------------------------------------------------------------
METHODES PUBLIQUES
------------------------------------------------------------*/

/**
*exec_Initialisation
*Execute l'initialisation d'un tableau.
*
*@param     object[element HTML]
*
*@return     void
*/
Comp_Tableau.prototype.exec_Initialisation = function(obj_Tableau)
{
	if(!this.check_Compatible())
		return;

	if(!obj_Tableau)
		return;

	if(!obj_Tableau.tBodies)
		return;

	var bool_CheckBox = false;
	var array_Actions = Bib_Elements.get_ElementsByClassName(obj_Tableau, 'ul', 'actions');
	var bool_Actions = (array_Actions.length > 0);

	//gestion des checkbox si nécessaire
	var array_ColonneCheckBox = Bib_Elements.get_ElementsByClassName(obj_Tableau, 'th', this.str_ClasseColonneCheckBox);
	if(array_ColonneCheckBox.length > 0)
	{
		bool_CheckBox = true;
		var obj_Cellule = array_ColonneCheckBox[0];

		var obj_UlTemp = document.createElement('ul');
		obj_Cellule.appendChild(obj_UlTemp);

		//lien "tout sélectionner"
		var obj_LiTemp = document.createElement('li');
		obj_UlTemp.appendChild(obj_LiTemp);
		var obj_ATemp = document.createElement('a');
		obj_LiTemp.appendChild(obj_ATemp);
		obj_ATemp.setAttribute('href', '#toutselectionner-Colonne');
		Bib_Elements.set_Action(obj_ATemp, 'click', this.exec_ToutCocher, false);
		var obj_ImgTemp = document.createElement('img');
		obj_ATemp.appendChild(obj_ImgTemp);
		obj_ImgTemp.setAttribute('src', this.get_UrlImageTheme()+this.str_ImageToutCocher);
		obj_ImgTemp.setAttribute('alt', this.str_ToutCocher);
		obj_ImgTemp.setAttribute('title', this.str_TitreToutCocher);

		//lien "tout désélectionner"
		var obj_LiTemp = document.createElement('li');
		obj_UlTemp.appendChild(obj_LiTemp);
		var obj_ATemp = document.createElement('a');
		obj_LiTemp.appendChild(obj_ATemp);
		obj_ATemp.setAttribute('href', '#toutdeselectionner-Colonne');
		Bib_Elements.set_Action(obj_ATemp, 'click', this.exec_ToutDecocher, false);
		var obj_ImgTemp = document.createElement('img');
		obj_ATemp.appendChild(obj_ImgTemp);
		obj_ImgTemp.setAttribute('src', this.get_UrlImageTheme()+this.str_ImageToutDecocher);
		obj_ImgTemp.setAttribute('alt', this.str_ToutDecocher);
		obj_ImgTemp.setAttribute('title', this.str_TitreToutDecocher);

		//lien "inverser sélection"
		var obj_LiTemp = document.createElement('li');
		obj_UlTemp.appendChild(obj_LiTemp);
		var obj_ATemp = document.createElement('a');
		obj_LiTemp.appendChild(obj_ATemp);
		obj_ATemp.setAttribute('href', '#inverserselection-Colonne');
		Bib_Elements.set_Action(obj_ATemp, 'click', this.exec_InverserSelection, false);
		var obj_ImgTemp = document.createElement('img');
		obj_ATemp.appendChild(obj_ImgTemp);
		obj_ImgTemp.setAttribute('src', this.get_UrlImageTheme()+this.str_ImageInverserSelection);
		obj_ImgTemp.setAttribute('alt', this.str_InverserSelection);
		obj_ImgTemp.setAttribute('title', this.str_TitreInverserSelection);
	}

	//zébrage des lignes
	if(obj_Tableau.className === this.str_ClasseSpecial)
	{
		var int_NbCorps = obj_Tableau.tBodies.length;
		for(var int_I = 0; int_I < int_NbCorps; int_I++)
		{
			obj_Tableau.tBodies[int_I].className = int_I % 2 ? this.str_ClasseLignePaire : this.str_ClasseLigneImpaire;

			//affectation des évenement "ouvrir" et "fermer"
			var array_Special = Bib_Elements.get_ElementsByClassName(obj_Tableau.tBodies[int_I], 'tr', this.str_ClasseContenuSpecial);
			if(array_Special.length === 1)
			{
				array_Special[0].className = this.str_ClasseLigneFermer;

				var int_NbLignes = obj_Tableau.tBodies[int_I].rows.length;
				if(int_NbLignes > 0)
				{
					var int_NbCellules = obj_Tableau.tBodies[int_I].rows[0].cells.length;
					var int_Y = 0;

					if(bool_Actions)
						int_NbCellules--;
					if(bool_CheckBox)
						int_Y++;
					for(int_Y; int_Y < int_NbCellules; int_Y++)
					{
						Bib_Elements.set_Action(obj_Tableau.tBodies[int_I].rows[0].cells[int_Y], 'click', this.exec_OuvrirFermer, false);
						obj_Tableau.tBodies[int_I].rows[0].cells[int_Y].style.cursor = 'pointer';
					}
				}
			}
		}
		obj_Tableau.className = this.str_ClasseSpecialActive;
	}
	else
	{
		var int_NbCorps = obj_Tableau.tBodies.length;
		for(var int_I = 0; int_I < int_NbCorps; int_I++)
		{
			var int_Decalage = 0;
			var int_NbLignes = obj_Tableau.tBodies[int_I].rows.length;
			for(var int_Y = 0; int_Y < int_NbLignes; int_Y++)
			{
				var int_NbColonnes = obj_Tableau.tBodies[int_I].rows[int_Y].cells.length;
				if(int_NbColonnes > 0 && obj_Tableau.tBodies[int_I].rows[int_Y].cells[0].nodeName.toLowerCase() != 'td')
					int_Decalage++;
				else
				{
					obj_Tableau.tBodies[int_I].rows[int_Y].className = (int_Y-int_Decalage) % 2 ? this.str_ClasseLignePaire : this.str_ClasseLigneImpaire;
					//affectation de l'effet
					//obj_Tableau.tBodies[int_I].rows[int_Y].onmouseover = 'this.className='+this.str_ClasseLigneActive;
					//obj_Tableau.tBodies[int_I].rows[int_Y].onmouseout = 'this.className='+this.str_ClasseLignePaire;
					//Bib_Elements.set_Action(obj_Tableau.tBodies[int_I].rows[int_Y], 'mouseover', this.set_LigneActive, false);
					//(int_Y-int_Decalage) % 2 ? Bib_Elements.set_Action(obj_Tableau.tBodies[int_I].rows[int_Y], 'mouseout', this.set_LignePaire, false) : Bib_Elements.set_Action(obj_Tableau.tBodies[int_I].rows[int_Y], 'mouseout', this.set_LigneImpaire, false);
				}
			}
		}
	}
};

/**
*exec_InitialisationGlobale
*Execute l'initialisation des tableaux du document.
*
*@return     void
*/
Comp_Tableau.prototype.exec_InitialisationGlobale = function()
{
	if(!this.check_Compatible())
		return;

	var array_Tableau = document.getElementsByTagName('table');
	var int_NbTableau = array_Tableau.length;
	for(var int_I=0; int_I<int_NbTableau; int_I++)
	{
		this.exec_Initialisation(array_Tableau[int_I]);
	}
};

if(Mxp_Init.set_NouvelleFonction)Mxp_Init.set_NouvelleFonction(function(){var obj_Temp = new Comp_Tableau();obj_Temp.exec_InitialisationGlobale();});
