define(["require", "inputManager", "browser", "globalize", "connectionManager", "scrollHelper", "serverNotifications", "loading", "datetime", "focusManager", "playbackManager", "userSettings", "imageLoader", "events", "layoutManager", "itemShortcuts", "dom", "css!./guide.css", "programStyles", "material-icons", "scrollStyles", "emby-button", "paper-icon-button-light", "emby-tabs", "emby-scroller", "flexStyles", "registerElement"], function(require, inputManager, browser, globalize, connectionManager, scrollHelper, serverNotifications, loading, datetime, focusManager, playbackManager, userSettings, imageLoader, events, layoutManager, itemShortcuts, dom) { "use strict"; function showViewSettings(instance) { require(["guide-settings-dialog"], function(guideSettingsDialog) { guideSettingsDialog.show(instance.categoryOptions).then(function() { instance.refresh() }) }) } function updateProgramCellOnScroll(cell, scrollPct) { var left = cell.posLeft; left || (left = parseFloat(cell.style.left.replace("%", "")), cell.posLeft = left); var width = cell.posWidth; width || (width = parseFloat(cell.style.width.replace("%", "")), cell.posWidth = width); var right = left + width, newPct = Math.max(Math.min(scrollPct, right), left), offset = newPct - left, pctOfWidth = offset / width * 100, guideProgramName = cell.guideProgramName; guideProgramName || (guideProgramName = cell.querySelector(".guideProgramName"), cell.guideProgramName = guideProgramName); var caret = cell.caret; caret || (caret = cell.querySelector(".guide-programNameCaret"), cell.caret = caret), guideProgramName && (pctOfWidth > 0 && pctOfWidth <= 100 ? (guideProgramName.style.transform = "translateX(" + pctOfWidth + "%)", caret.classList.remove("hide")) : (guideProgramName.style.transform = "none", caret.classList.add("hide"))) } function updateProgramCellsOnScroll(programGrid, programCells) { isUpdatingProgramCellScroll || (isUpdatingProgramCellScroll = !0, requestAnimationFrame(function() { for (var scrollLeft = programGrid.scrollLeft, scrollPct = scrollLeft ? scrollLeft / programGrid.scrollWidth * 100 : 0, i = 0, length = programCells.length; i < length; i++) updateProgramCellOnScroll(programCells[i], scrollPct); isUpdatingProgramCellScroll = !1 })) } function onProgramGridClick(e) { if (layoutManager.tv) { var programCell = dom.parentWithClass(e.target, "programCell"); if (programCell) { var startDate = programCell.getAttribute("data-startdate"), endDate = programCell.getAttribute("data-enddate"); startDate = datetime.parseISO8601Date(startDate, { toLocal: !0 }).getTime(), endDate = datetime.parseISO8601Date(endDate, { toLocal: !0 }).getTime(); var now = (new Date).getTime(); if (now >= startDate && now < endDate) { var channelId = programCell.getAttribute("data-channelid"), serverId = programCell.getAttribute("data-serverid"); e.preventDefault(), e.stopPropagation(), playbackManager.play({ ids: [channelId], serverId: serverId }) } } } } function Guide(options) { function restartAutoRefresh() { stopAutoRefresh(); autoRefreshInterval = setInterval(function() { self.refresh() }, 9e5) } function stopAutoRefresh() { autoRefreshInterval && (clearInterval(autoRefreshInterval), autoRefreshInterval = null) } function normalizeDateToTimeslot(date) { return date.getMinutes() - cellCurationMinutes >= 0 ? date.setHours(date.getHours(), cellCurationMinutes, 0, 0) : date.setHours(date.getHours(), 0, 0, 0), date } function showLoading() { loading.show() } function hideLoading() { loading.hide() } function reloadGuide(context, newStartDate, scrollToTimeMs, focusToTimeMs, startTimeOfDayMs, focusProgramOnRender) { var apiClient = connectionManager.getApiClient(options.serverId), channelQuery = { StartIndex: 0, EnableFavoriteSorting: "false" !== userSettings.get("livetv-favoritechannelsattop") }; channelQuery.UserId = apiClient.getCurrentUserId(); currentChannelLimit = 500, showLoading(), channelQuery.StartIndex = currentStartIndex, channelQuery.Limit = 500, channelQuery.AddCurrentProgram = !1, channelQuery.EnableUserData = !1, channelQuery.EnableImageTypes = "Primary"; var categories = self.categoryOptions.categories || [], displayMovieContent = !categories.length || -1 !== categories.indexOf("movies"), displaySportsContent = !categories.length || -1 !== categories.indexOf("sports"), displayNewsContent = !categories.length || -1 !== categories.indexOf("news"), displayKidsContent = !categories.length || -1 !== categories.indexOf("kids"), displaySeriesContent = !categories.length || -1 !== categories.indexOf("series"); displayMovieContent && displaySportsContent && displayNewsContent && displayKidsContent ? (channelQuery.IsMovie = null, channelQuery.IsSports = null, channelQuery.IsKids = null, channelQuery.IsNews = null, channelQuery.IsSeries = null) : (displayNewsContent && (channelQuery.IsNews = !0), displaySportsContent && (channelQuery.IsSports = !0), displayKidsContent && (channelQuery.IsKids = !0), displayMovieContent && (channelQuery.IsMovie = !0), displaySeriesContent && (channelQuery.IsSeries = !0)), "DatePlayed" === userSettings.get("livetv-channelorder") ? (channelQuery.SortBy = "DatePlayed", channelQuery.SortOrder = "Descending") : (channelQuery.SortBy = null, channelQuery.SortOrder = null); var date = newStartDate; date = new Date(date.getTime() + 1e3); var nextDay = new Date(date.getTime() + msPerDay - 2e3), allowIndicators = dom.getWindowSize().innerWidth >= 600, renderOptions = { showHdIcon: allowIndicators && "true" === userSettings.get("guide-indicator-hd"), showLiveIndicator: allowIndicators && "false" !== userSettings.get("guide-indicator-live"), showPremiereIndicator: allowIndicators && "false" !== userSettings.get("guide-indicator-premiere"), showNewIndicator: allowIndicators && "false" !== userSettings.get("guide-indicator-new"), showRepeatIndicator: allowIndicators && "true" === userSettings.get("guide-indicator-repeat"), showEpisodeTitle: !layoutManager.tv }; apiClient.getLiveTvChannels(channelQuery).then(function(channelsResult) { var btnPreviousPage = context.querySelector(".btnPreviousPage"), btnNextPage = context.querySelector(".btnNextPage"); channelsResult.TotalRecordCount > 500 ? (context.querySelector(".guideOptions").classList.remove("hide"), btnPreviousPage.classList.remove("hide"), btnNextPage.classList.remove("hide"), channelQuery.StartIndex ? context.querySelector(".btnPreviousPage").disabled = !1 : context.querySelector(".btnPreviousPage").disabled = !0, channelQuery.StartIndex + 500 < channelsResult.TotalRecordCount ? btnNextPage.disabled = !1 : btnNextPage.disabled = !0) : context.querySelector(".guideOptions").classList.add("hide"); var programFields = [], programQuery = { UserId: apiClient.getCurrentUserId(), MaxStartDate: nextDay.toISOString(), MinEndDate: date.toISOString(), channelIds: channelsResult.Items.map(function(c) { return c.Id }).join(","), ImageTypeLimit: 1, EnableImages: !1, SortBy: "StartDate", EnableTotalRecordCount: !1, EnableUserData: !1 }; renderOptions.showHdIcon && programFields.push("IsHD"), programFields.length && (programQuery.Fields = programFields.join("")), apiClient.getLiveTvPrograms(programQuery).then(function(programsResult) { renderGuide(context, date, channelsResult.Items, programsResult.Items, renderOptions, apiClient, scrollToTimeMs, focusToTimeMs, startTimeOfDayMs, focusProgramOnRender), hideLoading() }) }) } function getDisplayTime(date) { if ("string" === (typeof date).toString().toLowerCase()) try { date = datetime.parseISO8601Date(date, { toLocal: !0 }) } catch (err) { return date } return datetime.getDisplayTime(date).toLowerCase() } function getTimeslotHeadersHtml(startDate, endDateTime) { var html = ""; for (startDate = new Date(startDate.getTime()), html += '