/**
 * Espace de nom
 */

var k64 = window.k64 || {};

/**
 * Nav
 */

// Constructeur
k64.Nav = function(oOptions) {
	this.setOptions(oOptions);
	this.addWindowBehaviour();
};

// Prototype
k64.Nav.prototype = {
	
	options: {
		'menuClass': /\bk64_nav\b/,
		'titleClass': /\bkn_title\b/,
		'contentClass': /\bkn_content\b/,
		'showClass': {
			'regexp': /\bkn_show\b/,
			'name': 'kn_show'
		},
		'itemClass': /\bkn_item\b/,
		'currentClass': 'kn_current',
		'timer': 500
	},
	
	// Affecte des options
	setOptions: function(oOptions) {
		if(typeof oOptions === 'object') {
			for(var _sProp in oOptions) {
				if(oOptions.hasOwnProperty(_sProp)) {
					if(!this[_sProp]) {
						this.options[_sProp] = oOptions[_sProp];
					}
					else {
						this[_sProp](oOptions[_sProp]);
					}
				}
			}
		}
	},
	
	// Ajout d'une image de fond derriere les sous-menus au chargement de la page
	loadBkg: function(bLoad) {
		if(bLoad === true && !window.attachEvent) {
			var _oThat = this;
			this.addEvent(window, 'load', function(e) { return _oThat.addBkg.apply(_oThat, [e]); });
		}
	},
	
	// Ajoute une image de fond au sein de chaque element de liste d'un sous-menu
	addBkg: function(e) {
		var _aEls = document.getElementsByTagName('*');
		var _iEls = _aEls.length;
		while(--_iEls >= 0) {
			if(this.options.contentClass.test(_aEls[_iEls].className)) {
				var _aLis = _aEls[_iEls].getElementsByTagName('li');
				var _iLis = _aLis.length;
				while(--_iLis >= 0) {
					var _oImg = document.createElement('img');
					_oImg.src = '/img/bkgMenu.gif';
					_oImg.alt = '';
					_oImg.className = 'kn_bkgMenu';
					_aLis[_iLis].insertBefore(_oImg, _aLis[_iLis].firstChild);
				}
			}
		}
	},
	
	// Ajout d'une iframe derriere les sous-menus au chargement de la page
	loadIFrame: function(bLoad) {
		if(bLoad === true) {
			var _oThat = this;
			this.addEvent(window, 'load', function(e) { return _oThat.addIFrame.apply(_oThat, [e]); });
		}
	},
	
	// Ajoute une iframe au sein de chaque element de liste d'un sous-menu
	addIFrame: function(e) {
		var _aEls = document.getElementsByTagName('*');
		var _iEls = _aEls.length;
		while(--_iEls >= 0) {
			if(this.options.contentClass.test(_aEls[_iEls].className)) {
				var _aLis = _aEls[_iEls].getElementsByTagName('li');
				var _iLis = _aLis.length;
				while(--_iLis >= 0) {
					var _oIFrame = document.createElement('iframe');
					_oIFrame.name = 'foreground';
					_oIFrame.className = 'kn_bkgMenu';
					_aLis[_iLis].insertBefore(_oIFrame, _aLis[_iLis].firstChild);
					_aLis[_iLis].className += ' kn_withIFrame';
				}
			}
		}
	},
	
	// Chargement d'ARIA
	setupARIA: function(bLoad) {
		if(bLoad) {
			this.ARIA = true;
			var _oThat = this;
			this.addEvent(window, 'load', function(e) { return _oThat.addARIAAttributes.apply(_oThat); });
		}
	},
	
	// Definit un attribut et sa valeur sur un element
	addAttribute: function(oEl, sAttr, sValue) {
		if(oEl && typeof oEl === 'object' && oEl.nodeType === 1 && typeof sAttr === 'string' && typeof sValue !== 'undefined') {
			oEl.setAttribute(sAttr, sValue);
		}
	},
	
	// Ajoute les attributs ARIA au document
	addARIAAttributes: function() {
		this.addAttribute(document.getElementById('navH'), 'role', 'navigation');
		this.addAttribute(document.getElementById('middleContent'), 'role', 'menubar');
		var _aEls = document.getElementsByTagName('*');
		var _iEls = _aEls.length;
		while(--_iEls >= 0) {
			if(this.options.menuClass.test(_aEls[_iEls].className)) {
				this.addAttribute(_aEls[_iEls], 'role', 'presentation');
				this.addAttribute(_aEls[_iEls], 'aria-hidden', 'false');
				var _aEls2 = _aEls[_iEls].getElementsByTagName('*');
				var _iInd = 0;
				var _iEls2 = _aEls2.length;
				var _iIndex = 0;
				var _bFirstLink = true;
				while(_iInd < _iEls2) {
					if(_aEls2[_iInd].nodeName.toLowerCase() === 'a') {
						if(_bFirstLink) {
							var _sValue = 0;
							_bFirstLink = false;
						}
						else {
							var _sValue = -1;
						}
						this.addAttribute(_aEls2[_iInd], 'tabindex', _sValue);
						this.addAttribute(_aEls2[_iInd], 'role', 'menuitem');
					}
					if(this.options.itemClass.test(_aEls2[_iInd].className)) {
						this.addAttribute(_aEls2[_iInd], 'role', 'menu');
						this.addAttribute(_aEls2[_iInd], 'groupindex', 0);
						this.addAttribute(_aEls2[_iInd], 'index', _iIndex++);
					}
					if(this.options.titleClass.test(_aEls2[_iInd].className)) {
						this.addAttribute(_aEls2[_iInd], 'aria-haspopup', 'true');
					}
					if(this.options.contentClass.test(_aEls2[_iInd].className)) {
						this.addAttribute(_aEls2[_iInd], 'aria-hidden', 'true');
						this.addAttribute(_aEls2[_iInd], 'role', 'presentation');
					}
					_iInd++;
				}
			}
		}
	},
	
	// Precharge des styles
	preload: function(oOptions) {
		if(!oOptions.regexp.test(document.documentElement.className)) {
			document.documentElement.className += ' ' + oOptions.name;
		}
	},
	
	// Ajoute un gestionnaire d'evenements
	addEvent: function(oEl, sEvType, fn, bCapture) {
		return document.addEventListener ? oEl.addEventListener(sEvType, fn, bCapture || false) : oEl.attachEvent ? oEl.attachEvent('on' + sEvType, fn) : false;
	},
		
	// Definit des comportements
	addWindowBehaviour: function() {
		var _oThat = this;
		this.addEvent(window,'load',function(e) { return _oThat.addMenuBehaviour.apply(_oThat, [e]); });
	},
	
	// Agrandit la largeur des liens de chaque sous-menu a la largeur de ce dernier
	setFullSize: function() {
		var _aEls = document.getElementsByTagName('*');
		var _iEls = _aEls.length;
		var _oThat = this;
		while(--_iEls >= 0) {
			if(this.isPartOfMenu(_aEls[_iEls]) && this.isFocusableElement(_aEls[_iEls]) && !/\bk64_nav\b/.test(_aEls[_iEls].parentNode.parentNode.className)) {
				if(_aEls[_iEls].offsetWidth < _aEls[_iEls].parentNode.parentNode.offsetWidth) {
					_aEls[_iEls].style.display = 'inline-block';
					_aEls[_iEls].style.width = _aEls[_iEls].parentNode.parentNode.offsetWidth - _aEls[_iEls].offsetWidth + 'px';
				}
			}
		}
	},
	
	// Ajoute des comportements aux entetes de menu
	addMenuBehaviour: function(e) {
		var _aEls = document.getElementsByTagName('*');
		var _iEls = _aEls.length;
		var _oThat = this;
		while(--_iEls >= 0) {
			if(_aEls[_iEls].nodeType == 1 && !this.isPartOfMenu(_aEls[_iEls])) {
			
				// Lorsqu'un element de la page non inclus dans un menu prend le focus
				this.addEvent(_aEls[_iEls], 'focus', function(e) { return _oThat.closeAllMenus.apply(_oThat); });
			}
			if(this.ARIA && this.isFocusableElement(_aEls[_iEls]) && this.isPartOfMenu(_aEls[_iEls])) {
			
				// Lorsque l'utilisateur appuie sur une touche de son clavier
				this.addEvent(_aEls[_iEls], 'keydown', (function(oSrc) { return function(e) { return _oThat.manageKey.apply(_oThat, [e, oSrc]); }; })(_aEls[_iEls]));
			}
			if(_aEls[_iEls].nodeType == 1 && this.options.itemClass.test(_aEls[_iEls].className)) {
				var _aFocEls = this.getFocusableElements(_aEls[_iEls]);
				var _iFocEls = _aFocEls.length;
				while(--_iFocEls >= 0) {
				
					// Lorsqu'un element focusable prend le focus
					this.addEvent(_aFocEls[_iFocEls], 'focus', (function(oEl) { return function(e) { return _oThat.setCurrent.apply(_oThat, [e, oEl]); }; })(_aEls[_iEls]));
					
					// Lorsqu'un element focusable perd le focus
					this.addEvent(_aFocEls[_iFocEls], 'blur', (function(oEl) { return function(e) { return _oThat.delCurrent.apply(_oThat, [e, oEl]); }; })(_aEls[_iEls]));
				}
				
				// Lorsqu'un sous-menu est survole
				this.addEvent(_aEls[_iEls], 'mouseover', (function(oSrc) { return function(e) { return _oThat.openSsMenu.apply(_oThat, [e, oSrc]); }; })(_aEls[_iEls]));
				
				// Si ARIA est inactif et lorsqu'un sous-menu prend le focus
				if(!this.ARIA) {
					this.addEvent(_aFocusableElements[0], 'focus', (function(oSrc) { return function(e) { return _oThat.openSsMenu.apply(_oThat, [e, oSrc]); }; })(_aEls[_iEls]));
				}
				
				// Lorsqu'on quitte un sous-menu
				this.addEvent(_aEls[_iEls], 'mouseout', (function(oSrc) { return function(e) { return _oThat.closeSsMenu.apply(_oThat, [e, oSrc]); }; })(_aEls[_iEls]));
			}
		}
	},
	
	// Ajoute la classe current a un element
	setCurrent: function(e, oEl) {
		oEl.className += ' ' + this.options.currentClass;
	},
	
	// Supprime la classe current d'un element
	delCurrent: function(e, oEl) {
		oEl.className = oEl.className.replace(this.options.currentClass, '');
	},
	
	// Annule la propagation de l'evenement et l'action par defaut d'un element
	stopEvent: function(e) {
		if(e && e.stopPropagation && e.preventDefault) {
			e.stopPropagation();
			e.preventDefault();
		}
		else if(e && window.event) {
			window.event.cancelBubble = true;
			window.event.returnValue = false;
		}
		return false;
	},
	
	// Verifie qu'un element peut prendre le focus
	isFocusableElement: function(oEl) {
		if(oEl && oEl.nodeType == 1) {
			switch(oEl.nodeName.toLowerCase()) {
				case 'a':
				case 'area':
				case 'button':
				case 'input':
				case 'object':
				case 'select':
				case 'textarea':
					return true;
				default:
					return false;
			}
		}
		return false;
	},
	
	// Renvoie le tableau des elements focusables d'un noeud cible
	getFocusableElements: function(oContext) {
		var _oContext = oContext || document;
		var _aFocusableElements = [];
		var _aEls = _oContext.getElementsByTagName('*');
		for(var _iEl = 0, _iCount = _aEls.length; _iEl < _iCount; _iEl++) {
			switch(_aEls[_iEl].nodeName.toLowerCase()) {
				case 'a':
				case 'area':
				case 'button':
				case 'input':
				case 'object':
				case 'select':
				case 'textarea':
					_aFocusableElements.push(_aEls[_iEl]);
			}
		}
		return _aFocusableElements;
	},
	
	// Definit des actions en fonction de la touche pressee par l'utilisateur
	manageKey: function(e, oSrc) {
		switch(e.keyCode) {
			case 27: // escape
				
				// On coupe la propagation de l'evenement et l'action par defaut de l'element
				this.stopEvent(e);
				
				// On memorise le sous-menu courant
				var _oParent = oSrc.parentNode;
				while(_oParent && !this.options.itemClass.test(_oParent.className)) {
					_oParent = _oParent.parentNode;
				}
				
				// Si le sous-menu courant est apparent
				if(this.options.showClass.regexp.test(_oParent.className)) {
				
					// On le masque
					_oParent.className = _oParent.className.replace(this.options.showClass.name, '');
				
					// et on indique via l'attribut aria-hidden que le sous-menu est masque
					var _aEls = _oParent.getElementsByTagName('*');
					var _iEls = _aEls.length;
					while(--_iEls >= 0) {
						if(this.options.contentClass.test(_aEls[_iEls].className)) {
							this.addAttribute(_aEls[_iEls], 'aria-hidden', 'true');
						}
					}
					
					// On reinitialise l'attribut tabindex du premier element focusable du sous-menu et on lui donne le focus
					var _oFirstFocusableElement = this.getFocusableElements(_oParent)[0];
					if(_oFirstFocusableElement) {
						this.addAttribute(_oFirstFocusableElement, 'tabindex', '0');
						return _oFirstFocusableElement.focus();
					}
				}
				
				// sinon
				else {
				
					// On reinitialise l'attribut tabindex des elements focusables de chaque menu
					var _aEls = document.getElementsByTagName('*');
					var _iEls = _aEls.length;
					while(--_iEls >= 0) {
						if(this.options.menuClass.test(_aEls[_iEls].className)) {
							var _aMenuFocEls = this.getFocusableElements(_aEls[_iEls]);
							var _iMenuFocEls = _aMenuFocEls.length;
							while(--_iMenuFocEls >= 0) {
								this.addAttribute(_aMenuFocEls[_iMenuFocEls], 'tabindex', _iMenuFocEls == 0 ? '0' : '-1');
							}
						}
					}
					
					// On donne le focus au premier element focusable suivant le menu
					var _aFocEls = this.getFocusableElements();
					for(var _iFocEl = 0, _iCount = _aFocEls.length; _iFocEl < _iCount; _iFocEl++) {
						if(!this.isPartOfMenu(_aFocEls[_iFocEl])) {
							var _oPrevious = _aFocEls[_iFocEl - 1];
							if(_oPrevious && this.isPartOfMenu(_oPrevious)) {
								return _aFocEls[_iFocEl].focus();
							}
						}
					}
				}
			break;
			case 37: // left
			case 39: // right
				
				// On coupe la propagation de l'evenement et l'action par defaut de l'element
				this.stopEvent(e);
				
				// On memorise le sous-menu apparent
				var _oParent = oSrc.parentNode;
				while(_oParent && !this.options.itemClass.test(_oParent.className)) {
					_oParent = _oParent.parentNode;
				}
				
				// On memorise le menu englobant
				var _oMenu = _oParent.parentNode;
				while(_oMenu && !this.options.menuClass.test(_oMenu.className)) {
					_oMenu = _oMenu.parentNode;
				}
				
				// On definit le tableau des sous-menus du menu englobant
				var _aEls = _oMenu.getElementsByTagName('*');
				var _iEls = _aEls.length;
				var _aItems = [];
				while(--_iEls >= 0) {
					if(this.options.itemClass.test(_aEls[_iEls].className)) {
						_aItems.push(_aEls[_iEls]);
					}
				}
				var _iItems = _aItems.length;
				
				// On parcours le tableau des sous-menus
				while(--_iItems >= 0) {
				
					// Si le sous-menu courant est egal au sous-menu memorise
					if(_aItems[_iItems] == _oParent) {
						var _oTarget = _aItems[_iItems + (e.keyCode == 39 ? (- 1) : 1)];
						
						// Si le sous-menu vise existe
						if(_oTarget) {
						
							// On met a jour l'attribut tabindex de la source
							this.addAttribute(oSrc, 'tabindex', '-1');
							
							// On masque le sous-menu apparent
							_oParent.className = _oParent.className.replace(this.options.showClass.name, '');
							
							// et on met a jour l'attribut aria-hidden du contenu du sous-menu
							var _aNodes = _oParent.getElementsByTagName('*');
							var _iNodes = _aNodes.length;
							while(--_iNodes >= 0) {
								if(this.options.contentClass.test(_aNodes[_iNodes].className)) {
									this.addAttribute(_aNodes[_iNodes], 'aria-hidden', 'true');
								}
							}
							
							// On memorise le premier element focusable du sous-menu cible
							var _oFirstFocusableElement = this.getFocusableElements(_oTarget)[0];
							
							// Si cet element existe, on met a jour son attribut tabindex et on lui donne le focus
							if(_oFirstFocusableElement) {
								this.addAttribute(_oFirstFocusableElement, 'tabindex', '0');
								return _oFirstFocusableElement.focus();
							}
						}
					}
				}
			break;
			case 38: // up
			case 9: // tab
			case 40: // down
				
				// On coupe la propagation de l'evenement et l'action par defaut de l'element
				this.stopEvent(e);
				
				// On memorise le sous-menu courant
				var _oParent = oSrc.parentNode;
				while(_oParent && !this.options.itemClass.test(_oParent.className)) {
					_oParent = _oParent.parentNode;
				}
				
				// Si le sous-menu est masque, on l'affiche et on l'indique en modifiant l'attribut aria-hidden
				if(!this.options.showClass.regexp.test(_oParent.className)) {
					_oParent.className += ' ' + this.options.showClass.name;
					var _aEls = _oParent.getElementsByTagName('*');
					var _iEls = _aEls.length;
					while(--_iEls >= 0) {
						if(this.options.contentClass.test(_aEls[_iEls].className)) {
							this.addAttribute(_aEls[_iEls], 'aria-hidden', 'false');
						}
					}
				}
				
				// On recupere les elements focusables du sous-menu apparent
				var _aAs = this.getFocusableElements(_oParent);
				var _iAs = _aAs.length;
				
				// puis on parcourt cet ensemble
				while(--_iAs >= 0) {
				
					// Si l'element courant est egal a la source
					if(_aAs[_iAs] == oSrc) {
					
						// On met a jour l'attribut tabindex de la source
						this.addAttribute(oSrc, 'tabindex', '-1');
						
						// On memorise l'element cible
						var _iInd = (e.keyCode == 40 || (e.keyCode == 9 && !e.shiftKey)) ? 1 : (-1);
						var _oTarget = _aAs[_iAs + _iInd];
						
						// Si l'element cible existe, on met a jour son attribut tabindex et on lui donne le focus
						if(_oTarget) {
							this.addAttribute(_oTarget, 'tabindex', '0');
							return _oTarget.focus();
						}
						
						// Sinon
						else {
						
							// On masque le sous-menu apparent
							_oParent.className = _oParent.className.replace(this.options.showClass.name, '');
							
							// On indique via l'attribut aria-hidden que le sous-menu est masque
							var _aEls = _oParent.getElementsByTagName('*');
							var _iEls = _aEls.length;
							while(--_iEls >= 0) {
								if(this.options.contentClass.test(_aEls[_iEls].className)) {
									this.addAttribute(_aEls[_iEls], 'aria-hidden', 'true');
								}
							}
							
							// On memorise le tableau des elements focusable du menu
							var _aMenuAs = this.getFocusableElements(_oParent.parentNode);
							var _iMenuAs = _aMenuAs.length;
							
							// On parcours ce tableau
							while(--_iMenuAs >= 0) {
							
								// Si l'element focusable est egal a la source
								if(_aMenuAs[_iMenuAs] == oSrc) {
								
									// On met a jour l'attribut tabindex de la source
									this.addAttribute(oSrc, 'tabindex', '-1');
									
									// On memorise l'element focusable cible
									_iInd = (e.keyCode == 40 || (e.keyCode == 9 && !e.shiftKey)) ? 1 : (-1);
									_oTarget = _aMenuAs[_iMenuAs + _iInd];
									
									// S'il existe,
									if(_oTarget) {
										
										// Si l'utilisateur a appuye sur "shift+tab" ou "up"
										if((e.keyCode == 9 && e.shiftKey) || e.keyCode == 38) {
										
											// On memorise le sous-menu dans lequel se trouve l'element cible
											var _oSsMenu = _oTarget.parentNode;
											while(_oSsMenu && !this.options.itemClass.test(_oSsMenu.className)) {
												_oSsMenu = _oSsMenu.parentNode;
											}
											
											// Si le sous-menu existe
											if(_oSsMenu) {
											
												// On l'affiche
												_oSsMenu.className += ' ' + this.options.showClass.name;
											
												// et on indique via l'attribut aria-hidden que le sous-menu est ouvert
												var _aNodes = _oSsMenu.getElementsByTagName('*');
												var _iNodes = _aNodes.length;
												while(--_iNodes >= 0) {
													if(this.options.contentClass.test(_aNodes[_iNodes].className)) {
														this.addAttribute(_aNodes[_iNodes], 'aria-hidden', 'false');
													}
												}
											}
										}
										
										// On met a jour l'attribut tabindex de l'element cible
										this.addAttribute(_oTarget, 'tabindex', '0');
										
										// et on lui donne le focus
										return _oTarget.focus();
									}
									
									// Sinon
									else {
									
										// On reinitialise l'attribut tabindex du premier element focusable de chaque menu
										var _aMenus = document.getElementsByTagName('*');
										var _iMenu = _aMenus.length;
										while(--_iMenu >= 0) {
											if(this.options.menuClass.test(_aMenus[_iMenu].className)) {
												this.addAttribute(this.getFocusableElements(_aMenus[_iMenu])[0], 'tabindex', '0');
											}
										}
										
										// On recupere le tableau des elements focusables de la page
										var _aFocusableElements = this.getFocusableElements();
										var _iFocusableElements = _aFocusableElements.length;
										
										// On parcours ce tableau
										while(--_iFocusableElements >= 0) {
										
											// Si l'element courant est egal a la source
											if(_aFocusableElements[_iFocusableElements] == oSrc) {
											
												// On memorise l'element focusable cible
												_iInd = (e.keyCode == 40 || (e.keyCode == 9 && !e.shiftKey)) ? 1 : (-1);
												_oTarget =  _aFocusableElements[_iFocusableElements + _iInd];
												
												// S'il existe, on lui donne le focus
												if(_oTarget) {
													return _oTarget.focus();
												}
											}
										}
									}
								}
							}
						}
					}
				}
			break;
		}
	},
	
	// Verifie si un element fait parti d'un menu
	isPartOfMenu: function(oEl) {
		while(oEl && oEl.parentNode) {
			oEl = oEl.parentNode;
			if(this.options.menuClass.test(oEl.className)) {
				return true;
			}
		}
		return false;
	},
	
	// Ferme l'ensemble des sous-menus
	closeAllMenus: function(e, oSrc) {
		var _aEls = document.getElementsByTagName('*');
		var _iEls = _aEls.length;
		while(--_iEls >= 0) {
			if(this.options.menuClass.test(_aEls[_iEls].className)) {
				var _aIntEls = _aEls[_iEls].getElementsByTagName('*');
				var _iIntEls = _aIntEls.length;
				while(--_iIntEls >= 0) {
					if(this.options.showClass.regexp.test(_aIntEls[_iIntEls].className)) {
						_aIntEls[_iIntEls].className = _aIntEls[_iIntEls].className.replace(this.options.showClass.name, '');
						if(this.ARIA) {
							var _aInsEls = _aIntEls[_iIntEls].getElementsByTagName('*');
							var _iInsEls = _aInsEls.length;
							while(--_iInsEls >= 0) {
								if(this.options.contentClass.test(_aInsEls[_iInsEls].className)) {
									this.addAttribute(_aInsEls[_iInsEls], 'aria-hidden', 'true');
								}
							}
						}
					}
				}
			}
		}
	},
	
	// Verifie si un conteneur contient un noeud
	contains: function(oContainer, oContainee) {
		if(!(oContainer && oContainee)) {
			return;
		}
		for(var _oN = oContainee; _oN && _oN != oContainer; _oN = _oN.parentNode);
		return _oN;
	},
	
	// Ouvre un sous-menu
	openSsMenu: function(e, oSrc) {
		if(oSrc.timer) {
			clearTimeout(oSrc.timer);
		}
		var _oMenu = oSrc.parentNode;
		var _aEls = _oMenu.getElementsByTagName('*');
		var _iEls = _aEls.length;
		while(--_iEls >= 0) {
			if(_aEls[_iEls] && _aEls[_iEls].nodeType == 1 && !this.contains(oSrc,(e.relatedTarget || e.fromElement))) {
				_aEls[_iEls].className = _aEls[_iEls].className.replace(this.options.showClass.name, '');
				if(this.ARIA) {
					var _aInsEls = _aEls[_iEls].getElementsByTagName('*');
					var _iInsEls = _aInsEls.length;
					while(--_iInsEls >= 0) {
						if(this.options.contentClass.test(_aInsEls[_iInsEls].className)) {
							this.addAttribute(_aInsEls[_iInsEls], 'aria-hidden', 'true');
						}
					}
				}
			}
		}
		if(!this.options.showClass.regexp.test(oSrc.className)) {
			oSrc.className += ' ' + this.options.showClass.name;
			if(this.ARIA) {
				var _aInsEls = oSrc.getElementsByTagName('*');
				var _iInsEls = _aInsEls.length;
				while(--_iInsEls >= 0) {
					if(this.options.contentClass.test(_aInsEls[_iInsEls].className)) {
						this.addAttribute(_aInsEls[_iInsEls], 'aria-hidden', 'false');
					}
				}
			}
		}
	},
	
	// Ferme un sous-menu
	closeSsMenu: function(e, oSrc) {
		var _oThat = this;
		var _oRelatedTarget = e.relatedTarget || e.toElement;
		var _close = function() {
			if(!_oThat.contains(oSrc,_oRelatedTarget)) {
				oSrc.className = oSrc.className.replace(_oThat.options.showClass.name, '');
				if(_oThat.ARIA) {
					var _aInsEls = oSrc.getElementsByTagName('*');
					var _iInsEls = _aInsEls.length;
					while(--_iInsEls >= 0) {
						if(_oThat.options.contentClass.test(_aInsEls[_iInsEls].className)) {
							_oThat.addAttribute(_aInsEls[_iInsEls], 'aria-hidden', 'true');
						}
					}
				}
			}
		};
		if(!isNaN(this.options.timer)) {
			oSrc.timer = setTimeout(_close, this.options.timer);
		}
		else {
			_close();
		}
	}
};

