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 @@  - + + + + Jamstash @@ -12,17 +15,17 @@ - + + - @@ -36,13 +39,15 @@ @@ -76,9 +81,9 @@
-
+
@@ -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 + + + + + + + + + + +
    + +
    + +
    +
    + + +
    + + +
    +
    + All + None + + Queue + + Playlist + +
    +
    +
    +
    +
    +
    +
    Library
    +
    + +
      +
    • Auto Albums
    • + +
    • +
      + + +
      +
    • + +
    + +
    + A-Z +
    + +
      +
    • +
        +
      • +
      +
    +
    +
    +
    +
    Playlists
    +
    +
    +
    Podcasts
    +
    +
    +
    Archive.org
    +
    +
    +
    +
    +
    +
    +
    +
      +
      +
      +
      +
      +
      + + +
      +
      +
      + +
      +
      + All + None + + Queue +
      +
      +
      +
      +
      +
        +
      • +
      +
      +
      +
        +
      • + + + + +
      • +
      +
        +
        +
        +
          +
          +
          +
          +
          +
          + + + + + + + +
          + +
          +
            +
          • +
            + +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            +
          • +
          +
          +
          +
          +
          + + +
          +
          + + + New +
          + +
          +
          +
          +
          +
          • Auto Playlists
          +
            +
            • Folder Playlists
            +
              +
              • Saved Playlists
              +
                +
                +
                +
                + + + +
                +
                +
                +
                0 song(s), 00:00:00 total time
                +
                + + + +
                +
                + +
                +
                ***Opens new window to the video URL... +
                +
                +
                + + + +
                +
                +
                +
                +
                +
                + + +
                + +
                +
                +
                +
                +
                +

                Login

                +
                +
                +
                +
                +
                +
                + +
                +

                +

                Archive.org Settings

                +
                +
                +
                + Launch Welcome +

                Welcome

                +
                +
                +

                Options

                +
                +
                +
                +
                +
                + +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                + General +
                + +
                +
                + +
                +
                + +
                +
                + +
                +
                +
                + Advanced +
                + +
                +
                + +
                +
                + +
                +
                +
                + HTML5 [Beta] + Notifications
                +
                +
                + +
                +
                + +
                + Local Storage
                +
                +
                + +
                +
                +
                +
                +
                +
                *All settings will be automatically saved
                +
                +
                +

                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
                • +
                + +
                +
                +
                +

                Change Log

                +
                  +
                • + + + +
                • +
                + Show More +
                +
                +
                +

                Links

                + +

                Thanks

                + +
                +
                +
                +
                + + + +
                + +
                +
                +
                +
                + + + + +
                +
                + +
                +
                  +
                • +
                • +
                • +
                • + + + + + +
                • +
                +
                +
                +
                +
                +
                + +
                +
                +
                +
                +
                +
                +
                00:00/00:00
                +
                +
                +
                +
                +
                +
                +
                +
                +
                + + + + 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 @@
                - ? -
                @@ -36,7 +45,13 @@
                • - + +
                  @@ -45,7 +60,7 @@
                  {{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 @@
                  - -
                  -
                  + +
                  All None + Queue @@ -26,19 +25,19 @@
                  -
                  +
                  A-Z
                  - +
                  • 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 @@
                  -
                  - All +
                  +
                  diff --git a/js/partials/settings.html b/js/partials/settings.html index 3deebaa..e9c7bad 100644 --- a/js/partials/settings.html +++ b/js/partials/settings.html @@ -26,7 +26,7 @@ - *This is a donation to tsquillario, the developer of Jamstash. + *This is a donation to tsquillario, the developer of Jamstash.
                  Not related to a Subsonic License!
                  @@ -46,7 +46,7 @@

                  Thanks

                    diff --git a/js/partials/settingsForm.html b/js/partials/settingsForm.html index 4fafab5..e49bf20 100644 --- a/js/partials/settingsForm.html +++ b/js/partials/settingsForm.html @@ -4,7 +4,7 @@


                    -
                    +


                    diff --git a/js/partials/songs.html b/js/partials/songs.html index 68b3a0f..71233b7 100644 --- a/js/partials/songs.html +++ b/js/partials/songs.html @@ -8,8 +8,9 @@
                  -
                  {{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 @@
                  -
                  +
                  All
                  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,AA;)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