﻿/* $Id:: nav.js 10178 2011-08-04 14:46:36Z giarmoleol                       $ */
/* pour memoire:
   - !document.all renvoie false pour IE, true pour FF
   - display: block; fonctionne sur les table avec IEx et FF2 */

/* Variables définies au niveau du html:
currentNode     treeNode    noeud correspondant à la page en cours
                            null pour la page d'accueil
dataPath        String      chemin relatif de la racine des données
imgPath         String      chemin relatif des images
*/

/* TODO: ...
 - construction sur demande du DOM nav (pour les très gros projet)
 - placement de tout le matos nav dans un objet nav
*/

/* Interaction ****************************************************************/
function permuterDossier(evenement) {
    if (context!='preview') {
        evenement = (evenement) ? evenement : ((event) ? event : null);
        var elementDeclenchant = (evenement.target) ? evenement.target : evenement.srcElement;
        if (elementDeclenchant.nodeType == 3) elementDeclenchant = elementDeclenchant.parentNode
        var elementCible = elementDeclenchant.nextSibling;
        if (elementCible.style.display == "block") {
            //elementDeclenchant.className = "navDossierTitre navDossierFold";
            elementCible.style.display = "none";
        }
        else {
            //elementDeclenchant.className = "navDossierTitre navDossierUnfold";
            elementCible.style.display = "block";
        }
    }
}

/* Initialisation des variables de nav ****************************************/
function navInit(rootPubPath) {
    // initialise les variables globales de la nav.
    // @rootPubPath     String  URL relative vers la racine de la publication
    dataPath = rootPubPath + '_data/';
    imgPath = rootPubPath + 'img/';
    if (context == 'backoffice' || context == 'direct') {
        // publication HTML
        navLinkPrefix = dataPath;
        navLinkSuffix = '.html';
    }
    else if (context == 'frontoffice') {
        // publication XML habillé
        navLinkPrefix = 'page.asp?fichierXml=' + dataPath;
        navLinkSuffix = '.xml&fichierXsl=../xslt/start_mis.xsl';
    }
    else {
        // prévisu
        navLinkPrefix = 'javascript:void(0) /*';
        navLinkSuffix = '*/';
    }
}

/* Construction fil d'Ariane **************************************************/
function makeAriane(arianeContainer, treeNode) {
    // construit les liens du fil d'Ariane
    // @arianeContainer         objet html contenant le fil d'Ariane
    // @treeNode    treeNode    noeud à ajouter
    // retour                   néant

    var document1 = pubRoot.getFirstDoc();
    // protection au cas où...
    if (arianeContainer && treeNode) {
        // je commence par le début (c-à-d les aieuls), je remonte au niveau doc
        if (treeNode!=document1) {
            makeAriane(arianeContainer, treeNode.parent);
            arianeContainer.appendChild(document.createTextNode(' > '));
        }
        // TODO: lien si pas parent du noeud courant ET resource fille
        var firstResource = treeNode.getFirstResource(4,7);
        if (treeNode != currentNode.parent && firstResource) {
            var elementA = document.createElement("a");
            arianeContainer.appendChild(elementA);
            elementA.appendChild(document.createTextNode(treeNode.name))
            elementA.href = (firstResource.type == 6) ?
                dataPath + firstResource.getPath() :
                navLinkPrefix + firstResource.getPath() + navLinkSuffix;
        }
        else
            arianeContainer.appendChild(document.createTextNode(treeNode.name))
    }
}

/* Construction lien contact **************************************************/
function makeContact(elementA, treeNode) {
    // construit le lien vers le topic[@type='contact']
    // @elementA                objet A html dont on veut modifieer le href
    // @treeNode    treeNode    noeud à ajouter
    // retour                   néant

    // protection au cas où...
    if (elementA && treeNode) {
        elementA.href = (treeNode.type == 6) ?
            dataPath + treeNode.getPath() :
            navLinkPrefix + treeNode.getPath() + navLinkSuffix;
    }
}

