en | fr  | Contact  | Print  | Share

FrameBeurk File

Fmbk/Module/Zenpa/_js/patronPage.js.php

//FrameBeurk V0.65 Copyright ToolOscope 2016. Licence CeCILL-C.
// Javascript associé au Patron Zenpa

// Variable globale qui contient le jeton du défiment en cours (pour éviter 2 défilement en même temps
var JETON_DEFILEMENT = '';

<?php
// tissage des fonctions javascript associées au Patron
$CONFIG['Module']['Beurk']['Fonctions']['InitAffichageAjax'] = 'zenpa_initMessagesChargement';                    // initialise l'affichage lors de l'envoi d'une requete Ajax
$CONFIG['Module']['Beurk']['Fonctions']['AfficheChargement'] = 'zenpa_afficheChargement';                        // affiche un message de chargement en cours

$CONFIG['Module']['Beurk']['Fonctions']['RetourAjax'] = 'zenpa_traitementAjaxRetour';                            // traitement ajax au retour d'une requete
$CONFIG['Module']['Rhum']['Fonctions']['RetourAjax'] = 'zenpa_traitementAjaxRetour';                            // idem
$CONFIG['Module']['Kom1']['Fonctions']['ApresBasculeAffichage'] = 'zenpa_synchroniseColonnes';                    // après bascule de l'affichage d'une div, resynchro des colonnes
$CONFIG['Module']['Beurk']['Fonctions']['ApresCacheDiv'] = 'zenpa_synchroniseColonnes';                        // après fermeture d'une div, idem
// rem: ces variables de configuration dépendent du Patron qui peut changer à chaque transaction.
// elles ne sont pas sauvées en session (car non chargées par le bootstrap).
?>
// affiche les infos passées en JS. fonction appelée par zenpa_initAffichageApresChargement(...)
function zenpa_afficheMessages() {
    for(clef in MESSAGES)
        if (document.getElementById('message' + clef))
            document.getElementById('message' + clef).innerHTML = MESSAGES[clef]; // affiche les messages Maj, Vue, le nombre de résultats de la recherche, la duree d'éxécution de la transaction...
}

//initialise les messages à l'écran. fonction appelée par beurk_ajaxAllerGET(...) et ajaxAllerPOST(...)
function zenpa_initMessagesChargement() {
    for(clef in MESSAGES)
        if (document.getElementById('message' + clef) && document.getElementById('message' + clef).hasAttribute("data-chargement")) {
            data_chargement = document.getElementById('message' + clef).getAttribute("data-chargement");
            
            if (data_chargement == 'Init')
                document.getElementById('message' + clef).innerHTML = (MESSAGES[clef] != '') ? '&nbsp;' : '';    // si un message présent, on laisse un espace pour ne pas changer la hauteur de la fenêtre

            if (data_chargement == 'Load')
                document.getElementById('message' + clef).innerHTML = '<?php echo Beurk_traduit('Chargement en cours''Beurk'); ?>';
        }
}

//affiche le message de chargement en cours
function zenpa_afficheChargement(nomDiv) {
    if (nomDiv == DIV_VUE_PAGE)
        zenpa_repositionneColonnes();    // remonte les 2 divs à leurs positions d'origine
    if (document.getElementById(nomDiv))
        document.getElementById(nomDiv).innerHTML = '<p class="chargement"><?php echo Beurk_traduit('Chargement en cours''Beurk'); ?>...</p>'; //A traduire !!!
}

//traitement à faire à chaque retour Ajax
function zenpa_traitementAjaxRetour(xmldoc, nomDivAModifier) {

    //extraction des messages de traitement
    str_message = beurk_texteNoeudXml(xmldoc, 'messages');
    eval('MESSAGES = {' + str_message + '}');    // instancie le tableau MESSAGES en variable globale qui sera utilisée dans zenpa_initAffichageApresChargement
    
    //extraction des paramètres et initialisation de la page
    elementAScroller = beurk_texteNoeudXml(xmldoc, 'elementAScroller');
    formAAfficher = beurk_texteNoeudXml(xmldoc, 'formAAfficher');
    champASurligner = beurk_texteNoeudXml(xmldoc, 'champASurligner');

    beurk_afficheDiv(nomDivAModifier);    // vraie div dont le code HTML a été remplacé par celui reçu en ajax
    
    zenpa_initAffichageApresChargement(elementAScroller, formAAfficher, champASurligner, document.getElementById(nomDivAModifier));

    //extraction du nouveau jeton Ajax (JetonAjax déclaré en variable globale par trailer.php)
    JETON_AJAX = beurk_texteNoeudXml(xmldoc, 'JetonAjax');
}

