/** Permet d'appliquer une fonction sur un évènement (sauf IE MAC)

ex : addEvent(window, 'load', foo, false);
*/
function addEvent(obj, evType, fn, useCapture){ 
	if (obj.addEventListener){ 
		obj.addEventListener(evType, fn, useCapture); 
		return true; 
	} else if (obj.attachEvent){ 
		var r = obj.attachEvent("on"+evType, fn); 
		return r; 
	} else { 
		return false;
	} 
}

/** EFFECTUE DES MODIFICATIONS DE CLASSE SUR UN OBJET
Modification : 
swap	remplace la classe class1 par la classe class2 dans l'objet o
add	ajoute la classe class1 à l'objet obj
remove	supprime la classe class1 de l'objet obj
check	teste si la classe class1 est déjà appliquée à l'objet obj et renvoie true ou false

action	action à effectuer
obj	objet concerné
class1	nom de la première classe
class2	nom de la deuxième classe

ex:  cssjs('remove', this, 'hover');
*/
function jscss(action, obj, class1, class2)
{
	switch (action){
		case 'swap':
			obj.className=!jscss('check',obj,class1)?obj.className.replace(class2,class1): obj.className.replace(class1,class2);
		break;
		case 'add':
			if(!jscss('check',obj,class1)){obj.className+=obj.className?' '+class1:class1;}
		break;
		case 'remove':
			var rep=obj.className.match(' '+class1)?' '+class1:class1;
			obj.className=obj.className.replace(rep,'');
		break;
		case 'check':
			return new RegExp('\\b'+class1+'\\b').test(obj.className)
		break;
	}
}

/** SELECTIONNER UN ÉLÉMENT PAR NOM DE CLASSE

laClasse	nom de la classe à rechercher
node	dans quel élément se fait la recherche (optionnel)
balise	pour limiter la recherche à une ou des balises données
*/
function getElementsByClass(laClasse, node, balise) {
	var classElements = new Array();
	if ( node == null )
		node = document;
	if ( balise == null )
		balise = '*';
	var els = node.getElementsByTagName(balise);
	var elsLen = els.length;
	var pattern = new RegExp("(^|\\s)"+laClasse+"(\\s|$)");
	for (i = 0, j = 0; i < elsLen; i++) {
		if ( pattern.test(els[i].className) ) {
			classElements[j] = els[i];
			j++;
		}
	}
	return classElements;
}

/** RÉCUPÈRE UN TABLEAU DE TOUS LES ÉLÉMENTS QUI ONT UN ATTRIBUT PARTICULIER

oElm (obligatoire) élément à partir duquel on va faire la recherche
strTagName (obligatoire) l'élément HTML dans lequel on veut rechercher (* par défaut)
strAttributeName (obligatoire) nom de l'attribut recherché
strAttributeValue (optionnel) 

return array

ex: getElementsByAttribute(document.getElementById("the-form"), "input", "type", "text");

Copyright Robert Nyman, http://www.robertnyman.com
Free to use if this text is included
*/
function getElementsByAttribute(oElm, strTagName, strAttributeName, strAttributeValue) {
	var arrElements = (strTagName == "*" && document.all) ? document.all : oElm.getElementsByTagName(strTagName);
	var arrReturnElements = new Array();
	var oAttributeValue = (typeof strAttributeValue != "undefined")? new RegExp("(^|\\s)" + strAttributeValue + "(\\s|$)") : null;
	var oCurrent;
	var oAttribute;
	for(var i=0; i<arrElements.length; i++) {
		oCurrent = arrElements[i];
		oAttribute = oCurrent.getAttribute(strAttributeName);
		if (typeof oAttribute == "string" && oAttribute.length > 0) {
			if (typeof strAttributeValue == "undefined" || (oAttributeValue && oAttributeValue.test(oAttribute))){
				arrReturnElements.push(oCurrent);
			}
		}
	}
	return arrReturnElements;
}

