define(['libraryBrowser', 'components/categorysyncbuttons', 'cardBuilder', 'dom', 'apphost', 'imageLoader', 'playbackManager', 'scrollStyles', 'emby-itemscontainer', 'emby-tabs', 'emby-button'], function (libraryBrowser, categorysyncbuttons, cardBuilder, dom, appHost, imageLoader, playbackManager) { 'use strict'; function enableScrollX() { return browserInfo.mobile && AppInfo.enableAppLayouts; } function getPortraitShape() { return enableScrollX() ? 'overflowPortrait' : 'portrait'; } function getThumbShape() { return enableScrollX() ? 'overflowBackdrop' : 'backdrop'; } function loadLatest(page, userId, parentId) { var options = { IncludeItemTypes: "Movie", Limit: 18, Fields: "PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo", ParentId: parentId, ImageTypeLimit: 1, EnableImageTypes: "Primary,Backdrop,Banner,Thumb", EnableTotalRecordCount: false }; ApiClient.getJSON(ApiClient.getUrl('Users/' + userId + '/Items/Latest', options)).then(function (items) { var allowBottomPadding = !enableScrollX(); var container = page.querySelector('#recentlyAddedItems'); cardBuilder.buildCards(items, { itemsContainer: container, shape: getPortraitShape(), scalable: true, overlayPlayButton: true, allowBottomPadding: allowBottomPadding }); }); } function loadResume(page, userId, parentId) { var screenWidth = dom.getWindowSize().innerWidth; var options = { SortBy: "DatePlayed", SortOrder: "Descending", IncludeItemTypes: "Movie", Filters: "IsResumable", Limit: screenWidth >= 1920 ? 5 : (screenWidth >= 1600 ? 5 : 3), Recursive: true, Fields: "PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo", CollapseBoxSetItems: false, ParentId: parentId, ImageTypeLimit: 1, EnableImageTypes: "Primary,Backdrop,Banner,Thumb", EnableTotalRecordCount: false }; ApiClient.getItems(userId, options).then(function (result) { if (result.Items.length) { page.querySelector('#resumableSection').classList.remove('hide'); } else { page.querySelector('#resumableSection').classList.add('hide'); } var allowBottomPadding = !enableScrollX(); var container = page.querySelector('#resumableItems'); var supportsImageAnalysis = appHost.supports('imageanalysis'); var cardLayout = appHost.preferVisualCards; cardBuilder.buildCards(result.Items, { itemsContainer: container, preferThumb: true, shape: getThumbShape(), scalable: true, overlayPlayButton: true, allowBottomPadding: allowBottomPadding, cardLayout: cardLayout, vibrant: cardLayout && supportsImageAnalysis, showTitle: cardLayout, showYear: cardLayout }); }); } function getRecommendationHtml(recommendation) { var html = ''; var title = ''; switch (recommendation.RecommendationType) { case 'SimilarToRecentlyPlayed': title = Globalize.translate('RecommendationBecauseYouWatched').replace("{0}", recommendation.BaselineItemName); break; case 'SimilarToLikedItem': title = Globalize.translate('RecommendationBecauseYouLike').replace("{0}", recommendation.BaselineItemName); break; case 'HasDirectorFromRecentlyPlayed': case 'HasLikedDirector': title = Globalize.translate('RecommendationDirectedBy').replace("{0}", recommendation.BaselineItemName); break; case 'HasActorFromRecentlyPlayed': case 'HasLikedActor': title = Globalize.translate('RecommendationStarring').replace("{0}", recommendation.BaselineItemName); break; } html += '
'; html += '

' + title + '

'; var allowBottomPadding = true; if (enableScrollX()) { allowBottomPadding = false; html += '
'; } else { html += '
'; } html += cardBuilder.getCardsHtml(recommendation.Items, { shape: getPortraitShape(), scalable: true, overlayPlayButton: true, allowBottomPadding: allowBottomPadding }); html += '
'; html += '
'; return html; } function loadSuggestions(page, userId, parentId) { var screenWidth = dom.getWindowSize().innerWidth; var url = ApiClient.getUrl("Movies/Recommendations", { userId: userId, categoryLimit: 6, ItemLimit: screenWidth >= 1920 ? 8 : (screenWidth >= 1600 ? 8 : (screenWidth >= 1200 ? 6 : 5)), Fields: "PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo", ImageTypeLimit: 1, EnableImageTypes: "Primary,Backdrop,Banner,Thumb" }); ApiClient.getJSON(url).then(function (recommendations) { if (!recommendations.length) { page.querySelector('.noItemsMessage').classList.remove('hide'); page.querySelector('.recommendations').innerHTML = ''; return; } var html = recommendations.map(getRecommendationHtml).join(''); page.querySelector('.noItemsMessage').classList.add('hide'); var recs = page.querySelector('.recommendations'); recs.innerHTML = html; imageLoader.lazyChildren(recs); }); } function initSuggestedTab(page, tabContent) { var containers = tabContent.querySelectorAll('.itemsContainer'); for (var i = 0, length = containers.length; i < length; i++) { if (enableScrollX()) { containers[i].classList.add('hiddenScrollX'); containers[i].classList.remove('vertical-wrap'); } else { containers[i].classList.remove('hiddenScrollX'); containers[i].classList.add('vertical-wrap'); } } } function loadSuggestionsTab(view, params, tabContent) { var parentId = params.topParentId; var userId = Dashboard.getCurrentUserId(); console.log('loadSuggestionsTab'); loadResume(tabContent, userId, parentId); loadLatest(tabContent, userId, parentId); loadSuggestions(tabContent, userId, parentId); } return function (view, params) { var self = this; self.initTab = function () { var tabContent = view.querySelector('.pageTabContent[data-index=\'' + 0 + '\']'); categorysyncbuttons.init(tabContent); initSuggestedTab(view, tabContent); }; self.renderTab = function () { var tabContent = view.querySelector('.pageTabContent[data-index=\'' + 0 + '\']'); loadSuggestionsTab(view, params, tabContent); }; var viewTabs = view.querySelector('.libraryViewNav'); libraryBrowser.configurePaperLibraryTabs(view, viewTabs, view.querySelectorAll('.pageTabContent'), [0, 3, 4, 5]); var tabControllers = []; var renderedTabs = []; function getTabController(page, index, callback) { var depends = []; switch (index) { case 0: break; case 1: depends.push('scripts/movies'); break; case 2: depends.push('scripts/movietrailers'); break; case 3: depends.push('scripts/moviecollections'); break; case 4: depends.push('scripts/moviegenres'); break; case 5: depends.push('scripts/moviestudios'); break; default: break; } require(depends, function (controllerFactory) { var tabContent; if (index == 0) { tabContent = view.querySelector('.pageTabContent[data-index=\'' + index + '\']'); self.tabContent = tabContent; } var controller = tabControllers[index]; if (!controller) { tabContent = view.querySelector('.pageTabContent[data-index=\'' + index + '\']'); controller = index ? new controllerFactory(view, params, tabContent) : self; tabControllers[index] = controller; if (controller.initTab) { controller.initTab(); } } callback(controller); }); } function preLoadTab(page, index) { getTabController(page, index, function (controller) { if (renderedTabs.indexOf(index) == -1) { if (controller.preRender) { controller.preRender(); } } }); } function loadTab(page, index) { getTabController(page, index, function (controller) { if (renderedTabs.indexOf(index) == -1) { renderedTabs.push(index); controller.renderTab(); } }); } viewTabs.addEventListener('beforetabchange', function (e) { preLoadTab(view, parseInt(e.detail.selectedTabIndex)); }); viewTabs.addEventListener('tabchange', function (e) { loadTab(view, parseInt(e.detail.selectedTabIndex)); }); view.addEventListener('viewbeforeshow', function (e) { if (!view.getAttribute('data-title')) { var parentId = params.topParentId; if (parentId) { ApiClient.getItem(Dashboard.getCurrentUserId(), parentId).then(function (item) { view.setAttribute('data-title', item.Name); LibraryMenu.setTitle(item.Name); }); } else { view.setAttribute('data-title', Globalize.translate('TabMovies')); LibraryMenu.setTitle(Globalize.translate('TabMovies')); } } }); function onPlaybackStop(e, state) { if (state.NowPlayingItem && state.NowPlayingItem.MediaType == 'Video') { renderedTabs = []; viewTabs.triggerTabChange(); } } view.addEventListener('viewshow', function (e) { Events.on(playbackManager, 'playbackstop', onPlaybackStop); }); view.addEventListener('viewbeforehide', function (e) { Events.off(playbackManager, 'playbackstop', onPlaybackStop); }); require(["headroom-window"], function (headroom) { headroom.add(viewTabs); self.headroom = headroom; }); view.addEventListener('viewdestroy', function (e) { if (self.headroom) { self.headroom.remove(viewTabs); } }); }; });