var oO =

{

	'class': 'effet',

	'effet': 'effect',



	/**

	 * oO.connect(oElem, sEvType, fn, bCapture)

	 * Affecte un gestionnaire d'événement lors d'un événement sur un élément

	 */

	connect: function(oElem, sEvType, fn, bCapture)

	{

		return document.addEventListener ?

			oElem.addEventListener(sEvType, fn, bCapture):

			oElem.attachEvent ?

				oElem.attachEvent('on' + sEvType, fn):

				false;

	},

	

	/**

	 * oO.aTag(oEl, sTag)

	 * Renvoie un tableau des éléments de tag sTag compris dans l'élément oEl

	 */

	aTag: function(oEl, sTag)

	{

		return oEl.getElementsByTagName(sTag);

	},

	

	/**

	 * oO.getSource(e)

	 * Renvoie la source d'un événement

	 */

	getSource: function(e)

	{

		return e.target || e.srcElement;

	},

	

	/**

	 * oO.gestionClass(a, o, c1, c2) -> Manipulation et test de classes CSS

	 * par Christian Heilmann

	 *  http://onlinetools.org/articles/unobtrusivejavascript/cssjsseparation.html

	 *

	 * This example function takes four parameters:

	 * a -> defines the action you want the function to perform.

	 * o -> the object in question.

	 * c1 -> the name of the first class

	 * c2 -> the name of the second class

	 *

	 * Possible actions are:

	 * swap -> replaces class c1 with class c2 in object o.

	 * add -> adds class c1 to the object o.

	 * remove -> removes class c1 from the object o.

	 * check -> test if class c1 is already applied to object o and returns true

	 *          or false.

	 */

	gestionClass: function(a, o, c1, c2)

	{

		switch(a)

		{

			case 'swap': // Modification d'une classe en une autre

				o.className = !oO.gestionClass('check', o, c1) ?

					o.className.replace(c2, c1) :

					o.className.replace(c1, c2);

			break;

			case 'add': // Ajout d'une classe

				if(!oO.gestionClass('check', o, c1))

					o.className += o.className?

						' ' + c1 :

						c1;

			break;

			case 'remove': // Suppression d'une classe

				var rep = o.className.match(' ' + c1) ?

					' ' + c1 :

					c1;

				o.className = o.className.replace(rep, '');

			break;

			case 'check': // Recherche d'une classe

				return new RegExp('\\b' + c1 + '\\b').test(o.className);

			break;

		}

	},

	

	/**

	 * insertGestionKey(oEl)

	 * Insère un lien de contrôle en début d'élément (pour la navigation clavier)

	 */

	insertGestionKey: function(oEl)

	{

		var oA;



		oA = document.createElement('a');

		oA.href= '#';

		

		return oEl.insertBefore(oA, oEl.firstChild);

	},

	

	/**

	 * oO.gestionEffect(e)

	 * Gère les effets

	 */

	gestionEffect: function(e)

	{

		var oSrc, aChilds, iChild, sEffect;

		

		oSrc = oO.getSource(e);

		

		while(oSrc && oSrc.nodeName.toLowerCase() != 'div')

			oSrc = oSrc.parentNode;



		switch(e.type)

		{

			case 'mouseover':

				aChilds = oSrc.childNodes;

				iChild = aChilds.length;

				sEffect = 'add';

			break;

			case 'mouseout':

				aChilds = oSrc.childNodes;

				iChild = aChilds.length;

				sEffect = 'remove';

			break;

			case 'focus':

				aChilds = oSrc.parentNode.childNodes;

				iChild = aChilds.length;

				sEffect = 'add';

			break;

			case 'blur':

				aChilds = oSrc.parentNode.childNodes;

				iChild = aChilds.length;

				sEffect = 'remove';

			break;

		}

		

		do oO.setEffect(aChilds[--iChild], sEffect);

		while(iChild > 0);

		

		return true;

	},

	

	/**

	 * oO.setEffect(oEl, sControl)

	 * Applique l'effet demandé à un élément

	 */

	setEffect: function(oEl, sControl)

	{

		return sControl === 'remove' ?

			oO.gestionClass('remove', oEl, oO['effet']):

			oO.gestionClass('add', oEl, oO['effet']);

	},



	/**

	 * affectListener(oEl)

	 * Affecte un gestionnaier d'événement à un élément

	 */

	affectListener: function(oEl)

	{

		var aEvents, iEvent;



		aEvents = ['mouseover', 'mouseout', 'focus', 'blur'];

		iEvent = aEvents.length;



		while(iEvent-- > 0)

			oO.connect(oEl, aEvents[iEvent], oO.gestionEffect, false);

	},



	/**

	 * oO.init()

	 * Chef d'orchestre du script

	 */

	init: function()

	{

		var aDivs, iDiv, aAs, iA, aEvents, iEvent;

		

		aDivs = oO.aTag(document, 'div');

		iDiv = aDivs.length;

		

		while(--iDiv > -1 && oO.gestionClass('check', aDivs[iDiv], oO['class']))

		{

			oO.insertGestionKey(aDivs[iDiv]);

			oO.affectListener(aDivs[iDiv]);

		}

	}

};



oO.connect(window, 'load', oO.init, false);
