(function () { 'use strict'; /* eslint func-names: off, eqeqeq: off, camelcase: off, no-self-assign: off, unicorn/prefer-number-properties: off, unicorn/prevent-abbreviations: off, no-eq-null: off, max-depth: off, complexity: off, max-params: off, unicorn/prefer-query-selector: off, no-negated-condition: off, prefer-rest-params: off */ // Classes JS definies dans ce fichier : // . Select : Script convertissant un selecteur presents dans l'entete en composant JavaScript // . convertion de la liste des sites "other websites" en select JS pour le mode reduit // . affichage accordeon du pied de page en mode reduit // . gestion de l'affichage sur les menus lateraux (effet parallaxe + mode accordeon) /* ============================================================================================================================================================================ */ /* === CONVERTION DES SELECTEURS STATIQUES EN VERSION DYNAMIQUE =============================================================================================================== */ /* ============================================================================================================================================================================ */ const Data$4 = { convertlist: [], reference: {} }; // - VALIDATION - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // VALIDATION : controle de l'objet de donnees passe en parametre function check$4(d) { if (typeof d === 'object') { if (d != null) { return d.tagName != null; } return false; } return false; } // VALIDATION : convertion du text function clean(t) { return typeof t === 'string' ? t.replace(/&/g, '&').replace(/ /g, ' ').replace(/'/g, "'") : t; } // - CONVERTION - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // Fonction initiale convertissant un selecteur en version JS function askconvertion(tag, parameters) { let result = { converted: false, data: null }; if (typeof tag === 'string') tag = document.getElementById(tag); if (check$4(tag)) { if (!tag.dataset.selectconverted) { if (tag.tagName.toLowerCase() == 'select') { // Traitement des selecteurs classiques tag.parentNode.insertBefore(m, tag); tag.remove(); // Envoi de la convertion result = convert$3(s, parameters); } } } return result; } // Appel de la fonction "callback" apres la convertion du selecteur si demandee let b = false; if (parameters != null && typeof parameters === 'object' && typeof parameters.cb_afterconvert === 'function') b = true; if (b) parameters.cb_afterconvert(result.converted, result.data); // Envoi du resultat de la demande return result; } function alwaysTrue() { return true; } function convert$3(tag, parameters) { // Definition des arguments // > tag // [NODE] (mandatory) : Reference de la balise presents dans l'entete en composant JavaScript // . convertion de la liste des sites "other websites" en select JS pour le mode reduit // . affichage accordeon du pied de page en mode reduit // . gestion de l'affichage sur les menus lateraux (effet parallaxe + mode accordeon) /* ============================================================================================================================================================================ */ /* === GESTION DES ACTIONS ACCORDEONS (expand/collapse [+]/[-]) =============================================================================================================== */ /* ============================================================================================================================================================================ */ const Data$3 = { convertlist: [], reference: {} }; // - VALIDATION - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // VALIDATION : controle de l'objet de donnees passe en parametre function check$3(d) { if (typeof d === 'object') { if (d != null) { return d.tagName != null; } return false; } return false; } // - CONVERTION - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - function convert$2(parent, newbutton, animatedcontent, realcontent, parameters) { // Initialisation des variables let i; let m; let t; let b; let data = null; // Verification des balise transmises en parametre if (check$3(parent) && check$3(newbutton) && check$3(animatedcontent) && check$3(realcontent) && !parent.dataset.accordion) { // Blocage des convertions ulterieures parent.dataset.accordion = false; // Analyse de l'objet de parametre if (typeof parameters !== 'object') { parameters = {}; } else if (parameters == null) { parameters = {}; } // Definition de l'objet // > params.clickonicon // [BOOLEAN] (default value: false) : Indicateur d'ajout des actions de souris sur l'icone et non l'entierete du bouton // > params.openbtn // [NODE] : Conteneur du bouton d'ouverture [+] d'origine (utilise sans JS) a supprimer dans la version JS // > params.closebtn // [NODE] : Conteneur du bouton de fermeture [-] d'origine (utilise sans JS) a supprimer dans la version JS // > params.cb_afterconvert // [FUNCTION] (need a return value = true) : Fonction appelee apres la convertion du bloc // > params.cb_beforeanim // [FUNCTION] (need a return value = true) : Fonction appelee avant l'animation d'ouverture ou la fermeture du bloc de contenu // > params.cb_afteranim // [FUNCTION] (need a return value = true) : Fonction appelee apres l'animation d'ouverture ou la fermeture du bloc de contenu // Initialisation de l'objet de donnees du widget data = {}; data.id = null; // [STRING] : Identifiant de la balise originale data.reference = null; // [STRING] : Identifiant de la balise convertie data.index = null; // [INT] : Identifiant du widget dans le listing data.parent = parent; // [NODE] : Conteneur global du bouton et du contenu data.button = newbutton; // [NODE] : Bouton gerant l'ouverture et la fermeture du contenu data.buttoninside = false; // [BOOLEAN] : Indicateur si le bouton est ou non un enfant du conteneur a animer data.iconbutton = null; // [NODE] : Icone flottante/independante utilisee pour le clic data.content = realcontent; // [NODE] : Contenu a afficher/masquer data.container = animatedcontent; // [NODE] : Conteneur a animer lors de l'ouverture et la fermeture data.focus = null; // [NODE] : Balise devant receptionner le focus clavier lors de l'ouverture data.clickonicon = false; // [BOOLEAN] : Indicateur d'ajout des actions de souris sur l'icone et non l'entierete du bouton data.dependencies = []; // [ARRAY] : Liste des index des panneaux a fermer lorsque le panneau s'ouvre data.indexdependency = null; // [NUMBER] : Position du conteneur accordeon au sein des dependances data.callback = {}; data.callback.beforeanim = null; // [FUNCTION] : Fonction a appeler avant l'animation de changement de l'affichage data.callback.afteranim = null; // [FUNCTION] : Fonction a appeler apres l'animation de changement de l'affichage // Sauvegarde des donnees passees par parametre data.clickonicon = Boolean(parameters.clickonicon); data.callback.beforeanim = typeof parameters.cb_beforeanim === 'function' ? parameters.cb_beforeanim : function () { return true; }; data.callback.afteranim = typeof parameters.cb_afteranim === 'function' ? parameters.cb_afteranim : function () { return true; }; // Identification du conteneur if (String(parent.id).length > 0) { data.id = parent.id; } else { i = new Date(); data.id = String('aID-' + i.getTime() + '_' + Math.random()).replace('.', '-'); } data.reference = 'accordionid_' + data.id; // Parametrage des donnees et attributs JS data.parent.dataset.expanded = false; // Suppression des liens superflus (liens d'ouverture/fermeture utilises dans la version statique sans JS) if (check$3(parameters.openbtn)) parameters.openbtn.remove(); if (check$3(parameters.closebtn)) parameters.closebtn.remove(); // Creation de la balise "icone" [+]/[-] if (data.clickonicon) { b = document.createElement('span'); b.classList.add('epjs_accordionbutton'); data.iconbutton = document.createElement('span'); data.iconbutton.append(document.createTextNode(' ')); data.iconbutton.classList.add('epjs_accordionicon'); b.append(data.iconbutton); data.button.append(b); } // Identification de la position du bouton par rapport au conteneur d'animation t = data.container.querySelectorAll('*'); m = t.length; for (i = 0; i < m; i++) { if (t[i] == data.button) { data.buttoninside = true; break; } } // Recherche de la premiere balise devant receptionner le focus t = data.content.querySelectorAll('*'); m = t.length; for (i = 0; i < m; i++) { if (t[i].getAttribute('tabindex') && t[i].getAttribute('tabindex') != '-1' || t[i].tagName.toLowerCase() == 'a' || t[i].tagName.toLowerCase() == 'input' || t[i].tagName.toLowerCase() == 'button' || t[i].tagName.toLowerCase() == 'textarea') { data.focus = t[i]; break; } } // Traitement des elements interactifs du menu t = data.content.querySelectorAll('*'); m = t.length; for (i = 0; i < m; i++) { if (t[i].getAttribute('tabindex') && t[i].getAttribute('tabindex') != '-1' || t[i].tagName.toLowerCase() == 'a' || t[i].tagName.toLowerCase() == 'input' || t[i].tagName.toLowerCase() == 'button' || t[i].tagName.toLowerCase() == 'textarea') { t[i].addEventListener('keyup', function (e) { keyboard(e, i); }, false); } } // Sauvegarde des donnees dans la classe Data$3.convertlist.push(data); Data$3.reference[data.reference] = Data$3.convertlist.length - 1; data.index = Data$3.convertlist.length - 1; i = data.index; // Deplacement des actions d'ouverture/fermeture sur le nouveau bouton data.container.addEventListener('transitionend', function (e) { endanim(e, i); }, false); data.button.addEventListener('keydown', function (e) { keyboard(e, i); }, false); if (data.clickonicon) data.iconbutton.addEventListener('click', function (e) { click(e, i); }, false);else data.button.addEventListener('click', function (e) { click(e, i); }, false); // Activation de l'etat state(data, null, true); } // Appel de la fonction "callback" apres la convertion du selecteur si demandee b = false; if (parameters != null && typeof parameters === 'object' && typeof parameters.cb_afterconvert === 'function') b = true; if (b) parameters.cb_afterconvert(data != null, data);else return { converted: data != null, data }; } // Ajout des liaisons entre les panneaux (fermeture des panneaux lorsque le panneau cible est ouvert) function setdependency(index, dependencies) { const data = Data$3.convertlist[index]; if (data != null && dependencies.length > 0) { let i; const { length } = dependencies; for (i = 0; i < length; i++) { if (dependencies[i] != index) data.dependencies.push(dependencies[i]);else data.indexdependency = data.dependencies.length - 1; } return { executed: true, data }; } return { executed: false, data: null }; } // - GESTION DES ETATS DU WIDGET - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // ETAT DU WIDGET : Appel public pour le changement d'etat function activate(reference) { if (isNaN(reference)) { state(reference, null, true); } else { state(null, reference, true); } } function desactivate(reference) { if (isNaN(reference)) { state(reference, null, false); } else { state(null, reference, false); } } // ETAT DU WIDGET : Activation et desactivation des fonctionnalites function state(data, index, active) { // Identification de l'objet de donnees if (data == null) data = Data$3.convertlist[index]; if (data == null) return; // Verification du traitement prealable du widget if (active) { if (data.parent.dataset.accordion != 'true') { delete data.parent.dataset.noanim; data.parent.dataset.accordion = true; data.parent.dataset.expanded = false; data.button.setAttribute('aria-selected', false); data.button.setAttribute('aria-expanded', false); data.button.setAttribute('aria-controls', data.content.id); data.button.setAttribute('role', 'tab'); data.content.setAttribute('aria-hidden', true); data.container.setAttribute('role', 'tablist'); data.container.setAttribute('multiselectable', true); data.container.style.height = ''; data.content.style.display = ''; data.content.style.opacity = ''; if (data.dependencies.length > 0) { data.button.setAttribute('tabindex', data.indexdependency == -1 ? 0 : -1); } else { data.button.setAttribute('tabindex', 0); } } } else { if (data.parent.dataset.accordion) { data.parent.dataset.accordion = false; data.parent.dataset.expanded = false; } delete data.parent.dataset.noanim; data.button.removeAttribute('aria-selected'); data.button.removeAttribute('aria-expanded'); data.button.removeAttribute('aria-controls'); data.button.removeAttribute('role'); data.button.removeAttribute('tabindex'); data.content.removeAttribute('aria-hidden'); data.container.removeAttribute('role'); data.container.removeAttribute('multiselectable'); data.container.style.height = ''; data.content.style.display = ''; data.content.style.opacity = ''; } } // - GESTION DES ACTIONS SUR LES ELEMENTS DU MENU - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // ACTION : Demande d'ouverture ou de fermeture via le clic "souris" sur le bouton function click(_e, index) { // Identification de l'objet de donnees const data = Data$3.convertlist[index]; if (data != null) change(data, null, false, true); } // ACTION : Demande d'ouverture ou de fermeture via la navigation clavier function keyboard(e, index) { let b; // Identification de l'objet de donnees const data = Data$3.convertlist[index]; if (data != null) { // Verification de la touche choisie let k = null; if (e.keyCode) k = e.keyCode;else if (e) k = e.which ? e.which : 0; // Identification de l'objet de l'appel if (e.target == data.button && data.dependencies.length > 0 && data.indexdependency != null) { // Titre d'un panneau if (k == 104 || k == 38 || k == 37 || k == 100) { // - - - - - - - - - - - - - - - - - - - - - - - - -> deplacement de la selection (touche "8" ou "arrow up" ou "arrow left" ou "4") if (data.indexdependency >= 0) { Data$3.convertlist[data.dependencies[data.indexdependency]].button.focus(); } b = false; } else if (k == 98 || k == 40 || k == 39 || k == 102) { // - - - - - - - - - - - - - - - - - - - - -> deplacement de la selection (touche "2" ou "arrow bottom" ou "arrow right" ou "6") if (data.indexdependency < data.dependencies.length - 1) { Data$3.convertlist[data.dependencies[data.indexdependency + 1]].button.focus(); } b = false; } else if (k == 13 || k == 32) { // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -> ouverture/fermeture du menu (touche "enter" ou "space"){ change(data, null, null, true); b = false; } else if (k == 36 || k == 35) { // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -> deplacement de la selection au debut ou la fin du menu (touche "home" ou "end"){ if (data.indexdependency < 0 && k == 36 || data.indexdependency > data.dependencies.length - 2 && k == 35) { data.button.focus(); } else { Data$3.convertlist[data.dependencies[k == 36 ? 0 : data.dependencies.length - 1]].button.focus(); } b = false; } else b = true; } else if (e.ctrlKey && (k == 38 || k == 37)) { // Element interactif de l'accordeon data.button.focus(); b = false; } else b = true; } else b = true; // Autorisation de la suite d'evenement if (b) { return true; } e.preventDefault(); return false; } // ACTION : Demande specifique d'ouverture function open(index, noaction, dependencies, noanim) { const data = Data$3.convertlist[index]; if (data != null) change(data, true, noaction, dependencies === true, false, noanim); } // ACTION : Demande specifique de fermeture function close(index, noaction, dependencies, noanim) { const data = Data$3.convertlist[index]; if (data != null) change(data, false, noaction, dependencies === true, false, noanim); } // - GESTION DE L'OUVERTURE ET FERMETURE DE PANNEAUX - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // OUVERTURE/FERMETURE : Activation et desactivation des fonctionnalites function change(data, view, noaction, dependencies, focus, noanim) { // Recherche de l'etat a afficher view = view === true || view === false ? view : !(data.parent.dataset.expanded === 'true'); // Verification du changement demande if (data.parent.dataset.accordion == 'true' && String(view) != data.parent.dataset.expanded) { // Recuperation de la hauteur reelle des liens let h = calcul(data); // Calcul de la nouvelle hauteur a definir pour l'anim via CSS const i = data.buttoninside ? data.button.offsetHeight + 'px' : 0; const t = !view ? i : h + 'px'; // Assignation de la hauteur actuelle data.parent.dataset.noanim = true; data.container.style.height = !view ? h + 'px' : i; data.content.style.display = ''; // Autorisation d'affichage data.parent.dataset.expanded = view; data.button.setAttribute('aria-selected', view); data.button.setAttribute('aria-expanded', view); data.content.setAttribute('aria-hidden', !view); // Lancement des fermetures des panneaux lies lors de l'ouverture if (view && dependencies && data.dependencies.length > 0) { h = data.dependencies.length - 1; for (h = h; h >= 0; h--) { close(data.dependencies[h], true, false); } } // Gestion du focus sur le panneau et des panneaux associes if (dependencies && data.dependencies.length > 0) { // Assignation du focus sur le panneau appelant la fonction data.button.setAttribute('tabindex', 0); // Desactivation des panneaux lies (Skip focus for other footer's menu buttons) (Bug #ENG-34202) // h = data.dependencies.length - 1; // for (h = h; h >= 0; h--) { // Data.convertlist[data.dependencies[h]].button.setAttribute('tabindex', '-1'); // } } else if (data.dependencies.length === 0) { // Activation du panneau independant data.button.setAttribute('tabindex', 0); } // Autorisation de lancement des scripts callback en debut et fin d'animation if (noaction) delete data.parent.dataset.callback;else data.parent.dataset.callback = true; // Lancement de l'affichage anime if (noanim === true) { data.container.style.height = t; } else if (noaction) setTimeout(function () { delete data.parent.dataset.noanim; data.container.style.height = t; }, 10);else if (data.callback.beforeanim(null, data, view)) setTimeout(function () { delete data.parent.dataset.noanim; data.container.style.height = t; }, 10); } } // OUVERTURE/FERMETURE : Nettoyage des styles CSS apres animation function endanim(e, index) { // Identification de l'objet de donnees const data = Data$3.convertlist[index]; if (data != null) { const a = Boolean(data.parent.dataset.callback); // Nettoyage des styles CSS de l'animation data.container.style.height = ''; data.content.style.display = ''; data.content.style.opacity = ''; delete data.parent.dataset.callback; delete data.parent.dataset.noanim; // Lancement de l'appel "callback" si besoin if (a) data.callback.afteranim(null, data, !(data.parent.dataset.expanded === 'true')); } } // OUVERTURE/FERMETURE : Calcul de la hauteur du bloc de contenu pour l'animation function calcul(data) { let height; data.parent.dataset.noanim = true; data.container.style.height = data.buttoninside ? data.button.offsetHeight + 'px' : 0; data.content.style.display = 'block'; data.content.style.opacity = '0'; height = data.content.offsetHeight; if (data.buttoninside) height += data.button.offsetHeight; data.container.style.height = ''; data.content.style.display = ''; data.content.style.opacity = ''; delete data.parent.dataset.noanim; return height; } // - GESTION DES FONCTIONS PUBLIQUES - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - const accordionHandler = { // Fonction de convertion d'un conteneur en bloc "expand/collapse" convert: convert$2, // Parametres de la fonction : Accordion.convert(container, button, animatedcontent, realcontent, params) // > container // [NODE] (mandatory) : Reference de la balise "conteneur global" comprenant le bouton et le contenu // > button // [NODE] (mandatory) : Reference de la balise "bouton" gerant l'ouverture et la fermeture du contenu. // > animatedcontent // [NODE] (mandatory) : Reference de la balise a animer lors de l'ouverture et la fermeture. // > realcontent // [NODE] (mandatory) : Reference de la balise utilisee comme reference pour la hauteur du panneau ouvert (doit etre un enfant de "animatedcontent"). // > params // [OBJECT] (optional) : Objet de personnalisation du composant // > params.clickonicon // [BOOLEAN] (default value: false) : Indicateur d'ajout des actions de souris sur l'icone et non l'entierete du bouton // > params.openbtn // [NODE] : Conteneur du bouton d'ouverture [+] d'origine (utilise sans JS) a supprimer dans la version JS // > params.closebtn // [NODE] : Conteneur du bouton de fermeture [-] d'origine (utilise sans JS) a supprimer dans la version JS // > params.cb_afterconvert // [FUNCTION] (need a return value = true) : Fonction appelee apres la convertion du bloc // > params.cb_beforeanim // [FUNCTION] (need a return value = true) : Fonction appelee avant l'animation d'ouverture ou la fermeture du bloc de contenu // > params.cb_afteranim // [FUNCTION] (need a return value = true) : Fonction appelee apres l'animation d'ouverture ou la fermeture du bloc de contenu // // Reponse de la fonction : Accordion.convert() = result // > result.converted // [BOOLEAN] : Defini si la fonctionnalite a pu etre ajoutee ou non // > result.data // [OBJECT] : Objet de donnees contenant toutes les informations du composant converti (vaut "null" si la convertion a echoue) // Fonction de liaison des autres composants "accordion" deja convertis a fermer lors de l'ouverture du composant principal setdependency, // Parametres de la fonction : Accordion.setdependency(reference, dependencies) // > reference // [NUMBER] (mandatory) : Reference (numerique) du composant converti concerne // > dependencies // [ARRAY] (mandatory) : Liste de references des composants (index "numerique") a associer lors de l'ouverture // Reponse de la fonction : Accordion.setdependency() = result // > result.executed // [BOOLEAN] : Defini si la demande a reussi ou non // > result.data // [OBJECT] : Objet de donnees contenant toutes les informations du composant // Fonction d'activation et de desactivation du composant apres convertion activate, // Parametres de la fonction : Accordion.activate(reference) // > reference // [NUMBER] (mandatory) : Reference (numerique) du composant converti a activer desactivate, // Parametres de la fonction : Accordion.desactivate(reference) // > reference // [NUMBER] (mandatory) : Reference (numerique) du composant converti a desactiver // Fonction demandant l'ouverture et fermeture d'un composant "accordion" open, // Parametres de la fonction : Accordion.open(reference, no-action, depedency, no-anim) // > reference // [NUMBER] (mandatory) : Reference (numerique) du composant converti a activer // > no-action // [BOOLEAN] (default value: false) : Defini si les fonctions "callback" doivent etre exectuee lors de l'action // > dependencies // [BOOLEAN] (default value: false) : Defini si l'action doit modifier l'etat des composants associes // > no-anim // [BOOLEAN] (default value: false) : Defini si l'action doit etre animee ou non // Fonction d'activation du composant apres convertion close // Parametres de la fonction : Accordion.close(reference, no-action, depedency, no-anim) // > reference // [NUMBER] (mandatory) : Reference (numerique) du composant converti a desactiver // > no-action // [BOOLEAN] (default value: false) : Defini si les fonctions "callback" doivent etre exectuee lors de l'action // > dependencies // [BOOLEAN] (default value: false) : Defini si l'action doit modifier l'etat des composants associes // > no-anim // [BOOLEAN] (default value: false) : Defini si l'action doit etre animee ou non }; /* eslint func-names: off, eqeqeq: off, camelcase: off, no-self-assign: off, unicorn/prefer-number-properties: off, unicorn/prevent-abbreviations: off, no-eq-null: off, max-depth: off, complexity: off, max-params: off, unicorn/prefer-query-selector: off, no-negated-condition: off, prefer-rest-params: off */ // JAVASCRIPT GERANT L'AFFICHAGE GENERIQUE DES PAGES DES SITES EUROPARL // Copyright : European Parliament // Classes JS definies dans ce fichier : // . Select : Script convertissant un selecteur presents dans l'entete en composant JavaScript // . convertion de la liste des sites "other websites" en select JS pour le mode reduit // . affichage accordeon du pied de page en mode reduit // . gestion de l'affichage sur les menus lateraux (effet parallaxe + mode accordeon) /* ============================================================================================================================================================================ */ /* === GESTION DES ACTIONS DE SUIVI PARALLAXE ================================================================================================================================= */ /* ============================================================================================================================================================================ */ const Data$2 = { convertlist: [], reference: {}, toolbar: null }; // - VALIDATION - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // VALIDATION : controle de l'objet de donnees passe en parametre function check$2(d) { if (typeof d === 'object') { if (d != null) { return d.tagName != null; } return false; } return false; } // - CONVERTION - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - function convert$1(columntarget, contenttarget, parameters) { // Initialisation des variables let i; let m; let t; let b; let l; let data = null; // Recherche des balises utiles const o = {}; o.parent = columntarget; o.component = null; if (check$2(o.parent)) { if (!o.parent.dataset.following && o.parent.classList.contains('ep_gridcolumn')) { // Analyse de la demande specifique d'une balise a suivre if (check$2(contenttarget)) { o.component = contenttarget; } else { // Recherche de la balise a animer l = []; b = null; m = o.parent.childNodes.length - 1; for (i = 0; i < m; i++) { t = o.parent.childNodes[i]; if (check$2(t) && (t.classList.contains('ep_gridrow') || t.classList.contains('ep_gridcolumn-content'))) { b = t; break; } } if (b != null) { m = b.childNodes.length - 1; for (i = 0; i < m; i++) { if (check$2(b.childNodes[i])) l.push(b.childNodes[i]); } if (l.length == 1) o.component = l[0];else o.parent = null; } else o.parent = null; } } else o.parent = null; } // Verification des balise transmises en parametre if (check$2(o.parent) && check$2(o.component)) { if (o.parent.classList.contains('ep_gridcolumn') && o.component != null) { // Recherche de la barre d'outil utilisee en survol lors du parallaxe if (Data$2.toolbar == null) { t = document.querySelector('#website-header'); if (check$2(t)) { t = t.querySelectorAll('.toolbar'); i = t.length - 1; for (i = i; i >= 0; i--) { if (t[i].classList.contains('toolbar_bottom')) { Data$2.toolbar = t[i]; break; } } } } // Initialisation de l'objet de donnees du widget data = {}; data.index = null; // [INT] : Identifiant du widget dans le listing data.reference = null; // [STRING] : Identifiant de la balise convertie data.column = o.parent; // [NODE] : Reference de la balise "colonne" contenant les elements a animer data.component = o.component; // [NODE] : Balise principale a animer // Sauvegarde des donnees dans la classe Data$2.convertlist.push(data); data.index = Data$2.convertlist.length - 1; data.reference = 'followingscrollid_' + data.index; Data$2.reference[data.reference] = data.index; data.column.dataset.following = data.index; // Ajout des evenements de mises a jour if (Data$2.convertlist.length < 2 && Data$2.toolbar != null) { document.addEventListener('scroll', function (e) { update(); }, false); window.addEventListener('resize', function (e) { update(); }, false); } } else data = null; } else data = null; // Appel de la fonction "callback" apres la convertion du selecteur si demandee b = false; if (parameters != null && typeof parameters === 'object' && typeof parameters.cb_afterconvert === 'function') b = true; if (b) parameters.cb_afterconvert(data != null, data);else return { converted: data != null, data }; } // - GESTION DE L'ACTION DE SUIVI DU SCROLL - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // AFFICHAGE : Mise a jour de l'affichage du composant function refresh$2(index, call_by_scroll) { // Calcul de la hauteur du scroll const s = Math.max(document.body.scrollTop, document.documentElement.scrollTop); // Verification de la demande : tout mettre a jour ou juste un specifique ? if (!isNaN(index) && index >= 0 && index < Data$2.convertlist.length) { parallax(s, Data$2.convertlist[index], call_by_scroll); } else { let i = Data$2.convertlist.length - 1; for (i = i; i >= 0; i--) { parallax(s, Data$2.convertlist[i], call_by_scroll); } } } function askrefresh(index) { if (arguments.length == 1 || arguments.length == 2 && typeof arguments[0] === 'object') { refresh$2(arguments[1], false); } else { refresh$2(index, false); } } // AFFICHAGE : Repositionnement du composant selon le scroll de la page function parallax(scrollposition, data, delay) { let y = 0; const height = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight; let morey = 0; const limit = { height: 0, y: 0 }; const target = { height: 0, y: 0 }; // Calcul de la hauteur du composant et de la zone visible target.y = data.component.offsetTop; target.height = data.component.offsetHeight; limit.y = data.column.offsetTop; limit.height = data.column.offsetHeight; // Correction du scroll (prise en compte de la hauteur de la barre d'outil parallaxe) if (document.body.dataset.headerparallax) { morey = Data$2.toolbar.offsetHeight; } // Analyse de la hauteur du composant if (target.height < limit.height) { if (target.height > height) { // Calcul de la position a assigner au composant if (target.y + target.height > scrollposition + height) { y = 0; } else if (scrollposition + height < limit.y + limit.height) { y = Math.max(0, scrollposition + height - (target.y + target.height)); } else { y = Math.max(0, limit.height - target.height); } } else { // Calcul de la position a assigner au composant y = Math.max(0, Math.min(limit.height - target.height, scrollposition + morey - limit.y + 60)); } } else { y = 0; } // Definition du delais d'animation (si la fonction est bien appelee par les evenements de scroll) data.component.style.transitionDelay = delay ? '' : '0s'; // Assignation du la nouvelle coordonnee data.component.style.transform = 'translate(0, ' + y + 'px)'; data.component.style.webkitTransform = 'translate(0, ' + y + 'px)'; } // Appel de l'action par la fonction elle-meme function update(_e) { refresh$2(-1, true); } // - GESTION DES FONCTIONS PUBLIQUES - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - const FollowingScroll = { // Fonction d'ajout de la fonctionnalite de suivi du scroll a un composant HTML selon les limites de la colonne convert: convert$1, // Parametres de la fonction : FollowingScroll.convert(container, reference, params) // > container // [NODE] (mandatory) : Reference de la balise "colonne" contenant le bloc a manipuler // > reference // [NODE] (mandatory) : Reference de la balise a manipuler // > params // [OBJECT] (optional) : Objet de personnalisation du composant // > params.cb_afterconvert // [FUNCTION] (need a return value = true) : Fonction appelee apres la convertion du bloc // // Reponse de la fonction : FollowingScroll.convert() = result // > result.converted // [BOOLEAN] : Defini si la fonctionnalite a pu etre ajoutee ou non // > result.data // [OBJECT] : Objet de donnees contenant toutes les informations du composant converti (vaut "null" si la convertion a echoue) // Fonction de mise a jour de la position du composant refresh: askrefresh // Parametres de la fonction : FollowingScroll.refresh(reference) // > reference // [NUMBER] (optional) : Reference du composant a manipuler (si non mentionne, tous les composants convertis seront mise a jour) }; /* eslint func-names: off, eqeqeq: off, camelcase: off, no-self-assign: off, unicorn/prefer-number-properties: off, unicorn/prevent-abbreviations: off, no-eq-null: off, max-depth: off, complexity: off, max-params: off, unicorn/prefer-query-selector: off, no-negated-condition: off, prefer-rest-params: off */ const Data$1 = { convertlist: [], reference: {}, toolbar: null }; // - VALIDATION - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // VALIDATION : controle de l'objet de donnees passe en parametre function check$1(d) { if (typeof d === 'object') { if (d != null) { return d.tagName != null; } return false; } return false; } // - CONVERTION - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - function convert(target, parameters) { // Initialisation des variables let i; let t; let b; let f; let r; let data = null; // Recherche des balises utiles const o = {}; o.parent = target; o.menu = null; o.sections = []; if (check$1(o.parent)) { if (!o.parent.dataset.tableofcontent) { // Recherche de la balise parent t = o.parent.querySelectorAll('.ep_tableofcontent-menu'); if (t.length > 0) o.menu = t[0]; } else { o.parent = null; } } // Verification des balise transmises en parametre if (check$1(o.parent) && check$1(o.menu)) { // Definition de la recherche des balises pour l'affichage en accordeon f = function (f_tagparent) { let f_t; let f_i; // Initialisation de l'objet de donnees const f_d = { parent: f_tagparent, title: null, ticon: null, open: null, close: null, content: null, list: null }; // Recherche des liens d'ouverture/fermeture sans JS f_t = f_d.parent.querySelectorAll('.ep_menu-access'); f_i = f_t.length - 1; for (f_i = f_i; f_i >= 0; f_i--) { if (f_t[f_i].classList.contains('ep_openaccess')) f_d.open = f_t[f_i];else if (f_t[f_i].classList.contains('ep_closeaccess')) f_d.close = f_t[f_i]; if (f_d.open != null && f_d.close != null) break; } // Recherche du titre du bloc pour la convertion en lien d'ouverture/fermeture via JS f_t = f_d.parent.querySelectorAll('.ep_title'); if (f_t.length > 0) { f_d.title = f_t[0]; } // Recherche du bloc de contenu a deployer f_t = f_d.parent.querySelectorAll('.ep_list'); if (f_t.length > 0) { f_d.content = f_t[0]; f_t = f_d.content.querySelectorAll('ul'); if (f_t.length > 0) { f_d.list = f_t[0]; } } // Envoi du resultat return check$1(f_d.parent) && check$1(f_d.title) && check$1(f_d.open) && check$1(f_d.close) && check$1(f_d.content) && check$1(f_d.list) ? f_d : null; }; // Recherche des sections du menu a convertir en accordeon t = o.menu.querySelectorAll('.ep_content'); i = t.length - 1; for (i = i; i >= 0; i--) { r = f(t[i]); if (r != null) o.sections.push(r); } // Verification des donnees obtenues if (o.parent.classList.contains('ep_gridcolumn') && o.menu != null) { // Initialisation de l'objet de donnees du widget data = {}; data.index = null; // [INT] : Identifiant du widget dans le listing data.reference = null; // [STRING] : Identifiant de la balise convertie data.column = o.parent; // [NODE] : Reference de la balise [colonne] parente au menu data.menu = o.menu; // [NODE] : Balise principale du menu data.items = []; // [ARRAY] : Liste des references des sections [+]/[-] // Sauvegarde des donnees dans la classe Data$1.convertlist.push(data); data.index = Data$1.convertlist.length - 1; data.reference = 'tableofcontentid_' + data.index; Data$1.reference[data.reference] = data.index; data.column.dataset.tableofcontent = data.index; data.column.classList.remove('ep-layout_followingscroll'); // Autorisation de l'affichage visuel data.menu.dataset.converted = true; // Traitement du suivi du menu t = FollowingScroll.convert(o.parent, o.menu, null); if (t.converted) data.follow = t.data.index; // Convertion de la liste des elements en mode accordeon [+]/[-] if (o.sections.length > 0) { r = null; i = o.sections.length - 1; i = o.sections.length - 1; for (i = i; i >= 0; i--) { t = accordionHandler.convert(o.sections[i].parent, // Reference du conteneur global o.sections[i].title, // Reference du nouveau bouton d'ouverture [+]/[-] (conteneur global) o.sections[i].content, // Reference du conteneur a animer o.sections[i].list, // Reference de la liste generale des liens { openbtn: o.sections[i].open, // Reference de la balise du bouton d'ouverture d'origine a supprimer closebtn: o.sections[i].close, // Reference de la balise du bouton de fermeture d'origine a supprimer cb_afteranim(_e) { refresh$1(data.follow); } // Fonction a appeler lors de la fin de l'animation d'ouverture/fermeture }); if (t.converted) { data.items.push(t.data.index); if (o.sections[i].parent.dataset.selected == 'true') r = t.data.index; } } } // Ajout des dependances entre les sections i = data.items.length; for (i = i; i >= 0; i--) { accordionHandler.setdependency(data.items[i], data.items); } // Ouverture du menu selectionne lors de l'initialisation de la page if (r != null) accordionHandler.open(r, true, true, true); } else data = null; } // Appel de la fonction "callback" apres la convertion du selecteur si demandee b = false; if (parameters != null && typeof parameters === 'object' && typeof parameters.cb_afterconvert === 'function') b = true; if (b) parameters.cb_afterconvert(data != null, data);else return { converted: data != null, data }; } // - GESTION DE L'OUVERTURE ET FERMETURE DE PANNEAUX - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // AFFICHAGE : Mise a jour de l'affichage du menu function refresh$1(index) { index = arguments.length[2] && typeof arguments[1] === 'object' ? arguments[2] : arguments[1]; if (!isNaN(index) && index >= 0 && index < Data$1.convertlist.length) { FollowingScroll.refresh(Data$1.convertlist[index]); } else { let i = Data$1.convertlist.length - 1; for (i = i; i >= 0; i--) { FollowingScroll.refresh(Data$1.convertlist[i]); } } } // - GESTION DES FONCTIONS PUBLIQUES - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - const TableOfContent = { // Fonction ajoutant les fonctionnalites au menu "Table of Content" convert, // Parametres de la fonction : TableOfContent.convert(reference, params) // > reference // [NODE] (mandatory) : Reference de la balise "menu" // > params // [OBJECT] (optional) : Objet de personnalisation du composant // > params.cb_afterconvert // [FUNCTION] (need a return value = true) : Fonction appelee apres la convertion du bloc // // Reponse de la fonction : TableOfContent.convert() = result // > result.converted // [BOOLEAN] : Defini si la fonctionnalite a pu etre ajoutee ou non // > result.data // [OBJECT] : Objet de donnees contenant toutes les informations du composant converti (vaut "null" si la convertion a echoue) // Fonction de mise a jour de la position (scroll) du composant refresh: refresh$1 // Parametres de la fonction : TableOfContent.refresh(reference) // > reference // [NUMBER] (optional) : Reference du composant a manipuler (si non mentionne, tous les composants convertis seront mise a jour) }; /* eslint func-names: off, eqeqeq: off, camelcase: off, no-self-assign: off, unicorn/prefer-number-properties: off, unicorn/prevent-abbreviations: off, no-eq-null: off, max-depth: off, complexity: off, max-params: off, unicorn/prefer-query-selector: off, no-negated-condition: off, prefer-rest-params: off */ // JAVASCRIPT GERANT L'AFFICHAGE GENERIQUE DES PAGES DES SITES EUROPARL // Copyright : European Parliament // Classes JS definies dans ce fichier : // . Select : Script convertissant un selecteur presents dans l'entete en composant JavaScript // . convertion de la liste des sites "other websites" en select JS pour le mode reduit // . affichage accordeon du pied de page en mode reduit // . gestion de l'affichage sur les menus lateraux (effet parallaxe + mode accordeon) /* ============================================================================================================================================================================ */ /* === EXPAND/COLLAPSE (Version 2 [+]/[-]) =============================================================================================================== */ /* ============================================================================================================================================================================ */ function expandQuestions() { const headings = document.querySelectorAll('.ep_expand-title'); Array.prototype.forEach.call(headings, function (h) { const btn = h.querySelector('.ep_expand-trigger'); const target = h.nextElementSibling; let button; let div; if (h.closest('.ep_item').classList.contains('ep_expand') && !h.closest('.ep_item').classList.contains('loaded-question')) { button = h.parentNode.querySelectorAll('button')[0]; button.dataset.expanded = true; button.setAttribute('aria-expanded', true); div = h.parentNode.querySelectorAll('.ep_expand-content')[0]; div.removeAttribute('hidden'); h.closest('.ep_item').classList.add('loaded-question'); } else if (h.closest('.ep_item').classList.contains('ep_wrapper-expand-collapse') && !h.closest('.ep_item').classList.contains('loaded-question')) { h.closest('.ep_item').classList.remove('ep_wrapper-expand-collapse'); button = h.parentNode.querySelectorAll('button')[0]; button.dataset.expanded = false; button.setAttribute('aria-expanded', false); div = h.parentNode.querySelectorAll('.ep_expand-content')[0]; div.setAttribute('hidden', true); h.closest('.ep_item').classList.add('loaded-question'); } function handleClick(event) { const wrapperExpand = event.target.closest('.ep_item'); const wrapperExpandStyle = wrapperExpand.classList.contains('ep_wrapper-expand-collapse'); const expanded = btn.getAttribute('aria-expanded') === 'true'; const expandedData = btn.dataset.expanded === 'true'; if (wrapperExpandStyle) { wrapperExpand.classList.remove('ep_wrapper-expand-collapse'); } else { wrapperExpand.classList.add('ep_wrapper-expand-collapse'); } btn.setAttribute('aria-expanded', !expanded); btn.dataset.expanded = !expandedData; target.hidden = expanded; } if (btn && !btn.classList.contains('has-click-handler')) { btn.classList.add('has-click-handler'); btn.addEventListener('click', handleClick); } }); } /* global define */ /* ============================================================================================================================================================================ */ /* === INITIALISATION DES FONCTIONNALITES DU SITE ============================================================================================================================= */ /* ============================================================================================================================================================================ */ const Data = {}; Data.initscript = true; // Indicateur d'ajout d'evenement Data.toolbar = null; // Donnees utiles pour l'affichage parallaxe de l'entete du site Data.language = null; // Donnees utiles pour la convertion du selecteur linguistique Data.otherwebsites = null; // Donnees utiles pour la convertion du selecteur des autres sites Data.navigation = null; // Donnees utiles pour l'ouverture/fermeture du menu de navigation Data.search = null; // Donnees utiles pour l'ouverture/fermeture du menu de recherche Data.footer = null; // Donnees utiles pour l'ouverture/fermeture du pied de page Data.tableofcontent = null; // Donnees utiles pour l'ouverture/fermeture du menu sommaire (optionnel) Data.accordions = null; // Donnees utiles pour la convertion des boites en accordeon Data.timer = 0; // Interval pour les mouvements de scroll // - VALIDATION - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // VALIDATION : controle de la balise de donnees passe en parametre function check(d) { if (typeof d === 'object') { if (d != null) { return d.tagName != null; } return false; } return false; } // - INITIALISATION - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - function init(e) { let i; let d; let t; let r; let m; let f; let o; // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // Activation des traitements JavaScript document.body.dataset.jsactive = true; // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // Identification du type de support utilise pour la lecture ecran // Liste des appareils mobiles reconnus m = ['android', 'avantgo', 'blackberry', 'blazer', 'eudoraweb', 'handspring', 'htc', 'iphone', 'ipad', 'ipod', 'kyocera', 'lg', 'motorola', 'netfront', 'nokia', 'palm', 'playstation portable', 'samsung', 'smartphone', 'sonyericsson', 'symbian', 'wap', 'windows ce']; i = ['iphone', 'ipad', 'ipod']; // Identification du navigateur et de l'OS d = navigator.userAgent; d = String(d).toLowerCase(); // Recherche du navigateur dans la liste t = m.length - 1; for (t = t; t >= 0; t--) { if (d.includes(m[t])) { document.body.dataset.ismobile = true; break; } } if (document.body.dataset.ismobile) { t = i.length - 1; for (t = t; t >= 0; t--) { if (d.includes(i[t])) { document.body.dataset.ios = true; break; } } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - let wailinks = null; const site = document.querySelector('#website'); const content = document.querySelector('#website-body'); if (check(site)) { // MENU RACCOURCIS : Recherche du conteneur t = document.querySelector('#waimenu'); if (check(t)) { wailinks = t.querySelectorAll('a'); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // BARRE D'OUTILS : Recherche des balises (superieure et inferieure) d = { top: null, bottom: null }; t = site.querySelectorAll('.toolbar'); i = t.length - 1; for (i = i; i >= 0; i--) { if (t[i].classList.contains('toolbar_top')) d.top = t[i];else if (t[i].classList.contains('toolbar_bottom')) d.bottom = t[i]; if (d.top != null && d.bottom != null) break; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // BARRE D'OUTILS : Traitement de la barre superieure (menu linguistique) if (Data.language == null && d.top != null) { // Convertion du menu linguistique original t = document.querySelector('#language-select'); if (check(t)) { o = selectHandler.convert(t, { autoexecute: true }); if (o.converted) Data.language = o.data; } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // BARRE D'OUTILS : Traitement de la barre superieure (autres planetes) if (Data.otherwebsites == null && d.top != null) { // Duplication du menu "autres sites" par un selecteur JS pour les petites resolutions t = document.querySelector('#otherwebsites'); if (check(t)) { r = { parent: t, list: null, links: null, placeholder: null }; t = r.parent.querySelectorAll('ol'); if (t.length > 0) t = t[0]; if (check(t)) { // Fonction temporaire du traitement des liens f = function (f_id, f_parent, f_placeholder, f_links) { let f_m; let f_i; let f_o; // Creation du selecteur const f_t = document.createElement('select'); f_t.setAttribute('id', f_id + '-selectmobile'); f_t.setAttribute('aria-labelledby', f_id + '-label'); f_t.classList.add('ep_field'); // Nettoyage du texte du placeholder f_i = f_placeholder.querySelectorAll('.ep_name')[0]; f_m = f_i.querySelectorAll('span'); if (f_m.length > 0) { f_i = ''; for (f_o = 0; f_o < f_m.length; f_o++) { if (!f_m[f_o].classList.contains('ep_hidden')) f_i += f_m[f_o].innerHTML; } } else { f_i = f_i.innerHTML; } // Creation du placeholder f_o = document.createElement('option'); f_o.setAttribute('value', 'placeholder'); f_o.setAttribute('selected', 'selected'); f_o.setAttribute('disabled', 'disabled'); f_o.dataset.target = '_self'; f_o.append(document.createTextNode(f_i)); f_t.append(f_o); // Integration des valeurs f_m = f_links.length; for (f_i = 0; f_i < f_m; f_i++) { f_o = document.createElement('option'); f_o.setAttribute('value', f_links[f_i].href); f_o.dataset.target = f_links[f_i].getAttribute('target') == '_blank' ? '_blank' : '_self'; if (f_links[f_i].getAttribute('title')) f_o.setAttribute('title', f_links[f_i].getAttribute('title')); f_o.append(document.createTextNode(f_links[f_i].querySelectorAll('.ep_name')[0].innerHTML)); f_t.append(f_o); } // Creation des balises de contenu f_i = document.createElement('div'); f_i.classList.add('ep_select'); f_i.append(f_t); f_m = document.createElement('form'); f_m.setAttribute('id', f_id + '-formmobile'); f_m.setAttribute('method', 'get'); f_m.setAttribute('action', ''); f_m.classList.add('epjs_mobile'); f_m.append(f_i); // Integration du selecteur f_parent.append(f_m); // Convertion du selecteur f_i = selectHandler.convert(f_t, { autoexecute: true, cb_selection(selectdata) { selectdata.form.action = selectdata.original.value; selectdata.form.target = selectdata.options[selectdata.original.selectedIndex].original.dataset.target; selectHandler.updateselection(selectdata, 'placeholder', false); if (selectdata.form.target == '_blank') window.open(selectdata.form.action);else location.href = selectdata.form.action; return false; } }); // Autorisation d'acces pour la version mobile if (f_i.converted) { f_parent.dataset.converted = true; return f_i.data.index; } return null; }; // Recherche des liens a integrer r.list = t; t = r.list.querySelectorAll('.ep_item'); if (t.length > 0) { r.links = []; m = t.length; for (i = 0; i < m; i++) { o = t[i].querySelectorAll('a'); if (o[0].classList.length === 0) { r.links.push(o[0]); } } } // Recherche du libelle pour le placeholder t = document.querySelector('#otherwebsites-access'); if (check(t)) r.placeholder = t; // Verification de l'acces aux differentes donnees if (r.parent != null && r.links != null && r.placeholder != null) { // Initialisation de l'objet de donnees Data.otherwebsites = { main: null, more: null }; // Traitement du selecteur principal utilise en petite resolution Data.otherwebsites.main = f('otherwebsites', r.parent, r.placeholder, r.links); // Traitement du second selecteur pour les grandes resolutions uniquement t = document.querySelector('#more-otherwebsites'); if (check(t)) { r = { parent: t, list: null, links: null, placeholder: null }; // Recherche du placeholder t = document.querySelector('#more-otherwebsites-access'); if (check(t)) r.placeholder = t; // Recherche des liens t = r.parent.querySelectorAll('ol'); if (t.length > 0) t = t[0]; if (check(t)) { t = t.querySelectorAll('a'); if (t.length > 0) r.links = t; } // Traitement du selecteur if (r.parent != null && r.links != null && r.placeholder != null) { Data.otherwebsites.more = f('more-otherwebsites', r.parent, r.placeholder, r.links); } // Verification de la convertion des listes if (Data.otherwebsites.main == null && Data.otherwebsites.more == null) { Data.otherwebsites = null; } else { if (Data.otherwebsites.main != null) setTimeout(function () { selectHandler.resize(Data.otherwebsites.main); }, 50); if (Data.otherwebsites.more != null) setTimeout(function () { selectHandler.resize(Data.otherwebsites.more); }, 50); } } } } } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // BARRE D'OUTILS : Traitement de la barre inferieure (effet parallaxe) // I'm commmenting this out to avoid the instanciation of Data.toolbar in this function (window.init). // The goal is to prevent bogus interactions with the refactored header // tmk [2022-07-08] // if (Data.toolbar == null && d.bottom != null) { // // Recherche de la balise 'header' situee au dessus de la barre d'outil (balise utile pour le calcul du scroll minimum avant d'activer le parallaxe) // t = document // .querySelector('#website-header') // .querySelectorAll('.ep_header')[0]; // // Effet Parallaxe : Initialisation de l'objet de donnees // Data.toolbar = {}; // Data.toolbar.bar = d.bottom; // Reference de la balise de la barre // Data.toolbar.scrollsize = 0; // Valeur de la hauteur de la scrollbar // Data.toolbar.page = document.body; // Cible pour l'ajout du parametre de traitement // Data.toolbar.header = t; // Reference de la hauteur minimum pour l'activation du parallaxe // } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // BARRE D'OUTILS : Traitement de la barre inferieure (moteur de recherche) if (Data.search == null && Data.toolbar != null) { // Traitement du moteur de recherche m = document.querySelector('#search'); if (check(m)) { t = document.querySelector('#search-field'); d = m.querySelectorAll('.ep_send'); d = d.length > 0 ? d[0] : null; r = m.querySelectorAll('.ep_title'); r = r.length > 0 ? r[0] : null; if (check(t) && check(d) && check(r)) { // Initialisation de l'objet de donnees Data.search = {}; Data.search.reducemode = false; // Definition du mode d'affichage du menu : deploye (false) ou reduit (true) Data.search.scanmode = 0; // Indicateur de scan de l'etat du champ lorsque le focus est assigne au champ Data.search.timer = 0; // Timer pour l'attente avant la cloture du menu Data.search.parent = m.parentNode; // Reference au menu Data.search.form = m; // Reference au formulaire Data.search.field = t; // Reference au champ texte Data.search.button = d; // Reference au bouton d'execution du formulaire Data.search.access = r; // Reference au bouton d'ouverture/fermeture Data.search.animate = Data.search.field.parentNode.parentNode; // Reference du conteneur a animer // Suppression des liens d'ouverture/fermeture indesirables t = Data.search.parent.querySelectorAll('.ep_menu-access'); if (t.length > 1) t[1].remove(); if (t.length > 0) t[0].remove(); // Activation des mises a jour visuelles Data.search.parent.dataset.converted = true; // Traitement des balises pour l'ouverture et la fermeture du menu Data.search.access.setAttribute('tabindex', 0); Data.search.access.setAttribute('aria-expanded', false); Data.search.access.setAttribute('aria-controls', 'search-contentform'); // Data.search.animate.setAttribute('aria-hidden', true); Data.search.animate.setAttribute('id', 'search-contentform'); // Ajout des evenements pour l'ouverture et la fermeture du menu Data.search.access.addEventListener('click', search_display, false); Data.search.animate.addEventListener('transitionend', search_focus, false); Data.search.button.addEventListener('focus', search_button, false); Data.search.button.addEventListener('blur', search_button, false); // Ajout des evenements pour l'activation ou non du formulaire selon le contenu du champ texte Data.search.form.addEventListener('submit', search_submit, false); // Ajout de l'evenement pour la navigation clavier Data.search.form.addEventListener('keydown', search_key, true); Data.search.form.addEventListener('keyup', search_validation, true); Data.search.field.addEventListener('focus', search_scan, false); Data.search.field.addEventListener('blur', search_scan, false); // Ajout des evenements pour la fermeture du menu via clic hors de la zone t = Data.search.parent.querySelectorAll('*'); r = t.length - 1; Data.search.parent.classList.add('epjs_search'); for (r = r; r >= 0; r--) { t[r].classList.add('epjs_search'); } document.addEventListener('touchstart', search_check, false); document.addEventListener('click', search_check, false); // Verification de l'acces au formulaire search_validation(); } } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // BARRE D'OUTILS : Traitement de la barre inferieure (menu de navigation) if (Data.navigation == null && Data.toolbar != null) { d = { parent: null, display: { parent: null, content: null, open: null, close: null }, links: null }; // Recherche des balises t = document.querySelector('#navigation'); if (check(t)) { d.parent = t; // Recherche des liens d'ouverture/fermeture du menu t = d.parent.querySelectorAll('.ep_menu-access'); i = t.length - 1; for (i = i; i >= 0; i--) { if (t[i].classList.contains('ep_openaccess')) d.display.open = t[i];else if (t[i].classList.contains('ep_closeaccess')) d.display.close = t[i]; if (d.display.open != null && d.display.close != null) break; } // Recherche du conteneur principal a animer t = d.parent.querySelectorAll('.ep_menu-container'); if (t.length > 0) { d.display.parent = t[0]; // Recherche du conteneur de lien t = d.display.parent.childNodes.length; for (i = 0; i < t; i++) { if (check(d.display.parent.childNodes[i]) && d.display.parent.childNodes[i].tagName.toLowerCase() == 'div') { d.display.content = d.display.parent.childNodes[i]; break; } } // Recherche de la liste des liens du menu (par niveau) if (d.display.content != null) { t = d.display.content.querySelectorAll('.ep_menu'); if (t.length > 0) { t = t[0]; d.links = { parent: t, list: { all: [], level0: [], level1: [], level2: [] }, ismenu: { level0: [], level1: [], level2: [] } }; // Creation de la fonction de recuperation de noeud selon la profondeur f = function (f_parentnode, f_parentlevel, f_parentindex) { let f_i; let f_m; let f_t = f_parentnode.querySelectorAll('ol'); if (f_t.length > 0) { f_t = f_t[0]; f_m = f_t.childNodes.length; for (f_i = 0; f_i < f_m; f_i++) { if (check(f_t.childNodes[f_i])) { if (f_t.childNodes[f_i].classList.contains('ep_item') && f_t.childNodes[f_i].classList.contains('ep_directlink')) { d.links.list.all.push({ ismenu: false, tag: f_t.childNodes[f_i], level: f_parentlevel, parent: f_parentindex, children: [], order: d.links.list['level' + f_parentlevel].length }); d.links.list['level' + f_parentlevel].push(d.links.list.all.length - 1); if (f_parentindex != null) d.links.list.all[f_parentindex].children.push(d.links.list.all.length - 1); } else if (f_t.childNodes[f_i].classList.contains('ep_item') && f_t.childNodes[f_i].classList.contains('ep_hasmenu')) { d.links.list.all.push({ ismenu: true, tag: f_t.childNodes[f_i], level: f_parentlevel, parent: f_parentindex, children: [], order: d.links.list['level' + f_parentlevel].length }); d.links.ismenu['level' + f_parentlevel].push(d.links.list.all.length - 1); d.links.list['level' + f_parentlevel].push(d.links.list.all.length - 1); if (f_parentindex != null) d.links.list.all[f_parentindex].children.push(d.links.list.all.length - 1); } } } } }; // Identification des balises de liens du premier niveau selon les criteres f(t, 0, null); // Identification des balises de liens du second niveau selon les criteres if (d.links.ismenu.level0.length > 0) { m = d.links.ismenu.level0.length; for (i = 0; i < m; i++) { t = d.links.list.all[d.links.ismenu.level0[i]]; f(t.tag, 1, d.links.ismenu.level0[i]); } } // Identification des balises de liens du troisieme niveau selon les criteres if (d.links.ismenu.level1.length > 0) { m = d.links.ismenu.level1.length; for (i = 0; i < m; i++) { t = d.links.list.all[d.links.ismenu.level1[i]]; f(t.tag, 2, d.links.ismenu.level1[i]); } } // Verification de la quantite de liens obtenus if (d.links.list.all.length <= 0) d.links = null; } } } } // Verification de l'acces aux balises if (d.parent != null && d.display.parent != null && d.display.content != null && d.display.open != null && d.display.close != null && d.links != null) { // Recherche du tag "categorie" optionnel a afficher en parallaxe // Initialisation de l'objet de donnees Data.navigation = {}; // General Data.navigation.menu = d.parent; // Reference du conteneur principal du menu Data.navigation.page = document.querySelector('#website'); // Reference de la page pour le deplacement du scroll dans la navigation parallaxe Data.navigation.headerpage = Data.toolbar.header; // Reference de l'entete de la page pour le deplacement lors de la suppression de la scrollbar Data.navigation.headerbar = Data.navigation.menu.parentNode; // Reference du conteneur de la barre de navigation pour l'alignement de l'effet parallaxe lors de la suppression de la scrollbar Data.navigation.bodypage = document.querySelector('#website-body'); // Reference du corps de la page pour le deplacement lors de la suppression de la scrollbar Data.navigation.footerpage = document.querySelector('#website-footer'); // Reference du pied de la page pour le deplacement lors de la suppression de la scrollbar // Donnees utiles pour la version reduite Data.navigation.anim = d.display.content; // Reference du conteneur a animer Data.navigation.menuaccess = null; // Reference du bouton d'ouverture et fermeture du menu reduit Data.navigation.filter = null; // Reference du selecteur du filtre du menu Data.navigation.focus = []; // Reference des balises a cibler lors de l'assignation du focus Data.navigation.scrollfollow = false; // Indicateur du suivi du scroll manuel sur le menu Data.navigation.cursorY = 0; // Position initial du curseur lors du debut du scroll Data.navigation.scrollY = 0; // Position initial du scroll du menu lors du debut du deplacement Data.navigation.scrollratio = 0; // Ratio entre la hauteur du menu et la hauteur de la page Data.navigation.access = null; // Reference du bouton ayant appele pour la navigation clavier // Donnees utiles pour la version deployee Data.navigation.bar = d.links.parent; // Reference du conteneur des liens Data.navigation.links = null; // Liste des index et balises de tous les elements du menu Data.navigation.ismenu = null; // Reference des index des liens de type "menu" Data.navigation.selectedlink = null; // Index du lien actuellement accessible via clavier (focus) // Ajout du parametre indiquant le traitement du menu Data.navigation.menu.dataset.converted = true; // Ajout de l'action d'ecoute pour les clics hors du menu reduit et/ou deploye document.addEventListener('click', navigation_checkclick, false); // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GENERAL // Convertion du selecteur de filtre (si present) t = Data.navigation.menu.querySelectorAll('.ep_menu-filter'); if (t.length > 0) { t = t[0]; // Recherche des balises de selection t = t.querySelectorAll('select'); if (t.length > 0) { t = selectHandler.convert(t[0], { autoexecute: true, openbykeyboard: false }); if (t.converted) { Data.navigation.filter = t.data; // Redimensionnement du selecteur pour Firefox navigation_select(); } } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AFFICHAGE DU MENU PRINCIPAL (version reduite) // Suppression des boutons d'ouverture et de fermeture du menu inutile pour la version JS t = d.display.open.querySelectorAll('a'); if (t.length > 0) t[0].parentNode.remove(); t = d.display.close.querySelectorAll('a'); if (t.length > 0) t[0].parentNode.remove(); // Ajout de la classe CSS utile pour la gestion d'ouverture/fermeture du menu t = Data.navigation.menu.querySelectorAll('*'); i = t.length - 1; for (i = i; i >= 0; i--) { t[i].classList.add('epjs_navigation'); } // Sauvegarde du bouton d'acces au menu Data.navigation.menuaccess = d.display.open.querySelectorAll('.ep_button')[0].parentNode; Data.navigation.menuaccess.setAttribute('tabindex', '0'); // Ajout des actions sur le bouton d'acces pour l'ouverture du menu reduit Data.navigation.menuaccess.addEventListener('click', navigation_switch, false); Data.navigation.menuaccess.addEventListener('keydown', navigation_access, false); // Recherche du premier element cliquable du menu pour la gestion du focus entrant et sortant en mode reduit t = Data.navigation.anim.querySelectorAll('.ep_category'); if (t.length > 0) { t = t[0]; if (t.querySelectorAll('a').length > 0) Data.navigation.focus[0] = { type: 'category', tag: t.querySelectorAll('a')[0] }; } if (Data.navigation.focus[0] == null) Data.navigation.focus[0] = { type: 'menu', tag: null };else Data.navigation.focus[0].tag.addEventListener('keydown', navigation_keyboard, false); if (Data.navigation.filter != null) { Data.navigation.focus[1] = { type: 'filter', tag: document.getElementById(Data.navigation.filter.button.text.id) }; } if (Data.navigation.focus[1] == null) Data.navigation.focus[1] = { type: 'menu', tag: null };else Data.navigation.focus[1].tag.addEventListener('keydown', navigation_keyboard, false); // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AFFICHAGE DU MENU PRINCIPAL (version deployee) // Initialisation de l'objet de donnees temporaires pour le traitement des liens du "treeview" o = {}; o.links = { all: [], level0: [], level1: [], level2: [] }; // Reference des index et balises de tous les elements du menu o.ismenu = { all: [], level0: [], level1: [], level2: [] }; // Reference des index des liens de type "menu" // Traitement de tous les liens obtenus m = d.links.list.all.length; for (i = 0; i < m; i++) { t = d.links.list.all[i]; // Recuperation du lien principal (ouverture du menu ou acces au site) r = t.tag.querySelectorAll('.ep_button'); t.button = r.length > 0 ? r[0] : null; if (t.button != null) { r = t.ismenu ? t.button.querySelectorAll('span') : t.button.querySelectorAll('a'); t.button = r.length > 0 ? r[0] : null; } // Stockage des informations o.links.all.push({ index: o.links.all.length, // Index du lien dans la liste block: t.tag, // Reference a la balise du lien ismenu: t.ismenu, // Type de element du menu (lien direct ou sous-menu) level: t.level, // Niveau de profondeur du lien dans le menu de navigation parent: t.parent, // Index de l'element parent ("null" s'il ne fait pas partie d'un sous-menu) children: t.children, // Index des elements enfant button: t.button, // Reference a la balise servant de lien ou d'ouverture/fermeture du menu animtag: null, // Reference a la balise d'animation d'ouverture/fermeture de contenu list: null, // Reference a la balise de contenu de liens order: t.order // Position de la balise dans la liste par niveau }); // Sauvegarde de l'element par niveau o.links['level' + t.level].push(i); // Traitement des liens de type "menu" if (t.ismenu) { // Stockage de l'information o.ismenu.all.push(i); o.ismenu['level' + t.level].push(i); } } d = false; // Traitement des liens "menu" par niveau if (o.ismenu.all.length > 0) { d = true; m = o.ismenu.all.length; for (i = 0; i < m; i++) { t = o.links.all[o.ismenu.all[i]]; // Recherche des balises utiles pour l'affichage en accordeon r = t.block.querySelectorAll('ol'); if (r.length > 0) { t.list = r[0]; t.animtag = r[0].parentNode; } // Correction des liens de premier niveau if (t.level == 0) { // Recherche des balises ouvrantes et fermantes du menu a supprimer (inutile pour la gestion en "treeview") r = t.block.querySelectorAll('.ep_closeaccess'); if (r.length > 0) r[0].remove(); r = t.block.querySelectorAll('.ep_openaccess'); if (r.length > 0) { r = r[0]; r.classList.remove('ep_openaccess'); r = r.querySelectorAll('a'); if (r.length > 0) { r[0].parentNode.setAttribute('id', r[0].id); r[0].remove(); } } } // Verification de l'acces aux balises if (t.button == null || t.animtag == null || t.list == null) { d = false; break; } } } // Traitement du menu if (o.links.all.length > 0) { // Sauvegarde des valeurs obtenues Data.navigation.links = o.links; Data.navigation.ismenu = o.ismenu; // Traitement des elements du menu selon les niveaux m = Data.navigation.links.all.length; for (let i = 0; i < m; i++) { d = Data.navigation.links.all[i]; // Ajout des references a la balise d.block.dataset.navindex = i; d.button.dataset.navindex = i; d.button.parentNode.dataset.navindex = i; // Ajout des parametres d'accessibilite d.block.removeAttribute('tabindex'); d.button.setAttribute('tabindex', '-1'); // Gestion du mode "menu" if (d.ismenu) { // Ajout de l'identification du bloc d.animtag.dataset.navindex = i; d.list.dataset.navindex = i; // Ajout des parametres de fermeture d.block.setAttribute('aria-expanded', false); // Ajout des actions d'ouverture/fermeture d.button.addEventListener('click', navigation_expand, false); d.button.addEventListener('touchend', navigation_expand, false); d.animtag.addEventListener('transitionend', navigation_expandend, false); if (d.level == 1) { d.list.addEventListener('mouseover', navigation_mouse, false); d.list.addEventListener('mouseout', navigation_mouse, false); } } // Gestion des actions de survol if (d.level <= 1) { d.button.parentNode.addEventListener('mouseover', navigation_mouse, false); d.button.addEventListener('mouseout', navigation_mouse, false); } // Gestion des actions clavier d.button.addEventListener('keydown', navigation_keyboard, false); } // Autorisation d'acces au premier lien du menu (navigation clavier) Data.navigation.links.all[0].button.setAttribute('tabindex', '0'); Data.navigation.selectedlink = Data.navigation.links.all[0]; // Ajout de la fermeture du menu au survol de la page document.addEventListener('mouseover', navigation_checkover, false); document.addEventListener('touchstart', navigation_checkover, false); // Ajout du marqueur sur les balises du menu i = Data.navigation.links.level0.length - 1; for (i = i; i >= 0; i--) { // Identification du lien de premier niveau d = Data.navigation.links.all[Data.navigation.links.level0[i]].block; // Ajout du marqueur d.classList.add('epjs_navigationlinks'); // Ajout du marqueur sur les balises interieures d = d.querySelectorAll('*'); m = d.length - 1; for (m = m; m >= 0; m--) { d[m].classList.add('epjs_navigationlinks'); } } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - DEFINITION DU MODE D'AFFICHAGE SELON L'ECRAN // Definition du mode d'affichage du menu navigation_mode(Data.navigation.menuaccess.offsetWidth > 1); } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // PIED DE PAGE : Recherche des balises d = { footer: null, specific: null, general: null }; t = document.querySelector('#website-footer'); if (Data.footer == null && check(t)) { d.footer = t; // Fonction temporaire du traitement des liens f = function (f_classparent) { let f_t; let f_i; // Initialisation de l'objet de donnees const f_d = { parent: null, title: null, ticon: null, open: null, close: null, content: null, list: null }; // Recherche du bloc parent const f_p = d.footer.getElementsByClassName(f_classparent); if (f_p.length > 0) { f_d.parent = f_p[0]; // Recherche des liens d'ouverture/fermeture sans JS f_t = f_d.parent.querySelectorAll('.ep_menu-access'); f_i = f_t.length - 1; for (f_i = f_i; f_i >= 0; f_i--) { if (f_t[f_i].classList.contains('ep_openaccess')) f_d.open = f_t[f_i];else if (f_t[f_i].classList.contains('ep_closeaccess')) f_d.close = f_t[f_i]; if (f_d.open != null && f_d.close != null) break; } // Recherche du titre du bloc pour la convertion en lien d'ouverture/fermeture via JS f_t = f_d.parent.querySelectorAll('.ep_title'); if (f_t.length > 0) { f_d.title = f_t[0]; } // Recherche du bloc de contenu a deployer f_t = f_d.parent.querySelectorAll('.ep_list'); if (f_t.length > 0) { f_d.content = f_t[0]; f_t = f_d.content.classList.contains('ep-layout_category') ? f_d.content.querySelectorAll('div') : f_d.content.querySelectorAll('ul'); if (f_t.length > 0) { f_d.list = f_t[0]; } } } // Envoi du resultat return check(f_d.parent) && check(f_d.title) && check(f_d.open) && check(f_d.close) && check(f_d.content) && check(f_d.list) ? f_d : null; }; // Analyse des liens specifiques au site d.specific = f('ep_websitelinks'); // Analyse des liens generiques aux sites Europarl d.general = f('ep_europarllinks'); // Verification des donnees obtenues if (d.general != null) { Data.footer = {}; Data.footer.tabparent = d.general.parent.parentNode; Data.footer.specific = null; Data.footer.general = null; // Traitement de la liste de liens generiques // Initialisation de l'objet de donnees t = accordionHandler.convert(d.general.parent, // Reference du conteneur global d.general.title, // Reference du nouveau bouton d'ouverture [+]/[-] (conteneur global) d.general.content, // Reference du conteneur a animer d.general.list, // Reference de la liste generale des liens { openbtn: d.general.open, // Reference de la balise du bouton d'ouverture d'origine a supprimer closebtn: d.general.close, // Reference de la balise du bouton de fermeture d'origine a supprimer clickonicon: true // Autorisation de la creation d'un bouton icone receptionant l'action de clic }); if (t.converted) Data.footer.general = t.data; // Traitement de la liste de liens specifiques if (Data.footer.general != null && d.specific != null) { // Initialisation de l'objet de donnees t = accordionHandler.convert(d.specific.parent, // Reference du conteneur global d.specific.title, // Reference du nouveau bouton d'ouverture [+]/[-] (conteneur global) d.specific.content, // Reference du conteneur a animer d.specific.list, // Reference de la liste generale des liens { openbtn: d.specific.open, // Reference de la balise du bouton d'ouverture d'origine a supprimer closebtn: d.specific.close, // Reference de la balise du bouton de fermeture d'origine a supprimer clickonicon: true // Autorisation de la creation d'un bouton icone receptionant l'action de clic }); if (t.converted) { Data.footer.specific = t.data; // Ajout des dependances entre les deux blocs accordionHandler.setdependency(Data.footer.specific.index, [Data.footer.specific.index, Data.footer.general.index]); accordionHandler.setdependency(Data.footer.general.index, [Data.footer.specific.index, Data.footer.general.index]); } } else { Data.footer = null; } } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // MENU SOMMAIRE : Recherche des balises if (check(content)) { t = site.querySelectorAll('.ep-layout_tableofcontent'); if (t.length > 0) { i = t.length - 1; for (i = i; i >= 0; i--) { TableOfContent.convert(t[i], null); } } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // BLOC DE SUIVI : Recherche des balises devant suivre le scroll de la page if (check(content)) { t = site.querySelectorAll('.ep-layout_followingscroll'); if (t.length > 0) { i = t.length - 1; for (i = i; i >= 0; i--) { FollowingScroll.convert(t[i], null); } } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // SELECTEURS : Recherche des balises