diff options
author | Cory Fields <theuni-nospam-@xbmc.org> | 2011-01-04 12:39:23 -0500 |
---|---|---|
committer | Cory Fields <theuni-nospam-@xbmc.org> | 2011-01-04 12:39:23 -0500 |
commit | a9839fa95cb9711efe465ca8e137c34247238485 (patch) | |
tree | 0bb8dc55aa317c9cc9191ea85e8298c2da90b06b /addons/webinterface.default/js/MediaLibrary.js | |
parent | 07db21c48d60933b45c702d333572ed8f4629fdc (diff) |
Fix CRLF
Diffstat (limited to 'addons/webinterface.default/js/MediaLibrary.js')
-rw-r--r-- | addons/webinterface.default/js/MediaLibrary.js | 1114 |
1 files changed, 557 insertions, 557 deletions
diff --git a/addons/webinterface.default/js/MediaLibrary.js b/addons/webinterface.default/js/MediaLibrary.js index df8e533810..f26159e6a2 100644 --- a/addons/webinterface.default/js/MediaLibrary.js +++ b/addons/webinterface.default/js/MediaLibrary.js @@ -1,558 +1,558 @@ -/*
- * Copyright (C) 2005-2010 Team XBMC
- * http://www.xbmc.org
- *
- * This Program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This Program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with XBMC; see the file COPYING. If not, write to
- * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- */
-
-var MediaLibrary = function() {
- this.init();
- return true;
- }
-
-MediaLibrary.prototype = {
- init: function() {
- this.bindControls();
- },
- bindControls: function() {
- $('#musicLibrary').click(jQuery.proxy(this.musicLibraryOpen, this));
- $('#movieLibrary').click(jQuery.proxy(this.movieLibraryOpen, this));
- $('#tvshowLibrary').click(jQuery.proxy(this.tvshowLibraryOpen, this));
- $('#pictureLibrary').click(jQuery.proxy(this.pictureLibraryOpen, this));
- $('#overlay').click(jQuery.proxy(this.hideOverlay, this));
- $(window).resize(jQuery.proxy(this.updatePlayButtonLocation, this));
- },
- resetPage: function() {
- $('#musicLibrary').removeClass('selected');
- $('#movieLibrary').removeClass('selected');
- $('#tvshowLibrary').removeClass('selected');
- $('#pictureLibrary').removeClass('selected');
- this.hideOverlay();
- },
- musicLibraryOpen: function(event) {
- this.resetPage();
- $('#musicLibrary').addClass('selected');
- $('.contentContainer').hide();
- var libraryContainer = $('#libraryContainer');
- if (!libraryContainer || libraryContainer.length == 0) {
- $('#spinner').show();
- libraryContainer = $('<div>');
- libraryContainer.attr('id', 'libraryContainer')
- .addClass('contentContainer');
- $('#content').append(libraryContainer);
- jQuery.post(JSON_RPC + '?GetAlbums', '{"jsonrpc": "2.0", "method": "AudioLibrary.GetAlbums", "params": { "start": 0, "fields": ["album_description", "album_theme", "album_mood", "album_style", "album_type", "album_label", "album_artist", "album_genre", "album_rating", "album_title"] }, "id": 1}', jQuery.proxy(function(data) {
- if (data && data.result && data.result.albums) {
- this.albumList = data.result.albums;
- this.albumList.sort(jQuery.proxy(this.albumArtistSorter, this));
- $.each($(this.albumList), jQuery.proxy(function(i, item) {
- var floatableAlbum = this.generateThumb('album', item.thumbnail, item.album_title, item.album_artist);
- floatableAlbum.bind('click', { album: item }, jQuery.proxy(this.displayAlbumDetails, this));
- libraryContainer.append(floatableAlbum);
- }, this));
- libraryContainer.append($('<div>').addClass('footerPadding'));
- $('#spinner').hide();
- //$('#libraryContainer img').lazyload();
- libraryContainer.bind('scroll', { activeLibrary: libraryContainer }, jQuery.proxy(this.updateScrollEffects, this));
- libraryContainer.trigger('scroll');
- myScroll = new iScroll('libraryContainer');
- } else {
- libraryContainer.html('');
- }
- }, this), 'json');
- } else {
- libraryContainer.show();
- libraryContainer.trigger('scroll');
- }
- },
- getThumbnailPath: function(thumbnail) {
- return thumbnail ? ('/vfs/' + thumbnail) : DEFAULT_ALBUM_COVER;
- },
- generateThumb: function(type, thumbnail, album_title, album_artist) {
- var floatableAlbum = $('<div>');
- var path = this.getThumbnailPath(thumbnail);
- var title = album_title||'';
- var artist = album_artist||'';
- if (title.length > 18 && !(title.length <= 21)) {
- title = album_title.substring(0, 18) + '...';
- }
- if (artist.length > 20 && !(artist.length <= 22)) {
- artist = album_artist.substring(0, 20) + '...';
- }
- var className = '';
- var code = '';
- switch(type) {
- case 'album':
- className = 'floatableAlbum';
- code = '<p class="album" title="' + album_title + '">' + title + '</p><p class="artist" title="' + album_artist + '">' + artist + '</p>';
- break;
- case 'movie':
- className = 'floatableMovieCover';
- code = '<p class="album" title="' + album_title + '">' + title + '</p>';
- break;
- case 'tvshow':
- className = 'floatableTVShowCover';
- break;
- case 'image':
- case 'directory':
- className = 'floatableAlbum';
- code = '<p class="album" title="' + album_title + '">' + title + '</p>';
- break;
- }
- return floatableAlbum.addClass(className).html('<div class="imgWrapper"><div class="inner"><img src="' + path + '" alt="" /></div></div>' + code);
- },
- showAlbumSelectorBlock: function(album) {
- if (album) {
- //Find album in stored array
- var prevAlbum = null,
- nextAlbum = null;
- $.each($(this.albumList), jQuery.proxy(function(i, item) {
- if (item.albumid == album.albumid) {
- if (this.albumList.length > 1) {
- prevAlbum = this.albumList[i <= 0 ? this.albumList.length-1 : i-1];
- nextAlbum = this.albumList[i >= this.albumList.length ? 0 : i+1];
- }
- return false; /* .each break */
- }
- }, this));
- var albumSelectorBlock = $('#albumSelector');
- if (!albumSelectorBlock || albumSelectorBlock.length == 0) {
- albumSelectorBlock = $('<div>');
- albumSelectorBlock.attr('id', 'albumSelector')
- .html('<table><tr><td class="allAlbums">All Albums</td><td class="activeAlbumTitle"></td><td class="prevAlbum"> </td><td class="nextAlbum"> </td></tr></table>');
- $('#content').prepend(albumSelectorBlock);
- $('#albumSelector .allAlbums').bind('click', jQuery.proxy(this.hideAlbumDetails, this));
- }
- $('#albumSelector .prevAlbum').unbind();
- $('#albumSelector .nextAlbum').unbind();
- if (prevAlbum) {
- $('#albumSelector .prevAlbum').bind('click', {album: prevAlbum}, jQuery.proxy(this.displayAlbumDetails, this));
- }
- if (nextAlbum) {
- $('#albumSelector .nextAlbum').bind('click', {album: nextAlbum}, jQuery.proxy(this.displayAlbumDetails, this));
- }
- $('#albumSelector .activeAlbumTitle').html(album.album_title||'Unknown Album');
- albumSelectorBlock.show();
- }
- },
- hideAlbumDetails: function() {
- $('.contentContainer').hide();
- this.musicLibraryOpen();
- },
- displayAlbumDetails: function(event) {
- this.showAlbumSelectorBlock(event.data.album);
- var albumDetailsContainer = $('#albumDetails' + event.data.album.albumid);
- $('#topScrollFade').hide();
- if (!albumDetailsContainer || albumDetailsContainer.length == 0) {
- $('#spinner').show();
- jQuery.post(JSON_RPC + '?GetSongs', '{"jsonrpc": "2.0", "method": "AudioLibrary.GetSongs", "params": { "fields": ["title", "artist", "genre", "tracknumber", "discnumber", "duration", "year"], "albumid" : ' + event.data.album.albumid + ' }, "id": 1}', jQuery.proxy(function(data) {
- albumDetailsContainer = $('<div>');
- albumDetailsContainer.attr('id', 'albumDetails' + event.data.album.albumid)
- .addClass('contentContainer')
- .addClass('albumContainer')
- .html('<table class="albumView"><thead><tr class="headerRow"><th>Artwork</th><th> </th><th>Name</th><th class="time">Time</th><th>Artist</th><th>Genre</th></tr></thead><tbody class="resultSet"></tbody></table>');
- $('.contentContainer').hide();
- $('#content').append(albumDetailsContainer);
- var albumThumbnail = event.data.album.thumbnail;
- var albumTitle = event.data.album.album_title||'Unknown Album';
- var albumArtist = event.data.album.album_artist||'Unknown Artist';
- var trackCount = data.result.total;
- $.each($(data.result.songs), jQuery.proxy(function(i, item) {
- if (i == 0) {
- var trackRow = $('<tr>').addClass('trackRow').addClass('tr' + i % 2);
- trackRow.append($('<td>').attr('rowspan', ++trackCount + 1).addClass('albumThumb'));
- for (var a = 0; a < 5; a++) {
- trackRow.append($('<td>').html(' ').attr('style', 'display: none'));
- }
- $('#albumDetails' + event.data.album.albumid + ' .resultSet').append(trackRow);
- }
- var trackRow = $('<tr>').addClass('trackRow').addClass('tr' + i % 2);
- var trackNumberTD = $('<td>')
- .html(item.tracknumber)
- .bind('click', { song: item, album: event.data.album }, jQuery.proxy(this.playTrack, this));
- trackRow.append(trackNumberTD);
- var trackTitleTD = $('<td>')
- .html(item.title)
- .bind('click', { song: item, album: event.data.album }, jQuery.proxy(this.playTrack, this));
- trackRow.append(trackTitleTD);
- var trackDurationTD = $('<td>')
- .addClass('time')
- .html(durationToString(item.duration))
- .bind('click', { song: item, album: event.data.album }, jQuery.proxy(this.playTrack, this));
- trackRow.append(trackDurationTD);
- var trackArtistTD = $('<td>')
- .html(item.artist)
- .bind('click', { song: item, album: event.data.album }, jQuery.proxy(this.playTrack, this));
- trackRow.append(trackArtistTD);
- var trackGenreTD = $('<td>')
- .html(item.genre)
- .bind('click', { song: item, album: event.data.album }, jQuery.proxy(this.playTrack, this));
- trackRow.append(trackGenreTD);
- $('#albumDetails' + event.data.album.albumid + ' .resultSet').append(trackRow);
- }, this));
- if (trackCount > 0) {
- var trackRow = $('<tr>').addClass('fillerTrackRow');
- for (var i = 0; i < 5; i++) {
- trackRow.append($('<td>').html(' '));
- }
- $('#albumDetails' + event.data.album.albumid + ' .resultSet').append(trackRow);
-
- var trackRow2 = $('<tr>').addClass('fillerTrackRow2');
- trackRow2.append($('<td>').addClass('albumBG').html(' '));
- for (var i = 0; i < 5; i++) {
- trackRow2.append($('<td>').html(' '));
- }
- $('#albumDetails' + event.data.album.albumid + ' .resultSet').append(trackRow2);
- }
- $('#albumDetails' + event.data.album.albumid + ' .albumThumb')
- .append(this.generateThumb('album', albumThumbnail, albumTitle, albumArtist))
- .append($('<div>').addClass('footerPadding'));
- $('#spinner').hide();
- myScroll = new iScroll('albumDetails' + event.data.album.albumid);
- }, this), 'json');
- } else {
- $('.contentContainer').hide();
- $('#albumDetails' + event.data.album.albumid).show();
- }
- },
- displayTVShowDetails: function(event) {
- var tvshowDetailsContainer = $('#tvShowDetails' + event.data.tvshow.tvshowid);
- $('#topScrollFade').hide();
- if (!tvshowDetailsContainer || tvshowDetailsContainer.length == 0) {
- $('#spinner').show();
- jQuery.post(JSON_RPC + '?GetTVShowSeasons', '{"jsonrpc": "2.0", "method": "VideoLibrary.GetSeasons", "params": { "fields": ["genre", "director", "trailer", "tagline", "plot", "plotoutline", "title", "originaltitle", "lastplayed", "showtitle", "firstaired", "duration", "season", "episode", "runtime", "year", "playcount", "rating", "writer", "studio", "mpaa", "premiered"], "tvshowid" : ' + event.data.tvshow.tvshowid + ' }, "id": 1}', jQuery.proxy(function(data) {
- tvshowDetailsContainer = $('<div>');
- tvshowDetailsContainer.attr('id', 'tvShowDetails' + event.data.tvshow.tvshowid)
- .css('display', 'none')
- .addClass('contentContainer')
- .addClass('tvshowContainer');
- tvshowDetailsContainer.append(this.generateThumb('tvshow', event.data.tvshow.thumbnail, event.data.tvshow.title));
- if (data && data.result && data.result.seasons && data.result.seasons.length > 0) {
- var absWrapper = $('<div>').addClass('showDetailsWrapper');
- var showDetails = $('<div>').addClass('showDetails');
- showDetails.append($('<p>').html(data.result.seasons[0].showtitle).addClass('showTitle'));
- showDetails.append($('<p>').html('<span class="heading">Genre:</span> ' + data.result.seasons[0].genre));
- showDetails.append($('<p>').html('<span class="heading">Studio:</span> ' + data.result.seasons[0].studio));
- absWrapper.append(showDetails);
- var seasonSelectionContainer = $('<div>').addClass('seasonPicker');
- var seasonSelectionList = $('<ul>');
- var episodeCount = 0;
- var firstSeason;
- $.each($(data.result.seasons), jQuery.proxy(function(i, item) {
- episodeCount += item.episode;
- var season = $('<li>').html(item.title);
- if (i == 0) {
- season.addClass('activeSeason');
- firstSeason = season;
- this.tvActiveShowContainer = tvshowDetailsContainer;
- }
- season.bind('click', {tvshow: event.data.tvshow.tvshowid, season: item, element: season}, jQuery.proxy(this.displaySeasonListings, this));
- seasonSelectionList.append(season);
- }, this));
- showDetails.append($('<p>').html('<span class="heading">Episodes:</span> ' + episodeCount));
- seasonSelectionContainer.append(seasonSelectionList);
- absWrapper.append(seasonSelectionContainer);
- tvshowDetailsContainer.append(absWrapper);
- if (firstSeason) {
- firstSeason.trigger('click');
- }
- $('#content').append(tvshowDetailsContainer);
- tvshowDetailsContainer.fadeIn();
- }
- $('#spinner').hide();
- }, this), 'json');
- } else {
- $('.contentContainer').hide();
- $('#tvShowDetails' + event.data.show.showid);
- }
- },
- displaySeasonListings: function(event) {
- if (event.data.element != this.tvActiveSeason) {
- //Remove style from old season.
- if (this.tvActiveSeason) {
- $(this.tvActiveSeason).removeClass('activeSeason');
- }
- //Hide old listings
- var oldListings = $('.episodeListingsContainer', this.tvActiveShowContainer).fadeOut();
- //Update ActiveSeason
- this.tvActiveSeason = event.data.element;
- $(this.tvActiveSeason).addClass('activeSeason');
- //Populate new listings
- jQuery.post(JSON_RPC + '?GetTVSeasonEpisodes', '{"jsonrpc": "2.0", "method": "VideoLibrary.GetEpisodes", "params": { "fields": ["genre", "director", "trailer", "tagline", "plot", "plotoutline", "title", "originaltitle", "lastplayed", "showtitle", "firstaired", "duration", "season", "episode", "runtime", "year", "playcount", "rating", "writer", "studio", "mpaa", "premiered"], "season" : ' + event.data.season.season + ', "tvshowid" : ' + event.data.tvshow + ' }, "id": 1}', jQuery.proxy(function(data) {
- var episodeListingsContainer = $('<div>').addClass('episodeListingsContainer');
- var list = $('<ul>');
- $.each($(data.result.episodes), jQuery.proxy(function(i, item) {
- var episodePicture = $('<img>');
- episodePicture.attr('src', this.getThumbnailPath(item.thumbnail));
- var episodeTitle = $('<p>').html(item.title);
- var episode = $('<li>').append(episodePicture).append(episodeTitle);
- list.append(episode);
- }, this));
- episodeListingsContainer.append(list);
- $(this.tvActiveShowContainer).prepend(episodeListingsContainer);
- }, this), 'json');
- }
- },
- hideOverlay: function(event) {
- if (this.activeCover) {
- $(this.activeCover).remove();
- this.activeCover = null;
- }
- $('#overlay').hide();
- },
- updatePlayButtonLocation: function(event) {
- var movieContainer = $('.movieCover');
- if (movieContainer.length > 0) {
- var playIcon = $('.playIcon');
- if (playIcon.length > 0) {
- playIcon.width($(movieContainer[0]).width());
- playIcon.height($(movieContainer[0]).height());
- }
- }
- },
- playMovie: function(event) {
- jQuery.post(JSON_RPC + '?PlayMovie', '{"jsonrpc": "2.0", "method": "XBMC.Play", "params": { "movieid": ' + event.data.movie.movieid + ' }, "id": 1}', jQuery.proxy(function(data) {
- this.hideOverlay();
- }, this), 'json');
- },
- displayMovieDetails: function(event) {
- var movieDetails = $('<div>').attr('id', 'movie-' + event.data.movie.movieid).addClass('moviePopoverContainer');
- movieDetails.append($('<img>').attr('src', '/images/close-button.png').addClass('closeButton').bind('click', jQuery.proxy(this.hideOverlay, this)));
- movieDetails.append($('<img>').attr('src', this.getThumbnailPath(event.data.movie.thumbnail)).addClass('movieCover'));
- movieDetails.append($('<div>').addClass('playIcon').bind('click', {movie: event.data.movie}, jQuery.proxy(this.playMovie, this)));
- var movieTitle = $('<p>').addClass('movieTitle');
- var yearText = event.data.movie.year ? ' <span class="year">(' + event.data.movie.year + ')</span>' : '';
- movieTitle.html(event.data.movie.title + yearText);
- movieDetails.append(movieTitle);
- if (event.data.movie.runtime) {
- movieDetails.append($('<p>').addClass('runtime').html('<strong>Runtime:</strong> ' + event.data.movie.runtime + ' minutes'));
- }
- if (event.data.movie.plot) {
- movieDetails.append($('<p>').addClass('plot').html(event.data.movie.plot));
- }
- if (event.data.movie.genre) {
- movieDetails.append($('<p>').addClass('genre').html('<strong>Genre:</strong> ' + event.data.movie.genre));
- }
- if (event.data.movie.rating) {
- //Todo
- }
- if (event.data.movie.director) {
- movieDetails.append($('<p>').addClass('director').html('<strong>Directed By:</strong> ' + event.data.movie.director));
- }
- this.activeCover = movieDetails;
- $('body').append(movieDetails);
- $('#overlay').show();
- this.updatePlayButtonLocation();
- },
- playTrack: function(event) {
- jQuery.post(JSON_RPC + '?ClearPlaylist', '{"jsonrpc": "2.0", "method": "AudioPlaylist.Clear", "id": 1}', jQuery.proxy(function(data) {
- //check that clear worked.
- jQuery.post(JSON_RPC + '?AddAlbumToPlaylist', '{"jsonrpc": "2.0", "method": "AudioPlaylist.Add", "params": { "albumid": ' + event.data.album.albumid + ' }, "id": 1}', jQuery.proxy(function(data) {
- //play specific song in playlist
- jQuery.post(JSON_RPC + '?PlaylistItemPlay', '{"jsonrpc": "2.0", "method": "AudioPlaylist.Play", "params": { "songid": ' + event.data.song.songid + ' }, "id": 1}', function() {}, 'json');
- }, this), 'json');
- }, this), 'json');
- },
- movieLibraryOpen: function() {
- this.resetPage();
- $('#movieLibrary').addClass('selected');
- $('.contentContainer').hide();
- var libraryContainer = $('#movieLibraryContainer');
- if (!libraryContainer || libraryContainer.length == 0) {
- $('#spinner').show();
- jQuery.post(JSON_RPC + '?GetMovies', '{"jsonrpc": "2.0", "method": "VideoLibrary.GetMovies", "params": { "start": 0, "fields": ["genre", "director", "trailer", "tagline", "plot", "plotoutline", "title", "originaltitle", "lastplayed", "showtitle", "firstaired", "duration", "season", "episode", "runtime", "year", "playcount", "rating"] }, "id": 1}', jQuery.proxy(function(data) {
- if (data && data.result && data.result.movies) {
- libraryContainer = $('<div>');
- libraryContainer.attr('id', 'movieLibraryContainer')
- .addClass('contentContainer');
- $('#content').append(libraryContainer);
- } else {
- libraryContainer.html('');
- }
- data.result.movies.sort(jQuery.proxy(this.movieTitleSorter, this));
- $.each($(data.result.movies), jQuery.proxy(function(i, item) {
- var floatableMovieCover = this.generateThumb('movie', item.thumbnail, item.title);
- floatableMovieCover.bind('click', { movie: item }, jQuery.proxy(this.displayMovieDetails, this));
- libraryContainer.append(floatableMovieCover);
- }, this));
- libraryContainer.append($('<div>').addClass('footerPadding'));
- $('#spinner').hide();
- libraryContainer.bind('scroll', { activeLibrary: libraryContainer }, jQuery.proxy(this.updateScrollEffects, this));
- libraryContainer.trigger('scroll');
- //$('#libraryContainer img').lazyload();
- myScroll = new iScroll('movieLibraryContainer');
- }, this), 'json');
- } else {
- libraryContainer.show();
- libraryContainer.trigger('scroll');
- }
- },
- tvshowLibraryOpen: function() {
- this.resetPage();
- $('#tvshowLibrary').addClass('selected');
- $('.contentContainer').hide();
- var libraryContainer = $('#tvshowLibraryContainer');
- if (!libraryContainer || libraryContainer.length == 0) {
- $('#spinner').show();
- jQuery.post(JSON_RPC + '?GetTVShows', '{"jsonrpc": "2.0", "method": "VideoLibrary.GetTVShows", "params": { "start": 0, "fields": ["genre", "director", "trailer", "tagline", "plot", "plotoutline", "title", "originaltitle", "lastplayed", "showtitle", "firstaired", "duration", "season", "episode", "runtime", "year", "playcount", "rating"] }, "id": 1}', jQuery.proxy(function(data) {
- if (data && data.result && data.result.tvshows) {
- libraryContainer = $('<div>');
- libraryContainer.attr('id', 'tvshowLibraryContainer')
- .addClass('contentContainer');
- $('#content').append(libraryContainer);
- } else {
- libraryContainer.html('');
- }
- $.each($(data.result.tvshows), jQuery.proxy(function(i, item) {
- var floatableTVShowCover = this.generateThumb('tvshow', item.thumbnail, item.title);
- floatableTVShowCover.bind('click', { tvshow: item }, jQuery.proxy(this.displayTVShowDetails, this));
- libraryContainer.append(floatableTVShowCover);
- }, this));
- libraryContainer.append($('<div>').addClass('footerPadding'));
- //$('#libraryContainer img').lazyload();
- $('#spinner').hide();
- libraryContainer.bind('scroll', { activeLibrary: libraryContainer }, jQuery.proxy(this.updateScrollEffects, this));
- libraryContainer.trigger('scroll');
- myScroll = new iScroll('tvshowLibraryContainer');
- }, this), 'json');
- } else {
- libraryContainer.show();
- libraryContainer.trigger('scroll');
- }
- },
- updateScrollEffects: function(event) {
- if (event.data.activeLibrary && $(event.data.activeLibrary).scrollTop() > 0) {
- $('#topScrollFade').fadeIn();
- } else {
- $('#topScrollFade').fadeOut();
- }
- },
- albumArtistSorter: function(a, b) {
- var result = this.sortAlpha(a.album_artist, b.album_artist);
- if (result == 0) {
- return this.sortAlpha(a.album_title, b.album_title);
- }
- return result;
- },
- sortAlpha: function(aStr, bStr) {
- aStr = aStr.toLowerCase();
- bStr = bStr.toLowerCase();
- if (aStr < bStr) {
- return -1;
- }
- if (aStr > bStr) {
- return 1;
- }
- return 0;
- },
- movieTitleSorter: function(a, b) {
- return this.sortAlpha(a.title, b.title);
- },
- startSlideshow: function(event) {
- var directory = event.data.directory.file;
- jQuery.post(JSON_RPC + '?StartSlideshow', '{"jsonrpc": "2.0", "method": "XBMC.StartSlideshow", "params": { "recursive" : "true", "random":"true", "directory" : "' + directory + '" }, "id": 1}', null, 'json');
- },
- showDirectory: function(event) {
- var directory = event.data.directory.file;
- this.resetPage();
- $('#pictureLibrary').addClass('selected');
- $('.contentContainer').hide();
- var libraryContainer = $('#pictureLibraryDirContainer' + directory);
- if (!libraryContainer || libraryContainer.length == 0) {
- $('#spinner').show();
- jQuery.post(JSON_RPC + '?GetDirectory', '{"jsonrpc": "2.0", "method": "Files.GetDirectory", "params": { "media" : "pictures", "directory":"' + directory + '" }, "id": 1}', jQuery.proxy(function(data) {
- if (data && data.result && ( data.result.directories || data.result.files )) {
- libraryContainer = $('<div>');
- libraryContainer.attr('id', 'pictureLibraryDirContainer' + directory)
- .addClass('contentContainer');
- $('#content').append(libraryContainer);
- var breadcrumb = $('<div>');
- var seperator = '/';
- var item = '';
- var directoryArray = directory.split(seperator);
- jQuery.each(directoryArray, function(i,v) {
- if(v != '') {
- item += v + seperator;
- //tmp.bind('click', { directory: item }, jQuery.proxy(this.showDirectory, this));
- breadcrumb.append($('<div>').text(' > ' + v).css('float','left').addClass('breadcrumb'));
- }
- });
- libraryContainer.append(breadcrumb);
- libraryContainer.append($('<div>').css('clear','both'));
- if (data.result.directories) {
- $.each($(data.result.directories), jQuery.proxy(function(i, item) {
- var floatableShare = this.generateThumb('directory', item.thumbnail, item.label);
- floatableShare.bind('click', { directory: item }, jQuery.proxy(this.showDirectory, this));
- //var slideshow = $('<div">');
- //slideshow.html('<div>Slideshow</div>');
- //slideshow.bind('click', { directory: item }, jQuery.proxy(this.startSlideshow, this));
- //floatableShare.append(slideshow);
- libraryContainer.append(floatableShare);
- }, this));
- }
- if (data.result.files) {
- $.each($(data.result.files), jQuery.proxy(function(i, item) {
- var floatableImage = this.generateThumb('image', item.file, item.label);
- libraryContainer.append(floatableImage);
- }, this));
- }
- libraryContainer.append($('<div>').addClass('footerPadding'));
- } else {
- libraryContainer.html('');
- }
- $('#spinner').hide();
- libraryContainer.bind('scroll', { activeLibrary: libraryContainer }, jQuery.proxy(this.updateScrollEffects, this));
- libraryContainer.trigger('scroll');
- myScroll = new iScroll('#pictureLibraryDirContainer' + directory);
- }, this), 'json');
- } else {
- libraryContainer.show();
- libraryContainer.trigger('scroll');
- }
- },
- pictureLibraryOpen: function() {
- this.resetPage();
- $('#pictureLibrary').addClass('selected');
- $('.contentContainer').hide();
- var libraryContainer = $('#pictureLibraryContainer');
- if (!libraryContainer || libraryContainer.length == 0) {
- $('#spinner').show();
- jQuery.post(JSON_RPC + '?GetSources', '{"jsonrpc": "2.0", "method": "Files.GetSources", "params": { "media" : "pictures" }, "id": 1}', jQuery.proxy(function(data) {
- if (data && data.result && data.result.shares) {
- libraryContainer = $('<div>');
- libraryContainer.attr('id', 'pictureLibraryContainer')
- .addClass('contentContainer');
- $('#content').append(libraryContainer);
- } else {
- libraryContainer.html('');
- }
- $.each($(data.result.shares), jQuery.proxy(function(i, item) {
- var floatableShare = this.generateThumb('directory', item.thumbnail, item.label);
- floatableShare.bind('click', { directory: item }, jQuery.proxy(this.showDirectory, this));
- libraryContainer.append(floatableShare);
- }, this));
- libraryContainer.append($('<div>').addClass('footerPadding'));
- $('#spinner').hide();
- libraryContainer.bind('scroll', { activeLibrary: libraryContainer }, jQuery.proxy(this.updateScrollEffects, this));
- libraryContainer.trigger('scroll');
- myScroll = new iScroll('#pictureLibraryContainer');
- }, this), 'json');
- } else {
- libraryContainer.show();
- libraryContainer.trigger('scroll');
- }
- }
+/* + * Copyright (C) 2005-2010 Team XBMC + * http://www.xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, write to + * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + * http://www.gnu.org/copyleft/gpl.html + * + */ + +var MediaLibrary = function() { + this.init(); + return true; + } + +MediaLibrary.prototype = { + init: function() { + this.bindControls(); + }, + bindControls: function() { + $('#musicLibrary').click(jQuery.proxy(this.musicLibraryOpen, this)); + $('#movieLibrary').click(jQuery.proxy(this.movieLibraryOpen, this)); + $('#tvshowLibrary').click(jQuery.proxy(this.tvshowLibraryOpen, this)); + $('#pictureLibrary').click(jQuery.proxy(this.pictureLibraryOpen, this)); + $('#overlay').click(jQuery.proxy(this.hideOverlay, this)); + $(window).resize(jQuery.proxy(this.updatePlayButtonLocation, this)); + }, + resetPage: function() { + $('#musicLibrary').removeClass('selected'); + $('#movieLibrary').removeClass('selected'); + $('#tvshowLibrary').removeClass('selected'); + $('#pictureLibrary').removeClass('selected'); + this.hideOverlay(); + }, + musicLibraryOpen: function(event) { + this.resetPage(); + $('#musicLibrary').addClass('selected'); + $('.contentContainer').hide(); + var libraryContainer = $('#libraryContainer'); + if (!libraryContainer || libraryContainer.length == 0) { + $('#spinner').show(); + libraryContainer = $('<div>'); + libraryContainer.attr('id', 'libraryContainer') + .addClass('contentContainer'); + $('#content').append(libraryContainer); + jQuery.post(JSON_RPC + '?GetAlbums', '{"jsonrpc": "2.0", "method": "AudioLibrary.GetAlbums", "params": { "start": 0, "fields": ["album_description", "album_theme", "album_mood", "album_style", "album_type", "album_label", "album_artist", "album_genre", "album_rating", "album_title"] }, "id": 1}', jQuery.proxy(function(data) { + if (data && data.result && data.result.albums) { + this.albumList = data.result.albums; + this.albumList.sort(jQuery.proxy(this.albumArtistSorter, this)); + $.each($(this.albumList), jQuery.proxy(function(i, item) { + var floatableAlbum = this.generateThumb('album', item.thumbnail, item.album_title, item.album_artist); + floatableAlbum.bind('click', { album: item }, jQuery.proxy(this.displayAlbumDetails, this)); + libraryContainer.append(floatableAlbum); + }, this)); + libraryContainer.append($('<div>').addClass('footerPadding')); + $('#spinner').hide(); + //$('#libraryContainer img').lazyload(); + libraryContainer.bind('scroll', { activeLibrary: libraryContainer }, jQuery.proxy(this.updateScrollEffects, this)); + libraryContainer.trigger('scroll'); + myScroll = new iScroll('libraryContainer'); + } else { + libraryContainer.html(''); + } + }, this), 'json'); + } else { + libraryContainer.show(); + libraryContainer.trigger('scroll'); + } + }, + getThumbnailPath: function(thumbnail) { + return thumbnail ? ('/vfs/' + thumbnail) : DEFAULT_ALBUM_COVER; + }, + generateThumb: function(type, thumbnail, album_title, album_artist) { + var floatableAlbum = $('<div>'); + var path = this.getThumbnailPath(thumbnail); + var title = album_title||''; + var artist = album_artist||''; + if (title.length > 18 && !(title.length <= 21)) { + title = album_title.substring(0, 18) + '...'; + } + if (artist.length > 20 && !(artist.length <= 22)) { + artist = album_artist.substring(0, 20) + '...'; + } + var className = ''; + var code = ''; + switch(type) { + case 'album': + className = 'floatableAlbum'; + code = '<p class="album" title="' + album_title + '">' + title + '</p><p class="artist" title="' + album_artist + '">' + artist + '</p>'; + break; + case 'movie': + className = 'floatableMovieCover'; + code = '<p class="album" title="' + album_title + '">' + title + '</p>'; + break; + case 'tvshow': + className = 'floatableTVShowCover'; + break; + case 'image': + case 'directory': + className = 'floatableAlbum'; + code = '<p class="album" title="' + album_title + '">' + title + '</p>'; + break; + } + return floatableAlbum.addClass(className).html('<div class="imgWrapper"><div class="inner"><img src="' + path + '" alt="" /></div></div>' + code); + }, + showAlbumSelectorBlock: function(album) { + if (album) { + //Find album in stored array + var prevAlbum = null, + nextAlbum = null; + $.each($(this.albumList), jQuery.proxy(function(i, item) { + if (item.albumid == album.albumid) { + if (this.albumList.length > 1) { + prevAlbum = this.albumList[i <= 0 ? this.albumList.length-1 : i-1]; + nextAlbum = this.albumList[i >= this.albumList.length ? 0 : i+1]; + } + return false; /* .each break */ + } + }, this)); + var albumSelectorBlock = $('#albumSelector'); + if (!albumSelectorBlock || albumSelectorBlock.length == 0) { + albumSelectorBlock = $('<div>'); + albumSelectorBlock.attr('id', 'albumSelector') + .html('<table><tr><td class="allAlbums">All Albums</td><td class="activeAlbumTitle"></td><td class="prevAlbum"> </td><td class="nextAlbum"> </td></tr></table>'); + $('#content').prepend(albumSelectorBlock); + $('#albumSelector .allAlbums').bind('click', jQuery.proxy(this.hideAlbumDetails, this)); + } + $('#albumSelector .prevAlbum').unbind(); + $('#albumSelector .nextAlbum').unbind(); + if (prevAlbum) { + $('#albumSelector .prevAlbum').bind('click', {album: prevAlbum}, jQuery.proxy(this.displayAlbumDetails, this)); + } + if (nextAlbum) { + $('#albumSelector .nextAlbum').bind('click', {album: nextAlbum}, jQuery.proxy(this.displayAlbumDetails, this)); + } + $('#albumSelector .activeAlbumTitle').html(album.album_title||'Unknown Album'); + albumSelectorBlock.show(); + } + }, + hideAlbumDetails: function() { + $('.contentContainer').hide(); + this.musicLibraryOpen(); + }, + displayAlbumDetails: function(event) { + this.showAlbumSelectorBlock(event.data.album); + var albumDetailsContainer = $('#albumDetails' + event.data.album.albumid); + $('#topScrollFade').hide(); + if (!albumDetailsContainer || albumDetailsContainer.length == 0) { + $('#spinner').show(); + jQuery.post(JSON_RPC + '?GetSongs', '{"jsonrpc": "2.0", "method": "AudioLibrary.GetSongs", "params": { "fields": ["title", "artist", "genre", "tracknumber", "discnumber", "duration", "year"], "albumid" : ' + event.data.album.albumid + ' }, "id": 1}', jQuery.proxy(function(data) { + albumDetailsContainer = $('<div>'); + albumDetailsContainer.attr('id', 'albumDetails' + event.data.album.albumid) + .addClass('contentContainer') + .addClass('albumContainer') + .html('<table class="albumView"><thead><tr class="headerRow"><th>Artwork</th><th> </th><th>Name</th><th class="time">Time</th><th>Artist</th><th>Genre</th></tr></thead><tbody class="resultSet"></tbody></table>'); + $('.contentContainer').hide(); + $('#content').append(albumDetailsContainer); + var albumThumbnail = event.data.album.thumbnail; + var albumTitle = event.data.album.album_title||'Unknown Album'; + var albumArtist = event.data.album.album_artist||'Unknown Artist'; + var trackCount = data.result.total; + $.each($(data.result.songs), jQuery.proxy(function(i, item) { + if (i == 0) { + var trackRow = $('<tr>').addClass('trackRow').addClass('tr' + i % 2); + trackRow.append($('<td>').attr('rowspan', ++trackCount + 1).addClass('albumThumb')); + for (var a = 0; a < 5; a++) { + trackRow.append($('<td>').html(' ').attr('style', 'display: none')); + } + $('#albumDetails' + event.data.album.albumid + ' .resultSet').append(trackRow); + } + var trackRow = $('<tr>').addClass('trackRow').addClass('tr' + i % 2); + var trackNumberTD = $('<td>') + .html(item.tracknumber) + .bind('click', { song: item, album: event.data.album }, jQuery.proxy(this.playTrack, this)); + trackRow.append(trackNumberTD); + var trackTitleTD = $('<td>') + .html(item.title) + .bind('click', { song: item, album: event.data.album }, jQuery.proxy(this.playTrack, this)); + trackRow.append(trackTitleTD); + var trackDurationTD = $('<td>') + .addClass('time') + .html(durationToString(item.duration)) + .bind('click', { song: item, album: event.data.album }, jQuery.proxy(this.playTrack, this)); + trackRow.append(trackDurationTD); + var trackArtistTD = $('<td>') + .html(item.artist) + .bind('click', { song: item, album: event.data.album }, jQuery.proxy(this.playTrack, this)); + trackRow.append(trackArtistTD); + var trackGenreTD = $('<td>') + .html(item.genre) + .bind('click', { song: item, album: event.data.album }, jQuery.proxy(this.playTrack, this)); + trackRow.append(trackGenreTD); + $('#albumDetails' + event.data.album.albumid + ' .resultSet').append(trackRow); + }, this)); + if (trackCount > 0) { + var trackRow = $('<tr>').addClass('fillerTrackRow'); + for (var i = 0; i < 5; i++) { + trackRow.append($('<td>').html(' ')); + } + $('#albumDetails' + event.data.album.albumid + ' .resultSet').append(trackRow); + + var trackRow2 = $('<tr>').addClass('fillerTrackRow2'); + trackRow2.append($('<td>').addClass('albumBG').html(' ')); + for (var i = 0; i < 5; i++) { + trackRow2.append($('<td>').html(' ')); + } + $('#albumDetails' + event.data.album.albumid + ' .resultSet').append(trackRow2); + } + $('#albumDetails' + event.data.album.albumid + ' .albumThumb') + .append(this.generateThumb('album', albumThumbnail, albumTitle, albumArtist)) + .append($('<div>').addClass('footerPadding')); + $('#spinner').hide(); + myScroll = new iScroll('albumDetails' + event.data.album.albumid); + }, this), 'json'); + } else { + $('.contentContainer').hide(); + $('#albumDetails' + event.data.album.albumid).show(); + } + }, + displayTVShowDetails: function(event) { + var tvshowDetailsContainer = $('#tvShowDetails' + event.data.tvshow.tvshowid); + $('#topScrollFade').hide(); + if (!tvshowDetailsContainer || tvshowDetailsContainer.length == 0) { + $('#spinner').show(); + jQuery.post(JSON_RPC + '?GetTVShowSeasons', '{"jsonrpc": "2.0", "method": "VideoLibrary.GetSeasons", "params": { "fields": ["genre", "director", "trailer", "tagline", "plot", "plotoutline", "title", "originaltitle", "lastplayed", "showtitle", "firstaired", "duration", "season", "episode", "runtime", "year", "playcount", "rating", "writer", "studio", "mpaa", "premiered"], "tvshowid" : ' + event.data.tvshow.tvshowid + ' }, "id": 1}', jQuery.proxy(function(data) { + tvshowDetailsContainer = $('<div>'); + tvshowDetailsContainer.attr('id', 'tvShowDetails' + event.data.tvshow.tvshowid) + .css('display', 'none') + .addClass('contentContainer') + .addClass('tvshowContainer'); + tvshowDetailsContainer.append(this.generateThumb('tvshow', event.data.tvshow.thumbnail, event.data.tvshow.title)); + if (data && data.result && data.result.seasons && data.result.seasons.length > 0) { + var absWrapper = $('<div>').addClass('showDetailsWrapper'); + var showDetails = $('<div>').addClass('showDetails'); + showDetails.append($('<p>').html(data.result.seasons[0].showtitle).addClass('showTitle')); + showDetails.append($('<p>').html('<span class="heading">Genre:</span> ' + data.result.seasons[0].genre)); + showDetails.append($('<p>').html('<span class="heading">Studio:</span> ' + data.result.seasons[0].studio)); + absWrapper.append(showDetails); + var seasonSelectionContainer = $('<div>').addClass('seasonPicker'); + var seasonSelectionList = $('<ul>'); + var episodeCount = 0; + var firstSeason; + $.each($(data.result.seasons), jQuery.proxy(function(i, item) { + episodeCount += item.episode; + var season = $('<li>').html(item.title); + if (i == 0) { + season.addClass('activeSeason'); + firstSeason = season; + this.tvActiveShowContainer = tvshowDetailsContainer; + } + season.bind('click', {tvshow: event.data.tvshow.tvshowid, season: item, element: season}, jQuery.proxy(this.displaySeasonListings, this)); + seasonSelectionList.append(season); + }, this)); + showDetails.append($('<p>').html('<span class="heading">Episodes:</span> ' + episodeCount)); + seasonSelectionContainer.append(seasonSelectionList); + absWrapper.append(seasonSelectionContainer); + tvshowDetailsContainer.append(absWrapper); + if (firstSeason) { + firstSeason.trigger('click'); + } + $('#content').append(tvshowDetailsContainer); + tvshowDetailsContainer.fadeIn(); + } + $('#spinner').hide(); + }, this), 'json'); + } else { + $('.contentContainer').hide(); + $('#tvShowDetails' + event.data.show.showid); + } + }, + displaySeasonListings: function(event) { + if (event.data.element != this.tvActiveSeason) { + //Remove style from old season. + if (this.tvActiveSeason) { + $(this.tvActiveSeason).removeClass('activeSeason'); + } + //Hide old listings + var oldListings = $('.episodeListingsContainer', this.tvActiveShowContainer).fadeOut(); + //Update ActiveSeason + this.tvActiveSeason = event.data.element; + $(this.tvActiveSeason).addClass('activeSeason'); + //Populate new listings + jQuery.post(JSON_RPC + '?GetTVSeasonEpisodes', '{"jsonrpc": "2.0", "method": "VideoLibrary.GetEpisodes", "params": { "fields": ["genre", "director", "trailer", "tagline", "plot", "plotoutline", "title", "originaltitle", "lastplayed", "showtitle", "firstaired", "duration", "season", "episode", "runtime", "year", "playcount", "rating", "writer", "studio", "mpaa", "premiered"], "season" : ' + event.data.season.season + ', "tvshowid" : ' + event.data.tvshow + ' }, "id": 1}', jQuery.proxy(function(data) { + var episodeListingsContainer = $('<div>').addClass('episodeListingsContainer'); + var list = $('<ul>'); + $.each($(data.result.episodes), jQuery.proxy(function(i, item) { + var episodePicture = $('<img>'); + episodePicture.attr('src', this.getThumbnailPath(item.thumbnail)); + var episodeTitle = $('<p>').html(item.title); + var episode = $('<li>').append(episodePicture).append(episodeTitle); + list.append(episode); + }, this)); + episodeListingsContainer.append(list); + $(this.tvActiveShowContainer).prepend(episodeListingsContainer); + }, this), 'json'); + } + }, + hideOverlay: function(event) { + if (this.activeCover) { + $(this.activeCover).remove(); + this.activeCover = null; + } + $('#overlay').hide(); + }, + updatePlayButtonLocation: function(event) { + var movieContainer = $('.movieCover'); + if (movieContainer.length > 0) { + var playIcon = $('.playIcon'); + if (playIcon.length > 0) { + playIcon.width($(movieContainer[0]).width()); + playIcon.height($(movieContainer[0]).height()); + } + } + }, + playMovie: function(event) { + jQuery.post(JSON_RPC + '?PlayMovie', '{"jsonrpc": "2.0", "method": "XBMC.Play", "params": { "movieid": ' + event.data.movie.movieid + ' }, "id": 1}', jQuery.proxy(function(data) { + this.hideOverlay(); + }, this), 'json'); + }, + displayMovieDetails: function(event) { + var movieDetails = $('<div>').attr('id', 'movie-' + event.data.movie.movieid).addClass('moviePopoverContainer'); + movieDetails.append($('<img>').attr('src', '/images/close-button.png').addClass('closeButton').bind('click', jQuery.proxy(this.hideOverlay, this))); + movieDetails.append($('<img>').attr('src', this.getThumbnailPath(event.data.movie.thumbnail)).addClass('movieCover')); + movieDetails.append($('<div>').addClass('playIcon').bind('click', {movie: event.data.movie}, jQuery.proxy(this.playMovie, this))); + var movieTitle = $('<p>').addClass('movieTitle'); + var yearText = event.data.movie.year ? ' <span class="year">(' + event.data.movie.year + ')</span>' : ''; + movieTitle.html(event.data.movie.title + yearText); + movieDetails.append(movieTitle); + if (event.data.movie.runtime) { + movieDetails.append($('<p>').addClass('runtime').html('<strong>Runtime:</strong> ' + event.data.movie.runtime + ' minutes')); + } + if (event.data.movie.plot) { + movieDetails.append($('<p>').addClass('plot').html(event.data.movie.plot)); + } + if (event.data.movie.genre) { + movieDetails.append($('<p>').addClass('genre').html('<strong>Genre:</strong> ' + event.data.movie.genre)); + } + if (event.data.movie.rating) { + //Todo + } + if (event.data.movie.director) { + movieDetails.append($('<p>').addClass('director').html('<strong>Directed By:</strong> ' + event.data.movie.director)); + } + this.activeCover = movieDetails; + $('body').append(movieDetails); + $('#overlay').show(); + this.updatePlayButtonLocation(); + }, + playTrack: function(event) { + jQuery.post(JSON_RPC + '?ClearPlaylist', '{"jsonrpc": "2.0", "method": "AudioPlaylist.Clear", "id": 1}', jQuery.proxy(function(data) { + //check that clear worked. + jQuery.post(JSON_RPC + '?AddAlbumToPlaylist', '{"jsonrpc": "2.0", "method": "AudioPlaylist.Add", "params": { "albumid": ' + event.data.album.albumid + ' }, "id": 1}', jQuery.proxy(function(data) { + //play specific song in playlist + jQuery.post(JSON_RPC + '?PlaylistItemPlay', '{"jsonrpc": "2.0", "method": "AudioPlaylist.Play", "params": { "songid": ' + event.data.song.songid + ' }, "id": 1}', function() {}, 'json'); + }, this), 'json'); + }, this), 'json'); + }, + movieLibraryOpen: function() { + this.resetPage(); + $('#movieLibrary').addClass('selected'); + $('.contentContainer').hide(); + var libraryContainer = $('#movieLibraryContainer'); + if (!libraryContainer || libraryContainer.length == 0) { + $('#spinner').show(); + jQuery.post(JSON_RPC + '?GetMovies', '{"jsonrpc": "2.0", "method": "VideoLibrary.GetMovies", "params": { "start": 0, "fields": ["genre", "director", "trailer", "tagline", "plot", "plotoutline", "title", "originaltitle", "lastplayed", "showtitle", "firstaired", "duration", "season", "episode", "runtime", "year", "playcount", "rating"] }, "id": 1}', jQuery.proxy(function(data) { + if (data && data.result && data.result.movies) { + libraryContainer = $('<div>'); + libraryContainer.attr('id', 'movieLibraryContainer') + .addClass('contentContainer'); + $('#content').append(libraryContainer); + } else { + libraryContainer.html(''); + } + data.result.movies.sort(jQuery.proxy(this.movieTitleSorter, this)); + $.each($(data.result.movies), jQuery.proxy(function(i, item) { + var floatableMovieCover = this.generateThumb('movie', item.thumbnail, item.title); + floatableMovieCover.bind('click', { movie: item }, jQuery.proxy(this.displayMovieDetails, this)); + libraryContainer.append(floatableMovieCover); + }, this)); + libraryContainer.append($('<div>').addClass('footerPadding')); + $('#spinner').hide(); + libraryContainer.bind('scroll', { activeLibrary: libraryContainer }, jQuery.proxy(this.updateScrollEffects, this)); + libraryContainer.trigger('scroll'); + //$('#libraryContainer img').lazyload(); + myScroll = new iScroll('movieLibraryContainer'); + }, this), 'json'); + } else { + libraryContainer.show(); + libraryContainer.trigger('scroll'); + } + }, + tvshowLibraryOpen: function() { + this.resetPage(); + $('#tvshowLibrary').addClass('selected'); + $('.contentContainer').hide(); + var libraryContainer = $('#tvshowLibraryContainer'); + if (!libraryContainer || libraryContainer.length == 0) { + $('#spinner').show(); + jQuery.post(JSON_RPC + '?GetTVShows', '{"jsonrpc": "2.0", "method": "VideoLibrary.GetTVShows", "params": { "start": 0, "fields": ["genre", "director", "trailer", "tagline", "plot", "plotoutline", "title", "originaltitle", "lastplayed", "showtitle", "firstaired", "duration", "season", "episode", "runtime", "year", "playcount", "rating"] }, "id": 1}', jQuery.proxy(function(data) { + if (data && data.result && data.result.tvshows) { + libraryContainer = $('<div>'); + libraryContainer.attr('id', 'tvshowLibraryContainer') + .addClass('contentContainer'); + $('#content').append(libraryContainer); + } else { + libraryContainer.html(''); + } + $.each($(data.result.tvshows), jQuery.proxy(function(i, item) { + var floatableTVShowCover = this.generateThumb('tvshow', item.thumbnail, item.title); + floatableTVShowCover.bind('click', { tvshow: item }, jQuery.proxy(this.displayTVShowDetails, this)); + libraryContainer.append(floatableTVShowCover); + }, this)); + libraryContainer.append($('<div>').addClass('footerPadding')); + //$('#libraryContainer img').lazyload(); + $('#spinner').hide(); + libraryContainer.bind('scroll', { activeLibrary: libraryContainer }, jQuery.proxy(this.updateScrollEffects, this)); + libraryContainer.trigger('scroll'); + myScroll = new iScroll('tvshowLibraryContainer'); + }, this), 'json'); + } else { + libraryContainer.show(); + libraryContainer.trigger('scroll'); + } + }, + updateScrollEffects: function(event) { + if (event.data.activeLibrary && $(event.data.activeLibrary).scrollTop() > 0) { + $('#topScrollFade').fadeIn(); + } else { + $('#topScrollFade').fadeOut(); + } + }, + albumArtistSorter: function(a, b) { + var result = this.sortAlpha(a.album_artist, b.album_artist); + if (result == 0) { + return this.sortAlpha(a.album_title, b.album_title); + } + return result; + }, + sortAlpha: function(aStr, bStr) { + aStr = aStr.toLowerCase(); + bStr = bStr.toLowerCase(); + if (aStr < bStr) { + return -1; + } + if (aStr > bStr) { + return 1; + } + return 0; + }, + movieTitleSorter: function(a, b) { + return this.sortAlpha(a.title, b.title); + }, + startSlideshow: function(event) { + var directory = event.data.directory.file; + jQuery.post(JSON_RPC + '?StartSlideshow', '{"jsonrpc": "2.0", "method": "XBMC.StartSlideshow", "params": { "recursive" : "true", "random":"true", "directory" : "' + directory + '" }, "id": 1}', null, 'json'); + }, + showDirectory: function(event) { + var directory = event.data.directory.file; + this.resetPage(); + $('#pictureLibrary').addClass('selected'); + $('.contentContainer').hide(); + var libraryContainer = $('#pictureLibraryDirContainer' + directory); + if (!libraryContainer || libraryContainer.length == 0) { + $('#spinner').show(); + jQuery.post(JSON_RPC + '?GetDirectory', '{"jsonrpc": "2.0", "method": "Files.GetDirectory", "params": { "media" : "pictures", "directory":"' + directory + '" }, "id": 1}', jQuery.proxy(function(data) { + if (data && data.result && ( data.result.directories || data.result.files )) { + libraryContainer = $('<div>'); + libraryContainer.attr('id', 'pictureLibraryDirContainer' + directory) + .addClass('contentContainer'); + $('#content').append(libraryContainer); + var breadcrumb = $('<div>'); + var seperator = '/'; + var item = ''; + var directoryArray = directory.split(seperator); + jQuery.each(directoryArray, function(i,v) { + if(v != '') { + item += v + seperator; + //tmp.bind('click', { directory: item }, jQuery.proxy(this.showDirectory, this)); + breadcrumb.append($('<div>').text(' > ' + v).css('float','left').addClass('breadcrumb')); + } + }); + libraryContainer.append(breadcrumb); + libraryContainer.append($('<div>').css('clear','both')); + if (data.result.directories) { + $.each($(data.result.directories), jQuery.proxy(function(i, item) { + var floatableShare = this.generateThumb('directory', item.thumbnail, item.label); + floatableShare.bind('click', { directory: item }, jQuery.proxy(this.showDirectory, this)); + //var slideshow = $('<div">'); + //slideshow.html('<div>Slideshow</div>'); + //slideshow.bind('click', { directory: item }, jQuery.proxy(this.startSlideshow, this)); + //floatableShare.append(slideshow); + libraryContainer.append(floatableShare); + }, this)); + } + if (data.result.files) { + $.each($(data.result.files), jQuery.proxy(function(i, item) { + var floatableImage = this.generateThumb('image', item.file, item.label); + libraryContainer.append(floatableImage); + }, this)); + } + libraryContainer.append($('<div>').addClass('footerPadding')); + } else { + libraryContainer.html(''); + } + $('#spinner').hide(); + libraryContainer.bind('scroll', { activeLibrary: libraryContainer }, jQuery.proxy(this.updateScrollEffects, this)); + libraryContainer.trigger('scroll'); + myScroll = new iScroll('#pictureLibraryDirContainer' + directory); + }, this), 'json'); + } else { + libraryContainer.show(); + libraryContainer.trigger('scroll'); + } + }, + pictureLibraryOpen: function() { + this.resetPage(); + $('#pictureLibrary').addClass('selected'); + $('.contentContainer').hide(); + var libraryContainer = $('#pictureLibraryContainer'); + if (!libraryContainer || libraryContainer.length == 0) { + $('#spinner').show(); + jQuery.post(JSON_RPC + '?GetSources', '{"jsonrpc": "2.0", "method": "Files.GetSources", "params": { "media" : "pictures" }, "id": 1}', jQuery.proxy(function(data) { + if (data && data.result && data.result.shares) { + libraryContainer = $('<div>'); + libraryContainer.attr('id', 'pictureLibraryContainer') + .addClass('contentContainer'); + $('#content').append(libraryContainer); + } else { + libraryContainer.html(''); + } + $.each($(data.result.shares), jQuery.proxy(function(i, item) { + var floatableShare = this.generateThumb('directory', item.thumbnail, item.label); + floatableShare.bind('click', { directory: item }, jQuery.proxy(this.showDirectory, this)); + libraryContainer.append(floatableShare); + }, this)); + libraryContainer.append($('<div>').addClass('footerPadding')); + $('#spinner').hide(); + libraryContainer.bind('scroll', { activeLibrary: libraryContainer }, jQuery.proxy(this.updateScrollEffects, this)); + libraryContainer.trigger('scroll'); + myScroll = new iScroll('#pictureLibraryContainer'); + }, this), 'json'); + } else { + libraryContainer.show(); + libraryContainer.trigger('scroll'); + } + } }
\ No newline at end of file |