﻿// JavaScript menu

/* Cette fonction devrait être générique : elle affiche le premier UL trouvé dans l'élément passé.
	Préciser "time" si le hoverout est temporisé. Le hover ne le sera pas mais annulera un hoverout temporisé le cas échéant.
*/
function hover(obj, time){
		//alert('pi');
		UL = obj.getElementsByTagName('ul');
		if(UL.length > 0){
			var sousMenu = UL[0];
			if (time == undefined) {
				sousMenu.style.display = 'block';
			}
			else {
				showhover(sousMenu);
				//window.status += '; in ('+obj.id+'): '+UL[0].menutoContext;
				sousMenu.style.display = 'block';
			}
		}
	
}

/* Cette fonction devrait être générique : elle cache le premier UL trouvé dans l'élément passé.
	Préciser "time" si le hoverout est temporisé.
*/
function hoverout(obj, time) {
	
		UL = obj.getElementsByTagName('ul');
		if(UL.length > 0){
			var sousMenu = UL[0];
			if (time == undefined) {
				clearhover(sousMenu);
			}
			else {
				sousMenu.menutoContext=setInterval(function() { clearhover(sousMenu); },time);
				//window.status += '; out ('+obj.id+'): '+UL[0].menutoContext;
			}
		}
				
}

/* fonction appelée quand l'élément est montré. C'est ici qu'on peut gérer plus précisemment la gestion de
la temporisation et éventuellement cacher des éléments de même type déjà ouverts (un seul élément ouvert en même temps). */
/* obj : le UL contenu dans le LI */
function showhover(obj) {
	if (obj.menutoContext != undefined) { 
		clearInterval(obj.menutoContext); 
		obj.menutoContext = undefined; 
	}
	var niv = obj.parentNode.getAttribute("in_niveau");
	var lis = obj.parentNode.parentNode.getElementsByTagName("li");
	//alert(lis.length);
	for (var i=0; i < lis.length; i++) {
		
		if (lis[i] != obj.parentNode && lis[i].getAttribute('in_niveau') == niv) {
			//alert(lis[i].id);
			var ul = lis[i].getElementsByTagName('ul');
			if (ul.length > 0) {	// seulement si un UL est présent dans le LI
				window.status = "; "+ul[0].parentNode.id;
				clearhover(ul[0]);
			}
		}
	}
}

/* fonction appelée quand l'élément doit disparaitre (après temporisation le cas échéant).
On gère ici la disparition par CSS et l'annulation de l'interval. Cette fonction peut être modifiée.
*/
/* obj : le UL contenu dans le LI */
function clearhover(obj) {
	window.status += ";cl "+obj.parentNode.id;
	var interval = obj.menutoContext
	/*if (obj.parentNode) {
		window.status += ";"+obj.parentNode.id+" clear "+interval;
	}
	else {
		window.status += "; error "+obj+" ."+interval;
	}*/
	obj.style.display = '';
	
	if (interval != undefined) {
		clearInterval(interval);
	}
	
	// fermer les hovers plus bas dans la hiérarchie également
	
	/*uls = obj.getElementsByTagName('ul');
	//window.status = uls.length;
	for (var i=0; i < uls.length; i++) {
		//window.status += "; "+uls[i].parentNode.id;
		clearhover(uls[i]);
	}*/
}




/*var menuto = null;
var menutoContext = null;

function McontextHover(obj,obj2){
	//window.status = window.status + "-over("+obj2.className+")";
	var divs = document.getElementById('menuContextuel').getElementsByTagName('div');
	var len = divs.length;
	
	for (i=0; i < len; i++) {
		if (divs[i].getAttribute('menu') == "1") {
			var niv2 = divs[i].getElementsByTagName('div')[0];
			if (niv2 != null) {
				niv2.style.display = "none";
			}
		}
	}
	
	if (menutoContext != null) { clearTimeout(menutoContext); }

		divs = obj.getElementsByTagName('div');
		if(divs.length > 0){
			sousMenuContext = divs[0].style;
			sousMenuContext.display = 'block';
		}
	//}
}
		
function McontextHoverout(obj,obj2) {
	//window.status = window.status + "-out("+obj2.className+")";
	var thetime=500;
	//window.status = window.status + "-out";
	//if(document.all){
		var divs = obj.getElementsByTagName('div');
		if(divs.length > 0){
			sousMenuContext = divs[0].style;
			menutoContext=setTimeout("sousMenuContext.display='none'",thetime);
			//sousMenu.display = 'none';
		}
	//}			
}*/


