1 2// Global Player - station select toggle 3var player_stationselect_toggle = function(event) { 4 var stationselect = document.getElementById('player-station-select'); 5 var stationselect_button_main = document.getElementById('player-button-station-select'); 6 7 if (stationselect.style.display !== 'none') { 8 stationselect.style.display = 'none'; 9 if(stationselect_button_main.classList.contains("active")) { 10 stationselect_button_main.classList.remove("active"); 11 } 12 } else { 13 stationselect.style.display = 'block'; 14 stationselect_button_main.className += " active"; 15 } 16 17 event.preventDefault(); 18}; 19 20var player_button_stationselect = document.getElementById('player-button-station-select'); 21player_button_stationselect.onclick = player_stationselect_toggle; 22 23// Global Player - station select click 24var player_stationload = function(stationId, stationName, autoplay) { 25 26 if(typeof autoplay == 'undefined') { 27 autoplay = false; 28 } 29 30 if(autoplay == true) { 31 player_invoke(); 32 } 33 34 if(stationId !== document.getElementById('player-global').getAttribute('data-stationid')) { 35 // Station has changed - reset player 36 if(typeof mejs !== 'undefined' && typeof mejs.players !== 'undefined' && typeof mejs.players.mep_0 !== 'undefined') { 37 38 if(!mejs.players.mep_0.paused) { 39 mejs.players.mep_0.pause(); 40 } 41 42 mejs.players.mep_0.remove(); 43 } 44 45 metaradio_player_controls('play'); 46 jQuery('#metaradio-audio-player').html(''); 47 jQuery('#player-global .items').removeClass('scrubbable'); 48 document.querySelectorAll('#player-global .player-main-row')[0].classList.remove('on-demand-playing'); 49 50 } 51 52 document.getElementById('player-station-name').innerHTML = stationName; 53 document.getElementById('player-global').setAttribute('data-stationid', stationId); 54 document.getElementById('player-guide-link').setAttribute('data-stationid', stationId); 55 document.getElementsByTagName('body')[0].setAttribute('data-stationid', stationId); 56 57 var currentsong_heading = document.getElementById('player-global').getAttribute('data-titlesongnow'); 58 var currentsong_details = document.getElementById('player-global').getAttribute('data-currentsongdetails'); 59 60 if(currentsong_details == 'composertitleartist') { 61 var currentsong_html = ' \ 62 <span class="item-label">'+currentsong_heading+'</span> \ 63 <span class="item-composertitle"><span class="item-composer metaradio_station_now_composer" data-stationid="'+stationId+'"></span> - \ 64 <span class="item-title metaradio_station_now_title" data-stationid="'+stationId+'"></span></span> \ 65 <span class="item-artist metaradio_station_now_artist" data-stationid="'+stationId+'"></span> \ 66 '; 67 } else { 68 var currentsong_html = ' \ 69 <span class="item-label">'+currentsong_heading+'</span> \ 70 <span class="item-title metaradio_station_now_title" data-stationid="'+stationId+'"></span> \ 71 <span class="item-artistcomposer"><span class="item-artist metaradio_station_now_artist" data-stationid="'+stationId+'"></span> \ 72 <span class="item-composer metaradio_station_now_composer" data-stationid="'+stationId+'"></span></span> \ 73 '; 74 } 75 76 // Setup HTML for now-playing & program guide data 77 var items_container = document.querySelectorAll("#player-global .items"); 78 items_container[0].innerHTML = ' \ 79 <div class="item metaradio-hide-now-program-empty metaradio_station_now_statusclass" data-stationid="'+stationId+'"> \ 80 <div class="avatar metaradio_station_now_program_art" data-stationid="'+stationId+'"></div> \ 81 <div> \ 82 <span class="item-label">LIVE</span> \ 83 <span class="item-title metaradio_station_now_program_name" data-stationid="'+stationId+'"></span> \ 84 </div> \ 85 </div> \ 86 <div class="item metaradio-hide-now-empty" data-stationid="'+stationId+'"> \ 87 <div class="avatar metaradio_station_now_albumart" data-stationid="'+stationId+'"></div> \ 88 <div> \ 89 '+currentsong_html+'\ 90 </div> \ 91 </div> \ 92 <div class="item metaradio-hide-next-program-empty" data-stationid="'+stationId+'"> \ 93 <div class="avatar metaradio_station_next_program_art" data-stationid="'+stationId+'"></div> \ 94 <div> \
95 <span class="item-label metaradio_station_next_program_countdown" data-stationid="'+stationId+'"></span> \ 96 <span class="item-title metaradio_station_next_program_name" data-stationid="'+stationId+'"></span> \ 97 </div> \ 98 </div>'; 99 100 // Fetch data and render 101 if(autoplay == true) { 102 metaradio_station_now(stationId, player_playpause_autoplay_callback); 103 player_tracking("Player_Station_Play", "Station: #" + stationId + " " + stationName); 104 } else { 105 metaradio_station_now(stationId); 106 } 107 player_countdown(); 108 setInterval(player_countdown, 4000); 109 110 // Event listener for scrubbable clicker & full screen player click 111 var player_scrub_click = document.querySelectorAll('#player-global .items'); 112 player_scrub_click[0].onclick = player_ondemand_scrub; 113} 114 115var player_playpause_autoplay_callback = function(stationId) { 116 // Callback received when station data has been updated 117 player_playpause_toggle(); 118} 119 120var player_stationselect_select = function(event) { 121 // Event handler - Called when a Station is clicked from the dropdown 122 var stationId = this.getAttribute("data-stationid"); 123 player_stationselect_toggle(event); 124 player_stationload(stationId, this.innerHTML, true); 125 126 document.getElementById('player-button-rewind').style.display = 'none'; 127 document.getElementById('player-button-forward').style.display = 'none'; 128 129 player_tracking("Player_Station_Change", "Station: #" + stationId + " " + this.innerHTML); 130 131 event.preventDefault(); 132}; 133 134// Setup click event handlers for Station Select buttons in dropdown 135var player_stationselect_links = document.getElementsByClassName("player-station-select-station"); 136for (var i = 0; i < player_stationselect_links.length; i++) { 137 player_stationselect_links[i].addEventListener('click', player_stationselect_select, false); 138} 139 140// Global Player - play/pause button click handler 141var player_playpause_toggle = function(event) { 142 var stationId = document.getElementById('player-global').getAttribute('data-stationid'); 143 var stationName = document.getElementById('player-station-name').innerHTML; 144 145 if(stationId != '0') { 146 metaradio_radioplayer = { 147 'allow_pause': false, 148 'station_data': metaradio.station_data[stationId].station, 149 }; 150 151 if(jQuery('#player-global .button-playpause').html().includes('icon-play')) { 152 player_tracking("Player_Station_Play", "Station: #" + stationId + " " + stationName); 153 } 154 155 } else if('paused_gracefully' in metaradio_radioplayer 156 && metaradio_radioplayer.paused_gracefully == true 157 && typeof mejs !== 'undefined' 158 && typeof mejs.players !== 'undefined' 159 && typeof mejs.players.mep_0 !== 'undefined' 160 && mejs.players.mep_0.paused == true) { 161 // Resume playback of on-demand file 162 mejs.players.mep_0.play(); 163 player_volume_set(); 164 event.preventDefault(); 165 return; 166 } 167 168 metaradio_player_toggle(); 169 player_volume_set(); 170 171 if(typeof event != 'undefined') { 172 event.preventDefault(); 173 } 174}; 175 176var player_button_playpause = document.getElementById('player-button-playpause'); 177player_button_playpause.onclick = player_playpause_toggle; 178 179// Global Player - rewind button 180var player_rewind = function(event) { 181 event.preventDefault(); 182 183 if(typeof mejs !== 'undefined' 184 && typeof mejs.players !== 'undefined' 185 && typeof mejs.players.mep_0 !== 'undefined') { 186 // Rewind on-demand file 187 mejs.players.mep_0.setCurrentTime(mejs.players.mep_0.getCurrentTime() - 30); 188 return; 189 } 190}; 191 192var player_button_rewind = document.getElementById('player-button-rewind'); 193player_button_rewind.onclick = player_rewind; 194 195// Global Player - forward button 196var player_forward = function(event) { 197 event.preventDefault(); 198 199 if(typeof mejs !== 'undefined' 200 && typeof mejs.players !== 'undefined' 201 && typeof mejs.players.mep_0 !== 'undefined') { 202 // Seek forwards on-demand file 203 mejs.players.mep_0.setCurrentTime(mejs.players.mep_0.getCurrentTime() + 30); 204 return; 205 } 206}; 207 208var player_button_forward = document.getElementById('player-button-forward'); 209player_button_forward.onclick = player_forward; 210 211// This function overrides the one provided by the plugin 212function metaradio_player_controls(action) { 213 var control = jQuery('#player-global .button-playpause'); 214 215 if(action == "play") { 216 if(!control.html().includes('icon-play')) { 217 control.html('<span class="icon-play"></span>'); 218 } 219 jQuery('body').addClass('metaradio-player-stopped'); 220 jQuery('body').removeClass('metaradio-player-playing'); 221 222 } else if(action == "stop") { 223 if(!control.html().includes('icon-pause')) { 224 control.html('<span class="icon-pause"></span>'); 225 } 226 jQuery('body').removeClass('metaradio-player-stopped'); 227 jQuery('body').addClass('metaradio-player-playing'); 228 229 } else if(action == "buffering") { 230 if(!control.html().includes('icon-loader')) { 231 control.html('<span class="icon-loader"></span>'); 232 } 233 jQuery('body').removeClass('metaradio-player-stopped'); 234 jQuery('body').addClass('metaradio-player-playing'); 235 236 } else { 237 // Error state 238 if(!control.html().includes('icon-warning')) { 239 control.html('<span class="icon-warning"></span>'); 240 } 241 jQuery('body').addClass('metaradio-player-stopped'); 242 jQuery('body').removeClass('metaradio-player-playing'); 243 } 244} 245 246// Global Player - volume row toggle 247var player_volume_toggle = function() { 248 var volume = document.getElementById('player-volume'); 249 var volume_button_main = document.getElementById('player-button-volume'); 250 251 if (volume.style.display !== 'none') { 252 volume.style.display = 'none'; 253 if(volume_button_main.classList.contains("active")) { 254 volume_button_main.classList.remove("active"); 255 } 256 } else { 257 volume.style.display = 'block'; 258 volume_button_main.className += " active"; 259 } 260 261 event.preventDefault(); 262}; 263 264var player_button_volume = document.getElementById('player-button-volume'); 265player_button_volume.onclick = player_volume_toggle; 266 267// Global Player - volume up/down buttons 268var player_volume_down = function(event) { 269 var volume_indicator = document.getElementById('player-volume-indicator'); 270 271 current_volume = volume_indicator.style.width; 272 current_volume = parseInt(current_volume); 273 274 if(current_volume >= 10) { 275 // Decrease volume by 10% 276 new_volume = current_volume - 10; 277 volume_indicator.style.width = new_volume + '%'; 278 player_volume_set(); 279 } 280 281 event.preventDefault(); 282}; 283 284var player_volume_up = function(event) { 285 var volume_indicator = document.getElementById('player-volume-indicator'); 286 287 current_volume = volume_indicator.style.width; 288 current_volume = parseInt(current_volume); 289 290 if(current_volume <= 90) { 291 // Increase volume by 10%
292 new_volume = current_volume + 10; 293 volume_indicator.style.width = new_volume + '%'; 294 player_volume_set(); 295 } 296 297 event.preventDefault(); 298}; 299 300var player_volume_set = function() { 301 var volume_indicator = document.getElementById('player-volume-indicator'); 302 current_volume = volume_indicator.style.width; 303 current_volume = parseInt(current_volume); 304 305 if(typeof mejs !== 'undefined' && typeof mejs.players !== 'undefined' && typeof mejs.players.mep_0 !== 'undefined') { 306 mejs.players.mep_0.setVolume(current_volume / 100); 307 } 308 309 player_tracking("Player_Volume_Change", current_volume); 310} 311 312var player_button_volume_down = document.getElementById('player-button-volume-down'); 313var player_button_volume_up = document.getElementById('player-button-volume-up'); 314player_button_volume_down.onclick = player_volume_down; 315player_button_volume_up.onclick = player_volume_up; 316 317// Global Player - next show countdown time 318setInterval(player_countdown, 60000); 319var player_countdown = function(){ 320 var items = document.querySelectorAll("#player-global .metaradio_station_next_program_countdown"); 321 for(var i = 0; i < items.length; i++) { 322 var countdown_to = items[i].getAttribute("data-countdown-time"); 323 var unix_timestamp_now = Math.round((new Date()).getTime() / 1000); 324 if(countdown_to !== null) { 325 var secs_remaining = countdown_to - unix_timestamp_now; 326 var minutes_remaining = parseInt(secs_remaining / 60); 327 var hours_remaining = parseInt(secs_remaining / 60 /60); 328 if(secs_remaining < 0) { 329 items[i].innerHTML = ''; 330 } else if(hours_remaining == 1) { 331 items[i].innerHTML = 'Up next in '+hours_remaining+' hour'; 332 } else if(hours_remaining >= 1) { 333 items[i].innerHTML = 'Up next in '+hours_remaining+' hours'; 334 } else if(hours_remaining < 1) { 335 items[i].innerHTML = 'Up next in '+minutes_remaining+' minutes'; 336 } else { 337 items[i].innerHTML = 'Up next'; 338 } 339 340 } 341 } 342}; 343 344// Global Player - hijack links to static files, and use them for our purposes 345var player_ondemand_setup = function() { 346 var items = document.querySelectorAll("a.global-player-launch"); 347 for(var i = 0; i < items.length; i++) { 348 items[i].setAttribute('data-audiourl', items[i].getAttribute('href')); 349 items[i].setAttribute('href', '#'); 350 items[i].addEventListener("click", player_ondemand_play); 351 } 352} 353 354var player_invoke = function() { 355 // Checks if the player is visible, and display it if not 356 357 var player = document.getElementById('player-global'); 358 359 if(player.classList.contains("hidden")) { 360 player.classList.remove("hidden"); 361 player.classList.add("visible"); 362 } 363 364} 365 366// Register on-load command 367jQuery(document).ready(player_ondemand_setup); 368 369var player_ondemand_play = function(event) { 370 // Event handler for beginning playback of on-demand files 371 372 event.preventDefault(); 373 374 player_invoke(); 375 376 var audio_url = this.getAttribute('data-audiourl'); 377 var audio_title = this.getAttribute('title'); 378 var audio_avatar = this.getAttribute('data-audioavatar'); 379 380 // Reset player 381 if(typeof mejs !== 'undefined' && typeof mejs.players !== 'undefined' && typeof mejs.players.mep_0 !== 'undefined') { 382 383 // If this track is already playing, pause the file instead 384 if(audio_url == mejs.players.mep_0.getSrc()) { 385 386 if(mejs.players.mep_0.media.paused == true) { 387 mejs.players.mep_0.play(); 388 389 if(event.target.tagName.toLowerCase() == 'span') { 390 event.target.className = "icon-pause"; 391 } 392 } else { 393 mejs.players.mep_0.pause(); 394 395 if(event.target.tagName.toLowerCase() == 'span') { 396 event.target.className = "icon-play"; 397 } 398 } 399 400 return; 401 } 402 403 mejs.players.mep_0.pause(); 404 mejs.players.mep_0.remove(); 405 } 406 jQuery('#metaradio-audio-player').html(''); 407 408 if(audio_url.indexOf('.mp3') !== -1) { 409 audio_format = 'audio/mp3'; 410 } else { 411 audio_format = 'audio/mp4'; 412 } 413 414 metaradio_radioplayer = { 415 'allow_pause': true, 416 'station_data': { 417 'streams': [ 418 { 419 'url': audio_url, 420 'format': audio_format, 421 } 422 ] 423 } 424 }; 425 426 document.getElementById('player-station-name').innerHTML = 'On Demand'; 427 document.getElementById('player-global').setAttribute('data-stationid', '0'); 428 document.querySelectorAll('#player-global .player-main-row')[0].classList.add('on-demand-playing'); 429 430 document.getElementById('player-button-rewind').style.display = 'flex'; 431 document.getElementById('player-button-forward').style.display = 'flex'; 432 433 var items_container = document.querySelectorAll("#player-global .items"); 434 items_container[0].innerHTML = ' \ 435 <div id="player-track-progress"></div>\ 436 <div class="item"> \ 437 <div class="avatar"><img class="avatar" src="'+audio_avatar+'" /></div> \ 438 <div> \
439 <span class="item-label">NOW PLAYING</span> \ 440 <span class="item-title">'+audio_title+'</span> \ 441 </div> \ 442 </div>\ 443 <div class="item countdown"> \ 444 <div> \ 445 <span class="item-remaining"></span> \ 446 </div> \ 447 </div>'; 448 449 metaradio_player_toggle(); 450 player_volume_set(); 451 452 document.getElementById('metaradio-audio-player').addEventListener('timeupdate', function() { 453 // Visual indication of track progress 454 var currentTime = mejs.players.mep_0.getCurrentTime(); 455 var trackDuration = mejs.players.mep_0.duration; 456 var trackPercentage = currentTime / trackDuration * 100; 457 jQuery("#player-global .items #player-track-progress").css('width', trackPercentage + "%"); 458 jQuery("#player-global .items .item.countdown .item-remaining").text(time_seconds_friendly(currentTime)); 459 }); 460 461 // Add class to indicate this scrubber is clickable 462 jQuery('#player-global .items').addClass('scrubbable'); 463 464 // Hide the 'Station Select' menu if it's still expanded 465 var stationselect = document.getElementById('player-station-select'); 466 var stationselect_button_main = document.getElementById('player-button-station-select'); 467 468 if (stationselect.style.display !== 'none') { 469 stationselect.style.display = 'none'; 470 if(stationselect_button_main.classList.contains("active")) { 471 stationselect_button_main.classList.remove("active"); 472 } 473 } 474 475 // Change the 'play' icon from the calling link 476 if(event.target.tagName.toLowerCase() == 'span') { 477 event.target.className = "icon-pause"; 478 } 479 480 player_tracking("Player_OnDemand_Play", "On Demand Track Title: " + audio_title); 481} 482 483var player_ondemand_scrub = function(e) { 484 // Allow clicking around the track bar to skip forward/back in the track, or link to the full screen player page 485 e.preventDefault(); 486 487 if(typeof mejs !== 'undefined' 488 && typeof mejs.players !== 'undefined' 489 && typeof mejs.players.mep_0 !== 'undefined' 490 && jQuery("#player-global .items #player-track-progress").length == 1) { 491 // Calculate desired time and skip to that section 492 493 var posX = jQuery(this).position().left, 494 elementPosX = e.pageX - posX, 495 elementPercentageX = elementPosX / jQuery(this).width() * 100; 496 497 var newDuration = mejs.players.mep_0.duration * elementPercentageX / 100; 498 mejs.players.mep_0.setCurrentTime(newDuration); 499 return; 500 } else if(jQuery("#player-global .items #player-track-progress").length == 0) { 501 // When clicking the items during a live stream, link to the full screen player page 502 503 // Get Station ID 504 var stationId = document.getElementById('player-global').getAttribute('data-stationid'); 505 if(stationId != 0 && typeof metaradio.station_data[stationId] != 'undefined' && metaradio.station_data[stationId]['station']['playerUrl'] != '') { 506 History.pushState(null, 'Player', metaradio.station_data[stationId]['station']['playerUrl']); 507 return false; 508 } 509 } 510} 511 512// Time helper function 513var time_seconds_friendly = function(time_seconds) { 514 // Converts seconds to hours:minutes:seconds 515 516 var date = new Date(null); 517 date.setSeconds(time_seconds); 518 var formatted = date.toISOString().substr(11, 8); 519 520 // Hours display is optional 521 if(formatted.substr(0, 3) == '00:') { 522 formatted = formatted.substr(3) 523 } 524 525 return formatted; 526} 527 528var player_tracking = function(event_name, event_label) { 529 // Sends Google Analytics & Meta Pixel tracking events 530 531 if(typeof gtag != 'undefined') { 532 gtag('event', event_name, { 533 event_category: 'Global_Player', 534 event_label: event_label, 535 }); 536 } 537 538 if(typeof window.dataLayer != 'undefined') { 539 window.dataLayer.push({ 540 'event': event_name, 541 'event_category': 'Global_Player', 542 'event_label': event_label, 543 }); 544 } 545 546 if(typeof fbq != 'undefined') { 547 fbq('trackCustom', event_name, {label: event_label}); 548 } 549 550}
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.