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.