define(["layoutManager", "userSettings", "inputManager", "loading", "globalize", "libraryBrowser", "mainTabsManager", "cardBuilder", "apphost", "imageLoader", "scrollStyles", "emby-itemscontainer", "emby-tabs", "emby-button"], function (layoutManager, userSettings, inputManager, loading, globalize, libraryBrowser, mainTabsManager, cardBuilder, appHost, imageLoader) { "use strict"; function enableScrollX() { return !layoutManager.desktop; } function getBackdropShape() { if (enableScrollX()) { return "overflowBackdrop"; } return "backdrop"; } function getPortraitShape() { if (enableScrollX()) { return "overflowPortrait"; } return "portrait"; } function getLimit() { if (enableScrollX()) { return 12; } return 9; } function loadRecommendedPrograms(page) { loading.show(); var limit = getLimit(); if (enableScrollX()) { limit *= 2; } ApiClient.getLiveTvRecommendedPrograms({ userId: Dashboard.getCurrentUserId(), IsAiring: true, limit: limit, ImageTypeLimit: 1, EnableImageTypes: "Primary,Thumb,Backdrop", EnableTotalRecordCount: false, Fields: "ChannelInfo,PrimaryImageAspectRatio" }).then(function (result) { renderItems(page, result.Items, "activeProgramItems", "play", { showAirDateTime: false, showAirEndTime: true }); loading.hide(); }); } function reload(page, enableFullRender) { if (enableFullRender) { loadRecommendedPrograms(page); ApiClient.getLiveTvPrograms({ userId: Dashboard.getCurrentUserId(), HasAired: false, limit: getLimit(), IsMovie: false, IsSports: false, IsKids: false, IsNews: false, IsSeries: true, EnableTotalRecordCount: false, Fields: "ChannelInfo,PrimaryImageAspectRatio", EnableImageTypes: "Primary,Thumb" }).then(function (result) { renderItems(page, result.Items, "upcomingEpisodeItems"); }); ApiClient.getLiveTvPrograms({ userId: Dashboard.getCurrentUserId(), HasAired: false, limit: getLimit(), IsMovie: true, EnableTotalRecordCount: false, Fields: "ChannelInfo", EnableImageTypes: "Primary,Thumb" }).then(function (result) { renderItems(page, result.Items, "upcomingTvMovieItems", null, { shape: getPortraitShape(), preferThumb: null, showParentTitle: false }); }); ApiClient.getLiveTvPrograms({ userId: Dashboard.getCurrentUserId(), HasAired: false, limit: getLimit(), IsSports: true, EnableTotalRecordCount: false, Fields: "ChannelInfo,PrimaryImageAspectRatio", EnableImageTypes: "Primary,Thumb" }).then(function (result) { renderItems(page, result.Items, "upcomingSportsItems"); }); ApiClient.getLiveTvPrograms({ userId: Dashboard.getCurrentUserId(), HasAired: false, limit: getLimit(), IsKids: true, EnableTotalRecordCount: false, Fields: "ChannelInfo,PrimaryImageAspectRatio", EnableImageTypes: "Primary,Thumb" }).then(function (result) { renderItems(page, result.Items, "upcomingKidsItems"); }); ApiClient.getLiveTvPrograms({ userId: Dashboard.getCurrentUserId(), HasAired: false, limit: getLimit(), IsNews: true, EnableTotalRecordCount: false, Fields: "ChannelInfo,PrimaryImageAspectRatio", EnableImageTypes: "Primary,Thumb" }).then(function (result) { renderItems(page, result.Items, "upcomingNewsItems", null, { showParentTitleOrTitle: true, showTitle: false, showParentTitle: false }); }); } } function renderItems(page, items, sectionClass, overlayButton, cardOptions) { var html = cardBuilder.getCardsHtml(Object.assign({ items: items, preferThumb: "auto", inheritThumb: false, shape: enableScrollX() ? "autooverflow" : "auto", defaultShape: getBackdropShape(), showParentTitle: true, showTitle: true, centerText: true, coverImage: true, overlayText: false, lazy: true, overlayPlayButton: "play" === overlayButton, overlayMoreButton: "more" === overlayButton, overlayInfoButton: "info" === overlayButton, allowBottomPadding: !enableScrollX(), showAirTime: true, showAirDateTime: true }, cardOptions || {})); var elem = page.querySelector("." + sectionClass); elem.innerHTML = html; imageLoader.lazyChildren(elem); } function getTabs() { return [{ name: globalize.translate("Programs") }, { name: globalize.translate("TabGuide") }, { name: globalize.translate("TabChannels") }, { name: globalize.translate("TabRecordings") }, { name: globalize.translate("HeaderSchedule") }, { name: globalize.translate("TabSeries") }, { name: globalize.translate("ButtonSearch"), cssClass: "searchTabButton" }]; } function setScrollClasses(elem, scrollX) { if (scrollX) { elem.classList.add("hiddenScrollX"); if (layoutManager.tv) { elem.classList.add("smoothScrollX"); } elem.classList.add("scrollX"); elem.classList.remove("vertical-wrap"); } else { elem.classList.remove("hiddenScrollX"); elem.classList.remove("smoothScrollX"); elem.classList.remove("scrollX"); elem.classList.add("vertical-wrap"); } } function getDefaultTabIndex(folderId) { switch (userSettings.get("landing-" + folderId)) { case "guide": return 1; default: return 0; } } return function (view, params) { function enableFullRender() { return new Date().getTime() - lastFullRender > 3e5; } function onBeforeTabChange(e__q) { preLoadTab(view, parseInt(e__q.detail.selectedTabIndex)); } function onTabChange(e__w) { var previousTabController = tabControllers[parseInt(e__w.detail.previousIndex)]; if (previousTabController && previousTabController.onHide) { previousTabController.onHide(); } loadTab(view, parseInt(e__w.detail.selectedTabIndex)); } function getTabContainers() { return view.querySelectorAll(".pageTabContent"); } function initTabs() { mainTabsManager.setTabs(view, currentTabIndex, getTabs, getTabContainers, onBeforeTabChange, onTabChange); } function getTabController(page, index, callback) { var depends = []; switch (index) { case 0: break; case 1: depends.push("scripts/livetvguide"); break; case 2: depends.push("scripts/livetvchannels"); break; case 3: depends.push("scripts/livetvrecordings"); break; case 4: depends.push("scripts/livetvschedule"); break; case 5: depends.push("scripts/livetvseriestimers"); break; case 6: depends.push("scripts/searchtab"); } require(depends, function (controllerFactory) { var tabContent; if (0 == index) { tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']"); self.tabContent = tabContent; } var controller = tabControllers[index]; if (!controller) { tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']"); controller = 0 === index ? self : 6 === index ? new controllerFactory(view, tabContent, { collectionType: "livetv" }) : new controllerFactory(view, params, tabContent); tabControllers[index] = controller; if (controller.initTab) { controller.initTab(); } } callback(controller); }); } function preLoadTab(page, index) { getTabController(page, index, function (controller) { if (-1 == renderedTabs.indexOf(index) && controller.preRender) { controller.preRender(); } }); } function loadTab(page, index) { currentTabIndex = index; getTabController(page, index, function (controller) { initialTabIndex = null; if (1 === index) { document.body.classList.add("autoScrollY"); } else { document.body.classList.remove("autoScrollY"); } if (-1 == renderedTabs.indexOf(index)) { if (1 === index) { renderedTabs.push(index); } controller.renderTab(); } else { if (controller.onShow) { controller.onShow(); } } currentTabController = controller; }); } function onInputCommand(e__e) { switch (e__e.detail.command) { case "search": e__e.preventDefault(); Dashboard.navigate("search.html?collectionType=livetv"); } } var isViewRestored; var self = this; var currentTabIndex = parseInt(params.tab || getDefaultTabIndex("livetv")); var initialTabIndex = currentTabIndex; var lastFullRender = 0; [].forEach.call(view.querySelectorAll(".sectionTitleTextButton-programs"), function (link) { var href = link.href; if (href) { link.href = href + "&serverId=" + ApiClient.serverId(); } }); self.initTab = function () { var tabContent = view.querySelector(".pageTabContent[data-index='0']"); var containers = tabContent.querySelectorAll(".itemsContainer"); for (var i__r = 0, length = containers.length; i__r < length; i__r++) { setScrollClasses(containers[i__r], enableScrollX()); } }; self.renderTab = function () { var tabContent = view.querySelector(".pageTabContent[data-index='0']"); if (enableFullRender()) { reload(tabContent, true); lastFullRender = new Date().getTime(); } else { reload(tabContent); } }; var currentTabController; var tabControllers = []; var renderedTabs = []; view.addEventListener("viewbeforeshow", function (e__t) { isViewRestored = e__t.detail.isRestored; initTabs(); }); view.addEventListener("viewshow", function (e__y) { isViewRestored = e__y.detail.isRestored; if (!isViewRestored) { mainTabsManager.selectedTabIndex(initialTabIndex); } inputManager.on(window, onInputCommand); }); view.addEventListener("viewbeforehide", function (e__u) { if (currentTabController && currentTabController.onHide) { currentTabController.onHide(); } document.body.classList.remove("autoScrollY"); inputManager.off(window, onInputCommand); }); view.addEventListener("viewdestroy", function (e__i) { tabControllers.forEach(function (t__o) { if (t__o.destroy) { t__o.destroy(); } }); }); }; });