// éxécuté au chargement de la page ou de la div par Ajax
function zenpa_initAffichageApresChargement(elementAScroller, formAAfficher, champASurligner, divModifiee) {
  zenpa_afficheMessages();    // fonction à définir dans un autre module
    
  // force l'affichage de la div qui contient le form
  // remarque sur le format attendu : nom_du_form = 'form' + nom_de_la_div
  if (formAAfficher.length > 4) {
    divAAfficher = formAAfficher.substr(4, formAAfficher.length - 4);
    if (divAAfficher != '' && document.getElementById(divAAfficher))
        beurk_afficheDiv(divAAfficher);        // div dont le nom a été déduit du form en erreur
  }
  
  // met le focus sur le champ du form en erreur
  if (formAAfficher != '' && champASurligner != '' && document.forms[formAAfficher] && document.forms[formAAfficher].elements[champASurligner])
    document.forms[formAAfficher].elements[champASurligner].focus();

  // fait défiler la fenêtre jusqu'à l'élément souhaité (sauf s'il y a un # dans l'URL : l'ancre reste prioritaire)
  if (elementAScroller != '' && document.location.href.indexOf('#') == -1 && document.getElementById(elementAScroller))
    //document.getElementById(elementAScroller).scrollIntoView();
    zenpa_declencheDefilement(document.getElementById(elementAScroller));
    
  // amelioration des liens
  if (divModifiee === document || (divModifiee && divModifiee.nodeName && (divModifiee.nodeName.toLowerCase() === 'div')))
    beurk_ameliorationBalises(divModifiee);

    zenpa_synchroniseColonnes();
}

// sur défilement de la fenêtre, appelle la fonction de synchro des divs
window.onscroll = function (e) {
    zenpa_synchroniseColonnes();
}

// retourne la position de la div sur la page [X,Y]
function zenpa_posDiv(div) {
    var Ydiv = div.offsetTop;
    var Xdiv = div.offsetLeft;
    tmpDiv = div;
    while (tmpDiv = tmpDiv.offsetParent) {
        Ydiv += tmpDiv.offsetTop;
        Xdiv += tmpDiv.offsetLeft;
    }
    return [Xdiv, Ydiv];
}

// retourne la position de la div sur la page [X,Y]
function zenpa_yDiv(nomDiv) {

    var div = document.getElementById(nomDiv);
    if(div) {
        return zenpa_posDiv(div)[1];
    } else
        return 0;
}


