/**
*@addtogroup BIBLIOTHEQUE
*
*Bib_Elements
*Bibliothèque de script utilitaires sur les éléments HTML
*
*@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.0
*/
var Bib_Elements =
{
	/**
	*get_ElementsByClassName
	*Retourne tous les éléments dont la classe correspond à celle spécifier.
	*Diverses possibilités pour utiliser cette fonction:
	*     - Mxp_Elements.getElementsByClassName(conteneur, "div", array("maclasse", "uneclasse")); => retourne tout les éléments de type "div" contenu dans l'élément "conteneur" dont la classe correspond à "maclasse" ou à "uneclasse".
	*     - Mxp_Elements.getElementsByClassName(conteneur, "*", array("maclasse", "uneclasse")); => retourne tout les éléments contenu dans l'élément "conteneur" dont la classe correspond à "maclasse" ou à "uneclasse".
	*     - Mxp_Elements.getElementsByClassName(conteneur, "div", "maclasse"); => retourne tout les éléments de type "div" contenu dans l'élément "conteneur" dont la classe correspond à "maclasse".
	*
	*@param     object[Element HTML]
	*@param     string
	*@param     string|array
	*
	*@return     void
	*/
	get_ElementsByClassName: function(obj_Element, str_Balise, variant_Classe)
	{
		if(typeof Array.prototype.push == "undefined")
		{
			// méthode push() pour la compatibilité IE5
			Array.prototype.push = function()
				{
					var int_Indice = 0;
					var int_Nb = arguments.length;
					for(int_Indice = 0; int_Indice < int_Nb; int_Indice++)
					{
						this[this.length] = arguments[int_Indice];
					}
					return this.length;
				};
		}

		var array_Elements = (str_Balise == "*" && obj_Element.all)? obj_Element.all : obj_Element.getElementsByTagName(str_Balise);
		var array_Resultat = new Array();
		var array_Classe = new Array();
		if(typeof variant_Classe == "object")
		{
			var int_NbClasse = variant_Classe.length;
			for(var int_I=0; int_I<int_NbClasse; int_I++)
			{
				array_Classe.push(variant_Classe[int_I]);
			}
		}
		else
			array_Classe.push(variant_Classe);

		var obj_ElementTemp;
		var bool_Ok;
		var int_Nb = array_Elements.length;
		var int_NbClasse = array_Classe.length;
		for(var int_I=0; int_I<int_Nb; int_I++)
		{
			obj_ElementTemp = array_Elements[int_I];
			bool_Ok = false;
			var y = 0
			while(!bool_Ok && y<int_NbClasse)
			{
				bool_Ok = (array_Classe[y] == obj_ElementTemp.className)
				y++;
			}
			if(bool_Ok)
				array_Resultat.push(obj_ElementTemp);
		}
		return (array_Resultat)
	},

	/**
	*get_Cible
	*Retourne la source d'un événement.
	*
	*@param     object[Evenement]
	*@param     boolean
	*
	*@return     boolean | string
	*/
	get_Cible: function(obj_Evenement, bool_Lien)
	{
		if(bool_Lien!==false && (!bool_Lien || bool_Lien== 'undefined'))
			bool_Lien = true;
		var target = window.event ? window.event.srcElement : obj_Evenement ? obj_Evenement.target : this;
		if(!target)
			return false;
		if(bool_Lien==true && target.nodeName.toLowerCase() != 'a')
			target = target.parentNode;
		return target;
	},

	/**
	*set_Action
	*Ajoute une action sur un événement.
	*
	*@param     object[Element HTML]
	*@param     string
	*@param     object[Fonction]
	*@param     boolean
	*
	*@return     void
	*/
	set_Action: function(obj_Element, str_Type, obj_Fonction, bool_ModeCapture)
	{
		return obj_Element.addEventListener ?
			obj_Element.addEventListener(str_Type, obj_Fonction, bool_ModeCapture):
			obj_Element.attachEvent ?
				obj_Element.attachEvent('on' + str_Type, obj_Fonction):
				obj_Element['on' + str_Type] = obj_Fonction;
	},

	/**
	*unset_Action
	*Enlève une action sur un événement.
	*
	*@param     object[Element HTML]
	*@param     string
	*@param     object[Fonction]
	*@param     boolean
	*
	*@return     void
	*/
	unset_Action: function(obj_Element, str_Type, obj_Fonction, bool_ModeCapture)
	{
		return obj_Element.removeEventListener?
			obj_Element.removeEventListener(str_Type, obj_Fonction, bool_ModeCapture):
			obj_Element.detachEvent?
				obj_Element.detachEvent('on' + str_Type, obj_Fonction):
				obj_Element['on' + str_Type] = null;
	},

	/**
	*exec_StopAction
	*Permet de stopper la propagation de l'ancre des liens ayant une action d'affecter sur le onClick.
	*Merci à koala64 pour son aide.
	*
	*@param     object[Evenement]
	*
	*@return     boolean
	*/
	exec_StopAction: function(obj_Evenement)
	{
		if(obj_Evenement && obj_Evenement.stopPropagation && obj_Evenement.preventDefault)
		{
			obj_Evenement.stopPropagation();
			obj_Evenement.preventDefault();
		}
		else if(window.event && window.event.cancelBubble && window.event.returnValue)
		{
			window.event.cancelBubble = true;
			window.event.returnValue = false;
		}
		return false;
	},

	/**
	*exec_Centrer
	*Centre un élément html par rapport à sont parent ou à l'écran.
	*
	*@param     object[Element HTML]
	*@param     boolean (facultatif)
	*
	*@return     boolean
	*/
	exec_Centrer: function(obj_Element, bool_Ecran)
	{
		if(!obj_Element)
			return;

		if(bool_Ecran !== true)
			bool_Ecran = false;

		if(bool_Ecran)
		{
			var int_HauteurParent = screen.availHeight;
			var int_LargeurParent = screen.availWidth;
			var int_HauteurDefil = 0;
			var int_LargeurDefil = 0;
		}
		else
		{
			//données sur le parent
			obj_Parent = obj_Element.parentNode;
			if(!obj_Parent)
				return;
			var int_HauteurParent = obj_Parent.offsetHeight;
			var int_LargeurParent = obj_Parent.offsetWidth;
			var int_HauteurDefil = obj_Parent.scrollTop;//Hauteur de défilement de l'élément parent
			var int_LargeurDefil = obj_Parent.scrollLeft;//Longueur de défilement de l'élément parent
		}

		//dimmension de l'élément
		var int_Hauteur = obj_Element.offsetHeight;
		var int_Largeur = obj_Element.offsetWidth;

		if(int_Hauteur >= int_HauteurParent)
			var int_PosY = 0;
		else
			var int_PosY = (int_HauteurParent/2)-(int_Hauteur/2) + int_HauteurDefil;

		if(int_Largeur >= int_LargeurParent)
			var int_PosX = 0;
		else
			var int_PosX = (int_LargeurParent/2)-(int_Largeur/2) + int_LargeurDefil;

		obj_Element.style.top = int_PosY+"px";
		obj_Element.style.left = int_PosX+"px";
	},

	/**
	*get_StyleCss
	*Retourne la valeur d'une propriété de style CSS d'un élément.
	*
	*@param     object[Element HTML]
	*@param     string
	*
	*@return     boolean
	*/
	get_StyleCss: function(obj_Element, str_Propriete)
	{
		if(element.style[property])
			return element.style[property];
		else if(element.currentStyle)
			return element.currentStyle[property];
		else if(document.defaultView && document.defaultView.getComputedStyle)
		{
			var style = document.defaultView.getComputedStyle(element, null);
			return style.getPropertyValue(property);
		}
		else
			return null;
	}
};
