diff --git a/dashboard-ui/css/mediaplayer.css b/dashboard-ui/css/mediaplayer.css
index abb46b5ffe..b0352716a5 100644
--- a/dashboard-ui/css/mediaplayer.css
+++ b/dashboard-ui/css/mediaplayer.css
@@ -1,7 +1,7 @@
/* Now playing bar */
.nowPlayingBar {
padding: 16px 0 16px 0;
- border-top: 2px solid green;
+ border-top: 1px solid #444;
text-align: center;
}
diff --git a/dashboard-ui/css/site.css b/dashboard-ui/css/site.css
index 873250265d..14c6d22955 100644
--- a/dashboard-ui/css/site.css
+++ b/dashboard-ui/css/site.css
@@ -624,7 +624,7 @@ h1 .imageLink {
}
.footerOverBottomTabs {
- bottom: 50px;
+ bottom: 51px !important;
}
.footerNotification {
diff --git a/dashboard-ui/scripts/chromecast.js b/dashboard-ui/scripts/chromecast.js
index 8a689becc4..9718a909f4 100644
--- a/dashboard-ui/scripts/chromecast.js
+++ b/dashboard-ui/scripts/chromecast.js
@@ -30,10 +30,6 @@
var messageNamespace = 'urn:x-cast:com.google.cast.mediabrowser.v3';
- var cPlayer = {
- deviceState: DEVICE_STATE.IDLE
- };
-
var CastPlayer = function () {
/* device variables */
@@ -531,7 +527,7 @@
};
// Create Cast Player
- var castPlayer = new CastPlayer();
+ var castPlayer;
function chromecastPlayer() {
@@ -843,15 +839,27 @@
};
}
- MediaController.registerPlayer(new chromecastPlayer());
+ function initializeChromecast() {
- $(MediaController).on('playerchange', function () {
+ castPlayer = new CastPlayer();
- if (MediaController.getPlayerInfo().name == PlayerName) {
- if (castPlayer.deviceState != DEVICE_STATE.ACTIVE && castPlayer.isInitialized) {
- castPlayer.launchApp();
+ MediaController.registerPlayer(new chromecastPlayer());
+
+ $(MediaController).on('playerchange', function () {
+
+ if (MediaController.getPlayerInfo().name == PlayerName) {
+ if (castPlayer.deviceState != DEVICE_STATE.ACTIVE && castPlayer.isInitialized) {
+ castPlayer.launchApp();
+ }
}
- }
- });
+ });
+ }
+
+ if ($.browser.chrome) {
+ requirejs(["thirdparty/cast_sender"], function () {
+
+ initializeChromecast();
+ });
+ }
})(window, window.chrome, console);
\ No newline at end of file
diff --git a/dashboard-ui/scripts/dashboardpage.js b/dashboard-ui/scripts/dashboardpage.js
index 963e7aef0e..f6dc026364 100644
--- a/dashboard-ui/scripts/dashboardpage.js
+++ b/dashboard-ui/scripts/dashboardpage.js
@@ -1292,25 +1292,28 @@ $(document).on('pagebeforeshow', "#dashboardPage", DashboardPage.onPageShow)
function takeTour(page, userId) {
- $.swipebox([
- { href: 'css/images/tour/dashboard/dashboard.png', title: Globalize.translate('DashboardTourDashboard') },
- { href: 'css/images/tour/dashboard/help.png', title: Globalize.translate('DashboardTourHelp') },
- { href: 'css/images/tour/dashboard/users.png', title: Globalize.translate('DashboardTourUsers') },
- { href: 'css/images/tour/dashboard/sync.png', title: Globalize.translate('DashboardTourSync') },
- { href: 'css/images/tour/dashboard/cinemamode.png', title: Globalize.translate('DashboardTourCinemaMode') },
- { href: 'css/images/tour/dashboard/chapters.png', title: Globalize.translate('DashboardTourChapters') },
- { href: 'css/images/tour/dashboard/subtitles.png', title: Globalize.translate('DashboardTourSubtitles') },
- { href: 'css/images/tour/dashboard/plugins.png', title: Globalize.translate('DashboardTourPlugins') },
- { href: 'css/images/tour/dashboard/notifications.png', title: Globalize.translate('DashboardTourNotifications') },
- { href: 'css/images/tour/dashboard/scheduledtasks.png', title: Globalize.translate('DashboardTourScheduledTasks') },
- { href: 'css/images/tour/dashboard/mobile.png', title: Globalize.translate('DashboardTourMobile') },
- { href: 'css/images/tour/enjoy.jpg', title: Globalize.translate('MessageEnjoyYourStay') }
- ], {
- afterClose: function () {
- dismissWelcome(page, userId);
- $('.welcomeMessage', page).hide();
- },
- hideBarsDelay: 30000
+ Dashboard.loadSwipebox().done(function () {
+
+ $.swipebox([
+ { href: 'css/images/tour/dashboard/dashboard.png', title: Globalize.translate('DashboardTourDashboard') },
+ { href: 'css/images/tour/dashboard/help.png', title: Globalize.translate('DashboardTourHelp') },
+ { href: 'css/images/tour/dashboard/users.png', title: Globalize.translate('DashboardTourUsers') },
+ { href: 'css/images/tour/dashboard/sync.png', title: Globalize.translate('DashboardTourSync') },
+ { href: 'css/images/tour/dashboard/cinemamode.png', title: Globalize.translate('DashboardTourCinemaMode') },
+ { href: 'css/images/tour/dashboard/chapters.png', title: Globalize.translate('DashboardTourChapters') },
+ { href: 'css/images/tour/dashboard/subtitles.png', title: Globalize.translate('DashboardTourSubtitles') },
+ { href: 'css/images/tour/dashboard/plugins.png', title: Globalize.translate('DashboardTourPlugins') },
+ { href: 'css/images/tour/dashboard/notifications.png', title: Globalize.translate('DashboardTourNotifications') },
+ { href: 'css/images/tour/dashboard/scheduledtasks.png', title: Globalize.translate('DashboardTourScheduledTasks') },
+ { href: 'css/images/tour/dashboard/mobile.png', title: Globalize.translate('DashboardTourMobile') },
+ { href: 'css/images/tour/enjoy.jpg', title: Globalize.translate('MessageEnjoyYourStay') }
+ ], {
+ afterClose: function () {
+ dismissWelcome(page, userId);
+ $('.welcomeMessage', page).hide();
+ },
+ hideBarsDelay: 30000
+ });
});
}
diff --git a/dashboard-ui/scripts/editorsidebar.js b/dashboard-ui/scripts/editorsidebar.js
index 26a45a3f33..15d1a22a18 100644
--- a/dashboard-ui/scripts/editorsidebar.js
+++ b/dashboard-ui/scripts/editorsidebar.js
@@ -264,6 +264,13 @@
function initializeTree(page, currentUser, openItems, selectedId) {
+ MetadataEditor.loadJsTree().done(function () {
+ initializeTreeInternal(page, currentUser, openItems, selectedId);
+ });
+ }
+
+ function initializeTreeInternal(page, currentUser, openItems, selectedId) {
+
nodesToLoad = [];
selectedNodeId = null;
@@ -355,8 +362,8 @@
if (selectedNodeId && node.children && node.children.indexOf(selectedNodeId) != -1) {
- setTimeout(function() {
-
+ setTimeout(function () {
+
scrollToNode($.mobile.activePage, selectedNodeId);
}, 500);
}
@@ -473,8 +480,22 @@
return query;
};
+
+ self.loadJsTree = function () {
+
+ var deferred = DeferredBuilder.Deferred();
+
+ require([
+ 'thirdparty/jstree3.0.8/jstree.min',
+ 'css!thirdparty/jstree3.0.8/themes/default/style.min'
+ ], function () {
+
+ deferred.resolve();
+ });
+ return deferred.promise();
+ };
+
ensureInitialValues();
}
-
})(jQuery, document, window);
\ No newline at end of file
diff --git a/dashboard-ui/scripts/indexpage.js b/dashboard-ui/scripts/indexpage.js
index ba9aef174b..c4c649d21c 100644
--- a/dashboard-ui/scripts/indexpage.js
+++ b/dashboard-ui/scripts/indexpage.js
@@ -572,30 +572,33 @@
function takeTour(page, userId) {
- $.swipebox([
- { href: 'css/images/tour/web/tourcontent.jpg', title: Globalize.translate('WebClientTourContent') },
- { href: 'css/images/tour/web/tourmovies.jpg', title: Globalize.translate('WebClientTourMovies') },
- { href: 'css/images/tour/web/tourmouseover.jpg', title: Globalize.translate('WebClientTourMouseOver') },
- { href: 'css/images/tour/web/tourtaphold.jpg', title: Globalize.translate('WebClientTourTapHold') },
- { href: 'css/images/tour/web/tourmysync.png', title: Globalize.translate('WebClientTourMySync') },
- { href: 'css/images/tour/web/toureditor.png', title: Globalize.translate('WebClientTourMetadataManager') },
- { href: 'css/images/tour/web/tourplaylist.png', title: Globalize.translate('WebClientTourPlaylists') },
- { href: 'css/images/tour/web/tourcollections.jpg', title: Globalize.translate('WebClientTourCollections') },
- { href: 'css/images/tour/web/tourusersettings1.png', title: Globalize.translate('WebClientTourUserPreferences1') },
- { href: 'css/images/tour/web/tourusersettings2.png', title: Globalize.translate('WebClientTourUserPreferences2') },
- { href: 'css/images/tour/web/tourusersettings3.png', title: Globalize.translate('WebClientTourUserPreferences3') },
- { href: 'css/images/tour/web/tourusersettings4.png', title: Globalize.translate('WebClientTourUserPreferences4') },
- { href: 'css/images/tour/web/tourmobile1.jpg', title: Globalize.translate('WebClientTourMobile1') },
- { href: 'css/images/tour/web/tourmobile2.png', title: Globalize.translate('WebClientTourMobile2') },
- { href: 'css/images/tour/enjoy.jpg', title: Globalize.translate('MessageEnjoyYourStay') }
- ], {
- afterClose: function () {
- dismissWelcome(page, userId);
- $('.welcomeMessage', page).hide();
+ Dashboard.loadSwipebox().done(function () {
- loadConfigureViewsWelcomeMessage(page, userId);
- },
- hideBarsDelay: 30000
+ $.swipebox([
+ { href: 'css/images/tour/web/tourcontent.jpg', title: Globalize.translate('WebClientTourContent') },
+ { href: 'css/images/tour/web/tourmovies.jpg', title: Globalize.translate('WebClientTourMovies') },
+ { href: 'css/images/tour/web/tourmouseover.jpg', title: Globalize.translate('WebClientTourMouseOver') },
+ { href: 'css/images/tour/web/tourtaphold.jpg', title: Globalize.translate('WebClientTourTapHold') },
+ { href: 'css/images/tour/web/tourmysync.png', title: Globalize.translate('WebClientTourMySync') },
+ { href: 'css/images/tour/web/toureditor.png', title: Globalize.translate('WebClientTourMetadataManager') },
+ { href: 'css/images/tour/web/tourplaylist.png', title: Globalize.translate('WebClientTourPlaylists') },
+ { href: 'css/images/tour/web/tourcollections.jpg', title: Globalize.translate('WebClientTourCollections') },
+ { href: 'css/images/tour/web/tourusersettings1.png', title: Globalize.translate('WebClientTourUserPreferences1') },
+ { href: 'css/images/tour/web/tourusersettings2.png', title: Globalize.translate('WebClientTourUserPreferences2') },
+ { href: 'css/images/tour/web/tourusersettings3.png', title: Globalize.translate('WebClientTourUserPreferences3') },
+ { href: 'css/images/tour/web/tourusersettings4.png', title: Globalize.translate('WebClientTourUserPreferences4') },
+ { href: 'css/images/tour/web/tourmobile1.jpg', title: Globalize.translate('WebClientTourMobile1') },
+ { href: 'css/images/tour/web/tourmobile2.png', title: Globalize.translate('WebClientTourMobile2') },
+ { href: 'css/images/tour/enjoy.jpg', title: Globalize.translate('MessageEnjoyYourStay') }
+ ], {
+ afterClose: function () {
+ dismissWelcome(page, userId);
+ $('.welcomeMessage', page).hide();
+
+ loadConfigureViewsWelcomeMessage(page, userId);
+ },
+ hideBarsDelay: 30000
+ });
});
}
diff --git a/dashboard-ui/scripts/itemlistpage.js b/dashboard-ui/scripts/itemlistpage.js
index bbe567a362..76c3255a2b 100644
--- a/dashboard-ui/scripts/itemlistpage.js
+++ b/dashboard-ui/scripts/itemlistpage.js
@@ -196,9 +196,12 @@
index = Math.max(index || 0, 0);
- $.swipebox(slideshowItems, {
- initialIndexOnArray: index,
- hideBarsDelay: 30000
+ Dashboard.loadSwipebox().done(function () {
+
+ $.swipebox(slideshowItems, {
+ initialIndexOnArray: index,
+ hideBarsDelay: 30000
+ });
});
}
diff --git a/dashboard-ui/scripts/librarymenu.js b/dashboard-ui/scripts/librarymenu.js
index b464e18e82..cc370c8408 100644
--- a/dashboard-ui/scripts/librarymenu.js
+++ b/dashboard-ui/scripts/librarymenu.js
@@ -545,13 +545,18 @@
if (AppInfo.enableBottomTabs) {
$('.libraryViewNav', page).addClass('bottomLibraryViewNav');
$(page).addClass('noSecondaryNavPage');
+
+ $(function() {
+
+ $('.footer').addClass('footerOverBottomTabs');
+ });
+
} else {
$('.libraryViewNav', page).each(function () {
initHeadRoom(this);
});
-
}
}).on('pageshow', ".libraryPage", function () {
@@ -574,10 +579,13 @@
return;
}
- // construct an instance of Headroom, passing the element
- var headroom = new Headroom(elem);
- // initialise
- headroom.init();
+ requirejs(["thirdparty/headroom"], function () {
+
+ // construct an instance of Headroom, passing the element
+ var headroom = new Headroom(elem);
+ // initialise
+ headroom.init();
+ });
}
function initializeApiClient(apiClient) {
diff --git a/dashboard-ui/scripts/livetvguide.js b/dashboard-ui/scripts/livetvguide.js
index cf951bca05..d5a93dc02a 100644
--- a/dashboard-ui/scripts/livetvguide.js
+++ b/dashboard-ui/scripts/livetvguide.js
@@ -420,13 +420,16 @@
}
if (AppInfo.enableHeadRoom) {
- $('.tvGuideHeader', page).each(function () {
+ requirejs(["thirdparty/headroom"], function () {
- // construct an instance of Headroom, passing the element
- var headroom = new Headroom(this);
- // initialise
- headroom.init();
+ $('.tvGuideHeader', page).each(function () {
+ // construct an instance of Headroom, passing the element
+ var headroom = new Headroom(this);
+ // initialise
+ headroom.init();
+
+ });
});
}
diff --git a/dashboard-ui/scripts/mediacontroller.js b/dashboard-ui/scripts/mediacontroller.js
index 197652f38b..dc8f50452d 100644
--- a/dashboard-ui/scripts/mediacontroller.js
+++ b/dashboard-ui/scripts/mediacontroller.js
@@ -137,6 +137,10 @@
};
+ self.getPlayers = function() {
+ return players;
+ };
+
self.getTargets = function () {
var deferred = $.Deferred();
@@ -383,6 +387,37 @@
}
}
};
+
+ // TOOD: This doesn't really belong here
+ self.getNowPlayingNameHtml = function (nowPlayingItem) {
+
+ var topText = nowPlayingItem.Name;
+
+ if (nowPlayingItem.MediaType == 'Video') {
+ if (nowPlayingItem.IndexNumber != null) {
+ topText = nowPlayingItem.IndexNumber + " - " + topText;
+ }
+ if (nowPlayingItem.ParentIndexNumber != null) {
+ topText = nowPlayingItem.ParentIndexNumber + "." + topText;
+ }
+ }
+
+ var bottomText = '';
+
+ if (nowPlayingItem.Artists && nowPlayingItem.Artists.length) {
+ bottomText = topText;
+ topText = nowPlayingItem.Artists[0];
+ }
+ else if (nowPlayingItem.SeriesName || nowPlayingItem.Album) {
+ bottomText = topText;
+ topText = nowPlayingItem.SeriesName || nowPlayingItem.Album;
+ }
+ else if (nowPlayingItem.ProductionYear) {
+ bottomText = nowPlayingItem.ProductionYear;
+ }
+
+ return bottomText ? topText + '
' + bottomText : topText;
+ };
}
window.MediaController = new mediaController();
diff --git a/dashboard-ui/scripts/mediaplayer-video.js b/dashboard-ui/scripts/mediaplayer-video.js
index a601a1e4bb..3a4c3ce8a2 100644
--- a/dashboard-ui/scripts/mediaplayer-video.js
+++ b/dashboard-ui/scripts/mediaplayer-video.js
@@ -327,7 +327,7 @@
}
var nowPlayingTextElement = $('.nowPlayingText', mediaControls);
- var nameHtml = self.getNowPlayingNameHtml(state);
+ var nameHtml = MediaController.getNowPlayingNameHtml(state.NowPlayingItem);
if (nameHtml.indexOf('
') != -1) {
nowPlayingTextElement.addClass('nowPlayingDoubleText');
@@ -976,31 +976,8 @@
return s.Type == 'Subtitle';
});
- // Get Video Poster (Code from librarybrowser.js)
- var screenWidth = Math.max(screen.height, screen.width);
- var posterCode = '';
-
- if (item.BackdropImageTags && item.BackdropImageTags.length) {
-
- posterCode = ' poster="' + ApiClient.getScaledImageUrl(item.Id, {
- type: "Backdrop",
- index: 0,
- maxWidth: screenWidth,
- tag: item.BackdropImageTags[0]
- }) + '"';
-
- }
- else if (item.ParentBackdropItemId && item.ParentBackdropImageTags && item.ParentBackdropImageTags.length) {
-
- posterCode = ' poster="' + ApiClient.getScaledImageUrl(item.ParentBackdropItemId, {
- type: 'Backdrop',
- index: 0,
- maxWidth: screenWidth,
- tag: item.ParentBackdropImageTags[0]
- }) + '"';
-
- }
-
+ var posterCode = self.getPosterUrl(item);
+ posterCode = posterCode ? (' poster="' + posterCode + '"') : '';
//======================================================================================>
// Create video player
diff --git a/dashboard-ui/scripts/mediaplayer.js b/dashboard-ui/scripts/mediaplayer.js
index 0f1a987335..a3b5d37199 100644
--- a/dashboard-ui/scripts/mediaplayer.js
+++ b/dashboard-ui/scripts/mediaplayer.js
@@ -941,35 +941,32 @@
}
- self.getNowPlayingNameHtml = function (playerState) {
+ self.getPosterUrl = function (item) {
- var nowPlayingItem = playerState.NowPlayingItem;
- var topText = nowPlayingItem.Name;
+ var screenWidth = Math.max(screen.height, screen.width);
+
+ if (item.BackdropImageTags && item.BackdropImageTags.length) {
+
+ return ApiClient.getScaledImageUrl(item.Id, {
+ type: "Backdrop",
+ index: 0,
+ maxWidth: screenWidth,
+ tag: item.BackdropImageTags[0]
+ });
+
+ }
+ else if (item.ParentBackdropItemId && item.ParentBackdropImageTags && item.ParentBackdropImageTags.length) {
+
+ return ApiClient.getScaledImageUrl(item.ParentBackdropItemId, {
+ type: 'Backdrop',
+ index: 0,
+ maxWidth: screenWidth,
+ tag: item.ParentBackdropImageTags[0]
+ });
- if (nowPlayingItem.MediaType == 'Video') {
- if (nowPlayingItem.IndexNumber != null) {
- topText = nowPlayingItem.IndexNumber + " - " + topText;
- }
- if (nowPlayingItem.ParentIndexNumber != null) {
- topText = nowPlayingItem.ParentIndexNumber + "." + topText;
- }
}
- var bottomText = '';
-
- if (nowPlayingItem.Artists && nowPlayingItem.Artists.length) {
- bottomText = topText;
- topText = nowPlayingItem.Artists[0];
- }
- else if (nowPlayingItem.SeriesName || nowPlayingItem.Album) {
- bottomText = topText;
- topText = nowPlayingItem.SeriesName || nowPlayingItem.Album;
- }
- else if (nowPlayingItem.ProductionYear) {
- bottomText = nowPlayingItem.ProductionYear;
- }
-
- return bottomText ? topText + '
' + bottomText : topText;
+ return null;
};
self.displayContent = function (options) {
@@ -1676,6 +1673,7 @@
this.src = audioUrl;
this.volume = initialVolume;
+ this.poster = self.getPosterUrl(item);
this.play();
}).on("volumechange.mediaplayerevent", function () {
diff --git a/dashboard-ui/scripts/nowplayingbar.js b/dashboard-ui/scripts/nowplayingbar.js
index cb017e7242..7b10ba9f40 100644
--- a/dashboard-ui/scripts/nowplayingbar.js
+++ b/dashboard-ui/scripts/nowplayingbar.js
@@ -287,7 +287,7 @@
var currentImgUrl;
function updateNowPlayingInfo(state) {
- var nameHtml = MediaPlayer.getNowPlayingNameHtml(state) || '';
+ var nameHtml = MediaController.getNowPlayingNameHtml(state.NowPlayingItem) || '';
if (nameHtml.indexOf('
') != -1) {
nowPlayingTextElement.addClass('nowPlayingDoubleText');
diff --git a/dashboard-ui/scripts/nowplayingpage.js b/dashboard-ui/scripts/nowplayingpage.js
index 9a0f89cb8b..8694c2a4c4 100644
--- a/dashboard-ui/scripts/nowplayingpage.js
+++ b/dashboard-ui/scripts/nowplayingpage.js
@@ -521,7 +521,7 @@
var item = state.NowPlayingItem;
- $('.itemName', page).html(item ? MediaPlayer.getNowPlayingNameHtml(state) : '');
+ $('.itemName', page).html(item ? MediaController.getNowPlayingNameHtml(item) : '');
var url;
diff --git a/dashboard-ui/scripts/photos.js b/dashboard-ui/scripts/photos.js
index 49ad1fd3ab..a783e11cbf 100644
--- a/dashboard-ui/scripts/photos.js
+++ b/dashboard-ui/scripts/photos.js
@@ -175,9 +175,12 @@
index = Math.max(index || 0, 0);
- $.swipebox(slideshowItems, {
- initialIndexOnArray: index,
- hideBarsDelay: 30000
+ Dashboard.loadSwipebox().done(function() {
+
+ $.swipebox(slideshowItems, {
+ initialIndexOnArray: index,
+ hideBarsDelay: 30000
+ });
});
}
diff --git a/dashboard-ui/scripts/site.js b/dashboard-ui/scripts/site.js
index 69565b2e93..75f61850a6 100644
--- a/dashboard-ui/scripts/site.js
+++ b/dashboard-ui/scripts/site.js
@@ -1460,6 +1460,20 @@ var Dashboard = {
deviceName: deviceName,
deviceId: deviceId
};
+ },
+
+ loadSwipebox: function() {
+
+ var deferred = DeferredBuilder.Deferred();
+
+ require([
+ 'thirdparty/swipebox-master/js/jquery.swipebox.min',
+ 'css!thirdparty/swipebox-master/css/swipebox.min'
+ ], function () {
+
+ deferred.resolve();
+ });
+ return deferred.promise();
}
};
@@ -1583,12 +1597,16 @@ var AppInfo = {};
function initFastClick() {
- FastClick.attach(document.body);
+ requirejs(["thirdparty/fastclick"], function (FastClick) {
- // Have to work around this issue of fast click breaking the panel dismiss
- $(document.body).on('touchstart', '.ui-panel-dismiss', function () {
- $(this).trigger('click');
+ FastClick.attach(document.body);
+
+ // Have to work around this issue of fast click breaking the panel dismiss
+ $(document.body).on('touchstart', '.ui-panel-dismiss', function () {
+ $(this).trigger('click');
+ });
});
+
}
function onReady() {
@@ -1725,10 +1743,17 @@ var AppInfo = {};
var apiClient = ConnectionManager.currentApiClient();
// Close the connection gracefully when possible
- if (apiClient && apiClient.isWebSocketOpen() && !MediaPlayer.isPlaying()) {
+ if (apiClient && apiClient.isWebSocketOpen()) {
- console.log('Sending close web socket command');
- apiClient.closeWebSocket();
+ var localActivePlayers = MediaController.getPlayers().filter(function (p) {
+
+ return p.isLocalPlayer && p.isPlaying();
+ });
+
+ if (!localActivePlayers.length) {
+ console.log('Sending close web socket command');
+ apiClient.closeWebSocket();
+ }
}
});
@@ -1741,6 +1766,19 @@ var AppInfo = {};
});
}
+ requirejs.config({
+ map: {
+ '*': {
+ 'css': 'thirdparty/requirecss' // or whatever the path to require-css is
+ }
+ }
+ });
+
+ // Required since jQuery is loaded before requireJs
+ define('jquery', [], function () {
+ return jQuery;
+ });
+
setAppInfo();
createConnectionManager();
diff --git a/dashboard-ui/scripts/thememediaplayer.js b/dashboard-ui/scripts/thememediaplayer.js
index 67af8616c6..d2e243b8eb 100644
--- a/dashboard-ui/scripts/thememediaplayer.js
+++ b/dashboard-ui/scripts/thememediaplayer.js
@@ -46,8 +46,13 @@
var val = store.getItem('enableThemeSongs-' + userId);
+ var localAutoPlayers = MediaController.getPlayers().filter(function (p) {
+
+ return p.isLocalPlayer && p.canAutoPlayAudio();
+ });
+
// For bandwidth
- return val == '1' || (val != '0' && MediaPlayer.canAutoPlayAudio());
+ return val == '1' || (val != '0' && localAutoPlayers.length);
}
function getPlayer() {
diff --git a/dashboard-ui/thirdparty/headroom.js b/dashboard-ui/thirdparty/headroom.js
index df812cd9ad..66030da47c 100644
--- a/dashboard-ui/thirdparty/headroom.js
+++ b/dashboard-ui/thirdparty/headroom.js
@@ -4,387 +4,4 @@
* License: MIT
*/
-(function(window, document) {
-
- 'use strict';
-
- /* exported features */
-
- var features = {
- bind : !!(function(){}.bind),
- classList : 'classList' in document.documentElement,
- rAF : !!(window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame)
- };
- window.requestAnimationFrame = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame;
-
- /**
- * Handles debouncing of events via requestAnimationFrame
- * @see http://www.html5rocks.com/en/tutorials/speed/animations/
- * @param {Function} callback The callback to handle whichever event
- */
- function Debouncer (callback) {
- this.callback = callback;
- this.ticking = false;
- }
- Debouncer.prototype = {
- constructor : Debouncer,
-
- /**
- * dispatches the event to the supplied callback
- * @private
- */
- update : function() {
- this.callback && this.callback();
- this.ticking = false;
- },
-
- /**
- * ensures events don't get stacked
- * @private
- */
- requestTick : function() {
- if(!this.ticking) {
- requestAnimationFrame(this.rafCallback || (this.rafCallback = this.update.bind(this)));
- this.ticking = true;
- }
- },
-
- /**
- * Attach this as the event listeners
- */
- handleEvent : function() {
- this.requestTick();
- }
- };
- /**
- * Check if object is part of the DOM
- * @constructor
- * @param {Object} obj element to check
- */
- function isDOMElement(obj) {
- return obj && typeof window !== 'undefined' && (obj === window || obj.nodeType);
- }
-
- /**
- * Helper function for extending objects
- */
- function extend (object /*, objectN ... */) {
- if(arguments.length <= 0) {
- throw new Error('Missing arguments in extend function');
- }
-
- var result = object || {},
- key,
- i;
-
- for (i = 1; i < arguments.length; i++) {
- var replacement = arguments[i] || {};
-
- for (key in replacement) {
- // Recurse into object except if the object is a DOM element
- if(typeof result[key] === 'object' && ! isDOMElement(result[key])) {
- result[key] = extend(result[key], replacement[key]);
- }
- else {
- result[key] = result[key] || replacement[key];
- }
- }
- }
-
- return result;
- }
-
- /**
- * Helper function for normalizing tolerance option to object format
- */
- function normalizeTolerance (t) {
- return t === Object(t) ? t : { down : t, up : t };
- }
-
- /**
- * UI enhancement for fixed headers.
- * Hides header when scrolling down
- * Shows header when scrolling up
- * @constructor
- * @param {DOMElement} elem the header element
- * @param {Object} options options for the widget
- */
- function Headroom (elem, options) {
- options = extend(options, Headroom.options);
-
- this.lastKnownScrollY = 0;
- this.elem = elem;
- this.debouncer = new Debouncer(this.update.bind(this));
- this.tolerance = normalizeTolerance(options.tolerance);
- this.classes = options.classes;
- this.offset = options.offset;
- this.scroller = options.scroller;
- this.initialised = false;
- this.onPin = options.onPin;
- this.onUnpin = options.onUnpin;
- this.onTop = options.onTop;
- this.onNotTop = options.onNotTop;
- }
- Headroom.prototype = {
- constructor : Headroom,
-
- /**
- * Initialises the widget
- */
- init : function() {
- if(!Headroom.cutsTheMustard) {
- return;
- }
-
- this.elem.classList.add(this.classes.initial);
-
- // defer event registration to handle browser
- // potentially restoring previous scroll position
- setTimeout(this.attachEvent.bind(this), 100);
-
- return this;
- },
-
- /**
- * Unattaches events and removes any classes that were added
- */
- destroy : function() {
- var classes = this.classes;
-
- this.initialised = false;
- this.elem.classList.remove(classes.unpinned, classes.pinned, classes.top, classes.initial);
- this.scroller.removeEventListener('scroll', this.debouncer, false);
- },
-
- /**
- * Attaches the scroll event
- * @private
- */
- attachEvent : function() {
- if(!this.initialised){
- this.lastKnownScrollY = this.getScrollY();
- this.initialised = true;
- this.scroller.addEventListener('scroll', this.debouncer, false);
-
- this.debouncer.handleEvent();
- }
- },
-
- /**
- * Unpins the header if it's currently pinned
- */
- unpin : function() {
- var classList = this.elem.classList,
- classes = this.classes;
-
- if(classList.contains(classes.pinned) || !classList.contains(classes.unpinned)) {
- classList.add(classes.unpinned);
- classList.remove(classes.pinned);
- this.onUnpin && this.onUnpin.call(this);
- }
- },
-
- /**
- * Pins the header if it's currently unpinned
- */
- pin : function() {
- var classList = this.elem.classList,
- classes = this.classes;
-
- if(classList.contains(classes.unpinned)) {
- classList.remove(classes.unpinned);
- classList.add(classes.pinned);
- this.onPin && this.onPin.call(this);
- }
- },
-
- /**
- * Handles the top states
- */
- top : function() {
- var classList = this.elem.classList,
- classes = this.classes;
-
- if(!classList.contains(classes.top)) {
- classList.add(classes.top);
- classList.remove(classes.notTop);
- this.onTop && this.onTop.call(this);
- }
- },
-
- /**
- * Handles the not top state
- */
- notTop : function() {
- var classList = this.elem.classList,
- classes = this.classes;
-
- if(!classList.contains(classes.notTop)) {
- classList.add(classes.notTop);
- classList.remove(classes.top);
- this.onNotTop && this.onNotTop.call(this);
- }
- },
-
- /**
- * Gets the Y scroll position
- * @see https://developer.mozilla.org/en-US/docs/Web/API/Window.scrollY
- * @return {Number} pixels the page has scrolled along the Y-axis
- */
- getScrollY : function() {
- return (this.scroller.pageYOffset !== undefined)
- ? this.scroller.pageYOffset
- : (this.scroller.scrollTop !== undefined)
- ? this.scroller.scrollTop
- : (document.documentElement || document.body.parentNode || document.body).scrollTop;
- },
-
- /**
- * Gets the height of the viewport
- * @see http://andylangton.co.uk/blog/development/get-viewport-size-width-and-height-javascript
- * @return {int} the height of the viewport in pixels
- */
- getViewportHeight : function () {
- return window.innerHeight
- || document.documentElement.clientHeight
- || document.body.clientHeight;
- },
-
- /**
- * Gets the height of the document
- * @see http://james.padolsey.com/javascript/get-document-height-cross-browser/
- * @return {int} the height of the document in pixels
- */
- getDocumentHeight : function () {
- var body = document.body,
- documentElement = document.documentElement;
-
- return Math.max(
- body.scrollHeight, documentElement.scrollHeight,
- body.offsetHeight, documentElement.offsetHeight,
- body.clientHeight, documentElement.clientHeight
- );
- },
-
- /**
- * Gets the height of the DOM element
- * @param {Object} elm the element to calculate the height of which
- * @return {int} the height of the element in pixels
- */
- getElementHeight : function (elm) {
- return Math.max(
- elm.scrollHeight,
- elm.offsetHeight,
- elm.clientHeight
- );
- },
-
- /**
- * Gets the height of the scroller element
- * @return {int} the height of the scroller element in pixels
- */
- getScrollerHeight : function () {
- return (this.scroller === window || this.scroller === document.body)
- ? this.getDocumentHeight()
- : this.getElementHeight(this.scroller);
- },
-
- /**
- * determines if the scroll position is outside of document boundaries
- * @param {int} currentScrollY the current y scroll position
- * @return {bool} true if out of bounds, false otherwise
- */
- isOutOfBounds : function (currentScrollY) {
- var pastTop = currentScrollY < 0,
- pastBottom = currentScrollY + this.getViewportHeight() > this.getScrollerHeight();
-
- return pastTop || pastBottom;
- },
-
- /**
- * determines if the tolerance has been exceeded
- * @param {int} currentScrollY the current scroll y position
- * @return {bool} true if tolerance exceeded, false otherwise
- */
- toleranceExceeded : function (currentScrollY, direction) {
- return Math.abs(currentScrollY-this.lastKnownScrollY) >= this.tolerance[direction];
- },
-
- /**
- * determine if it is appropriate to unpin
- * @param {int} currentScrollY the current y scroll position
- * @param {bool} toleranceExceeded has the tolerance been exceeded?
- * @return {bool} true if should unpin, false otherwise
- */
- shouldUnpin : function (currentScrollY, toleranceExceeded) {
- var scrollingDown = currentScrollY > this.lastKnownScrollY,
- pastOffset = currentScrollY >= this.offset;
-
- return scrollingDown && pastOffset && toleranceExceeded;
- },
-
- /**
- * determine if it is appropriate to pin
- * @param {int} currentScrollY the current y scroll position
- * @param {bool} toleranceExceeded has the tolerance been exceeded?
- * @return {bool} true if should pin, false otherwise
- */
- shouldPin : function (currentScrollY, toleranceExceeded) {
- var scrollingUp = currentScrollY < this.lastKnownScrollY,
- pastOffset = currentScrollY <= this.offset;
-
- return (scrollingUp && toleranceExceeded) || pastOffset;
- },
-
- /**
- * Handles updating the state of the widget
- */
- update : function() {
- var currentScrollY = this.getScrollY(),
- scrollDirection = currentScrollY > this.lastKnownScrollY ? 'down' : 'up',
- toleranceExceeded = this.toleranceExceeded(currentScrollY, scrollDirection);
-
- if(this.isOutOfBounds(currentScrollY)) { // Ignore bouncy scrolling in OSX
- return;
- }
-
- if (currentScrollY <= this.offset ) {
- this.top();
- } else {
- this.notTop();
- }
-
- if(this.shouldUnpin(currentScrollY, toleranceExceeded)) {
- this.unpin();
- }
- else if(this.shouldPin(currentScrollY, toleranceExceeded)) {
- this.pin();
- }
-
- this.lastKnownScrollY = currentScrollY;
- }
- };
- /**
- * Default options
- * @type {Object}
- */
- Headroom.options = {
- tolerance : {
- up : 0,
- down : 0
- },
- offset : 0,
- scroller: window,
- classes : {
- pinned : 'headroom--pinned',
- unpinned : 'headroom--unpinned',
- top : 'headroom--top',
- notTop : 'headroom--not-top',
- initial : 'headroom'
- }
- };
- Headroom.cutsTheMustard = typeof features !== 'undefined' && features.rAF && features.bind && features.classList;
-
- window.Headroom = Headroom;
-
-}(window, document));
\ No newline at end of file
+!function (a, b) { "use strict"; function c(a) { this.callback = a, this.ticking = !1 } function d(b) { return b && "undefined" != typeof a && (b === a || b.nodeType) } function e(a) { if (arguments.length <= 0) throw new Error("Missing arguments in extend function"); var b, c, f = a || {}; for (c = 1; c < arguments.length; c++) { var g = arguments[c] || {}; for (b in g) f[b] = "object" != typeof f[b] || d(f[b]) ? f[b] || g[b] : e(f[b], g[b]) } return f } function f(a) { return a === Object(a) ? a : { down: a, up: a } } function g(a, b) { b = e(b, g.options), this.lastKnownScrollY = 0, this.elem = a, this.debouncer = new c(this.update.bind(this)), this.tolerance = f(b.tolerance), this.classes = b.classes, this.offset = b.offset, this.scroller = b.scroller, this.initialised = !1, this.onPin = b.onPin, this.onUnpin = b.onUnpin, this.onTop = b.onTop, this.onNotTop = b.onNotTop } var h = { bind: !!function () { }.bind, classList: "classList" in b.documentElement, rAF: !!(a.requestAnimationFrame || a.webkitRequestAnimationFrame || a.mozRequestAnimationFrame) }; a.requestAnimationFrame = a.requestAnimationFrame || a.webkitRequestAnimationFrame || a.mozRequestAnimationFrame, c.prototype = { constructor: c, update: function () { this.callback && this.callback(), this.ticking = !1 }, requestTick: function () { this.ticking || (requestAnimationFrame(this.rafCallback || (this.rafCallback = this.update.bind(this))), this.ticking = !0) }, handleEvent: function () { this.requestTick() } }, g.prototype = { constructor: g, init: function () { return g.cutsTheMustard ? (this.elem.classList.add(this.classes.initial), setTimeout(this.attachEvent.bind(this), 100), this) : void 0 }, destroy: function () { var a = this.classes; this.initialised = !1, this.elem.classList.remove(a.unpinned, a.pinned, a.top, a.initial), this.scroller.removeEventListener("scroll", this.debouncer, !1) }, attachEvent: function () { this.initialised || (this.lastKnownScrollY = this.getScrollY(), this.initialised = !0, this.scroller.addEventListener("scroll", this.debouncer, !1), this.debouncer.handleEvent()) }, unpin: function () { var a = this.elem.classList, b = this.classes; (a.contains(b.pinned) || !a.contains(b.unpinned)) && (a.add(b.unpinned), a.remove(b.pinned), this.onUnpin && this.onUnpin.call(this)) }, pin: function () { var a = this.elem.classList, b = this.classes; a.contains(b.unpinned) && (a.remove(b.unpinned), a.add(b.pinned), this.onPin && this.onPin.call(this)) }, top: function () { var a = this.elem.classList, b = this.classes; a.contains(b.top) || (a.add(b.top), a.remove(b.notTop), this.onTop && this.onTop.call(this)) }, notTop: function () { var a = this.elem.classList, b = this.classes; a.contains(b.notTop) || (a.add(b.notTop), a.remove(b.top), this.onNotTop && this.onNotTop.call(this)) }, getScrollY: function () { return void 0 !== this.scroller.pageYOffset ? this.scroller.pageYOffset : void 0 !== this.scroller.scrollTop ? this.scroller.scrollTop : (b.documentElement || b.body.parentNode || b.body).scrollTop }, getViewportHeight: function () { return a.innerHeight || b.documentElement.clientHeight || b.body.clientHeight }, getDocumentHeight: function () { var a = b.body, c = b.documentElement; return Math.max(a.scrollHeight, c.scrollHeight, a.offsetHeight, c.offsetHeight, a.clientHeight, c.clientHeight) }, getElementHeight: function (a) { return Math.max(a.scrollHeight, a.offsetHeight, a.clientHeight) }, getScrollerHeight: function () { return this.scroller === a || this.scroller === b.body ? this.getDocumentHeight() : this.getElementHeight(this.scroller) }, isOutOfBounds: function (a) { var b = 0 > a, c = a + this.getViewportHeight() > this.getScrollerHeight(); return b || c }, toleranceExceeded: function (a, b) { return Math.abs(a - this.lastKnownScrollY) >= this.tolerance[b] }, shouldUnpin: function (a, b) { var c = a > this.lastKnownScrollY, d = a >= this.offset; return c && d && b }, shouldPin: function (a, b) { var c = a < this.lastKnownScrollY, d = a <= this.offset; return c && b || d }, update: function () { var a = this.getScrollY(), b = a > this.lastKnownScrollY ? "down" : "up", c = this.toleranceExceeded(a, b); this.isOutOfBounds(a) || (a <= this.offset ? this.top() : this.notTop(), this.shouldUnpin(a, c) ? this.unpin() : this.shouldPin(a, c) && this.pin(), this.lastKnownScrollY = a) } }, g.options = { tolerance: { up: 0, down: 0 }, offset: 0, scroller: a, classes: { pinned: "headroom--pinned", unpinned: "headroom--unpinned", top: "headroom--top", notTop: "headroom--not-top", initial: "headroom" } }, g.cutsTheMustard = "undefined" != typeof h && h.rAF && h.bind && h.classList, a.Headroom = g }(window, document);
\ No newline at end of file
diff --git a/dashboard-ui/thirdparty/require.js b/dashboard-ui/thirdparty/require.js
new file mode 100644
index 0000000000..0fe6b9cd8b
--- /dev/null
+++ b/dashboard-ui/thirdparty/require.js
@@ -0,0 +1,136 @@
+/*
+ RequireJS 2.1.17 Copyright (c) 2010-2015, The Dojo Foundation All Rights Reserved.
+ Available via the MIT or new BSD license.
+ see: http://github.com/jrburke/requirejs for details
+*/
+var requirejs, require, define;
+(function (ba) {
+ function G(b) { return "[object Function]" === K.call(b) } function H(b) { return "[object Array]" === K.call(b) } function v(b, c) { if (b) { var d; for (d = 0; d < b.length && (!b[d] || !c(b[d], d, b)) ; d += 1); } } function T(b, c) { if (b) { var d; for (d = b.length - 1; -1 < d && (!b[d] || !c(b[d], d, b)) ; d -= 1); } } function t(b, c) { return fa.call(b, c) } function m(b, c) { return t(b, c) && b[c] } function B(b, c) { for (var d in b) if (t(b, d) && c(b[d], d)) break } function U(b, c, d, e) {
+ c && B(c, function (c, g) {
+ if (d || !t(b, g)) e && "object" === typeof c && c && !H(c) && !G(c) && !(c instanceof
+ RegExp) ? (b[g] || (b[g] = {}), U(b[g], c, d, e)) : b[g] = c
+ }); return b
+ } function u(b, c) { return function () { return c.apply(b, arguments) } } function ca(b) { throw b; } function da(b) { if (!b) return b; var c = ba; v(b.split("."), function (b) { c = c[b] }); return c } function C(b, c, d, e) { c = Error(c + "\nhttp://requirejs.org/docs/errors.html#" + b); c.requireType = b; c.requireModules = e; d && (c.originalError = d); return c } function ga(b) {
+ function c(a, k, b) {
+ var f, l, c, d, e, g, i, p, k = k && k.split("/"), h = j.map, n = h && h["*"]; if (a) {
+ a = a.split("/"); l = a.length - 1; j.nodeIdCompat &&
+ Q.test(a[l]) && (a[l] = a[l].replace(Q, "")); "." === a[0].charAt(0) && k && (l = k.slice(0, k.length - 1), a = l.concat(a)); l = a; for (c = 0; c < l.length; c++) if (d = l[c], "." === d) l.splice(c, 1), c -= 1; else if (".." === d && !(0 === c || 1 === c && ".." === l[2] || ".." === l[c - 1]) && 0 < c) l.splice(c - 1, 2), c -= 2; a = a.join("/")
+ } if (b && h && (k || n)) {
+ l = a.split("/"); c = l.length; a: for (; 0 < c; c -= 1) { e = l.slice(0, c).join("/"); if (k) for (d = k.length; 0 < d; d -= 1) if (b = m(h, k.slice(0, d).join("/"))) if (b = m(b, e)) { f = b; g = c; break a } !i && (n && m(n, e)) && (i = m(n, e), p = c) } !f && i && (f = i, g = p); f && (l.splice(0,
+ g, f), a = l.join("/"))
+ } return (f = m(j.pkgs, a)) ? f : a
+ } function d(a) { z && v(document.getElementsByTagName("script"), function (k) { if (k.getAttribute("data-requiremodule") === a && k.getAttribute("data-requirecontext") === i.contextName) return k.parentNode.removeChild(k), !0 }) } function e(a) { var k = m(j.paths, a); if (k && H(k) && 1 < k.length) return k.shift(), i.require.undef(a), i.makeRequire(null, { skipMap: !0 })([a]), !0 } function n(a) { var k, c = a ? a.indexOf("!") : -1; -1 < c && (k = a.substring(0, c), a = a.substring(c + 1, a.length)); return [k, a] } function p(a,
+ k, b, f) { var l, d, e = null, g = k ? k.name : null, j = a, p = !0, h = ""; a || (p = !1, a = "_@r" + (K += 1)); a = n(a); e = a[0]; a = a[1]; e && (e = c(e, g, f), d = m(r, e)); a && (e ? h = d && d.normalize ? d.normalize(a, function (a) { return c(a, g, f) }) : -1 === a.indexOf("!") ? c(a, g, f) : a : (h = c(a, g, f), a = n(h), e = a[0], h = a[1], b = !0, l = i.nameToUrl(h))); b = e && !d && !b ? "_unnormalized" + (O += 1) : ""; return { prefix: e, name: h, parentMap: k, unnormalized: !!b, url: l, originalName: j, isDefine: p, id: (e ? e + "!" + h : h) + b } } function s(a) { var k = a.id, b = m(h, k); b || (b = h[k] = new i.Module(a)); return b } function q(a,
+ k, b) { var f = a.id, c = m(h, f); if (t(r, f) && (!c || c.defineEmitComplete)) "defined" === k && b(r[f]); else if (c = s(a), c.error && "error" === k) b(c.error); else c.on(k, b) } function w(a, b) { var c = a.requireModules, f = !1; if (b) b(a); else if (v(c, function (b) { if (b = m(h, b)) b.error = a, b.events.error && (f = !0, b.emit("error", a)) }), !f) g.onError(a) } function x() { R.length && (ha.apply(A, [A.length, 0].concat(R)), R = []) } function y(a) { delete h[a]; delete V[a] } function F(a, b, c) {
+ var f = a.map.id; a.error ? a.emit("error", a.error) : (b[f] = !0, v(a.depMaps, function (f,
+ d) { var e = f.id, g = m(h, e); g && (!a.depMatched[d] && !c[e]) && (m(b, e) ? (a.defineDep(d, r[e]), a.check()) : F(g, b, c)) }), c[f] = !0)
+ } function D() {
+ var a, b, c = (a = 1E3 * j.waitSeconds) && i.startTime + a < (new Date).getTime(), f = [], l = [], g = !1, h = !0; if (!W) {
+ W = !0; B(V, function (a) { var i = a.map, j = i.id; if (a.enabled && (i.isDefine || l.push(a), !a.error)) if (!a.inited && c) e(j) ? g = b = !0 : (f.push(j), d(j)); else if (!a.inited && (a.fetched && i.isDefine) && (g = !0, !i.prefix)) return h = !1 }); if (c && f.length) return a = C("timeout", "Load timeout for modules: " + f, null,
+ f), a.contextName = i.contextName, w(a); h && v(l, function (a) { F(a, {}, {}) }); if ((!c || b) && g) if ((z || ea) && !X) X = setTimeout(function () { X = 0; D() }, 50); W = !1
+ }
+ } function E(a) { t(r, a[0]) || s(p(a[0], null, !0)).init(a[1], a[2]) } function I(a) { var a = a.currentTarget || a.srcElement, b = i.onScriptLoad; a.detachEvent && !Y ? a.detachEvent("onreadystatechange", b) : a.removeEventListener("load", b, !1); b = i.onScriptError; (!a.detachEvent || Y) && a.removeEventListener("error", b, !1); return { node: a, id: a && a.getAttribute("data-requiremodule") } } function J() {
+ var a;
+ for (x() ; A.length;) { a = A.shift(); if (null === a[0]) return w(C("mismatch", "Mismatched anonymous define() module: " + a[a.length - 1])); E(a) }
+ } var W, Z, i, L, X, j = { waitSeconds: 7, baseUrl: "./", paths: {}, bundles: {}, pkgs: {}, shim: {}, config: {} }, h = {}, V = {}, $ = {}, A = [], r = {}, S = {}, aa = {}, K = 1, O = 1; L = {
+ require: function (a) { return a.require ? a.require : a.require = i.makeRequire(a.map) }, exports: function (a) { a.usingExports = !0; if (a.map.isDefine) return a.exports ? r[a.map.id] = a.exports : a.exports = r[a.map.id] = {} }, module: function (a) {
+ return a.module ?
+ a.module : a.module = { id: a.map.id, uri: a.map.url, config: function () { return m(j.config, a.map.id) || {} }, exports: a.exports || (a.exports = {}) }
+ }
+ }; Z = function (a) { this.events = m($, a.id) || {}; this.map = a; this.shim = m(j.shim, a.id); this.depExports = []; this.depMaps = []; this.depMatched = []; this.pluginMaps = {}; this.depCount = 0 }; Z.prototype = {
+ init: function (a, b, c, f) {
+ f = f || {}; if (!this.inited) {
+ this.factory = b; if (c) this.on("error", c); else this.events.error && (c = u(this, function (a) { this.emit("error", a) })); this.depMaps = a && a.slice(0); this.errback =
+ c; this.inited = !0; this.ignore = f.ignore; f.enabled || this.enabled ? this.enable() : this.check()
+ }
+ }, defineDep: function (a, b) { this.depMatched[a] || (this.depMatched[a] = !0, this.depCount -= 1, this.depExports[a] = b) }, fetch: function () { if (!this.fetched) { this.fetched = !0; i.startTime = (new Date).getTime(); var a = this.map; if (this.shim) i.makeRequire(this.map, { enableBuildCallback: !0 })(this.shim.deps || [], u(this, function () { return a.prefix ? this.callPlugin() : this.load() })); else return a.prefix ? this.callPlugin() : this.load() } }, load: function () {
+ var a =
+ this.map.url; S[a] || (S[a] = !0, i.load(this.map.id, a))
+ }, check: function () {
+ if (this.enabled && !this.enabling) {
+ var a, b, c = this.map.id; b = this.depExports; var f = this.exports, l = this.factory; if (this.inited) if (this.error) this.emit("error", this.error); else {
+ if (!this.defining) {
+ this.defining = !0; if (1 > this.depCount && !this.defined) {
+ if (G(l)) {
+ if (this.events.error && this.map.isDefine || g.onError !== ca) try { f = i.execCb(c, l, b, f) } catch (d) { a = d } else f = i.execCb(c, l, b, f); this.map.isDefine && void 0 === f && ((b = this.module) ? f = b.exports : this.usingExports &&
+ (f = this.exports)); if (a) return a.requireMap = this.map, a.requireModules = this.map.isDefine ? [this.map.id] : null, a.requireType = this.map.isDefine ? "define" : "require", w(this.error = a)
+ } else f = l; this.exports = f; if (this.map.isDefine && !this.ignore && (r[c] = f, g.onResourceLoad)) g.onResourceLoad(i, this.map, this.depMaps); y(c); this.defined = !0
+ } this.defining = !1; this.defined && !this.defineEmitted && (this.defineEmitted = !0, this.emit("defined", this.exports), this.defineEmitComplete = !0)
+ }
+ } else this.fetch()
+ }
+ }, callPlugin: function () {
+ var a =
+ this.map, b = a.id, d = p(a.prefix); this.depMaps.push(d); q(d, "defined", u(this, function (f) {
+ var l, d; d = m(aa, this.map.id); var e = this.map.name, P = this.map.parentMap ? this.map.parentMap.name : null, n = i.makeRequire(a.parentMap, { enableBuildCallback: !0 }); if (this.map.unnormalized) {
+ if (f.normalize && (e = f.normalize(e, function (a) { return c(a, P, !0) }) || ""), f = p(a.prefix + "!" + e, this.map.parentMap), q(f, "defined", u(this, function (a) { this.init([], function () { return a }, null, { enabled: !0, ignore: !0 }) })), d = m(h, f.id)) {
+ this.depMaps.push(f);
+ if (this.events.error) d.on("error", u(this, function (a) { this.emit("error", a) })); d.enable()
+ }
+ } else d ? (this.map.url = i.nameToUrl(d), this.load()) : (l = u(this, function (a) { this.init([], function () { return a }, null, { enabled: !0 }) }), l.error = u(this, function (a) { this.inited = !0; this.error = a; a.requireModules = [b]; B(h, function (a) { 0 === a.map.id.indexOf(b + "_unnormalized") && y(a.map.id) }); w(a) }), l.fromText = u(this, function (f, c) {
+ var d = a.name, e = p(d), P = M; c && (f = c); P && (M = !1); s(e); t(j.config, b) && (j.config[d] = j.config[b]); try { g.exec(f) } catch (h) {
+ return w(C("fromtexteval",
+ "fromText eval for " + b + " failed: " + h, h, [b]))
+ } P && (M = !0); this.depMaps.push(e); i.completeLoad(d); n([d], l)
+ }), f.load(a.name, n, l, j))
+ })); i.enable(d, this); this.pluginMaps[d.id] = d
+ }, enable: function () {
+ V[this.map.id] = this; this.enabling = this.enabled = !0; v(this.depMaps, u(this, function (a, b) {
+ var c, f; if ("string" === typeof a) {
+ a = p(a, this.map.isDefine ? this.map : this.map.parentMap, !1, !this.skipMap); this.depMaps[b] = a; if (c = m(L, a.id)) { this.depExports[b] = c(this); return } this.depCount += 1; q(a, "defined", u(this, function (a) {
+ this.defineDep(b,
+ a); this.check()
+ })); this.errback ? q(a, "error", u(this, this.errback)) : this.events.error && q(a, "error", u(this, function (a) { this.emit("error", a) }))
+ } c = a.id; f = h[c]; !t(L, c) && (f && !f.enabled) && i.enable(a, this)
+ })); B(this.pluginMaps, u(this, function (a) { var b = m(h, a.id); b && !b.enabled && i.enable(a, this) })); this.enabling = !1; this.check()
+ }, on: function (a, b) { var c = this.events[a]; c || (c = this.events[a] = []); c.push(b) }, emit: function (a, b) { v(this.events[a], function (a) { a(b) }); "error" === a && delete this.events[a] }
+ }; i = {
+ config: j, contextName: b,
+ registry: h, defined: r, urlFetched: S, defQueue: A, Module: Z, makeModuleMap: p, nextTick: g.nextTick, onError: w, configure: function (a) {
+ a.baseUrl && "/" !== a.baseUrl.charAt(a.baseUrl.length - 1) && (a.baseUrl += "/"); var b = j.shim, c = { paths: !0, bundles: !0, config: !0, map: !0 }; B(a, function (a, b) { c[b] ? (j[b] || (j[b] = {}), U(j[b], a, !0, !0)) : j[b] = a }); a.bundles && B(a.bundles, function (a, b) { v(a, function (a) { a !== b && (aa[a] = b) }) }); a.shim && (B(a.shim, function (a, c) {
+ H(a) && (a = { deps: a }); if ((a.exports || a.init) && !a.exportsFn) a.exportsFn = i.makeShimExports(a);
+ b[c] = a
+ }), j.shim = b); a.packages && v(a.packages, function (a) { var b, a = "string" === typeof a ? { name: a } : a; b = a.name; a.location && (j.paths[b] = a.location); j.pkgs[b] = a.name + "/" + (a.main || "main").replace(ia, "").replace(Q, "") }); B(h, function (a, b) { !a.inited && !a.map.unnormalized && (a.map = p(b)) }); if (a.deps || a.callback) i.require(a.deps || [], a.callback)
+ }, makeShimExports: function (a) { return function () { var b; a.init && (b = a.init.apply(ba, arguments)); return b || a.exports && da(a.exports) } }, makeRequire: function (a, e) {
+ function j(c, d, m) {
+ var n,
+ q; e.enableBuildCallback && (d && G(d)) && (d.__requireJsBuild = !0); if ("string" === typeof c) { if (G(d)) return w(C("requireargs", "Invalid require call"), m); if (a && t(L, c)) return L[c](h[a.id]); if (g.get) return g.get(i, c, a, j); n = p(c, a, !1, !0); n = n.id; return !t(r, n) ? w(C("notloaded", 'Module name "' + n + '" has not been loaded yet for context: ' + b + (a ? "" : ". Use require([])"))) : r[n] } J(); i.nextTick(function () { J(); q = s(p(null, a)); q.skipMap = e.skipMap; q.init(c, d, m, { enabled: !0 }); D() }); return j
+ } e = e || {}; U(j, {
+ isBrowser: z, toUrl: function (b) {
+ var d,
+ e = b.lastIndexOf("."), k = b.split("/")[0]; if (-1 !== e && (!("." === k || ".." === k) || 1 < e)) d = b.substring(e, b.length), b = b.substring(0, e); return i.nameToUrl(c(b, a && a.id, !0), d, !0)
+ }, defined: function (b) { return t(r, p(b, a, !1, !0).id) }, specified: function (b) { b = p(b, a, !1, !0).id; return t(r, b) || t(h, b) }
+ }); a || (j.undef = function (b) { x(); var c = p(b, a, !0), e = m(h, b); d(b); delete r[b]; delete S[c.url]; delete $[b]; T(A, function (a, c) { a[0] === b && A.splice(c, 1) }); e && (e.events.defined && ($[b] = e.events), y(b)) }); return j
+ }, enable: function (a) {
+ m(h, a.id) &&
+ s(a).enable()
+ }, completeLoad: function (a) { var b, c, d = m(j.shim, a) || {}, g = d.exports; for (x() ; A.length;) { c = A.shift(); if (null === c[0]) { c[0] = a; if (b) break; b = !0 } else c[0] === a && (b = !0); E(c) } c = m(h, a); if (!b && !t(r, a) && c && !c.inited) { if (j.enforceDefine && (!g || !da(g))) return e(a) ? void 0 : w(C("nodefine", "No define call for " + a, null, [a])); E([a, d.deps || [], d.exportsFn]) } D() }, nameToUrl: function (a, b, c) {
+ var d, e, h; (d = m(j.pkgs, a)) && (a = d); if (d = m(aa, a)) return i.nameToUrl(d, b, c); if (g.jsExtRegExp.test(a)) d = a + (b || ""); else {
+ d = j.paths;
+ a = a.split("/"); for (e = a.length; 0 < e; e -= 1) if (h = a.slice(0, e).join("/"), h = m(d, h)) { H(h) && (h = h[0]); a.splice(0, e, h); break } d = a.join("/"); d += b || (/^data\:|\?/.test(d) || c ? "" : ".js"); d = ("/" === d.charAt(0) || d.match(/^[\w\+\.\-]+:/) ? "" : j.baseUrl) + d
+ } return j.urlArgs ? d + ((-1 === d.indexOf("?") ? "?" : "&") + j.urlArgs) : d
+ }, load: function (a, b) { g.load(i, a, b) }, execCb: function (a, b, c, d) { return b.apply(d, c) }, onScriptLoad: function (a) { if ("load" === a.type || ja.test((a.currentTarget || a.srcElement).readyState)) N = null, a = I(a), i.completeLoad(a.id) },
+ onScriptError: function (a) { var b = I(a); if (!e(b.id)) return w(C("scripterror", "Script error for: " + b.id, a, [b.id])) }
+ }; i.require = i.makeRequire(); return i
+ } var g, x, y, D, I, E, N, J, s, O, ka = /(\/\*([\s\S]*?)\*\/|([^:]|^)\/\/(.*)$)/mg, la = /[^.]\s*require\s*\(\s*["']([^'"\s]+)["']\s*\)/g, Q = /\.js$/, ia = /^\.\//; x = Object.prototype; var K = x.toString, fa = x.hasOwnProperty, ha = Array.prototype.splice, z = !!("undefined" !== typeof window && "undefined" !== typeof navigator && window.document), ea = !z && "undefined" !== typeof importScripts, ja =
+ z && "PLAYSTATION 3" === navigator.platform ? /^complete$/ : /^(complete|loaded)$/, Y = "undefined" !== typeof opera && "[object Opera]" === opera.toString(), F = {}, q = {}, R = [], M = !1; if ("undefined" === typeof define) {
+ if ("undefined" !== typeof requirejs) { if (G(requirejs)) return; q = requirejs; requirejs = void 0 } "undefined" !== typeof require && !G(require) && (q = require, require = void 0); g = requirejs = function (b, c, d, e) {
+ var n, p = "_"; !H(b) && "string" !== typeof b && (n = b, H(c) ? (b = c, c = d, d = e) : b = []); n && n.context && (p = n.context); (e = m(F, p)) || (e = F[p] = g.s.newContext(p));
+ n && e.configure(n); return e.require(b, c, d)
+ }; g.config = function (b) { return g(b) }; g.nextTick = "undefined" !== typeof setTimeout ? function (b) { setTimeout(b, 4) } : function (b) { b() }; require || (require = g); g.version = "2.1.17"; g.jsExtRegExp = /^\/|:|\?|\.js$/; g.isBrowser = z; x = g.s = { contexts: F, newContext: ga }; g({}); v(["toUrl", "undef", "defined", "specified"], function (b) { g[b] = function () { var c = F._; return c.require[b].apply(c, arguments) } }); if (z && (y = x.head = document.getElementsByTagName("head")[0], D = document.getElementsByTagName("base")[0])) y =
+ x.head = D.parentNode; g.onError = ca; g.createNode = function (b) { var c = b.xhtml ? document.createElementNS("http://www.w3.org/1999/xhtml", "html:script") : document.createElement("script"); c.type = b.scriptType || "text/javascript"; c.charset = "utf-8"; c.async = !0; return c }; g.load = function (b, c, d) {
+ var e = b && b.config || {}; if (z) return e = g.createNode(e, c, d), e.setAttribute("data-requirecontext", b.contextName), e.setAttribute("data-requiremodule", c), e.attachEvent && !(e.attachEvent.toString && 0 > e.attachEvent.toString().indexOf("[native code")) &&
+ !Y ? (M = !0, e.attachEvent("onreadystatechange", b.onScriptLoad)) : (e.addEventListener("load", b.onScriptLoad, !1), e.addEventListener("error", b.onScriptError, !1)), e.src = d, J = e, D ? y.insertBefore(e, D) : y.appendChild(e), J = null, e; if (ea) try { importScripts(d), b.completeLoad(c) } catch (m) { b.onError(C("importscripts", "importScripts failed for " + c + " at " + d, m, [c])) }
+ }; z && !q.skipDataMain && T(document.getElementsByTagName("script"), function (b) {
+ y || (y = b.parentNode); if (I = b.getAttribute("data-main")) return s = I, q.baseUrl || (E = s.split("/"),
+ s = E.pop(), O = E.length ? E.join("/") + "/" : "./", q.baseUrl = O), s = s.replace(Q, ""), g.jsExtRegExp.test(s) && (s = I), q.deps = q.deps ? q.deps.concat(s) : [s], !0
+ }); define = function (b, c, d) {
+ var e, g; "string" !== typeof b && (d = c, c = b, b = null); H(c) || (d = c, c = null); !c && G(d) && (c = [], d.length && (d.toString().replace(ka, "").replace(la, function (b, d) { c.push(d) }), c = (1 === d.length ? ["require"] : ["require", "exports", "module"]).concat(c))); if (M) {
+ if (!(e = J)) N && "interactive" === N.readyState || T(document.getElementsByTagName("script"), function (b) {
+ if ("interactive" ===
+ b.readyState) return N = b
+ }), e = N; e && (b || (b = e.getAttribute("data-requiremodule")), g = F[e.getAttribute("data-requirecontext")])
+ } (g ? g.defQueue : R).push([b, c, d])
+ }; define.amd = { jQuery: !0 }; g.exec = function (b) { return eval(b) }; g(q)
+ }
+})(this);
\ No newline at end of file
diff --git a/dashboard-ui/thirdparty/requirecss.js b/dashboard-ui/thirdparty/requirecss.js
new file mode 100644
index 0000000000..2e1d1202fc
--- /dev/null
+++ b/dashboard-ui/thirdparty/requirecss.js
@@ -0,0 +1 @@
+define(function(){if("undefined"==typeof window)return{load:function(e,t,n){n()}};var e=document.getElementsByTagName("head")[0],t=window.navigator.userAgent.match(/Trident\/([^ ;]*)|AppleWebKit\/([^ ;]*)|Opera\/([^ ;]*)|rv\:([^ ;]*)(.*?)Gecko\/([^ ;]*)|MSIE\s([^ ;]*)|AndroidWebKit\/([^ ;]*)/)||0,n=!1,r=!0;t[1]||t[7]?n=parseInt(t[1])<6||parseInt(t[7])<=9:t[2]||t[8]?r=!1:t[4]&&(n=parseInt(t[4])<18);var o={};o.pluginBuilder="./css-builder";var a,i,s,l=function(){a=document.createElement("style"),e.appendChild(a),i=a.styleSheet||a.sheet},u=0,d=[],c=function(e){u++,32==u&&(l(),u=0),i.addImport(e),a.onload=function(){f()}},f=function(){s();var e=d.shift();return e?(s=e[1],void c(e[0])):void(s=null)},h=function(e,t){if(i&&i.addImport||l(),i&&i.addImport)s?d.push([e,t]):(c(e),s=t);else{a.textContent='@import "'+e+'";';var n=setInterval(function(){try{a.sheet.cssRules,clearInterval(n),t()}catch(e){}},10)}},p=function(t,n){var o=document.createElement("link");if(o.type="text/css",o.rel="stylesheet",r)o.onload=function(){o.onload=function(){},setTimeout(n,7)};else var a=setInterval(function(){for(var e=0;e