/*
Author   : bieler batiste
Company  : doSimple : http://www.dosimple.ch
send me a mail for more informations : faden@PASDEPOURRIELaltern.org - remove ( PASDEPOURRIEL )

Short javascript function to create and handle a CSS navigation menu

Copyright (C) 2004  Bieler Batiste

This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*/

// the timeout for the menu
var timeout = 0;

var bgSsMenu = "#F0F0F0"; //"#F0ECDD";
var delaiAff = 200;

// not very clean but simple
// the function can be run in the HTML for faster display
// window.onload=initMenu;

// creat timeout variables for list item
// it's for avoid some warning with IE
for( var i = 0; i < 100; i++ )
{
    eval("var timeoutli" + i + " = false;");
}

// this fonction apply the CSS style and the event
function initMenu()
{
    // a test to avoid some browser like IE4, Opera 6, and IE Mac
    if ( navigateur.isDOM1
    && !( navigateur.isMac && navigateur.isIE )
    && !( navigateur.isOpera && navigateur.versionMajor < 7 )
    && !( navigateur.isIE && navigateur.versionMajor < 5 ) )
    {

        // get some element
        var menu = document.getElementById('menu-deroul'); // the root element
        var lis = menu.getElementsByTagName('li'); // all the li
        
        // change the class name of the menu, 
        // it's usefull for compatibility with old browser
        menu.className='menu-deroul';

        // i am searching for ul element in li element
        for ( var i=0; i<lis.length; i++ )
        {
            // is there a ul element ?
            if ( lis.item(i).getElementsByTagName('ul').length > 0 )
            {        
                // improve IE key navigation
                if ( navigateur.isIE )
                {
                    addAnEvent(lis.item(i),'keyup',show);
                }
                // link events to list item
                addAnEvent(lis.item(i),'mouseover',show);
                addAnEvent(lis.item(i),'click',timeoutHide);
                addAnEvent(lis.item(i),'mouseout',timeoutHide);
                addAnEvent(lis.item(i),'blur',timeoutHide);
                addAnEvent(lis.item(i),'focus',show);
                
                // add an id to list item
                lis.item(i).setAttribute( 'id', "li"+i );

		// Initialisation des positions des sous-menus
		initializePos(lis.item(i));
                // Si niveau autre que 1er, on met la class pour presence sous-menu
                /*if (lis.item(i).parentNode.id != "menu-deroul"){
                	//lis.item(i).getElementsByTagName('a')[0].className = 'menuIndicateur';
                }*/
            }
        }
    }
}

function addAnEvent( target, eventName, functionName )
{
    // apply the method to IE
    if ( navigateur.isIE )
    {
        //attachEvent dont work properly with this
        eval('target.on'+eventName+'=functionName');
    }
    // apply the method to DOM compliant browsers
    else
    {
        target.addEventListener( eventName , functionName , true ); // true is important for Opera7
    }
}
    
// hide the first ul element of the current element
function timeoutHide()
{
    // start the timeout
    eval( "timeout" + this.id + " = window.setTimeout('hideUlUnder( \"" + this.id + "\" )', " + timeout + " );");
}

// hide the ul elements under the element identified by id
function hideUlUnder(id){   
    document.getElementById(id).getElementsByTagName('ul')[0].style['visibility'] = 'hidden';

	// Couleur d'arriere plan remis par défaut si niv1 -> noeud parent est menu-deroul
	idLien = document.getElementById(id).getElementsByTagName('a')[0];
	if (document.getElementById(id).parentNode.id == "menu-deroul"){
	   idLien.style.backgroundColor = document.getElementById('menu-deroul').style.backgroundColor;
	   idLien.style.color = "white";
	   if (navigateur.isIE) modifZindex(0);
	}
	
}

/*** A voir si besoin pour positionnement ***/
function getAbsX(elt) {
	return parseInt(elt.x) ? elt.x : getAbsPos(elt,"Left");
}

function getAbsY(elt) {
	return parseInt(elt.y) ? elt.y : getAbsPos(elt,"Top");
}

function getAbsPos(elt,which) {
	iPos = 0;
	while (elt != null) {
		iPos += elt["offset" + which];
		elt = elt.offsetParent;
	}
	return iPos;
}
function largeur_fenetre()
{
 if (window.innerWidth) return window.innerWidth;
 else if (document.body && document.body.offsetWidth) return document.body.offsetWidth;
 else return 0;
}

/******************** Bugs avec IE -> z-index dans la feuille de style est ignore...*************************/
function modifZindex(valeur){
     if (document.getElementById('portlet-language')) document.getElementById('portlet-language').style.zIndex = valeur ;
    if (document.getElementById('portal-personaltools'))  document.getElementById('portal-personaltools').style.zIndex = valeur;
    if (document.getElementById('portlet-events'))  document.getElementById('portlet-events').style.zIndex = valeur;

}

function initializePos(li){
	parentIsMenu = false;
	if (li.parentNode.id == "menu-deroul") parentIsMenu = true;

	menu = document.getElementById('menu-deroul');
	distanceLibre = largeur_fenetre() - getAbsX(li);
	ulToAffiche = li.getElementsByTagName('ul')[0];
	ulToAffiche.style.marginLeft = 0;
	if (parentIsMenu){

		if (ulToAffiche.offsetWidth < distanceLibre) ulToAffiche.style.left = li.offsetLeft;
		else ulToAffiche.style.right = 0;
    	}
    	else{
        	if (ulToAffiche.offsetWidth + li.offsetWidth < distanceLibre) ulToAffiche.style.left = li.offsetLeft + li.offsetWidth - 5 +"px";
        else ulToAffiche.style.left = li.offsetLeft - ulToAffiche.offsetWidth + 5 + "px";
    }
}

// show the first ul element found under this element
function show(){
     if (navigateur.isIE) modifZindex(-1);

    // Couleur d'arriere plan de la barre de menu si 1er niveau de menu
    if (this.parentNode.id == "menu-deroul"){
    	this.getElementsByTagName('a')[0].style.backgroundColor = bgSsMenu;
    	this.getElementsByTagName('a')[0].style.color = "Black";
    }


    // show the sub menu
    this.getElementsByTagName('ul')[0].style['visibility'] = 'visible';

    // clear the timeout
    eval ( "clearTimeout( timeout"+ this.id +");" );
    hideAllOthersUls( this );
}

// hide all ul on the same level of  this list item
function hideAllOthersUls( currentLi )
{
    var ul = currentLi.parentNode;
    //alert(lis.childNodes.length);
    for ( var i=0; i<ul.childNodes.length; i++ )
    {
        if ( ul.childNodes[i].id && ul.childNodes[i].id != currentLi.id )
        {
            hideUlUnderLi( ul.childNodes[i] );
        }
    }
}

// hide all the ul wich are in the li element
function hideUlUnderLi( li )
{
    var uls = li.getElementsByTagName('ul');
    for ( var i=0; i<uls.length; i++ )
    {
        uls.item(i).style['visibility'] = 'hidden';
    }
}

