2013-03-22 21:04:36 -07:00
$ . ajaxSetup ( {
crossDomain : true ,
2013-04-12 11:22:40 -07:00
error : function ( event ) {
2013-03-22 21:04:36 -07:00
Dashboard . hideLoadingMsg ( ) ;
if ( ! Dashboard . suppressAjaxErrors ) {
setTimeout ( function ( ) {
var msg = event . getResponseHeader ( "X-Application-Error-Code" ) || Dashboard . defaultErrorMessage ;
Dashboard . showError ( msg ) ;
} , 500 ) ;
}
}
} ) ;
2013-04-23 12:36:36 -07:00
if ( $ . browser . msie ) {
2013-05-10 05:18:07 -07:00
2013-04-23 12:36:36 -07:00
// This is unfortuantely required due to IE's over-aggressive caching.
// https://github.com/MediaBrowser/MediaBrowser/issues/179
$ . ajaxSetup ( {
cache : false
} ) ;
}
2013-03-22 21:04:36 -07:00
$ . support . cors = true ;
$ ( document ) . one ( 'click' , WebNotifications . requestPermission ) ;
var Dashboard = {
jQueryMobileInit : function ( ) {
// Page
//$.mobile.page.prototype.options.theme = "a";
//$.mobile.page.prototype.options.headerTheme = "a";
//$.mobile.page.prototype.options.contentTheme = "a";
//$.mobile.page.prototype.options.footerTheme = "a";
//$.mobile.button.prototype.options.theme = "c";
2013-12-24 11:37:29 -07:00
//$.mobile.listview.prototype.options.dividerTheme = "b";
2013-03-22 21:04:36 -07:00
2013-12-24 11:37:29 -07:00
//$.mobile.popup.prototype.options.theme = "c";
//$.mobile.popup.prototype.options.transition = "none";
2013-12-22 20:46:03 -07:00
//$.mobile.defaultPageTransition = "none";
2013-03-22 21:04:36 -07:00
//$.mobile.collapsible.prototype.options.contentTheme = "a";
} ,
getCurrentUser : function ( ) {
if ( ! Dashboard . getUserPromise ) {
2013-07-16 09:03:28 -07:00
var userId = Dashboard . getCurrentUserId ( ) ;
Dashboard . getUserPromise = ApiClient . getUser ( userId ) . fail ( Dashboard . logout ) ;
2013-03-22 21:04:36 -07:00
}
return Dashboard . getUserPromise ;
} ,
2013-04-04 08:22:39 -07:00
validateCurrentUser : function ( page ) {
2013-07-16 09:03:28 -07:00
2013-03-22 21:04:36 -07:00
Dashboard . getUserPromise = null ;
if ( Dashboard . getCurrentUserId ( ) ) {
Dashboard . getCurrentUser ( ) ;
}
2013-04-15 18:46:17 -07:00
page = page || $ . mobile . activePage ;
2013-04-04 08:22:39 -07:00
var header = $ ( '.header' , page ) ;
2013-03-26 15:40:01 -07:00
2013-03-22 21:04:36 -07:00
if ( header . length ) {
// Re-render the header
header . remove ( ) ;
2013-08-27 21:31:34 -07:00
2013-07-16 09:03:28 -07:00
if ( Dashboard . getUserPromise ) {
2013-08-27 21:31:34 -07:00
Dashboard . getUserPromise . done ( function ( user ) {
2013-07-16 09:03:28 -07:00
Dashboard . ensureHeader ( page , user ) ;
} ) ;
} else {
Dashboard . ensureHeader ( page ) ;
}
2013-03-22 21:04:36 -07:00
}
} ,
getCurrentUserId : function ( ) {
2014-01-03 19:35:41 -07:00
if ( ! window . localStorage ) {
return null ;
}
2013-03-22 21:04:36 -07:00
var userId = localStorage . getItem ( "userId" ) ;
if ( ! userId ) {
var autoLoginUserId = getParameterByName ( 'u' ) ;
if ( autoLoginUserId ) {
userId = autoLoginUserId ;
localStorage . setItem ( "userId" , userId ) ;
}
}
return userId ;
} ,
setCurrentUser : function ( userId ) {
2014-01-03 19:35:41 -07:00
if ( window . localStorage ) {
localStorage . setItem ( "userId" , userId ) ;
}
2013-03-22 21:04:36 -07:00
ApiClient . currentUserId ( userId ) ;
Dashboard . getUserPromise = null ;
} ,
logout : function ( ) {
2014-01-03 19:35:41 -07:00
if ( window . localStorage ) {
localStorage . removeItem ( "userId" ) ;
}
2013-03-22 21:04:36 -07:00
Dashboard . getUserPromise = null ;
ApiClient . currentUserId ( null ) ;
window . location = "login.html" ;
} ,
showError : function ( message ) {
$ . mobile . loading ( 'show' , {
text : message ,
textonly : true ,
textVisible : true
} ) ;
setTimeout ( function ( ) {
$ . mobile . loading ( 'hide' ) ;
2014-01-01 11:26:31 -07:00
} , 3000 ) ;
2013-03-22 21:04:36 -07:00
} ,
2013-12-26 19:23:57 -07:00
alert : function ( options ) {
2013-03-22 21:04:36 -07:00
2013-12-26 19:23:57 -07:00
if ( typeof options == "string" ) {
2013-03-22 21:04:36 -07:00
2013-12-26 19:23:57 -07:00
var message = options ;
$ . mobile . loading ( 'show' , {
text : message ,
textonly : true ,
textVisible : true
} ) ;
setTimeout ( function ( ) {
$ . mobile . loading ( 'hide' ) ;
2014-01-01 11:26:31 -07:00
} , 3000 ) ;
2013-12-26 19:23:57 -07:00
return ;
}
Dashboard . confirmInternal ( options . message , options . title || 'Alert' , false , options . callback ) ;
2013-03-22 21:04:36 -07:00
} ,
updateSystemInfo : function ( info ) {
var isFirstLoad = ! Dashboard . lastSystemInfo ;
Dashboard . lastSystemInfo = info ;
Dashboard . ensureWebSocket ( info ) ;
if ( ! Dashboard . initialServerVersion ) {
Dashboard . initialServerVersion = info . Version ;
}
if ( info . HasPendingRestart ) {
Dashboard . hideDashboardVersionWarning ( ) ;
2013-06-27 08:04:10 -07:00
Dashboard . getCurrentUser ( ) . done ( function ( currentUser ) {
if ( currentUser . Configuration . IsAdministrator ) {
2013-10-07 07:38:31 -07:00
Dashboard . showServerRestartWarning ( info ) ;
2013-06-27 08:04:10 -07:00
}
} ) ;
2013-03-22 21:04:36 -07:00
} else {
Dashboard . hideServerRestartWarning ( ) ;
if ( Dashboard . initialServerVersion != info . Version ) {
Dashboard . showDashboardVersionWarning ( ) ;
}
}
if ( isFirstLoad ) {
Dashboard . showFailedAssemblies ( info . FailedPluginAssemblies ) ;
}
Dashboard . showInProgressInstallations ( info . InProgressInstallations ) ;
} ,
showFailedAssemblies : function ( failedAssemblies ) {
for ( var i = 0 , length = failedAssemblies . length ; i < length ; i ++ ) {
var assembly = failedAssemblies [ i ] ;
var html = '<img src="css/images/notifications/error.png" class="notificationIcon" />' ;
var index = assembly . lastIndexOf ( '\\' ) ;
if ( index != - 1 ) {
assembly = assembly . substring ( index + 1 ) ;
}
html += '<span>' ;
html += assembly + " failed to load." ;
html += '</span>' ;
Dashboard . showFooterNotification ( { html : html } ) ;
}
} ,
showInProgressInstallations : function ( installations ) {
installations = installations || [ ] ;
for ( var i = 0 , length = installations . length ; i < length ; i ++ ) {
var installation = installations [ i ] ;
var percent = installation . PercentComplete || 0 ;
if ( percent < 100 ) {
Dashboard . showPackageInstallNotification ( installation , "progress" ) ;
}
}
if ( installations . length ) {
Dashboard . ensureInstallRefreshInterval ( ) ;
} else {
Dashboard . stopInstallRefreshInterval ( ) ;
}
} ,
ensureInstallRefreshInterval : function ( ) {
if ( ! Dashboard . installRefreshInterval ) {
if ( ApiClient . isWebSocketOpen ( ) ) {
ApiClient . sendWebSocketMessage ( "SystemInfoStart" , "0,350" ) ;
}
Dashboard . installRefreshInterval = 1 ;
}
} ,
stopInstallRefreshInterval : function ( ) {
if ( Dashboard . installRefreshInterval ) {
if ( ApiClient . isWebSocketOpen ( ) ) {
ApiClient . sendWebSocketMessage ( "SystemInfoStop" ) ;
}
Dashboard . installRefreshInterval = null ;
}
} ,
cancelInstallation : function ( id ) {
ApiClient . cancelPackageInstallation ( id ) . always ( Dashboard . refreshSystemInfoFromServer ) ;
} ,
2013-10-07 07:38:31 -07:00
showServerRestartWarning : function ( systemInfo ) {
2013-03-22 21:04:36 -07:00
2013-12-27 09:18:42 -07:00
var html = '<span style="margin-right: 1em;">Please restart to finish updating.</span>' ;
2013-11-28 11:27:29 -07:00
2013-10-07 07:38:31 -07:00
if ( systemInfo . CanSelfRestart ) {
2013-12-24 11:37:29 -07:00
html += '<button type="button" data-icon="refresh" onclick="$(this).buttonEnabled(false);Dashboard.restartServer();" data-theme="b" data-inline="true" data-mini="true">Restart Server</button>' ;
2013-10-07 07:38:31 -07:00
}
2013-03-22 21:04:36 -07:00
Dashboard . showFooterNotification ( { id : "serverRestartWarning" , html : html , forceShow : true , allowHide : false } ) ;
} ,
hideServerRestartWarning : function ( ) {
$ ( '#serverRestartWarning' ) . remove ( ) ;
} ,
showDashboardVersionWarning : function ( ) {
var html = '<span style="margin-right: 1em;">Please refresh this page to receive new updates from the server.</span>' ;
Dashboard . showFooterNotification ( { id : "dashboardVersionWarning" , html : html , forceShow : true , allowHide : false } ) ;
} ,
reloadPage : function ( ) {
2013-11-05 12:43:21 -07:00
var currentUrl = window . location . toString ( ) . toLowerCase ( ) ;
2013-11-28 11:27:29 -07:00
2013-11-05 12:43:21 -07:00
// If they're on a plugin config page just go back to the dashboard
// The plugin may not have been loaded yet, or could have been uninstalled
if ( currentUrl . indexOf ( 'configurationpage' ) != - 1 ) {
window . location . href = "dashboard.html" ;
} else {
window . location . href = window . location . href ;
}
2013-03-22 21:04:36 -07:00
} ,
hideDashboardVersionWarning : function ( ) {
$ ( '#dashboardVersionWarning' ) . remove ( ) ;
} ,
showFooterNotification : function ( options ) {
var removeOnHide = ! options . id ;
options . id = options . id || "notification" + new Date ( ) . getTime ( ) + parseInt ( Math . random ( ) ) ;
var parentElem = $ ( '#footerNotifications' ) ;
var elem = $ ( '#' + options . id , parentElem ) ;
if ( ! elem . length ) {
elem = $ ( '<p id="' + options . id + '" class="footerNotification"></p>' ) . appendTo ( parentElem ) ;
}
var onclick = removeOnHide ? "$(\"#" + options . id + "\").remove();" : "$(\"#" + options . id + "\").hide();" ;
if ( options . allowHide !== false ) {
2013-12-29 19:41:22 -07:00
options . html += "<span style='margin-left: 1em;'><button type='button' onclick='" + onclick + "' data-icon='delete' data-iconpos='notext' data-mini='true' data-inline='true' data-theme='b'>Hide</button></span>" ;
2013-03-22 21:04:36 -07:00
}
if ( options . forceShow ) {
elem . show ( ) ;
}
elem . html ( options . html ) . trigger ( 'create' ) ;
if ( options . timeout ) {
setTimeout ( function ( ) {
if ( removeOnHide ) {
elem . remove ( ) ;
} else {
elem . hide ( ) ;
}
} , options . timeout ) ;
}
} ,
getConfigurationPageUrl : function ( name ) {
return "ConfigurationPage?name=" + encodeURIComponent ( name ) ;
} ,
navigate : function ( url , preserveQueryString ) {
var queryString = window . location . search ;
if ( preserveQueryString && queryString ) {
url += queryString ;
}
$ . mobile . changePage ( url ) ;
} ,
showLoadingMsg : function ( ) {
2013-03-31 18:52:07 -07:00
$ . mobile . loading ( "show" ) ;
2013-03-22 21:04:36 -07:00
} ,
hideLoadingMsg : function ( ) {
2013-03-31 18:52:07 -07:00
$ . mobile . loading ( "hide" ) ;
2013-03-22 21:04:36 -07:00
} ,
processPluginConfigurationUpdateResult : function ( ) {
Dashboard . hideLoadingMsg ( ) ;
Dashboard . alert ( "Settings saved." ) ;
} ,
defaultErrorMessage : "There was an error processing the request." ,
processServerConfigurationUpdateResult : function ( result ) {
Dashboard . hideLoadingMsg ( ) ;
Dashboard . alert ( "Settings saved." ) ;
} ,
2013-12-26 19:23:57 -07:00
confirmInternal : function ( message , title , showCancel , callback ) {
2013-03-22 21:04:36 -07:00
2014-01-22 10:05:06 -07:00
$ ( '.confirmFlyout' ) . popup ( "close" ) . remove ( ) ;
2013-03-22 21:04:36 -07:00
2014-01-22 10:05:06 -07:00
var html = '<div data-role="popup" data-transition="slidefade" class="confirmFlyout" style="max-width:500px;" data-theme="a">' ;
2013-03-22 21:04:36 -07:00
2013-12-24 11:37:29 -07:00
html += '<div class="ui-bar-a" style="text-align:center;">' ;
2013-03-22 21:04:36 -07:00
html += '<h3>' + title + '</h3>' ;
html += '</div>' ;
2013-12-24 11:37:29 -07:00
html += '<div style="padding: 1em;">' ;
2013-03-22 21:04:36 -07:00
html += '<div style="padding: 1em .25em;margin: 0;">' ;
html += message ;
html += '</div>' ;
2014-01-22 10:05:06 -07:00
html += '<p><button type="button" data-icon="check" onclick="$(\'.confirmFlyout\')[0].confirm=true;$(\'.confirmFlyout\').popup(\'close\');" data-theme="b">Ok</button></p>' ;
2013-12-26 19:23:57 -07:00
if ( showCancel ) {
2014-01-22 10:05:06 -07:00
html += '<p><button type="button" data-icon="delete" onclick="$(\'.confirmFlyout\').popup(\'close\');" data-theme="a">Cancel</button></p>' ;
2013-12-26 19:23:57 -07:00
}
2013-03-22 21:04:36 -07:00
html += '</div>' ;
html += '</div>' ;
$ ( document . body ) . append ( html ) ;
2014-01-22 10:05:06 -07:00
$ ( '.confirmFlyout' ) . popup ( { history : false } ) . trigger ( 'create' ) . popup ( "open" ) . on ( "popupafterclose" , function ( ) {
2013-03-22 21:04:36 -07:00
if ( callback ) {
callback ( this . confirm == true ) ;
}
$ ( this ) . off ( "popupafterclose" ) . remove ( ) ;
} ) ;
} ,
2013-12-26 19:23:57 -07:00
confirm : function ( message , title , callback ) {
Dashboard . confirmInternal ( message , title , true , callback ) ;
} ,
2013-03-22 21:04:36 -07:00
refreshSystemInfoFromServer : function ( ) {
ApiClient . getSystemInfo ( ) . done ( function ( info ) {
Dashboard . updateSystemInfo ( info ) ;
} ) ;
} ,
restartServer : function ( ) {
Dashboard . suppressAjaxErrors = true ;
Dashboard . showLoadingMsg ( ) ;
2013-07-16 10:18:32 -07:00
ApiClient . restartServer ( ) . done ( function ( ) {
2013-03-22 21:04:36 -07:00
setTimeout ( function ( ) {
Dashboard . reloadPageWhenServerAvailable ( ) ;
} , 250 ) ;
} ) . fail ( function ( ) {
Dashboard . suppressAjaxErrors = false ;
} ) ;
} ,
reloadPageWhenServerAvailable : function ( retryCount ) {
2013-07-26 08:57:51 -07:00
// Don't use apiclient method because we don't want it reporting authentication under the old version
$ . getJSON ( ApiClient . getUrl ( "System/Info" ) ) . done ( function ( info ) {
2013-03-26 15:40:01 -07:00
2013-03-22 21:04:36 -07:00
// If this is back to false, the restart completed
if ( ! info . HasPendingRestart ) {
Dashboard . reloadPage ( ) ;
} else {
Dashboard . retryReload ( retryCount ) ;
}
2013-03-26 15:40:01 -07:00
} ) . fail ( function ( ) {
2013-03-22 21:04:36 -07:00
Dashboard . retryReload ( retryCount ) ;
} ) ;
} ,
2013-03-26 15:40:01 -07:00
2013-03-22 21:04:36 -07:00
retryReload : function ( retryCount ) {
setTimeout ( function ( ) {
retryCount = retryCount || 0 ;
retryCount ++ ;
if ( retryCount < 10 ) {
Dashboard . reloadPageWhenServerAvailable ( retryCount ) ;
} else {
Dashboard . suppressAjaxErrors = false ;
}
} , 500 ) ;
} ,
2013-05-13 22:36:36 -07:00
showUserFlyout : function ( context ) {
2013-03-22 21:04:36 -07:00
Dashboard . getCurrentUser ( ) . done ( function ( user ) {
2014-01-15 15:19:45 -07:00
var html = '<div data-role="popup" data-transition="slidefade" id="userFlyout" style="max-width:400px;margin-top:30px;margin-right:20px;" data-theme="a">' ;
2013-03-22 21:04:36 -07:00
2013-12-24 11:37:29 -07:00
html += '<a href="#" data-rel="back" data-role="button" data-icon="delete" data-iconpos="notext" class="ui-btn-right" data-theme="b">Close</a>' ;
2013-03-22 21:04:36 -07:00
2013-12-24 11:37:29 -07:00
html += '<div class="ui-bar-b" style="text-align:center;">' ;
2013-07-06 14:23:32 -07:00
html += '<h3 style="margin: .5em 0;">' + user . Name + '</h3>' ;
2013-03-22 21:04:36 -07:00
html += '</div>' ;
2013-12-24 11:37:29 -07:00
html += '<div style="padding: 1em;">' ;
2013-03-22 21:04:36 -07:00
html += '<p style="text-align:center;">' ;
var imageUrl = user . PrimaryImageTag ? ApiClient . getUserImageUrl ( user . Id , {
height : 400 ,
tag : user . PrimaryImageTag ,
type : "Primary"
2013-03-27 15:17:46 -07:00
} ) : "css/images/userflyoutdefault.png" ;
2013-03-22 21:04:36 -07:00
html += '<img style="max-height:125px;max-width:200px;" src="' + imageUrl + '" />' ;
html += '</p>' ;
2013-12-26 08:40:38 -07:00
html += '<p><a data-mini="true" data-role="button" href="useredit.html?userId=' + user . Id + '" data-icon="user">View Profile</button></a>' ;
2013-12-25 20:44:26 -07:00
html += '<p><button data-mini="true" type="button" onclick="Dashboard.logout();" data-icon="lock">Sign Out</button></p>' ;
2013-03-22 21:04:36 -07:00
html += '</div>' ;
html += '</div>' ;
$ ( document . body ) . append ( html ) ;
2013-05-13 22:36:36 -07:00
$ ( '#userFlyout' ) . popup ( { positionTo : context } ) . trigger ( 'create' ) . popup ( "open" ) . on ( "popupafterclose" , function ( ) {
2013-03-22 21:04:36 -07:00
$ ( this ) . off ( "popupafterclose" ) . remove ( ) ;
} ) ;
} ) ;
} ,
getPluginSecurityInfo : function ( ) {
if ( ! Dashboard . getPluginSecurityInfoPromise ) {
var deferred = $ . Deferred ( ) ;
// Don't let this blow up the dashboard when it fails
$ . ajax ( {
type : "GET" ,
url : ApiClient . getUrl ( "Plugins/SecurityInfo" ) ,
dataType : 'json' ,
error : function ( ) {
// Don't show normal dashboard errors
}
} ) . done ( function ( result ) {
2013-06-04 09:59:03 -07:00
deferred . resolveWith ( null , [ result ] ) ;
2013-03-22 21:04:36 -07:00
} ) ;
Dashboard . getPluginSecurityInfoPromise = deferred ;
}
return Dashboard . getPluginSecurityInfoPromise ;
} ,
resetPluginSecurityInfo : function ( ) {
Dashboard . getPluginSecurityInfoPromise = null ;
2013-09-14 14:19:32 -07:00
Dashboard . validateCurrentUser ( ) ;
2013-03-22 21:04:36 -07:00
} ,
2013-07-16 09:03:28 -07:00
ensureHeader : function ( page , user ) {
2013-03-22 21:04:36 -07:00
2013-05-13 22:36:36 -07:00
if ( ! page . hasClass ( 'libraryPage' ) && ! $ ( '.headerButtons' , page ) . length ) {
2013-03-22 21:04:36 -07:00
2013-07-16 09:03:28 -07:00
Dashboard . renderHeader ( page , user ) ;
2013-03-22 21:04:36 -07:00
}
} ,
renderHeader : function ( page , user ) {
var headerHtml = '' ;
2013-04-22 07:44:11 -07:00
var header = $ ( '.header' , page ) ;
2013-04-23 12:17:21 -07:00
2013-04-22 07:44:11 -07:00
if ( ! header . length ) {
headerHtml += '<div class="header">' ;
2013-03-22 21:04:36 -07:00
2013-05-13 22:36:36 -07:00
headerHtml += '<a class="logo" href="index.html">' ;
2013-03-22 21:04:36 -07:00
2013-05-13 22:36:36 -07:00
if ( page . hasClass ( 'standalonePage' ) ) {
2013-03-22 21:04:36 -07:00
2013-05-13 22:36:36 -07:00
headerHtml += '<img class="imgLogoIcon" src="css/images/mblogoicon.png" /><img class="imgLogoText" src="css/images/mblogotextblack.png" />' ;
2013-03-31 22:08:29 -07:00
}
2013-05-13 22:36:36 -07:00
headerHtml += '</a>' ;
2013-12-26 22:08:37 -07:00
if ( page . hasClass ( 'type-interior' ) ) {
headerHtml += '<div>' ;
headerHtml += '<button type="button" data-icon="bars" data-inline="true" data-iconpos="notext" class="ui-alt-icon" onclick="Dashboard.showDashboardMenu();">Menu</button>' ;
headerHtml += '</div>' ;
}
2013-04-22 07:44:11 -07:00
headerHtml += '</div>' ;
page . prepend ( headerHtml ) ;
2013-12-26 22:08:37 -07:00
header = $ ( '.header' , page ) . trigger ( 'create' ) ;
2013-03-22 21:04:36 -07:00
}
2013-05-13 22:36:36 -07:00
var imageColor = "black" ;
2013-03-22 21:04:36 -07:00
2013-04-22 07:44:11 -07:00
headerHtml = '' ;
headerHtml += '<div class="headerButtons">' ;
2013-03-22 21:04:36 -07:00
if ( user && ! page . hasClass ( 'wizardPage' ) ) {
2013-04-25 20:31:10 -07:00
2013-12-24 11:37:29 -07:00
headerHtml += '<a class="imageLink btnCurrentUser" href="#" onclick="Dashboard.showUserFlyout(this);"><span class="currentUsername" style="font-weight:normal;">' + user . Name + '</span>' ;
2013-03-22 21:04:36 -07:00
if ( user . PrimaryImageTag ) {
var url = ApiClient . getUserImageUrl ( user . Id , {
width : 225 ,
tag : user . PrimaryImageTag ,
type : "Primary"
} ) ;
headerHtml += '<img src="' + url + '" />' ;
} else {
2013-03-27 15:17:46 -07:00
headerHtml += '<img src="css/images/currentuserdefault' + imageColor + '.png" />' ;
2013-03-22 21:04:36 -07:00
}
headerHtml += '</a>' ;
if ( user . Configuration . IsAdministrator ) {
2013-12-26 22:13:19 -07:00
var href = window . location . toString ( ) . toLowerCase ( ) . indexOf ( 'dashboard.html' ) == - 1 ? 'dashboard.html' : '#' ;
headerHtml += '<a class="imageLink btnTools" href="' + href + '" data-role="button" data-icon="gear" data-inline="true" data-iconpos="notext">Tools</a>' ;
2013-03-22 21:04:36 -07:00
}
}
headerHtml += '</div>' ;
2013-04-22 07:44:11 -07:00
2013-12-26 22:08:37 -07:00
header . append ( headerHtml ) . trigger ( 'create' ) ;
2013-03-22 21:04:36 -07:00
2013-05-19 19:45:04 -07:00
if ( ! $ ( '.supporterIcon' , header ) . length ) {
2013-05-23 13:09:01 -07:00
2013-06-04 09:59:03 -07:00
Dashboard . getPluginSecurityInfo ( ) . done ( function ( pluginSecurityInfo ) {
2013-04-25 20:31:10 -07:00
2013-05-19 19:45:04 -07:00
if ( pluginSecurityInfo . IsMBSupporter ) {
2013-05-19 22:36:22 -07:00
$ ( '<a class="imageLink supporterIcon" href="supporter.html" title="Thank you for supporting Media Browser."><img src="css/images/supporter/supporterbadge.png" /></a>' ) . insertBefore ( $ ( '.btnTools' , header ) ) ;
2013-05-19 19:45:04 -07:00
} else {
2013-05-20 21:04:38 -07:00
$ ( '<a class="imageLink supporterIcon" href="supporter.html" title="Become a Media Browser supporter!"><img src="css/images/supporter/nonsupporterbadge.png" /></a>' ) . insertBefore ( $ ( '.btnTools' , header ) ) ;
2013-05-19 19:45:04 -07:00
}
} ) ;
}
2013-07-06 14:23:32 -07:00
$ ( Dashboard ) . trigger ( 'interiorheaderrendered' , [ header , user ] ) ;
2013-03-22 21:04:36 -07:00
} ,
2013-05-10 05:18:07 -07:00
2013-03-22 21:04:36 -07:00
ensureToolsMenu : function ( page ) {
if ( ! page . hasClass ( 'type-interior' ) ) {
return ;
}
var sidebar = $ ( '.toolsSidebar' , page ) ;
if ( ! sidebar . length ) {
var html = '<div class="content-secondary ui-bar-a toolsSidebar">' ;
2014-02-06 15:22:03 -07:00
html += '<p class="libraryPanelHeader" style="margin: 30px 0 20px 25px;"><a href="index.html" class="imageLink"><img src="css/images/mblogoicon.png" style="height:28px;" /><span>MEDIA</span><span class="mediaBrowserAccent">BROWSER</span></a></p>' ;
2013-12-27 14:10:06 -07:00
html += '<div style="position:absolute;top:20px;right:20px;"><a data-role="button" data-theme="b" data-icon="edit" data-iconpos="notext" href="edititemmetadata.html" title="Metadata Manager">Metadata Manager</a></div>' ;
2013-03-22 21:04:36 -07:00
html += '<div class="sidebarLinks">' ;
var links = Dashboard . getToolsMenuLinks ( page ) ;
2013-12-26 22:08:37 -07:00
var i , length , link ;
for ( i = 0 , length = links . length ; i < length ; i ++ ) {
2013-03-22 21:04:36 -07:00
2013-12-26 22:08:37 -07:00
link = links [ i ] ;
2013-12-26 19:23:57 -07:00
2013-12-25 20:44:26 -07:00
if ( link . divider ) {
html += "<div class='sidebarDivider'></div>" ;
}
2013-03-22 21:04:36 -07:00
if ( link . href ) {
if ( link . selected ) {
html += '<a class="selectedSidebarLink" href="' + link . href + '">' + link . name + '</a>' ;
} else {
html += '<a href="' + link . href + '">' + link . name + '</a>' ;
}
}
}
// collapsible
html += '</div>' ;
// content-secondary
html += '</div>' ;
2013-12-26 22:08:37 -07:00
html += '<div data-role="panel" id="dashboardPanel" class="dashboardPanel" data-position="left" data-display="overlay" data-position-fixed="true" data-theme="b">' ;
2013-12-27 14:10:06 -07:00
html += '<p class="libraryPanelHeader" style="margin: 20px 0 20px 15px;"><a href="index.html" class="imageLink"><img src="css/images/mblogoicon.png" /><span>MEDIA</span><span class="mediaBrowserAccent">BROWSER</span></a></p>' ;
2013-12-26 22:08:37 -07:00
for ( i = 0 , length = links . length ; i < length ; i ++ ) {
link = links [ i ] ;
if ( link . divider ) {
html += "<div class='dashboardPanelDivider'></div>" ;
}
if ( link . href ) {
if ( link . selected ) {
html += '<a class="selectedDashboardPanelLink dashboardPanelLink" href="' + link . href + '">' + link . name + '</a>' ;
} else {
html += '<a class="dashboardPanelLink" href="' + link . href + '">' + link . name + '</a>' ;
}
}
}
html += '</div>' ;
$ ( page ) . append ( html ) . trigger ( 'create' ) ;
2013-03-22 21:04:36 -07:00
}
} ,
2013-12-26 22:08:37 -07:00
showDashboardMenu : function ( ) {
var page = $ . mobile . activePage ;
$ ( "#dashboardPanel" , page ) . panel ( "open" ) ;
} ,
2013-03-22 21:04:36 -07:00
getToolsMenuLinks : function ( page ) {
var pageElem = page [ 0 ] ;
return [ {
name : "Dashboard" ,
href : "dashboard.html" ,
selected : pageElem . id == "dashboardPage"
} , {
2013-12-25 20:44:26 -07:00
name : "Media Library" ,
divider : true ,
2013-03-22 21:04:36 -07:00
href : "library.html" ,
2013-12-26 11:46:38 -07:00
selected : page . hasClass ( "mediaLibraryPage" )
2013-03-22 21:04:36 -07:00
} , {
name : "Metadata" ,
href : "metadata.html" ,
selected : pageElem . id == "metadataConfigurationPage" || pageElem . id == "advancedMetadataConfigurationPage" || pageElem . id == "metadataImagesConfigurationPage"
2014-01-22 16:52:01 -07:00
} , {
name : "Auto-Organize" ,
href : "autoorganizelog.html" ,
selected : page . hasClass ( "organizePage" )
2013-03-22 21:04:36 -07:00
} , {
name : "Plugins" ,
href : "plugins.html" ,
selected : page . hasClass ( "pluginConfigurationPage" )
2014-01-12 09:55:38 -07:00
} , {
name : "Live TV" ,
2014-01-22 13:46:01 -07:00
href : "livetvstatus.html" ,
2014-01-12 09:55:38 -07:00
selected : page . hasClass ( "liveTvSettingsPage" )
2013-03-22 21:04:36 -07:00
} , {
2013-12-25 20:44:26 -07:00
name : "Users" ,
divider : true ,
2013-03-28 22:45:21 -07:00
href : "userprofiles.html" ,
2013-04-02 20:04:08 -07:00
selected : page . hasClass ( "userProfilesConfigurationPage" ) || ( pageElem . id == "mediaLibraryPage" && getParameterByName ( 'userId' ) )
2013-03-22 21:04:36 -07:00
} , {
2013-12-25 20:44:26 -07:00
name : "App Settings" ,
href : "appsplayback.html" ,
selected : page . hasClass ( "appsPage" )
2013-03-22 21:04:36 -07:00
} , {
name : "Advanced" ,
2013-12-25 20:44:26 -07:00
divider : true ,
2013-03-22 21:04:36 -07:00
href : "advanced.html" ,
2014-01-07 11:39:35 -07:00
selected : page . hasClass ( "advancedConfigurationPage" )
2013-03-22 21:04:36 -07:00
} , {
name : "Scheduled Tasks" ,
2013-03-28 22:45:21 -07:00
href : "scheduledtasks.html" ,
2013-03-22 21:04:36 -07:00
selected : pageElem . id == "scheduledTasksPage" || pageElem . id == "scheduledTaskPage"
} , {
name : "Help" ,
2013-12-25 20:44:26 -07:00
divider : true ,
2013-03-22 21:04:36 -07:00
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 ( ApiClient . isWebSocketOpenOrConnecting ( ) ) {
return ;
}
systemInfo = systemInfo || Dashboard . lastSystemInfo ;
2014-01-18 12:25:20 -07:00
var location = window . location ;
var webSocketUrl = "ws://" + location . hostname ;
2014-01-22 15:38:55 -07:00
if ( systemInfo . HttpServerPortNumber == systemInfo . WebSocketPortNumber ) {
2014-01-18 12:25:20 -07:00
if ( location . port ) {
webSocketUrl += ':' + location . port ;
}
} else {
webSocketUrl += ':' + systemInfo . WebSocketPortNumber ;
}
ApiClient . openWebSocket ( webSocketUrl ) ;
2013-03-22 21:04:36 -07:00
} ,
2013-03-26 15:40:01 -07:00
2013-03-27 22:19:58 -07:00
onWebSocketMessageReceived : function ( e , data ) {
2013-03-26 15:40:01 -07:00
2013-03-27 22:19:58 -07:00
var msg = data ;
2013-03-31 18:52:07 -07:00
2013-03-22 21:04:36 -07:00
if ( msg . MessageType === "LibraryChanged" ) {
Dashboard . processLibraryUpdateNotification ( msg . Data ) ;
}
2013-09-05 10:26:03 -07:00
else if ( msg . MessageType === "ServerShuttingDown" ) {
Dashboard . hideServerRestartWarning ( ) ;
}
else if ( msg . MessageType === "ServerRestarting" ) {
Dashboard . hideServerRestartWarning ( ) ;
}
2013-03-22 21:04:36 -07:00
else if ( msg . MessageType === "UserDeleted" ) {
Dashboard . validateCurrentUser ( ) ;
}
else if ( msg . MessageType === "SystemInfo" ) {
Dashboard . updateSystemInfo ( msg . Data ) ;
}
2013-03-27 22:19:58 -07:00
else if ( msg . MessageType === "RestartRequired" ) {
2013-03-22 21:04:36 -07:00
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" ) {
2013-06-27 08:04:10 -07:00
Dashboard . getCurrentUser ( ) . done ( function ( currentUser ) {
if ( currentUser . Configuration . IsAdministrator ) {
Dashboard . showPackageInstallNotification ( msg . Data , "completed" ) ;
Dashboard . refreshSystemInfoFromServer ( ) ;
}
} ) ;
2013-03-22 21:04:36 -07:00
}
else if ( msg . MessageType === "PackageInstallationFailed" ) {
2013-06-27 08:04:10 -07:00
Dashboard . getCurrentUser ( ) . done ( function ( currentUser ) {
if ( currentUser . Configuration . IsAdministrator ) {
Dashboard . showPackageInstallNotification ( msg . Data , "failed" ) ;
Dashboard . refreshSystemInfoFromServer ( ) ;
}
} ) ;
2013-03-22 21:04:36 -07:00
}
else if ( msg . MessageType === "PackageInstallationCancelled" ) {
2013-06-27 08:04:10 -07:00
Dashboard . getCurrentUser ( ) . done ( function ( currentUser ) {
if ( currentUser . Configuration . IsAdministrator ) {
Dashboard . showPackageInstallNotification ( msg . Data , "cancelled" ) ;
Dashboard . refreshSystemInfoFromServer ( ) ;
}
} ) ;
2013-03-22 21:04:36 -07:00
}
else if ( msg . MessageType === "PackageInstalling" ) {
2013-06-27 08:04:10 -07:00
Dashboard . getCurrentUser ( ) . done ( function ( currentUser ) {
if ( currentUser . Configuration . IsAdministrator ) {
Dashboard . showPackageInstallNotification ( msg . Data , "progress" ) ;
Dashboard . refreshSystemInfoFromServer ( ) ;
}
} ) ;
2013-03-22 21:04:36 -07:00
}
2013-03-27 22:19:58 -07:00
else if ( msg . MessageType === "ScheduledTaskEnded" ) {
2013-03-22 21:04:36 -07:00
2013-06-27 08:04:10 -07:00
Dashboard . getCurrentUser ( ) . done ( function ( currentUser ) {
2013-07-16 09:03:28 -07:00
2013-06-27 08:04:10 -07:00
if ( currentUser . Configuration . IsAdministrator ) {
Dashboard . showTaskCompletionNotification ( msg . Data ) ;
}
} ) ;
2013-03-22 21:04:36 -07:00
}
2013-05-10 05:18:07 -07:00
else if ( msg . MessageType === "Browse" ) {
Dashboard . onBrowseCommand ( msg . Data ) ;
}
else if ( msg . MessageType === "Play" ) {
2013-06-07 09:06:32 -07:00
MediaPlayer . getItemsForPlayback ( {
2013-05-31 08:03:40 -07:00
2013-06-07 09:06:32 -07:00
Ids : msg . Data . ItemIds . join ( ',' )
2013-05-31 08:03:40 -07:00
} ) . done ( function ( result ) {
2013-11-29 23:07:45 -07:00
if ( msg . Data . PlayCommand == "PlayNext" ) {
2013-11-30 11:32:39 -07:00
MediaPlayer . queueItemsNext ( result . Items ) ;
2013-11-29 23:07:45 -07:00
}
else if ( msg . Data . PlayCommand == "PlayLast" ) {
MediaPlayer . queueItems ( result . Items ) ;
}
else {
MediaPlayer . play ( result . Items , msg . Data . StartPositionTicks ) ;
}
2013-05-28 10:25:10 -07:00
} ) ;
2013-05-10 05:18:07 -07:00
}
2013-07-10 05:37:14 -07:00
else if ( msg . MessageType === "Playstate" ) {
2013-07-25 12:43:40 -07:00
2013-07-17 20:18:16 -07:00
if ( msg . Data . Command === 'Stop' ) {
MediaPlayer . stop ( ) ;
}
else if ( msg . Data . Command === 'Pause' ) {
MediaPlayer . pause ( ) ;
}
else if ( msg . Data . Command === 'Unpause' ) {
MediaPlayer . unpause ( ) ;
}
else if ( msg . Data . Command === 'Seek' ) {
2013-07-19 11:38:09 -07:00
MediaPlayer . seek ( msg . Data . SeekPositionTicks ) ;
2013-07-17 20:18:16 -07:00
}
else if ( msg . Data . Command === 'NextTrack' ) {
2013-07-18 20:12:52 -07:00
MediaPlayer . nextTrack ( ) ;
2013-07-17 20:18:16 -07:00
}
else if ( msg . Data . Command === 'PreviousTrack' ) {
2013-07-18 20:12:52 -07:00
MediaPlayer . previousTrack ( ) ;
2013-07-17 20:18:16 -07:00
}
2013-05-10 05:18:07 -07:00
}
2013-08-27 21:31:34 -07:00
else if ( msg . MessageType === "SystemCommand" ) {
if ( msg . Data === 'GoHome' ) {
Dashboard . navigate ( 'index.html' ) ;
}
else if ( msg . Data === 'GoToSettings' ) {
Dashboard . navigate ( 'dashboard.html' ) ;
}
else if ( msg . Data === 'Mute' ) {
MediaPlayer . mute ( ) ;
}
else if ( msg . Data === 'Unmute' ) {
MediaPlayer . unmute ( ) ;
}
else if ( msg . Data === 'VolumeUp' ) {
MediaPlayer . volumeUp ( ) ;
}
else if ( msg . Data === 'VolumeDown' ) {
MediaPlayer . volumeDown ( ) ;
}
else if ( msg . Data === 'ToggleMute' ) {
MediaPlayer . toggleMute ( ) ;
}
}
else if ( msg . MessageType === "MessageCommand" ) {
var cmd = msg . Data ;
2013-08-27 22:17:26 -07:00
if ( cmd . TimeoutMs && WebNotifications . supported ( ) ) {
2013-08-27 21:31:34 -07:00
var notification = {
title : cmd . Header ,
body : cmd . Text ,
timeout : cmd . TimeoutMs
} ;
WebNotifications . show ( notification ) ;
2013-08-27 22:44:43 -07:00
}
else {
2013-08-27 21:31:34 -07:00
Dashboard . showFooterNotification ( { html : "<b>" + cmd . Header + ": </b>" + cmd . Text , timeout : cmd . TimeoutMs } ) ;
}
}
2013-05-10 05:18:07 -07:00
} ,
onBrowseCommand : function ( cmd ) {
var context = cmd . Context || "" ;
var url ;
2013-05-25 17:53:51 -07:00
var type = ( cmd . ItemType || "" ) . toLowerCase ( ) ;
2013-05-10 05:18:07 -07:00
if ( type == "genre" ) {
2013-05-25 17:53:51 -07:00
url = "itembynamedetails.html?genre=" + ApiClient . encodeName ( cmd . ItemName ) + "&context=" + context ;
2013-05-10 05:18:07 -07:00
}
2013-06-10 20:31:00 -07:00
else if ( type == "musicgenre" ) {
url = "itembynamedetails.html?musicgenre=" + ApiClient . encodeName ( cmd . ItemName ) + "&context=" + ( context || "music" ) ;
}
2013-07-01 10:17:33 -07:00
else if ( type == "gamegenre" ) {
url = "itembynamedetails.html?gamegenre=" + ApiClient . encodeName ( cmd . ItemName ) + "&context=" + ( context || "games" ) ;
}
2013-05-10 05:18:07 -07:00
else if ( type == "studio" ) {
2013-05-25 17:53:51 -07:00
url = "itembynamedetails.html?studio=" + ApiClient . encodeName ( cmd . ItemName ) + "&context=" + context ;
2013-05-10 05:18:07 -07:00
}
else if ( type == "person" ) {
2013-05-25 17:53:51 -07:00
url = "itembynamedetails.html?person=" + ApiClient . encodeName ( cmd . ItemName ) + "&context=" + context ;
2013-05-10 05:18:07 -07:00
}
2013-11-21 13:48:26 -07:00
else if ( type == "musicartist" ) {
url = "itembynamedetails.html?musicartist=" + ApiClient . encodeName ( cmd . ItemName ) + "&context=" + ( context || "music" ) ;
2013-05-10 05:18:07 -07:00
}
2013-05-13 08:00:03 -07:00
2013-05-10 05:18:07 -07:00
if ( url ) {
Dashboard . navigate ( url ) ;
return ;
}
2013-05-25 17:53:51 -07:00
ApiClient . getItem ( Dashboard . getCurrentUserId ( ) , cmd . ItemId ) . done ( function ( item ) {
2013-05-10 05:18:07 -07:00
Dashboard . navigate ( LibraryBrowser . getHref ( item , context ) ) ;
} ) ;
2013-03-22 21:04:36 -07:00
} ,
showTaskCompletionNotification : function ( result ) {
var html = '' ;
if ( result . Status == "Completed" ) {
html += '<img src="css/images/notifications/done.png" class="notificationIcon" />' ;
return ;
}
else if ( result . Status == "Cancelled" ) {
html += '<img src="css/images/notifications/info.png" class="notificationIcon" />' ;
return ;
}
else {
html += '<img src="css/images/notifications/error.png" class="notificationIcon" />' ;
}
html += '<span>' ;
html += result . Name + " " + result . Status ;
html += '</span>' ;
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 += '<img src="css/images/notifications/done.png" class="notificationIcon" />' ;
}
else if ( status == 'cancelled' ) {
html += '<img src="css/images/notifications/info.png" class="notificationIcon" />' ;
}
else if ( status == 'failed' ) {
html += '<img src="css/images/notifications/error.png" class="notificationIcon" />' ;
}
else if ( status == 'progress' ) {
html += '<img src="css/images/notifications/download.png" class="notificationIcon" />' ;
}
html += '<span style="margin-right: 1em;">' ;
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 += '</span>' ;
if ( status == 'progress' ) {
var percentComplete = Math . round ( installation . PercentComplete || 0 ) ;
html += '<progress style="margin-right: 1em;" max="100" value="' + percentComplete + '" title="' + percentComplete + '%">' ;
html += '' + percentComplete + '%' ;
html += '</progress>' ;
if ( percentComplete < 100 ) {
var btnId = "btnCancel" + installation . Id ;
2013-12-24 11:37:29 -07:00
html += '<button id="' + btnId + '" type="button" data-icon="delete" onclick="$(\'' + btnId + '\').buttonEnabled(false);Dashboard.cancelInstallation(\'' + installation . Id + '\');" data-theme="b" data-inline="true" data-mini="true">Cancel</button>' ;
2013-03-22 21:04:36 -07:00
}
}
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 ) {
2013-05-02 21:10:11 -07:00
var newItems = data . ItemsAdded ;
2013-05-10 05:18:07 -07:00
2013-05-02 21:10:11 -07:00
if ( ! newItems . length ) {
return ;
}
2013-03-22 21:04:36 -07:00
2013-04-15 11:45:58 -07:00
ApiClient . getItems ( Dashboard . getCurrentUserId ( ) , {
2013-04-19 15:09:21 -07:00
2013-04-15 11:45:58 -07:00
Recursive : true ,
2013-05-18 14:47:50 -07:00
Limit : 3 ,
2013-04-15 16:45:09 -07:00
Filters : "IsNotFolder" ,
2013-04-15 11:45:58 -07:00
SortBy : "DateCreated" ,
SortOrder : "Descending" ,
2013-05-02 21:10:11 -07:00
ImageTypes : "Primary" ,
Ids : newItems . join ( ',' )
2013-04-19 15:09:21 -07:00
2013-04-15 11:45:58 -07:00
} ) . done ( function ( result ) {
var items = result . Items ;
for ( var i = 0 , length = Math . min ( items . length , 2 ) ; i < length ; i ++ ) {
var item = items [ i ] ;
2013-05-02 21:10:11 -07:00
var notification = {
2013-04-15 11:45:58 -07:00
title : "New " + item . Type ,
body : item . Name ,
timeout : 5000
} ;
var imageTags = item . ImageTags || { } ;
2013-04-19 15:09:21 -07:00
2013-04-15 11:45:58 -07:00
if ( imageTags . Primary ) {
2013-05-02 21:10:11 -07:00
notification . icon = ApiClient . getImageUrl ( item . Id , {
2013-04-15 11:45:58 -07:00
width : 100 ,
tag : imageTags . Primary ,
type : "Primary"
} ) ;
}
2013-03-22 21:04:36 -07:00
2013-05-02 21:10:11 -07:00
WebNotifications . show ( notification ) ;
2013-03-22 21:04:36 -07:00
}
} ) ;
} ,
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 ( "<h2 class='pageTitle'>" + ( document . title || " " ) + "</h2>" ) ;
pageElem . hasPageTitle = true ;
} ,
setPageTitle : function ( title ) {
$ ( '.pageTitle' , $ . mobile . activePage ) . html ( title ) ;
if ( title ) {
document . title = title ;
}
2013-06-07 10:29:33 -07:00
} ,
getDisplayTime : function ( ticks ) {
var ticksPerHour = 36000000000 ;
var parts = [ ] ;
var hours = ticks / ticksPerHour ;
2013-12-05 20:39:44 -07:00
hours = Math . floor ( hours ) ;
2013-06-07 10:29:33 -07:00
if ( hours ) {
parts . push ( hours ) ;
}
ticks -= ( hours * ticksPerHour ) ;
var ticksPerMinute = 600000000 ;
var minutes = ticks / ticksPerMinute ;
2013-12-05 20:39:44 -07:00
minutes = Math . floor ( minutes ) ;
2013-06-07 10:29:33 -07:00
ticks -= ( minutes * ticksPerMinute ) ;
if ( minutes < 10 && hours ) {
minutes = '0' + minutes ;
}
parts . push ( minutes ) ;
var ticksPerSecond = 10000000 ;
var seconds = ticks / ticksPerSecond ;
2013-12-05 20:39:44 -07:00
seconds = Math . round ( seconds ) ;
2013-06-07 10:29:33 -07:00
if ( seconds < 10 ) {
seconds = '0' + seconds ;
}
parts . push ( seconds ) ;
return parts . join ( ':' ) ;
2013-11-07 10:27:05 -07:00
} ,
2013-11-28 11:27:29 -07:00
ratePackage : function ( link ) {
2013-11-07 10:27:05 -07:00
var id = link . getAttribute ( 'data-id' ) ;
var name = link . getAttribute ( 'data-name' ) ;
var rating = link . getAttribute ( 'data-rating' ) ;
var dialog = new RatingDialog ( $ . mobile . activePage ) ;
2013-11-08 08:37:22 -07:00
dialog . show ( {
header : "Rate and review " + name ,
id : id ,
rating : rating ,
2013-11-28 11:27:29 -07:00
callback : function ( review ) {
2013-11-08 08:37:22 -07:00
console . log ( review ) ;
dialog . close ( ) ;
2013-11-28 11:27:29 -07:00
ApiClient . createPackageReview ( review ) . done ( function ( ) {
2013-12-26 19:23:57 -07:00
Dashboard . alert ( {
message : "Thank you for your review" ,
title : "Thank You"
} ) ;
2013-11-08 08:37:22 -07:00
} ) ;
}
} ) ;
} ,
2013-11-28 11:27:29 -07:00
getStoreRatingHtml : function ( rating , id , name , noLinks ) {
2013-11-07 10:27:05 -07:00
2013-12-28 22:32:03 -07:00
var html = "<div style='margin-left: 5px; margin-right: 5px; display: inline-block; vertical-align:middle;'>" ;
2013-11-08 08:37:22 -07:00
if ( ! rating ) rating = 0 ;
2013-11-07 10:27:05 -07:00
2013-11-08 08:37:22 -07:00
for ( var i = 1 ; i <= 5 ; i ++ ) {
2013-11-08 13:53:09 -07:00
var title = noLinks ? rating + " stars" : "Rate " + i + ( i > 1 ? " stars" : " star" ) ;
2013-11-28 11:27:29 -07:00
2013-12-28 22:32:03 -07:00
html += noLinks ? "" : "<span data-id=" + id + " data-name='" + name + "' data-rating=" + i + " onclick='Dashboard.ratePackage(this);return false;' >" ;
2013-11-09 11:36:45 -07:00
if ( rating <= i - 1 ) {
2013-11-08 13:53:09 -07:00
html += "<div class='storeStarRating emptyStarRating' title='" + title + "'></div>" ;
2013-11-08 08:37:22 -07:00
} else if ( rating < i ) {
2013-11-08 13:53:09 -07:00
html += "<div class='storeStarRating halfStarRating' title='" + title + "'></div>" ;
2013-11-08 08:37:22 -07:00
} else {
2013-11-08 13:53:09 -07:00
html += "<div class='storeStarRating' title='" + title + "'></div>" ;
2013-11-08 08:37:22 -07:00
}
2013-12-28 22:32:03 -07:00
html += noLinks ? "" : "</span>" ;
2013-11-08 08:37:22 -07:00
}
html += "</div>" ;
return html ;
2013-12-28 09:58:13 -07:00
} ,
populateLanguages : function ( select , languages ) {
var html = "" ;
html += "<option value=''></option>" ;
for ( var i = 0 , length = languages . length ; i < length ; i ++ ) {
var culture = languages [ i ] ;
html += "<option value='" + culture . TwoLetterISOLanguageName + "'>" + culture . DisplayName + "</option>" ;
}
$ ( select ) . html ( html ) . selectmenu ( "refresh" ) ;
} ,
populateCountries : function ( select , allCountries ) {
var html = "" ;
html += "<option value=''></option>" ;
for ( var i = 0 , length = allCountries . length ; i < length ; i ++ ) {
var culture = allCountries [ i ] ;
html += "<option value='" + culture . TwoLetterISORegionName + "'>" + culture . DisplayName + "</option>" ;
}
$ ( select ) . html ( html ) . selectmenu ( "refresh" ) ;
2013-11-08 08:37:22 -07:00
}
2013-10-18 12:47:57 -07:00
} ;
2013-04-01 22:14:37 -07:00
2013-10-18 12:47:57 -07:00
if ( ! window . WebSocket ) {
2014-01-03 19:35:41 -07:00
alert ( "This browser does not support web sockets. For a better experience, try a newer browser such as Chrome, Firefox, IE10+, Safari (iOS) or Opera." ) ;
2013-10-18 12:47:57 -07:00
}
2014-01-03 19:35:41 -07:00
else if ( ! IsStorageEnabled ( ) ) {
alert ( "This browser does not support local storage or is running in private mode. For a better experience, try a newer browser such as Chrome, Firefox, IE10+, Safari (iOS) or Opera." ) ;
2013-10-18 12:47:57 -07:00
}
2013-04-19 15:09:21 -07:00
2013-03-22 21:04:36 -07:00
2013-07-09 09:11:16 -07:00
var ApiClient = MediaBrowser . ApiClient . create ( "Dashboard" , window . dashboardVersion ) ;
2013-03-22 21:04:36 -07:00
2013-09-05 10:26:03 -07:00
$ ( ApiClient ) . on ( "websocketmessage" , Dashboard . onWebSocketMessageReceived ) ;
2013-03-22 21:04:36 -07:00
$ ( function ( ) {
2013-12-27 21:42:40 -07:00
var footerHtml = '<div id="footer" data-theme="b" class="ui-bar-b">' ;
footerHtml += '<div id="nowPlayingBar" class="nowPlayingBar" style="display:none;">' ;
footerHtml += '<div class="barBackground ui-bar-b"></div>' ;
footerHtml += '<div style="display:inline-block;width:12px;"></div>' ;
2014-01-15 15:19:45 -07:00
footerHtml += '<a id="playlistButton" class="mediaButton playlistButton" href="playlist.html" data-role="button" data-icon="bullets" data-iconpos="notext" data-inline="true" title="Playlist">Playlist</a>' ;
footerHtml += '<button id="previousTrackButton" class="mediaButton previousTrackButton" title="Previous Track" type="button" onclick="MediaPlayer.previousTrack();" data-icon="previous-track" data-iconpos="notext" data-inline="true">Previous Track</button>' ;
2013-12-27 21:42:40 -07:00
footerHtml += '<button id="playButton" class="mediaButton" title="Play" type="button" onclick="MediaPlayer.unpause();" data-icon="play" data-iconpos="notext" data-inline="true">Play</button>' ;
footerHtml += '<button id="pauseButton" class="mediaButton" title="Pause" type="button" onclick="MediaPlayer.pause();" data-icon="pause" data-iconpos="notext" data-inline="true">Pause</button>' ;
2014-01-12 08:58:47 -07:00
footerHtml += '<div id="mediaElement"></div>' ;
2013-12-27 21:42:40 -07:00
footerHtml += '<button id="stopButton" class="mediaButton" title="Stop" type="button" onclick="MediaPlayer.stop();" data-icon="stop" data-iconpos="notext" data-inline="true">Stop</button>' ;
2014-01-15 15:19:45 -07:00
footerHtml += '<button id="nextTrackButton" class="mediaButton nextTrackButton" title="Next Track" type="button" onclick="MediaPlayer.nextTrack();" data-icon="next-track" data-iconpos="notext" data-inline="true">Next Track</button>' ;
2013-12-27 21:42:40 -07:00
footerHtml += '<div class="positionSliderContainer sliderContainer">' ;
footerHtml += '<input type="range" class="mediaSlider positionSlider slider" step=".001" min="0" max="100" value="0" style="display:none;" data-mini="true" data-theme="a" data-highlight="true" />' ;
footerHtml += '</div>' ;
2013-05-23 13:09:01 -07:00
footerHtml += '<div class="currentTime"></div>' ;
footerHtml += '<div class="nowPlayingMediaInfo"></div>' ;
2013-05-25 17:53:51 -07:00
2014-01-15 15:19:45 -07:00
footerHtml += '<button id="muteButton" class="mediaButton muteButton" title="Mute" type="button" onclick="MediaPlayer.mute();" data-icon="audio" data-iconpos="notext" data-inline="true">Mute</button>' ;
footerHtml += '<button id="unmuteButton" class="mediaButton unmuteButton" title="Unmute" type="button" onclick="MediaPlayer.unmute();" data-icon="volume-off" data-iconpos="notext" data-inline="true">Unmute</button>' ;
2013-05-23 13:09:01 -07:00
2013-12-27 21:42:40 -07:00
footerHtml += '<div class="volumeSliderContainer sliderContainer">' ;
footerHtml += '<input type="range" class="mediaSlider volumeSlider slider" step=".05" min="0" max="1" value="0" style="display:none;" data-mini="true" data-theme="a" data-highlight="true" />' ;
footerHtml += '</div>' ;
footerHtml += '<button onclick="MediaPlayer.showQualityFlyout();" id="qualityButton" class="mediaButton qualityButton" title="Quality" type="button" data-icon="gear" data-iconpos="notext" data-inline="true">Quality</button>' ;
2013-05-25 21:52:14 -07:00
footerHtml += '<div class="mediaFlyoutContainer"><div id="qualityFlyout" style="display:none;" class="mediaPlayerFlyout"></div></div>' ;
2013-05-25 17:53:51 -07:00
2013-12-27 21:42:40 -07:00
footerHtml += '<button onclick="MediaPlayer.showAudioTracksFlyout();" id="audioTracksButton" class="imageButton mediaButton audioTracksButton" title="Audio tracks" type="button" data-icon="audiocd" data-iconpos="notext" data-inline="true">Audio Tracks</button>' ;
2013-05-25 21:52:14 -07:00
footerHtml += '<div class="mediaFlyoutContainer"><div id="audioTracksFlyout" style="display:none;" class="mediaPlayerFlyout audioTracksFlyout"></div></div>' ;
2013-05-25 17:53:51 -07:00
2013-12-27 21:42:40 -07:00
footerHtml += '<button onclick="MediaPlayer.showSubtitleMenu();" id="subtitleButton" class="imageButton mediaButton subtitleButton" title="Subtitles" type="button" data-icon="subtitles" data-iconpos="notext" data-inline="true">Subtitles</button>' ;
2013-05-25 21:52:14 -07:00
footerHtml += '<div class="mediaFlyoutContainer"><div id="subtitleFlyout" style="display:none;" class="mediaPlayerFlyout subtitleFlyout"></div></div>' ;
2013-05-25 17:53:51 -07:00
2013-12-27 21:42:40 -07:00
footerHtml += '<button onclick="MediaPlayer.showChaptersFlyout();" id="chaptersButton" class="mediaButton chaptersButton" title="Scenes" type="button" data-icon="video" data-iconpos="notext" data-inline="true">Scenes</button>' ;
2013-05-25 21:52:14 -07:00
footerHtml += '<div class="mediaFlyoutContainer"><div id="chaptersFlyout" style="display:none;" class="mediaPlayerFlyout chaptersFlyout"></div></div>' ;
2013-12-27 21:42:40 -07:00
footerHtml += '<button onclick="MediaPlayer.toggleFullscreen();" id="fullscreenButton" class="mediaButton fullscreenButton" title="Fullscreen" type="button" data-icon="action" data-iconpos="notext" data-inline="true">Fullscreen</button>' ;
2013-05-25 17:53:51 -07:00
2014-01-16 10:23:30 -07:00
footerHtml += '<button onclick="MediaPlayer.showChannelsFlyout();" id="channelsButton" class="mediaButton channelsButton" title="TV Channels" type="button" data-icon="tv" data-iconpos="notext" data-inline="true">TV Channels</button>' ;
footerHtml += '<div class="mediaFlyoutContainer"><div id="channelsFlyout" style="display:none;" class="mediaPlayerFlyout channelsFlyout"></div></div>' ;
2014-01-16 20:13:12 -07:00
footerHtml += '<button onclick="MediaPlayer.showSendMediaMenu();" id="sendMediaButton" class="mediaButton sendMediaButton" title="Remote" type="button" data-icon="wireless" data-iconpos="notext" data-inline="true">Remote</button>' ;
2014-01-03 21:53:49 -07:00
2013-03-22 21:04:36 -07:00
footerHtml += '</div>' ;
2013-05-23 13:09:01 -07:00
2013-03-22 21:04:36 -07:00
footerHtml += '<div id="footerNotifications"></div>' ;
footerHtml += '</div>' ;
$ ( document . body ) . append ( footerHtml ) ;
2013-09-19 17:53:18 -07:00
2013-12-27 21:42:40 -07:00
var footerElem = $ ( '#footer' , document . body ) ;
footerElem . trigger ( 'create' ) ;
2013-09-09 11:23:55 -07:00
$ ( window ) . on ( "beforeunload" , function ( ) {
// Close the connection gracefully when possible
if ( ApiClient . isWebSocketOpen ( ) && ! MediaPlayer . isPlaying ( ) ) {
2013-12-26 11:46:38 -07:00
console . log ( 'Sending close web socket command' ) ;
2013-09-09 11:23:55 -07:00
ApiClient . closeWebSocket ( ) ;
}
} ) ;
2013-03-22 21:04:36 -07:00
} ) ;
Dashboard . jQueryMobileInit ( ) ;
2013-07-16 09:03:28 -07:00
$ ( document ) . on ( 'pagebeforeshow' , ".page" , function ( ) {
2013-03-22 21:04:36 -07:00
var page = $ ( this ) ;
2013-03-26 15:40:01 -07:00
2013-03-22 21:04:36 -07:00
var userId = Dashboard . getCurrentUserId ( ) ;
ApiClient . currentUserId ( userId ) ;
if ( ! userId ) {
if ( this . id !== "loginPage" && ! page . hasClass ( 'wizardPage' ) ) {
Dashboard . logout ( ) ;
2013-07-16 09:03:28 -07:00
return ;
2013-03-22 21:04:36 -07:00
}
2013-08-27 21:31:34 -07:00
2013-07-16 09:03:28 -07:00
Dashboard . ensureHeader ( page ) ;
Dashboard . ensurePageTitle ( page ) ;
2013-03-22 21:04:36 -07:00
}
else {
Dashboard . getCurrentUser ( ) . done ( function ( user ) {
if ( user . Configuration . IsAdministrator ) {
Dashboard . ensureToolsMenu ( page ) ;
2013-08-27 13:04:58 -07:00
} else if ( page . hasClass ( 'adminPage' ) ) {
2013-08-20 07:42:07 -07:00
window . location . replace ( "index.html" ) ;
2013-03-22 21:04:36 -07:00
}
2013-05-10 05:18:07 -07:00
2013-07-16 09:03:28 -07:00
Dashboard . ensureHeader ( page , user ) ;
Dashboard . ensurePageTitle ( page ) ;
} ) ;
2013-09-19 17:53:18 -07:00
}
2013-04-25 20:31:10 -07:00
2013-09-19 17:53:18 -07:00
if ( ! ApiClient . isWebSocketOpen ( ) ) {
2013-07-16 09:03:28 -07:00
Dashboard . refreshSystemInfoFromServer ( ) ;
}
2013-09-09 11:23:55 -07:00
} ) ;