/**
 * HORIZONTAL PULLDOWN MENU
 * @author Romain Berton
 * @link http://forum.alsacreations.com/profile-1486-koala64.html
 * @date 2008-05-05
 * @licence CC-BY
 */
// ENCAPSULATION DU SCRIPT
(function() {
		
// FONCTION D'AJOUT DE GESTIONNAIRE D'EVENEMENT
var connect = function(oEl, sEvType, fn, bCapture) {
	
	return document.addEventListener ? oEl.addEventListener(sEvType, fn, bCapture || false): oEl.attachEvent ? oEl.attachEvent('on' + sEvType, fn): false;
};

// INSTANCE DE GESTION DE CLASSES CSS
var css = {
	remove: function(oEl, sClass) {
		var rep = oEl.className.match(' ' + sClass) ? ' ' + sClass : sClass;
		oEl.className = oEl.className.replace(rep, '');
	},
	add: function(oEl, sClass) {
		if(!css.has(oEl, sClass)) oEl.className += oEl.className ? ' ' + sClass : sClass;
	},
	has: function(oEl, sClass) {
		return new RegExp('\\b' + sClass + '\\b').test(oEl.className);
	}
};

// CLASSE MENU
var Menu = function() {};
// PROTOTYPE DE LA CLASSE MENU
var Mp = Menu.prototype = {
	menus: [],
	label: 'menu',
	imgBkg: {'tag':'img', 'src':'testImgActives.gif', 'class':'imgBackground', 'alt': ''},
	iframeBkg: {'tag':'iframe', 'class':'iframeBackground'},
	show: 'show',
	active: 'active',
	// IDENTIFIE TOUS LES MENUS AYANT LA CLASSE MP.LABEL ET LES AJOUTE AU TABLEAU MP.MENUS
	identify: function() {
		var aMenus = document.getElementsByTagName('ul'), iMenu = aMenus.length;
		while(iMenu-- > 0) if(css.has(aMenus[iMenu], Mp.label)) Mp.menus.push(aMenus[iMenu]);
		return Mp;
	},
	// INSERE UNE IMAGE DE FOND ET UNE IFRAME EN ARRIERE-PLAN POUR PALIER AU PROBLEME DE SUPERPOSITIONS
	insertBkg: function(oLi, oA) {
		var oImg = document.createElement(Mp.imgBkg['tag']);
		oImg.src = Mp.imgBkg['src'];
		oImg.width = oLi.offsetWidth;
		oImg.height = oLi.offsetHeight;
		css.add(oImg, Mp.imgBkg['class']);
		oImg.alt = Mp.imgBkg['alt'];
		oLi.insertBefore(oImg, oA);
		if(window.attachEvent && typeof XMLHttpRequest == 'undefined') {
			var oIframe = document.createElement(Mp.iframeBkg['tag']);
			oIframe.width = oA.offsetWidth;
			oIframe.height = oA.offsetHeight;
			css.add(oIframe, Mp.iframeBkg['class']);
			oLi.insertBefore(oIframe, oImg);
			
		}
		return true;
	},
	// VERIFIE SI UN ELEMENT EST CONTENU DANS UN AUTRE
	contains: function(container, containee) {
		if(!container || !containee) return;
		for(var n = containee; n && n != container; n = n.parentNode);
		return n;
	},
	// INITIALISE UN MENU
	init: function(oMenu) {
		var aLis = oMenu.getElementsByTagName('li'), iLi = aLis.length;
		while(iLi-- > 0) {
			css.remove(aLis[iLi], Mp.show);
			css.remove(aLis[iLi].getElementsByTagName('a')[0], Mp.active);
		}
	},
	// AJOUTE DES GESTIONNAIRES D'EVENEMENT SUR CHAQUE MENU
	addBehaviour: function() {
		var iMenu = Mp.menus.length;
		while(iMenu-- > 0) {
			Mp.init(Mp.menus[iMenu]);
			var aLis = Mp.menus[iMenu].getElementsByTagName('li'), iLi = aLis.length;
			while(iLi-- > 0) {
				var oLi = aLis[iLi];
				var oA = oLi.getElementsByTagName('a')[0];
				// AFFECTE UNE IMAGE DE FOND ET UNE IFRAME DERRIERE LE LIEN DE L'ELEMENT DE LISTE POUR CHAQUE SOUS-MENU
				if(oLi.parentNode != Mp.menus[iMenu]) Mp.insertBkg(oLi, oA);
				var oIframe = oLi.getElementsByTagName('iframe')[0];
				var oUl = oLi.getElementsByTagName('ul')[0];
				if(window.attachEvent && typeof XMLHttpRequest == 'undefined' && oUl) css.add(oLi, 'threePixelJog');
				// GESTIONNAIRE D'EVENEMENT LORSQUE LA SOURIS SURVOLE L'ELEMENT
				connect(oLi, 'mouseover', (function(oMenu, oLi, oUl) {
					return function(e) {
						var aIframes = oMenu.getElementsByTagName('iframe'), iIframe = aIframes.length;
						while(iIframe-- > 0) css.remove(aIframes[iIframe], 'hidden');
						// INITIALISATION DES ELEMENTS DE LISTE FRERES DE L'ELEMENT DE LISTE COURANT
						var oParent = oLi.parentNode;
						var aLis = oParent.getElementsByTagName('li'), iLi = aLis.length;
						while(iLi-- > 0) if(!Mp.contains(aLis[iLi],(e.target || e.srcElement))) {
							css.remove(aLis[iLi], Mp.show);
							css.remove(aLis[iLi].getElementsByTagName('a')[0], Mp.active);
						}
						// MISE EN EXERGUE DU LIEN DE CONTROLE
						css.add(oLi, Mp.show);
						css.add(oLi.getElementsByTagName('a')[0], Mp.active);
						// SI L'ELEMENT DE LISTE COMPORTE UN SOUS-MENU, ON ANNULE LA TEMPO
						if(oUl && oUl.tempo) clearTimeout(oUl.tempo);
					};
				})(Mp.menus[iMenu], oLi, oUl));
				// GESTIONNAIRE D'EVENEMENT LORSQUE LA SOURIS QUITTE L'ELEMENT
				connect(oLi, 'mouseout', (function(oLi, oUl) {
					return function() {
						var removeClass = function() {
							css.remove(oLi, Mp.show);
							css.remove(oLi.getElementsByTagName('a')[0], Mp.active);
						}
						if(oUl) oUl.tempo = setTimeout(removeClass, 500);
						else removeClass();
					};
				})(oLi, oUl));
				// GESTIONNAIRE D'EVENEMENT AU FOCUS D'UN LIEN
				connect(oA, 'focus', (function(oMenu, oLi) {
					return function(e) {
						var aIframes = oMenu.getElementsByTagName('iframe'), iIframe = aIframes.length;
						while(iIframe-- > 0) css.add(aIframes[iIframe], 'hidden');
						if(window.attachEvent && typeof XMLHttpRequest == 'undefined' && document.getElementsByTagName('select')[0]) {
							var aSelects = document.getElementsByTagName('select'), iSelect = aSelects.length;
							while(iSelect-- > 0) css.add(aSelects[iSelect], 'hidden');
						}
						// CONSTITUTION D'UN TABLEAU REGROUPANT TOUS LES ELEMENTS DE LISTE PARENTS DU LIEN DE CONTROLE
						var oTempLi = oLi;
						var aLis = [oTempLi];
						while(oTempLi.parentNode != oMenu) {
							oTempLi = oTempLi.parentNode;
							if(oTempLi.nodeName.toLowerCase() == 'li') aLis.push(oTempLi);
						}
						// AFFECTATION DES STYLES SI LES LIENS DE CONTROLE OU LES SOUS-MENUS FONT PARTIS DES ELEMENTS DE LISTE DU TABLEAU
						var iLi= aLis.length;
						while(iLi-- > 0) {
							oA = aLis[iLi].getElementsByTagName('a')[0];
							if(Mp.contains(aLis[iLi], oLi)) {
								css.add(aLis[iLi], Mp.show);
								css.add(oA, Mp.active);
							}
						}
					}
				})(Mp.menus[iMenu], oLi));
				// GESTIONNAIRE D'EVENEMENT A LA PERTE DE FOCUS D'UN LIEN
				connect(oA, 'blur', (function(oMenu, oLi) {
					// INITIALISATION DU MENU
					return function() {
						if(window.attachEvent && typeof XMLHttpRequest == 'undefined' && document.getElementsByTagName('select')[0]) {
							var aSelects = document.getElementsByTagName('select'), iSelect = aSelects.length;
							while(iSelect-- > 0) css.remove(aSelects[iSelect], 'hidden');
						}
						return Mp.init(oMenu);
					};
				})(Mp.menus[iMenu], oLi));
			}
		}
		return Mp;
	}
};
// CONTROLE DES PRERECQUIS ET INSTANCE DE MENU
//var oImg = new Image();
//var iTmp = new Date();
//var iSuffix = iTmp.getTime();
//oImg.src = "testImgActives.gif?" + iSuffix;
if(document.getElementsByTagName && document.createElement  && typeof Array.prototype.push != 'undefined') {
	//connect(oImg, 'load', function() {
		// AJOUT DE LA CLASSE HASJS SUR L'ELEMENT HTML
		css.add(document.documentElement, 'hasJS');
		return connect(window, 'load', function() {
			// VERIFICATION DE LA PRESENCE DE CSS
			var oNewDiv = document.createElement('div');
			document.body.appendChild(oNewDiv);
			oNewDiv.style.visibility = 'hidden';
			oNewDiv.style.width = '20px';
			oNewDiv.style.padding = '10px';
			if(oNewDiv.offsetWidth != 40) {
				document.body.removeChild(oNewDiv);
				return css.remove(document.documentElement, 'hasJS');
			}
			document.body.removeChild(oNewDiv);
			// CHARGEMENT DU MENU
			return new Menu().identify().addBehaviour();
		});
	//});
}

})();
