(function ($, document, LibraryBrowser, window) {
var currentItem;
function getPromise() {
var id = getParameterByName('id');
if (id) {
return ApiClient.getItem(Dashboard.getCurrentUserId(), id);
}
var name = getParameterByName('genre');
if (name) {
return ApiClient.getGenre(name, Dashboard.getCurrentUserId());
}
name = getParameterByName('musicgenre');
if (name) {
return ApiClient.getMusicGenre(name, Dashboard.getCurrentUserId());
}
name = getParameterByName('gamegenre');
if (name) {
return ApiClient.getGameGenre(name, Dashboard.getCurrentUserId());
}
name = getParameterByName('musicartist');
if (name) {
return ApiClient.getArtist(name, Dashboard.getCurrentUserId());
}
else {
throw new Error('Invalid request');
}
}
function reload(page) {
Dashboard.showLoadingMsg();
getPromise().done(function (item) {
reloadFromItem(page, item);
});
}
function reloadFromItem(page, item) {
currentItem = item;
var context = getContext(item);
renderHeader(page, item, context);
LibraryBrowser.renderName(item, $('.itemName', page), false, context);
LibraryBrowser.renderParentName(item, $('.parentName', page), context);
LibraryMenu.setTitle(item.SeriesName || item.Name);
Dashboard.getCurrentUser().done(function (user) {
renderImage(page, item, user);
setInitialCollapsibleState(page, item, context, user);
renderDetails(page, item, context);
var hasBackdrop = false;
if (item.Type == 'MusicAlbum1' || item.Type == 'Season1') {
Backdrops.setBackdrops(page, [item]);
$('#itemBackdrop', page).addClass('noBackdrop').css('background-image', 'none');
} else {
hasBackdrop = LibraryBrowser.renderDetailPageBackdrop(page, item);
}
var transparentHeader = hasBackdrop && page.classList.contains('noSecondaryNavPage');
LibraryMenu.setTransparentMenu(transparentHeader);
var canPlay = false;
if (item.Type == 'Program') {
var now = new Date();
if (now >= parseISO8601Date(item.StartDate, { toLocal: true }) && now < parseISO8601Date(item.EndDate, { toLocal: true })) {
$('.btnPlay', page).removeClass('hide');
canPlay = true;
} else {
$('.btnPlay', page).addClass('hide');
}
}
else if (MediaController.canPlay(item)) {
$('.btnPlay', page).removeClass('hide');
canPlay = true;
}
else {
$('.btnPlay', page).addClass('hide');
}
if (item.LocalTrailerCount && item.PlayAccess == 'Full') {
$('.btnPlayTrailer', page).removeClass('hide');
} else {
$('.btnPlayTrailer', page).addClass('hide');
}
if (SyncManager.isAvailable(item, user)) {
$('.btnSync', page).removeClass('hide');
} else {
$('.btnSync', page).addClass('hide');
}
if (LibraryBrowser.canShare(item, user)) {
$('.btnShare', page).removeClass('hide');
} else {
$('.btnShare', page).addClass('hide');
}
if (item.Type == 'Program' && item.TimerId) {
$('.btnCancelRecording', page).removeClass('hide');
} else {
$('.btnCancelRecording', page).addClass('hide');
}
if (item.Type == 'Program' && (!item.TimerId && !item.SeriesTimerId)) {
if (canPlay) {
$('.btnRecord', page).removeClass('hide');
$('.btnFloatingRecord', page).addClass('hide');
} else {
$('.btnRecord', page).addClass('hide');
$('.btnFloatingRecord', page).removeClass('hide');
}
} else {
$('.btnRecord', page).addClass('hide');
$('.btnFloatingRecord', page).addClass('hide');
}
if (!item.LocalTrailerCount && item.RemoteTrailers.length && item.PlayAccess == 'Full') {
$('.btnPlayExternalTrailer', page).removeClass('hide').attr('href', item.RemoteTrailers[0].Url);
} else {
$('.btnPlayExternalTrailer', page).addClass('hide').attr('href', '#');
}
var groupedVersions = (item.MediaSources || []).filter(function (g) {
return g.Type == "Grouping";
});
if (user.Policy.IsAdministrator && groupedVersions.length) {
$('.splitVersionContainer', page).show();
} else {
$('.splitVersionContainer', page).hide();
}
$('.btnMoreCommands', page).visible(LibraryBrowser.getMoreCommands(item, user).length > 0);
if (user.Policy.IsAdministrator) {
$('.chapterSettingsButton', page).show();
} else {
$('.chapterSettingsButton', page).hide();
}
LiveTvHelpers.renderOriginalAirDate($('.airDate', page), item);
});
if (item.LocationType == "Offline") {
$('.offlineIndicator', page).show();
}
else {
$('.offlineIndicator', page).hide();
}
var isMissingEpisode = false;
if (item.LocationType == "Virtual" && item.Type == "Episode") {
try {
if (item.PremiereDate && (new Date().getTime() >= parseISO8601Date(item.PremiereDate, { toLocal: true }).getTime())) {
isMissingEpisode = true;
}
} catch (err) {
}
}
if (isMissingEpisode) {
$('.missingIndicator', page).show();
}
else {
$('.missingIndicator', page).hide();
}
setPeopleHeader(page, item);
$(page).trigger('displayingitem', [{
item: item,
context: context
}]);
Dashboard.hideLoadingMsg();
}
function renderImage(page, item, user) {
var imageHref = user.Policy.IsAdministrator && item.MediaType != 'Photo' ? "edititemmetadata.html?tab=3&id=" + item.Id : "";
LibraryBrowser.renderDetailImage(page.querySelector('.detailImageContainer'), item, imageHref);
}
function onWebSocketMessage(e, data) {
var msg = data;
var page = $($.mobile.activePage)[0];
if (msg.MessageType === "UserDataChanged") {
if (currentItem && msg.Data.UserId == Dashboard.getCurrentUserId()) {
var key = currentItem.UserData.Key;
var userData = msg.Data.UserDataList.filter(function (u) {
return u.Key == key;
})[0];
if (userData) {
currentItem.UserData = userData;
Dashboard.getCurrentUser().done(function (user) {
renderImage(page, currentItem, user);
});
}
}
}
}
function setPeopleHeader(page, item) {
if (item.Type == "Audio" || item.Type == "MusicAlbum" || item.MediaType == "Book" || item.MediaType == "Photo") {
$('#peopleHeader', page).html(Globalize.translate('HeaderPeople'));
} else {
$('#peopleHeader', page).html(Globalize.translate('HeaderCastAndCrew'));
}
}
function getContext(item) {
return getParameterByName('context');
}
function renderHeader(page, item, context) {
$('.itemTabs', page).hide();
if (context == 'tv') {
$(page).removeClass('noSecondaryNavPage');
$('#tvShowsTabs', page).show();
LibraryMenu.setMenuButtonVisible(true);
}
else {
$(page).addClass('noSecondaryNavPage');
LibraryMenu.setBackButtonVisible(true);
LibraryMenu.setMenuButtonVisible(false);
}
}
function setInitialCollapsibleState(page, item, context, user) {
$('.collectionItems', page).empty();
if (item.Type == 'TvChannel') {
$('#childrenCollapsible', page).removeClass('hide');
renderChannelGuide(page, item, user);
}
else if (item.Type == 'Playlist') {
$('#childrenCollapsible', page).removeClass('hide');
renderPlaylistItems(page, item, user);
}
else if (item.Type == 'Studio' || item.Type == 'Person' || item.Type == 'Genre' || item.Type == 'MusicGenre' || item.Type == 'GameGenre' || item.Type == 'MusicArtist') {
$('#childrenCollapsible', page).removeClass('hide');
renderItemsByName(page, item, user);
}
else if (item.IsFolder) {
if (item.Type == "BoxSet") {
$('#childrenCollapsible', page).addClass('hide');
} else {
$('#childrenCollapsible', page).removeClass('hide');
}
renderChildren(page, item, user, context);
}
else {
$('#childrenCollapsible', page).addClass('hide');
}
if (item.MediaSources && item.MediaSources.length) {
renderMediaSources(page, item);
}
var chapters = item.Chapters || [];
if (!chapters.length || !AppInfo.enableDetailPageChapters) {
$('#scenesCollapsible', page).hide();
} else {
$('#scenesCollapsible', page).show();
renderScenes(page, item, user, 3);
}
if (!item.SpecialFeatureCount || item.SpecialFeatureCount == 0 || item.Type == "Series") {
$('#specialsCollapsible', page).addClass('hide');
} else {
$('#specialsCollapsible', page).removeClass('hide');
renderSpecials(page, item, user, 6);
}
if (!item.People || !item.People.length) {
$('#castCollapsible', page).hide();
} else {
$('#castCollapsible', page).show();
renderCast(page, item, context, 6);
}
if (item.PartCount && item.PartCount > 1) {
$('#additionalPartsCollapsible', page).removeClass('hide');
renderAdditionalParts(page, item, user);
} else {
$('#additionalPartsCollapsible', page).addClass('hide');
}
$('#themeSongsCollapsible', page).hide();
$('#themeVideosCollapsible', page).hide();
if (item.Type == "MusicAlbum") {
renderMusicVideos(page, item, user);
} else {
$('#musicVideosCollapsible', page).hide();
}
renderThemeMedia(page, item, user);
renderCriticReviews(page, item, 1);
}
function renderDetails(page, item, context, isStatic) {
renderSimilarItems(page, item, context);
renderSiblingLinks(page, item, context);
if (item.Taglines && item.Taglines.length) {
$('.tagline', page).html(item.Taglines[0]).show();
} else {
$('.tagline', page).hide();
}
LibraryBrowser.renderOverview(page.querySelectorAll('.itemOverview'), item);
$('.itemCommunityRating', page).html(LibraryBrowser.getRatingHtml(item));
LibraryBrowser.renderAwardSummary($('#awardSummary', page), item);
$('.itemMiscInfo', page).html(LibraryBrowser.getMiscInfoHtml(item));
LibraryBrowser.renderGenres($('.itemGenres', page), item, null, isStatic);
LibraryBrowser.renderStudios($('.itemStudios', page), item, isStatic);
renderUserDataIcons(page, item);
LibraryBrowser.renderLinks(page.querySelector('.itemExternalLinks'), item);
$('.criticRatingScore', page).html((item.CriticRating || '0') + '%');
if (item.CriticRatingSummary) {
$('#criticRatingSummary', page).show();
$('.criticRatingSummaryText', page).html(item.CriticRatingSummary);
} else {
$('#criticRatingSummary', page).hide();
}
renderTags(page, item);
renderSeriesAirTime(page, item, context);
if (item.Players) {
$('#players', page).show().html(item.Players + ' Player');
} else {
$('#players', page).hide();
}
if (item.ArtistItems && item.ArtistItems.length && item.Type != "MusicAlbum") {
$('.artist', page).show().html(getArtistLinksHtml(item.ArtistItems, context)).trigger('create');
} else {
$('.artist', page).hide();
}
if (item.MediaSources && item.MediaSources.length && item.Path) {
$('.audioVideoMediaInfo', page).removeClass('hide');
} else {
$('.audioVideoMediaInfo', page).addClass('hide');
}
if (item.MediaType == 'Photo') {
$('.photoInfo', page).removeClass('hide');
renderPhotoInfo(page, item);
} else {
$('.photoInfo', page).addClass('hide');
}
renderTabButtons(page, item);
}
function renderPhotoInfo(page, item) {
var html = '';
var attributes = [];
if (item.CameraMake) {
attributes.push(createAttribute(Globalize.translate('MediaInfoCameraMake'), item.CameraMake));
}
if (item.CameraModel) {
attributes.push(createAttribute(Globalize.translate('MediaInfoCameraModel'), item.CameraModel));
}
if (item.Altitude) {
attributes.push(createAttribute(Globalize.translate('MediaInfoAltitude'), item.Altitude.toFixed(1)));
}
if (item.Aperture) {
attributes.push(createAttribute(Globalize.translate('MediaInfoAperture'), 'F' + item.Aperture.toFixed(1)));
}
if (item.ExposureTime) {
var val = 1 / item.ExposureTime;
attributes.push(createAttribute(Globalize.translate('MediaInfoExposureTime'), '1/' + val + ' s'));
}
if (item.FocalLength) {
attributes.push(createAttribute(Globalize.translate('MediaInfoFocalLength'), item.FocalLength.toFixed(1) + ' mm'));
}
if (item.ImageOrientation) {
attributes.push(createAttribute(Globalize.translate('MediaInfoOrientation'), item.ImageOrientation));
}
if (item.IsoSpeedRating) {
attributes.push(createAttribute(Globalize.translate('MediaInfoIsoSpeedRating'), item.IsoSpeedRating));
}
if (item.Latitude) {
attributes.push(createAttribute(Globalize.translate('MediaInfoLatitude'), item.Latitude.toFixed(1)));
}
if (item.Longitude) {
attributes.push(createAttribute(Globalize.translate('MediaInfoLongitude'), item.Longitude.toFixed(1)));
}
if (item.ShutterSpeed) {
attributes.push(createAttribute(Globalize.translate('MediaInfoShutterSpeed'), item.ShutterSpeed));
}
if (item.Software) {
attributes.push(createAttribute(Globalize.translate('MediaInfoSoftware'), item.Software));
}
html += attributes.join('
');
$('.photoInfoContent', page).html(html).trigger('create');
}
function renderTabButtons(page, item) {
var elem = $('.tabDetails', page)[0];
var text = elem.textContent || elem.innerText || '';
if (text.trim()) {
$('.detailsSection', page).removeClass('hide');
} else {
$('.detailsSection', page).addClass('hide');
}
}
function getArtistLinksHtml(artists, context) {
var html = [];
for (var i = 0, length = artists.length; i < length; i++) {
var artist = artists[i];
html.push('' + artist.Name + '');
}
html = html.join(' / ');
if (artists.length == 1) {
return Globalize.translate('ValueArtist', html);
}
if (artists.length > 1) {
return Globalize.translate('ValueArtists', html);
}
return html;
}
function renderSiblingLinks(page, item, context) {
$('.lnkSibling', page).addClass('hide');
if ((item.Type != "Episode" && item.Type != "Season" && item.Type != "Audio" && item.Type != "Photo")) {
return;
}
var promise;
if (item.Type == "Season") {
promise = ApiClient.getSeasons(item.SeriesId, {
userId: Dashboard.getCurrentUserId(),
AdjacentTo: item.Id
});
}
else if (item.Type == "Episode" && item.SeasonId) {
// Use dedicated episodes endpoint
promise = ApiClient.getEpisodes(item.SeriesId, {
seasonId: item.SeasonId,
userId: Dashboard.getCurrentUserId(),
AdjacentTo: item.Id
});
} else {
promise = ApiClient.getItems(Dashboard.getCurrentUserId(), {
AdjacentTo: item.Id,
ParentId: item.ParentId,
SortBy: 'SortName'
});
}
context = context || '';
promise.done(function (result) {
var foundExisting = false;
for (var i = 0, length = result.Items.length; i < length; i++) {
var curr = result.Items[i];
if (curr.Id == item.Id) {
foundExisting = true;
}
else if (!foundExisting) {
$('.lnkPreviousItem', page).removeClass('hide').attr('href', 'itemdetails.html?id=' + curr.Id + '&context=' + context);
}
else {
$('.lnkNextItem', page).removeClass('hide').attr('href', 'itemdetails.html?id=' + curr.Id + '&context=' + context);
}
}
});
}
function renderSimilarItems(page, item, context) {
if (item.Type == "Movie" || item.Type == "Trailer" || item.Type == "Series" || item.Type == "Program" || item.Type == "Recording" || item.Type == "Game" || item.Type == "MusicAlbum" || item.Type == "MusicArtist" || item.Type == "ChannelVideoItem") {
$('#similarCollapsible', page).show();
}
else {
$('#similarCollapsible', page).hide();
return;
}
var screenWidth = $(window).width();
var options = {
userId: Dashboard.getCurrentUserId(),
limit: screenWidth > 800 ? 5 : 4,
fields: "PrimaryImageAspectRatio,UserData,SyncInfo"
};
ApiClient.getSimilarItems(item.Id, options).done(function (result) {
if (!result.Items.length) {
$('#similarCollapsible', page).hide();
return;
}
var elem = $('#similarCollapsible', page).show();
$('.similiarHeader', elem).html(Globalize.translate('HeaderIfYouLikeCheckTheseOut', item.Name));
var html = LibraryBrowser.getPosterViewHtml({
items: result.Items,
shape: item.Type == "MusicAlbum" || item.Type == "MusicArtist" ? "detailPageSquare" : "detailPagePortrait",
showParentTitle: item.Type == "MusicAlbum",
centerText: true,
showTitle: item.Type == "MusicAlbum" || item.Type == "Game" || item.Type == "MusicArtist",
borderless: item.Type == "Game",
context: context,
lazy: true,
showDetailsMenu: true,
coverImage: item.Type == "MusicAlbum" || item.Type == "MusicArtist"
});
$('#similarContent', page).html(html).lazyChildren();
});
}
function renderSeriesAirTime(page, item, context) {
if (item.Type != "Series") {
$('#seriesAirTime', page).hide();
return;
}
var html = '';
if (item.AirDays && item.AirDays.length) {
html += item.AirDays.length == 7 ? 'daily' : item.AirDays.map(function (a) {
return a + "s";
}).join(',');
}
if (item.AirTime) {
html += ' at ' + item.AirTime;
}
if (item.Studios.length) {
html += ' on ' + item.Studios[0].Name + '';
}
if (html) {
html = (item.Status == 'Ended' ? 'Aired ' : 'Airs ') + html;
$('#seriesAirTime', page).show().html(html).trigger('create');
} else {
$('#seriesAirTime', page).hide();
}
}
function renderTags(page, item) {
if (item.Tags && item.Tags.length) {
var html = '';
html += '
' + Globalize.translate('HeaderTags') + '
'; for (var i = 0, length = item.Tags.length; i < length; i++) { html += '' + cast.Name + '
'; var role = cast.Role ? Globalize.translate('ValueAsRole', cast.Role) : cast.Type; if (role == "GuestStar") { role = Globalize.translate('ValueGuestStar'); } role = role || ""; var maxlength = 40; if (role.length > maxlength) { role = role.substring(0, maxlength - 3) + '...'; } html += '' + role + '
'; html += '