/***************************/

/* cette fonction doit être appelée au chargement de la page (onload). Elle ajoute le onhover/out à tous les LI
de l'élément passé en paramètre. Pour préciser une temporisation, changer la valeur de "letemps".
*/

var letemps = 500;

function setHover(menuid){
	//alert("setHover("+menuid+")");
	if (menuid == null) { menuid = 'menu'; }
	var menu = document.getElementById(menuid);
	if (menu == undefined) { return; }
	var LI = menu.getElementsByTagName('li');
	var nLI = LI.length;
	for(i=0; i < nLI; i++){
		LI[i].onmouseover = function(){
			hover(this, letemps);
		}
		LI[i].onmouseout = function(){
			hoverout(this, letemps);
		}
	}
	
	//setHoverHint();
}		


// info-bulles


/* document.getElementsBySelector(selector)
   - returns an array of element objects from the current document
     matching the CSS selector. Selectors can contain element names, 
     class names and ids and can be nested. For example:
     
       elements = document.getElementsBySelect('div#main p a.external')
     
     Will return an array of all 'a' elements with 'external' in their 
     class attribute that are contained inside 'p' elements that are 
     contained inside the 'div' element which has id="main"

   New in version 0.4: Support for CSS2 and CSS3 attribute selectors:
   See http://www.w3.org/TR/css3-selectors/#attribute-selectors

   Version 0.4 - Simon Willison, March 25th 2003
   -- Works in Phoenix 0.5, Mozilla 1.3, Opera 7, Internet Explorer 6, Internet Explorer 5 on Windows
   -- Opera 7 fails 
*/

function getAllChildren(e) {
  // Returns all children of element. Workaround required for IE5/Windows. Ugh.
  return e.all ? e.all : e.getElementsByTagName('*');
}