/* Construction lien contact **************************************************/
function makeImap(elementA, treeNode) {
    // construit le lien vers le topic[@type='imap']
    // @elementA                objet A html dont on veut modifieer le href
    // @treeNode    treeNode    noeud à ajouter
    // retour                   néant

    // protection au cas où...
    if (elementA && treeNode) {
        elementA.href = (treeNode.type == 6) ?
            dataPath + treeNode.getPath() :
            navLinkPrefix + treeNode.getPath() + navLinkSuffix;
    }
}

/* Construction nav ***********************************************************/
function makeNav(navContainer) {
    // construit les objets html nécessaires pour la nav
    // @navContainer    objet html contenant la nav
    // retour           néant

    // s'il faut partir du noeud racine, alors il faudra remplacer le code
    // d'après par la ligne suivante.
    // addNavNode(navContainer, pubRoot);

    // je pars directement sur les enfants du premier document
    var document1 = pubRoot.getFirstDoc();
    for (var i=0; i<document1.children.length; i++) {
        addNavNode(navContainer, document1.children[i]);
    }

}

function addNavNode(container, treeNode) {
    // ajoute un noeud dans la nav
    // @container   objet html  contenant dans lequel ajouter le fragment html
    // @treeNode    treeNode    noeud à ajouter
    // retour       néant

    if (treeNode.show) {
        if (treeNode.type < 4 && treeNode.getFirstResource()!= null) addNavFolderNode(treeNode, container);
        if (treeNode.type > 3) addNavResourceNode(treeNode, container);
    }
}

function addNavFolderNode(treeNode, container) {
    // ajoute un noeud de type folder|doc|section à la nav
    // @treeNode    treeNode    noeud à ajouter
    // @container   objet html  contenant dans lequel ajouter le titre et
    //                          la descendance
    // retour       néant

    // le titre
    // création du P titre
    var elementP = document.createElement('p');
    container.appendChild(elementP);
    elementP.className = 'navDossierTitre';
     elementA = document.createElement('a');
        elementP.appendChild(elementA);
        elementA.appendChild(document.createTextNode(treeNode.name));
   // elementP.appendChild(document.createTextNode(treeNode.name));

    // traitement de la descendance
    if (treeNode.hasShownChildren()) {
        if (treeNode.getFirstResource(4,2).type == 6)
                elementA.href = dataPath + treeNode.getFirstResource(4,2).getPath()
        else
                elementA.href = navLinkPrefix
                    + treeNode.getFirstResource(4,2).getPath() + navLinkSuffix;
//        if (treeNode.type == 6)
//                elementA.href = dataPath + treeNode.getPath()
//            else
//                elementA.href = navLinkPrefix
//                    + treeNode.getFirstResource(4,2).getPath() + navLinkSuffix;

        // Créer le DIV descendance
        var elementDiv = document.createElement('div');
        elementDiv.className = 'navDossierContenu';
        container.appendChild(elementDiv);
        if (treeNode.isAncestorOf(currentNode)) {
            elementP.className += ' navDossierUnfold';
            elementDiv.style.display = 'block';
        }
        else {
            elementP.className += ' navDossierFold';
            elementDiv.style.display = 'none';
        }
        for (var i=0; i<treeNode.children.length; i++) {
            addNavNode(elementDiv, treeNode.children[i])
        }
    }
    //else elementP.className += ' navDossierVide'
}