// cette fonction ajuste la position verticale de la div la plus petite (en hauteur) pour qu'elle soit visible à l'écran
function zenpa_synchroniseColonnes(jetonEnCours) {

    if (typeof jetonEnCours == 'undefined')
        jetonEnCours = '';

    if (jetonEnCours != JETON_DEFILEMENT)        // pas de synchronisation si un défilement est en cours
        return true;
        
    var nomDiv1 = "gauche";
    var nomDiv2 = "droite";
    var div1 = document.getElementById(nomDiv1);    // div à synchroniser
    var div2 = document.getElementById(nomDiv2);

    var DYdiv1 = div1.offsetHeight;                    // récupération hauteurs et largeur
    var DXdiv1 = div1.offsetWidth;                    
    var DYdiv2 = div2.offsetHeight;
    var DXdiv2 = div2.offsetWidth;                    

    // marges hautes
    if (div1.hasAttribute("div-MargeTop")) {
        var margeTopIniDiv1 = div1.getAttribute("div-MargeTop");    // récupération marge haute initiale
    } else {
        var margeTopIniDiv1 = parseInt(window.getComputedStyle(div1).marginTop.replace("px", ""));
        div1.setAttribute("div-MargeTop", margeTopIniDiv1);        // stockage marge haute initiale
    }
    if (div2.hasAttribute("div-MargeTop")) {
        var margeTopIniDiv2 = div2.getAttribute("div-MargeTop");    // récupération marge haute initiale
    } else {
        var margeTopIniDiv2 = parseInt(window.getComputedStyle(div2).marginTop.replace("px", ""));
        div2.setAttribute("div-MargeTop", margeTopIniDiv2);        // stockage marge haute initiale
    }
    
    // choix de la div à déplacer : la plus petite
    if (DYdiv2 == DYdiv1) {
        return true;
    } else if (DYdiv2 > DYdiv1) {
        divAAjuster = document.getElementById(nomDiv1);
        divReference = document.getElementById(nomDiv2);
        DYdiv = DYdiv1;
        DYref = DYdiv2;
        DXdiv = DXdiv1;
        DXref = DXdiv2;
        M1div = margeTopIniDiv1;
        M1ref = margeTopIniDiv2;
    } else {
        divAAjuster = document.getElementById(nomDiv2);
        divReference = document.getElementById(nomDiv1);
        DYdiv = DYdiv2;
        DYref = DYdiv1;
        DXdiv = DXdiv2;
        DXref = DXdiv1;
        M1div = margeTopIniDiv2;
        M1ref = margeTopIniDiv1;
    }
    var margeCourante = parseInt(window.getComputedStyle(divAAjuster).marginTop.replace("px", ""));
    var margeCouranteRef = parseInt(window.getComputedStyle(divReference).marginTop.replace("px", ""));
    var defilement = 0;

    // récupération positions verticales (et horizontales)
    var posDiv = zenpa_posDiv(divAAjuster)
    var X1div = posDiv[0];
    var Y1div = posDiv[1];

    posDiv = zenpa_posDiv(divReference)
    var X1ref = posDiv[0];
    var Y1ref = posDiv[1];

    var Y2div = Y1div + DYdiv;
    var Y2ref = Y1ref + DYref;

    // cas où les 2 divs sont l'une au dessus de l'autre (responsive design)
    if (X1ref < (X1div + DXdiv) && X1div < (X1ref + DXref)) {
        div1.style.marginTop = margeTopIniDiv1 + "px";        // on force à la marge initiale
        div2.style.marginTop = margeTopIniDiv2 + "px";
        return true;
    }
    //récupération de la position de l'écran sur le document
    if (document.documentElement && document.documentElement.scrollTop) {
        Y1ecran = document.documentElement.scrollTop;
    } else if (document.body && document.body.scrollTop) {
        Y1ecran = document.body.scrollTop;
    } else if (window.pageYOffset) {
        Y1ecran = window.pageYOffset;
    } else {
        return false;
    }
    
    // récupération de la hauteur de l'écran
    if (window.innerWidth) {
        DYecran = window.innerHeight;
    } else if (document.documentElement && document.documentElement.clientHeight) {
        DYecran = document.documentElement.clientHeight;
    } else {
        return false;
    }
    var Y2ecran = Y1ecran + DYecran;

    var cas = '?';    
    // cas '1' : la div de référence commence en dessous du haut de l'écran
    if (Y1ecran < Y1ref - M1ref && margeCouranteRef > M1ref) {
        cas = '1';
        //alert(cas);
        margeCouranteRef = Math.max(margeCouranteRef + Y1ecran - Y1ref, M1ref);        // calcul nouvelle marge haute (au moins la marge initiale)
        divReference.style.marginTop = margeCouranteRef + "px";
    }
            
    // cas 2 : haut de la div visible
    if (Y1ecran < Y1div && margeCourante > M1div) {
        cas = '2';
        margeCourante = Math.max(margeCourante + Y1ecran - Y1div, M1div);            // on remonte la div...
        divAAjuster.style.marginTop = margeCourante + "px";

    // cas 3 : haut de la div plus haut que le début de l'écran et le bas de la div est visible
    } else if (Y1ecran > Y1div && Y2ecran > Y2div) {
        cas = '3';
        defilement = Math.min(Y2ecran - Y2div, Y1ecran - Y1div, Y2ref - Y2div);            // on descend la div...
        margeCourante = Math.max(margeCourante + defilement, M1div);
        divAAjuster.style.marginTop = margeCourante + "px";
    }

    if (jetonEnCours == '')                        // re-synchronisation, sauf si défilement en cours
        zenpa_resynchroniseColonnes();
    
    /* zenpa_debug(Y1ecran + ' ' + Y1div +  ' ' + Y1ref + ' ' + M1div + ' ' + M1ref, true);
    zenpa_debug( Y2ecran + ' ' + Y2div  + ' ' + Y2ref);
    zenpa_debug( cas + ' : ' + margeCourante + ' ' + margeCouranteRef); */
}


// cette fonction remet la position verticale des divs à synchroniser (en hauteur) à leur valeurs initiales
// (à appeler lorsque l'une des 2 colonnes est rechargée complètement ...ou presque)
function zenpa_repositionneColonnes() {
    var nomDiv1 = "gauche";
    var nomDiv2 = "droite";
    var div1 = document.getElementById(nomDiv1);    // div à synchroniser
    var div2 = document.getElementById(nomDiv2);

    if (div1 && div1.hasAttribute("div-MargeTop"))
        div1.style.marginTop = div1.getAttribute("div-MargeTop") + "px";

    if (div2 && div2.hasAttribute("div-MargeTop"))
        div2.style.marginTop = div2.getAttribute("div-MargeTop") + "px";
}

