angular.module('JamStash') .controller('AppController', ['$scope', '$rootScope', '$document', '$window', '$location', '$cookieStore', '$http', 'lodash', 'utils', 'globals', 'model', 'notifications', 'player', 'persistence', 'Page', 'subsonic', 'Loading', function ($scope, $rootScope, $document, $window, $location, $cookieStore, $http, _, utils, globals, model, notifications, player, persistence, Page, subsonic, Loading) { 'use strict'; $rootScope.settings = globals.settings; $rootScope.song = []; $rootScope.playingSong = null; $rootScope.Messages = []; $rootScope.unity = null; $scope.Page = Page; $rootScope.loggedIn = function () { if (globals.settings.Server !== '' && globals.settings.Username !== '' && globals.settings.Password !== '') { return true; } else { return false; } }; $rootScope.totalDisplayed = 50; $rootScope.loadMore = function () { $scope.totalDisplayed += 50; }; $rootScope.go = function (path) { $location.path(path); }; $scope.loading = Loading; // TODO: Hyz: remove when there are no longer jQuery ajax calls $.ajaxSetup({ 'beforeSend': function () { $("#loading").removeClass('ng-hide'); }, 'complete': function () { $("#loading").addClass('ng-hide'); } }); // Reads cookies and sets globals.settings values $scope.loadSettings = function () { // Temporary Code to Convert Cookies added 2/2/2014 if ($cookieStore.get('Settings')) { persistence.saveSettings($cookieStore.get('Settings')); $cookieStore.remove('Settings'); } var settings = persistence.getSettings(); if (settings !== undefined) { var updSettings = _.omit(settings, 'Url'); // We can't just assign settings to globals.settings because it's on the scope // TODO: Hyz: remove $rootScope.settings and replace with individual settings _.each(updSettings, function(val, key) { globals.settings[key] = val; }); } if (utils.getValue("SavedCollections")) { globals.SavedCollections = utils.getValue("SavedCollections").split(","); } if (utils.getValue("DefaultCollection")) { globals.DefaultCollection = utils.getValue("DefaultCollection"); } if (globals.settings.Debug) { console.log('Loaded Settings: ' + JSON.stringify(globals.settings, null, 2)); } }; $scope.toggleSetting = function (setting) { var id = setting; if (globals.settings[id]) { globals.settings[id] = false; } else { globals.settings[id] = true; } notifications.updateMessage(setting + ' : ' + globals.settings[id], true); }; var submenu_active = false; $('div.submenu').mouseenter(function () { submenu_active = true; }); $('div.submenu').mouseleave(function () { submenu_active = false; $('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); var off = el.offset(); var width = el.width(); var 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); } }; $scope.$watchCollection(function () { return player.queue; }, function(newQueue) { if (newQueue !== undefined && newQueue.length > 0 && globals.settings.ShowQueue) { $scope.showQueue(); } }); $rootScope.showQueue = function () { $('#SideBar').css('display', 'block'); $('#right-component').removeClass('lgcolumn_expanded'); }; $rootScope.hideQueue = function () { $('#SideBar').css('display', 'none'); $('#right-component').addClass('lgcolumn_expanded'); }; $scope.toggleQueue = function () { if ($('#SideBar').css('display') === 'none') { $rootScope.showQueue(); } else { $rootScope.hideQueue(); } }; $rootScope.showArtists = function () { $('#left-component').css('display', ''); $('#right-component').removeClass('lgcolumn_expandedleft'); }; $rootScope.hideArtists = function () { $('#left-component').css('display', 'none'); $('#right-component').addClass('lgcolumn_expandedleft'); }; $scope.toggleArtists = function () { if ($('#left-component').css('display') == 'none') { $rootScope.showArtists(); } else { $rootScope.hideArtists(); } }; $scope.fancyboxOpenImage = function (url) { $.fancybox.open({ helpers : { overlay : { css : { 'background' : 'rgba(0, 0, 0, 0.15)' } } }, hideOnContentClick: true, type: 'image', openEffect: 'none', closeEffect: 'none', href: url }); }; $(document).on("click", ".message", function(){ $(this).remove(); }); // Global Functions window.onbeforeunload = function () { if (!globals.settings.Debug) { if (player.queue.length > 0) { return "You're about to end your session, are you sure?"; } } }; $rootScope.showIndex = false; $(document).on( 'click', 'message', function() { $(this).fadeOut(function () { $(this).remove(); }); return false; }) $document.keydown(function (e) { $scope.scrollToIndex(e); }); $scope.scrollToIndex = function (e) { var source = e.target.id; if (e.target.tagName.toUpperCase() != 'INPUT') { var unicode = e.charCode ? e.charCode : e.keyCode; if (globals.settings.Debug) { console.log('Keycode Triggered: ' + unicode); } if (unicode == 49) { // 1 $('#action_Queue').click(); } else if (unicode == 50) { $('#action_Library').click(); } else if (unicode == 51) { $('#action_Archive').click(); } else if (unicode == 52) { $('#action_Settings').click(); } else if (unicode == 53) { } else if (unicode == 54) { // 6 } if (unicode >= 65 && unicode <= 90 && $('#tabLibrary').is(':visible')) { // a-z var key = utils.findKeyForCode(unicode); if (key == 'x' || key == 'y' || key == 'z') { key = 'x-z'; } var el = '#' + key.toUpperCase(); if ($(el).length > 0) { $('#left-component').stop().scrollTo(el, 400); } } else if (unicode == 36 && $('#tabLibrary').is(':visible')) { // home $('#left-component').stop().scrollTo('#MusicFolders', 400); } } return true; }; $scope.scrollToIndexName = function (index) { var el = '#' + index; if ($(el).length > 0) { $('#left-component').stop().scrollTo(el, 400); } }; $scope.scrollToTop = function () { $('#left-component').stop().scrollTo('#MusicFolders', 400); }; $rootScope.removeSong = function (item, songs) { // TODO: Hyz: Replace var index = songs.indexOf(item); songs.splice(index, 1); }; $scope.isActive = function (route) { return route === $location.path(); }; $rootScope.getSplitPosition = function (scope, elm) { window.alert(elm.getBoundingClientRect().left); }; $scope.download = function (id) { $.ajax({ url: globals.BaseURL() + '/getUser.view?' + globals.BaseParams() + '&username=' + globals.settings.Username, method: 'GET', dataType: globals.settings.Protocol, timeout: globals.settings.Timeout, success: function (data) { if (typeof data["subsonic-response"].error != 'undefined') { notifications.updateMessage('Error: ' + data["subsonic-response"].error.message, true); } else { if (data["subsonic-response"].user.downloadRole === true) { $window.location.href = globals.BaseURL() + '/download.view?' + globals.BaseParams() + '&id=' + id; } else { notifications.updateMessage('You do not have permission to Download', true); } } } }); }; /** * Returns true if the target of this event is an input * @param {jQuery event} event * @return {Boolean} */ function isTargetInput (event) { return (event && event.target.tagName === "INPUT"); } /* We define player-related methods here instead of in player controller in order to bind keypresses to and have global shortcuts. We also check the event so we don't do anything if it's on an input */ $scope.togglePause = function (event) { if(!isTargetInput(event)) { if(globals.settings.Jukebox) { $scope.sendToJukebox('stop'); } else { player.togglePause(); } } }; $scope.turnVolumeUp = function (event) { if(!isTargetInput(event)) { var volume = player.turnVolumeUp(); persistence.saveVolume(volume); } }; $scope.turnVolumeDown = function (event) { if(!isTargetInput(event)) { var volume = player.turnVolumeDown(); persistence.saveVolume(volume); } }; $scope.nextTrack = function (event) { if(!isTargetInput(event)) { player.nextTrack(); } }; $scope.previousTrack = function (event) { if(!isTargetInput(event)) { player.previousTrack(); } }; $rootScope.addToJukebox = function (id) { if (globals.settings.Debug) { console.log("LOAD JUKEBOX"); } $.ajax({ url: globals.BaseURL() + '/jukeboxControl.view?' + globals.BaseParams() + '&action=set&id=' + id, method: 'GET', dataType: globals.settings.Protocol, timeout: globals.settings.Timeout, success: function (data) { /* if (data["subsonic-response"].podcasts.channel !== undefined) { } deferred.resolve(podcasts); */ $.get(globals.BaseURL() + '/jukeboxControl.view?' + globals.BaseParams() + '&action=start'); } }); }; $rootScope.sendToJukebox = function (action) { if (globals.settings.Debug) { console.log("SEND JUKEBOX " + action); } $.ajax({ url: globals.BaseURL() + '/jukeboxControl.view?' + globals.BaseParams() + '&action=' + action, method: 'GET', dataType: globals.settings.Protocol, timeout: globals.settings.Timeout, success: function (data) { } }); }; $scope.toggleStar = function (item) { subsonic.toggleStar(item).then(function (newStarred) { item.starred = newStarred; notifications.updateMessage('Favorite Updated!', true); }); }; $scope.toTrusted = function (html) { return $sce.trustAsHtml(html); }; /* Launch on Startup */ $scope.loadSettings(); utils.switchTheme(globals.settings.Theme); if(!globals.settings.ShowQueue) { $rootScope.hideQueue(); } if ($scope.loggedIn()) { //$scope.ping(); if (globals.settings.SaveTrackPosition) { persistence.loadQueue(); persistence.loadTrackPosition(); } player.setVolume(persistence.getVolume()); } /* End Startup */ }]);