/** remplace getElementById, getElementsByClassName, getElementsByTagName

return array

ex : 
var inputs = document.getElementsByTagName('input');
var selects = document.getElementsByTagName('select');
var ta = document.getElementsByTagName('textarea');
var elements = inputs.concat(selects.concat(ta));

devient : 
var elements = $('input','select','textarea');
*/
function $() {
	var elements = new Array();
	for (var i=0,len=arguments.length;i<len;i++) {
		var element = arguments[i];
		if (typeof element == 'string') {
			var matched = document.getElementById(element);
			if (matched) {
				elements.push(matched);
			} else {
				var allels = (document.all) ? document.all : document.getElementsByTagName('*');
				var regexp = new RegExp('(^| )'+element+'( |$)');
				for (var i=0,len=allels.length;i<len;i++) if (regexp.test(allels[i].className)) elements.push(allels[i]);
			}
			if (!elements.length) elements = document.getElementsByTagName(element);
			if (!elements.length) {
				elements = new Array();
				var allels = (document.all) ? document.all : document.getElementsByTagName('*');
				for (var i=0,len=allels.length;i<len;i++) if (allels[i].getAttribute(element)) elements.push(allels[i]);
			}
			if (!elements.length) {
				var allels = (document.all) ? document.all : document.getElementsByTagName('*');
				for (var i=0,len=allels.length;i<len;i++) if (allels[i].attributes) for (var j=0,lenn=allels[i].attributes.length;j<lenn;j++) if (allels[i].attributes[j].specified) if (allels[i].attributes[j].nodeValue == element) elements.push(allels[i]);
			}
		} else {
			elements.push(element);
		}
	}
	if (elements.length == 1) {
		return elements[0];
	} else {
		return elements;
	}
}

/** OUVRE LES LIENS EXTERNES DANS UNE NOUVELLE FENETRE
non intrusif, nécessite de donner un nom de classe : "externe"
*/
function open_ext_link()
{
	var liens = document.getElementsByTagName('a');
	for (var i = 0 ; i < liens.length ; ++i)  {
		// Si les liens ont un nom de class égal à externe, alors on agit.
		if (/externe/.test(liens[i].className)) {
			liens[i].title += ' (s\'ouvre dans une nouvelle fenêtre)';
			liens[i].onclick = function()  {
				window.open(this.href);
				return false; // On ouvre une nouvelle page ayant pour URL le href du lien cliqué et on inhibe le lien réel.
			};
		}
	}
}
if (document.getElementById && document.createTextNode) {//pour être sûr que ça s'applique aux éléments qui comprennent les DOM
	addEvent(window, 'load', open_ext_link, false);
}

/** ROLLOVER ACCESSIBLE : fonctionne même sans souris
Remplace une image : image.ext par image_on.ext au rollover
Utilisation : <a href="index.html"><img src="/chemin/home.gif" class="roll" alt="home" /></a>

appel du type :
addEvent(window, 'load', findimg);
*/
//Fonction de recherche des images concernées (qui comportent la classe 'roll')
function findimg()
{
	var imgs,i;
	imgs=document.getElementsByTagName('img');
	for(i=0;i<imgs.length;i++)
	{
		if(/roll/.test(imgs[i].className))
		{
// ajoutons la fonction 'roll' à l'élément parent de cette image
			imgs[i].parentNode.onmouseover=function(){roll(this);};
			imgs[i].parentNode.onmouseout=function(){roll(this);};
			imgs[i].parentNode.onfocus=function(){roll(this);};
			imgs[i].parentNode.onblur=function(){roll(this);};
		}
	}
}
//Fonction de remplacement
function roll(o)
{
	var i,isnode,src,ftype,newsrc,nownode;
// parcourons tous les enfants
	for (i=0;i<o.childNodes.length;i++)
	{
		nownode=o.childNodes[i];
// si le nœud est un élément et une image, fixons la variable et sortons de la boucle
		if(nownode.nodeType==1 && /img/i.test(nownode.nodeName))
		{
			isnode=i;
			break;
		}
	}
// vérifions le src et permutons le fichier source de l'image
	src = o.childNodes[isnode].src;
	ftype = src.substring(src.lastIndexOf('.'), src.length);
	if(/_on/.test(src))
	{
		newsrc = src.replace('_on','');
	}else{
		newsrc = src.replace(ftype, '_on'+ftype);
	}
	o.childNodes[isnode].src=newsrc;
}