PageSourceSearch

https://www.endangeredlabs.io/main.js

js endangeredlabs.io collected 2026-10-09 22:53:34 UTC 6,004 bytes, 195 lines download raw bytes

1/* global ScrollReveal */
2/* global $ */
3window.onload = function(){
4
5  // ##############################################################
6  // Countdown
7  // ##############################################################
8  // la date cible du décompte (année, mois, jour, heure, minute, seconde)
9  var target_date = new Date(Date.UTC(2023, 0, 12, 23, 0, 0)).getTime();
10
11  // obtient la référence aux éléments HTML où le décompte doit être affiché
12  var daysEl = $(".js-d");
13  var hoursEl = $(".js-h");
14  var minutesEl = $(".js-m");
15  var secondsEl = $(".js-s");
16
17  var countdown = function() {
18
19    // obtient la date et l'heure actuelles
20    var now = new Date;
21    var current_date = Date.UTC(now.getFullYear(),now.getMonth(), now.getDate() ,
22      now.getHours(), now.getMinutes(), now.getSeconds(), now.getMilliseconds());
23
24    // trouve la différence entre la date actuelle et la date cible
25    var difference = target_date - current_date;
26
27    // calcule les jours, heures, minutes et secondes restants
28    var days = Math.floor(difference / (1000 * 60 * 60 * 24));
29    var hours = Math.floor((difference % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
30    var minutes = Math.floor((difference % (1000 * 60 * 60)) / (1000 * 60));
31    var seconds = Math.floor((difference % (1000 * 60)) / 1000);
32
33    // formate les chiffres avec un préfixe "0" si nécessaire
34    days = ("0" + days).slice(-2);
35    hours = ("0" + hours).slice(-2);
36    minutes = ("0" + minutes).slice(-2);
37    seconds = ("0" + seconds).slice(-2);
38
39    // affiche le résultat dans les éléments HTML
40    daysEl.html(days);
41    hoursEl.html(hours);
42    minutesEl.html(minutes);
43    secondsEl.html(seconds);
44
45  };
46  countdown()
47  setInterval(countdown, 1000)
48
49  // ##############################################################
50  // FAQ
51  // ##############################################################
52  $('.answer').hide();
53  $('.item-content').click(function() {
54    $(this).children('.answer').slideToggle();
55  });
56
57  // ##############################################################
58  // Menu Toggle
59  // ##############################################################
60  $( ".btn-burger" ).click(function() {
61    $( this ).toggleClass( "open" );
62    $(".menu").toggleClass( "open" );
63  });
64
65  // ##############################################################
66  // DropDown Toggle
67  // ##############################################################
68  $( ".dropdown-toggle" ).click(function() {
69    $( this ).parent().toggleClass( "open" );
70  });
71
72  // ##############################################################
73  // Narrative pagination Toggle
74  // ##############################################################
75  $( ".narrative-pagination-page" ).click(function() {
76    $( ".narrative-pagination-page" ).removeClass( "active" );
77    $( this ).toggleClass( "active" );
78  });
79
80
81  // ##############################################################
82  // Scroll Reveal
83  // ##############################################################
84  window.runScrollReveal = () => {
85    ScrollReveal().reveal('.load-hidden', { distance: '-30px', interval: 50 });
86
87    ScrollReveal().reveal('.load-hidden-bigBtn', { distance: '250px', origin: 'right', interval: 50 });
88
89    ScrollReveal().reveal('.load-hidden-header-text', { opacity: '0', duration: 4000 });
90
91    ScrollReveal().reveal('.load-hidden-constro', { opacity: '0', duration: 500 });
92  }
93
94
95  // ##############################################################
96  // Reveal Title matrix
97  // ##############################################################
98  var Messenger = function(el){
99    'use strict';
100    var m = this;
101
102    m.init = function(){
103      m.codeletters = "&#*+%?£@§$";
104      m.message = 0;
105      m.current_length = 0;
106      m.fadeBuffer = false;
107      m.messages = [
108        $(el).html()
109      ];
110
111      setTimeout(m.animateIn, 100);
112    };
113
114    m.generateRandomString = function(length){
115      var random_text = '';
116      while(random_text.length < length){
117        random_text += m.codeletters.charAt(Math.floor(Math.random()*m.codeletters.length));
118      }
119
120      return random_text;
121    };
122
123    m.animateIn = function(){
124      if(m.current_length < m.messages[m.message].length){
125        m.current_length = m.current_length + 2;
126        if(m.current_length > m.messages[m.message].length) {
127          m.current_length = m.messages[m.message].length;
128        }
129
130        var message = m.generateRandomString(m.current_length);
131        $(el).html(message);
132
133        setTimeout(m.animateIn, 20);
134      } else {
135        setTimeout(m.animateFadeBuffer, 20);
136      }
137    };
138
139    m.animateFadeBuffer = function(){
140      if(m.fadeBuffer === false){
141        m.fadeBuffer = [];
142        for(var i = 0; i < m.messages[m.message].length; i++){
143          m.fadeBuffer.push({ c: (Math.floor(Math.random()*12))+1, l: m.messages[m.message].charAt(i) });
144        }
145      }
146
147      var do_cycles = false;
148      var message = '';
149
150      for(var i = 0; i < m.fadeBuffer.length; i++){
151        var fader = m.fadeBuffer[i];
152        if(fader.c > 0){
153          do_cycles = true;
154          fader.c--;
155          message += m.codeletters.charAt(Math.floor(Math.random()*m.codeletters.length));
156        } else {
157          message += fader.l;
158        }
159      }
160
161      $(el).html(message);
162
163      if(do_cycles === true){
164        setTimeout(m.animateFadeBuffer, 50);
165      } else {
166        setTimeout(m.cycleText, 2000);
167      }
168    };
169
170
171
172    m.init();
173  }
174
175  // console.clear();
176
177  let loadedTitle = []
178  window.addEventListener('scroll', function() {
179
180    const h2 = document.querySelectorAll("h2");
181    for (const title of [ ...h2 ]) {
182      const position = title.getBoundingClientRect()
183
184      // checking for partial visibility
185      if(position.top < window.innerHeight && position.bottom >= 0 && !loadedTitle.includes(title.id)) {
186        if(!title.id){
187          continue
188        }
189        new Messenger(`#${title.id}`);
190        loadedTitle.push(title.id)
191      }
192    }
193  });
194
195}

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.