// Instance
k64.myNav = new k64.Nav({
	'preload': {                                          // Activation du prechargement des styles "hasJS"
		'regexp':/\bhasJS\b/,              // Regexp correspondante
		'name': 'hasJS'                          // Classe CSS correspondante
	},
	'titleClass':/\bkn_title\b/,              // Classe CSS activant l'ouverture des menus
	'loadBkg': false,                                 // Ajout d'une image de fond pour prevoir la desactivation des couleurs
	'loadIFrame': false,                           // Ajout d'une iframe de fond pour prevoir les superpositions aux Flash
	'setupARIA': true,                             // Implementation d'ARIA
	'timer': 500                                        // Temporisation de fermeture pour faciliter l'utilisation du menu
});

k64.Corrections = function() {
	this.addBehaviour();
};

k64.userAgent = navigator.userAgent.toLowerCase();

k64.Corrections.prototype = {
	isWebkit: (typeof navigator.taintEnabled === 'undefined'),
	isIE7: (/msie/.test(k64.userAgent) && !/opera/.test(k64.userAgent) && (k64.userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/) || [0,'0'])[1] <= 7),
	addEvent: k64.Nav.prototype.addEvent,
	addBehaviour: function() {
		var _self = this;
		this.addEvent(window, 'load', function() {
			if(_self.isWebkit || _self.isIE7) {
				var _aDls = document.getElementsByTagName('dl');
				for(var _i = 0, _c = _aDls.length; _i < _c; _i++) {
					var _aDts = _aDls[_i].getElementsByTagName('dt');
					for(var _i2 = 1, _c2 = _aDts.length; _i2 < _c2; _i2++) {
						var _oDd = document.createElement('dd');
						var _oParent = _aDts[_i2].parentNode;
						var _oRef = _aDts[_i2];
						_oDd.style.display = 'block';
						_oDd.style.marginBottom = '3px';
						_oRef ?
							_oParent.insertBefore(_oDd, _oRef) :
							_oParent.appendChild(_oDd);
					}
				} 
			}
		});	
	}
};

