/** 
 * Raccourci pour document.getElementById(<id>)
 * @param id L'identifiant de l'objet à récuperer
 * @return l'objet ayant pour identifiant id.
 */
function gbi(id) {
	return document.getElementById(id);
}

/** 
 * navigateur utilisé 
 */
function navigateurNom() {
	if (navigator.userAgent.lastIndexOf('MSIE')>-1) {
		return 'MSIE';
	} else if (navigator.userAgent.lastIndexOf('Firefox')>-1) {
		return 'Firefox';
	} else {
		return 'autre';
	}
}

/**
 * changement de display css
 * @param eltId L'identifiant de l'élément pour lequel il faut changer le display
 * @param displayType La nouvelle valeur du display css
 */
function changeDisplay(eltId, displayType) {
	if(navigateurNom() == 'MSIE') {
		switch (displayType) {
            case 'table':  displayType = 'block'; break;
            case 'table-row':  displayType = 'block'; break;
            default: break;
        }
	}
	
	gbi(eltId).style.display = displayType;
}

/**
 * Recherche les élements par leur nom de classe
 * @param oElm l'element racine
 * @param strTagName Le type d'élément Html
 * @param strClassName Le type de classe css
 * @return la liste d'élément d'un type Html donné et d'une classe donnée.
 */
function getElementsByClassName(oElm, strTagName, strClassName){
    var arrElements = (strTagName == "*" && oElm.all)? oElm.all : oElm.getElementsByTagName(strTagName);
    var arrReturnElements = new Array();
    strClassName = strClassName.replace(/\-/g, "\\-");
    var oRegExp = new RegExp("(^|\\s)" + strClassName + "(\\s|$)");
    var oElement;
    for(var i=0; i<arrElements.length; i++){
        oElement = arrElements[i];      
        if(oRegExp.test(oElement.className)){
            arrReturnElements.push(oElement);
        }   
    }
    return (arrReturnElements)
}

/**
 * Fonction permettant des récuperer dans les noeuds fils (profondeur 1)
 * @param oElm L'element racine
 * @param strTagName Le type d'élément html
 */
function getChildrenByTagName(oElm, strTagName) {
	if(!strTagName) {
		strTagName = '*';
	}
	var allChild = oElm.getElementsByTagName(strTagName);
	var directChild = [];
	for(var i = 0; i < allChild.length; i++) {
		if(allChild[i].parentNode == oElm) {
			directChild[directChild.length] = allChild[i];
		}
	}
	
	return directChild;
}

/**
 * Fonction permettant l'ajout d'un style à l'objet passé en paramètre
 * @param elt L'élément sur lequel il faut ajouter un style
 * @param className Le nom du style à ajouter
 */
function addClass(elt, className) {
	if(elt.className
		&& elt.className != '') { // Si l'élément est stylable
		var lClass = elt.className.split(' '); // Je récupère la liste des styles appliqué sur l'élément à modifier
		for(var _i = 0; _i<lClass.length;_i++) {
			if(lClass[_i] == className) { // Si le style est déjà appliqué alors on quitte la fonction
				return;
			}
		}
		elt.className += ' ' + className;
	} else {
		elt.className += className;
	}
}

/**
 * Fonction permettant de supprimer un style à l'objet passé en paramètre
 * @param elt L'élément sur lequel il faut supprimer un style
 * @param className Le nom du style à supprimer
 */
function removeClass(elt, className) {
	if(elt.className && 
		elt.className != '') { // Si a un style
		var lClass = elt.className.split(' '); // Je récupère la liste des styles appliqué sur l'élément à modifier
		elt.className = '';
		for(var _i = 0; _i<lClass.length;_i++) {
			if(lClass[_i] != className) {
				elt.className += lClass[_i]; // Ajout du style s'il est différent du style à supprimer
				if(_i != lClass.length - 1) {
					elt.className += ' '; // Ajout d'un blanc sauf pour le dernier style
				}
			}
		}
	}
}


/**
 * Fonction permettant de savoir si l'element passé en parametre contient le style passe en parametre
 * @param className le nom de classe
 * @param elt L'élément sur lequel on doit contrôler la présence du style
 * @return <code>true</code> si l'élément contient le style, <code>false</code> sinon.
 */
function classExist(elt, className){
	if(elt.className &&
		elt.className != '') { // Si l'élément est stylable
		var lClass = elt.className.split(' ');
		for(var _i=0; _i<lClass.length; _i++){
			if(lClass[_i] == className) {
				return true;
			}
		}
		return false;
	}
}

/**
 * Fonction permettant d'attacher un événement (fonctionnement cross-browser)
 * @param obj L'objet sur lequel on souhaite attacher un événement
 * @param e Une chaine de caractère indiquant le type d'événement (sans le 'on', ie. pour 'onload' e vaut 'load')
 * @param fn Le nom de la fonction (sans les parenthèses)
 * @param useCapture 
 */
 function addEvent(obj, e, fn, useCapture) {
 	if(!useCapture) useCapture = false;
 	if(obj.addEventListener) {
 		obj.addEventListener(e, fn, useCapture);
 		return true;
 	} else if(obj.attachEvent) {
 		return obj.attachEvent('on'+e, fn);
 	} else {
 		// Navigateur qui ne gère ni addEventListener ni attachEvent
 		attachEvents(obj, e, fn)
 		obj['on' + e]=function(){fireEvent(obj, e)}
 		
 	}
 }
 
 function attachEvents(obj, e, fn) {
 	if(!obj.attachedEvents) {
		obj.attachedEvents={};
	}
	if(!obj.attachedEvents[e]) {
		obj.attachedEvents[e] = [];
	}
	// Recupération de toutes les fonctions attachées pour l'événement 'e'
	var fns = obj.attachedEvents[e];
	// Ajout de la nouvelle fonction
	fns[fns.length] = fn;
 }
 
 function fireEvent(obj, e) {
	if(!obj || !obj.attachedEvents || !obj.attachedEvents[e]) {
		return;
	}
	
	// Recupération de toutes les fonctions attachées pour l'événement 'e'
	var fns = obj.attachedEvents[e];
 	
 	// Execution des méthodes attachées
 	for(var i=0; i < fns.length; i++) {
 		fns[i]();
 	}
 }