// cette fonction remet une des 2 marges à zéro (cas où les 2 divs sont descendues)
function zenpa_resynchroniseColonnes() {
    var nomDiv1 = "gauche";
    var nomDiv2 = "droite";
    var div1 = document.getElementById(nomDiv1);    // div à synchroniser
    var div2 = document.getElementById(nomDiv2);

    if (div1 && div1.hasAttribute("div-MargeTop"))        // marges initiales
        var margeTopIniDiv1 = div1.getAttribute("div-MargeTop");
    else
        return false;

    if (div2 && div2.hasAttribute("div-MargeTop"))
        var margeTopIniDiv2 = div2.getAttribute("div-MargeTop");
    else
        return false;

    var margeTopCourDiv1 = parseInt(window.getComputedStyle(div1).marginTop.replace("px", ""));        // marges courantes
    var margeTopCourDiv2 = parseInt(window.getComputedStyle(div2).marginTop.replace("px", ""));

    var DeltaDiv1 = margeTopCourDiv1 - margeTopIniDiv1;            // écarts avec les marges courantes
    var DeltaDiv2 = margeTopCourDiv2 - margeTopIniDiv2;

    if (minDelta = Math.min(DeltaDiv1, DeltaDiv2)) {        // si les 2 sont supérieures à zéro, on recale les divs et l'écran
        div1.style.marginTop = (margeTopCourDiv1 - minDelta) + "px";
        div2.style.marginTop = (margeTopCourDiv2 - minDelta) + "px";
        window.scrollBy(0, - minDelta);
    }
}

// défilement doux jusqu'à la div en argument
function zenpa_declencheDefilement(divAffichee) {

    //zenpa_debug('zenpa_declencheDefilement : ' + divAffichee.id, true);

    // récupération hauteur
    var DYdiv = divAffichee.offsetHeight;

    // récupération position verticale
    var Y1div = divAffichee.offsetTop;
    tmpDiv = divAffichee;
    while (tmpDiv = tmpDiv.offsetParent) {
        Y1div += tmpDiv.offsetTop;
    }
    Y2div = Y1div + DYdiv;

    //récupération de la position de l'écran sur le document
    if (document.documentElement && document.documentElement.scrollTop) {
        Y1ecran = document.documentElement.scrollTop;
    } else if (document.body && document.body.scrollTop) {
        Y1ecran = document.body.scrollTop;
    } else if (window.pageYOffset) {
        Y1ecran = window.pageYOffset;
    } else {
        Y1ecran = 0;
    }
    
    // récupération de la hauteur de l'écran
    if (window.innerWidth) {
        DYecran = window.innerHeight;
    } else if (document.documentElement && document.documentElement.clientHeight) {
        DYecran = document.documentElement.clientHeight;
    } else {
        return false;
    }
    var Y2ecran = Y1ecran + DYecran;

    // 1er cas : div entièrement à l'écran
    if (Y1div >= Y1ecran && Y2div <= Y2ecran) {
        return true;
    
    // 2ème cas : écran trop bas
    } else if (Y1ecran > Y1div) {
        Y1ecranCible = Y1div - 10; // on remonte l'écran jusqu'à 10 pixels au dessus du haut de la div
        
    // 3ème cas : écran trop haut
    } else if (Y2ecran < Y2div) {
        Y1ecranCible = Y1ecran + Y2div - Y2ecran + 10; // on remonte la div jusqu'à 10 pixels au dessus du bas de l'écran
        if (Y1ecranCible > Y1div) {
            Y1ecranCible = Y1div - 10;        // mais on ne remonte pas la div plus haut que le début de l'écran
        }
    }
    
    JETON_DEFILEMENT = beurk_jeton();    // c'est la dernière fonction de défilement qui prend la main
    
    // déclenche le défilement (de l'écran)
    DYdefilement = Y1ecranCible - Y1ecran;
    zenpa_defilement(DYdefilement, JETON_DEFILEMENT);
}

function zenpa_defilement(DYdefilement, jetonEnCours) {

    if (jetonEnCours != JETON_DEFILEMENT)        // si le jeton a changé, on arrête.
        return true;
        
    if (DYdefilement < 0)
        pas = Math.max(DYdefilement, -40);     //défile 40 pixel
    else
        pas = Math.min(DYdefilement, 40);
        
    //zenpa_debug(DYdefilement + ' ' + pas);
    window.scrollBy(0, pas);
    
    DYdefilement = DYdefilement - pas;
    if (DYdefilement != 0)
        setTimeout(function() {zenpa_defilement(DYdefilement, jetonEnCours);}, 20); // toutes les 20 ms
    else {
        JETON_DEFILEMENT = '';
        zenpa_resynchroniseColonnes();
    }
}

// debugging
function zenpa_debug(chaine, init) {
    if (init == true)
        document.getElementById('debug').innerHTML = '';
    document.getElementById('debug').innerHTML = document.getElementById('debug').innerHTML + chaine + '<br />';
}


© 2010-2015 by ToolOscope SASU. © 2016-2018 by Arnaud De Rette. All rights reserved