k64.myCorrections = new k64.Corrections();

k64.Form = function() {
	this.addBehaviour();
};

k64.Form.prototype = {
	addEvent: k64.Nav.prototype.addEvent,
	addBehaviour: function() {
		var _self = this;
		this.addEvent(window, 'load', function() {
			var _aBefore = [];
			var _oEntier = document.getElementById('entier');
			var _oUneOuDes = document.getElementById('uneoudes');
			if(!(_oEntier && _oUneOuDes)) {
				return;
			}
			_self.addEvent(_oEntier, 'click', (function(oSrc) {
				return function(e) {
					var _aInputs = oSrc.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('input');
					var _i = 0;
					var _c = _aInputs.length;
					for(; _i < _c; _i++) {
						_aBefore.push(_aInputs[_i].checked ? 'checked' : 'unchecked');
						_aInputs[_i].checked = true;
					}
				};
			})(_oEntier));
			_self.addEvent(_oUneOuDes, 'click', (function(oSrc) {
				return function(e) {
					var _aInputs = oSrc.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('input');
					var _i = 0;
					var _c = _aInputs.length;
					for(; _i < _c; _i++) {
						_aInputs[_i].checked = _aBefore[_i] == 'checked' ? true : false;
					}
					_aBefore = [];
				};
			})(_oUneOuDes));
		});
	}
};

