define(['dom', 'playbackManager', 'connectionManager', 'events', 'mediaInfo', 'layoutManager', 'focusManager', 'globalize', 'itemHelper', 'css!./upnextdialog', 'emby-button', 'flexStyles'], function (dom, playbackManager, connectionManager, events, mediaInfo, layoutManager, focusManager, globalize, itemHelper) {
'use strict';
var transitionEndEventName = dom.whichTransitionEvent();
function seriesImageUrl(item, options) {
if (item.Type !== 'Episode') {
return null;
}
options = options || {};
options.type = options.type || "Primary";
if (options.type === 'Primary') {
if (item.SeriesPrimaryImageTag) {
options.tag = item.SeriesPrimaryImageTag;
return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options);
}
}
if (options.type === 'Thumb') {
if (item.SeriesThumbImageTag) {
options.tag = item.SeriesThumbImageTag;
return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options);
}
if (item.ParentThumbImageTag) {
options.tag = item.ParentThumbImageTag;
return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.ParentThumbItemId, options);
}
}
return null;
}
function imageUrl(item, options) {
options = options || {};
options.type = options.type || "Primary";
if (item.ImageTags && item.ImageTags[options.type]) {
options.tag = item.ImageTags[options.type];
return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.PrimaryImageItemId || item.Id, options);
}
if (options.type === 'Primary') {
if (item.AlbumId && item.AlbumPrimaryImageTag) {
options.tag = item.AlbumPrimaryImageTag;
return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.AlbumId, options);
}
}
return null;
}
function setPoster(osdPoster, item, secondaryItem) {
if (item) {
var imgUrl = seriesImageUrl(item, { type: 'Primary' }) ||
seriesImageUrl(item, { type: 'Thumb' }) ||
imageUrl(item, { type: 'Primary' });
if (!imgUrl && secondaryItem) {
imgUrl = seriesImageUrl(secondaryItem, { type: 'Primary' }) ||
seriesImageUrl(secondaryItem, { type: 'Thumb' }) ||
imageUrl(secondaryItem, { type: 'Primary' });
}
if (imgUrl) {
osdPoster.innerHTML = '
';
return;
}
}
osdPoster.innerHTML = '';
}
function getHtml() {
var html = '';
html += '
';
html += '
';
html += '';
html += '
';
html += '
';
html += '
';
html += '
';
html += '
';
html += '
';
html += '';
html += '';
// buttons
html += '
';
// main
html += '
';
return html;
}
function setNextVideoText() {
var instance = this;
var elem = instance.options.parent;
var secondsRemaining = Math.max(Math.round(getTimeRemainingMs(instance) / 1000), 0);
console.debug('up next seconds remaining: ' + secondsRemaining);
var timeText = '' + globalize.translate('HeaderSecondsValue', secondsRemaining) + '';
var nextVideoText = instance.itemType === 'Episode' ?
globalize.translate('HeaderNextEpisodePlayingInValue', timeText) :
globalize.translate('HeaderNextVideoPlayingInValue', timeText);
elem.querySelector('.upNextDialog-nextVideoText').innerHTML = nextVideoText;
}
function fillItem(item) {
var instance = this;
var elem = instance.options.parent;
setPoster(elem.querySelector('.upNextDialog-poster'), item);
elem.querySelector('.upNextDialog-overview').innerHTML = item.Overview || '';
elem.querySelector('.upNextDialog-mediainfo').innerHTML = mediaInfo.getPrimaryMediaInfoHtml(item, {
});
var title = itemHelper.getDisplayName(item);
if (item.SeriesName) {
title = item.SeriesName + ' - ' + title;
}
elem.querySelector('.upNextDialog-title').innerHTML = title || '';
instance.itemType = item.Type;
instance.show();
}
function clearCountdownTextTimeout(instance) {
if (instance._countdownTextTimeout) {
clearInterval(instance._countdownTextTimeout);
instance._countdownTextTimeout = null;
}
}
function onStartNowClick() {
var options = this.options;
if (options) {
var player = options.player;
this.hide();
playbackManager.nextTrack(player);
}
}
function init(instance, options) {
options.parent.innerHTML = getHtml();
options.parent.classList.add('hide');
options.parent.classList.add('upNextDialog');
options.parent.classList.add('upNextDialog-hidden');
fillItem.call(instance, options.nextItem);
options.parent.querySelector('.btnHide').addEventListener('click', instance.hide.bind(instance));
options.parent.querySelector('.btnStartNow').addEventListener('click', onStartNowClick.bind(instance));
}
function clearHideAnimationEventListeners(instance, elem) {
var fn = instance._onHideAnimationComplete;
if (fn) {
dom.removeEventListener(elem, transitionEndEventName, fn, {
once: true
});
}
}
function onHideAnimationComplete(e) {
var instance = this;
var elem = e.target;
elem.classList.add('hide');
clearHideAnimationEventListeners(instance, elem);
events.trigger(instance, 'hide');
}
function hideComingUpNext() {
var instance = this;
clearCountdownTextTimeout(this);
if (!instance.options) {
return;
}
var elem = instance.options.parent;
if (!elem) {
return;
}
clearHideAnimationEventListeners(this, elem);
if (elem.classList.contains('upNextDialog-hidden')) {
return;
}
// trigger a reflow to force it to animate again
void elem.offsetWidth;
elem.classList.add('upNextDialog-hidden');
var fn = onHideAnimationComplete.bind(instance);
instance._onHideAnimationComplete = fn;
dom.addEventListener(elem, transitionEndEventName, fn, {
once: true
});
}
function getTimeRemainingMs(instance) {
var options = instance.options;
if (options) {
var runtimeTicks = playbackManager.duration(options.player);
if (runtimeTicks) {
var timeRemainingTicks = runtimeTicks - playbackManager.currentTime(options.player);
return Math.round(timeRemainingTicks / 10000);
}
}
return 0;
}
function startComingUpNextHideTimer(instance) {
var timeRemainingMs = getTimeRemainingMs(instance);
if (timeRemainingMs <= 0) {
return;
}
setNextVideoText.call(instance);
clearCountdownTextTimeout(instance);
instance._countdownTextTimeout = setInterval(setNextVideoText.bind(instance), 400);
}
function UpNextDialog(options) {
this.options = options;
init(this, options);
}
UpNextDialog.prototype.show = function () {
var elem = this.options.parent;
clearHideAnimationEventListeners(this, elem);
elem.classList.remove('hide');
// trigger a reflow to force it to animate again
void elem.offsetWidth;
elem.classList.remove('upNextDialog-hidden');
if (layoutManager.tv) {
setTimeout(function () {
focusManager.focus(elem.querySelector('.btnStartNow'));
}, 50);
}
startComingUpNextHideTimer(this);
};
UpNextDialog.prototype.hide = function () {
hideComingUpNext.call(this);
};
UpNextDialog.prototype.destroy = function () {
hideComingUpNext.call(this);
this.options = null;
this.itemType = null;
};
return UpNextDialog;
});