diff --git a/README.md b/README.md
index 44b5c49..d9a4d1e 100644
--- a/README.md
+++ b/README.md
@@ -7,7 +7,6 @@ What?
* Archive.org browsing and streaming
Features
-* Basic Archive.org browsing and streaming
* HTML5 Audio with Flash fallback (provided by the jPlayer library)
* Flexible Layout (will scale to whatever size your browser window is)
* Keyboard shortcuts (back, forward, play/pause, skip to artist, media keys)
@@ -24,13 +23,15 @@ Features
* Last.fm support
* Autopilot Mode (click one button and songs continue to play)
* AutoSave Mode (saves position and current playlist if you close or refresh your browser)
+* Built with AngularJS
***Please submit all bug reports & feature requests via the GitHub page***
https://github.com/tsquillario/Jamstash/issues
You will need a Subsonic server to be able to play your own music. Subsonic is a free, web-based media streamer, providing ubiquitous access to your music. Use it to share your music with friends, or to listen to your own music while at work. Please see http://www.subsonic.org
-* Live Demo: http://tsquillario.github.io/Jamstash
+* Twitter (Release Announcements): https://twitter.com/JamstashApp
+* Live Beta: http://jamstash.com/beta
* Github Repo: https://github.com/tsquillario/Jamstash
* Chrome App: https://chrome.google.com/webstore/detail/minisub/jccdpflnecheidefpofmlblgebobbloc
* Forum: http://forum.subsonic.org/forum/viewforum.php?f=12
diff --git a/images/albumdefault_160.jpg b/images/albumdefault_160.jpg
new file mode 100644
index 0000000..e70f51b
Binary files /dev/null and b/images/albumdefault_160.jpg differ
diff --git a/images/fbpreview.png b/images/fbpreview.png
new file mode 100644
index 0000000..7eed1f8
Binary files /dev/null and b/images/fbpreview.png differ
diff --git a/images/info_gd_4x8.png b/images/info_gd_4x8.png
new file mode 100644
index 0000000..5eeeae7
Binary files /dev/null and b/images/info_gd_4x8.png differ
diff --git a/images/info_gl_4x8.png b/images/info_gl_4x8.png
new file mode 100644
index 0000000..08e1d2f
Binary files /dev/null and b/images/info_gl_4x8.png differ
diff --git a/images/info_gl_6x12.png b/images/info_gl_6x12.png
new file mode 100644
index 0000000..adc3676
Binary files /dev/null and b/images/info_gl_6x12.png differ
diff --git a/images/x_gl_11x11.png b/images/x_gl_11x11.png
new file mode 100644
index 0000000..a54c625
Binary files /dev/null and b/images/x_gl_11x11.png differ
diff --git a/index.html b/index.html
index 23ee103..b3c21ef 100755
--- a/index.html
+++ b/index.html
@@ -1,7 +1,10 @@
-
@@ -125,9 +130,9 @@
- {{o.name}}
- {{o.album}}
- {{o.artist}}
+
+
+
diff --git a/js/archiveViewModel.js b/js/_saved/archiveViewModel.js
similarity index 100%
rename from js/archiveViewModel.js
rename to js/_saved/archiveViewModel.js
diff --git a/js/_saved/demo.html b/js/_saved/demo.html
new file mode 100644
index 0000000..8c2aa44
--- /dev/null
+++ b/js/_saved/demo.html
@@ -0,0 +1,15 @@
+
+
+
+
+
Contact Manager
+
+
+
AngularJS Contact Manager
+ [
index ]
+
+
+
+
+
+
diff --git a/js/_saved/saved.html b/js/_saved/saved.html
new file mode 100644
index 0000000..7daddd5
--- /dev/null
+++ b/js/_saved/saved.html
@@ -0,0 +1,591 @@
+
+
+
+
+
Jamstash
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Album
+ Song
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Library
+
+
+
+ Auto Albums
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Playlists
+
+
+
Podcasts
+
+
+
Archive.org
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
0 song(s), 00:00:00 total time
+
+
+
+
+
+
+
+
+
***Opens new window to the video URL...
+
+
+
+
+
+
+
+
+
+
+
+
+
Tips
+
+ Click the Notification to quickly Skip the Song
+ Click on a song to play the rest of the album
+
+
Keyboard Shortcuts
+
+
+ [a-z] Use to Quickly Browse to an Artist
+ Home Scroll to Top of Artist List
+ Spacebar Play/Pause
+ → Next Track
+ ← Previous Track
+ -/_ Volume Down =/+ Volume Up
+ Media Keys via Sway.fm Unified Music Media Keys
+
+
+
Buy me a beer ! I'd like that :)
+
+
*This is a donation to tsquillario , the developer of Jamstash .
+ Not related to a Subsonic License!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/js/subsonicViewModel.js b/js/_saved/subsonicViewModel.js
similarity index 100%
rename from js/subsonicViewModel.js
rename to js/_saved/subsonicViewModel.js
diff --git a/js/subsonic_old.js b/js/_saved/subsonic_old.js
similarity index 100%
rename from js/subsonic_old.js
rename to js/_saved/subsonic_old.js
diff --git a/js/app.js b/js/app.js
index 212e398..1162fdd 100755
--- a/js/app.js
+++ b/js/app.js
@@ -1,47 +1,60 @@
/* Declare app level module */
-var JamStash = angular.module('JamStash', ['ngCookies'])
- .config(function ($routeProvider) {
- $routeProvider.when('/index', {
- redirectTo: '/library'
- })
- .when('/settings', {
- templateUrl: 'js/partials/settings.html',
- controller: 'SettingsCtrl'
- })
- .when('/library', {
- templateUrl: 'js/partials/library.html',
- controller: 'SubsonicCtrl'
- })
- .when('/library/:albumId', {
- templateUrl: 'js/partials/library.html',
- controller: 'SubsonicCtrl'
- })
- .when('/playlists', {
- templateUrl: 'js/partials/playlists.html',
- controller: 'PlaylistCtrl'
- })
- .when('/podcasts', {
- templateUrl: 'js/partials/podcasts.html',
- controller: 'PodcastCtrl'
- })
- .when('/archive', {
- templateUrl: 'js/partials/archive.html',
- controller: 'ArchiveCtrl'
- })
- .otherwise({
- redirectTo: '/library'
- });
- })
-.run(function ($rootScope, $location, globals) {
- // register listener to watch route changes
+var JamStash = angular.module('JamStash', ['ngCookies']);
+JamStash.config(function ($routeProvider) {
+ $routeProvider
+ .when('/index', { redirectTo: '/library' })
+ .when('/settings', { templateUrl: 'js/partials/settings.html', controller: 'SettingsCtrl' })
+ .when('/library', { templateUrl: 'js/partials/library.html', controller: 'SubsonicCtrl' })
+ .when('/library/:albumId', { templateUrl: 'js/partials/library.html', controller: 'SubsonicCtrl' })
+ .when('/playlists', { templateUrl: 'js/partials/playlists.html', controller: 'PlaylistCtrl' })
+ .when('/podcasts', { templateUrl: 'js/partials/podcasts.html', controller: 'PodcastCtrl' })
+ .when('/archive', { templateUrl: 'js/partials/archive.html', controller: 'ArchiveCtrl' })
+ .when('/archive/:artist', { templateUrl: 'js/partials/archive.html', controller: 'ArchiveCtrl' })
+ .when('/archive/:artist/:album', { templateUrl: 'js/partials/archive.html', controller: 'ArchiveCtrl' })
+ .otherwise({ redirectTo: '/index' });
+})
+.run(['$rootScope', '$location', 'globals', function ($rootScope, $location, globals) {
$rootScope.$on("$locationChangeStart", function (event, next, current) {
- if (next.templateUrl != 'js/partials/settings.html') {
- if (globals.settings.Server == '' && globals.settings.Username == '' && globals.settings.Password == '') {
- $location.path("/settings");
- }
+ $rootScope.loggedIn = false;
+ var path = $location.path().replace(/^\/([^\/]*).*$/, '$1');
+ if (globals.settings.Username != "" && globals.settings.Password != "" && globals.settings.Server != "") {
+ $rootScope.loggedIn = true;
+ }
+ if (!$rootScope.loggedIn && (path != 'settings' && path != 'archive')) {
+ $location.path('/settings');
}
});
+} ]);
+
+/*
+JamStash.config(function ($httpProvider) {
+ $httpProvider.interceptors.push(function ($rootScope, $location, $q, globals) {
+ return {
+ 'request': function (request) {
+ // if we're not logged-in to the AngularJS app, redirect to login page
+ //$rootScope.loggedIn = $rootScope.loggedIn || globals.settings.Username;
+ $rootScope.loggedIn = false;
+ if (globals.settings.Username != "" && globals.settings.Password != "" && globals.settings.Server != "") {
+ $rootScope.loggedIn = true;
+ }
+ if (!$rootScope.loggedIn && $location.path() != '/settings' && $location.path() != '/archive') {
+ $location.path('/settings');
+ }
+ return request;
+ },
+ 'responseError': function (rejection) {
+ // if we're not logged-in to the web service, redirect to login page
+ if (rejection.status === 401 && $location.path() != '/settings') {
+ $rootScope.loggedIn = false;
+ $location.path('/settings');
+ }
+ return $q.reject(rejection);
+ }
+ };
+ });
});
+*/
+
JamStash.service('model', function (utils) {
this.Index = function (name, artist) {
@@ -52,12 +65,13 @@ JamStash.service('model', function (utils) {
this.id = id;
this.name = name;
}
- this.Album = function (id, parentid, name, artist, coverart, date, starred, description, url) {
+ this.Album = function (id, parentid, name, artist, coverartthumb, coverartfull, date, starred, description, url) {
this.id = id;
this.parentid = parentid;
this.name = name;
this.artist = artist;
- this.coverart = coverart;
+ this.coverartthumb = coverartthumb;
+ this.coverartfull = coverartfull;
this.date = date;
this.starred = starred;
this.description = description;
@@ -97,6 +111,7 @@ JamStash.service('globals', function (utils) {
Password: "guest"),
Server: "http://subsonic.org/demo"),
*/
+ Url: "http://Jamstash.com/beta/#/archive/",
Username: "",
Password: "",
Server: "",
@@ -171,13 +186,14 @@ JamStash.filter('capitalize', function () {
}
});
-JamStash.service('notifications', function (globals) {
+JamStash.service('notifications', function ($rootScope, globals) {
var msgIndex = 1;
this.updateMessage = function (msg, autohide) {
if (msg != '') {
var id = msgIndex;
$('#messages').append('
' + msg + ' ');
$('#messages').fadeIn();
+ $("#messages").scrollTo('100%');
var el = '#msg_' + id;
if (autohide) {
setTimeout(function () {
@@ -213,7 +229,7 @@ JamStash.service('notifications', function (globals) {
if (bind = '#NextTrack') {
popup.addEventListener('click', function (bind) {
//$(bind).click();
- require("player").nextTrack();
+ $rootScope.nextTrack();
this.cancel();
})
}
diff --git a/js/controllers/archive.js b/js/controllers/archive.js
index bc8348c..f7b4df7 100644
--- a/js/controllers/archive.js
+++ b/js/controllers/archive.js
@@ -1,7 +1,9 @@
JamStash.controller('ArchiveCtrl',
-function ArchiveCtrl($scope, $rootScope, $location, $http, utils, globals, model, notifications, player, json) {
+function ArchiveCtrl($scope, $rootScope, $location, $routeParams, $http, utils, globals, model, notifications, player, json) {
$("#LayoutContainer").layout($scope.layoutThreeCol);
+ $scope.settings = globals.settings;
+ $scope.itemType = 'archive';
$rootScope.song = [];
$scope.Protocol = 'jsonp';
$scope.artist = [];
@@ -9,20 +11,45 @@ function ArchiveCtrl($scope, $rootScope, $location, $http, utils, globals, model
$scope.selectedArtist;
$scope.selectedAlbum;
$scope.selectedSongs = [];
+ $scope.SavedCollections = globals.SavedCollections;
$scope.AllCollections = [];
+ $scope.loadedCollection = false;
json.getCollections(function (data) {
$scope.AllCollections = data;
+ $scope.loadedCollection = true;
});
+ $scope.writeSavedCollection = function () {
+ utils.setValue('SavedCollections', $scope.SavedCollections.join(), false);
+ /*
+ $scope.$apply(function () {
+ });
+ */
+ globals.SavedCollections = $scope.SavedCollections;
+ }
+ $scope.addSavedCollection = function (newValue) {
+ if ($scope.SavedCollections.indexOf(newValue) == -1) {
+ $scope.SavedCollections.push(newValue);
+ $scope.writeSavedCollection();
+ }
+ }
+ $scope.deleteSavedCollection = function (index) {
+ $scope.SavedCollections.splice(index, 1);
+ $scope.writeSavedCollection();
+ }
$scope.selectedCollection;
$scope.$watch("selectedCollection", function (newValue, oldValue) {
if (newValue !== oldValue) {
- if (globals.SavedCollections.length > 0) {
- globals.SavedCollections.push(newValue);
- }
- $scope.artist.push(new model.Artist('', newValue));
- utils.setValue('SavedCollections', globals.SavedCollections.join(), false);
+ $scope.addSavedCollection(newValue);
}
});
+ $scope.setupDemoCollections = function () {
+ var demo = ["YonderMountainStringBand", "GreenskyBluegrass"];
+ angular.forEach(demo, function (item, key) {
+ if ($scope.SavedCollections.indexOf(item) == -1) {
+ $scope.SavedCollections.push(item);
+ }
+ });
+ }
$scope.archiveUrl = 'https://archive.org/';
/* Filter */
@@ -72,39 +99,46 @@ function ArchiveCtrl($scope, $rootScope, $location, $http, utils, globals, model
};
$scope.filterSave = function () {
if ($scope.selectedArtist) {
- $scope.getAlbums('');
+ $scope.getAlbums('', '');
}
}
/* End Filter */
+ /*
$scope.getArtists = function (data) {
- var map = function (data) {
- return new model.Artist('', data);
- };
- angular.forEach(globals.SavedCollections, function (item, key) {
- $scope.artist.push(map(item));
- });
+ var map = function (data) {
+ return new model.Artist('', data);
};
- $scope.getAlbums = function (name) {
+ angular.forEach($scope.SavedCollections, function (item, key) {
+ $scope.artist.push(map(item));
+ });
+ };
+ */
+ $scope.getAlbums = function (name, identifier) {
+ var url = $scope.archiveUrl + 'advancedsearch.php?q=';
if (name != '') {
$scope.selectedArtist = name;
+ url += 'collection:(' + name + ') AND format:(MP3)';
+ } else if ($scope.selectedArtist) {
+ url += 'collection:(' + $scope.selectedArtist + ') AND format:(MP3)';
+ } else {
+ url += 'identifier:(' + identifier + ')';
}
var map = function (data) {
var song = data;
- var coverart, starred;
+ var coverartthumb, coverartfull, starred;
var url = $scope.archiveUrl + 'details/' + song.identifier;
- coverart = 'images/albumdefault_50.jpg';
+ coverartthumb = 'images/albumdefault_50.jpg';
+ coverartfull = 'images/albumdefault_160.jpg';
if (parseInt(song.avg_rating) == 5) { starred = true; } else { starred = false; }
//var description = '
Details ';
var description = '
Source : ' + song.source + '
';
description += '
Date : ' + song.date + '
';
description += typeof song.publisher != 'undefined' ? '
Transferer : ' + song.publisher + '
' : '';
description += typeof song.avg_rating != 'undefined' ? '
Rating : ' + song.avg_rating + '
' : '';
- description += '
Downloads : ' + song.downloads + '
';
- //description += typeof song.description == 'undefined' ? '' : song.description.replace("\n", "
");
- return new model.Album(song.identifier, null, song.title, null, coverart, $.format.date(new Date(song.publicdate), "yyyy-MM-dd h:mm a"), starred, description, url);
+ description += typeof song.downloads != 'undefined' ? '
Downloads : ' + song.downloads + '
' : '';
+ return new model.Album(song.identifier, null, song.title, song.collection[0], coverartthumb, coverartfull, $.format.date(new Date(song.publicdate), "yyyy-MM-dd h:mm a"), starred, description, url);
}
- var url = $scope.archiveUrl + 'advancedsearch.php?q=collection:(' + $scope.selectedArtist + ') AND format:(MP3)';
if ($scope.filter.Source) {
url += ' AND source:(' + $scope.filter.Source + ')';
}
@@ -136,8 +170,9 @@ function ArchiveCtrl($scope, $rootScope, $location, $http, utils, globals, model
$scope.album.push(map(item));
});
$scope.$apply();
+ notifications.updateMessage($scope.album.length, true);
} else {
- notifications.updateMessage("0 records returned", true);
+ notifications.updateMessage("Sorry :(", true);
}
},
error: function () {
@@ -145,16 +180,16 @@ function ArchiveCtrl($scope, $rootScope, $location, $http, utils, globals, model
}
});
};
- $scope.mapSong = function (key, song, server, dir, coverart) {
+ $scope.mapSong = function (key, song, server, dir, identifier, coverart) {
var url, time, track, title, rating, starred, contenttype, suffix;
var specs = ''
if (song.format == 'VBR MP3') {
url = 'http://' + server + dir + key;
- specs = song.bitrate + 'kbps, ' + song.format.toLowerCase();
+ if (typeof song.bitrate == 'undefined' || typeof song.format == 'undefined') { specs = ' '; } else { specs = song.bitrate + 'kbps, ' + song.format.toLowerCase(); }
if (typeof song.track == 'undefined') { track = ' '; } else { track = song.track; }
if (typeof song.title == 'undefined') { title = ' '; } else { title = song.title; }
if (typeof song.length == 'undefined') { time = ' '; } else { time = utils.timeToSeconds(song.length); }
- return new model.Song(song.md5, song.album, song.track, title, song.creator, '', song.album, '', coverart, coverart, time, '', '', 'mp3', specs, url, 0, '');
+ return new model.Song(song.md5, identifier, song.track, title, song.creator, '', song.album, '', coverart, coverart, time, '', '', 'mp3', specs, url, 0, '');
}
};
$scope.getSongs = function (id, action) {
@@ -169,24 +204,25 @@ function ArchiveCtrl($scope, $rootScope, $location, $http, utils, globals, model
var coverart = '';
var server = data.server;
var dir = data.dir;
+ var identifier = data.metadata.identifier[0];
if (typeof data.misc.image != 'undefined') {
coverart = data.misc.image;
}
var items = data.files;
if (action == 'add') {
angular.forEach(items, function (item, key) {
- var song = $scope.mapSong(key, item, server, dir, coverart);
+ var song = $scope.mapSong(key, item, server, dir, identifier, coverart);
if (song) {
$rootScope.queue.push(song);
}
});
+ $('body').layout().open('south');
+ notifications.updateMessage(Object.keys(items).length + ' Song(s) Added to Queue', true);
$scope.$apply();
- $('body').layout().open('south');
- notifications.updateMessage(items.length + ' Song(s) Added to Queue', true);
} else if (action == 'play') {
$rootScope.queue = [];
angular.forEach(items, function (item, key) {
- var song = $scope.mapSong(key, item, server, dir, coverart);
+ var song = $scope.mapSong(key, item, server, dir, identifier, coverart);
if (song) {
$rootScope.queue.push(song);
}
@@ -196,11 +232,11 @@ function ArchiveCtrl($scope, $rootScope, $location, $http, utils, globals, model
$rootScope.playSong(false, next);
});
$('body').layout().open('south');
- notifications.updateMessage(items.length + ' Song(s) Added to Queue', true);
+ notifications.updateMessage(Object.keys(items).length + ' Song(s) Added to Queue', true);
} else {
$rootScope.song = [];
angular.forEach(items, function (item, key) {
- var song = $scope.mapSong(key, item, server, dir, coverart);
+ var song = $scope.mapSong(key, item, server, dir, identifier, coverart);
if (song) {
$rootScope.song.push(song);
}
@@ -211,12 +247,14 @@ function ArchiveCtrl($scope, $rootScope, $location, $http, utils, globals, model
});
};
$scope.addSongsToQueue = function () {
- angular.forEach($scope.selectedSongs, function (item, key) {
- $scope.queue.push(item);
- item.selected = false;
- });
- $('body').layout().open('south');
- notifications.updateMessage($scope.selectedSongs.length + ' Song(s) Added to Queue', true);
+ if ($scope.selectedSongs.length > 0) {
+ angular.forEach($scope.selectedSongs, function (item, key) {
+ $scope.queue.push(item);
+ item.selected = false;
+ });
+ $('body').layout().open('south');
+ notifications.updateMessage($scope.selectedSongs.length + ' Song(s) Added to Queue', true);
+ }
}
$scope.scrollToTop = function () {
$('#Artists').stop().scrollTo('#auto', 400);
@@ -233,16 +271,16 @@ function ArchiveCtrl($scope, $rootScope, $location, $http, utils, globals, model
item.selected = false;
});
}
- $scope.setupDemoCollections = function () {
- if (globals.SavedCollections.length == 0) {
- globals.SavedCollections = ["YonderMountainStringBand", "GreenskyBluegrass"];
- $scope.getArtists();
- }
- }
-
-
/* Launch on Startup */
- $scope.getArtists();
+ if ($routeParams.artist) {
+ if ($routeParams.album) {
+ //collection:(GreenskyBluegrass) AND format:(MP3) AND identifier:(gsbg2013-09-20.flac16)
+ $scope.getAlbums('', $routeParams.album);
+ } else {
+ $scope.getAlbums($routeParams.artist, '');
+ }
+ $scope.addSavedCollection($routeParams.artist);
+ }
/* End Startup */
});
\ No newline at end of file
diff --git a/js/controllers/library.js b/js/controllers/library.js
index 994aadc..a174bce 100644
--- a/js/controllers/library.js
+++ b/js/controllers/library.js
@@ -4,6 +4,7 @@ function SubsonicCtrl($scope, $rootScope, $location, $window, $routeParams, util
$rootScope.song = [];
$scope.settings = globals.settings;
+ $scope.itemType = 'ss';
$scope.index = [];
$scope.shortcut = [];
$scope.album = [];
@@ -19,20 +20,24 @@ function SubsonicCtrl($scope, $rootScope, $location, $window, $routeParams, util
$scope.selectedAutoAlbum;
$scope.selectedArtist;
$scope.selectedAlbum;
- $scope.selectedMusicFolder;
- $scope.$watch("selectedMusicFolder", function (newValue, oldValue) {
+ $scope.selectedSubsonicAlbumSort = 'default';
+ $scope.SubsonicAlbumSort = [
+ { id: "default", name: "Default Sort" },
+ { id: "artist", name: "Artist" },
+ { id: "album", name: "Album" },
+ { id: "createdate desc", name: "Created Date - Desc" },
+ ];
+ $scope.$watch("selectedSubsonicAlbumSort", function (newValue, oldValue) {
if (newValue !== oldValue) {
- if (utils.getValue('MusicFolders') != newValue) {
- if (typeof newValue != 'undefined') {
- utils.setValue('MusicFolders', newValue, true);
- } else {
- utils.setValue('MusicFolders', null, true);
- }
- //alert(newValue);
- $scope.getArtists(newValue);
- }
+ $scope.sortSubsonicAlbums(newValue);
}
});
+ $scope.selectedLayout = 'grid';
+ $scope.Layouts = [
+ { id: "list", name: "List" },
+ { id: "grid", name: "Grid" },
+ ];
+
$scope.rescanLibrary = function (data, event) {
$.ajax({
url: globals.BaseURL() + '/getUser.view?' + globals.BaseParams() + '&username=' + globals.settings.Username,
@@ -61,7 +66,8 @@ function SubsonicCtrl($scope, $rootScope, $location, $window, $routeParams, util
$scope.getArtists = function (id) {
var url, id;
if (utils.getValue('MusicFolders')) {
- id = utils.getValue('MusicFolders');
+ var folder = angular.fromJson(utils.getValue('MusicFolders'));
+ id = folder.id;
}
if (id) {
url = globals.BaseURL() + '/getIndexes.view?' + globals.BaseParams() + '&musicFolderId=' + id;
@@ -87,16 +93,15 @@ function SubsonicCtrl($scope, $rootScope, $location, $window, $routeParams, util
indexes[0] = data["subsonic-response"].indexes.index;
}
}
- // TODO: AZContainer, build letters here. Make it a click button somewhere then a larger popup with letters finger friendly size
- var shortcuts = [];
+ // TODO: AZIndex, build letters here. Make it a click button somewhere then a larger popup with letters finger friendly size
+ $scope.shortcut = [];
if (typeof data["subsonic-response"].indexes.shortcut != 'undefined') {
if (data["subsonic-response"].indexes.shortcut.length > 0) {
- shortcuts = data["subsonic-response"].indexes.shortcut;
+ $scope.shortcut = data["subsonic-response"].indexes.shortcut;
} else {
- shortcuts[0] = data["subsonic-response"].indexes.shortcut;
+ $scope.shortcut[0] = data["subsonic-response"].indexes.shortcut;
}
}
- $scope.shortcut = shortcuts;
$scope.index = [];
angular.forEach(indexes, function (item, key) {
$scope.index.push($scope.mapArtist(item));
@@ -107,12 +112,13 @@ function SubsonicCtrl($scope, $rootScope, $location, $window, $routeParams, util
};
$scope.mapAlbum = function (data) {
var album = data;
- var coverart, starred;
+ var coverartthumb, coverartfull, starred;
if (typeof album.coverArt != 'undefined') {
- coverart = globals.BaseURL() + '/getCoverArt.view?' + globals.BaseParams() + '&size=50&id=' + album.coverArt;
+ coverartthumb = globals.BaseURL() + '/getCoverArt.view?' + globals.BaseParams() + '&size=160&id=' + album.coverArt;
+ coverartfull = globals.BaseURL() + '/getCoverArt.view?' + globals.BaseParams() + '&id=' + album.coverArt;
}
if (typeof album.starred !== 'undefined') { starred = true; } else { starred = false; }
- return new model.Album(album.id, album.parent, album.album, album.artist, coverart, $.format.date(new Date(album.created), "yyyy-MM-dd h:mm a"), starred, '', '');
+ return new model.Album(album.id, album.parent, album.album, album.artist, coverartthumb, coverartfull, $.format.date(new Date(album.created), "yyyy-MM-dd h:mm a"), starred, '', '');
}
$scope.getAlbums = function (id) {
$scope.selectedAutoAlbum = null;
@@ -127,7 +133,7 @@ function SubsonicCtrl($scope, $rootScope, $location, $window, $routeParams, util
var items = [];
if (typeof data["subsonic-response"].directory.child != 'undefined') {
if (data["subsonic-response"].directory.child.length > 0) {
- items = data["subsonic-response"].directory.child;
+ items = data["subsonic-response"].directory.child;
} else {
items[0] = data["subsonic-response"].directory.child;
}
@@ -138,7 +144,7 @@ function SubsonicCtrl($scope, $rootScope, $location, $window, $routeParams, util
if (item.isDir) {
$scope.album.push($scope.mapAlbum(item));
} else {
- $rootScope.song.push($scope.mapAlbum(item));
+ $rootScope.song.push($scope.mapSong(item));
}
});
if ($scope.selectedSubsonicAlbumSort != "default") {
@@ -231,9 +237,17 @@ function SubsonicCtrl($scope, $rootScope, $location, $window, $routeParams, util
notifications.updateMessage(items.length + ' Song(s) Added to Queue', true);
} else {
$rootScope.song = [];
+ var albums = [];
angular.forEach(items, function (item, key) {
- $rootScope.song.push($scope.mapSong(item));
+ if (item.isDir) {
+ albums.push($scope.mapAlbum(item));
+ } else {
+ $rootScope.song.push($scope.mapSong(item));
+ }
});
+ if (albums.length > 0) {
+ $scope.album = albums;
+ }
$scope.$apply();
}
} else {
@@ -290,51 +304,28 @@ function SubsonicCtrl($scope, $rootScope, $location, $window, $routeParams, util
}
}
});
- $('#Search').val("");
+ //$('#Search').val("");
}
}
$scope.toggleAZ = function (event) {
- var submenu = $('div#submenu_AZIndex');
- if (submenu.css('display') !== 'none') {
- submenu.fadeOut();
- } else {
- //submenu.fadeIn();
- var el = $('#AZContainer');
- pos = el.offset();
- width = el.width();
- height = el.height();
- //show the menu directly over the placeholder
- submenu.css({ "left": (pos.left + 44) + "px", "top": (pos.top) + "px" }).fadeIn(400);
- }
+ $scope.toggleSubmenu('#submenu_AZIndex', '#AZIndex', 'right', 44);
}
$scope.addSongsToQueue = function () {
- angular.forEach($scope.selectedSongs, function (item, key) {
- $scope.queue.push(item);
- item.selected = false;
- });
- $('body').layout().open('south');
- notifications.updateMessage($scope.selectedSongs.length + ' Song(s) Added to Queue', true);
- }
- $scope.scrollToTop = function () {
- $('#Artists').stop().scrollTo('#auto', 400);
- }
- $scope.selectAll = function () {
- angular.forEach($rootScope.song, function (item, key) {
- $scope.selectedSongs.push(item);
- item.selected = true;
- });
- }
- $scope.selectNone = function () {
- angular.forEach($rootScope.song, function (item, key) {
- $scope.selectedSongs = [];
- item.selected = false;
- });
+ if ($scope.selectedSongs.length !== 0) {
+ angular.forEach($scope.selectedSongs, function (item, key) {
+ $scope.queue.push(item);
+ item.selected = false;
+ });
+ $('body').layout().open('south');
+ notifications.updateMessage($scope.selectedSongs.length + ' Song(s) Added to Queue', true);
+ $scope.selectedSongs.length = 0;
+ }
}
$scope.updateFavorite = function (item) {
var id = item.id;
var starred = item.starred;
var url;
- if (typeof starred !== 'undefined') {
+ if (starred) {
url = globals.BaseURL() + '/unstar.view?' + globals.BaseParams() + '&id=' + id;
item.starred = undefined;
} else {
@@ -367,18 +358,6 @@ function SubsonicCtrl($scope, $rootScope, $location, $window, $routeParams, util
*/
return a.name.toLowerCase() < b.name.toLowerCase() ? -1 : 1;
};
- $scope.selectedSubsonicAlbumSort = 'default';
- $scope.SubsonicAlbumSort = [
- "default",
- "artist",
- "album",
- "createdate desc"
- ];
- $scope.$watch("selectedSubsonicAlbumSort", function (newValue, oldValue) {
- if (newValue !== oldValue) {
- $scope.sortSubsonicAlbums(newValue);
- }
- });
$scope.sortSubsonicAlbums = function (newValue) {
if (typeof newValue != 'undefined') {
//alert(newValue);
@@ -398,7 +377,6 @@ function SubsonicCtrl($scope, $rootScope, $location, $window, $routeParams, util
/* Launch on Startup */
$scope.getArtists();
- $scope.getMusicFolders();
if ($routeParams.albumId) {
$scope.getSongs($routeParams.albumId, '');
}
diff --git a/js/controllers/main.js b/js/controllers/main.js
index e7ad7f6..5baf829 100644
--- a/js/controllers/main.js
+++ b/js/controllers/main.js
@@ -6,12 +6,27 @@ function AppCtrl($scope, $rootScope, $document, $location, utils, globals, model
$rootScope.playingSong;
$rootScope.MusicFolders = [];
$rootScope.Genres = [];
+ $rootScope.selectedPlaylist = "";
+ $rootScope.selectedAutoPlaylist = "";
+ $rootScope.selectedMusicFolder = "";
+ $rootScope.unity;
+ $rootScope.$watch("selectedMusicFolder", function (newValue, oldValue) {
+ if (newValue !== oldValue) {
+ if (typeof newValue != 'undefined' && newValue != null) {
+ utils.setValue('MusicFolders', angular.toJson(newValue), true);
+ //$scope.getArtists(newValue.id);
+ } else {
+ utils.setValue('MusicFolders', null, true);
+ //$scope.getArtists();
+ }
+ }
+ });
/*
$scope.playSong = function (loadonly, data) {
- $scope.$apply(function () {
- $rootScope.playSong(loadonly, data);
- });
+ $scope.$apply(function () {
+ $rootScope.playSong(loadonly, data);
+ });
}
*/
@@ -37,6 +52,7 @@ function AppCtrl($scope, $rootScope, $document, $location, utils, globals, model
}
notifications.updateMessage(setting + ' : ' + globals.settings[id], true);
}
+
$.ajaxSetup({
'beforeSend': function () {
$("#loading").show();
@@ -46,6 +62,23 @@ function AppCtrl($scope, $rootScope, $document, $location, utils, globals, model
}
});
+
+ $("a.coverartfancy").live("click", function () {
+ $("a.coverartfancy").fancybox({
+ beforeShow: function () {
+ //this.title = $('#songdetails_artist').html();
+ },
+ afterLoad: function () {
+ //this.inner.prepend( '
1. My custom title ' );
+ //this.content = '
2. My custom title ';
+ },
+ hideOnContentClick: true,
+ type: 'image',
+ openEffect: 'none',
+ closeEffect: 'none'
+ });
+ });
+
var submenu_active = false;
$('div.submenu').mouseenter(function () {
submenu_active = true;
@@ -55,19 +88,41 @@ function AppCtrl($scope, $rootScope, $document, $location, utils, globals, model
$('div.submenu').hide();
//setTimeout(function () { if (submenu_active == false) $('div.submenu').stop().fadeOut(); }, 400);
});
+ $scope.toggleSubmenu = function (menu, pl, pos, margin) {
+ var submenu = $(menu);
+ if (submenu.css('display') !== 'none') {
+ submenu.fadeOut();
+ } else {
+ var el = $(pl);
+ off = el.offset();
+ width = el.width();
+ height = el.height();
+ switch (pos) {
+ case 'right':
+ //show the menu to the right of placeholder
+ submenu.css({ "left": (off.left + margin) + "px", "top": (off.top) + "px" }).fadeIn(400);
+ break;
+ case 'left':
+ //show the menu to the right of placeholder
+ submenu.css({ "left": (off.left - margin) + "px", "top": (off.top) + "px" }).fadeIn(400);
+ break;
+ }
+ setTimeout(function () { if (submenu_active == false) $('div.submenu').stop().fadeOut(); }, 10000);
+ }
+ }
$("a.coverartfancy").fancybox({
- beforeShow : function() {
+ beforeShow: function () {
//this.title = $('#songdetails_artist').html();
},
- afterLoad : function() {
+ afterLoad: function () {
//this.inner.prepend( '
1. My custom title ' );
//this.content = '
2. My custom title ';
},
hideOnContentClick: true,
type: 'image',
openEffect: 'none',
- closeEffect: 'none',
+ closeEffect: 'none'
});
$('#action_Welcome').fancybox({
@@ -82,6 +137,8 @@ function AppCtrl($scope, $rootScope, $document, $location, utils, globals, model
$('.audiojs .scrubber').stop().animate({ height: '4px' });
});
+ $('.message').live('click', function () { $(this).remove(); });
+
// JQuery UI Sortable - Drag and drop sorting
var fixHelper = function (e, ui) {
ui.children().each(function () {
@@ -93,6 +150,28 @@ function AppCtrl($scope, $rootScope, $document, $location, utils, globals, model
helper: fixHelper
});
+ // Sway.fm Unity Plugin
+ $rootScope.unity = UnityMusicShim();
+ $rootScope.unity.setSupports({
+ playpause: true,
+ next: true,
+ previous: true
+ });
+ $rootScope.unity.setCallbackObject({
+ pause: function () {
+ if (globals.settings.Debug) { console.log("Unity: Recieved playpause command"); }
+ player.playPauseSong();
+ },
+ next: function () {
+ if (globals.settings.Debug) { console.log("Unity: Recieved next command"); }
+ $rootScope.nextTrack();
+ },
+ previous: function () {
+ if (globals.settings.Debug) { console.log("Unity: Recieved previous command"); }
+ $rootScope.previousTrack();
+ }
+ });
+
// JQuery Layout Plugin
function resizePageLayout() {
var pageLayout = $("body").data("layout");
@@ -121,13 +200,13 @@ function AppCtrl($scope, $rootScope, $document, $location, utils, globals, model
var pageLayout = $("body").layout(pageLayoutOptions);
$scope.layoutThreeCol = {
- east__size: .5,
+ east__size: .45,
east__minSize: 400,
east__maxSize: .5, // 50% of layout width
east__initClosed: false,
east__initHidden: false,
//center__size: 'auto',
- center__minWidth: .3,
+ center__minWidth: .35,
center__initClosed: false,
center__initHidden: false,
west__size: .2,
@@ -162,9 +241,9 @@ function AppCtrl($scope, $rootScope, $document, $location, utils, globals, model
}
}
}
-
- $document.keydown(function(e){
- $scope.scrollToIndex(e);
+
+ $document.keydown(function (e) {
+ $scope.scrollToIndex(e);
});
$scope.scrollToIndex = function (e) {
var source = e.target.id;
@@ -236,7 +315,22 @@ function AppCtrl($scope, $rootScope, $document, $location, utils, globals, model
$('#SubsonicArtists').stop().scrollTo(el, 400);
}
};
- $scope.isActive = function(route) {
+ $scope.scrollToTop = function () {
+ $('#Artists').stop().scrollTo('#auto', 400);
+ }
+ $scope.selectAll = function () {
+ angular.forEach($rootScope.song, function (item, key) {
+ $scope.selectedSongs.push(item);
+ item.selected = true;
+ });
+ }
+ $scope.selectNone = function () {
+ angular.forEach($rootScope.song, function (item, key) {
+ $scope.selectedSongs = [];
+ item.selected = false;
+ });
+ }
+ $scope.isActive = function (route) {
return route === $location.path();
};
$scope.getMusicFolders = function () {
@@ -254,12 +348,18 @@ function AppCtrl($scope, $rootScope, $document, $location, utils, globals, model
folders[0] = data["subsonic-response"].musicFolders.musicFolder;
}
- /* Fix default saved folder
- if (utils.getValue('MusicFolders')) {
- $scope.selectedMusicFolders = utils.getValue('MusicFolders');
- }
- */
$rootScope.MusicFolders = folders;
+ if (utils.getValue('MusicFolders')) {
+ var folder = angular.fromJson(utils.getValue('MusicFolders'));
+ var i = 0, index = "";
+ angular.forEach($rootScope.MusicFolders, function (item, key) {
+ if (item.id == folder.id) {
+ index = i;
+ }
+ i++;
+ });
+ $rootScope.selectedMusicFolder = $rootScope.MusicFolders[index];
+ }
$scope.$apply();
}
}
@@ -270,23 +370,23 @@ function AppCtrl($scope, $rootScope, $document, $location, utils, globals, model
$rootScope.Genres = genres.split(',');
/* This is broken in version 4.8, unable to convert XML to JSON
$.ajax({
- url: globals.BaseURL() + '/getGenres.view?' + globals.BaseParams(),
- method: 'GET',
- dataType: globals.settings.Protocol,
- timeout: globals.settings.Timeout,
- success: function (data) {
- if (typeof data["subsonic-response"].genres != 'undefined') {
- var items = [];
- if (data["subsonic-response"].genres.length > 0) {
- items = data["subsonic-response"].genres;
- } else {
- items[0] = data["subsonic-response"].genres;
- }
+ url: globals.BaseURL() + '/getGenres.view?' + globals.BaseParams(),
+ method: 'GET',
+ dataType: globals.settings.Protocol,
+ timeout: globals.settings.Timeout,
+ success: function (data) {
+ if (typeof data["subsonic-response"].genres != 'undefined') {
+ var items = [];
+ if (data["subsonic-response"].genres.length > 0) {
+ items = data["subsonic-response"].genres;
+ } else {
+ items[0] = data["subsonic-response"].genres;
+ }
- $rootScope.Genres = items;
- $scope.$apply();
- }
- }
+ $rootScope.Genres = items;
+ $scope.$apply();
+ }
+ }
});
*/
}
@@ -385,26 +485,28 @@ function AppCtrl($scope, $rootScope, $document, $location, utils, globals, model
}
//$scope.$apply();
}
- $scope.getRandomSongs = function (action, genre, folder) {
+ $rootScope.getRandomSongs = function (action, genre, folder) {
if (globals.settings.Debug) { console.log('action:' + action + ', genre:' + genre + ', folder:' + folder); }
var size = globals.settings.AutoPlaylistSize;
- $scope.selectedPlaylist = null;
+ $rootScope.selectedPlaylist = null;
if (typeof folder == 'number') {
- $scope.selectedAutoPlaylist = folder;
+ $rootScope.selectedAutoPlaylist = folder;
} else if (genre != '') {
- $scope.selectedAutoPlaylist = genre;
+ $rootScope.selectedAutoPlaylist = genre;
} else {
- $scope.selectedAutoPlaylist = 'random';
+ $rootScope.selectedAutoPlaylist = 'random';
}
var genreParams = '';
if (genre != '' && genre != 'Random') {
genreParams = '&genre=' + genre;
}
folderParams = '';
- if (typeof folder == 'number' && folder == 0 && folder != 'all') {
- folderParams = '&musicFolderId=' + folder;
- } else if (folder != '' && folder != 'all') {
+ if (typeof folder == 'number' && folder != '' && folder != 'all') {
+ //alert(folder);
folderParams = '&musicFolderId=' + folder;
+ } else if (typeof $rootScope.selectedMusicFolder.id != 'undefined') {
+ //alert($rootScope.selectedMusicFolder.id);
+ folderParams = '&musicFolderId=' + $rootScope.selectedMusicFolder.id;
}
$.ajax({
url: globals.BaseURL() + '/getRandomSongs.view?' + globals.BaseParams() + '&size=' + size + genreParams + folderParams,
@@ -454,6 +556,7 @@ function AppCtrl($scope, $rootScope, $document, $location, utils, globals, model
utils.switchTheme(globals.settings.Theme);
if (globals.settings.Server != '' && globals.settings.Username != '' && globals.settings.Password != '') {
$scope.ping();
+ $scope.getMusicFolders();
if (globals.settings.SaveTrackPosition) {
player.loadTrackPosition();
player.startSaveTrackPosition();
diff --git a/js/controllers/playlists.js b/js/controllers/playlists.js
index 271035a..9158583 100644
--- a/js/controllers/playlists.js
+++ b/js/controllers/playlists.js
@@ -6,8 +6,6 @@ function PlaylistCtrl($scope, $rootScope, $location, utils, globals, model, noti
$scope.playlists = [];
$scope.playlistsPublic = [];
$scope.playlistsGenre = globals.SavedGenres;
- $scope.selectedPlaylist;
- $scope.selectedAutoPlaylist;
$scope.selectedGenre;
$scope.$watch("selectedGenre", function (newValue, oldValue) {
if (newValue !== oldValue) {
@@ -44,8 +42,8 @@ function PlaylistCtrl($scope, $rootScope, $location, utils, globals, model, noti
});
}
$scope.getPlaylist = function (id, action) {
- $scope.selectedAutoPlaylist = null;
- $scope.selectedPlaylist = id;
+ $rootScope.selectedAutoPlaylist = null;
+ $rootScope.selectedPlaylist = id;
$.ajax({
url: globals.BaseURL() + '/getPlaylist.view?' + globals.BaseParams() + '&id=' + id,
method: 'GET',
@@ -93,8 +91,8 @@ function PlaylistCtrl($scope, $rootScope, $location, utils, globals, model, noti
}
$scope.getStarred = function (action, type) {
var size = globals.settings.AutoPlaylistSize;
- $scope.selectedPlaylist = null;
- $scope.selectedAutoPlaylist = 'starred';
+ $rootScope.selectedPlaylist = null;
+ $rootScope.selectedAutoPlaylist = 'starred';
$.ajax({
url: globals.BaseURL() + '/getStarred.view?' + globals.BaseParams() + '&size=' + size,
method: 'GET',
@@ -225,8 +223,8 @@ function PlaylistCtrl($scope, $rootScope, $location, utils, globals, model, noti
}
}
$scope.deletePlaylist = function () {
- if ($scope.selectedPlaylist != null) {
- var id = $scope.selectedPlaylist;
+ if ($rootScope.selectedPlaylist != null) {
+ var id = $rootScope.selectedPlaylist;
if (utils.confirmDelete('Are you sure you want to delete the selected playlist?')) {
$.ajax({
url: globals.BaseURL() + '/deletePlaylist.view?' + globals.BaseParams() + '&id=' + id,
@@ -241,8 +239,8 @@ function PlaylistCtrl($scope, $rootScope, $location, utils, globals, model, noti
}
}
$scope.savePlaylist = function () {
- if ($scope.selectedPlaylist() != null) {
- var id = $scope.selectedPlaylist().id();
+ if ($rootScope.selectedPlaylist() != null) {
+ var id = $rootScope.selectedPlaylist().id();
var songs = [];
ko.utils.arrayForEach($rootScope.song(), function (item) {
songs.push(item.id);
@@ -297,7 +295,7 @@ function PlaylistCtrl($scope, $rootScope, $location, utils, globals, model, noti
/* Launch on Startup */
$scope.getPlaylists();
- $scope.getMusicFolders();
+ //$scope.getMusicFolders();
$scope.getGenres();
/* End Startup */
});
\ No newline at end of file
diff --git a/js/controllers/settings.js b/js/controllers/settings.js
index 4a9248b..8e1d046 100644
--- a/js/controllers/settings.js
+++ b/js/controllers/settings.js
@@ -15,9 +15,9 @@ function SettingsCtrl($scope, $routeParams, $location, utils, globals, json, not
$scope.Themes = ["Default", "Dark"];
$scope.$watch('settings.HideAZ', function () {
if (globals.settings.HideAZ) {
- $('#AZContainer').hide();
+ $('#AZIndex').hide();
} else {
- $('#AZContainer').show();
+ $('#AZIndex').show();
}
});
$scope.save = function () {
@@ -63,10 +63,11 @@ function SettingsCtrl($scope, $routeParams, $location, utils, globals, json, not
var Server = "http://subsonic.org/demo";
var Tab = "tabLibrary";
if (utils.confirmDelete("Do you want to connect to the Subsonic Demo server?")) {
- settings.Username(Username);
- settings.Password(Password);
- settings.Server(Server);
- location.reload();
+ globals.settings.Username = Username;
+ globals.settings.Password = Password;
+ globals.settings.Server = Server;
+ //$scope.save();
+ $location.url('/library');
}
}
diff --git a/js/json_changelog.js b/js/json_changelog.js
index eb391d7..77e1172 100644
--- a/js/json_changelog.js
+++ b/js/json_changelog.js
@@ -1,4 +1,10 @@
[
+{ "date": "10/31/2013", "version": "3.1.1",
+ "changes": [
+ { "text": "- Sway.fm Media Keys plugin fixed" },
+ { "text": "- Fixed issue with multiple sub-folders levels, other bug fixes" }
+ ]
+},
{ "date": "9/26/2013", "version": "3.1.0",
"changes": [
{ "text": "- ReRewrite of the code using
AngularJS " },
diff --git a/js/partials/archive.html b/js/partials/archive.html
index 073f619..2343ac2 100644
--- a/js/partials/archive.html
+++ b/js/partials/archive.html
@@ -1,7 +1,7 @@
-
+
All
None
+ Queue
@@ -10,12 +10,21 @@
-
+
Select Collection
?
-
- {{o.name}}
+
+
+
+
+
+
+
+ {{o}}
+
@@ -36,7 +45,13 @@
-
+
+
+
+
{{o.name}}
-
+
diff --git a/js/partials/library.html b/js/partials/library.html
index 88695eb..9f85666 100644
--- a/js/partials/library.html
+++ b/js/partials/library.html
@@ -1,20 +1,19 @@
-
-
-
-
- Album
- Song
-
-
-
-
+
+
+
+ Song
+ Album
+
+
+
+
All
None
+ Queue
@@ -26,19 +25,19 @@
-
+
-
- All Folders
-
+
+ All Folders
+
Auto Albums
{{o.name}}
@@ -49,17 +48,17 @@
-
@@ -68,23 +67,26 @@
-
+
+
+
-
- {{o.name}}
-
- Created: {{o.date}}
diff --git a/js/partials/playlists.html b/js/partials/playlists.html
index 042eb55..0d5cc6e 100644
--- a/js/partials/playlists.html
+++ b/js/partials/playlists.html
@@ -4,7 +4,7 @@
-
+
+ New
Delete
Save
diff --git a/js/partials/podcasts.html b/js/partials/podcasts.html
index 03598f8..94ae788 100644
--- a/js/partials/podcasts.html
+++ b/js/partials/podcasts.html
@@ -4,8 +4,8 @@
-
@@ -46,7 +46,7 @@
Thanks
-
{{o.name}}
-
{{o.album}}
+
+
+
{{o.time}}
diff --git a/js/partials/template.html b/js/partials/template.html
index 30efae1..389dde0 100644
--- a/js/partials/template.html
+++ b/js/partials/template.html
@@ -4,7 +4,7 @@
-
+
diff --git a/js/player.js b/js/player.js
index e2efeff..4904575 100644
--- a/js/player.js
+++ b/js/player.js
@@ -117,7 +117,7 @@
$rootScope.queue = items;
if ($rootScope.queue.length > 0) {
//$('body').layout().open('south');
- notifications.updateMessage($rootScope.queue.length + ' Song(s) Loaded to Queue', true);
+ notifications.updateMessage($rootScope.queue.length + ' Saved Song(s)', true);
}
if (globals.settings.Debug) { console.log('Play Queue Loaded From localStorage: ' + $rootScope.queue.length + ' song(s)'); }
}
@@ -159,6 +159,20 @@
$('#songdetails').css('visibility', 'visible');
$rootScope.loadjPlayer(player1, url, suffix, loadonly, position);
+ if (!loadonly) {
+ // Sway.fm UnityShim
+ var playerState = {
+ playing: true,
+ title: title,
+ artist: artist,
+ favorite: false,
+ albumArt: coverartfull
+ }
+ if ($rootScope.unity) {
+ $rootScope.unity.sendState(playerState);
+ }
+ // End UnityShim
+ }
$('#Queue').stop().scrollTo('#' + id, 400);
$('#QueuePreviewList').stop().scrollTo('#' + id, 400);
var spechtml = '';
@@ -240,18 +254,6 @@
}
if (!loadonly) { // Start playing
$(this).jPlayer("play");
- /* Uncomment to enable Unity shim
- var playerState = {
- playing: true,
- title: title,
- artist: artist,
- favorite: false,
- albumArt: coverartFullSrc
- }
- if (unity) {
- unity.sendState(playerState);
- }
- */
} else { // Loadonly
//$('#' + songid).addClass('playing');
$(this).jPlayer("pause", position);
@@ -287,7 +289,7 @@
var next = $rootScope.queue[0];
$rootScope.playSong(false, next);
} else if (globals.settings.AutoPlay) { // Load more tracks if enabled
- $scope.getRandomSongs('play', '', '');
+ $rootScope.getRandomSongs('play', '', '');
notifications.updateMessage('Auto Play Activated...', true);
}
} else {
diff --git a/js/plugins/UnityShim.js b/js/plugins/UnityShim.js
new file mode 100644
index 0000000..a596255
--- /dev/null
+++ b/js/plugins/UnityShim.js
@@ -0,0 +1,62 @@
+/*
+ * Use this function to create a Unity Music Shim. To use it, simply call setSupports to tell unity
+ * which features you support, give it a callback for actions as documented below,
+ * and notify it when your player state changes.
+ */
+var UnityMusicShim = function() {
+ var UnityObj = {};
+ /*
+ * sendState requires an object with any of the following properties.
+ * Call this whenever your player state changes.
+ *
+ * - playing: Boolean whether or not you are currently playing music
+ * - title: String the title of the current song
+ * - artist: String the artist of the current song
+ * - albumArt: String a URL to the album art of the current song. This must be a publically accessible url
+ * - favorite: Boolean whether or not the current song is marked as a favorite
+ * - thumbsUp: Boolean whether or not the current song is marked as thumbs up
+ * - thumbsDown: Boolean whether or not the current song is marked as thumbs down
+ */
+ UnityObj.sendState = function(state) {
+ var evt = document.createEvent("CustomEvent");
+ evt.initEvent("UnityStateEvent", true, true );
+ document.body.setAttribute('data-unity-state', JSON.stringify(state));
+ document.body.dispatchEvent(evt, state);
+ }
+
+ document.body.addEventListener('UnityActionEvent', function(e) {
+ var action = JSON.parse(document.body.getAttribute('data-unity-action'));
+ if (UnityObj._callbackObject) UnityObj._callbackObject[action]();
+ });
+
+ /*
+ * addCallbackObject requires an object with functions mapping to any features you support.
+ * - playpause: Toggle the paused state of your player.
+ * - next: Skip to the next song.
+ * - previous: Skip to the previous song.
+ * - thumbsUp: Mark (or unmark) this song as thumbs up.
+ * - thumbsDown: Mark (or unmark) this song as thumbs up.
+ * - favorite: Mark (or unmark) this song as a favorite.
+ */
+ UnityObj.setCallbackObject = function(cbObj) {
+ UnityObj._callbackObject = cbObj;
+ };
+ /*
+ * setSupports requires an object with any of the following features that your player supports.
+ * Pass true for anything you support, and omit any you don't.
+ *
+ * - playpause: Whether you support pausing the song. You must support this to use Unity
+ * - next: Whether you support skipping the current song.
+ * - previous: Whether you support going back to a previous song.
+ * - thumbsUp: Whether you support giving a song a thumbs up.
+ * - thumbsDown: Whether you support giving a song a thumbs down.
+ * - favorite: Whether you support marking song as a favorite.
+ */
+ UnityObj.setSupports = function(supports) {
+ var evt = document.createEvent("CustomEvent");
+ evt.initEvent("UnitySupportsEvent", true, true );
+ document.body.setAttribute('data-unity-supports', JSON.stringify(supports));
+ document.body.dispatchEvent(evt, supports);
+ }
+ return UnityObj;
+};
diff --git a/js/plugins/angular-cookies.js b/js/plugins/angular-cookies.js
new file mode 100644
index 0000000..f9eccc1
--- /dev/null
+++ b/js/plugins/angular-cookies.js
@@ -0,0 +1,184 @@
+/**
+ * @license AngularJS v1.1.4
+ * (c) 2010-2012 Google, Inc. http://angularjs.org
+ * License: MIT
+ */
+(function(window, angular, undefined) {
+'use strict';
+
+/**
+ * @ngdoc overview
+ * @name ngCookies
+ */
+
+
+angular.module('ngCookies', ['ng']).
+ /**
+ * @ngdoc object
+ * @name ngCookies.$cookies
+ * @requires $browser
+ *
+ * @description
+ * Provides read/write access to browser's cookies.
+ *
+ * Only a simple Object is exposed and by adding or removing properties to/from
+ * this object, new cookies are created/deleted at the end of current $eval.
+ *
+ * @example
+
+
+
+
+
+ */
+ factory('$cookies', ['$rootScope', '$browser', function ($rootScope, $browser) {
+ var cookies = {},
+ lastCookies = {},
+ lastBrowserCookies,
+ runEval = false,
+ copy = angular.copy,
+ isUndefined = angular.isUndefined;
+
+ //creates a poller fn that copies all cookies from the $browser to service & inits the service
+ $browser.addPollFn(function() {
+ var currentCookies = $browser.cookies();
+ if (lastBrowserCookies != currentCookies) { //relies on browser.cookies() impl
+ lastBrowserCookies = currentCookies;
+ copy(currentCookies, lastCookies);
+ copy(currentCookies, cookies);
+ if (runEval) $rootScope.$apply();
+ }
+ })();
+
+ runEval = true;
+
+ //at the end of each eval, push cookies
+ //TODO: this should happen before the "delayed" watches fire, because if some cookies are not
+ // strings or browser refuses to store some cookies, we update the model in the push fn.
+ $rootScope.$watch(push);
+
+ return cookies;
+
+
+ /**
+ * Pushes all the cookies from the service to the browser and verifies if all cookies were stored.
+ */
+ function push() {
+ var name,
+ value,
+ browserCookies,
+ updated;
+
+ //delete any cookies deleted in $cookies
+ for (name in lastCookies) {
+ if (isUndefined(cookies[name])) {
+ $browser.cookies(name, undefined);
+ }
+ }
+
+ //update all cookies updated in $cookies
+ for(name in cookies) {
+ value = cookies[name];
+ if (!angular.isString(value)) {
+ if (angular.isDefined(lastCookies[name])) {
+ cookies[name] = lastCookies[name];
+ } else {
+ delete cookies[name];
+ }
+ } else if (value !== lastCookies[name]) {
+ $browser.cookies(name, value);
+ updated = true;
+ }
+ }
+
+ //verify what was actually stored
+ if (updated){
+ updated = false;
+ browserCookies = $browser.cookies();
+
+ for (name in cookies) {
+ if (cookies[name] !== browserCookies[name]) {
+ //delete or reset all cookies that the browser dropped from $cookies
+ if (isUndefined(browserCookies[name])) {
+ delete cookies[name];
+ } else {
+ cookies[name] = browserCookies[name];
+ }
+ updated = true;
+ }
+ }
+ }
+ }
+ }]).
+
+
+ /**
+ * @ngdoc object
+ * @name ngCookies.$cookieStore
+ * @requires $cookies
+ *
+ * @description
+ * Provides a key-value (string-object) storage, that is backed by session cookies.
+ * Objects put or retrieved from this storage are automatically serialized or
+ * deserialized by angular's toJson/fromJson.
+ * @example
+ */
+ factory('$cookieStore', ['$cookies', function($cookies) {
+
+ return {
+ /**
+ * @ngdoc method
+ * @name ngCookies.$cookieStore#get
+ * @methodOf ngCookies.$cookieStore
+ *
+ * @description
+ * Returns the value of given cookie key
+ *
+ * @param {string} key Id to use for lookup.
+ * @returns {Object} Deserialized cookie value.
+ */
+ get: function(key) {
+ return angular.fromJson($cookies[key]);
+ },
+
+ /**
+ * @ngdoc method
+ * @name ngCookies.$cookieStore#put
+ * @methodOf ngCookies.$cookieStore
+ *
+ * @description
+ * Sets a value for given cookie key
+ *
+ * @param {string} key Id for the `value`.
+ * @param {Object} value Value to be stored.
+ */
+ put: function(key, value) {
+ $cookies[key] = angular.toJson(value);
+ },
+
+ /**
+ * @ngdoc method
+ * @name ngCookies.$cookieStore#remove
+ * @methodOf ngCookies.$cookieStore
+ *
+ * @description
+ * Remove given cookie
+ *
+ * @param {string} key Id of the key-value pair to delete.
+ */
+ remove: function(key) {
+ delete $cookies[key];
+ }
+ };
+
+ }]);
+
+
+})(window, window.angular);
diff --git a/js/plugins/angular-cookies.min.js b/js/plugins/angular-cookies.min.js
deleted file mode 100644
index f774f8c..0000000
--- a/js/plugins/angular-cookies.min.js
+++ /dev/null
@@ -1,7 +0,0 @@
-/*
- AngularJS v1.0.7
- (c) 2010-2012 Google, Inc. http://angularjs.org
- License: MIT
-*/
-(function(m,f,l){'use strict';f.module("ngCookies",["ng"]).factory("$cookies",["$rootScope","$browser",function(d,b){var c={},g={},h,i=!1,j=f.copy,k=f.isUndefined;b.addPollFn(function(){var a=b.cookies();h!=a&&(h=a,j(a,g),j(a,c),i&&d.$apply())})();i=!0;d.$watch(function(){var a,e,d;for(a in g)k(c[a])&&b.cookies(a,l);for(a in c)e=c[a],f.isString(e)?e!==g[a]&&(b.cookies(a,e),d=!0):f.isDefined(g[a])?c[a]=g[a]:delete c[a];if(d)for(a in e=b.cookies(),c)c[a]!==e[a]&&(k(e[a])?delete c[a]:c[a]=e[a])});return c}]).factory("$cookieStore",
-["$cookies",function(d){return{get:function(b){return(b=d[b])?f.fromJson(b):b},put:function(b,c){d[b]=f.toJson(c)},remove:function(b){delete d[b]}}}])})(window,window.angular);
diff --git a/js/plugins/angular-resource.min.js b/js/plugins/angular-resource.min.js
new file mode 100644
index 0000000..024dbfd
--- /dev/null
+++ b/js/plugins/angular-resource.min.js
@@ -0,0 +1,11 @@
+/*
+ AngularJS v1.1.4
+ (c) 2010-2012 Google, Inc. http://angularjs.org
+ License: MIT
+*/
+(function(B,f,x){'use strict';f.module("ngResource",["ng"]).factory("$resource",["$http","$parse",function(y,z){function v(g,c){this.template=g+"#";this.defaults=c||{};this.urlParams={}}function w(g,c,d){function j(e,b){var p={},b=q({},c,b);k(b,function(a,b){l(a)&&(a=a());var h;a.charAt&&a.charAt(0)=="@"?(h=a.substr(1),h=z(h)(e)):h=a;p[b]=h});return p}function b(b){u(b||{},this)}var m=new v(g),d=q({},A,d);k(d,function(e,c){e.method=f.uppercase(e.method);var p=e.method=="POST"||e.method=="PUT"||e.method==
+"PATCH";b[c]=function(a,c,h,g){function f(){i.$resolved=!0}var n={},d,o=r,s=null;switch(arguments.length){case 4:s=g,o=h;case 3:case 2:if(l(c)){if(l(a)){o=a;s=c;break}o=c;s=h}else{n=a;d=c;o=h;break}case 1:l(a)?o=a:p?d=a:n=a;break;case 0:break;default:throw"Expected between 0-4 arguments [params, data, success, error], got "+arguments.length+" arguments.";}var i=this instanceof b?this:e.isArray?[]:new b(d),t={};k(e,function(a,b){b!="params"&&b!="isArray"&&(t[b]=u(a))});t.data=d;m.setUrlParams(t,q({},
+j(d,e.params||{}),n),e.url);n=y(t);i.$resolved=!1;n.then(f,f);i.$then=n.then(function(a){var c=a.data,h=i.$then,d=i.$resolved;if(c)e.isArray?(i.length=0,k(c,function(a){i.push(new b(a))})):(u(c,i),i.$then=h,i.$resolved=d);(o||r)(i,a.headers);a.resource=i;return a},s).then;return i};b.prototype["$"+c]=function(a,e,h){var d=j(this),f=r,g;switch(arguments.length){case 3:d=a;f=e;g=h;break;case 2:case 1:l(a)?(f=a,g=e):(d=a,f=e||r);case 0:break;default:throw"Expected between 1-3 arguments [params, success, error], got "+
+arguments.length+" arguments.";}b[c].call(this,d,p?this:x,f,g)}});b.bind=function(b){return w(g,q({},c,b),d)};return b}var A={get:{method:"GET"},save:{method:"POST"},query:{method:"GET",isArray:!0},remove:{method:"DELETE"},"delete":{method:"DELETE"}},r=f.noop,k=f.forEach,q=f.extend,u=f.copy,l=f.isFunction;v.prototype={setUrlParams:function(g,c,d){var j=this,b=d||j.template,m,e,l=j.urlParams={};k(b.split(/\W/),function(c){c&&RegExp("(^|[^\\\\]):"+c+"(\\W|$)").test(b)&&(l[c]=!0)});b=b.replace(/\\:/g,
+":");c=c||{};k(j.urlParams,function(d,a){m=c.hasOwnProperty(a)?c[a]:j.defaults[a];f.isDefined(m)&&m!==null?(e=encodeURIComponent(m).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"%20").replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+"),b=b.replace(RegExp(":"+a+"(\\W|$)","g"),e+"$1")):b=b.replace(RegExp("(/?):"+a+"(\\W|$)","g"),function(a,b,c){return c.charAt(0)=="/"?c:b+c})});g.url=b.replace(/\/?#$/,"").replace(/\/*$/,"");k(c,function(b,
+a){if(!j.urlParams[a])g.params=g.params||{},g.params[a]=b})}};return w}])})(window,window.angular);
diff --git a/js/plugins/angular.min.js b/js/plugins/angular.min.js
index 2b22068..486d5e1 100644
--- a/js/plugins/angular.min.js
+++ b/js/plugins/angular.min.js
@@ -1,163 +1,173 @@
/*
- AngularJS v1.0.7
+ AngularJS v1.1.4
(c) 2010-2012 Google, Inc. http://angularjs.org
License: MIT
*/
-(function(P,T,q){'use strict';function m(b,a,c){var d;if(b)if(H(b))for(d in b)d!="prototype"&&d!="length"&&d!="name"&&b.hasOwnProperty(d)&&a.call(c,b[d],d);else if(b.forEach&&b.forEach!==m)b.forEach(a,c);else if(!b||typeof b.length!=="number"?0:typeof b.hasOwnProperty!="function"&&typeof b.constructor!="function"||b instanceof K||ca&&b instanceof ca||wa.call(b)!=="[object Object]"||typeof b.callee==="function")for(d=0;d
=0&&b.splice(c,1);return a}function U(b,a){if(oa(b)||b&&b.$evalAsync&&b.$watch)throw Error("Can't copy Window or Scope");if(a){if(b===a)throw Error("Can't copy equivalent objects or arrays");if(E(b))for(var c=a.length=0;c2?ha.call(arguments,2):[];return H(a)&&!(a instanceof RegExp)?c.length?function(){return arguments.length?a.apply(b,c.concat(ha.call(arguments,0))):a.apply(b,c)}:function(){return arguments.length?a.apply(b,arguments):a.call(b)}:a}function ic(b,a){var c=a;/^\$+/.test(b)?c=q:oa(a)?c="$WINDOW":a&&T===a?c="$DOCUMENT":a&&a.$evalAsync&&a.$watch&&(c="$SCOPE");return c}function da(b,a){return JSON.stringify(b,
-ic,a?" ":null)}function pb(b){return B(b)?JSON.parse(b):b}function Ua(b){b&&b.length!==0?(b=z(""+b),b=!(b=="f"||b=="0"||b=="false"||b=="no"||b=="n"||b=="[]")):b=!1;return b}function pa(b){b=u(b).clone();try{b.html("")}catch(a){}var c=u("").append(b).html();try{return b[0].nodeType===3?z(c):c.match(/^(<[^>]+>)/)[1].replace(/^<([\w\-]+)/,function(a,b){return"<"+z(b)})}catch(d){return z(c)}}function Va(b){var a={},c,d;m((b||"").split("&"),function(b){b&&(c=b.split("="),d=decodeURIComponent(c[0]),
-a[d]=y(c[1])?decodeURIComponent(c[1]):!0)});return a}function qb(b){var a=[];m(b,function(b,d){a.push(Wa(d,!0)+(b===!0?"":"="+Wa(b,!0)))});return a.length?a.join("&"):""}function Xa(b){return Wa(b,!0).replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+")}function Wa(b,a){return encodeURIComponent(b).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,a?"%20":"+")}function jc(b,a){function c(a){a&&d.push(a)}var d=[b],e,g,h=["ng:app","ng-app","x-ng-app",
-"data-ng-app"],f=/\sng[:\-]app(:\s*([\w\d_]+);?)?\s/;m(h,function(a){h[a]=!0;c(T.getElementById(a));a=a.replace(":","\\:");b.querySelectorAll&&(m(b.querySelectorAll("."+a),c),m(b.querySelectorAll("."+a+"\\:"),c),m(b.querySelectorAll("["+a+"]"),c))});m(d,function(a){if(!e){var b=f.exec(" "+a.className+" ");b?(e=a,g=(b[2]||"").replace(/\s+/g,",")):m(a.attributes,function(b){if(!e&&h[b.name])e=a,g=b.value})}});e&&a(e,g?[g]:[])}function rb(b,a){var c=function(){b=u(b);a=a||[];a.unshift(["$provide",function(a){a.value("$rootElement",
-b)}]);a.unshift("ng");var c=sb(a);c.invoke(["$rootScope","$rootElement","$compile","$injector",function(a,b,c,d){a.$apply(function(){b.data("$injector",d);c(b)(a)})}]);return c},d=/^NG_DEFER_BOOTSTRAP!/;if(P&&!d.test(P.name))return c();P.name=P.name.replace(d,"");Ya.resumeBootstrap=function(b){m(b,function(b){a.push(b)});c()}}function Za(b,a){a=a||"_";return b.replace(kc,function(b,d){return(d?a:"")+b.toLowerCase()})}function $a(b,a,c){if(!b)throw Error("Argument '"+(a||"?")+"' is "+(c||"required"));
-return b}function qa(b,a,c){c&&E(b)&&(b=b[b.length-1]);$a(H(b),a,"not a function, got "+(b&&typeof b=="object"?b.constructor.name||"Object":typeof b));return b}function lc(b){function a(a,b,e){return a[b]||(a[b]=e())}return a(a(b,"angular",Object),"module",function(){var b={};return function(d,e,g){e&&b.hasOwnProperty(d)&&(b[d]=null);return a(b,d,function(){function a(c,d,e){return function(){b[e||"push"]([c,d,arguments]);return k}}if(!e)throw Error("No module: "+d);var b=[],c=[],j=a("$injector",
-"invoke"),k={_invokeQueue:b,_runBlocks:c,requires:e,name:d,provider:a("$provide","provider"),factory:a("$provide","factory"),service:a("$provide","service"),value:a("$provide","value"),constant:a("$provide","constant","unshift"),filter:a("$filterProvider","register"),controller:a("$controllerProvider","register"),directive:a("$compileProvider","directive"),config:j,run:function(a){c.push(a);return this}};g&&j(g);return k})}})}function tb(b){return b.replace(mc,function(a,b,d,e){return e?d.toUpperCase():
-d}).replace(nc,"Moz$1")}function ab(b,a){function c(){var e;for(var b=[this],c=a,h,f,i,j,k,l;b.length;){h=b.shift();f=0;for(i=h.length;f
"+b;a.removeChild(a.firstChild);bb(this,a.childNodes);this.remove()}else bb(this,b)}function cb(b){return b.cloneNode(!0)}function ra(b){ub(b);for(var a=0,b=b.childNodes||[];a-1}function xb(b,a){a&&m(a.split(" "),function(a){b.className=Q((" "+b.className+" ").replace(/[\n\t]/g," ").replace(" "+Q(a)+" "," "))})}
-function yb(b,a){a&&m(a.split(" "),function(a){if(!Ca(b,a))b.className=Q(b.className+" "+Q(a))})}function bb(b,a){if(a)for(var a=!a.nodeName&&y(a.length)&&!oa(a)?a:[a],c=0;c4096&&c.warn("Cookie '"+a+"' possibly not set or overflowed because it was too large ("+d+" > 4096 bytes)!")}else{if(i.cookie!==$){$=i.cookie;d=$.split("; ");r={};for(f=0;f0&&(a=unescape(e.substring(0,j)),r[a]===q&&(r[a]=unescape(e.substring(j+1))))}return r}};f.defer=function(a,b){var c;
-p++;c=l(function(){delete o[c];e(a)},b||0);o[c]=!0;return c};f.defer.cancel=function(a){return o[a]?(delete o[a],n(a),e(C),!0):!1}}function wc(){this.$get=["$window","$log","$sniffer","$document",function(b,a,c,d){return new vc(b,d,a,c)}]}function xc(){this.$get=function(){function b(b,d){function e(a){if(a!=l){if(n){if(n==a)n=a.n}else n=a;g(a.n,a.p);g(a,l);l=a;l.n=null}}function g(a,b){if(a!=b){if(a)a.p=b;if(b)b.n=a}}if(b in a)throw Error("cacheId "+b+" taken");var h=0,f=v({},d,{id:b}),i={},j=d&&
-d.capacity||Number.MAX_VALUE,k={},l=null,n=null;return a[b]={put:function(a,b){var c=k[a]||(k[a]={key:a});e(c);w(b)||(a in i||h++,i[a]=b,h>j&&this.remove(n.key))},get:function(a){var b=k[a];if(b)return e(b),i[a]},remove:function(a){var b=k[a];if(b){if(b==l)l=b.p;if(b==n)n=b.n;g(b.n,b.p);delete k[a];delete i[a];h--}},removeAll:function(){i={};h=0;k={};l=n=null},destroy:function(){k=f=i=null;delete a[b]},info:function(){return v({},f,{size:h})}}}var a={};b.info=function(){var b={};m(a,function(a,e){b[e]=
-a.info()});return b};b.get=function(b){return a[b]};return b}}function yc(){this.$get=["$cacheFactory",function(b){return b("templates")}]}function Db(b){var a={},c="Directive",d=/^\s*directive\:\s*([\d\w\-_]+)\s+(.*)$/,e=/(([\d\w\-_]+)(?:\:([^;]+))?;?)/,g="Template must have exactly one root element. was: ",h=/^\s*(https?|ftp|mailto|file):/;this.directive=function i(d,e){B(d)?($a(e,"directive"),a.hasOwnProperty(d)||(a[d]=[],b.factory(d+c,["$injector","$exceptionHandler",function(b,c){var e=[];m(a[d],
-function(a){try{var g=b.invoke(a);if(H(g))g={compile:I(g)};else if(!g.compile&&g.link)g.compile=I(g.link);g.priority=g.priority||0;g.name=g.name||d;g.require=g.require||g.controller&&g.name;g.restrict=g.restrict||"A";e.push(g)}catch(h){c(h)}});return e}])),a[d].push(e)):m(d,nb(i));return this};this.urlSanitizationWhitelist=function(a){return y(a)?(h=a,this):h};this.$get=["$injector","$interpolate","$exceptionHandler","$http","$templateCache","$parse","$controller","$rootScope","$document",function(b,
-j,k,l,n,o,p,s,t){function x(a,b,c){a instanceof u||(a=u(a));m(a,function(b,c){b.nodeType==3&&b.nodeValue.match(/\S+/)&&(a[c]=u(b).wrap(" ").parent()[0])});var d=A(a,b,a,c);return function(b,c){$a(b,"scope");for(var e=c?ua.clone.call(a):a,j=0,g=e.length;jr.priority)break;if(Y=r.scope)ta("isolated scope",J,r,D),L(Y)&&(M(D,"ng-isolate-scope"),J=r),M(D,"ng-scope"),s=s||r;F=r.name;if(Y=r.controller)y=y||{},ta("'"+F+"' controller",y[F],r,D),y[F]=r;if(Y=r.transclude)ta("transclusion",ja,r,D),ja=r,l=r.priority,Y=="element"?(W=u(b),D=c.$$element=u(T.createComment(" "+
-F+": "+c[F]+" ")),b=D[0],C(e,u(W[0]),b),V=x(W,d,l)):(W=u(cb(b)).contents(),D.html(""),V=x(W,d));if(Y=r.template)if(ta("template",A,r,D),A=r,Y=Fb(Y),r.replace){W=u(""+Q(Y)+"
").contents();b=W[0];if(W.length!=1||b.nodeType!==1)throw Error(g+Y);C(e,D,b);F={$attr:{}};a=a.concat(N(b,a.splice(v+1,a.length-(v+1)),F));$(c,F);z=a.length}else D.html(Y);if(r.templateUrl)ta("template",A,r,D),A=r,i=R(a.splice(v,a.length-v),i,D,c,e,r.replace,V),z=a.length;else if(r.compile)try{w=r.compile(D,c,V),H(w)?
-j(null,w):w&&j(w.pre,w.post)}catch(G){k(G,pa(D))}if(r.terminal)i.terminal=!0,l=Math.max(l,r.priority)}i.scope=s&&s.scope;i.transclude=ja&&V;return i}function r(d,e,g,j){var h=!1;if(a.hasOwnProperty(e))for(var o,e=b.get(e+c),l=0,p=e.length;lo.priority)&&o.restrict.indexOf(g)!=-1)d.push(o),h=!0}catch(n){k(n)}return h}function $(a,b){var c=b.$attr,d=a.$attr,e=a.$$element;m(a,function(d,e){e.charAt(0)!="$"&&(b[e]&&(d+=(e==="style"?";":" ")+b[e]),a.$set(e,d,!0,c[e]))});m(b,
-function(b,g){g=="class"?(M(e,b),a["class"]=(a["class"]?a["class"]+" ":"")+b):g=="style"?e.attr("style",e.attr("style")+";"+b):g.charAt(0)!="$"&&!a.hasOwnProperty(g)&&(a[g]=b,d[g]=c[g])})}function R(a,b,c,d,e,j,h){var i=[],k,o,p=c[0],t=a.shift(),s=v({},t,{controller:null,templateUrl:null,transclude:null,scope:null});c.html("");l.get(t.templateUrl,{cache:n}).success(function(l){var n,t,l=Fb(l);if(j){t=u("
"+Q(l)+"
").contents();n=t[0];if(t.length!=1||n.nodeType!==1)throw Error(g+l);l={$attr:{}};
-C(e,c,n);N(n,a,l);$(d,l)}else n=p,c.html(l);a.unshift(s);k=J(a,n,d,h);for(o=A(c[0].childNodes,h);i.length;){var r=i.pop(),l=i.pop();t=i.pop();var ia=i.pop(),D=n;t!==p&&(D=cb(n),C(l,u(t),D));k(function(){b(o,ia,D,e,r)},ia,D,e,r)}i=null}).error(function(a,b,c,d){throw Error("Failed to load template: "+d.url);});return function(a,c,d,e,g){i?(i.push(c),i.push(d),i.push(e),i.push(g)):k(function(){b(o,c,d,e,g)},c,d,e,g)}}function F(a,b){return b.priority-a.priority}function ta(a,b,c,d){if(b)throw Error("Multiple directives ["+
-b.name+", "+c.name+"] asking for "+a+" on: "+pa(d));}function y(a,b){var c=j(b,!0);c&&a.push({priority:0,compile:I(function(a,b){var d=b.parent(),e=d.data("$binding")||[];e.push(c);M(d.data("$binding",e),"ng-binding");a.$watch(c,function(a){b[0].nodeValue=a})})})}function V(a,b,c,d){var e=j(c,!0);e&&b.push({priority:100,compile:I(function(a,b,c){b=c.$$observers||(c.$$observers={});d==="class"&&(e=j(c[d],!0));c[d]=q;(b[d]||(b[d]=[])).$$inter=!0;(c.$$observers&&c.$$observers[d].$$scope||a).$watch(e,
-function(a){c.$set(d,a)})})})}function C(a,b,c){var d=b[0],e=d.parentNode,g,j;if(a){g=0;for(j=a.length;g
-0){var e=R[0],f=e.text;if(f==a||f==b||f==c||f==d||!a&&!b&&!c&&!d)return e}return!1}function f(b,c,d,f){return(b=h(b,c,d,f))?(a&&!b.json&&e("is not valid json",b),R.shift(),b):!1}function i(a){f(a)||e("is unexpected, expecting ["+a+"]",h())}function j(a,b){return function(c,d){return a(c,d,b)}}function k(a,b,c){return function(d,e){return b(d,e,a,c)}}function l(){for(var a=[];;)if(R.length>0&&!h("}",")",";","]")&&a.push(w()),!f(";"))return a.length==1?a[0]:function(b,c){for(var d,e=0;e","<=",">="))a=k(a,b.fn,t());return a}function x(){for(var a=m(),b;b=f("*","/","%");)a=k(a,b.fn,m());return a}function m(){var a;return f("+")?A():(a=f("-"))?k(r,a.fn,m()):(a=f("!"))?j(a.fn,m()):A()}function A(){var a;if(f("("))a=w(),i(")");else if(f("["))a=N();else if(f("{"))a=J();else{var b=f();(a=b.fn)||e("not a primary expression",b)}for(var c;b=f("(","[",".");)b.text==="("?(a=y(a,c),c=null):b.text==="["?(c=a,a=V(a)):b.text==="."?(c=a,a=u(a)):e("IMPOSSIBLE");return a}function N(){var a=
-[];if(g().text!="]"){do a.push(F());while(f(","))}i("]");return function(b,c){for(var d=[],e=0;e1;d++){var e=a.shift(),g=b[e];g||(g={},b[e]=g);b=g}return b[a.shift()]=
-c}function gb(b,a,c){if(!a)return b;for(var a=a.split("."),d,e=b,g=a.length,h=0;h7),hasEvent:function(c){if(c=="input"&&Z==9)return!1;if(w(a[c])){var e=b.document.createElement("div");a[c]="on"+c in e}return a[c]},csp:!1}}]}function Vc(){this.$get=I(P)}function Ob(b){var a={},c,d,e;if(!b)return a;m(b.split("\n"),function(b){e=b.indexOf(":");c=z(Q(b.substr(0,
-e)));d=Q(b.substr(e+1));c&&(a[c]?a[c]+=", "+d:a[c]=d)});return a}function Pb(b){var a=L(b)?b:q;return function(c){a||(a=Ob(b));return c?a[z(c)]||null:a}}function Qb(b,a,c){if(H(c))return c(b,a);m(c,function(c){b=c(b,a)});return b}function Wc(){var b=/^\s*(\[|\{[^\{])/,a=/[\}\]]\s*$/,c=/^\)\]\}',?\n/,d=this.defaults={transformResponse:[function(d){B(d)&&(d=d.replace(c,""),b.test(d)&&a.test(d)&&(d=pb(d,!0)));return d}],transformRequest:[function(a){return L(a)&&wa.apply(a)!=="[object File]"?da(a):a}],
-headers:{common:{Accept:"application/json, text/plain, */*","X-Requested-With":"XMLHttpRequest"},post:{"Content-Type":"application/json;charset=utf-8"},put:{"Content-Type":"application/json;charset=utf-8"}}},e=this.responseInterceptors=[];this.$get=["$httpBackend","$browser","$cacheFactory","$rootScope","$q","$injector",function(a,b,c,i,j,k){function l(a){function c(a){var b=v({},a,{data:Qb(a.data,a.headers,f)});return 200<=a.status&&a.status<300?b:j.reject(b)}a.method=la(a.method);var e=a.transformRequest||
-d.transformRequest,f=a.transformResponse||d.transformResponse,g=d.headers,g=v({"X-XSRF-TOKEN":b.cookies()["XSRF-TOKEN"]},g.common,g[z(a.method)],a.headers),e=Qb(a.data,Pb(g),e),i;w(a.data)&&delete g["Content-Type"];i=n(a,e,g);i=i.then(c,c);m(s,function(a){i=a(i)});i.success=function(b){i.then(function(c){b(c.data,c.status,c.headers,a)});return i};i.error=function(b){i.then(null,function(c){b(c.data,c.status,c.headers,a)});return i};return i}function n(b,c,d){function e(a,b,c){m&&(200<=a&&a<300?m.put(q,
-[a,b,Ob(c)]):m.remove(q));f(b,a,c);i.$apply()}function f(a,c,d){c=Math.max(c,0);(200<=c&&c<300?k.resolve:k.reject)({data:a,status:c,headers:Pb(d),config:b})}function h(){var a=za(l.pendingRequests,b);a!==-1&&l.pendingRequests.splice(a,1)}var k=j.defer(),n=k.promise,m,s,q=o(b.url,b.params);l.pendingRequests.push(b);n.then(h,h);b.cache&&b.method=="GET"&&(m=L(b.cache)?b.cache:p);if(m)if(s=m.get(q))if(s.then)return s.then(h,h),s;else E(s)?f(s[1],s[0],U(s[2])):f(s,200,{});else m.put(q,n);s||a(b.method,
-q,c,e,d,b.timeout,b.withCredentials);return n}function o(a,b){if(!b)return a;var c=[];fc(b,function(a,b){a==null||a==q||(L(a)&&(a=da(a)),c.push(encodeURIComponent(b)+"="+encodeURIComponent(a)))});return a+(a.indexOf("?")==-1?"?":"&")+c.join("&")}var p=c("$http"),s=[];m(e,function(a){s.push(B(a)?k.get(a):k.invoke(a))});l.pendingRequests=[];(function(a){m(arguments,function(a){l[a]=function(b,c){return l(v(c||{},{method:a,url:b}))}})})("get","delete","head","jsonp");(function(a){m(arguments,function(a){l[a]=
-function(b,c,d){return l(v(d||{},{method:a,url:b,data:c}))}})})("post","put");l.defaults=d;return l}]}function Xc(){this.$get=["$browser","$window","$document",function(b,a,c){return Yc(b,Zc,b.defer,a.angular.callbacks,c[0],a.location.protocol.replace(":",""))}]}function Yc(b,a,c,d,e,g){function h(a,b){var c=e.createElement("script"),d=function(){e.body.removeChild(c);b&&b()};c.type="text/javascript";c.src=a;Z?c.onreadystatechange=function(){/loaded|complete/.test(c.readyState)&&d()}:c.onload=c.onerror=
-d;e.body.appendChild(c)}return function(e,i,j,k,l,n,o){function p(a,c,d,e){c=(i.match(Hb)||["",g])[1]=="file"?d?200:404:c;a(c==1223?204:c,d,e);b.$$completeOutstandingRequest(C)}b.$$incOutstandingRequestCount();i=i||b.url();if(z(e)=="jsonp"){var s="_"+(d.counter++).toString(36);d[s]=function(a){d[s].data=a};h(i.replace("JSON_CALLBACK","angular.callbacks."+s),function(){d[s].data?p(k,200,d[s].data):p(k,-2);delete d[s]})}else{var t=new a;t.open(e,i,!0);m(l,function(a,b){a&&t.setRequestHeader(b,a)});
-var q;t.onreadystatechange=function(){if(t.readyState==4){var a=t.getAllResponseHeaders(),b=["Cache-Control","Content-Language","Content-Type","Expires","Last-Modified","Pragma"];a||(a="",m(b,function(b){var c=t.getResponseHeader(b);c&&(a+=b+": "+c+"\n")}));p(k,q||t.status,t.responseText,a)}};if(o)t.withCredentials=!0;t.send(j||"");n>0&&c(function(){q=-1;t.abort()},n)}}}function $c(){this.$get=function(){return{id:"en-us",NUMBER_FORMATS:{DECIMAL_SEP:".",GROUP_SEP:",",PATTERNS:[{minInt:1,minFrac:0,
-maxFrac:3,posPre:"",posSuf:"",negPre:"-",negSuf:"",gSize:3,lgSize:3},{minInt:1,minFrac:2,maxFrac:2,posPre:"\u00a4",posSuf:"",negPre:"(\u00a4",negSuf:")",gSize:3,lgSize:3}],CURRENCY_SYM:"$"},DATETIME_FORMATS:{MONTH:"January,February,March,April,May,June,July,August,September,October,November,December".split(","),SHORTMONTH:"Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec".split(","),DAY:"Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday".split(","),SHORTDAY:"Sun,Mon,Tue,Wed,Thu,Fri,Sat".split(","),
-AMPMS:["AM","PM"],medium:"MMM d, y h:mm:ss a","short":"M/d/yy h:mm a",fullDate:"EEEE, MMMM d, y",longDate:"MMMM d, y",mediumDate:"MMM d, y",shortDate:"M/d/yy",mediumTime:"h:mm:ss a",shortTime:"h:mm a"},pluralCat:function(b){return b===1?"one":"other"}}}}function ad(){this.$get=["$rootScope","$browser","$q","$exceptionHandler",function(b,a,c,d){function e(e,f,i){var j=c.defer(),k=j.promise,l=y(i)&&!i,f=a.defer(function(){try{j.resolve(e())}catch(a){j.reject(a),d(a)}l||b.$apply()},f),i=function(){delete g[k.$$timeoutId]};
-k.$$timeoutId=f;g[f]=j;k.then(i,i);return k}var g={};e.cancel=function(b){return b&&b.$$timeoutId in g?(g[b.$$timeoutId].reject("canceled"),a.defer.cancel(b.$$timeoutId)):!1};return e}]}function Rb(b){function a(a,e){return b.factory(a+c,e)}var c="Filter";this.register=a;this.$get=["$injector",function(a){return function(b){return a.get(b+c)}}];a("currency",Sb);a("date",Tb);a("filter",bd);a("json",cd);a("limitTo",dd);a("lowercase",ed);a("number",Ub);a("orderBy",Vb);a("uppercase",fd)}function bd(){return function(b,
-a){if(!E(b))return b;var c=[];c.check=function(a){for(var b=0;b-1;case "object":for(var c in a)if(c.charAt(0)!=="$"&&d(a[c],b))return!0;return!1;case "array":for(c=0;ce+1?h="0":(f=h,j=!0)}if(!j){h=(h.split(Xb)[1]||"").length;w(e)&&(e=Math.min(Math.max(a.minFrac,h),a.maxFrac));var h=Math.pow(10,e),b=Math.round(b*h)/h,b=(""+b).split(Xb),h=b[0],b=b[1]||"",j=0,k=a.lgSize,
-l=a.gSize;if(h.length>=k+l)for(var j=h.length-k,n=0;n0||e>
--c)e+=c;e===0&&c==-12&&(e=12);return jb(e,a,d)}}function Ja(b,a){return function(c,d){var e=c["get"+b](),g=la(a?"SHORT"+b:b);return d[g][e]}}function Tb(b){function a(a){var b;if(b=a.match(c)){var a=new Date(0),g=0,h=0;b[9]&&(g=G(b[9]+b[10]),h=G(b[9]+b[11]));a.setUTCFullYear(G(b[1]),G(b[2])-1,G(b[3]));a.setUTCHours(G(b[4]||0)-g,G(b[5]||0)-h,G(b[6]||0),G(b[7]||0))}return a}var c=/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/;return function(c,
-e){var g="",h=[],f,i,e=e||"mediumDate",e=b.DATETIME_FORMATS[e]||e;B(c)&&(c=gd.test(c)?G(c):a(c));Qa(c)&&(c=new Date(c));if(!na(c))return c;for(;e;)(i=hd.exec(e))?(h=h.concat(ha.call(i,1)),e=h.pop()):(h.push(e),e=null);m(h,function(a){f=id[a];g+=f?f(c,b.DATETIME_FORMATS):a.replace(/(^'|'$)/g,"").replace(/''/g,"'")});return g}}function cd(){return function(b){return da(b,!0)}}function dd(){return function(b,a){if(!(b instanceof Array))return b;var a=G(a),c=[],d,e;if(!b||!(b instanceof Array))return c;
-a>b.length?a=b.length:a<-b.length&&(a=-b.length);a>0?(d=0,e=a):(d=b.length+a,e=b.length);for(;dn?(d.$setValidity("maxlength",!1),q):(d.$setValidity("maxlength",!0),a)};d.$parsers.push(c);d.$formatters.push(c)}}function kb(b,a){b="ngClass"+b;return S(function(c,d,e){function g(b){if(a===!0||c.$index%2===a)i&&!fa(b,i)&&h(i),f(b);i=U(b)}function h(a){L(a)&&
-!E(a)&&(a=Ra(a,function(a,b){if(a)return b}));d.removeClass(E(a)?a.join(" "):a)}function f(a){L(a)&&!E(a)&&(a=Ra(a,function(a,b){if(a)return b}));a&&d.addClass(E(a)?a.join(" "):a)}var i=q;c.$watch(e[b],g,!0);e.$observe("class",function(){var a=c.$eval(e[b]);g(a,a)});b!=="ngClass"&&c.$watch("$index",function(d,g){var i=d&1;i!==g&1&&(i===a?f(c.$eval(e[b])):h(c.$eval(e[b])))})})}var z=function(b){return B(b)?b.toLowerCase():b},la=function(b){return B(b)?b.toUpperCase():b},Z=G((/msie (\d+)/.exec(z(navigator.userAgent))||
-[])[1]),u,ca,ha=[].slice,Pa=[].push,wa=Object.prototype.toString,Ya=P.angular||(P.angular={}),sa,fb,aa=["0","0","0"];C.$inject=[];ma.$inject=[];fb=Z<9?function(b){b=b.nodeName?b:b[0];return b.scopeName&&b.scopeName!="HTML"?la(b.scopeName+":"+b.nodeName):b.nodeName}:function(b){return b.nodeName?b.nodeName:b[0].nodeName};var kc=/[A-Z]/g,jd={full:"1.0.7",major:1,minor:0,dot:7,codeName:"monochromatic-rainbow"},Ba=K.cache={},Aa=K.expando="ng-"+(new Date).getTime(),oc=1,$b=P.document.addEventListener?
-function(b,a,c){b.addEventListener(a,c,!1)}:function(b,a,c){b.attachEvent("on"+a,c)},db=P.document.removeEventListener?function(b,a,c){b.removeEventListener(a,c,!1)}:function(b,a,c){b.detachEvent("on"+a,c)},mc=/([\:\-\_]+(.))/g,nc=/^moz([A-Z])/,ua=K.prototype={ready:function(b){function a(){c||(c=!0,b())}var c=!1;this.bind("DOMContentLoaded",a);K(P).bind("load",a)},toString:function(){var b=[];m(this,function(a){b.push(""+a)});return"["+b.join(", ")+"]"},eq:function(b){return b>=0?u(this[b]):u(this[this.length+
-b])},length:0,push:Pa,sort:[].sort,splice:[].splice},Ea={};m("multiple,selected,checked,disabled,readOnly,required".split(","),function(b){Ea[z(b)]=b});var Bb={};m("input,select,option,textarea,button,form".split(","),function(b){Bb[la(b)]=!0});m({data:wb,inheritedData:Da,scope:function(b){return Da(b,"$scope")},controller:zb,injector:function(b){return Da(b,"$injector")},removeAttr:function(b,a){b.removeAttribute(a)},hasClass:Ca,css:function(b,a,c){a=tb(a);if(y(c))b.style[a]=c;else{var d;Z<=8&&(d=
-b.currentStyle&&b.currentStyle[a],d===""&&(d="auto"));d=d||b.style[a];Z<=8&&(d=d===""?q:d);return d}},attr:function(b,a,c){var d=z(a);if(Ea[d])if(y(c))c?(b[a]=!0,b.setAttribute(a,d)):(b[a]=!1,b.removeAttribute(d));else return b[a]||(b.attributes.getNamedItem(a)||C).specified?d:q;else if(y(c))b.setAttribute(a,c);else if(b.getAttribute)return b=b.getAttribute(a,2),b===null?q:b},prop:function(b,a,c){if(y(c))b[a]=c;else return b[a]},text:v(Z<9?function(b,a){if(b.nodeType==1){if(w(a))return b.innerText;
-b.innerText=a}else{if(w(a))return b.nodeValue;b.nodeValue=a}}:function(b,a){if(w(a))return b.textContent;b.textContent=a},{$dv:""}),val:function(b,a){if(w(a))return b.value;b.value=a},html:function(b,a){if(w(a))return b.innerHTML;for(var c=0,d=b.childNodes;c":function(a,c,d,e){return d(a,c)>e(a,c)},"<=":function(a,c,d,e){return d(a,c)<=e(a,c)},">=":function(a,c,d,e){return d(a,c)>=e(a,c)},"&&":function(a,c,d,e){return d(a,c)&&e(a,c)},"||":function(a,c,d,e){return d(a,c)||e(a,c)},"&":function(a,c,d,e){return d(a,c)&e(a,c)},"|":function(a,c,d,e){return e(a,c)(a,c,d(a,c))},"!":function(a,c,d){return!d(a,c)}},Mc={n:"\n",f:"\u000c",r:"\r",t:"\t",v:"\u000b","'":"'",'"':'"'},ib={},Zc=P.XMLHttpRequest||function(){try{return new ActiveXObject("Msxml2.XMLHTTP.6.0")}catch(a){}try{return new ActiveXObject("Msxml2.XMLHTTP.3.0")}catch(c){}try{return new ActiveXObject("Msxml2.XMLHTTP")}catch(d){}throw Error("This browser does not support XMLHttpRequest.");
-};Rb.$inject=["$provide"];Sb.$inject=["$locale"];Ub.$inject=["$locale"];var Xb=".",id={yyyy:O("FullYear",4),yy:O("FullYear",2,0,!0),y:O("FullYear",1),MMMM:Ja("Month"),MMM:Ja("Month",!0),MM:O("Month",2,1),M:O("Month",1,1),dd:O("Date",2),d:O("Date",1),HH:O("Hours",2),H:O("Hours",1),hh:O("Hours",2,-12),h:O("Hours",1,-12),mm:O("Minutes",2),m:O("Minutes",1),ss:O("Seconds",2),s:O("Seconds",1),EEEE:Ja("Day"),EEE:Ja("Day",!0),a:function(a,c){return a.getHours()<12?c.AMPMS[0]:c.AMPMS[1]},Z:function(a){var a=
--1*a.getTimezoneOffset(),c=a>=0?"+":"";c+=jb(Math[a>0?"floor":"ceil"](a/60),2)+jb(Math.abs(a%60),2);return c}},hd=/((?:[^yMdHhmsaZE']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d+|H+|h+|m+|s+|a|Z))(.*)/,gd=/^\d+$/;Tb.$inject=["$locale"];var ed=I(z),fd=I(la);Vb.$inject=["$parse"];var kd=I({restrict:"E",compile:function(a,c){Z<=8&&(!c.href&&!c.name&&c.$set("href",""),a.append(T.createComment("IE fix")));return function(a,c){c.bind("click",function(a){c.attr("href")||a.preventDefault()})}}}),lb={};m(Ea,function(a,
-c){var d=ea("ng-"+c);lb[d]=function(){return{priority:100,compile:function(){return function(a,g,h){a.$watch(h[d],function(a){h.$set(c,!!a)})}}}}});m(["src","href"],function(a){var c=ea("ng-"+a);lb[c]=function(){return{priority:99,link:function(d,e,g){g.$observe(c,function(c){c&&(g.$set(a,c),Z&&e.prop(a,g[a]))})}}}});var Ma={$addControl:C,$removeControl:C,$setValidity:C,$setDirty:C};Yb.$inject=["$element","$attrs","$scope"];var Pa=function(a){return["$timeout",function(c){var d={name:"form",restrict:"E",
-controller:Yb,compile:function(){return{pre:function(a,d,h,f){if(!h.action){var i=function(a){a.preventDefault?a.preventDefault():a.returnValue=!1};$b(d[0],"submit",i);d.bind("$destroy",function(){c(function(){db(d[0],"submit",i)},0,!1)})}var j=d.parent().controller("form"),k=h.name||h.ngForm;k&&(a[k]=f);j&&d.bind("$destroy",function(){j.$removeControl(f);k&&(a[k]=q);v(f,Ma)})}}}};return a?v(U(d),{restrict:"EAC"}):d}]},ld=Pa(),md=Pa(!0),nd=/^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/,
-od=/^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$/,pd=/^\s*(\-|\+)?(\d+|(\d*(\.\d*)))\s*$/,bc={text:Oa,number:function(a,c,d,e,g,h){Oa(a,c,d,e,g,h);e.$parsers.push(function(a){var c=X(a);return c||pd.test(a)?(e.$setValidity("number",!0),a===""?null:c?a:parseFloat(a)):(e.$setValidity("number",!1),q)});e.$formatters.push(function(a){return X(a)?"":""+a});if(d.min){var f=parseFloat(d.min),a=function(a){return!X(a)&&ai?(e.$setValidity("max",!1),q):(e.$setValidity("max",!0),a)};e.$parsers.push(d);e.$formatters.push(d)}e.$formatters.push(function(a){return X(a)||Qa(a)?(e.$setValidity("number",!0),a):(e.$setValidity("number",!1),q)})},url:function(a,c,d,e,g,h){Oa(a,c,d,e,g,h);a=function(a){return X(a)||nd.test(a)?(e.$setValidity("url",!0),a):(e.$setValidity("url",!1),q)};e.$formatters.push(a);e.$parsers.push(a)},email:function(a,
-c,d,e,g,h){Oa(a,c,d,e,g,h);a=function(a){return X(a)||od.test(a)?(e.$setValidity("email",!0),a):(e.$setValidity("email",!1),q)};e.$formatters.push(a);e.$parsers.push(a)},radio:function(a,c,d,e){w(d.name)&&c.attr("name",xa());c.bind("click",function(){c[0].checked&&a.$apply(function(){e.$setViewValue(d.value)})});e.$render=function(){c[0].checked=d.value==e.$viewValue};d.$observe("value",e.$render)},checkbox:function(a,c,d,e){var g=d.ngTrueValue,h=d.ngFalseValue;B(g)||(g=!0);B(h)||(h=!1);c.bind("click",
-function(){a.$apply(function(){e.$setViewValue(c[0].checked)})});e.$render=function(){c[0].checked=e.$viewValue};e.$formatters.push(function(a){return a===g});e.$parsers.push(function(a){return a?g:h})},hidden:C,button:C,submit:C,reset:C},cc=["$browser","$sniffer",function(a,c){return{restrict:"E",require:"?ngModel",link:function(d,e,g,h){h&&(bc[z(g.type)]||bc.text)(d,e,g,h,c,a)}}}],La="ng-valid",Ka="ng-invalid",Na="ng-pristine",Zb="ng-dirty",qd=["$scope","$exceptionHandler","$attrs","$element","$parse",
-function(a,c,d,e,g){function h(a,c){c=c?"-"+Za(c,"-"):"";e.removeClass((a?Ka:La)+c).addClass((a?La:Ka)+c)}this.$modelValue=this.$viewValue=Number.NaN;this.$parsers=[];this.$formatters=[];this.$viewChangeListeners=[];this.$pristine=!0;this.$dirty=!1;this.$valid=!0;this.$invalid=!1;this.$name=d.name;var f=g(d.ngModel),i=f.assign;if(!i)throw Error(Eb+d.ngModel+" ("+pa(e)+")");this.$render=C;var j=e.inheritedData("$formController")||Ma,k=0,l=this.$error={};e.addClass(Na);h(!0);this.$setValidity=function(a,
-c){if(l[a]!==!c){if(c){if(l[a]&&k--,!k)h(!0),this.$valid=!0,this.$invalid=!1}else h(!1),this.$invalid=!0,this.$valid=!1,k++;l[a]=!c;h(c,a);j.$setValidity(a,c,this)}};this.$setViewValue=function(d){this.$viewValue=d;if(this.$pristine)this.$dirty=!0,this.$pristine=!1,e.removeClass(Na).addClass(Zb),j.$setDirty();m(this.$parsers,function(a){d=a(d)});if(this.$modelValue!==d)this.$modelValue=d,i(a,d),m(this.$viewChangeListeners,function(a){try{a()}catch(d){c(d)}})};var n=this;a.$watch(function(){var c=
-f(a);if(n.$modelValue!==c){var d=n.$formatters,e=d.length;for(n.$modelValue=c;e--;)c=d[e](c);if(n.$viewValue!==c)n.$viewValue=c,n.$render()}})}],rd=function(){return{require:["ngModel","^?form"],controller:qd,link:function(a,c,d,e){var g=e[0],h=e[1]||Ma;h.$addControl(g);c.bind("$destroy",function(){h.$removeControl(g)})}}},sd=I({require:"ngModel",link:function(a,c,d,e){e.$viewChangeListeners.push(function(){a.$eval(d.ngChange)})}}),dc=function(){return{require:"?ngModel",link:function(a,c,d,e){if(e){d.required=
-!0;var g=function(a){if(d.required&&(X(a)||a===!1))e.$setValidity("required",!1);else return e.$setValidity("required",!0),a};e.$formatters.push(g);e.$parsers.unshift(g);d.$observe("required",function(){g(e.$viewValue)})}}}},td=function(){return{require:"ngModel",link:function(a,c,d,e){var g=(a=/\/(.*)\//.exec(d.ngList))&&RegExp(a[1])||d.ngList||",";e.$parsers.push(function(a){var c=[];a&&m(a.split(g),function(a){a&&c.push(Q(a))});return c});e.$formatters.push(function(a){return E(a)?a.join(", "):
-q})}}},ud=/^(true|false|\d+)$/,vd=function(){return{priority:100,compile:function(a,c){return ud.test(c.ngValue)?function(a,c,g){g.$set("value",a.$eval(g.ngValue))}:function(a,c,g){a.$watch(g.ngValue,function(a){g.$set("value",a,!1)})}}}},wd=S(function(a,c,d){c.addClass("ng-binding").data("$binding",d.ngBind);a.$watch(d.ngBind,function(a){c.text(a==q?"":a)})}),xd=["$interpolate",function(a){return function(c,d,e){c=a(d.attr(e.$attr.ngBindTemplate));d.addClass("ng-binding").data("$binding",c);e.$observe("ngBindTemplate",
-function(a){d.text(a)})}}],yd=[function(){return function(a,c,d){c.addClass("ng-binding").data("$binding",d.ngBindHtmlUnsafe);a.$watch(d.ngBindHtmlUnsafe,function(a){c.html(a||"")})}}],zd=kb("",!0),Ad=kb("Odd",0),Bd=kb("Even",1),Cd=S({compile:function(a,c){c.$set("ngCloak",q);a.removeClass("ng-cloak")}}),Dd=[function(){return{scope:!0,controller:"@"}}],Ed=["$sniffer",function(a){return{priority:1E3,compile:function(){a.csp=!0}}}],ec={};m("click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave".split(" "),
-function(a){var c=ea("ng-"+a);ec[c]=["$parse",function(d){return function(e,g,h){var f=d(h[c]);g.bind(z(a),function(a){e.$apply(function(){f(e,{$event:a})})})}}]});var Fd=S(function(a,c,d){c.bind("submit",function(){a.$apply(d.ngSubmit)})}),Gd=["$http","$templateCache","$anchorScroll","$compile",function(a,c,d,e){return{restrict:"ECA",terminal:!0,compile:function(g,h){var f=h.ngInclude||h.src,i=h.onload||"",j=h.autoscroll;return function(g,h){var n=0,o,p=function(){o&&(o.$destroy(),o=null);h.html("")};
-g.$watch(f,function(f){var m=++n;f?a.get(f,{cache:c}).success(function(a){m===n&&(o&&o.$destroy(),o=g.$new(),h.html(a),e(h.contents())(o),y(j)&&(!j||g.$eval(j))&&d(),o.$emit("$includeContentLoaded"),g.$eval(i))}).error(function(){m===n&&p()}):p()})}}}}],Hd=S({compile:function(){return{pre:function(a,c,d){a.$eval(d.ngInit)}}}}),Id=S({terminal:!0,priority:1E3}),Jd=["$locale","$interpolate",function(a,c){var d=/{}/g;return{restrict:"EA",link:function(e,g,h){var f=h.count,i=g.attr(h.$attr.when),j=h.offset||
-0,k=e.$eval(i),l={},n=c.startSymbol(),o=c.endSymbol();m(k,function(a,e){l[e]=c(a.replace(d,n+f+"-"+j+o))});e.$watch(function(){var c=parseFloat(e.$eval(f));return isNaN(c)?"":(c in k||(c=a.pluralCat(c-j)),l[c](e,g,!0))},function(a){g.text(a)})}}}],Kd=S({transclude:"element",priority:1E3,terminal:!0,compile:function(a,c,d){return function(a,c,h){var f=h.ngRepeat,h=f.match(/^\s*(.+)\s+in\s+(.*)\s*$/),i,j,k;if(!h)throw Error("Expected ngRepeat in form of '_item_ in _collection_' but got '"+f+"'.");f=
-h[1];i=h[2];h=f.match(/^(?:([\$\w]+)|\(([\$\w]+)\s*,\s*([\$\w]+)\))$/);if(!h)throw Error("'item' in 'item in collection' should be identifier or (key, value) but got '"+f+"'.");j=h[3]||h[1];k=h[2];var l=new eb;a.$watch(function(a){var e,f,h=a.$eval(i),m=c,q=new eb,y,A,u,w,r,v;if(E(h))r=h||[];else{r=[];for(u in h)h.hasOwnProperty(u)&&u.charAt(0)!="$"&&r.push(u);r.sort()}y=r.length-1;e=0;for(f=r.length;ez;)u.pop().element.remove()}for(;r.length>
-x;)r.pop()[0].element.remove()}var i;if(!(i=s.match(d)))throw Error("Expected ngOptions in form of '_select_ (as _label_)? for (_key_,)?_value_ in _collection_' but got '"+s+"'.");var j=c(i[2]||i[1]),k=i[4]||i[6],l=i[5],m=c(i[3]||""),n=c(i[2]?i[1]:k),o=c(i[7]),r=[[{element:f,label:""}]];t&&(a(t)(e),t.removeClass("ng-scope"),t.remove());f.html("");f.bind("change",function(){e.$apply(function(){var a,c=o(e)||[],d={},h,i,j,m,s,t;if(p){i=[];m=0;for(t=r.length;m@charset "UTF-8";[ng\\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak{display:none;}ng\\:form{display:block;}');
+(function(M,V,s){'use strict';function gc(){var b=M.angular;M.angular=hc;return b}function o(b,a,c){var d;if(b)if(I(b))for(d in b)d!="prototype"&&d!="length"&&d!="name"&&b.hasOwnProperty(d)&&a.call(c,b[d],d);else if(b.forEach&&b.forEach!==o)b.forEach(a,c);else if(!b||typeof b.length!=="number"?0:typeof b.hasOwnProperty!="function"&&typeof b.constructor!="function"||b instanceof P||ca&&b instanceof ca||Da.call(b)!=="[object Object]"||typeof b.callee==="function")for(d=0;d=0&&b.splice(c,1);return a}function W(b,a){if(ra(b)||b&&b.$evalAsync&&b.$watch)throw Error("Can't copy Window or Scope");if(a){if(b===a)throw Error("Can't copy equivalent objects or arrays");if(C(b))for(var c=a.length=0;c2?ka.call(arguments,2):[];return I(a)&&!(a instanceof RegExp)?c.length?function(){return arguments.length?a.apply(b,c.concat(ka.call(arguments,0))):a.apply(b,c)}:function(){return arguments.length?a.apply(b,arguments):a.call(b)}:a}function lc(b,a){var c=a;/^\$+/.test(b)?c=s:ra(a)?c="$WINDOW":a&&V===a?c="$DOCUMENT":a&&a.$evalAsync&&a.$watch&&(c="$SCOPE");return c}function da(b,a){return JSON.stringify(b,lc,a?" ":null)}function tb(b){return x(b)?
+JSON.parse(b):b}function Ha(b){b&&b.length!==0?(b=J(""+b),b=!(b=="f"||b=="0"||b=="false"||b=="no"||b=="n"||b=="[]")):b=!1;return b}function ta(b){b=v(b).clone();try{b.html("")}catch(a){}var c=v("").append(b).html();try{return b[0].nodeType===3?J(c):c.match(/^(<[^>]+>)/)[1].replace(/^<([\w\-]+)/,function(a,b){return"<"+J(b)})}catch(d){return J(c)}}function bb(b){var a={},c,d;o((b||"").split("&"),function(b){b&&(c=b.split("="),d=decodeURIComponent(c[0]),a[d]=w(c[1])?decodeURIComponent(c[1]):!0)});
+return a}function ub(b){var a=[];o(b,function(b,d){a.push(ua(d,!0)+(b===!0?"":"="+ua(b,!0)))});return a.length?a.join("&"):""}function cb(b){return ua(b,!0).replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+")}function ua(b,a){return encodeURIComponent(b).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,a?"%20":"+")}function mc(b,a){function c(a){a&&d.push(a)}var d=[b],e,f,i=["ng:app","ng-app","x-ng-app","data-ng-app"],h=/\sng[:\-]app(:\s*([\w\d_]+);?)?\s/;
+o(i,function(a){i[a]=!0;c(V.getElementById(a));a=a.replace(":","\\:");b.querySelectorAll&&(o(b.querySelectorAll("."+a),c),o(b.querySelectorAll("."+a+"\\:"),c),o(b.querySelectorAll("["+a+"]"),c))});o(d,function(a){if(!e){var b=h.exec(" "+a.className+" ");b?(e=a,f=(b[2]||"").replace(/\s+/g,",")):o(a.attributes,function(b){if(!e&&i[b.name])e=a,f=b.value})}});e&&a(e,f?[f]:[])}function vb(b,a){var c=function(){b=v(b);a=a||[];a.unshift(["$provide",function(a){a.value("$rootElement",b)}]);a.unshift("ng");
+var c=wb(a);c.invoke(["$rootScope","$rootElement","$compile","$injector",function(a,b,c,d){a.$apply(function(){b.data("$injector",d);c(b)(a)})}]);return c},d=/^NG_DEFER_BOOTSTRAP!/;if(M&&!d.test(M.name))return c();M.name=M.name.replace(d,"");Ia.resumeBootstrap=function(b){o(b,function(b){a.push(b)});c()}}function db(b,a){a=a||"_";return b.replace(nc,function(b,d){return(d?a:"")+b.toLowerCase()})}function eb(b,a,c){if(!b)throw Error("Argument '"+(a||"?")+"' is "+(c||"required"));return b}function va(b,
+a,c){c&&C(b)&&(b=b[b.length-1]);eb(I(b),a,"not a function, got "+(b&&typeof b=="object"?b.constructor.name||"Object":typeof b));return b}function oc(b){function a(a,b,e){return a[b]||(a[b]=e())}return a(a(b,"angular",Object),"module",function(){var b={};return function(d,e,f){e&&b.hasOwnProperty(d)&&(b[d]=null);return a(b,d,function(){function a(c,d,e){return function(){b[e||"push"]([c,d,arguments]);return m}}if(!e)throw Error("No module: "+d);var b=[],c=[],g=a("$injector","invoke"),m={_invokeQueue:b,
+_runBlocks:c,requires:e,name:d,provider:a("$provide","provider"),factory:a("$provide","factory"),service:a("$provide","service"),value:a("$provide","value"),constant:a("$provide","constant","unshift"),animation:a("$animationProvider","register"),filter:a("$filterProvider","register"),controller:a("$controllerProvider","register"),directive:a("$compileProvider","directive"),config:g,run:function(a){c.push(a);return this}};f&&g(f);return m})}})}function Ja(b){return b.replace(pc,function(a,b,d,e){return e?
+d.toUpperCase():d}).replace(qc,"Moz$1")}function fb(b,a){function c(){var e;for(var b=[this],c=a,i,h,j,g,m,k;b.length;){i=b.shift();h=0;for(j=i.length;h
"+b;a.removeChild(a.firstChild);gb(this,a.childNodes);this.remove()}else gb(this,b)}function hb(b){return b.cloneNode(!0)}function wa(b){xb(b);for(var a=0,b=b.childNodes||[];a-1}function Ab(b,a){a&&o(a.split(" "),function(a){b.className=S((" "+b.className+" ").replace(/[\n\t]/g," ").replace(" "+S(a)+" "," "))})}function Bb(b,
+a){a&&o(a.split(" "),function(a){if(!Ma(b,a))b.className=S(b.className+" "+S(a))})}function gb(b,a){if(a)for(var a=!a.nodeName&&w(a.length)&&!ra(a)?a:[a],c=0;c4096&&c.warn("Cookie '"+a+"' possibly not set or overflowed because it was too large ("+d+" > 4096 bytes)!")}else{if(j.cookie!==H){H=j.cookie;d=H.split("; ");A={};for(g=0;g0&&(A[unescape(e.substring(0,h))]=unescape(e.substring(h+1)))}return A}};h.defer=function(a,b){var c;n++;c=k(function(){delete q[c];e(a)},b||0);q[c]=!0;return c};h.defer.cancel=function(a){return q[a]?(delete q[a],l(a),e(t),!0):!1}}function zc(){this.$get=["$window","$log","$sniffer","$document",function(b,a,c,d){return new yc(b,d,a,c)}]}function Ac(){this.$get=function(){function b(b,d){function e(a){if(a!=k){if(l){if(l==a)l=a.n}else l=a;f(a.n,a.p);f(a,k);k=a;k.n=null}}function f(a,
+b){if(a!=b){if(a)a.p=b;if(b)b.n=a}}if(b in a)throw Error("cacheId "+b+" taken");var i=0,h=y({},d,{id:b}),j={},g=d&&d.capacity||Number.MAX_VALUE,m={},k=null,l=null;return a[b]={put:function(a,b){var c=m[a]||(m[a]={key:a});e(c);if(!u(b))return a in j||i++,j[a]=b,i>g&&this.remove(l.key),b},get:function(a){var b=m[a];if(b)return e(b),j[a]},remove:function(a){var b=m[a];if(b){if(b==k)k=b.p;if(b==l)l=b.n;f(b.n,b.p);delete m[a];delete j[a];i--}},removeAll:function(){j={};i=0;m={};k=l=null},destroy:function(){m=
+h=j=null;delete a[b]},info:function(){return y({},h,{size:i})}}}var a={};b.info=function(){var b={};o(a,function(a,e){b[e]=a.info()});return b};b.get=function(b){return a[b]};return b}}function Bc(){this.$get=["$cacheFactory",function(b){return b("templates")}]}function Hb(b){var a={},c="Directive",d=/^\s*directive\:\s*([\d\w\-_]+)\s+(.*)$/,e=/(([\d\w\-_]+)(?:\:([^;]+))?;?)/,f="Template must have exactly one root element. was: ",i=/^\s*(https?|ftp|mailto|file):/;this.directive=function j(d,e){x(d)?
+(eb(e,"directive"),a.hasOwnProperty(d)||(a[d]=[],b.factory(d+c,["$injector","$exceptionHandler",function(b,c){var e=[];o(a[d],function(a){try{var f=b.invoke(a);if(I(f))f={compile:Q(f)};else if(!f.compile&&f.link)f.compile=Q(f.link);f.priority=f.priority||0;f.name=f.name||d;f.require=f.require||f.controller&&f.name;f.restrict=f.restrict||"A";e.push(f)}catch(j){c(j)}});return e}])),a[d].push(e)):o(d,sb(j));return this};this.urlSanitizationWhitelist=function(a){return w(a)?(i=a,this):i};this.$get=["$injector",
+"$interpolate","$exceptionHandler","$http","$templateCache","$parse","$controller","$rootScope","$document",function(b,g,m,k,l,q,n,B,r){function p(a,b,c){a instanceof v||(a=v(a));o(a,function(b,c){b.nodeType==3&&b.nodeValue.match(/\S+/)&&(a[c]=v(b).wrap(" ").parent()[0])});var d=D(a,b,a,c);return function(b,c){eb(b,"scope");for(var e=c?za.clone.call(a):a,g=0,f=e.length;gz.priority)break;if(y=z.scope)ea("isolated scope",ba,z,A),L(y)&&(E(A,"ng-isolate-scope"),ba=z),E(A,
+"ng-scope"),D=D||z;T=z.name;if(y=z.controller)ha=ha||{},ea("'"+T+"' controller",ha[T],z,A),ha[T]=z;if(y=z.transclude)ea("transclusion",ga,z,A),ga=z,k=z.priority,y=="element"?(R=v(b),A=c.$$element=v(V.createComment(" "+T+": "+c[T]+" ")),b=A[0],fa(e,v(R[0]),b),ia=p(R,d,k)):(R=v(hb(b)).contents(),A.html(""),ia=p(R,d));if(z.template)if(ea("template",N,z,A),N=z,y=I(z.template)?z.template(A,c):z.template,y=Jb(y),z.replace){R=v(""+S(y)+"
").contents();b=R[0];if(R.length!=1||b.nodeType!==1)throw Error(f+
+y);fa(e,A,b);T={$attr:{}};a=a.concat(G(b,a.splice(w+1,a.length-(w+1)),T));H(c,T);u=a.length}else A.html(y);if(z.templateUrl)ea("template",N,z,A),N=z,l=F(a.splice(w,a.length-w),l,A,c,e,z.replace,ia),u=a.length;else if(z.compile)try{t=z.compile(A,c,ia),I(t)?j(null,t):t&&j(t.pre,t.post)}catch(J){m(J,ta(A))}if(z.terminal)l.terminal=!0,k=Math.max(k,z.priority)}l.scope=D&&D.scope;l.transclude=ga&&ia;return l}function A(d,e,g,f){var l=!1;if(a.hasOwnProperty(e))for(var i,e=b.get(e+c),n=0,k=e.length;ni.priority)&&i.restrict.indexOf(g)!=-1)d.push(i),l=!0}catch(q){m(q)}return l}function H(a,b){var c=b.$attr,d=a.$attr,e=a.$$element;o(a,function(d,e){e.charAt(0)!="$"&&(b[e]&&(d+=(e==="style"?";":" ")+b[e]),a.$set(e,d,!0,c[e]))});o(b,function(b,g){g=="class"?(E(e,b),a["class"]=(a["class"]?a["class"]+" ":"")+b):g=="style"?e.attr("style",e.attr("style")+";"+b):g.charAt(0)!="$"&&!a.hasOwnProperty(g)&&(a[g]=b,d[g]=c[g])})}function F(a,b,c,d,e,g,j){var i=[],n,m,q=c[0],p=a.shift(),ya=y({},
+p,{controller:null,templateUrl:null,transclude:null,scope:null}),p=I(p.templateUrl)?p.templateUrl(c,d):p.templateUrl;c.html("");k.get(p,{cache:l}).success(function(l){var k,p,l=Jb(l);if(g){p=v(""+S(l)+"
").contents();k=p[0];if(p.length!=1||k.nodeType!==1)throw Error(f+l);l={$attr:{}};fa(e,c,k);G(k,a,l);H(d,l)}else k=q,c.html(l);a.unshift(ya);n=R(a,k,d,j);for(m=D(c[0].childNodes,j);i.length;){var B=i.shift(),l=i.shift();p=i.shift();var r=i.shift(),F=k;l!==q&&(F=hb(k),fa(p,v(l),F));n(function(){b(m,
+B,F,e,r)},B,F,e,r)}i=null}).error(function(a,b,c,d){throw Error("Failed to load template: "+d.url);});return function(a,c,d,e,g){i?(i.push(c),i.push(d),i.push(e),i.push(g)):n(function(){b(m,c,d,e,g)},c,d,e,g)}}function N(a,b){return b.priority-a.priority}function ea(a,b,c,d){if(b)throw Error("Multiple directives ["+b.name+", "+c.name+"] asking for "+a+" on: "+ta(d));}function ga(a,b){var c=g(b,!0);c&&a.push({priority:0,compile:Q(function(a,b){var d=b.parent(),e=d.data("$binding")||[];e.push(c);E(d.data("$binding",
+e),"ng-binding");a.$watch(c,function(a){b[0].nodeValue=a})})})}function z(a,b,c,d){var e=g(c,!0);e&&b.push({priority:100,compile:Q(function(a,b,c){b=c.$$observers||(c.$$observers={});if(e=g(c[d],!0))c[d]=e(a),(b[d]||(b[d]=[])).$$inter=!0,(c.$$observers&&c.$$observers[d].$$scope||a).$watch(e,function(a){c.$set(d,a)})})})}function fa(a,b,c){var d=b[0],e=d.parentNode,g,f;if(a){g=0;for(f=a.length;g0){var e=F[0],g=e.text;if(g==a||g==b||g==c||g==d||!a&&!b&&!c&&!d)return e}return!1}function h(b,c,d,g){return(b=i(b,c,d,g))?(a&&!b.json&&e("is not valid json",b),F.shift(),b):!1}function j(a){h(a)||e("is unexpected, expecting ["+a+"]",i())}function g(a,b){return y(function(c,d){return a(c,d,b)},{constant:b.constant})}function m(a,b,c){return y(function(d,e){return b(d,e,a,c)},{constant:a.constant&&c.constant})}function k(){for(var a=[];;)if(F.length>0&&!i("}",")",";","]")&&a.push(fa()),
+!h(";"))return a.length==1?a[0]:function(b,c){for(var d,e=0;e","<=",">="))a=m(a,b.fn,r());return a}function p(){for(var a=E(),b;b=h("*","/","%");)a=m(a,b.fn,E());return a}function E(){var a;return h("+")?D():(a=h("-"))?m(A,a.fn,E()):(a=h("!"))?g(a.fn,E()):D()}function D(){var a;if(h("("))a=fa(),j(")");else if(h("["))a=G();else if(h("{"))a=o();else{var b=h();(a=b.fn)||e("not a primary expression",b);if(b.json)a.constant=a.literal=!0}for(var c;b=h("(","[",".");)b.text===
+"("?(a=ea(a,c),c=null):b.text==="["?(c=a,a=z(a)):b.text==="."?(c=a,a=ga(a)):e("IMPOSSIBLE");return a}function G(){var a=[],b=!0;if(f().text!="]"){do{var c=N();a.push(c);c.constant||(b=!1)}while(h(","))}j("]");return y(function(b,c){for(var d=[],e=0;e1;d++){var e=a.shift(),f=b[e];f||(f={},b[e]=f);b=f}return b[a.shift()]=c}function kb(b,a,c){if(!a)return b;for(var a=a.split("."),d,e=b,f=a.length,i=0;ia)for(b in h++,e)e.hasOwnProperty(b)&&!f.hasOwnProperty(b)&&(o--,delete e[b])}else e!==f&&(e=f,h++);return h},
+function(){b(f,e,c)})},$digest:function(){var a,d,e,i,q=this.$$asyncQueue,n,o,r=b,p,E=[],D,G;f("$digest");do{o=!1;for(p=this;q.length;)try{p.$eval(q.shift())}catch(s){c(s)}do{if(i=p.$$watchers)for(n=i.length;n--;)try{if(a=i[n],(d=a.get(p))!==(e=a.last)&&!(a.eq?ja(d,e):typeof d=="number"&&typeof e=="number"&&isNaN(d)&&isNaN(e)))o=!0,a.last=a.eq?W(d):d,a.fn(d,e===h?d:e,p),r<5&&(D=4-r,E[D]||(E[D]=[]),G=I(a.exp)?"fn: "+(a.exp.name||a.exp.toString()):a.exp,G+="; newVal: "+da(d)+"; oldVal: "+da(e),E[D].push(G))}catch(A){c(A)}if(!(i=
+p.$$childHead||p!==this&&p.$$nextSibling))for(;p!==this&&!(i=p.$$nextSibling);)p=p.$parent}while(p=i);if(o&&!r--)throw j.$$phase=null,Error(b+" $digest() iterations reached. Aborting!\nWatchers fired in the last 5 iterations: "+da(E));}while(o||q.length);j.$$phase=null},$destroy:function(){if(!(j==this||this.$$destroyed)){var a=this.$parent;this.$broadcast("$destroy");this.$$destroyed=!0;if(a.$$childHead==this)a.$$childHead=this.$$nextSibling;if(a.$$childTail==this)a.$$childTail=this.$$prevSibling;
+if(this.$$prevSibling)this.$$prevSibling.$$nextSibling=this.$$nextSibling;if(this.$$nextSibling)this.$$nextSibling.$$prevSibling=this.$$prevSibling;this.$parent=this.$$nextSibling=this.$$prevSibling=this.$$childHead=this.$$childTail=null}},$eval:function(a,b){return d(a)(this,b)},$evalAsync:function(a){this.$$asyncQueue.push(a)},$apply:function(a){try{return f("$apply"),this.$eval(a)}catch(b){c(b)}finally{j.$$phase=null;try{j.$digest()}catch(d){throw c(d),d;}}},$on:function(a,b){var c=this.$$listeners[a];
+c||(this.$$listeners[a]=c=[]);c.push(b);return function(){c[Ga(c,b)]=null}},$emit:function(a,b){var d=[],e,f=this,h=!1,i={name:a,targetScope:f,stopPropagation:function(){h=!0},preventDefault:function(){i.defaultPrevented=!0},defaultPrevented:!1},j=[i].concat(ka.call(arguments,1)),p,o;do{e=f.$$listeners[a]||d;i.currentScope=f;p=0;for(o=e.length;p7),hasEvent:function(a){if(a=="input"&&X==9)return!1;if(u(c[a])){var b=e.createElement("div");c[a]="on"+a in b}return c[a]},
+csp:e.securityPolicy?e.securityPolicy.isActive:!1,vendorPrefix:f,supportsTransitions:j}}]}function Wc(){this.$get=Q(M)}function Qb(b){var a={},c,d,e;if(!b)return a;o(b.split("\n"),function(b){e=b.indexOf(":");c=J(S(b.substr(0,e)));d=S(b.substr(e+1));c&&(a[c]?a[c]+=", "+d:a[c]=d)});return a}function Xc(b,a){var c=Yc.exec(b);if(c==null)return!0;var d={protocol:c[2],host:c[4],port:K(c[6])||Ba[c[2]]||null,relativeProtocol:c[2]===s||c[2]===""},c=lb.exec(a),c={protocol:c[1],host:c[3],port:K(c[5])||Ba[c[1]]||
+null};return(d.protocol==c.protocol||d.relativeProtocol)&&d.host==c.host&&(d.port==c.port||d.relativeProtocol&&c.port==Ba[c.protocol])}function Rb(b){var a=L(b)?b:s;return function(c){a||(a=Qb(b));return c?a[J(c)]||null:a}}function Sb(b,a,c){if(I(c))return c(b,a);o(c,function(c){b=c(b,a)});return b}function Zc(){var b=/^\s*(\[|\{[^\{])/,a=/[\}\]]\s*$/,c=/^\)\]\}',?\n/,d=this.defaults={transformResponse:[function(d){x(d)&&(d=d.replace(c,""),b.test(d)&&a.test(d)&&(d=tb(d,!0)));return d}],transformRequest:[function(a){return L(a)&&
+Da.apply(a)!=="[object File]"?da(a):a}],headers:{common:{Accept:"application/json, text/plain, */*"},post:{"Content-Type":"application/json;charset=utf-8"},put:{"Content-Type":"application/json;charset=utf-8"}},xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN"},e=this.interceptors=[],f=this.responseInterceptors=[];this.$get=["$httpBackend","$browser","$cacheFactory","$rootScope","$q","$injector",function(a,b,c,g,m,k){function l(a){function c(a){var b=y({},a,{data:Sb(a.data,a.headers,e.transformResponse)});
+return 200<=a.status&&a.status<300?b:m.reject(b)}var e={transformRequest:d.transformRequest,transformResponse:d.transformResponse},g={};y(e,a);e.headers=g;e.method=na(e.method);y(g,d.headers.common,d.headers[J(e.method)],a.headers);(a=Xc(e.url,b.url())?b.cookies()[e.xsrfCookieName||d.xsrfCookieName]:s)&&(g[e.xsrfHeaderName||d.xsrfHeaderName]=a);var f=[function(a){var b=Sb(a.data,Rb(g),a.transformRequest);u(a.data)&&delete g["Content-Type"];if(u(a.withCredentials)&&!u(d.withCredentials))a.withCredentials=
+d.withCredentials;return q(a,b,g).then(c,c)},s],j=m.when(e);for(o(r,function(a){(a.request||a.requestError)&&f.unshift(a.request,a.requestError);(a.response||a.responseError)&&f.push(a.response,a.responseError)});f.length;)var a=f.shift(),i=f.shift(),j=j.then(a,i);j.success=function(a){j.then(function(b){a(b.data,b.status,b.headers,e)});return j};j.error=function(a){j.then(null,function(b){a(b.data,b.status,b.headers,e)});return j};return j}function q(b,c,e){function f(a,b,c){o&&(200<=a&&a<300?o.put(s,
+[a,b,Qb(c)]):o.remove(s));h(b,a,c);g.$apply()}function h(a,c,d){c=Math.max(c,0);(200<=c&&c<300?k.resolve:k.reject)({data:a,status:c,headers:Rb(d),config:b})}function j(){var a=Ga(l.pendingRequests,b);a!==-1&&l.pendingRequests.splice(a,1)}var k=m.defer(),q=k.promise,o,r,s=n(b.url,b.params);l.pendingRequests.push(b);q.then(j,j);if((b.cache||d.cache)&&b.cache!==!1&&b.method=="GET")o=L(b.cache)?b.cache:L(d.cache)?d.cache:B;if(o)if(r=o.get(s))if(r.then)return r.then(j,j),r;else C(r)?h(r[1],r[0],W(r[2])):
+h(r,200,{});else o.put(s,q);r||a(b.method,s,c,f,e,b.timeout,b.withCredentials,b.responseType);return q}function n(a,b){if(!b)return a;var c=[];ic(b,function(a,b){a==null||a==s||(C(a)||(a=[a]),o(a,function(a){L(a)&&(a=da(a));c.push(ua(b)+"="+ua(a))}))});return a+(a.indexOf("?")==-1?"?":"&")+c.join("&")}var B=c("$http"),r=[];o(e,function(a){r.unshift(x(a)?k.get(a):k.invoke(a))});o(f,function(a,b){var c=x(a)?k.get(a):k.invoke(a);r.splice(b,0,{response:function(a){return c(m.when(a))},responseError:function(a){return c(m.reject(a))}})});
+l.pendingRequests=[];(function(a){o(arguments,function(a){l[a]=function(b,c){return l(y(c||{},{method:a,url:b}))}})})("get","delete","head","jsonp");(function(a){o(arguments,function(a){l[a]=function(b,c,d){return l(y(d||{},{method:a,url:b,data:c}))}})})("post","put");l.defaults=d;return l}]}function $c(){this.$get=["$browser","$window","$document",function(b,a,c){return ad(b,bd,b.defer,a.angular.callbacks,c[0],a.location.protocol.replace(":",""))}]}function ad(b,a,c,d,e,f){function i(a,b){var c=
+e.createElement("script"),d=function(){e.body.removeChild(c);b&&b()};c.type="text/javascript";c.src=a;X?c.onreadystatechange=function(){/loaded|complete/.test(c.readyState)&&d()}:c.onload=c.onerror=d;e.body.appendChild(c)}return function(e,j,g,m,k,l,q,n){function B(a,c,d,e){c=(j.match(lb)||["",f])[1]=="file"?d?200:404:c;a(c==1223?204:c,d,e);b.$$completeOutstandingRequest(t)}b.$$incOutstandingRequestCount();j=j||b.url();if(J(e)=="jsonp"){var r="_"+(d.counter++).toString(36);d[r]=function(a){d[r].data=
+a};i(j.replace("JSON_CALLBACK","angular.callbacks."+r),function(){d[r].data?B(m,200,d[r].data):B(m,-2);delete d[r]})}else{var p=new a;p.open(e,j,!0);o(k,function(a,b){a&&p.setRequestHeader(b,a)});var s;p.onreadystatechange=function(){if(p.readyState==4){var a=p.getAllResponseHeaders(),b=["Cache-Control","Content-Language","Content-Type","Expires","Last-Modified","Pragma"];a||(a="",o(b,function(b){var c=p.getResponseHeader(b);c&&(a+=b+": "+c+"\n")}));B(m,s||p.status,p.responseType?p.response:p.responseText,
+a)}};if(q)p.withCredentials=!0;if(n)p.responseType=n;p.send(g||"");l>0&&c(function(){s=-1;p.abort()},l)}}}function cd(){this.$get=function(){return{id:"en-us",NUMBER_FORMATS:{DECIMAL_SEP:".",GROUP_SEP:",",PATTERNS:[{minInt:1,minFrac:0,maxFrac:3,posPre:"",posSuf:"",negPre:"-",negSuf:"",gSize:3,lgSize:3},{minInt:1,minFrac:2,maxFrac:2,posPre:"\u00a4",posSuf:"",negPre:"(\u00a4",negSuf:")",gSize:3,lgSize:3}],CURRENCY_SYM:"$"},DATETIME_FORMATS:{MONTH:"January,February,March,April,May,June,July,August,September,October,November,December".split(","),
+SHORTMONTH:"Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec".split(","),DAY:"Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday".split(","),SHORTDAY:"Sun,Mon,Tue,Wed,Thu,Fri,Sat".split(","),AMPMS:["AM","PM"],medium:"MMM d, y h:mm:ss a","short":"M/d/yy h:mm a",fullDate:"EEEE, MMMM d, y",longDate:"MMMM d, y",mediumDate:"MMM d, y",shortDate:"M/d/yy",mediumTime:"h:mm:ss a",shortTime:"h:mm a"},pluralCat:function(b){return b===1?"one":"other"}}}}function dd(){this.$get=["$rootScope","$browser","$q",
+"$exceptionHandler",function(b,a,c,d){function e(e,h,j){var g=c.defer(),m=g.promise,k=w(j)&&!j,h=a.defer(function(){try{g.resolve(e())}catch(a){g.reject(a),d(a)}k||b.$apply()},h),j=function(){delete f[m.$$timeoutId]};m.$$timeoutId=h;f[h]=g;m.then(j,j);return m}var f={};e.cancel=function(b){return b&&b.$$timeoutId in f?(f[b.$$timeoutId].reject("canceled"),a.defer.cancel(b.$$timeoutId)):!1};return e}]}function Tb(b){function a(a,e){return b.factory(a+c,e)}var c="Filter";this.register=a;this.$get=["$injector",
+function(a){return function(b){return a.get(b+c)}}];a("currency",Ub);a("date",Vb);a("filter",ed);a("json",fd);a("limitTo",gd);a("lowercase",hd);a("number",Wb);a("orderBy",Xb);a("uppercase",id)}function ed(){return function(b,a,c){if(!C(b))return b;var d=[];d.check=function(a){for(var b=0;b-1}}var e=function(a,b){if(typeof b=="string"&&b.charAt(0)==="!")return!e(a,b.substr(1));switch(typeof a){case "boolean":case "number":case "string":return c(a,b);case "object":switch(typeof b){case "object":return c(a,b);default:for(var d in a)if(d.charAt(0)!=="$"&&e(a[d],b))return!0}return!1;case "array":for(d=0;de+1?i="0":(h=i,g=!0)}if(!g){i=(i.split(Zb)[1]||"").length;u(e)&&(e=Math.min(Math.max(a.minFrac,i),a.maxFrac));var i=Math.pow(10,e),b=Math.round(b*i)/i,b=(""+b).split(Zb),i=b[0],b=b[1]||"",g=0,m=a.lgSize,k=a.gSize;if(i.length>=m+k)for(var g=i.length-m,l=0;l0||e>-c)e+=c;e===0&&c==-12&&(e=12);return ob(e,a,d)}}function Sa(b,a){return function(c,
+d){var e=c["get"+b](),f=na(a?"SHORT"+b:b);return d[f][e]}}function Vb(b){function a(a){var b;if(b=a.match(c)){var a=new Date(0),f=0,i=0,h=b[8]?a.setUTCFullYear:a.setFullYear,j=b[8]?a.setUTCHours:a.setHours;b[9]&&(f=K(b[9]+b[10]),i=K(b[9]+b[11]));h.call(a,K(b[1]),K(b[2])-1,K(b[3]));j.call(a,K(b[4]||0)-f,K(b[5]||0)-i,K(b[6]||0),K(b[7]||0))}return a}var c=/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/;return function(c,e){var f="",i=[],h,j,e=e||
+"mediumDate",e=b.DATETIME_FORMATS[e]||e;x(c)&&(c=jd.test(c)?K(c):a(c));Za(c)&&(c=new Date(c));if(!qa(c))return c;for(;e;)(j=kd.exec(e))?(i=i.concat(ka.call(j,1)),e=i.pop()):(i.push(e),e=null);o(i,function(a){h=ld[a];f+=h?h(c,b.DATETIME_FORMATS):a.replace(/(^'|'$)/g,"").replace(/''/g,"'")});return f}}function fd(){return function(b){return da(b,!0)}}function gd(){return function(b,a){if(!C(b)&&!x(b))return b;a=K(a);if(x(b))return a?a>=0?b.slice(0,a):b.slice(a,b.length):"";var c=[],d,e;a>b.length?a=
+b.length:a<-b.length&&(a=-b.length);a>0?(d=0,e=a):(d=b.length+a,e=b.length);for(;dk?(d.$setValidity("maxlength",!1),s):(d.$setValidity("maxlength",!0),a)};d.$parsers.push(e);d.$formatters.push(e)}}function pb(b,a){b="ngClass"+b;return Y(function(c,d,e){function f(b){if(a===
+!0||c.$index%2===a)j&&b!==j&&i(j),h(b);j=b}function i(a){L(a)&&!C(a)&&(a=$a(a,function(a,b){if(a)return b}));d.removeClass(C(a)?a.join(" "):a)}function h(a){L(a)&&!C(a)&&(a=$a(a,function(a,b){if(a)return b}));a&&d.addClass(C(a)?a.join(" "):a)}var j=s;c.$watch(e[b],f,!0);e.$observe("class",function(){var a=c.$eval(e[b]);f(a,a)});b!=="ngClass"&&c.$watch("$index",function(d,f){var j=d%2;j!==f%2&&(j==a?h(c.$eval(e[b])):i(c.$eval(e[b])))})})}var J=function(b){return x(b)?b.toLowerCase():b},na=function(b){return x(b)?
+b.toUpperCase():b},X=K((/msie (\d+)/.exec(J(navigator.userAgent))||[])[1]),v,ca,ka=[].slice,Ya=[].push,Da=Object.prototype.toString,hc=M.angular,Ia=M.angular||(M.angular={}),xa,jb,Z=["0","0","0"];t.$inject=[];pa.$inject=[];jb=X<9?function(b){b=b.nodeName?b:b[0];return b.scopeName&&b.scopeName!="HTML"?na(b.scopeName+":"+b.nodeName):b.nodeName}:function(b){return b.nodeName?b.nodeName:b[0].nodeName};var nc=/[A-Z]/g,md={full:"1.1.4",major:1,minor:1,dot:4,codeName:"quantum-manipulation"},La=P.cache={},
+Ka=P.expando="ng-"+(new Date).getTime(),rc=1,ac=M.document.addEventListener?function(b,a,c){b.addEventListener(a,c,!1)}:function(b,a,c){b.attachEvent("on"+a,c)},ib=M.document.removeEventListener?function(b,a,c){b.removeEventListener(a,c,!1)}:function(b,a,c){b.detachEvent("on"+a,c)},pc=/([\:\-\_]+(.))/g,qc=/^moz([A-Z])/,za=P.prototype={ready:function(b){function a(){c||(c=!0,b())}var c=!1;V.readyState==="complete"?setTimeout(a):(this.bind("DOMContentLoaded",a),P(M).bind("load",a))},toString:function(){var b=
+[];o(this,function(a){b.push(""+a)});return"["+b.join(", ")+"]"},eq:function(b){return b>=0?v(this[b]):v(this[this.length+b])},length:0,push:Ya,sort:[].sort,splice:[].splice},Oa={};o("multiple,selected,checked,disabled,readOnly,required,open".split(","),function(b){Oa[J(b)]=b});var Eb={};o("input,select,option,textarea,button,form,details".split(","),function(b){Eb[na(b)]=!0});o({data:zb,inheritedData:Na,scope:function(b){return Na(b,"$scope")},controller:Cb,injector:function(b){return Na(b,"$injector")},
+removeAttr:function(b,a){b.removeAttribute(a)},hasClass:Ma,css:function(b,a,c){a=Ja(a);if(w(c))b.style[a]=c;else{var d;X<=8&&(d=b.currentStyle&&b.currentStyle[a],d===""&&(d="auto"));d=d||b.style[a];X<=8&&(d=d===""?s:d);return d}},attr:function(b,a,c){var d=J(a);if(Oa[d])if(w(c))c?(b[a]=!0,b.setAttribute(a,d)):(b[a]=!1,b.removeAttribute(d));else return b[a]||(b.attributes.getNamedItem(a)||t).specified?d:s;else if(w(c))b.setAttribute(a,c);else if(b.getAttribute)return b=b.getAttribute(a,2),b===null?
+s:b},prop:function(b,a,c){if(w(c))b[a]=c;else return b[a]},text:y(X<9?function(b,a){if(b.nodeType==1){if(u(a))return b.innerText;b.innerText=a}else{if(u(a))return b.nodeValue;b.nodeValue=a}}:function(b,a){if(u(a))return b.textContent;b.textContent=a},{$dv:""}),val:function(b,a){if(u(a))return b.value;b.value=a},html:function(b,a){if(u(a))return b.innerHTML;for(var c=0,d=b.childNodes;c":function(a,c,d,e){return d(a,c)>e(a,c)},"<=":function(a,c,d,e){return d(a,c)<=e(a,c)},">=":function(a,c,d,e){return d(a,c)>=e(a,
+c)},"&&":function(a,c,d,e){return d(a,c)&&e(a,c)},"||":function(a,c,d,e){return d(a,c)||e(a,c)},"&":function(a,c,d,e){return d(a,c)&e(a,c)},"|":function(a,c,d,e){return e(a,c)(a,c,d(a,c))},"!":function(a,c,d){return!d(a,c)}},Nc={n:"\n",f:"\u000c",r:"\r",t:"\t",v:"\u000b","'":"'",'"':'"'},nb={},Yc=/^(([^:]+):)?\/\/(\w+:{0,1}\w*@)?([\w\.-]*)?(:([0-9]+))?(.*)$/,bd=M.XMLHttpRequest||function(){try{return new ActiveXObject("Msxml2.XMLHTTP.6.0")}catch(a){}try{return new ActiveXObject("Msxml2.XMLHTTP.3.0")}catch(c){}try{return new ActiveXObject("Msxml2.XMLHTTP")}catch(d){}throw Error("This browser does not support XMLHttpRequest.");
+};Tb.$inject=["$provide"];Ub.$inject=["$locale"];Wb.$inject=["$locale"];var Zb=".",ld={yyyy:O("FullYear",4),yy:O("FullYear",2,0,!0),y:O("FullYear",1),MMMM:Sa("Month"),MMM:Sa("Month",!0),MM:O("Month",2,1),M:O("Month",1,1),dd:O("Date",2),d:O("Date",1),HH:O("Hours",2),H:O("Hours",1),hh:O("Hours",2,-12),h:O("Hours",1,-12),mm:O("Minutes",2),m:O("Minutes",1),ss:O("Seconds",2),s:O("Seconds",1),sss:O("Milliseconds",3),EEEE:Sa("Day"),EEE:Sa("Day",!0),a:function(a,c){return a.getHours()<12?c.AMPMS[0]:c.AMPMS[1]},
+Z:function(a){var a=-1*a.getTimezoneOffset(),c=a>=0?"+":"";c+=ob(Math[a>0?"floor":"ceil"](a/60),2)+ob(Math.abs(a%60),2);return c}},kd=/((?:[^yMdHhmsaZE']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d+|H+|h+|m+|s+|a|Z))(.*)/,jd=/^\d+$/;Vb.$inject=["$locale"];var hd=Q(J),id=Q(na);Xb.$inject=["$parse"];var od=Q({restrict:"E",compile:function(a,c){X<=8&&(!c.href&&!c.name&&c.$set("href",""),a.append(V.createComment("IE fix")));return function(a,c){c.bind("click",function(a){c.attr("href")||a.preventDefault()})}}}),
+qb={};o(Oa,function(a,c){var d=aa("ng-"+c);qb[d]=function(){return{priority:100,compile:function(){return function(a,f,i){a.$watch(i[d],function(a){i.$set(c,!!a)})}}}}});o(["src","href"],function(a){var c=aa("ng-"+a);qb[c]=function(){return{priority:99,link:function(d,e,f){f.$observe(c,function(c){c&&(f.$set(a,c),X&&e.prop(a,f[a]))})}}}});var Va={$addControl:t,$removeControl:t,$setValidity:t,$setDirty:t,$setPristine:t};$b.$inject=["$element","$attrs","$scope"];var Ya=function(a){return["$timeout",
+function(c){var d={name:"form",restrict:"E",controller:$b,compile:function(){return{pre:function(a,d,i,h){if(!i.action){var j=function(a){a.preventDefault?a.preventDefault():a.returnValue=!1};ac(d[0],"submit",j);d.bind("$destroy",function(){c(function(){ib(d[0],"submit",j)},0,!1)})}var g=d.parent().controller("form"),m=i.name||i.ngForm;m&&(a[m]=h);g&&d.bind("$destroy",function(){g.$removeControl(h);m&&(a[m]=s);y(h,Va)})}}}};return a?y(W(d),{restrict:"EAC"}):d}]},pd=Ya(),qd=Ya(!0),rd=/^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/,
+sd=/^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$/,td=/^\s*(\-|\+)?(\d+|(\d*(\.\d*)))\s*$/,cc={text:Xa,number:function(a,c,d,e,f,i){Xa(a,c,d,e,f,i);e.$parsers.push(function(a){var c=U(a);return c||td.test(a)?(e.$setValidity("number",!0),a===""?null:c?a:parseFloat(a)):(e.$setValidity("number",!1),s)});e.$formatters.push(function(a){return U(a)?"":""+a});if(d.min){var h=parseFloat(d.min),a=function(a){return!U(a)&&aj?(e.$setValidity("max",!1),s):(e.$setValidity("max",!0),a)};e.$parsers.push(d);e.$formatters.push(d)}e.$formatters.push(function(a){return U(a)||Za(a)?(e.$setValidity("number",!0),a):(e.$setValidity("number",!1),s)})},url:function(a,c,d,e,f,i){Xa(a,c,d,e,f,i);a=function(a){return U(a)||rd.test(a)?(e.$setValidity("url",!0),a):(e.$setValidity("url",!1),s)};e.$formatters.push(a);e.$parsers.push(a)},email:function(a,
+c,d,e,f,i){Xa(a,c,d,e,f,i);a=function(a){return U(a)||sd.test(a)?(e.$setValidity("email",!0),a):(e.$setValidity("email",!1),s)};e.$formatters.push(a);e.$parsers.push(a)},radio:function(a,c,d,e){u(d.name)&&c.attr("name",Ea());c.bind("click",function(){c[0].checked&&a.$apply(function(){e.$setViewValue(d.value)})});e.$render=function(){c[0].checked=d.value==e.$viewValue};d.$observe("value",e.$render)},checkbox:function(a,c,d,e){var f=d.ngTrueValue,i=d.ngFalseValue;x(f)||(f=!0);x(i)||(i=!1);c.bind("click",
+function(){a.$apply(function(){e.$setViewValue(c[0].checked)})});e.$render=function(){c[0].checked=e.$viewValue};e.$formatters.push(function(a){return a===f});e.$parsers.push(function(a){return a?f:i})},hidden:t,button:t,submit:t,reset:t},dc=["$browser","$sniffer",function(a,c){return{restrict:"E",require:"?ngModel",link:function(d,e,f,i){i&&(cc[J(f.type)]||cc.text)(d,e,f,i,c,a)}}}],Ua="ng-valid",Ta="ng-invalid",oa="ng-pristine",Wa="ng-dirty",ud=["$scope","$exceptionHandler","$attrs","$element","$parse",
+function(a,c,d,e,f){function i(a,c){c=c?"-"+db(c,"-"):"";e.removeClass((a?Ta:Ua)+c).addClass((a?Ua:Ta)+c)}this.$modelValue=this.$viewValue=Number.NaN;this.$parsers=[];this.$formatters=[];this.$viewChangeListeners=[];this.$pristine=!0;this.$dirty=!1;this.$valid=!0;this.$invalid=!1;this.$name=d.name;var h=f(d.ngModel),j=h.assign;if(!j)throw Error(Ib+d.ngModel+" ("+ta(e)+")");this.$render=t;var g=e.inheritedData("$formController")||Va,m=0,k=this.$error={};e.addClass(oa);i(!0);this.$setValidity=function(a,
+c){if(k[a]!==!c){if(c){if(k[a]&&m--,!m)i(!0),this.$valid=!0,this.$invalid=!1}else i(!1),this.$invalid=!0,this.$valid=!1,m++;k[a]=!c;i(c,a);g.$setValidity(a,c,this)}};this.$setPristine=function(){this.$dirty=!1;this.$pristine=!0;e.removeClass(Wa).addClass(oa)};this.$setViewValue=function(d){this.$viewValue=d;if(this.$pristine)this.$dirty=!0,this.$pristine=!1,e.removeClass(oa).addClass(Wa),g.$setDirty();o(this.$parsers,function(a){d=a(d)});if(this.$modelValue!==d)this.$modelValue=d,j(a,d),o(this.$viewChangeListeners,
+function(a){try{a()}catch(d){c(d)}})};var l=this;a.$watch(function(){var c=h(a);if(l.$modelValue!==c){var d=l.$formatters,e=d.length;for(l.$modelValue=c;e--;)c=d[e](c);if(l.$viewValue!==c)l.$viewValue=c,l.$render()}})}],vd=function(){return{require:["ngModel","^?form"],controller:ud,link:function(a,c,d,e){var f=e[0],i=e[1]||Va;i.$addControl(f);c.bind("$destroy",function(){i.$removeControl(f)})}}},wd=Q({require:"ngModel",link:function(a,c,d,e){e.$viewChangeListeners.push(function(){a.$eval(d.ngChange)})}}),
+ec=function(){return{require:"?ngModel",link:function(a,c,d,e){if(e){d.required=!0;var f=function(a){if(d.required&&(U(a)||a===!1))e.$setValidity("required",!1);else return e.$setValidity("required",!0),a};e.$formatters.push(f);e.$parsers.unshift(f);d.$observe("required",function(){f(e.$viewValue)})}}}},xd=function(){return{require:"ngModel",link:function(a,c,d,e){var f=(a=/\/(.*)\//.exec(d.ngList))&&RegExp(a[1])||d.ngList||",";e.$parsers.push(function(a){var c=[];a&&o(a.split(f),function(a){a&&c.push(S(a))});
+return c});e.$formatters.push(function(a){return C(a)?a.join(", "):s})}}},yd=/^(true|false|\d+)$/,zd=function(){return{priority:100,compile:function(a,c){return yd.test(c.ngValue)?function(a,c,f){f.$set("value",a.$eval(f.ngValue))}:function(a,c,f){a.$watch(f.ngValue,function(a){f.$set("value",a,!1)})}}}},Ad=Y(function(a,c,d){c.addClass("ng-binding").data("$binding",d.ngBind);a.$watch(d.ngBind,function(a){c.text(a==s?"":a)})}),Bd=["$interpolate",function(a){return function(c,d,e){c=a(d.attr(e.$attr.ngBindTemplate));
+d.addClass("ng-binding").data("$binding",c);e.$observe("ngBindTemplate",function(a){d.text(a)})}}],Cd=[function(){return function(a,c,d){c.addClass("ng-binding").data("$binding",d.ngBindHtmlUnsafe);a.$watch(d.ngBindHtmlUnsafe,function(a){c.html(a||"")})}}],Dd=pb("",!0),Ed=pb("Odd",0),Fd=pb("Even",1),Gd=Y({compile:function(a,c){c.$set("ngCloak",s);a.removeClass("ng-cloak")}}),Hd=[function(){return{scope:!0,controller:"@"}}],Id=["$sniffer",function(a){return{priority:1E3,compile:function(){a.csp=!0}}}],
+fc={};o("click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress".split(" "),function(a){var c=aa("ng-"+a);fc[c]=["$parse",function(d){return function(e,f,i){var h=d(i[c]);f.bind(J(a),function(a){e.$apply(function(){h(e,{$event:a})})})}}]});var Jd=Y(function(a,c,d){c.bind("submit",function(){a.$apply(d.ngSubmit)})}),Kd=["$http","$templateCache","$anchorScroll","$compile","$animator",function(a,c,d,e,f){return{restrict:"ECA",terminal:!0,compile:function(i,
+h){var j=h.ngInclude||h.src,g=h.onload||"",m=h.autoscroll;return function(h,i,o){var n=f(h,o),s=0,r,p=function(){r&&(r.$destroy(),r=null);n.leave(i.contents(),i)};h.$watch(j,function(f){var j=++s;f?a.get(f,{cache:c}).success(function(a){j===s&&(r&&r.$destroy(),r=h.$new(),n.leave(i.contents(),i),a=v("
").html(a).contents(),n.enter(a,i),e(a)(r),w(m)&&(!m||h.$eval(m))&&d(),r.$emit("$includeContentLoaded"),h.$eval(g))}).error(function(){j===s&&p()}):p()})}}}}],Ld=Y({compile:function(){return{pre:function(a,
+c,d){a.$eval(d.ngInit)}}}}),Md=Y({terminal:!0,priority:1E3}),Nd=["$locale","$interpolate",function(a,c){var d=/{}/g;return{restrict:"EA",link:function(e,f,i){var h=i.count,j=f.attr(i.$attr.when),g=i.offset||0,m=e.$eval(j),k={},l=c.startSymbol(),q=c.endSymbol();o(m,function(a,e){k[e]=c(a.replace(d,l+h+"-"+g+q))});e.$watch(function(){var c=parseFloat(e.$eval(h));return isNaN(c)?"":(m[c]||(c=a.pluralCat(c-g)),k[c](e,f,!0))},function(a){f.text(a)})}}}],Od=["$parse","$animator",function(a,c){return{transclude:"element",
+priority:1E3,terminal:!0,compile:function(d,e,f){return function(d,e,j){var g=c(d,j),m=j.ngRepeat,k=m.match(/^\s*(.+)\s+in\s+(.*?)\s*(\s+track\s+by\s+(.+)\s*)?$/),l,q,n,s,r,p={$id:la};if(!k)throw Error("Expected ngRepeat in form of '_item_ in _collection_[ track by _id_]' but got '"+m+"'.");j=k[1];n=k[2];(k=k[4])?(l=a(k),q=function(a,c,e){r&&(p[r]=a);p[s]=c;p.$index=e;return l(d,p)}):q=function(a,c){return la(c)};k=j.match(/^(?:([\$\w]+)|\(([\$\w]+)\s*,\s*([\$\w]+)\))$/);if(!k)throw Error("'item' in 'item in collection' should be identifier or (key, value) but got '"+
+j+"'.");s=k[3]||k[1];r=k[2];var y={};d.$watchCollection(n,function(a){var c,j,k=e,l,n={},p,t,v,z,w,u,x=[];if(C(a))w=a;else{w=[];for(v in a)a.hasOwnProperty(v)&&v.charAt(0)!="$"&&w.push(v);w.sort()}p=w.length;j=x.length=w.length;for(c=0;c ").html(k).contents(),c);var k=f(c.contents()),m=d.current;l=m.scope=a.$new();if(m.controller)h.$scope=l,h=i(m.controller,h),c.children().data("$ngControllerController",h);k(l);l.$emit("$viewContentLoaded");l.$eval(o);e()}else n.leave(c.contents(),c),l&&(l.$destroy(),l=null)}var l,o=m.onload||"",n=h(a,m);a.$on("$routeChangeSuccess",k);k()}}}],Xd=["$templateCache",function(a){return{restrict:"E",terminal:!0,compile:function(c,
+d){d.type=="text/ng-template"&&a.put(d.id,c[0].text)}}}],Yd=Q({terminal:!0}),Zd=["$compile","$parse",function(a,c){var d=/^\s*(.*?)(?:\s+as\s+(.*?))?(?:\s+group\s+by\s+(.*))?\s+for\s+(?:([\$\w][\$\w\d]*)|(?:\(\s*([\$\w][\$\w\d]*)\s*,\s*([\$\w][\$\w\d]*)\s*\)))\s+in\s+(.*)$/,e={$setViewValue:t};return{restrict:"E",require:["select","?ngModel"],controller:["$element","$scope","$attrs",function(a,c,d){var j=this,g={},m=e,k;j.databound=d.ngModel;j.init=function(a,c,d){m=a;k=d};j.addOption=function(c){g[c]=
+!0;m.$viewValue==c&&(a.val(c),k.parent()&&k.remove())};j.removeOption=function(a){this.hasOption(a)&&(delete g[a],m.$viewValue==a&&this.renderUnknownOption(a))};j.renderUnknownOption=function(c){c="? "+la(c)+" ?";k.val(c);a.prepend(k);a.val(c);k.prop("selected",!0)};j.hasOption=function(a){return g.hasOwnProperty(a)};c.$on("$destroy",function(){j.renderUnknownOption=t})}],link:function(e,i,h,j){function g(a,c,d,e){d.$render=function(){var a=d.$viewValue;e.hasOption(a)?(x.parent()&&x.remove(),c.val(a),
+a===""&&p.prop("selected",!0)):u(a)&&p?c.val(""):e.renderUnknownOption(a)};c.bind("change",function(){a.$apply(function(){x.parent()&&x.remove();d.$setViewValue(c.val())})})}function m(a,c,d){var e;d.$render=function(){var a=new Pa(d.$viewValue);o(c.find("option"),function(c){c.selected=w(a.get(c.value))})};a.$watch(function(){ja(e,d.$viewValue)||(e=W(d.$viewValue),d.$render())});c.bind("change",function(){a.$apply(function(){var a=[];o(c.find("option"),function(c){c.selected&&a.push(c.value)});d.$setViewValue(a)})})}
+function k(e,f,h){function g(){var a={"":[]},c=[""],d,i,t,v,u;t=h.$modelValue;v=p(e)||[];var w=l?rb(v):v,z,x,A;x={};u=!1;var B,C;if(n)u=new Pa(t);else if(t===null||r)a[""].push({selected:t===null,id:"",label:""}),u=!0;for(A=0;z=w.length,A
A;)v.pop().element.remove()}for(;q.length>x;)q.pop()[0].element.remove()}var i;if(!(i=t.match(d)))throw Error("Expected ngOptions in form of '_select_ (as _label_)? for (_key_,)?_value_ in _collection_' but got '"+t+"'.");var j=c(i[2]||i[1]),k=i[4]||i[6],l=i[5],m=c(i[3]||""),o=c(i[2]?i[1]:k),p=c(i[7]),q=[[{element:f,label:""}]];r&&(a(r)(e),r.removeClass("ng-scope"),r.remove());f.html("");f.bind("change",
+function(){e.$apply(function(){var a,c=p(e)||[],d={},g,i,j,m,r,t;if(n){i=[];m=0;for(t=q.length;m@charset "UTF-8";[ng\\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak{display:none;}ng\\:form{display:block;}');
diff --git a/js/utils.js b/js/utils.js
index 4031a7d..0748b6e 100644
--- a/js/utils.js
+++ b/js/utils.js
@@ -10,7 +10,11 @@ JamStash.service('utils', function ($cookieStore) {
}
};
this.setValue = function (key, value, notify) {
- $cookieStore.put(key, value);
+ if (value !== null) {
+ $cookieStore.put(key, value);
+ } else {
+ $cookieStore.remove(key);
+ }
if (notify) {
}
/* jQuery.cookies.js
diff --git a/style/Dark.css b/style/Dark.css
index d8515bc..245cdf0 100644
--- a/style/Dark.css
+++ b/style/Dark.css
@@ -26,19 +26,19 @@ span.apiversion
.lgsection
{
background: #323232;
- border-top: 1px solid #1D1D1D;
- border-bottom: 1px solid #1D1D1D;
+ border-top: 1px solid #5A5A5A;
+ border-bottom: 1px solid #5A5A5A;
}
.fullsection
{
background: #323232;
- border-top: 1px solid #1D1D1D;
- border-bottom: 1px solid #1D1D1D;
+ border-top: 1px solid #5A5A5A;
+ border-bottom: 1px solid #5A5A5A;
}
.smsection
{
background: none;
- /*border-right: 1px solid #1D1D1D;*/
+ /*border-right: 1px solid #5A5A5A;*/
}
#nav a
{
@@ -51,27 +51,25 @@ span.apiversion
{
color: #545454;
border: 1px solid #5A5A5A;
- border-right: 1px solid #232323;
border-bottom: none;
}
#nav a.active
{
color: #545454;
background: #323232;
- border: 1px solid #1D1D1D;
+ border: 1px solid #5A5A5A;
border-bottom: none;
}
#nav a.active:hover
{
color: #545454;
border: 1px solid #5A5A5A;
- border: 1px solid #1D1D1D;
border-bottom: none;
}
#SideBar
{
background: #292929;
- border: 1px solid #1d1d1d;
+ border: 1px solid #5A5A5A;
}
#NowPlaying, #ChatMsgs
{
@@ -86,8 +84,8 @@ span.apiversion
.status
{
background: #222;
- border-top: 1px solid #1D1D1D;
- border-left: 1px solid #1D1D1D;
+ border-top: 1px solid #1d1d1d;
+ border-left: 1px solid #1d1d1d;
}
.status a
{
@@ -96,8 +94,8 @@ span.apiversion
#player
{
background: #323232;
- border-top: 1px solid #1D1D1D;
- border-bottom: 1px solid #1D1D1D;
+ border-top: 1px solid #5A5A5A;
+ border-bottom: 1px solid #5A5A5A;
}
.vertshade {
background: -webkit-gradient(linear, left top, right top, from(rgba(46, 46, 46, 0)), to(rgba(46, 46, 46, 1)));
@@ -136,7 +134,7 @@ a.button {
background: #323232;
background: -webkit-gradient(linear,0% 40%,0% 70%,from(#323232),to(#323232));
background: -moz-linear-gradient(linear,0% 40%,0% 70%,from(#323232),to(#323232));
- border: solid 1px #1d1d1d;
+ border: solid 1px #5A5A5A;
}
a.button:hover {
color: #939393;
@@ -165,7 +163,7 @@ a.disabled {
}
a.disabled:hover {
color: #3D3D3D;
- border-color: #1d1d1d;
+ border-color: #5A5A5A;
-moz-box-shadow: none;
box-shadow: none;
}
@@ -205,13 +203,12 @@ ul.simplelist li.selected
{
color: #D6D469;
}
-#AZContainer
+#submenu_AZIndex
{
- border-top: 1px solid #F2F2F2;
- /*background: #2a2a2a;*/
- background: rgba(42, 42, 42, .8);
+ border: 1px solid #5A5A5A;
+ background: #323232;
}
-#AZContainer #AZIndex li a
+#AZIndex #AZIndex li a
{
color: #f2f2f2;
}
@@ -239,6 +236,12 @@ ul.songlist li.album .albumart img
{
border: 1px solid #232323;
}
+ul.songlist .albumgrid .title
+{
+ background: -webkit-linear-gradient(right, #2e2e2e 0%, #fff 40%);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+}
ul.songlist li.row {
border-bottom: 1px solid #232323;
}
@@ -293,11 +296,11 @@ ul.preferences li em
}
.inputwrap
{
- border: 1px solid #1d1d1d;
+ border: 1px solid #5A5A5A;
}
fieldset
{
- border: 1px solid #1d1d1d;
+ border: 1px solid #5A5A5A;
}
label
{
@@ -348,6 +351,9 @@ label
border: solid 1px #000000;
background: #222222;
}
+#QueuePreview .row .albumart img {
+ border-color: #1d1d1d;
+}
#QueuePreview .queueactions {
border-right: 1px solid #000000;
}
diff --git a/style/Style.css b/style/Style.css
index d2e93df..91c21f2 100755
--- a/style/Style.css
+++ b/style/Style.css
@@ -66,27 +66,19 @@ span.apiversion
display: inline-block;
background-color: #EEF4FA;
}
-
+.infolink {
+ float: right;
+ margin: 0 5px 5px 5px;
+}
+.infolink a {
+ padding: 0 4px;
+}
#container {
text-align: left;
overflow: hidden;
width: 100%;
height: 100%;
}
-#logo
-{
- position: absolute;
- width: 54px;
- height: 36px;
- background: url('../images/subsonic_36.png') no-repeat 5px 3px;
- cursor: pointer;
- top: 0;
- right: 248px;
-}
-#logo:hover
-{
- background: url('../images/subsonic_dn_36.png') no-repeat 5px 2px;
-}
#version
{
position: absolute;
@@ -98,10 +90,10 @@ span.apiversion
#nav
{
height: 54px;
- width: 270px;
+ /*width: 270px;*/
position: absolute;
top: 2px;
- left: 0;
+ left: 50px;
z-index: 99;
}
#nav ul
@@ -127,7 +119,7 @@ span.apiversion
text-decoration: none;
background: #f4f4f4;
border: 1px solid #E4E4E4;
- border-right: 1px solid #D5D5D5;
+ border-left: 1px solid #D5D5D5;
border-bottom: none;
}
#nav a:hover
@@ -162,14 +154,33 @@ span.apiversion
display: block;
margin: 3px 0 4px 1px;
}
-#search
+#jslogo
{
- height: 30px;
- width: 250px;
position: absolute;
top: 6px;
- right: 0;
- z-index: 1;
+ left: 12px;
+ width: 32px;
+ height: 32px;
+ background: url('../images/favicon_32x32.png') no-repeat 0 0;
+ cursor: pointer;
+}
+#jslogo:hover
+{
+ background: url('../images/favicon_32x32.png') no-repeat 0 1px;
+}
+#sslogo
+{
+ position: absolute;
+ top: -1px;
+ right: 7px;
+ width: 54px;
+ height: 36px;
+ background: url('../images/subsonic_36.png') no-repeat 5px 3px;
+ cursor: pointer;
+}
+#sslogo:hover
+{
+ background: url('../images/subsonic_dn_36.png') no-repeat 5px 2px;
}
#content
{
@@ -264,12 +275,14 @@ span.apiversion
#messages
{
display: none;
- /*width: 600px;*/
+ width: 200px;
+ max-height: 205px;
+ overflow: hidden;
font-size: 12px;
position: absolute;
- z-index: 99;
- top: 0;
- right: 10px;
+ z-index: 999;
+ bottom: 5px;
+ right: 5px;
}
#messages .message
{
@@ -375,7 +388,6 @@ ul.actionlist li
font-size: 13px;
cursor: pointer;
padding: 0;
- border-bottom: 1px solid #f2f2f2;
}
#AutoAlbumContainer li.item
{
@@ -516,11 +528,7 @@ ul.songlist .album
font-size: 13px;
border-bottom: 1px solid #EFEFEF;
cursor: pointer;
- padding: 4px
-}
-ul.songlist .album .details
-{
- font-size: 11px;
+ padding: 4px;
}
ul.songlist .album a
{
@@ -534,10 +542,6 @@ ul.songlist .album a:hover
{
text-decoration: underline;
}
-ul.songlist .album .albumlink {
- float: right;
- margin: 0 5px 5px 5px;
-}
ul.songlist .album .description
{
background: #ffffff;
@@ -550,7 +554,7 @@ ul.songlist .album .description
}
ul.songlist .album .itemactions
{
- width: 80px;
+ width: 100px;
padding: 0;
margin: 4px 0 0 2px;
float: left;
@@ -573,10 +577,21 @@ ul.songlist .album .albumart img
margin: 3px 10px 0 10px;
padding: 2px;
border: 1px solid #DEDEDE;
+ width: 50px;
}
ul.songlist .album .title
{
padding: 5px 0 0px 0;
+ line-height: 18px;
+}
+ul.songlist .album .artist
+{
+ line-height: 14px;
+}
+ul.songlist .album .details
+{
+ font-size: 11px;
+ line-height: 14px;
}
ul.songlist .album a.play
{
@@ -618,6 +633,49 @@ ul.songlist .album a.favorite
{
background: url('../images/star_yo_12x12.png') 4px center no-repeat;
}
+ul.songlist .album a.info
+{
+ background: url('../images/info_gl_4x8.png') no-repeat 7px center;
+}
+ul.songlist .albumgrid
+{
+ width: 185px;
+ height: 230px;
+ float: left;
+ margin: 5px;
+ box-shadow: 0 1px 4px rgba(0, 0, 0, 0.2);
+}
+ul.songlist .albumgrid .title
+{
+ padding: 0;
+ overflow: hidden;
+ white-space: nowrap;
+ display: block;
+ height: 18px;
+ background: -webkit-linear-gradient(right, #eee 0%, #333 40%);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+}
+ul.songlist .albumgrid .albumart img
+{
+ width: 160px;
+}
+ul.songlist .albumgrid .albuminfo
+{
+ float: left;
+ margin: 0 10px;
+ overflow: hidden;
+ width: 165px;
+}
+ul.songlist .albumgrid .itemactions
+{
+ margin: 0 auto;
+ float: none;
+}
+ul.songlist .albumgrid .itemactions a
+{
+ height: 20px
+}
ul.songlist .row
{
@@ -756,6 +814,7 @@ ul.songlist li.selected
background-image: url('../images/check_8x7.png');
background-position: 10px 16px;
background-repeat: no-repeat;
+ border-bottom: 1px solid #C0D5EB;
}
ul.songlist li.selected:hover {
background-color: #D4E2F1;
@@ -780,17 +839,12 @@ ul.songlist li:hover
#ArtistContainer
{
}
-#AZContainer
+#AZIndex
{
- border-top: 1px solid #F2F2F2;
float: right;
margin: 0 5px 0 0;
- /*
- position: fixed;
- bottom: 85px;
- */
}
-#AZContainer a
+#AZIndex a
{
color: #7EA8D5;
font-size: 24px;
@@ -798,17 +852,13 @@ ul.songlist li:hover
padding: 5px 5px 0 5px;
display: block;
}
-#AZContainer a:hover { text-decoration: underline; }
+#AZIndex a:hover { text-decoration: underline; }
#submenu_AZIndex
{
display: none;
width: 200px;
height: 100px;
position: fixed;
- /*
- bottom: 94px;
- left: 4px;
- */
background: #f9f9f9;
border: 1px solid #C3C3C3;
z-index: 999;
@@ -845,19 +895,25 @@ ul.songlist li:hover
.actions
{
height: 30px;
- margin: 6px 20px 0 265px;
+ margin: 6px 5px 0 280px;
padding: 0 0 0 5px;
}
.subactions
{
height: 29px;
- width: 660px;
- margin: 5px 0 0 0;
+ /* width: 660px; */
+ margin: 5px 68px 0 0;
padding: 0 0 0 5px;
+ float: right;
+}
+#search
+{
+ margin: 6px 0 0 0;
+ float: left;
}
.submenu
{
- position: absolute;
+ position: fixed;
background: #fff;
padding: 5px 10px;
margin: 2px 0 0 1px;
@@ -893,6 +949,7 @@ ul.songlist li:hover
overflow-x: hidden;
border: solid 1px gainsboro;
}
+
#SideBar
{
display: none;
@@ -1155,10 +1212,10 @@ ul.songlist li:hover
}
.audiojs .time
{
- float: right;
+ float: left;
border: none;
line-height: 17px;
- padding: 0 0 0 5px;
+ padding: 0 5px 0 0;
font-size: 11px;
text-shadow: none;
height: 36px;
@@ -1578,7 +1635,7 @@ input.chat
input#Search
{
border: 1px solid #DCDCDC;
- width: 110px;
+ width: 200px;
margin: 0 0 0 5px;
}
select