';
page.prepend(headerHtml);
Dashboard.getPluginSecurityInfo().done(function (pluginSecurityInfo) {
if (pluginSecurityInfo.IsMBSupporter) {
$('').insertBefore('.btnTools', page);
}
});
},
ensureToolsMenu: function (page) {
if (!page.hasClass('type-interior')) {
return;
}
var sidebar = $('.toolsSidebar', page);
if (!sidebar.length) {
var html = '
';
html += '
Tools
';
html += '
';
var links = Dashboard.getToolsMenuLinks(page);
for (var i = 0, length = links.length; i < length; i++) {
var link = links[i];
if (link.href) {
if (link.selected) {
html += '' + link.name + '';
} else {
html += '' + link.name + '';
}
}
}
// collapsible
html += '
';
// content-secondary
html += '
';
$(page).append(html);
}
},
getToolsMenuLinks: function (page) {
var pageElem = page[0];
return [{
name: "Dashboard",
href: "dashboard.html",
selected: pageElem.id == "dashboardPage"
}, {
name: "Media Library",
href: "library.html",
selected: pageElem.id == "mediaLibraryPage"
}, {
name: "Metadata",
href: "metadata.html",
selected: pageElem.id == "metadataConfigurationPage" || pageElem.id == "advancedMetadataConfigurationPage" || pageElem.id == "metadataImagesConfigurationPage"
}, {
name: "Plugins",
href: "plugins.html",
selected: page.hasClass("pluginConfigurationPage")
}, {
name: "User Profiles",
href: "userProfiles.html",
selected: page.hasClass("userProfilesConfigurationPage")
}, {
name: "Display Settings",
href: "uiSettings.html",
selected: pageElem.id == "displaySettingsPage"
}, {
name: "Advanced",
href: "advanced.html",
selected: pageElem.id == "advancedConfigurationPage"
}, {
name: "Scheduled Tasks",
href: "scheduledTasks.html",
selected: pageElem.id == "scheduledTasksPage" || pageElem.id == "scheduledTaskPage"
}, {
name: "Help",
href: "support.html",
selected: pageElem.id == "supportPage" || pageElem.id == "logPage" || pageElem.id == "supporterPage" || pageElem.id == "supporterKeyPage" || pageElem.id == "aboutPage"
}];
},
ensureWebSocket: function (systemInfo) {
if (!("WebSocket" in window)) {
// Not supported by the browser
return;
}
if (Dashboard.webSocket) {
if (Dashboard.webSocket.readyState === WebSocket.OPEN || Dashboard.webSocket.readyState === WebSocket.CONNECTING) {
return;
}
}
systemInfo = systemInfo || Dashboard.lastSystemInfo;
var url = "ws://" + ApiClient.serverHostName() + ":" + systemInfo.WebSocketPortNumber + "/mediabrowser";
var ws = new WebSocket(url);
ws.onmessage = Dashboard.onWebSocketMessage;
ws.onopen = function () {
setTimeout(function () {
$(document).trigger("websocketopen");
}, 500);
};
ws.onerror = function () {
setTimeout(function () {
$(document).trigger("websocketerror");
}, 0);
};
ws.onclose = function () {
setTimeout(function () {
$(document).trigger("websocketclose");
}, 0);
};
Dashboard.webSocket = ws;
},
resetWebSocketPingInterval: function () {
if (Dashboard.pingWebSocketInterval) {
clearInterval(Dashboard.pingWebSocketInterval);
Dashboard.pingWebSocketInterval = null;
}
Dashboard.pingWebSocketInterval = setInterval(Dashboard.pingWebSocket, 30000);
},
pingWebSocket: function () {
// Send a ping to the server every so often to try and keep the connection alive
if (Dashboard.isWebSocketOpen()) {
Dashboard.sendWebSocketMessage("ping");
}
},
onWebSocketMessage: function (msg) {
msg = JSON.parse(msg.data);
if (msg.MessageType === "LibraryChanged") {
Dashboard.processLibraryUpdateNotification(msg.Data);
}
else if (msg.MessageType === "UserDeleted") {
Dashboard.validateCurrentUser();
}
else if (msg.MessageType === "SystemInfo") {
Dashboard.updateSystemInfo(msg.Data);
}
else if (msg.MessageType === "HasPendingRestartChanged") {
Dashboard.updateSystemInfo(msg.Data);
}
else if (msg.MessageType === "UserUpdated") {
Dashboard.validateCurrentUser();
var user = msg.Data;
if (user.Id == Dashboard.getCurrentUserId()) {
$('.currentUsername').html(user.Name);
}
}
else if (msg.MessageType === "PackageInstallationCompleted") {
Dashboard.showPackageInstallNotification(msg.Data, "completed");
Dashboard.refreshSystemInfoFromServer();
}
else if (msg.MessageType === "PackageInstallationFailed") {
Dashboard.showPackageInstallNotification(msg.Data, "failed");
Dashboard.refreshSystemInfoFromServer();
}
else if (msg.MessageType === "PackageInstallationCancelled") {
Dashboard.showPackageInstallNotification(msg.Data, "cancelled");
Dashboard.refreshSystemInfoFromServer();
}
else if (msg.MessageType === "PackageInstalling") {
Dashboard.showPackageInstallNotification(msg.Data, "progress");
Dashboard.refreshSystemInfoFromServer();
}
else if (msg.MessageType === "ScheduledTaskEndExecute") {
Dashboard.showTaskCompletionNotification(msg.Data);
}
$(document).trigger("websocketmessage", [msg]);
},
sendWebSocketMessage: function (name, data) {
var msg = { MessageType: name };
if (data) {
msg.Data = data;
}
msg = JSON.stringify(msg);
Dashboard.webSocket.send(msg);
},
isWebSocketOpen: function () {
return Dashboard.webSocket && Dashboard.webSocket.readyState === WebSocket.OPEN;
},
showTaskCompletionNotification: function (result) {
var html = '';
if (result.Status == "Completed") {
html += '';
return;
}
else if (result.Status == "Cancelled") {
html += '';
return;
}
else {
html += '';
}
html += '';
html += result.Name + " " + result.Status;
html += '';
var timeout = 0;
if (result.Status == 'Cancelled') {
timeout = 2000;
}
Dashboard.showFooterNotification({ html: html, id: result.Id, forceShow: true, timeout: timeout });
},
showPackageInstallNotification: function (installation, status) {
var html = '';
if (status == 'completed') {
html += '';
}
else if (status == 'cancelled') {
html += '';
}
else if (status == 'failed') {
html += '';
}
else if (status == 'progress') {
html += '';
}
html += '';
if (status == 'completed') {
html += installation.Name + ' ' + installation.Version + ' installation completed';
}
else if (status == 'cancelled') {
html += installation.Name + ' ' + installation.Version + ' installation was cancelled';
}
else if (status == 'failed') {
html += installation.Name + ' ' + installation.Version + ' installation failed';
}
else if (status == 'progress') {
html += 'Installing ' + installation.Name + ' ' + installation.Version;
}
html += '';
if (status == 'progress') {
var percentComplete = Math.round(installation.PercentComplete || 0);
html += '';
if (percentComplete < 100) {
var btnId = "btnCancel" + installation.Id;
html += '';
}
}
var timeout = 0;
if (status == 'cancelled') {
timeout = 2000;
}
var forceShow = status != "progress";
var allowHide = status != "progress" && status != 'cancelled';
Dashboard.showFooterNotification({ html: html, id: installation.Id, timeout: timeout, forceShow: forceShow, allowHide: allowHide });
},
processLibraryUpdateNotification: function (data) {
var newItems = data.ItemsAdded.filter(function (a) {
return !a.IsFolder;
});
if (!Dashboard.newItems) {
Dashboard.newItems = [];
}
for (var i = 0, length = newItems.length ; i < length; i++) {
Dashboard.newItems.push(newItems[i]);
}
if (Dashboard.newItemTimeout) {
clearTimeout(Dashboard.newItemTimeout);
}
Dashboard.newItemTimeout = setTimeout(Dashboard.onNewItemTimerStopped, 60000);
},
onNewItemTimerStopped: function () {
var newItems = Dashboard.newItems;
newItems = newItems.sort(function (a, b) {
if (a.PrimaryImageTag && b.PrimaryImageTag) {
return 0;
}
if (a.PrimaryImageTag) {
return -1;
}
return 1;
});
Dashboard.newItems = [];
Dashboard.newItemTimeout = null;
// Show at most 3 notifications
for (var i = 0, length = Math.min(newItems.length, 3) ; i < length; i++) {
var item = newItems[i];
var data = {
title: "New " + item.Type,
body: item.Name,
timeout: 6000
};
if (item.PrimaryImageTag) {
data.icon = ApiClient.getImageUrl(item.Id, {
width: 100,
tag: item.PrimaryImageTag,
type: "Primary"
});
if (!item.Id || data.icon.indexOf("undefined") != -1) {
alert("bad image url: " + JSON.stringify(item));
console.log("bad image url: " + JSON.stringify(item));
continue;
}
}
WebNotifications.show(data);
}
},
ensurePageTitle: function (page) {
if (!page.hasClass('type-interior')) {
return;
}
var pageElem = page[0];
if (pageElem.hasPageTitle) {
return;
}
var parent = $('.content-primary', page);
if (!parent.length) {
parent = $('.ui-content', page)[0];
}
$(parent).prepend("
" + (document.title || " ") + "
");
pageElem.hasPageTitle = true;
},
setPageTitle: function (title) {
$('.pageTitle', $.mobile.activePage).html(title);
if (title) {
document.title = title;
}
},
metroColors: ["#6FBD45", "#4BB3DD", "#4164A5", "#E12026", "#800080", "#E1B222", "#008040", "#0094FF", "#FF00C7", "#FF870F", "#7F0037"],
getRandomMetroColor: function () {
var index = Math.floor(Math.random() * (Dashboard.metroColors.length - 1));
return Dashboard.metroColors[index];
}
};
var ApiClient = MediaBrowser.ApiClient.create("Dashboard");
$(function () {
var footerHtml = '';
$(document.body).append(footerHtml);
});
Dashboard.jQueryMobileInit();
$(document).on('pagebeforeshow', ".page", function () {
Dashboard.refreshSystemInfoFromServer();
var page = $(this);
Dashboard.ensureHeader(page);
Dashboard.ensurePageTitle(page);
}).on('pageinit', ".page", function () {
var page = $(this);
var userId = Dashboard.getCurrentUserId();
ApiClient.currentUserId(userId);
if (!userId) {
if (this.id !== "loginPage" && !page.hasClass('wizardPage')) {
Dashboard.logout();
}
}
else {
Dashboard.getCurrentUser().done(function (user) {
if (user.Configuration.IsAdministrator) {
Dashboard.ensureToolsMenu(page);
}
});
}
});