k64.myForm = new k64.Form();

k64.Carte = function() {
	this.addBehaviour();
};

k64.Carte.prototype = {
	addEvent: k64.Nav.prototype.addEvent,
	stopEvent: k64.Nav.prototype.stopEvent,
	addBehaviour: function() {
		var _self = this;
		this.addEvent(window, 'load', function() {
			var _oSearch = document.getElementById(document.location.hash.slice(1));
			if(_oSearch) {
				var _oCont = _oSearch.parentNode;
				while(_oCont && !/\bcarteItem\b/.test(_oCont.className)) {
					_oCont = _oCont.parentNode;
				}
			}
			var _oCarte = document.getElementById('carte');
			if(!_oCarte) {
				return;
			}
			var _aAreas = _oCarte.getElementsByTagName('area');
			var _aDivs = document.getElementsByTagName('div');
			var _aItems = [];
			for(var _i = 0, _c = _aDivs.length; _i < _c; _i++) {
				if(/\bcarteItem\b/.test(_aDivs[_i].className)) {
					_aItems.push(_aDivs[_i]);
				}
			}
			if(_aItems.length != _aAreas.length) {
				alert("Le nombre de zones cliquables n'est pas égal au nombre d'items. - " + _aItems.length + ' - ' + _aAreas.length);
			}
			if(_oCont) {
				for(var _i = 0, _c = _aItems.length; _i < _c; _i++) {
					if(/\bcurrentItem\b/.test(_aItems[_i].className)) {
						_aItems[_i].className = _aItems[_i] == _oCont ?
							_aItems[_i].className:
							_aItems[_i].className.replace(/\bcurrentItem\b/, '');
					}
					else if(_aItems[_i] == _oCont) {
						_aItems[_i].className = _aItems[_i].className + ' currentItem';
					}
				}
			}
			for(var _i = 0, _c = _aAreas.length; _i < _c; _i++) {
				_self.addEvent(_aAreas[_i], 'click', (function(i) {
					return function(e) {
						for(var _i = 0, _c = _aItems.length; _i < _c; _i++) {
							if(/\bcurrentItem\b/.test(_aItems[_i].className)) {
								_aItems[_i].className = _i == i ?
									_aItems[_i].className:
									_aItems[_i].className.replace(/\bcurrentItem\b/, '');
							}
							else if(_i == i) {
								_aItems[_i].className = _aItems[_i].className + ' currentItem';
							}
						}
						_self.stopEvent(e);
					};
				})(_i));
			}
		});
	}
};

