PageSourceSearch

https://www.frasercoast.fm/wp-content/themes/radiorelativity-cbaa/assets/scripts/player.js?ver=1790089025

js frasercoast.fm collected 2026-10-03 01:01:20 UTC 21,033 bytes, 550 lines download raw bytes

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.