diff --git a/dashboard-ui/components/tvguide/tvguide.js b/dashboard-ui/components/tvguide/tvguide.js
new file mode 100644
index 000000000..3a9b7325b
--- /dev/null
+++ b/dashboard-ui/components/tvguide/tvguide.js
@@ -0,0 +1,521 @@
+define(['livetvcss', 'scripts/livetvcomponents'], function () {
+
+ return function (options) {
+
+ var self = this;
+
+ self.refresh = function () {
+ reloadPage(options.element);
+ };
+
+ // 30 mins
+ var cellCurationMinutes = 30;
+ var cellDurationMs = cellCurationMinutes * 60 * 1000;
+ var msPerDay = 86400000;
+
+ var currentDate;
+
+ var defaultChannels = 50;
+ var channelLimit = 1000;
+
+ var channelQuery = {
+
+ StartIndex: 0,
+ Limit: defaultChannels,
+ EnableFavoriteSorting: true
+ };
+
+ var channelsPromise;
+
+ function normalizeDateToTimeslot(date) {
+
+ var minutesOffset = date.getMinutes() - cellCurationMinutes;
+
+ if (minutesOffset >= 0) {
+
+ date.setHours(date.getHours(), cellCurationMinutes, 0, 0);
+
+ } else {
+
+ date.setHours(date.getHours(), 0, 0, 0);
+ }
+
+ return date;
+ }
+
+ function reloadChannels(page) {
+ channelsPromise = null;
+ reloadGuide(page);
+ }
+
+ function reloadGuide(page) {
+
+ Dashboard.showModalLoadingMsg();
+
+ channelQuery.UserId = Dashboard.getCurrentUserId();
+
+ channelQuery.Limit = Math.min(channelQuery.Limit || defaultChannels, channelLimit);
+ channelQuery.AddCurrentProgram = false;
+
+ channelsPromise = channelsPromise || ApiClient.getLiveTvChannels(channelQuery);
+
+ var date = currentDate;
+
+ var nextDay = new Date(date.getTime() + msPerDay - 1);
+ Logger.log(nextDay);
+ channelsPromise.done(function (channelsResult) {
+
+ ApiClient.getLiveTvPrograms({
+ UserId: Dashboard.getCurrentUserId(),
+ MaxStartDate: nextDay.toISOString(),
+ MinEndDate: date.toISOString(),
+ channelIds: channelsResult.Items.map(function (c) {
+ return c.Id;
+ }).join(','),
+ ImageTypeLimit: 1,
+ EnableImageTypes: "Primary"
+
+ }).done(function (programsResult) {
+
+ renderGuide(page, date, channelsResult.Items, programsResult.Items);
+
+ Dashboard.hideModalLoadingMsg();
+
+ LibraryBrowser.setLastRefreshed(page);
+
+ });
+
+ if (options.enablePaging !== false) {
+ var channelPagingHtml = LibraryBrowser.getQueryPagingHtml({
+ startIndex: channelQuery.StartIndex,
+ limit: channelQuery.Limit,
+ totalRecordCount: channelsResult.TotalRecordCount,
+ updatePageSizeSetting: false,
+ showLimit: true
+ });
+
+ var channelPaging = page.querySelector('.channelPaging');
+ channelPaging.innerHTML = channelPagingHtml;
+ $(channelPaging);
+ }
+
+ Events.on(page.querySelector('.btnNextPage'), 'click', function () {
+ channelQuery.StartIndex += channelQuery.Limit;
+ reloadChannels(page);
+ });
+
+ Events.on(page.querySelector('.btnPreviousPage'), 'click', function () {
+ channelQuery.StartIndex -= channelQuery.Limit;
+ reloadChannels(page);
+ });
+
+ Events.on(page.querySelector('#selectPageSize'), 'change', function () {
+ channelQuery.Limit = parseInt(this.value);
+ channelQuery.StartIndex = 0;
+ reloadChannels(page);
+ });
+ });
+ }
+
+ function getTimeslotHeadersHtml(startDate, endDateTime) {
+
+ var html = '';
+
+ // clone
+ startDate = new Date(startDate.getTime());
+
+ html += '
';
+
+ return html;
+ }
+
+ function parseDates(program) {
+
+ if (!program.StartDateLocal) {
+ try {
+
+ program.StartDateLocal = parseISO8601Date(program.StartDate, { toLocal: true });
+
+ } catch (err) {
+
+ }
+
+ }
+
+ if (!program.EndDateLocal) {
+ try {
+
+ program.EndDateLocal = parseISO8601Date(program.EndDate, { toLocal: true });
+
+ } catch (err) {
+
+ }
+
+ }
+
+ return null;
+ }
+
+ function getChannelProgramsHtml(page, date, channel, programs) {
+
+ var html = '';
+
+ var startMs = date.getTime();
+ var endMs = startMs + msPerDay - 1;
+
+ programs = programs.filter(function (curr) {
+ return curr.ChannelId == channel.Id;
+ });
+
+ html += '';
+
+ for (var i = 0, length = programs.length; i < length; i++) {
+
+ var program = programs[i];
+
+ if (program.ChannelId != channel.Id) {
+ continue;
+ }
+
+ parseDates(program);
+
+ if (program.EndDateLocal.getTime() < startMs) {
+ continue;
+ }
+
+ if (program.StartDateLocal.getTime() > endMs) {
+ break;
+ }
+
+ var renderStartMs = Math.max(program.StartDateLocal.getTime(), startMs);
+ var startPercent = (program.StartDateLocal.getTime() - startMs) / msPerDay;
+ startPercent *= 100;
+ startPercent = Math.max(startPercent, 0);
+
+ var renderEndMs = Math.min(program.EndDateLocal.getTime(), endMs);
+ var endPercent = (renderEndMs - renderStartMs) / msPerDay;
+ endPercent *= 100;
+
+ html += '
';
+ }
+
+ html += '
';
+
+ return html;
+ }
+
+ function renderPrograms(page, date, channels, programs) {
+
+ var html = [];
+
+ for (var i = 0, length = channels.length; i < length; i++) {
+
+ html.push(getChannelProgramsHtml(page, date, channels[i], programs));
+ }
+
+ var programGrid = page.querySelector('.programGrid');
+ programGrid.innerHTML = html.join('');
+
+ $(programGrid).scrollTop(0).scrollLeft(0);
+
+ if (options.enableHoverMenu) {
+ $(programGrid).createGuideHoverMenu('.programCellInner');
+ }
+ }
+
+ function renderChannelHeaders(page, channels) {
+
+ var html = '';
+
+ for (var i = 0, length = channels.length; i < length; i++) {
+
+ var channel = channels[i];
+
+ html += '';
+ }
+
+ var channelList = page.querySelector('.channelList');
+ channelList.innerHTML = html;
+ ImageLoader.lazyChildren(channelList);
+ }
+
+ function renderGuide(page, date, channels, programs) {
+
+ renderChannelHeaders(page, channels);
+
+ var startDate = date;
+ var endDate = new Date(startDate.getTime() + msPerDay);
+ page.querySelector('.timeslotHeaders').innerHTML = getTimeslotHeadersHtml(startDate, endDate);
+ renderPrograms(page, date, channels, programs);
+ }
+
+ var gridScrolling = false;
+ var headersScrolling = false;
+ function onProgramGridScroll(page, elem) {
+
+ if (!headersScrolling) {
+ gridScrolling = true;
+
+ $(page.querySelector('.timeslotHeaders')).scrollLeft($(elem).scrollLeft());
+ gridScrolling = false;
+ }
+ }
+
+ function onTimeslotHeadersScroll(page, elem) {
+
+ if (!gridScrolling) {
+ headersScrolling = true;
+ $(page.querySelector('.programGrid')).scrollLeft($(elem).scrollLeft());
+ headersScrolling = false;
+ }
+ }
+
+ function changeDate(page, date) {
+
+ currentDate = normalizeDateToTimeslot(date);
+
+ reloadGuide(page);
+
+ var text = LibraryBrowser.getFutureDateText(date);
+ text = '' + text.replace(' ', ' ');
+ page.querySelector('.currentDate').innerHTML = text;
+ }
+
+ var dateOptions = [];
+
+ function setDateRange(page, guideInfo) {
+
+ var today = new Date();
+ today.setHours(today.getHours(), 0, 0, 0);
+
+ var start = parseISO8601Date(guideInfo.StartDate, { toLocal: true });
+ var end = parseISO8601Date(guideInfo.EndDate, { toLocal: true });
+
+ start.setHours(0, 0, 0, 0);
+ end.setHours(0, 0, 0, 0);
+
+ if (start.getTime() >= end.getTime()) {
+ end.setDate(start.getDate() + 1);
+ }
+
+ start = new Date(Math.max(today, start));
+
+ dateOptions = [];
+
+ while (start <= end) {
+
+ dateOptions.push({
+ name: LibraryBrowser.getFutureDateText(start),
+ id: start.getTime(),
+ ironIcon: 'today'
+ });
+
+ start.setDate(start.getDate() + 1);
+ start.setHours(0, 0, 0, 0);
+ }
+
+ var date = new Date();
+
+ if (currentDate) {
+ date.setTime(currentDate.getTime());
+ }
+
+ changeDate(page, date);
+ }
+
+ function reloadPageAfterValidation(page, limit) {
+
+ channelLimit = limit;
+
+ ApiClient.getLiveTvGuideInfo().done(function (guideInfo) {
+
+ setDateRange(page, guideInfo);
+ });
+ }
+
+ function reloadPage(page) {
+
+ $('.guideRequiresUnlock', page).hide();
+
+ RegistrationServices.validateFeature('livetv').done(function () {
+ Dashboard.showModalLoadingMsg();
+
+ reloadPageAfterValidation(page, 1000);
+ }).fail(function () {
+
+ Dashboard.showModalLoadingMsg();
+
+ var limit = 5;
+ $('.guideRequiresUnlock', page).show();
+ $('.unlockText', page).html(Globalize.translate('MessageLiveTvGuideRequiresUnlock', limit));
+
+ reloadPageAfterValidation(page, limit);
+ });
+ }
+
+ function selectDate(page) {
+
+ require(['actionsheet'], function () {
+
+ ActionSheetElement.show({
+ items: dateOptions,
+ showCancel: true,
+ title: Globalize.translate('HeaderSelectDate'),
+ callback: function (id) {
+
+ var date = new Date();
+ date.setTime(parseInt(id));
+ changeDate(page, date);
+ }
+ });
+
+ });
+ }
+
+ ApiClient.ajax({
+
+ type: 'GET',
+ url: 'components/tvguide/tvguide.template.html'
+
+ }).done(function (template) {
+
+ var tabContent = options.element;
+ tabContent.innerHTML = template;
+
+ Events.on(tabContent.querySelector('.programGrid'), 'scroll', function () {
+
+ onProgramGridScroll(tabContent, this);
+ });
+
+ if ($.browser.mobile) {
+ tabContent.querySelector('.tvGuide').classList.add('mobileGuide');
+ } else {
+
+ tabContent.querySelector('.tvGuide').classList.remove('mobileGuide');
+
+ Events.on(tabContent.querySelector('.timeslotHeaders'), 'scroll', function () {
+
+ onTimeslotHeadersScroll(tabContent, this);
+ });
+ }
+
+ if (AppInfo.enableHeadRoom && options.enableHeadRoom) {
+ requirejs(["thirdparty/headroom"], function () {
+
+ // construct an instance of Headroom, passing the element
+ var headroom = new Headroom(tabContent.querySelector('.tvGuideHeader'));
+ // initialise
+ headroom.init();
+ });
+ }
+
+ $('.btnUnlockGuide', tabContent).on('click', function () {
+
+ reloadPage(tabContent);
+ });
+
+ $('.btnSelectDate', tabContent).on('click', function () {
+
+ selectDate(tabContent);
+ });
+
+ self.refresh();
+ });
+ };
+});
\ No newline at end of file
diff --git a/dashboard-ui/components/tvguide/tvguide.template.html b/dashboard-ui/components/tvguide/tvguide.template.html
new file mode 100644
index 000000000..cfd25509c
--- /dev/null
+++ b/dashboard-ui/components/tvguide/tvguide.template.html
@@ -0,0 +1,19 @@
+
+
+
+
${ButtonUnlockGuide}
+
\ No newline at end of file
diff --git a/dashboard-ui/css/livetv.css b/dashboard-ui/css/livetv.css
index 273b0f206..3703ad806 100644
--- a/dashboard-ui/css/livetv.css
+++ b/dashboard-ui/css/livetv.css
@@ -2,6 +2,10 @@
background: #161616;
}
+.tvGuide {
+ text-align: left;
+}
+
.tvGuideHeader {
white-space: nowrap;
position: fixed;
diff --git a/dashboard-ui/css/mediaplayer-video.css b/dashboard-ui/css/mediaplayer-video.css
index 3f63c0834..dafafb6fa 100644
--- a/dashboard-ui/css/mediaplayer-video.css
+++ b/dashboard-ui/css/mediaplayer-video.css
@@ -75,6 +75,20 @@
padding: 1.5em 1em 2em 1em;
}
+.guide {
+ height: 400px;
+ overflow: auto;
+ background-color: #000 !important;
+}
+
+ .guide .tvGuideHeader {
+ position: static !important;
+ }
+
+ .guide .programContainer {
+ margin-top: 0 !important;
+ }
+
#videoPlayer .nowPlayingImage img {
height: auto !important;
max-width: 180px;
diff --git a/dashboard-ui/livetv.html b/dashboard-ui/livetv.html
index 9ddce1083..8e7193aa3 100644
--- a/dashboard-ui/livetv.html
+++ b/dashboard-ui/livetv.html
@@ -67,25 +67,6 @@
-
-
-
-
${ButtonUnlockGuide}
-
diff --git a/dashboard-ui/scripts/livetvcomponents.js b/dashboard-ui/scripts/livetvcomponents.js
index f690f8985..e34a5c704 100644
--- a/dashboard-ui/scripts/livetvcomponents.js
+++ b/dashboard-ui/scripts/livetvcomponents.js
@@ -349,6 +349,13 @@
});
}
+ function onHoverOut() {
+ if (showOverlayTimeout) {
+ clearTimeout(showOverlayTimeout);
+ showOverlayTimeout = null;
+ }
+ }
+
function onHoverIn() {
if (showOverlayTimeout) {
@@ -385,6 +392,7 @@
}
return this.on('mouseenter', childSelector, onHoverIn)
+ .on('mouseleave', childSelector, onHoverOut)
.on('click', childSelector, onProgramClicked);
};
diff --git a/dashboard-ui/scripts/livetvguide.js b/dashboard-ui/scripts/livetvguide.js
index 2f3742fe4..c6c69d6f9 100644
--- a/dashboard-ui/scripts/livetvguide.js
+++ b/dashboard-ui/scripts/livetvguide.js
@@ -1,504 +1,24 @@
(function ($, document) {
- // 30 mins
- var cellCurationMinutes = 30;
- var cellDurationMs = cellCurationMinutes * 60 * 1000;
- var msPerDay = 86400000;
-
- var currentDate;
-
- var defaultChannels = 50;
- var channelLimit = 1000;
-
- var channelQuery = {
-
- StartIndex: 0,
- Limit: defaultChannels,
- EnableFavoriteSorting: true
- };
-
- var channelsPromise;
-
- function normalizeDateToTimeslot(date) {
-
- var minutesOffset = date.getMinutes() - cellCurationMinutes;
-
- if (minutesOffset >= 0) {
-
- date.setHours(date.getHours(), cellCurationMinutes, 0, 0);
-
- } else {
-
- date.setHours(date.getHours(), 0, 0, 0);
- }
-
- return date;
- }
-
- function reloadChannels(page) {
- channelsPromise = null;
- reloadGuide(page);
- }
-
- function reloadGuide(page) {
-
- Dashboard.showModalLoadingMsg();
-
- channelQuery.UserId = Dashboard.getCurrentUserId();
-
- channelQuery.Limit = Math.min(channelQuery.Limit || defaultChannels, channelLimit);
- channelQuery.AddCurrentProgram = false;
-
- channelsPromise = channelsPromise || ApiClient.getLiveTvChannels(channelQuery);
-
- var date = currentDate;
-
- var nextDay = new Date(date.getTime() + msPerDay - 1);
- Logger.log(nextDay);
- channelsPromise.done(function (channelsResult) {
-
- ApiClient.getLiveTvPrograms({
- UserId: Dashboard.getCurrentUserId(),
- MaxStartDate: nextDay.toISOString(),
- MinEndDate: date.toISOString(),
- channelIds: channelsResult.Items.map(function (c) {
- return c.Id;
- }).join(','),
- ImageTypeLimit: 1,
- EnableImageTypes: "Primary"
-
- }).done(function (programsResult) {
-
- renderGuide(page, date, channelsResult.Items, programsResult.Items);
-
- Dashboard.hideModalLoadingMsg();
-
- LibraryBrowser.setLastRefreshed(page);
-
- });
-
- var channelPagingHtml = LibraryBrowser.getQueryPagingHtml({
- startIndex: channelQuery.StartIndex,
- limit: channelQuery.Limit,
- totalRecordCount: channelsResult.TotalRecordCount,
- updatePageSizeSetting: false,
- showLimit: true
- });
-
- var channelPaging = page.querySelector('.channelPaging');
- channelPaging.innerHTML = channelPagingHtml;
- $(channelPaging).trigger('create');
-
- Events.on(page.querySelector('.btnNextPage'), 'click', function () {
- channelQuery.StartIndex += channelQuery.Limit;
- reloadChannels(page);
- });
-
- Events.on(page.querySelector('.btnPreviousPage'), 'click', function () {
- channelQuery.StartIndex -= channelQuery.Limit;
- reloadChannels(page);
- });
-
- Events.on(page.querySelector('#selectPageSize'), 'change', function () {
- channelQuery.Limit = parseInt(this.value);
- channelQuery.StartIndex = 0;
- reloadChannels(page);
- });
- });
- }
-
- function getTimeslotHeadersHtml(startDate, endDateTime) {
-
- var html = '';
-
- // clone
- startDate = new Date(startDate.getTime());
-
- html += '';
-
- return html;
- }
-
- function parseDates(program) {
-
- if (!program.StartDateLocal) {
- try {
-
- program.StartDateLocal = parseISO8601Date(program.StartDate, { toLocal: true });
-
- } catch (err) {
-
- }
-
- }
-
- if (!program.EndDateLocal) {
- try {
-
- program.EndDateLocal = parseISO8601Date(program.EndDate, { toLocal: true });
-
- } catch (err) {
-
- }
-
- }
-
- return null;
- }
-
- function getChannelProgramsHtml(page, date, channel, programs) {
-
- var html = '';
-
- var startMs = date.getTime();
- var endMs = startMs + msPerDay - 1;
-
- programs = programs.filter(function (curr) {
- return curr.ChannelId == channel.Id;
- });
-
- html += '';
-
- for (var i = 0, length = programs.length; i < length; i++) {
-
- var program = programs[i];
-
- if (program.ChannelId != channel.Id) {
- continue;
- }
-
- parseDates(program);
-
- if (program.EndDateLocal.getTime() < startMs) {
- continue;
- }
-
- if (program.StartDateLocal.getTime() > endMs) {
- break;
- }
-
- var renderStartMs = Math.max(program.StartDateLocal.getTime(), startMs);
- var startPercent = (program.StartDateLocal.getTime() - startMs) / msPerDay;
- startPercent *= 100;
- startPercent = Math.max(startPercent, 0);
-
- var renderEndMs = Math.min(program.EndDateLocal.getTime(), endMs);
- var endPercent = (renderEndMs - renderStartMs) / msPerDay;
- endPercent *= 100;
-
- html += '
';
- }
-
- html += '
';
-
- return html;
- }
-
- function renderPrograms(page, date, channels, programs) {
-
- var html = [];
-
- for (var i = 0, length = channels.length; i < length; i++) {
-
- html.push(getChannelProgramsHtml(page, date, channels[i], programs));
- }
-
- var programGrid = page.querySelector('.programGrid');
- programGrid.innerHTML = html.join('');
-
- $(programGrid).scrollTop(0).scrollLeft(0)
- .createGuideHoverMenu('.programCellInner');
- }
-
- function renderChannelHeaders(page, channels) {
-
- var html = '';
-
- for (var i = 0, length = channels.length; i < length; i++) {
-
- var channel = channels[i];
-
- html += '';
- }
-
- var channelList = page.querySelector('.channelList');
- channelList.innerHTML = html;
- ImageLoader.lazyChildren(channelList);
- }
-
- function renderGuide(page, date, channels, programs) {
-
- renderChannelHeaders(page, channels);
-
- var startDate = date;
- var endDate = new Date(startDate.getTime() + msPerDay);
- page.querySelector('.timeslotHeaders').innerHTML = getTimeslotHeadersHtml(startDate, endDate);
- renderPrograms(page, date, channels, programs);
- }
-
- var gridScrolling = false;
- var headersScrolling = false;
- function onProgramGridScroll(page, elem) {
-
- if (!headersScrolling) {
- gridScrolling = true;
-
- $(page.querySelector('.timeslotHeaders')).scrollLeft($(elem).scrollLeft());
- gridScrolling = false;
- }
- }
-
- function onTimeslotHeadersScroll(page, elem) {
-
- if (!gridScrolling) {
- headersScrolling = true;
- $(page.querySelector('.programGrid')).scrollLeft($(elem).scrollLeft());
- headersScrolling = false;
- }
- }
-
- function changeDate(page, date) {
-
- currentDate = normalizeDateToTimeslot(date);
-
- reloadGuide(page);
-
- var text = LibraryBrowser.getFutureDateText(date);
- text = '' + text.replace(' ', ' ');
- page.querySelector('.currentDate').innerHTML = text;
- }
-
- var dateOptions = [];
-
- function setDateRange(page, guideInfo) {
-
- var today = new Date();
- today.setHours(today.getHours(), 0, 0, 0);
-
- var start = parseISO8601Date(guideInfo.StartDate, { toLocal: true });
- var end = parseISO8601Date(guideInfo.EndDate, { toLocal: true });
-
- start.setHours(0, 0, 0, 0);
- end.setHours(0, 0, 0, 0);
-
- if (start.getTime() >= end.getTime()) {
- end.setDate(start.getDate() + 1);
- }
-
- start = new Date(Math.max(today, start));
-
- dateOptions = [];
-
- while (start <= end) {
-
- dateOptions.push({
- name: LibraryBrowser.getFutureDateText(start),
- id: start.getTime(),
- ironIcon: 'today'
- });
-
- start.setDate(start.getDate() + 1);
- start.setHours(0, 0, 0, 0);
- }
-
- var date = new Date();
-
- if (currentDate) {
- date.setTime(currentDate.getTime());
- }
-
- changeDate(page, date);
- }
-
- function reloadPageAfterValidation(page, limit) {
-
- channelLimit = limit;
-
- ApiClient.getLiveTvGuideInfo().done(function (guideInfo) {
-
- setDateRange(page, guideInfo);
- });
- }
-
- function reloadPage(page) {
-
- $('.guideRequiresUnlock', page).hide();
-
- RegistrationServices.validateFeature('livetv').done(function () {
- Dashboard.showModalLoadingMsg();
-
- reloadPageAfterValidation(page, 1000);
- }).fail(function () {
-
- Dashboard.showModalLoadingMsg();
-
- var limit = 5;
- $('.guideRequiresUnlock', page).show();
- $('.unlockText', page).html(Globalize.translate('MessageLiveTvGuideRequiresUnlock', limit));
-
- reloadPageAfterValidation(page, limit);
- });
- }
-
- function selectDate(page) {
-
- require(['actionsheet'], function () {
-
- ActionSheetElement.show({
- items: dateOptions,
- showCancel: true,
- title: Globalize.translate('HeaderSelectDate'),
- callback: function (id) {
-
- var date = new Date();
- date.setTime(parseInt(id));
- changeDate(page, date);
- }
- });
-
- });
- }
-
window.LiveTvPage.initGuideTab = function (page, tabContent) {
- Events.on(tabContent.querySelector('.programGrid'), 'scroll', function () {
-
- onProgramGridScroll(tabContent, this);
- });
-
- if ($.browser.mobile) {
- tabContent.querySelector('.tvGuide').classList.add('mobileGuide');
- } else {
-
- tabContent.querySelector('.tvGuide').classList.remove('mobileGuide');
-
- Events.on(tabContent.querySelector('.timeslotHeaders'), 'scroll', function () {
-
- onTimeslotHeadersScroll(tabContent, this);
- });
- }
-
- if (AppInfo.enableHeadRoom) {
- requirejs(["thirdparty/headroom"], function () {
-
- // construct an instance of Headroom, passing the element
- var headroom = new Headroom(tabContent.querySelector('.tvGuideHeader'));
- // initialise
- headroom.init();
- });
- }
-
- $('.btnUnlockGuide', tabContent).on('click', function () {
-
- reloadPage(tabContent);
- });
-
- $('.btnSelectDate', tabContent).on('click', function () {
-
- selectDate(tabContent);
- });
};
window.LiveTvPage.renderGuideTab = function (page, tabContent) {
- if (LibraryBrowser.needsRefresh(tabContent)) {
- reloadPage(tabContent);
+ if (page.guideInstance) {
+ if (LibraryBrowser.needsRefresh(tabContent)) {
+ page.guideInstance.refresh();
+ }
+ } else {
+ require(['tvguide'], function (tvguide) {
+
+ page.guideInstance = new tvguide({
+ element: tabContent,
+ enableHeadRoom: true,
+ enableHoverMenu: true
+ });
+ });
}
};
diff --git a/dashboard-ui/scripts/mediaplayer-video.js b/dashboard-ui/scripts/mediaplayer-video.js
index 35c3f6d93..7e43f10e4 100644
--- a/dashboard-ui/scripts/mediaplayer-video.js
+++ b/dashboard-ui/scripts/mediaplayer-video.js
@@ -626,6 +626,35 @@
}
};
+ self.toggleGuide = function () {
+
+ var button = document.querySelector('.mediaButton.guideButton');
+ var nowPlayingInfo = document.querySelector('.videoControls .guide');
+
+ if (button.classList.contains('active')) {
+ button.classList.remove('active');
+ document.querySelector('.videoControls').classList.add('hiddenOnIdle');
+
+ fadeOutDown(nowPlayingInfo);
+
+ } else {
+ button.classList.add('active');
+ document.querySelector('.videoControls').classList.remove('hiddenOnIdle');
+ nowPlayingInfo.classList.remove('hide');
+ fadeInUp(nowPlayingInfo);
+
+ if (!self.guideInstance) {
+ require(['tvguide'], function (tvguide) {
+
+ self.guideInstance = new tvguide({
+ element: nowPlayingInfo,
+ enablePaging: false
+ });
+ });
+ }
+ }
+ };
+
function fadeInUp(elem) {
var keyframes = [
{ transform: 'translate3d(0, 100%, 0)', offset: 0 },
@@ -682,6 +711,9 @@
html += '';
html += ''; // nowPlayingInfo
+ html += '';
+ html += '
'; // guide
+
html += '';
html += ''; // videoControls
diff --git a/dashboard-ui/scripts/site.js b/dashboard-ui/scripts/site.js
index ca0bbe053..819265f92 100644
--- a/dashboard-ui/scripts/site.js
+++ b/dashboard-ui/scripts/site.js
@@ -2023,7 +2023,8 @@ var AppInfo = {};
}
var paths = {
- velocity: "bower_components/velocity/velocity.min"
+ velocity: "bower_components/velocity/velocity.min",
+ tvguide: 'components/tvguide/tvguide'
};
if (Dashboard.isRunningInCordova()) {