function addNavResourceNode(treeNode, container) {
    // ajoute un noeud de type topic|unit à la nav
    // @treeNode    treeNode    noeud à ajouter
    // @container   objet html  contenant dans lequel ajouter le titre et
    //                          la descendance
    // retour       néant

    // création du P titre
    var elementP = document.createElement('p');
    if (treeNode == currentNode) elementP.className = 'navRessourceCourante'
    else elementP.className = 'navRessource'
    container.appendChild(elementP);
    if (treeNode == currentNode) {
        elementP.appendChild(document.createTextNode(treeNode.name));
    }
    else {
        // création du lien
        elementA = document.createElement('a');
        elementP.appendChild(elementA);
        elementA.appendChild(document.createTextNode(treeNode.name));

        if (treeNode.type == 6)
            elementA.href = dataPath + treeNode.getPath()
        else
            elementA.href = navLinkPrefix + treeNode.getPath() + navLinkSuffix;
    }
    //Permet de rajouter un espace entre le titre de topic et le titre du document
    /*var elementPInterligne = document.createElement('p');
    elementP.appendChild(elementPInterligne);
    elementPInterligne.className = 'navRessourceInterligne';*/
}

/* Fonctions génériques *******************************************************/
function addTable(container, styleClass, header) {
    // Crée un tableau html avec entête
    // @container       Objet html contenant le tableau
    // @styleClass      String contenant la classe
    // @header          (facultatif) Array contenant les libellés de l'entête
    // retour           Objet TBODY

    var elementTable, elementThead, elementTbody, elementTr, elementTh;

    // création du TABLE
    elementTable = document.createElement('table');
    container.appendChild(elementTable);
    elementTable.className = styleClass;
    // création du THEAD si nécessaire
    if (header) {
        elementThead = document.createElement('thead');
        elementTable.appendChild(elementThead);
        elementTr = document.createElement('tr');
        elementThead.appendChild(elementTr);
        for (var i=0; i<header.length; i++) {
            elementTh = document.createElement('th');
            elementTr.appendChild(elementTh);
            elementTh.appendChild(document.createTextNode(header[i]));
        }
    }
    // création du TBODY
    elementTbody = document.createElement('tbody');
    elementTable.appendChild(elementTbody);
    return elementTbody;
}


/* Construction chemin ***********************************************************/
/*function makeChemin(cheminContainer) {
    // construit les objets html nécessaires pour le chemin
    // @cheminContainer    objet html contenant le chemin
    // retour           néant

    addCheminNode(cheminContainer, currentNode.parent)
}

function addCheminNode(containerChemin, treeNode) {
    // ajoute un noeud dans le chemin
    // @container   objet html  contenant dans lequel ajouter le fragment html
    // @treeNode    treeNode    noeud à ajouter
    // retour       néant

    var elementSpan, elementA;

    if (treeNode.isPubRoot)
    {
        // creation du A contenant le lien vers l'accueil
        elementA = document.createElement("a");
        elementA.appendChild(document.createTextNode(treeNode.name));
        //création du lien
       if (treeNode.type == 0)
            elementA.href = '../default.asp';
       else
            elementA.href = navLinkPrefix + treeNode.getPath() + navLinkSuffix;

        containerChemin.appendChild(elementA);
    }
    else
    {
        addCheminNode(containerChemin, treeNode.parent);
        // creation du SPAN contenant la puce inter-chemin
        elementSpan = document.createElement("span");
        containerChemin.appendChild(elementSpan);
        elementSpan.className = "puce";
        elementSpan.appendChild(document.createTextNode(" > "));
        // si la rubrique contient un topic
        if (treeNode.children.length)
        {
            // creation du A contenant le lien vers le premier topic
            elementA = document.createElement("a");
            containerChemin.appendChild(elementA);
            elementA.appendChild(document.createTextNode(treeNode.name));
            //création du lien
            if (treeNode.getFirstResource(4, 1)!= null)
                elementA.href = navLinkPrefix + treeNode.getFirstResource(4, 1).getPath() + navLinkSuffix;
        }
        // si la rubrique ne contient pas de topic
        else
        {
            // creation du Span contenant le titre de la rubrique
            elementSpan = document.createElement("span");
            containerChemin.appendChild(elementSpan);
            elementSpan.appendChild(document.createTextNode(treeNode.name));
            elementSpan.className = "dummy";
            elementSpan.title = "Ce niveau ne contient aucune page.";
        }
    }
}*/


