diff --git a/dashboard-ui/css/card.css b/dashboard-ui/css/card.css index 5d32a32bb0..9bf3a29b29 100644 --- a/dashboard-ui/css/card.css +++ b/dashboard-ui/css/card.css @@ -84,13 +84,6 @@ margin: 12px; } -@media all and (min-width: 600px) { - - .largeCardMargin .visualCardBox { - margin: 18px; - } -} - .ui-page-theme-b .visualCardBox { background: rgba(45,45,45,.85); border-radius: 3px; diff --git a/dashboard-ui/css/librarybrowser.css b/dashboard-ui/css/librarybrowser.css index be6aa607e1..5bcd7fe84c 100644 --- a/dashboard-ui/css/librarybrowser.css +++ b/dashboard-ui/css/librarybrowser.css @@ -20,6 +20,10 @@ background-color: rgba(240, 240,240, .94) !important; } +.ui-page-theme-b { + background-color: #1f1f1f; +} + .backdropPage.ui-page-theme-b { background-color: rgba(20, 20,20, .86) !important; } @@ -1283,80 +1287,6 @@ span.itemCommunityRating:not(:empty) + .userDataIcons { text-decoration: none; } -.groupingMenu { - width: 240px; -} - -.groupingMenuScroller { - overflow-x: auto; - overflow-y: hidden; - white-space: nowrap; - padding: 1em; -} - -@media all and (min-width: 400px) { - - .groupingMenu { - width: 360px; - } -} - -@media all and (min-width: 500px) { - - .groupingMenu { - width: 460px; - } -} - -@media all and (min-width: 600px) { - - .groupingMenu { - width: 560px; - } -} - -@media all and (min-width: 700px) { - - .groupingMenu { - width: 660px; - } -} - -@media all and (min-width: 800px) { - - .groupingMenu { - width: 760px; - } -} - -@media all and (min-width: 900px) { - - .groupingMenu { - width: 860px; - } -} - -@media all and (min-width: 1000px) { - - .groupingMenu { - width: 960px; - } -} - -@media all and (min-width: 1100px) { - - .groupingMenu { - width: 1060px; - } -} - -@media all and (min-width: 1200px) { - - .groupingMenu { - width: 1160px; - } -} - .itemsContainer:not(.fullWidthItemsContainer) .itemsListview { max-width: 800px; @@ -1547,3 +1477,126 @@ span.itemCommunityRating:not(:empty) + .userDataIcons { .homeFavoritesTabDisabled .homeFavoritesTab { display: none !important; } + +.detailsMenu { + width: 280px; +} + +@media all and (min-width: 360px) { + + .detailsMenu { + width: 320px; + } +} + +@media all and (min-width: 400px) { + + .detailsMenu { + width: 340px; + } +} + +@media all and (min-width: 500px) { + + .detailsMenu { + width: 440px; + } +} + +@media all and (min-width: 600px) { + + .detailsMenu { + width: 540px; + } +} + +@media all and (min-width: 700px) { + + .detailsMenu { + width: 640px; + } +} + +@media all and (min-width:800px) { + + .detailsMenu { + width: 740px; + } +} + +.detailsMenuLeftButton { + position: absolute; + left: 0; + top: 0; + padding: 23px 15px; +} + +.detailsMenuRightButton { + position: absolute; + right: 0; + top: 0; + padding: 23px 15px; +} + +.detailsMenuHeaderWithLogo .detailsMenuLeftButton, .detailsMenuHeaderWithLogo .detailsMenuRightButton { + padding-top: 30px; + padding-bottom: 30px; +} + +.detailsMenuContentInner { + height: 200px; +} + +.detailsMenuOverview { + max-height: 30px; + text-overflow: ellipsis; + overflow-y: hidden; +} + +.detailsMenuButtons { + padding: 1em 0 .5em; + text-transform: uppercase; + text-align: center; +} + + .detailsMenuButtons .btn { + font-size: 14px; + } + +.detailsMenuButtonContainer { + display: inline-block; +} + + .detailsMenuButtonContainer span { + padding-left: 1em; + } + + .detailsMenuButtonContainer + .detailsMenuButtonContainer { + margin-left: 1em; + } + +.detailsMenu h3 { + padding: 0 30px; +} + +@media all and (min-height:500px) { + + .detailsMenuContentInner { + height: 300px; + } + + .detailsMenuOverview { + max-height: 120px; + } +} + +@media all and (min-height:600px) { + + .detailsMenuContentInner { + height: 400px; + } + + .detailsMenuOverview { + max-height: 220px; + } +} diff --git a/dashboard-ui/scripts/episodes.js b/dashboard-ui/scripts/episodes.js index d7559f18d6..b1e252e9f2 100644 --- a/dashboard-ui/scripts/episodes.js +++ b/dashboard-ui/scripts/episodes.js @@ -69,7 +69,8 @@ showParentTitle: true, overlayText: true, lazy: true, - context: 'tv' + context: 'tv', + showDetailsMenu: true }); } else if (view == "PosterCard") { @@ -80,7 +81,8 @@ showParentTitle: true, lazy: true, context: 'tv', - cardLayout: true + cardLayout: true, + showDetailsMenu: true }); } diff --git a/dashboard-ui/scripts/favorites.js b/dashboard-ui/scripts/favorites.js index 5b4724bee0..2187f26fec 100644 --- a/dashboard-ui/scripts/favorites.js +++ b/dashboard-ui/scripts/favorites.js @@ -48,7 +48,8 @@ context: 'home-favorites', showTitle: section.showTitle, showParentTitle: section.showParentTitle, - lazy: true + lazy: true, + showDetailsMenu: true }); if (result.TotalRecordCount > result.Items.length) { diff --git a/dashboard-ui/scripts/indexpage.js b/dashboard-ui/scripts/indexpage.js index 7a4c8e228c..fe83c33a1b 100644 --- a/dashboard-ui/scripts/indexpage.js +++ b/dashboard-ui/scripts/indexpage.js @@ -161,7 +161,8 @@ lazy: true, cardLayout: cardLayout, showTitle: cardLayout, - showYear: cardLayout + showYear: cardLayout, + showDetailsMenu: true }); html += ''; } @@ -196,7 +197,8 @@ shape: 'auto', showTitle: true, centerText: true, - lazy: true + lazy: true, + showDetailsMenu: true }); html += ''; } @@ -251,7 +253,7 @@ html += ''; } - $(elem).html(html).lazyChildren().createCardMenus(); + $(elem).html(html).lazyChildren().createCardMenus({ showDetailsMenu: false }); handleLibraryLinkNavigations(elem); }); @@ -294,7 +296,8 @@ showParentTitle: true, context: 'home', lazy: true, - cardLayout: cardLayout + cardLayout: cardLayout, + showDetailsMenu: true }); html += ''; } @@ -384,7 +387,8 @@ showTitle: true, centerText: true, context: 'channels', - lazy: true + lazy: true, + showDetailsMenu: true }); html += ''; @@ -424,7 +428,8 @@ showParentTitle: true, overlayText: screenWidth >= 600, coverImage: true, - lazy: true + lazy: true, + showDetailsMenu: true }); elem.html(html).lazyChildren().trigger('create'); @@ -657,7 +662,7 @@ }); function getDisplayPreferencesAppName() { - + if (Dashboard.isRunningInCordova()) { return 'Emby Mobile'; } @@ -668,7 +673,7 @@ function getDisplayPreferences(key, userId) { return ApiClient.getDisplayPreferences(key, userId, getDisplayPreferencesAppName()).done(function (result) { - + }); } diff --git a/dashboard-ui/scripts/itemdetailpage.js b/dashboard-ui/scripts/itemdetailpage.js index 7590b125d0..0541ed4c5e 100644 --- a/dashboard-ui/scripts/itemdetailpage.js +++ b/dashboard-ui/scripts/itemdetailpage.js @@ -666,7 +666,8 @@ borderless: item.Type == "Game", context: context, overlayText: item.Type != "MusicAlbum", - lazy: true + lazy: true, + showDetailsMenu: true }); $('#similarContent', page).html(html).lazyChildren(); @@ -866,7 +867,8 @@ context: context, playFromHere: true, overlayText: true, - lazy: true + lazy: true, + showDetailsMenu: true }); } else if (item.Type == "GameSystem") { @@ -876,7 +878,8 @@ showTitle: true, centerText: true, context: context, - lazy: true + lazy: true, + showDetailsMenu: true }); } @@ -982,13 +985,14 @@ showTitle: true, centerText: true, context: context, - lazy: true + lazy: true, + showDetailsMenu: true }); html += ''; html += ''; - $('.collectionItems', page).append(html); + $('.collectionItems', page).append(html).lazyChildren(); } function renderUserDataIcons(page, item) { diff --git a/dashboard-ui/scripts/librarybrowser.js b/dashboard-ui/scripts/librarybrowser.js index 34218fcb3f..faad204c21 100644 --- a/dashboard-ui/scripts/librarybrowser.js +++ b/dashboard-ui/scripts/librarybrowser.js @@ -884,6 +884,10 @@ atts.push('data-locationtype="' + (item.LocationType || '') + '"'); atts.push('data-index="' + index + '"'); + if (options.showDetailsMenu) { + atts.push('data-detailsmenu="true"'); + } + var html = atts.join(' '); if (html) { @@ -1689,7 +1693,8 @@ return { id: itemId, index: index, - mediaType: mediaType + mediaType: mediaType, + context: elemWithAttributes.getAttribute('data-context') }; }, diff --git a/dashboard-ui/scripts/librarylist.js b/dashboard-ui/scripts/librarylist.js index 0a4415dc1e..4904a6881b 100644 --- a/dashboard-ui/scripts/librarylist.js +++ b/dashboard-ui/scripts/librarylist.js @@ -492,8 +492,6 @@ function onGroupedCardClick(e) { - var target = $(e.target); - var card = this; var itemId = card.getAttribute('data-itemid'); var context = card.getAttribute('data-context'); @@ -502,8 +500,6 @@ var userId = Dashboard.getCurrentUserId(); - var promise1 = ApiClient.getItem(userId, itemId); - var options = { Limit: parseInt($('.playedIndicator', card).html() || '10'), @@ -512,59 +508,285 @@ GroupItems: false }; - var promise2 = ApiClient.getJSON(ApiClient.getUrl('Users/' + userId + '/Items/Latest', options)); + ApiClient.getJSON(ApiClient.getUrl('Users/' + userId + '/Items/Latest', options)).done(function (items) { - $.when(promise1, promise2).done(function (response1, response2) { - - var item = response1[0]; - var latestItems = response2[0]; - - if (latestItems.length == 1) { - - if (!target.is('a,button')) { - var first = latestItems[0]; - Dashboard.navigate(LibraryBrowser.getHref(first, context)); - return; - } - } - - var html = '
'; - - var href = card.href || LibraryBrowser.getHref(item, context); - var header = Globalize.translate('HeaderLatestFromChannel').replace('{0}', '' + item.Name + ''); - html += '

' + header + '

'; - - html += '
'; - - html += LibraryBrowser.getPosterViewHtml({ - items: latestItems, - shape: "detailPage169", - showTitle: true, - overlayText: true, - lazy: true, - context: context + var ids = items.map(function (i) { + return i.Id; }); - html += '
'; - - html += '
'; - - $($.mobile.activePage).append(html); - - $('.groupingMenu').popup().trigger('create').popup("open").on("popupafterclose", function () { - - $(this).off("popupafterclose").remove(); - $(card).removeClass('hasContextMenu'); - - }).lazyChildren(); + showItemsOverlay({ + ids: ids, + context: context + }); }); e.preventDefault(); return false; } + function getItemsOverlay(ids, context) { - $.fn.createCardMenus = function () { + var html = '
'; + + html += '
'; + html += ''; + html += '

'; + html += ''; + html += '
'; + + html += '
'; + html += '
'; + html += '
'; + html += '
'; + + html += '
'; + + $($.mobile.activePage).append(html); + + var elem = $('.detailsMenu').popup().trigger('create').popup("open").on("popupafterclose", function () { + + $(this).off("popupafterclose").remove(); + }); + + $('.detailsMenuLeftButton', elem).on('click', function () { + + var overlay = $(this).parents('.detailsMenu'); + setItemIntoOverlay(overlay, parseInt(overlay.attr('data-index')) - 1, context); + }); + + $('.detailsMenuRightButton', elem).on('click', function () { + + var overlay = $(this).parents('.detailsMenu'); + setItemIntoOverlay(overlay, parseInt(overlay.attr('data-index')) + 1, context); + }); + + return elem; + } + + function setItemIntoOverlay(elem, index) { + + var ids = elem.attr('data-ids').split(','); + var itemId = ids[index]; + var userId = Dashboard.getCurrentUserId(); + var context = elem.attr('data-context'); + + elem.attr('data-index', index); + + if (index > 0) { + $('.detailsMenuLeftButton', elem).show(); + } else { + $('.detailsMenuLeftButton', elem).hide(); + } + + if (index < ids.length - 1) { + $('.detailsMenuRightButton', elem).show(); + } else { + $('.detailsMenuRightButton', elem).hide(); + } + + var promise1 = ApiClient.getItem(userId, itemId); + var promise2 = Dashboard.getCurrentUser(); + + $.when(promise1, promise2).done(function (response1, response2) { + + var item = response1[0]; + var user = response2[0]; + + var background = 'none'; + + if (!AppInfo.hasLowImageBandwidth) { + var backdropUrl; + var screenWidth = $(window).width(); + var backdropWidth = Math.min(screenWidth, 800); + + if (item.BackdropImageTags && item.BackdropImageTags.length) { + + backdropUrl = ApiClient.getScaledImageUrl(item.Id, { + type: "Backdrop", + index: 0, + maxWidth: backdropWidth, + tag: item.BackdropImageTags[0] + }); + } + else if (item.ParentBackdropItemId && item.ParentBackdropImageTags && item.ParentBackdropImageTags.length) { + + backdropUrl = ApiClient.getScaledImageUrl(item.ParentBackdropItemId, { + type: 'Backdrop', + index: 0, + tag: item.ParentBackdropImageTags[0], + maxWidth: backdropWidth + }); + } + + if (backdropUrl) { + background = 'url(' + backdropUrl + ')'; + } + } + + $('.detailsMenuContent', elem).css('backgroundImage', background); + + var headerHtml = LibraryBrowser.getPosterViewDisplayName(item); + $('.detailsMenuHeader', elem).removeClass('detailsMenuHeaderWithLogo'); + if (!AppInfo.hasLowImageBandwidth) { + + var logoUrl; + + var logoHeight = 30; + if (item.ImageTags && item.ImageTags.Logo) { + + logoUrl = ApiClient.getScaledImageUrl(item.Id, { + type: "Logo", + index: 0, + height: logoHeight, + tag: item.ImageTags.Logo + }); + } + + if (logoUrl) { + headerHtml = ''; + $('.detailsMenuHeader', elem).addClass('detailsMenuHeaderWithLogo'); + } + } + + $('h3', elem).html(headerHtml); + + var contentHtml = ''; + + var miscInfo = LibraryBrowser.getMiscInfoHtml(item); + if (miscInfo) { + + contentHtml += '

' + miscInfo + '

'; + } + + var userData = LibraryBrowser.getUserDataIconsHtml(item); + if (userData) { + + contentHtml += '

' + userData + '

'; + } + + var ratingHtml = LibraryBrowser.getRatingHtml(item); + if (ratingHtml) { + + contentHtml += '

' + ratingHtml + '

'; + } + + if (item.Overview) { + contentHtml += '

' + item.Overview + '

'; + } + + contentHtml += '
'; + + if (MediaController.canPlay(item)) { + if (item.MediaType == 'Video' && !item.IsFolder && item.UserData && item.UserData.PlaybackPositionTicks) { + contentHtml += '
'; + contentHtml += ''; + contentHtml += ''; + contentHtml += '' + Globalize.translate('ButtonResume') + ''; + contentHtml += ''; + contentHtml += '
'; + } + + contentHtml += '
'; + contentHtml += ''; + contentHtml += ''; + contentHtml += '' + Globalize.translate('ButtonPlay') + ''; + contentHtml += ''; + contentHtml += '
'; + + } + + contentHtml += '
'; + contentHtml += ''; + contentHtml += ''; + contentHtml += '' + Globalize.translate('ButtonOpen') + ''; + contentHtml += ''; + contentHtml += '
'; + + if (SyncManager.isAvailable(item, user)) { + contentHtml += '
'; + contentHtml += ''; + contentHtml += ''; + contentHtml += '' + Globalize.translate('ButtonSync') + ''; + contentHtml += ''; + contentHtml += '
'; + } + + contentHtml += '
'; + + $('.detailsMenuContentInner', elem).html(contentHtml).trigger('create'); + + $('.btnSync', elem).on('click', function () { + + elem.popup('close'); + + SyncManager.showMenu({ + items: [item] + }); + }); + + $('.btnPlay', elem).on('click', function () { + + elem.popup('close'); + + MediaController.play({ + items: [item] + }); + }); + + $('.btnResume', elem).on('click', function () { + + elem.popup('close'); + + MediaController.play({ + items: [item], + startPositionTicks: item.UserData.PlaybackPositionTicks + }); + }); + }); + } + + function showItemsOverlay(options) { + + var context = options.context; + + var elem = getItemsOverlay(options.ids, context); + + setItemIntoOverlay(elem, 0); + } + + function onCardClick() { + + var info = LibraryBrowser.getListItemInfo(this); + var itemId = info.id; + var context = info.context; + + var card = $(this); + + if (card.hasClass('itemWithAction')) { + return; + } + + if (!card.hasClass('card')) { + card = $(card).parents('.card'); + } + + if (card.hasClass('groupedCard')) { + return; + } + + if (card.attr('data-detailsmenu') != 'true') { + return; + } + + showItemsOverlay({ + ids: [itemId], + context: context + }); + + return false; + } + + $.fn.createCardMenus = function (options) { var preventHover = false; @@ -643,8 +865,7 @@ preventHover = true; } - return this - .off('.cardMenu') + this.off('.cardMenu') .on('contextmenu.cardMenu', '.card', onCardTapHold) .off('.latestgroupings') .on('click.latestgroupings', '.groupedCard', onGroupedCardClick) @@ -654,6 +875,10 @@ .on('mouseenter.cardHoverMenu', '.card:not(.bannerCard)', onHoverIn) .on('mouseleave.cardHoverMenu', '.card:not(.bannerCard)', onHoverOut) .on("touchstart.cardHoverMenu", '.card:not(.bannerCard)', preventTouchHover); + + this.off('.mediaDetails').on('click.mediaDetails', '.mediaItem', onCardClick); + + return this; }; function toggleSelections(page) { diff --git a/dashboard-ui/scripts/movies.js b/dashboard-ui/scripts/movies.js index 061dbbf97a..fc0a973ee5 100644 --- a/dashboard-ui/scripts/movies.js +++ b/dashboard-ui/scripts/movies.js @@ -64,7 +64,8 @@ preferThumb: true, context: 'movies', lazy: true, - overlayText: true + overlayText: true, + showDetailsMenu: true }); } else if (view == "ThumbCard") { @@ -77,7 +78,8 @@ lazy: true, showTitle: true, cardLayout: true, - showYear: true + showYear: true, + showDetailsMenu: true }); } else if (view == "Banner") { @@ -87,7 +89,8 @@ shape: "banner", preferBanner: true, context: 'movies', - lazy: true + lazy: true, + showDetailsMenu: true }); } else if (view == "List") { @@ -106,7 +109,8 @@ context: 'movies', centerText: true, lazy: true, - overlayText: true + overlayText: true, + showDetailsMenu: true }); } else if (view == "PosterCard") { @@ -117,7 +121,8 @@ showTitle: true, showYear: true, lazy: true, - cardLayout: true + cardLayout: true, + showDetailsMenu: true }); } else if (view == "Timeline") { @@ -128,7 +133,8 @@ showTitle: true, timeline: true, centerText: true, - lazy: true + lazy: true, + showDetailsMenu: true }); } diff --git a/dashboard-ui/scripts/moviesrecommended.js b/dashboard-ui/scripts/moviesrecommended.js index b18e2271b9..188687b844 100644 --- a/dashboard-ui/scripts/moviesrecommended.js +++ b/dashboard-ui/scripts/moviesrecommended.js @@ -49,7 +49,8 @@ overlayText: false, showTitle: true, showYear: true, - cardLayout: true + cardLayout: true, + showDetailsMenu: true }); @@ -107,7 +108,8 @@ showTitle: true, showYear: true, lazy: true, - cardLayout: true + cardLayout: true, + showDetailsMenu: true }); @@ -119,7 +121,8 @@ shape: 'backdrop', overlayText: true, showTitle: true, - lazy: true + lazy: true, + showDetailsMenu: true }); } @@ -167,7 +170,8 @@ overlayText: false, showTitle: true, showYear: true, - cardLayout: true + cardLayout: true, + showDetailsMenu: true }); @@ -178,7 +182,8 @@ shape: "portrait", centerText: true, lazy: true, - overlayText: true + overlayText: true, + showDetailsMenu: true }); } html += ''; diff --git a/dashboard-ui/scripts/movietrailers.js b/dashboard-ui/scripts/movietrailers.js index 9b8925dd5b..7ca1669682 100644 --- a/dashboard-ui/scripts/movietrailers.js +++ b/dashboard-ui/scripts/movietrailers.js @@ -57,7 +57,8 @@ showTitle: true, showYear: true, lazy: true, - cardLayout: true + cardLayout: true, + showDetailsMenu: true }); var elem = $('.itemsContainer', page).html(html).lazyChildren(); diff --git a/dashboard-ui/scripts/musicvideos.js b/dashboard-ui/scripts/musicvideos.js index 5bc0fd34f6..6b0e924f5e 100644 --- a/dashboard-ui/scripts/musicvideos.js +++ b/dashboard-ui/scripts/musicvideos.js @@ -52,7 +52,8 @@ context: 'music', showTitle: true, lazy: true, - centerText: true + centerText: true, + showDetailsMenu: true }); } else if (view == "PosterCard") { @@ -65,7 +66,8 @@ centerText: true, cardLayout: true, lazy: true, - showParentTitle: true + showParentTitle: true, + showDetailsMenu: true }); } diff --git a/dashboard-ui/scripts/site.js b/dashboard-ui/scripts/site.js index d95dacf6f4..8beaa908ab 100644 --- a/dashboard-ui/scripts/site.js +++ b/dashboard-ui/scripts/site.js @@ -1367,10 +1367,10 @@ var Dashboard = { if (AppInfo.hasLowImageBandwidth) { - quality -= 20; + quality -= 50; if (isBackdrop) { - quality -= 20; + //quality -= 20; } } @@ -1816,12 +1816,14 @@ $(document).on('pagecreate', ".page", function () { if (current && current != newTheme) { page.page("option", "theme", newTheme); } + + current = newTheme; } if (current == 'b') { $(document.body).addClass('darkScrollbars'); } else { - $(document.body).addClass('removeScrollbars'); + $(document.body).removeClass('darkScrollbars'); } }).on('pageinit', ".page", function () { @@ -1831,7 +1833,7 @@ $(document).on('pagecreate', ".page", function () { var require = this.getAttribute('data-require'); if (require) { - requirejs([require], function() { + requirejs([require], function () { $(page).trigger('pageinitdepends'); }); diff --git a/dashboard-ui/scripts/tvrecommended.js b/dashboard-ui/scripts/tvrecommended.js index 3ac9576690..8bbaf76ec5 100644 --- a/dashboard-ui/scripts/tvrecommended.js +++ b/dashboard-ui/scripts/tvrecommended.js @@ -81,7 +81,8 @@ showParentTitle: true, lazy: true, cardLayout: true, - context: 'tv' + context: 'tv', + showDetailsMenu: true }); } else if (view == 'Thumb') { @@ -94,7 +95,8 @@ overlayText: false, context: context, lazy: true, - preferThumb: true + preferThumb: true, + showDetailsMenu: true }); } @@ -149,7 +151,8 @@ showParentTitle: true, lazy: true, cardLayout: true, - context: 'tv' + context: 'tv', + showDetailsMenu: true }); } else if (view == 'Poster') { @@ -161,7 +164,8 @@ showParentTitle: true, overlayText: screenWidth >= 800 && !AppInfo.hasLowImageBandwidth, lazy: true, - context: 'tv' + context: 'tv', + showDetailsMenu: true }); } diff --git a/dashboard-ui/scripts/tvupcoming.js b/dashboard-ui/scripts/tvupcoming.js index 6c72645f8d..1ff08fa913 100644 --- a/dashboard-ui/scripts/tvupcoming.js +++ b/dashboard-ui/scripts/tvupcoming.js @@ -52,6 +52,7 @@ preferThumb: true, context: context || 'home-upcoming', lazy: true, + showDetailsMenu: true })).lazyChildren(); }); diff --git a/dashboard-ui/thirdparty/jquery.unveil-custom.js b/dashboard-ui/thirdparty/jquery.unveil-custom.js index 0c361d04b9..78d46042f6 100644 --- a/dashboard-ui/thirdparty/jquery.unveil-custom.js +++ b/dashboard-ui/thirdparty/jquery.unveil-custom.js @@ -309,7 +309,6 @@ setImageIntoElement(elem, localUrl); }).fail(onFail); - }; } @@ -458,245 +457,6 @@ }; } - function indexedDbWebpImageStore() { - - var self = this; - - openDb().done(function (db) { - - self._db = db; - window.ImageStore = self; - }); - - self.addImageToDatabase = function (blob, key) { - - console.log("addImageToDatabase"); - - // Open a transaction to the database - var transaction = self.db().transaction([imagesStoreName], "readwrite"); - - // Put the blob into the dabase - var put = transaction.objectStore(imagesStoreName).put(blob, key); - }; - - self.db = function () { - - return self._db; - }; - - self.get = function (key) { - - var deferred = DeferredBuilder.Deferred(); - - var transaction = self.db().transaction([imagesStoreName], "readonly"); - - // Open a transaction to the database - var getRequest = transaction.objectStore(imagesStoreName).get(key); - - getRequest.onsuccess = function (event) { - - var imgFile = event.target.result; - - if (imgFile) { - deferred.resolveWith(null, [imgFile]); - } else { - deferred.reject(); - } - }; - - getRequest.onerror = function () { - deferred.reject(); - }; - - return deferred.promise(); - }; - - self.getImageUrl = function (originalUrl) { - - console.log('getImageUrl:' + originalUrl); - - var key = CryptoJS.SHA1(originalUrl).toString(); - - var deferred = DeferredBuilder.Deferred(); - - self.get(key).done(function (url) { - - deferred.resolveWith(null, [url]); - - }).fail(function () { - - self.downloadImage(originalUrl, key).done(function () { - self.get(key).done(function (url) { - - deferred.resolveWith(null, [url]); - - }).fail(function () { - - deferred.reject(); - }); - }).fail(function () { - - deferred.reject(); - }); - }); - - return deferred.promise(); - }; - - self.downloadImage = function (url, key) { - - var deferred = DeferredBuilder.Deferred(); - - console.log('downloadImage:' + url); - - // Create XHR - var xhr = new XMLHttpRequest(); - - xhr.open("GET", url, true); - // Set the responseType to blob - xhr.responseType = "arraybuffer"; - - xhr.addEventListener("load", function () { - - if (xhr.status === 200) { - console.log("Image retrieved"); - - try { - - - self.addImageToDatabase(this.response, key); - deferred.resolve(); - } catch (err) { - console.log("Error adding image to database"); - deferred.reject(); - } - } else { - deferred.reject(); - } - }, false); - - // Send XHR - xhr.send(); - return deferred.promise(); - }; - - function decode(data, elem) { - - console.log('decoding webp'); - - var WebPImage = { width: { value: 0 }, height: { value: 0 } } - var decoder = new WebPDecoder(); - - //Config, you can set all arguments or what you need, nothing no objeect - var config = decoder.WebPDecoderConfig; - var output_buffer = config.j; - var bitstream = config.input; - - if (!decoder.WebPInitDecoderConfig(config)) { - throw new Error("Library version mismatch!\n"); - } - - var StatusCode = decoder.VP8StatusCode; - - var status = decoder.WebPGetFeatures(data, data.length, bitstream); - if (status != 0) { - console.log('error'); - } - - var mode = decoder.WEBP_CSP_MODE; - output_buffer.J = 4; - - status = decoder.WebPDecode(data, data.length, config); - - var ok = (status == 0); - if (!ok) { - throw new Error("Decoding of %s failed.\n"); - } - - drawIntoElement(output_buffer, elem); - } - - function drawIntoElement(output_buffer, elem) { - - console.log('drawing canvas'); - - var bitmap = output_buffer.c.RGBA.ma; - - var canvas = document.createElement("canvas"); - - var biHeight = output_buffer.height; var biWidth = output_buffer.width; - - canvas.height = biHeight; - canvas.width = biWidth; - - var context = canvas.getContext('2d'); - var output = context.createImageData(canvas.width, canvas.height); - var outputData = output.data; - - for (var h = 0; h < biHeight; h++) { - for (var w = 0; w < biWidth; w++) { - outputData[0 + w * 4 + (biWidth * 4) * h] = bitmap[1 + w * 4 + (biWidth * 4) * h]; - outputData[1 + w * 4 + (biWidth * 4) * h] = bitmap[2 + w * 4 + (biWidth * 4) * h]; - outputData[2 + w * 4 + (biWidth * 4) * h] = bitmap[3 + w * 4 + (biWidth * 4) * h]; - outputData[3 + w * 4 + (biWidth * 4) * h] = bitmap[0 + w * 4 + (biWidth * 4) * h]; - - }; - } - - context.putImageData(output, 0, 0); - - elem.appendChild(canvas); - } - - self.setImageInto = function (elem, url) { - - if (url.indexOf('format=webp') == -1 || elem.tagName != 'DIV') { - - setImageIntoElement(elem, url); - return; - } - - // Create XHR - var xhr = new XMLHttpRequest(); - - xhr.open("GET", url, true); - // Set the responseType to blob - xhr.responseType = "arraybuffer"; - - xhr.addEventListener("load", function () { - - if (xhr.status === 200) { - console.log("Image retrieved"); - - try { - - var arr = new Uint8Array(this.response); - - //// Convert the int array to a binary string - //// We have to use apply() as we are converting an *array* - //// and String.fromCharCode() takes one or more single values, not - //// an array. - //var raw = String.fromCharCode.apply(null, arr); - - //// This works!!! - //var b64 = btoa(raw); - //var dataURL = "data:image/jpeg;base64," + b64; - - console.log(url); - decode(arr, elem); - - } catch (err) { - console.log("Error adding image to database"); - } - } else { - } - }, false); - - // Send XHR - xhr.send(); - }; - } - function simpleImageStore() { var self = this;