PageSourceSearch

https://www.tbn.org/themes/custom/tbnnet/js/schedule.js?tlkm0r

js tbn.org collected 2026-09-24 09:11:21 UTC 26,815 bytes, 588 lines download raw bytes

1( function( $, Drupal, drupalSettings ) {
2  $(document).ready(function () {
3
4    const EMPTY_ROW = '<tr class="episode-row selected-day processing empty-row" >' +
5      '<td class="time-column"></td>' +
6      '<td class="title-column">Schedule Information Coming Soon</td>' +
7      '</tr>';
8
9    //add empty row
10    function addEmptyTimeslots(){
11      var selectedRows = $('.episode-row.selected-day');
12      for (var i=0;i<selectedRows.length - 1;i++) {
13        var endTimestamp = new Date ($(selectedRows[i]).data('timestamp-end-utc'));
14        var startTimestamp = new Date ($(selectedRows[i+1]).data('timestamp-utc'));
15        var diff = (startTimestamp - endTimestamp) / 1000 / 60; // in minutes
16        if ( diff > 10 && $(selectedRows[i+1]).data('timestamp-utc') != $(selectedRows[i]).data('timestamp-utc')){
17          $(selectedRows[i]).after(EMPTY_ROW);
18        }
19      }
20    }
21
22    function convertToTimezone(time, fromTimezone, toTimezone, date) {
23      var nowDate = moment(date).tz(toTimezone).format('l');
24      return moment.tz( nowDate + ' ' + time, fromTimezone).tz(toTimezone);
25    }
26
27    function scrollToScheduleActiveItem(isCustomTime) {
28      if ($('#schedule-table-wrapper').length) {
29        var tableWrapper = $('#schedule-table-wrapper');
30        if (isCustomTime && window.location.href.split('time=')[1]) {
31          var time  = window.location.href.split('time=')[1].toLowerCase();
32          var episodeRow = tableWrapper.find('.episode-row.selected-day[data-time="' + time + '"]');
33          if (episodeRow.length) {
34            tableWrapper.animate({scrollTop: episodeRow.position().top}, 600);
35            setTimeout(function() {
36              $('.active').trigger('click');
37            }, 100);
38          }
39        } else if ($('#schedule-table-wrapper .active').length) {
40          tableWrapper.animate({ scrollTop: tableWrapper.find('.active').position().top }, 600);
41          setTimeout(function() {
42            $('.active').trigger('click');
43          }, 100);
44        }
45      }
46    }
47
48    function updateScheduleItemsTimestamps(timezone) {
49      $('.upcoming-schedule-section .schedule-item').each( function(){
50        var scheduleItem = $(this);
51        var timestamp = moment(scheduleItem.attr('data-timestamp-utc'));
52        timestamp = timezone ? timestamp.tz(timezone) : timestamp;
53        scheduleItem.find('.schedule-date').text(timestamp.format('dddd, MMM Do'));
54        scheduleItem.find('.schedule-time').text(timestamp.format('LT'));
55      });
56    }
57
58    function updateRecentEpisodesTimestamps(timezone) {
59      $('#episodes-slider .episode-time:not(.program-recent)').each( function(){
60        var scheduleItem = $(this);
61        var timestamp = moment(scheduleItem.attr('data-timestamp')).tz('UTC');
62        scheduleItem.text(formatEpisodesTimestamp(timestamp, timezone));
63      });
64    }
65
66    function updateFeaturedEpisodeTimestamp(timezone) {
67      $('.featured-episode-section .episode-time:not(.program-feature)').each( function(){
68        var scheduleItem = $(this);
69        var timestamp = moment(scheduleItem.attr('data-timestamp')).tz('UTC');
70        scheduleItem.text(formatEpisodesTimestamp(timestamp, timezone));
71      });
72    }
73
74    function formatEpisodesTimestamp (timestamp, timezone){
75      timestamp = timezone ? timestamp.tz(timezone) : timestamp;
76      return timestamp.format('MMM, D YYYY') + ' at  ' + timestamp.format('h:mm a');
77    }
78
79    function setDaySchedule(time) {
80      var defaultTimezone = "America/Los_Angeles";
81      var currentTimezone = moment.tz.guess();
82      var now = moment(time);
83      var nowRowIndex = null;
84      var scheduleTable = $('#schedule-table-wrapper .schedule-table');
85      scheduleTable.html('');
86      var scheduleItems = {};
87      var currentTime = moment();
88      $('#scroll-to-active').addClass('not-today');
89      $('#schedule-days-wrapper .go-to-today').removeClass('disable');
90      $.each($('#block-views-block-programs-list .views-row'), function (index, row){
91        var episodeTime = convertToTimezone($(row).find('.episode-time').text().replace(/\s/g, ''), defaultTimezone, currentTimezone, now);
92        var nextEpisodeTime = convertToTimezone($('#block-views-block-programs-list .views-row').eq(index + 1).find('.episode-time').text().replace(/\s/g, ''), defaultTimezone, currentTimezone);
93        if ($(row).find('.episode-days').text().includes(episodeTime.format('dddd'))) {
94          var episodeItem = '';
95          if (!nowRowIndex && episodeTime.isBefore(currentTime) && currentTime.isBefore(nextEpisodeTime) && currentTime.format('MM DD') == episodeTime.format('MM DD')) {
96            nowRowIndex = index;
97            $('#scroll-to-active').removeClass('not-today');
98            $('#schedule-days-wrapper .go-to-today').addClass('disable');
99            episodeItem = '<tr class="active" id="active-item">' +
100              '<td class="time-column">' + episodeTime.format('LT') + '</td>' +
101              ' <td class="title-column">' +
102              '   <a href="https://watch.tbn.org/p/wUwJ86KF?channel=OZpATbsP" class="btn red">Watch Now</a>' +
103              $(row).find('.episode-title').html() +
104              '   <span class="description">' + $(row).find('.episode-description').html() + '</span>' +
105              ' </td>' +
106              '</tr>';
107          } else {
108            episodeItem = '<tr>' +
109              '<td class="time-column">' + episodeTime.format('LT') + '</td>' +
110              '<td class="title-column">' + $(row).find('.episode-title').html() + '</td>' +
111              '</tr>';
112          }
113          scheduleItems[episodeTime.format('LT')] = episodeItem;
114        }
115      });
116      var timeStamps =  Object.keys(scheduleItems);
117      timeStamps.sort();
118      for(var i=0; i < timeStamps.length; i++){
119        scheduleTable.append(scheduleItems[timeStamps[i]]);
120      }
121    }
122
123    function showCurrentDaySchedule(date, timezone) {
124      $('#schedule-table-wrapper tr.selected-day').removeClass('selected-day');
125      $('#schedule-table-wrapper tr.active').removeClass('active').find('.watch-now, .description').remove();
126      $('#scroll-to-active').addClass('not-today');
127      var selectedDayItem = $('#schedule-table-wrapper tr[data-date="' + date + '"]');
128
129      if (selectedDayItem.length) {
130        var now = timezone ? moment().tz(timezone) : moment();
131        if (now.format('YYYY-MM-DD') == date) {
132          selectedDayItem.each(function (index) {
133            var timeRow = $(this);
134            if (now.format('YYYY-MM-DDTHH:mm:ss') >= timeRow.attr('data-timestamp') && (selectedDayItem.length == index + 1 || now.format('YYYY-MM-DDTHH:mm:ss') < $(selectedDayItem.get(index + 1)).attr('data-timestamp'))) {
135              timeRow.addClass('active');
136              $('#scroll-to-active').removeClass('not-today');
137              var activeTitle = timeRow.find('.title-column');
138              if (!activeTitle.find('.watch-now').length) {
139                // activeTitle.prepend('<a href="' + $(this).attr("data-program-url") + '" class="btn red watch-now">Watch Now</a>');
140                activeTitle.prepend('<a href="https://watch.tbn.org/p/wUwJ86KF?channel=OZpATbsP" class="btn red watch-now">Watch Now</a>');
141                activeTitle.append('<span class="description">' + timeRow.attr("data-synopsis") + '</span>');
142              }
143            }
144            // timeRow.find('.time-column .clickable').text(moment(timeRow.attr('data-timestamp-utc') + '+0000').format('h:mm A'));
145          });
146        }
147        selectedDayItem.addClass('selected-day');
148        addEmptyTimeslots();
149      } else {
150        if ($('#schedule-table-wrapper .empty-row').length) {
151          $('#schedule-table-wrapper .empty-row').addClass('selected-day');
152        } else {
153          $('#schedule-table-wrapper tbody').first().append(EMPTY_ROW);
154        }
155      }
156    }
157
158    function setDays(date){
159      var daysWrapper = $('#schedule-days-wrapper');
160      var currentDate = moment(date);
161      var today = moment().format('L');
162      daysWrapper.find('.day-of-week').remove();
163      for (var i = 0; i < 7; i++) {
164        var classes = 'day-of-week';
165        var isToday = false;
166        if (currentDate.format('L') === today) {
167          classes += ' today';
168          isToday = true;
169        }
170        switch (i) {
171          case 0: {
172            classes+=' first active';
173            break;
174          }
175          case 6: {
176            classes+=' last';
177            break;
178          }
179        }
180        dayItem = '<a href="#' + currentDate.format('YYYY-MM-DDTH:mm:ss') + '" data-date="' + currentDate.format('YYYY-MM-DD') + '" class="' + classes + '">' +
181          '<span class="day-name">' + ((isToday) ? 'Today' : currentDate.format('dddd')) + '</span>' +
182          '<span class="date">' + currentDate.format('MMM D') + '</span>' +
183          '</a>';
184        daysWrapper.append(dayItem);
185        currentDate.add('days', 1);
186      }
187      daysWrapper.find('.day-controls').appendTo(daysWrapper);
188    }
189
190    //convert timestamps to user timezone on Schedule block (Home page)
191    // function updateScheduleBlockTimestamps() {
192
193    //   if (drupalSettings.tbnSchedule !== undefined) {
194    //     var events = JSON.parse(drupalSettings.tbnSchedule.events);
195    //     $('#schedule-section-block .episode-time, .fixed-schedule .episode-time').each(function (i) {
196
197    //       if (events[i] !== undefined && events[i].timestamp !== undefined) {
198    //         var time = moment.unix(events[i].timestamp).tz('UTC').tz(moment.tz.guess()).format('h:mm A');
199    //         $(this).text(time);
200    //         $(this).next('.episode-title').html(events[i].title);
201    //       }
202    //     });
203    //   }
204    // }
205
206    //update schedule items to user timezone on Schedule table
207    function updateScheduleTableTimestamps(timezone){
208      $('#schedule-table-wrapper .episode-row').each(function() {
209        var episodeItem = $(this);
210        var episodeTime = moment(episodeItem.data('timestamp-utc')+ '+0000');
211        if (timezone) {
212          episodeTime.tz(timezone);
213        }
214        var episodeItemTimeFormat = (episodeTime.format('mm') === '00') ? 'ha': 'h:mma';
215        episodeItem
216          .attr('data-timestamp', episodeTime.format('YYYY-MM-DDTHH:mm:ss'))
217          .attr('data-date', episodeTime.format('YYYY-MM-DD'))
218          .attr('data-time', episodeTime.format(episodeItemTimeFormat))
219          .find('.time-column span').text(episodeTime.format('h:mm A'));
220      });
221    }
222
223    //function get moment timestamp
224    function getMomentTimestamp(){
225      var url = new URL(window.location.href);
226      var searchParams = new URLSearchParams(url.search);
227      var date = searchParams.get('date');
228      return /\d{4}\-\d{2}\-\d{2}/.test(date) ? moment(date) : moment();
229    }
230
231    // toggle Now button on schedule table
232    $('#schedule-table-wrapper').scroll(function(){
233      if ($('.today.active').length) {
234        var tableWrapper = $('#schedule-table-wrapper');
235        var tableScrollPosition = tableWrapper.scrollTop();
236        var activeRowPosition =  tableWrapper.find('.active').position().top;
237        if
238          (tableScrollPosition + tableWrapper.height() >= activeRowPosition &&
239          (tableScrollPosition < activeRowPosition + tableWrapper.find('.active').height() )
240          ){
241            $('#scroll-to-active').addClass('hidden');
242          } else {
243            $('#scroll-to-active').removeClass('hidden');
244        }
245      } else {
246        $('#scroll-to-active').removeClass('hidden');
247      }
248    });
249
250    // OLD
251    //set schedule programs on Home page
252    // if($('#block-views-block-programs-list').length ){
253    //   var defaultTimezone = "America/Los_Angeles";
254    //   var currentTimezone = moment.tz.guess();
255    //   var now = moment();
256    //   var nowRowIndex = null;
257    //   $.each($('#block-views-block-programs-list .views-row'), function (index, row){
258    //     var episodeTime = convertToTimezone($(row).find('.episode-time').text().replace(/\s/g, ''), defaultTimezone, currentTimezone);
259    //     var nextEpisodeTime = convertToTimezone($('#block-views-block-programs-list .views-row').eq(index + 1).find('.episode-time').text().replace(/\s/g, ''), defaultTimezone, currentTimezone);
260    //     if( episodeTime.isBefore(now) && now.isBefore(nextEpisodeTime)){
261    //       nowRowIndex = index;
262    //       return;
263    //     }
264    //   });
265    //   for (var i=0; i<=2; i++){
266    //     var row = $('#block-views-block-programs-list .views-row').eq(nowRowIndex + i
266);
267    //     var episodeWrapper = (i === 0) ? $('.schedule-section .now-block') : $('.schedule-section .episode-wrapper').eq(i-1);
268    //     var episodeTime = convertToTimezone(row.find('.episode-time').text().replace(/\s/g, ''), defaultTimezone, currentTimezone);
269    //     episodeWrapper.find('.episode-title').html(row.find('.episode-title').html());
270    //     episodeWrapper.find('.episode-time').html(episodeTime.format('LT'));
271    //     episodeWrapper.find('.episode-description').html(row.find('.episode-description').html());
272    //   }
273    // }
274
275    //scroll to online program on schedule page
276    // scrollToScheduleActiveItem();
277
278    $('#scroll-to-active').on('click', function(event){
279      event.preventDefault();
280      if ($(this).hasClass('not-today')) {
281        $('#schedule-days-wrapper .day-of-week.today').click();
282      }
283      scrollToScheduleActiveItem();
284    });
285
286
287    if ($('.timezone-dropdown').length){
288      var timezone = $('.timezone-dropdown option').first().val();
289      var needleTimeOption = '';
290      if (window.location.href.split('timezone=')[1]){
291        needleTimeOption = $('.timezone-dropdown option:contains("' + window.location.href.split('timezone=')[1].slice(1) + '")');
292        timezone = needleTimeOption.val();
293      } else {
294        // var currentOffset = moment().parseZone().utcOffset()/60;
295        var currentTimeZone = moment.tz.guess();
296        needleTimeOption = $('.timezone-dropdown option[data-value*="' + moment().tz(moment.tz.guess()).format('z') + '"]');
297
298        if (!needleTimeOption.length) {
299          timezone = currentTimeZone;
300          $('.timezone-dropdown').prepend('<option value="' + currentTimeZone + '">Local (' + currentTimeZone + ')</option>');
301        } else {
302          timezone = needleTimeOption.val();
303        }
304      }
305      $('.timezone-dropdown').val(timezone).change();
306      updateRecentEpisodesTimestamps(timezone);
307      updateScheduleItemsTimestamps(timezone);
308      updateFeaturedEpisodeTimestamp(timezone);
309    }
310
311    var timestamp = getMomentTimestamp();
312    //set days on Schedule page
313    if ($('#schedule-days-wrapper').length) {
314      setDays(timestamp.format());
315    }
316
317    //set current day programs
318    if($('#block-views-block-programs-list').length ){
319      setDaySchedule(timestamp.format());
320    }
321    if ($('#schedule-table-wrapper').length) {
322      var timezone = $('.timezone-dropdown').length ? $('.timezone-dropdown').val() : '';
323      updateScheduleTableTimestamps(timezone);
324      timestamp = timezone ? timestamp.tz(timezone).format('YYYY-MM-DD') : timestamp.format('YYYY-MM-DD');
325      showCurrentDaySchedule(timestamp);
326      scrollToScheduleActiveItem(true);
327    }
328
329    //set schedule on select day
330    $('#schedule-days-wrapper').on('click', '.day-of-week', function(event){
331      event.preventDefault();
332      $('#schedule-days-wrapper .day-of-week.active').removeClass('active');
333      // var selectedTime = ($(this).hasClass('today')) ? moment().format() : $(this).data('date');
334      // setDaySchedule(selectedTime);
335      var date = $(this).data('date');
336      showCurrentDaySchedule(date);
337      updateScheduleUrl(date);
338      $(this).addClass('active');
339    });
340
341    //update schedule url
342    function updateScheduleUrl(date) {
343      if (window.location.search.indexOf('date=') !== -1 ){
344        window.history.replaceState('', null, window.location.href.replace(/date=\d{4}\-\d{2}\-\d{2}/, 'date=' + date));
345      } else {
346        window.history.pushState('', null, '?date='+ date);
347      }
348    }
349
350    //update days on Schedule table
351    $('#schedule-days-wrapper').on('click', '.update-days', function(){
352      var scheduleWrapper = '.schedule-table-wrapper';
353      $(scheduleWrapper).addClass('loading');
354      if ($(this).hasClass('disable')) return;
355      var timeStamp = null;
356      var isGoToday = false;
357      var url = '/watch/schedules?date=';
358      var scheduleTable = ' .schedule-table tbody';
359      switch ($(this).data('action')) {
360        case "prev": {
361          timeStamp = moment($('#schedule-days-wrapper .day-of-week.first').data('date')).subtract(7, 'days');
362          var date = timeStamp.format('YYYY-MM-DD');
363          $(scheduleTable).load(url + date + scheduleTable, function(){
364            updateScheduleTableTimestamps();
365            $('#schedule-days-wrapper .go-to-today').removeClass('disable');
366            $('#schedule-days-wrapper .day-of-week.first').click();
367            // updateScheduleUrl(date);
368            $(scheduleWrapper).removeClass('loading');
369          });
370          break;
371        }
372        case "next": {
373          var date = $('#schedule-days-wrapper .day-of-week.last').data('date');
374          $(scheduleTable).load(url + date + scheduleTable, function(){
375            updateScheduleTableTimestamps();
376            $('#schedule-days-wrapper .go-to-today').removeClass('disable');
377            $('#schedule-days-wrapper .day-of-week.first').click();
378            // updateScheduleUrl(date);
379            $(scheduleWrapper).removeClass('loading');
380          });
381          timeStamp = moment(date).add('days', 1);
382          break;
383        }
384        default: {
385          timeStamp = moment();
386          isGoToday = true;
387          $(scheduleTable).load(url + timeStamp.format('YYYY-MM-DD') + sc
387heduleTable, function(){
388            updateScheduleTableTimestamps();
389            $('#schedule-days-wrapper .go-to-today').removeClass('disable');
390            $('#schedule-days-wrapper .day-of-week.first').click();
391            $('#scroll-to-active').click();
392            updateScheduleUrl(date);
393            $(scheduleWrapper).removeClass('loading');
394          });
395        }
396      }
397      setDays(timeStamp.format());
398      // if (isGoToday){
399        // $('#schedule-days-wrapper .day-of-week.today').click();
400        // $('#scroll-to-active').click();
401      // }
402    });
403
404    $('#schedule-table-wrapper').on('click', '.episode-row', function(){
405      var selectedElement = $(this);
406      console.log(selectedElement);
407      if (selectedElement.hasClass('processing')) { return; }
408      if (selectedElement.hasClass('show-details')){
409        selectedElement.removeClass('show-details');
410        return;
411      }
412      selectedElement.addClass('processing');
413      var selectedTimestamp = moment(selectedElement.attr('data-timestamp'));
414      var url = '/episode/' + selectedElement.attr('data-program-id') + '/' + (selectedTimestamp.format('H')*3600 + selectedTimestamp.format('mm')*60) + '/' + selectedElement.attr('data-date');
415
416      $('#schedule-table-wrapper .episode-row.show-details').removeClass('show-details');
417      if (selectedElement.hasClass('include-details')){
418        selectedElement.addClass('show-details');
419        selectedElement.removeClass('processing');
420      } else if(selectedElement.attr('data-program-id')) {
421        $.ajax({
422          type: 'GET',
423          url: url
424        }).done(function (result) {
425          if (result.length) {
426            var episode = result[0];
427            // var mediaElement = episode.field_video_url[0].value ? '<iframe src="' + episode.field_video_url[0].value + '?rel=0" allowfullscreen=""></iframe>' : '<img src="' + episode.field_image[0].url + '" loading="lazy" onerror="this.onerror=null;this.src=\'/themes/custom/tbnnet/images/image.png\';">';
428            var mediaElement = '<img src="' + episode.field_image[0].url + '" loading="lazy" onerror="this.onerror=null;this.src=\'/themes/custom/tbnnet/images/image.png\';">';
429            selectedElement.find('.time-column').append('<div class="details-wrapper"><span>' + episode.field_duration[0].value + '</span><span>' + episode.field_se[0].value + '</span></div>');
430            var programUrl = selectedElement.attr('data-program-url');
431            var detailsInfo = '<div class="details-wrapper">' +
432              '<div class="episode-image">' + mediaElement + '</div>' +
433              '<div class="episode-details">' +
434              '<div class="episode-info">'+ episode.body[0].value.replace(/<\/?[^>]+(>|$)/g, "") +'</div>' +
435              '<div class="buttons-wrapper">';
436            detailsInfo += (episode.field_vimeo_video[0].value) ? '<a href="' + episode.field_vimeo_video[0].value + '" class="btn">Watch Episode</a>' : '';
437            detailsInfo += programUrl ? '<a href="' + programUrl + '" class="link">Program Page</a>' : '';
438            detailsInfo +='</div></div></div>';
439            selectedElement.find('.title-column').append(detailsInfo);
440          } else {
441            // var mediaElement = selectedElement.attr('data-video-url') ? '<iframe src="' + selectedElement.attr('data-video-url') + '?rel=0" allowfullscreen=""></iframe>' : '<img src="' + selectedElement.attr('data-image-url') + '" loading="lazy" onerror="this.onerror=null;this.src=\'/themes/custom/tbnnet/images/image.png\';">';
442            var mediaElement = '<img src="' + selectedElement.attr('data-image-url') + '" loading="lazy" onerror="this.onerror=null;this.src=\'/themes/custom/tbnnet/images/image.png\';">';
443            var programUrl = selectedElement.attr('data-program-url');
444            var details = '<div class="details-wrapper">' +
445              '<div class="episode-image">' + mediaElement + '</div>' +
446              '<div class="episode-details">' +
447              '<div class="episode-info">'+ selectedElement.attr('data-synopsis') +'</div>' +
448              '<div class="buttons-wrapper">';
449            details += programUrl ? '<a href="' + selectedElement.attr('data-program-url') + '" class="link">Program Page</a>': '';
450            details += '</div></div>';
451            selectedElement.find('.title-column').append(details);
452          }
453          selectedElement.addClass('include-details show-details');
454          selectedElement.removeClass('processing');
455        }).fail(function () {
456          console.log('fail');
457          selectedElement.removeClass('processing');
458        });
459      } else {
460        var mediaElement = '<img src="/themes/custom/tbnnet/images/image.png" >';
461        var details = '<div class="details-wrapper">' +
462          '<div class="episode-image">' + mediaElement + '</div>' +
463          '<div class="episode-details">' +
464          '<div class="episode-info">'+ selectedElement.attr('data-synopsis') +'</div>' +
465          '<div class="buttons-wrapper">' +
466          '</div></div>';
467        selectedElement.find('.title-column').append(details);
468        selectedElement.addClass('include-details show-details');
469        selectedElement.removeClass('processing');
470      }
471
472    });
473
474    //update date/time on recent episodes section
475    // updateRecentEpisodesTimestamps();
476
477    //change timezone on recent episodes section
478    $('.upcoming-schedule-section .timezone-dropdown').on('change', function(){
479      var timezone = $(this).val();
480      updateRecentEpisodesTimestamps(timezone);
481      updateScheduleItemsTimestamps(timezone);
482      updateFeaturedEpisodeTimestamp(timezone);
483    });
484
485    $('.title-wrapper .timezone-dropdown').on('change', function(){
486      var timezone = $(this).val();
487      updateScheduleTableTimestamps(timezone);
488      var timestamp = timezone ? moment().tz(timezone).format('YYYY-MM-DD') : moment().format('YYYY-MM-DD');
489      showCurrentDaySchedule(timestamp, timezone);
490    });
491
492    updateFeaturedEpisodeTimestamp('EST');
493    // update date/time on upcoming schedule section
494    updateScheduleItemsTimestamps();
495    
496  });
497  // set schedule programs on Home page
498  // set time to user's time zone
499  window.updateScheduleBlockTimestamps = function() {
500    if (drupalSettings.tbnSchedule !== undefined) {
501      var events = JSON.parse(drupalSettings.tbnSchedule.events);
502      $('#schedule-section-block .episode-time, .fixed-schedule .episode-time').each(function (i) {
503        if (events[i] !== undefined && events[i].timestamp !== undefined) {
504          var time = moment.unix(events[i].timestamp).tz('UTC').tz(moment.tz.guess()).format('h:mm A');
505          $(this).text(time);
506          $(this).next('.episode-title').html(events[i].title);
507        }
508      });
509    }
510  }
511  // refresh homepage schedule block on 00 and 30
512  window.updateHomeSchedule = function() {
513    if (drupalSettings.tbnSchedule !== undefined) {
514      var viewName = 'schedule';
515      var instances = Drupal.views.instances;
516      var myView;
517      $.each(instances, function getInstance(index, element) {
518        if(element.settings.view_name == viewName) {
519          myView = '.js-view-dom-id-' + element.settings.view_dom_id;
520        }
521      });
522      var d = new Date();
523      var mins = d.getMinutes();
524      if(mins === 00 || mins === 30) {
525        // refresh view
526        $(myView).trigger('RefreshView');
527        // set time to user's time zone
528        setTimeout(updateScheduleBlockTimestamps, 1700);
529        console.log('done');
530      }
531    }
532  }
533
534  //  set time to user's time zone once schedule is loaded
535  $(window).on('load', function() {
536    updateScheduleBlockTimestamps();
537  });
538  // check to see if it's time to refresh schedule once every minute
539  setInterval(updateHomeSchedule, 60000);
540
541}) (jQuery, Drupal, drupalSettings);
542
543(function (Drupal, $, once, drupalSettings) {
544  Drupal.behaviors.tbnScheduleRefresh = {
545    attach: function (context) {
546
547      // Disable auto-focus ONLY for the schedule view
548      once('disableScheduleAutoFocus', '.view-id-schedule', context).forEach((viewEl) => {
549        viewEl.addEventListener('focus', function (e) {
550          e.stopImmediatePropagation();
551        }, true);
552      });
553
554      // Main logic
555      once('tbnScheduleRefresh', 'body', context).forEach(() => {
556
557        const waitForDigioh = () => {
558          if (window.DIGIOH && DIGIOH.parent && DIGIOH.parent.props) {
559
560            if (drupalSettings.tbnSchedule !== undefined) {
561
562              var viewName = 'schedule';
563              var instances = Drupal.views.instances;
564              var myView;
565
566              $.each(instances, function (index, element) {
567                if (element.settings.view_name === viewName) {
568                  myView = '.js-view-dom-id-' + element.settings.view_dom_id;
569                }
570              });
571
572              if (myView) {
573                $(myView).trigger('RefreshView');
574              }
575            }
576
577          } else {
578            setTimeout(waitForDigioh, 100);
579          }
580        };
581
582        waitForDigioh();
583
584      });
585
586    }
587  };
588})(Drupal, jQuery, once, drupalSettings);

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.