PageSourceSearch

https://www.nordlittoral.fr/sites/all/modules/ena/ena_froomle/js/ena_froomle_recommendations.js

js nordlittoral.fr collected 2026-10-02 07:54:16 UTC 48,494 bytes, 782 lines download raw bytes

1window.drupalScripts.push(function ($) {
2  (function ($) {
3    $('document').ready(function () {
4      window.didomiOnReady.push(function (Didomi) {
5        if (!Didomi.notice.isVisible()) {
6          console.log("Didomi notice is not visible");
7          setTimeout(function() {
8            froomle_ab_test_router();
9            console.log("Froomle lancé après 2s d'attente");
10          }, 2000);
11        } else {
12          console.log("Didomi notice is visible");
13          // event listener la popup didomi est fermé
14          window.didomiEventListeners = window.didomiEventListeners || [];
15          window.didomiEventListeners.push({
16            event: 'notice.hidden',
17            listener: function () {
18              // the notice has been hidden
19              if (!Drupal.settings.ena_froomle.is_loaded_recom) {
20                console.log("Didomi notice has been hidden");
21                setTimeout(function() {
22                  froomle_ab_test_router();
23                  console.log("Froomle lancé après 2s d'attente (Didomi)");
24                }, 2000);
25              }
26            }
27          }); // fin event listener la popup didomi est fermé
28        }
29      });
30
31      // ROUTEUR AB TEST : Choisit la bonne fonction selon le groupe défini par Kameleoon
32      function froomle_ab_test_router() {
33        console.log("froomle_ab_test_router called");
34        var group = (typeof window.froomleTestGroup === 'string') ? window.froomleTestGroup : null;
35        if (group === 'froomle_1') {
36          console.log("Running froomle_1 variant");
37          runFroomleFroomle1();
38        } else if (group === 'froomle_2') {
39          console.log("Running froomle_2 variant");
40          runFroomleFroomle2();
41        } else if (group === 'customer') {
42          console.log("Running customer variant");
43          runFroomleCustomer();
44        } else {
45          console.log("Running legacy variant");
46          ena_froomle_recommendations(); // legacy
47        }
48      }
49      window.froomle_ab_test_router = froomle_ab_test_router; // <-- expose la fonction en global
50
51      // LOGIQUE GROUPE "customer" (DPI only)
52      function runFroomleCustomer() {
53        console.log("Running customer variant");
54        window.froomle_ab_group = 'customer';
55        runFroomleWithGroup('customer');
56      }
57
58      // LOGIQUE GROUPE "froomle_1" (mixed)
59      function runFroomleFroomle1() {
60        console.log("Running froomle_1 variant");
61        window.froomle_ab_group = 'froomle_1';
62        runFroomleWithGroup('froomle_1');
63      }
64
65      // LOGIQUE GROUPE "froomle_2" (Froomle only)
66      function runFroomleFroomle2() {
67        console.log("Running froomle_2 variant");
68        window.froomle_ab_group = 'froomle_2';
69        runFroomleWithGroup('froomle_2');
70      }
71
72      // Fonction générique pour exécuter la logique legacy en forçant le user_group
73      function runFroomleWithGroup(groupName) {
74        (async () => {
75          try {
76            if (typeof Drupal !== undefined && Drupal.settings.ena_froomle !== undefined && Drupal.settings.ena_froomle.enable !== undefined && Drupal.settings.ena_froomle.enable && Drupal.settings.ena_froomle.is_loaded_recom === undefined) {
77              Drupal.settings.ena_froomle.is_loaded_recom = true;
78
79              const deviceId = getDeviceId();
80              const container = document.getElementById("r-froomle--reco");
81              const containerArticle = document.querySelector(".r-froomle--article-reco");
82
83              jwtToken = getCookie(Drupal.settings.ena_froomle.jwtTokenCookieName)
84              if (jwtToken != undefined && jwtToken !== "") {
85                jwtTokenSplit = jwtToken.split(".");
86                if (jwtTokenSplit[1] !== undefined) {
87                  jwtTokenString = atob(jwtTokenSplit[1]);
88                  jwtTokenObj = JSON.parse(jwtTokenString);
89                  if (jwtTokenObj.loginID != undefined && jwtTokenObj.loginID != "" || jwtTokenObj.i != undefined && jwtTokenObj.i != "") {
90                    loginId = "";
91                    if (jwtTokenObj.i != undefined && jwtTokenObj.i != "") {
92                      loginId = jwtTokenObj.i;
93                    } else {
94                      loginId = jwtTokenObj.loginID;
95                    }
96                    if (dataLayer != undefined && dataLayer.find(e => e.event === "custom-didomi-loaded").vendors.froomle == true) {
97                      const froomleApi = Drupal.settings.ena_froomle.apiUrl;
98                      const fallbackSection = Drupal.settings.ena_froomle.section_fallback;
99                      const list_name = window.froomleListName || "recommended_for_you";
100                      const regex_user_agent = /Mobi|Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i;
101
102                      let articleHidden = document.querySelector("r-main > .r-viewmode--niveau-2:last-of-type");
103                      if (articleHidden !== null && articleHidden.length !== 0) {
104                        articleHidden.style.display = "none";
105                      }
106                      let user_subscription = "NONE";
107                      if (dataLayer != undefined && dataLayer[0] != undefined && dataLayer[0]['member_status_v2'] == "abonne") {
108                        user_subscription = "SUBSCRIPTION";
109                      }
110
111                      let excludes = []
112                      const article_to_exclude = document.querySelectorAll('.-is-targetblock 
112i.r-m');
113                      article_to_exclude.forEach(function (i_article, index) {
114                        if (i_article.getAttribute('data-extref') != "") {
115                          excludes.push({
116                            id: i_article.getAttribute('data-extref'),
117                            item_type: "article",
118                            reconsumable: false
119                          });
120                        }
121                      });
122
123                      let page_type = Drupal.settings.ena_froomle.pageType;
124
125                      const context = {
126                        channel: regex_user_agent.test(navigator.userAgent) ? "www-mobile" : "www-desktop",
127                        page_type: Drupal.settings.ena_froomle.pageType,
128                        device_id: deviceId,
129                        user_id: loginId,
130                        user_subscription: user_subscription,
131                        histories: {exclude: excludes},
132                        user_group: groupName // <-- on force le groupe pour l'AB test
133                      };
134
135                      if (page_type == "article_detail") {
136                        context.context_item = Drupal.settings.ena_froomle.extRef;
137                        context.context_item_type = "article";
138                      }
139
140                      let nbArticle = (containerArticle !== null && containerArticle.length !== 0) ? Drupal.settings.ena_froomle.nb_article + 1 : Drupal.settings.ena_froomle.nb_article;
141                      let recommendations = await fetchRecommendations(froomleApi, context, [list_name], [nbArticle]);
142                      // Ensure consistency for the AB test: force the user_group to the groupName
143                      // so that URLs, dataLayer items and events all use the same group.
144                      recommendations = recommendations || {};
145                      recommendations.user_group = groupName;
146
147                      let recommended_items = recommendations.lists
148                        .find(l => l.list_name === list_name)
149                        .items;
150                      let articles_rendered = "";
151
152                      if (recommended_items == undefined || recommended_items == "") {
153                        let recommendationsFallback = await fetchFallbackSection(fallbackSection, context, [list_name], [nbArticle]);
154                        let recommended_items_fallback = recommendationsFallback.packages;
155                        for (const item of recommended_items_fallback) {
156                          articles_rendered += `<r-viewmode class="r-viewmode--niveau-2 r-viewmode--o-niveau-2">
157                                                ${item.rendered}
158                                                </r-viewmode>`;
159                        }
160                      }
161                      else {
162                        dataLayer.push({
163                          event: "select_item",
164                          ecommerce: {
165                            items: []
166                          }
167                        });
168
169                        let indexFirstPaidItem = (recommended_items.findIndex(({access_type}) => access_type === "PAID") !== -1) ? recommended_items.findIndex(({access_type}) => access_type === "PAID") : 0;
170                        let indexFirstFreeItem = (recommended_items.findIndex(({access_type}) => access_type === "FREE") !== -1) ? recommended_items.findIndex(({access_type}) => access_type === "FREE") : 0;
171
172                        recommended_items.forEach(function (item, key) {
173                          var image = "";
174                          if(item.images[0] == null) {
175                            image = document.location.host + "/sites/all/themes/enacarbon_lesoir/images/default.svg";
176                          } else {
177                            image = item.images[0];
178                          }
179
180                          dataLayer.find(e => e.event === "select_item").ecommerce.items.push({
181                            item_id: item.item_id,
182                            item_type: item.item_type,
183                            request_id: recommendations.request_id,
184                            user_group: recommendations.user_group,
185                            item_list_name: recommendations.lists[0].list_name,
186                          });
187
188                          const context2 = {
189                            page_type: Drupal.settings.ena_froomle.pageType,
190                            device_id: deviceId,
191                            user_id: loginId,
192                            list_name: recommendations.lists[0].list_name,
193                            action_item: item.item_id,
194                            request_id: recommendations.request_id,
195                            channel: regex_user_agent.test(navigator.userAgent) ? "www-mobile" : "www-desktop",
196                            user_group: recommendations.user_group
197                          };
198
199                          impression(froomleApi, context2); // no await!
200
201                          let iconAbo = "";
202                          if (item.access_type != undefined && item.access_type == "PAID" || item.item_attributes != undefined && item.item_attributes.restricted_access != undefined && item.item_attributes.restricted_access == true) {
203                            iconAbo = `<r-icon class="r-icon--abonne"></r-icon>`;
204                          }
205
206                          if (containerArticle !== null && containerArticle.length !== 0) {
207                            if (dataLayer[0]['member_status_v2'] == "abonne") {
208                              if (key == indexFirstPaidItem) {
209                                containerArticle.innerHTML = `
210                                                              <article>
211                                                                <a href="${item.uri}?f_itemid=${item.item_id}&f_itemtype=${item.item_type}&f_requestid=${recommendations.request_id}&f_usergroup=${recommendations.user_group}&f_itemlistname=${recommendations.lists[0].list_name}" class="r-article--img r-froomle--link">
212                                                                  <figure role="img" class="r-ratio--16-9"><img src="${image}" /></figure>
213                                                                </a>
214                                                                <h3 class="r-article--title"><a href="${item.uri}?f_itemid=${item.item_id}&f_itemtype=${item.item_type}&f_requestid=${recommendations.request_id}&f_usergroup=${recommendations.user_group}&f_itemlistname=${recommendations.lists[0].list_name}" class="r-article--link r-froomle--link">${iconAbo} ${item.title}</a></h3>
215                                                              </article>
216                                                              `;
217                              }
218                              if (key !== indexFirstPaidItem) {
219                                articles_rendered += `
220                                                      <r-viewmode class="r-viewmode--niveau-2 r-viewmode--o-niveau-2">
221                                                        <article>
222                                                          <a href="${item.uri}?f_itemid=${item.item_id}&f_itemtype=${item.item_type}&f_requestid=${recommendations.request_id}&f_usergroup=${recommendations.user_group}&f_itemlistname=${recommendations.lists[0].list_name}" class="r-article--img r-froomle--link">
223                                                            <figure role="img" class="r-ratio--16-9"><img src="${image}" /></figure>
224                                                          </a>
225                                                          <h3 class="r-article--title"><a href="${item.uri}?f_itemid=${item.item_id}&f_itemtype=${item.item_type}&f_requestid=${recommendations.request_id}&f_usergroup=${recommendations.user_group}&f_itemlistname=${recommendations.lists[0].list_name}" class="r-article--link r-froomle--link">${iconAbo} ${item.title}</a></h3>
226                                                        </article>
227                                                      </r-viewmode>`;
228                              }
229                            } else {
230                              if (key == indexFirstFreeItem) {
231                                containerArticle.innerHTML = `
232                                                              <article>
233                                                                <a href="${item.uri}?f_itemid=${item.item_id}&f_itemtype=${item.item_type}&f_requestid=${recommendations.request_id}&f_usergroup=${recommendations.user_group}&f_itemlistname=${recommendations.lists[0].list_name}" class="r-article--img r-froomle--link">
234                                                                  <figure role="img" class="r-ratio--16-9"><img src="${image}" /></figure>
235                                                                </a>
236                                                                <h3 class="r-article--title"><a href="${item.uri}?f_itemid=${item.item_id}&f_itemtype=${item.item_type}&f_requestid=${recommendations.request_id}&f_usergroup=${recommendations.user_group}&f_itemlistname=${recommendations.lists[0].list_name}" class="r-article--link r-froomle--link">${iconAbo} ${item.title}</a></h3>
237                                                              </article>
238                                                              `;
239                              }
240                              if (key !== indexFirstFreeItem) {
241                                articles_rendered += `
242                                                      <r-viewmode class="r-viewmode--niveau-2 r-viewmode--o-niveau-2">
243                                                        <article>
244                                                          <a href="${item.uri}?f_itemid=${item.item_id}&f_itemtype=${item.item_type}&f_requestid=${recommendations.request_id}&f_usergroup=${recommendations.user_group}&f_itemlistname=${recommendations.lists[0].list_name}" class="r-article--img r-froomle--link">
245                                                            <figure role="img" class="r-ratio--16-9"><img src="${image}" /></figure>
246                                                          </a>
247                                                          <h3 class="r-article--title"><a href="${item.uri}?f_itemid=${item.item_id}&f_itemtype=${item.item_type}&f_requestid=${recommendations.request_id}&f_usergroup=${recommendations.user_group}&f_itemlistname=${recommendations.lists[0].list_name}" class="r-article--link r-froomle--link">${iconAbo} ${item.title}</a></h3>
248                                                          
249                                                        </article>
250                                                      </r-viewmode>
251                                                      `;
252                              }
253                            }
254                          } else {
255                            articles_rendered += `
256                                                  <r-viewmode class="r-viewmode--niveau-2 r-viewmode--o-niveau-2">
257                                                    <article>
258                                                      <a href="${item.uri}?f_itemid=${item.item_id}&f_itemtype=${item.item_type}&f_requestid=${recommendations.request_id}&f_usergroup=${recommendations.user_group}&f_itemlistname=${recommendations.lists[0].list_name}" class="r-article--img r-froomle--link">
259                                                        <figure role="img" class="r-ratio--16-9"><img src="${image}" /></figure>
260                                                      </a>
261                                                      <h3 class="r-article--title"><a href="${item.uri}?f_itemid=${item.item_id}&f_itemtype=${item.item_type}&f_requestid=${recommendations.request_id}&f_usergroup=${recommendations.user_group}&f_itemlistname=${recommendations.lists[0].list_name}" class="r-article--link r-froomle--link">${iconAbo} ${item.title}</a></h3>
262                                                      
263                                                    </article>
264                                                  </r-viewmode>
265                                                  `;
266                          }
267                        });
268                      }
269
270                      container.innerHTML = articles_rendered;
271
272                      $('.r-froomle--link').click(function(event) {
273                        try {
274                          event.preventDefault();
275                          var url = $(this).attr('href');
276                          var parameters = getUrlParameters(url);
277
278                          const context3 = {
279                            page_type: Drupal.settings.ena_froomle.pageType,
280                            device_id: deviceId,
281                            user_id: loginId,
282                            list_name: parameters.f_itemlistname,
283                            action_item: parameters.f_itemid,
284                            request_id: parameters.f_requestid,
285                            channel: regex_user_agent.test(navigator.userAgent) ? "www-mobile" : "www-desktop",
286                            user_group: parameters.f_usergroup
287                          };
288
289                          clickRecommendation(froomleApi, context3)
290                            .then(() => {
291                              window.location.href = url;
292                            }).catch(function(error) {
293                            window.location.href = url;
294                          });
295                        } catch (error) {
296                          window.location.href = $(this).attr('href');
297                        }
298                      });
299
300                    } else {
301                      if (containerArticle !== null && containerArticle.length !== 0) {
302                        containerArticle.style.display = "none";
303                      }
304
305                      let cookiesText = Drupal.settings.ena_froomle.textCookies;
306                      if (cookiesText == "" || cookiesText == undefined) {
307                        cookiesText = `Pour profiter d’une expérience de lecture optimale,<br />nous vous conseillons d’activer vos cookies.`;
308                      }
309
310                      container.innerHTML = `
311                                              <r-panel class="r-froomle--cookies">
312                                                <p>${cookiesText}</p>
313                                                <a onclick="showConsentPopup();" class="r-btn r-btn--primary">Activer</a>
314                                              </r-panel>
315                                            `;
316                    }
317                  }
318                }
319              } else {
320                if (containerArticle !== null && containerArticle.length !== 0) {
321                  containerArticle.style.display = "none";
322                }
323
324                let paywallText = Drupal.settings.ena_froomle.textPaywall;
325                if (paywallText == "" || paywallText == undefined) {
326                  paywallText = `Découvrez une sélection d'articles qui correspondent à vos intérêts<br /> en vous inscrivant gratuitement`;
327                }
328
329                container.innerHTML = `
330                                          <r-panel class="r-froomle--anonyme">
331                                            <p>${paywallText}</p>
332                                            <a href="${Drupal.settings.ena_froomle.profilUrl}${window.location.href}" class="r-btn r-btn--primary r-froomle--register">Je m'inscris</a>
333                                            <a href="${Drupal.settings.ena_froomle.loginUrl}${window.location.href}" class="r-froomle--login">Je me connecte</a>
334                                          </r-panel>
335                                        `;
336              }
337            }
338          } catch (error) {
339            console.error('Error runFroomleWithGroup : ', error);
340          }
341        })();
342      }
343      
344      // fonction d'extraction paramètres de l'URL
345      function getUrlParameters(url) {
346        var params = {};
347        var parser = document.createElement('a');
348        parser.href = url;
349        var query = parser.search.substring(1);
350        var vars = query.split('&');
351        
352        for (var i = 0; i < vars.length; i++) {
353          var pair = vars[i].split('=');
354          params[pair[0]] = decodeURIComponent(pair[1]);
355        }
356        
357        return params;
358      }
359
360      function getDeviceId() {
361        let deviceId = localStorage.getItem('deviceId');
362        if (!deviceId) {
363          // Générer un UUID et le persister
364          deviceId = crypto.randomUUID();
365          localStorage.setItem('deviceId', deviceId);
366        }
367        console.log(deviceId);
368        return deviceId;
369      }
370
371      // --- Début : Fonctions utilitaires rendues globales ---
372      async function fetchRecommendations(froomleApi, context, list_names, list_sizes) {
373        let data = JSON.stringify(Object.assign({
374          lists: list_names.map((name, i) => ({
375            list_name: name,
376            list_size: list_sizes[i]
377          }))
378        }, context));
379        console.log(data);
380        // build headers and add X-User-Group when available
381        const headers = { 'Content-Type': 'application/json' };
382        try {
383          if (typeof window !== 'undefined' && typeof window.froomle_ab_group === 'string' && window.froomle_ab_group !== '') {
384            headers['X-User-Group'] = window.froomle_ab_group;
385          }
386        } catch (e) { /* ignore */ }
387
388        const response = await fetch(`${froomleApi}/recommendations/requests`, {
389          method: 'POST',
390          headers: headers,
391          body: data,
392        });
393        if (!response.ok) {
394          console.log("froomle error : " + response.statusText);
395          throw Error(response.statusText);
396        }
397        return await response.json();
398      }
399
400      async function fetchFallbackSection(sectionId, context, list_names, list_sizes) {
401        const response = await fetch('/api/sectionrendered/apps/' + sectionId + '/cible_principale/0/4/enacarbon_teaser_panel.json', {
402          method: 'GET',
403          headers: {
404            'Content-Type': 'application/json'
405          },
406        });
407        if (!response.ok) {
408          throw Error(response.statusText);
409        }
410        return await response.json();
411      }
412
413      function clickRecommendation(froomleApi, context) {
414        let data = JSON.stringify({
415          events: [Object.assign({
416            event_type: "click_on_recommendation",
417            action_item: context.action_item,
418            action_item_type: "article"
419          }, context)]
420        });
421        console.log(data);
422        const headers = { 'Content-Type': 'application/json' };
423        try {
424          if (typeof context.user_group === 'string' && context.user_group !== '') {
425            headers['X-User-Group'] = context.user_group;
426          } else if (typeof window !== 'undefined' && typeof window.froomle_ab_group === 'string' && window.froomle_ab_group !== '') {
427            headers['X-User-Group'] = window.froomle_ab_group;
428          }
429        } catch (e) { /* ignore */ }
430
431        return fetch(`${froomleApi}/events`, {
432          method: 'POST',
433          headers: headers,
434          body: data
435        })
436        .then(response => {
437          if (!response.ok) {
438            throw Error(response.statusText);
439          }
440          return response.json();
441        });
442      }
443
444      async function impression(froomleApi, context) {
445        const headers = { 'Content-Type': 'application/json' };
446        try {
447          if (typeof context.user_group === 'string' && context.user_group !== '') {
448            headers['X-User-Group'] = context.user_group;
449          } else if (typeof window !== 'undefined' && typeof window.froomle_ab_group === 'string' && window.froomle_ab_group !== '') {
450            headers['X-User-Group'] = window.froomle_ab_group;
451          }
452        } catch (e) { /* ignore */ }
453
454        const response = await fetch(`${froomleApi}/events`, {
455          method: 'POST',
456          headers: headers,
457          body: JSON.stringify({
458            events: [Object.assign({
459              event_type: "impression",
460              action_item: context.action_item,
461              action_item_type: "article"
462            }, context)]
463          })
464        });
465        if (!response.ok) {
466          throw Error(response.statusText);
467        }
468        return await response.json();
469      }
470      // --- Fin : Fonctions utilitaires globales ---
471      
472      function ena_froomle_recommendations() {
473        (async () => {
474          try {
475            if (typeof Drupal !== undefined && Drupal.settings.ena_froomle !== undefined && Drupal.settings.ena_froomle.enable !== undefined && Drupal.settings.ena_froomle.enable && Drupal.settings.ena_froomle.is_loaded_recom === undefined) {
476              // @TODO hack degueu, actuellement le script est appelé deux fois (comme, tous les autres script visiblement dans la page), on set une variable pour ne pas faire un second appel a froomle.
477              // @TODO se baser sur l'ID du block en plus si pas de solution propre
478              Drupal.settings.ena_froomle.is_loaded_recom = true;
479
480              const deviceId = getDeviceId();
481              const container = document.getElementById("r-froomle--reco");
482              const containerArticle = document.querySelector(".r-froomle--article-reco");
483
484              jwtToken = getCookie(Drupal.settings.ena_froomle.jwtTokenCookieName)
485              if (jwtToken != undefined && jwtToken !== "") {
486                // Split the JWT token to parse them
487                jwtTokenSplit = jwtToken.split(".");
488                if (jwtTokenSplit[1] !== undefined) {
489                  jwtTokenString = atob(jwtTokenSplit[1]);
490                  // Convert the jwtToken to object
491                  jwtTokenObj = JSON.parse(jwtTokenString);
492                  
493                  // si la personne est connectée -> loginID est différent de undefined ou vide
494                  if (jwtTokenObj.loginID != undefined && jwtTokenObj.loginID != "" || jwtTokenObj.i != undefined && jwtTokenObj.i != "") {
495                    loginId = "";
496                    if (jwtTokenObj.i != undefined && jwtTokenObj.i != "") {
497                      loginId = jwtTokenObj.i;
498                    } else {
499                      loginId = jwtTokenObj.loginID;
500                    }
501                    // si la personne a accepté le cookie froomle
502                    if (dataLayer != undefined && dataLayer.find(e => e.event === "custom-didomi-loaded").vendors.froomle == true) {
503                      const froomleApi = Drupal.settings.ena_froomle.apiUrl;
504                      const fallbackSection = Drupal.settings.ena_froomle.section_fallback;
505                      const list_name = "recommended_for_you";
506                      const regex_user_agent = /Mobi|Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i;
507
508                      //let articleHidden = document.querySelector(".r-froomle--article-reco + .
508-is-targetblock"); // pour l'article juste à côté
509                      //let articleHidden = document.querySelector("r-main > .-is-targetblock:last-of-type"); // le dernier article niveau 2
510
511                      let articleHidden = document.querySelector("r-main > .r-viewmode--niveau-2:last-of-type"); // le dernier article niveau 2
512                      
513                      if (articleHidden !== null && articleHidden.length !== 0) {
514                        articleHidden.style.display = "none";
515                      }
516                      let user_subscription = "NONE";
517                      if (dataLayer != undefined && dataLayer[0] != undefined && dataLayer[0]['member_status_v2'] == "abonne") {
518                        // l'utilisteur est abonné
519                        user_subscription = "SUBSCRIPTION";
520                      }
521                      
522                      // exclure des recommendations les articles présents dans la page
523                      let excludes = []
524                      const article_to_exclude = document.querySelectorAll('.-is-targetblock i.r-m');
525                      article_to_exclude.forEach(function (i_article, index) {
526                        if (i_article.getAttribute('data-extref') != "") {
527                          excludes.push({
528                            id: i_article.getAttribute('data-extref'),
529                            item_type: "article",
530                            reconsumable: false
531                          });
532                        }
533                      });
534                      
535                      let page_type = Drupal.settings.ena_froomle.pageType;
536                      
537                      const context = {
538                        channel: regex_user_agent.test(navigator.userAgent) ? "www-mobile" : "www-desktop",
539                        page_type: Drupal.settings.ena_froomle.pageType,
540                        device_id: deviceId,
541                        user_id: loginId,
542                        user_subscription: user_subscription,
543                        histories: {exclude: excludes}
544                      };
545                      
546                      if (page_type == "article_detail") {
547                        // nécessaire pour page_type article_detail
548                        context.context_item = Drupal.settings.ena_froomle.extRef;
549                        context.context_item_type = "article";
550                      }
551                      
552                      // si il y a le bloc avec 1 seul article, alors le nombre de d'article est celui paramétré dans le bloc froomle +1, sinon il reste à celui paramétré
553                      let nbArticle = (containerArticle !== null && containerArticle.length !== 0) ? Drupal.settings.ena_froomle.nb_article + 1 : Drupal.settings.ena_froomle.nb_article;
554                      let recommendations = await fetchRecommendations(froomleApi, context, [list_name], [nbArticle]);
555                      let recommended_items = recommendations.lists
556                        .find(l => l.list_name === list_name)
557                        .items;
558                      let articles_rendered = "";
559                      
560                      // pour si on n'a pas d'information de froomle on utilise la section renseigné dans l'admin froomle
561                      if (recommended_items == undefined || recommended_items == "") {
562                        console.log("Froomle - get recommendation from section");
563                        
564                        let recommendationsFallback = await fetchFallbackSection(fallbackSection, context, [list_name], [nbArticle]);
565                        let recommended_items_fallback = recommendationsFallback.packages;
566                        
567                        for (const item of recommended_items_fallback) {
568                          articles_rendered += `<r-viewmode class="r-viewmode--niveau-2 r-viewmode--o-niveau-2">
569                                                ${item.rendered}
570                                                </r-viewmode>`;
571                        }
572                      }
573                      else {
574                        console.log("Froomle - get recommendation from froomle");
575                        
576                        // initialisation du push du datalayer
577                        dataLayer.push({
578                          event: "select_item",
579                          ecommerce: {
580                            items: []
581                          }
582                        });
583                        
584                        // récupérer les index des articles payant/gratuit et un chiffre de fallback si il n'y en a pas
585                        let indexFirstPaidItem = (recommended_items.findIndex(({access_type}) => access_type === "PAID") !== -1) ? recommended_items.findIndex(({access_type}) => access_type === "PAID") : 0;
586                        let indexFirstFreeItem = (recommended_items.findIndex(({access_type}) => access_type === "FREE") !== -1) ? recommended_items.findIndex(({access_type}) => access_type === "FREE") : 0;
587                        
588                        // parcourir les articles recommandés
589                        recommended_items.forEach(function (item, key) {
590
591
592                          var image = "";
593                          if(item.images[0] == null) {
594                            image = document.location.host + "/sites/all/themes/enacarbon_lesoir/images/default.svg";
595                          } else {
596                            image = item.images[0];
597                          }
598
599                          // dataLayer
600                          dataLayer.find(e => e.event === "select_item").ecommerce.items.push({
601                            item_id: item.item_id,
602                            item_type: item.item_type,
603                            request_id: recommendations.request_id,
604                            user_group: recommendations.user_group,
605                            item_list_name: recommendations.lists[0].list_name,  // needs to match the list_name used in the recommendation response
606                          });
607                          
608                          // une recommandation de Froomle qui a été montrée à l'utilisateur
609                          const context = {
610                            page_type: Drupal.settings.ena_froomle.pageType,
611                            device_id: deviceId,
612                            user_id: loginId,
613                            list_name: recommendations.lists[0].list_name,
614                            action_item: item.item_id,
615                            request_id: recommendations.request_id,
616                            channel: regex_user_agent.test(navigator.userAgent) ? "www-mobile" : "www-desktop",
617                            user_group: recommendations.user_group
618                          };
619                          
620                          const resp = impression(froomleApi, context); // no await!
621                          
622                          // icône abonnement
623                          let iconAbo = "";
624                          if (item.access_type != undefined && item.access_type == "PAID" || item.item_attributes != undefined && item.item_attributes.restricted_access != undefined && item.item_attributes.restricted_access == true) {
625                            iconAbo = `<r-icon class="r-icon--abonne"></r-icon>`;
626                          }
627                          
628                          if (containerArticle !== null && containerArticle.length !== 0) {
629                            // si l'utilisateur est abonné :
630                            if (dataLayer[0]['member_status_v2'] == "abonne") {
631                              // on affiche le 1er article payant en 7ème position
632                              if (key == indexFirstPaidItem) {
633                                containerArticle.innerHTML = `
634                                                              <article>
635                                                                <a href="${item.uri}?f_itemid=${item.item_id}&f_itemtype=${item.item_type}&f_requestid=${recommendations.request_id}&f_usergroup=${recommendations.user_group}&f_itemlistname=${recommendations.lists[0].list_name}" class="r-article--img r-froomle--link">
636                                                                  <figure role="img" class="r-ratio--16-9"><img src="${image}" /></figure>
637                                                                </a>
638                                                                <h3 class="r-article--title"><a href="${item.uri}?f_itemid=${item.item_id}&f_itemtype=${item.item_type}&f_requestid=${recommendations.request_id}&f_usergroup=${recommendations.user_group}&f_itemlistname=${recommendations.lists[0].list_name}" class="r-article--link r-froomle--link">${iconAbo} ${item.title}</a></h3>
639                                                              </article>
640                                                              `;
641                              }
642                              // et on n'affiche pas le premier article payant dans le bloc froomle
643                              if (key !== indexFirstPaidItem) {
644                                articles_rendered += `
645                                                      <r-viewmode class="r-viewmode--niveau-2 r-viewmode--o-niveau-2">
646                                                        <article>
647                                                          <a href="${item.uri}?f_itemid=${item.item_id}&f_itemtype=${item.item_type}&f_requestid=${recommendations.request_id}&f_usergroup=${recommendations.user_group}&f_itemlistname=${recommendations.lists[0].list_name}" class="r-article--img r-froomle--link">
648                                                            <figure role="img" class="r-ratio--16-9"><img src="${image}" /></figure>
649                                                          </a>
650                                                          <h3 class="r-article--title"><a href="${item.uri}?f_itemid=${item.item_id}&f_itemtype=${item.item_type}&f_requestid=${recommendations.request_id}&f_usergroup=${recommendations.user_group}&f_itemlistname=${recommendations.lists[0].list_name}" class="r-article--link r-froomle--link">${iconAbo} ${item.title}</a></h3>
651                                                        </article>
652                                                      </r-viewmode>`;
653                              }
654                            } else {
655                              // sinon l'utilisateur n'est pas abonné
656                              // on affiche le premier article gratuit en 7ème position
657                              if (key == indexFirstFreeItem) {
658                                containerArticle.innerHTML = `
659                                                              <article>
660                                                                <a href="${item.uri}?f_itemid=${item.item_id}&f_itemtype=${item.item_type}&f_requestid=${recommendations.request_id}&f_usergroup=${recommendations.user_group}&f_itemlistname=${recommendations.lists[0].list_name}" class="r-article--img r-froomle--link">
661                                                                  <figure role="img" class="r-ratio--16-9"><img src="${image}" /></figure>
662                                                                </a>
663                                                                <h3 class="r-article--title"><a href="${item.uri}?f_itemid=${item.item_id}&f_itemtype=${item.item_type}&f_requestid=${recommendations.request_id}&f_usergroup=${recommendations.user_group}&f_itemlistname=${recommendations.lists[0].list_name}" class="r-article--link r-froomle--link">${iconAbo} ${item.title}</a></h3>
664                                                              </article>
665                                                              `;
666                              }
667                              // et on n'affiche pas le premier article gratuit dans le bloc froomle
668                              if (key !== indexFirstFreeItem) {
669                                articles_rendered += `
670                                                      <r-viewmode class="r-viewmode--niveau-2 r-viewmode--o-niveau-2">
671                                                        <article>
672                                                          <a href="${item.uri}?f_itemid=${item.item_id}&f_itemtype=${item.item_type}&f_requestid=${recommendations.request_id}&f_usergroup=${recommendations.user_group}&f_itemlistname=${recommendations.lists[0].list_name}" class="r-article--img r-froomle--link">
673                                                            <figure role="img" class="r-ratio--16-9"><img src="${image}" /></figure>
674                                                          </a>
675                                                          <h3 class="r-article--title"><a href="${item.uri}?f_itemid=${item.item_id}&f_itemtype=${item.item_type}&f_requestid=${recommendations.request_id}&f_usergroup=${recommendations.user_group}&f_itemlistname=${recommendations.lists[0].list_name}" class="r-article--link r-froomle--link">${iconAbo} ${item.title}</a></h3>
676                                                          
677                                                        </article>
678                                                      </r-viewmode>
679                                                      `;
680                              }
681                            }
682                          } else {
683                            articles_rendered += `
684                                                  <r-viewmode class="r-viewmode--niveau-2 r-viewmode--o-niveau-2">
685                                                    <article>
686                                                      <a href="${item.uri}?f_itemid=${item.item_id}&f_itemtype=${item.item_type}&f_requestid=${recommendations.request_id}&f_usergroup=${recommendations.user_group}&f_itemlistname=${recommendations.lists[0].list_name}" class="r-article--img r-froomle--link">
687                                                        <figure role="img" class="r-ratio--16-9"><img src="${image}" /></figure>
688                                                      </a>
689                                                      <h3 class="r-article--title"><a href="${item.uri}?f_itemid=${item.item_id}&f_itemtype=${item.item_type}&f_requestid=${recommendations.request_id}&f_usergroup=${recommendations.user_group}&f_itemlistname=${recommendations.lists[0].list_name}" class="r-article--link r-froomle--link">${iconAbo} ${item.title}</a></h3>
690                                                      
691                                                    </article>
692                                                  </r-viewmode>
693                                                  `;
694                          }
695                        });
696                      }
697                      
698                      container.innerHTML = articles_rendered;
699                      
700                      // event listener clique sur un lien recommandé par Froomle pour leur envoyer les infos de l'article froomle visité
701                      $('.r-froomle--link').click(function(event) {
702                        console.log('click on froomle link');
703                        try {
704                          event.preventDefault();
705                          var url = $(this).attr('href');
706                          var parameters = getUrlParameters(url);
707                          
708                          const context = {
709                            page_type: Drupal.settings.ena_froomle.pageType,
710                            device_id: deviceId,
711                            user_id: loginId,
712                            list_name: parameters.f_itemlistname,
713                            action_item: parameters.f_itemid,
714                            request_id: parameters.f_requestid,
715                            channel: regex_user_agent.test(navigator.userAgent) ? "www-mobile" : "www-desktop",
716                            user_group: parameters.f_usergroup
717                          };
718                          
719                          clickRecommendation(froomleApi, context)
720                            .then(() => {
721                              // rediriger l'utilisateur après l'appel API réussi
722                              window.location.href = url;
723                            }).catch(function(error) {
724                            console.error('Error link ena_froomle_recommendations.js : ', error);
725                            // rediriger l'utilisateur y compris en cas d'erreur lors de l'appel à l'API
726                            window.location.href = url;
727                          });
728                        } catch (error) {
729                          console.error('Error link ena_froomle_recommendations.js: ', error);
730                          // rediriger l'utilisateur en cas d'autre erreur
731                          window.location.href = $(this).attr('href');
732                        }
733                      });
734                      
735                    } else {
736                      // il n'a pas accepté le cookie froomle
737                      if (containerArticle !== null && containerArticle.length !== 0) {
738                        containerArticle.style.display = "none";
739                      }
740
741                      let cookiesText = Drupal.settings.ena_froomle.textCookies;
742                      if (cookiesText == "" || cookiesText == undefined) {
743                        cookiesText = `Pour profiter d’une expérience de lecture optimale,<br />nous vous conseillons d’activer vos cookies.`;
744                      }
745                      
746                      container.innerHTML = `
747                                              <r-panel class="r-froomle--cookies">
748                                                <p>${cookiesText}</p>
749                                                <a onclick="showConsentPopup();" class="r-btn r-btn--primary">Activer</a>
750                                              </r-panel>
751                                            `;
752                    }
753                  }
754                }
755              } else {
756                // il n'est pas connecté
757                if (containerArticle !== null && containerArticle.length !== 0) {
758                  containerArticle.style.display = "none";
759                }
760
761                let paywallText = Drupal.settings.ena_froomle.textPaywall;
762                if (paywallText == "" || paywallText == undefined) {
763                  paywallText = `Découvrez une sélection d'articles qui correspondent à vos intérêts<br /> en vous inscrivant gratuitement`;
764                }
765
766                container.innerHTML = `
767                                          <r-panel class="r-froomle--anonyme">
768                                            <p>${paywallText}</p>
769                                            <a href="${Drupal.settings.ena_froomle.profilUrl}${window.location.href}" class="r-btn r-btn--primary r-froomle--register">Je m'inscris</a>
770                                            <a href="${Drupal.settings.ena_froomle.loginUrl}${window.location.href}" class="r-froomle--login">Je me connecte</a>
771                                          </r-panel>
772                                        `;
773              }
774            }
775          } catch (error) {
776            console.error('Error ena_froomle_recommendations.js : ', error);
777          }
778        })();
779      }
780    });
781  })(jQuery);
782});

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.