PageSourceSearch

https://sanjoseahora.com.uy/wp-content/plugins/sja-radio-lite-v2/assets/radio.js?ver=1.4.27

js sanjoseahora.com.uy collected 2026-10-02 13:03:56 UTC 10,547 bytes, 397 lines download raw bytes

1(function(){
2  function initRadio(){
3    var root = document.getElementById('sja-radio-lite');
4    if(!root || root.dataset.mounted === '1') return;
5    root.dataset.mounted = '1';
6
7    var audio = document.getElementById('sja-radio-audio');
8    var playButtons = root.querySelectorAll('.sja-play-toggle');
9    var volumeSliders = root.querySelectorAll('.sja-volume');
10    var statusTexts = root.querySelectorAll('.sja-status-text');
11    var statusActions = root.querySelectorAll('.sja-status-action');
12    var moreBtn = root.querySelector('.sja-more-toggle');
13    var mobilePanel = root.querySelector('.sja-mobile-panel');
14    var collapseBtn = root.querySelector('.sja-collapse-toggle');
15    var playerLinks = root.querySelectorAll('.sja-player-link');
16    var nudge = document.getElementById('sja-radio-nudge');
17    var nudgePlay = nudge
18      ? nudge.querySelector('.sja-radio-nudge-play')
19      : null;
20    var nudgeClose = nudge
21      ? nudge.querySelector('.sja-radio-nudge-close')
22      : null;
23    var nudgeTimer = null;
24    var streamUrl = root.getAttribute('data-stream') ||
25      (window.SJARadioLite && window.SJARadioLite.streamUrl) || '';
26
27    var started = false;
28    var userPaused = false;
29    var successTracked = false;
30
31    function track(eventName, extra){
32      window.dataLayer = window.dataLayer || [];
33      var payload = extra || {};
34      payload.event = eventName;
35      window.dataLayer.push(payload);
36    }
37
38    function setStatus(text){
39      statusTexts.forEach(function(node){
40        node.textContent = text;
41      });
42    }
43
44    function setResumeFlag(enabled){
45      if(!window.sessionStorage) return;
46      try {
47        if(enabled){
48          sessionStorage.setItem('sjaRadioResume', '1');
49        } else {
50          sessionStorage.removeItem('sjaRadioResume');
51        }
52      } catch(e){}
53    }
54
55    function hasResumeFlag(){
56      if(!window.sessionStorage) return false;
57      try {
58        return sessionStorage.getItem('sjaRadioResume') === '1';
59      } catch(e){
60        return false;
61      }
62    }
63
64    function hasNudgeBeenShown(){
65      if(!window.sessionStorage) return false;
66      try {
67        return sessionStorage.getItem('sjaRadioNudgeShown') === '1';
68      } catch(e){
69        return false;
70      }
71    }
72
73    function markNudgeShown(){
74      if(!window.sessionStorage) return;
75      try {
76        sessionStorage.setItem('sjaRadioNudgeShown', '1');
77      } catch(e){}
78    }
79
80    function hideNudge(markAsShown){
81      if(nudgeTimer){
82        window.clearTimeout(nudgeTimer);
83        nudgeTimer = null;
84      }
85
86      if(nudge){
87        nudge.hidden = true;
88      }
89
90      if(markAsShown){
91        markNudgeShown();
92      }
93    }
94
95    function scheduleNudge(){
96      if(!nudge || hasNudgeBeenShown() || hasResumeFlag()){
97        return;
98      }
99
100      nudgeTimer = window.setTimeout(function(){
101        nudgeTimer = null;
102
103        if(
104          audio.paused &&
105          !root.classList.contains('is-connecting') &&
106          !hasResumeFlag()
107        ){
108          nudge.hidden = false;
109          markNudgeShown();
110          track('radio_nudge_view');
111        }
112      }, 15000);
113    }
114
115    function ensureStream(){
116      if(started) return;
117      audio.src = streamUrl;
118      audio.setAttribute('playsinline', 'playsinline');
119      started = true;
120    }
121
122    function setConnecting(active){
123        active = !!active;
124        root.classList.toggle('is-connecting', active);
125
126        if(active){
127          root.dataset.connectingSince = String(Date.now());
128        }
129
130        playButtons.forEach(function(btn){
131          if(!btn.dataset.normalHtml){
132            btn.dataset.normalHtml = btn.innerHTML;
133          }
134
135          btn.disabled = active;
136
137          if(active){
138            btn.innerHTML = '';
139
140            var spinner = document.createElement('span');
141            spinner.setAttribute('aria-hidden', 'true');
142            spinner.style.cssText =
143              'display:block;width:22px;height:22px;' +
144              'border:3px solid #fff;border-right-color:transparent;' +
145              'border-radius:50%;box-sizing:border-box';
146
147            btn.appendChild(spinner);
148            btn.setAttribute('aria-busy', 'true');
149            btn.setAttribute('aria-label', 'Conectando radio');
150
151            if(spinner.animate){
152              spinner.animate(
153                [
154                  {transform:'rotate(0deg)'},
155                  {transform:'rotate(360deg)'}
156                ],
157                {
158                  duration:650,
159                  iterations:Infinity
160                }
161              );
162            }
163          } else {
164            btn.innerHTML = btn.dataset.normalHtml;
165            btn.removeAttribute('aria-busy');
166          }
167        });
168      }
169
170      function setPlaying(playing){
171        setConnecting(false);
172        root.classList.toggle('is-playing', !!playing);
173
174        playButtons.forEach(function(btn){
175          btn.setAttribute(
176            'aria-label',
177            playing ? 'Pausar radio' : 'Reproducir radio'
178          );
179        });
180      }
181
182      function setCollapsed(collapsed, persist){
183      root.classList.toggle('is-collapsed', !!collapsed);
184      document.body.classList.toggle('sja-radio-collapsed', !!collapsed);
185
186      if(collapseBtn){
187        collapseBtn.setAttribute(
188          'aria-expanded',
189          collapsed ? 'false' : 'true'
190        );
191        collapseBtn.setAttribute(
192          'aria-label',
193          collapsed ? 'Expandir reproductor' : 'Minimizar reproductor'
194        );
195      }
196
197      if(persist && window.sessionStorage){
198        try {
199          sessionStorage.setItem(
200            'sjaRadioCollapsed',
201            collapsed ? '1' : '0'
202          );
203        } catch(e){}
204      }
205    }
206
207    function startPlayback(){
208      hideNudge(true);
209      ensureStream();
210      userPaused = false;
211      root.classList.add('is-connecting');
212      root.classList.remove('needs-resume');
213      setStatus('Conectando…');
214      track('radio_play_click');
215
216      audio.play().then(function(){
217        setPlaying(true);
218        setStatus('Reproduciendo en vivo');
219        setResumeFlag(true);
220      }).catch(function(error){
221        setPlaying(false);
222        setStatus('No se pudo iniciar. Tocá para reintentar');
223        setResumeFlag(false);
224        track('radio_play_error', {
225          radio_error: error && error.name ? error.name : 'unknown'
226        });
227      });
228    }
229
230    playButtons.forEach(function(btn){
231      btn.addEventListener('click', function(){
232        if(root.classList.contains('is-connecting')) return;
233        if(audio.paused){
234          startPlayback();
235        } else {
236          userPaused = true;
237          audio.pause();
238          setPlaying(false);
239          setStatus('Pausado · Tocá para escuchar');
240          setResumeFlag(false);
241          track('radio_pause');
242        }
243      });
244    });
245
246    statusActions.forEach(function(action){
247      action.addEventListener('click', function(){
248        if(playButtons.length){
249          playButtons[0].click();
250        }
251      });
252    });
253
254    if(nudgePlay){
255      nudgePlay.addEventListener('click', function(){
256        hideNudge(true);
257        track('radio_nudge_play');
258
259        if(playButtons.length && audio.paused){
260          playButtons[0].click();
261        }
262      });
263    }
264
265    if(nudgeClose){
266      nudgeClose.addEventListener('click', function(){
267        hideNudge(true);
268        track('radio_nudge_close');
269      });
270    }
271
272    playerLinks.forEach(function(link){
273      link.addEventListener('click', function(event){
274        track('radio_continuous_open');
275
276        if(
277          window.matchMedia &&
278          window.matchMedia('(min-width: 992px)').matches
279        ){
280          var popup = window.open(
281            link.href,
282            'sjaRadioPlayer',
283            'popup=yes,width=520,height=760,resizable=yes,scrollbars=yes'
284          );
285
286          if(popup){
287            event.preventDefault();
288
289            try {
290              popup.opener = null;
291              popup.focus();
292            } catch(e){}
293          }
294        }
295      });
296    });
297
298    volumeSliders.forEach(function(slider){
299      slider.addEventListener('input', function(){
300        audio.volume = parseFloat(slider.value);
301        audio.muted = audio.volume === 0;
302
303        volumeSliders.forEach(function(other){
304          if(other !== slider) other.value = slider.value;
305        });
306      });
307    });
308
309    if(moreBtn && mobilePanel){
310      moreBtn.addEventListener('click', function(){
311        var expanded = moreBtn.getAttribute('aria-expanded') === 'true';
312        moreBtn.setAttribute('aria-expanded', expanded ? 'false' : 'true');
313        mobilePanel.hidden = expanded;
314      });
315    }
316
317    if(collapseBtn){
318      collapseBtn.addEventListener('click', function(){
319        setCollapsed(
320          !root.classList.contains('is-collapsed'),
321          true
322        );
323      });
324
325      if(window.sessionStorage){
326        try {
327          if(sessionStorage.getItem('sjaRadioCollapsed') === '1'){
328            setCollapsed(true, false);
329          }
330        } catch(e){}
331      }
332    }
333
334    audio.addEventListener('playing', function(){
335      hideNudge(true);
336      setPlaying(true);
337      setStatus('Reproduciendo en vivo');
338      setResumeFlag(true);
339
340      if(!successTracked){
341        successTracked = true;
342        track('radio_play_success');
343      }
344    });
345
346    audio.addEventListener('waiting', function(){
347      if(started && !audio.paused){
348        root.classList.add('is-connecting');
349        setStatus('Conectando…');
350      }
351    });
352
353    audio.addEventListener('stalled', function(){
354      if(started){
355        setStatus('Reconectando…');
356      }
357    });
358
359    audio.addEventListener('error', function(){
360      setPlaying(false);
361      setStatus('Error de conexión · Tocá para reintentar');
362      setResumeFlag(false);
363      track('radio_stream_error');
364    });
365
366    audio.addEventListener('pause', function(){
367      setPlaying(false);
368
369      if(userPaused){
370        setStatus('Pausado · Tocá para escuchar');
371      }
372    });
373
374    window.addEventListener('pagehide', function(){
375      if(started && !audio.paused){
376        setResumeFlag(true);
377      }
378    });
379
380    if(hasResumeFlag()){
381      setCollapsed(false, false);
382      root.classList.add('needs-resume');
383      setStatus('Continuar escuchando');
384    } else {
385      setStatus('Tocá para escuchar');
386    }
387
388    setPlaying(false);
389    scheduleNudge();
390  }
391
392  if(document.readyState === 'loading'){
393    document.addEventListener('DOMContentLoaded', initRadio);
394  } else {
395    initRadio();
396  }
397})();

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.