// Raccourci et création d'un objet
var d = document,
    o = {};

// Définition des propriétés de l'objet
o.Menu =
{

    // Chargement du menu
    __Load__: function()
    {

        // On lance le test pour s'assurer du bon fonctionnement
        o.Menu.__Test__();

    },

    // Test d'existence des méthodes et de la syntaxe xhtml
    __Test__: function()
    {

        // Si l'une des méthodes du script n'est pas interprétée ou si le menu n'existe pas, on stoppe le script.
        if ( !d.getElementById ||
         !d.getElementsByTagName ||
         !d.createElement ||
         !d.createTextNode ||
         !d.getElementById('menu') ||
         !d.getElementById('menu').setAttribute ||
         !d.getElementById('menu').replaceChild ||
         !d.getElementById('menu').appendChild ||
         !d.getElementById('menu').getElementsByTagName('dl') ) return false;

/*
        ----- Tests facultatifs et non exhaustifs de bon augure ^^ -----
        ----- Les codes contenus dans la zone suivante peuvent -----
        ----- être virés si vous êtes sûr de votre syntaxe xhtml. -----
*/

        // Une fois le premier test effectué, on définit les variables nécessaires.
        var iA, iB, iC, iD,
            oMenu = d.getElementById('menu'),
            oDl = oMenu.getElementsByTagName('dl');

        // Pour chaque élément dl du tableau oDl,
        for ( iA = oDl.length - 1; iA >= 0; iA-- )
        {
            // on récupère les éléments dt dans un tableau.
            var oDt = oDl[iA].getElementsByTagName('dt');
            // Si le tableau oDt est vide, on stoppe le script.
            if ( !oDt ) return false;
        }
        
        // Pour chaque élément dl du tableau oDl,
        for ( iA = oDl.length - 1; iA >= 0; iA-- )
        {
            // on récupère les éléments dd dans un tableau oDd.
            var oDd = oDl[iA].getElementsByTagName('dd');
            // Si le tableau oDd est vide, on stoppe le script.
            if ( !oDd ) return false;
            // sinon
            else
            {
                // pour chaque élément dd du tableau oDd,
                for ( iB = oDd.length - 1; iB >= 0; iB-- )
                {
                    // on récupère les éléments ul dans un tableau oUl.
                    var oUl=oDd[iB].getElementsByTagName('ul');
                    // S'il n'y a pas d'élément ul, on stoppe le script.
                    if( !oUl ) return false;
                    // sinon
                    else
                    {
                        // pour chaque élément ul du tableau oUl,
                        for ( iC = oUl.length - 1; iC >= 0; iC-- )
                        {
                            // on récupère les éléments li dans un tableau oLi.
                            var oLi = oUl[iC].getElementsByTagName('li');
                            // S'il n'y a aucun objet oLi, on stoppe le script.
                            if( !oLi ) return false;
                            // sinon
                            else
                            {
                                // pour chaque élément li du tableau oLi,
                                for ( iD = oLi.length - 1; iD >= 0; iD-- )
                                {
                                    // on récupère l'élément a dans un objet oA.
                                    var oA = oLi[iD].getElementsByTagName('a')[0];
                                    // S'il n'y a pas d'objet oA, on stoppe le script.
                                    if( !oA ) return false;
                                }
                            }
                        }
                    }
                }
            }
        }
        
/*
        ----- -----
        ----- Fin des tests facultatifs de bon augure ^^ -----
        ----- -----
*/

        // Une fois le test effectué, on initialise le menu.
        return o.Menu.__Init__();

    },

    // Méthode d'initialisation du menu
    __Init__:function()
    {

        // On définit les variables nécessaires.
        var iA,
            oMenu = d.getElementById('menu'),
            oDl = oMenu.getElementsByTagName('dl');

        // On cache tous les éléments dd en lançant la méthode dédiée à cette tâche.
        o.Menu.__HideLists__();

        // Pour chaque élément dl du tableau oDl,
        for ( iA = oDl.length - 1; iA >= 0; iA-- )
        {
            // On récupère l'élément dt.
            var oDt = oDl[iA].getElementsByTagName('dt')[0];
            // On crée un élément dt et un élément a
            var oNewDt = d.createElement('dt'),
                oA = d.createElement('a'),
                oTextA = d.createTextNode('');

            // On définit les propriétés de l'objet oA
            // (récupération du noeud texte de l'élément dt pour définir celui de l'élément a)
            oA.setAttribute('href','#');
            oTextA.data = oDt.firstChild.nodeValue;

            // On constitue l'arbre DOM en remplaçant l'élément dt du code xhtml
            // par celui qu'on vient de créer.
            oA.appendChild(oTextA);
            oNewDt.appendChild(oA);
            oDl[iA].replaceChild(oNewDt,oDt);

            // On définit des méthodes en fonction des actions de l'utilisateur.
            oA.onclick = o.Menu.__Discard__;
            oDl[iA].onmouseover = o.Menu.__MouseDisplay__;
            oA.onfocus = o.Menu.__TabDisplay__;
            oA.onkeypress = o.Menu.__TabDisplay__;
        }

    },

    // Méthode d'affichage de l'élément dd lorsqu'on le survole.
    __MouseDisplay__:function()
    {

        // On cache tous les éléments dd en lançant la méthode dédiée à cette tâche.
        o.Menu.__HideLists__();

        // On récupère l'élément dd de l'élément dl qu'on survole dans un objet.
        var oDd = this.getElementsByTagName('dd')[0];

        // On affecte la propriété css "display: block;" à l'objet oDd (affichage)
        oDd.style.display = 'block';

        // On cache l'élément dd lorsqu'on ne survole plus l'élément dl.
        this.onmouseout = o.Menu.__HideLists__;

    },

    // Méthode d'affichage de l'élément dd lorsqu'il prend le focus.
    __TabDisplay__:function()
    {

        // On cache tous les éléments dd en lançant la méthode dédiée à cette tâche.
        o.Menu.__HideLists__();

        // On récupère l'élément dd de l'élément dl qui a le focus dans un objet.
        var oDd = this.parentNode.parentNode.getElementsByTagName('dd')[0];

        // On affecte la propriété css "display: block;" à l'objet oDd (affichage)
        oDd.style.display = 'block';

        // On donne le focus au premier lien de l'élément dd traité.
        oDd.getElementsByTagName('a')[0].focus();

    },

    // Méthode de masquage des éléments dd
    __HideLists__:function()
    {

        // On définit les variables nécessaires.
        var iA,
            oDd = d.getElementById('menu').getElementsByTagName('dd');

        // Pour chaque élément dd du tableau oDd,
        for (iA = oDd.length - 1; iA >= 0; iA-- )
        {
            // On affecte la propriété css "display: none;" à l'objet oDd (masquage)
            oDd[iA].style.display = 'none';
        }

    },

    // Fonction d'annulation
     __Discard__:function()
    {

        // On annule l'action.
        return false;

    }

};

// Une fois que le document est chargé en mémoire, on charge le script.
window.onload=o.Menu.__Load__;