document.getElementsBySelector = function(selector) {
  // Attempt to fail gracefully in lesser browsers
  if (!document.getElementsByTagName) {
    return new Array();
  }
  // Split selector in to tokens
  var tokens = selector.split(' ');
  var currentContext = new Array(document);
  for (var i = 0; i < tokens.length; i++) {
    token = tokens[i].replace(/^\s+/,'').replace(/\s+$/,'');;
    if (token.indexOf('#') > -1) {
      // Token is an ID selector
      var bits = token.split('#');
      var tagName = bits[0];
      var id = bits[1];
      var element = document.getElementById(id);
      if (tagName && element.nodeName.toLowerCase() != tagName) {
        // tag with that ID not found, return false
        return new Array();
      }
      // Set currentContext to contain just this element
      currentContext = new Array(element);
      continue; // Skip to next token
    }
    if (token.indexOf('.') > -1) {
      // Token contains a class selector
      var bits = token.split('.');
      var tagName = bits[0];
      var className = bits[1];
      if (!tagName) {
        tagName = '*';
      }
      // Get elements matching tag, filter them for class selector
      var found = new Array;
      var foundCount = 0;
      for (var h = 0; h < currentContext.length; h++) {
        var elements;
        if (tagName == '*') {
            elements = getAllChildren(currentContext[h]);
        } else {
            elements = currentContext[h].getElementsByTagName(tagName);
        }
        for (var j = 0; j < elements.length; j++) {
          found[foundCount++] = elements[j];
        }
      }
      currentContext = new Array;
      var currentContextIndex = 0;
      for (var k = 0; k < found.length; k++) {
        if (found[k].className && found[k].className.match(new RegExp('\\b'+className+'\\b'))) {
          currentContext[currentContextIndex++] = found[k];
        }
      }
      continue; // Skip to next token
    }
    // Code to deal with attribute selectors
    if (token.match(/^(\w*)\[(\w+)([=~\|\^\$\*]?)=?"?([^\]"]*)"?\]$/)) {
      var tagName = RegExp.$1;
      var attrName = RegExp.$2;
      var attrOperator = RegExp.$3;
      var attrValue = RegExp.$4;
      if (!tagName) {
        tagName = '*';
      }
      // Grab all of the tagName elements within current context
      var found = new Array;
      var foundCount = 0;
      for (var h = 0; h < currentContext.length; h++) {
        var elements;
        if (tagName == '*') {
            elements = getAllChildren(currentContext[h]);
        } else {
            elements = currentContext[h].getElementsByTagName(tagName);
        }
        for (var j = 0; j < elements.length; j++) {
          found[foundCount++] = elements[j];
        }
      }
      currentContext = new Array;
      var currentContextIndex = 0;
      var checkFunction; // This function will be used to filter the elements
      switch (attrOperator) {
        case '=': // Equality
          checkFunction = function(e) { return (e.getAttribute(attrName) == attrValue); };
          break;
        case '~': // Match one of space seperated words 
          checkFunction = function(e) { return (e.getAttribute(attrName).match(new RegExp('\\b'+attrValue+'\\b'))); };
          break;
        case '|': // Match start with value followed by optional hyphen
          checkFunction = function(e) { return (e.getAttribute(attrName).match(new RegExp('^'+attrValue+'-?'))); };
          break;
        case '^': // Match starts with value
          checkFunction = function(e) { return (e.getAttribute(attrName).indexOf(attrValue) == 0); };
          break;
        case '$': // Match ends with value - fails with "Warning" in Opera 7
          checkFunction = function(e) { return (e.getAttribute(attrName).lastIndexOf(attrValue) == e.getAttribute(attrName).length - attrValue.length); };
          break;
        case '*': // Match ends with value
          checkFunction = function(e) { return (e.getAttribute(attrName).indexOf(attrValue) > -1); };
          break;
        default :
          // Just test for existence of attribute
          checkFunction = function(e) { return e.getAttribute(attrName); };
      }
      currentContext = new Array;
      var currentContextIndex = 0;
      for (var k = 0; k < found.length; k++) {
        if (checkFunction(found[k])) {
          currentContext[currentContextIndex++] = found[k];
        }
      }
      // alert('Attribute Selector: '+tagName+' '+attrName+' '+attrOperator+' '+attrValue);
      continue; // Skip to next token
    }
    // If we get here, token is JUST an element (not a class or ID selector)
    tagName = token;
    var found = new Array;
    var foundCount = 0;
    for (var h = 0; h < currentContext.length; h++) {
      var elements = currentContext[h].getElementsByTagName(tagName);
      for (var j = 0; j < elements.length; j++) {
        found[foundCount++] = elements[j];
      }
    }
    currentContext = found;
  }
  return currentContext;
}

/* That revolting regular expression explained 
/^(\w+)\[(\w+)([=~\|\^\$\*]?)=?"?([^\]"]*)"?\]$/
  \---/  \---/\-------------/    \-------/
    |      |         |               |
    |      |         |           The value
    |      |    ~,|,^,$,* or =
    |   Attribute 
   Tag
*/


function getElementsByClass(rootobj, classname){
		var temparray=new Array();
		var inc=0;
		var rootlength=rootobj.length;
		for (i=0; i < rootlength; i++){
			if (rootobj[i].className==classname) {
				temparray[inc++]=rootobj[i];
			}
		}
		return temparray;
}


function hoverhint(obj){
	
	if(document.all){
		WHE = obj.getElementsByTagName('div');
		if(WHE.length > 0){
			for (i=0; i < WHE.length; i++) {
				if (WHE[i].className == 'help') {
					var popup = WHE[i].style;
					popup.display = 'block';
				}
			}
		}
	}
}
		
function hoverhintout(obj) {
	if(document.all){
		WHE = obj.getElementsByTagName('div');
		if(WHE.length > 0){
			for (i=0; i < WHE.length; i++) {
				if (WHE[i].className == 'help') {
					var popup = WHE[i].style;
					popup.display = 'none';
				}
			}
		}
	}			
}
		
function setHoverHint(){
	HE = document.getElementsByTagName('div');
	nHE = HE.length;
	for(i=0; i < nHE; i++){
		
		if (HE[i].className == 'withhelp') {
			HE[i].onmouseover = function(){
				hoverhint(this);
			}
			HE[i].onmouseout = function(){
				hoverhintout(this);
			}
		}
	}
}		
