// Affichage d'un menu en DHTML
// Auteur: Julien Liébert <jliebert@gaya.fr>
// Date creation: ven avr  4 14:49:29 CEST 2003
// Modification: 19/06/2003 18:09 - Correction compatibilité Mac
//		 10/06/2003 17:10 - Reformatage du code
//		 30/05/2003 17:04 - Ajout des attributs dmenuimgon 
//				    et dmenuimgoff pour les tags img.
//		  
// Les arguments que peut prendre le tag du menu sont:
// dmenutarget:  L'id du menu a afficher.
// dmenupos:     La position du menu, 4 cas sont possible: 
//		 left, right, top, bottom (right par defaut)
// dmenuoffsetx: Décalage en pixel horizontale du menu affiché.
// dmenuoffsety: Décalage en pixel verticale du menu affiché.
//
// Les arguments que peuvent prendre le tag du menu et tout les tags fils:
// dmenuon:      La class css utilisé quand le menu est activé.
// dmenuoff:     La class css utilisé quand le menu est désactivé.
// dmenuimgon:   L'image d'un tag img quand le menu est activé.
// dmenuimgoff:  L'image d'un tag img quand le menu est déactivé.


var __menuClearTimeout;
var __menuClearTimeoutValue=250;
var __itemByName=new Object();
var __menu;
var __item;

function __getParentId(obj) {
	if( ! obj.parentNode ) {
		return false;
	}
	if( obj.parentNode.id ) {
		return obj.parentNode.id;
	}
	else {
		return __getParentId(obj.parentNode);
	}
}

function __setClassAttribute(obj,attribute) {
	if( ! obj || ! obj.setAttribute ) return;

	obj.setAttribute(attribute,obj.className);

	var childs=obj.childNodes;
	for( var i=0; i < childs.length; i++ ) {
		__setClassAttribute(childs[i],attribute);
	}
}

function __setClass(obj,attribute) {
	if( ! obj || ! obj.getAttribute ) return;

	var cl=obj.getAttribute(attribute);
	if( cl ) {
		obj.className=cl;
	}

	var childs=obj.childNodes;
	for( var i=0; i < childs.length; i++ ) {
		__setClass(childs[i],attribute);
	}
}

function __setImg(obj,attribute) {
	if( ! obj || ! obj.getAttribute ) return;

	var str=obj.getAttribute(attribute);
	if( str && obj.src ) {		
		obj.src=str;
	}

	var childs=obj.childNodes;
	for( var i=0; i < childs.length; i++ ) {
		__setImg(childs[i],attribute);
	}
}

function __hideMenu(this_name) {
	if( ! this_name ) return;

	var obj=__itemByName[this_name];
	if( obj ) {
		var layer_id=__getParentId(obj);
		if( layer_id ) {
			document.getElementById(this_name).style.visibility='hidden';
			__hideMenu(layer_id);
		}
		__setClass(obj,'dmenuoff');
		__setImg(obj,'dmenuimgoff');
	}
}

function __showMenu(this_name) {
	if( ! this_name ) return;

	var obj=__itemByName[this_name];
	if( obj ) {
		var layer_id=__getParentId(obj);
		if( layer_id ) {
			__showMenu(layer_id);
		}
		__setClass(obj,'dmenuon');
		__setImg(obj,'dmenuimgon');		
	}
	document.getElementById(this_name).style.visibility='inherit';
}

function __hideCurrentMenuAndItem() {
	__hideMenu(__menu);
	__setClass(__item,'dmenuoff');
	__setImg(__item,'dmenuimgoff'); 	
}

function __showCurrentMenuAndItem() {
	__showMenu(__menu);
	__setClass(__item,'dmenuon');
	__setImg(__item,'dmenuimgon'); 	
}

function dmenuShow(obj) {
	if( ! obj || ! obj.getAttribute ) return;

	if( ! obj.getAttribute('dmenuoff') ) {
		__setClassAttribute(obj,'dmenuoff');
	}

	if( ! obj.getAttribute('dmenutarget') || 
	    ! document.getElementById(obj.getAttribute('dmenutarget')) ) { 
		clearTimeout(__menuClearTimeout);

		__hideCurrentMenuAndItem();		;
		__menu=__getParentId(obj);
		__item=obj;
		__showCurrentMenuAndItem();		

		return;
	}

	__itemByName[obj.getAttribute('dmenutarget')]=obj;
	clearTimeout(__menuClearTimeout);

	var new_layer=document.getElementById(obj.getAttribute('dmenutarget'));
	var layer=document.getElementById(__getParentId(obj));
	var pos=obj.getAttribute('dmenupos');
	var offset_x=+(obj.getAttribute('dmenuoffsetx'));
	var offset_y=+(obj.getAttribute('dmenuoffsety'));
	var X;
	var Y;
	if( ! pos ) {
		pos="right";
	}
	if( pos=="left" ) {
		X=layer.offsetLeft+obj.offsetLeft-new_layer.offsetWidth-offset_x;
		Y=layer.offsetTop+obj.offsetTop-offset_y;
	}
	if( pos=="right" || ( pos=="left" && X < 0 ) ) {
		X=layer.offsetLeft+obj.offsetLeft+obj.offsetWidth+offset_x;
		Y=layer.offsetTop+obj.offsetTop+offset_y;
		if ( X+new_layer.offsetWidth > window.innerWidth ) {
			X=X-obj.offsetWidth-new_layer.offsetWidth-offset_x*2;
			if( X < 0 ) {
				X=0;
			}
		}
	}
	if( pos=="top" ) {
		X=layer.offsetLeft+obj.offsetLeft+offset_x;
		Y=layer.offsetTop+obj.offsetTop-new_layer.offsetHeight-offset_y;
	}
	if( pos=="bottom" || ( pos=="top" && Y < 0 ) ) {
		X=layer.offsetLeft+obj.offsetLeft+offset_x;
		Y=layer.offsetTop+obj.offsetTop+obj.offsetHeight+offset_y;
	}
	new_layer.style.left=X+'px';
	new_layer.style.top=Y+'px';

	__hideCurrentMenuAndItem();	
	__menu=obj.getAttribute('dmenutarget');
	__showMenu(__menu);
}

function dmenuHide() {
	__menuClearTimeout=setTimeout("__hideCurrentMenuAndItem()",__menuClearTimeoutValue);
}

// Definition de la fonction getElementById si elle n'est pas définit.
if( ! document.getElementById ) {
	if( document.layers )
		document.getElementById=function(id) { return document.layers[id]; }
   	else if( document.all )
        	document.getElementById=function(id) { return document.all[id]; }
}

// Définition d'une variable innerWidth inexistante sous ie
if( ! window.innerWidth ) {
	window.innerWidth=document.body.clientWidth;
}