k64.myCarte = new k64.Carte();

if(window.attachEvent && typeof XMLHttpRequest === 'undefined') {
	/**
	* DD_belatedPNG: Adds IE6 support: PNG images for CSS background-image and HTML <IMG/>.
	* Author: Drew Diller
	* Email: drew.diller@gmail.com
	* URL: http://www.dillerdesign.com/experiment/DD_belatedPNG/
	* Version: 0.0.8a
	* Licensed under the MIT License: http://dillerdesign.com/experiment/DD_belatedPNG/#license
	*
	* Example usage:
	* DD_belatedPNG.fix('.png_bg'); // argument is a CSS selector
	* DD_belatedPNG.fixPng( someNode ); // argument is an HTMLDomElement
	**/
	var DD_belatedPNG={ns:"DD_belatedPNG",imgSize:{},delay:10,nodesFixed:0,createVmlNameSpace:function(){if(document.namespaces&&!document.namespaces[this.ns]){document.namespaces.add(this.ns,"urn:schemas-microsoft-com:vml")}},createVmlStyleSheet:function(){var b,a;b=document.createElement("style");b.setAttribute("media","screen");document.documentElement.firstChild.insertBefore(b,document.documentElement.firstChild.firstChild);if(b.styleSheet){b=b.styleSheet;b.addRule(this.ns+"\\:*","{behavior:url(#default#VML)}");b.addRule(this.ns+"\\:shape","position:absolute;");b.addRule("img."+this.ns+"_sizeFinder","behavior:none; border:none; position:absolute; z-index:-1; top:-10000px; visibility:hidden;");this.screenStyleSheet=b;a=document.createElement("style");a.setAttribute("media","print");document.documentElement.firstChild.insertBefore(a,document.documentElement.firstChild.firstChild);a=a.styleSheet;a.addRule(this.ns+"\\:*","{display: none !important;}");a.addRule("img."+this.ns+"_sizeFinder","{display: none !important;}")}},readPropertyChange:function(){var b,c,a;b=event.srcElement;if(!b.vmlInitiated){return}if(event.propertyName.search("background")!=-1||event.propertyName.search("border")!=-1){DD_belatedPNG.applyVML(b)}if(event.propertyName=="style.display"){c=(b.currentStyle.display=="none")?"none":"block";for(a in b.vml){if(b.vml.hasOwnProperty(a)){b.vml[a].shape.style.display=c}}}if(event.propertyName.search("filter")!=-1){DD_belatedPNG.vmlOpacity(b)}},vmlOpacity:function(b){if(b.currentStyle.filter.search("lpha")!=-1){var a=b.currentStyle.filter;a=parseInt(a.substring(a.lastIndexOf("=")+1,a.lastIndexOf(")")),10)/100;b.vml.color.shape.style.filter=b.currentStyle.filter;b.vml.image.fill.opacity=a}},handlePseudoHover:function(a){setTimeout(function(){DD_belatedPNG.applyVML(a)},1)},fix:function(a){if(this.screenStyleSheet){var c,b;c=a.split(",");for(b=0;b<c.length;b++){this.screenStyleSheet.addRule(c[b],"behavior:expression(DD_belatedPNG.fixPng(this))")}}},applyVML:function(a){a.runtimeStyle.cssText="";this.vmlFill(a);this.vmlOffsets(a);this.vmlOpacity(a);if(a.isImg){this.copyImageBorders(a)}},attachHandlers:function(i){var d,c,g,e,b,f;d=this;c={resize:"vmlOffsets",move:"vmlOffsets"};if(i.nodeName=="A"){e={mouseleave:"handlePseudoHover",mouseenter:"handlePseudoHover",focus:"handlePseudoHover",blur:"handlePseudoHover"};for(b in e){if(e.hasOwnProperty(b)){c[b]=e[b]}}}for(f in c){if(c.hasOwnProperty(f)){g=function(){d[c[f]](i)};i.attachEvent("on"+f,g)}}i.attachEvent("onpropertychange",this.readPropertyChange)},giveLayout:function(a){a.style.zoom=1;if(a.currentStyle.position=="static"){a.style.position="relative"}},copyImageBorders:function(b){var c,a;c={borderStyle:true,borderWidth:true,borderColor:true};for(a in c){if(c.hasOwnProperty(a)){b.vml.color.shape.style[a]=b.currentStyle[a]}}},vmlFill:function(e){if(!e.currentStyle){return}else{var d,f,g,b,a,c;d=e.currentStyle}for(b in e.vml){if(e.vml.hasOwnProperty(b)){e.vml[b].shape.style.zIndex=d.zIndex}}e.runtimeStyle.backgroundColor="";e.runtimeStyle.backgroundImage="";f=true;if(d.backgroundImage!="none"||e.isImg){if(!e.isImg){e.vmlBg=d.backgroundImage;e.vmlBg=e.vmlBg.substr(5,e.vmlBg.lastIndexOf('")')-5)}else{e.vmlBg=e.src}g=this;if(!g.imgSize[e.vmlBg]){a=document.createElement("img");g.imgSize[e.vmlBg]=a;a.className=g.ns+"_sizeFinder";a.runtimeStyle.cssText="behavior:none; position:absolute; left:-10000px; top:-10000px; border:none; margin:0; padding:0;";c=function(){this.width=this.offsetWidth;this.height=this.offsetHeight;g.vmlOffsets(e)};a.attachEvent("onload",c);a.src=e.vmlBg;a.removeAttribute("width");a.removeAttribute("height");document.body.insertBefore(a,document.body.firstChild)}e.vml.image.fill.src=e.vmlBg;f=false}e.vml.image.fill.on=!f;e.vml.image.fill.color="none";e.vml.color.shape.style.backgroundColor=d.backgroundColor;e.runtimeStyle.backgroundImage="none";e.runtimeStyle.backgroundColor="transparent"},vmlOffsets:function(d){var h,n,a,e,g,m,f,l,j,i,k;h=d.currentStyle;n={W:d.clientWidth+1,H:d.clientHeight+1,w:this.imgSize[d.vmlBg].width,h:this.imgSize[d.vmlBg].height,L:d.offsetLeft,T:d.offsetTop,bLW:d.clientLeft,bTW:d.clientTop};a=(n.L+n.bLW==1)?1:0;e=function(b,p,q,c,s,u){b.coordsize=c+","+s;b.coordorigin=u+","+u;b.path="m0,0l"+c+",0l"+c+","+s+"l0,"+s+" xe";b.style.width=c+"px";b.style.height=s+"px";b.style.left=p+"px";b.style.top=q+"px"};e(d.vml.color.shape,(n.L+(d.isImg?0:n.bLW)),(n.T+(d.isImg?0:n.bTW)),(n.W-1),(n.H-1),0);e(d.vml.image.shape,(n.L+n.bLW),(n.T+n.bTW),(n.W),(n.H),1);g={X:0,Y:0};if(d.isImg){g.X=parseInt(h.paddingLeft,10)+1;g.Y=parseInt(h.paddingTop,10)+1}else{for(j in g){if(g.hasOwnProperty(j)){this.figurePercentage(g,n,j,h["backgroundPosition"+j])}}}d.vml.image.fill.position=(g.X/n.W)+","+(g.Y/n.H);m=h.backgroundRepeat;f={T:1,R:n.W+a,B:n.H,L:1+a};l={X:{b1:"L",b2:"R",d:"W"},Y:{b1:"T",b2:"B",d:"H"}};if(m!="repeat"||d.isImg){i={T:(g.Y),R:(g.X+n.w),B:(g.Y+n.h),L:(g.X)};if(m.search("repeat-")!=-1){k=m.split("repeat-")[1].toUpperCase();i[l[k].b1]=1;i[l[k].b2]=n[l[k].d]}if(i.B>n.H){i.B=n.H}d.vml.image.shape.style.clip="rect("+i.T+"px "+(i.R+a)+"px "+i.B+"px "+(i.L+a)+"px)"}else{d.vml.image.shape.style.clip="rect("+f.T+"px "+f.R+"px "+f.B+"px "+f.L+"px)"}},figurePercentage:function(d,c,f,a){var b,e;e=true;b=(f=="X");switch(a){case"left":case"top":d[f]=0;break;case"center":d[f]=0.5;break;case"right":case"bottom":d[f]=1;break;default:if(a.search("%")!=-1){d[f]=parseInt(a,10)/100}else{e=false}}d[f]=Math.ceil(e?((c[b?"W":"H"]*d[f])-(c[b?"w":"h"]*d[f])):parseInt(a,10));if(d[f]%2===0){d[f]++}return d[f]},fixPng:function(c){c.style.behavior="none";var g,b,f,a,d;if(c.nodeName=="BODY"||c.nodeName=="TD"||c.nodeName=="TR"){return}c.isImg=false;if(c.nodeName=="IMG"){if(c.src.toLowerCase().search(/\.png$/)!=-1){c.isImg=true;c.style.visibility="hidden"}else{return}}else{if(c.currentStyle.backgroundImage.toLowerCase().search(".png")==-1){return}}g=DD_belatedPNG;c.vml={color:{},image:{}};b={shape:{},fill:{}};for(a in c.vml){if(c.vml.hasOwnProperty(a)){for(d in b){if(b.hasOwnProperty(d)){f=g.ns+":"+d;c.vml[a][d]=document.createElement(f)}}c.vml[a].shape.stroked=false;c.vml[a].shape.appendChild(c.vml[a].fill);c.parentNode.insertBefore(c.vml[a].shape,c)}}c.vml.image.shape.fillcolor="none";c.vml.image.fill.type="tile";c.vml.color.fill.on=false;g.attachHandlers(c);g.giveLayout(c);g.giveLayout(c.offsetParent);c.vmlInitiated=true;g.applyVML(c)}};try{document.execCommand("BackgroundImageCache",false,true)}catch(r){}DD_belatedPNG.createVmlNameSpace();DD_belatedPNG.createVmlStyleSheet();

	DD_belatedPNG.fix('.blackline, .minheight616 img, .breadcrumb img, .dark .nav img');
}
