diff options
64 files changed, 9765 insertions, 10776 deletions
diff --git a/www/index.html b/www/index.html index 81753e52..01a87cc5 100644 --- a/www/index.html +++ b/www/index.html @@ -2,186 +2,185 @@ <html> <head> - <meta charset="utf-8"> - - - <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover"> - - <meta http-equiv="Content-Security-Policy" content="img-src * blob: android-webview-video-poster: cdvphotolibrary: 'self' data: ws: wss://*; default-src * blob: 'self' gap: wss: ws: data:; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; connect-src * http: https: ws: wss:;"> - - - - - <!--<meta http-equiv="Content-Security-Policy" content="img-src * blob: android-webview-video-poster: cdvphotolibrary: 'self' data:; default-src * blob: 'self' gap: wss: ws: ; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval';connect-src * http: https: ws: wss:;">--> - <title></title> - <meta name="format-detection" content="telephone=no"> - <link rel="stylesheet" href="css/animate.min.css"> - <link rel="stylesheet" href="css/angular-circular-navigation.css"> - <link rel="stylesheet" href="css/custommfb.css"> - <link rel="stylesheet" href="lib/font-awesome/css/font-awesome.min.css"> - <link rel="stylesheet" href="css/angular-carousel.css"> - <link rel="stylesheet" href="lib/angular-awesome-slider/dist/css/angular-awesome-slider.min.css"> - <link rel="stylesheet" href="lib/vis/dist/vis-timeline-graph2d.min.css"> - <link rel="stylesheet" href="lib/ion-datetime-picker/release/ion-datetime-picker.min.css"> - <link rel="stylesheet" href="lib/angular-wizard/dist/angular-wizard.min.css"> - <link href="css/ionic.app.min.css" rel="stylesheet"> - <link href="css/style.css" rel="stylesheet"> - - <!-- unmanaged external styles --> - <link rel="stylesheet" href="external/ionic.content.banner.min.css"> - <link rel="stylesheet" href="external/radio.css"> - - - - - - <script src="lib/ionic/js/ionic.bundle.js"></script> - <script src="lib/ngCordova/dist/ng-cordova.min.js"></script> - - <script src="cordova.js"></script> - <script src="lib/filelogger/dist/filelogger.min.js"></script> - - - <script src="lib/localforage/dist/localforage.js"></script> - <script src="lib/localforage-cordovasqlitedriver/dist/localforage-cordovasqlitedriver.js"></script> - <script src="js/ionicUtils.js"></script> - <script src="lib/ionic-native-transitions/dist/ionic-native-transitions.min.js"></script> - <script src="lib/angular-wizard/dist/angular-wizard.min.js"></script> - <script src="lib/crypto-js/crypto-js.js"></script> - <script src="lib/angular-awesome-slider/dist/angular-awesome-slider.min.js"> - </script> - <script src="lib/videogular/videogular.min.js"></script> - <script src="lib/videogular-controls/vg-controls.min.js"></script> - <script src="lib/videogular-overlay-play/vg-overlay-play.min.js"></script> - <script src="lib/videogular-buffering/vg-buffering.min.js"></script> - <script src="lib/videogular-cuepoints/cuepoints.js"></script> - <script src="lib/ion-datetime-picker/release/ion-datetime-picker.min.js"></script> - <script src="lib/angular-translate/angular-translate.min.js"></script> - <script src="lib/angular-translate-loader-static-files/angular-translate-loader-static-files.min.js"></script> - <script src="lib/vis/dist/vis-timeline-graph2d.min.js"></script> - <script src="lib/moment/min/moment-with-locales.min.js"></script> - <script src="lib/ng-mfb/src/mfb-directive.js"></script> - <script src="lib/angular-touch/angular-touch.min.js"></script> - <script src="lib/holderjs/holder.min.js"></script> - - - - <!-- unmanaged externals --> - <script src="external/moment-timezone-with-data.min.js"></script> - <script src="external/angular-ios9-uiwebview.patch.js"></script> - <script src="external/ionRadio.min.js"></script> - - <!--<script src="external/ng-websocket.min.js"></script>--> - <script src="external/angular-websocket.js"></script> - - - <script src="external/uri.min.js"></script> - <script src="external/angular-carousel.min.js"></script> - <script src="external/ion-pullup.min.js"></script> - <script src="external/ionic.content.banner.min.js"></script> - <script src="external/FileSaver.min.js"></script> - <script src="external/canvas-toBlob.min.js"></script> - <script src="external/imagesloaded.pkgd.min.js"></script> - <script src="external/packery.pkgd.min.js"></script> - <script src="external/masonry.pkgd.min.js"></script> - <script src="external/draggabilly.pkgd.min.js"></script> - <script src="external/ionic.scroll.sista.min.js"></script> - <script src="external/angular-circular-navigation.min.js"></script> - <script src="external/Chart2.min.js"></script> - <script src="external/screwdriver.js"></script> - <script src="external/polyfill.min.js"></script> - <script src="external/gifwriter.min.js"></script> - <script src="external/NeuQuant.min.js"></script> - <script src="external/angular.dcb-img-fallback.min.js"></script> - <script src="external/ng-image-appear.min.js"></script> - - - - - - - <!-- app related JS --> - <script src="js/app.js"></script> - <script src="js/controllers.js"></script> - <script src="js/DataModel.js"></script> - <script src="js/LoginCtrl.js"></script> - <script src="js/MonitorModalCtrl.js"></script> - <script src="js/EventModalCtrl.js"></script> - <script src="js/MontageCtrl.js"></script> - <script src="js/EventCtrl.js"></script> - <script src="js/EventsGraphsCtrl.js"></script> - <script src="js/MonitorCtrl.js"></script> - <script src="js/HelpCtrl.js"></script> - <script src="js/StateCtrl.js"></script> - <script src="js/DevOptionsCtrl.js"></script> - <script src="js/LogCtrl.js"></script> - <script src="js/EventDateTimeFilterCtrl.js"></script> - <script src="js/TimelineCtrl.js"></script> - <script src="js/PortalLoginCtrl.js"></script> - <script src="js/LowVersionCtrl.js"></script> - <script src="js/ImportantMessageCtrl.js"></script> - <script src="js/EventServer.js"></script> - <script src="js/EventServerSettingsCtrl.js"></script> - <script src="js/FirstUseCtrl.js"></script> - <script src="js/MontageHistoryCtrl.js"></script> - <script src="js/NewsCtrl.js"></script> - <script src="js/TimelineModalCtrl.js"></script> - <script src="js/WizardCtrl.js"></script> - <script src="js/MenuController.js"></script> - <script src="js/EventsModalGraphCtrl.js"></script> - <script src="js/InvalidApiCtrl.js"></script> - <script src="js/MomentCtrl.js"></script> - <script src="js/RefreshCtrl.js"></script> - - - - + <meta charset="utf-8"> + + + <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover"> + + <meta http-equiv="Content-Security-Policy" content="img-src * blob: android-webview-video-poster: cdvphotolibrary: 'self' data: ws: wss://*; default-src * blob: 'self' gap: wss: ws: data:; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; connect-src * http: https: ws: wss:;"> + + + + + <!--<meta http-equiv="Content-Security-Policy" content="img-src * blob: android-webview-video-poster: cdvphotolibrary: 'self' data:; default-src * blob: 'self' gap: wss: ws: ; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval';connect-src * http: https: ws: wss:;">--> + <title></title> + <meta name="format-detection" content="telephone=no"> + <link rel="stylesheet" href="css/animate.min.css"> + <link rel="stylesheet" href="css/angular-circular-navigation.css"> + <link rel="stylesheet" href="css/custommfb.css"> + <link rel="stylesheet" href="lib/font-awesome/css/font-awesome.min.css"> + <link rel="stylesheet" href="css/angular-carousel.css"> + <link rel="stylesheet" href="lib/angular-awesome-slider/dist/css/angular-awesome-slider.min.css"> + <link rel="stylesheet" href="lib/vis/dist/vis-timeline-graph2d.min.css"> + <link rel="stylesheet" href="lib/ion-datetime-picker/release/ion-datetime-picker.min.css"> + <link rel="stylesheet" href="lib/angular-wizard/dist/angular-wizard.min.css"> + <link href="css/ionic.app.min.css" rel="stylesheet"> + <link href="css/style.css" rel="stylesheet"> + + <!-- unmanaged external styles --> + <link rel="stylesheet" href="external/ionic.content.banner.min.css"> + <link rel="stylesheet" href="external/radio.css"> + + + + + + <script src="lib/ionic/js/ionic.bundle.js"></script> + <script src="lib/ngCordova/dist/ng-cordova.min.js"></script> + + <script src="cordova.js"></script> + <script src="lib/filelogger/dist/filelogger.min.js"></script> + + + <script src="lib/localforage/dist/localforage.js"></script> + <script src="lib/localforage-cordovasqlitedriver/dist/localforage-cordovasqlitedriver.js"></script> + <script src="js/ionicUtils.js"></script> + <script src="lib/ionic-native-transitions/dist/ionic-native-transitions.min.js"></script> + <script src="lib/angular-wizard/dist/angular-wizard.min.js"></script> + <script src="lib/crypto-js/crypto-js.js"></script> + <script src="lib/angular-awesome-slider/dist/angular-awesome-slider.min.js"> + + + </script> + <script src="lib/videogular/videogular.min.js"></script> + <script src="lib/videogular-controls/vg-controls.min.js"></script> + <script src="lib/videogular-overlay-play/vg-overlay-play.min.js"></script> + <script src="lib/videogular-buffering/vg-buffering.min.js"></script> + <script src="lib/videogular-cuepoints/cuepoints.js"></script> + <script src="lib/ion-datetime-picker/release/ion-datetime-picker.min.js"></script> + <script src="lib/angular-translate/angular-translate.min.js"></script> + <script src="lib/angular-translate-loader-static-files/angular-translate-loader-static-files.min.js"></script> + <script src="lib/vis/dist/vis-timeline-graph2d.min.js"></script> + <script src="lib/moment/min/moment-with-locales.min.js"></script> + <script src="lib/ng-mfb/src/mfb-directive.js"></script> + <script src="lib/angular-touch/angular-touch.min.js"></script> + <script src="lib/holderjs/holder.min.js"></script> + + + + <!-- unmanaged externals --> + <script src="external/moment-timezone-with-data.min.js"></script> + <script src="external/angular-ios9-uiwebview.patch.js"></script> + <script src="external/ionRadio.min.js"></script> + + <!--<script src="external/ng-websocket.min.js"></script>--> + <script src="external/angular-websocket.js"></script> + + + <script src="external/uri.min.js"></script> + <script src="external/angular-carousel.min.js"></script> + <script src="external/ion-pullup.min.js"></script> + <script src="external/ionic.content.banner.min.js"></script> + <script src="external/FileSaver.min.js"></script> + <script src="external/canvas-toBlob.min.js"></script> + <script src="external/imagesloaded.pkgd.min.js"></script> + <script src="external/packery.pkgd.min.js"></script> + <script src="external/masonry.pkgd.min.js"></script> + <script src="external/draggabilly.pkgd.min.js"></script> + <script src="external/ionic.scroll.sista.min.js"></script> + <script src="external/angular-circular-navigation.min.js"></script> + <script src="external/Chart2.min.js"></script> + <script src="external/screwdriver.js"></script> + <script src="external/polyfill.min.js"></script> + <script src="external/gifwriter.min.js"></script> + <script src="external/NeuQuant.min.js"></script> + <script src="external/angular.dcb-img-fallback.min.js"></script> + <script src="external/ng-image-appear.min.js"></script> + + + + + + + <!-- app related JS --> + <script src="js/app.js"></script> + <script src="js/controllers.js"></script> + <script src="js/DataModel.js"></script> + <script src="js/LoginCtrl.js"></script> + <script src="js/MonitorModalCtrl.js"></script> + <script src="js/EventModalCtrl.js"></script> + <script src="js/MontageCtrl.js"></script> + <script src="js/EventCtrl.js"></script> + <script src="js/EventsGraphsCtrl.js"></script> + <script src="js/MonitorCtrl.js"></script> + <script src="js/HelpCtrl.js"></script> + <script src="js/StateCtrl.js"></script> + <script src="js/DevOptionsCtrl.js"></script> + <script src="js/LogCtrl.js"></script> + <script src="js/EventDateTimeFilterCtrl.js"></script> + <script src="js/TimelineCtrl.js"></script> + <script src="js/PortalLoginCtrl.js"></script> + <script src="js/LowVersionCtrl.js"></script> + <script src="js/ImportantMessageCtrl.js"></script> + <script src="js/EventServer.js"></script> + <script src="js/EventServerSettingsCtrl.js"></script> + <script src="js/FirstUseCtrl.js"></script> + <script src="js/MontageHistoryCtrl.js"></script> + <script src="js/NewsCtrl.js"></script> + <script src="js/TimelineModalCtrl.js"></script> + <script src="js/WizardCtrl.js"></script> + <script src="js/MenuController.js"></script> + <script src="js/EventsModalGraphCtrl.js"></script> + <script src="js/InvalidApiCtrl.js"></script> + <script src="js/MomentCtrl.js"></script> + <script src="js/RefreshCtrl.js"></script> + + + + </head> <!-- <body ng-app="starter" > --> <!-- I want to start angular only after cordova device is ready, so I'll tag it on device ready --> -<body bgcolor="#555555"> - <!-- For some reason - which I haven't debugged yet, when I was using the ionic side menu template +<body bgcolor="#555555"> + <!-- For some reason - which I haven't debugged yet, when I was using the ionic side menu template I was having problems with tabs/sliders in views, I think its to do with controls being alive in the menu. this approach puts controls in each page and that works well --> - <!-- This is the Side menu options --> - <!-- ng-cloak makes sure no HTML items load up before Angular is initialized --> - <!-- This avoids sudden flashes of odd/mis-aligned icons--> + <!-- This is the Side menu options --> + <!-- ng-cloak makes sure no HTML items load up before Angular is initialized --> + <!-- This avoids sudden flashes of odd/mis-aligned icons--> - <!-- This is where is bootstrap angular - if I don't do this, then the window jumps around + <!-- This is where is bootstrap angular - if I don't do this, then the window jumps around after the status bar comes on - because the window kicked in before phonegap got ready --> - - <!-- keyboard input jump fix + + <!-- keyboard input jump fix https://forum.ionicframework.com/t/ionic-keyboard-scroll-issue-ios/34420/2?u=pliablepixels --> - <script> + <script> /* global angular, $*/ - // window.addEventListener('native.keyboardshow', keyboardShowHandler); - //alert ('Hello'); - - - - window.ionic.Platform.ready(function() - { - console.log("******* PLATFORM READY ****"); - angular.bootstrap(document, ['zmApp']); - }); - - - function keyboardShowHandler(e) - { - setTimeout(function() - { - $('html, body').animate( - { - scrollTop: 0 - }, 1000); - }, 0); + // window.addEventListener('native.keyboardshow', keyboardShowHandler); + //alert ('Hello'); + + + + window.ionic.Platform.ready(function () { + console.log("******* PLATFORM READY ****"); + angular.bootstrap(document, ['zmApp']); + }); + + + function keyboardShowHandler(e) { + setTimeout(function () { + $('html, body').animate({ + scrollTop: 0 + }, 1000); + }, 0); } - </script> + + </script> - <ion-nav-view></ion-nav-view> + <ion-nav-view></ion-nav-view> </body> </html> diff --git a/www/js/DevOptionsCtrl.js b/www/js/DevOptionsCtrl.js index 9b4bd2c9..1ee85904 100644 --- a/www/js/DevOptionsCtrl.js +++ b/www/js/DevOptionsCtrl.js @@ -2,153 +2,133 @@ /* jslint browser: true*/ /* global cordova,StatusBar,angular,console */ -angular.module('zmApp.controllers').controller('zmApp.DevOptionsCtrl', ['$scope', '$rootScope', '$ionicModal', 'zm', 'NVRDataModel', '$ionicSideMenuDelegate', '$ionicPopup', '$http', '$q', '$ionicLoading', '$ionicHistory', '$state', 'SecuredPopups', '$translate', function($scope, $rootScope, $ionicModal, zm, NVRDataModel, $ionicSideMenuDelegate, $ionicPopup, $http, $q, $ionicLoading, $ionicHistory, $state, SecuredPopups, $translate) -{ - - $scope.openMenu = function() - { - $ionicSideMenuDelegate.toggleLeft(); - // $scope.this.will.crash = 1; - - }; - - //---------------------------------------------------------------- - // Alarm notification handling - //---------------------------------------------------------------- - $scope.handleAlarms = function() - { - $rootScope.isAlarm = !$rootScope.isAlarm; - if (!$rootScope.isAlarm) - { - $rootScope.alarmCount = "0"; - $ionicHistory.nextViewOptions( - { - disableBack: true - }); - $state.go("app.events", - { - "id": 0, - "playEvent": false - }, - { - reload: true - }); - return; - } - }; - - //---------------------------------------------------------------- - // Save anyway when you exit - //---------------------------------------------------------------- - - $scope.$on('$ionicView.beforeLeave', function() - { - saveDevOptions(); +angular.module('zmApp.controllers').controller('zmApp.DevOptionsCtrl', ['$scope', '$rootScope', '$ionicModal', 'zm', 'NVRDataModel', '$ionicSideMenuDelegate', '$ionicPopup', '$http', '$q', '$ionicLoading', '$ionicHistory', '$state', 'SecuredPopups', '$translate', function ($scope, $rootScope, $ionicModal, zm, NVRDataModel, $ionicSideMenuDelegate, $ionicPopup, $http, $q, $ionicLoading, $ionicHistory, $state, SecuredPopups, $translate) { + + $scope.openMenu = function () { + $ionicSideMenuDelegate.toggleLeft(); + // $scope.this.will.crash = 1; + + }; + + //---------------------------------------------------------------- + // Alarm notification handling + //---------------------------------------------------------------- + $scope.handleAlarms = function () { + $rootScope.isAlarm = !$rootScope.isAlarm; + if (!$rootScope.isAlarm) { + $rootScope.alarmCount = "0"; + $ionicHistory.nextViewOptions({ + disableBack: true + }); + $state.go("app.events", { + "id": 0, + "playEvent": false + }, { + reload: true + }); + return; + } + }; + + //---------------------------------------------------------------- + // Save anyway when you exit + //---------------------------------------------------------------- + + $scope.$on('$ionicView.beforeLeave', function () { + saveDevOptions(); + + }); + + //------------------------------------------------------------------------- + // Lets make sure we set screen dim properly as we enter + // The problem is we enter other states before we leave previous states + // from a callback perspective in ionic, so we really can't predictably + // reset power state on exit as if it is called after we enter another + // state, that effectively overwrites current view power management needs + //------------------------------------------------------------------------ + $scope.$on('$ionicView.beforeEnter', function () { + //console.log("**VIEW ** DevOptions Ctrl Entered"); + $scope.loginData = NVRDataModel.getLogin(); + console.log("DEV LOGS=" + $scope.loginData.enableLogs); + + $scope.isMultiPort = false; + + NVRDataModel.getZmsMultiPortSupport() + .then(function (data) { + $scope.isMultiPort = (data == 0) ? false : true; + NVRDataModel.debug("Multiport report:" + $scope.isMultiPort); + }); + + + NVRDataModel.setAwake(false); + }); + + $scope.isTzSupported = function () { + return NVRDataModel.isTzSupported(); + }; + + $scope.getTimeZoneNow = function () { + return NVRDataModel.getTimeZoneNow(); + }; + + $scope.checkMultiPortToggle = function () { + // if ($rootScope.platformOS == 'ios') + // $scope.loginData.disableSimulStreaming = true; + }; + //------------------------------------------------------------------ + // Perform the login action when the user submits the login form + //------------------------------------------------------------------ + + function saveDevOptions() { + NVRDataModel.debug("SaveDevOptions: called"); + + if (parseInt($scope.loginData.cycleMonitorsInterval) < zm.minCycleTime) { + $scope.loginData.cycleMonitorsInterval = zm.minCycleTime.toString(); + } + if ((parseInt($scope.loginData.maxFPS) < 0) || (parseInt($scope.loginData.maxFPS) > zm.maxFPS)) { + $scope.loginData.maxFPS = zm.defaultFPS.toString(); + } - }); + if (parseInt($scope.loginData.refreshSec) <= 0) { + NVRDataModel.debug("SaveDevOptions: refresh sec was too low at " + + $scope.loginData.refreshSec + " reset to 1"); + $scope.loginData.refreshSec = 1; - //------------------------------------------------------------------------- - // Lets make sure we set screen dim properly as we enter - // The problem is we enter other states before we leave previous states - // from a callback perspective in ionic, so we really can't predictably - // reset power state on exit as if it is called after we enter another - // state, that effectively overwrites current view power management needs - //------------------------------------------------------------------------ - $scope.$on('$ionicView.beforeEnter', function() - { - //console.log("**VIEW ** DevOptions Ctrl Entered"); - $scope.loginData = NVRDataModel.getLogin(); - console.log ("DEV LOGS="+$scope.loginData.enableLogs); - - $scope.isMultiPort = false; - - NVRDataModel.getZmsMultiPortSupport() - .then (function (data) { - $scope.isMultiPort = (data == 0) ? false:true; - NVRDataModel.debug ("Multiport report:"+$scope.isMultiPort); - }); - - - NVRDataModel.setAwake(false); - }); + } - $scope.isTzSupported = function() - { - return NVRDataModel.isTzSupported(); - }; - - $scope.getTimeZoneNow = function() - { - return NVRDataModel.getTimeZoneNow(); - }; - - $scope.checkMultiPortToggle = function() { - // if ($rootScope.platformOS == 'ios') - // $scope.loginData.disableSimulStreaming = true; - }; - //------------------------------------------------------------------ - // Perform the login action when the user submits the login form - //------------------------------------------------------------------ - - function saveDevOptions() - { - NVRDataModel.debug("SaveDevOptions: called"); - - if (parseInt($scope.loginData.cycleMonitorsInterval) < zm.minCycleTime) - { - $scope.loginData.cycleMonitorsInterval = zm.minCycleTime.toString(); - } - if ((parseInt($scope.loginData.maxFPS) < 0) || (parseInt($scope.loginData.maxFPS) > zm.maxFPS)) - { - $scope.loginData.maxFPS = zm.defaultFPS.toString(); - } - - if (parseInt($scope.loginData.refreshSec) <= 0) - { - NVRDataModel.debug("SaveDevOptions: refresh sec was too low at " + - $scope.loginData.refreshSec + " reset to 1"); - $scope.loginData.refreshSec = 1; - - } - - if ((parseInt($scope.loginData.montageQuality) < zm.safeMontageLimit) || - (parseInt($scope.loginData.montageQuality) > 100)) - { - $scope.loginData.montageQuality = 100; - } - - if ((parseInt($scope.loginData.singleImageQuality) < zm.safeImageQuality) || - (parseInt($scope.loginData.singleImageQuality) > 100)) - { - $scope.loginData.singleImageQuality = zm.safeImageQuality.toString(); - } - - - NVRDataModel.debug("SaveDevOptions: Saving to disk"); - NVRDataModel.setLogin($scope.loginData); - NVRDataModel.getMonitors(1); + if ((parseInt($scope.loginData.montageQuality) < zm.safeMontageLimit) || + (parseInt($scope.loginData.montageQuality) > 100)) { + $scope.loginData.montageQuality = 100; + } + if ((parseInt($scope.loginData.singleImageQuality) < zm.safeImageQuality) || + (parseInt($scope.loginData.singleImageQuality) > 100)) { + $scope.loginData.singleImageQuality = zm.safeImageQuality.toString(); } - $scope.saveDevOptions = function() - { - - saveDevOptions(); - // $rootScope.zmPopup.close(); - $rootScope.zmPopup = SecuredPopups.show('alert', - { - title: $translate.instant('kSettingsSaved'), - template: "{{'kExploreEnjoy' | translate }} {{$root.appName}}", - okText: $translate.instant('kButtonOk'), - cancelText: $translate.instant('kButtonCancel'), - }).then(function(res) - { - $ionicSideMenuDelegate.toggleLeft(); - }); - - }; - //------------------------------------------------------------------ - // controller main - //------------------------------------------------------------------ + + NVRDataModel.debug("SaveDevOptions: Saving to disk"); + NVRDataModel.setLogin($scope.loginData); + NVRDataModel.getMonitors(1); + + } + + $scope.saveDevOptions = function () { + + saveDevOptions(); + // $rootScope.zmPopup.close(); + $rootScope.zmPopup = SecuredPopups.show('alert', { + title: $translate.instant('kSettingsSaved'), + template: "{{'kExploreEnjoy' | translate }} {{$root.appName}}", + okText: $translate.instant('kButtonOk'), + cancelText: $translate.instant('kButtonCancel'), + }).then(function (res) { + $ionicSideMenuDelegate.toggleLeft(); + }); + + }; + //------------------------------------------------------------------ + // controller main + //------------------------------------------------------------------ }]); diff --git a/www/js/EventCtrl.js b/www/js/EventCtrl.js index 6da6f884..d8925dee 100644 --- a/www/js/EventCtrl.js +++ b/www/js/EventCtrl.js @@ -9,36 +9,30 @@ angular.module('zmApp.controllers') -// alarm frames filter -.filter('selectFrames', function($filter, $translate) -{ + // alarm frames filter + .filter('selectFrames', function ($filter, $translate) { // Create the return function and set the required parameter name to **input** - return function(input, typeOfFrames) - { + return function (input, typeOfFrames) { - var out = []; + var out = []; - angular.forEach(input, function(item) - { + angular.forEach(input, function (item) { - if (typeOfFrames == $translate.instant('kShowTimeDiffFrames')) - { - if (item.type == $translate.instant('kShowTimeDiffFrames')) - out.push(item); - } - else - out.push(item); + if (typeOfFrames == $translate.instant('kShowTimeDiffFrames')) { + if (item.type == $translate.instant('kShowTimeDiffFrames')) + out.push(item); + } else + out.push(item); - }); + }); - return out; + return out; }; -}) + }) -.controller('zmApp.EventCtrl', ['$scope', '$rootScope', 'zm', 'NVRDataModel', 'message', '$ionicSideMenuDelegate', '$timeout', '$interval', '$ionicModal', '$ionicLoading', '$http', '$state', '$stateParams', '$ionicHistory', '$ionicScrollDelegate', '$ionicPlatform', '$ionicSlideBoxDelegate', '$ionicPosition', '$ionicPopover', '$ionicPopup', 'EventServer', '$sce', '$cordovaBadge', '$cordovaLocalNotification', '$q', 'carouselUtils', '$translate', '$cordovaFileTransfer', '$cordovaFile', '$ionicListDelegate', 'ionPullUpFooterState',function($scope, $rootScope, zm, NVRDataModel, message, $ionicSideMenuDelegate, $timeout, $interval, $ionicModal, $ionicLoading, $http, $state, $stateParams, $ionicHistory, $ionicScrollDelegate, $ionicPlatform, $ionicSlideBoxDelegate, $ionicPosition, $ionicPopover, $ionicPopup, EventServer, $sce, $cordovaBadge, $cordovaLocalNotification, $q, carouselUtils, $translate, $cordovaFileTransfer, $cordovaFile, $ionicListDelegate,ionPullUpFooterState) -{ + .controller('zmApp.EventCtrl', ['$scope', '$rootScope', 'zm', 'NVRDataModel', 'message', '$ionicSideMenuDelegate', '$timeout', '$interval', '$ionicModal', '$ionicLoading', '$http', '$state', '$stateParams', '$ionicHistory', '$ionicScrollDelegate', '$ionicPlatform', '$ionicSlideBoxDelegate', '$ionicPosition', '$ionicPopover', '$ionicPopup', 'EventServer', '$sce', '$cordovaBadge', '$cordovaLocalNotification', '$q', 'carouselUtils', '$translate', '$cordovaFileTransfer', '$cordovaFile', '$ionicListDelegate', 'ionPullUpFooterState', function ($scope, $rootScope, zm, NVRDataModel, message, $ionicSideMenuDelegate, $timeout, $interval, $ionicModal, $ionicLoading, $http, $state, $stateParams, $ionicHistory, $ionicScrollDelegate, $ionicPlatform, $ionicSlideBoxDelegate, $ionicPosition, $ionicPopover, $ionicPopup, EventServer, $sce, $cordovaBadge, $cordovaLocalNotification, $q, carouselUtils, $translate, $cordovaFileTransfer, $cordovaFile, $ionicListDelegate, ionPullUpFooterState) { // events in last 5 minutes // TODO https://server/zm/api/events/consoleEvents/5%20minute.json @@ -71,211 +65,199 @@ angular.module('zmApp.controllers') var eventsListScrubHeight = eventsListScrubHeight; var eventsListDetailsHeight = eventsListDetailsHeight; - + //--------------------------------------------------- // initial code //--------------------------------------------------- //we come here is TZ is updated after the view loads - var tzu = $scope.$on('tz-updated', function() - { - $scope.tzAbbr = NVRDataModel.getTimeZoneNow(); - NVRDataModel.debug("Timezone API updated timezone to " + NVRDataModel.getTimeZoneNow()); + var tzu = $scope.$on('tz-updated', function () { + $scope.tzAbbr = NVRDataModel.getTimeZoneNow(); + NVRDataModel.debug("Timezone API updated timezone to " + NVRDataModel.getTimeZoneNow()); }); broadcastHandles.push(tzu); - var lc = $scope.$on("language-changed", function() - { - NVRDataModel.log(">>>>>>>>>>>>>>> language changed"); - doRefresh(); + var lc = $scope.$on("language-changed", function () { + NVRDataModel.log(">>>>>>>>>>>>>>> language changed"); + doRefresh(); }); broadcastHandles.push(lc); - $scope.$on('$ionicView.afterEnter', function() - { - - // console.log ("********* AFTER ENTER"); - // - $ionicListDelegate.canSwipeItems(true); - NVRDataModel.debug ("enabling options swipe"); + $scope.$on('$ionicView.afterEnter', function () { - // see if we come from monitors, if so, don't filter events - if ($ionicHistory.backTitle() == 'Monitors') - { - showHiddenMonitors = true; - } - else - { - showHiddenMonitors = false; - } + // console.log ("********* AFTER ENTER"); + // + $ionicListDelegate.canSwipeItems(true); + NVRDataModel.debug("enabling options swipe"); - if (NVRDataModel.getLogin().useLocalTimeZone) - { - $scope.tzAbbr = moment().tz(moment.tz.guess()).zoneAbbr(); - } - else - { - $scope.tzAbbr = moment().tz(NVRDataModel.getTimeZoneNow()).zoneAbbr(); - } + // see if we come from monitors, if so, don't filter events + if ($ionicHistory.backTitle() == 'Monitors') { + showHiddenMonitors = true; + } else { + showHiddenMonitors = false; + } - //console.log ("************** CLEARING EVENTS"); - $scope.events = []; + if (NVRDataModel.getLogin().useLocalTimeZone) { + $scope.tzAbbr = moment().tz(moment.tz.guess()).zoneAbbr(); + } else { + $scope.tzAbbr = moment().tz(NVRDataModel.getTimeZoneNow()).zoneAbbr(); + } - $timeout ( function() { - // console.log ("DEFERRED ACTION EVENTS"); - getInitialEvents(); - setupWatchers(); - footerExpand(); - // now do event playback if asked + //console.log ("************** CLEARING EVENTS"); + $scope.events = []; - if (parseInt($rootScope.tappedEid) > 0) { - NVRDataModel.debug (" Trying ot live play " + $rootScope.tappedEid); - playSpecificEvent($rootScope.tappedEid); - - } + $timeout(function () { + // console.log ("DEFERRED ACTION EVENTS"); + getInitialEvents(); + setupWatchers(); + footerExpand(); + // now do event playback if asked + + if (parseInt($rootScope.tappedEid) > 0) { + NVRDataModel.debug(" Trying ot live play " + $rootScope.tappedEid); + playSpecificEvent($rootScope.tappedEid); + + } + + }, 100); - },100); - }); - function playSpecificEvent (eid) { - NVRDataModel.log ("Stuffing EID to play back "+ eid); - $rootScope.tappedEid = 0; - var event = { - Event: { - Id:eid - } + function playSpecificEvent(eid) { + NVRDataModel.log("Stuffing EID to play back " + eid); + $rootScope.tappedEid = 0; + var event = { + Event: { + Id: eid + } - }; - $scope.event = event; - $scope.currentEvent = event; - openModal(event); + }; + $scope.event = event; + $scope.currentEvent = event; + openModal(event); } - $scope.$on('$ionicView.beforeLeave', function() - { + $scope.$on('$ionicView.beforeLeave', function () { - NVRDataModel.debug ("EventCtrl: Deregistering broadcast handles"); - for (var i=0; i < broadcastHandles.length; i++) { - // broadcastHandles[i](); - } - broadcastHandles = []; + NVRDataModel.debug("EventCtrl: Deregistering broadcast handles"); + for (var i = 0; i < broadcastHandles.length; i++) { + // broadcastHandles[i](); + } + broadcastHandles = []; }); - $scope.$on('$ionicView.beforeEnter', function() - { + $scope.$on('$ionicView.beforeEnter', function () { - //console.log ("********* BEFORE ENTER"); - // + //console.log ("********* BEFORE ENTER"); + // - $scope.modalData = {"doRefresh":false}; + $scope.modalData = { + "doRefresh": false + }; - $scope.footerState = ionPullUpFooterState.MINIMIZED; - $scope.gifshotSupported = true; - document.addEventListener("pause", onPause, false); - //console.log("I got STATE PARAM " + $stateParams.id); - $scope.id = parseInt($stateParams.id, 10); - $scope.showEvent = $stateParams.playEvent || false; + $scope.footerState = ionPullUpFooterState.MINIMIZED; + $scope.gifshotSupported = true; + document.addEventListener("pause", onPause, false); + //console.log("I got STATE PARAM " + $stateParams.id); + $scope.id = parseInt($stateParams.id, 10); + $scope.showEvent = $stateParams.playEvent || false; - //console.log("BEFORE ENTER >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"); + //console.log("BEFORE ENTER >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"); - NVRDataModel.log("EventCtrl called with: E/MID=" + $scope.id + " playEvent = " + $scope.showEvent); + NVRDataModel.log("EventCtrl called with: E/MID=" + $scope.id + " playEvent = " + $scope.showEvent); - // This is the only view that hardcodes row size due to - // collection repeat, so lets re-get the text size if it has changed - // note that there may be a delay as its a callback - so might involve - // a UI jiggle + // This is the only view that hardcodes row size due to + // collection repeat, so lets re-get the text size if it has changed + // note that there may be a delay as its a callback - so might involve + // a UI jiggle - if (window.cordova) - MobileAccessibility.getTextZoom(getTextZoomCallback); + if (window.cordova) + MobileAccessibility.getTextZoom(getTextZoomCallback); - eventsListDetailsHeight = parseInt(zm.eventsListDetailsHeight * $rootScope.textScaleFactor); - eventsListScrubHeight = parseInt(zm.eventsListScrubHeight * $rootScope.textScaleFactor); + eventsListDetailsHeight = parseInt(zm.eventsListDetailsHeight * $rootScope.textScaleFactor); + eventsListScrubHeight = parseInt(zm.eventsListScrubHeight * $rootScope.textScaleFactor); - if (NVRDataModel.getLogin().enableThumbs) { - NVRDataModel.debug ("--> thumbnail means increasing row size"); - eventsListScrubHeight=370; - eventsListDetailsHeight=330; - - } + if (NVRDataModel.getLogin().enableThumbs) { + NVRDataModel.debug("--> thumbnail means increasing row size"); + eventsListScrubHeight = 370; + eventsListDetailsHeight = 330; - NVRDataModel.debug(">>>height of list/scrub set to " + eventsListDetailsHeight + " and " + eventsListScrubHeight); + } - pageLoaded = false; - enableLoadMore = true; + NVRDataModel.debug(">>>height of list/scrub set to " + eventsListDetailsHeight + " and " + eventsListScrubHeight); - $scope.mycarousel = { - index: 0 - }; + pageLoaded = false; + enableLoadMore = true; - $scope.ionRange = { - index: 1 - }; - $scope.animationInProgress = false; + $scope.mycarousel = { + index: 0 + }; - $scope.hours = []; - $scope.days = []; - $scope.weeks = []; - $scope.months = []; + $scope.ionRange = { + index: 1 + }; + $scope.animationInProgress = false; - $scope.eventList = { - showDelete: false - }; + $scope.hours = []; + $scope.days = []; + $scope.weeks = []; + $scope.months = []; - $scope.slides = []; // will hold scrub frames - $scope.totalEventTime = 0; // used to display max of progress bar - $scope.currentEventTime = 0; - oldEvent = ""; // will hold previous event that had showScrub = true - scrollbynumber = 0; - $scope.eventsBeingLoaded = true; - $scope.FrameArray = []; // will hold frame info from detailed Events API - loginData = NVRDataModel.getLogin(); - NVRDataModel.getKeyConfigParams(0) - .then(function(data) - { - //console.log ("***GETKEY: " + JSON.stringify(data)); - eventImageDigits = parseInt(data); - NVRDataModel.log("Image padding digits reported as " + eventImageDigits); - }); + $scope.eventList = { + showDelete: false + }; - $scope.showSearch = false; - eventsPage = 1; - moreEvents = true; - $scope.viewTitle = { - title: "" - }; - $scope.search = { - text: "" + $scope.slides = []; // will hold scrub frames + $scope.totalEventTime = 0; // used to display max of progress bar + $scope.currentEventTime = 0; + oldEvent = ""; // will hold previous event that had showScrub = true + scrollbynumber = 0; + $scope.eventsBeingLoaded = true; + $scope.FrameArray = []; // will hold frame info from detailed Events API + loginData = NVRDataModel.getLogin(); + NVRDataModel.getKeyConfigParams(0) + .then(function (data) { + //console.log ("***GETKEY: " + JSON.stringify(data)); + eventImageDigits = parseInt(data); + NVRDataModel.log("Image padding digits reported as " + eventImageDigits); + }); - }; - $scope.myfilter = ""; + $scope.showSearch = false; + eventsPage = 1; + moreEvents = true; + $scope.viewTitle = { + title: "" + }; + $scope.search = { + text: "" + + }; + $scope.myfilter = ""; - $scope.loginData = NVRDataModel.getLogin(); - $scope.playbackURL = $scope.loginData.url; + $scope.loginData = NVRDataModel.getLogin(); + $scope.playbackURL = $scope.loginData.url; }); - function getEventObject(eid) - { + function getEventObject(eid) { - var apiurl = NVRDataModel.getLogin().apiurl + '/events/' + eid + '.json'; + var apiurl = NVRDataModel.getLogin().apiurl + '/events/' + eid + '.json'; - $http.get(apiurl) - .success(function(data) {}) - .error(function(err) {}); + $http.get(apiurl) + .success(function (data) {}) + .error(function (err) {}); } - function getTextZoomCallback(tz) - { - $rootScope.textScaleFactor = parseFloat(tz + "%") / 100.0; - NVRDataModel.debug("text zoom factor is " + $rootScope.textScaleFactor); + function getTextZoomCallback(tz) { + $rootScope.textScaleFactor = parseFloat(tz + "%") / 100.0; + NVRDataModel.debug("text zoom factor is " + $rootScope.textScaleFactor); } // -------------------------------------------------------- @@ -283,70 +265,58 @@ angular.module('zmApp.controllers') // close the modal // -------------------------------------------------------- - $ionicPlatform.registerBackButtonAction(function(e) - { - e.preventDefault(); - if ($scope.modal != undefined && $scope.modal.isShown()) - { - // switch off awake, as liveview is finished - NVRDataModel.debug("Modal is open, closing it"); - NVRDataModel.setAwake(false); - $scope.modal.remove(); + $ionicPlatform.registerBackButtonAction(function (e) { + e.preventDefault(); + if ($scope.modal != undefined && $scope.modal.isShown()) { + // switch off awake, as liveview is finished + NVRDataModel.debug("Modal is open, closing it"); + NVRDataModel.setAwake(false); + $scope.modal.remove(); + } else { + NVRDataModel.debug("Modal is closed, so toggling or exiting"); + if (!$ionicSideMenuDelegate.isOpenLeft()) { + $ionicSideMenuDelegate.toggleLeft(); + + } else { + navigator.app.exitApp(); } - else - { - NVRDataModel.debug("Modal is closed, so toggling or exiting"); - if (!$ionicSideMenuDelegate.isOpenLeft()) - { - $ionicSideMenuDelegate.toggleLeft(); - - } - else - { - navigator.app.exitApp(); - } - } + } }, 1000); //-------------------------------------- // monitor the slider for carousels //-------------------------------------- - function setupWatchers() - { - NVRDataModel.debug("Setting up carousel watchers"); + function setupWatchers() { + NVRDataModel.debug("Setting up carousel watchers"); - ionRangeWatcher = $scope.$watch('ionRange.index', function() - { - // console.log ("Watching index"); - $scope.mycarousel.index = parseInt($scope.ionRange.index) - 1; - if (carouselUtils.getStop() == true) - return; + ionRangeWatcher = $scope.$watch('ionRange.index', function () { + // console.log ("Watching index"); + $scope.mycarousel.index = parseInt($scope.ionRange.index) - 1; + if (carouselUtils.getStop() == true) + return; - //console.log ("***ION RANGE CHANGED TO " + $scope.mycarousel.index); - }); + //console.log ("***ION RANGE CHANGED TO " + $scope.mycarousel.index); + }); - mycarouselWatcher = $scope.$watch('mycarousel.index', function() - { + mycarouselWatcher = $scope.$watch('mycarousel.index', function () { - if ($scope.event && $scope.ionRange.index == parseInt($scope.event.Event.Frames) - 1) - { - if (!$scope.modal || $scope.modal.isShown() == false) - { - // console.log("quick scrub playback over"); - carouselUtils.setStop(true); - $scope.ionRange.index = 0; - $scope.mycarousel.index = 1; - } + if ($scope.event && $scope.ionRange.index == parseInt($scope.event.Event.Frames) - 1) { + if (!$scope.modal || $scope.modal.isShown() == false) { + // console.log("quick scrub playback over"); + carouselUtils.setStop(true); + $scope.ionRange.index = 0; + $scope.mycarousel.index = 1; + } - } - if (carouselUtils.getStop() == true) - return; - $scope.ionRange.index = ($scope.mycarousel.index + 1).toString(); - // console.log ("***IONRANGE RANGE CHANGED TO " + $scope.ionRange.index); + } + if (carouselUtils.getStop() == true) + return; + $scope.ionRange.index = ($scope.mycarousel.index + 1).toString(); + // console.log ("***IONRANGE RANGE CHANGED TO " + $scope.ionRange.index); - }); + }); } @@ -355,782 +325,698 @@ angular.module('zmApp.controllers') // close the modal // -------------------------------------------------------- - function getInitialEvents() - { - NVRDataModel.debug("getInitialEvents called"); - var lData = NVRDataModel.getLogin(); + function getInitialEvents() { + NVRDataModel.debug("getInitialEvents called"); + var lData = NVRDataModel.getLogin(); + + // If you came from Monitors, disregard hidden monitors in montage + /* if (lData.persistMontageOrder && stackState != "Monitors") { + var tempMon = message; + $scope.monitors = NVRDataModel.applyMontageMonitorPrefs(tempMon, 2)[0]; + } else*/ + $scope.monitors = message; + + if ($scope.monitors.length == 0) { + var pTitle = $translate.instant('kNoMonitors'); + $ionicPopup.alert({ + title: pTitle, + template: "{{'kCheckCredentials' | translate }}", + okText: $translate.instant('kButtonOk'), + cancelText: $translate.instant('kButtonCancel'), + }); + $ionicHistory.nextViewOptions({ + disableBack: true + }); + $state.go("app.login", { + "wizard": false + }); + return; + } + + $scope.events = []; + + // First get total pages and then + // start from the latest. If this fails, nothing displays + + NVRDataModel.debug("EventCtrl: grabbing # of event pages"); + nolangFrom = ""; + nolangTo = ""; + if ($rootScope.fromString) + nolangFrom = moment($rootScope.fromString).locale('en').format("YYYY-MM-DD HH:mm:ss"); + if ($rootScope.toString) + nolangTo = moment($rootScope.toString).locale('en').format("YYYY-MM-DD HH:mm:ss"); + + //NVRDataModel.debug ("GETTING EVENTS USING "+$scope.id+" "+nolangFrom+" "+ nolangTo); + NVRDataModel.getEventsPages($scope.id, nolangFrom, nolangTo) + .then(function (data) { + // console.log ("WE GOT PAGES="+JSON.stringify(data)); + eventsPage = data.pageCount || 1; + NVRDataModel.debug("EventCtrl: found " + eventsPage + " pages of events"); + + pageLoaded = true; + $scope.viewTitle.title = data.count; + NVRDataModel.debug("EventCtrl: grabbing events for: id=" + $scope.id + " Date/Time:" + $rootScope.fromString + + "-" + $rootScope.toString); + nolangFrom = ""; + nolangTo = ""; + if ($rootScope.fromString) + nolangFrom = moment($rootScope.fromString).locale('en').format("YYYY-MM-DD HH:mm:ss"); + if ($rootScope.toString) + nolangTo = moment($rootScope.toString).locale('en').format("YYYY-MM-DD HH:mm:ss"); - // If you came from Monitors, disregard hidden monitors in montage - /* if (lData.persistMontageOrder && stackState != "Monitors") { - var tempMon = message; - $scope.monitors = NVRDataModel.applyMontageMonitorPrefs(tempMon, 2)[0]; - } else*/ - $scope.monitors =message; + NVRDataModel.getEvents($scope.id, eventsPage, "", nolangFrom, nolangTo) + .then(function (data) { - if ($scope.monitors.length == 0) - { - var pTitle = $translate.instant('kNoMonitors'); - $ionicPopup.alert( - { - title: pTitle, - template: "{{'kCheckCredentials' | translate }}", - okText: $translate.instant('kButtonOk'), - cancelText: $translate.instant('kButtonCancel'), - }); - $ionicHistory.nextViewOptions( - { - disableBack: true - }); - $state.go("app.login", - { - "wizard": false - }); - return; - } + // console.log ("WE GOT EVENTS="+JSON.stringify(data)); + var myevents = data; - $scope.events = []; + NVRDataModel.debug("EventCtrl: success, got " + myevents.length + " events"); + var loginData = NVRDataModel.getLogin(); - // First get total pages and then - // start from the latest. If this fails, nothing displays + //console.log ("-------->MON LEN"+$scope.monitors.length); - NVRDataModel.debug("EventCtrl: grabbing # of event pages"); - nolangFrom = ""; - nolangTo = ""; - if ($rootScope.fromString) - nolangFrom = moment($rootScope.fromString).locale('en').format("YYYY-MM-DD HH:mm:ss"); - if ($rootScope.toString) - nolangTo = moment($rootScope.toString).locale('en').format("YYYY-MM-DD HH:mm:ss"); + for (var i = 0; i < myevents.length; i++) { - //NVRDataModel.debug ("GETTING EVENTS USING "+$scope.id+" "+nolangFrom+" "+ nolangTo); - NVRDataModel.getEventsPages($scope.id, nolangFrom, nolangTo) - .then(function(data) - { - // console.log ("WE GOT PAGES="+JSON.stringify(data)); - eventsPage = data.pageCount || 1; - NVRDataModel.debug("EventCtrl: found " + eventsPage + " pages of events"); - - pageLoaded = true; - $scope.viewTitle.title = data.count; - NVRDataModel.debug("EventCtrl: grabbing events for: id=" + $scope.id + " Date/Time:" + $rootScope.fromString + - "-" + $rootScope.toString); - nolangFrom = ""; - nolangTo = ""; - if ($rootScope.fromString) - nolangFrom = moment($rootScope.fromString).locale('en').format("YYYY-MM-DD HH:mm:ss"); - if ($rootScope.toString) - nolangTo = moment($rootScope.toString).locale('en').format("YYYY-MM-DD HH:mm:ss"); + var idfound = true; + if (loginData.persistMontageOrder) { + idfound = false; + for (var ii = 0; ii < $scope.monitors.length; ii++) { + if ($scope.monitors[ii].Monitor.Id == myevents[i].Event.MonitorId && (NVRDataModel.isNotHidden(myevents[i].Event.MonitorId) || showHiddenMonitors)) { + // console.log ("FOUND IT"); - NVRDataModel.getEvents($scope.id, eventsPage, "", nolangFrom, nolangTo) - .then(function(data) - { - - // console.log ("WE GOT EVENTS="+JSON.stringify(data)); - var myevents = data; + idfound = true; + break; + } + } + } - NVRDataModel.debug("EventCtrl: success, got " + myevents.length + " events"); - var loginData = NVRDataModel.getLogin(); + //console.log ("IDFOUND="+idfound + " AND MON LEN="+$scope.monitors.length); - //console.log ("-------->MON LEN"+$scope.monitors.length); - - for (var i = 0; i < myevents.length; i++) - { + myevents[i].Event.humanizeTime = humanizeTime(myevents[i].Event.StartTime); + myevents[i].Event.streamingURL = NVRDataModel.getStreamingURL(myevents[i].Event.MonitorId); + myevents[i].Event.baseURL = NVRDataModel.getBaseURL(myevents[i].Event.MonitorId); + myevents[i].Event.imageMode = NVRDataModel.getImageMode(myevents[i].Event.MonitorId); - var idfound = true; - if (loginData.persistMontageOrder) - { - idfound = false; - for (var ii = 0; ii < $scope.monitors.length; ii++) - { - if ($scope.monitors[ii].Monitor.Id == myevents[i].Event.MonitorId && (NVRDataModel.isNotHidden(myevents[i].Event.MonitorId) || showHiddenMonitors)) - { - // console.log ("FOUND IT"); - - idfound = true; - break; - } - } - } - - //console.log ("IDFOUND="+idfound + " AND MON LEN="+$scope.monitors.length); - - myevents[i].Event.humanizeTime = humanizeTime(myevents[i].Event.StartTime); - myevents[i].Event.streamingURL = NVRDataModel.getStreamingURL(myevents[i].Event.MonitorId); - myevents[i].Event.baseURL = NVRDataModel.getBaseURL(myevents[i].Event.MonitorId); - myevents[i].Event.imageMode = NVRDataModel.getImageMode(myevents[i].Event.MonitorId); - - //console.log ("***** MULTISERVER STREAMING URL FOR EVENTS " + myevents[i].Event.streamingURL); - - // console.log ("***** MULTISERVER BASE URL FOR EVENTS " + myevents[i].Event.baseURL); - - myevents[i].Event.MonitorName = NVRDataModel.getMonitorName(myevents[i].Event.MonitorId); - myevents[i].Event.ShowScrub = false; - myevents[i].Event.height = eventsListDetailsHeight; - // now construct base path - myevents[i].Event.BasePath = computeBasePath(myevents[i]); - myevents[i].Event.relativePath = computeRelativePath(myevents[i]); - - // get thumbW/H - - var tempMon = NVRDataModel.getMonitorObject(myevents[i].Event.MonitorId); - if (tempMon != undefined) { - - var ratio; - var mw = parseInt(tempMon.Monitor.Width); - var mh = parseInt(tempMon.Monitor.Height); - var mo =parseInt(tempMon.Monitor.Orientation); - - myevents[i].Event.Rotation = ''; - - // scale by X if width > height - if (mw > mh ) { - ratio = mw / zm.thumbWidth; - myevents[i].Event.thumbWidth = 200; - myevents[i].Event.thumbHeight = Math.round(mh/ratio); - } - else { - - ratio = mh / zm.thumbWidth; - myevents[i].Event.thumbHeight = 200; - myevents[i].Event.thumbWidth = Math.round(mw/ratio); - - } - - if (mo != 0) { - /* - myevents[i].Event.Rotation = { - 'transform' : 'rotate('+mo+'deg'+')' - }; */ - - var tmp = myevents[i].Event.thumbHeight; - myevents[i].Event.thumbHeight = myevents[i].Event.thumbWidth; - myevents[i].Event.thumbWidth = tmp; - - - } // swap - - // console.log ("--------->" +"MW:"+myevents[i].Event.thumbWidth+ " MH:"+ myevents[i].Event.thumbHeight + " for Monitor:" + myevents[i].Event.MonitorName); - - - - - - } - - // in multiserver BasePath is login url for frames - // http://login.url/index.php?view=frame&eid=19696772&fid=21 - - // console.log ("COMPARING "+NVRDataModel.getLogin().url+ " TO " +myevents[i].Event.baseURL); - if (NVRDataModel.getLogin().url != myevents[i].Event.baseURL) - { - //NVRDataModel.debug ("Multi server, changing base"); - myevents[i].Event.baseURL = NVRDataModel.getLogin().url; - - } - - if (myevents[i].Event.imageMode == 'path') - //if (1) - myevents[i].Event.videoPath = myevents[i].Event.baseURL + "/events/" + myevents[i].Event.relativePath + myevents[i].Event.DefaultVideo; - else - myevents[i].Event.videoPath = myevents[i].Event.baseURL + "/index.php?view=view_video&eid=" + myevents[i].Event.Id; - - // if (idfound) - if (idfound) - { - - //NVRDataModel.debug ("PUSHING "+JSON.stringify(myevents[i])); - $scope.events.push(myevents[i]); - //console.log ("SCOPE EVENTS LEN="+$scope.events.length); - } - else - { - //NVRDataModel.debug ("Skipping Event MID = " + myevents[i].Event.MonitorId); - } - - } //for - - //$scope.events = myevents; - // we only need to stop the template from loading when the list is empty - // so this can be false once we have _some_ content - // FIXME: check reload - $scope.eventsBeingLoaded = false; - // to avoid only few events being displayed - // if last page has less events - //console.log("**Loading Next Page ***"); - if (myevents.length < 50) - { - //console.log ("EVENTS LOADED="+JSON.stringify($scope.events)); - NVRDataModel.debug("EventCtrl:loading one more page just in case we don't have enough to display"); - loadMore(); - } - }); + //console.log ("***** MULTISERVER STREAMING URL FOR EVENTS " + myevents[i].Event.streamingURL); - }); - } + // console.log ("***** MULTISERVER BASE URL FOR EVENTS " + myevents[i].Event.baseURL); - //------------------------------------------------------- - // Tapping on a frame shows this image - //------------------------------------------------------ + myevents[i].Event.MonitorName = NVRDataModel.getMonitorName(myevents[i].Event.MonitorId); + myevents[i].Event.ShowScrub = false; + myevents[i].Event.height = eventsListDetailsHeight; + // now construct base path + myevents[i].Event.BasePath = computeBasePath(myevents[i]); + myevents[i].Event.relativePath = computeRelativePath(myevents[i]); - function SaveSuccess() - { - $ionicLoading.show( - { - template: $translate.instant('kDone'), - noBackdrop: true, - duration: 1000 - }); - NVRDataModel.debug("ModalCtrl:Photo saved successfuly"); - } + // get thumbW/H - function SaveError(e) - { - $ionicLoading.show( - { - template: $translate.instant('kErrorSave'), - noBackdrop: true, - duration: 2000 - }); - NVRDataModel.log("Error saving image: " + e.message); - //console.log("***ERROR"); - } + var tempMon = NVRDataModel.getMonitorObject(myevents[i].Event.MonitorId); + if (tempMon != undefined) { + + var ratio; + var mw = parseInt(tempMon.Monitor.Width); + var mh = parseInt(tempMon.Monitor.Height); + var mo = parseInt(tempMon.Monitor.Orientation); + + myevents[i].Event.Rotation = ''; + + // scale by X if width > height + if (mw > mh) { + ratio = mw / zm.thumbWidth; + myevents[i].Event.thumbWidth = 200; + myevents[i].Event.thumbHeight = Math.round(mh / ratio); + } else { + + ratio = mh / zm.thumbWidth; + myevents[i].Event.thumbHeight = 200; + myevents[i].Event.thumbWidth = Math.round(mw / ratio); + + } + + if (mo != 0) { + /* + myevents[i].Event.Rotation = { + 'transform' : 'rotate('+mo+'deg'+')' + }; */ + + var tmp = myevents[i].Event.thumbHeight; + myevents[i].Event.thumbHeight = myevents[i].Event.thumbWidth; + myevents[i].Event.thumbWidth = tmp; + + + } // swap + + // console.log ("--------->" +"MW:"+myevents[i].Event.thumbWidth+ " MH:"+ myevents[i].Event.thumbHeight + " for Monitor:" + myevents[i].Event.MonitorName); - function saveNow(imgsrc, r, f) - { - $ionicLoading.show( - { - template: $translate.instant('kSavingSnapshot') + "...", - noBackdrop: true, - duration: zm.httpTimeout - }); - var url = imgsrc; - NVRDataModel.log("saveNow: File path to grab is " + url); - var img = new Image(); - img.onload = function() - { - // console.log("********* ONLOAD"); - var canvas = document.createElement('canvas'); - canvas.width = img.width; - canvas.height = img.height; - var context = canvas.getContext('2d'); - context.drawImage(img, 0, 0); - - var imageDataUrl = canvas.toDataURL('image/jpeg', 1.0); - var imageData = imageDataUrl.replace(/data:image\/jpeg;base64,/, ''); - - if ($rootScope.platformOS != "desktop") - { - try - { - cordova.exec( - SaveSuccess, - SaveError, - 'Canvas2ImagePlugin', - 'saveImageDataToLibrary', [imageData] - ); - // carouselUtils.setStop(curState); } - catch (e) - { - SaveError(e.message); - // carouselUtils.setStop(curState); + // in multiserver BasePath is login url for frames + // http://login.url/index.php?view=frame&eid=19696772&fid=21 + + // console.log ("COMPARING "+NVRDataModel.getLogin().url+ " TO " +myevents[i].Event.baseURL); + if (NVRDataModel.getLogin().url != myevents[i].Event.baseURL) { + //NVRDataModel.debug ("Multi server, changing base"); + myevents[i].Event.baseURL = NVRDataModel.getLogin().url; + } - } - else - { - var fname = r + f + ".png"; - fname = fname.replace(/\//, "-"); - fname = fname.replace(/\.jpg/, ''); + if (myevents[i].Event.imageMode == 'path') + //if (1) + myevents[i].Event.videoPath = myevents[i].Event.baseURL + "/events/" + myevents[i].Event.relativePath + myevents[i].Event.DefaultVideo; + else + myevents[i].Event.videoPath = myevents[i].Event.baseURL + "/index.php?view=view_video&eid=" + myevents[i].Event.Id; - canvas.toBlob(function(blob) - { - saveAs(blob, fname); - SaveSuccess(); - }); - } - }; - try - { - img.src = url; - // console.log ("SAVING IMAGE SOURCE"); - } - catch (e) - { - SaveError(e.message); - } + // if (idfound) + if (idfound) { + //NVRDataModel.debug ("PUSHING "+JSON.stringify(myevents[i])); + $scope.events.push(myevents[i]); + //console.log ("SCOPE EVENTS LEN="+$scope.events.length); + } else { + //NVRDataModel.debug ("Skipping Event MID = " + myevents[i].Event.MonitorId); + } + + } //for + + //$scope.events = myevents; + // we only need to stop the template from loading when the list is empty + // so this can be false once we have _some_ content + // FIXME: check reload + $scope.eventsBeingLoaded = false; + // to avoid only few events being displayed + // if last page has less events + //console.log("**Loading Next Page ***"); + if (myevents.length < 50) { + //console.log ("EVENTS LOADED="+JSON.stringify($scope.events)); + NVRDataModel.debug("EventCtrl:loading one more page just in case we don't have enough to display"); + loadMore(); + } + }); + + }); } + //------------------------------------------------------- + // Tapping on a frame shows this image + //------------------------------------------------------ + + function SaveSuccess() { + $ionicLoading.show({ + template: $translate.instant('kDone'), + noBackdrop: true, + duration: 1000 + }); + NVRDataModel.debug("ModalCtrl:Photo saved successfuly"); + } + function SaveError(e) { + $ionicLoading.show({ + template: $translate.instant('kErrorSave'), + noBackdrop: true, + duration: 2000 + }); + NVRDataModel.log("Error saving image: " + e.message); + //console.log("***ERROR"); + } - function writeFile2( path, file, blob, isAppend) - { - var csize = 4 * 1024 * 1024; // 4MB - var d = $q.defer(); - NVRDataModel.debug ("Inside writeFile2 with blob size="+blob.size); + function saveNow(imgsrc, r, f) { + + $ionicLoading.show({ + template: $translate.instant('kSavingSnapshot') + "...", + noBackdrop: true, + duration: zm.httpTimeout + }); + var url = imgsrc; + NVRDataModel.log("saveNow: File path to grab is " + url); + + var img = new Image(); + img.onload = function () { + // console.log("********* ONLOAD"); + var canvas = document.createElement('canvas'); + canvas.width = img.width; + canvas.height = img.height; + var context = canvas.getContext('2d'); + context.drawImage(img, 0, 0); + + var imageDataUrl = canvas.toDataURL('image/jpeg', 1.0); + var imageData = imageDataUrl.replace(/data:image\/jpeg;base64,/, ''); + + if ($rootScope.platformOS != "desktop") { + try { + + cordova.exec( + SaveSuccess, + SaveError, + 'Canvas2ImagePlugin', + 'saveImageDataToLibrary', [imageData] + ); + // carouselUtils.setStop(curState); + } catch (e) { - // nothing more to write, so all good? - if (!blob.size) - { - NVRDataModel.debug ("writeFile2 all done"); - d.resolve(true); - return $q.resolve(true); + SaveError(e.message); + // carouselUtils.setStop(curState); + } + } else { + + var fname = r + f + ".png"; + fname = fname.replace(/\//, "-"); + fname = fname.replace(/\.jpg/, ''); + + canvas.toBlob(function (blob) { + saveAs(blob, fname); + SaveSuccess(); + }); } + }; + try { + img.src = url; + // console.log ("SAVING IMAGE SOURCE"); + } catch (e) { + SaveError(e.message); + } - - if (!isAppend) - { - // return the delegated promise, even if it fails - return $cordovaFile.writeFile(path, file, blob.slice(0,csize), true) - .then (function (succ) { - return writeFile2(path,file,blob.slice(csize),true); - }); - } - else - { - // return the delegated promise, even if it fails - return $cordovaFile.writeExistingFile(path, file, blob.slice(0,csize)) - .then (function (succ) { - return writeFile2(path,file,blob.slice(csize),true); - }); - } - - } - function writeFile(path, __filename, __data){ - var d = $q.defer(); - //console.log ("inside write file"); - window.requestFileSystem(LocalFileSystem.TEMPORARY, __data.size+5000, onFileSystemSuccess, fail); - function fail(e) - { - var msg = ''; - switch (e.code) { - case FileError.QUOTA_EXCEEDED_ERR: - msg = 'QUOTA_EXCEEDED_ERR'; - break; - case FileError.NOT_FOUND_ERR: - msg = 'NOT_FOUND_ERR'; - break; - case FileError.SECURITY_ERR: - msg = 'SECURITY_ERR'; - break; - case FileError.INVALID_MODIFICATION_ERR: - msg = 'INVALID_MODIFICATION_ERR'; - break; - case FileError.INVALID_STATE_ERR: - msg = 'INVALID_STATE_ERR'; - break; - default: - msg = 'Unknown Error'; - break; - } - //console.log('Error: ' + msg); - } - function onFileSystemSuccess() - { - // console.log ("Got temporary FS"); - window.resolveLocalFileSystemURL(path, function(dir){ - dir.getFile(__filename, {create:true}, function(file){ - file.createWriter(function(fileWriter){ - //var blob = new Blob([__data], {type:'text/plain'}); - // console.log ("about to write "+__data.size+" bytes"); - //var blob = new Blob([__data], {type:'text/plain'}); - fileWriter.write(__data); - fileWriter.onwrite = function(e) { - NVRDataModel.debug ("write complete"); - d.resolve(); - return d.promise; - }; - - fileWriter.onerror = function(e) { - NVRDataModel.debug ("write error in filewriter:"+JSON.stringify(e)); - d.reject(); - return d.promise; - }; - - }); - }); + function writeFile2(path, file, blob, isAppend) { + var csize = 4 * 1024 * 1024; // 4MB + var d = $q.defer(); + NVRDataModel.debug("Inside writeFile2 with blob size=" + blob.size); + + // nothing more to write, so all good? + if (!blob.size) { + NVRDataModel.debug("writeFile2 all done"); + d.resolve(true); + return $q.resolve(true); + } + + + if (!isAppend) { + // return the delegated promise, even if it fails + return $cordovaFile.writeFile(path, file, blob.slice(0, csize), true) + .then(function (succ) { + return writeFile2(path, file, blob.slice(csize), true); + }); + } else { + // return the delegated promise, even if it fails + return $cordovaFile.writeExistingFile(path, file, blob.slice(0, csize)) + .then(function (succ) { + return writeFile2(path, file, blob.slice(csize), true); + }); + } + - }, - function (err) { - d.reject(err); - return d.promise; - }); } - return d.promise; + + function writeFile(path, __filename, __data) { + var d = $q.defer(); + //console.log ("inside write file"); + window.requestFileSystem(LocalFileSystem.TEMPORARY, __data.size + 5000, onFileSystemSuccess, fail); + + function fail(e) { + var msg = ''; + + switch (e.code) { + case FileError.QUOTA_EXCEEDED_ERR: + msg = 'QUOTA_EXCEEDED_ERR'; + break; + case FileError.NOT_FOUND_ERR: + msg = 'NOT_FOUND_ERR'; + break; + case FileError.SECURITY_ERR: + msg = 'SECURITY_ERR'; + break; + case FileError.INVALID_MODIFICATION_ERR: + msg = 'INVALID_MODIFICATION_ERR'; + break; + case FileError.INVALID_STATE_ERR: + msg = 'INVALID_STATE_ERR'; + break; + default: + msg = 'Unknown Error'; + break; + } + + //console.log('Error: ' + msg); + } + + function onFileSystemSuccess() { + // console.log ("Got temporary FS"); + window.resolveLocalFileSystemURL(path, function (dir) { + dir.getFile(__filename, { + create: true + }, function (file) { + file.createWriter(function (fileWriter) { + //var blob = new Blob([__data], {type:'text/plain'}); + // console.log ("about to write "+__data.size+" bytes"); + //var blob = new Blob([__data], {type:'text/plain'}); + fileWriter.write(__data); + fileWriter.onwrite = function (e) { + NVRDataModel.debug("write complete"); + d.resolve(); + return d.promise; + }; + + fileWriter.onerror = function (e) { + NVRDataModel.debug("write error in filewriter:" + JSON.stringify(e)); + d.reject(); + return d.promise; + }; + + }); + }); + + }, + function (err) { + d.reject(err); + return d.promise; + }); + } + return d.promise; } - function moveImageToGallery(fname) - { - // this is https://github.com/terikon/cordova-plugin-photo-library + function moveImageToGallery(fname) { + // this is https://github.com/terikon/cordova-plugin-photo-library - NVRDataModel.debug("moveImageToGallery called with " + fname); - cordova.plugins.photoLibrary.saveImage(fname, "zmNinja",onSuccess, onError); - //LibraryHelper.saveImageToLibrary(onSuccess, onError, fname, "zmNinja"); + NVRDataModel.debug("moveImageToGallery called with " + fname); + cordova.plugins.photoLibrary.saveImage(fname, "zmNinja", onSuccess, onError); + //LibraryHelper.saveImageToLibrary(onSuccess, onError, fname, "zmNinja"); - function onSuccess(results) - { + function onSuccess(results) { - NVRDataModel.debug("Removing temp file"); + NVRDataModel.debug("Removing temp file"); - if ($rootScope.platformOS == 'ios') { - $cordovaFile.removeFile(cordova.file.documentsDirectory, "temp-file.gif"); - } - else - $cordovaFile.removeFile(cordova.file.dataDirectory, "temp-file.gif"); - $ionicLoading.show( - { - template: $translate.instant('kDone'), - noBackdrop: true, - duration: 2000 - }); + if ($rootScope.platformOS == 'ios') { + $cordovaFile.removeFile(cordova.file.documentsDirectory, "temp-file.gif"); + } else + $cordovaFile.removeFile(cordova.file.dataDirectory, "temp-file.gif"); + $ionicLoading.show({ + template: $translate.instant('kDone'), + noBackdrop: true, + duration: 2000 + }); - } + } - function onError(error) - { - // console.log("Error: " + error); + function onError(error) { + // console.log("Error: " + error); - } - } + } + } + + $scope.readyToPlay = function (api) { - $scope.readyToPlay = function(api) { - - api.mediaElement.attr("playsinline", ""); + api.mediaElement.attr("playsinline", ""); }; - - $scope.downloadFileToDevice = function(path, eid) - { - NVRDataModel.setAwake(true); - var tp; - if ($rootScope.platformOS == 'ios') - tp = cordova.file.documentsDirectory + "temp-video.mp4"; - else - tp = cordova.file.dataDirectory + "temp-video.mp4"; + $scope.downloadFileToDevice = function (path, eid) { - var th = true; + NVRDataModel.setAwake(true); + var tp; + if ($rootScope.platformOS == 'ios') + tp = cordova.file.documentsDirectory + "temp-video.mp4"; + else + tp = cordova.file.dataDirectory + "temp-video.mp4"; - var opt = {}; + var th = true; - if ($rootScope.basicAuthHeader) { - opt.headers = {"Authorization": $rootScope.basicAuthHeader}; - NVRDataModel.debug ("download with auth options is:"+JSON.stringify(opt)); - } - - //path = "http://techslides.com/demos/sample-videos/small.mp4"; - - NVRDataModel.debug("Saving temporary video to: " + tp); - $cordovaFileTransfer.download(path, tp, opt, th) - .then(function(result) - { - NVRDataModel.debug("Moving to gallery..."); - var ntp; - ntp = tp.indexOf('file://') === 0 ? tp.slice(7) : tp; - - $timeout(function() - { - $ionicLoading.hide(); - }); - moveToGallery(ntp, eid + "-video"); - NVRDataModel.setAwake(false); - // Success! - }, function(err) - { - NVRDataModel.setAwake(false); - NVRDataModel.log("Error=" + JSON.stringify(err)); - - $timeout(function() - { - $ionicLoading.show( - { + var opt = {}; - template: $translate.instant('kError'), - noBackdrop: true, - duration: 3000 - }); - }); - // Error - }, function(progress) - { - var p = Math.round((progress.loaded / progress.total) * 100); + if ($rootScope.basicAuthHeader) { + opt.headers = { + "Authorization": $rootScope.basicAuthHeader + }; + NVRDataModel.debug("download with auth options is:" + JSON.stringify(opt)); + } + + //path = "http://techslides.com/demos/sample-videos/small.mp4"; + + NVRDataModel.debug("Saving temporary video to: " + tp); + $cordovaFileTransfer.download(path, tp, opt, th) + .then(function (result) { + NVRDataModel.debug("Moving to gallery..."); + var ntp; + ntp = tp.indexOf('file://') === 0 ? tp.slice(7) : tp; + + $timeout(function () { + $ionicLoading.hide(); + }); + moveToGallery(ntp, eid + "-video"); + NVRDataModel.setAwake(false); + // Success! + }, function (err) { + NVRDataModel.setAwake(false); + NVRDataModel.log("Error=" + JSON.stringify(err)); + + $timeout(function () { + $ionicLoading.show({ + + template: $translate.instant('kError'), + noBackdrop: true, + duration: 3000 + }); + }); + // Error + }, function (progress) { + var p = Math.round((progress.loaded / progress.total) * 100); - $ionicLoading.show( - { + $ionicLoading.show({ - template: $translate.instant('kPleaseWait') + "...(" + p + "%)", - noBackdrop: true - }); + template: $translate.instant('kPleaseWait') + "...(" + p + "%)", + noBackdrop: true + }); - }); + }); - function moveToGallery(path, fname) - { + function moveToGallery(path, fname) { - NVRDataModel.debug("moveToGallery called with " + path); - LibraryHelper.saveVideoToLibrary(onSuccess, onError, path, fname); + NVRDataModel.debug("moveToGallery called with " + path); + LibraryHelper.saveVideoToLibrary(onSuccess, onError, path, fname); - function onSuccess(results) - { - $ionicLoading.hide(); - NVRDataModel.debug("Removing temp file"); + function onSuccess(results) { + $ionicLoading.hide(); + NVRDataModel.debug("Removing temp file"); - if ($rootScope.platformOS == 'ios') - $cordovaFile.removeFile(cordova.file.documentsDirectory, "temp-video.mp4"); - else - $cordovaFile.removeFile(cordova.file.dataDirectory, "temp-video.mp4"); + if ($rootScope.platformOS == 'ios') + $cordovaFile.removeFile(cordova.file.documentsDirectory, "temp-video.mp4"); + else + $cordovaFile.removeFile(cordova.file.dataDirectory, "temp-video.mp4"); - } + } - function onError(error) - { - $ionicLoading.hide(); - console.log("Error: " + error); + function onError(error) { + $ionicLoading.hide(); + console.log("Error: " + error); - } } + } }; - $scope.mp4warning = function() - { - $ionicPopup.alert( - { - title: $translate.instant('kNote'), - template: "{{'kVideoMp4Warning' | translate }}", - okText: $translate.instant('kButtonOk'), - cancelText: $translate.instant('kButtonCancel'), - }); + $scope.mp4warning = function () { + $ionicPopup.alert({ + title: $translate.instant('kNote'), + template: "{{'kVideoMp4Warning' | translate }}", + okText: $translate.instant('kButtonOk'), + cancelText: $translate.instant('kButtonCancel'), + }); }; - $scope.showImage = function(p, r, f, fid, e, imode, id, parray, ndx) - { - var img; - - //console.log ("HERE"); - $scope.kFrame = $translate.instant('kFrame'); - $scope.kEvent = $translate.instant('kEvent'); - $scope.ndx = ndx; - $scope.parray = parray; - $scope.imode = imode; + $scope.showImage = function (p, r, f, fid, e, imode, id, parray, ndx) { + var img; - // note ndx may be incorrect if we are looking - // at unique frames; + //console.log ("HERE"); + $scope.kFrame = $translate.instant('kFrame'); + $scope.kEvent = $translate.instant('kEvent'); + $scope.ndx = ndx; + $scope.parray = parray; + $scope.imode = imode; - // NVRDataModel.debug("Hello"); - if ($scope.typeOfFrames == $translate.instant('kShowTimeDiffFrames')) - { + // note ndx may be incorrect if we are looking + // at unique frames; - var ic; + // NVRDataModel.debug("Hello"); + if ($scope.typeOfFrames == $translate.instant('kShowTimeDiffFrames')) { - for (ic = 0; ic < $scope.parray.length; ic++) - { - if ($scope.parray[ic].frameid == fid) - break; - } + var ic; - NVRDataModel.debug("Readjusting selected frame ID from:" + $scope.ndx + " to actual frame ID of:" + ic); - $scope.ndx = ic; - } - else - { - NVRDataModel.debug("No index adjustment necessary as we are using all frames"); + for (ic = 0; ic < $scope.parray.length; ic++) { + if ($scope.parray[ic].frameid == fid) + break; } - // console.log ("Image Mode " + imode); - // console.log ("parray : " + JSON.stringify(parray)); - // console.log ("index: " + ndx); - if ($scope.imode == 'path') - { - if ($scope.outlineMotion) - $scope.imgsrc = p + "/index.php?view=image&path=" + r + $scope.parray[$scope.ndx].aname; - else - $scope.imgsrc = p + "/index.php?view=image&path=" + r + $scope.parray[$scope.ndx].fname; - $scope.fallbackImgSrc = p + "/index.php?view=image&path=" + r + $scope.parray[$scope.ndx].fname; - } + NVRDataModel.debug("Readjusting selected frame ID from:" + $scope.ndx + " to actual frame ID of:" + ic); + $scope.ndx = ic; + } else { + NVRDataModel.debug("No index adjustment necessary as we are using all frames"); + } + // console.log ("Image Mode " + imode); + // console.log ("parray : " + JSON.stringify(parray)); + // console.log ("index: " + ndx); + if ($scope.imode == 'path') { + if ($scope.outlineMotion) + $scope.imgsrc = p + "/index.php?view=image&path=" + r + $scope.parray[$scope.ndx].aname; else - { - $scope.imgsrc = p + "/index.php?view=image&fid=" + $scope.parray[$scope.ndx].id+$scope.outlineMotionParam; - $scope.fallbackImgSrc = p + "/index.php?view=image&fid=" + $scope.parray[$scope.ndx].id; + $scope.imgsrc = p + "/index.php?view=image&path=" + r + $scope.parray[$scope.ndx].fname; + $scope.fallbackImgSrc = p + "/index.php?view=image&path=" + r + $scope.parray[$scope.ndx].fname; + } else { + $scope.imgsrc = p + "/index.php?view=image&fid=" + $scope.parray[$scope.ndx].id + $scope.outlineMotionParam; + $scope.fallbackImgSrc = p + "/index.php?view=image&fid=" + $scope.parray[$scope.ndx].id; - } + } - //$rootScope.zmPopup = $ionicPopup.alert({title: kFrame+':'+fid+'/'+kEvent+':'+e,template:img, cssClass:'popup80'}); + //$rootScope.zmPopup = $ionicPopup.alert({title: kFrame+':'+fid+'/'+kEvent+':'+e,template:img, cssClass:'popup80'}); - if ($rootScope.authSession !='undefined'){ - $scope.imgsrc +=$rootScope.authSession; - $scope.fallbackImgSrc +=$rootScope.authSession; - } + if ($rootScope.authSession != 'undefined') { + $scope.imgsrc += $rootScope.authSession; + $scope.fallbackImgSrc += $rootScope.authSession; + } - - $scope.imgsrc +=NVRDataModel.insertBasicAuthToken(); - $scope.fallbackImgSrc +=NVRDataModel.insertBasicAuthToken(); - + $scope.imgsrc += NVRDataModel.insertBasicAuthToken(); + $scope.fallbackImgSrc += NVRDataModel.insertBasicAuthToken(); - $rootScope.zmPopup = $ionicPopup.show( - { - template: '<center>' + $translate.instant('kFrame') + ':{{parray[ndx].frameid}}@{{prettifyTimeSec(parray[ndx].time)}}</center><br/><img ng-src="{{imgsrc}}" fallback-src="{{fallbackImgSrc}}" width="100%" />', - title: $translate.instant('kImages') + " (" + $translate.instant($scope.typeOfFrames) + ")", - subTitle: 'use left and right arrows to change', - scope: $scope, - cssClass: 'popup95', - buttons: [ - { - text: '', - type: 'button-assertive button-small ion-camera', - onTap: function(e) - { - e.preventDefault(); - saveNow($scope.imgsrc, r, parray[$scope.ndx].fname); - } - }, + $rootScope.zmPopup = $ionicPopup.show({ + template: '<center>' + $translate.instant('kFrame') + ':{{parray[ndx].frameid}}@{{prettifyTimeSec(parray[ndx].time)}}</center><br/><img ng-src="{{imgsrc}}" fallback-src="{{fallbackImgSrc}}" width="100%" />', + title: $translate.instant('kImages') + " (" + $translate.instant($scope.typeOfFrames) + ")", + subTitle: 'use left and right arrows to change', + scope: $scope, + cssClass: 'popup95', + buttons: [ - { - // left 1 - text: '', - type: 'button-small button-energized ion-chevron-left', - onTap: function(e) - { - // look for next frame that matches the type of frame - // we are showing (all or diff timestamps); - - // console.log ("TYPE OF FRAMES: " + $scope.typeOfFrames); - var nndx = null; - var alltype = $translate.instant('kShowAllFrames'); - for (var i = $scope.ndx - 1; i >= 0; i--) - { - if ($scope.parray[i].type == $scope.typeOfFrames || $scope.typeOfFrames == alltype) - { - nndx = i; - break; - } - } - if (nndx == null) nndx = $scope.ndx; - $scope.ndx = nndx; - - if ($scope.imode == 'path') - { - if ($scope.outlineMotion) - $scope.imgsrc = p + "/index.php?view=image&path=" + r + $scope.parray[$scope.ndx].aname; - else - $scope.imgsrc = p + "/index.php?view=image&path=" + r + $scope.parray[$scope.ndx].fname; - $scope.fallbackImgSrc = p + "/index.php?view=image&path=" + r + $scope.parray[$scope.ndx].fname; - } - - else - { - $scope.imgsrc = p + "/index.php?view=image&fid=" + $scope.parray[$scope.ndx].id+$scope.outlineMotionParam; - $scope.fallbackImgSrc = p + "/index.php?view=image&fid=" + $scope.parray[$scope.ndx].id; - - } - - - e.preventDefault(); + { + text: '', + type: 'button-assertive button-small ion-camera', + onTap: function (e) { + e.preventDefault(); + saveNow($scope.imgsrc, r, parray[$scope.ndx].fname); - } - }, - { - // right 1 - text: '', - type: 'button-small button-energized ion-chevron-right', - onTap: function(e) - { - - // look for next frame that matches the type of frame - // we are showing (all or diff timestamps); - - // console.log ("TYPE OF FRAMES: " + $scope.typeOfFrames); - var nndx = null; - var alltype = $translate.instant('kShowAllFrames'); - for (var i = $scope.ndx + 1; i < $scope.parray.length; i++) - { - //console.log ("Comparing: " +$scope.parray[i].type +" to " + $scope.typeOfFrames); - if ($scope.parray[i].type == $scope.typeOfFrames || $scope.typeOfFrames == alltype) - { - nndx = i; - break; - } - } - if (nndx == null) nndx = $scope.ndx; - $scope.ndx = nndx; - - if ($scope.imode == 'path') - { - if ($scope.outlineMotion) - $scope.imgsrc = p + "/index.php?view=image&path=" + r + $scope.parray[$scope.ndx].aname; - else - $scope.imgsrc = p + "/index.php?view=image&path=" + r + $scope.parray[$scope.ndx].fname; - $scope.fallbackImgSrc = p + "/index.php?view=image&path=" + r + $scope.parray[$scope.ndx].fname; - } - - else - { - $scope.imgsrc = p + "/index.php?view=image&fid=" + $scope.parray[$scope.ndx].id+$scope.outlineMotionParam; - $scope.fallbackImgSrc = p + "/index.php?view=image&fid=" + $scope.parray[$scope.ndx].id; - - } - - - e.preventDefault(); + } + }, + + { + // left 1 + text: '', + type: 'button-small button-energized ion-chevron-left', + onTap: function (e) { + // look for next frame that matches the type of frame + // we are showing (all or diff timestamps); + + // console.log ("TYPE OF FRAMES: " + $scope.typeOfFrames); + var nndx = null; + var alltype = $translate.instant('kShowAllFrames'); + for (var i = $scope.ndx - 1; i >= 0; i--) { + if ($scope.parray[i].type == $scope.typeOfFrames || $scope.typeOfFrames == alltype) { + nndx = i; + break; + } + } + if (nndx == null) nndx = $scope.ndx; + $scope.ndx = nndx; - } - }, + if ($scope.imode == 'path') { + if ($scope.outlineMotion) + $scope.imgsrc = p + "/index.php?view=image&path=" + r + $scope.parray[$scope.ndx].aname; + else + $scope.imgsrc = p + "/index.php?view=image&path=" + r + $scope.parray[$scope.ndx].fname; + $scope.fallbackImgSrc = p + "/index.php?view=image&path=" + r + $scope.parray[$scope.ndx].fname; + } else { + $scope.imgsrc = p + "/index.php?view=image&fid=" + $scope.parray[$scope.ndx].id + $scope.outlineMotionParam; + $scope.fallbackImgSrc = p + "/index.php?view=image&fid=" + $scope.parray[$scope.ndx].id; - { - text: '', - type: 'button-positive button-small ion-checkmark-round', - onTap: function(e) { + } - } + + e.preventDefault(); + + } + }, + { + // right 1 + text: '', + type: 'button-small button-energized ion-chevron-right', + onTap: function (e) { + + // look for next frame that matches the type of frame + // we are showing (all or diff timestamps); + + // console.log ("TYPE OF FRAMES: " + $scope.typeOfFrames); + var nndx = null; + var alltype = $translate.instant('kShowAllFrames'); + for (var i = $scope.ndx + 1; i < $scope.parray.length; i++) { + //console.log ("Comparing: " +$scope.parray[i].type +" to " + $scope.typeOfFrames); + if ($scope.parray[i].type == $scope.typeOfFrames || $scope.typeOfFrames == alltype) { + nndx = i; + break; } - ] - }); + } + if (nndx == null) nndx = $scope.ndx; + $scope.ndx = nndx; + + if ($scope.imode == 'path') { + if ($scope.outlineMotion) + $scope.imgsrc = p + "/index.php?view=image&path=" + r + $scope.parray[$scope.ndx].aname; + else + $scope.imgsrc = p + "/index.php?view=image&path=" + r + $scope.parray[$scope.ndx].fname; + $scope.fallbackImgSrc = p + "/index.php?view=image&path=" + r + $scope.parray[$scope.ndx].fname; + } else { + $scope.imgsrc = p + "/index.php?view=image&fid=" + $scope.parray[$scope.ndx].id + $scope.outlineMotionParam; + $scope.fallbackImgSrc = p + "/index.php?view=image&fid=" + $scope.parray[$scope.ndx].id; + + } + + + e.preventDefault(); + + } + }, + + { + text: '', + type: 'button-positive button-small ion-checkmark-round', + onTap: function (e) { + + } + } + ] + }); }; - - $scope.toggleMotionOutline = function() - { - $scope.outlineMotion = !$scope.outlineMotion; - if ($scope.outlineMotion) - $scope.outlineMotionParam = "&show=analyse"; - else - $scope.outlineMotionParam = ""; + + $scope.toggleMotionOutline = function () { + $scope.outlineMotion = !$scope.outlineMotion; + if ($scope.outlineMotion) + $scope.outlineMotionParam = "&show=analyse"; + else + $scope.outlineMotionParam = ""; }; - $scope.toggleTypeOfAlarms = function() - { - // "kShowAllFrames" : "all", - // "kShowTimeDiffFrames" : "different timestamps" + $scope.toggleTypeOfAlarms = function () { + // "kShowAllFrames" : "all", + // "kShowTimeDiffFrames" : "different timestamps" - if ($scope.typeOfFrames == $translate.instant('kShowAllFrames')) - { - $scope.typeOfFrames = $translate.instant('kShowTimeDiffFrames'); - } - else - { - $scope.typeOfFrames = $translate.instant('kShowAllFrames'); - } + if ($scope.typeOfFrames == $translate.instant('kShowAllFrames')) { + $scope.typeOfFrames = $translate.instant('kShowTimeDiffFrames'); + } else { + $scope.typeOfFrames = $translate.instant('kShowAllFrames'); + } }; // not explictly handling error --> I have a default "No events found" message @@ -1139,114 +1025,106 @@ angular.module('zmApp.controllers') //-------------------------------------------------------------------------- // This is what the pullup bar calls depending on what range is specified //-------------------------------------------------------------------------- - $scope.showEvents = function(val, unit, monitorId) - { - NVRDataModel.debug("ShowEvents called with val:" + val + " unit:" + unit + " for Monitor:" + monitorId); + $scope.showEvents = function (val, unit, monitorId) { + NVRDataModel.debug("ShowEvents called with val:" + val + " unit:" + unit + " for Monitor:" + monitorId); + + $ionicHistory.nextViewOptions({ + disableBack: true + }); + + // we have to convert from and to, to server time + var mToDate = moment().tz(NVRDataModel.getTimeZoneNow()); + var mFromDate = moment().subtract(parseInt(val), unit).tz(NVRDataModel.getTimeZoneNow()); + + // console.log("Moment Dates:" + mFromDate.format() + " TO " + mToDate.format()); + + $rootScope.fromTime = mFromDate.toDate(); + $rootScope.toTime = mToDate.toDate(); + $rootScope.fromDate = $rootScope.fromTime; + $rootScope.toDate = $rootScope.toTime; + + NVRDataModel.debug("From: " + $rootScope.fromTime); + NVRDataModel.debug("To: " + $rootScope.toTime); + + //$rootScope.fromDate = fromDate.toDate(); + //$rootScope.toDate = toDate.toDate(); + $rootScope.isEventFilterOn = true; + $rootScope.fromString = mFromDate + .format("YYYY-MM-DD") + " " + mFromDate.format("HH:mm:ss"); + + $rootScope.toString = mToDate + .format("YYYY-MM-DD") + " " + mToDate + .format("HH:mm:ss"); + + // console.log("**************From String: " + $rootScope.fromString); + // console.log("**************To String: " + $rootScope.toString); + + // reloading - may solve https://github.com/pliablepixels/zmNinja/issues/36 + // if you are in the same mid event page $state.go won't work + + $scope.id = monitorId; + $scope.showEvent = false; + $scope.footerState = ionPullUpFooterState.MINIMIZED; + getInitialEvents(); + + /* console.log ("---> SENDING TO EVENTS WITH mid " + monitorId); + $state.go("app.events", + { + "id": monitorId, + "playEvent": false + }, + { + reload: true + });*/ + }; - $ionicHistory.nextViewOptions( + //---------------------------------------------------------------- + // Alarm notification handling + //---------------------------------------------------------------- + $scope.handleAlarms = function () { + // $rootScope.isAlarm = !$rootScope.isAlarm; + if ($rootScope.isAlarm) { + $rootScope.alarmCount = "0"; + $rootScope.isAlarm = !$rootScope.isAlarm; + /*$ionicHistory.nextViewOptions( { disableBack: true }); - - // we have to convert from and to, to server time - var mToDate = moment().tz(NVRDataModel.getTimeZoneNow()); - var mFromDate = moment().subtract(parseInt(val), unit).tz(NVRDataModel.getTimeZoneNow()); - - // console.log("Moment Dates:" + mFromDate.format() + " TO " + mToDate.format()); - - $rootScope.fromTime = mFromDate.toDate(); - $rootScope.toTime = mToDate.toDate(); - $rootScope.fromDate = $rootScope.fromTime; - $rootScope.toDate = $rootScope.toTime; - - NVRDataModel.debug("From: " + $rootScope.fromTime); - NVRDataModel.debug("To: " + $rootScope.toTime); - - //$rootScope.fromDate = fromDate.toDate(); - //$rootScope.toDate = toDate.toDate(); - $rootScope.isEventFilterOn = true; - $rootScope.fromString = mFromDate - .format("YYYY-MM-DD") + " " + mFromDate.format("HH:mm:ss"); - - $rootScope.toString = mToDate - .format("YYYY-MM-DD") + " " + mToDate - .format("HH:mm:ss"); - - // console.log("**************From String: " + $rootScope.fromString); - // console.log("**************To String: " + $rootScope.toString); - - // reloading - may solve https://github.com/pliablepixels/zmNinja/issues/36 - // if you are in the same mid event page $state.go won't work - - $scope.id = monitorId; - $scope.showEvent = false; - $scope.footerState = ionPullUpFooterState.MINIMIZED; - getInitialEvents(); - - /* console.log ("---> SENDING TO EVENTS WITH mid " + monitorId); $state.go("app.events", { - "id": monitorId, + "id": 0, "playEvent": false }, { reload: true - });*/ - }; - - //---------------------------------------------------------------- - // Alarm notification handling - //---------------------------------------------------------------- - $scope.handleAlarms = function() - { - // $rootScope.isAlarm = !$rootScope.isAlarm; - if ($rootScope.isAlarm) - { - $rootScope.alarmCount = "0"; - $rootScope.isAlarm = !$rootScope.isAlarm; - /*$ionicHistory.nextViewOptions( - { - disableBack: true - }); - $state.go("app.events", - { - "id": 0, - "playEvent": false - }, - { - reload: true - }); */ - getInitialEvents(); - return; - } + }); */ + getInitialEvents(); + return; + } }; // credit:http://stackoverflow.com/a/20151856/1361529 - function base64toBlob(base64Data, contentType) - { - contentType = contentType || ''; - var sliceSize = 1024; - var byteCharacters = atob(base64Data); - var bytesLength = byteCharacters.length; - var slicesCount = Math.ceil(bytesLength / sliceSize); - var byteArrays = new Array(slicesCount); - - for (var sliceIndex = 0; sliceIndex < slicesCount; ++sliceIndex) - { - var begin = sliceIndex * sliceSize; - var end = Math.min(begin + sliceSize, bytesLength); - - var bytes = new Array(end - begin); - for (var offset = begin, i = 0; offset < end; ++i, ++offset) - { - bytes[i] = byteCharacters[offset].charCodeAt(0); - } - byteArrays[sliceIndex] = new Uint8Array(bytes); + function base64toBlob(base64Data, contentType) { + contentType = contentType || ''; + var sliceSize = 1024; + var byteCharacters = atob(base64Data); + var bytesLength = byteCharacters.length; + var slicesCount = Math.ceil(bytesLength / sliceSize); + var byteArrays = new Array(slicesCount); + + for (var sliceIndex = 0; sliceIndex < slicesCount; ++sliceIndex) { + var begin = sliceIndex * sliceSize; + var end = Math.min(begin + sliceSize, bytesLength); + + var bytes = new Array(end - begin); + for (var offset = begin, i = 0; offset < end; ++i, ++offset) { + bytes[i] = byteCharacters[offset].charCodeAt(0); } - return new Blob(byteArrays, - { - type: contentType - }); + byteArrays[sliceIndex] = new Uint8Array(bytes); + } + return new Blob(byteArrays, { + type: contentType + }); } //---------------------------------------------------------- @@ -1254,593 +1132,517 @@ angular.module('zmApp.controllers') // to keep memory manageable, we are only going to pick up alarmed frames // and that too, max 1ps // -------------------------------------------------------------- - function prepareImages(e) - { - var d = $q.defer(); - var imglist = []; - var myurl = loginData.apiurl + '/events/' + e.Event.Id + ".json"; - $http.get(myurl) - .then(function(succ) + function prepareImages(e) { + var d = $q.defer(); + var imglist = []; + var myurl = loginData.apiurl + '/events/' + e.Event.Id + ".json"; + $http.get(myurl) + .then(function (succ) { + var data = succ.data; + var fps = 0; + var lastTime = ""; + + for (var i = 0; i < data.event.Frame.length; i++) { + if (data.event.Frame[i].Type == "Alarm") + //if (1) + { + var fname; + //console.log ("PATH="+e.Event.imageMode); + if (e.Event.imageMode == 'path') + //if (1) { - var data = succ.data; - var fps = 0; - var lastTime = ""; - - for (var i = 0; i < data.event.Frame.length; i++) - { - if (data.event.Frame[i].Type == "Alarm") - //if (1) - { - var fname; - //console.log ("PATH="+e.Event.imageMode); - if (e.Event.imageMode == 'path') - //if (1) - { - var rfp = padToN(data.event.Frame[i].FrameId, eventImageDigits) + "-capture.jpg"; - fname = e.Event.baseURL + "/index.php?view=image&width=" + zm.maxGifWidth + "&path=" + e.Event.relativePath + rfp; - } - else - { - fname = e.Event.baseURL + "/index.php?view=image&width=" + zm.maxGifWidth + "&fid=" + data.event.Frame[i].Id; - } - - if (data.event.Frame[i].TimeStamp != lastTime /*|| fps < 2*/ ) - - { - imglist.push(fname); - //fps = data.event.Frame[i].TimeStamp != lastTime ? 0 : fps+1; - lastTime = data.event.Frame[i].TimeStamp; - } - - } + var rfp = padToN(data.event.Frame[i].FrameId, eventImageDigits) + "-capture.jpg"; + fname = e.Event.baseURL + "/index.php?view=image&width=" + zm.maxGifWidth + "&path=" + e.Event.relativePath + rfp; + } else { + fname = e.Event.baseURL + "/index.php?view=image&width=" + zm.maxGifWidth + "&fid=" + data.event.Frame[i].Id; + } - } + if (data.event.Frame[i].TimeStamp != lastTime /*|| fps < 2*/ ) - // next up make sure we are not processing more than 100 images + { + imglist.push(fname); + //fps = data.event.Frame[i].TimeStamp != lastTime ? 0 : fps+1; + lastTime = data.event.Frame[i].TimeStamp; + } - while (imglist.length > zm.maxGifCount2) - { - NVRDataModel.debug("Too many images: " + imglist.length + ", deleting alternate frames to keep it <=" + zm.maxGifCount2); + } - for (var l = 0; l < imglist.length; l++) - { - imglist.splice(l + 1, 2); - if (imglist.length <= zm.maxGifCount2) break; - } + } - } - NVRDataModel.debug("final image list length is:" + imglist.length); + // next up make sure we are not processing more than 100 images - d.resolve(imglist); - return d.promise; - }, - function(err) - { - d.reject(err); - return d.promise; - }); - return d.promise; + while (imglist.length > zm.maxGifCount2) { + NVRDataModel.debug("Too many images: " + imglist.length + ", deleting alternate frames to keep it <=" + zm.maxGifCount2); + + for (var l = 0; l < imglist.length; l++) { + imglist.splice(l + 1, 2); + if (imglist.length <= zm.maxGifCount2) break; + } + + } + NVRDataModel.debug("final image list length is:" + imglist.length); + + d.resolve(imglist); + return d.promise; + }, + function (err) { + d.reject(err); + return d.promise; + }); + return d.promise; } // force image to be of zm.maxGifWidth. TBD: rotated foo - function adjustAspect(e) - { - - var w = zm.maxGifWidth; - var h = Math.round(e.Event.Height / e.Event.Width * zm.maxGifWidth); - return { - w: w, - h: h - }; + function adjustAspect(e) { + + var w = zm.maxGifWidth; + var h = Math.round(e.Event.Height / e.Event.Width * zm.maxGifWidth); + return { + w: w, + h: h + }; } // for devices - handle permission before you download - $scope.permissionsDownload = function(e) - { - if ($rootScope.platformOS == 'desktop') - { + $scope.permissionsDownload = function (e) { + if ($rootScope.platformOS == 'desktop') { + gifAlert(e); + } else { + + //console.log("in perms"); + cordova.plugins.photoLibrary.getLibrary( + function (library) { gifAlert(e); - } - else - { - - //console.log("in perms"); - cordova.plugins.photoLibrary.getLibrary( - function(library) - { - gifAlert(e); + }, + function (err) { + if (err.startsWith('Permission')) { + // call requestAuthorization, and retry + cordova.plugins.photoLibrary.requestAuthorization( + function () { + // User gave us permission to his library, retry reading it! + gifAlert(e); }, - function(err) + function (err) { + NVRDataModel.log("ERROR with saving permissions " + err); + // User denied the access + }, // if options not provided, defaults to {read: true}. { - if (err.startsWith('Permission')) - { - // call requestAuthorization, and retry - cordova.plugins.photoLibrary.requestAuthorization( - function() - { - // User gave us permission to his library, retry reading it! - gifAlert(e); - }, - function(err) - { - NVRDataModel.log("ERROR with saving permissions " + err); - // User denied the access - }, // if options not provided, defaults to {read: true}. - { - read: true, - write: true - } - ); - } - // Handle error - it's not permission-related + read: true, + write: true } - ); + ); + } + // Handle error - it's not permission-related + } + ); - } + } }; // make sure the user knows the GIF is not full fps/all frames - function gifAlert(e) - { - if(navigator.userAgent.toLowerCase().indexOf('crosswalk') == -1) { - $ionicPopup.confirm( - { - title: $translate.instant('kNote'), - template: "{{'kGifWarning' | translate }}", - okText: $translate.instant('kButtonOk'), - cancelText: $translate.instant('kButtonCancel'), - }).then(function(res) - { - if (res) - { - downloadAsGif2(e); - } - else - NVRDataModel.debug ("User cancelled GIF"); - - }); - } - else - { - $ionicPopup.alert({ - title:$translate.instant ('kNote'), - template:"{{'kGifNoCrosswalk' | translate}}" - }); - } + function gifAlert(e) { + if (navigator.userAgent.toLowerCase().indexOf('crosswalk') == -1) { + $ionicPopup.confirm({ + title: $translate.instant('kNote'), + template: "{{'kGifWarning' | translate }}", + okText: $translate.instant('kButtonOk'), + cancelText: $translate.instant('kButtonCancel'), + }).then(function (res) { + if (res) { + downloadAsGif2(e); + } else + NVRDataModel.debug("User cancelled GIF"); + + }); + } else { + $ionicPopup.alert({ + title: $translate.instant('kNote'), + template: "{{'kGifNoCrosswalk' | translate}}" + }); + } } // convert to base64 - devices need this to save to gallery - function blobToBase64(blob) - { - NVRDataModel.debug("converting blob to base64..."); - var d = $q.defer(); - var reader = new window.FileReader(); - reader.readAsDataURL(blob); - reader.onloadend = function() - { - var base64data = reader.result; - //console.log(base64data ); - d.resolve(base64data); - return d.promise; - - }; + function blobToBase64(blob) { + NVRDataModel.debug("converting blob to base64..."); + var d = $q.defer(); + var reader = new window.FileReader(); + reader.readAsDataURL(blob); + reader.onloadend = function () { + var base64data = reader.result; + //console.log(base64data ); + d.resolve(base64data); return d.promise; + + }; + return d.promise; } // part of neuquant conversion - function componentizedPaletteToArray(paletteRGB) - { - var paletteArray = [], - i, r, g, b; - for (i = 0; i < paletteRGB.length; i += 3) - { - r = paletteRGB[i]; - g = paletteRGB[i + 1]; - b = paletteRGB[i + 2]; - paletteArray.push(r << 16 | g << 8 | b); - } - return paletteArray; + function componentizedPaletteToArray(paletteRGB) { + var paletteArray = [], + i, r, g, b; + for (i = 0; i < paletteRGB.length; i += 3) { + r = paletteRGB[i]; + g = paletteRGB[i + 1]; + b = paletteRGB[i + 2]; + paletteArray.push(r << 16 | g << 8 | b); + } + return paletteArray; } // part of neuquant conversion - function dataToRGB(data, width, height) - { - var i = 0, - length = width * height * 4, - rgb = []; - while (i < length) - { - rgb.push(data[i++]); - rgb.push(data[i++]); - rgb.push(data[i++]); - i++; - } - return rgb; + function dataToRGB(data, width, height) { + var i = 0, + length = width * height * 4, + rgb = []; + while (i < length) { + rgb.push(data[i++]); + rgb.push(data[i++]); + rgb.push(data[i++]); + i++; + } + return rgb; } // credit Jimmy Warting // https://github.com/jimmywarting/StreamSaver.js/issues/38 // he stream-ized and cleaned up the gif creation process // using GifWriter.js - function createGif(files, w, h) - { + function createGif(files, w, h) { + + var cv = document.getElementById("canvas"); + var ctx = cv.getContext("2d"); + var pixels = new Uint8Array(w * h); + var totalImages = files.length; + var processedImages = 0; + + cv.width = w; + cv.height = h; + + var rs = new ReadableStream({ + // Each time pull gets called you should get the pixel data and + // enqueue it as if it would be good old gif.addFrame() + pull: function pull(controller) { + var frame = files.shift(); + if (!frame) { + controller.close(); + return; + } - var cv = document.getElementById("canvas"); - var ctx = cv.getContext("2d"); - var pixels = new Uint8Array(w * h); - var totalImages = files.length; - var processedImages = 0; + return $http({ + url: frame, + responseType: "blob" + }) + .then(function (res) { - cv.width = w; - cv.height = h; + return res.data.image(); + }) + .then(function (img) { + processedImages++; + + var p = Math.round(processedImages / totalImages * 100); + $ionicLoading.show({ + template: $translate.instant('kPleaseWait') + "...(" + p + "%)", + noBackdrop: true + }); + + // console.log("URL=" + frame); + URL.revokeObjectURL(img.src); + ctx.drawImage(img, 0, 0); + + var data = ctx.getImageData(0, 0, w, h).data; + var rgbComponents = dataToRGB(data, w, h); + var nq = new NeuQuant(rgbComponents, rgbComponents.length, 15); + var paletteRGB = nq.process(); + var paletteArray = new Uint32Array(componentizedPaletteToArray(paletteRGB)); + var numberPixels = w * h; + var k = 0, + i, r, g, b; + + for (i = 0; i < numberPixels; i++) { + r = rgbComponents[k++]; + g = rgbComponents[k++]; + b = rgbComponents[k++]; + pixels[i] = nq.map(r, g, b); + } - var rs = new ReadableStream( - { - // Each time pull gets called you should get the pixel data and - // enqueue it as if it would be good old gif.addFrame() - pull: function pull(controller) - { - var frame = files.shift(); - if (!frame) {controller.close(); return;} - - return $http( - { - url: frame, - responseType: "blob" - }) - .then(function(res) - { - - return res.data.image(); - }) - .then(function(img) - { - processedImages++; - - var p = Math.round(processedImages / totalImages * 100); - $ionicLoading.show( - { - template: $translate.instant('kPleaseWait') + "...(" + p + "%)", - noBackdrop: true - }); - - // console.log("URL=" + frame); - URL.revokeObjectURL(img.src); - ctx.drawImage(img, 0, 0); - - var data = ctx.getImageData(0, 0, w, h).data; - var rgbComponents = dataToRGB(data, w, h); - var nq = new NeuQuant(rgbComponents, rgbComponents.length, 15); - var paletteRGB = nq.process(); - var paletteArray = new Uint32Array(componentizedPaletteToArray(paletteRGB)); - var numberPixels = w * h; - var k = 0, - i, r, g, b; - - for (i = 0; i < numberPixels; i++) - { - r = rgbComponents[k++]; - g = rgbComponents[k++]; - b = rgbComponents[k++]; - pixels[i] = nq.map(r, g, b); - } - - controller.enqueue([0, 0, w, h, pixels, - { - palette: paletteArray, - delay: 100, // 1 second - }]); - }); - } - }); + controller.enqueue([0, 0, w, h, pixels, + { + palette: paletteArray, + delay: 100, // 1 second + } + ]); + }); + } + }); - return new GifWriter(rs, w, h, - { - loop: null - }); + return new GifWriter(rs, w, h, { + loop: null + }); } - - function downloadAsGif2(e) - { - $rootScope.isDownloading = true; - $ionicLoading.show( - { - template: $translate.instant('kPleaseWait') + "...", - noBackdrop: true, - duration: 20000 - }); - NVRDataModel.setAwake(true); - prepareImages(e) - .then(function(files) - { - return $http( - { - url: files[0], - responseType: "blob" - }) - .then(function(res) - { - return res.data.image(); - }) - .then(function(img) - { - URL.revokeObjectURL(img.src); // Revoke object URL to free memory - var stream = createGif(files, img.width, img.height); - //var fileStream = streamSaver.createWriteStream('image.gif'); - - var chunks = []; - var reader = stream.getReader(); - - function pull() - { - return reader.read().then(function(result) - { - chunks.push(result.value); - return result.done ? chunks : pull(); - }); - } - - pull().then(function(chunks) - { - var blob = new Blob(chunks, - { - type: "image/gif" - - }); - - //alert ("WE ARE DONE!"); - if ($rootScope.platformOS == 'desktop') - { - saveAs(blob, e.Event.Id + "-video.gif"); - $ionicLoading.hide(); - } - else - { - // write blob to file - var tp; - if ($rootScope.platformOS == 'ios') - tp = cordova.file.documentsDirectory; - else - tp = cordova.file.dataDirectory; - var th = true, opt = {}; - - $ionicLoading.show( - { - - template:"writing to file...", - noBackdrop: true, - }); - - //var bloburl = URL.createObjectURL(blob); - //NVRDataModel.debug ("blob-url is:"+bloburl); - - writeFile2(tp,"temp-file.gif",blob,false) - .then (function (succ) { - NVRDataModel.debug ("write to file successful"); - // console.log( "write file successful"); - $ionicLoading.hide(); - - var ntp = tp; - //ntp = tp.indexOf('file://') === 0 ? tp.slice(7) : tp; - - ntp = ntp+"temp-file.gif"; - // console.log ("ntp="+ntp); - - moveImageToGallery(ntp); - $rootScope.isDownloading = false; - - }, function (err) { - $rootScope.isDownloading = false; - $ionicLoading.hide(); - NVRDataModel.debug ("error writing to file "+JSON.stringify(err)); - - - }); - } - - }); - }); + function downloadAsGif2(e) { + $rootScope.isDownloading = true; + $ionicLoading.show({ + template: $translate.instant('kPleaseWait') + "...", + noBackdrop: true, + duration: 20000 + }); + NVRDataModel.setAwake(true); + + prepareImages(e) + .then(function (files) { + return $http({ + url: files[0], + responseType: "blob" + }) + .then(function (res) { + return res.data.image(); + }) + .then(function (img) { + URL.revokeObjectURL(img.src); // Revoke object URL to free memory + var stream = createGif(files, img.width, img.height); + //var fileStream = streamSaver.createWriteStream('image.gif'); + + var chunks = []; + var reader = stream.getReader(); + + function pull() { + return reader.read().then(function (result) { + chunks.push(result.value); + return result.done ? chunks : pull(); + }); + } - }, - function(err) - { + pull().then(function (chunks) { + var blob = new Blob(chunks, { + type: "image/gif" + + }); + + //alert ("WE ARE DONE!"); + if ($rootScope.platformOS == 'desktop') { + saveAs(blob, e.Event.Id + "-video.gif"); $ionicLoading.hide(); - NVRDataModel.setAwake(false); - NVRDataModel.log("Error getting frames"); - $rootScope.isDownloading = false; - } + } else { + // write blob to file + var tp; + if ($rootScope.platformOS == 'ios') + tp = cordova.file.documentsDirectory; + else + tp = cordova.file.dataDirectory; + var th = true, + opt = {}; + + $ionicLoading.show({ + + template: "writing to file...", + noBackdrop: true, + }); - ); + //var bloburl = URL.createObjectURL(blob); + //NVRDataModel.debug ("blob-url is:"+bloburl); - } + writeFile2(tp, "temp-file.gif", blob, false) + .then(function (succ) { + NVRDataModel.debug("write to file successful"); + // console.log( "write file successful"); + $ionicLoading.hide(); - // NOT USED - WILL REMOVE AFTER TESTING OTHER METHOD MORE - function downloadAsGif(e) - { - $ionicLoading.show( - { - template: $translate.instant('kPleaseWait') + "...", - noBackdrop: true, - duration: 20000 - }); + var ntp = tp; + //ntp = tp.indexOf('file://') === 0 ? tp.slice(7) : tp; - prepareImages(e) - .then(function(imgs) - { + ntp = ntp + "temp-file.gif"; + // console.log ("ntp="+ntp); - // console.log("TOTAL IMAGES TO GIF=" + imgs.length); - //console.log(JSON.stringify(imgs)); - - var ad = adjustAspect(e); - //console.log("SAVING W=" + ad.w + " H=" + ad.h); - NVRDataModel.setAwake(true); - gifshot.createGIF( - { - - 'gifWidth': ad.w, - 'gifHeight': ad.h, - 'images': imgs, - 'interval': 1, - //'loop':null, - 'sampleInterval': 20, - //'frameDur':5, // 1/2 a sec - 'text': 'zmNinja', - 'crossOrigin': 'use-credentials', - 'progressCallback': function(cp) - { - var p = Math.round(cp * 100); - $ionicLoading.show( - { - template: $translate.instant('kPleaseWait') + "...(" + p + "%)", - noBackdrop: true - }); - } - }, function(obj) - { - NVRDataModel.setAwake(false); - if (!obj.error) - { - //console.log(obj.image); - - var blob; - - if ($rootScope.platformOS == 'desktop') - { - - obj.image = obj.image.replace(/data:image\/gif;base64,/, ''); - blob = base64toBlob(obj.image, "image/gif"); - var f = NVRDataModel.getMonitorName(e.Event.MonitorId); - f = f + "-" + e.Event.Id + ".gif"; - saveAs(blob, f); - $ionicLoading.hide(); - } - - else - { - NVRDataModel.debug("Saving blob to gallery..."); - var album = "zmNinja"; - cordova.plugins.photoLibrary.saveImage(obj.image, album, - function() - { - $ionicLoading.hide(); - NVRDataModel.debug("Event saved"); - }, - function(err) - { - $ionicLoading.hide(); - NVRDataModel.debug("Saving ERROR=" + err); - }); - - } - - } - else - { - $ionicLoading.hide(); - NVRDataModel.log("Error creating GIF"); - } - }); - }, - function(err) - { - $ionicLoading.hide(); - NVRDataModel.log("Error getting frames"); - } + moveImageToGallery(ntp); + $rootScope.isDownloading = false; - ); - } + }, function (err) { + $rootScope.isDownloading = false; + $ionicLoading.hide(); + NVRDataModel.debug("error writing to file " + JSON.stringify(err)); - $scope.archiveUnarchiveEvent = function (ndx,eid) - { - //https://server/zm/api/events/11902.json -XPUT -d"Event[Archived]=1" - // - $ionicListDelegate.closeOptionButtons(); - NVRDataModel.debug ("Archiving request for EID="+eid); - var loginData = NVRDataModel.getLogin(); - var apiArchive = loginData.apiurl + "/events/" + eid + ".json"; - var setArchiveBit = ($scope.events[ndx].Event.Archived == '0') ? "1":"0"; + }); + } - NVRDataModel.debug ("Calling archive with:"+apiArchive+ " and Archive="+setArchiveBit); - //put(url, data, [config]); + }); + }); - // $http.put(apiArchive,"Event[Archived]="+setArchiveBit) - // - $ionicLoading.show( - { - template: "{{'kPleaseWait' | translate}}...", - noBackdrop: true, - duration: zm.httpTimeout - }); + }, + function (err) { + $ionicLoading.hide(); + NVRDataModel.setAwake(false); + NVRDataModel.log("Error getting frames"); + $rootScope.isDownloading = false; + } - $http({ + ); - method: 'POST', - headers: - { - 'Content-Type': 'application/x-www-form-urlencoded', - 'Accept': '*/*', - }, - transformRequest: function(obj) - { - var str = []; - for (var p in obj) - str.push(encodeURIComponent(p) + "=" + - encodeURIComponent(obj[p])); - var foo = str.join("&"); - // console.log("****RETURNING " + foo); - NVRDataModel.debug("MonitorCtrl: parmeters constructed: " + foo); - return foo; - }, - url: apiArchive, - data: { - "Event[Archived]":setArchiveBit + } + + // NOT USED - WILL REMOVE AFTER TESTING OTHER METHOD MORE + function downloadAsGif(e) { + $ionicLoading.show({ + template: $translate.instant('kPleaseWait') + "...", + noBackdrop: true, + duration: 20000 + }); + + prepareImages(e) + .then(function (imgs) { + + // console.log("TOTAL IMAGES TO GIF=" + imgs.length); + //console.log(JSON.stringify(imgs)); + + var ad = adjustAspect(e); + //console.log("SAVING W=" + ad.w + " H=" + ad.h); + NVRDataModel.setAwake(true); + gifshot.createGIF({ + + 'gifWidth': ad.w, + 'gifHeight': ad.h, + 'images': imgs, + 'interval': 1, + //'loop':null, + 'sampleInterval': 20, + //'frameDur':5, // 1/2 a sec + 'text': 'zmNinja', + 'crossOrigin': 'use-credentials', + 'progressCallback': function (cp) { + var p = Math.round(cp * 100); + $ionicLoading.show({ + template: $translate.instant('kPleaseWait') + "...(" + p + "%)", + noBackdrop: true + }); + } + }, function (obj) { + NVRDataModel.setAwake(false); + if (!obj.error) { + //console.log(obj.image); + + var blob; + + if ($rootScope.platformOS == 'desktop') { + + obj.image = obj.image.replace(/data:image\/gif;base64,/, ''); + blob = base64toBlob(obj.image, "image/gif"); + var f = NVRDataModel.getMonitorName(e.Event.MonitorId); + f = f + "-" + e.Event.Id + ".gif"; + saveAs(blob, f); + $ionicLoading.hide(); + } else { + NVRDataModel.debug("Saving blob to gallery..."); + var album = "zmNinja"; + cordova.plugins.photoLibrary.saveImage(obj.image, album, + function () { + $ionicLoading.hide(); + NVRDataModel.debug("Event saved"); + }, + function (err) { + $ionicLoading.hide(); + NVRDataModel.debug("Saving ERROR=" + err); + }); } - }) - .then (function (success) { - - NVRDataModel.log ("archiving response: "+ JSON.stringify(success)); - if (success.data.message == 'Error') - { - $ionicLoading.show( - { - template: "{{'kError' | translate}}...", - noBackdrop: true, - duration: 1500 - }); - - } - else - { - - - $ionicLoading.show( - { - template: "{{'kSuccess' | translate}}...", - noBackdrop: true, - duration: 1000 - }); - if ($scope.events[ndx].Event.Archived == '0') - $scope.events[ndx].Event.Archived = '1'; - else - $scope.events[ndx].Event.Archived = '0'; - } - + } else { + $ionicLoading.hide(); + NVRDataModel.log("Error creating GIF"); + } + }); + }, + function (err) { + $ionicLoading.hide(); + NVRDataModel.log("Error getting frames"); + } + + ); + } + + $scope.archiveUnarchiveEvent = function (ndx, eid) { + //https://server/zm/api/events/11902.json -XPUT -d"Event[Archived]=1" + // + $ionicListDelegate.closeOptionButtons(); + + NVRDataModel.debug("Archiving request for EID=" + eid); + var loginData = NVRDataModel.getLogin(); + var apiArchive = loginData.apiurl + "/events/" + eid + ".json"; + var setArchiveBit = ($scope.events[ndx].Event.Archived == '0') ? "1" : "0"; + + NVRDataModel.debug("Calling archive with:" + apiArchive + " and Archive=" + setArchiveBit); + //put(url, data, [config]); + + // $http.put(apiArchive,"Event[Archived]="+setArchiveBit) + // + $ionicLoading.show({ + template: "{{'kPleaseWait' | translate}}...", + noBackdrop: true, + duration: zm.httpTimeout + }); + + $http({ + + method: 'POST', + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + 'Accept': '*/*', + }, + transformRequest: function (obj) { + var str = []; + for (var p in obj) + str.push(encodeURIComponent(p) + "=" + + encodeURIComponent(obj[p])); + var foo = str.join("&"); + // console.log("****RETURNING " + foo); + NVRDataModel.debug("MonitorCtrl: parmeters constructed: " + foo); + return foo; + }, + url: apiArchive, + data: { + "Event[Archived]": setArchiveBit + + } + }) + .then(function (success) { + + NVRDataModel.log("archiving response: " + JSON.stringify(success)); + if (success.data.message == 'Error') { + $ionicLoading.show({ + template: "{{'kError' | translate}}...", + noBackdrop: true, + duration: 1500 + }); + + } else { + + + $ionicLoading.show({ + template: "{{'kSuccess' | translate}}...", + noBackdrop: true, + duration: 1000 + }); + if ($scope.events[ndx].Event.Archived == '0') + $scope.events[ndx].Event.Archived = '1'; + else + $scope.events[ndx].Event.Archived = '0'; + } + + + + }, + function (error) { + NVRDataModel.log("Error archiving: " + JSON.stringify(error)); + }); + - }, - function (error) { - NVRDataModel.log ("Error archiving: "+ JSON.stringify(error)); - } ); - - }; @@ -1849,130 +1651,115 @@ angular.module('zmApp.controllers') //-------------------------------------------------------------------------- - - $scope.deleteEvent = function(id, itemid) - { - deleteEvent(id,itemid); + + $scope.deleteEvent = function (id, itemid) { + deleteEvent(id, itemid); }; - function deleteEvent (id,itemid) { - //$scope.eventList.showDelete = false; - //curl -XDELETE http://server/zm/api/events/1.json - var loginData = NVRDataModel.getLogin(); - var apiDelete = loginData.apiurl + "/events/" + id + ".json"; - NVRDataModel.debug("DeleteEvent: ID=" + id + " item=" + itemid); - NVRDataModel.log("Delete event " + apiDelete); + function deleteEvent(id, itemid) { + //$scope.eventList.showDelete = false; + //curl -XDELETE http://server/zm/api/events/1.json + var loginData = NVRDataModel.getLogin(); + var apiDelete = loginData.apiurl + "/events/" + id + ".json"; + NVRDataModel.debug("DeleteEvent: ID=" + id + " item=" + itemid); + NVRDataModel.log("Delete event " + apiDelete); - $ionicLoading.show( - { - template: "{{'kDeletingEvent' | translate}}...", - noBackdrop: true, - duration: zm.httpTimeout - }); + $ionicLoading.show({ + template: "{{'kDeletingEvent' | translate}}...", + noBackdrop: true, + duration: zm.httpTimeout + }); - return $http.delete(apiDelete) - .success(function(data) - { - $ionicLoading.hide(); - NVRDataModel.debug("delete output: " + JSON.stringify(data)); + return $http.delete(apiDelete) + .success(function (data) { + $ionicLoading.hide(); + NVRDataModel.debug("delete output: " + JSON.stringify(data)); - if (data.message == 'Error') - { - $ionicLoading.show( - { - template: "{{'kError' | translate}}...", - noBackdrop: true, - duration: 1500 - }); + if (data.message == 'Error') { + $ionicLoading.show({ + template: "{{'kError' | translate}}...", + noBackdrop: true, + duration: 1500 + }); - } - else - { + } else { - $ionicLoading.hide(); - $ionicLoading.show( - { - template: "{{'kSuccess' | translate}}...", - noBackdrop: true, - duration: 1000 - }); - if (itemid > 0) $scope.events.splice(itemid, 1); - - } + $ionicLoading.hide(); + $ionicLoading.show({ + template: "{{'kSuccess' | translate}}...", + noBackdrop: true, + duration: 1000 + }); + if (itemid > 0) $scope.events.splice(itemid, 1); - // NVRDataModel.displayBanner('info', [$translate.instant('kDeleteEventSuccess')], 2000, 2000); + } - + // NVRDataModel.displayBanner('info', [$translate.instant('kDeleteEventSuccess')], 2000, 2000); - //doRefresh(); - }) - .error(function(data) - { - $ionicLoading.hide(); - NVRDataModel.debug("delete error: " + JSON.stringify(data)); - NVRDataModel.displayBanner('error', [$translate.instant('kDeleteEventError1'), $translate.instant('kDeleteEventError2')]); - }); + + //doRefresh(); + + }) + .error(function (data) { + $ionicLoading.hide(); + NVRDataModel.debug("delete error: " + JSON.stringify(data)); + NVRDataModel.displayBanner('error', [$translate.instant('kDeleteEventError1'), $translate.instant('kDeleteEventError2')]); + }); } //------------------------------------------------ // Tapping on the filter sign lets you reset it //------------------------------------------------- - $scope.filterTapped = function() - { - //console.log("FILTER TAPPED"); - var myFrom = moment($rootScope.fromString).format("MMM/DD/YYYY " + NVRDataModel.getTimeFormat()).toString(); - var toString = moment($rootScope.toString).format("MMM/DD/YYYY " + NVRDataModel.getTimeFormat()).toString(); - - $rootScope.zmPopup = $ionicPopup.confirm( - { - title: $translate.instant('kFilterSettings'), - template: $translate.instant('kFilterEventsBetween1') + ':<br/> <b>' + myFrom + "</b> " + $translate.instant('kTo') + " <b>" + toString + '</b><br/>' + $translate.instant('kFilterEventsBetween2'), - okText: $translate.instant('kButtonOk'), - cancelText: $translate.instant('kButtonCancel'), - }); - $rootScope.zmPopup.then(function(res) - { - if (res) - { - NVRDataModel.log("Filter reset requested in popup"); - $rootScope.isEventFilterOn = false; - $rootScope.fromDate = ""; - $rootScope.fromTime = ""; - $rootScope.toDate = ""; - $rootScope.toTime = ""; - $rootScope.fromString = ""; - $rootScope.toString = ""; - - $scope.id = 0; - $scope.showEvent = false; - $scope.footerState = ionPullUpFooterState.MINIMIZED; - getInitialEvents(); - - /* - $ionicHistory.nextViewOptions( - { - disableBack: true - }); - $state.go("app.events", - { - "id": 0, - "playEvent": false, - refresh:true - });*/ - - return; - } - else - { - NVRDataModel.log("Filter reset cancelled in popup"); - } - }); + $scope.filterTapped = function () { + //console.log("FILTER TAPPED"); + var myFrom = moment($rootScope.fromString).format("MMM/DD/YYYY " + NVRDataModel.getTimeFormat()).toString(); + var toString = moment($rootScope.toString).format("MMM/DD/YYYY " + NVRDataModel.getTimeFormat()).toString(); + + $rootScope.zmPopup = $ionicPopup.confirm({ + title: $translate.instant('kFilterSettings'), + template: $translate.instant('kFilterEventsBetween1') + ':<br/> <b>' + myFrom + "</b> " + $translate.instant('kTo') + " <b>" + toString + '</b><br/>' + $translate.instant('kFilterEventsBetween2'), + okText: $translate.instant('kButtonOk'), + cancelText: $translate.instant('kButtonCancel'), + }); + $rootScope.zmPopup.then(function (res) { + if (res) { + NVRDataModel.log("Filter reset requested in popup"); + $rootScope.isEventFilterOn = false; + $rootScope.fromDate = ""; + $rootScope.fromTime = ""; + $rootScope.toDate = ""; + $rootScope.toTime = ""; + $rootScope.fromString = ""; + $rootScope.toString = ""; + + $scope.id = 0; + $scope.showEvent = false; + $scope.footerState = ionPullUpFooterState.MINIMIZED; + getInitialEvents(); + + /* + $ionicHistory.nextViewOptions( + { + disableBack: true + }); + $state.go("app.events", + { + "id": 0, + "playEvent": false, + refresh:true + });*/ + + return; + } else { + NVRDataModel.log("Filter reset cancelled in popup"); + } + }); }; @@ -1981,268 +1768,224 @@ angular.module('zmApp.controllers') // data for events ranges summaries using the consolveEvents facility of ZM //-------------------------------------------------------------------------- - $scope.footerExpand = function() - { - footerExpand(); + $scope.footerExpand = function () { + footerExpand(); }; - function footerExpand() - { - //https://server/zm/api/events/consoleEvents/5%20minute.json - var ld = NVRDataModel.getLogin(); + function footerExpand() { + //https://server/zm/api/events/consoleEvents/5%20minute.json + var ld = NVRDataModel.getLogin(); - var af = "/AlarmFrames >=:" + (ld.enableAlarmCount ? ld.minAlarmCount : 0); + var af = "/AlarmFrames >=:" + (ld.enableAlarmCount ? ld.minAlarmCount : 0); - var apiurl = ld.apiurl + "/events/consoleEvents/1%20hour" + af + ".json"; - NVRDataModel.debug("consoleEvents API:" + apiurl); + var apiurl = ld.apiurl + "/events/consoleEvents/1%20hour" + af + ".json"; + NVRDataModel.debug("consoleEvents API:" + apiurl); - $http.get(apiurl) - .success(function(data) - { - NVRDataModel.debug(JSON.stringify(data)); - $scope.hours = []; - var p = data.results; - for (var key in data.results) - { + $http.get(apiurl) + .success(function (data) { + NVRDataModel.debug(JSON.stringify(data)); + $scope.hours = []; + var p = data.results; + for (var key in data.results) { - if (p.hasOwnProperty(key)) - { - - var idfound = true; - //console.log ("PERSIST IS " + ld.persistMontageOrder); - if (ld.persistMontageOrder) - { - idfound = false; - for (var ii = 0; ii < $scope.monitors.length; ii++) - { - if ($scope.monitors[ii].Monitor.Id == key && (NVRDataModel.isNotHidden(key) || showHiddenMonitors)) - { - // console.log ("Authorizing "+$scope.monitors[ii].Monitor.Name); - idfound = true; - break; - } - } - } - //console.log(NVRDataModel.getMonitorName(key) + " -> " + p[key]); - if (idfound) - $scope.hours.push( - { - monitor: NVRDataModel.getMonitorName(key), - events: p[key], - mid: key - }); + if (p.hasOwnProperty(key)) { - } + var idfound = true; + //console.log ("PERSIST IS " + ld.persistMontageOrder); + if (ld.persistMontageOrder) { + idfound = false; + for (var ii = 0; ii < $scope.monitors.length; ii++) { + if ($scope.monitors[ii].Monitor.Id == key && (NVRDataModel.isNotHidden(key) || showHiddenMonitors)) { + // console.log ("Authorizing "+$scope.monitors[ii].Monitor.Name); + idfound = true; + break; + } } - }); + } + //console.log(NVRDataModel.getMonitorName(key) + " -> " + p[key]); + if (idfound) + $scope.hours.push({ + monitor: NVRDataModel.getMonitorName(key), + events: p[key], + mid: key + }); - apiurl = ld.apiurl + "/events/consoleEvents/1%20day" + af + ".json"; - NVRDataModel.debug("consoleEvents API:" + apiurl); - $http.get(apiurl) - .success(function(data) - { - NVRDataModel.debug(JSON.stringify(data)); - $scope.days = []; - var p = data.results; - for (var key in data.results) - { - if (p.hasOwnProperty(key)) - { - var idfound = true; - if (ld.persistMontageOrder) - { - idfound = false; - for (var ii = 0; ii < $scope.monitors.length; ii++) - { - if ($scope.monitors[ii].Monitor.Id == key && (NVRDataModel.isNotHidden(key) || showHiddenMonitors)) - { - idfound = true; - break; - } - } - } - //console.log(NVRDataModel.getMonitorName(key) + " -> " + p[key]); - if (idfound) - //console.log(NVRDataModel.getMonitorName(key) + " -> " + p[key]); - $scope.days.push( - { - monitor: NVRDataModel.getMonitorName(key), - events: p[key], - mid: key - }); + } + } + }); - } + apiurl = ld.apiurl + "/events/consoleEvents/1%20day" + af + ".json"; + NVRDataModel.debug("consoleEvents API:" + apiurl); + $http.get(apiurl) + .success(function (data) { + NVRDataModel.debug(JSON.stringify(data)); + $scope.days = []; + var p = data.results; + for (var key in data.results) { + if (p.hasOwnProperty(key)) { + var idfound = true; + if (ld.persistMontageOrder) { + idfound = false; + for (var ii = 0; ii < $scope.monitors.length; ii++) { + if ($scope.monitors[ii].Monitor.Id == key && (NVRDataModel.isNotHidden(key) || showHiddenMonitors)) { + idfound = true; + break; + } } - }); + } + //console.log(NVRDataModel.getMonitorName(key) + " -> " + p[key]); + if (idfound) + //console.log(NVRDataModel.getMonitorName(key) + " -> " + p[key]); + $scope.days.push({ + monitor: NVRDataModel.getMonitorName(key), + events: p[key], + mid: key + }); - apiurl = ld.apiurl + "/events/consoleEvents/1%20week" + af + ".json"; - NVRDataModel.debug("consoleEvents API:" + apiurl); - $http.get(apiurl) - .success(function(data) - { - NVRDataModel.debug(JSON.stringify(data)); - $scope.weeks = []; - var p = data.results; - for (var key in data.results) - { - if (p.hasOwnProperty(key)) - { - - var idfound = true; - if (ld.persistMontageOrder) - { - idfound = false; - for (var ii = 0; ii < $scope.monitors.length; ii++) - { - if ($scope.monitors[ii].Monitor.Id == key && (NVRDataModel.isNotHidden(key) || showHiddenMonitors)) - { - idfound = true; - break; - } - } - } - //console.log(NVRDataModel.getMonitorName(key) + " -> " + p[key]); - if (idfound) - //console.log(NVRDataModel.getMonitorName(key) + " -> " + p[key]); - $scope.weeks.push( - { - monitor: NVRDataModel.getMonitorName(key), - events: p[key], - mid: key - }); + } + } + }); - } + apiurl = ld.apiurl + "/events/consoleEvents/1%20week" + af + ".json"; + NVRDataModel.debug("consoleEvents API:" + apiurl); + $http.get(apiurl) + .success(function (data) { + NVRDataModel.debug(JSON.stringify(data)); + $scope.weeks = []; + var p = data.results; + for (var key in data.results) { + if (p.hasOwnProperty(key)) { + + var idfound = true; + if (ld.persistMontageOrder) { + idfound = false; + for (var ii = 0; ii < $scope.monitors.length; ii++) { + if ($scope.monitors[ii].Monitor.Id == key && (NVRDataModel.isNotHidden(key) || showHiddenMonitors)) { + idfound = true; + break; + } } - }); + } + //console.log(NVRDataModel.getMonitorName(key) + " -> " + p[key]); + if (idfound) + //console.log(NVRDataModel.getMonitorName(key) + " -> " + p[key]); + $scope.weeks.push({ + monitor: NVRDataModel.getMonitorName(key), + events: p[key], + mid: key + }); - apiurl = ld.apiurl + "/events/consoleEvents/1%20month" + af + ".json"; - NVRDataModel.debug("consoleEvents API:" + apiurl); - $http.get(apiurl) - .success(function(data) - { - NVRDataModel.debug(JSON.stringify(data)); - $scope.months = []; - var p = data.results; - for (var key in data.results) - { - if (p.hasOwnProperty(key)) - { - - var idfound = true; - var ld = NVRDataModel.getLogin(); - if (ld.persistMontageOrder) - { - idfound = false; - for (var ii = 0; ii < $scope.monitors.length; ii++) - { - if ($scope.monitors[ii].Monitor.Id == key && (NVRDataModel.isNotHidden(key) || showHiddenMonitors)) - { - idfound = true; - break; - } - } - } - //console.log(NVRDataModel.getMonitorName(key) + " -> " + p[key]); - if (idfound) - //console.log(NVRDataModel.getMonitorName(key) + " -> " + p[key]); - $scope.months.push( - { - monitor: NVRDataModel.getMonitorName(key), - events: p[key], - mid: key - }); + } + } + }); - } + apiurl = ld.apiurl + "/events/consoleEvents/1%20month" + af + ".json"; + NVRDataModel.debug("consoleEvents API:" + apiurl); + $http.get(apiurl) + .success(function (data) { + NVRDataModel.debug(JSON.stringify(data)); + $scope.months = []; + var p = data.results; + for (var key in data.results) { + if (p.hasOwnProperty(key)) { + + var idfound = true; + var ld = NVRDataModel.getLogin(); + if (ld.persistMontageOrder) { + idfound = false; + for (var ii = 0; ii < $scope.monitors.length; ii++) { + if ($scope.monitors[ii].Monitor.Id == key && (NVRDataModel.isNotHidden(key) || showHiddenMonitors)) { + idfound = true; + break; + } } - }); + } + //console.log(NVRDataModel.getMonitorName(key) + " -> " + p[key]); + if (idfound) + //console.log(NVRDataModel.getMonitorName(key) + " -> " + p[key]); + $scope.months.push({ + monitor: NVRDataModel.getMonitorName(key), + events: p[key], + mid: key + }); + + } + } + }); } - $scope.openMenu = function() - { - $ionicSideMenuDelegate.toggleLeft(); + $scope.openMenu = function () { + $ionicSideMenuDelegate.toggleLeft(); }; - $scope.scrollPosition = function() - { - if (!$ionicScrollDelegate.$getByHandle("mainScroll")) return ""; - if (!$ionicScrollDelegate.$getByHandle("mainScroll").getScrollPosition()) return ""; - var scrl = parseFloat($ionicScrollDelegate.$getByHandle("mainScroll").getScrollPosition().top); - var item = Math.round(scrl / eventsListDetailsHeight); - if ($scope.events == undefined || !$scope.events.length || $scope.events[item] == undefined) - { - return ""; - } - else - { - //return prettifyDate($scope.events[item].Event.StartTime); - return ($scope.events[item].Event.humanizeTime); - } - //return Math.random(); + $scope.scrollPosition = function () { + if (!$ionicScrollDelegate.$getByHandle("mainScroll")) return ""; + if (!$ionicScrollDelegate.$getByHandle("mainScroll").getScrollPosition()) return ""; + var scrl = parseFloat($ionicScrollDelegate.$getByHandle("mainScroll").getScrollPosition().top); + var item = Math.round(scrl / eventsListDetailsHeight); + if ($scope.events == undefined || !$scope.events.length || $scope.events[item] == undefined) { + return ""; + } else { + //return prettifyDate($scope.events[item].Event.StartTime); + return ($scope.events[item].Event.humanizeTime); + } + //return Math.random(); }; //------------------------------------------------------------------------- // called when user switches to background //------------------------------------------------------------------------- - function onPause() - { - NVRDataModel.debug("EventCtrl:onpause called"); - if ($scope.popover) $scope.popover.remove(); - NVRDataModel.debug ("EventCtrl Pause:Deregistering broadcast handles"); - for (var i=0; i < broadcastHandles.length; i++) { - // broadcastHandles[i](); - } - broadcastHandles = []; + function onPause() { + NVRDataModel.debug("EventCtrl:onpause called"); + if ($scope.popover) $scope.popover.remove(); + NVRDataModel.debug("EventCtrl Pause:Deregistering broadcast handles"); + for (var i = 0; i < broadcastHandles.length; i++) { + // broadcastHandles[i](); + } + broadcastHandles = []; } //------------------------------------------------------------------------- // Pads the filename with leading 0s, depending on ZM_IMAGE_DIGITS //------------------------------------------------------------------------- - function padToN(number, digits) - { - - var i; - var stringMax = ""; - var stringLeading = ""; - for (i = 1; i <= digits; i++) - { - stringMax = stringMax + "9"; - if (i != digits) stringLeading = stringLeading + "0"; - } - var numMax = parseInt(stringMax); - - if (number <= numMax) - { - number = (stringLeading + number).slice(-digits); - } - //console.log ("PADTON: returning " + number); - return number; + function padToN(number, digits) { + + var i; + var stringMax = ""; + var stringLeading = ""; + for (i = 1; i <= digits; i++) { + stringMax = stringMax + "9"; + if (i != digits) stringLeading = stringLeading + "0"; + } + var numMax = parseInt(stringMax); + + if (number <= numMax) { + number = (stringLeading + number).slice(-digits); + } + //console.log ("PADTON: returning " + number); + return number; } //------------------------------------------------------------------------- // FIXME: Are we using this? //------------------------------------------------------------------------- - $scope.disableSlide = function() - { - NVRDataModel.debug("EventCtrl:DisableSlide called"); - $ionicSlideBoxDelegate.$getByHandle("eventSlideBox").enableSlide(false); + $scope.disableSlide = function () { + NVRDataModel.debug("EventCtrl:DisableSlide called"); + $ionicSlideBoxDelegate.$getByHandle("eventSlideBox").enableSlide(false); }; - $scope.checkSwipe = function (ndx) - { - if ($scope.events[ndx].Event.ShowScrub) - { - $ionicListDelegate.canSwipeItems(false); - NVRDataModel.debug ("disabling options swipe"); - } - else - { - $ionicListDelegate.canSwipeItems(true); - NVRDataModel.debug ("enabling options swipe"); - } - + $scope.checkSwipe = function (ndx) { + if ($scope.events[ndx].Event.ShowScrub) { + $ionicListDelegate.canSwipeItems(false); + NVRDataModel.debug("disabling options swipe"); + } else { + $ionicListDelegate.canSwipeItems(true); + NVRDataModel.debug("enabling options swipe"); + } + }; //------------------------------------------------------------------------- @@ -2250,409 +1993,357 @@ angular.module('zmApp.controllers') // scrub view for an event. //------------------------------------------------------------------------- - $scope.toggleGroupScrub = function(event, ndx, frames) - { - $scope.groupType = "scrub"; - toggleGroup(event, ndx, frames, $scope.groupType); + $scope.toggleGroupScrub = function (event, ndx, frames) { + $scope.groupType = "scrub"; + toggleGroup(event, ndx, frames, $scope.groupType); }; - $scope.toggleGroupAlarms = function(event, ndx, frames) - { - $scope.groupType = "alarms"; - toggleGroup(event, ndx, frames, $scope.groupType); + $scope.toggleGroupAlarms = function (event, ndx, frames) { + $scope.groupType = "alarms"; + toggleGroup(event, ndx, frames, $scope.groupType); }; - function toggleGroup(event, ndx, frames, groupType) - { - + function toggleGroup(event, ndx, frames, groupType) { - // If we are here and there is a record of a previous scroll - // then we need to scroll back to hide that view - if (scrollbynumber) - { - $ionicScrollDelegate.$getByHandle("mainScroll").scrollBy(0, -1 * scrollbynumber, true); - scrollbynumber = 0; - } - if (oldEvent && event != oldEvent) - { + // If we are here and there is a record of a previous scroll + // then we need to scroll back to hide that view + if (scrollbynumber) { + $ionicScrollDelegate.$getByHandle("mainScroll").scrollBy(0, -1 * scrollbynumber, true); + scrollbynumber = 0; + } - NVRDataModel.debug("EventCtrl:Old event scrub will hide now"); - oldEvent.Event.ShowScrub = false; - oldEvent.Event.height = eventsListDetailsHeight; - oldEvent = ""; - } + if (oldEvent && event != oldEvent) { - event.Event.ShowScrub = !event.Event.ShowScrub; + NVRDataModel.debug("EventCtrl:Old event scrub will hide now"); + oldEvent.Event.ShowScrub = false; + oldEvent.Event.height = eventsListDetailsHeight; + oldEvent = ""; + } - if (event.Event.ShowScrub == false) - { - $ionicListDelegate.canSwipeItems(true); - NVRDataModel.debug ("enabling options swipe due to toggle"); - } + event.Event.ShowScrub = !event.Event.ShowScrub; - else - { - $ionicListDelegate.canSwipeItems(false); - $ionicListDelegate.closeOptionButtons(); - NVRDataModel.debug ("disabling options swipe due to toggle"); + if (event.Event.ShowScrub == false) { + $ionicListDelegate.canSwipeItems(true); + NVRDataModel.debug("enabling options swipe due to toggle"); + } else { + $ionicListDelegate.canSwipeItems(false); + $ionicListDelegate.closeOptionButtons(); + NVRDataModel.debug("disabling options swipe due to toggle"); - } + } - //console.log ("SCRUBBING IS "+event.Event.ShowScrub); - // $ionicScrollDelegate.resize(); + //console.log ("SCRUBBING IS "+event.Event.ShowScrub); + // $ionicScrollDelegate.resize(); - //console.log ("GROUP TYPE IS " + groupType); + //console.log ("GROUP TYPE IS " + groupType); - if (event.Event.ShowScrub == true) // turn on display now - { - - - if (groupType == 'alarms') - { - // $ionicListDelegate.canSwipeItems(false); - //NVRDataModel.debug ("Disabling flag swipe as alarms are swipable"); - $scope.alarm_images = []; - event.Event.height = (eventsListDetailsHeight + eventsListScrubHeight); - $ionicScrollDelegate.resize(); - var myurl = loginData.apiurl + '/events/' + event.Event.Id + ".json"; - NVRDataModel.log("API for event details" + myurl); - $http.get(myurl) - .success(function(data) - { - $scope.FrameArray = data.event.Frame; - // $scope.slider_options.scale=[]; - - //$scope.slider_options.scale = []; - - var i; - var timestamp = null; - for (i = 0; i < data.event.Frame.length; i++) - { - if (data.event.Frame[i].Type == "Alarm") - { - - //console.log ("**ONLY ALARM AT " + i + "of " + data.event.Frame.length); - var atype; - if (timestamp != data.event.Frame[i].TimeStamp) - { - - atype = $translate.instant('kShowTimeDiffFrames'); - } - else - { - atype = $translate.instant('kShowAllFrames'); - } - $scope.alarm_images.push( - { - type: atype, - id: data.event.Frame[i].Id, - frameid: data.event.Frame[i].FrameId, - score: data.event.Frame[i].Score, - fname: padToN(data.event.Frame[i].FrameId, eventImageDigits) + "-capture.jpg", - aname:padToN(data.event.Frame[i].FrameId, eventImageDigits) + "-analyse.jpg", - time: data.event.Frame[i].TimeStamp - }); - timestamp = data.event.Frame[i].TimeStamp; - } - - } - oldEvent = event; - - //console.log (JSON.stringify(data)); - }) - .error(function(err) - { - NVRDataModel.log("Error retrieving detailed frame API " + JSON.stringify(err)); - NVRDataModel.displayBanner('error', ['could not retrieve frame details', 'please try again']); - }); + if (event.Event.ShowScrub == true) // turn on display now + { - } // end of groupType == alarms - else // groupType == scrub - { - - NVRDataModel.debug("EventCtrl: Scrubbing will turn on now"); - $scope.currentEvent = ""; - $scope.event = event; - //$ionicScrollDelegate.freezeScroll(true); - $ionicSideMenuDelegate.canDragContent(false); - $scope.slider_options = { - from: 1, - to: event.Event.Frames, - realtime: true, - step: 1, - className: "mySliderClass", - callback: function(value, released) - { - //console.log("CALLBACK"+value+released); - $ionicScrollDelegate.freezeScroll(!released); - //NVRDataModel.debug("EventCtrl: freezeScroll called with " + !released); - }, - //modelLabels:function(val) {return "";}, - css: - { - background: - { - "background-color": "silver" - }, - before: - { - "background-color": "purple" - }, - default: - { - "background-color": "white" - }, // default value: 1px - after: - { - "background-color": "green" - }, // zone after default value - pointer: - { - "background-color": "red" - }, // circle pointer - range: - { - "background-color": "red" - } // use it if double value - }, - scale: [] + if (groupType == 'alarms') { + // $ionicListDelegate.canSwipeItems(false); + //NVRDataModel.debug ("Disabling flag swipe as alarms are swipable"); + $scope.alarm_images = []; + event.Event.height = (eventsListDetailsHeight + eventsListScrubHeight); + $ionicScrollDelegate.resize(); + var myurl = loginData.apiurl + '/events/' + event.Event.Id + ".json"; + NVRDataModel.log("API for event details" + myurl); + $http.get(myurl) + .success(function (data) { + $scope.FrameArray = data.event.Frame; + // $scope.slider_options.scale=[]; - }; + //$scope.slider_options.scale = []; - event.Event.height = (eventsListDetailsHeight + eventsListScrubHeight); - $ionicScrollDelegate.resize(); - $scope.mycarousel.index = 0; - $scope.ionRange.index = 1; - //console.log("**Resetting range"); - $scope.slides = []; - var i; + var i; + var timestamp = null; + for (i = 0; i < data.event.Frame.length; i++) { + if (data.event.Frame[i].Type == "Alarm") { - if (event.Event.imageMode == 'path') - { - NVRDataModel.debug("EventCtrl: found " + frames + " frames to scrub"); + //console.log ("**ONLY ALARM AT " + i + "of " + data.event.Frame.length); + var atype; + if (timestamp != data.event.Frame[i].TimeStamp) { - for (i = 1; i <= frames; i++) - { - var fname = padToN(i, eventImageDigits) + "-capture.jpg"; + atype = $translate.instant('kShowTimeDiffFrames'); + } else { + atype = $translate.instant('kShowAllFrames'); + } + $scope.alarm_images.push({ + type: atype, + id: data.event.Frame[i].Id, + frameid: data.event.Frame[i].FrameId, + score: data.event.Frame[i].Score, + fname: padToN(data.event.Frame[i].FrameId, eventImageDigits) + "-capture.jpg", + aname: padToN(data.event.Frame[i].FrameId, eventImageDigits) + "-analyse.jpg", + time: data.event.Frame[i].TimeStamp + }); + timestamp = data.event.Frame[i].TimeStamp; + } - $scope.slides.push( - { - id: i, - img: fname - }); + } + oldEvent = event; - } - } - else // we need fids - { - var myurl_frames = loginData.apiurl + '/events/' + event.Event.Id + ".json"; - NVRDataModel.log("API for event details" + myurl_frames); - $http.get(myurl_frames) - .success(function(data) - { - $scope.FrameArray = data.event.Frame; - // $scope.slider_options.scale=[]; - - //$scope.slider_options.scale = []; - - var i; - for (i = 0; i < data.event.Frame.length; i++) - { - - //console.log ("**ONLY ALARM AT " + i + "of " + data.event.Frame.length); - $scope.slides.push( - { - id: data.event.Frame[i].Id, - frameid: data.event.Frame[i].FrameId, - - }); - - } - - //console.log (JSON.stringify(data)); - }) - .error(function(err) - { - NVRDataModel.log("Error retrieving detailed frame API " + JSON.stringify(err)); - NVRDataModel.displayBanner('error', [$translate.instant('kErrorFrameBanner'), $translate.instant('kErrorPleaseTryAgain')]); - }); + //console.log (JSON.stringify(data)); + }) + .error(function (err) { + NVRDataModel.log("Error retrieving detailed frame API " + JSON.stringify(err)); + NVRDataModel.displayBanner('error', ['could not retrieve frame details', 'please try again']); + }); + + } // end of groupType == alarms + else // groupType == scrub + { + + NVRDataModel.debug("EventCtrl: Scrubbing will turn on now"); + $scope.currentEvent = ""; + $scope.event = event; + //$ionicScrollDelegate.freezeScroll(true); + $ionicSideMenuDelegate.canDragContent(false); + $scope.slider_options = { + from: 1, + to: event.Event.Frames, + realtime: true, + step: 1, + className: "mySliderClass", + callback: function (value, released) { + //console.log("CALLBACK"+value+released); + $ionicScrollDelegate.freezeScroll(!released); + //NVRDataModel.debug("EventCtrl: freezeScroll called with " + !released); + + }, + //modelLabels:function(val) {return "";}, + css: { + background: { + "background-color": "silver" + }, + before: { + "background-color": "purple" + }, + default: { + "background-color": "white" + }, // default value: 1px + after: { + "background-color": "green" + }, // zone after default value + pointer: { + "background-color": "red" + }, // circle pointer + range: { + "background-color": "red" + } // use it if double value + }, + scale: [] + + }; + + event.Event.height = (eventsListDetailsHeight + eventsListScrubHeight); + $ionicScrollDelegate.resize(); + $scope.mycarousel.index = 0; + $scope.ionRange.index = 1; + //console.log("**Resetting range"); + $scope.slides = []; + var i; + + if (event.Event.imageMode == 'path') { + NVRDataModel.debug("EventCtrl: found " + frames + " frames to scrub"); + + for (i = 1; i <= frames; i++) { + var fname = padToN(i, eventImageDigits) + "-capture.jpg"; + + $scope.slides.push({ + id: i, + img: fname + }); + + } + } else // we need fids + { + var myurl_frames = loginData.apiurl + '/events/' + event.Event.Id + ".json"; + NVRDataModel.log("API for event details" + myurl_frames); + $http.get(myurl_frames) + .success(function (data) { + $scope.FrameArray = data.event.Frame; + // $scope.slider_options.scale=[]; + + //$scope.slider_options.scale = []; + + var i; + for (i = 0; i < data.event.Frame.length; i++) { + + //console.log ("**ONLY ALARM AT " + i + "of " + data.event.Frame.length); + $scope.slides.push({ + id: data.event.Frame[i].Id, + frameid: data.event.Frame[i].FrameId, + + }); } - // now get event details to show alarm frames - loginData = NVRDataModel.getLogin(); - - if (typeof event.Event.DefaultVideo === 'undefined') - event.Event.DefaultVideo = ""; - // grab video details - event.Event.video = {}; - var videoURL; - - //if (event.Event.imageMode == 'path') - - /* videoURL = event.Event.baseURL + "/events/" + event.Event.relativePath + event.Event.DefaultVideo;*/ - videoURL = event.Event.baseURL + "/index.php?view=view_video&eid=" + event.Event.Id; - if ($rootScope.authSession != 'undefined') videoURL +=$rootScope.authSession; - videoURL+=NVRDataModel.insertBasicAuthToken(); - - - console.log("************** VIDEO IS " + videoURL); - event.Event.video.config = { - autoPlay: true, - sources: [ - { - src: $sce.trustAsResourceUrl(videoURL), - type: "video/mp4" - } - - ], - - theme: "lib/videogular-themes-default/videogular.css", + //console.log (JSON.stringify(data)); + }) + .error(function (err) { + NVRDataModel.log("Error retrieving detailed frame API " + JSON.stringify(err)); + NVRDataModel.displayBanner('error', [$translate.instant('kErrorFrameBanner'), $translate.instant('kErrorPleaseTryAgain')]); + }); - }; + } - var myurl2 = loginData.apiurl + '/events/' + event.Event.Id + ".json"; - NVRDataModel.log("API for event details" + myurl2); - $http.get(myurl2) - .success(function(data) - { - $scope.FrameArray = data.event.Frame; - // $scope.slider_options.scale=[]; - $scope.slider_options.scale = []; - - var i; - for (i = 0; i < data.event.Frame.length; i++) - { - if (data.event.Frame[i].Type == "Alarm") - { - - //console.log ("**ALARM AT " + i + "of " + data.event.Frame.length); - $scope.slider_options.scale.push( - { - val: data.event.Frame[i].FrameId, - label: ' ' - }); - } - else - { - //$scope.slider_options.scale.push(' '); - } - - } - - //console.log (JSON.stringify(data)); - }) - .error(function(err) - { - NVRDataModel.log("Error retrieving detailed frame API " + JSON.stringify(err)); - NVRDataModel.displayBanner('error', [$translate.instant('kErrorFrameBanner'), $translate.instant('kErrorPleaseTryAgain')]); - }); + // now get event details to show alarm frames + loginData = NVRDataModel.getLogin(); - oldEvent = event; - $rootScope.rand = Math.floor(Math.random() * (999999 - 111111 + 1)) + 111111; - var elem = angular.element(document.getElementById("item-" + ndx)); - var locobject = $ionicPosition.offset(elem); - //console.log(JSON.stringify(locobject)); - var toplocation = parseInt(locobject.top); - var objheight = parseInt(locobject.height); - // console.log("top location is " + toplocation); - var distdiff = parseInt($rootScope.devHeight) - toplocation - objheight; - // console.log("*****Space at bottom is " + distdiff); - - if (distdiff < eventsListScrubHeight) // size of the scroller with bars - { - scrollbynumber = eventsListScrubHeight - distdiff; - $ionicScrollDelegate.$getByHandle("mainScroll").scrollBy(0, scrollbynumber, true); + if (typeof event.Event.DefaultVideo === 'undefined') + event.Event.DefaultVideo = ""; + // grab video details + event.Event.video = {}; + var videoURL; + + //if (event.Event.imageMode == 'path') + + /* videoURL = event.Event.baseURL + "/events/" + event.Event.relativePath + event.Event.DefaultVideo;*/ + videoURL = event.Event.baseURL + "/index.php?view=view_video&eid=" + event.Event.Id; + if ($rootScope.authSession != 'undefined') videoURL += $rootScope.authSession; + videoURL += NVRDataModel.insertBasicAuthToken(); + + + console.log("************** VIDEO IS " + videoURL); + event.Event.video.config = { + autoPlay: true, + sources: [{ + src: $sce.trustAsResourceUrl(videoURL), + type: "video/mp4" + } + + ], + + theme: "lib/videogular-themes-default/videogular.css", + + }; + + var myurl2 = loginData.apiurl + '/events/' + event.Event.Id + ".json"; + NVRDataModel.log("API for event details" + myurl2); + $http.get(myurl2) + .success(function (data) { + $scope.FrameArray = data.event.Frame; + // $scope.slider_options.scale=[]; + $scope.slider_options.scale = []; + + var i; + for (i = 0; i < data.event.Frame.length; i++) { + if (data.event.Frame[i].Type == "Alarm") { - // we need to scroll up to make space + //console.log ("**ALARM AT " + i + "of " + data.event.Frame.length); + $scope.slider_options.scale.push({ + val: data.event.Frame[i].FrameId, + label: ' ' + }); + } else { + //$scope.slider_options.scale.push(' '); } - } // end of groupType == scrub - } // end of ShowScrub == true - else - { - // $ionicScrollDelegate.freezeScroll(false); - // - // $ionicListDelegate.canSwipeItems(true); - // NVRDataModel.debug ("enabling options swipe"); - - $ionicSideMenuDelegate.canDragContent(true); - event.Event.height = eventsListDetailsHeight; - $ionicScrollDelegate.resize(); - - if (scrollbynumber) - { - $ionicScrollDelegate.$getByHandle("mainScroll").scrollBy(0, -1 * scrollbynumber, true); - scrollbynumber = 0; - } - // we are turning off, so scroll by back + } + + //console.log (JSON.stringify(data)); + }) + .error(function (err) { + NVRDataModel.log("Error retrieving detailed frame API " + JSON.stringify(err)); + NVRDataModel.displayBanner('error', [$translate.instant('kErrorFrameBanner'), $translate.instant('kErrorPleaseTryAgain')]); + }); + + oldEvent = event; + $rootScope.rand = Math.floor(Math.random() * (999999 - 111111 + 1)) + 111111; + var elem = angular.element(document.getElementById("item-" + ndx)); + var locobject = $ionicPosition.offset(elem); + //console.log(JSON.stringify(locobject)); + var toplocation = parseInt(locobject.top); + var objheight = parseInt(locobject.height); + // console.log("top location is " + toplocation); + var distdiff = parseInt($rootScope.devHeight) - toplocation - objheight; + // console.log("*****Space at bottom is " + distdiff); + + if (distdiff < eventsListScrubHeight) // size of the scroller with bars + { + scrollbynumber = eventsListScrubHeight - distdiff; + $ionicScrollDelegate.$getByHandle("mainScroll").scrollBy(0, scrollbynumber, true); + + // we need to scroll up to make space + } + + } // end of groupType == scrub + } // end of ShowScrub == true + else { + // $ionicScrollDelegate.freezeScroll(false); + // + // $ionicListDelegate.canSwipeItems(true); + // NVRDataModel.debug ("enabling options swipe"); + + $ionicSideMenuDelegate.canDragContent(true); + event.Event.height = eventsListDetailsHeight; + $ionicScrollDelegate.resize(); + + if (scrollbynumber) { + $ionicScrollDelegate.$getByHandle("mainScroll").scrollBy(0, -1 * scrollbynumber, true); + scrollbynumber = 0; } + // we are turning off, so scroll by back + } } - $scope.closeIfOpen = function(event) - { - if (event != undefined) - { - if (event.Event.ShowScrub) - toggleGroup(event); + $scope.closeIfOpen = function (event) { + if (event != undefined) { + if (event.Event.ShowScrub) + toggleGroup(event); - } + } }; - $scope.isGroupShown = function(event) - { - // console.log ("IS SHOW INDEX is " + ndx); - //console.log ("SHOW GROUP IS " + showGroup); + $scope.isGroupShown = function (event) { + // console.log ("IS SHOW INDEX is " + ndx); + //console.log ("SHOW GROUP IS " + showGroup); - return (event == undefined) ? false : event.Event.ShowScrub; + return (event == undefined) ? false : event.Event.ShowScrub; }; //--------------------------------------------------- // reload view //--------------------------------------------------- - $scope.reloadView = function() - { - // All we really need to do here is change the random token - // in the image src and it will refresh. No need to reload the view - // and if you did reload the view, it would go back to events list - // which is the view - and when you are in the modal it will go away - //console.log("*** Refreshing Modal view ***"); - //$state.go($state.current, {}, {reload: true}); - $rootScope.rand = Math.floor(Math.random() * (999999 - 111111 + 1)) + 111111; - $ionicLoading.show( - { - template: $translate.instant('kRefreshedView'), - noBackdrop: true, - duration: 3000 - }); + $scope.reloadView = function () { + // All we really need to do here is change the random token + // in the image src and it will refresh. No need to reload the view + // and if you did reload the view, it would go back to events list + // which is the view - and when you are in the modal it will go away + //console.log("*** Refreshing Modal view ***"); + //$state.go($state.current, {}, {reload: true}); + $rootScope.rand = Math.floor(Math.random() * (999999 - 111111 + 1)) + 111111; + $ionicLoading.show({ + template: $translate.instant('kRefreshedView'), + noBackdrop: true, + duration: 3000 + }); }; //--------------------------------------------------- // when you tap a list entry - to break search loop //--------------------------------------------------- - $scope.tapped = function() - { - // console.log("*** TAPPED ****"); - // if he tapped, the we are not infinite loading on ion-infinite - if (enableLoadMore == false) - { - moreEvents = true; - enableLoadMore = true; - // console.log("REMOVING ARTIFICAL LOAD MORE BLOCK"); - } + $scope.tapped = function () { + // console.log("*** TAPPED ****"); + // if he tapped, the we are not infinite loading on ion-infinite + if (enableLoadMore == false) { + moreEvents = true; + enableLoadMore = true; + // console.log("REMOVING ARTIFICAL LOAD MORE BLOCK"); + } }; - $scope.$on('$ionicView.loaded', function() - { - // console.log("**VIEW ** Events Ctrl Loaded"); + $scope.$on('$ionicView.loaded', function () { + // console.log("**VIEW ** Events Ctrl Loaded"); }); //------------------------------------------------------------------------- @@ -2662,117 +2353,102 @@ angular.module('zmApp.controllers') // reset power state on exit as if it is called after we enter another // state, that effectively overwrites current view power management needs //------------------------------------------------------------------------ - $scope.$on('$ionicView.enter', function() - { - // console.log("**VIEW ** Events Ctrl Entered"); - NVRDataModel.setAwake(false); - - EventServer.sendMessage('push', - { - type: 'badge', - badge: 0, - }); - - $ionicPopover.fromTemplateUrl('templates/events-popover.html', - { - scope: $scope, - }).then(function(popover) - { - $scope.popover = popover; + $scope.$on('$ionicView.enter', function () { + // console.log("**VIEW ** Events Ctrl Entered"); + NVRDataModel.setAwake(false); + + EventServer.sendMessage('push', { + type: 'badge', + badge: 0, + }); + + $ionicPopover.fromTemplateUrl('templates/events-popover.html', { + scope: $scope, + }).then(function (popover) { + $scope.popover = popover; + }); + + //reset badge count + if (window.cordova && window.cordova.plugins.notification) { + $cordovaBadge.set(0).then(function () { + // You have permission, badge set. + }, function (err) { + NVRDataModel.debug("app does not have badge permissions. Please check your phone notification settings"); + // You do not have permission. }); - //reset badge count - if (window.cordova && window.cordova.plugins.notification) - { - $cordovaBadge.set(0).then(function() - { - // You have permission, badge set. - }, function(err) - { - NVRDataModel.debug("app does not have badge permissions. Please check your phone notification settings"); - // You do not have permission. - }); - - $cordovaLocalNotification.clearAll(); - } + $cordovaLocalNotification.clearAll(); + } }); - $scope.$on('$ionicView.leave', function() - { - //console.log("**VIEW ** Events Ctrl Left"); + $scope.$on('$ionicView.leave', function () { + //console.log("**VIEW ** Events Ctrl Left"); }); - $scope.$on('$ionicView.unloaded', function() - { - //console.log("**VIEW ** Events Ctrl Unloaded"); - //console.log("*** MODAL ** Destroying modal too"); - if ($scope.modal !== undefined) - { - $scope.modal.remove(); - } + $scope.$on('$ionicView.unloaded', function () { + //console.log("**VIEW ** Events Ctrl Unloaded"); + //console.log("*** MODAL ** Destroying modal too"); + if ($scope.modal !== undefined) { + $scope.modal.remove(); + } }); //--------------------------------------------------- // used to hide loading image toast //--------------------------------------------------- - $scope.finishedLoadingImage = function(ndx) - { - // console.log("*** Events image FINISHED loading index: "+ndx+"***"); - $ionicLoading.hide(); + $scope.finishedLoadingImage = function (ndx) { + // console.log("*** Events image FINISHED loading index: "+ndx+"***"); + $ionicLoading.hide(); }; //--------------------------------------------------- // //--------------------------------------------------- - $scope.clearSearch = function() - { - $scope.search.text = ""; + $scope.clearSearch = function () { + $scope.search.text = ""; }; //--------------------------------------------------- // Called when user toggles search //--------------------------------------------------- - $scope.searchClicked = function() - { - $scope.showSearch = !$scope.showSearch; - // this helps greatly in repeat scroll gets - if ($scope.showSearch == false) - $scope.search.text = ""; - - //console.log("**** Setting search view to " + $scope.showSearch + " ****"); - if (enableLoadMore == false && $scope.showSearch == false) - { - moreEvents = true; - enableLoadMore = true; - //console.log("REMOVING ARTIFICAL LOAD MORE BLOCK"); - } + $scope.searchClicked = function () { + $scope.showSearch = !$scope.showSearch; + // this helps greatly in repeat scroll gets + if ($scope.showSearch == false) + $scope.search.text = ""; + + //console.log("**** Setting search view to " + $scope.showSearch + " ****"); + if (enableLoadMore == false && $scope.showSearch == false) { + moreEvents = true; + enableLoadMore = true; + //console.log("REMOVING ARTIFICAL LOAD MORE BLOCK"); + } }; //-------------------------------------------------------- // utility function //-------------------------------------------------------- - function computeRelativePath(event) - { - var relativePath = ""; - var loginData = NVRDataModel.getLogin(); - var str = event.Event.StartTime; - var yy = moment(str).locale('en').format('YY'); - var mm = moment(str).locale('en').format('MM'); - var dd = moment(str).locale('en').format('DD'); - var hh = moment(str).locale('en').format('HH'); - var min = moment(str).locale('en').format('mm'); - var sec = moment(str).locale('en').format('ss'); - relativePath = event.Event.MonitorId + "/" + - yy + "/" + - mm + "/" + - dd + "/" + - hh + "/" + - min + "/" + - sec + "/"; - return relativePath; + function computeRelativePath(event) { + var relativePath = ""; + var loginData = NVRDataModel.getLogin(); + var str = event.Event.StartTime; + var yy = moment(str).locale('en').format('YY'); + var mm = moment(str).locale('en').format('MM'); + var dd = moment(str).locale('en').format('DD'); + var hh = moment(str).locale('en').format('HH'); + var min = moment(str).locale('en').format('mm'); + var sec = moment(str).locale('en').format('ss'); + relativePath = event.Event.MonitorId + "/" + + yy + "/" + + mm + "/" + + dd + "/" + + hh + "/" + + min + "/" + + sec + "/"; + return relativePath; } @@ -2780,115 +2456,104 @@ angular.module('zmApp.controllers') // utility function //-------------------------------------------------------- - function computeBasePath(event) - { - var basePath = ""; - var loginData = NVRDataModel.getLogin(); - var str = event.Event.StartTime; - var yy = moment(str).locale('en').format('YY'); - var mm = moment(str).locale('en').format('MM'); - var dd = moment(str).locale('en').format('DD'); - var hh = moment(str).locale('en').format('HH'); - var min = moment(str).locale('en').format('mm'); - var sec = moment(str).locale('en').format('ss'); - - basePath = event.Event.baseURL + "/events/" + - event.Event.MonitorId + "/" + - yy + "/" + - mm + "/" + - dd + "/" + - hh + "/" + - min + "/" + - sec + "/"; - return basePath; + function computeBasePath(event) { + var basePath = ""; + var loginData = NVRDataModel.getLogin(); + var str = event.Event.StartTime; + var yy = moment(str).locale('en').format('YY'); + var mm = moment(str).locale('en').format('MM'); + var dd = moment(str).locale('en').format('DD'); + var hh = moment(str).locale('en').format('HH'); + var min = moment(str).locale('en').format('mm'); + var sec = moment(str).locale('en').format('ss'); + + basePath = event.Event.baseURL + "/events/" + + event.Event.MonitorId + "/" + + yy + "/" + + mm + "/" + + dd + "/" + + hh + "/" + + min + "/" + + sec + "/"; + return basePath; } - $scope.modalGraph = function() - { - $ionicModal.fromTemplateUrl('templates/events-modalgraph.html', - { - scope: $scope, // give ModalCtrl access to this scope - animation: 'slide-in-up', - id: 'modalgraph', + $scope.modalGraph = function () { + $ionicModal.fromTemplateUrl('templates/events-modalgraph.html', { + scope: $scope, // give ModalCtrl access to this scope + animation: 'slide-in-up', + id: 'modalgraph', - }) - .then(function(modal) - { - $scope.modal = modal; + }) + .then(function (modal) { + $scope.modal = modal; - $scope.modal.show(); + $scope.modal.show(); - }); + }); }; - $scope.analyzeEvent = function(ev) - { - $scope.event = ev; - $ionicModal.fromTemplateUrl('templates/timeline-modal.html', - { - scope: $scope, // give ModalCtrl access to this scope - animation: 'slide-in-up', - id: 'analyze', - }) - .then(function(modal) - { - $scope.modal = modal; + $scope.analyzeEvent = function (ev) { + $scope.event = ev; + $ionicModal.fromTemplateUrl('templates/timeline-modal.html', { + scope: $scope, // give ModalCtrl access to this scope + animation: 'slide-in-up', + id: 'analyze', + }) + .then(function (modal) { + $scope.modal = modal; - $scope.modal.show(); + $scope.modal.show(); - }); + }); }; - $scope.$on('modal.removed', function(e, m) - { + $scope.$on('modal.removed', function (e, m) { - if (m.id != 'footage') - return; - NVRDataModel.debug("Rebinding watchers of eventCtrl"); - setupWatchers(); + if (m.id != 'footage') + return; + NVRDataModel.debug("Rebinding watchers of eventCtrl"); + setupWatchers(); - //console.log ("************** FOOTAGE CLOSED"); + //console.log ("************** FOOTAGE CLOSED"); }); - - - $scope.showThumbnail = function (b,f) { - if (!f) {// api update needed - $ionicPopup.alert( - { - title: $translate.instant('kNote'), - template: "{{'kApiUpgrade' | translate }}", - okText: $translate.instant('kButtonOk'), - cancelText: $translate.instant('kButtonCancel'), - }); - return; + $scope.showThumbnail = function (b, f) { - } + if (!f) { // api update needed - - $scope.thumbnailLarge=b+'/index.php?view=image&fid='+f; - $ionicModal.fromTemplateUrl('templates/image-modal.html', - { - scope: $scope, - animation: 'slide-in-up', - id: 'thumbnail', + $ionicPopup.alert({ + title: $translate.instant('kNote'), + template: "{{'kApiUpgrade' | translate }}", + okText: $translate.instant('kButtonOk'), + cancelText: $translate.instant('kButtonCancel'), + }); + return; + + } + + + $scope.thumbnailLarge = b + '/index.php?view=image&fid=' + f; + $ionicModal.fromTemplateUrl('templates/image-modal.html', { + scope: $scope, + animation: 'slide-in-up', + id: 'thumbnail', }) - .then(function(modal) - { - $scope.modal = modal; - + .then(function (modal) { + $scope.modal = modal; - $scope.modal.show(); - var ld = NVRDataModel.getLogin(); + $scope.modal.show(); - }); + var ld = NVRDataModel.getLogin(); + + }); }; @@ -2902,77 +2567,74 @@ angular.module('zmApp.controllers') //-------------------------------------------------------- $scope.openModalWithSnapshot = function (event) { - openModal (event,'enabled'); + openModal(event, 'enabled'); }; - $scope.openModal = function(event) - { + $scope.openModal = function (event) { - openModal(event); + openModal(event); }; - function openModal (event, snapshot) { - NVRDataModel.debug("unbinding eventCtrl watchers as modal has its own"); - ionRangeWatcher(); - mycarouselWatcher(); - //NVRDataModel.debug("EventCtrl: Open Modal with Base path " + relativepath); - - $scope.modalData = {"doRefresh":false}; - - $scope.event = event; - - NVRDataModel.setAwake(NVRDataModel.getKeepAwake()); - - $scope.currentEvent = event; - $scope.followSameMonitor = ($stateParams.id == "0") ? "0" : "1"; - - var ld = NVRDataModel.getLogin(); - var sl = 'disabled'; - if (ld.showLiveForInProgressEvents) { - sl = 'enabled'; - } - - $ionicModal.fromTemplateUrl('templates/events-modal.html', - { - scope: $scope, - animation: 'slide-in-up', - id: 'footage', - showLive:sl, // seems bool is not allowed... - snapshot:snapshot, - snapshotId: event.Event.MaxScoreFrameId, - eventId:event.Event.Id - }) - .then(function(modal) - { - $scope.modal = modal; + function openModal(event, snapshot) { + NVRDataModel.debug("unbinding eventCtrl watchers as modal has its own"); + ionRangeWatcher(); + mycarouselWatcher(); + //NVRDataModel.debug("EventCtrl: Open Modal with Base path " + relativepath); + + $scope.modalData = { + "doRefresh": false + }; + + $scope.event = event; + + NVRDataModel.setAwake(NVRDataModel.getKeepAwake()); + + $scope.currentEvent = event; + $scope.followSameMonitor = ($stateParams.id == "0") ? "0" : "1"; + + var ld = NVRDataModel.getLogin(); + var sl = 'disabled'; + if (ld.showLiveForInProgressEvents) { + sl = 'enabled'; + } + + $ionicModal.fromTemplateUrl('templates/events-modal.html', { + scope: $scope, + animation: 'slide-in-up', + id: 'footage', + showLive: sl, // seems bool is not allowed... + snapshot: snapshot, + snapshotId: event.Event.MaxScoreFrameId, + eventId: event.Event.Id + }) + .then(function (modal) { + $scope.modal = modal; - $scope.modal.show(); + $scope.modal.show(); - var ld = NVRDataModel.getLogin(); + var ld = NVRDataModel.getLogin(); - }); + }); } //-------------------------------------------------------- //We need to destroy because we are instantiating // it on open //-------------------------------------------------------- - $scope.closeModal = function() - { - NVRDataModel.debug(">>>EventCtrl:Close & Destroy Modal"); - NVRDataModel.setAwake(false); - if ($scope.modal !== undefined) - { - $scope.modal.remove(); - } - if ($scope.modalData.doRefresh) { - $scope.modalData.doRefresh = false; - NVRDataModel.debug ("Reloading events since we deleted some..."); - doRefresh(); - } - + $scope.closeModal = function () { + NVRDataModel.debug(">>>EventCtrl:Close & Destroy Modal"); + NVRDataModel.setAwake(false); + if ($scope.modal !== undefined) { + $scope.modal.remove(); + } + if ($scope.modalData.doRefresh) { + $scope.modalData.doRefresh = false; + NVRDataModel.debug("Reloading events since we deleted some..."); + doRefresh(); + } + }; @@ -2980,43 +2642,38 @@ angular.module('zmApp.controllers') //Cleanup the modal when we're done with it // I Don't think it ever comes here //-------------------------------------------------------- - $scope.$on('$destroy', function() - { - //console.log("Destroy Modal"); - if ($scope.modal !== undefined) - { - $scope.modal.remove(); - } - if ($scope.popover !== undefined) - $scope.popover.remove(); + $scope.$on('$destroy', function () { + //console.log("Destroy Modal"); + if ($scope.modal !== undefined) { + $scope.modal.remove(); + } + if ($scope.popover !== undefined) + $scope.popover.remove(); }); //-------------------------------------------------------- // used by infinite scrolling to see if we can get more //-------------------------------------------------------- - $scope.moreDataCanBeLoaded = function() - { - return moreEvents; + $scope.moreDataCanBeLoaded = function () { + return moreEvents; }; //-------------------------------------------------------- // stop searching for more data //-------------------------------------------------------- - $scope.cancelSearch = function() - { - $ionicLoading.hide(); //Or whatever action you want to preform - enableLoadMore = false; - //console.log("**** CANCELLED ****"); - $ionicLoading.show( - { - template: $translate.instant('kSearchCancelled'), - animation: 'fade-in', - showBackdrop: true, - duration: 2000, - maxWidth: 200, - showDelay: 0 - }); + $scope.cancelSearch = function () { + $ionicLoading.hide(); //Or whatever action you want to preform + enableLoadMore = false; + //console.log("**** CANCELLED ****"); + $ionicLoading.show({ + template: $translate.instant('kSearchCancelled'), + animation: 'fade-in', + showBackdrop: true, + duration: 2000, + maxWidth: 200, + showDelay: 0 + }); }; @@ -3024,294 +2681,272 @@ angular.module('zmApp.controllers') // loads next page of events //-------------------------------------------------------- - function loadMore() - { - // the events API does not return an error for anything - // except greater page limits than reported + function loadMore() { + // the events API does not return an error for anything + // except greater page limits than reported + + // console.log("***** LOADING MORE INFINITE SCROLL ****"); + eventsPage--; + if ((eventsPage <= 0) && (pageLoaded)) { + moreEvents = false; + //console.log("*** At Page " + eventsPage + ", not proceeding"); + return; + } + + if (!enableLoadMore) { + moreEvents = false; // Don't ion-scroll till enableLoadMore is true; + $scope.$broadcast('scroll.infiniteScrollComplete'); + + // console.log("**** LOADMORE ARTIFICALLY DISABLED"); + return; + } + + var loadingStr = ""; + if ($scope.search.text != "") { + var toastStr = $translate.instant('kToastSearchingPage') + eventsPage; + $ionicLoading.show({ + maxwidth: 100, + scope: $scope, + template: '<button class="button button-clear icon-left ion-close-circled button-text-wrap" ng-click="cancelSearch()" >' + toastStr + '</button>' + }); - // console.log("***** LOADING MORE INFINITE SCROLL ****"); - eventsPage--; - if ((eventsPage <= 0) && (pageLoaded)) - { - moreEvents = false; - //console.log("*** At Page " + eventsPage + ", not proceeding"); - return; - } + loadingStr = "none"; + } - if (!enableLoadMore) - { - moreEvents = false; // Don't ion-scroll till enableLoadMore is true; - $scope.$broadcast('scroll.infiniteScrollComplete'); + nolangFrom = ""; + nolangTo = ""; + if ($rootScope.fromString) + nolangFrom = moment($rootScope.fromString).locale('en').format("YYYY-MM-DD HH:mm:ss"); + if ($rootScope.toString) + nolangTo = moment($rootScope.toString).locale('en').format("YYYY-MM-DD HH:mm:ss"); - // console.log("**** LOADMORE ARTIFICALLY DISABLED"); - return; - } + NVRDataModel.getEvents($scope.id, eventsPage, loadingStr, nolangFrom, nolangTo) + .then(function (data) { + var loginData = NVRDataModel.getLogin(); + // console.log("Got new page of events with Page=" + eventsPage); + var myevents = data; - var loadingStr = ""; - if ($scope.search.text != "") - { - var toastStr = $translate.instant('kToastSearchingPage') + eventsPage; - $ionicLoading.show( - { - maxwidth: 100, - scope: $scope, - template: '<button class="button button-clear icon-left ion-close-circled button-text-wrap" ng-click="cancelSearch()" >' + toastStr + '</button>' - }); + for (var i = 0; i < myevents.length; i++) { - loadingStr = "none"; - } + var idfound = true; + var ld = NVRDataModel.getLogin(); - nolangFrom = ""; - nolangTo = ""; - if ($rootScope.fromString) - nolangFrom = moment($rootScope.fromString).locale('en').format("YYYY-MM-DD HH:mm:ss"); - if ($rootScope.toString) - nolangTo = moment($rootScope.toString).locale('en').format("YYYY-MM-DD HH:mm:ss"); + if (ld.persistMontageOrder) { + idfound = false; + for (var ii = 0; ii < $scope.monitors.length; ii++) { + if ($scope.monitors[ii].Monitor.Id == myevents[i].Event.MonitorId && (NVRDataModel.isNotHidden(myevents[i].Event.MonitorId) || showHiddenMonitors)) { - NVRDataModel.getEvents($scope.id, eventsPage, loadingStr, nolangFrom, nolangTo) - .then(function(data) - { - var loginData = NVRDataModel.getLogin(); - // console.log("Got new page of events with Page=" + eventsPage); - var myevents = data; - - for (var i = 0; i < myevents.length; i++) - { - - var idfound = true; - var ld = NVRDataModel.getLogin(); - - if (ld.persistMontageOrder) - { - idfound = false; - for (var ii = 0; ii < $scope.monitors.length; ii++) - { - if ($scope.monitors[ii].Monitor.Id == myevents[i].Event.MonitorId && (NVRDataModel.isNotHidden(myevents[i].Event.MonitorId) || showHiddenMonitors)) - { - - //console.log ( $scope.monitors[ii].Monitor.Id + " MATCHES " + myevents[i].Event.MonitorId); - idfound = true; - - break; - } - } - } - - myevents[i].Event.humanizeTime = humanizeTime(myevents[i].Event.StartTime); - myevents[i].Event.MonitorName = NVRDataModel.getMonitorName(myevents[i].Event.MonitorId); - // now construct base path - - myevents[i].Event.streamingURL = NVRDataModel.getStreamingURL(myevents[i].Event.MonitorId); - myevents[i].Event.baseURL = NVRDataModel.getBaseURL(myevents[i].Event.MonitorId); - myevents[i].Event.imageMode = NVRDataModel.getImageMode(myevents[i].Event.MonitorId); - // console.log ("***** MULTISERVER STREAMING URL FOR EVENTS " + myevents[i].Event.streamingURL); - - // console.log ("***** MULTISERVER BASE URL FOR EVENTS " + myevents[i].Event.baseURL); - - myevents[i].Event.ShowScrub = false; - myevents[i].Event.BasePath = computeBasePath(myevents[i]); - myevents[i].Event.relativePath = computeRelativePath(myevents[i]); - myevents[i].Event.height = eventsListDetailsHeight; - - // get thumbW/H - - var tempMon = NVRDataModel.getMonitorObject(myevents[i].Event.MonitorId); - if (tempMon != undefined) { - - var ratio; - var mw = parseInt(tempMon.Monitor.Width); - var mh = parseInt(tempMon.Monitor.Height); - var mo = parseInt(tempMon.Monitor.Orientation); - - // scale by X if width > height - if (mw > mh ) { - ratio = mw / zm.thumbWidth; - myevents[i].Event.thumbWidth = 200; - myevents[i].Event.thumbHeight = Math.round(mh/ratio); - } - else { - - ratio = mh / zm.thumbWidth; - myevents[i].Event.thumbHeight = 200; - myevents[i].Event.thumbWidth = Math.round(mw/ratio); - - } - if (mo != 0) { - - /*myevents[i].Event.Rotation = { - 'transform' : 'rotate('+mo+'deg'+')' - }; */ - - var tmp = myevents[i].Event.thumbHeight; - myevents[i].Event.thumbHeight = myevents[i].Event.thumbWidth; - myevents[i].Event.thumbWidth = tmp; - - } // swap - } - - - if (myevents[i].Event.imageMode == 'path') - //if (1) - myevents[i].Event.videoPath = myevents[i].Event.baseURL + "/events/" + myevents[i].Event.relativePath + myevents[i].Event.DefaultVideo; - else - myevents[i].Event.videoPath = myevents[i].Event.baseURL + "/index.php?view=view_video&eid=" + myevents[i].Event.Id; - - if (idfound) $scope.events.push(myevents[i]); - } + //console.log ( $scope.monitors[ii].Monitor.Id + " MATCHES " + myevents[i].Event.MonitorId); + idfound = true; - //console.log("Got new page of events"); - moreEvents = true; - $scope.$broadcast('scroll.infiniteScrollComplete'); - }, + break; + } + } + } - function(error) - { - // console.log("*** No More Events to Load, Stop Infinite Scroll ****"); - moreEvents = false; - $scope.$broadcast('scroll.infiniteScrollComplete'); + myevents[i].Event.humanizeTime = humanizeTime(myevents[i].Event.StartTime); + myevents[i].Event.MonitorName = NVRDataModel.getMonitorName(myevents[i].Event.MonitorId); + // now construct base path - }); + myevents[i].Event.streamingURL = NVRDataModel.getStreamingURL(myevents[i].Event.MonitorId); + myevents[i].Event.baseURL = NVRDataModel.getBaseURL(myevents[i].Event.MonitorId); + myevents[i].Event.imageMode = NVRDataModel.getImageMode(myevents[i].Event.MonitorId); + // console.log ("***** MULTISERVER STREAMING URL FOR EVENTS " + myevents[i].Event.streamingURL); + + // console.log ("***** MULTISERVER BASE URL FOR EVENTS " + myevents[i].Event.baseURL); + + myevents[i].Event.ShowScrub = false; + myevents[i].Event.BasePath = computeBasePath(myevents[i]); + myevents[i].Event.relativePath = computeRelativePath(myevents[i]); + myevents[i].Event.height = eventsListDetailsHeight; + + // get thumbW/H + + var tempMon = NVRDataModel.getMonitorObject(myevents[i].Event.MonitorId); + if (tempMon != undefined) { + + var ratio; + var mw = parseInt(tempMon.Monitor.Width); + var mh = parseInt(tempMon.Monitor.Height); + var mo = parseInt(tempMon.Monitor.Orientation); + + // scale by X if width > height + if (mw > mh) { + ratio = mw / zm.thumbWidth; + myevents[i].Event.thumbWidth = 200; + myevents[i].Event.thumbHeight = Math.round(mh / ratio); + } else { + + ratio = mh / zm.thumbWidth; + myevents[i].Event.thumbHeight = 200; + myevents[i].Event.thumbWidth = Math.round(mw / ratio); + + } + if (mo != 0) { + + /*myevents[i].Event.Rotation = { + 'transform' : 'rotate('+mo+'deg'+')' + }; */ + + var tmp = myevents[i].Event.thumbHeight; + myevents[i].Event.thumbHeight = myevents[i].Event.thumbWidth; + myevents[i].Event.thumbWidth = tmp; + + } // swap + } + + + if (myevents[i].Event.imageMode == 'path') + //if (1) + myevents[i].Event.videoPath = myevents[i].Event.baseURL + "/events/" + myevents[i].Event.relativePath + myevents[i].Event.DefaultVideo; + else + myevents[i].Event.videoPath = myevents[i].Event.baseURL + "/index.php?view=view_video&eid=" + myevents[i].Event.Id; + + if (idfound) $scope.events.push(myevents[i]); + } + + //console.log("Got new page of events"); + moreEvents = true; + $scope.$broadcast('scroll.infiniteScrollComplete'); + }, + + function (error) { + // console.log("*** No More Events to Load, Stop Infinite Scroll ****"); + moreEvents = false; + $scope.$broadcast('scroll.infiniteScrollComplete'); + + }); } - $scope.loadMore = function() - { - loadMore(); + $scope.loadMore = function () { + loadMore(); }; - $scope.constructThumbnail = function(event) { - var stream = ""; - stream = event.Event.baseURL+ + $scope.constructThumbnail = function (event) { + var stream = ""; + stream = event.Event.baseURL + "/index.php?view=image&fid=" + - (event.Event.MaxScoreFrameId ? event.Event.MaxScoreFrameId: "1&eid="+event.Event.Id) + - "&width="+event.Event.thumbWidth*2 + - "&height="+event.Event.thumbHeight*2; - if ($rootScope.authSession !='undefined') stream+=$rootScope.authSession; - - stream += NVRDataModel.insertBasicAuthToken(); - return stream; - + (event.Event.MaxScoreFrameId ? event.Event.MaxScoreFrameId : "1&eid=" + event.Event.Id) + + "&width=" + event.Event.thumbWidth * 2 + + "&height=" + event.Event.thumbHeight * 2; + if ($rootScope.authSession != 'undefined') stream += $rootScope.authSession; + + stream += NVRDataModel.insertBasicAuthToken(); + return stream; + }; - $scope.constructScrubFrame = function (event,slide) { + $scope.constructScrubFrame = function (event, slide) { - var stream = ""; - if (event.Event.imageMode=='path') { - stream = event.Event.baseURL+"/index.php?view=image"+ - "&path="+event.Event.relativePath+slide.img+"&height=380"; + var stream = ""; + if (event.Event.imageMode == 'path') { + stream = event.Event.baseURL + "/index.php?view=image" + + "&path=" + event.Event.relativePath + slide.img + "&height=380"; - } - else if (event.Event.imageMode == 'fid') { - stream = event.Event.baseURL+"/index.php?view=image"+ - "&fid="+slide.id; - } - if ($rootScope.authSession !='undefined') stream+=$rootScope.authSession; + } else if (event.Event.imageMode == 'fid') { + stream = event.Event.baseURL + "/index.php?view=image" + + "&fid=" + slide.id; + } + if ($rootScope.authSession != 'undefined') stream += $rootScope.authSession; + + stream += NVRDataModel.insertBasicAuthToken(); - stream +=NVRDataModel.insertBasicAuthToken(); - - - return stream; + + return stream; }; - $scope.constructAlarmFrame = function(event, alarm, motion) { - var stream = ""; + $scope.constructAlarmFrame = function (event, alarm, motion) { + var stream = ""; - if (event.Event.imageMode=='fid') { - stream = event.Event.baseURL+ - "/index.php?view=image&fid=" +alarm.id; - if (motion) stream+=$scope.outlineMotionParam; + if (event.Event.imageMode == 'fid') { + stream = event.Event.baseURL + + "/index.php?view=image&fid=" + alarm.id; + if (motion) stream += $scope.outlineMotionParam; - } - else if (event.Event.imageMode=='path') { - stream = event.Event.baseURL+ - "/index.php?view=image&path=" +event.Event.relativePath + - motion? alarm.aname:alarm.fname + - "&height=380"; + } else if (event.Event.imageMode == 'path') { + stream = event.Event.baseURL + + "/index.php?view=image&path=" + event.Event.relativePath + + motion ? alarm.aname : alarm.fname + + "&height=380"; - } - if ($rootScope.authSession !='undefined') stream+=$rootScope.authSession; - stream += NVRDataModel.insertBasicAuthToken(); - - return stream; - + } + if ($rootScope.authSession != 'undefined') stream += $rootScope.authSession; + stream += NVRDataModel.insertBasicAuthToken(); + + return stream; + }; - $scope.toggleMinAlarmFrameCount = function() - { + $scope.toggleMinAlarmFrameCount = function () { - var ld = NVRDataModel.getLogin(); + var ld = NVRDataModel.getLogin(); - console.log("Toggling " + ld.enableAlarmCount); - ld.enableAlarmCount = !ld.enableAlarmCount; - NVRDataModel.setLogin(ld); - $scope.loginData = NVRDataModel.getLogin(); - doRefresh(); + console.log("Toggling " + ld.enableAlarmCount); + ld.enableAlarmCount = !ld.enableAlarmCount; + NVRDataModel.setLogin(ld); + $scope.loginData = NVRDataModel.getLogin(); + doRefresh(); }; //-------------------------------------- // formats events dates in a nice way //--------------------------------------- - function humanizeTime(str) - { - //console.log ("Time:"+str+" TO LOCAL " + moment(str).local().toString()); - //if (NVRDataModel.getLogin().useLocalTimeZone) - return moment.tz(str, NVRDataModel.getTimeZoneNow()).fromNow(); - // else - // return moment(str).fromNow(); + function humanizeTime(str) { + //console.log ("Time:"+str+" TO LOCAL " + moment(str).local().toString()); + //if (NVRDataModel.getLogin().useLocalTimeZone) + return moment.tz(str, NVRDataModel.getTimeZoneNow()).fromNow(); + // else + // return moment(str).fromNow(); } $scope.humanize = function (num) { - var min = Math.floor(num/60); - var sec = Math.floor(num - min * 60); - stime=""; - if (min) stime += min+"m "; + var min = Math.floor(num / 60); + var sec = Math.floor(num - min * 60); + stime = ""; + if (min) stime += min + "m "; - if (sec) stime += sec+"s"; - return stime; + if (sec) stime += sec + "s"; + return stime; }; - $scope.prettifyDate = function(str) - { - if (NVRDataModel.getLogin().useLocalTimeZone) - return moment.tz(str, NVRDataModel.getTimeZoneNow()).tz(moment.tz.guess()).format('MMM Do'); - else - return moment(str).format('MMM Do'); + $scope.prettifyDate = function (str) { + if (NVRDataModel.getLogin().useLocalTimeZone) + return moment.tz(str, NVRDataModel.getTimeZoneNow()).tz(moment.tz.guess()).format('MMM Do'); + else + return moment(str).format('MMM Do'); }; - function prettifyDate(str) - { - if (NVRDataModel.getLogin().useLocalTimeZone) - return moment.tz(str, NVRDataModel.getTimeZoneNow()).tz(moment.tz.guess()).format('MMM Do'); - else - return moment(str).format('MMM Do'); + function prettifyDate(str) { + if (NVRDataModel.getLogin().useLocalTimeZone) + return moment.tz(str, NVRDataModel.getTimeZoneNow()).tz(moment.tz.guess()).format('MMM Do'); + else + return moment(str).format('MMM Do'); } - $scope.prettifyTime = function(str) - { - if (NVRDataModel.getLogin().useLocalTimeZone) - return moment.tz(str, NVRDataModel.getTimeZoneNow()).tz(moment.tz.guess()).format(NVRDataModel.getTimeFormat()); - else - return moment(str).format(NVRDataModel.getTimeFormat()); + $scope.prettifyTime = function (str) { + if (NVRDataModel.getLogin().useLocalTimeZone) + return moment.tz(str, NVRDataModel.getTimeZoneNow()).tz(moment.tz.guess()).format(NVRDataModel.getTimeFormat()); + else + return moment(str).format(NVRDataModel.getTimeFormat()); }; - $scope.prettifyTimeSec = function(str) - { - if (NVRDataModel.getLogin().useLocalTimeZone) - return moment.tz(str, NVRDataModel.getTimeZoneNow()).tz(moment.tz.guess()).format(NVRDataModel.getTimeFormatSec()); - else - return moment(str).format(NVRDataModel.getTimeFormatSec()); + $scope.prettifyTimeSec = function (str) { + if (NVRDataModel.getLogin().useLocalTimeZone) + return moment.tz(str, NVRDataModel.getTimeZoneNow()).tz(moment.tz.guess()).format(NVRDataModel.getTimeFormatSec()); + else + return moment(str).format(NVRDataModel.getTimeFormatSec()); }; - $scope.prettify = function(str) - { - if (NVRDataModel.getLogin().useLocalTimeZone) - return moment.tz(str, NVRDataModel.getTimeZoneNow()).tz(moment.tz.guess()).format(NVRDataModel.getTimeFormat() + ', MMMM Do YYYY'); - else - return moment(str).format(NVRDataModel.getTimeFormat() + ', MMMM Do YYYY'); + $scope.prettify = function (str) { + if (NVRDataModel.getLogin().useLocalTimeZone) + return moment.tz(str, NVRDataModel.getTimeZoneNow()).tz(moment.tz.guess()).format(NVRDataModel.getTimeFormat() + ', MMMM Do YYYY'); + else + return moment(str).format(NVRDataModel.getTimeFormat() + ', MMMM Do YYYY'); }; //-------------------------------------------------------- // For consistency we are keeping the refresher list @@ -3321,38 +2956,34 @@ angular.module('zmApp.controllers') // a large list //-------------------------------------------------------- - $scope.dummyDoRefresh = function() - { - $scope.$broadcast('scroll.refreshComplete'); + $scope.dummyDoRefresh = function () { + $scope.$broadcast('scroll.refreshComplete'); }; - $scope.doRefresh = function() - { - doRefresh(); + $scope.doRefresh = function () { + doRefresh(); }; //dorefresh - function doRefresh() - { - // console.log("***Pull to Refresh"); + function doRefresh() { + // console.log("***Pull to Refresh"); - NVRDataModel.debug("Reloading monitors"); - var refresh = NVRDataModel.getMonitors(1); - refresh.then(function(data) - { - $scope.monitors = data; + NVRDataModel.debug("Reloading monitors"); + var refresh = NVRDataModel.getMonitors(1); + refresh.then(function (data) { + $scope.monitors = data; - /* var ld = NVRDataModel.getLogin(); - if (ld.persistMontageOrder) { - var tempMon = data; - $scope.monitors = NVRDataModel.applyMontageMonitorPrefs(tempMon, 2)[0]; - } else { - $scope.monitors = data; - }*/ + /* var ld = NVRDataModel.getLogin(); + if (ld.persistMontageOrder) { + var tempMon = data; + $scope.monitors = NVRDataModel.applyMontageMonitorPrefs(tempMon, 2)[0]; + } else { + $scope.monitors = data; + }*/ - getInitialEvents(); - moreEvents = true; + getInitialEvents(); + moreEvents = true; - }); + }); } -}]); + }]); diff --git a/www/js/EventDateTimeFilterCtrl.js b/www/js/EventDateTimeFilterCtrl.js index df7f774a..41de68a5 100644 --- a/www/js/EventDateTimeFilterCtrl.js +++ b/www/js/EventDateTimeFilterCtrl.js @@ -3,136 +3,118 @@ /* global cordova,StatusBar,angular,console,moment */ angular.module('zmApp.controllers') - .controller('zmApp.EventDateTimeFilterCtrl', ['$scope', '$ionicSlideBoxDelegate', '$ionicSideMenuDelegate', '$rootScope', '$ionicHistory', 'NVRDataModel', '$state', function($scope, $ionicScrollDelegate, $ionicSideMenuDelegate, $rootScope, $ionicHistory, NVRDataModel, $state) + .controller('zmApp.EventDateTimeFilterCtrl', ['$scope', '$ionicSlideBoxDelegate', '$ionicSideMenuDelegate', '$rootScope', '$ionicHistory', 'NVRDataModel', '$state', function ($scope, $ionicScrollDelegate, $ionicSideMenuDelegate, $rootScope, $ionicHistory, NVRDataModel, $state) { + + //---------------------------------------------------------------- + // Alarm notification handling + //---------------------------------------------------------------- + $scope.handleAlarms = function () { + $rootScope.isAlarm = !$rootScope.isAlarm; + if (!$rootScope.isAlarm) { + $rootScope.alarmCount = "0"; + $ionicHistory.nextViewOptions({ + disableBack: true + }); + $state.go("app.events", { + "id": 0, + "playEvent": false + }, { + reload: true + }); + return; + } + }; + + $scope.$on('$ionicView.beforeEnter', function () { + $scope.today = moment().format("YYYY-MM-DD"); + }); + + //-------------------------------------------------------------------------- + // Clears filters + //-------------------------------------------------------------------------- + + $scope.removeFilters = function () { + $rootScope.isEventFilterOn = false; + $rootScope.fromDate = ""; + $rootScope.fromTime = ""; + $rootScope.toDate = ""; + $rootScope.toTime = ""; + $rootScope.fromString = ""; + $rootScope.toString = ""; + + // if you come here via the events pullup + // you are looking at a specific monitor ID + // going back will only retain that monitor ID + // so lets reload with all monitors + // + //console.log (">>> BACKVIEW="+$ionicHistory.backTitle()); + + if ($ionicHistory.backTitle() == 'Timeline') { + $ionicHistory.goBack(); + } else // in events, backview is undefined? { + $ionicHistory.nextViewOptions({ + disableBack: true + }); + $state.go("app.events", { + "id": 0, + "playEvent": false + }); + return; + } + + //$ionicHistory.goBack(); + }; + + //-------------------------------------------------------------------------- + // Saves filters in root variables so EventFilter can access it. I know: + // don't root. + //-------------------------------------------------------------------------- + $scope.saveFilters = function () { + if (!$rootScope.fromDate) { + //console.log("RESET fromDate"); + $rootScope.fromDate = new Date(); + NVRDataModel.debug("DateTimeFilter: resetting from date"); + } - //---------------------------------------------------------------- - // Alarm notification handling - //---------------------------------------------------------------- - $scope.handleAlarms = function() - { - $rootScope.isAlarm = !$rootScope.isAlarm; - if (!$rootScope.isAlarm) - { - $rootScope.alarmCount = "0"; - $ionicHistory.nextViewOptions( - { - disableBack: true - }); - $state.go("app.events", - { - "id": 0, - "playEvent": false - }, - { - reload: true - }); - return; - } - }; - - $scope.$on('$ionicView.beforeEnter', function() - { - $scope.today = moment().format("YYYY-MM-DD"); - }); - - //-------------------------------------------------------------------------- - // Clears filters - //-------------------------------------------------------------------------- - - $scope.removeFilters = function() - { - $rootScope.isEventFilterOn = false; - $rootScope.fromDate = ""; - $rootScope.fromTime = ""; - $rootScope.toDate = ""; - $rootScope.toTime = ""; - $rootScope.fromString = ""; - $rootScope.toString = ""; - - // if you come here via the events pullup - // you are looking at a specific monitor ID - // going back will only retain that monitor ID - // so lets reload with all monitors - // - //console.log (">>> BACKVIEW="+$ionicHistory.backTitle()); - - if ($ionicHistory.backTitle() == 'Timeline') - { - $ionicHistory.goBack(); - } - else // in events, backview is undefined? - { - $ionicHistory.nextViewOptions( - { - disableBack: true - }); - $state.go("app.events", - { - "id": 0, - "playEvent": false - }); - return; - } - - //$ionicHistory.goBack(); - }; - - //-------------------------------------------------------------------------- - // Saves filters in root variables so EventFilter can access it. I know: - // don't root. - //-------------------------------------------------------------------------- - $scope.saveFilters = function() - { - if (!$rootScope.fromDate) - { - //console.log("RESET fromDate"); - $rootScope.fromDate = new Date(); - NVRDataModel.debug("DateTimeFilter: resetting from date"); - } - - if (!$rootScope.toDate) - { - // console.log("RESET toDate"); - $rootScope.toDate = new Date(); - NVRDataModel.debug("DateTimeFilter: resetting to date"); - } - - if (!$rootScope.fromTime) - { - // console.log("RESET fromTime"); - $rootScope.fromTime = new Date(99, 5, 24, 0, 0, 0, 0); //moment().format("hh:mm:ss"); - NVRDataModel.debug("DateTimeFilter: resetting from time"); - } - - if (!$rootScope.toTime) - { - //console.log("RESET toTime"); - $rootScope.toTime = new Date(99, 5, 24, 23, 59, 59, 0); - //$rootScope.toTime = "01:01:02"; //moment().format("hh:mm:ss"); - NVRDataModel.debug("DateTimeFilter: resetting to time"); - } - - if ($rootScope.fromDate > $rootScope.toDate) - { - NVRDataModel.log("From date > To Date, swapping"); - var t = $rootScope.fromDate; - $rootScope.fromDate = $rootScope.toDate; - $rootScope.toDate = t; - } - - $rootScope.isEventFilterOn = true; - $rootScope.fromString = moment($rootScope.fromDate).format("YYYY-MM-DD") + " " + moment($rootScope.fromTime).format("HH:mm:ss"); - - $rootScope.toString = moment($rootScope.toDate).format("YYYY-MM-DD") + " " + moment($rootScope.toTime).format("HH:mm:ss"); - - //console.log("CONCAT DATES " + temp); - // - // var startDate = moment(temp).format("YYYY-MM-DD hh:mm:ss"); - NVRDataModel.debug("DateTimeFilter: From/To is now: " + $rootScope.fromString + " & " + $rootScope.toString); - $ionicHistory.goBack(); - }; + if (!$rootScope.toDate) { + // console.log("RESET toDate"); + $rootScope.toDate = new Date(); + NVRDataModel.debug("DateTimeFilter: resetting to date"); + } + + if (!$rootScope.fromTime) { + // console.log("RESET fromTime"); + $rootScope.fromTime = new Date(99, 5, 24, 0, 0, 0, 0); //moment().format("hh:mm:ss"); + NVRDataModel.debug("DateTimeFilter: resetting from time"); + } + if (!$rootScope.toTime) { + //console.log("RESET toTime"); + $rootScope.toTime = new Date(99, 5, 24, 23, 59, 59, 0); + //$rootScope.toTime = "01:01:02"; //moment().format("hh:mm:ss"); + NVRDataModel.debug("DateTimeFilter: resetting to time"); } - ]); + if ($rootScope.fromDate > $rootScope.toDate) { + NVRDataModel.log("From date > To Date, swapping"); + var t = $rootScope.fromDate; + $rootScope.fromDate = $rootScope.toDate; + $rootScope.toDate = t; + } + + $rootScope.isEventFilterOn = true; + $rootScope.fromString = moment($rootScope.fromDate).format("YYYY-MM-DD") + " " + moment($rootScope.fromTime).format("HH:mm:ss"); + + $rootScope.toString = moment($rootScope.toDate).format("YYYY-MM-DD") + " " + moment($rootScope.toTime).format("HH:mm:ss"); + + //console.log("CONCAT DATES " + temp); + // + // var startDate = moment(temp).format("YYYY-MM-DD hh:mm:ss"); + NVRDataModel.debug("DateTimeFilter: From/To is now: " + $rootScope.fromString + " & " + $rootScope.toString); + $ionicHistory.goBack(); + }; + + } + + ]); diff --git a/www/js/EventModalCtrl.js b/www/js/EventModalCtrl.js index e16e1830..ebc4bafc 100644 --- a/www/js/EventModalCtrl.js +++ b/www/js/EventModalCtrl.js @@ -955,11 +955,13 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro if (m.snapshot == 'enabled') { isSnapShotEnabled = true; currentStreamState = streamState.SNAPSHOT; - if (m.snapshotId) { - $scope.snapshotFrameId = m.snapshotId; - isGlobalFid = true; + if (m.snapshotId) { + $scope.snapshotFrameId = m.snapshotId; + isGlobalFid = true; + } else { + $scope.snapshotFrameId = 1; + isSnapShotEnabled = false; } - else { $scope.snapshotFrameId = 1; isSnapShotEnabled = false;} eventId = m.eventId; $scope.eventId = m.eventId; @@ -1152,44 +1154,44 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro var ld = NVRDataModel.getLogin(); - - - var cmd; - $scope.isPaused = false; - switch (val) { - case 'ff': - cmd = 4; - break; - case 'fr': - cmd = 7; - break; - case 'np': - cmd = 2; - break; - case 'p': - cmd = 1; - $scope.isPaused = true; - break; - default: - cmd = 0; - } - $ionicLoading.show({ - template: $translate.instant('kPleaseWait') + "...", - noBackdrop: true, - duration: zm.httpTimeout - }); - sendCommand(cmd, $scope.connKey) - .then(function (success) { - $ionicLoading.hide(); + var cmd; + $scope.isPaused = false; + switch (val) { + case 'ff': + cmd = 4; + break; + case 'fr': + cmd = 7; + break; + case 'np': + cmd = 2; + break; + case 'p': + cmd = 1; + $scope.isPaused = true; + break; + default: + cmd = 0; + } - }, - function (err) { - $ionicLoading.hide(); - NVRDataModel.debug("Error in adjust speed: " + JSON.stringify(err)); - } - ); + $ionicLoading.show({ + template: $translate.instant('kPleaseWait') + "...", + noBackdrop: true, + duration: zm.httpTimeout + }); + + sendCommand(cmd, $scope.connKey) + .then(function (success) { + $ionicLoading.hide(); + + }, + function (err) { + $ionicLoading.hide(); + NVRDataModel.debug("Error in adjust speed: " + JSON.stringify(err)); + } + ); }; diff --git a/www/js/EventServerSettingsCtrl.js b/www/js/EventServerSettingsCtrl.js index d8944ec7..24928007 100644 --- a/www/js/EventServerSettingsCtrl.js +++ b/www/js/EventServerSettingsCtrl.js @@ -2,370 +2,325 @@ /* jslint browser: true*/ /* global cordova,StatusBar,angular,console */ - angular.module('zmApp.controllers').controller('zmApp.EventServerSettingsCtrl', ['$scope', '$ionicSideMenuDelegate', 'zm', '$stateParams', 'EventServer', '$ionicHistory', '$rootScope', '$state', 'message', 'NVRDataModel', '$ionicPlatform', '$ionicPopup', '$timeout', '$translate', function($scope, $ionicSideMenuDelegate, zm, $stateParams, EventServer, $ionicHistory, $rootScope, $state, message, NVRDataModel, $ionicPlatform, $ionicPopup, $timeout, $translate) - { - $scope.openMenu = function() - { - $ionicSideMenuDelegate.toggleLeft(); - }; + angular.module('zmApp.controllers').controller('zmApp.EventServerSettingsCtrl', ['$scope', '$ionicSideMenuDelegate', 'zm', '$stateParams', 'EventServer', '$ionicHistory', '$rootScope', '$state', 'message', 'NVRDataModel', '$ionicPlatform', '$ionicPopup', '$timeout', '$translate', function ($scope, $ionicSideMenuDelegate, zm, $stateParams, EventServer, $ionicHistory, $rootScope, $state, message, NVRDataModel, $ionicPlatform, $ionicPopup, $timeout, $translate) { + $scope.openMenu = function () { + $ionicSideMenuDelegate.toggleLeft(); + }; + + $scope.openMenu = function () { + $ionicSideMenuDelegate.toggleLeft(); + }; + + //---------------------------------------------------------------- + // Alarm notification handling + //---------------------------------------------------------------- + $scope.handleAlarms = function () { + $rootScope.isAlarm = !$rootScope.isAlarm; + if (!$rootScope.isAlarm) { + $rootScope.alarmCount = "0"; + $ionicHistory.nextViewOptions({ + disableBack: true + }); + + $state.go("app.events", { + "id": 0, + "playEvent": false + }, { + reload: true + }); + return; + } + }; - $scope.openMenu = function() - { - $ionicSideMenuDelegate.toggleLeft(); - }; + // we need this to dynamically get title + // name as ion-view is set in stone and + // we don't get title till beforeEnter + // which is odd - I'd expect beforeEnter to load + // before View is loaded + $scope.getTitle = function () { + return $scope.loginData.serverName; + }; - //---------------------------------------------------------------- - // Alarm notification handling - //---------------------------------------------------------------- - $scope.handleAlarms = function() - { - $rootScope.isAlarm = !$rootScope.isAlarm; - if (!$rootScope.isAlarm) - { - $rootScope.alarmCount = "0"; - $ionicHistory.nextViewOptions( - { - disableBack: true - }); - - $state.go("app.events", - { - "id": 0, - "playEvent": false - }, - { - reload: true - }); - return; - } - }; + //---------------------------------------------------------------- + // Save anyway when you exit + //---------------------------------------------------------------- - // we need this to dynamically get title - // name as ion-view is set in stone and - // we don't get title till beforeEnter - // which is odd - I'd expect beforeEnter to load - // before View is loaded - $scope.getTitle = function() - { - return $scope.loginData.serverName; - }; + $scope.$on('$ionicView.beforeLeave', function () { + saveItems(); - //---------------------------------------------------------------- - // Save anyway when you exit - //---------------------------------------------------------------- + }); - $scope.$on('$ionicView.beforeLeave', function() - { - saveItems(); + $scope.$on('$ionicView.beforeEnter', function () { - }); - $scope.$on('$ionicView.beforeEnter', function() - { + $scope.loginData = NVRDataModel.getLogin(); + //console.log ("Event server - before Enter, loginData is " + JSON.stringify($scope.loginData)); - - $scope.loginData = NVRDataModel.getLogin(); - //console.log ("Event server - before Enter, loginData is " + JSON.stringify($scope.loginData)); + //console.log ("BEFORE ENTER I GOT " + JSON.stringify($scope.loginData)); - //console.log ("BEFORE ENTER I GOT " + JSON.stringify($scope.loginData)); + $scope.defScreen = $scope.loginData.onTapScreen; - $scope.defScreen = $scope.loginData.onTapScreen; + if ($scope.loginData.eventServer == "") { + $scope.loginData.eventServer = "wss://" + extractDomain($scope.loginData.url) + ":9000"; + } - if ($scope.loginData.eventServer == "") - { - $scope.loginData.eventServer = "wss://" + extractDomain($scope.loginData.url) + ":9000"; - } + res = $scope.loginData.eventServerMonitors.split(","); + minterval = $scope.loginData.eventServerInterval.split(","); - res = $scope.loginData.eventServerMonitors.split(","); - minterval = $scope.loginData.eventServerInterval.split(","); + var monchecked = false; + for (var i = 0; i < $scope.monitors.length; i++) { - var monchecked = false; - for (var i = 0; i < $scope.monitors.length; i++) - { + if (!isEnabled($scope.monitors[i].Monitor.Id)) { + // if the filter list has IDs and this is not part of it, uncheck it + $scope.monitors[i].Monitor.isChecked = false; + //console.log("Marking false"); + $scope.monitors[i].Monitor.reportingInterval = 0; + } else { + // console.log("Marking true"); + $scope.monitors[i].Monitor.isChecked = true; + $scope.monitors[i].Monitor.reportingInterval = getInterval($scope.monitors[i].Monitor.Id); + monchecked = true; + } + + } - if (!isEnabled($scope.monitors[i].Monitor.Id)) - { - // if the filter list has IDs and this is not part of it, uncheck it - $scope.monitors[i].Monitor.isChecked = false; - //console.log("Marking false"); - $scope.monitors[i].Monitor.reportingInterval = 0; - } - else - { - // console.log("Marking true"); - $scope.monitors[i].Monitor.isChecked = true; - $scope.monitors[i].Monitor.reportingInterval = getInterval($scope.monitors[i].Monitor.Id); - monchecked = true; - } + // now if none are checked, assume it means all checked. This is related to the + // fact that ES will start sending all monitors, even ones you don't have access to + if (!monchecked) { + NVRDataModel.debug("Enabling all monitors for event server"); + for (var j = 0; j < $scope.monitors.length; j++) { + $scope.monitors[i].Monitor.isChecked = true; + $scope.monitors[i].Monitor.reportingInterval = 0; + } - } + } + }); - // now if none are checked, assume it means all checked. This is related to the - // fact that ES will start sending all monitors, even ones you don't have access to - if (!monchecked) - { - NVRDataModel.debug ("Enabling all monitors for event server"); - for (var j = 0; j < $scope.monitors.length; j++) - { - $scope.monitors[i].Monitor.isChecked = true; - $scope.monitors[i].Monitor.reportingInterval = 0; - } + //-------------------------------------------------- + // notification tap action + //-------------------------------------------------- - } - }); + $scope.selectScreen = function () { - //-------------------------------------------------- - // notification tap action - //-------------------------------------------------- + // var ld = NVRDataModel.getLogin(); - $scope.selectScreen = function() - { + $scope.myopt = { + selectedState: $scope.loginData.onTapScreen + }; - // var ld = NVRDataModel.getLogin(); + var options = '<ion-radio-fix ng-model="myopt.selectedState" ng-value="\'' + $translate.instant('kTapEvents') + '\'">' + $translate.instant('kTapEvents') + '</ion-radio-fix>'; - $scope.myopt = { - selectedState: $scope.loginData.onTapScreen - }; + options += '<ion-radio-fix ng-model="myopt.selectedState" ng-value="\'' + $translate.instant('kTapMontage') + '\'">' + $translate.instant('kTapMontage') + '</ion-radio-fix>'; + options += '<ion-radio-fix ng-model="myopt.selectedState" ng-value="\'' + $translate.instant('kTapLiveMonitor') + '\'">' + $translate.instant('kTapLiveMonitor') + '</ion-radio-fix>'; - var options = '<ion-radio-fix ng-model="myopt.selectedState" ng-value="\'' + $translate.instant('kTapEvents') + '\'">' + $translate.instant('kTapEvents') + '</ion-radio-fix>'; + $rootScope.zmPopup = $ionicPopup.show({ + scope: $scope, + template: options, - options += '<ion-radio-fix ng-model="myopt.selectedState" ng-value="\'' + $translate.instant('kTapMontage') + '\'">' + $translate.instant('kTapMontage') + '</ion-radio-fix>'; - options += '<ion-radio-fix ng-model="myopt.selectedState" ng-value="\'' + $translate.instant('kTapLiveMonitor') + '\'">' + $translate.instant('kTapLiveMonitor') + '</ion-radio-fix>'; + title: 'View to navigate to:', + subTitle: 'currently set to: ' + $scope.loginData.onTapScreen, + buttons: [{ + text: $translate.instant('kButtonCancel'), - $rootScope.zmPopup = $ionicPopup.show( + }, { - scope: $scope, - template: options, - - title: 'View to navigate to:', - subTitle: 'currently set to: ' + $scope.loginData.onTapScreen, - buttons: [ - { - text: $translate.instant('kButtonCancel'), - - }, - { - text: $translate.instant('kButtonOk'), - onTap: function(e) - { - - $scope.loginData.onTapScreen = $scope.myopt.selectedState; - NVRDataModel.log("Setting new onTap State:" + $scope.loginData.onTapScreen); - NVRDataModel.setLogin($scope.loginData); - $scope.defScreen = $scope.myopt.selectedState; - //$scope.loginData = ld; - - } - }] - }); - - }; + text: $translate.instant('kButtonOk'), + onTap: function (e) { - //---------------------------------------------------------------- - // Accordion list show/hide - //---------------------------------------------------------------- + $scope.loginData.onTapScreen = $scope.myopt.selectedState; + NVRDataModel.log("Setting new onTap State:" + $scope.loginData.onTapScreen); + NVRDataModel.setLogin($scope.loginData); + $scope.defScreen = $scope.myopt.selectedState; + //$scope.loginData = ld; - $scope.toggleGroup = function(group) - { - if ($scope.isGroupShown(group)) - { - $scope.shownGroup = null; - } - else - { - $scope.shownGroup = group; + } } - }; - $scope.isGroupShown = function(group) - { - return $scope.shownGroup === group; - }; + ] + }); - $scope.saveItems = function() - { - saveItems(); - }; + }; - //---------------------------------------------------------------- - // Saves ES data - //---------------------------------------------------------------- - - function saveItems() - { - NVRDataModel.debug("Saving Event Server data"); - var monstring = ""; - var intervalstring = ""; - var plat = $ionicPlatform.is('ios') ? 'ios' : 'android'; - for (var i = 0; i < $scope.monitors.length; i++) - { - if (isNaN($scope.monitors[i].Monitor.reportingInterval)) - { - $scope.monitors[i].Monitor.reportingInterval = 0; - } - if ($scope.monitors[i].Monitor.isChecked) - { - monstring = monstring + $scope.monitors[i].Monitor.Id + ","; - var tint = parseInt($scope.monitors[i].Monitor.reportingInterval); - if (isNaN(tint)) tint = 0; - intervalstring = intervalstring + tint + ","; - } + //---------------------------------------------------------------- + // Accordion list show/hide + //---------------------------------------------------------------- - } + $scope.toggleGroup = function (group) { + if ($scope.isGroupShown(group)) { + $scope.shownGroup = null; + } else { + $scope.shownGroup = group; + } + }; + $scope.isGroupShown = function (group) { + return $scope.shownGroup === group; + }; + + $scope.saveItems = function () { + saveItems(); + }; + + //---------------------------------------------------------------- + // Saves ES data + //---------------------------------------------------------------- + + function saveItems() { + NVRDataModel.debug("Saving Event Server data"); + var monstring = ""; + var intervalstring = ""; + var plat = $ionicPlatform.is('ios') ? 'ios' : 'android'; + for (var i = 0; i < $scope.monitors.length; i++) { + if (isNaN($scope.monitors[i].Monitor.reportingInterval)) { + $scope.monitors[i].Monitor.reportingInterval = 0; + } + if ($scope.monitors[i].Monitor.isChecked) { + monstring = monstring + $scope.monitors[i].Monitor.Id + ","; + var tint = parseInt($scope.monitors[i].Monitor.reportingInterval); + if (isNaN(tint)) tint = 0; + intervalstring = intervalstring + tint + ","; + } - if (monstring.charAt(monstring.length - 1) == ',') - monstring = monstring.substr(0, monstring.length - 1); + } - if (intervalstring.charAt(intervalstring.length - 1) == ',') - intervalstring = intervalstring.substr(0, intervalstring.length - 1); + if (monstring.charAt(monstring.length - 1) == ',') + monstring = monstring.substr(0, monstring.length - 1); - $scope.loginData.eventServerMonitors = monstring; - $scope.loginData.eventServerInterval = intervalstring; + if (intervalstring.charAt(intervalstring.length - 1) == ',') + intervalstring = intervalstring.substr(0, intervalstring.length - 1); - $rootScope.monstring = monstring; - $rootScope.intstring = intervalstring; + $scope.loginData.eventServerMonitors = monstring; + $scope.loginData.eventServerInterval = intervalstring; + $rootScope.monstring = monstring; + $rootScope.intstring = intervalstring; - // console.log ("SAVED: " + JSON.stringify($scope.loginData)); - NVRDataModel.setLogin($scope.loginData); - var pushstate = "enabled"; - if ($scope.loginData.disablePush == true || $scope.loginData.isUseEventServer == false) - pushstate = "disabled"; + // console.log ("SAVED: " + JSON.stringify($scope.loginData)); + NVRDataModel.setLogin($scope.loginData); - if ($scope.loginData.isUseEventServer == true) - { - EventServer.disconnect(); - EventServer.init() - .then(function(data) - { - // console.log("Sending control filter"); - NVRDataModel.debug("Sending Control message 'filter' with monlist=" + monstring + " and interval=" + intervalstring); - EventServer.sendMessage("control", - { - type: 'filter', - monlist: monstring, - intlist: intervalstring - }, 1); - - if ($rootScope.apnsToken != "") - // if its defined then this is post init work - // so lets transmit state here - - { - // we need to disable the token - NVRDataModel.debug("Sending token state " + pushstate); - EventServer.sendMessage('push', - { - type: 'token', - platform: plat, - token: $rootScope.apnsToken, - state: pushstate - }, 1); - - } - - }); - - } // no event server configured/enabled - else - { - if ($rootScope.apnsToken != "") - // if its defined then this is post init work - // so lets transmit state here - - { - // we need to disable the token - NVRDataModel.debug("Sending token state " + pushstate); - EventServer.sendMessage('push', - { - type: 'token', - platform: plat, - token: $rootScope.apnsToken, - state: pushstate - }, 1); - - } - // Give the above some time to transmit - - $timeout ( function() {EventServer.disconnect();},1000); + var pushstate = "enabled"; + if ($scope.loginData.disablePush == true || $scope.loginData.isUseEventServer == false) + pushstate = "disabled"; - } + if ($scope.loginData.isUseEventServer == true) { + EventServer.disconnect(); + EventServer.init() + .then(function (data) { + // console.log("Sending control filter"); + NVRDataModel.debug("Sending Control message 'filter' with monlist=" + monstring + " and interval=" + intervalstring); + EventServer.sendMessage("control", { + type: 'filter', + monlist: monstring, + intlist: intervalstring + }, 1); - NVRDataModel.displayBanner('info', ['settings saved']); - } + if ($rootScope.apnsToken != "") + // if its defined then this is post init work + // so lets transmit state here - //---------------------------------------------------------------- - // returns domain name in string - - // http://stackoverflow.com/questions/8498592/extract-root-domain-name-from-string - //---------------------------------------------------------------- - function extractDomain(url) - { - var domain; - //find & remove protocol (http, ftp, etc.) and get domain - if (url.indexOf("://") > -1) - { - domain = url.split('/')[2]; - } - else - { - domain = url.split('/')[0]; - } + { + // we need to disable the token + NVRDataModel.debug("Sending token state " + pushstate); + EventServer.sendMessage('push', { + type: 'token', + platform: plat, + token: $rootScope.apnsToken, + state: pushstate + }, 1); - //find & remove port number - domain = domain.split(':')[0]; + } - return domain; - } + }); - //---------------------------------------------------------------- - // returns reporting interval for monitor ID - //---------------------------------------------------------------- - function getInterval(id) - { - // means no interval, should only happen one time - // till we save - if ($scope.loginData.eventServerInterval == "") - return 0; - var retval = 0; - for (var i = 0; i < res.length; i++) - { - if (res[i] == id) - { - retval = parseInt(minterval[i]); - break; - } - } - return retval; - } + } // no event server configured/enabled + else { + if ($rootScope.apnsToken != "") + // if its defined then this is post init work + // so lets transmit state here + + { + // we need to disable the token + NVRDataModel.debug("Sending token state " + pushstate); + EventServer.sendMessage('push', { + type: 'token', + platform: plat, + token: $rootScope.apnsToken, + state: pushstate + }, 1); + + } + // Give the above some time to transmit + + $timeout(function () { + EventServer.disconnect(); + }, 1000); - //---------------------------------------------------------------- - // Returns true/false if monitor ID is in event monitor list - //---------------------------------------------------------------- - function isEnabled(id) - { - if ($scope.loginData.eventServerMonitors == "") - return true; + } - var isThere = false; - for (var i = 0; i < res.length; i++) - { - if (res[i] == id) - { - isThere = true; - //console.log("isRes found: " + id); - break; - } - } - return isThere; + NVRDataModel.displayBanner('info', ['settings saved']); + } + + //---------------------------------------------------------------- + // returns domain name in string - + // http://stackoverflow.com/questions/8498592/extract-root-domain-name-from-string + //---------------------------------------------------------------- + function extractDomain(url) { + var domain; + //find & remove protocol (http, ftp, etc.) and get domain + if (url.indexOf("://") > -1) { + domain = url.split('/')[2]; + } else { + domain = url.split('/')[0]; } - //------------------------------------------------------------------------- - // Controller Main - //------------------------------------------------------------------------ - $scope.monitors = []; - $scope.monitors = message; - var res, minterval; + //find & remove port number + domain = domain.split(':')[0]; + + return domain; + } + + //---------------------------------------------------------------- + // returns reporting interval for monitor ID + //---------------------------------------------------------------- + function getInterval(id) { + // means no interval, should only happen one time + // till we save + if ($scope.loginData.eventServerInterval == "") + return 0; + var retval = 0; + for (var i = 0; i < res.length; i++) { + if (res[i] == id) { + retval = parseInt(minterval[i]); + break; + } + } + return retval; + } + + //---------------------------------------------------------------- + // Returns true/false if monitor ID is in event monitor list + //---------------------------------------------------------------- + function isEnabled(id) { + if ($scope.loginData.eventServerMonitors == "") + return true; + + var isThere = false; + for (var i = 0; i < res.length; i++) { + if (res[i] == id) { + isThere = true; + //console.log("isRes found: " + id); + break; + } + } + return isThere; + } + + //------------------------------------------------------------------------- + // Controller Main + //------------------------------------------------------------------------ + $scope.monitors = []; + $scope.monitors = message; + var res, minterval; }]); diff --git a/www/js/EventsGraphsCtrl.js b/www/js/EventsGraphsCtrl.js index d57472e4..bfffb351 100644 --- a/www/js/EventsGraphsCtrl.js +++ b/www/js/EventsGraphsCtrl.js @@ -8,243 +8,219 @@ // the main function is generateChart. I call generate chart with required parameters // from the template file -angular.module('zmApp.controllers').controller('zmApp.EventsGraphsCtrl', ['$ionicPlatform', '$scope', 'zm', 'NVRDataModel', '$ionicSideMenuDelegate', '$rootScope', '$http', '$ionicHistory', '$state', function($ionicPlatform, $scope, zm, NVRDataModel, $ionicSideMenuDelegate, $rootScope, $http, $ionicHistory, $state) -{ - //console.log("Inside Graphs controller"); - $scope.openMenu = function() - { - $ionicSideMenuDelegate.toggleLeft(); - }; - - $scope.$on('$ionicView.loaded', function() - { - // console.log("**VIEW ** Graph Ctrl Loaded"); - }); - - //---------------------------------------------------------------- - // Alarm notification handling - //---------------------------------------------------------------- - $scope.handleAlarms = function() - { - $rootScope.isAlarm = !$rootScope.isAlarm; - if (!$rootScope.isAlarm) - { - $rootScope.alarmCount = "0"; - $ionicHistory.nextViewOptions( - { - disableBack: true - }); - $state.go("app.events", - { - "id": 0, - "playEvent": false - }, - { - reload: true - }); - return; - } - }; - - //------------------------------------------------------------------------- - // Lets make sure we set screen dim properly as we enter - // The problem is we enter other states before we leave previous states - // from a callback perspective in ionic, so we really can't predictably - // reset power state on exit as if it is called after we enter another - // state, that effectively overwrites current view power management needs - //------------------------------------------------------------------------ - $scope.$on('$ionicView.enter', function() - { - // console.log("**VIEW ** EventsGraphs Ctrl Entered"); - NVRDataModel.setAwake(false); - }); - - $scope.$on('$ionicView.leave', function() - { - // console.log("**VIEW ** Graph Ctrl Left"); - }); - - $scope.$on('$ionicView.unloaded', function() - { - // console.log("**VIEW ** Graph Ctrl Unloaded"); - }); - - //------------------------------------------------- - // Controller main - //------------------------------------------------- - - // $scope.chart = ""; - $scope.navTitle = 'Tab Page'; - // $scope.chart=""; - $scope.leftButtons = [ - { - type: 'button-icon icon ion-navicon', - tap: function(e) - { - $scope.toggleMenu(); - } - }]; - - var container = angular.element(document.getElementById('visualization')); - //console.log(JSON.stringify(container)); - var data = [ - { - id: 1, - content: 'item 1', - start: '2013-04-20' +angular.module('zmApp.controllers').controller('zmApp.EventsGraphsCtrl', ['$ionicPlatform', '$scope', 'zm', 'NVRDataModel', '$ionicSideMenuDelegate', '$rootScope', '$http', '$ionicHistory', '$state', function ($ionicPlatform, $scope, zm, NVRDataModel, $ionicSideMenuDelegate, $rootScope, $http, $ionicHistory, $state) { + //console.log("Inside Graphs controller"); + $scope.openMenu = function () { + $ionicSideMenuDelegate.toggleLeft(); + }; + + $scope.$on('$ionicView.loaded', function () { + // console.log("**VIEW ** Graph Ctrl Loaded"); + }); + + //---------------------------------------------------------------- + // Alarm notification handling + //---------------------------------------------------------------- + $scope.handleAlarms = function () { + $rootScope.isAlarm = !$rootScope.isAlarm; + if (!$rootScope.isAlarm) { + $rootScope.alarmCount = "0"; + $ionicHistory.nextViewOptions({ + disableBack: true + }); + $state.go("app.events", { + "id": 0, + "playEvent": false + }, { + reload: true + }); + return; + } + }; + + //------------------------------------------------------------------------- + // Lets make sure we set screen dim properly as we enter + // The problem is we enter other states before we leave previous states + // from a callback perspective in ionic, so we really can't predictably + // reset power state on exit as if it is called after we enter another + // state, that effectively overwrites current view power management needs + //------------------------------------------------------------------------ + $scope.$on('$ionicView.enter', function () { + // console.log("**VIEW ** EventsGraphs Ctrl Entered"); + NVRDataModel.setAwake(false); + }); + + $scope.$on('$ionicView.leave', function () { + // console.log("**VIEW ** Graph Ctrl Left"); + }); + + $scope.$on('$ionicView.unloaded', function () { + // console.log("**VIEW ** Graph Ctrl Unloaded"); + }); + + //------------------------------------------------- + // Controller main + //------------------------------------------------- + + // $scope.chart = ""; + $scope.navTitle = 'Tab Page'; + // $scope.chart=""; + $scope.leftButtons = [{ + type: 'button-icon icon ion-navicon', + tap: function (e) { + $scope.toggleMenu(); + } + }]; + + var container = angular.element(document.getElementById('visualization')); + //console.log(JSON.stringify(container)); + var data = [{ + id: 1, + content: 'item 1', + start: '2013-04-20' }, { - id: 2, - content: 'item 2', - start: '2013-04-14' + id: 2, + content: 'item 2', + start: '2013-04-14' }, { - id: 3, - content: 'item 3', - start: '2013-04-18' + id: 3, + content: 'item 3', + start: '2013-04-18' }, { - id: 4, - content: 'item 4', - start: '2013-04-16', - end: '2013-04-19' + id: 4, + content: 'item 4', + start: '2013-04-16', + end: '2013-04-19' }, { - id: 5, - content: 'item 5', - start: '2013-04-25' + id: 5, + content: 'item 5', + start: '2013-04-25' }, { - id: 6, - content: 'item 6', - start: '2013-04-27' - }]; - var options = {}; - //var timeline = new vis.Timeline(container[0], data, options); - - // ------------------------------------------------- - // Called when user taps on a bar - //--------------------------------------------------- - $scope.handleChartClick = function(event) - { + id: 6, + content: 'item 6', + start: '2013-04-27' + } + ]; + var options = {}; + //var timeline = new vis.Timeline(container[0], data, options); + + // ------------------------------------------------- + // Called when user taps on a bar + //--------------------------------------------------- + $scope.handleChartClick = function (event) { + + //console.log(JSON.stringify($scope.chartwithbars.getBarsAtEvent(event))); + //console.log(angular.element[0].getContext('2d')); + //console.log (JSON.stringify( $scope.chart)); + + }; + + //------------------------------------------------- + // Generates a bar graph with data provided + //------------------------------------------------- + $scope.generateTCChart = function (id, chartTitle, hrs) { + var monitors = []; + var dateRange = ""; + var startDate = ""; + var endDate = ""; + + $scope.chart = { + barHeight: "", + data: "", + options: "" - //console.log(JSON.stringify($scope.chartwithbars.getBarsAtEvent(event))); - //console.log(angular.element[0].getContext('2d')); - //console.log (JSON.stringify( $scope.chart)); + }; + $scope.chart.barHeight = $rootScope.devHeight; + + if (hrs) { + // Apply a time based filter if I am not watching all events + var cur = moment(); + endDate = cur.format("YYYY-MM-DD " + NVRDataModel.getTimeFormat()); + startDate = cur.subtract(hrs, 'hours').format("YYYY-MM-DD " + NVRDataModel.getTimeFormat()); + //console.log("Start and End " + startDate + "==" + endDate); + NVRDataModel.log("Generating graph for " + startDate + " to " + endDate); + + } + + var loginData = NVRDataModel.getLogin(); + //$scope.chart.data = {}; + $scope.chart.data = { + labels: [], + datasets: [{ + label: '', + fillColor: zm.graphFillColor, + strokeColor: zm.graphStrokeColor, + highlightFill: zm.graphHighlightFill, + data: [] + }, ] }; - //------------------------------------------------- - // Generates a bar graph with data provided - //------------------------------------------------- - $scope.generateTCChart = function(id, chartTitle, hrs) - { - var monitors = []; - var dateRange = ""; - var startDate = ""; - var endDate = ""; - - $scope.chart = { - barHeight: "", - data: "", - options: "" - - }; - - $scope.chart.barHeight = $rootScope.devHeight; - - if (hrs) - { - // Apply a time based filter if I am not watching all events - var cur = moment(); - endDate = cur.format("YYYY-MM-DD " + NVRDataModel.getTimeFormat()); - startDate = cur.subtract(hrs, 'hours').format("YYYY-MM-DD " + NVRDataModel.getTimeFormat()); - //console.log("Start and End " + startDate + "==" + endDate); - NVRDataModel.log("Generating graph for " + startDate + " to " + endDate); - - } - - var loginData = NVRDataModel.getLogin(); - //$scope.chart.data = {}; - $scope.chart.data = { - labels: [], - datasets: [ - { - label: '', - fillColor: zm.graphFillColor, - strokeColor: zm.graphStrokeColor, - highlightFill: zm.graphHighlightFill, - data: [] - }, ] - }; - - NVRDataModel.getMonitors(0).then(function(data) - { - monitors = data; - var adjustedHeight = monitors.length * 30; - if (adjustedHeight > $rootScope.devHeight) - { - - $scope.chart.barHeight = adjustedHeight; - //console.log("********* BAR HEIGHT TO " + $scope.chart.barHeight); - } - - for (var i = 0; i < monitors.length; i++) - { - (function(j) - { // loop closure - http is async, so success returns after i goes out of scope - // so we need to bind j to i when http returns so its not out of scope. Gak. - // I much prefer the old days of passing context data from request to response - - $scope.chart.data.labels.push(monitors[j].Monitor.Name); - - //$scope.chartObject[id].data.push([monitors[j].Monitor.Name,'0','color:#76A7FA','0']); - // $scope.chartObject.data[j+1]=([monitors[j].Monitor.Name,'100','color:#76A7FA','0']); - - var dateString = ""; - if (hrs) - { - dateString = "/StartTime >=:" + startDate + "/EndTime <=:" + endDate; - } - var url = loginData.apiurl + - "/events/index/MonitorId:" + monitors[j].Monitor.Id + dateString + - ".json?page=1"; - // console.log("Monitor event URL:" + url); - NVRDataModel.log("EventGraph: composed url is " + url); - $http.get(url /*,{timeout:15000}*/ ) - .success(function(data) - { - NVRDataModel.debug("Event count for monitor" + - monitors[j].Monitor.Id + " is " + data.pagination.count); - $scope.chart.data.datasets[0].data[j] = data.pagination.count; - }) - .error(function(data) - { - // ideally I should be treating it as an error - // but what I am really doing now is treating it like no events - // works but TBD: make this into a proper error handler - $scope.chart.data.datasets[0].data[j] = 0; - NVRDataModel.log("Error retrieving events for graph " + JSON.stringify(data), "error"); - }); - })(i); // j - } //for - }); - - $scope.chart.options = { - - responsive: true, - scaleBeginAtZero: true, - scaleShowGridLines: false, - scaleGridLineColor: "rgba(0,0,0,.05)", - scaleGridLineWidth: 1, - barShowStroke: true, - barStrokeWidth: 2, - barValueSpacing: 5, - barDatasetSpacing: 1, - showTooltip: true, - - //String - A legend template - // legendTemplate : '<ul class="tc-chart-js-legend"><% for (var i=0; i<datasets.length; i++){%><li><span style="background-color:<%=datasets[i].fillColor%>"></span><%if(datasets[i].label){%><%=datasets[i].label%><%}%></li><%}%></ul>' - }; - }; //generateTCChart + NVRDataModel.getMonitors(0).then(function (data) { + monitors = data; + var adjustedHeight = monitors.length * 30; + if (adjustedHeight > $rootScope.devHeight) { + + $scope.chart.barHeight = adjustedHeight; + //console.log("********* BAR HEIGHT TO " + $scope.chart.barHeight); + } + + for (var i = 0; i < monitors.length; i++) { + (function (j) { // loop closure - http is async, so success returns after i goes out of scope + // so we need to bind j to i when http returns so its not out of scope. Gak. + // I much prefer the old days of passing context data from request to response + + $scope.chart.data.labels.push(monitors[j].Monitor.Name); + + //$scope.chartObject[id].data.push([monitors[j].Monitor.Name,'0','color:#76A7FA','0']); + // $scope.chartObject.data[j+1]=([monitors[j].Monitor.Name,'100','color:#76A7FA','0']); + + var dateString = ""; + if (hrs) { + dateString = "/StartTime >=:" + startDate + "/EndTime <=:" + endDate; + } + var url = loginData.apiurl + + "/events/index/MonitorId:" + monitors[j].Monitor.Id + dateString + + ".json?page=1"; + // console.log("Monitor event URL:" + url); + NVRDataModel.log("EventGraph: composed url is " + url); + $http.get(url /*,{timeout:15000}*/ ) + .success(function (data) { + NVRDataModel.debug("Event count for monitor" + + monitors[j].Monitor.Id + " is " + data.pagination.count); + $scope.chart.data.datasets[0].data[j] = data.pagination.count; + }) + .error(function (data) { + // ideally I should be treating it as an error + // but what I am really doing now is treating it like no events + // works but TBD: make this into a proper error handler + $scope.chart.data.datasets[0].data[j] = 0; + NVRDataModel.log("Error retrieving events for graph " + JSON.stringify(data), "error"); + }); + })(i); // j + } //for + }); + + $scope.chart.options = { + + responsive: true, + scaleBeginAtZero: true, + scaleShowGridLines: false, + scaleGridLineColor: "rgba(0,0,0,.05)", + scaleGridLineWidth: 1, + barShowStroke: true, + barStrokeWidth: 2, + barValueSpacing: 5, + barDatasetSpacing: 1, + showTooltip: true, + + //String - A legend template + // legendTemplate : '<ul class="tc-chart-js-legend"><% for (var i=0; i<datasets.length; i++){%><li><span style="background-color:<%=datasets[i].fillColor%>"></span><%if(datasets[i].label){%><%=datasets[i].label%><%}%></li><%}%></ul>' + }; + }; //generateTCChart }]); diff --git a/www/js/EventsModalGraphCtrl.js b/www/js/EventsModalGraphCtrl.js index 3db8b31e..b4e82ee2 100644 --- a/www/js/EventsModalGraphCtrl.js +++ b/www/js/EventsModalGraphCtrl.js @@ -3,139 +3,126 @@ /* jslint browser: true*/ /* global saveAs, cordova,StatusBar,angular,console,ionic, moment, vis , Chart, DJS*/ -angular.module('zmApp.controllers').controller('EventsModalGraphCtrl', ['$scope', '$rootScope', 'zm', 'NVRDataModel', '$ionicSideMenuDelegate', '$timeout', '$interval', '$ionicModal', '$ionicLoading', '$http', '$state', '$stateParams', '$ionicHistory', '$ionicScrollDelegate', '$q', '$sce', 'carouselUtils', '$ionicPopup', '$translate', function($scope, $rootScope, zm, NVRDataModel, $ionicSideMenuDelegate, $timeout, $interval, $ionicModal, $ionicLoading, $http, $state, $stateParams, $ionicHistory, $ionicScrollDelegate, $q, $sce, carouselUtils, $ionicPopup, $translate) -{ - - var Graph2d; - var tcGraph; - var items; - var groups; - var eventImageDigits = 5; - var cv; - var ctx; - //var options; - //var data; - var onlyalarm_data; - var current_data; - var current_options; - var btype; - var data, options; - var broadCastHandles = []; - - - $scope.$on('modal.removed', function(e, m) - { - NVRDataModel.debug ("Deregistering broadcast handles"); - for (var i=0; i < broadcastHandles.length; i++) { - // broadcastHandles[i](); - } - broadcastHandles = []; - }); - - $scope.$on('modal.shown', function(e, m) - { - - if (m.id != 'modalgraph') - return; - - //console.log ("INSIDE MODAL GRAPH>>>>>>>>>>>>>>>>>"); - data = { - labels: ["January", "February", "March", "April", "May", "June", "July"], - datasets: [ - { - label: "My First dataset", - fillColor: "rgba(220,220,220,0.5)", - strokeColor: "rgba(220,220,220,0.8)", - highlightFill: "rgba(220,220,220,0.75)", - highlightStroke: "rgba(220,220,220,1)", - data: [65, 59, 80, 81, 56, 55, 40] - }, - { - label: "My Second dataset", - fillColor: "rgba(151,187,205,0.5)", - strokeColor: "rgba(151,187,205,0.8)", - highlightFill: "rgba(151,187,205,0.75)", - highlightStroke: "rgba(151,187,205,1)", - data: [28, 48, 40, 19, 86, 27, 90] - }] - }; - - options = { - - scales: - { - yAxes: [ - { - ticks: - { - // beginAtZero:true, - min: -1, - }, - }], - xAxes: [ - { - display: false - }] - }, - - responsive: true, - scaleBeginAtZero: true, - scaleShowGridLines: true, - scaleGridLineColor: "rgba(0,0,0,.05)", - scaleGridLineWidth: 1, - - hover: - { - mode: 'single', - onHover: function(obj) - { - if (obj.length > 0) - tapOrHover(obj[0]._index); - } - }, - - //String - A legend template - legendTemplate: '<ul class="tc-chart-js-legend"><% for (var i=0; i<datasets.length; i++){%><li><span style="background-color:<%=datasets[i].fillColor%>"></span><%if(datasets[i].label){%><%=datasets[i].label%><%}%></li><%}%></ul>' - }; - - cv = document.getElementById("eventchart"); - ctx = cv.getContext("2d"); - $timeout(function() +angular.module('zmApp.controllers').controller('EventsModalGraphCtrl', ['$scope', '$rootScope', 'zm', 'NVRDataModel', '$ionicSideMenuDelegate', '$timeout', '$interval', '$ionicModal', '$ionicLoading', '$http', '$state', '$stateParams', '$ionicHistory', '$ionicScrollDelegate', '$q', '$sce', 'carouselUtils', '$ionicPopup', '$translate', function ($scope, $rootScope, zm, NVRDataModel, $ionicSideMenuDelegate, $timeout, $interval, $ionicModal, $ionicLoading, $http, $state, $stateParams, $ionicHistory, $ionicScrollDelegate, $q, $sce, carouselUtils, $ionicPopup, $translate) { + + var Graph2d; + var tcGraph; + var items; + var groups; + var eventImageDigits = 5; + var cv; + var ctx; + //var options; + //var data; + var onlyalarm_data; + var current_data; + var current_options; + var btype; + var data, options; + var broadCastHandles = []; + + + $scope.$on('modal.removed', function (e, m) { + NVRDataModel.debug("Deregistering broadcast handles"); + for (var i = 0; i < broadcastHandles.length; i++) { + // broadcastHandles[i](); + } + broadcastHandles = []; + }); + + $scope.$on('modal.shown', function (e, m) { + + if (m.id != 'modalgraph') + return; + + //console.log ("INSIDE MODAL GRAPH>>>>>>>>>>>>>>>>>"); + data = { + labels: ["January", "February", "March", "April", "May", "June", "July"], + datasets: [{ + label: "My First dataset", + fillColor: "rgba(220,220,220,0.5)", + strokeColor: "rgba(220,220,220,0.8)", + highlightFill: "rgba(220,220,220,0.75)", + highlightStroke: "rgba(220,220,220,1)", + data: [65, 59, 80, 81, 56, 55, 40] + }, { - var tcGraph2 = new Chart(ctx, - { - type: 'bar', - data: data, - options: options - }); - }); + label: "My Second dataset", + fillColor: "rgba(151,187,205,0.5)", + strokeColor: "rgba(151,187,205,0.8)", + highlightFill: "rgba(151,187,205,0.75)", + highlightStroke: "rgba(151,187,205,1)", + data: [28, 48, 40, 19, 86, 27, 90] + } + ] + }; + + options = { + + scales: { + yAxes: [{ + ticks: { + // beginAtZero:true, + min: -1, + }, + }], + xAxes: [{ + display: false + }] + }, + + responsive: true, + scaleBeginAtZero: true, + scaleShowGridLines: true, + scaleGridLineColor: "rgba(0,0,0,.05)", + scaleGridLineWidth: 1, + + hover: { + mode: 'single', + onHover: function (obj) { + if (obj.length > 0) + tapOrHover(obj[0]._index); + } + }, + + //String - A legend template + legendTemplate: '<ul class="tc-chart-js-legend"><% for (var i=0; i<datasets.length; i++){%><li><span style="background-color:<%=datasets[i].fillColor%>"></span><%if(datasets[i].label){%><%=datasets[i].label%><%}%></li><%}%></ul>' + }; + + cv = document.getElementById("eventchart"); + ctx = cv.getContext("2d"); + $timeout(function () { + var tcGraph2 = new Chart(ctx, { + type: 'bar', + data: data, + options: options + }); }); + }); - //------------------------------------------------------- - // we use this to reload the connkey if authkey changed - //------------------------------------------------------ + //------------------------------------------------------- + // we use this to reload the connkey if authkey changed + //------------------------------------------------------ - var as = $scope.$on("auth-success", function() - { + var as = $scope.$on("auth-success", function () { - NVRDataModel.debug("EventModalCtrl: Re-login detected, resetting everything & re-generating connkey"); + NVRDataModel.debug("EventModalCtrl: Re-login detected, resetting everything & re-generating connkey"); - }); - broadCastHandles.push(as); + }); + broadCastHandles.push(as); - //------------------------------------------------------- - // I was kidding, this is where it really is drawn - // scout's promise - //------------------------------------------------------ + //------------------------------------------------------- + // I was kidding, this is where it really is drawn + // scout's promise + //------------------------------------------------------ - function drawGraphTC(event) - { + function drawGraphTC(event) { - $scope.eid = event.event.Event.Id; + $scope.eid = event.event.Event.Id; - $scope.alarm_images = []; + $scope.alarm_images = []; - /*data = { + /*data = { labels: [], datasets: [ { @@ -159,263 +146,236 @@ angular.module('zmApp.controllers').controller('EventsModalGraphCtrl', ['$scope' ] };*/ - data = { - labels: [], - datasets: [ - { - label: $translate.instant('kScore'), - fill: true, - backgroundColor: 'rgba(129, 207, 224, 1.0)', - borderColor: 'rgb(92, 147, 159)', - borderCapStyle: 'butt', - borderJoinStyle: 'miter', - pointBorderColor: "rgba(220,220,220,1)", - pointBackgroundColor: "#e74c3c", - - pointHoverRadius: 10, - pointHoverBackgroundColor: "#f39c12", - pointHoverBorderWidth: 1, - tension: 0.1, - - data: [], - frames: [] - }, - - ] - }; - - onlyalarm_data = { - labels: [], - datasets: [ - { - label: $translate.instant('kScore'), - backgroundColor: 'rgba(129, 207, 224, 1.0)', - borderColor: 'rgba(129, 207, 224, 1.0)', - hoverBackgroundColor: 'rgba(248, 148, 6,1.0)', - hoverBorderColor: 'rgba(248, 148, 6,1.0)', - data: [], - frames: [] - }, - - ] - }; - - // Chart.js Options - options = { - - scales: - { - yAxes: [ - { - ticks: - { - // beginAtZero:true, - min: -1, - }, - }], - xAxes: [ - { - display: false - }] - }, - - responsive: true, - scaleBeginAtZero: true, - scaleShowGridLines: true, - scaleGridLineColor: "rgba(0,0,0,.05)", - scaleGridLineWidth: 1, - - hover: - { - mode: 'single', - onHover: function(obj) - { - if (obj.length > 0) - tapOrHover(obj[0]._index); - } - }, - - //String - A legend template - legendTemplate: '<ul class="tc-chart-js-legend"><% for (var i=0; i<datasets.length; i++){%><li><span style="background-color:<%=datasets[i].fillColor%>"></span><%if(datasets[i].label){%><%=datasets[i].label%><%}%></li><%}%></ul>' - }; - - $scope.graphWidth = event.event.Frame.length * 10; - if ($scope.graphWidth < $rootScope.devWidth) - $scope.graphWidth = $rootScope.devWidth; - - // NVRDataModel.log ("Changing graph width to " + $scope.graphWidth); - - for (var i = 0; i < event.event.Frame.length; i++) - { + data = { + labels: [], + datasets: [{ + label: $translate.instant('kScore'), + fill: true, + backgroundColor: 'rgba(129, 207, 224, 1.0)', + borderColor: 'rgb(92, 147, 159)', + borderCapStyle: 'butt', + borderJoinStyle: 'miter', + pointBorderColor: "rgba(220,220,220,1)", + pointBackgroundColor: "#e74c3c", - data.labels.push(event.event.Frame[i].TimeStamp); - //data.labels.push(' '); - data.datasets[0].data.push(event.event.Frame[i].Score); - data.datasets[0].frames.push( - { - x: event.event.Frame[i].TimeStamp, - y: event.event.Frame[i].Score, - eid: event.event.Event.Id, - fid: event.event.Frame[i].FrameId, - //group:i, - relativePath: computeRelativePath(event.event), - score: event.event.Frame[i].Score, - fname: padToN(event.event.Frame[i].FrameId, eventImageDigits) + "-capture.jpg", - - }); - - if (event.event.Frame[i].Type == "Alarm") - { - - onlyalarm_data.labels.push(event.event.Frame[i].TimeStamp); - //data.labels.push(' '); - onlyalarm_data.datasets[0].data.push(event.event.Frame[i].Score); - onlyalarm_data.datasets[0].frames.push( - { - x: event.event.Frame[i].TimeStamp, - y: event.event.Frame[i].Score, - eid: event.event.Event.Id, - fid: event.event.Frame[i].FrameId, - //group:i, - relativePath: computeRelativePath(event.event), - score: event.event.Frame[i].Score, - fname: padToN(event.event.Frame[i].FrameId, eventImageDigits) + "-capture.jpg", - - }); - } + pointHoverRadius: 10, + pointHoverBackgroundColor: "#f39c12", + pointHoverBorderWidth: 1, + tension: 0.1, - } + data: [], + frames: [] + }, - $scope.dataReady = true; + ] + }; - cv = document.getElementById("tcchart"); - ctx = cv.getContext("2d"); + onlyalarm_data = { + labels: [], + datasets: [{ + label: $translate.instant('kScore'), + backgroundColor: 'rgba(129, 207, 224, 1.0)', + borderColor: 'rgba(129, 207, 224, 1.0)', + hoverBackgroundColor: 'rgba(248, 148, 6,1.0)', + hoverBorderColor: 'rgba(248, 148, 6,1.0)', + data: [], + frames: [] + }, - if (NVRDataModel.getLogin().timelineModalGraphType == 'all') - { - btype = 'line'; - current_data = data; - } - else - { - btype = 'bar'; - current_data = onlyalarm_data; + ] + }; + + // Chart.js Options + options = { + + scales: { + yAxes: [{ + ticks: { + // beginAtZero:true, + min: -1, + }, + }], + xAxes: [{ + display: false + }] + }, + + responsive: true, + scaleBeginAtZero: true, + scaleShowGridLines: true, + scaleGridLineColor: "rgba(0,0,0,.05)", + scaleGridLineWidth: 1, + + hover: { + mode: 'single', + onHover: function (obj) { + if (obj.length > 0) + tapOrHover(obj[0]._index); } - $timeout(function() - { - tcGraph = new Chart(ctx, - { - type: btype, - data: current_data, - options: options - }); - }); + }, + + //String - A legend template + legendTemplate: '<ul class="tc-chart-js-legend"><% for (var i=0; i<datasets.length; i++){%><li><span style="background-color:<%=datasets[i].fillColor%>"></span><%if(datasets[i].label){%><%=datasets[i].label%><%}%></li><%}%></ul>' + }; + + $scope.graphWidth = event.event.Frame.length * 10; + if ($scope.graphWidth < $rootScope.devWidth) + $scope.graphWidth = $rootScope.devWidth; + + // NVRDataModel.log ("Changing graph width to " + $scope.graphWidth); + + for (var i = 0; i < event.event.Frame.length; i++) { + + data.labels.push(event.event.Frame[i].TimeStamp); + //data.labels.push(' '); + data.datasets[0].data.push(event.event.Frame[i].Score); + data.datasets[0].frames.push({ + x: event.event.Frame[i].TimeStamp, + y: event.event.Frame[i].Score, + eid: event.event.Event.Id, + fid: event.event.Frame[i].FrameId, + //group:i, + relativePath: computeRelativePath(event.event), + score: event.event.Frame[i].Score, + fname: padToN(event.event.Frame[i].FrameId, eventImageDigits) + "-capture.jpg", + + }); + + if (event.event.Frame[i].Type == "Alarm") { + + onlyalarm_data.labels.push(event.event.Frame[i].TimeStamp); + //data.labels.push(' '); + onlyalarm_data.datasets[0].data.push(event.event.Frame[i].Score); + onlyalarm_data.datasets[0].frames.push({ + x: event.event.Frame[i].TimeStamp, + y: event.event.Frame[i].Score, + eid: event.event.Event.Id, + fid: event.event.Frame[i].FrameId, + //group:i, + relativePath: computeRelativePath(event.event), + score: event.event.Frame[i].Score, + fname: padToN(event.event.Frame[i].FrameId, eventImageDigits) + "-capture.jpg", - cv.onclick = function(e) - { - var b = tcGraph.getElementAtEvent(e); - if (b.length > 0) - { - tapOrHover(b[0]._index); - } - }; - } - - function tapOrHover(ndx) - { - - $timeout(function() - { - - //console.log ("You tapped " + ndx); - $scope.alarm_images = []; - $scope.playbackURL = NVRDataModel.getLogin().url; - var items = current_data.datasets[0].frames[ndx]; - $scope.alarm_images.push( - { - relativePath: items.relativePath, - fid: items.fid, - fname: items.fname, - score: items.score, - time: moment(items.x).format("MMM D," + NVRDataModel.getTimeFormatSec()), - eid: items.eid - }); }); + } } - //-------------------------------------------------------- - // utility function - //-------------------------------------------------------- - - function computeRelativePath(event) - { - var relativePath = ""; - var loginData = NVRDataModel.getLogin(); - var str = event.Event.StartTime; - var yy = moment(str).locale('en').format('YY'); - var mm = moment(str).locale('en').format('MM'); - var dd = moment(str).locale('en').format('DD'); - var hh = moment(str).locale('en').format('HH'); - var min = moment(str).locale('en').format('mm'); - var sec = moment(str).locale('en').format('ss'); - relativePath = event.Event.MonitorId + "/" + - yy + "/" + - mm + "/" + - dd + "/" + - hh + "/" + - min + "/" + - sec + "/"; - return relativePath; + $scope.dataReady = true; - } + cv = document.getElementById("tcchart"); + ctx = cv.getContext("2d"); - //-------------------------------------------------------- - // utility function - //-------------------------------------------------------- - - function computeBasePath(event) - { - var basePath = ""; - var loginData = NVRDataModel.getLogin(); - var str = event.Event.StartTime; - var yy = moment(str).locale('en').format('YY'); - var mm = moment(str).locale('en').format('MM'); - var dd = moment(str).locale('en').format('DD'); - var hh = moment(str).locale('en').format('HH'); - var min = moment(str).locale('en').format('mm'); - var sec = moment(str).locale('en').format('ss'); - - basePath = loginData.url + "/events/" + - event.Event.MonitorId + "/" + - yy + "/" + - mm + "/" + - dd + "/" + - hh + "/" + - min + "/" + - sec + "/"; - return basePath; + if (NVRDataModel.getLogin().timelineModalGraphType == 'all') { + btype = 'line'; + current_data = data; + } else { + btype = 'bar'; + current_data = onlyalarm_data; } + $timeout(function () { + tcGraph = new Chart(ctx, { + type: btype, + data: current_data, + options: options + }); + }); - function padToN(number, digits) - { + cv.onclick = function (e) { + var b = tcGraph.getElementAtEvent(e); + if (b.length > 0) { + tapOrHover(b[0]._index); + } + }; + } + + function tapOrHover(ndx) { + + $timeout(function () { + + //console.log ("You tapped " + ndx); + $scope.alarm_images = []; + $scope.playbackURL = NVRDataModel.getLogin().url; + var items = current_data.datasets[0].frames[ndx]; + $scope.alarm_images.push({ + relativePath: items.relativePath, + fid: items.fid, + fname: items.fname, + score: items.score, + time: moment(items.x).format("MMM D," + NVRDataModel.getTimeFormatSec()), + eid: items.eid + }); + }); - var i; - var stringMax = ""; - var stringLeading = ""; - for (i = 1; i <= digits; i++) - { - stringMax = stringMax + "9"; - if (i != digits) stringLeading = stringLeading + "0"; - } - var numMax = parseInt(stringMax); + } + + //-------------------------------------------------------- + // utility function + //-------------------------------------------------------- + + function computeRelativePath(event) { + var relativePath = ""; + var loginData = NVRDataModel.getLogin(); + var str = event.Event.StartTime; + var yy = moment(str).locale('en').format('YY'); + var mm = moment(str).locale('en').format('MM'); + var dd = moment(str).locale('en').format('DD'); + var hh = moment(str).locale('en').format('HH'); + var min = moment(str).locale('en').format('mm'); + var sec = moment(str).locale('en').format('ss'); + relativePath = event.Event.MonitorId + "/" + + yy + "/" + + mm + "/" + + dd + "/" + + hh + "/" + + min + "/" + + sec + "/"; + return relativePath; + + } + + //-------------------------------------------------------- + // utility function + //-------------------------------------------------------- + + function computeBasePath(event) { + var basePath = ""; + var loginData = NVRDataModel.getLogin(); + var str = event.Event.StartTime; + var yy = moment(str).locale('en').format('YY'); + var mm = moment(str).locale('en').format('MM'); + var dd = moment(str).locale('en').format('DD'); + var hh = moment(str).locale('en').format('HH'); + var min = moment(str).locale('en').format('mm'); + var sec = moment(str).locale('en').format('ss'); + + basePath = loginData.url + "/events/" + + event.Event.MonitorId + "/" + + yy + "/" + + mm + "/" + + dd + "/" + + hh + "/" + + min + "/" + + sec + "/"; + return basePath; + } + + function padToN(number, digits) { + + var i; + var stringMax = ""; + var stringLeading = ""; + for (i = 1; i <= digits; i++) { + stringMax = stringMax + "9"; + if (i != digits) stringLeading = stringLeading + "0"; + } + var numMax = parseInt(stringMax); - if (number <= numMax) - { - number = (stringLeading + number).slice(-digits); - } - //console.log ("PADTON: returning " + number); - return number; + if (number <= numMax) { + number = (stringLeading + number).slice(-digits); } + //console.log ("PADTON: returning " + number); + return number; + } }]); diff --git a/www/js/FirstUseCtrl.js b/www/js/FirstUseCtrl.js index 02293f77..89f45e96 100644 --- a/www/js/FirstUseCtrl.js +++ b/www/js/FirstUseCtrl.js @@ -2,94 +2,81 @@ /* jslint browser: true*/ /* global cordova,StatusBar,angular,console */ -angular.module('zmApp.controllers').controller('zmApp.FirstUseCtrl', ['$scope', '$ionicSideMenuDelegate', 'zm', '$stateParams', '$ionicHistory', '$state', 'NVRDataModel', '$rootScope', '$ionicPopup', '$translate', function($scope, $ionicSideMenuDelegate, zm, $stateParams, $ionicHistory, $state, NVRDataModel, $rootScope, $ionicPopup, $translate) -{ - $scope.openMenu = function() - { - $ionicSideMenuDelegate.toggleLeft(); - }; +angular.module('zmApp.controllers').controller('zmApp.FirstUseCtrl', ['$scope', '$ionicSideMenuDelegate', 'zm', '$stateParams', '$ionicHistory', '$state', 'NVRDataModel', '$rootScope', '$ionicPopup', '$translate', function ($scope, $ionicSideMenuDelegate, zm, $stateParams, $ionicHistory, $state, NVRDataModel, $rootScope, $ionicPopup, $translate) { + $scope.openMenu = function () { + $ionicSideMenuDelegate.toggleLeft(); + }; - //------------------------------------------------------------------------- - // Controller Main - //------------------------------------------------------------------------ - $scope.$on('$ionicView.enter', function() - { - //console.log("**VIEW ** FirstUse Ctrl Entered"); - $ionicSideMenuDelegate.canDragContent(true); - // right up here lets set certs to true, we will disable it later - // this is for first starts - - // - if (window.cordova) - { - cordova.plugins.certificates.trustUnsecureCerts(true); - NVRDataModel.log (">>>>>Accepting all certificates, since its first use"); - } + //------------------------------------------------------------------------- + // Controller Main + //------------------------------------------------------------------------ + $scope.$on('$ionicView.enter', function () { + //console.log("**VIEW ** FirstUse Ctrl Entered"); + $ionicSideMenuDelegate.canDragContent(true); + // right up here lets set certs to true, we will disable it later + // this is for first starts + // + if (window.cordova) { + cordova.plugins.certificates.trustUnsecureCerts(true); + NVRDataModel.log(">>>>>Accepting all certificates, since its first use"); + } - }); - $scope.switchLang = function() - { - $scope.lang = NVRDataModel.getLanguages(); - $scope.myopt = { - lang: "" - }; + }); - $rootScope.zmPopup = $ionicPopup.show( - { - scope: $scope, - template: '<ion-radio-fix ng-repeat="item in lang" ng-value="item.value" ng-model="myopt.lang"> {{item.text}} </ion-radio-fix>', + $scope.switchLang = function () { + $scope.lang = NVRDataModel.getLanguages(); + $scope.myopt = { + lang: "" + }; - title: $translate.instant('kSelectLanguage'), + $rootScope.zmPopup = $ionicPopup.show({ + scope: $scope, + template: '<ion-radio-fix ng-repeat="item in lang" ng-value="item.value" ng-model="myopt.lang"> {{item.text}} </ion-radio-fix>', - buttons: [ - { - text: $translate.instant('kButtonCancel'), - onTap: function(e) - { - //return "CANCEL"; - } + title: $translate.instant('kSelectLanguage'), - }, - { - text: $translate.instant('kButtonOk'), - onTap: function(e) - { - NVRDataModel.log("Language selected:" + $scope.myopt.lang); - NVRDataModel.setDefaultLanguage($scope.myopt.lang, true); + buttons: [{ + text: $translate.instant('kButtonCancel'), + onTap: function (e) { + //return "CANCEL"; + } - //return "OK"; + }, + { + text: $translate.instant('kButtonOk'), + onTap: function (e) { + NVRDataModel.log("Language selected:" + $scope.myopt.lang); + NVRDataModel.setDefaultLanguage($scope.myopt.lang, true); - } - }] - }); + //return "OK"; - }; + } + } + ] + }); - $scope.goToLogin = function() - { - $ionicHistory.nextViewOptions( - { - disableAnimate: false, - disableBack: true - }); - $state.go("app.login", - { - "wizard": false - }); - return; - }; + }; - $scope.goToWizard = function() - { - $ionicHistory.nextViewOptions( - { - disableAnimate: false, - disableBack: true - }); - $state.go("app.wizard"); - return; - }; + $scope.goToLogin = function () { + $ionicHistory.nextViewOptions({ + disableAnimate: false, + disableBack: true + }); + $state.go("app.login", { + "wizard": false + }); + return; + }; + + $scope.goToWizard = function () { + $ionicHistory.nextViewOptions({ + disableAnimate: false, + disableBack: true + }); + $state.go("app.wizard"); + return; + }; }]); diff --git a/www/js/HelpCtrl.js b/www/js/HelpCtrl.js index 005b7df1..b0cc14df 100644 --- a/www/js/HelpCtrl.js +++ b/www/js/HelpCtrl.js @@ -2,91 +2,78 @@ /* jslint browser: true*/ /* global cordova,StatusBar,angular,console, Masonry */ -angular.module('zmApp.controllers').controller('zmApp.HelpCtrl', ['$scope', '$rootScope', '$ionicModal', 'NVRDataModel', '$ionicSideMenuDelegate', '$ionicHistory', '$state', '$translate', '$q', '$templateRequest', '$sce', '$compile', function($scope, $rootScope, $ionicModal, NVRDataModel, $ionicSideMenuDelegate, $ionicHistory, $state, $translate, $q, $templateRequest, $sce, $compile) -{ - $scope.openMenu = function() - { - $ionicSideMenuDelegate.toggleLeft(); - }; +angular.module('zmApp.controllers').controller('zmApp.HelpCtrl', ['$scope', '$rootScope', '$ionicModal', 'NVRDataModel', '$ionicSideMenuDelegate', '$ionicHistory', '$state', '$translate', '$q', '$templateRequest', '$sce', '$compile', function ($scope, $rootScope, $ionicModal, NVRDataModel, $ionicSideMenuDelegate, $ionicHistory, $state, $translate, $q, $templateRequest, $sce, $compile) { + $scope.openMenu = function () { + $ionicSideMenuDelegate.toggleLeft(); + }; - //---------------------------------------------------------------- - // Alarm notification handling - //---------------------------------------------------------------- - $scope.handleAlarms = function() - { - $rootScope.isAlarm = !$rootScope.isAlarm; - if (!$rootScope.isAlarm) - { - $rootScope.alarmCount = "0"; - $ionicHistory.nextViewOptions( - { - disableBack: true - }); - $state.go("app.events", - { - "id": 0, - "playEvent": false - }, - { - reload: true - }); - return; - } - }; + //---------------------------------------------------------------- + // Alarm notification handling + //---------------------------------------------------------------- + $scope.handleAlarms = function () { + $rootScope.isAlarm = !$rootScope.isAlarm; + if (!$rootScope.isAlarm) { + $rootScope.alarmCount = "0"; + $ionicHistory.nextViewOptions({ + disableBack: true + }); + $state.go("app.events", { + "id": 0, + "playEvent": false + }, { + reload: true + }); + return; + } + }; - //---------------------------------------------------------------- - // This function dynamically inserts the relevant help text file - // based on selected language - //---------------------------------------------------------------- + //---------------------------------------------------------------- + // This function dynamically inserts the relevant help text file + // based on selected language + //---------------------------------------------------------------- - function insertHelp() - { + function insertHelp() { - var l = NVRDataModel.getDefaultLanguage() || 'en'; - var lang = "lang/help/help-" + l + ".html"; - //console.log ("LANG IS " + lang); - var templateUrl = $sce.getTrustedResourceUrl(lang); - var lang_fb = "lang/help/help-" + "en" + ".html"; - var templateUrlFB = $sce.getTrustedResourceUrl(lang_fb); + var l = NVRDataModel.getDefaultLanguage() || 'en'; + var lang = "lang/help/help-" + l + ".html"; + //console.log ("LANG IS " + lang); + var templateUrl = $sce.getTrustedResourceUrl(lang); + var lang_fb = "lang/help/help-" + "en" + ".html"; + var templateUrlFB = $sce.getTrustedResourceUrl(lang_fb); - $templateRequest(lang) - .then(function(template) - { - var elem = angular.element(document.getElementById('insertHelp')); - $compile(elem.html(template).contents())($scope); - }, - function(error) - { - NVRDataModel.log("Language file " + lang + " not found, falling back"); - $templateRequest(templateUrlFB) - .then(function(template) - { - var elem = angular.element(document.getElementById('insertHelp')); - $compile(elem.html(template).contents())($scope); - }, - function(error) - { - NVRDataModel.log("fallback help not found"); - }); - } - ); + $templateRequest(lang) + .then(function (template) { + var elem = angular.element(document.getElementById('insertHelp')); + $compile(elem.html(template).contents())($scope); + }, + function (error) { + NVRDataModel.log("Language file " + lang + " not found, falling back"); + $templateRequest(templateUrlFB) + .then(function (template) { + var elem = angular.element(document.getElementById('insertHelp')); + $compile(elem.html(template).contents())($scope); + }, + function (error) { + NVRDataModel.log("fallback help not found"); + }); + } + ); - } + } - //------------------------------------------------------------------------- - // Lets make sure we set screen dim properly as we enter - // The problem is we enter other states before we leave previous states - // from a callback perspective in ionic, so we really can't predictably - // reset power state on exit as if it is called after we enter another - // state, that effectively overwrites current view power management needs - //------------------------------------------------------------------------ - $scope.$on('$ionicView.enter', function() - { - //console.log("**VIEW ** Help Ctrl Entered"); - NVRDataModel.setAwake(false); - $scope.zmAppVersion = NVRDataModel.getAppVersion(); - insertHelp(); + //------------------------------------------------------------------------- + // Lets make sure we set screen dim properly as we enter + // The problem is we enter other states before we leave previous states + // from a callback perspective in ionic, so we really can't predictably + // reset power state on exit as if it is called after we enter another + // state, that effectively overwrites current view power management needs + //------------------------------------------------------------------------ + $scope.$on('$ionicView.enter', function () { + //console.log("**VIEW ** Help Ctrl Entered"); + NVRDataModel.setAwake(false); + $scope.zmAppVersion = NVRDataModel.getAppVersion(); + insertHelp(); - }); + }); }]); diff --git a/www/js/ImportantMessageCtrl.js b/www/js/ImportantMessageCtrl.js index e4a3b86d..218ec417 100644 --- a/www/js/ImportantMessageCtrl.js +++ b/www/js/ImportantMessageCtrl.js @@ -2,34 +2,29 @@ /* jslint browser: true*/ /* global cordova,StatusBar,angular,console */ -angular.module('zmApp.controllers').controller('zmApp.ImportantMessageCtrl', ['$scope', '$ionicSideMenuDelegate', 'zm', '$stateParams', '$timeout', '$rootScope', function($scope, $ionicSideMenuDelegate, zm, $stateParams, $timeout, $rootScope) -{ - $scope.openMenu = function() - { - $ionicSideMenuDelegate.toggleLeft(); - }; +angular.module('zmApp.controllers').controller('zmApp.ImportantMessageCtrl', ['$scope', '$ionicSideMenuDelegate', 'zm', '$stateParams', '$timeout', '$rootScope', function ($scope, $ionicSideMenuDelegate, zm, $stateParams, $timeout, $rootScope) { + $scope.openMenu = function () { + $ionicSideMenuDelegate.toggleLeft(); + }; - //------------------------------------------------------------------------- - // Controller Main - //------------------------------------------------------------------------ - $scope.$on('$ionicView.enter', function() - { - // console.log("**VIEW ** LowVersion Ctrl Entered"); - $ionicSideMenuDelegate.canDragContent(true); - $scope.requiredVersion = zm.minAppVersion; - $scope.currentVersion = $stateParams.ver; - $scope.recommendedVersion = zm.recommendedAppVersion; + //------------------------------------------------------------------------- + // Controller Main + //------------------------------------------------------------------------ + $scope.$on('$ionicView.enter', function () { + // console.log("**VIEW ** LowVersion Ctrl Entered"); + $ionicSideMenuDelegate.canDragContent(true); + $scope.requiredVersion = zm.minAppVersion; + $scope.currentVersion = $stateParams.ver; + $scope.recommendedVersion = zm.recommendedAppVersion; - }); + }); - $scope.openMenu = function() - { - $timeout(function() - { - $rootScope.stateofSlide = $ionicSideMenuDelegate.isOpen(); - }, 500); + $scope.openMenu = function () { + $timeout(function () { + $rootScope.stateofSlide = $ionicSideMenuDelegate.isOpen(); + }, 500); - $ionicSideMenuDelegate.toggleLeft(); - }; + $ionicSideMenuDelegate.toggleLeft(); + }; }]); diff --git a/www/js/InvalidApiCtrl.js b/www/js/InvalidApiCtrl.js index 56a0b8b9..0bea0654 100644 --- a/www/js/InvalidApiCtrl.js +++ b/www/js/InvalidApiCtrl.js @@ -2,36 +2,30 @@ /* jslint browser: true*/ /* global cordova,StatusBar,angular,console */ -angular.module('zmApp.controllers').controller('zmApp.InvalidApiCtrl', ['$scope', '$ionicSideMenuDelegate', 'zm', '$stateParams', '$timeout', '$rootScope', function($scope, $ionicSideMenuDelegate, zm, $stateParams, $timeout, $rootScope) -{ - $scope.openMenu = function() - { - $ionicSideMenuDelegate.toggleLeft(); - }; +angular.module('zmApp.controllers').controller('zmApp.InvalidApiCtrl', ['$scope', '$ionicSideMenuDelegate', 'zm', '$stateParams', '$timeout', '$rootScope', function ($scope, $ionicSideMenuDelegate, zm, $stateParams, $timeout, $rootScope) { + $scope.openMenu = function () { + $ionicSideMenuDelegate.toggleLeft(); + }; - //------------------------------------------------------------------------- - // Controller Main - //------------------------------------------------------------------------ - $scope.$on('$ionicView.enter', function() - { - // console.log("**VIEW ** InvalidAPI Ctrl Entered"); - $ionicSideMenuDelegate.canDragContent(true); - }); + //------------------------------------------------------------------------- + // Controller Main + //------------------------------------------------------------------------ + $scope.$on('$ionicView.enter', function () { + // console.log("**VIEW ** InvalidAPI Ctrl Entered"); + $ionicSideMenuDelegate.canDragContent(true); + }); - $scope.openMenu = function() - { - $timeout(function() - { - $rootScope.stateofSlide = $ionicSideMenuDelegate.isOpen(); - }, 500); + $scope.openMenu = function () { + $timeout(function () { + $rootScope.stateofSlide = $ionicSideMenuDelegate.isOpen(); + }, 500); - $ionicSideMenuDelegate.toggleLeft(); - }; + $ionicSideMenuDelegate.toggleLeft(); + }; - $scope.readFAQ = function() - { - window.open('https://github.com/pliablepixels/zmNinja/wiki/Validating-if-APIs-work-on-ZM', '_blank', 'location=yes'); - return false; - }; + $scope.readFAQ = function () { + window.open('https://github.com/pliablepixels/zmNinja/wiki/Validating-if-APIs-work-on-ZM', '_blank', 'location=yes'); + return false; + }; }]); diff --git a/www/js/LogCtrl.js b/www/js/LogCtrl.js index 530a7178..8d2c2672 100644 --- a/www/js/LogCtrl.js +++ b/www/js/LogCtrl.js @@ -2,331 +2,290 @@ /* jslint browser: true*/ /* global saveAs, cordova,StatusBar,angular,console,moment */ -angular.module('zmApp.controllers').controller('zmApp.LogCtrl', ['$scope', '$rootScope', 'zm', '$ionicModal', 'NVRDataModel', '$ionicSideMenuDelegate', '$fileLogger', '$cordovaEmailComposer', '$ionicPopup', '$timeout', '$ionicHistory', '$state', '$interval', '$ionicLoading', '$translate', '$http',function($scope, $rootScope, zm, $ionicModal, NVRDataModel, $ionicSideMenuDelegate, $fileLogger, $cordovaEmailComposer, $ionicPopup, $timeout, $ionicHistory, $state, $interval, $ionicLoading, $translate, $http) -{ - $scope.openMenu = function() - { - $ionicSideMenuDelegate.toggleLeft(); - }; - - //--------------------------------------------------------------- - // Controller main - //--------------------------------------------------------------- - - var intervalLogUpdateHandle; - - document.addEventListener("pause", onPause, false); - document.addEventListener("resume", onResume, false); - - function onPause() - { - NVRDataModel.debug("LogCtrl: pause called, killing log timer"); - // $interval.cancel(intervalLogUpdateHandle); - } - - function onResume() - { - // NVRDataModel.debug("LogCtrl: resume called, starting log timer"); - loadLogs(); - } - - $scope.flipLogs = function() - { - if ($scope.logEntity == 'ZoneMinder') - $scope.logEntity = $rootScope.appName; - else - $scope.logEntity = 'ZoneMinder'; - //console.log ("Flipped"); - loadLogs(); - - }; - - $scope.deleteLogs = function() - { - - $rootScope.zmPopup = $ionicPopup.confirm( - { - title: $translate.instant('kPleaseConfirm'), - template: $translate.instant('kDeleteLogsConfirm'), - okText: $translate.instant('kButtonOk'), - cancelText: $translate.instant('kButtonCancel'), - }); +angular.module('zmApp.controllers').controller('zmApp.LogCtrl', ['$scope', '$rootScope', 'zm', '$ionicModal', 'NVRDataModel', '$ionicSideMenuDelegate', '$fileLogger', '$cordovaEmailComposer', '$ionicPopup', '$timeout', '$ionicHistory', '$state', '$interval', '$ionicLoading', '$translate', '$http', function ($scope, $rootScope, zm, $ionicModal, NVRDataModel, $ionicSideMenuDelegate, $fileLogger, $cordovaEmailComposer, $ionicPopup, $timeout, $ionicHistory, $state, $interval, $ionicLoading, $translate, $http) { + $scope.openMenu = function () { + $ionicSideMenuDelegate.toggleLeft(); + }; + + //--------------------------------------------------------------- + // Controller main + //--------------------------------------------------------------- + + var intervalLogUpdateHandle; + + document.addEventListener("pause", onPause, false); + document.addEventListener("resume", onResume, false); + + function onPause() { + NVRDataModel.debug("LogCtrl: pause called, killing log timer"); + // $interval.cancel(intervalLogUpdateHandle); + } + + function onResume() { + // NVRDataModel.debug("LogCtrl: resume called, starting log timer"); + loadLogs(); + } + + $scope.flipLogs = function () { + if ($scope.logEntity == 'ZoneMinder') + $scope.logEntity = $rootScope.appName; + else + $scope.logEntity = 'ZoneMinder'; + //console.log ("Flipped"); + loadLogs(); + + }; + + $scope.deleteLogs = function () { + + $rootScope.zmPopup = $ionicPopup.confirm({ + title: $translate.instant('kPleaseConfirm'), + template: $translate.instant('kDeleteLogsConfirm'), + okText: $translate.instant('kButtonOk'), + cancelText: $translate.instant('kButtonCancel'), + }); - $rootScope.zmPopup.then(function(res) - { - if (res) - { - $fileLogger.deleteLogfile().then(function() - { - //console.log('Logfile deleted'); - $fileLogger.setStorageFilename(zm.logFile); - $scope.log.logString = ""; - }); - } + $rootScope.zmPopup.then(function (res) { + if (res) { + $fileLogger.deleteLogfile().then(function () { + //console.log('Logfile deleted'); + $fileLogger.setStorageFilename(zm.logFile); + $scope.log.logString = ""; }); - }; - - //---------------------------------------------------------------- - // Alarm notification handling - //---------------------------------------------------------------- - $scope.handleAlarms = function() - { - $rootScope.isAlarm = !$rootScope.isAlarm; - if (!$rootScope.isAlarm) - { - $rootScope.alarmCount = "0"; - $ionicHistory.nextViewOptions( - { - disableBack: true - }); - $state.go("app.events", - { - "id": 0, - "playEvent": false - }, - { - reload: true - }); - return; + } + }); + }; + + //---------------------------------------------------------------- + // Alarm notification handling + //---------------------------------------------------------------- + $scope.handleAlarms = function () { + $rootScope.isAlarm = !$rootScope.isAlarm; + if (!$rootScope.isAlarm) { + $rootScope.alarmCount = "0"; + $ionicHistory.nextViewOptions({ + disableBack: true + }); + $state.go("app.events", { + "id": 0, + "playEvent": false + }, { + reload: true + }); + return; + } + }; + + //-------------------------------------------------------------------------- + // Make sure user knows information masking is best effort + //-------------------------------------------------------------------------- + + $scope.sendEmail = function (logstring) { + logstring = logstring.substring(0, 20000); + $ionicPopup.confirm({ + title: $translate.instant('kSensitiveTitle'), + template: $rootScope.appName + ' ' + $translate.instant('kSensitiveBody'), + okText: $translate.instant('kButtonOk'), + cancelText: $translate.instant('kButtonCancel'), + }) + .then(function (res) { + if (res) { + + logstring = "zmNinja version:" + $scope.zmAppVersion + + " (" + $rootScope.platformOS + ")\n" + + "ZoneMinder version:" + NVRDataModel.getCurrentServerVersion() + "\n" + + logstring; + sendEmailReally(logstring); } - }; - - //-------------------------------------------------------------------------- - // Make sure user knows information masking is best effort - //-------------------------------------------------------------------------- - - $scope.sendEmail = function(logstring) - { - logstring = logstring.substring (0,20000); - $ionicPopup.confirm( - { - title: $translate.instant('kSensitiveTitle'), - template: $rootScope.appName + ' ' + $translate.instant('kSensitiveBody'), - okText: $translate.instant('kButtonOk'), - cancelText: $translate.instant('kButtonCancel'), - }) - .then(function(res) - { - if (res) - { - - logstring = "zmNinja version:" + $scope.zmAppVersion + - " ("+$rootScope.platformOS+")\n" + - "ZoneMinder version:" + NVRDataModel.getCurrentServerVersion()+"\n" + - logstring; - sendEmailReally(logstring); - } + }); + }; + + //-------------------------------------------------------------------------- + // Convenience function to send logs via email + //-------------------------------------------------------------------------- + function sendEmailReally(logstring) { + + //console.log ("LOGSTRING:"+logstring); + if (window.cordova) { + + // do my best to replace sensitive information + var loginData = NVRDataModel.getLogin(); + + // We don't need this anymore as log and debug now strip passwords + /*if (loginData.password !="") + { + var re1 = new RegExp(loginData.password, "g"); + logstring = logstring.replace(re1, "<deleted>"); + }*/ + // keep the protocol, helps to debug + var urlNoProtocol = loginData.url.replace(/.*?:\/\//, ""); + if (urlNoProtocol != "") { + var re2 = new RegExp(urlNoProtocol, "g"); + // just replacing baseurl - that will take care of + // masking api but may not be cgi + logstring = logstring.replace(re2, "<server>"); + } + urlNoProtocol = loginData.streamingurl.replace(/.*?:\/\//, ""); + if (urlNoProtocol != "") { + var re3 = new RegExp(urlNoProtocol, "g"); + logstring = logstring.replace(re3, "<server>"); + } + + urlNoProtocol = loginData.eventServer.replace(/.*?:\/\//, ""); + if (urlNoProtocol != "") { + var re4 = new RegExp(urlNoProtocol, "g"); + logstring = logstring.replace(re4, "<server>"); + } + + //console.log ("NEW LOGSTRING:"+logstring); + /* window.plugins.emailComposer.showEmailComposerWithCallback(callback, $rootScope.appName + ' logs', logstring, [zm.authoremail]);*/ + + + cordova.plugins.email.isAvailable( + function (isAvailable) { + + if (isAvailable) { + // body encapsulation requires br :^ + // see https://github.com/katzer/cordova-plugin-email-composer/issues/150 + logstring = logstring.split('\n').join('<br/>'); + cordova.plugins.email.open({ + to: zm.authoremail, + subject: $rootScope.appName + ' logs', + body: logstring }); - }; - - //-------------------------------------------------------------------------- - // Convenience function to send logs via email - //-------------------------------------------------------------------------- - function sendEmailReally(logstring) - { + } else { + // kEmailNotConfigured + $rootScope.zmPopup = SecuredPopups.show('alert', { + title: $translate.instant('kError'), + template: $translate.instant('kEmailNotConfigured'), + okText: $translate.instant('kButtonOk'), + cancelText: $translate.instant('kButtonCancel'), + }); + } - //console.log ("LOGSTRING:"+logstring); - if (window.cordova) - { - - // do my best to replace sensitive information - var loginData = NVRDataModel.getLogin(); - - // We don't need this anymore as log and debug now strip passwords - /*if (loginData.password !="") - { - var re1 = new RegExp(loginData.password, "g"); - logstring = logstring.replace(re1, "<deleted>"); - }*/ - // keep the protocol, helps to debug - var urlNoProtocol = loginData.url.replace(/.*?:\/\//, ""); - if (urlNoProtocol != "") - { - var re2 = new RegExp(urlNoProtocol, "g"); - // just replacing baseurl - that will take care of - // masking api but may not be cgi - logstring = logstring.replace(re2, "<server>"); - } - urlNoProtocol = loginData.streamingurl.replace(/.*?:\/\//, ""); - if (urlNoProtocol != "") - { - var re3 = new RegExp(urlNoProtocol, "g"); - logstring = logstring.replace(re3, "<server>"); - } - - urlNoProtocol = loginData.eventServer.replace(/.*?:\/\//, ""); - if (urlNoProtocol != "") - { - var re4 = new RegExp(urlNoProtocol, "g"); - logstring = logstring.replace(re4, "<server>"); - } - - //console.log ("NEW LOGSTRING:"+logstring); - /* window.plugins.emailComposer.showEmailComposerWithCallback(callback, $rootScope.appName + ' logs', logstring, [zm.authoremail]);*/ - - - cordova.plugins.email.isAvailable( - function (isAvailable) { - - if (isAvailable) { - // body encapsulation requires br :^ - // see https://github.com/katzer/cordova-plugin-email-composer/issues/150 - logstring = logstring.split('\n').join('<br/>'); - cordova.plugins.email.open({ - to: zm.authoremail, - subject: $rootScope.appName + ' logs', - body: logstring - }); - } - else { - // kEmailNotConfigured - $rootScope.zmPopup = SecuredPopups.show('alert', - { - title: $translate.instant('kError'), - template: $translate.instant('kEmailNotConfigured'), - okText: $translate.instant('kButtonOk'), - cancelText: $translate.instant('kButtonCancel'), - }); - } - - }); - + }); - } - else - { - // console.log("Using default email client to send data"); - var fname = $rootScope.appName + "-logs-" + - moment().format('MMM-DD-YY_HH-mm-ss') + ".txt"; + } else { + // console.log("Using default email client to send data"); - var blob = new Blob([logstring], - { - type: "text/plain;charset=utf-8" - }); - saveAs(blob, fname); - } - - } + var fname = $rootScope.appName + "-logs-" + + moment().format('MMM-DD-YY_HH-mm-ss') + ".txt"; - function callback() - { - // console.log ("EMAIL SENT"); - NVRDataModel.debug("Email sent callback called"); + var blob = new Blob([logstring], { + type: "text/plain;charset=utf-8" + }); + saveAs(blob, fname); } - function loadZMlogs() - { - var ld = NVRDataModel.getLogin(); - var lapi = ld.apiurl + "/logs.json?sort=TimeKey&direction=desc&page="+$scope.zmPage; - $http.get (lapi) - .then (function (success) { - $ionicLoading.hide(); - $scope.zmMaxPage = success.data.pagination.pageCount; - // console.log ("PAGES="+$scope.zmMaxPage); - var tLogs = ""; - // console.log (JSON.stringify(success)); - for (var i=0; i< success.data.logs.length; i++) - { - tLogs = tLogs + moment.unix(success.data.logs[i].Log.TimeKey).format ("MM/DD/YY hh:mm:ss") +" "+ - success.data.logs[i].Log.Code+" " + - success.data.logs[i].Log.Message+"\n"; - } - $scope.log.logString = tLogs; + } + + function callback() { + // console.log ("EMAIL SENT"); + NVRDataModel.debug("Email sent callback called"); + } + + function loadZMlogs() { + var ld = NVRDataModel.getLogin(); + var lapi = ld.apiurl + "/logs.json?sort=TimeKey&direction=desc&page=" + $scope.zmPage; + $http.get(lapi) + .then(function (success) { + $ionicLoading.hide(); + $scope.zmMaxPage = success.data.pagination.pageCount; + // console.log ("PAGES="+$scope.zmMaxPage); + var tLogs = ""; + // console.log (JSON.stringify(success)); + for (var i = 0; i < success.data.logs.length; i++) { + tLogs = tLogs + moment.unix(success.data.logs[i].Log.TimeKey).format("MM/DD/YY hh:mm:ss") + " " + + success.data.logs[i].Log.Code + " " + + success.data.logs[i].Log.Message + "\n"; + } + $scope.log.logString = tLogs; }, function (error) { - NVRDataModel.log ("Error getting ZM logs:"+JSON.stringify(error)); - $scope.log.logString = "Error getting log: " + JSON.stringify(error); - + NVRDataModel.log("Error getting ZM logs:" + JSON.stringify(error)); + $scope.log.logString = "Error getting log: " + JSON.stringify(error); - } ); - } + }); - $scope.selectToggle = function() { - $scope.selectOn = !$scope.selectOn; - }; + } - $scope.changePage = function(p) - { - $scope.zmPage = $scope.zmPage + p; - if ($scope.zmPage < 1) $scope.zmPage = 1; - if ($scope.zmPage > $scope.zmMaxPage) $scope.zmPage = $scope.zmMaxPage; - loadLogs(); - }; + $scope.selectToggle = function () { + $scope.selectOn = !$scope.selectOn; + }; - function loadLogs() - { - //console.log ("GETTING LOGS"); + $scope.changePage = function (p) { + $scope.zmPage = $scope.zmPage + p; + if ($scope.zmPage < 1) $scope.zmPage = 1; + if ($scope.zmPage > $scope.zmMaxPage) $scope.zmPage = $scope.zmMaxPage; + loadLogs(); + }; - $ionicLoading.show( - { - template: $translate.instant('kLoading'), - noBackdrop: true, - duration: zm.loadingTimeout + function loadLogs() { + //console.log ("GETTING LOGS"); - }); + $ionicLoading.show({ + template: $translate.instant('kLoading'), + noBackdrop: true, + duration: zm.loadingTimeout - if ($scope.logEntity == $rootScope.appName) - { - $fileLogger.getLogfile().then(function(l) - { - - $scope.log.logString = l.split('\n').reverse().join('\n'); - //$scope.log.logString = l; - - $ionicLoading.hide(); - }, - function(error) - { - $scope.log.logString = "Error getting log: " + JSON.stringify(error); - $ionicLoading.hide(); - }); - } - else - loadZMlogs(); - - } + }); - //------------------------------------------------------------------------- - // Lets make sure we set screen dim properly as we enter - // The problem is we enter other states before we leave previous states - // from a callback perspective in ionic, so we really can't predictably - // reset power state on exit as if it is called after we enter another - // state, that effectively overwrites current view power management needs - //------------------------------------------------------------------------ - $scope.$on('$ionicView.enter', function() - { - //console.log("**VIEW ** Log Ctrl Entered"); + if ($scope.logEntity == $rootScope.appName) { + $fileLogger.getLogfile().then(function (l) { - $ionicSideMenuDelegate.canDragContent(false); - $scope.selectOn = false; - NVRDataModel.setAwake(false); - $scope.logEntity = $rootScope.appName; - $scope.zmPage = 1; - $scope.zmMaxPage = 1; + $scope.log.logString = l.split('\n').reverse().join('\n'); + //$scope.log.logString = l; - $scope.log = { - logString: "" - }; + $ionicLoading.hide(); + }, + function (error) { + $scope.log.logString = "Error getting log: " + JSON.stringify(error); + $ionicLoading.hide(); + }); + } else + loadZMlogs(); + + } + + //------------------------------------------------------------------------- + // Lets make sure we set screen dim properly as we enter + // The problem is we enter other states before we leave previous states + // from a callback perspective in ionic, so we really can't predictably + // reset power state on exit as if it is called after we enter another + // state, that effectively overwrites current view power management needs + //------------------------------------------------------------------------ + $scope.$on('$ionicView.enter', function () { + //console.log("**VIEW ** Log Ctrl Entered"); + + $ionicSideMenuDelegate.canDragContent(false); + $scope.selectOn = false; + NVRDataModel.setAwake(false); + $scope.logEntity = $rootScope.appName; + $scope.zmPage = 1; + $scope.zmMaxPage = 1; + + $scope.log = { + logString: "" + }; - $scope.zmAppVersion = NVRDataModel.getAppVersion(); + $scope.zmAppVersion = NVRDataModel.getAppVersion(); - /* intervalLogUpdateHandle = $interval(function () - { - loadLogs(); + /* intervalLogUpdateHandle = $interval(function () + { + loadLogs(); - }.bind(this), 3000);*/ + }.bind(this), 3000);*/ - loadLogs(); + loadLogs(); - }); + }); - $scope.$on('$ionicView.leave', function() - { - //console.log ("Deleting Log interval..."); - // $interval.cancel(intervalLogUpdateHandle); - }); + $scope.$on('$ionicView.leave', function () { + //console.log ("Deleting Log interval..."); + // $interval.cancel(intervalLogUpdateHandle); + }); }]); diff --git a/www/js/LoginCtrl.js b/www/js/LoginCtrl.js index a6d50530..377e5829 100644 --- a/www/js/LoginCtrl.js +++ b/www/js/LoginCtrl.js @@ -23,7 +23,7 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r document.addEventListener("resume", onResume, false); function onResume() { - // NVRDataModel.log("Login screen resumed"); + // NVRDataModel.log("Login screen resumed"); } @@ -263,7 +263,7 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r $scope.loginData = angular.copy(NVRDataModel.getDefaultLoginObject()); // default object has this as false - if ($rootScope.platformOS=='ios') { + if ($rootScope.platformOS == 'ios') { $scope.loginData.disableSimulStreaming = true; } @@ -282,9 +282,9 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r $scope.loginData.isUseAuth = false; } - // 'isUseBasicAuth': false, - // 'basicAuthUser': '', - // 'basicAuthPassword': '', + // 'isUseBasicAuth': false, + // 'basicAuthUser': '', + // 'basicAuthPassword': '', if ($rootScope.wizard.useauth && $rootScope.wizard.usebasicauth) { $scope.loginData.basicAuthUser = $rootScope.wizard.basicuser; @@ -298,7 +298,7 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r $scope.loginData.useSSL = true; } - } + } oldLoginData = JSON.stringify($scope.loginData); @@ -421,7 +421,7 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r //$scope.basicAuthUsed = ($scope.loginData.url.indexOf('@') == -1) ? false:true; - + }; //------------------------------------------------------------------------------- @@ -476,7 +476,7 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r $scope.loginData.username = $scope.loginData.username.trim(); - + if ($scope.loginData.url.slice(-1) == '/') { $scope.loginData.url = $scope.loginData.url.slice(0, -1); @@ -560,11 +560,10 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r if (!$scope.loginData.isUseBasicAuth) { $rootScope.basicAuthHeader = ''; $rootScope.basicAuthToken = ''; - // console.log ("CLEARING AUTH"); - } - else { - $rootScope.basicAuthToken = btoa($scope.loginData.basicAuthUser+':'+$scope.loginData.basicAuthPassword); - $rootScope.basicAuthHeader = 'Basic ' + $rootScope.basicAuthToken ; + // console.log ("CLEARING AUTH"); + } else { + $rootScope.basicAuthToken = btoa($scope.loginData.basicAuthUser + ':' + $scope.loginData.basicAuthPassword); + $rootScope.basicAuthHeader = 'Basic ' + $rootScope.basicAuthToken; } diff --git a/www/js/LowVersionCtrl.js b/www/js/LowVersionCtrl.js index a7fbb7ff..9d18d9e0 100644 --- a/www/js/LowVersionCtrl.js +++ b/www/js/LowVersionCtrl.js @@ -2,23 +2,20 @@ /* jslint browser: true*/ /* global cordova,StatusBar,angular,console */ -angular.module('zmApp.controllers').controller('zmApp.LowVersionCtrl', ['$scope', '$ionicSideMenuDelegate', 'zm', '$stateParams', function($scope, $ionicSideMenuDelegate, zm, $stateParams) -{ - $scope.openMenu = function() - { - $ionicSideMenuDelegate.toggleLeft(); - }; +angular.module('zmApp.controllers').controller('zmApp.LowVersionCtrl', ['$scope', '$ionicSideMenuDelegate', 'zm', '$stateParams', function ($scope, $ionicSideMenuDelegate, zm, $stateParams) { + $scope.openMenu = function () { + $ionicSideMenuDelegate.toggleLeft(); + }; - //------------------------------------------------------------------------- - // Controller Main - //------------------------------------------------------------------------ - $scope.$on('$ionicView.enter', function() - { - //console.log("**VIEW ** LowVersion Ctrl Entered"); - $ionicSideMenuDelegate.canDragContent(true); - $scope.requiredVersion = zm.minAppVersion; - $scope.currentVersion = $stateParams.ver; + //------------------------------------------------------------------------- + // Controller Main + //------------------------------------------------------------------------ + $scope.$on('$ionicView.enter', function () { + //console.log("**VIEW ** LowVersion Ctrl Entered"); + $ionicSideMenuDelegate.canDragContent(true); + $scope.requiredVersion = zm.minAppVersion; + $scope.currentVersion = $stateParams.ver; - }); + }); }]); diff --git a/www/js/MenuController.js b/www/js/MenuController.js index e353d310..477849a6 100644 --- a/www/js/MenuController.js +++ b/www/js/MenuController.js @@ -2,78 +2,72 @@ /* jslint browser: true*/ /* global cordova,StatusBar,angular,console */ -angular.module('zmApp.controllers').controller('MenuController', ['$scope', '$ionicSideMenuDelegate', 'zm', '$stateParams', '$ionicHistory', '$state', 'NVRDataModel', '$rootScope', '$ionicPopup', '$translate', '$timeout', function($scope, $ionicSideMenuDelegate, zm, $stateParams, $ionicHistory, $state, NVRDataModel, $rootScope, $ionicPopup, $translate, $timeout) -{ - $scope.openMenu = function() - { - $ionicSideMenuDelegate.toggleLeft(); - }; +angular.module('zmApp.controllers').controller('MenuController', ['$scope', '$ionicSideMenuDelegate', 'zm', '$stateParams', '$ionicHistory', '$state', 'NVRDataModel', '$rootScope', '$ionicPopup', '$translate', '$timeout', function ($scope, $ionicSideMenuDelegate, zm, $stateParams, $ionicHistory, $state, NVRDataModel, $rootScope, $ionicPopup, $translate, $timeout) { + $scope.openMenu = function () { + $ionicSideMenuDelegate.toggleLeft(); + }; + + //---------------------------------------------------------------- + // This controller sits along with the main app to bring up + // the language menu from the main menu + //---------------------------------------------------------------- + + - //---------------------------------------------------------------- - // This controller sits along with the main app to bring up - // the language menu from the main menu - //---------------------------------------------------------------- + $scope.navigateView = function (view, args) { + if (view == $state.current.name) return; + NVRDataModel.debug("Navigating view to: " + view); + $ionicHistory.nextViewOptions({ + disableBack: true + }); + $state.go(view, args); + /* $timeout (function() { + window.stop(); + // after window stop executes, in next cycle + // this _should_ ensure stop concludes before + // exit/entry lifecycles kick in? + $timeout (function() {$state.go(view,args);}); + + });*/ - $scope.navigateView = function(view,args) { + }; - if (view == $state.current.name) return; - NVRDataModel.debug ("Navigating view to: " + view); - $ionicHistory.nextViewOptions({ - disableBack: true - }); - $state.go(view,args); - /* $timeout (function() { - window.stop(); - // after window stop executes, in next cycle - // this _should_ ensure stop concludes before - // exit/entry lifecycles kick in? - $timeout (function() {$state.go(view,args);}); - - });*/ - + $scope.switchLang = function () { + $scope.lang = NVRDataModel.getLanguages(); + $scope.myopt = { + lang: "" }; + $rootScope.zmPopup = $ionicPopup.show({ + scope: $scope, + template: '<ion-radio-fix ng-repeat="item in lang" ng-value="item.value" ng-model="myopt.lang"> {{item.text}} </ion-radio-fix>', - $scope.switchLang = function() - { - $scope.lang = NVRDataModel.getLanguages(); - $scope.myopt = { - lang: "" - }; + title: $translate.instant('kSelectLanguage'), - $rootScope.zmPopup = $ionicPopup.show( + buttons: [{ + text: $translate.instant('kButtonCancel'), + onTap: function (e) { + //return "CANCEL"; + } + + }, { - scope: $scope, - template: '<ion-radio-fix ng-repeat="item in lang" ng-value="item.value" ng-model="myopt.lang"> {{item.text}} </ion-radio-fix>', - - title: $translate.instant('kSelectLanguage'), - - buttons: [ - { - text: $translate.instant('kButtonCancel'), - onTap: function(e) - { - //return "CANCEL"; - } - - }, - { - text: $translate.instant('kButtonOk'), - onTap: function(e) - { - NVRDataModel.log("Language selected:" + $scope.myopt.lang); - NVRDataModel.setDefaultLanguage($scope.myopt.lang, true); - $rootScope.$broadcast('language-changed'); - - //return "OK"; - - } - }] - }); + text: $translate.instant('kButtonOk'), + onTap: function (e) { + NVRDataModel.log("Language selected:" + $scope.myopt.lang); + NVRDataModel.setDefaultLanguage($scope.myopt.lang, true); + $rootScope.$broadcast('language-changed'); - }; + //return "OK"; + + } + } + ] + }); + + }; }]); diff --git a/www/js/MomentCtrl.js b/www/js/MomentCtrl.js index 0560e9ed..a5fe9649 100644 --- a/www/js/MomentCtrl.js +++ b/www/js/MomentCtrl.js @@ -45,7 +45,7 @@ angular.module('zmApp.controllers').controller('zmApp.MomentCtrl', ['$scope', '$ function jiggleAway() { - + // STEP 3: Called when step 2 completes for the finale masonry.once('layoutComplete', function (laidOutItems) { @@ -83,10 +83,10 @@ angular.module('zmApp.controllers').controller('zmApp.MomentCtrl', ['$scope', '$ function getIndexFromEID(eid) { var found = -1; - for (var i=0; i < moments.length; i++) { + for (var i = 0; i < moments.length; i++) { if (parseInt(moments[i].Event.Id) == parseInt(eid)) { - found = i; - break; + found = i; + break; } } return found; // really should never be -1 @@ -258,31 +258,31 @@ angular.module('zmApp.controllers').controller('zmApp.MomentCtrl', ['$scope', '$ }; - $scope.constructFrame = function(moment) { + $scope.constructFrame = function (moment) { var stream = ""; - // console.log ($scope.isMaxScoreFramePresent); - stream = moment.Event.baseURL+"/index.php?view=image" + - ($scope.isMaxScoreFramePresent? "&fid="+moment.Event.MaxScoreFrameId: "&eid="+moment.Event.Id+"&fid=1")+ - "&width="+moment.Event.thumbWidth*2 + - "&height="+moment.Event.thumbHeight*2; + // console.log ($scope.isMaxScoreFramePresent); + stream = moment.Event.baseURL + "/index.php?view=image" + + ($scope.isMaxScoreFramePresent ? "&fid=" + moment.Event.MaxScoreFrameId : "&eid=" + moment.Event.Id + "&fid=1") + + "&width=" + moment.Event.thumbWidth * 2 + + "&height=" + moment.Event.thumbHeight * 2; - if ($rootScope.authSession != 'undefined') stream +=$rootScope.authSession; + if ($rootScope.authSession != 'undefined') stream += $rootScope.authSession; stream += NVRDataModel.insertBasicAuthToken(); return stream; }; - -//---------------------------------------------------------------- -// construct popover only when needed -// so that we can use one-time binding for the compare function -//---------------------------------------------------------------- - $scope.isChecked=function(val) { + + //---------------------------------------------------------------- + // construct popover only when needed + // so that we can use one-time binding for the compare function + //---------------------------------------------------------------- + $scope.isChecked = function (val) { //console.log ("COMPARE"); - return $translate.instant(val) == $scope.type; + return $translate.instant(val) == $scope.type; }; - $scope.showPopover = function($event) { + $scope.showPopover = function ($event) { $ionicPopover.fromTemplateUrl('templates/moment-popover.html', { scope: $scope, @@ -301,7 +301,7 @@ angular.module('zmApp.controllers').controller('zmApp.MomentCtrl', ['$scope', '$ $scope.togglePin = function (eid) { var ndx = getIndexFromEID(eid); if (ndx == -1) { - NVRDataModel.log ("Uh oh, ndx returned -1, this should never happen. Event passed was "+eid); + NVRDataModel.log("Uh oh, ndx returned -1, this should never happen. Event passed was " + eid); return; } @@ -309,16 +309,16 @@ angular.module('zmApp.controllers').controller('zmApp.MomentCtrl', ['$scope', '$ }; - $scope.toggleExpandOrCollapse = function() { - + $scope.toggleExpandOrCollapse = function () { + if ($scope.expand) expandAll(); else collapseAll(); $scope.expand = !$scope.expand; }; - function expandAll() { - for (var i=0; i < $scope.moments.length; i++) { + function expandAll() { + for (var i = 0; i < $scope.moments.length; i++) { $scope.moments[i].Event.hide = false; $scope.moments[i].Event.icon = 'ion-code-working'; $scope.moments[i].Event.collapseCount = ''; @@ -330,16 +330,16 @@ angular.module('zmApp.controllers').controller('zmApp.MomentCtrl', ['$scope', '$ jiggleAway(); }, 100); - + } function collapseAll() { - for (var i=0; i < monitors.length; i++) { + for (var i = 0; i < monitors.length; i++) { var firstFound = false; var firstIndex = -1; var collapseCount = 0; - for (var j=0; j < $scope.moments.length; j++) { + for (var j = 0; j < $scope.moments.length; j++) { if ($scope.moments[j].Event.MonitorId == monitors[i].Monitor.Id) { if (!firstFound) { @@ -347,27 +347,25 @@ angular.module('zmApp.controllers').controller('zmApp.MomentCtrl', ['$scope', '$ $scope.moments[j].Event.hide = false; $scope.moments[j].Event.icon = 'ion-images'; firstFound = true; - } - else if (!$scope.moments[j].Event.pinned) { - // mid matches, but not first, and not pinned so collapse - $scope.moments[j].Event.hide = true; - $scope.moments[j].Event.icon = 'ion-code-working'; - collapseCount++; + } else if (!$scope.moments[j].Event.pinned) { + // mid matches, but not first, and not pinned so collapse + $scope.moments[j].Event.hide = true; + $scope.moments[j].Event.icon = 'ion-code-working'; + collapseCount++; } } // if same mid } // moment for j - if (firstIndex !=-1) { - if (collapseCount>0) { - $scope.moments[firstIndex].Event.collapseCount = collapseCount+1; - } - else { // nothing to group + if (firstIndex != -1) { + if (collapseCount > 0) { + $scope.moments[firstIndex].Event.collapseCount = collapseCount + 1; + } else { // nothing to group $scope.moments[firstIndex].Event.icon = 'ion-code-working'; $scope.moments[firstIndex].Event.collapseCount = ""; } } // firstIndex } // monitor for i - + $timeout(function () { masonry.reloadItems(); jiggleAway(); @@ -392,7 +390,7 @@ angular.module('zmApp.controllers').controller('zmApp.MomentCtrl', ['$scope', '$ var ndx = getIndexFromEID(eid); if (ndx == -1) { - NVRDataModel.log ("Uh oh, ndx returned -1, this should never happen. Event passed was "+eid); + NVRDataModel.log("Uh oh, ndx returned -1, this should never happen. Event passed was " + eid); return; } @@ -416,10 +414,9 @@ angular.module('zmApp.controllers').controller('zmApp.MomentCtrl', ['$scope', '$ } //for if (hide) { // +1 for the marked frame which doesn't get counted - if (collapseCount >0) { + if (collapseCount > 0) { $scope.moments[ndx].Event.collapseCount = collapseCount + 1; - } - else { // nothing to collapse + } else { // nothing to collapse $scope.moments[ndx].Event.collapseCount = ""; $scope.moments[ndx].Event.icon = 'ion-code-working'; @@ -427,7 +424,7 @@ angular.module('zmApp.controllers').controller('zmApp.MomentCtrl', ['$scope', '$ } else { $scope.moments[ndx].Event.collapseCount = ""; } - + $timeout(function () { masonry.reloadItems(); jiggleAway(); @@ -544,7 +541,7 @@ angular.module('zmApp.controllers').controller('zmApp.MomentCtrl', ['$scope', '$ percentPosition: true, }); - + imagesLoaded(elem).on('progress', function (instance, img) { masonry.layout(); @@ -572,7 +569,7 @@ angular.module('zmApp.controllers').controller('zmApp.MomentCtrl', ['$scope', '$ $scope.modal.remove(); } - if ($scope.modalData.doRefresh) getMoments(momentType, timeTo); + if ($scope.modalData.doRefresh) getMoments(momentType, timeTo); }; //---------------------------------------------------------------- @@ -597,26 +594,28 @@ angular.module('zmApp.controllers').controller('zmApp.MomentCtrl', ['$scope', '$ var ld = NVRDataModel.getLogin(); var sl = 'disabled'; if (ld.showLiveForInProgressEvents) { - sl = 'enabled'; - } + sl = 'enabled'; + } - $scope.modalData = {doRefresh:false}; + $scope.modalData = { + doRefresh: false + }; $ionicModal.fromTemplateUrl('templates/events-modal.html', { scope: $scope, animation: 'slide-in-up', id: 'footage', - showLive:sl, + showLive: sl, snapshot: 'enabled', - snapshotId: $scope.isMaxScoreFramePresent?event.Event.MaxScoreFrameId:undefined, - eventId:event.Event.Id + snapshotId: $scope.isMaxScoreFramePresent ? event.Event.MaxScoreFrameId : undefined, + eventId: event.Event.Id //eventId:event.Event.Id - + }) .then(function (modal) { $scope.modal = modal; - + $scope.modal.show(); @@ -627,7 +626,7 @@ angular.module('zmApp.controllers').controller('zmApp.MomentCtrl', ['$scope', '$ }; - + //---------------------------------------------------------------- // Only called by "here" button without cond. So prev type is used //---------------------------------------------------------------- @@ -677,20 +676,17 @@ angular.module('zmApp.controllers').controller('zmApp.MomentCtrl', ['$scope', '$ function getMoments(sortCondition, to) { if (sortCondition == 'MaxScore') { - $scope.type = $translate.instant - ('kMomentMenuByScore'); + $scope.type = $translate.instant('kMomentMenuByScore'); $scope.typeIcon = "ion-arrow-graph-up-right"; - } - else if (sortCondition == 'StartTime') { + } else if (sortCondition == 'StartTime') { $scope.type = $translate.instant('kMomentMenuByTime'); $scope.typeIcon = "ion-clock"; - } - else if (sortCondition == 'monitorName') { + } else if (sortCondition == 'monitorName') { $scope.type = $translate.instant('kMomentMenuByMonitor'); $scope.typeIcon = "ion-ios-videocam"; } - + $scope.apiurl = NVRDataModel.getLogin().apiurl; moments.length = 0; @@ -766,15 +762,15 @@ angular.module('zmApp.controllers').controller('zmApp.MomentCtrl', ['$scope', '$ // check the very first element for presence of maxscoreframe id // if its not there, we can't show snuff if (moments.length && !moments[0].Event.MaxScoreFrameId) { - $scope.isMaxScoreFramePresent =false; - + $scope.isMaxScoreFramePresent = false; + } else { $scope.isMaxScoreFramePresent = true; } $scope.moments = moments; - $timeout(function () { - initMasonry(); - }, 300); + $timeout(function () { + initMasonry(); + }, 300); }); @@ -820,11 +816,10 @@ angular.module('zmApp.controllers').controller('zmApp.MomentCtrl', ['$scope', '$ try { excludeMonitors = JSON.parse(ld.momentMonitorFilter); - } - catch (e) { + } catch (e) { excludeMonitors = []; } - + //console.log("RETRIEVED EXCLUDE=" + JSON.stringify(excludeMonitors)); constructMask(); $scope.isSubMenu = ld.enableMomentSubMenu; @@ -842,8 +837,8 @@ angular.module('zmApp.controllers').controller('zmApp.MomentCtrl', ['$scope', '$ }); $scope.$on('$ionicView.afterEnter', function () { - - + + getMoments(momentType); diff --git a/www/js/MonitorCtrl.js b/www/js/MonitorCtrl.js index b41abfd0..38bdf765 100644 --- a/www/js/MonitorCtrl.js +++ b/www/js/MonitorCtrl.js @@ -6,539 +6,469 @@ // refer to comments in EventCtrl for the modal stuff. They are almost the same angular.module('zmApp.controllers') - .controller('zmApp.MonitorCtrl', ['$ionicPopup', 'zm', '$scope', 'NVRDataModel', 'message', '$ionicSideMenuDelegate', '$ionicLoading', '$ionicModal', '$state', '$http', '$rootScope', '$timeout', '$ionicHistory', '$ionicPlatform', '$translate', '$q', - function($ionicPopup, zm, $scope, NVRDataModel, message, $ionicSideMenuDelegate, $ionicLoading, $ionicModal, $state, $http, $rootScope, $timeout, $ionicHistory, $ionicPlatform, $translate, $q) - { + .controller('zmApp.MonitorCtrl', ['$ionicPopup', 'zm', '$scope', 'NVRDataModel', 'message', '$ionicSideMenuDelegate', '$ionicLoading', '$ionicModal', '$state', '$http', '$rootScope', '$timeout', '$ionicHistory', '$ionicPlatform', '$translate', '$q', + function ($ionicPopup, zm, $scope, NVRDataModel, message, $ionicSideMenuDelegate, $ionicLoading, $ionicModal, $state, $http, $rootScope, $timeout, $ionicHistory, $ionicPlatform, $translate, $q) { - //----------------------------------------------------------------------- - // Controller Main - //----------------------------------------------------------------------- + //----------------------------------------------------------------------- + // Controller Main + //----------------------------------------------------------------------- - // var isModalOpen = false; + // var isModalOpen = false; - // console.log("***EVENTS: Waiting for Monitors to load before I proceed"); + // console.log("***EVENTS: Waiting for Monitors to load before I proceed"); - var loginData; + var loginData; - // -------------------------------------------------------- - // Handling of back button in case modal is open should - // close the modal - // -------------------------------------------------------- + // -------------------------------------------------------- + // Handling of back button in case modal is open should + // close the modal + // -------------------------------------------------------- - $ionicPlatform.registerBackButtonAction(function(e) - { - e.preventDefault(); - if ($scope.modal != undefined && $scope.modal.isShown()) - { - // switch off awake, as liveview is finished - NVRDataModel.debug("Modal is open, closing it"); - NVRDataModel.setAwake(false); - $scope.modal.remove(); - } - else - { - NVRDataModel.debug("Modal is closed, so toggling or exiting"); - if (!$ionicSideMenuDelegate.isOpenLeft()) - { - $ionicSideMenuDelegate.toggleLeft(); - - } - else - { - navigator.app.exitApp(); - } + $ionicPlatform.registerBackButtonAction(function (e) { + e.preventDefault(); + if ($scope.modal != undefined && $scope.modal.isShown()) { + // switch off awake, as liveview is finished + NVRDataModel.debug("Modal is open, closing it"); + NVRDataModel.setAwake(false); + $scope.modal.remove(); + } else { + NVRDataModel.debug("Modal is closed, so toggling or exiting"); + if (!$ionicSideMenuDelegate.isOpenLeft()) { + $ionicSideMenuDelegate.toggleLeft(); - } + } else { + navigator.app.exitApp(); + } - }, 1000); + } - $scope.openMenu = function() - { - $ionicSideMenuDelegate.toggleLeft(); - }; + }, 1000); + + $scope.openMenu = function () { + $ionicSideMenuDelegate.toggleLeft(); + }; + + //---------------------------------------------------------------- + // Alarm notification handling + //---------------------------------------------------------------- + $scope.handleAlarms = function () { + $rootScope.isAlarm = !$rootScope.isAlarm; + if (!$rootScope.isAlarm) { + $rootScope.alarmCount = "0"; + $ionicHistory.nextViewOptions({ + disableBack: true + }); + + $state.go("app.events", { + "id": 0, + "playEvent": false + }, { + reload: true + }); + return; + } + }; + //----------------------------------------------------------------------- + // This function takes care of changing monitor parameters + // For now, I've only limited it to enable/disable and change monitor mode + // and changing monitor function + //----------------------------------------------------------------------- + $scope.changeConfig = function (monitorName, monitorId, enabled, func) { + var checked = false; + + if (monitorName == 'All') { + monitorName = $translate.instant('kAll'); + } - //---------------------------------------------------------------- - // Alarm notification handling - //---------------------------------------------------------------- - $scope.handleAlarms = function() - { - $rootScope.isAlarm = !$rootScope.isAlarm; - if (!$rootScope.isAlarm) - { - $rootScope.alarmCount = "0"; - $ionicHistory.nextViewOptions( - { - disableBack: true - }); + //console.log("called with " + monitorId + ":" + enabled + ":" + func); + if (enabled == '1') checked = true; + + //if monitorId is not specified, all monitors will be changed + var monitorsIds = []; + if (monitorId == '') { + for (var i = 0; i < $scope.monitors.length; i++) { + monitorsIds[i] = $scope.monitors[i].Monitor.Id; + } + } else { + monitorsIds[0] = monitorId; + } - $state.go("app.events", - { - "id": 0, - "playEvent": false - }, - { - reload: true - }); - return; - } - }; - //----------------------------------------------------------------------- - // This function takes care of changing monitor parameters - // For now, I've only limited it to enable/disable and change monitor mode - // and changing monitor function - //----------------------------------------------------------------------- - $scope.changeConfig = function(monitorName, monitorId, enabled, func) + $scope.monFunctions = [{ + text: $translate.instant('kMonModect'), + value: "Modect" + }, + { + text: $translate.instant('kMonMocord'), + value: "Mocord" + }, + { + text: $translate.instant('kMonRecord'), + value: "Record" + }, + { + text: $translate.instant('kMonNodect'), + value: "Nodect" + }, + { + text: $translate.instant('kMonMonitor'), + value: "Monitor" + }, + { + text: $translate.instant('kMonNone'), + value: "None" + } + ]; + + $scope.monfunc = { + mymonitorsIds: monitorsIds, + myfunc: func, + myenabled: checked, + myfailedIds: [], + mypromises: [] + }; + + $rootScope.zmPopup = $ionicPopup.show({ + scope: $scope, + template: '<ion-toggle ng-model="monfunc.myenabled" toggle-class="toggle-calm">Enabled</ion-toggle><ion-radio-fix ng-repeat="item in monFunctions" ng-value="item.value" ng-model="monfunc.myfunc"> {{item.text}} </ion-radio-fix>', + + title: $translate.instant('kChangeSettingsFor') + ' ' + monitorName, + + buttons: [{ + text: $translate.instant('kButtonCancel'), + + }, { - var checked = false; - - if (monitorName == 'All') - { - monitorName = $translate.instant('kAll'); - } - - //console.log("called with " + monitorId + ":" + enabled + ":" + func); - if (enabled == '1') checked = true; - - //if monitorId is not specified, all monitors will be changed - var monitorsIds = []; - if (monitorId == '') - { - for (var i = 0; i < $scope.monitors.length; i++) - { - monitorsIds[i] = $scope.monitors[i].Monitor.Id; - } - } - else - { - monitorsIds[0] = monitorId; - } - - $scope.monFunctions = [ - { - text: $translate.instant('kMonModect'), - value: "Modect" - }, - { - text: $translate.instant('kMonMocord'), - value: "Mocord" - }, - { - text: $translate.instant('kMonRecord'), - value: "Record" - }, - { - text: $translate.instant('kMonNodect'), - value: "Nodect" - }, - { - text: $translate.instant('kMonMonitor'), - value: "Monitor" - }, - { - text: $translate.instant('kMonNone'), - value: "None" - }]; - - $scope.monfunc = { - mymonitorsIds: monitorsIds, - myfunc: func, - myenabled: checked, - myfailedIds: [], - mypromises: [] - }; - - $rootScope.zmPopup = $ionicPopup.show( - { - scope: $scope, - template: '<ion-toggle ng-model="monfunc.myenabled" toggle-class="toggle-calm">Enabled</ion-toggle><ion-radio-fix ng-repeat="item in monFunctions" ng-value="item.value" ng-model="monfunc.myfunc"> {{item.text}} </ion-radio-fix>', - - title: $translate.instant('kChangeSettingsFor') + ' ' + monitorName, - - buttons: [ - { - text: $translate.instant('kButtonCancel'), - - }, - { - text: $translate.instant('kButtonSave'), - onTap: function(e) - { - $scope.monfunc.mymonitorsIds.forEach(function(item, index) - { - NVRDataModel.debug("MonitorCtrl:changeConfig selection:" + $scope.monfunc.myenabled + - $scope.monfunc.myfunc); - var loginData = NVRDataModel.getLogin(); - var apiRestart = loginData.apiurl + "/states/change/restart.json"; - var apiMon = loginData.apiurl + "/monitors/" + item + ".json"; - - NVRDataModel.debug("MonitorCtrl: URLs for changeConfig save:" + apiMon); - - var isEnabled = ""; - isEnabled = ($scope.monfunc.myenabled == true) ? '1' : '0'; - - $ionicLoading.show( - { - template: $translate.instant('kApplyingChanges') + "...", - noBackdrop: true, - duration: zm.largeHttpTimeout, - }); - - var httpPromise = $http( - { - url: apiMon, - method: 'post', - headers: - { - 'Content-Type': 'application/x-www-form-urlencoded', - 'Accept': '*/*', - }, - transformRequest: function(obj) - { - var str = []; - for (var p in obj) - str.push(encodeURIComponent(p) + "=" + - encodeURIComponent(obj[p])); - var foo = str.join("&"); - // console.log("****RETURNING " + foo); - NVRDataModel.debug("MonitorCtrl: parmeters constructed: " + foo); - return foo; - }, - data: - { - 'Monitor[Function]': $scope.monfunc.myfunc, - 'Monitor[Enabled]': isEnabled, - } - - }) - .success(function() - { - NVRDataModel.debug("MonitorCtrl: Not restarting ZM - Make sure you have the patch installed in MonitorsController.php or this won't work"); - }) - .error(function(data, status, headers, config) - { - NVRDataModel.debug("MonitorCtrl: Error changing monitor " + JSON.stringify(data)); - $scope.monfunc.myfailedIds.push(item); - }); - - $scope.monfunc.mypromises.push(httpPromise); - }); + text: $translate.instant('kButtonSave'), + onTap: function (e) { + $scope.monfunc.mymonitorsIds.forEach(function (item, index) { + NVRDataModel.debug("MonitorCtrl:changeConfig selection:" + $scope.monfunc.myenabled + + $scope.monfunc.myfunc); + var loginData = NVRDataModel.getLogin(); + var apiRestart = loginData.apiurl + "/states/change/restart.json"; + var apiMon = loginData.apiurl + "/monitors/" + item + ".json"; + + NVRDataModel.debug("MonitorCtrl: URLs for changeConfig save:" + apiMon); + + var isEnabled = ""; + isEnabled = ($scope.monfunc.myenabled == true) ? '1' : '0'; + + $ionicLoading.show({ + template: $translate.instant('kApplyingChanges') + "...", + noBackdrop: true, + duration: zm.largeHttpTimeout, + }); + + var httpPromise = $http({ + url: apiMon, + method: 'post', + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + 'Accept': '*/*', + }, + transformRequest: function (obj) { + var str = []; + for (var p in obj) + str.push(encodeURIComponent(p) + "=" + + encodeURIComponent(obj[p])); + var foo = str.join("&"); + // console.log("****RETURNING " + foo); + NVRDataModel.debug("MonitorCtrl: parmeters constructed: " + foo); + return foo; + }, + data: { + 'Monitor[Function]': $scope.monfunc.myfunc, + 'Monitor[Enabled]': isEnabled, + } - $q.all($scope.monfunc.mypromises).then(function(e) - { - $ionicLoading.hide(); - // if there's a failed ID, an error has occurred - if ($scope.monfunc.myfailedIds.length != 0) - { - $ionicLoading.show( - { - template: $translate.instant('kErrorChangingMonitors') + ". Monitor IDs : " + $scope.monfunc.myfailedIds.toString(), - noBackdrop: true, - duration: 3000, - }); - } - else - { - // I am not restarting ZM after monitor change - /* NVRDataModel.debug ("MonitorCtrl: Restarting ZM"); - $ionicLoading.show({ - template: "Successfully changed Monitor. Please wait, restarting ZoneMinder...", - noBackdrop: true, - duration: zm.largeHttpTimeout, - }); - $http.post(apiRestart) - .then(function (success) { - $ionicLoading.hide(); - var refresh = NVRDataModel.getMonitors(1); - refresh.then(function (data) { - $scope.monitors = data; - $scope.$broadcast('scroll.refreshComplete'); - }); - - }, - function (error) { - $ionicLoading.hide(); - - });*/ - doRefresh(); - } - }); - } + }) + .success(function () { + NVRDataModel.debug("MonitorCtrl: Not restarting ZM - Make sure you have the patch installed in MonitorsController.php or this won't work"); + }) + .error(function (data, status, headers, config) { + NVRDataModel.debug("MonitorCtrl: Error changing monitor " + JSON.stringify(data)); + $scope.monfunc.myfailedIds.push(item); + }); - }, ] + $scope.monfunc.mypromises.push(httpPromise); }); - }; - - // same logic as EventCtrl.js - $scope.finishedLoadingImage = function() - { - // console.log("***Monitor image FINISHED Loading***"); - $ionicLoading.hide(); - }; - - $scope.$on('$ionicView.loaded', function() - { - // console.log("**VIEW ** Monitor Ctrl Loaded"); - }); - - //------------------------------------------------------------------------- - // Lets make sure we set screen dim properly as we enter - // The problem is we enter other states before we leave previous states - // from a callback perspective in ionic, so we really can't predictably - // reset power state on exit as if it is called after we enter another - // state, that effectively overwrites current view power management needs - //------------------------------------------------------------------------ - $scope.$on('$ionicView.enter', function() - { - // console.log("**VIEW ** Monitor Ctrl Entered"); - NVRDataModel.setAwake(false); - $ionicSideMenuDelegate.canDragContent(true); - $scope.areImagesLoading = true; - }); - - $scope.$on('$ionicView.afterEnter', function() - { - // console.log("**VIEW ** Monitor Ctrl Entered"); - $scope.monitors = []; - $scope.monitors = message; - - //console.log (">>>>>>>>>>>> MONITOR CTRL " + JSON.stringify($scope.monitors)); - - if ($scope.monitors.length == 0) - { - $rootScope.zmPopup = $ionicPopup.alert( - { - title: $translate.instant('kNoMonitors'), - template: $translate.instant('kPleaseCheckCredentials') + $q.all($scope.monfunc.mypromises).then(function (e) { + $ionicLoading.hide(); + // if there's a failed ID, an error has occurred + if ($scope.monfunc.myfailedIds.length != 0) { + $ionicLoading.show({ + template: $translate.instant('kErrorChangingMonitors') + ". Monitor IDs : " + $scope.monfunc.myfailedIds.toString(), + noBackdrop: true, + duration: 3000, }); - $ionicHistory.nextViewOptions( - { - disableBack: true + } else { + // I am not restarting ZM after monitor change + /* NVRDataModel.debug ("MonitorCtrl: Restarting ZM"); + $ionicLoading.show({ + template: "Successfully changed Monitor. Please wait, restarting ZoneMinder...", + noBackdrop: true, + duration: zm.largeHttpTimeout, }); - $state.go("app.login", - { - "wizard": false - }); - return; - } + $http.post(apiRestart) + .then(function (success) { + $ionicLoading.hide(); + var refresh = NVRDataModel.getMonitors(1); + refresh.then(function (data) { + $scope.monitors = data; + $scope.$broadcast('scroll.refreshComplete'); + }); - loginData = NVRDataModel.getLogin(); - monitorStateCheck(); - //console.log("Setting Awake to " + NVRDataModel.getKeepAwake()); - NVRDataModel.setAwake(NVRDataModel.getKeepAwake()); - // Now lets see if we need to load live screen - - // $rootScope.tappedMid = 1; - if ($rootScope.tappedMid != 0) - { - NVRDataModel.log("Notification tapped, we need to go to monitor " + $rootScope.tappedMid); - - var tm = $rootScope.tappedMid; - $rootScope.tappedMid = 0; - var monitem; - for (var m = 0; m < $scope.monitors.length; m++) - { - if ($scope.monitors[m].Monitor.Id == tm) - { - monitem = $scope.monitors[m]; - break; - } - - } - - openModal(monitem.Monitor.Id, monitem.Monitor.Controllable, monitem.Monitor.ControlId, monitem.Monitor.connKey, monitem); - } + }, + function (error) { + $ionicLoading.hide(); - }); + });*/ + doRefresh(); + } + }); + } + + }, + ] + }); + + }; + + // same logic as EventCtrl.js + $scope.finishedLoadingImage = function () { + // console.log("***Monitor image FINISHED Loading***"); + $ionicLoading.hide(); + }; + + $scope.$on('$ionicView.loaded', function () { + // console.log("**VIEW ** Monitor Ctrl Loaded"); + }); + + //------------------------------------------------------------------------- + // Lets make sure we set screen dim properly as we enter + // The problem is we enter other states before we leave previous states + // from a callback perspective in ionic, so we really can't predictably + // reset power state on exit as if it is called after we enter another + // state, that effectively overwrites current view power management needs + //------------------------------------------------------------------------ + $scope.$on('$ionicView.enter', function () { + // console.log("**VIEW ** Monitor Ctrl Entered"); + NVRDataModel.setAwake(false); + $ionicSideMenuDelegate.canDragContent(true); + $scope.areImagesLoading = true; + }); + + $scope.$on('$ionicView.afterEnter', function () { + // console.log("**VIEW ** Monitor Ctrl Entered"); + $scope.monitors = []; + $scope.monitors = message; + + //console.log (">>>>>>>>>>>> MONITOR CTRL " + JSON.stringify($scope.monitors)); + + if ($scope.monitors.length == 0) { + $rootScope.zmPopup = $ionicPopup.alert({ + title: $translate.instant('kNoMonitors'), + template: $translate.instant('kPleaseCheckCredentials') + }); + $ionicHistory.nextViewOptions({ + disableBack: true + }); + $state.go("app.login", { + "wizard": false + }); + return; + } - $scope.$on('$ionicView.leave', function() - { - // console.log("**VIEW ** Monitor Ctrl Left, force removing modal"); - if ($scope.modal) $scope.modal.remove(); - }); + loginData = NVRDataModel.getLogin(); + monitorStateCheck(); + //console.log("Setting Awake to " + NVRDataModel.getKeepAwake()); + NVRDataModel.setAwake(NVRDataModel.getKeepAwake()); + // Now lets see if we need to load live screen + + // $rootScope.tappedMid = 1; + if ($rootScope.tappedMid != 0) { + NVRDataModel.log("Notification tapped, we need to go to monitor " + $rootScope.tappedMid); + + var tm = $rootScope.tappedMid; + $rootScope.tappedMid = 0; + var monitem; + for (var m = 0; m < $scope.monitors.length; m++) { + if ($scope.monitors[m].Monitor.Id == tm) { + monitem = $scope.monitors[m]; + break; + } - $scope.$on('$ionicView.unloaded', function() - { - // console.log("**VIEW ** Monitor Ctrl Unloaded"); - }); + } - $scope.openModal = function(mid, controllable, controlid, connKey, monitor) - { + openModal(monitem.Monitor.Id, monitem.Monitor.Controllable, monitem.Monitor.ControlId, monitem.Monitor.connKey, monitem); + } - openModal(mid, controllable, controlid, connKey, monitor); + }); - }; + $scope.$on('$ionicView.leave', function () { + // console.log("**VIEW ** Monitor Ctrl Left, force removing modal"); + if ($scope.modal) $scope.modal.remove(); + }); + + $scope.$on('$ionicView.unloaded', function () { + // console.log("**VIEW ** Monitor Ctrl Unloaded"); + }); - function openModal(mid, controllable, controlid, connKey, monitor) - { - NVRDataModel.debug("MonitorCtrl:Open Monitor Modal with monitor Id=" + mid + - " and Controllable:" + controllable + " with control ID:" + controlid); - - $scope.controlURL = monitor.Monitor.controlURL; - $scope.monitor = monitor; - //console.log (">>>>>>>>>>>> MONITOR CRL " + $scope.monitor. - $scope.monitorId = mid; - $scope.monitorName = NVRDataModel.getMonitorName(mid); - $scope.LoginData = NVRDataModel.getLogin(); - $scope.rand = Math.floor(Math.random() * (999999 - 111111 + 1)) + 111111; - $scope.refMonitor = monitor; - NVRDataModel.log("Monitor Orientation is: " + $scope.orientation); - $rootScope.rand = Math.floor(Math.random() * (999999 - 111111 + 1)) + 111111; - - $scope.showPTZ = false; - $scope.monitorId = mid; - $scope.monitorName = NVRDataModel.getMonitorName(mid); - $scope.controlid = controlid; - - $scope.LoginData = NVRDataModel.getLogin(); - $rootScope.modalRand = Math.floor(Math.random() * (999999 - 111111 + 1)) + 111111; - - $scope.ptzMoveCommand = ""; - $scope.ptzStopCommand = ""; - - $scope.zoomInCommand = ""; - $scope.zoomOutCommand = ""; - $scope.zoomStopCommand = "zoomStop"; - $scope.canZoom = false; - - $scope.presetOn = false; - - - $scope.isControllable = controllable; - - $rootScope.modalRand = Math.floor(Math.random() * (999999 - 111111 + 1)) + 111111; - - // This is a modal to show the monitor footage - // We need to switch to always awake if set so the feed doesn't get interrupted - NVRDataModel.setAwake(NVRDataModel.getKeepAwake()); - - $ionicModal.fromTemplateUrl('templates/monitors-modal.html', - { - scope: $scope, - animation: 'slide-in-up' - }) - .then(function(modal) - { - $scope.modal = modal; - $scope.isModalActive = true; - $scope.modal.show(); - }); + $scope.openModal = function (mid, controllable, controlid, connKey, monitor) { - } + openModal(mid, controllable, controlid, connKey, monitor); - $scope.closeModal = function() - { - // console.log("Close & Destroy Monitor Modal"); - - // stop networking -nph-zms keeps sucking data - - // switch off awake, as liveview is finished - NVRDataModel.setAwake(false); - $scope.modal.remove(); - $timeout(function() - { - NVRDataModel.log("MonitorCtrl:Stopping network pull..."); - if (NVRDataModel.isForceNetworkStop()) NVRDataModel.stopNetwork("MonitorCtrl-closeModal"); - }, 300); - - }; - //Cleanup the modal when we're done with it! - $scope.$on('$destroy', function() - { - //console.log("Destroy Monitor Modal"); - if ($scope.modal) $scope.modal.remove(); - }); + }; - //----------------------------------------------------------------------- - // Controller Main - //----------------------------------------------------------------------- - - function monitorStateCheck() - { - var apiMonCheck; - - // The status is provided by zmdc.pl - // "not running", "pending", "running since", "Unable to connect" - var i; - for (i = 0; i < $scope.monitors.length; i++) - { - (function(j) - { - $scope.monitors[j].Monitor.isRunningText = "..."; - $scope.monitors[j].Monitor.isRunning = "..."; - $scope.monitors[j].Monitor.color = zm.monitorCheckingColor; - $scope.monitors[j].Monitor.char = "ion-checkmark-circled"; - apiMonCheck = loginData.apiurl + "/monitors/daemonStatus/id:" + $scope.monitors[j].Monitor.Id + "/daemon:zmc.json"; - - //apiMonCheck = apiMonCheck.replace(loginData.url, $scope.monitors[j].Monitor.baseURL); - - // in multiserver replace apiurl with baseurl - - NVRDataModel.debug("MonitorCtrl:monitorStateCheck: " + apiMonCheck); - //console.log("**** ZMC CHECK " + apiMonCheck); - $http.get(apiMonCheck) - .success(function(data) - { - NVRDataModel.debug("MonitorCtrl: monitor check state returned: " + JSON.stringify(data)); - if (data.statustext.indexOf("not running") > -1) - { - $scope.monitors[j].Monitor.isRunning = "false"; - $scope.monitors[j].Monitor.color = zm.monitorNotRunningColor; - $scope.monitors[j].Monitor.char = "ion-close-circled"; - } - else if (data.statustext.indexOf("pending") > -1) - { - $scope.monitors[j].Monitor.isRunning = "pending"; - $scope.monitors[j].Monitor.color = zm.monitorPendingColor; - } - else if (data.statustext.indexOf("running since") > -1) - { - $scope.monitors[j].Monitor.isRunning = "true"; - $scope.monitors[j].Monitor.color = zm.monitorRunningColor; - } - else if (data.statustext.indexOf("Unable to connect") > -1) - { - $scope.monitors[j].Monitor.isRunning = "false"; - $scope.monitors[j].Monitor.color = zm.monitorNotRunningColor; - $scope.monitors[j].Monitor.char = "ion-close-circled"; - } - - $scope.monitors[j].Monitor.isRunningText = data.statustext; - }) - .error(function(data) - { - NVRDataModel.debug("MonitorCtrl: Error->monitor check state returned: " + - JSON.stringify(data)); - NVRDataModel.displayBanner('error', [$translate.instant('kErrorRetrievingState'), $translate.instant('kPleaseTryAgain')]); - $scope.monitors[j].Monitor.isRunning = "error"; - $scope.monitors[j].Monitor.color = zm.monitorErrorColor; - $scope.monitors[j].Monitor.char = "ion-help-circled"; - }); - - })(i); + function openModal(mid, controllable, controlid, connKey, monitor) { + NVRDataModel.debug("MonitorCtrl:Open Monitor Modal with monitor Id=" + mid + + " and Controllable:" + controllable + " with control ID:" + controlid); + + $scope.controlURL = monitor.Monitor.controlURL; + $scope.monitor = monitor; + //console.log (">>>>>>>>>>>> MONITOR CRL " + $scope.monitor. + $scope.monitorId = mid; + $scope.monitorName = NVRDataModel.getMonitorName(mid); + $scope.LoginData = NVRDataModel.getLogin(); + $scope.rand = Math.floor(Math.random() * (999999 - 111111 + 1)) + 111111; + $scope.refMonitor = monitor; + NVRDataModel.log("Monitor Orientation is: " + $scope.orientation); + $rootScope.rand = Math.floor(Math.random() * (999999 - 111111 + 1)) + 111111; + + $scope.showPTZ = false; + $scope.monitorId = mid; + $scope.monitorName = NVRDataModel.getMonitorName(mid); + $scope.controlid = controlid; + + $scope.LoginData = NVRDataModel.getLogin(); + $rootScope.modalRand = Math.floor(Math.random() * (999999 - 111111 + 1)) + 111111; + + $scope.ptzMoveCommand = ""; + $scope.ptzStopCommand = ""; + + $scope.zoomInCommand = ""; + $scope.zoomOutCommand = ""; + $scope.zoomStopCommand = "zoomStop"; + $scope.canZoom = false; + + $scope.presetOn = false; + + + $scope.isControllable = controllable; + + $rootScope.modalRand = Math.floor(Math.random() * (999999 - 111111 + 1)) + 111111; + + // This is a modal to show the monitor footage + // We need to switch to always awake if set so the feed doesn't get interrupted + NVRDataModel.setAwake(NVRDataModel.getKeepAwake()); + + $ionicModal.fromTemplateUrl('templates/monitors-modal.html', { + scope: $scope, + animation: 'slide-in-up' + }) + .then(function (modal) { + $scope.modal = modal; + $scope.isModalActive = true; + $scope.modal.show(); + }); + + } + + $scope.closeModal = function () { + // console.log("Close & Destroy Monitor Modal"); + + // stop networking -nph-zms keeps sucking data + + // switch off awake, as liveview is finished + NVRDataModel.setAwake(false); + $scope.modal.remove(); + $timeout(function () { + NVRDataModel.log("MonitorCtrl:Stopping network pull..."); + if (NVRDataModel.isForceNetworkStop()) NVRDataModel.stopNetwork("MonitorCtrl-closeModal"); + }, 300); + + }; + //Cleanup the modal when we're done with it! + $scope.$on('$destroy', function () { + //console.log("Destroy Monitor Modal"); + if ($scope.modal) $scope.modal.remove(); + }); + + //----------------------------------------------------------------------- + // Controller Main + //----------------------------------------------------------------------- + + function monitorStateCheck() { + var apiMonCheck; + + // The status is provided by zmdc.pl + // "not running", "pending", "running since", "Unable to connect" + var i; + for (i = 0; i < $scope.monitors.length; i++) { + (function (j) { + $scope.monitors[j].Monitor.isRunningText = "..."; + $scope.monitors[j].Monitor.isRunning = "..."; + $scope.monitors[j].Monitor.color = zm.monitorCheckingColor; + $scope.monitors[j].Monitor.char = "ion-checkmark-circled"; + apiMonCheck = loginData.apiurl + "/monitors/daemonStatus/id:" + $scope.monitors[j].Monitor.Id + "/daemon:zmc.json"; + + //apiMonCheck = apiMonCheck.replace(loginData.url, $scope.monitors[j].Monitor.baseURL); + + // in multiserver replace apiurl with baseurl + + NVRDataModel.debug("MonitorCtrl:monitorStateCheck: " + apiMonCheck); + //console.log("**** ZMC CHECK " + apiMonCheck); + $http.get(apiMonCheck) + .success(function (data) { + NVRDataModel.debug("MonitorCtrl: monitor check state returned: " + JSON.stringify(data)); + if (data.statustext.indexOf("not running") > -1) { + $scope.monitors[j].Monitor.isRunning = "false"; + $scope.monitors[j].Monitor.color = zm.monitorNotRunningColor; + $scope.monitors[j].Monitor.char = "ion-close-circled"; + } else if (data.statustext.indexOf("pending") > -1) { + $scope.monitors[j].Monitor.isRunning = "pending"; + $scope.monitors[j].Monitor.color = zm.monitorPendingColor; + } else if (data.statustext.indexOf("running since") > -1) { + $scope.monitors[j].Monitor.isRunning = "true"; + $scope.monitors[j].Monitor.color = zm.monitorRunningColor; + } else if (data.statustext.indexOf("Unable to connect") > -1) { + $scope.monitors[j].Monitor.isRunning = "false"; + $scope.monitors[j].Monitor.color = zm.monitorNotRunningColor; + $scope.monitors[j].Monitor.char = "ion-close-circled"; } - } - function doRefresh() - { - $scope.monitors = []; + $scope.monitors[j].Monitor.isRunningText = data.statustext; + }) + .error(function (data) { + NVRDataModel.debug("MonitorCtrl: Error->monitor check state returned: " + + JSON.stringify(data)); + NVRDataModel.displayBanner('error', [$translate.instant('kErrorRetrievingState'), $translate.instant('kPleaseTryAgain')]); + $scope.monitors[j].Monitor.isRunning = "error"; + $scope.monitors[j].Monitor.color = zm.monitorErrorColor; + $scope.monitors[j].Monitor.char = "ion-help-circled"; + }); + + })(i); + } + } - var refresh = NVRDataModel.getMonitors(1); + function doRefresh() { + $scope.monitors = []; - refresh.then(function(data) - { - $scope.monitors = data; - monitorStateCheck(); - $scope.$broadcast('scroll.refreshComplete'); - }); - } + var refresh = NVRDataModel.getMonitors(1); - $scope.doRefresh = function() - { - //console.log("***Pull to Refresh"); - doRefresh(); + refresh.then(function (data) { + $scope.monitors = data; + monitorStateCheck(); + $scope.$broadcast('scroll.refreshComplete'); + }); + } - }; + $scope.doRefresh = function () { + //console.log("***Pull to Refresh"); + doRefresh(); - } - ]); + }; + + } + ]); diff --git a/www/js/MonitorModalCtrl.js b/www/js/MonitorModalCtrl.js index 97ffc45c..0875b25a 100644 --- a/www/js/MonitorModalCtrl.js +++ b/www/js/MonitorModalCtrl.js @@ -19,8 +19,8 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$ var targetID = ""; $scope.imageZoomable = true; $scope.ptzButtonsShown = true; - - + + @@ -34,20 +34,20 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$ //$rootScope.authSession = "undefined"; - /* $ionicLoading.show({ - template: $translate.instant('kNegotiatingStreamAuth') + '...', - animation: 'fade-in', - showBackdrop: true, - duration: zm.loadingTimeout, - maxWidth: 300, - showDelay: 0 - });*/ + /* $ionicLoading.show({ + template: $translate.instant('kNegotiatingStreamAuth') + '...', + animation: 'fade-in', + showBackdrop: true, + duration: zm.loadingTimeout, + maxWidth: 300, + showDelay: 0 + });*/ $scope.currentStreamMode = 'single'; NVRDataModel.log("Using stream mode " + $scope.currentStreamMode); NVRDataModel.debug("MonitorModalCtrl called from " + $ionicHistory.currentStateName()); - + //no need to recompute auth in modal /*$rootScope.validMonitorId = $scope.monitors[0].Monitor.Id; @@ -75,7 +75,7 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$ // console.log ("Refreshing Image..."); }.bind(this), zm.alarmStatusTime); - + // This is the PTZ menu @@ -199,22 +199,21 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$ //NVRDataModel.stopNetwork("MonitorModal-auth success"); $scope.isModalStreamPaused = false; - $timeout (function() { + $timeout(function () { if (0 && $rootScope.platformOS == 'ios') { - NVRDataModel.debug ("Webkit hack, hammering window.stop();"); + NVRDataModel.debug("Webkit hack, hammering window.stop();"); NVRDataModel.stopNetwork(); - } - else { + } else { NVRDataModel.killLiveStream($scope.connKey, $scope.controlURL); } - - - $scope.connKey = (Math.floor((Math.random() * 999999) + 1)).toString(); + + + $scope.connKey = (Math.floor((Math.random() * 999999) + 1)).toString(); }); - + }); @@ -281,12 +280,12 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$ $interval.cancel(cycleHandle); NVRDataModel.debug("Killing single stream..."); - + if (0 && $rootScope.platformOS == 'ios') { - NVRDataModel.debug ("Webkit hack, hammering window.stop();"); + NVRDataModel.debug("Webkit hack, hammering window.stop();"); NVRDataModel.stopNetwork(); - } else { - NVRDataModel.killLiveStream($scope.connKey, $scope.controlURL); + } else { + NVRDataModel.killLiveStream($scope.connKey, $scope.controlURL); } // $interval.cancel(modalIntervalHandle) // FIXME: Do I need to setAwake(false) here? @@ -627,7 +626,7 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$ // now create a points array for circle handles - /* for (i = 0; i < $scope.zoneArray.length; i++) { + /* for (i = 0; i < $scope.zoneArray.length; i++) { //jshint loopfunc: true $scope.zoneArray[i].coords.split(' ') .forEach(function (itm) { @@ -644,7 +643,7 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$ }*/ $scope.isModalStreamPaused = false; - NVRDataModel.debug ("Modal image loaded, switching to streaming"); + NVRDataModel.debug("Modal image loaded, switching to streaming"); @@ -652,7 +651,7 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$ } - + //------------------------------------------------------------- // Send PTZ command to ZM // Note: PTZ fails on desktop, don't bother about it @@ -849,13 +848,13 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$ var element = angular.element(document.getElementById("monitorimage")); var slidein; var slideout; - $timeout (function() { + $timeout(function () { NVRDataModel.killLiveStream($scope.connKey, $scope.controlURL); // we should now have a paused stream, time to animate out - - + + var dirn = d; if (dirn == 1) { slideout = "animated slideOutLeft"; @@ -864,35 +863,35 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$ slideout = "animated slideOutRight"; slidein = "animated slideInLeft"; } - - + + element.addClass(slideout) .one('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend', outWithOld); }); - + function outWithOld() { NVRDataModel.log(">>>Old image out"); - // NVRDataModel.log("ModalCtrl:Stopping network pull..."); + // NVRDataModel.log("ModalCtrl:Stopping network pull..."); //NVRDataModel.stopNetwork("MonitorModal-outwithOld"); $scope.rand = Math.floor((Math.random() * 100000) + 1); - + $timeout(function () { element.removeClass(slideout); element.addClass(slidein) .one('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend', inWithNew); - + $scope.monitorId = mid; $scope.monitorName = NVRDataModel.getMonitorName(mid); $scope.monitor = NVRDataModel.getMonitorObject(mid); $scope.controlURL = $scope.monitor.Monitor.controlURL; $scope.zoneArray = []; $scope.circlePoints = []; - // getZones(); + // getZones(); configurePTZ($scope.monitorId); }, 200); } @@ -900,15 +899,15 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$ function inWithNew() { element.removeClass(slidein); - + $scope.isModalStreamPaused = false; - + var ld = NVRDataModel.getLogin(); carouselUtils.setStop(false); $scope.connKey = (Math.floor((Math.random() * 999999) + 1)).toString(); // get new key for new id $scope.animationInProgress = false; // has to be AFTER new connkey - NVRDataModel.log("<<<New image loaded in with ck:"+$scope.connKey); + NVRDataModel.log("<<<New image loaded in with ck:" + $scope.connKey); } $ionicLoading.hide(); @@ -1081,11 +1080,11 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$ var url = loginData.streamingurl + '/zms?mode=single&monitor=' + mid; - if ($rootScope.authSession !='undefined'){ - url +=$rootScope.authSession; - - } - url += NVRDataModel.insertBasicAuthToken(); + if ($rootScope.authSession != 'undefined') { + url += $rootScope.authSession; + + } + url += NVRDataModel.insertBasicAuthToken(); NVRDataModel.log("SavetoPhone:Trying to save image from " + url); @@ -1135,33 +1134,33 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$ } - $scope.constructSingleStream = function() { + $scope.constructSingleStream = function () { + - var stream; - stream = $scope.monitor.Monitor.streamingURL + - "/nph-zms?mode="+getSingleStreamMode() + - "&monitor="+$scope.monitorId + - "&scale="+$scope.quality + - $rootScope.authSession + - "&rand="+$rootScope.modalRand + - appendSingleStreamConnKey(); - - //console.log ("STREAM="+stream); + stream = $scope.monitor.Monitor.streamingURL + + "/nph-zms?mode=" + getSingleStreamMode() + + "&monitor=" + $scope.monitorId + + "&scale=" + $scope.quality + + $rootScope.authSession + + "&rand=" + $rootScope.modalRand + + appendSingleStreamConnKey(); + + //console.log ("STREAM="+stream); - if (stream) stream += NVRDataModel.insertBasicAuthToken(); - return stream; + if (stream) stream += NVRDataModel.insertBasicAuthToken(); + return stream; }; function getSingleStreamMode() { - return $scope.isModalStreamPaused ? 'single': 'jpeg'; + return $scope.isModalStreamPaused ? 'single' : 'jpeg'; } -function appendSingleStreamConnKey() { - return $scope.isModalStreamPaused ? "": "&connkey="+$scope.connKey; + function appendSingleStreamConnKey() { + return $scope.isModalStreamPaused ? "" : "&connkey=" + $scope.connKey; } @@ -1225,16 +1224,14 @@ function appendSingleStreamConnKey() { $scope.isModalActive = false; if (1 || $rootScope.platformOS != 'ios') { - + // ios calls window stop... NVRDataModel.debug("Single monitor exited killing stream"); - NVRDataModel.killLiveStream($scope.connKey, $scope.controlURL); - } + NVRDataModel.killLiveStream($scope.connKey, $scope.controlURL); + } else { - else { - - NVRDataModel.debug("Webkit hack, hammering window.stop();"); - NVRDataModel.stopNetwork(); + NVRDataModel.debug("Webkit hack, hammering window.stop();"); + NVRDataModel.stopNetwork(); } //console.log("**MODAL REMOVED: Stopping modal timer"); diff --git a/www/js/MontageCtrl.js b/www/js/MontageCtrl.js index 53774f93..839c8527 100644 --- a/www/js/MontageCtrl.js +++ b/www/js/MontageCtrl.js @@ -31,10 +31,10 @@ angular.module('zmApp.controllers') var streamState = { - SNAPSHOT:1, - ACTIVE:2, - STOPPED:3 - }; + SNAPSHOT: 1, + ACTIVE: 2, + STOPPED: 3 + }; var currentStreamState = streamState.SNAPSHOT; // first load snapshot $scope.isModalStreamPaused = false; // used in Monitor Modal @@ -317,14 +317,14 @@ angular.module('zmApp.controllers') $scope.areImagesLoading = false; currentStreamState = streamState.SNAPSHOT; - if (simulStreaming) { + if (simulStreaming) { - $timeout (function() { - NVRDataModel.debug ("Switching mode to active..."); + $timeout(function () { + NVRDataModel.debug("Switching mode to active..."); currentStreamState = streamState.ACTIVE; - },100); + }, 100); } - + $ionicLoading.hide(); @@ -593,7 +593,7 @@ angular.module('zmApp.controllers') function randEachTime() { randToAvoidCacheMem = new Date().getTime(); - + //$scope.randToAvoidCacheMem = "1"; //console.log ("Generating:"+$scope.randToAvoidCacheMem); } @@ -604,7 +604,7 @@ angular.module('zmApp.controllers') function loadNotifications() { if (simulStreaming) { - // console.log ("Skipping timer as simulStreaming"); + // console.log ("Skipping timer as simulStreaming"); return; } @@ -642,7 +642,7 @@ angular.module('zmApp.controllers') $scope.modal.remove(); $scope.MontageMonitors = $scope.copyMontage; finishReorder(); - + }; function finishReorder() { @@ -696,29 +696,29 @@ angular.module('zmApp.controllers') $scope.areImagesLoading = false; currentStreamState = streamState.SNAPSHOT; - if (simulStreaming) { + if (simulStreaming) { - $timeout (function() { - NVRDataModel.debug ("Switching mode to active..."); + $timeout(function () { + NVRDataModel.debug("Switching mode to active..."); currentStreamState = streamState.ACTIVE; - },100); + }, 100); } }, 20); } $scope.reorderFrame = function (item) { - var frame = ""; - frame = item.Monitor.streamingURL+"/nph-zms?mode=single" + - "&monitor="+item.Monitor.Id + - "&scale=50"; - - if ($rootScope.authSession!='undefined') frame+=$rootScope.authSession; - frame += NVRDataModel.insertBasicAuthToken(); - return frame; + var frame = ""; + frame = item.Monitor.streamingURL + "/nph-zms?mode=single" + + "&monitor=" + item.Monitor.Id + + "&scale=50"; + + if ($rootScope.authSession != 'undefined') frame += $rootScope.authSession; + frame += NVRDataModel.insertBasicAuthToken(); + return frame; }; - $scope.isCycleOn = function() { + $scope.isCycleOn = function () { return NVRDataModel.getLogin().cycleMontageProfiles; }; @@ -761,12 +761,27 @@ angular.module('zmApp.controllers') NVRDataModel.debug("Killing all streams in montage to save memory/nw..."); currentStreamState = streamState.STOPPED; NVRDataModel.stopNetwork() - .then (function (succ) { - for (var i = 0; i < $scope.MontageMonitors.length; i++) { - if ($scope.MontageMonitors[i].Monitor.listDisplay == 'show') NVRDataModel.killLiveStream($scope.MontageMonitors[i].Monitor.connKey, $scope.MontageMonitors[i].Monitor.controlURL); - } - // in context of timeout - $ionicModal.fromTemplateUrl('templates/reorder-modal.html', { + .then(function (succ) { + for (var i = 0; i < $scope.MontageMonitors.length; i++) { + if ($scope.MontageMonitors[i].Monitor.listDisplay == 'show') NVRDataModel.killLiveStream($scope.MontageMonitors[i].Monitor.connKey, $scope.MontageMonitors[i].Monitor.controlURL); + } + // in context of timeout + $ionicModal.fromTemplateUrl('templates/reorder-modal.html', { + scope: $scope, + animation: 'slide-in-up', + id: 'reorder', + }) + .then(function (modal) { + $scope.modal = modal; + $scope.reOrderActive = true; + $scope.modal.show(); + }); + + }); + + + } else { + $ionicModal.fromTemplateUrl('templates/reorder-modal.html', { scope: $scope, animation: 'slide-in-up', id: 'reorder', @@ -777,22 +792,6 @@ angular.module('zmApp.controllers') $scope.modal.show(); }); - }); - - - } - else { - $ionicModal.fromTemplateUrl('templates/reorder-modal.html', { - scope: $scope, - animation: 'slide-in-up', - id: 'reorder', - }) - .then(function (modal) { - $scope.modal = modal; - $scope.reOrderActive = true; - $scope.modal.show(); - }); - } }; @@ -1324,21 +1323,21 @@ angular.module('zmApp.controllers') broadcastHandles = []; currentStreamState = streamState.STOPPED; - $timeout(function () { - if (!$scope.singleMonitorModalOpen && simulStreaming) { - NVRDataModel.debug("Killing all streams in montage to save memory/nw..."); + $timeout(function () { + if (!$scope.singleMonitorModalOpen && simulStreaming) { + NVRDataModel.debug("Killing all streams in montage to save memory/nw..."); + + for (i = 0; i < $scope.MontageMonitors.length; i++) { + if ($scope.MontageMonitors[i].Monitor.listDisplay == 'show') NVRDataModel.killLiveStream($scope.MontageMonitors[i].Monitor.connKey, $scope.MontageMonitors[i].Monitor.controlURL); - for (i = 0; i < $scope.MontageMonitors.length; i++) { - if ($scope.MontageMonitors[i].Monitor.listDisplay == 'show') NVRDataModel.killLiveStream($scope.MontageMonitors[i].Monitor.connKey, $scope.MontageMonitors[i].Monitor.controlURL); - - } - } - - }); - - + } + + }); + + + @@ -1348,7 +1347,7 @@ angular.module('zmApp.controllers') NVRDataModel.debug("MontageCtrl: onpause called"); viewCleanup(); viewCleaned = true; - + } function onResume() { @@ -1476,7 +1475,7 @@ angular.module('zmApp.controllers') //console.log ("NEW POS="+ld.packeryPositions); NVRDataModel.setLogin(ld); - + $timeout(function () { // after render @@ -1496,7 +1495,7 @@ angular.module('zmApp.controllers') } // in timeout for iOS as we call stopNetwork - $timeout (function() { + $timeout(function () { NVRDataModel.regenConnKeys(); $scope.monitors = NVRDataModel.getMonitorsNow(); @@ -1506,16 +1505,15 @@ angular.module('zmApp.controllers') }, zm.packeryTimer); }); - - } - else { + + } else { NVRDataModel.regenConnKeys(); - $scope.monitors = NVRDataModel.getMonitorsNow(); - $scope.MontageMonitors = angular.copy($scope.monitors); - $timeout(function () { - initPackery(); - }, zm.packeryTimer); + $scope.monitors = NVRDataModel.getMonitorsNow(); + $scope.MontageMonitors = angular.copy($scope.monitors); + $timeout(function () { + initPackery(); + }, zm.packeryTimer); } @@ -1701,7 +1699,7 @@ angular.module('zmApp.controllers') function getMode() { - var mode = (simulStreaming && currentStreamState!=streamState.SNAPSHOT && currentStreamState != streamState.STOPPED) ? 'jpeg' : 'single'; + var mode = (simulStreaming && currentStreamState != streamState.SNAPSHOT && currentStreamState != streamState.STOPPED) ? 'jpeg' : 'single'; //console.log ("mode="+mode); return mode; @@ -1713,7 +1711,7 @@ angular.module('zmApp.controllers') var stream; if (currentStreamState == streamState.STOPPED || monitor.Monitor.listDisplay == 'noshow' || $rootScope.authSession == 'undefined') { - // console.log ("STREAM=empty"); + // console.log ("STREAM=empty"); return ""; } @@ -1725,17 +1723,17 @@ angular.module('zmApp.controllers') "&buffer=1000" + $rootScope.authSession + appendConnKey(monitor.Monitor.connKey); - - if (stream) stream += NVRDataModel.insertBasicAuthToken(); + if (stream) stream += NVRDataModel.insertBasicAuthToken(); - -//"&rand=" + randToAvoidCacheMem; + + + //"&rand=" + randToAvoidCacheMem; //"&rand="+$scope.randToAvoidCacheMem + - - // console.log("STREAM=" + stream); + + // console.log("STREAM=" + stream); return stream; }; @@ -1747,7 +1745,7 @@ angular.module('zmApp.controllers') return ""; } - + $scope.toggleSubMenuFunction = function () { $scope.toggleSubMenu = !$scope.toggleSubMenu; @@ -1769,7 +1767,7 @@ angular.module('zmApp.controllers') $scope.monitors = NVRDataModel.getMonitorsNow(); $scope.MontageMonitors = angular.copy($scope.monitors); - + $scope.singleMonitorModalOpen = false; // $scope.minimal = $stateParams.minimal; @@ -1785,10 +1783,10 @@ angular.module('zmApp.controllers') //console.log ("****** MULTIPORT="+multiPortZms); NVRDataModel.debug("Multiport=" + data); - /* if ($rootScope.platformOS == 'ios') { - simulStreaming = false; - NVRDataModel.debug("IOS detected, DISABLING simul streaming"); - }*/ + /* if ($rootScope.platformOS == 'ios') { + simulStreaming = false; + NVRDataModel.debug("IOS detected, DISABLING simul streaming"); + }*/ if (ld.disableSimulStreaming) { simulStreaming = false; @@ -1822,7 +1820,7 @@ angular.module('zmApp.controllers') }; $scope.$on('$ionicView.afterEnter', function () { - // NVRDataModel.debug("Setting image mode to snapshot, will change to image when packery is all done"); + // NVRDataModel.debug("Setting image mode to snapshot, will change to image when packery is all done"); $scope.areImagesLoading = true; $scope.isDragabillyOn = false; $scope.reOrderActive = false; @@ -1933,9 +1931,9 @@ angular.module('zmApp.controllers') } - $timeout(function () { - initPackery(); - }, zm.packeryTimer); + $timeout(function () { + initPackery(); + }, zm.packeryTimer); //console.log("**VIEW ** Montage Ctrl AFTER ENTER"); window.addEventListener("resize", orientationChanged, false); @@ -1946,9 +1944,9 @@ angular.module('zmApp.controllers') $scope.$on('$ionicView.beforeLeave', function () { - currentStreamState = streamState.STOPPED; - viewCleanup(); - viewCleaned = true; + currentStreamState = streamState.STOPPED; + viewCleanup(); + viewCleaned = true; }); diff --git a/www/js/MontageHistoryCtrl.js b/www/js/MontageHistoryCtrl.js index 6ecb7d53..e2782387 100644 --- a/www/js/MontageHistoryCtrl.js +++ b/www/js/MontageHistoryCtrl.js @@ -177,7 +177,7 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc /* Note this is also called when the view is first loaded */ function footerCollapse() { - NVRDataModel.debug ("Inside footerCollapse"); + NVRDataModel.debug("Inside footerCollapse"); if (readyToRun == false) { NVRDataModel.debug("fake call to footerCollapse - ignoring"); return; @@ -227,24 +227,23 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc $timeout(function () { - var i; - if ($rootScope.platformOS != 'ios') { + var i; + if ($rootScope.platformOS != 'ios') { NVRDataModel.debug("Killing existing streams, if alive..."); - for ( i = 0; i < $scope.MontageMonitors.length; i++) { - if ($scope.MontageMonitors[i].Monitor.listDisplay == 'show' && $scope.MontageMonitors[i].Monitor.eventUrl != 'img/noevent.png') NVRDataModel.killLiveStream($scope.MontageMonitors[i].Monitor.connKey, $scope.MontageMonitors[i].Monitor.controlURL, $scope.MontageMonitors[i].Monitor.Name); - } - } - else { + for (i = 0; i < $scope.MontageMonitors.length; i++) { + if ($scope.MontageMonitors[i].Monitor.listDisplay == 'show' && $scope.MontageMonitors[i].Monitor.eventUrl != 'img/noevent.png') NVRDataModel.killLiveStream($scope.MontageMonitors[i].Monitor.connKey, $scope.MontageMonitors[i].Monitor.controlURL, $scope.MontageMonitors[i].Monitor.Name); + } + } else { NVRDataModel.stopNetwork("montage-history footerCollapse"); - } - + } + //NVRDataModel.regenConnKeys(); //$scope.monitors = NVRDataModel.getMonitorsNow(); //$scope.MontageMonitors = angular.copy($scope.monitors); NVRDataModel.debug(">>Initializing monitor array with history specific stuff..."); - for ( i = 0; i < $scope.MontageMonitors.length; i++) { + for (i = 0; i < $scope.MontageMonitors.length; i++) { //$scope.MontageMonitors[i].Monitor.connKey=''; //$scope.MontageMonitors[i].Monitor.connKey = (Math.floor((Math.random() * 99999) + 1)).toString(); $scope.MontageMonitors[i].Monitor.eventUrl = 'img/noevent.png'; @@ -260,8 +259,10 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc } // let stopNetwork finish - $timeout (function() {getNextSetHistory();}); - + $timeout(function () { + getNextSetHistory(); + }); + }); @@ -312,7 +313,7 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc } } - }// for + } // for } // make sure we do our best to get that duration for all monitors @@ -330,12 +331,14 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc } } - $q.all(promises).then( function() { + $q.all(promises).then(function () { $scope.isScreenReady = true; - $timeout (function() { doPackery();}); - - } - + $timeout(function () { + doPackery(); + }); + + } + ); // At this stage, we have both a general events grab, and specific event grabs for MIDS that were empty @@ -344,22 +347,22 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc // $ionicLoading.hide(); //console.log("REDOING PACKERY & DRAG"); NVRDataModel.debug("Re-creating packery and draggy"); - - // remove current draggies - if (draggies) + + // remove current draggies + if (draggies) draggies.forEach(function (drag) { drag.destroy(); }); - draggies = []; - // destroy existing packery object - if (pckry) pckry.destroy(); - initPackery(); - - $interval.cancel($rootScope.eventQueryInterval); - $rootScope.eventQueryInterval = $interval(function () { - checkAllEvents(); - }.bind(this), zm.eventHistoryTimer); - + draggies = []; + // destroy existing packery object + if (pckry) pckry.destroy(); + initPackery(); + + $interval.cancel($rootScope.eventQueryInterval); + $rootScope.eventQueryInterval = $interval(function () { + checkAllEvents(); + }.bind(this), zm.eventHistoryTimer); + } }, function (err) { NVRDataModel.debug("history ERROR:" + JSON.stringify(err)); @@ -378,7 +381,7 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc if (data.events.length > 0) { if (!NVRDataModel.isBackground()) { var bw = NVRDataModel.getBandwidth() == "lowbw" ? zm.eventMontageQualityLowBW : ld.montageHistoryQuality; - $scope.MontageMonitors[i].Monitor.eventUrl = $scope.MontageMonitors[i].Monitor.streamingURL + "/nph-zms?source=event&mode=jpeg&event=" + data.events[0].Event.Id + "&frame=1&replay=gapless&rate=" + $scope.sliderVal.realRate + "&connkey=" + $scope.MontageMonitors[i].Monitor.connKey + "&scale=" + bw + $rootScope.authSession; + $scope.MontageMonitors[i].Monitor.eventUrl = $scope.MontageMonitors[i].Monitor.streamingURL + "/nph-zms?source=event&mode=jpeg&event=" + data.events[0].Event.Id + "&frame=1&replay=gapless&rate=" + $scope.sliderVal.realRate + "&connkey=" + $scope.MontageMonitors[i].Monitor.connKey + "&scale=" + bw + $rootScope.authSession; //console.log ("SWITCHING TO " + $scope.MontageMonitors[i].eventUrl); $scope.MontageMonitors[i].Monitor.eventUrlTime = data.events[0].Event.StartTime; $scope.MontageMonitors[i].Monitor.eid = data.events[0].Event.Id; @@ -396,13 +399,13 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc } } d.resolve(true); - + return d.promise; }, function (err) { d.resolve(true); - + return d.promise; } @@ -411,7 +414,7 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc return d.promise; } - }// getNextHistory + } // getNextHistory } @@ -615,8 +618,8 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc var bw = NVRDataModel.getBandwidth() == "lowbw" ? zm.eventMontageQualityLowBW : ld.montageHistoryQuality; // you don't have to change url - its taken care of in cmd? - - // $scope.MontageMonitors[ndx].Monitor.eventUrl = $scope.MontageMonitors[ndx].Monitor.streamingURL + "/nph-zms?source=event&mode=jpeg&event=" + data.event.Event.Id + "&frame=1&replay=gapless&rate=" + $scope.sliderVal.realRate + "&connkey=" + $scope.MontageMonitors[ndx].Monitor.connKey + "&scale=" + bw + $rootScope.authSession; + + // $scope.MontageMonitors[ndx].Monitor.eventUrl = $scope.MontageMonitors[ndx].Monitor.streamingURL + "/nph-zms?source=event&mode=jpeg&event=" + data.event.Event.Id + "&frame=1&replay=gapless&rate=" + $scope.sliderVal.realRate + "&connkey=" + $scope.MontageMonitors[ndx].Monitor.connKey + "&scale=" + bw + $rootScope.authSession; $scope.MontageMonitors[ndx].Monitor.eid = data.event.Event.Id; $scope.MontageMonitors[ndx].Monitor.sliderProgress = { progress: 0 @@ -794,8 +797,8 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc NVRDataModel.debug("Montage History View Cleanup was already done, skipping"); return; } - - + + $interval.cancel($rootScope.eventQueryInterval); if (pckry) pckry.destroy(); @@ -804,15 +807,15 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc areStreamsStopped = true; - $timeout(function () { + $timeout(function () { - NVRDataModel.debug("Killing all streams in montage to save memory/nw..."); - for (var i = 0; i < $scope.MontageMonitors.length; i++) { - if ($scope.MontageMonitors[i].Monitor.listDisplay == 'show' && $scope.MontageMonitors[i].Monitor.eventUrl != 'img/noevent.png') NVRDataModel.killLiveStream($scope.MontageMonitors[i].Monitor.connKey, $scope.MontageMonitors[i].Monitor.controlURL,$scope.MontageMonitors[i].Monitor.Name); - - } - - }); + NVRDataModel.debug("Killing all streams in montage to save memory/nw..."); + for (var i = 0; i < $scope.MontageMonitors.length; i++) { + if ($scope.MontageMonitors[i].Monitor.listDisplay == 'show' && $scope.MontageMonitors[i].Monitor.eventUrl != 'img/noevent.png') NVRDataModel.killLiveStream($scope.MontageMonitors[i].Monitor.connKey, $scope.MontageMonitors[i].Monitor.controlURL, $scope.MontageMonitors[i].Monitor.Name); + + } + + }); } @@ -990,8 +993,8 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc //console.log ("**** mygrid is " + JSON.stringify(elem)); imagesLoaded(elem).on('progress', function (instance, img) { var result = img.isLoaded ? 'loaded' : 'broken'; - // NVRDataModel.debug('~~loaded image is ' + result + ' for ' + img.img.src); - $timeout(function () { + // NVRDataModel.debug('~~loaded image is ' + result + ' for ' + img.img.src); + $timeout(function () { pckry.layout(); }, 100); @@ -1076,10 +1079,10 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc // don't do this - we are simulstreaming in this view - /* if ($rootScope.platformOS == 'ios') { - isSimulStreaming = false; - NVRDataModel.log("IOS detected, disabling simulstreaming"); - }*/ + /* if ($rootScope.platformOS == 'ios') { + isSimulStreaming = false; + NVRDataModel.log("IOS detected, disabling simulstreaming"); + }*/ $scope.isMultiPort = isMultiPort; areStreamsStopped = true; @@ -1209,43 +1212,35 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc realtime: true, step: 1, className: "mySliderClass", //modelLabels:function(val) {return "";}, - callback: function(value, released) - { - //console.log("CALLBACK"+value+released); - $ionicScrollDelegate.freezeScroll(!released); - //NVRDataModel.debug("EventCtrl: freezeScroll called with " + !released); + callback: function (value, released) { + //console.log("CALLBACK"+value+released); + $ionicScrollDelegate.freezeScroll(!released); + //NVRDataModel.debug("EventCtrl: freezeScroll called with " + !released); }, smooth: false, dimension: 'X', - css: - { - background: - { - "background-color": "silver" - }, - before: - { - "background-color": "purple" - }, - default: - { - "background-color": "white" - }, // default value: 1px - after: - { - "background-color": "green" - }, // zone after default value - pointer: - { - "background-color": "red" - }, // circle pointer - range: - { - "background-color": "red" - } // use it if double value + css: { + background: { + "background-color": "silver" + }, + before: { + "background-color": "purple" + }, + default: { + "background-color": "white" + }, // default value: 1px + after: { + "background-color": "green" + }, // zone after default value + pointer: { + "background-color": "red" + }, // circle pointer + range: { + "background-color": "red" + } // use it if double value }, - + }; $scope.datetimeValueFrom = { @@ -1266,17 +1261,17 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc if (areStreamsStopped) return ""; //if (monitor.Monitor.isPaused) return ""; stream = monitor.Monitor.eventUrl; //eventUrl already has all the foo - + stream += NVRDataModel.insertBasicAuthToken(); - // console.log("STREAM=" + stream); + // console.log("STREAM=" + stream); return stream; }; function appendConnKey(ck) { - // always streaming + // always streaming return "&connkey=" + ck; - + } function doInitCode() @@ -1369,7 +1364,7 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc $scope.currentLimit = $scope.LoginData.maxMontage; ld = NVRDataModel.getLogin(); - if (!isMultiPort || ld.disableSimulStreaming) { + if (!isMultiPort || ld.disableSimulStreaming) { NVRDataModel.log("Limiting montage to 5, thanks to max connection per domain limit"); $scope.currentLimit = 5; @@ -1379,14 +1374,14 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc NVRDataModel.log("You have multiport on, so no montage limits"); } - + $timeout(function () { - // initPackery(); - readyToRun = true; - NVRDataModel.debug ("Calling footerCollapse from doInit"); - footerCollapse(); - }, zm.packeryTimer); + // initPackery(); + readyToRun = true; + NVRDataModel.debug("Calling footerCollapse from doInit"); + footerCollapse(); + }, zm.packeryTimer); } diff --git a/www/js/NewsCtrl.js b/www/js/NewsCtrl.js index f5d1fd35..6be6aa0e 100644 --- a/www/js/NewsCtrl.js +++ b/www/js/NewsCtrl.js @@ -2,131 +2,112 @@ /* jslint browser: true*/ /* global cordova,StatusBar,angular,console,moment*/ -angular.module('zmApp.controllers').controller('zmApp.NewsCtrl', ['$scope', '$rootScope', '$ionicModal', 'NVRDataModel', '$ionicSideMenuDelegate', '$ionicHistory', '$state', '$http', 'zm', function($scope, $rootScope, $ionicModal, NVRDataModel, $ionicSideMenuDelegate, $ionicHistory, $state, $http, zm) -{ - $scope.openMenu = function() - { - $ionicSideMenuDelegate.toggleLeft(); - }; - - //---------------------------------------------------------------- - // Alarm notification handling - //---------------------------------------------------------------- - $scope.handleAlarms = function() - { - $rootScope.isAlarm = !$rootScope.isAlarm; - if (!$rootScope.isAlarm) - { - $rootScope.alarmCount = "0"; - $ionicHistory.nextViewOptions( - { - disableBack: true - }); - $state.go("app.events", - { - "id": 0, - "playEvent": false - }, - { - reload: true - }); - return; +angular.module('zmApp.controllers').controller('zmApp.NewsCtrl', ['$scope', '$rootScope', '$ionicModal', 'NVRDataModel', '$ionicSideMenuDelegate', '$ionicHistory', '$state', '$http', 'zm', function ($scope, $rootScope, $ionicModal, NVRDataModel, $ionicSideMenuDelegate, $ionicHistory, $state, $http, zm) { + $scope.openMenu = function () { + $ionicSideMenuDelegate.toggleLeft(); + }; + + //---------------------------------------------------------------- + // Alarm notification handling + //---------------------------------------------------------------- + $scope.handleAlarms = function () { + $rootScope.isAlarm = !$rootScope.isAlarm; + if (!$rootScope.isAlarm) { + $rootScope.alarmCount = "0"; + $ionicHistory.nextViewOptions({ + disableBack: true + }); + $state.go("app.events", { + "id": 0, + "playEvent": false + }, { + reload: true + }); + return; + } + }; + + //------------------------------------------------------------------------- + // Lets make sure we set screen dim properly as we enter + // The problem is we enter other states before we leave previous states + // from a callback perspective in ionic, so we really can't predictably + // reset power state on exit as if it is called after we enter another + // state, that effectively overwrites current view power management needs + //------------------------------------------------------------------------ + $scope.$on('$ionicView.enter', function () { + // console.log("**VIEW ** News Ctrl Entered"); + NVRDataModel.setAwake(false); + + }); + + $scope.isUnread = function (itemdate) { + var lastDate = NVRDataModel.getLatestBlogPostChecked(); + //console.log ("BLOG DATE="+itemdate+" LAST DATE="+lastDate); + //get("latestBlogPostChecked"); + if (!lastDate) return true; + var mLastDate = moment(lastDate); + var mItemDate = moment(itemdate); + //var unread = mItemDate.diff(mLastDate) >0) ? true:false; + //console.log (unread); + return (mItemDate.diff(mLastDate, 'seconds') > 0) ? true : false; + + }; + + $scope.loadPost = function (item, itemdate) { + var lastDate = + NVRDataModel.getLatestBlogPostChecked(); //zmStorageService.get("latestBlogPostChecked"); + + if (!lastDate) { + NVRDataModel.debug("First time checking blog posts, I see"); + NVRDataModel.setLatestBlogPostChecked(itemdate); + //zmStorageService.set("latestBlogPostChecked", itemdate); + } else { + NVRDataModel.debug("last post checked is " + lastDate); + NVRDataModel.debug("current post dated is " + itemdate); + + var mLastDate = moment(lastDate); + var mItemDate = moment(itemdate); + if (mItemDate.diff(mLastDate, 'seconds') > 0) { + NVRDataModel.debug("Updating lastDate to this post"); + + NVRDataModel.setLatestBlogPostChecked(itemdate); //zmStorageService.set("latestBlogPostChecked", itemdate); + + if (itemdate == $scope.newsItems[0].date) { + // we are reading the latest post + $rootScope.newBlogPost = ""; } - }; - - //------------------------------------------------------------------------- - // Lets make sure we set screen dim properly as we enter - // The problem is we enter other states before we leave previous states - // from a callback perspective in ionic, so we really can't predictably - // reset power state on exit as if it is called after we enter another - // state, that effectively overwrites current view power management needs - //------------------------------------------------------------------------ - $scope.$on('$ionicView.enter', function() - { - // console.log("**VIEW ** News Ctrl Entered"); - NVRDataModel.setAwake(false); + } - }); + } - $scope.isUnread = function(itemdate) - { - var lastDate = NVRDataModel.getLatestBlogPostChecked(); - //console.log ("BLOG DATE="+itemdate+" LAST DATE="+lastDate); - //get("latestBlogPostChecked"); - if (!lastDate) return true; - var mLastDate = moment(lastDate); - var mItemDate = moment(itemdate); - //var unread = mItemDate.diff(mLastDate) >0) ? true:false; - //console.log (unread); - return (mItemDate.diff(mLastDate, 'seconds') > 0) ? true : false; - - }; - - $scope.loadPost = function(item, itemdate) - { - var lastDate = - NVRDataModel.getLatestBlogPostChecked(); //zmStorageService.get("latestBlogPostChecked"); - - if (!lastDate) - { - NVRDataModel.debug("First time checking blog posts, I see"); - NVRDataModel.setLatestBlogPostChecked(itemdate); - //zmStorageService.set("latestBlogPostChecked", itemdate); - } - else - { - NVRDataModel.debug("last post checked is " + lastDate); - NVRDataModel.debug("current post dated is " + itemdate); - - var mLastDate = moment(lastDate); - var mItemDate = moment(itemdate); - if (mItemDate.diff(mLastDate, 'seconds') > 0) - { - NVRDataModel.debug("Updating lastDate to this post"); - - NVRDataModel.setLatestBlogPostChecked(itemdate); //zmStorageService.set("latestBlogPostChecked", itemdate); - - if (itemdate == $scope.newsItems[0].date) - { - // we are reading the latest post - $rootScope.newBlogPost = ""; - } - } + window.open(item, '_blank', 'location=yes'); + return false; + }; + + $scope.newsItems = []; - } - - window.open(item, '_blank', 'location=yes'); - return false; - }; - - $scope.newsItems = []; - - - $http.get(zm.blogUrl, - {transformResponse: function(d,h) - { - var trunc = "])}while(1);</x>"; - d = d.substr(trunc.length); - return d; - } - }) - .success(function(datastr) - { - - - // console.log ("DATA:"+data); - // - var data = JSON.parse(datastr); - for (var i = 0; i < data.payload.posts.length; i++) - { - $scope.newsItems.push( - { - title: data.payload.posts[i].title, - url: "https://medium.com/zmninja/"+data.payload.posts[i].uniqueSlug, - date: moment(data.payload.posts[i].createdAt).format("YYYY-MM-DD HH:mm:ss") - }); - } + $http.get(zm.blogUrl, { + transformResponse: function (d, h) { + var trunc = "])}while(1);</x>"; + d = d.substr(trunc.length); + return d; + } + }) + .success(function (datastr) { + + + // console.log ("DATA:"+data); + // + var data = JSON.parse(datastr); + for (var i = 0; i < data.payload.posts.length; i++) { + $scope.newsItems.push({ + title: data.payload.posts[i].title, + url: "https://medium.com/zmninja/" + data.payload.posts[i].uniqueSlug, + date: moment(data.payload.posts[i].createdAt).format("YYYY-MM-DD HH:mm:ss") }); + } + + }); }]); diff --git a/www/js/PortalLoginCtrl.js b/www/js/PortalLoginCtrl.js index 46d15e1f..5135dffa 100644 --- a/www/js/PortalLoginCtrl.js +++ b/www/js/PortalLoginCtrl.js @@ -3,390 +3,349 @@ /*This is for the loop closure I am using in line 143 */ /* jslint browser: true*/ /* global vis,cordova,StatusBar,angular,console,moment */ -angular.module('zmApp.controllers').controller('zmApp.PortalLoginCtrl', ['$ionicPlatform', '$scope', 'zm', 'NVRDataModel', '$ionicSideMenuDelegate', '$rootScope', '$http', '$q', '$state', '$ionicLoading', '$ionicPopover', '$ionicScrollDelegate', '$ionicModal', '$timeout', 'zmAutoLogin', '$ionicHistory', 'EventServer', '$translate', function($ionicPlatform, $scope, zm, NVRDataModel, $ionicSideMenuDelegate, $rootScope, $http, $q, $state, $ionicLoading, $ionicPopover, $ionicScrollDelegate, $ionicModal, $timeout, zmAutoLogin, $ionicHistory, EventServer, $translate) -{ +angular.module('zmApp.controllers').controller('zmApp.PortalLoginCtrl', ['$ionicPlatform', '$scope', 'zm', 'NVRDataModel', '$ionicSideMenuDelegate', '$rootScope', '$http', '$q', '$state', '$ionicLoading', '$ionicPopover', '$ionicScrollDelegate', '$ionicModal', '$timeout', 'zmAutoLogin', '$ionicHistory', 'EventServer', '$translate', function ($ionicPlatform, $scope, zm, NVRDataModel, $ionicSideMenuDelegate, $rootScope, $http, $q, $state, $ionicLoading, $ionicPopover, $ionicScrollDelegate, $ionicModal, $timeout, zmAutoLogin, $ionicHistory, EventServer, $translate) { - var processPush = false; - var broadcastHandles = []; + var processPush = false; + var broadcastHandles = []; - $scope.$on ('$ionicView.beforeLeave', function() { - //processPush = false; - // NVRDataModel.debug ("BeforeEnter in Portal: setting ProcessPush to false"); - }); + $scope.$on('$ionicView.beforeLeave', function () { + //processPush = false; + // NVRDataModel.debug ("BeforeEnter in Portal: setting ProcessPush to false"); + }); - $scope.$on ('$ionicView.beforeLeave', function() { - NVRDataModel.debug ("Portal: Deregistering broadcast handles"); - for (var i=0; i < broadcastHandles.length; i++) { - //broadcastHandles[i](); - } - broadcastHandles = []; - }); + $scope.$on('$ionicView.beforeLeave', function () { + NVRDataModel.debug("Portal: Deregistering broadcast handles"); + for (var i = 0; i < broadcastHandles.length; i++) { + //broadcastHandles[i](); + } + broadcastHandles = []; + }); - $scope.$on('$ionicView.enter', - function() - { - NVRDataModel.setJustResumed(false); - - NVRDataModel.debug("Inside Portal login Enter handler"); - loginData = NVRDataModel.getLogin(); + $scope.$on('$ionicView.enter', + function () { + NVRDataModel.setJustResumed(false); - $ionicHistory.nextViewOptions( - { - disableBack: true - }); + NVRDataModel.debug("Inside Portal login Enter handler"); + loginData = NVRDataModel.getLogin(); - $scope.pindata = {}; - if ($ionicSideMenuDelegate.isOpen()) - { - $ionicSideMenuDelegate.toggleLeft(); - NVRDataModel.debug("Sliding menu close"); - } + $ionicHistory.nextViewOptions({ + disableBack: true + }); - $scope.pinPrompt = false; // if true, then PIN is displayed else skip + $scope.pindata = {}; + if ($ionicSideMenuDelegate.isOpen()) { + $ionicSideMenuDelegate.toggleLeft(); + NVRDataModel.debug("Sliding menu close"); + } - if (NVRDataModel.hasLoginInfo()) - { - NVRDataModel.log("User credentials are provided"); + $scope.pinPrompt = false; // if true, then PIN is displayed else skip + + if (NVRDataModel.hasLoginInfo()) { + NVRDataModel.log("User credentials are provided"); + + // You can login either via touch ID or typing in your code + + var ld = NVRDataModel.getLogin(); + + if (ld.reloadInMontage == true) { + // we are in montage reload, so don't re-auth + NVRDataModel.log("skipping validation, as this is montage reload"); + ld.reloadInMontage = false; + NVRDataModel.setLogin(ld); + unlock(true); + + } else if ($ionicPlatform.is('android') && loginData.usePin) { + + FingerprintAuth.isAvailable(function (result) { + NVRDataModel.debug("FingerprintAuth available: " + JSON.stringify(result)); + if (result.isAvailable == true && result.hasEnrolledFingerprints == true) { + var encryptConfig = { + clientId: "zmNinja", + username: "doesntmatter", + password: "doesntmatter", + maxAttempts: 5, + locale: "en_US", + dialogTitle: $translate.instant('kPleaseAuthenticate'), + dialogMessage: $translate.instant('kPleaseAuthenticate'), + dialogHint: "", + }; // See config object for required parameters + FingerprintAuth.encrypt(encryptConfig, function (succ) { + NVRDataModel.log("Touch success"); + unlock(true); + }, function (err) { + NVRDataModel.log("Touch Failed " + JSON.stringify(msg)); + }); + } // if available + }, + function (err) { + NVRDataModel.log("Fingerprint auth not available or not compatible with Android specs: " + JSON.stringify(err)); + } - // You can login either via touch ID or typing in your code + ); //isAvailable + + } else if ($ionicPlatform.is('ios') && loginData.usePin) { + + window.plugins.touchid.isAvailable( + function () { + window.plugins.touchid.verifyFingerprint( + $translate.instant('kPleaseAuthenticate'), // this will be shown in the native scanner popup + function (msg) { + NVRDataModel.log("Touch success"); + unlock(true); + }, // success handler: fingerprint accepted + function (msg) { + NVRDataModel.log("Touch Failed " + JSON.stringify(msg)); + } // error handler with errorcode and localised reason + ); + }, + function (err) {}); + + /* $cordovaTouchID.checkSupport() + .then(function() + { + // success, TouchID supported + $cordovaTouchID.authenticate("") + .then(function() + { + NVRDataModel.log("Touch Success"); + // Don't assign pin as it may be alphanum + unlock(true); + + }, + function() + { + NVRDataModel.log("Touch Failed"); + }); + }, function(error) + { + NVRDataModel.log("TouchID not supported"); + });*/ + } else // touch was not used + { + NVRDataModel.log("not checking for touchID"); + } - var ld = NVRDataModel.getLogin(); + if (loginData.usePin) { + // this shows the pin prompt on screen + $scope.pinPrompt = true; + // dont call unlock, let the user type in code - if (ld.reloadInMontage == true) { - // we are in montage reload, so don't re-auth - NVRDataModel.log ("skipping validation, as this is montage reload"); - ld.reloadInMontage = false; - NVRDataModel.setLogin(ld); - unlock(true); + } else // no PIN Code so go directly to auth + { - } + unlock(true); + } - else if ($ionicPlatform.is('android') && loginData.usePin) { - - FingerprintAuth.isAvailable(function (result) { - NVRDataModel.debug("FingerprintAuth available: " + JSON.stringify(result)); - if (result.isAvailable == true && result.hasEnrolledFingerprints == true) { - var encryptConfig = { - clientId: "zmNinja", - username: "doesntmatter", - password: "doesntmatter", - maxAttempts: 5, - locale: "en_US", - dialogTitle: $translate.instant('kPleaseAuthenticate'), - dialogMessage: $translate.instant('kPleaseAuthenticate'), - dialogHint: "", - }; // See config object for required parameters - FingerprintAuth.encrypt(encryptConfig, function (succ) { - NVRDataModel.log ("Touch success"); unlock(true); - }, function (err) { - NVRDataModel.log("Touch Failed " + JSON.stringify(msg)); - }); - } // if available - }, - function (err) { - NVRDataModel.log ("Fingerprint auth not available or not compatible with Android specs: "+ JSON.stringify(err)); - } - - );//isAvailable + } else // login creds are not present + { + NVRDataModel.debug("PortalLogin: Not logged in, so going to login"); + if (NVRDataModel.isFirstUse()) { + NVRDataModel.debug("First use, showing warm and fuzzy..."); + $ionicHistory.nextViewOptions({ + disableAnimate: true, + disableBack: true + }); + $state.go('app.first-use'); + return; + } else { + if (!$rootScope.userCancelledAuth) { + $ionicHistory.nextViewOptions({ + disableAnimate: true, + disableBack: true + }); + $state.go("app.login", { + "wizard": false + }); + return; + } else { + // do this only once - rest for next time + $rootScope.userCancelledAuth = false; + } + } + } - } + }); - else if ($ionicPlatform.is('ios') && loginData.usePin) - { + //------------------------------------------------------------------------------- + // remove status is pin is empty + //------------------------------------------------------------------------------- - window.plugins.touchid.isAvailable( - function () { - window.plugins.touchid.verifyFingerprint( - $translate.instant('kPleaseAuthenticate'), // this will be shown in the native scanner popup - function(msg) {NVRDataModel.log ("Touch success"); unlock(true);}, // success handler: fingerprint accepted - function(msg) { NVRDataModel.log("Touch Failed " + JSON.stringify(msg));} // error handler with errorcode and localised reason - ); - }, - function (err) {}); - - /* $cordovaTouchID.checkSupport() - .then(function() - { - // success, TouchID supported - $cordovaTouchID.authenticate("") - .then(function() - { - NVRDataModel.log("Touch Success"); - // Don't assign pin as it may be alphanum - unlock(true); - - }, - function() - { - NVRDataModel.log("Touch Failed"); - }); - }, function(error) - { - NVRDataModel.log("TouchID not supported"); - });*/ - } - else // touch was not used - { - NVRDataModel.log("not checking for touchID"); + $scope.pinChange = function () { + if ($scope.pindata.pin == null) { + $scope.pindata.status = ""; + } + }; + + //------------------------------------------------------------------------------- + // unlock app if PIN is correct + //------------------------------------------------------------------------------- + $scope.unlock = function () { + // call with false meaning check for pin + unlock(false); + }; + + //------------------------------------------------------------------------ + // Aaron Lager hack - can't figure out why he gets a 401 after + // successful login and then it works after resaving + //------------------------------------------------------------------------ + function tryLoggingSecondTimeHack() { + var d = $q.defer(); + + zmAutoLogin.doLogin("<button class='button button-clear' style='line-height: normal; min-height: 0; min-width: 0;color:#fff;' ng-click='$root.cancelAuth()'><i class='ion-close-circled'></i> " + $translate.instant('kAuthenticating') + "...</button>") + .then(function (data) // success + { + NVRDataModel.debug("2nd auth login worked"); + NVRDataModel.getAPIversion() + .then(function (data) { + NVRDataModel.getKeyConfigParams(1); + NVRDataModel.log("2nd auth:Got API version: " + data); + $rootScope.apiVersion = data; + var ld = NVRDataModel.getLogin(); + if (NVRDataModel.versionCompare(data, zm.minAppVersion) == -1 && data != "0.0.0") { + + $state.go('app.lowversion', { + "ver": data + }); + return; } - if (loginData.usePin) - { - // this shows the pin prompt on screen - $scope.pinPrompt = true; - // dont call unlock, let the user type in code + if (NVRDataModel.versionCompare(data, zm.recommendedAppVersion) == -1 && data != "0.0.0") { - } - else // no PIN Code so go directly to auth - { + NVRDataModel.hrsSinceChecked("zmVersion") + .then(function (val) { + NVRDataModel.debug("ZM Version nag: Checking " + val + " with " + zm.zmVersionCheckNag); + if (val >= zm.zmVersionCheckNag && 0) { + NVRDataModel.updateHrsSinceChecked("zmVersion"); + $state.go('app.importantmessage', { + "ver": data + }); + return; + } + + }); - unlock(true); } - } - else // login creds are not present - { - NVRDataModel.debug("PortalLogin: Not logged in, so going to login"); - if (NVRDataModel.isFirstUse()) + /*if (data == "0.0.0") { - NVRDataModel.debug("First use, showing warm and fuzzy..."); - $ionicHistory.nextViewOptions( + + NVRDataModel.log("2nd Auth:API getVersion succeeded but returned 0.0.0 " + JSON.stringify(data)); + NVRDataModel.displayBanner('error', ['ZoneMinder authentication failed']); + $state.go("login", { - disableAnimate: true, - disableBack: true + "wizard": false }); - $state.go('app.first-use'); return; - } - else - { - if (!$rootScope.userCancelledAuth) - { - $ionicHistory.nextViewOptions( - { - disableAnimate: true, - disableBack: true - }); - $state.go("app.login", - { - "wizard": false - }); - return; - } - else - { - // do this only once - rest for next time - $rootScope.userCancelledAuth = false; - } - } - } + }*/ + // coming here means continue + //EventServer.init(); + + var statetoGo = $rootScope.lastState ? $rootScope.lastState : 'app.montage'; + //NVRDataModel.debug ("logging state transition"); + NVRDataModel.debug("2nd Auth: Transitioning state to: " + + statetoGo + " with param " + JSON.stringify($rootScope.lastStateParam)); + $state.go(statetoGo, $rootScope.lastStateParam); + return; + + }, + function (error) { + NVRDataModel.debug("2nd auth API failed, going to login"); + d.reject("failed 2nd auth"); + return (d.promise); + }); + + }, + function (error) { + NVRDataModel.debug("2nd auth hack failed, going to login"); + d.reject("failed 2nd auth"); + return (d.promise); }); - //------------------------------------------------------------------------------- - // remove status is pin is empty - //------------------------------------------------------------------------------- + return (d.promise); + } - $scope.pinChange = function() - { - if ($scope.pindata.pin == null) - { - $scope.pindata.status = ""; - } - }; - //------------------------------------------------------------------------------- - // unlock app if PIN is correct - //------------------------------------------------------------------------------- - $scope.unlock = function() - { - // call with false meaning check for pin - unlock(false); - }; - - //------------------------------------------------------------------------ - // Aaron Lager hack - can't figure out why he gets a 401 after - // successful login and then it works after resaving - //------------------------------------------------------------------------ - function tryLoggingSecondTimeHack() - { - var d = $q.defer(); + //this needs to be rootScope so it lives even when we are out of view + var pp = $rootScope.$on("process-push", function () { + NVRDataModel.debug("*** PROCESS PUSH HANDLER CALLED INSIDE PORTAL LOGIN, setting ProcessPush to true"); + processPush = true; + evaluateTappedNotification(); - zmAutoLogin.doLogin("<button class='button button-clear' style='line-height: normal; min-height: 0; min-width: 0;color:#fff;' ng-click='$root.cancelAuth()'><i class='ion-close-circled'></i> " + $translate.instant('kAuthenticating') + "...</button>") - .then(function(data) // success - { - NVRDataModel.debug("2nd auth login worked"); - NVRDataModel.getAPIversion() - .then(function(data) - { - NVRDataModel.getKeyConfigParams(1); - NVRDataModel.log("2nd auth:Got API version: " + data); - $rootScope.apiVersion = data; - var ld = NVRDataModel.getLogin(); - if (NVRDataModel.versionCompare(data, zm.minAppVersion) == -1 && data != "0.0.0") - { - - $state.go('app.lowversion', - { - "ver": data - }); - return; - } - - if (NVRDataModel.versionCompare(data, zm.recommendedAppVersion) == -1 && data != "0.0.0") - { - - NVRDataModel.hrsSinceChecked("zmVersion") - .then (function (val) { - NVRDataModel.debug ("ZM Version nag: Checking "+val+" with "+zm.zmVersionCheckNag); - if (val >=zm.zmVersionCheckNag && 0) { - NVRDataModel.updateHrsSinceChecked("zmVersion"); - $state.go('app.importantmessage', - { - "ver": data - }); - return; - } - - }); - - } - - /*if (data == "0.0.0") - { - - NVRDataModel.log("2nd Auth:API getVersion succeeded but returned 0.0.0 " + JSON.stringify(data)); - NVRDataModel.displayBanner('error', ['ZoneMinder authentication failed']); - $state.go("login", - { - "wizard": false - }); - return; - }*/ - // coming here means continue - //EventServer.init(); - - var statetoGo = $rootScope.lastState ? $rootScope.lastState : 'app.montage'; - //NVRDataModel.debug ("logging state transition"); - NVRDataModel.debug("2nd Auth: Transitioning state to: " + - statetoGo + " with param " + JSON.stringify($rootScope.lastStateParam)); - $state.go(statetoGo, $rootScope.lastStateParam); - return; - - }, - function(error) - { - NVRDataModel.debug("2nd auth API failed, going to login"); - d.reject("failed 2nd auth"); - return (d.promise); - }); + }); + broadcastHandles.push(pp); - }, - function(error) - { - NVRDataModel.debug("2nd auth hack failed, going to login"); - d.reject("failed 2nd auth"); - return (d.promise); - }); + function evaluateTappedNotification() { + var ld = NVRDataModel.getLogin(); - return (d.promise); - } + // give enough time for state conflicts to work out + // that way PortalLogin doesn't override this + // and I thought I was eliminating hacks.... + $timeout(function () { + processPush = false; + }, 1000); - //this needs to be rootScope so it lives even when we are out of view - var pp = $rootScope.$on("process-push", function () { - NVRDataModel.debug("*** PROCESS PUSH HANDLER CALLED INSIDE PORTAL LOGIN, setting ProcessPush to true"); - processPush = true; - evaluateTappedNotification(); + if ($rootScope.tappedNotification == 2) { // url launch + NVRDataModel.debug("Came via app url launch with mid=" + $rootScope.tappedMid); + NVRDataModel.debug("Came via app url launch with eid=" + $rootScope.tappedEid); + $rootScope.tappedNotification = 0; + $ionicHistory.nextViewOptions({ + disableBack: true + }); - - }); - broadcastHandles.push(pp); - - function evaluateTappedNotification() + if (parseInt($rootScope.tappedMid) > 0) { + NVRDataModel.debug("Going to live view "); + $state.go("app.monitors"); + return; + + } else if (parseInt($rootScope.tappedEid) > 0) { + NVRDataModel.debug("Going to events with EID=" + $rootScope.tappedEid); + $state.go("app.events", { + //"id": $rootScope.tappedEid, + "id": 0, + "playEvent": true + }, { + reload: true + }); + return; + } + // go with monitor first, then event - just because I feel like ;) + + + } else if ($rootScope.tappedNotification == 1) // push + { + + + NVRDataModel.log("Came via push tap. onTapScreen=" + ld.onTapScreen); + $rootScope.pushOverride = true; + //console.log ("***** NOTIFICATION TAPPED "); + $rootScope.tappedNotification = 0; + $ionicHistory.nextViewOptions({ + disableBack: true + }); + + if (ld.onTapScreen == $translate.instant('kTapMontage')) { + NVRDataModel.debug("Going to montage"); + $state.go("app.montage"); + + return; + } else if (ld.onTapScreen == $translate.instant('kTapEvents')) { + NVRDataModel.debug("Going to events"); + $state.go("app.events", { + "id": 0, + "playEvent": false + }); + return; + } else // we go to live { - var ld = NVRDataModel.getLogin(); - - // give enough time for state conflicts to work out - // that way PortalLogin doesn't override this - // and I thought I was eliminating hacks.... - $timeout (function() {processPush = false;},1000); - - - if ($rootScope.tappedNotification == 2) { // url launch - NVRDataModel.debug("Came via app url launch with mid="+$rootScope.tappedMid); - NVRDataModel.debug("Came via app url launch with eid="+$rootScope.tappedEid); - $rootScope.tappedNotification = 0; - $ionicHistory.nextViewOptions( - { - disableBack: true - }); - - if (parseInt($rootScope.tappedMid) > 0) - { - NVRDataModel.debug("Going to live view "); - $state.go("app.monitors"); - return; - - } - - else if (parseInt($rootScope.tappedEid) > 0) { - NVRDataModel.debug("Going to events with EID=" + $rootScope.tappedEid); - $state.go("app.events", - { - //"id": $rootScope.tappedEid, - "id": 0, - "playEvent": true - }, - { - reload: true - }); - return; - } - // go with monitor first, then event - just because I feel like ;) - - - } - else if ($rootScope.tappedNotification == 1) // push - { - - - NVRDataModel.log("Came via push tap. onTapScreen=" + ld.onTapScreen); - $rootScope.pushOverride = true; - //console.log ("***** NOTIFICATION TAPPED "); - $rootScope.tappedNotification = 0; - $ionicHistory.nextViewOptions( - { - disableBack: true - }); - - if (ld.onTapScreen == $translate.instant('kTapMontage')) - { - NVRDataModel.debug("Going to montage"); - $state.go("app.montage"); - - return; - } - else if (ld.onTapScreen == $translate.instant('kTapEvents')) - { - NVRDataModel.debug("Going to events"); - $state.go("app.events", - { - "id": 0, - "playEvent": false - }); - return; - } - else // we go to live - { - NVRDataModel.debug("Going to live view "); - $state.go("app.monitors"); - return; - } - } - else { - /* NVRDataModel.debug ("Inside evaluateTapped, but no tap occured."); + NVRDataModel.debug("Going to live view "); + $state.go("app.monitors"); + return; + } + } else { + /* NVRDataModel.debug ("Inside evaluateTapped, but no tap occured."); NVRDataModel.debug ("This can happen if timing mismatch and holy foo happens"); $state.go("app.montage", {}, @@ -395,214 +354,188 @@ angular.module('zmApp.controllers').controller('zmApp.PortalLoginCtrl', ['$ionic }); return;*/ - - } - - } - - - function unlock(idVerified) - { - /* - idVerified == true means no pin check needed - == false means check PIN - */ + } + + } + + + + function unlock(idVerified) { + /* + idVerified == true means no pin check needed + == false means check PIN + */ + + NVRDataModel.debug("unlock called with check PIN=" + idVerified); + if (idVerified || ($scope.pindata.pin == loginData.pinCode)) { + NVRDataModel.debug("PIN code entered is correct, or there is no PIN set"); + $rootScope.rand = Math.floor((Math.random() * 100000) + 1); + zmAutoLogin.stop(); //safety + zmAutoLogin.start(); + + // PIN is fine, or not set so lets login + zmAutoLogin.doLogin("<button class='button button-clear' style='line-height: normal; min-height: 0; min-width: 0;color:#fff;' ng-click='$root.cancelAuth()'><i class='ion-close-circled'></i> " + $translate.instant('kAuthenticating') + "...</button>") + .then(function (data) // success + { + NVRDataModel.debug("PortalLogin: auth success"); + + + // $state.go("login" ,{"wizard": false}); + //login was ok, so get API details + NVRDataModel.getAPIversion() + .then(function (data) { + NVRDataModel.log("Got API version: " + data); + $rootScope.apiVersion = data; + var ld = NVRDataModel.getLogin(); + if (NVRDataModel.versionCompare(data, zm.minAppVersion) == -1 && data != "0.0.0") { + + $state.go('app.lowversion', { + "ver": data + }); + return; + } + + if (NVRDataModel.versionCompare(data, zm.recommendedAppVersion) == -1 && data != "0.0.0") { + + NVRDataModel.hrsSinceChecked("zmVersion") + .then(function (val) { + + NVRDataModel.debug("ZM Version nag: Checking " + val + " with " + zm.zmVersionCheckNag); + if (val >= zm.zmVersionCheckNag && 0) { + //https://api.github.com/repos/zoneminder/zoneminder/releases/latest + //tag_name + NVRDataModel.updateHrsSinceChecked("zmVersion"); + $state.go('app.importantmessage', { + "ver": data + }); + return; - NVRDataModel.debug("unlock called with check PIN=" + idVerified); - if (idVerified || ($scope.pindata.pin == loginData.pinCode)) - { - NVRDataModel.debug("PIN code entered is correct, or there is no PIN set"); - $rootScope.rand = Math.floor((Math.random() * 100000) + 1); - zmAutoLogin.stop(); //safety - zmAutoLogin.start(); - - // PIN is fine, or not set so lets login - zmAutoLogin.doLogin("<button class='button button-clear' style='line-height: normal; min-height: 0; min-width: 0;color:#fff;' ng-click='$root.cancelAuth()'><i class='ion-close-circled'></i> " + $translate.instant('kAuthenticating') + "...</button>") - .then(function(data) // success - { - NVRDataModel.debug("PortalLogin: auth success"); - - - // $state.go("login" ,{"wizard": false}); - //login was ok, so get API details - NVRDataModel.getAPIversion() - .then(function(data) - { - NVRDataModel.log("Got API version: " + data); - $rootScope.apiVersion = data; - var ld = NVRDataModel.getLogin(); - if (NVRDataModel.versionCompare(data, zm.minAppVersion) == -1 && data != "0.0.0") - { - - $state.go('app.lowversion', - { - "ver": data - }); - return; - } - - if (NVRDataModel.versionCompare(data, zm.recommendedAppVersion) == -1 && data != "0.0.0") - { - - NVRDataModel.hrsSinceChecked("zmVersion") - .then (function (val) { - - NVRDataModel.debug ("ZM Version nag: Checking "+val+" with "+zm.zmVersionCheckNag); - if (val >=zm.zmVersionCheckNag && 0 ) { - //https://api.github.com/repos/zoneminder/zoneminder/releases/latest - //tag_name - NVRDataModel.updateHrsSinceChecked("zmVersion"); - $state.go('app.importantmessage', - { - "ver": data - }); - return; - - } - - }); - - } - - /*if (data == "0.0.0") - { - - NVRDataModel.log("API getVersion succeeded but returned 0.0.0 " + JSON.stringify(data)); - NVRDataModel.displayBanner('error', ['ZoneMinder authentication failed']); - $state.go("login", - { - "wizard": false - }); - return; - - }*/ - // coming here means continue - // console.log (">>>>>>>>>>>>>>>>>>>>>>>>>NEVER"); - - NVRDataModel.getKeyConfigParams(1); - NVRDataModel.getTimeZone(); - EventServer.init(); - - // if push broadcast happens BEFORE this, then no - // state change will occur here which is good - - // if push happens AFTER this, then while going to - // lastState, it will interrupt and go to onTap - // (I HOPE...) - if (!processPush) - { - //console.log ("NOTIFICATION TAPPED INSIDE CHECK IS "+$rootScope.tappedNotification); - var statetoGo = $rootScope.lastState ? $rootScope.lastState : 'app.montage'; - // NVRDataModel.debug("logging state transition"); - NVRDataModel.debug("Transitioning state to: " + - statetoGo + " with param " + JSON.stringify($rootScope.lastStateParam)); - - $state.go(statetoGo, $rootScope.lastStateParam); - return; - - } - // else - // evaluateTappedNotification(); - - - }, - function(error) - { // API Error - NVRDataModel.log("API Error handler: going to login getAPI returned error: " + JSON.stringify(error)); - //NVRDataModel.displayBanner('error', ['ZoneMinder authentication failed']); - - NVRDataModel.debug("Doing the Aaron Hack after 1 sec...."); - $timeout(function() - { - tryLoggingSecondTimeHack() - .then(function success(s) - { - NVRDataModel.log("2nd time login hack worked!, nothing to do"); - NVRDataModel.getTimeZone(); - }, - function error(e) - { - - if ($rootScope.apiValid == true) - { - $state.go("app.login", - { - "wizard": false - }); - return; - } - else - { - $state.go("app.invalidapi"); - return; - } - - }); - - return; - - }, 1000); - - }); - - - - }, - // coming here means auth error - // so go back to login - function(error) - { - NVRDataModel.debug("PortalLogin: error authenticating " + - JSON.stringify(error)); - if (!$rootScope.userCancelledAuth) - { - NVRDataModel.displayBanner('error', ['ZoneMinder authentication failed', 'Please check API settings']); - $ionicHistory.nextViewOptions( - { - disableAnimate: true, - disableBack: true - }); - $state.go("app.login", - { - "wizard": false - }); - return; } - else - { - // if user cancelled auth I guess we go to login - $rootScope.userCancelledAuth = false; - $state.go("app.login", - { - "wizard": false + + }); + + } + + /*if (data == "0.0.0") + { + + NVRDataModel.log("API getVersion succeeded but returned 0.0.0 " + JSON.stringify(data)); + NVRDataModel.displayBanner('error', ['ZoneMinder authentication failed']); + $state.go("login", + { + "wizard": false + }); + return; + + }*/ + // coming here means continue + // console.log (">>>>>>>>>>>>>>>>>>>>>>>>>NEVER"); + + NVRDataModel.getKeyConfigParams(1); + NVRDataModel.getTimeZone(); + EventServer.init(); + + // if push broadcast happens BEFORE this, then no + // state change will occur here which is good + + // if push happens AFTER this, then while going to + // lastState, it will interrupt and go to onTap + // (I HOPE...) + if (!processPush) { + //console.log ("NOTIFICATION TAPPED INSIDE CHECK IS "+$rootScope.tappedNotification); + var statetoGo = $rootScope.lastState ? $rootScope.lastState : 'app.montage'; + // NVRDataModel.debug("logging state transition"); + NVRDataModel.debug("Transitioning state to: " + + statetoGo + " with param " + JSON.stringify($rootScope.lastStateParam)); + + $state.go(statetoGo, $rootScope.lastStateParam); + return; + + } + // else + // evaluateTappedNotification(); + + + }, + function (error) { // API Error + NVRDataModel.log("API Error handler: going to login getAPI returned error: " + JSON.stringify(error)); + //NVRDataModel.displayBanner('error', ['ZoneMinder authentication failed']); + + NVRDataModel.debug("Doing the Aaron Hack after 1 sec...."); + $timeout(function () { + tryLoggingSecondTimeHack() + .then(function success(s) { + NVRDataModel.log("2nd time login hack worked!, nothing to do"); + NVRDataModel.getTimeZone(); + }, + function error(e) { + + if ($rootScope.apiValid == true) { + $state.go("app.login", { + "wizard": false }); return; - } - }); - } - else - { - $scope.pindata.status = "Invalid PIN"; + } else { + $state.go("app.invalidapi"); + return; + } - // wobble the input box on error - var element = angular.element(document.getElementById("pin-box")); + }); - element.addClass("animated shake") - .one('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend', - function() - { - element.removeClass("animated shake"); - }); - } - } + return; - //------------------------------------------------------------------------------- - // Controller Main - //------------------------------------------------------------------------------- - // console.log("************* ENTERING PORTAL MAIN "); - NVRDataModel.log("Entering Portal Main"); - var loginData; - $ionicSideMenuDelegate.canDragContent(true); + }, 1000); + + }); + + + + }, + // coming here means auth error + // so go back to login + function (error) { + NVRDataModel.debug("PortalLogin: error authenticating " + + JSON.stringify(error)); + if (!$rootScope.userCancelledAuth) { + NVRDataModel.displayBanner('error', ['ZoneMinder authentication failed', 'Please check API settings']); + $ionicHistory.nextViewOptions({ + disableAnimate: true, + disableBack: true + }); + $state.go("app.login", { + "wizard": false + }); + return; + } else { + // if user cancelled auth I guess we go to login + $rootScope.userCancelledAuth = false; + $state.go("app.login", { + "wizard": false + }); + return; + } + }); + } else { + $scope.pindata.status = "Invalid PIN"; + + // wobble the input box on error + var element = angular.element(document.getElementById("pin-box")); + + element.addClass("animated shake") + .one('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend', + function () { + element.removeClass("animated shake"); + }); + } + } + + //------------------------------------------------------------------------------- + // Controller Main + //------------------------------------------------------------------------------- + // console.log("************* ENTERING PORTAL MAIN "); + NVRDataModel.log("Entering Portal Main"); + var loginData; + $ionicSideMenuDelegate.canDragContent(true); }]); diff --git a/www/js/RefreshCtrl.js b/www/js/RefreshCtrl.js index a29aae96..02acd74a 100644 --- a/www/js/RefreshCtrl.js +++ b/www/js/RefreshCtrl.js @@ -2,27 +2,24 @@ /* jslint browser: true*/ /* global cordova,StatusBar,angular,console */ -angular.module('zmApp.controllers').controller('zmApp.RefreshCtrl', ['$scope', '$ionicSideMenuDelegate', 'zm', '$stateParams', '$state', '$ionicHistory', function($scope, $ionicSideMenuDelegate, zm, $stateParams, $state, $ionicHistory) -{ - $scope.openMenu = function() - { - $ionicSideMenuDelegate.toggleLeft(); - }; +angular.module('zmApp.controllers').controller('zmApp.RefreshCtrl', ['$scope', '$ionicSideMenuDelegate', 'zm', '$stateParams', '$state', '$ionicHistory', function ($scope, $ionicSideMenuDelegate, zm, $stateParams, $state, $ionicHistory) { + $scope.openMenu = function () { + $ionicSideMenuDelegate.toggleLeft(); + }; - //------------------------------------------------------------------------- - // Controller Main - //------------------------------------------------------------------------ - $scope.$on('$ionicView.afterEnter', function() - { - //console.log("**VIEW ** LowVersion Ctrl Entered"); - $ionicSideMenuDelegate.canDragContent(false); - //console.log ("jumping to: "+$stateParams.view); - $ionicHistory.nextViewOptions({ - disableAnimate: true, - disableBack: true - }); - $state.go($stateParams.view); - return; + //------------------------------------------------------------------------- + // Controller Main + //------------------------------------------------------------------------ + $scope.$on('$ionicView.afterEnter', function () { + //console.log("**VIEW ** LowVersion Ctrl Entered"); + $ionicSideMenuDelegate.canDragContent(false); + //console.log ("jumping to: "+$stateParams.view); + $ionicHistory.nextViewOptions({ + disableAnimate: true, + disableBack: true }); + $state.go($stateParams.view); + return; + }); }]); diff --git a/www/js/StateCtrl.js b/www/js/StateCtrl.js index ed188613..a278c55d 100644 --- a/www/js/StateCtrl.js +++ b/www/js/StateCtrl.js @@ -4,407 +4,360 @@ // controller for State View -angular.module('zmApp.controllers').controller('zmApp.StateCtrl', ['$ionicPopup', '$scope', 'zm', 'NVRDataModel', '$ionicSideMenuDelegate', '$ionicLoading', '$ionicModal', '$state', '$http', '$rootScope', '$timeout', '$ionicHistory', '$translate', function( - $ionicPopup, $scope, zm, NVRDataModel, $ionicSideMenuDelegate, $ionicLoading, $ionicModal, $state, $http, $rootScope, $timeout, $ionicHistory, $translate) -{ - - //---------------------------------------------------------------------- - // Controller main - //---------------------------------------------------------------------- - $scope.zmRun = "..."; - $scope.zmLoad = "..."; - $scope.zmDisk = "..."; - $scope.color = ""; - $scope.showDanger = false; - $scope.dangerText = [$translate.instant('kStateShowControls'), $translate.instant('kStateHideControls')]; - $scope.dangerButtonColor = ["button-positive", "button-assertive"]; - $scope.customState = ""; - $scope.allStateNames = []; - - $rootScope.zmPopup = ""; - - var loginData = NVRDataModel.getLogin(); - - var apiRun = loginData.apiurl + "/host/daemonCheck.json"; - var apiLoad = loginData.apiurl + "/host/getLoad.json"; - var apiDisk = loginData.apiurl + "/host/getDiskPercent.json"; - var apiCurrentState = loginData.apiurl + "/States.json"; +angular.module('zmApp.controllers').controller('zmApp.StateCtrl', ['$ionicPopup', '$scope', 'zm', 'NVRDataModel', '$ionicSideMenuDelegate', '$ionicLoading', '$ionicModal', '$state', '$http', '$rootScope', '$timeout', '$ionicHistory', '$translate', function ( + $ionicPopup, $scope, zm, NVRDataModel, $ionicSideMenuDelegate, $ionicLoading, $ionicModal, $state, $http, $rootScope, $timeout, $ionicHistory, $translate) { + + //---------------------------------------------------------------------- + // Controller main + //---------------------------------------------------------------------- + $scope.zmRun = "..."; + $scope.zmLoad = "..."; + $scope.zmDisk = "..."; + $scope.color = ""; + $scope.showDanger = false; + $scope.dangerText = [$translate.instant('kStateShowControls'), $translate.instant('kStateHideControls')]; + $scope.dangerButtonColor = ["button-positive", "button-assertive"]; + $scope.customState = ""; + $scope.allStateNames = []; + + $rootScope.zmPopup = ""; + + var loginData = NVRDataModel.getLogin(); + + var apiRun = loginData.apiurl + "/host/daemonCheck.json"; + var apiLoad = loginData.apiurl + "/host/getLoad.json"; + var apiDisk = loginData.apiurl + "/host/getDiskPercent.json"; + var apiCurrentState = loginData.apiurl + "/States.json"; + + var apiExec = loginData.apiurl + "/states/change/"; + + var inProgress = 0; // prevents user from another op if one is in progress + getRunStatus(); + + // Let's stagger this by 500ms each to see if Chrome lets these through + // This may also help if your Apache is not configured to let multiple connections through + + $timeout(function () { + NVRDataModel.debug("invoking LoadStatus..."); + getLoadStatus(); + }, 2000); + + $timeout(function () { + NVRDataModel.debug("invoking CurrentState..."); + getCurrentState(); + }, 4000); + + /* + $timeout(function () { + NVRDataModel.debug("invoking DiskStatus..."); + getDiskStatus(); + }, 6000); + */ + //------------------------------------------------------------------------- + // Lets make sure we set screen dim properly as we enter + // The problem is we enter other states before we leave previous states + // from a callback perspective in ionic, so we really can't predictably + // reset power state on exit as if it is called after we enter another + // state, that effectively overwrites current view power management needs + //------------------------------------------------------------------------ + $scope.$on('$ionicView.enter', function () { + // console.log("**VIEW ** Montage Ctrl Entered"); + NVRDataModel.setAwake(false); + }); + + //--------------------------------------------------------- + // This gets the current run state custom name + // if applicable + //--------------------------------------------------------- + function getCurrentState() { + NVRDataModel.debug("StateCtrl: getting state using " + apiCurrentState); + $http.get(apiCurrentState) + .then( + function (success) { + NVRDataModel.debug("State results: " + JSON.stringify(success)); + var customStateArray = success.data.states; + var i = 0; + var found = false; + $scope.allStateNames = []; + for (i = 0; i < customStateArray.length; i++) { + $scope.allStateNames.push(customStateArray[i].State.Name); + if (customStateArray[i].State.IsActive == '1') { + $scope.customState = customStateArray[i].State.Name; + found = true; + } + } + if (!found) $scope.customState = ""; - var apiExec = loginData.apiurl + "/states/change/"; + }, + function (error) { + NVRDataModel.debug("StateCtrl: Error retrieving state list " + JSON.stringify(error)); + $scope.customState = ""; - var inProgress = 0; // prevents user from another op if one is in progress - getRunStatus(); + } + ); + + } + + //---------------------------------------------------------------- + // Alarm notification handling + //---------------------------------------------------------------- + $scope.handleAlarms = function () { + $rootScope.isAlarm = !$rootScope.isAlarm; + if (!$rootScope.isAlarm) { + $rootScope.alarmCount = "0"; + $ionicHistory.nextViewOptions({ + disableBack: true + }); + $state.go("app.events", { + "id": 0, + "playEvent": false + }, { + reload: true + }); + } + }; + + //--------------------------------------------------------- + // Allows the user to select a custom run state + //--------------------------------------------------------- + $scope.selectCustomState = function () { + $scope.myopt = { + selectedState: "" + }; + //console.log(JSON.stringify($scope.allStateNames)); + NVRDataModel.log("List of custom states: " + JSON.stringify($scope.allStateNames)); + $rootScope.zmPopup = $ionicPopup.show({ + scope: $scope, + template: '<ion-radio-fix ng-repeat="item in allStateNames" ng-value="item" ng-model="myopt.selectedState"> {{item}} </ion-radio-fix>', + + title: $translate.instant('kSelectRunState'), + subTitle: $translate.instant('kCurrentState') + $scope.customState ? ($translate.instant('kCurrentState') + ": " + $scope.customState) : "", + buttons: [{ + text: $translate.instant('kButtonCancel'), + onTap: function (e) { + return "CANCEL"; + } + + }, + { + text: $translate.instant('kButtonOk'), + onTap: function (e) { + return "OK"; - // Let's stagger this by 500ms each to see if Chrome lets these through - // This may also help if your Apache is not configured to let multiple connections through - - $timeout(function() - { - NVRDataModel.debug("invoking LoadStatus..."); - getLoadStatus(); - }, 2000); - - $timeout(function() - { - NVRDataModel.debug("invoking CurrentState..."); - getCurrentState(); - }, 4000); - - /* - $timeout(function () { - NVRDataModel.debug("invoking DiskStatus..."); - getDiskStatus(); - }, 6000); - */ - //------------------------------------------------------------------------- - // Lets make sure we set screen dim properly as we enter - // The problem is we enter other states before we leave previous states - // from a callback perspective in ionic, so we really can't predictably - // reset power state on exit as if it is called after we enter another - // state, that effectively overwrites current view power management needs - //------------------------------------------------------------------------ - $scope.$on('$ionicView.enter', function() - { - // console.log("**VIEW ** Montage Ctrl Entered"); - NVRDataModel.setAwake(false); + } + } + ] }); - //--------------------------------------------------------- - // This gets the current run state custom name - // if applicable - //--------------------------------------------------------- - function getCurrentState() - { - NVRDataModel.debug("StateCtrl: getting state using " + apiCurrentState); - $http.get(apiCurrentState) - .then( - function(success) - { - NVRDataModel.debug("State results: " + JSON.stringify(success)); - var customStateArray = success.data.states; - var i = 0; - var found = false; - $scope.allStateNames = []; - for (i = 0; i < customStateArray.length; i++) - { - $scope.allStateNames.push(customStateArray[i].State.Name); - if (customStateArray[i].State.IsActive == '1') - { - $scope.customState = customStateArray[i].State.Name; - found = true; - } - } - if (!found) $scope.customState = ""; - - }, - function(error) - { - NVRDataModel.debug("StateCtrl: Error retrieving state list " + JSON.stringify(error)); - $scope.customState = ""; - - } - ); - - } - - //---------------------------------------------------------------- - // Alarm notification handling - //---------------------------------------------------------------- - $scope.handleAlarms = function() - { - $rootScope.isAlarm = !$rootScope.isAlarm; - if (!$rootScope.isAlarm) - { - $rootScope.alarmCount = "0"; - $ionicHistory.nextViewOptions( - { - disableBack: true - }); - $state.go("app.events", - { - "id": 0, - "playEvent": false - }, - { - reload: true - }); + // It seems invoking a popup within a popup handler + // causes issues. Doing this outside due to that reason + $rootScope.zmPopup.then(function (res) { + // console.log("GOT : " + JSON.stringify(res)); + if (res == "OK") { + if ($scope.myopt.selectedState != "") + controlZM($scope.myopt.selectedState); + } + }); + }; + + //---------------------------------------------------------------------- + // returns disk space in gigs taken up by events + //---------------------------------------------------------------------- + function getDiskStatus() { + NVRDataModel.debug("StateCtrl/getDiskStatus: " + apiDisk); + $http.get(apiDisk) + .then( + function (success) { + NVRDataModel.debug("StateCtrl/getDiskStatus: success"); + NVRDataModel.debug("Disk results: " + JSON.stringify(success)); + var obj = success.data.usage; + if (obj.Total.space != undefined) { + $scope.zmDisk = parseFloat(obj.Total.space).toFixed(1).toString() + "G"; + } else { + $scope.zmDisk = "unknown"; + NVRDataModel.log("Error retrieving disk space, API returned null for obj.Total.space"); + } + + }, + function (error) { + $scope.zmDisk = "unknown"; + // console.log("ERROR:" + JSON.stringify(error)); + NVRDataModel.log("Error retrieving DiskStatus: " + JSON.stringify(error), "error"); } - }; + ); + } + + //---------------------------------------------------------------------- + // returns ZM running status + //---------------------------------------------------------------------- + function getRunStatus() { + NVRDataModel.debug("StateCtrl/getRunStatus: " + apiRun); + $http.get(apiRun) + .then( + function (success) { + NVRDataModel.debug("StateCtrl/getRunStatus: success"); + NVRDataModel.debug("Run results: " + JSON.stringify(success)); + switch (success.data.result) { + case 1: + $scope.zmRun = $translate.instant('kZMRunning'); + $scope.color = 'green'; + break; + case 0: + $scope.zmRun = $translate.instant('kZMStopped'); + $scope.color = 'red'; + break; + default: + $scope.zmRun = $translate.instant('kZMUndetermined'); + $scope.color = 'orange'; + + break; + } + + // console.log("X"+success.data.result+"X"); + }, + function (error) { + //console.log("ERROR in getRun: " + JSON.stringify(error)); + NVRDataModel.log("Error getting RunStatus " + JSON.stringify(error), "error"); + $scope.color = 'red'; + $scope.zmRun = $translate.instant('kZMUndetermined'); + } + ); + + } + + //---------------------------------------------------------------------- + // gets ZM load - max[0], avg[1], min[2] + //---------------------------------------------------------------------- + function getLoadStatus() { + NVRDataModel.debug("StateCtrl/getLoadStatus: " + apiLoad); + $http.get(apiLoad) + .then( + function (success) { + NVRDataModel.debug("Load results: " + JSON.stringify(success)); + //console.log(JSON.stringify(success)); + // load returns 3 params - one in the middle is avg. + NVRDataModel.debug("StateCtrl/getLoadStatus: success"); + $scope.zmLoad = success.data.load[1]; + + // console.log("X"+success.data.result+"X"); + }, + function (error) { + //console.log("ERROR in getLoad: " + JSON.stringify(error)); + NVRDataModel.log("Error retrieving loadStatus " + JSON.stringify(error), "error"); + $scope.zmLoad = 'undetermined'; + } + ); + } - //--------------------------------------------------------- - // Allows the user to select a custom run state - //--------------------------------------------------------- - $scope.selectCustomState = function() - { - $scope.myopt = { - selectedState: "" - }; - //console.log(JSON.stringify($scope.allStateNames)); - NVRDataModel.log("List of custom states: " + JSON.stringify($scope.allStateNames)); - $rootScope.zmPopup = $ionicPopup.show( - { - scope: $scope, - template: '<ion-radio-fix ng-repeat="item in allStateNames" ng-value="item" ng-model="myopt.selectedState"> {{item}} </ion-radio-fix>', - - title: $translate.instant('kSelectRunState'), - subTitle: $translate.instant('kCurrentState') + $scope.customState ? ($translate.instant('kCurrentState') + ": " + $scope.customState) : "", - buttons: [ - { - text: $translate.instant('kButtonCancel'), - onTap: function(e) - { - return "CANCEL"; - } - - }, - { - text: $translate.instant('kButtonOk'), - onTap: function(e) - { - return "OK"; - - } - }] - }); + //---------------------------------------------------------------------- + // start/stop/restart ZM + //---------------------------------------------------------------------- - // It seems invoking a popup within a popup handler - // causes issues. Doing this outside due to that reason - $rootScope.zmPopup.then(function(res) - { - // console.log("GOT : " + JSON.stringify(res)); - if (res == "OK") - { - if ($scope.myopt.selectedState != "") - controlZM($scope.myopt.selectedState); - } - }); - }; + function performZMoperation(str) { - //---------------------------------------------------------------------- - // returns disk space in gigs taken up by events - //---------------------------------------------------------------------- - function getDiskStatus() - { - NVRDataModel.debug("StateCtrl/getDiskStatus: " + apiDisk); - $http.get(apiDisk) - .then( - function(success) - { - NVRDataModel.debug("StateCtrl/getDiskStatus: success"); - NVRDataModel.debug("Disk results: " + JSON.stringify(success)); - var obj = success.data.usage; - if (obj.Total.space != undefined) - { - $scope.zmDisk = parseFloat(obj.Total.space).toFixed(1).toString() + "G"; - } - else - { - $scope.zmDisk = "unknown"; - NVRDataModel.log("Error retrieving disk space, API returned null for obj.Total.space"); - } - - }, - function(error) - { - $scope.zmDisk = "unknown"; - // console.log("ERROR:" + JSON.stringify(error)); - NVRDataModel.log("Error retrieving DiskStatus: " + JSON.stringify(error), "error"); - } - ); - } + NVRDataModel.debug("inside performZMoperation with " + str); - //---------------------------------------------------------------------- - // returns ZM running status - //---------------------------------------------------------------------- - function getRunStatus() - { - NVRDataModel.debug("StateCtrl/getRunStatus: " + apiRun); - $http.get(apiRun) - .then( - function(success) - { - NVRDataModel.debug("StateCtrl/getRunStatus: success"); - NVRDataModel.debug("Run results: " + JSON.stringify(success)); - switch (success.data.result) - { - case 1: - $scope.zmRun = $translate.instant('kZMRunning'); - $scope.color = 'green'; - break; - case 0: - $scope.zmRun = $translate.instant('kZMStopped'); - $scope.color = 'red'; - break; - default: - $scope.zmRun = $translate.instant('kZMUndetermined'); - $scope.color = 'orange'; - - break; - } - - // console.log("X"+success.data.result+"X"); - }, - function(error) - { - //console.log("ERROR in getRun: " + JSON.stringify(error)); - NVRDataModel.log("Error getting RunStatus " + JSON.stringify(error), "error"); - $scope.color = 'red'; - $scope.zmRun = $translate.instant('kZMUndetermined'); - } - ); + $scope.zmRun = "..."; + $scope.color = 'orange'; + $scope.customState = ""; + NVRDataModel.debug("StateCtrl/controlZM: POST Control command is " + apiExec + str + ".json"); + inProgress = 1; + $http.post(apiExec + str + ".json") + .then( + function (success) { + NVRDataModel.debug("StateCtrl/controlZM: returned success"); + inProgress = 0; + switch (str) { + case "stop": + $scope.zmRun = $translate.instant('kZMStopped'); + $scope.color = 'red'; + break; + default: + $scope.zmRun = $translate.instant('kZMRunning'); + $scope.color = 'green'; + getCurrentState(); + break; + + } + + }, + function (error) { + //if (error.status) // it seems to return error with status 0 if ok + // { + //console.log("ERROR in Change State:" + JSON.stringify(error)); + NVRDataModel.debug("StateCtrl/controlZM: returned error"); + NVRDataModel.log("Error in change run state:" + JSON.stringify(error), "error"); + $scope.zmRun = $translate.instant('kZMUndetermined'); + $scope.color = 'orange'; + inProgress = 0; + }); + } + + function controlZM(str) { + if (inProgress) { + NVRDataModel.debug("StateCtrl/controlZM: operation in progress"); + $ionicPopup.alert({ + title: $translate.instant('kOperationInProgressTitle'), + template: $translate.instant('kOperationInProgressBody') + '...', + okText: $translate.instant('kButtonOk'), + cancelText: $translate.instant('kButtonCancel'), + }); + return; } - //---------------------------------------------------------------------- - // gets ZM load - max[0], avg[1], min[2] - //---------------------------------------------------------------------- - function getLoadStatus() - { - NVRDataModel.debug("StateCtrl/getLoadStatus: " + apiLoad); - $http.get(apiLoad) - .then( - function(success) - { - NVRDataModel.debug("Load results: " + JSON.stringify(success)); - //console.log(JSON.stringify(success)); - // load returns 3 params - one in the middle is avg. - NVRDataModel.debug("StateCtrl/getLoadStatus: success"); - $scope.zmLoad = success.data.load[1]; - - // console.log("X"+success.data.result+"X"); - }, - function(error) - { - //console.log("ERROR in getLoad: " + JSON.stringify(error)); - NVRDataModel.log("Error retrieving loadStatus " + JSON.stringify(error), "error"); - $scope.zmLoad = 'undetermined'; - } - ); - } + var statesearch = "startstoprestart"; - //---------------------------------------------------------------------- - // start/stop/restart ZM - //---------------------------------------------------------------------- - - function performZMoperation(str) - { - - NVRDataModel.debug("inside performZMoperation with " + str); - - $scope.zmRun = "..."; - $scope.color = 'orange'; - $scope.customState = ""; - NVRDataModel.debug("StateCtrl/controlZM: POST Control command is " + apiExec + str + ".json"); - inProgress = 1; - $http.post(apiExec + str + ".json") - .then( - function(success) - { - NVRDataModel.debug("StateCtrl/controlZM: returned success"); - inProgress = 0; - switch (str) - { - case "stop": - $scope.zmRun = $translate.instant('kZMStopped'); - $scope.color = 'red'; - break; - default: - $scope.zmRun = $translate.instant('kZMRunning'); - $scope.color = 'green'; - getCurrentState(); - break; - - } - - }, - function(error) - { - //if (error.status) // it seems to return error with status 0 if ok - // { - //console.log("ERROR in Change State:" + JSON.stringify(error)); - NVRDataModel.debug("StateCtrl/controlZM: returned error"); - NVRDataModel.log("Error in change run state:" + JSON.stringify(error), "error"); - $scope.zmRun = $translate.instant('kZMUndetermined'); - $scope.color = 'orange'; - inProgress = 0; - - }); + var promptstring = $translate.instant('kStateAreYouSure') + str + ' Zoneminder?'; + if (statesearch.indexOf(str) == -1) { + promptstring = "Are you sure you want to change state to " + str; } - function controlZM(str) - { - if (inProgress) + $rootScope.zmPopup = $ionicPopup.show({ + title: $translate.instant('kPleaseConfirm'), + template: promptstring, + buttons: [{ + text: $translate.instant('kButtonCancel'), + type: 'button-positive' + }, { - NVRDataModel.debug("StateCtrl/controlZM: operation in progress"); - $ionicPopup.alert( - { - title: $translate.instant('kOperationInProgressTitle'), - template: $translate.instant('kOperationInProgressBody') + '...', - okText: $translate.instant('kButtonOk'), - cancelText: $translate.instant('kButtonCancel'), - }); - return; - } - - var statesearch = "startstoprestart"; - - var promptstring = $translate.instant('kStateAreYouSure') + str + ' Zoneminder?'; - if (statesearch.indexOf(str) == -1) - { - promptstring = "Are you sure you want to change state to " + str; + text: $translate.instant('kButtonOk'), + type: 'button-assertive', + onTap: function (e) { + performZMoperation(str); + } } + ] + }); - $rootScope.zmPopup = $ionicPopup.show( - { - title: $translate.instant('kPleaseConfirm'), - template: promptstring, - buttons: [ - { - text: $translate.instant('kButtonCancel'), - type: 'button-positive' - }, - { - text: $translate.instant('kButtonOk'), - type: 'button-assertive', - onTap: function(e) - { - performZMoperation(str); - } - }] - }); + } - } + // Binder so template can call controlZM + $scope.controlZM = function (str) { + controlZM(str); + }; - // Binder so template can call controlZM - $scope.controlZM = function(str) - { - controlZM(str); - }; + $scope.openMenu = function () { + $ionicSideMenuDelegate.toggleLeft(); + }; - $scope.openMenu = function() - { - $ionicSideMenuDelegate.toggleLeft(); - }; - - $scope.$on('$ionicView.leave', function() - { - // console.log("**VIEW ** State Ctrl Left"); - // FIXME not the best way... - // If the user exits a view before its complete, - // make sure he can come back in and redo - inProgress = 0; - }); + $scope.$on('$ionicView.leave', function () { + // console.log("**VIEW ** State Ctrl Left"); + // FIXME not the best way... + // If the user exits a view before its complete, + // make sure he can come back in and redo + inProgress = 0; + }); - $scope.doRefresh = function() - { - //console.log("***Pull to Refresh"); - NVRDataModel.debug("StateCtrl/refresh: calling getRun/Load/Disk/CurrentState"); - getRunStatus(); - $timeout(getLoadStatus, 2000); - $timeout(getCurrentState, 4000); - //$timeout (getDiskStatus,6000); - $scope.$broadcast('scroll.refreshComplete'); + $scope.doRefresh = function () { + //console.log("***Pull to Refresh"); + NVRDataModel.debug("StateCtrl/refresh: calling getRun/Load/Disk/CurrentState"); + getRunStatus(); + $timeout(getLoadStatus, 2000); + $timeout(getCurrentState, 4000); + //$timeout (getDiskStatus,6000); + $scope.$broadcast('scroll.refreshComplete'); - }; + }; }]); diff --git a/www/js/TimelineCtrl.js b/www/js/TimelineCtrl.js index 5795d0a4..d69cfd24 100644 --- a/www/js/TimelineCtrl.js +++ b/www/js/TimelineCtrl.js @@ -12,1664 +12,1491 @@ // FIXME: too much redundant code between EventCtrl and Timeline // Move to ModalCtrl and see if it works -angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPlatform', '$scope', 'zm', 'NVRDataModel', '$ionicSideMenuDelegate', '$rootScope', '$http', '$q', 'message', '$state', '$ionicLoading', '$ionicPopover', '$ionicScrollDelegate', '$ionicModal', '$timeout', '$ionicContentBanner', '$ionicHistory', '$sce', '$stateParams', '$translate', '$ionicPopup', '$interval', function($ionicPlatform, $scope, zm, NVRDataModel, $ionicSideMenuDelegate, $rootScope, $http, $q, message, $state, $ionicLoading, $ionicPopover, $ionicScrollDelegate, $ionicModal, $timeout, $ionicContentBanner, $ionicHistory, $sce, $stateParams, $translate, $ionicPopup, $interval) -{ - var broadcastHandles = []; +angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPlatform', '$scope', 'zm', 'NVRDataModel', '$ionicSideMenuDelegate', '$rootScope', '$http', '$q', 'message', '$state', '$ionicLoading', '$ionicPopover', '$ionicScrollDelegate', '$ionicModal', '$timeout', '$ionicContentBanner', '$ionicHistory', '$sce', '$stateParams', '$translate', '$ionicPopup', '$interval', function ($ionicPlatform, $scope, zm, NVRDataModel, $ionicSideMenuDelegate, $rootScope, $http, $q, message, $state, $ionicLoading, $ionicPopover, $ionicScrollDelegate, $ionicModal, $timeout, $ionicContentBanner, $ionicHistory, $sce, $stateParams, $translate, $ionicPopup, $interval) { + var broadcastHandles = []; + + //console.log("Inside Timeline controller"); + $scope.openMenu = function () { + $ionicSideMenuDelegate.toggleLeft(); + }; + + //---------------------------------------f------------------------- + // Alarm notification handling + //---------------------------------------------------------------- + $scope.handleAlarms = function () { + $rootScope.isAlarm = !$rootScope.isAlarm; + if (!$rootScope.isAlarm) { + $rootScope.alarmCount = "0"; + $ionicHistory.nextViewOptions({ + disableBack: true + }); + $state.go("app.events", { + "id": 0, + "playEvent": false + }, { + reload: true + }); + return; + } + }; - //console.log("Inside Timeline controller"); - $scope.openMenu = function() - { - $ionicSideMenuDelegate.toggleLeft(); - }; + $scope.leftButtons = [{ + type: 'button-icon icon ion-navicon', + tap: function (e) { + $scope.toggleMenu(); + } + }]; + + //----------------------------------------------------------- + // Used to display date range for timeline + //----------------------------------------------------------- + $scope.prettify = function (str) { + if (NVRDataModel.getLogin().useLocalTimeZone) + return moment.tz(str, NVRDataModel.getTimeZoneNow()).tz(moment.tz.guess()).format('MMMM Do YYYY, ' + NVRDataModel.getTimeFormat()); + else + return moment(str).format('MMMM Do YYYY, ' + NVRDataModel.getTimeFormat()); + }; + + //----------------------------------------------------------- + // used for playback when you tap on a timeline event + //----------------------------------------------------------- + $scope.calcMsTimer = function (frames, len) { + var myframes, mylen; + myframes = parseFloat(frames); + mylen = parseFloat(len); + // console.log ("frames " + myframes + "length " + mylen); + // console.log ("*** MS COUNT " + (1000.0/(myframes/mylen))); + return (Math.round(1000 / (myframes / mylen))); + }; + + $scope.toggleMinAlarmFrameCount = function () { + // console.log("Toggling"); - //---------------------------------------f------------------------- - // Alarm notification handling - //---------------------------------------------------------------- - $scope.handleAlarms = function() - { - $rootScope.isAlarm = !$rootScope.isAlarm; - if (!$rootScope.isAlarm) - { - $rootScope.alarmCount = "0"; - $ionicHistory.nextViewOptions( - { - disableBack: true - }); - $state.go("app.events", - { - "id": 0, - "playEvent": false - }, - { - reload: true - }); - return; - } - }; + var ld = NVRDataModel.getLogin(); + ld.enableAlarmCount = !ld.enableAlarmCount; - $scope.leftButtons = [ - { - type: 'button-icon icon ion-navicon', - tap: function(e) - { - $scope.toggleMenu(); - } - }]; + NVRDataModel.setLogin(ld); + $scope.loginData = ld; - //----------------------------------------------------------- - // Used to display date range for timeline - //----------------------------------------------------------- - $scope.prettify = function(str) - { - if (NVRDataModel.getLogin().useLocalTimeZone) - return moment.tz(str, NVRDataModel.getTimeZoneNow()).tz(moment.tz.guess()).format('MMMM Do YYYY, ' + NVRDataModel.getTimeFormat()); - else - return moment(str).format('MMMM Do YYYY, ' + NVRDataModel.getTimeFormat()); - }; + drawGraph(curFromDate, curToDate, curCount); - //----------------------------------------------------------- - // used for playback when you tap on a timeline event - //----------------------------------------------------------- - $scope.calcMsTimer = function(frames, len) - { - var myframes, mylen; - myframes = parseFloat(frames); - mylen = parseFloat(len); - // console.log ("frames " + myframes + "length " + mylen); - // console.log ("*** MS COUNT " + (1000.0/(myframes/mylen))); - return (Math.round(1000 / (myframes / mylen))); - }; + }; - $scope.toggleMinAlarmFrameCount = function() - { - // console.log("Toggling"); + //----------------------------------------------------------- + // Move/Zoom are used to move the timeline around + //----------------------------------------------------------- + function move(percentage) { + var range = timeline.getWindow(); + var interval = range.end - range.start; - var ld = NVRDataModel.getLogin(); - ld.enableAlarmCount = !ld.enableAlarmCount; + timeline.setWindow({ + start: range.start.valueOf() - interval * percentage, + end: range.end.valueOf() - interval * percentage + }); + } - NVRDataModel.setLogin(ld); - $scope.loginData = ld; + // helps to navigate to current time quickly + // after a night of heavy navigation + $scope.gotoNow = function () { + timeline.moveTo(timeline.getCurrentTime()); + }; - drawGraph(curFromDate, curToDate, curCount); + $scope.move = function (percentage) { + move(percentage); - }; + }; - //----------------------------------------------------------- - // Move/Zoom are used to move the timeline around - //----------------------------------------------------------- - function move(percentage) - { - var range = timeline.getWindow(); - var interval = range.end - range.start; + //----------------------------------------- + // Move by X days + //----------------------------------------- + $scope.moveDays = function (d) { + var range = timeline.getWindow(); + var ds = moment(range.start); + if (d > 0) + ds.add(d, 'days'); + else + ds.subtract(Math.abs(d), 'days'); - timeline.setWindow( - { - start: range.start.valueOf() - interval * percentage, - end: range.end.valueOf() - interval * percentage - }); - } + var es = moment(ds); // clone it! + es.add(1, 'day'); - // helps to navigate to current time quickly - // after a night of heavy navigation - $scope.gotoNow = function() - { - timeline.moveTo(timeline.getCurrentTime()); - }; + fromDate = ds.format("YYYY-MM-DD HH:mm:ss"); + toDate = es.format("YYYY-MM-DD HH:mm:ss"); - $scope.move = function(percentage) - { - move(percentage); + $scope.fromDate = fromDate; + $scope.toDate = toDate; + $rootScope.customTimelineRange = false; + NVRDataModel.log("moving by " + d + " day to " + fromDate + " upto " + toDate); + drawGraph(fromDate, toDate, maxItems); + + }; + + function eventDetails(ev) { + $scope.event = ev; + $ionicModal.fromTemplateUrl('templates/timeline-modal.html', { + scope: $scope, // give ModalCtrl access to this scope + animation: 'slide-in-up', + id: 'analyze', + + }) + .then(function (modal) { + $scope.modal = modal; + + $scope.modal.show(); + + }); + } + + //-------------------------------------------------------- + // To show a modal dialog with the event tapped on in timeline + // FIXME : code repeat from Events + //-------------------------------------------------------- + function openModal(event) { + + if ($scope.modalFromTimelineIsOpen == true) { + // don't know why but some conflict from angular to timeline lib + // results in double modals at times + NVRDataModel.log(">>-- duplicate modal detected, preventing"); + } - }; + $scope.modalFromTimelineIsOpen = true; + NVRDataModel.setAwake(NVRDataModel.getKeepAwake()); - //----------------------------------------- - // Move by X days - //----------------------------------------- - $scope.moveDays = function(d) - { - var range = timeline.getWindow(); - var ds = moment(range.start); - if (d > 0) - ds.add(d, 'days'); - else - ds.subtract(Math.abs(d), 'days'); + // pass this event to ModalCtrl + $scope.currentEvent = event; - var es = moment(ds); // clone it! - es.add(1, 'day'); + $scope.event = event; + // in Timeline view, make sure events stick to same monitor + $scope.followSameMonitor = "1"; - fromDate = ds.format("YYYY-MM-DD HH:mm:ss"); - toDate = es.format("YYYY-MM-DD HH:mm:ss"); + //prepareModalEvent(event.Event.Id); - $scope.fromDate = fromDate; - $scope.toDate = toDate; - $rootScope.customTimelineRange = false; - NVRDataModel.log("moving by " + d + " day to " + fromDate + " upto " + toDate); - drawGraph(fromDate, toDate, maxItems); + var ld = NVRDataModel.getLogin(); + var sl = 'disabled'; + if (ld.showLiveForInProgressEvents) { + sl = 'enabled'; + } + $scope.modalData = { + doRefresh: false }; + $ionicModal.fromTemplateUrl('templates/events-modal.html', { + scope: $scope, // give ModalCtrl access to this scope + animation: 'slide-in-up', + id: 'footage', + showLive: sl + }) + .then(function (modal) { + $scope.modal = modal; + + $ionicLoading.show({ + template: $translate.instant('kPleaseWait') + "...", + noBackdrop: true, + duration: 10000, - function eventDetails(ev) - { - $scope.event = ev; - $ionicModal.fromTemplateUrl('templates/timeline-modal.html', - { - scope: $scope, // give ModalCtrl access to this scope - animation: 'slide-in-up', - id: 'analyze', + }); - }) - .then(function(modal) - { - $scope.modal = modal; + $scope.modal.show(); - $scope.modal.show(); + var ld = NVRDataModel.getLogin(); - }); + }); + + } + + //-------------------------------------------------------- + //We need to destroy because we are instantiating + // it on open + //-------------------------------------------------------- + $scope.closeModal = function () { + $scope.modalFromTimelineIsOpen = false; + // $interval.cancel(eventsInterval); + //$interval.cancel(segmentHandle); + NVRDataModel.debug("TimelineCtrl:Close & Destroy Modal"); + NVRDataModel.stopNetwork("TimelineCtrl: closeModal"); + NVRDataModel.setAwake(false); + if ($scope.modal !== undefined) { + $scope.modal.remove(); } - //-------------------------------------------------------- - // To show a modal dialog with the event tapped on in timeline - // FIXME : code repeat from Events - //-------------------------------------------------------- - function openModal(event) - { + if ($scope.modalData.doRefresh) { - if ($scope.modalFromTimelineIsOpen == true) + $timeout(function () { + drawGraph($scope.fromDate, $scope.toDate, maxItems); + }, 500); + + } + + }; + + /* $scope.toggleGapless = function() { - // don't know why but some conflict from angular to timeline lib - // results in double modals at times - NVRDataModel.log(">>-- duplicate modal detected, preventing"); - } + console.log ("GAPLESS TOGGLE"); + $scope.loginData.gapless = !$scope.loginData.gapless; + NVRDataModel.setLogin($scope.loginData); + + };*/ - $scope.modalFromTimelineIsOpen = true; - NVRDataModel.setAwake(NVRDataModel.getKeepAwake()); + //------------------------------------------------------------------------- + // called when user switches to background + //------------------------------------------------------------------------- + function onPause() { + NVRDataModel.debug("TimelineCtrl:onpause called"); + $interval.cancel(updateInterval); + // console.log("*** Moving to Background ***"); // Handle the pause event - // pass this event to ModalCtrl - $scope.currentEvent = event; + if ($scope.popover) $scope.popover.remove(); - $scope.event = event; - // in Timeline view, make sure events stick to same monitor - $scope.followSameMonitor = "1"; + } - //prepareModalEvent(event.Event.Id); + //-------------------------------------------------------- + // This function is called by the graph ontapped function + // which in turn calls openModal + //-------------------------------------------------------- - var ld = NVRDataModel.getLogin(); - var sl = 'disabled'; - if (ld.showLiveForInProgressEvents) { - sl = 'enabled'; - } + function showEvent(event) { - $scope.modalData = {doRefresh:false}; - $ionicModal.fromTemplateUrl('templates/events-modal.html', - { - scope: $scope, // give ModalCtrl access to this scope - animation: 'slide-in-up', - id: 'footage', - showLive:sl - }) - .then(function(modal) - { - $scope.modal = modal; - - $ionicLoading.show( - { - template: $translate.instant('kPleaseWait') + "...", - noBackdrop: true, - duration: 10000, + // in context of angular - }); + $timeout(function () { + openModal(event); + }); - $scope.modal.show(); + } - var ld = NVRDataModel.getLogin(); + var tzu = $scope.$on('tz-updated', function () { + $scope.tzAbbr = NVRDataModel.getTimeZoneNow(); + NVRDataModel.debug("Timezone API updated timezone to " + NVRDataModel.getTimeZoneNow()); + }); + broadcastHandles.push(tzu); - }); + //------------------------------------------------- + // Make sure we delete the timeline + // This may be redundant as the root view gets + // destroyed but no harm + //------------------------------------------------- + $scope.$on('$ionicView.leave', function () { + NVRDataModel.debug("Timeline: Deregistering broadcast handles"); + for (var i = 0; i < broadcastHandles.length; i++) { + // broadcastHandles[i](); } + broadcastHandles = []; - //-------------------------------------------------------- - //We need to destroy because we are instantiating - // it on open - //-------------------------------------------------------- - $scope.closeModal = function() - { - $scope.modalFromTimelineIsOpen = false; - // $interval.cancel(eventsInterval); - //$interval.cancel(segmentHandle); - NVRDataModel.debug("TimelineCtrl:Close & Destroy Modal"); - NVRDataModel.stopNetwork("TimelineCtrl: closeModal"); - NVRDataModel.setAwake(false); - if ($scope.modal !== undefined) - { - $scope.modal.remove(); - } + if (timeline) { + $interval.cancel(updateInterval); + timeline.destroy(); + //console.log("**Destroying Timeline"); - if ($scope.modalData.doRefresh) { + } + }); - $timeout (function() {drawGraph ($scope.fromDate, $scope.toDate, maxItems );},500); - - } + /*$scope.$on('$ionicView.enter', function() { - }; - /* $scope.toggleGapless = function() - { - console.log ("GAPLESS TOGGLE"); - $scope.loginData.gapless = !$scope.loginData.gapless; - NVRDataModel.setLogin($scope.loginData); - - };*/ - - //------------------------------------------------------------------------- - // called when user switches to background - //------------------------------------------------------------------------- - function onPause() - { - NVRDataModel.debug("TimelineCtrl:onpause called"); - $interval.cancel(updateInterval); - // console.log("*** Moving to Background ***"); // Handle the pause event - if ($scope.popover) $scope.popover.remove(); + + });*/ - } + $scope.$on('$ionicView.beforeEnter', function () { - //-------------------------------------------------------- - // This function is called by the graph ontapped function - // which in turn calls openModal - //-------------------------------------------------------- + //$ionicHistory.clearCache(); + //$ionicHistory.clearHistory(); + timeline = ''; + $scope.newEvents = ''; - function showEvent(event) - { + }); - // in context of angular + //------------------------------------------- + // Entire reason for existence: + // double tap doesn't reliably work + // when paired with tap on mobiles + //------------------------------------------- - $timeout(function() - { - openModal(event); - }); + $scope.toggleTap = function () { + + if ($scope.onTap == $translate.instant('kTimelineEvent')) { + $scope.onDTap = $translate.instant('kTimelineEvent'); + $scope.onTap = $translate.instant('kTimelineGraph'); + } else { + $scope.onTap = $translate.instant('kTimelineEvent'); + $scope.onDTap = $translate.instant('kTimelineGraph'); } + $scope.timelineControls = $translate.instant('kTimelineTap') + ':' + $scope.onTap + " / " + $translate.instant('kTimelineDTap') + ':' + $scope.onDTap; - var tzu = $scope.$on('tz-updated', function() - { - $scope.tzAbbr = NVRDataModel.getTimeZoneNow(); - NVRDataModel.debug("Timezone API updated timezone to " + NVRDataModel.getTimeZoneNow()); - }); - broadcastHandles.push(tzu); - - //------------------------------------------------- - // Make sure we delete the timeline - // This may be redundant as the root view gets - // destroyed but no harm - //------------------------------------------------- - $scope.$on('$ionicView.leave', function() - { + }; - NVRDataModel.debug ("Timeline: Deregistering broadcast handles"); - for (var i=0; i < broadcastHandles.length; i++) { - // broadcastHandles[i](); - } - broadcastHandles = []; - if (timeline) - { - $interval.cancel(updateInterval); - timeline.destroy(); - //console.log("**Destroying Timeline"); + //------------------------------------------------- + // FIXME: shitty hackery -- Im using a rootScope + // to know if you just went to custom range + // and back. Fix this, really. + // So anyway, if you did select a custom range + // then we "go back" to timeline, which is when + // we come here - so make sure we update the + // graph range + //------------------------------------------------- - } - }); - /*$scope.$on('$ionicView.enter', function() { + $scope.$on('$ionicView.afterEnter', function () { + $scope.monitors = message; + $scope.onTap = $translate.instant('kTimelineEvent'); + $scope.onDTap = $translate.instant('kTimelineGraph'); + $scope.timelineControls = $translate.instant('kTimelineTap') + ':' + $scope.onTap + " / " + $translate.instant('kTimelineDTap') + ':' + $scope.onDTap; - - });*/ + //console.log("***AFTER ENTER"); - $scope.$on('$ionicView.beforeEnter', function() - { + $scope.follow = { + 'time': NVRDataModel.getLogin().followTimeLine + }; - //$ionicHistory.clearCache(); - //$ionicHistory.clearHistory(); - timeline = ''; - $scope.newEvents = ''; + $interval.cancel(updateInterval); - }); + // Make sure sliding for menu is disabled so it + // does not interfere with graph panning + $ionicSideMenuDelegate.canDragContent(false); + var ld = NVRDataModel.getLogin(); + maxItemsConf = ($rootScope.platformOS == 'desktop') ? zm.graphDesktopItemMax : zm.graphItemMax; + maxItems = ld.graphSize || maxItemsConf; + NVRDataModel.log("Graph items to draw is " + maxItems); + $scope.maxItems = maxItems; + $scope.translationData = { + maxItemsVal: maxItems + }; - //------------------------------------------- - // Entire reason for existence: - // double tap doesn't reliably work - // when paired with tap on mobiles - //------------------------------------------- + $scope.graphLoaded = false; + NVRDataModel.debug("TimelineCtrl/drawGraph: graphLoaded is " + $scope.graphLoaded); - $scope.toggleTap = function() { + //latestDateDrawn = moment().locale('en').format("YYYY-MM-DD HH:mm:ss"); + $scope.modalFromTimelineIsOpen = false; + //var tempMon = message; - if ($scope.onTap == $translate.instant('kTimelineEvent')) { - $scope.onDTap = $translate.instant('kTimelineEvent'); - $scope.onTap = $translate.instant('kTimelineGraph'); + // lets timeline.onget the abbreviated version of TZ to display + if (NVRDataModel.getLogin().useLocalTimeZone) { + $scope.tzAbbr = moment().tz(moment.tz.guess()).zoneAbbr(); + } else { + $scope.tzAbbr = moment().tz(NVRDataModel.getTimeZoneNow()).zoneAbbr(); + } + //console.log ("TIMELINE MONITORS: " + JSON.stringify(message)); + //var ld = NVRDataModel.getLogin(); + $scope.loginData = NVRDataModel.getLogin(); + + /* if (ld.persistMontageOrder) { + var iMon = NVRDataModel.applyMontageMonitorPrefs(tempMon, 2); + $scope.monitors = iMon[0]; + } else*/ + + //console.log ("MONITORS:"+JSON.stringify($scope.monitors)); + + if ($rootScope.customTimelineRange) { + $scope.currentMode = 'custom'; + //console.log("***** CUSTOM RANGE"); + if (moment($rootScope.fromString).isValid() && + moment($rootScope.toString).isValid()) { + // console.log("FROM & TO IS CUSTOM"); + fromDate = $rootScope.fromString; + toDate = $rootScope.toString; + $scope.fromDate = fromDate; + $scope.toDate = toDate; + drawGraph(fromDate, toDate, maxItems); + } else { + //console.log("From:" + $rootScope.fromString + " To:" + $rootScope.toString); + //console.log("FROM & TO IS CUSTOM INVALID"); + + if (NVRDataModel.getLogin().useLocalTimeZone) { + fromDate = moment().startOf('day').format("YYYY-MM-DD HH:mm:ss"); + toDate = moment().endOf('day').format("YYYY-MM-DD HH:mm:ss"); + } else { + fromDate = moment().tz(NVRDataModel.getTimeZoneNow()).startOf('day').format("YYYY-MM-DD HH:mm:ss"); + toDate = moment().tz(NVRDataModel.getTimeZoneNow()).endOf('day').format("YYYY-MM-DD HH:mm:ss"); } - else { - $scope.onTap = $translate.instant('kTimelineEvent'); - $scope.onDTap = $translate.instant('kTimelineGraph'); + + drawGraph(fromDate, toDate, maxItems); + } + } else { + $scope.currentMode = 'day'; + + if (NVRDataModel.getLogin().useLocalTimeZone) { + fromDate = moment().startOf('day').format("YYYY-MM-DD HH:mm:ss"); + toDate = moment().endOf('day').format("YYYY-MM-DD HH:mm:ss"); + } else { + fromDate = moment().tz(NVRDataModel.getTimeZoneNow()).startOf('day').format("YYYY-MM-DD HH:mm:ss"); + toDate = moment().tz(NVRDataModel.getTimeZoneNow()).endOf('day').format("YYYY-MM-DD HH:mm:ss"); + } + drawGraph(fromDate, toDate, maxItems); + } + + $ionicPopover.fromTemplateUrl('templates/timeline-popover.html', { + scope: $scope, + }).then(function (popover) { + $scope.popover = popover; + }); + + // -------------------------------------------------------- + // Handling of back button in case modal is open should + // close the modal + // -------------------------------------------------------- + + $ionicPlatform.registerBackButtonAction(function (e) { + e.preventDefault(); + if ($scope.modal != undefined && $scope.modal.isShown()) { + // switch off awake, as liveview is finished + NVRDataModel.debug("Modal is open, closing it"); + NVRDataModel.setAwake(false); + $scope.modal.remove(); + } else { + NVRDataModel.debug("Modal is closed, so toggling or exiting"); + if (!$ionicSideMenuDelegate.isOpenLeft()) { + $ionicSideMenuDelegate.toggleLeft(); + + } else { + navigator.app.exitApp(); } - $scope.timelineControls = $translate.instant('kTimelineTap')+':'+$scope.onTap+" / "+$translate.instant('kTimelineDTap')+':'+$scope.onDTap; - }; + } + }, 1000); - //------------------------------------------------- - // FIXME: shitty hackery -- Im using a rootScope - // to know if you just went to custom range - // and back. Fix this, really. - // So anyway, if you did select a custom range - // then we "go back" to timeline, which is when - // we come here - so make sure we update the - // graph range - //------------------------------------------------- - + }); - $scope.$on('$ionicView.afterEnter', function() - { + //------------------------------------------------- + // Controller main + //------------------------------------------------- - $scope.monitors = message; + var graphIndex; + var updateInterval; + var lastTimeForEvent; + var groups, graphData; + var isProcessNewEventsWaiting = false; + var options; + var dblclick = false; - $scope.onTap = $translate.instant('kTimelineEvent'); - $scope.onDTap = $translate.instant('kTimelineGraph'); - $scope.timelineControls = $translate.instant('kTimelineTap')+':'+$scope.onTap+" / "+$translate.instant('kTimelineDTap')+':'+$scope.onDTap; - - //console.log("***AFTER ENTER"); + $scope.mycarousel = { + index: 0 + }; + $scope.ionRange = { + index: 1 + }; - $scope.follow = { - 'time': NVRDataModel.getLogin().followTimeLine - }; + var curFromDate, curToDate, curCount; - $interval.cancel(updateInterval); + document.addEventListener("pause", onPause, false); - // Make sure sliding for menu is disabled so it - // does not interfere with graph panning - $ionicSideMenuDelegate.canDragContent(false); - var ld = NVRDataModel.getLogin(); - maxItemsConf = ($rootScope.platformOS == 'desktop') ? zm.graphDesktopItemMax : zm.graphItemMax; - maxItems = ld.graphSize || maxItemsConf; - NVRDataModel.log("Graph items to draw is " + maxItems); - $scope.maxItems = maxItems; - $scope.translationData = { - maxItemsVal: maxItems - }; - - $scope.graphLoaded = false; - NVRDataModel.debug("TimelineCtrl/drawGraph: graphLoaded is " + $scope.graphLoaded); - - //latestDateDrawn = moment().locale('en').format("YYYY-MM-DD HH:mm:ss"); - $scope.modalFromTimelineIsOpen = false; - //var tempMon = message; - - // lets timeline.onget the abbreviated version of TZ to display - if (NVRDataModel.getLogin().useLocalTimeZone) - { - $scope.tzAbbr = moment().tz(moment.tz.guess()).zoneAbbr(); - } - else - { - $scope.tzAbbr = moment().tz(NVRDataModel.getTimeZoneNow()).zoneAbbr(); - } + // FIXME: Timeline awake to avoid graph redrawing + NVRDataModel.setAwake(NVRDataModel.getKeepAwake()); - //console.log ("TIMELINE MONITORS: " + JSON.stringify(message)); - //var ld = NVRDataModel.getLogin(); - $scope.loginData = NVRDataModel.getLogin(); + // fromDate and toDate will be used to plot the range for the graph + // We start in day mode + // + var fromDate, toDate; - /* if (ld.persistMontageOrder) { - var iMon = NVRDataModel.applyMontageMonitorPrefs(tempMon, 2); - $scope.monitors = iMon[0]; - } else*/ + fromDate = moment().tz(NVRDataModel.getLogin().useLocalTimeZone ? NVRDataModel.getLocalTimeZoneNow() : NVRDataModel.getTimeZoneNow()).startOf('day').format("YYYY-MM-DD HH:mm:ss"); + toDate = moment().tz(NVRDataModel.getLogin().useLocalTimeZone ? NVRDataModel.getLocalTimeZoneNow() : NVRDataModel.getTimeZoneNow()).endOf('day').format("YYYY-MM-DD HH:mm:ss"); - //console.log ("MONITORS:"+JSON.stringify($scope.monitors)); + $scope.fromDate = fromDate; + $scope.toDate = toDate; - if ($rootScope.customTimelineRange) - { - $scope.currentMode = 'custom'; - //console.log("***** CUSTOM RANGE"); - if (moment($rootScope.fromString).isValid() && - moment($rootScope.toString).isValid()) - { - // console.log("FROM & TO IS CUSTOM"); - fromDate = $rootScope.fromString; - toDate = $rootScope.toString; - $scope.fromDate = fromDate; - $scope.toDate = toDate; - drawGraph(fromDate, toDate, maxItems); - } - else - { - //console.log("From:" + $rootScope.fromString + " To:" + $rootScope.toString); - //console.log("FROM & TO IS CUSTOM INVALID"); + // maxItems will be ignored during timeline draw if its desktop + var maxItemsConf; - if (NVRDataModel.getLogin().useLocalTimeZone) - { - fromDate = moment().startOf('day').format("YYYY-MM-DD HH:mm:ss"); - toDate = moment().endOf('day').format("YYYY-MM-DD HH:mm:ss"); - } - else - { - fromDate = moment().tz(NVRDataModel.getTimeZoneNow()).startOf('day').format("YYYY-MM-DD HH:mm:ss"); - toDate = moment().tz(NVRDataModel.getTimeZoneNow()).endOf('day').format("YYYY-MM-DD HH:mm:ss"); - } + var ld = NVRDataModel.getLogin(); + var maxItems; - drawGraph(fromDate, toDate, maxItems); - } - } - else - { - $scope.currentMode = 'day'; + //flat colors for graph - https://flatuicolors.com http://www.flatuicolorpicker.com + var colors = ['#3498db', '#E57373', '#EB974E', '#95A5A6', '#e74c3c', '#03C9A9', ]; - if (NVRDataModel.getLogin().useLocalTimeZone) - { - fromDate = moment().startOf('day').format("YYYY-MM-DD HH:mm:ss"); - toDate = moment().endOf('day').format("YYYY-MM-DD HH:mm:ss"); - } - else - { - fromDate = moment().tz(NVRDataModel.getTimeZoneNow()).startOf('day').format("YYYY-MM-DD HH:mm:ss"); - toDate = moment().tz(NVRDataModel.getTimeZoneNow()).endOf('day').format("YYYY-MM-DD HH:mm:ss"); - } - drawGraph(fromDate, toDate, maxItems); - } + var container; + container = angular.element(document.getElementById('visualization')); + var timeline; - $ionicPopover.fromTemplateUrl('templates/timeline-popover.html', - { - scope: $scope, - }).then(function(popover) - { - $scope.popover = popover; - }); + //console.log ("RETURNING MONITORS " + JSON.stringify($scope.monitors)); + //$scope.monitors = message; - // -------------------------------------------------------- - // Handling of back button in case modal is open should - // close the modal - // -------------------------------------------------------- + //console.log ("MONITOR DATA AFTER APPLYING : " + JSON.stringify($scope.monitors)); - $ionicPlatform.registerBackButtonAction(function(e) - { - e.preventDefault(); - if ($scope.modal != undefined && $scope.modal.isShown()) - { - // switch off awake, as liveview is finished - NVRDataModel.debug("Modal is open, closing it"); - NVRDataModel.setAwake(false); - $scope.modal.remove(); - } - else - { - NVRDataModel.debug("Modal is closed, so toggling or exiting"); - if (!$ionicSideMenuDelegate.isOpenLeft()) - { - $ionicSideMenuDelegate.toggleLeft(); + $scope.navControls = false; + var navControls = false; - } - else - { - navigator.app.exitApp(); - } + //drawGraph(fromDate, toDate, maxItems); + //dummyDrawGraph(fromDate, toDate,maxItems); - } + //------------------------------------------------- + // Rest graph to sane state after you went + // wild zooming and panning :-) + //------------------------------------------------- + $scope.fit = function () { + timeline.fit(); + }; - }, 1000); + $scope.toggleNav = function () { + if (navControls == true) { + navControls = !navControls; + // $scope.navControls = navControls; + // give out animation time + $timeout(function () { + $scope.navControls = navControls; + }, 2000); + } else { + navControls = !navControls; + $scope.navControls = navControls; + } + var element = angular.element(document.getElementById("timeline-ctrl")); + + if (navControls) { + element.removeClass("animated bounceOutLeft"); + element.addClass("animated bounceInRight"); + } else { + element.removeClass("animated bounceInRight"); + element.addClass("animated bounceOutLeft"); + } - }); + }; - //------------------------------------------------- - // Controller main - //------------------------------------------------- + function shortenTime(str) { + if (NVRDataModel.getLogin().useLocalTimeZone) + return moment.tz(str, NVRDataModel.getTimeZoneNow()).tz(moment.tz.guess()).format(NVRDataModel.getTimeFormat()); + else + return moment(str).format(NVRDataModel.getTimeFormat()); + } - var graphIndex; - var updateInterval; - var lastTimeForEvent; - var groups, graphData; - var isProcessNewEventsWaiting = false; - var options; - var dblclick = false; + $scope.toggleFollowTime = function () { + /*if ($scope.currentMode != 'day') { + $rootScope.zmPopup = $ionicPopup.alert({ + title: $translate.instant('kError'), + template: $translate.instant('kFollowError') + }); + return; + }*/ + $scope.follow.time = !$scope.follow.time; + var loginData = NVRDataModel.getLogin(); + loginData.followTimeLine = $scope.follow.time; + NVRDataModel.setLogin(loginData); + }; + //------------------------------------------------- + // Called with day/week/month + // so we can redraw the graph + //------------------------------------------------- + + $scope.buttonClicked = function (index) { + //console.log (index); + if (index == 0) //month + { + $scope.follow.time = NVRDataModel.getLogin().followTimeLine; + $scope.currentMode = "month"; + NVRDataModel.log("Month view"); + $rootScope.customTimelineRange = false; + + toDate = moment().format("YYYY-MM-DD HH:mm:ss"); + fromDate = moment().subtract(1, 'month').startOf('day').format("YYYY-MM-DD HH:mm:ss"); + $scope.fromDate = fromDate; + $scope.toDate = toDate; + drawGraph(fromDate, toDate, maxItems); + } else if (index == 1) //week + { + $scope.follow.time = NVRDataModel.getLogin().followTimeLine; + $scope.currentMode = "week"; + $rootScope.customTimelineRange = false; + NVRDataModel.log("Week view"); + toDate = moment().tz(NVRDataModel.getLogin().useLocalTimeZone ? NVRDataModel.getLocalTimeZoneNow() : NVRDataModel.getTimeZoneNow()).format("YYYY-MM-DD HH:mm:ss"); + fromDate = moment().tz(NVRDataModel.getLogin().useLocalTimeZone ? NVRDataModel.getLocalTimeZoneNow() : NVRDataModel.getTimeZoneNow()).subtract(1, 'week').startOf('day').format("YYYY-MM-DD HH:mm:ss"); + $scope.fromDate = fromDate; + $scope.toDate = toDate; + drawGraph(fromDate, toDate, maxItems); + } else if (index == 2) //day + { - $scope.mycarousel = { - index: 0 - }; - $scope.ionRange = { - index: 1 - }; + $scope.currentMode = "day"; + $rootScope.customTimelineRange = false; + NVRDataModel.log("Day view"); + //toDate = moment().format("YYYY-MM-DD HH:mm:ss"); + fromDate = moment().tz(NVRDataModel.getLogin().useLocalTimeZone ? NVRDataModel.getLocalTimeZoneNow() : NVRDataModel.getTimeZoneNow()).startOf('day').format("YYYY-MM-DD HH:mm:ss"); + toDate = moment().tz(NVRDataModel.getLogin().useLocalTimeZone ? NVRDataModel.getLocalTimeZoneNow() : NVRDataModel.getTimeZoneNow()).endOf('day').format("YYYY-MM-DD HH:mm:ss"); + $scope.fromDate = fromDate; + $scope.toDate = toDate; + drawGraph(fromDate, toDate, maxItems); + } else // custom + { + $scope.follow.time = NVRDataModel.getLogin().followTimeLine; + $scope.currentMode = "custom"; + $rootScope.customTimelineRange = true; + $state.go('app.events-date-time-filter'); + return; + } - var curFromDate, curToDate, curCount; + }; - document.addEventListener("pause", onPause, false); + /** + * [processNewEvents is called every X seconds when dynamic update is on. X = 10 for now] + * @return {[type]} + */ + function processNewEvents() { - // FIXME: Timeline awake to avoid graph redrawing - NVRDataModel.setAwake(NVRDataModel.getKeepAwake()); + //safeguard in the event http calls are still going on + if (!$scope.follow.time || isProcessNewEventsWaiting) return; + + var ld = NVRDataModel.getLogin(); - // fromDate and toDate will be used to plot the range for the graph - // We start in day mode + // check for last 2 minutes to account for late DB updates and what not. 5 mins was likely enough // - var fromDate, toDate; - fromDate = moment().tz(NVRDataModel.getLogin().useLocalTimeZone ? NVRDataModel.getLocalTimeZoneNow() : NVRDataModel.getTimeZoneNow()).startOf('day').format("YYYY-MM-DD HH:mm:ss"); - toDate = moment().tz(NVRDataModel.getLogin().useLocalTimeZone ? NVRDataModel.getLocalTimeZoneNow() : NVRDataModel.getTimeZoneNow()).endOf('day').format("YYYY-MM-DD HH:mm:ss"); + // make sure these are server time + var from = moment(lastTimeForEvent).tz(NVRDataModel.getTimeZoneNow()); + from = from.subtract(2, 'minutes').locale('en').format("YYYY-MM-DD HH:mm:ss"); - $scope.fromDate = fromDate; - $scope.toDate = toDate; + var to = moment(lastTimeForEvent).tz(NVRDataModel.getTimeZoneNow()); + to = to.locale('en').format("YYYY-MM-DD HH:mm:ss"); - // maxItems will be ignored during timeline draw if its desktop - var maxItemsConf; + lastTimeForEvent = moment().tz(NVRDataModel.getLogin().useLocalTimeZone ? NVRDataModel.getLocalTimeZoneNow() : NVRDataModel.getTimeZoneNow()); - var ld = NVRDataModel.getLogin(); - var maxItems; + // FIXME: totally ignoring event pages - hoping it wont be more than 100 or 150 whatever + // the events per page limit is. Why? laziness. + // + var completedEvents = ld.apiurl + '/events/index/EndTime >=:' + from; + // we can add alarmCount as this is really for completed events + //completedEvents = completedEvents + "/AlarmFrames >=:" + (ld.enableAlarmCount ? ld.minAlarmCount : 0); - //flat colors for graph - https://flatuicolors.com http://www.flatuicolorpicker.com - var colors = ['#3498db', '#E57373', '#EB974E', '#95A5A6', '#e74c3c', '#03C9A9', ]; + completedEvents = completedEvents + ".json"; - var container; - container = angular.element(document.getElementById('visualization')); - var timeline; + // now get currently ongoing events + // as it turns out various events get stored withn null and never recover + // so, lets limiy to 15 m + // - //console.log ("RETURNING MONITORS " + JSON.stringify($scope.monitors)); - //$scope.monitors = message; + var st = moment(lastTimeForEvent).tz(NVRDataModel.getTimeZoneNow()); + st = st.subtract(10, 'minutes').locale('en').format("YYYY-MM-DD HH:mm:ss"); + var ongoingEvents = ld.apiurl + '/events/index/StartTime >=:' + st + '/EndTime =:.json'; + //NVRDataModel.debug("Getting incremental events using: " + completedEvents); - //console.log ("MONITOR DATA AFTER APPLYING : " + JSON.stringify($scope.monitors)); + NVRDataModel.debug("Completed events API:" + completedEvents); + NVRDataModel.debug("Ongoing events API:+" + ongoingEvents); - $scope.navControls = false; - var navControls = false; + isProcessNewEventsWaiting = true; - //drawGraph(fromDate, toDate, maxItems); - //dummyDrawGraph(fromDate, toDate,maxItems); + var $httpApi = $http.get(completedEvents); + var $httpOngoing = $http.get(ongoingEvents); - //------------------------------------------------- - // Rest graph to sane state after you went - // wild zooming and panning :-) - //------------------------------------------------- - $scope.fit = function() - { - timeline.fit(); - }; + $q.all([$httpApi, $httpOngoing]) + .then(function (dataarray) { - $scope.toggleNav = function() - { - if (navControls == true) - { - navControls = !navControls; - // $scope.navControls = navControls; - // give out animation time - $timeout(function() - { - $scope.navControls = navControls; - }, 2000); - } - else - { - navControls = !navControls; - $scope.navControls = navControls; - } - var element = angular.element(document.getElementById("timeline-ctrl")); + var myevents = dataarray[0].data.events; - if (navControls) - { - element.removeClass("animated bounceOutLeft"); - element.addClass("animated bounceInRight"); - } - else - { - element.removeClass("animated bounceInRight"); - element.addClass("animated bounceOutLeft"); - } + if (dataarray.length > 1) { + myevents = myevents.concat(dataarray[1].data.events); - }; + } - function shortenTime(str) - { - if (NVRDataModel.getLogin().useLocalTimeZone) - return moment.tz(str, NVRDataModel.getTimeZoneNow()).tz(moment.tz.guess()).format(NVRDataModel.getTimeFormat()); - else - return moment(str).format(NVRDataModel.getTimeFormat()); - } + $scope.newEvents = ''; + var localNewEvents = ''; + //console.log ("GOT "+JSON.stringify(data)); - $scope.toggleFollowTime = function() - { - /*if ($scope.currentMode != 'day') { - $rootScope.zmPopup = $ionicPopup.alert({ - title: $translate.instant('kError'), - template: $translate.instant('kFollowError') - }); - return; - }*/ - $scope.follow.time = !$scope.follow.time; - var loginData = NVRDataModel.getLogin(); - loginData.followTimeLine = $scope.follow.time; - NVRDataModel.setLogin(loginData); - }; - //------------------------------------------------- - // Called with day/week/month - // so we can redraw the graph - //------------------------------------------------- + for (var j = 0; j < myevents.length; j++) { - $scope.buttonClicked = function(index) - { - //console.log (index); - if (index == 0) //month - { - $scope.follow.time = NVRDataModel.getLogin().followTimeLine; - $scope.currentMode = "month"; - NVRDataModel.log("Month view"); - $rootScope.customTimelineRange = false; - - toDate = moment().format("YYYY-MM-DD HH:mm:ss"); - fromDate = moment().subtract(1, 'month').startOf('day').format("YYYY-MM-DD HH:mm:ss"); - $scope.fromDate = fromDate; - $scope.toDate = toDate; - drawGraph(fromDate, toDate, maxItems); - } - else if (index == 1) //week - { - $scope.follow.time = NVRDataModel.getLogin().followTimeLine; - $scope.currentMode = "week"; - $rootScope.customTimelineRange = false; - NVRDataModel.log("Week view"); - toDate = moment().tz(NVRDataModel.getLogin().useLocalTimeZone ? NVRDataModel.getLocalTimeZoneNow() : NVRDataModel.getTimeZoneNow()).format("YYYY-MM-DD HH:mm:ss"); - fromDate = moment().tz(NVRDataModel.getLogin().useLocalTimeZone ? NVRDataModel.getLocalTimeZoneNow() : NVRDataModel.getTimeZoneNow()).subtract(1, 'week').startOf('day').format("YYYY-MM-DD HH:mm:ss"); - $scope.fromDate = fromDate; - $scope.toDate = toDate; - drawGraph(fromDate, toDate, maxItems); - } - else if (index == 2) //day - { + // these are all in server timezone but no TZ - $scope.currentMode = "day"; - $rootScope.customTimelineRange = false; - NVRDataModel.log("Day view"); - //toDate = moment().format("YYYY-MM-DD HH:mm:ss"); - fromDate = moment().tz(NVRDataModel.getLogin().useLocalTimeZone ? NVRDataModel.getLocalTimeZoneNow() : NVRDataModel.getTimeZoneNow()).startOf('day').format("YYYY-MM-DD HH:mm:ss"); - toDate = moment().tz(NVRDataModel.getLogin().useLocalTimeZone ? NVRDataModel.getLocalTimeZoneNow() : NVRDataModel.getTimeZoneNow()).endOf('day').format("YYYY-MM-DD HH:mm:ss"); - $scope.fromDate = fromDate; - $scope.toDate = toDate; - drawGraph(fromDate, toDate, maxItems); - } - else // custom - { - $scope.follow.time = NVRDataModel.getLogin().followTimeLine; - $scope.currentMode = "custom"; - $rootScope.customTimelineRange = true; - $state.go('app.events-date-time-filter'); - return; - } + myevents[j].Event.StartTime = moment.tz(myevents[j].Event.StartTime, NVRDataModel.getTimeZoneNow()).format('YYYY-MM-DD HH:mm:ss'); - }; + myevents[j].Event.EndTime = moment.tz(myevents[j].Event.EndTime, NVRDataModel.getTimeZoneNow()).format('YYYY-MM-DD HH:mm:ss'); - /** - * [processNewEvents is called every X seconds when dynamic update is on. X = 10 for now] - * @return {[type]} - */ - function processNewEvents() - { + var itm = graphData.get(myevents[j].Event.Id); + if (itm) { + // console.log(myevents[j].Event.Id + " already exists, updating params"); - //safeguard in the event http calls are still going on - if (!$scope.follow.time || isProcessNewEventsWaiting) return; + var content = "<span class='my-vis-font'>" + "(" + myevents[j].Event.Id + ")" + myevents[j].Event.Notes + " " + $translate.instant('kRecordingProgress') + "</span>"; - var ld = NVRDataModel.getLogin(); + var style; + var recordingInProgress = false; - // check for last 2 minutes to account for late DB updates and what not. 5 mins was likely enough - // + if (moment(myevents[j].Event.EndTime).isValid()) // recording over + { + //console.log ("EVENT "+myevents[j].Event.Id+" emded at "+myevents[j].Event.EndTime); - // make sure these are server time - var from = moment(lastTimeForEvent).tz(NVRDataModel.getTimeZoneNow()); - from = from.subtract(2, 'minutes').locale('en').format("YYYY-MM-DD HH:mm:ss"); + content = "<span class='my-vis-font'>" + "( <i class='ion-android-notifications'></i>" + myevents[j].Event.AlarmFrames + ") " + " (" + myevents[j].Event.Id + ") " + myevents[j].Event.Notes + "</span>"; - var to = moment(lastTimeForEvent).tz(NVRDataModel.getTimeZoneNow()); - to = to.locale('en').format("YYYY-MM-DD HH:mm:ss"); + style = "background-color:" + colors[parseInt(myevents[j].Event.MonitorId) % colors.length] + + ";border-color:" + colors[parseInt(myevents[j].Event.MonitorId) % colors.length]; + } else // still recording + { - lastTimeForEvent = moment().tz(NVRDataModel.getLogin().useLocalTimeZone ? NVRDataModel.getLocalTimeZoneNow() : NVRDataModel.getTimeZoneNow()); + var tze; + tze = moment().tz(NVRDataModel.getTimeZoneNow()); - // FIXME: totally ignoring event pages - hoping it wont be more than 100 or 150 whatever - // the events per page limit is. Why? laziness. - // - var completedEvents = ld.apiurl + '/events/index/EndTime >=:' + from; - // we can add alarmCount as this is really for completed events - //completedEvents = completedEvents + "/AlarmFrames >=:" + (ld.enableAlarmCount ? ld.minAlarmCount : 0); + myevents[j].Event.EndTime = tze.format('YYYY-MM-DD HH:mm:ss'); - completedEvents = completedEvents + ".json"; + //console.log ("END TIME = "+ myevents[j].Event.EndTime); - // now get currently ongoing events - // as it turns out various events get stored withn null and never recover - // so, lets limiy to 15 m - // + style = "background-color:orange"; + recordingInProgress = true; - var st = moment(lastTimeForEvent).tz(NVRDataModel.getTimeZoneNow()); - st = st.subtract(10, 'minutes').locale('en').format("YYYY-MM-DD HH:mm:ss"); - var ongoingEvents = ld.apiurl + '/events/index/StartTime >=:' + st + '/EndTime =:.json'; - //NVRDataModel.debug("Getting incremental events using: " + completedEvents); + } - NVRDataModel.debug("Completed events API:" + completedEvents); - NVRDataModel.debug("Ongoing events API:+" + ongoingEvents); + // right at this point we need to decide if we keep or remove this event + // - isProcessNewEventsWaiting = true; + if (ld.enableAlarmCount && ld.minAlarmCount > myevents[j].Event.AlarmFrames && !recordingInProgress) { + // remove + NVRDataModel.debug("Removing Event:" + myevents[j].Event.Id + "as it doesn't have " + myevents[j].Event.AlarmFrames + " alarm frames"); + // var old = timeline.getWindow(); + graphData.remove(myevents[j].Event.Id); + // timeline.setWindow (old.start, old.end); + } else { - var $httpApi = $http.get(completedEvents); - var $httpOngoing = $http.get(ongoingEvents); + var tzs1, tze1; + if (NVRDataModel.getLogin().useLocalTimeZone) { + tzs1 = moment.tz(myevents[j].Event.StartTime, NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow()); + tze1 = moment.tz(myevents[j].Event.EndTime, NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow()); + } else { + tzs1 = moment.tz(myevents[j].Event.StartTime, NVRDataModel.getTimeZoneNow()); + tze1 = moment.tz(myevents[j].Event.EndTime, NVRDataModel.getTimeZoneNow()); + } - $q.all([$httpApi, $httpOngoing]) - .then(function(dataarray) - { + //tzs1 = tzs1.format("YYYY-MM-DD HH:mm:ss"); + //tze1 = tze1.format("YYYY-MM-DD HH:mm:ss"); + + NVRDataModel.debug("Updating Event:" + myevents[j].Event.Id + "StartTime:" + tzs1.format() + " EndTime:" + tze1.format()); + graphData.update({ + id: myevents[j].Event.Id, + content: content, + start: tzs1, + // start: myevents[j].Event.StartTime, + // end: myevents[j].Event.EndTime, + end: tze1, + //group: myevents[j].Event.MonitorId, + //type: "range", + style: style, + myframes: myevents[j].Event.Frames, + mydur: myevents[j].Event.Length, + myeid: myevents[j].Event.Id, + myename: myevents[j].Event.Name, + myvideo: myevents[j].Event.DefaultVideo, + myevent: myevents[j] + + }); - var myevents = dataarray[0].data.events; + //timeline.focus(myevents[j].Event.Id); + // + timeline.moveTo(timeline.getCurrentTime()); + //console.log ("Focus EID="+myevents[j].Event.Id); + localNewEvents = localNewEvents + NVRDataModel.getMonitorName(myevents[j].Event.MonitorId) + '@' + shortenTime(myevents[j].Event.StartTime) + ' (' + myevents[j].Event.Id + '),'; - if (dataarray.length > 1) - { - myevents = myevents.concat(dataarray[1].data.events); + } - } + } else { // event is new - $scope.newEvents = ''; - var localNewEvents = ''; - //console.log ("GOT "+JSON.stringify(data)); - - for (var j = 0; j < myevents.length; j++) - { - - // these are all in server timezone but no TZ - - myevents[j].Event.StartTime = moment.tz(myevents[j].Event.StartTime, NVRDataModel.getTimeZoneNow()).format('YYYY-MM-DD HH:mm:ss'); - - myevents[j].Event.EndTime = moment.tz(myevents[j].Event.EndTime, NVRDataModel.getTimeZoneNow()).format('YYYY-MM-DD HH:mm:ss'); - - var itm = graphData.get(myevents[j].Event.Id); - if (itm) - { - // console.log(myevents[j].Event.Id + " already exists, updating params"); - - var content = "<span class='my-vis-font'>" + "(" + myevents[j].Event.Id + ")" + myevents[j].Event.Notes + " " + $translate.instant('kRecordingProgress') + "</span>"; - - var style; - var recordingInProgress = false; - - if (moment(myevents[j].Event.EndTime).isValid()) // recording over - { - //console.log ("EVENT "+myevents[j].Event.Id+" emded at "+myevents[j].Event.EndTime); - - content = "<span class='my-vis-font'>" + "( <i class='ion-android-notifications'></i>" + myevents[j].Event.AlarmFrames + ") " + " (" + myevents[j].Event.Id + ") " + myevents[j].Event.Notes + "</span>"; - - style = "background-color:" + colors[parseInt(myevents[j].Event.MonitorId) % colors.length] + - ";border-color:" + colors[parseInt(myevents[j].Event.MonitorId) % colors.length]; - } - else // still recording - { - - var tze; - tze = moment().tz(NVRDataModel.getTimeZoneNow()); - - myevents[j].Event.EndTime = tze.format('YYYY-MM-DD HH:mm:ss'); - - //console.log ("END TIME = "+ myevents[j].Event.EndTime); - - style = "background-color:orange"; - recordingInProgress = true; - - } - - // right at this point we need to decide if we keep or remove this event - // - - if (ld.enableAlarmCount && ld.minAlarmCount > myevents[j].Event.AlarmFrames && !recordingInProgress) - { - // remove - NVRDataModel.debug("Removing Event:" + myevents[j].Event.Id + "as it doesn't have " + myevents[j].Event.AlarmFrames + " alarm frames"); - // var old = timeline.getWindow(); - graphData.remove(myevents[j].Event.Id); - // timeline.setWindow (old.start, old.end); - } - else - { - - var tzs1, tze1; - if (NVRDataModel.getLogin().useLocalTimeZone) - { - tzs1 = moment.tz(myevents[j].Event.StartTime, NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow()); - tze1 = moment.tz(myevents[j].Event.EndTime, NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow()); - } - else - { - tzs1 = moment.tz(myevents[j].Event.StartTime, NVRDataModel.getTimeZoneNow()); - tze1 = moment.tz(myevents[j].Event.EndTime, NVRDataModel.getTimeZoneNow()); - } - - //tzs1 = tzs1.format("YYYY-MM-DD HH:mm:ss"); - //tze1 = tze1.format("YYYY-MM-DD HH:mm:ss"); - - NVRDataModel.debug("Updating Event:" + myevents[j].Event.Id + "StartTime:" + tzs1.format() + " EndTime:" + tze1.format()); - graphData.update( - { - id: myevents[j].Event.Id, - content: content, - start: tzs1, - // start: myevents[j].Event.StartTime, - // end: myevents[j].Event.EndTime, - end: tze1, - //group: myevents[j].Event.MonitorId, - //type: "range", - style: style, - myframes: myevents[j].Event.Frames, - mydur: myevents[j].Event.Length, - myeid: myevents[j].Event.Id, - myename: myevents[j].Event.Name, - myvideo: myevents[j].Event.DefaultVideo, - myevent: myevents[j] - - }); - - //timeline.focus(myevents[j].Event.Id); - // - timeline.moveTo(timeline.getCurrentTime()); - //console.log ("Focus EID="+myevents[j].Event.Id); - localNewEvents = localNewEvents + NVRDataModel.getMonitorName(myevents[j].Event.MonitorId) + '@' + shortenTime(myevents[j].Event.StartTime) + ' (' + myevents[j].Event.Id + '),'; - - } - - } - else - { // event is new - - var isBeingRecorded = false; - var idfound = false; - for (var ii = 0; ii < $scope.monitors.length; ii++) - { - if ($scope.monitors[ii].Monitor.Id == myevents[j].Event.MonitorId && NVRDataModel.isNotHidden(myevents[j].Event.MonitorId)) - { - idfound = true; - break; - } - } - - if (idfound) - { - - myevents[j].Event.MonitorName = NVRDataModel.getMonitorName(myevents[j].Event.MonitorId); - - myevents[j].Event.streamingURL = NVRDataModel.getStreamingURL(myevents[j].Event.MonitorId); - myevents[j].Event.baseURL = NVRDataModel.getBaseURL(myevents[j].Event.MonitorId); - myevents[j].Event.imageMode = NVRDataModel.getImageMode(myevents[j].Event.MonitorId); - if (NVRDataModel.getLogin().url != myevents[j].Event.baseURL) - { - - myevents[j].Event.baseURL = NVRDataModel.getLogin().url; - } - - if (typeof myevents[j].Event.DefaultVideo === 'undefined') - // console.log (JSON.stringify(myevents[j])); - myevents[j].Event.DefaultVideo = ""; - - // now lets make sure we don't infinitely increase - - if (graphIndex >= curCount) - //if (1) - { - var mv = graphData.min('id'); - //console.log("MIN="+JSON.stringify(mv)); - if (mv) - { - graphData.remove(mv.id); - graphIndex--; - NVRDataModel.debug("Removed Event " + mv.id + " to make space"); - } - - } - - // since this is a new add its possible dates are not defined - if (!moment(myevents[j].Event.StartTime).isValid()) - { - NVRDataModel.log("Event:" + myevents[j].Event.Id + "-Invalid Start time - this should really not happen "); - - } - - if (!moment(myevents[j].Event.EndTime).isValid()) - { - var t1 = moment().tz(NVRDataModel.getTimeZoneNow()); - - myevents[j].Event.EndTime = t1.format('YYYY-MM-DD HH:mm:ss'); - - NVRDataModel.debug("Event:" + myevents[j].Event.Id + "-End time is invalid, setting to current time"); - - isBeingRecorded = true; - - } - - // if range doesn't allow for current time, we need to fix that - /*if (moment(options.max).isBefore(moment())) { - // console.log("Adjusting Range to fit in new event"); - options.max = moment().add('1', 'hours').locale('en').format("YYYY-MM-DD HH:mm:ss"); - timeline.setOptions(options); - }*/ - - var eventText = "<span class='my-vis-font'>" + "( <i class='ion-android-notifications'></i>" + (myevents[j].Event.AlarmFrames || ' unknown ') + ") " + myevents[j].Event.Notes + "</span>"; - - if (isBeingRecorded) - { - eventText = "<span class='my-vis-font'>" + "(" + myevents[j].Event.Id + ") " + myevents[j].Event.Notes + " " + $translate.instant('kRecordingProgress') + "</span>"; - } - - // since we concated, its possible events may be repeated - if (!graphData.get(myevents[j].Event.Id)) - { - - localNewEvents = localNewEvents + NVRDataModel.getMonitorName(myevents[j].Event.MonitorId) + '@' + shortenTime(myevents[j].Event.StartTime) + ' (' + myevents[j].Event.Id + '),'; - - var tzs2, tze2; - if (NVRDataModel.getLogin().useLocalTimeZone) - { - tzs2 = moment.tz(myevents[j].Event.StartTime, NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow()); - tze2 = moment.tz(myevents[j].Event.EndTime, NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow()); - } - else - { - tzs2 = moment.tz(myevents[j].Event.StartTime, NVRDataModel.getTimeZoneNow()); - tze2 = moment.tz(myevents[j].Event.EndTime, NVRDataModel.getTimeZoneNow()); - } - - //tzs2 = tzs2.format("YYYY-MM-DD HH:mm:ss"); - //tze2 = tze2.format("YYYY-MM-DD HH:mm:ss"); - - NVRDataModel.debug(">>> " + myevents[j].Event.Id + " New event updating graph " + " from:" + tzs2.format() + " to:" + tze2.format()); - - graphData.add( - { - - id: myevents[j].Event.Id, - content: eventText, - start: tzs2, - //start: myevents[j].Event.StartTime, - // end: myevents[j].Event.EndTime, - end: tze2, - group: myevents[j].Event.MonitorId, - style: "background-color:orange", - //type: "range", - - myframes: myevents[j].Event.Frames, - mydur: myevents[j].Event.Length, - myeid: myevents[j].Event.Id, - myename: myevents[j].Event.Name, - myvideo: myevents[j].Event.DefaultVideo, - myevent: myevents[j] - - }); - graphIndex++; - //timeline.focus(myevents[j].Event.Id); - timeline.moveTo(timeline.getCurrentTime()); - } - - //options.max = moment(fromDate).locale('en').format("YYYY-MM-DD HH:mm:ss"); - - } //idfound - - } // new event - - } // for j - - // At this stage, see if we need to display new events - if (localNewEvents.length > 0) - { - localNewEvents = $translate.instant('kLatestEvents') + ':' + localNewEvents; - localNewEvents = localNewEvents.slice(0, -1); - $scope.newEvents = localNewEvents; - } - isProcessNewEventsWaiting = false; + var isBeingRecorded = false; + var idfound = false; + for (var ii = 0; ii < $scope.monitors.length; ii++) { + if ($scope.monitors[ii].Monitor.Id == myevents[j].Event.MonitorId && NVRDataModel.isNotHidden(myevents[j].Event.MonitorId)) { + idfound = true; + break; + } + } + + if (idfound) { + + myevents[j].Event.MonitorName = NVRDataModel.getMonitorName(myevents[j].Event.MonitorId); + + myevents[j].Event.streamingURL = NVRDataModel.getStreamingURL(myevents[j].Event.MonitorId); + myevents[j].Event.baseURL = NVRDataModel.getBaseURL(myevents[j].Event.MonitorId); + myevents[j].Event.imageMode = NVRDataModel.getImageMode(myevents[j].Event.MonitorId); + if (NVRDataModel.getLogin().url != myevents[j].Event.baseURL) { + + myevents[j].Event.baseURL = NVRDataModel.getLogin().url; + } - }, - function(err) + if (typeof myevents[j].Event.DefaultVideo === 'undefined') + // console.log (JSON.stringify(myevents[j])); + myevents[j].Event.DefaultVideo = ""; + + // now lets make sure we don't infinitely increase + + if (graphIndex >= curCount) + //if (1) { - NVRDataModel.debug("Error getting incremental timeline data"); - isProcessNewEventsWaiting = false; + var mv = graphData.min('id'); + //console.log("MIN="+JSON.stringify(mv)); + if (mv) { + graphData.remove(mv.id); + graphIndex--; + NVRDataModel.debug("Removed Event " + mv.id + " to make space"); + } - }); + } - // check all events that started 10+10 seconds ago + // since this is a new add its possible dates are not defined + if (!moment(myevents[j].Event.StartTime).isValid()) { + NVRDataModel.log("Event:" + myevents[j].Event.Id + "-Invalid Start time - this should really not happen "); - } + } - //------------------------------------------------- - // This function draws the graph - //------------------------------------------------- + if (!moment(myevents[j].Event.EndTime).isValid()) { + var t1 = moment().tz(NVRDataModel.getTimeZoneNow()); - function drawGraph(fromDate, toDate, count) - { + myevents[j].Event.EndTime = t1.format('YYYY-MM-DD HH:mm:ss'); - // console.log("INSIDE DRAW"); + NVRDataModel.debug("Event:" + myevents[j].Event.Id + "-End time is invalid, setting to current time"); - $scope.newEvents = ""; - // we only need this for day mode - $interval.cancel(updateInterval); + isBeingRecorded = true; - curFromDate = fromDate; - curToDate = toDate; - curCount = count; + } - var isFirstItem = true; + // if range doesn't allow for current time, we need to fix that + /*if (moment(options.max).isBefore(moment())) { + // console.log("Adjusting Range to fit in new event"); + options.max = moment().add('1', 'hours').locale('en').format("YYYY-MM-DD HH:mm:ss"); + timeline.setOptions(options); + }*/ - var fromDateNoLang = moment(fromDate).locale('en').format("YYYY-MM-DD HH:mm:ss"); - var toDateNoLang = moment(toDate).locale('en').format("YYYY-MM-DD HH:mm:ss"); + var eventText = "<span class='my-vis-font'>" + "( <i class='ion-android-notifications'></i>" + (myevents[j].Event.AlarmFrames || ' unknown ') + ") " + myevents[j].Event.Notes + "</span>"; - //latestDateDrawn =toDateNoLang; + if (isBeingRecorded) { + eventText = "<span class='my-vis-font'>" + "(" + myevents[j].Event.Id + ") " + myevents[j].Event.Notes + " " + $translate.instant('kRecordingProgress') + "</span>"; + } + + // since we concated, its possible events may be repeated + if (!graphData.get(myevents[j].Event.Id)) { + + localNewEvents = localNewEvents + NVRDataModel.getMonitorName(myevents[j].Event.MonitorId) + '@' + shortenTime(myevents[j].Event.StartTime) + ' (' + myevents[j].Event.Id + '),'; + + var tzs2, tze2; + if (NVRDataModel.getLogin().useLocalTimeZone) { + tzs2 = moment.tz(myevents[j].Event.StartTime, NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow()); + tze2 = moment.tz(myevents[j].Event.EndTime, NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow()); + } else { + tzs2 = moment.tz(myevents[j].Event.StartTime, NVRDataModel.getTimeZoneNow()); + tze2 = moment.tz(myevents[j].Event.EndTime, NVRDataModel.getTimeZoneNow()); + } + + //tzs2 = tzs2.format("YYYY-MM-DD HH:mm:ss"); + //tze2 = tze2.format("YYYY-MM-DD HH:mm:ss"); + + NVRDataModel.debug(">>> " + myevents[j].Event.Id + " New event updating graph " + " from:" + tzs2.format() + " to:" + tze2.format()); + + graphData.add({ + + id: myevents[j].Event.Id, + content: eventText, + start: tzs2, + //start: myevents[j].Event.StartTime, + // end: myevents[j].Event.EndTime, + end: tze2, + group: myevents[j].Event.MonitorId, + style: "background-color:orange", + //type: "range", + + myframes: myevents[j].Event.Frames, + mydur: myevents[j].Event.Length, + myeid: myevents[j].Event.Id, + myename: myevents[j].Event.Name, + myvideo: myevents[j].Event.DefaultVideo, + myevent: myevents[j] + + }); + graphIndex++; + //timeline.focus(myevents[j].Event.Id); + timeline.moveTo(timeline.getCurrentTime()); + } + + //options.max = moment(fromDate).locale('en').format("YYYY-MM-DD HH:mm:ss"); + + } //idfound + + } // new event + + } // for j + + // At this stage, see if we need to display new events + if (localNewEvents.length > 0) { + localNewEvents = $translate.instant('kLatestEvents') + ':' + localNewEvents; + localNewEvents = localNewEvents.slice(0, -1); + $scope.newEvents = localNewEvents; + } + isProcessNewEventsWaiting = false; + + }, + function (err) { + NVRDataModel.debug("Error getting incremental timeline data"); + isProcessNewEventsWaiting = false; - $ionicLoading.show( - { - template: $translate.instant('kLoadingGraph') + "...", - animation: 'fade-in', - showBackdrop: true, - maxWidth: 200, - showDelay: 0, - duration: zm.loadingTimeout, //specifically for Android - http seems to get stuck at times }); - NVRDataModel.log("TimelineCtrl/drawgraph: from->" + fromDateNoLang + " to->" + toDateNoLang + " count:" + count); - $scope.graphLoaded = false; - NVRDataModel.debug("TimelineCtrl/drawgraph: graphLoaded:" + $scope.graphLoaded); + // check all events that started 10+10 seconds ago - if (timeline) - { - NVRDataModel.debug("TimelineCtrl/drawgraph: destroying timeline as it exists"); - timeline.destroy(); - } + } + + //------------------------------------------------- + // This function draws the graph + //------------------------------------------------- + + function drawGraph(fromDate, toDate, count) { + + // console.log("INSIDE DRAW"); + + $scope.newEvents = ""; + // we only need this for day mode + $interval.cancel(updateInterval); + + curFromDate = fromDate; + curToDate = toDate; + curCount = count; + + var isFirstItem = true; + + var fromDateNoLang = moment(fromDate).locale('en').format("YYYY-MM-DD HH:mm:ss"); + var toDateNoLang = moment(toDate).locale('en').format("YYYY-MM-DD HH:mm:ss"); + + //latestDateDrawn =toDateNoLang; + + $ionicLoading.show({ + template: $translate.instant('kLoadingGraph') + "...", + animation: 'fade-in', + showBackdrop: true, + maxWidth: 200, + showDelay: 0, + duration: zm.loadingTimeout, //specifically for Android - http seems to get stuck at times + }); + + NVRDataModel.log("TimelineCtrl/drawgraph: from->" + fromDateNoLang + " to->" + toDateNoLang + " count:" + count); + $scope.graphLoaded = false; + NVRDataModel.debug("TimelineCtrl/drawgraph: graphLoaded:" + $scope.graphLoaded); + + if (timeline) { + NVRDataModel.debug("TimelineCtrl/drawgraph: destroying timeline as it exists"); + timeline.destroy(); + } - groups = new vis.DataSet(); - graphData = new vis.DataSet(); - //console.log ("AFTER VIS"); + groups = new vis.DataSet(); + graphData = new vis.DataSet(); + //console.log ("AFTER VIS"); - var tzs, tze; + var tzs, tze; - // lets scope the time graph to either local or remote time zone + // lets scope the time graph to either local or remote time zone + if (NVRDataModel.getLogin().useLocalTimeZone) { + tzs = moment.tz(fromDate, NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow()); + tze = moment.tz(toDate, NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow()); + } else { + tzs = moment.tz(fromDate, NVRDataModel.getTimeZoneNow()); + tze = moment.tz(toDate, NVRDataModel.getTimeZoneNow()); + } + + //tzs = tzs.format("YYYY-MM-DD HH:mm:ss"); + //tze = tze.format("YYYY-MM-DD HH:mm:ss"); + + options = { + + showCurrentTime: true, + editable: false, + moment: function (date) { + + //var t; if (NVRDataModel.getLogin().useLocalTimeZone) - { - tzs = moment.tz(fromDate, NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow()); - tze = moment.tz(toDate, NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow()); - } + //if (0) + return moment.tz(date, NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow()); else - { - tzs = moment.tz(fromDate, NVRDataModel.getTimeZoneNow()); - tze = moment.tz(toDate, NVRDataModel.getTimeZoneNow()); + // typecast to server time zone - its in server time anyway + return moment.tz(date, NVRDataModel.getTimeZoneNow()); + }, + //throttleRedraw: 100, + moveable: true, + zoomable: true, + selectable: true, + start: tzs, + end: tze, + orientation: 'top', + min: tzs, + //max: tze, + zoomMin: 5 * 60 * 1000, // 1 min + stack: false, + format: { + minorLabels: { + minute: NVRDataModel.getTimeFormat(), + hour: NVRDataModel.getTimeFormat(), + second: 's', + }, + majorLabels: { + second: "D MMM " + NVRDataModel.getTimeFormat(), } + }, - //tzs = tzs.format("YYYY-MM-DD HH:mm:ss"); - //tze = tze.format("YYYY-MM-DD HH:mm:ss"); + }; - options = { + graphIndex = 1; // will be used for graph ID - showCurrentTime: true, - editable: false, - moment: function(date) - { + //console.log ("**NOLANG" + fromDateNoLang + " " + toDateNoLang); - //var t; - if (NVRDataModel.getLogin().useLocalTimeZone) - //if (0) - return moment.tz(date, NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow()); - else - // typecast to server time zone - its in server time anyway - return moment.tz(date, NVRDataModel.getTimeZoneNow()); - }, - //throttleRedraw: 100, - moveable: true, - zoomable: true, - selectable: true, - start: tzs, - end: tze, - orientation: 'top', - min: tzs, - //max: tze, - zoomMin: 5 * 60 * 1000, // 1 min - stack: false, - format: - { - minorLabels: - { - minute: NVRDataModel.getTimeFormat(), - hour: NVRDataModel.getTimeFormat(), - second: 's', - }, - majorLabels: - { - second: "D MMM " + NVRDataModel.getTimeFormat(), - } - }, + NVRDataModel.getEventsPages(0, fromDateNoLang, toDateNoLang) + .then(function (data) { + var pages = data.pageCount || 1; + var itemsPerPage = parseInt(data.limit); + var iterCount; - }; + // So iterCount is the # of HTTP calls I need to make + iterCount = Math.max(Math.round(count / itemsPerPage), 1); + NVRDataModel.debug("TimelineCtrl/drawGraph: pages of data: " + pages + " items per page: " + itemsPerPage); + NVRDataModel.debug("TimelineCtrl/drawGraph: I will make " + iterCount + " HTTP Requests to get all graph data"); - graphIndex = 1; // will be used for graph ID + // I've restructured this part. I was initially using vis DataSets + // for dynamic binding which was easier, but due to performance reasons + // I am waiting for the full data to load before I draw + var promises = []; + while ((pages > 0) && (iterCount > 0)) { + var promise = NVRDataModel.getEvents(0, pages, "none", fromDateNoLang, toDateNoLang); + promises.push(promise); + pages--; + iterCount--; - //console.log ("**NOLANG" + fromDateNoLang + " " + toDateNoLang); + } - NVRDataModel.getEventsPages(0, fromDateNoLang, toDateNoLang) - .then(function(data) - { - var pages = data.pageCount || 1; - var itemsPerPage = parseInt(data.limit); - var iterCount; + $q.all(promises) + .then(function (data) { + NVRDataModel.debug("TimelineCtrl/drawgraph: all pages of graph data received"); + graphIndex = 0; + NVRDataModel.log("Creating " + $scope.monitors.length + " groups for the graph"); + // create groups + for (var g = 0; g < $scope.monitors.length; g++) { + groups.add({ + id: $scope.monitors[g].Monitor.Id, + //mid: $scope.monitors[g].Monitor.Id, + content: NVRDataModel.getMonitorName($scope.monitors[g].Monitor.Id), + order: $scope.monitors[g].Monitor.Sequence + }); + NVRDataModel.debug("TimelineCtrl/drawgraph:Adding group " + + NVRDataModel.getMonitorName($scope.monitors[g].Monitor.Id)); + } - // So iterCount is the # of HTTP calls I need to make - iterCount = Math.max(Math.round(count / itemsPerPage), 1); - NVRDataModel.debug("TimelineCtrl/drawGraph: pages of data: " + pages + " items per page: " + itemsPerPage); - NVRDataModel.debug("TimelineCtrl/drawGraph: I will make " + iterCount + " HTTP Requests to get all graph data"); + for (var j = 0; j < data.length; j++) { + var myevents = data[j]; - // I've restructured this part. I was initially using vis DataSets - // for dynamic binding which was easier, but due to performance reasons - // I am waiting for the full data to load before I draw - var promises = []; - while ((pages > 0) && (iterCount > 0)) - { - var promise = NVRDataModel.getEvents(0, pages, "none", fromDateNoLang, toDateNoLang); - promises.push(promise); - pages--; - iterCount--; + if (graphIndex > count) { + NVRDataModel.log("Exiting page count graph - reached limit of " + count); + break; } - $q.all(promises) - .then(function(data) - { - NVRDataModel.debug("TimelineCtrl/drawgraph: all pages of graph data received"); - graphIndex = 0; - NVRDataModel.log("Creating " + $scope.monitors.length + " groups for the graph"); - // create groups - for (var g = 0; g < $scope.monitors.length; g++) - { - groups.add( - { - id: $scope.monitors[g].Monitor.Id, - //mid: $scope.monitors[g].Monitor.Id, - content: NVRDataModel.getMonitorName($scope.monitors[g].Monitor.Id), - order: $scope.monitors[g].Monitor.Sequence - }); - NVRDataModel.debug("TimelineCtrl/drawgraph:Adding group " + - NVRDataModel.getMonitorName($scope.monitors[g].Monitor.Id)); - } - - for (var j = 0; j < data.length; j++) - { - var myevents = data[j]; - - if (graphIndex > count) - { - NVRDataModel.log("Exiting page count graph - reached limit of " + count); - break; - - } - - for (var i = 0; i < myevents.length; i++) - { - - // make sure group id exists before adding - var idfound = true; - var ld = NVRDataModel.getLogin(); - - if (ld.persistMontageOrder) - { - - idfound = false; - for (var ii = 0; ii < $scope.monitors.length; ii++) - { - if ($scope.monitors[ii].Monitor.Id == myevents[i].Event.MonitorId && NVRDataModel.isNotHidden(myevents[i].Event.MonitorId)) - { - idfound = true; - //console.log ("****************** ID MATCH " + graphIndex); - - break; - } - } - } - - myevents[i].Event.MonitorName = NVRDataModel.getMonitorName(myevents[i].Event.MonitorId); - // now construct base path - - myevents[i].Event.streamingURL = NVRDataModel.getStreamingURL(myevents[i].Event.MonitorId); - myevents[i].Event.baseURL = NVRDataModel.getBaseURL(myevents[i].Event.MonitorId); - myevents[i].Event.imageMode = NVRDataModel.getImageMode(myevents[i].Event.MonitorId); - if (NVRDataModel.getLogin().url != myevents[i].Event.baseURL) - { - //NVRDataModel.debug ("Multi server, changing base"); - myevents[i].Event.baseURL = NVRDataModel.getLogin().url; - - } - // console.log ("***** MULTISERVER STREAMING URL FOR EVENTS " + myevents[i].Event.streamingURL); - - // console.log ("***** MULTISERVER BASE URL FOR EVENTS " + myevents[i].Event.baseURL); - - if (idfound) - { - - if (typeof myevents[i].Event.DefaultVideo === 'undefined') - // console.log (JSON.stringify(myevents[i])); - myevents[i].Event.DefaultVideo = ""; - - //console.log ("ADDING "+myevents[i].Event.StartTime+"->"+myevents[i].Event.EndTime); - - var tzs, tze; - if (NVRDataModel.getLogin().useLocalTimeZone) - { - tzs = moment.tz(myevents[i].Event.StartTime, NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow()); - tze = moment.tz(myevents[i].Event.EndTime, NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow()); - } - else - { - tzs = moment.tz(myevents[i].Event.StartTime, NVRDataModel.getTimeZoneNow()); - tze = moment.tz(myevents[i].Event.EndTime, NVRDataModel.getTimeZoneNow()); - } - - //console.log ("ADDED "+tzs+" " +tze); - graphData.add( - { - //id: graphIndex, - id: myevents[i].Event.Id, - content: "<span class='my-vis-font'>" + "( <i class='ion-android-notifications'></i>" + myevents[i].Event.AlarmFrames + ") " + "(" + myevents[j].Event.Id + ") " + myevents[i].Event.Notes + "</span>", - - start: tzs, - //start: myevents[i].Event.StartTime, - //end: myevents[i].Event.EndTime, - end: tze, - group: myevents[i].Event.MonitorId, - //type: "range", - style: "background-color:" + colors[parseInt(myevents[i].Event.MonitorId) % colors.length] + - ";border-color:" + colors[parseInt(myevents[i].Event.MonitorId) % colors.length], - myframes: myevents[i].Event.Frames, - mydur: myevents[i].Event.Length, - myeid: myevents[i].Event.Id, - myename: myevents[i].Event.Name, - myvideo: myevents[i].Event.DefaultVideo, - myevent: myevents[i] - - }); - graphIndex++; - } - else - { - //console.log ("SKIPPED GRAPH ID " + graphIndex); - } - - if (graphIndex > count) - { - NVRDataModel.log("Exiting event graph - reached limit of " + count); - break; - - } - - } - } - - // console.log(">>>>> CREATING NEW TIMELINE with " + JSON.stringify(options)); - timeline = new vis.Timeline(container[0], null, options); - // console.log ("GRAPH DATA"); - timeline.setItems(graphData); - // console.log ("GROUPS"); - timeline.setGroups(groups); - - if (NVRDataModel.getLogin().timelineScale == -1) - - { - // console.log ("SCALE NOT FOUND"); - - timeline.fit(); - } - else - { - timeline.fit(); - - /*var d = NVRDataModel.getLogin().timelineScale; - console.log ("SCALE FOUND "+d+" SECONDS"); - var w = timeline.getWindow(); - console.log ("Original s="+w.start+" e="+w.end); - - - var s = moment.tz(w.end, NVRDataModel.getTimeZoneNow()).subtract(d,'seconds').tz(moment.tz.guess()); - - //var s = moment(w.start).format("YYYY-MM-DD HH:mm:ss"); - // - //var e = moment(w.start).add(d,'seconds').format("YYYY-MM-DD HH:mm:ss"); - - var e = moment.tz(w.end, NVRDataModel.getTimeZoneNow()).tz(moment.tz.guess()); - - console.log ("Start="+s+" End="+e); - $timeout (function() {timeline.setWindow(s,e);},1000);*/ - - } - - lastTimeForEvent = moment().tz(NVRDataModel.getLogin().useLocalTimeZone ? NVRDataModel.getLocalTimeZoneNow() : NVRDataModel.getTimeZoneNow()); - updateInterval = $interval(function() - { - processNewEvents(); - }.bind(this), 10 * 1000); - - $ionicLoading.hide(); - $scope.graphLoaded = true; - NVRDataModel.debug("graph loaded: " + $scope.graphLoaded); - $scope.navControls = false; - dblclick = false; - - // we don't really need this anymore - as we have an interval timer - // ticking away - - // this is called for each tick the bar moves - // speed moves depending on zoom factor - // - /* timeline.on('currentTimeTick', function() { - - if ($scope.follow.time) { - - } - - - });*/ - - timeline.on('rangechanged', function(s) - { - ///console.log ("Range Changed:"+JSON.stringify(s)); - if (s.byUser) - { - - var w = timeline.getWindow(); - //console.log ("start:"+w.start+" end:"+w.end); - var a = moment(w.start); - var b = moment(w.end); - var d = b.diff(a, 'seconds'); - var ld = NVRDataModel.getLogin(); - ld.timelineScale = d; - NVRDataModel.setLogin(ld); - //console.log ("Stored user scale of "+d+" seconds"); - } + for (var i = 0; i < myevents.length; i++) { - }); - - timeline.on('click', function(prop) - { - //console.log ("CLICK"); - if ($scope.onTap==$translate.instant('kTimelineGraph')) - timelineAnalyzeFrames(prop); - else - timelineShowEvent(prop); + // make sure group id exists before adding + var idfound = true; + var ld = NVRDataModel.getLogin(); + if (ld.persistMontageOrder) { - }); + idfound = false; + for (var ii = 0; ii < $scope.monitors.length; ii++) { + if ($scope.monitors[ii].Monitor.Id == myevents[i].Event.MonitorId && NVRDataModel.isNotHidden(myevents[i].Event.MonitorId)) { + idfound = true; + //console.log ("****************** ID MATCH " + graphIndex); - timeline.on('doubleClick', function(prop) - { - if ($scope.onDTap==$translate.instant('kTimelineGraph')) - timelineAnalyzeFrames(prop); - else - timelineShowEvent(prop); + break; + } + } + } - }); - }, - function(error) - { - NVRDataModel.displayBanner('error', 'Timeline error', 'Please try again'); + myevents[i].Event.MonitorName = NVRDataModel.getMonitorName(myevents[i].Event.MonitorId); + // now construct base path - } + myevents[i].Event.streamingURL = NVRDataModel.getStreamingURL(myevents[i].Event.MonitorId); + myevents[i].Event.baseURL = NVRDataModel.getBaseURL(myevents[i].Event.MonitorId); + myevents[i].Event.imageMode = NVRDataModel.getImageMode(myevents[i].Event.MonitorId); + if (NVRDataModel.getLogin().url != myevents[i].Event.baseURL) { + //NVRDataModel.debug ("Multi server, changing base"); + myevents[i].Event.baseURL = NVRDataModel.getLogin().url; - ); // get Events - }); - } + } + // console.log ("***** MULTISERVER STREAMING URL FOR EVENTS " + myevents[i].Event.streamingURL); - function timelineShowEvent(prop) { - $timeout(function() - { - if (dblclick) - { - //console.log ("IGNORING CLICK AS DBL CLICK"); - $timeout(function() - { - dblclick = false; - }, 400); - return; - } - //console.log ("CLICK"); - //console.log ("I GOT " + JSON.stringify(prop)); - // console.log ("EVENT IS " + JSON.stringify(properties.event)); - //var properties = timeline.getEventProperties(prop); - // console.log ( "I GOT " + properties); - var itm = prop.item; - //console.log ("ITEM CLICKED " + itm); - if (itm && !isNaN(itm)) - { - NVRDataModel.debug("TimelineCtrl/drawGraph:You clicked on item " + itm); - var item = graphData.get(itm); - NVRDataModel.debug("TimelineCtrl/drawGraph: clicked item details:" + JSON.stringify(item)); - showEvent(item.myevent); + // console.log ("***** MULTISERVER BASE URL FOR EVENTS " + myevents[i].Event.baseURL); - } - else - { - NVRDataModel.debug("exact match not found, guessing item with co-ordinates X=" + prop.x + " group=" + prop.group); - if (prop.group) - { - var visible = timeline.getVisibleItems(); - NVRDataModel.debug("Visible items=" + JSON.stringify(visible)); - var closestItem = null; - var minDist = 99999; - var _item; - for (var x = 0; x < visible.length; x++) - { - _item = timeline.itemSet.items[x]; - if (_item.data.group == prop.group) - { - if (Math.abs(_item.left - prop.x) < minDist) - { - closestItem = _item; - minDist = Math.abs(_item.left - prop.x); - NVRDataModel.debug("Temporary closest " + _item.left); - //console.log (_item); - } - } + if (idfound) { - } + if (typeof myevents[i].Event.DefaultVideo === 'undefined') + // console.log (JSON.stringify(myevents[i])); + myevents[i].Event.DefaultVideo = ""; - if (closestItem != null) - { - NVRDataModel.log("Closest item " + closestItem.left + " group: " + closestItem.data.group); - showEvent(closestItem.data.myevent); - } - else - { - NVRDataModel.log("Did not find a visible item match"); + //console.log ("ADDING "+myevents[i].Event.StartTime+"->"+myevents[i].Event.EndTime); + + var tzs, tze; + if (NVRDataModel.getLogin().useLocalTimeZone) { + tzs = moment.tz(myevents[i].Event.StartTime, NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow()); + tze = moment.tz(myevents[i].Event.EndTime, NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow()); + } else { + tzs = moment.tz(myevents[i].Event.StartTime, NVRDataModel.getTimeZoneNow()); + tze = moment.tz(myevents[i].Event.EndTime, NVRDataModel.getTimeZoneNow()); } - } - else // no group row tapped, do nothing - { - /*$ionicLoading.show({ - template: "", - animation: 'fade-in', - showBackdrop: true, - maxWidth: 200, - showDelay: 0, - duration: 1500, - });*/ + //console.log ("ADDED "+tzs+" " +tze); + graphData.add({ + //id: graphIndex, + id: myevents[i].Event.Id, + content: "<span class='my-vis-font'>" + "( <i class='ion-android-notifications'></i>" + myevents[i].Event.AlarmFrames + ") " + "(" + myevents[j].Event.Id + ") " + myevents[i].Event.Notes + "</span>", + + start: tzs, + //start: myevents[i].Event.StartTime, + //end: myevents[i].Event.EndTime, + end: tze, + group: myevents[i].Event.MonitorId, + //type: "range", + style: "background-color:" + colors[parseInt(myevents[i].Event.MonitorId) % colors.length] + + ";border-color:" + colors[parseInt(myevents[i].Event.MonitorId) % colors.length], + myframes: myevents[i].Event.Frames, + mydur: myevents[i].Event.Length, + myeid: myevents[i].Event.Id, + myename: myevents[i].Event.Name, + myvideo: myevents[i].Event.DefaultVideo, + myevent: myevents[i] + + }); + graphIndex++; + } else { + //console.log ("SKIPPED GRAPH ID " + graphIndex); + } + + if (graphIndex > count) { + NVRDataModel.log("Exiting event graph - reached limit of " + count); + break; + + } + } - // console.log("Zoomed out too far to playback events"); - } - }, 400); - } + } - function timelineAnalyzeFrames(prop) { - // console.log ("DOUBLE"); - dblclick = true; - var itm = prop.item; - //console.log ("ITEM CLICKED " + itm); - if (itm && !isNaN(itm)) - { - NVRDataModel.debug("TimelineCtrl/drawGraph:You clicked on item " + itm); - var item = graphData.get(itm); - NVRDataModel.debug("TimelineCtrl/drawGraph: clicked item details:" + JSON.stringify(item)); - eventDetails(item.myevent); + // console.log(">>>>> CREATING NEW TIMELINE with " + JSON.stringify(options)); + timeline = new vis.Timeline(container[0], null, options); + // console.log ("GRAPH DATA"); + timeline.setItems(graphData); + // console.log ("GROUPS"); + timeline.setGroups(groups); - } - else - { + if (NVRDataModel.getLogin().timelineScale == -1) - NVRDataModel.debug("exact match not found, guessing item with co-ordinates X=" + prop.x + " group=" + prop.group); - if (prop.group) - { - var visible = timeline.getVisibleItems(); - NVRDataModel.debug("Visible items=" + JSON.stringify(visible)); - var closestItem = null; - var minDist = 99999; - var _item; - for (var x = 0; x < visible.length; x++) - { - _item = timeline.itemSet.items[x]; - if (_item.data.group == prop.group) - { - if (Math.abs(_item.left - prop.x) < minDist) - { - closestItem = _item; - minDist = Math.abs(_item.left - prop.x); - NVRDataModel.debug("Temporary closest " + _item.left); - //console.log (_item); - } - } + { + // console.log ("SCALE NOT FOUND"); + timeline.fit(); + } else { + timeline.fit(); + + /*var d = NVRDataModel.getLogin().timelineScale; + console.log ("SCALE FOUND "+d+" SECONDS"); + var w = timeline.getWindow(); + console.log ("Original s="+w.start+" e="+w.end); + + + var s = moment.tz(w.end, NVRDataModel.getTimeZoneNow()).subtract(d,'seconds').tz(moment.tz.guess()); + + //var s = moment(w.start).format("YYYY-MM-DD HH:mm:ss"); + // + //var e = moment(w.start).add(d,'seconds').format("YYYY-MM-DD HH:mm:ss"); + + var e = moment.tz(w.end, NVRDataModel.getTimeZoneNow()).tz(moment.tz.guess()); + + console.log ("Start="+s+" End="+e); + $timeout (function() {timeline.setWindow(s,e);},1000);*/ + + } + + lastTimeForEvent = moment().tz(NVRDataModel.getLogin().useLocalTimeZone ? NVRDataModel.getLocalTimeZoneNow() : NVRDataModel.getTimeZoneNow()); + updateInterval = $interval(function () { + processNewEvents(); + }.bind(this), 10 * 1000); + + $ionicLoading.hide(); + $scope.graphLoaded = true; + NVRDataModel.debug("graph loaded: " + $scope.graphLoaded); + $scope.navControls = false; + dblclick = false; + + // we don't really need this anymore - as we have an interval timer + // ticking away + + // this is called for each tick the bar moves + // speed moves depending on zoom factor + // + /* timeline.on('currentTimeTick', function() { + + if ($scope.follow.time) { + + } + + + });*/ + + timeline.on('rangechanged', function (s) { + ///console.log ("Range Changed:"+JSON.stringify(s)); + if (s.byUser) { + + var w = timeline.getWindow(); + //console.log ("start:"+w.start+" end:"+w.end); + var a = moment(w.start); + var b = moment(w.end); + var d = b.diff(a, 'seconds'); + var ld = NVRDataModel.getLogin(); + ld.timelineScale = d; + NVRDataModel.setLogin(ld); + //console.log ("Stored user scale of "+d+" seconds"); } - NVRDataModel.log("Closest item " + closestItem.left + " group: " + closestItem.data.group); - if (closestItem != null) - { - NVRDataModel.log("Closest item " + closestItem.left + " group: " + closestItem.data.group); - showEvent(closestItem.data.myevent); - } + + }); + + timeline.on('click', function (prop) { + //console.log ("CLICK"); + if ($scope.onTap == $translate.instant('kTimelineGraph')) + timelineAnalyzeFrames(prop); else - { - NVRDataModel.log("Did not find a visible item match"); - } + timelineShowEvent(prop); + + + }); + + timeline.on('doubleClick', function (prop) { + if ($scope.onDTap == $translate.instant('kTimelineGraph')) + timelineAnalyzeFrames(prop); + else + timelineShowEvent(prop); + + }); + }, + function (error) { + NVRDataModel.displayBanner('error', 'Timeline error', 'Please try again'); + } - // console.log("Zoomed out too far to playback events"); - } - } + ); // get Events + }); + } - $scope.radialMenuOptions = { - content: '', - //size: 'small', + function timelineShowEvent(prop) { + $timeout(function () { + if (dblclick) { + //console.log ("IGNORING CLICK AS DBL CLICK"); + $timeout(function () { + dblclick = false; + }, 400); + return; + } + //console.log ("CLICK"); + //console.log ("I GOT " + JSON.stringify(prop)); + // console.log ("EVENT IS " + JSON.stringify(properties.event)); + //var properties = timeline.getEventProperties(prop); + // console.log ( "I GOT " + properties); + var itm = prop.item; + //console.log ("ITEM CLICKED " + itm); + if (itm && !isNaN(itm)) { + NVRDataModel.debug("TimelineCtrl/drawGraph:You clicked on item " + itm); + var item = graphData.get(itm); + NVRDataModel.debug("TimelineCtrl/drawGraph: clicked item details:" + JSON.stringify(item)); + showEvent(item.myevent); + + } else { + NVRDataModel.debug("exact match not found, guessing item with co-ordinates X=" + prop.x + " group=" + prop.group); + if (prop.group) { + var visible = timeline.getVisibleItems(); + NVRDataModel.debug("Visible items=" + JSON.stringify(visible)); + var closestItem = null; + var minDist = 99999; + var _item; + for (var x = 0; x < visible.length; x++) { + _item = timeline.itemSet.items[x]; + if (_item.data.group == prop.group) { + if (Math.abs(_item.left - prop.x) < minDist) { + closestItem = _item; + minDist = Math.abs(_item.left - prop.x); + NVRDataModel.debug("Temporary closest " + _item.left); + //console.log (_item); + } + } + + } - background: '#982112', - isOpen: true, - toggleOnClick: false, - button: + if (closestItem != null) { + NVRDataModel.log("Closest item " + closestItem.left + " group: " + closestItem.data.group); + showEvent(closestItem.data.myevent); + } else { + NVRDataModel.log("Did not find a visible item match"); + } + } else // no group row tapped, do nothing { - cssClass: 'fa fa-compress fa-2x', - size: 'small', - onclick: function() - { - //console.log("fitting"); - timeline.fit(); + + /*$ionicLoading.show({ + template: "", + animation: 'fade-in', + showBackdrop: true, + maxWidth: 200, + showDelay: 0, + duration: 1500, + });*/ + } + // console.log("Zoomed out too far to playback events"); + } + }, 400); + } + + function timelineAnalyzeFrames(prop) { + // console.log ("DOUBLE"); + dblclick = true; + var itm = prop.item; + //console.log ("ITEM CLICKED " + itm); + if (itm && !isNaN(itm)) { + NVRDataModel.debug("TimelineCtrl/drawGraph:You clicked on item " + itm); + var item = graphData.get(itm); + NVRDataModel.debug("TimelineCtrl/drawGraph: clicked item details:" + JSON.stringify(item)); + eventDetails(item.myevent); + + } else { + + NVRDataModel.debug("exact match not found, guessing item with co-ordinates X=" + prop.x + " group=" + prop.group); + if (prop.group) { + var visible = timeline.getVisibleItems(); + NVRDataModel.debug("Visible items=" + JSON.stringify(visible)); + var closestItem = null; + var minDist = 99999; + var _item; + for (var x = 0; x < visible.length; x++) { + _item = timeline.itemSet.items[x]; + if (_item.data.group == prop.group) { + if (Math.abs(_item.left - prop.x) < minDist) { + closestItem = _item; + minDist = Math.abs(_item.left - prop.x); + NVRDataModel.debug("Temporary closest " + _item.left); + //console.log (_item); } - }, - items: [ - { - content: '', - cssClass: 'fa fa-minus-circle', - empty: false, - onclick: function() - { - //zoom(0.2); - timeline.zoomOut(0.2); - } - }, + } - { - content: '', - cssClass: 'fa fa-chevron-circle-up', - empty: true, - onclick: function() { + } + NVRDataModel.log("Closest item " + closestItem.left + " group: " + closestItem.data.group); + if (closestItem != null) { + NVRDataModel.log("Closest item " + closestItem.left + " group: " + closestItem.data.group); + showEvent(closestItem.data.myevent); + } else { + NVRDataModel.log("Did not find a visible item match"); + } + } - } - }, + // console.log("Zoomed out too far to playback events"); + } + } + + $scope.radialMenuOptions = { + content: '', + //size: 'small', + + background: '#982112', + isOpen: true, + toggleOnClick: false, + button: { + cssClass: 'fa fa-compress fa-2x', + size: 'small', + onclick: function () { + //console.log("fitting"); + timeline.fit(); + } + }, + items: [{ + content: '', + cssClass: 'fa fa-minus-circle', + empty: false, + onclick: function () { + //zoom(0.2); + timeline.zoomOut(0.2); + } + }, - { - content: '', - cssClass: 'fa fa-chevron-circle-up', - empty: false, + { + content: '', + cssClass: 'fa fa-chevron-circle-up', + empty: true, + onclick: function () { - onclick: function() - { + } + }, - move(0.2); - } - }, - { - content: 'D', - empty: true, + { + content: '', + cssClass: 'fa fa-chevron-circle-up', + empty: false, - onclick: function() - { - // console.log('About'); - } - }, + onclick: function () { - { - content: '', - cssClass: 'fa fa-chevron-circle-up', - empty: true, - onclick: function() { + move(0.2); + } + }, + { + content: 'D', + empty: true, - } - }, + onclick: function () { + // console.log('About'); + } + }, - { - content: '', - cssClass: 'fa fa-plus-circle', - empty: false, - onclick: function() - { + { + content: '', + cssClass: 'fa fa-chevron-circle-up', + empty: true, + onclick: function () { - //zoom(-0.2); - timeline.zoomIn(0.2); - } - }, + } + }, - { - content: '', - cssClass: 'fa fa-chevron-circle-up', - empty: true, - onclick: function() { + { + content: '', + cssClass: 'fa fa-plus-circle', + empty: false, + onclick: function () { - } - }, + //zoom(-0.2); + timeline.zoomIn(0.2); + } + }, - { - content: 'H', - empty: true, - onclick: function() - { - // console.log('About'); - } - }, + { + content: '', + cssClass: 'fa fa-chevron-circle-up', + empty: true, + onclick: function () { - { - content: '', - cssClass: 'fa fa-chevron-circle-up', - empty: false, - onclick: function() - { - move(-0.2); - } - }, + } + }, - { - content: '', - cssClass: 'fa fa-chevron-circle-up', - empty: true, - onclick: function() { + { + content: 'H', + empty: true, + onclick: function () { + // console.log('About'); + } + }, - } - }, + { + content: '', + cssClass: 'fa fa-chevron-circle-up', + empty: false, + onclick: function () { + move(-0.2); + } + }, - { - content: 'K', - empty: true, - onclick: function() - { - //console.log('About'); - } - }, - ] - }; + { + content: '', + cssClass: 'fa fa-chevron-circle-up', + empty: true, + onclick: function () { + + } + }, + + { + content: 'K', + empty: true, + onclick: function () { + //console.log('About'); + } + }, + ] + }; }]); diff --git a/www/js/TimelineModalCtrl.js b/www/js/TimelineModalCtrl.js index fb1e480f..238d271a 100644 --- a/www/js/TimelineModalCtrl.js +++ b/www/js/TimelineModalCtrl.js @@ -3,504 +3,451 @@ /* jslint browser: true*/ /* global saveAs, cordova,StatusBar,angular,console,ionic, moment, vis , Chart, DJS*/ -angular.module('zmApp.controllers').controller('TimelineModalCtrl', ['$scope', '$rootScope', 'zm', 'NVRDataModel', '$ionicSideMenuDelegate', '$timeout', '$interval', '$ionicModal', '$ionicLoading', '$http', '$state', '$stateParams', '$ionicHistory', '$ionicScrollDelegate', '$q', '$sce', 'carouselUtils', '$ionicPopup', '$translate', function($scope, $rootScope, zm, NVRDataModel, $ionicSideMenuDelegate, $timeout, $interval, $ionicModal, $ionicLoading, $http, $state, $stateParams, $ionicHistory, $ionicScrollDelegate, $q, $sce, carouselUtils, $ionicPopup, $translate) -{ - - var Graph2d; - var tcGraph; - var items; - var groups; - var eventImageDigits = 5; - var cv; - var ctx; - var options; - var data; - var onlyalarm_data; - var current_data; - var current_options; - var btype; - - $scope.graphType = NVRDataModel.getLogin().timelineModalGraphType; - //$scope.graphType = "all"; - $scope.errorDetails = ""; - - //---------------------------------------------------------------- - // Alarm notification handling - //---------------------------------------------------------------- - $scope.handleAlarms = function() - { - $rootScope.isAlarm = !$rootScope.isAlarm; - if (!$rootScope.isAlarm) - { - $rootScope.alarmCount = "0"; - $ionicHistory.nextViewOptions( - { - disableBack: true - }); - $state.go("app.events", - { - "id": 0, - "playEvent": false - }, - { - reload: true - }); - return; - } - }; +angular.module('zmApp.controllers').controller('TimelineModalCtrl', ['$scope', '$rootScope', 'zm', 'NVRDataModel', '$ionicSideMenuDelegate', '$timeout', '$interval', '$ionicModal', '$ionicLoading', '$http', '$state', '$stateParams', '$ionicHistory', '$ionicScrollDelegate', '$q', '$sce', 'carouselUtils', '$ionicPopup', '$translate', function ($scope, $rootScope, zm, NVRDataModel, $ionicSideMenuDelegate, $timeout, $interval, $ionicModal, $ionicLoading, $http, $state, $stateParams, $ionicHistory, $ionicScrollDelegate, $q, $sce, carouselUtils, $ionicPopup, $translate) { + + var Graph2d; + var tcGraph; + var items; + var groups; + var eventImageDigits = 5; + var cv; + var ctx; + var options; + var data; + var onlyalarm_data; + var current_data; + var current_options; + var btype; + + $scope.graphType = NVRDataModel.getLogin().timelineModalGraphType; + //$scope.graphType = "all"; + $scope.errorDetails = ""; + + //---------------------------------------------------------------- + // Alarm notification handling + //---------------------------------------------------------------- + $scope.handleAlarms = function () { + $rootScope.isAlarm = !$rootScope.isAlarm; + if (!$rootScope.isAlarm) { + $rootScope.alarmCount = "0"; + $ionicHistory.nextViewOptions({ + disableBack: true + }); + $state.go("app.events", { + "id": 0, + "playEvent": false + }, { + reload: true + }); + return; + } + }; - $scope.constructFrames = function (event,alarm) { + $scope.constructFrames = function (event, alarm) { - var stream = ""; - if (event.Event.imageMode=='path') { - stream = event.Event.baseURL + "/index.php?view=image" + - "&path="+event.Event.relativePath+alarm.fname + - "&height=380"; - } - else if (event.Event.imageMode == 'fid') { - stream = event.Event.baseURL + "/index.php?view=image" + - "&fid="+alarm.id; + var stream = ""; + if (event.Event.imageMode == 'path') { + stream = event.Event.baseURL + "/index.php?view=image" + + "&path=" + event.Event.relativePath + alarm.fname + + "&height=380"; + } else if (event.Event.imageMode == 'fid') { + stream = event.Event.baseURL + "/index.php?view=image" + + "&fid=" + alarm.id; - } - if ($rootScope.authSession !='undefined') stream+=$rootScope.authSession; + } + if ($rootScope.authSession != 'undefined') stream += $rootScope.authSession; - stream+= NVRDataModel.insertBasicAuthToken(); - return stream; - }; + stream += NVRDataModel.insertBasicAuthToken(); + return stream; + }; - //------------------------------------------------------- - // we use this to reload the connkey if authkey changed - //------------------------------------------------------ + //------------------------------------------------------- + // we use this to reload the connkey if authkey changed + //------------------------------------------------------ - - $scope.scrollUp = function() - { - //console.log ("SWIPE UP"); - $ionicScrollDelegate.$getByHandle("timeline-modal-delegate").scrollTop(true); - }; - $scope.scrollDown = function() - { - //console.log ("SWIPE DOWN"); - $ionicScrollDelegate.$getByHandle("timeline-modal-delegate").scrollBottom(true); - }; + $scope.scrollUp = function () { + //console.log ("SWIPE UP"); + $ionicScrollDelegate.$getByHandle("timeline-modal-delegate").scrollTop(true); + }; - $scope.switchType = function() - { + $scope.scrollDown = function () { + //console.log ("SWIPE DOWN"); + $ionicScrollDelegate.$getByHandle("timeline-modal-delegate").scrollBottom(true); + }; - if ($scope.graphType == $translate.instant('kGraphAll')) - { - current_data = onlyalarm_data; - $scope.graphType = $translate.instant('kGraphAlarmed'); - NVRDataModel.debug("Alarm array has " + onlyalarm_data.labels.length + " frames"); - btype = 'bar'; - //console.log (JSON.stringify(onlyalarm_data)); + $scope.switchType = function () { - } - else - { - current_data = data; - // tcGraph.data = - $scope.graphType = $translate.instant('kGraphAll'); - btype = 'line'; - } + if ($scope.graphType == $translate.instant('kGraphAll')) { + current_data = onlyalarm_data; + $scope.graphType = $translate.instant('kGraphAlarmed'); + NVRDataModel.debug("Alarm array has " + onlyalarm_data.labels.length + " frames"); + btype = 'bar'; + //console.log (JSON.stringify(onlyalarm_data)); - NVRDataModel.log("Switching graph type to " + $scope.graphType); - - var ld = NVRDataModel.getLogin(); - ld.timelineModalGraphType = $scope.graphType; - NVRDataModel.setLogin(ld); - - $timeout(function() - { - - /* - if ($scope.graphType == 'alarmed') - tcGraph.data = data; - else - tcGraph.data = onlyalarm_data; - tcGraph.update();*/ - tcGraph.destroy(); - // console.log("GRAPH TYPE IS " + btype); - tcGraph = new Chart(ctx, - { - type: btype, - data: current_data, - options: options - }); - }); + } else { + current_data = data; + // tcGraph.data = + $scope.graphType = $translate.instant('kGraphAll'); + btype = 'line'; + } - }; + NVRDataModel.log("Switching graph type to " + $scope.graphType); + + var ld = NVRDataModel.getLogin(); + ld.timelineModalGraphType = $scope.graphType; + NVRDataModel.setLogin(ld); + + $timeout(function () { + + /* + if ($scope.graphType == 'alarmed') + tcGraph.data = data; + else + tcGraph.data = onlyalarm_data; + tcGraph.update();*/ + tcGraph.destroy(); + // console.log("GRAPH TYPE IS " + btype); + tcGraph = new Chart(ctx, { + type: btype, + data: current_data, + options: options + }); + }); - //------------------------------------------------------- - // Tapping on a frame shows this image - //------------------------------------------------------ - - $scope.showImage = function(p, r, f, fid, e, imode, id) - { - var img; - //console.log("Image Mode " + imode); - if (imode == 'path') - - img = "<img width='100%' ng-src='" + p + "/index.php?view=image&path=" + r + f + "'>"; - else - { - img = "<img width='100%' ng-src='" + p + "/index.php?view=image&fid=" + id + "'>"; - // console.log ("IS MULTISERVER SO IMAGE IS " + img); - } - $rootScope.zmPopup = $ionicPopup.alert( - { - title: 'frame:' + fid + '/Event:' + e, - template: img, - cssClass: 'popup95', - okText: $translate.instant('kButtonOk'), - cancelText: $translate.instant('kButtonCancel'), - }); - }; + }; - $scope.$on('modal.removed', function(e, m) - { + //------------------------------------------------------- + // Tapping on a frame shows this image + //------------------------------------------------------ - if (m.id != 'analyze') - return; - //Graph2d.destroy(); - tcGraph.destroy(); - // Execute action - }); + $scope.showImage = function (p, r, f, fid, e, imode, id) { + var img; + //console.log("Image Mode " + imode); + if (imode == 'path') - //------------------------------------------------------- - // init drawing here - //------------------------------------------------------ - - $scope.$on('modal.shown', function(e, m) - { - - if (m.id != 'analyze') - return; - - $scope.alarm_images = []; - $scope.graphWidth = $rootScope.devWidth - 30; - NVRDataModel.log("Setting init graph width to " + $scope.graphWidth); - $scope.dataReady = false; - - NVRDataModel.getKeyConfigParams(0) - .then(function(data) - { - //console.log ("***GETKEY: " + JSON.stringify(data)); - eventImageDigits = parseInt(data); - NVRDataModel.log("Image padding digits reported as " + eventImageDigits); - }); - - $scope.eventdetails = $translate.instant('kLoading') + "..."; - $scope.mName = NVRDataModel.getMonitorName($scope.event.Event.MonitorId); - $scope.humanizeTime = humanizeTime($scope.event.Event.StartTime); - processEvent(); - //$scope.eventdetails = JSON.stringify($scope.event); + img = "<img width='100%' ng-src='" + p + "/index.php?view=image&path=" + r + f + "'>"; + else { + img = "<img width='100%' ng-src='" + p + "/index.php?view=image&fid=" + id + "'>"; + // console.log ("IS MULTISERVER SO IMAGE IS " + img); + } + $rootScope.zmPopup = $ionicPopup.alert({ + title: 'frame:' + fid + '/Event:' + e, + template: img, + cssClass: 'popup95', + okText: $translate.instant('kButtonOk'), + cancelText: $translate.instant('kButtonCancel'), }); + }; + + $scope.$on('modal.removed', function (e, m) { + + if (m.id != 'analyze') + return; + //Graph2d.destroy(); + tcGraph.destroy(); + // Execute action + }); + + //------------------------------------------------------- + // init drawing here + //------------------------------------------------------ + + $scope.$on('modal.shown', function (e, m) { + + if (m.id != 'analyze') + return; + + $scope.alarm_images = []; + $scope.graphWidth = $rootScope.devWidth - 30; + NVRDataModel.log("Setting init graph width to " + $scope.graphWidth); + $scope.dataReady = false; + + NVRDataModel.getKeyConfigParams(0) + .then(function (data) { + //console.log ("***GETKEY: " + JSON.stringify(data)); + eventImageDigits = parseInt(data); + NVRDataModel.log("Image padding digits reported as " + eventImageDigits); + }); + + $scope.eventdetails = $translate.instant('kLoading') + "..."; + $scope.mName = NVRDataModel.getMonitorName($scope.event.Event.MonitorId); + $scope.humanizeTime = humanizeTime($scope.event.Event.StartTime); + processEvent(); + //$scope.eventdetails = JSON.stringify($scope.event); + }); + + //------------------------------------------------------- + // okay, really init drawing here + //------------------------------------------------------ + + function processEvent() { + var eid = $scope.event.Event.Id; + //eid = 22302; + var ld = NVRDataModel.getLogin(); + var apiurl = ld.apiurl + "/events/" + eid + ".json"; + NVRDataModel.log("Getting " + apiurl); + $http.get(apiurl) + .then(function (success) { + //$scope.eventdetails = JSON.stringify(success); + drawGraphTC(success.data); + }, + function (error) { + $scope.errorDetails = $translate.instant('kGraphError'); + NVRDataModel.log("Error in timeline frames " + JSON.stringify(error)); + }); + } - //------------------------------------------------------- - // okay, really init drawing here - //------------------------------------------------------ - - function processEvent() - { - var eid = $scope.event.Event.Id; - //eid = 22302; - var ld = NVRDataModel.getLogin(); - var apiurl = ld.apiurl + "/events/" + eid + ".json"; - NVRDataModel.log("Getting " + apiurl); - $http.get(apiurl) - .then(function(success) - { - //$scope.eventdetails = JSON.stringify(success); - drawGraphTC(success.data); - }, - function(error) - { - $scope.errorDetails = $translate.instant('kGraphError'); - NVRDataModel.log("Error in timeline frames " + JSON.stringify(error)); - }); - } + //------------------------------------------------------- + // I was kidding, this is where it really is drawn + // scout's promise + //------------------------------------------------------ - //------------------------------------------------------- - // I was kidding, this is where it really is drawn - // scout's promise - //------------------------------------------------------ - - function drawGraphTC(event) - { - - $scope.eid = event.event.Event.Id; - - $scope.alarm_images = []; - - data = { - labels: [], - datasets: [ - { - label: 'Score', - fill: true, - backgroundColor: 'rgba(89, 171, 227, 1.0)', - borderColor: 'rgba(52, 152, 219, 1.0)', - borderCapStyle: 'butt', - borderJoinStyle: 'miter', - pointBorderColor: "#e74c3c", - pointBackgroundColor: "#e74c3c", - - pointHoverRadius: 10, - pointHoverBackgroundColor: "rgba(249, 105, 14,1.0)", - pointHoverBorderWidth: 1, - tension: 0.1, - - data: [], - frames: [] - }, - - ] - }; - - onlyalarm_data = { - labels: [], - datasets: [ - { - label: 'Score', - backgroundColor: 'rgba(52, 152, 219, 1.0)', - borderColor: 'rgba(52, 152, 219, 1.0)', - hoverBackgroundColor: 'rgba(249, 105, 14,1.0)', - hoverBorderColor: 'rgba(249, 105, 14,1.0)', - data: [], - frames: [] - }, - - ] - }; - - // Chart.js Options - options = { - legend: false, - scales: - { - yAxes: [ - { - ticks: - { - // beginAtZero:true, - min: -1, - }, - }], - xAxes: [ - { - display: false - }] - }, - - responsive: true, - scaleBeginAtZero: true, - scaleShowGridLines: true, - scaleGridLineColor: "rgba(0,0,0,.05)", - scaleGridLineWidth: 1, - - hover: - { - mode: 'single', - onHover: function(obj) - { - if (obj.length > 0) - tapOrHover(obj[0]._index); - } - }, - - //String - A legend template - legendTemplate: '<ul class="tc-chart-js-legend"><% for (var i=0; i<datasets.length; i++){%><li><span style="background-color:<%=datasets[i].fillColor%>"></span><%if(datasets[i].label){%><%=datasets[i].label%><%}%></li><%}%></ul>' - }; - - $scope.graphWidth = event.event.Frame.length * 10; - if ($scope.graphWidth < $rootScope.devWidth) - $scope.graphWidth = $rootScope.devWidth; - - // NVRDataModel.log ("Changing graph width to " + $scope.graphWidth); - - for (var i = 0; i < event.event.Frame.length; i++) - { - - data.labels.push(event.event.Frame[i].TimeStamp); - //data.labels.push(' '); - data.datasets[0].data.push(event.event.Frame[i].Score); - data.datasets[0].frames.push( - { - x: event.event.Frame[i].TimeStamp, - y: event.event.Frame[i].Score, - eid: event.event.Event.Id, - fid: event.event.Frame[i].FrameId, - id: event.event.Frame[i].Id, - //group:i, - relativePath: computeRelativePath(event.event), - score: event.event.Frame[i].Score, - fname: padToN(event.event.Frame[i].FrameId, eventImageDigits) + "-capture.jpg", - - }); - - if (event.event.Frame[i].Type == "Alarm") - { - - onlyalarm_data.labels.push(event.event.Frame[i].TimeStamp); - //data.labels.push(' '); - onlyalarm_data.datasets[0].data.push(event.event.Frame[i].Score); - onlyalarm_data.datasets[0].frames.push( - { - x: event.event.Frame[i].TimeStamp, - y: event.event.Frame[i].Score, - eid: event.event.Event.Id, - fid: event.event.Frame[i].FrameId, - //group:i, - relativePath: computeRelativePath(event.event), - score: event.event.Frame[i].Score, - fname: padToN(event.event.Frame[i].FrameId, eventImageDigits) + "-capture.jpg", - id: event.event.Frame[i].Id, - - }); - } + function drawGraphTC(event) { - } + $scope.eid = event.event.Event.Id; - $scope.dataReady = true; + $scope.alarm_images = []; - cv = document.getElementById("tcchart"); - ctx = cv.getContext("2d"); + data = { + labels: [], + datasets: [{ + label: 'Score', + fill: true, + backgroundColor: 'rgba(89, 171, 227, 1.0)', + borderColor: 'rgba(52, 152, 219, 1.0)', + borderCapStyle: 'butt', + borderJoinStyle: 'miter', + pointBorderColor: "#e74c3c", + pointBackgroundColor: "#e74c3c", - if (NVRDataModel.getLogin().timelineModalGraphType == $translate.instant('kGraphAll')) - { - btype = 'line'; - current_data = data; - } - else - { - btype = 'bar'; - current_data = onlyalarm_data; + pointHoverRadius: 10, + pointHoverBackgroundColor: "rgba(249, 105, 14,1.0)", + pointHoverBorderWidth: 1, + tension: 0.1, + + data: [], + frames: [] + }, + + ] + }; + + onlyalarm_data = { + labels: [], + datasets: [{ + label: 'Score', + backgroundColor: 'rgba(52, 152, 219, 1.0)', + borderColor: 'rgba(52, 152, 219, 1.0)', + hoverBackgroundColor: 'rgba(249, 105, 14,1.0)', + hoverBorderColor: 'rgba(249, 105, 14,1.0)', + data: [], + frames: [] + }, + + ] + }; + + // Chart.js Options + options = { + legend: false, + scales: { + yAxes: [{ + ticks: { + // beginAtZero:true, + min: -1, + }, + }], + xAxes: [{ + display: false + }] + }, + + responsive: true, + scaleBeginAtZero: true, + scaleShowGridLines: true, + scaleGridLineColor: "rgba(0,0,0,.05)", + scaleGridLineWidth: 1, + + hover: { + mode: 'single', + onHover: function (obj) { + if (obj.length > 0) + tapOrHover(obj[0]._index); } - $timeout(function() - { - tcGraph = new Chart(ctx, - { - type: btype, - data: current_data, - options: options - }); - }); + }, - cv.onclick = function(e) - { - var b = tcGraph.getElementAtEvent(e); - if (b.length > 0) - { - tapOrHover(b[0]._index); - } - }; - } + //String - A legend template + legendTemplate: '<ul class="tc-chart-js-legend"><% for (var i=0; i<datasets.length; i++){%><li><span style="background-color:<%=datasets[i].fillColor%>"></span><%if(datasets[i].label){%><%=datasets[i].label%><%}%></li><%}%></ul>' + }; + + $scope.graphWidth = event.event.Frame.length * 10; + if ($scope.graphWidth < $rootScope.devWidth) + $scope.graphWidth = $rootScope.devWidth; + + // NVRDataModel.log ("Changing graph width to " + $scope.graphWidth); + + for (var i = 0; i < event.event.Frame.length; i++) { + + data.labels.push(event.event.Frame[i].TimeStamp); + //data.labels.push(' '); + data.datasets[0].data.push(event.event.Frame[i].Score); + data.datasets[0].frames.push({ + x: event.event.Frame[i].TimeStamp, + y: event.event.Frame[i].Score, + eid: event.event.Event.Id, + fid: event.event.Frame[i].FrameId, + id: event.event.Frame[i].Id, + //group:i, + relativePath: computeRelativePath(event.event), + score: event.event.Frame[i].Score, + fname: padToN(event.event.Frame[i].FrameId, eventImageDigits) + "-capture.jpg", + + }); + + if (event.event.Frame[i].Type == "Alarm") { + + onlyalarm_data.labels.push(event.event.Frame[i].TimeStamp); + //data.labels.push(' '); + onlyalarm_data.datasets[0].data.push(event.event.Frame[i].Score); + onlyalarm_data.datasets[0].frames.push({ + x: event.event.Frame[i].TimeStamp, + y: event.event.Frame[i].Score, + eid: event.event.Event.Id, + fid: event.event.Frame[i].FrameId, + //group:i, + relativePath: computeRelativePath(event.event), + score: event.event.Frame[i].Score, + fname: padToN(event.event.Frame[i].FrameId, eventImageDigits) + "-capture.jpg", + id: event.event.Frame[i].Id, - function tapOrHover(ndx) - { - - $timeout(function() - { - - //console.log ("You tapped " + ndx); - $scope.alarm_images = []; - $scope.playbackURL = $scope.event.Event.baseURL; - var items = current_data.datasets[0].frames[ndx]; - $scope.alarm_images.push( - { - relativePath: items.relativePath, - fid: items.fid, - id: items.id, - fname: items.fname, - score: items.score, - time: moment(items.x).format("MMM D," + NVRDataModel.getTimeFormatSec()), - eid: items.eid - }); }); + } } - //-------------------------------------------------------- - // utility function - //-------------------------------------------------------- - - function computeRelativePath(event) - { - var relativePath = ""; - var loginData = NVRDataModel.getLogin(); - var str = event.Event.StartTime; - var yy = moment(str).locale('en').format('YY'); - var mm = moment(str).locale('en').format('MM'); - var dd = moment(str).locale('en').format('DD'); - var hh = moment(str).locale('en').format('HH'); - var min = moment(str).locale('en').format('mm'); - var sec = moment(str).locale('en').format('ss'); - relativePath = event.Event.MonitorId + "/" + - yy + "/" + - mm + "/" + - dd + "/" + - hh + "/" + - min + "/" + - sec + "/"; - return relativePath; + $scope.dataReady = true; - } + cv = document.getElementById("tcchart"); + ctx = cv.getContext("2d"); - //-------------------------------------------------------- - // utility function - //-------------------------------------------------------- - - function computeBasePath(event) - { - var basePath = ""; - var loginData = NVRDataModel.getLogin(); - var str = event.Event.StartTime; - var yy = moment(str).locale('en').format('YY'); - var mm = moment(str).locale('en').format('MM'); - var dd = moment(str).locale('en').format('DD'); - var hh = moment(str).locale('en').format('HH'); - var min = moment(str).locale('en').format('mm'); - var sec = moment(str).locale('en').format('ss'); - - basePath = loginData.url + "/events/" + - event.Event.MonitorId + "/" + - yy + "/" + - mm + "/" + - dd + "/" + - hh + "/" + - min + "/" + - sec + "/"; - return basePath; + if (NVRDataModel.getLogin().timelineModalGraphType == $translate.instant('kGraphAll')) { + btype = 'line'; + current_data = data; + } else { + btype = 'bar'; + current_data = onlyalarm_data; } + $timeout(function () { + tcGraph = new Chart(ctx, { + type: btype, + data: current_data, + options: options + }); + }); - function humanizeTime(str) - { - return moment.tz(str, NVRDataModel.getTimeZoneNow()).fromNow(); + cv.onclick = function (e) { + var b = tcGraph.getElementAtEvent(e); + if (b.length > 0) { + tapOrHover(b[0]._index); + } + }; + } + + function tapOrHover(ndx) { + + $timeout(function () { + + //console.log ("You tapped " + ndx); + $scope.alarm_images = []; + $scope.playbackURL = $scope.event.Event.baseURL; + var items = current_data.datasets[0].frames[ndx]; + $scope.alarm_images.push({ + relativePath: items.relativePath, + fid: items.fid, + id: items.id, + fname: items.fname, + score: items.score, + time: moment(items.x).format("MMM D," + NVRDataModel.getTimeFormatSec()), + eid: items.eid + }); + }); + } + + //-------------------------------------------------------- + // utility function + //-------------------------------------------------------- + + function computeRelativePath(event) { + var relativePath = ""; + var loginData = NVRDataModel.getLogin(); + var str = event.Event.StartTime; + var yy = moment(str).locale('en').format('YY'); + var mm = moment(str).locale('en').format('MM'); + var dd = moment(str).locale('en').format('DD'); + var hh = moment(str).locale('en').format('HH'); + var min = moment(str).locale('en').format('mm'); + var sec = moment(str).locale('en').format('ss'); + relativePath = event.Event.MonitorId + "/" + + yy + "/" + + mm + "/" + + dd + "/" + + hh + "/" + + min + "/" + + sec + "/"; + return relativePath; + + } + + //-------------------------------------------------------- + // utility function + //-------------------------------------------------------- + + function computeBasePath(event) { + var basePath = ""; + var loginData = NVRDataModel.getLogin(); + var str = event.Event.StartTime; + var yy = moment(str).locale('en').format('YY'); + var mm = moment(str).locale('en').format('MM'); + var dd = moment(str).locale('en').format('DD'); + var hh = moment(str).locale('en').format('HH'); + var min = moment(str).locale('en').format('mm'); + var sec = moment(str).locale('en').format('ss'); + + basePath = loginData.url + "/events/" + + event.Event.MonitorId + "/" + + yy + "/" + + mm + "/" + + dd + "/" + + hh + "/" + + min + "/" + + sec + "/"; + return basePath; + } + + function humanizeTime(str) { + return moment.tz(str, NVRDataModel.getTimeZoneNow()).fromNow(); + + } + + function padToN(number, digits) { + + var i; + var stringMax = ""; + var stringLeading = ""; + for (i = 1; i <= digits; i++) { + stringMax = stringMax + "9"; + if (i != digits) stringLeading = stringLeading + "0"; } + var numMax = parseInt(stringMax); - function padToN(number, digits) - { - - var i; - var stringMax = ""; - var stringLeading = ""; - for (i = 1; i <= digits; i++) - { - stringMax = stringMax + "9"; - if (i != digits) stringLeading = stringLeading + "0"; - } - var numMax = parseInt(stringMax); - - if (number <= numMax) - { - number = (stringLeading + number).slice(-digits); - } - //console.log ("PADTON: returning " + number); - return number; + if (number <= numMax) { + number = (stringLeading + number).slice(-digits); } + //console.log ("PADTON: returning " + number); + return number; + } }]); diff --git a/www/js/WizardCtrl.js b/www/js/WizardCtrl.js index f285418f..a0bc1b06 100644 --- a/www/js/WizardCtrl.js +++ b/www/js/WizardCtrl.js @@ -2,852 +2,743 @@ /* jslint browser: true*/ /* global cordova,StatusBar,angular,console, Masonry, URI */ -angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$rootScope', '$ionicModal', 'NVRDataModel', '$ionicSideMenuDelegate', '$ionicHistory', '$state', '$ionicPopup', 'SecuredPopups', '$http', '$q', 'zm', '$ionicLoading', 'WizardHandler', '$translate', function($scope, $rootScope, $ionicModal, NVRDataModel, $ionicSideMenuDelegate, $ionicHistory, $state, $ionicPopup, SecuredPopups, $http, $q, zm, $ionicLoading, WizardHandler, $translate) -{ - $scope.openMenu = function() - { - $ionicSideMenuDelegate.toggleLeft(); - }; - - //-------------------------------------------------------------------------- - // logs into ZM - //-------------------------------------------------------------------------- - - function login(u, zmu, zmp) - { - var d = $q.defer(); +angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$rootScope', '$ionicModal', 'NVRDataModel', '$ionicSideMenuDelegate', '$ionicHistory', '$state', '$ionicPopup', 'SecuredPopups', '$http', '$q', 'zm', '$ionicLoading', 'WizardHandler', '$translate', function ($scope, $rootScope, $ionicModal, NVRDataModel, $ionicSideMenuDelegate, $ionicHistory, $state, $ionicPopup, SecuredPopups, $http, $q, zm, $ionicLoading, WizardHandler, $translate) { + $scope.openMenu = function () { + $ionicSideMenuDelegate.toggleLeft(); + }; + + //-------------------------------------------------------------------------- + // logs into ZM + //-------------------------------------------------------------------------- + + function login(u, zmu, zmp) { + var d = $q.defer(); + + $http({ + method: 'POST', + //withCredentials: true, + url: u, + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + 'Accept': 'application/json', + }, + transformRequest: function (obj) { + var str = []; + for (var p in obj) + str.push(encodeURIComponent(p) + "=" + + encodeURIComponent(obj[p])); + var params = str.join("&"); + return params; + }, + + data: { + username: zmu, + password: zmp, + action: "login", + view: "console" + } + }) + .success(function (data, status, headers) { + //console.log("LOOKING FOR " + zm.loginScreenString); + //console.log("DATA RECEIVED " + JSON.stringify(data)); + if (data.indexOf(zm.loginScreenString) == -1) { + + $scope.wizard.loginURL = $scope.wizard.fqportal; + $scope.wizard.portalValidText = $translate.instant('kPortal') + ": " + $scope.wizard.loginURL; + $scope.wizard.portalColor = "#16a085"; + d.resolve(true); + return d.promise; + } else { + //console.log("************ERROR"); + $scope.wizard.portalValidText = $translate.instant('kPortalDetectionFailed'); + $scope.wizard.portalColor = "#e74c3c"; + d.reject(false); + return d.promise; + } + }) + .error(function (error) { + //console.log("************ERROR"); + $scope.wizard.portalValidText = $translate.instant('kPortalDetectionFailed'); + $scope.wizard.portalColor = "#e74c3c"; + d.reject(false); + return d.promise; - $http( - { - method: 'POST', - //withCredentials: true, - url: u, - headers: - { - 'Content-Type': 'application/x-www-form-urlencoded', - 'Accept': 'application/json', - }, - transformRequest: function(obj) - { - var str = []; - for (var p in obj) - str.push(encodeURIComponent(p) + "=" + - encodeURIComponent(obj[p])); - var params = str.join("&"); - return params; - }, - - data: - { - username: zmu, - password: zmp, - action: "login", - view: "console" - } - }) - .success(function(data, status, headers) - { - //console.log("LOOKING FOR " + zm.loginScreenString); - //console.log("DATA RECEIVED " + JSON.stringify(data)); - if (data.indexOf(zm.loginScreenString) == -1) - { - - $scope.wizard.loginURL = $scope.wizard.fqportal; - $scope.wizard.portalValidText = $translate.instant('kPortal') + ": " + $scope.wizard.loginURL; - $scope.wizard.portalColor = "#16a085"; - d.resolve(true); - return d.promise; - } - else - { - //console.log("************ERROR"); - $scope.wizard.portalValidText = $translate.instant('kPortalDetectionFailed'); - $scope.wizard.portalColor = "#e74c3c"; - d.reject(false); - return d.promise; - } - }) - .error(function(error) - { - //console.log("************ERROR"); - $scope.wizard.portalValidText = $translate.instant('kPortalDetectionFailed'); - $scope.wizard.portalColor = "#e74c3c"; - d.reject(false); - return d.promise; + }); + + return d.promise; + + } + + //-------------------------------------------------------------------------- + // we need a monitor ID to do cgi-bin detection - if you don't have + // monitors configured, cgi-bin won't work + //-------------------------------------------------------------------------- + + function getFirstMonitor() { + var d = $q.defer(); + $http.get($scope.wizard.apiURL + "/monitors.json") + .then(function (success) { + // console.log("getfirst monitor success: " + JSON.stringify(success)); + if (success.data.monitors.length > 0) { + var foundMid = -1; + for (var i = 0; i < success.data.monitors.length; i++) { + if (success.data.monitors[i].Monitor.Function != 'None' && + success.data.monitors[i].Monitor.Enabled == '1') { + foundMid = success.data.monitors[i].Monitor.Id; + break; + } + } - }); + if (foundMid != -1) { + NVRDataModel.debug("zmWizard - getFirstMonitor returned " + foundMid); + d.resolve(foundMid); + return d.promise; + } else { + d.reject(false); + return d.promise; + } + } else { + d.reject(false); + return d.promise; + } + }, + function (error) { + //console.log("getfirst monitor error: " + JSON.stringify(error)); + d.reject(false); + return d.promise; + }); + return d.promise; + } + + //-------------------------------------------------------------------------- + // Utility function - iterates through a list of URLs + // Don't put loginData.reachability here --> we are using this to iterate + // through multiple options - not the same as fallback + //-------------------------------------------------------------------------- + + function findFirstReachableUrl(urls, tail) { + var d = $q.defer(); + if (urls.length > 0) { + var t = ""; + if (tail) t = tail; + //$ionicLoading.show({template: 'trying ' + urls[0].server}); + NVRDataModel.log("zmWizard test.." + urls[0] + t); + return $http.get(urls[0] + t).then(function () { + NVRDataModel.log("Success: on " + urls[0] + t); + //$ionicLoading.hide(); + d.resolve(urls[0]); return d.promise; + //return urls[0]; + }, function (err) { + NVRDataModel.log("zmWizard:Failed on " + urls[0] + t + " with error " + JSON.stringify(err)); + // this is actually a success - I might get empty status + // or something + if (err.status < 300) { + NVRDataModel.log("I am taking this as a cgi-bin success - " + urls[0]); + d.resolve(urls[0]); + return d.promise; + } + return findFirstReachableUrl(urls.slice(1), tail); + }); + } else { + // $ionicLoading.hide(); + NVRDataModel.log("zmWizard: findFirst returned no success"); + d.reject("No reachable URL"); + return d.promise; } - //-------------------------------------------------------------------------- - // we need a monitor ID to do cgi-bin detection - if you don't have - // monitors configured, cgi-bin won't work - //-------------------------------------------------------------------------- - - function getFirstMonitor() - { - var d = $q.defer(); - $http.get($scope.wizard.apiURL + "/monitors.json") - .then(function(success) - { - // console.log("getfirst monitor success: " + JSON.stringify(success)); - if (success.data.monitors.length > 0) - { - var foundMid = -1; - for (var i = 0; i < success.data.monitors.length; i++) - { - if (success.data.monitors[i].Monitor.Function != 'None' && - success.data.monitors[i].Monitor.Enabled == '1') - { - foundMid = success.data.monitors[i].Monitor.Id; - break; - } - } - - if (foundMid != -1) - { - NVRDataModel.debug("zmWizard - getFirstMonitor returned " + foundMid); - d.resolve(foundMid); - return d.promise; - } - else - { - d.reject(false); - return d.promise; - } + return d.promise; + + } + + //-------------------------------------------------------------------------- + // removes proto scheme from string + //-------------------------------------------------------------------------- + + function stripProto(u) { + if (u.indexOf('://') != -1) + return u.substr(u.indexOf('://') + 3); + else + return u; + } + + //-------------------------------------------------------------------------- + // tries to detect cgi-bin + //-------------------------------------------------------------------------- + + function detectcgi() { + var d = $q.defer(); + var c = URI.parse($scope.wizard.loginURL); + var p1, p2; + p1 = ""; + p2 = ""; + + if (c.userinfo) + p1 = c.userinfo + "@"; + if (c.port) + p2 = ":" + c.port; + + var baseUri = c.scheme + "://" + p1 + c.host + p2; + + NVRDataModel.log("zmWizard CGI: baseURL is " + baseUri); + + var a5 = baseUri + "/zmcgi"; // mageia + var a4 = baseUri + "/cgi-bin/zm"; // another one I found with a CentOS 6 guy + var a1 = baseUri + "/zm/cgi-bin"; // ubuntu/debian + var a2 = baseUri + "/cgi-bin-zm"; //fedora/centos/rhel + var a3 = baseUri + "/cgi-bin"; // doofus + + var urls = [a1, a2, a3, a4, a5]; + + NVRDataModel.getPathZms() // what does ZM have stored in PATH_ZMS? + .then(function (data) { + // remove zms or nph-zms + var path = data.trim(); + path = path.replace("/nph-zms", ""); + path = path.replace("/zms", ""); + urls.push(baseUri.trim() + path); + NVRDataModel.log("zmWizard: getPathZMS succeeded, adding " + baseUri + path + " to things to try"); + continueCgi(urls); + }, + function (error) { + NVRDataModel.log("zmWizard: getPathZMS failed, but continuing..."); + continueCgi(urls); + }); + // Well, PATH_ZMS or not, lets call this function and brute force it + function continueCgi(urls) { + $ionicLoading.show({ + template: $translate.instant('kDiscovering') + "...", + noBackdrop: true, + duration: zm.httpTimeout + }); + getFirstMonitor() + .then(function (success) { + $ionicLoading.hide(); + var tail = "/nph-zms?mode=single&monitor=" + success; + if ($scope.wizard.useauth && $scope.wizard.usezmauth) { + + var ck = Math.floor(Math.random() * (50000 - 10000 + 1)) + 10000; + NVRDataModel.getAuthKey(success, ck) + .then(function (success) { + if (success == "") { + NVRDataModel.log("getAuthKey returned null, so going user=&pwd= way"); + tail += "&user=" + $scope.wizard.zmuser + "&pass=" + $scope.wizard.zmpassword; + } else { + tail += success; } - else - { - d.reject(false); - return d.promise; - } - }, - function(error) - { - //console.log("getfirst monitor error: " + JSON.stringify(error)); - d.reject(false); - return d.promise; - }); - return d.promise; - } + NVRDataModel.log("auth computed is : " + tail); + proceedwithCgiAfterAuth(urls, tail); + }, + function (error) { + NVRDataModel.log("Should never come here, getAuthKey doesn't return error"); - //-------------------------------------------------------------------------- - // Utility function - iterates through a list of URLs - // Don't put loginData.reachability here --> we are using this to iterate - // through multiple options - not the same as fallback - //-------------------------------------------------------------------------- + }); - function findFirstReachableUrl(urls, tail) - { - var d = $q.defer(); - if (urls.length > 0) - { - var t = ""; - if (tail) t = tail; - //$ionicLoading.show({template: 'trying ' + urls[0].server}); - NVRDataModel.log("zmWizard test.." + urls[0] + t); - return $http.get(urls[0] + t).then(function() - { - NVRDataModel.log("Success: on " + urls[0] + t); - //$ionicLoading.hide(); - d.resolve(urls[0]); - return d.promise; - //return urls[0]; - }, function(err) + //console.log ("****CDING " + tail); + } else // no auth case { - NVRDataModel.log("zmWizard:Failed on " + urls[0] + t + " with error " + JSON.stringify(err) ); - // this is actually a success - I might get empty status - // or something - if (err.status < 300) - { - NVRDataModel.log ("I am taking this as a cgi-bin success - "+urls[0]); - d.resolve(urls[0]); - return d.promise; - } - return findFirstReachableUrl(urls.slice(1), tail); - }); - } - else - { - // $ionicLoading.hide(); - NVRDataModel.log("zmWizard: findFirst returned no success"); - d.reject("No reachable URL"); - return d.promise; - - } - - return d.promise; - - } - - //-------------------------------------------------------------------------- - // removes proto scheme from string - //-------------------------------------------------------------------------- - - function stripProto(u) - { - if (u.indexOf('://') != -1) - return u.substr(u.indexOf('://') + 3); - else - return u; - } + proceedwithCgiAfterAuth(urls, tail); + } - //-------------------------------------------------------------------------- - // tries to detect cgi-bin - //-------------------------------------------------------------------------- + function proceedwithCgiAfterAuth(urls, tail) { - function detectcgi() - { - var d = $q.defer(); - var c = URI.parse($scope.wizard.loginURL); - var p1, p2; - p1 = ""; - p2 = ""; - - if (c.userinfo) - p1 = c.userinfo + "@"; - if (c.port) - p2 = ":" + c.port; - - var baseUri = c.scheme + "://" + p1 + c.host + p2; - - NVRDataModel.log("zmWizard CGI: baseURL is " + baseUri); - - var a5 = baseUri + "/zmcgi"; // mageia - var a4 = baseUri + "/cgi-bin/zm"; // another one I found with a CentOS 6 guy - var a1 = baseUri + "/zm/cgi-bin"; // ubuntu/debian - var a2 = baseUri + "/cgi-bin-zm"; //fedora/centos/rhel - var a3 = baseUri + "/cgi-bin"; // doofus - - var urls = [a1, a2, a3, a4, a5]; - - NVRDataModel.getPathZms() // what does ZM have stored in PATH_ZMS? - .then(function(data) - { - // remove zms or nph-zms - var path = data.trim(); - path = path.replace("/nph-zms", ""); - path = path.replace("/zms", ""); - urls.push(baseUri.trim() + path); - NVRDataModel.log("zmWizard: getPathZMS succeeded, adding " + baseUri + path + " to things to try"); - continueCgi(urls); - }, - function(error) - { - NVRDataModel.log("zmWizard: getPathZMS failed, but continuing..."); - continueCgi(urls); - }); - - // Well, PATH_ZMS or not, lets call this function and brute force it - function continueCgi(urls) - { - $ionicLoading.show( - { + $ionicLoading.show({ template: $translate.instant('kDiscovering') + "...", noBackdrop: true, duration: zm.httpTimeout - }); - getFirstMonitor() - .then(function(success) - { - $ionicLoading.hide(); - var tail = "/nph-zms?mode=single&monitor=" + success; - if ($scope.wizard.useauth && $scope.wizard.usezmauth) - { - - var ck = Math.floor(Math.random() * (50000 - 10000 + 1)) + 10000; - NVRDataModel.getAuthKey(success, ck) - .then(function(success) - { - if (success == "") - { - NVRDataModel.log("getAuthKey returned null, so going user=&pwd= way"); - tail += "&user=" + $scope.wizard.zmuser + "&pass=" + $scope.wizard.zmpassword; - } - else - { - tail += success; - } - NVRDataModel.log("auth computed is : " + tail); - proceedwithCgiAfterAuth(urls, tail); - }, - function(error) - { - NVRDataModel.log("Should never come here, getAuthKey doesn't return error"); - - }); - - //console.log ("****CDING " + tail); - } - else // no auth case - { - proceedwithCgiAfterAuth(urls, tail); - } - - function proceedwithCgiAfterAuth(urls, tail) - { - - $ionicLoading.show( - { - template: $translate.instant('kDiscovering') + "...", - noBackdrop: true, - duration: zm.httpTimeout - }); - - findFirstReachableUrl(urls, tail) - .then(function(success) - { - $ionicLoading.hide(); - NVRDataModel.log("Valid cgi-bin found with: " + success); - $scope.wizard.streamingURL = success; - $scope.wizard.streamingValidText = "cgi-bin: " + $scope.wizard.streamingURL; - $scope.wizard.streamingColor = "#16a085"; - d.resolve(true); - return d.promise; - - }, - function(error) - { - $ionicLoading.hide(); - NVRDataModel.debug("No cgi-bin found: " + JSON.stringify(error)); - $scope.wizard.streamingValidText = $translate.instant('kPortalCgiBinFailed'); - $scope.wizard.streamingColor = "#e74c3c"; - d.reject(false); - return (d.promise); - }); - } - }, - function(error) - { - $ionicLoading.hide(); - $scope.wizard.streamingValidText = $translate.instant('kPortalCgiBinFailed') + " -" + $translate.instant('kPortalNoMonitorFound'); - $scope.wizard.streamingColor = "#e74c3c"; - d.reject(false); - return (d.promise); - - }); - } - - // https://server/zm/cgi-bin/nph-zms?mode=single&monitor=1&user=admin&pass=cc - - return d.promise; - - } - - //-------------------------------------------------------------------------- - // Finds an appropriate API to use - //-------------------------------------------------------------------------- - - function detectapi() - { - var u = $scope.wizard.loginURL; - var d = $q.defer(); - var api1 = u + "/api"; - var api3 = u + "/zm/api"; - var c = URI.parse(u); - - // lets also try without the path - var api2 = c.scheme + "://"; - if (c.userinfo) api2 += c.userinfo + "@"; - api2 += c.host; - if (c.port) api2 += ":" + c.port; - api2 += "/api"; - - // lets try both /zm/api and /api. What else is there? - var apilist = [api1, api2, api3]; - - findFirstReachableUrl(apilist, '/host/getVersion.json') - .then(function(success) - { - NVRDataModel.log("Valid API response found with:" + success); - $scope.wizard.apiURL = success; - - $scope.wizard.apiValidText = "API: " + $scope.wizard.apiURL; - $scope.wizard.apiColor = "#16a085"; + }); + + findFirstReachableUrl(urls, tail) + .then(function (success) { + $ionicLoading.hide(); + NVRDataModel.log("Valid cgi-bin found with: " + success); + $scope.wizard.streamingURL = success; + $scope.wizard.streamingValidText = "cgi-bin: " + $scope.wizard.streamingURL; + $scope.wizard.streamingColor = "#16a085"; d.resolve(true); return d.promise; - }, - function(error) - { - //console.log("No APIs found: " + error); - $scope.wizard.apiValidText = $translate.instant('kPortalAPIFailed'); - $scope.wizard.apiColor = "#e74c3c"; + + }, + function (error) { + $ionicLoading.hide(); + NVRDataModel.debug("No cgi-bin found: " + JSON.stringify(error)); + $scope.wizard.streamingValidText = $translate.instant('kPortalCgiBinFailed'); + $scope.wizard.streamingColor = "#e74c3c"; d.reject(false); return (d.promise); - }); - - return d.promise; + }); + } + }, + function (error) { + $ionicLoading.hide(); + $scope.wizard.streamingValidText = $translate.instant('kPortalCgiBinFailed') + " -" + $translate.instant('kPortalNoMonitorFound'); + $scope.wizard.streamingColor = "#e74c3c"; + d.reject(false); + return (d.promise); + + }); } - //-------------------------------------------------------------------------- - // logs out of ZM - //-------------------------------------------------------------------------- - - function logout(u) - { - var d = $q.defer(); - - $http( - { - method: 'POST', - url: u, - headers: - { - 'Content-Type': 'application/x-www-form-urlencoded', - 'Accept': 'application/json', - }, - transformRequest: function(obj) - { - var str = []; - for (var p in obj) - str.push(encodeURIComponent(p) + "=" + - encodeURIComponent(obj[p])); - var params = str.join("&"); - return params; - }, - - data: - { - action: "logout", - view: "login" - } - }) - .then(function(success) - { - $rootScope.zmCookie = ""; - //console.log("ZMlogout success, cookie removed"); - d.resolve(true); - return d.promise; - }, function(error) - { - //console.log("ZMlogout success"); - d.resolve(true); - return d.promise; - }); + // https://server/zm/cgi-bin/nph-zms?mode=single&monitor=1&user=admin&pass=cc + + return d.promise; + + } + + //-------------------------------------------------------------------------- + // Finds an appropriate API to use + //-------------------------------------------------------------------------- + + function detectapi() { + var u = $scope.wizard.loginURL; + var d = $q.defer(); + var api1 = u + "/api"; + var api3 = u + "/zm/api"; + var c = URI.parse(u); + + // lets also try without the path + var api2 = c.scheme + "://"; + if (c.userinfo) api2 += c.userinfo + "@"; + api2 += c.host; + if (c.port) api2 += ":" + c.port; + api2 += "/api"; + + // lets try both /zm/api and /api. What else is there? + var apilist = [api1, api2, api3]; + + findFirstReachableUrl(apilist, '/host/getVersion.json') + .then(function (success) { + NVRDataModel.log("Valid API response found with:" + success); + $scope.wizard.apiURL = success; + + $scope.wizard.apiValidText = "API: " + $scope.wizard.apiURL; + $scope.wizard.apiColor = "#16a085"; + d.resolve(true); + return d.promise; + }, + function (error) { + //console.log("No APIs found: " + error); + $scope.wizard.apiValidText = $translate.instant('kPortalAPIFailed'); + $scope.wizard.apiColor = "#e74c3c"; + d.reject(false); + return (d.promise); + }); + return d.promise; + } + + //-------------------------------------------------------------------------- + // logs out of ZM + //-------------------------------------------------------------------------- + + function logout(u) { + var d = $q.defer(); + + $http({ + method: 'POST', + url: u, + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + 'Accept': 'application/json', + }, + transformRequest: function (obj) { + var str = []; + for (var p in obj) + str.push(encodeURIComponent(p) + "=" + + encodeURIComponent(obj[p])); + var params = str.join("&"); + return params; + }, + + data: { + action: "logout", + view: "login" + } + }) + .then(function (success) { + $rootScope.zmCookie = ""; + //console.log("ZMlogout success, cookie removed"); + d.resolve(true); return d.promise; - + }, function (error) { + //console.log("ZMlogout success"); + d.resolve(true); + return d.promise; + }); + + return d.promise; + + } + + //-------------------------------------------------------------------------- + // clears all status updates in the verify results page - if you + // get back to it + //-------------------------------------------------------------------------- + + $scope.enterResults = function () { + $scope.portalValidText = ""; + $scope.apiValidateText = ""; + $scope.streamingValidateText = ""; + $scope.wizard.fqportal = ""; + return true; + }; + //-------------------------------------------------------------------------- + // tries to log into the portal and then discover api and cgi-bin + //-------------------------------------------------------------------------- + + function validateData() { + $rootScope.authSession = 'undefined'; + $rootScope.zmCookie = ''; + + $scope.wizard.portalValidText = ""; + $scope.wizard.apiValidText = ""; + $scope.wizard.streamingValidText = ""; + $scope.wizard.fqportal = ""; + $scope.wizard.loginURL = ""; + $scope.wizard.apiURL = ""; + $scope.wizard.streamingURL = ""; + $scope.wizard.serverName = ""; + + var d = $q.defer(); + + var c = URI.parse($scope.wizard.portalurl); + + $scope.wizard.serverName = c.host; + if (c.port) + $scope.wizard.serverName += "-" + c.port; + + var b = ""; + if ($scope.wizard.useauth && $scope.wizard.usebasicauth) { + // b = $scope.wizard.basicuser + ":" + $scope.wizard.basicpassword + "@"; + //console.log("B=" + b); + $rootScope.basicAuthHeader = 'Basic ' + btoa($scope.wizard.basicuser + ':' + $scope.wizard.basicpassword); + //console.log (">>>> WIZARD SET BASIC AUTH TO " + $rootScope.basicAuthHeader); } + var u = c.scheme + "://" + b + c.host; + if (c.port) u += ":" + c.port; + if (c.path) u += c.path; - //-------------------------------------------------------------------------- - // clears all status updates in the verify results page - if you - // get back to it - //-------------------------------------------------------------------------- - - $scope.enterResults = function() - { - $scope.portalValidText = ""; - $scope.apiValidateText = ""; - $scope.streamingValidateText = ""; - $scope.wizard.fqportal = ""; - return true; - }; - //-------------------------------------------------------------------------- - // tries to log into the portal and then discover api and cgi-bin - //-------------------------------------------------------------------------- - - function validateData() - { - $rootScope.authSession = 'undefined'; - $rootScope.zmCookie = ''; - - $scope.wizard.portalValidText = ""; - $scope.wizard.apiValidText = ""; - $scope.wizard.streamingValidText = ""; - $scope.wizard.fqportal = ""; - $scope.wizard.loginURL = ""; - $scope.wizard.apiURL = ""; - $scope.wizard.streamingURL = ""; - $scope.wizard.serverName = ""; - - var d = $q.defer(); - - var c = URI.parse($scope.wizard.portalurl); - - $scope.wizard.serverName = c.host; - if (c.port) - $scope.wizard.serverName += "-" + c.port; - - var b = ""; - if ($scope.wizard.useauth && $scope.wizard.usebasicauth) - { - // b = $scope.wizard.basicuser + ":" + $scope.wizard.basicpassword + "@"; - //console.log("B=" + b); - $rootScope.basicAuthHeader = 'Basic ' + btoa($scope.wizard.basicuser+':'+$scope.wizard.basicpassword); - //console.log (">>>> WIZARD SET BASIC AUTH TO " + $rootScope.basicAuthHeader); - } - var u = c.scheme + "://" + b + c.host; - if (c.port) u += ":" + c.port; - if (c.path) u += c.path; - - if (u.slice(-1) == '/') - { - u = u.slice(0, -1); + if (u.slice(-1) == '/') { + u = u.slice(0, -1); - } + } - $scope.wizard.fqportal = u; + $scope.wizard.fqportal = u; - u = u + '/index.php'; - NVRDataModel.log("Wizard: login url is " + u); + u = u + '/index.php'; + NVRDataModel.log("Wizard: login url is " + u); - // now lets login + // now lets login - var zmu = "x"; - var zmp = "x"; - if ($scope.wizard.usezmauth) - { - zmu = $scope.wizard.zmuser; - zmp = $scope.wizard.zmpassword; - } + var zmu = "x"; + var zmp = "x"; + if ($scope.wizard.usezmauth) { + zmu = $scope.wizard.zmuser; + zmp = $scope.wizard.zmpassword; + } - // logout first for the adventurers amongst us who must - // use it even after logging in - NVRDataModel.log("zmWizard: logging out"); - $ionicLoading.show( - { - template: $translate.instant('kCleaningUp') + "...", - noBackdrop: true, - duration: zm.httpTimeout + // logout first for the adventurers amongst us who must + // use it even after logging in + NVRDataModel.log("zmWizard: logging out"); + $ionicLoading.show({ + template: $translate.instant('kCleaningUp') + "...", + noBackdrop: true, + duration: zm.httpTimeout + }); + logout(u) + .then(function (ans) { + // login now + $ionicLoading.hide(); + NVRDataModel.log("zmWizard: logging in with " + u + " " + zmu); + + // The logic will be: + // Login then do an api detect and cgi-detect together + $ionicLoading.show({ + template: $translate.instant('kDiscoveringPortal') + "...", + noBackdrop: true, + duration: zm.httpTimeout }); - logout(u) - .then(function(ans) - { - // login now - $ionicLoading.hide(); - NVRDataModel.log("zmWizard: logging in with " + u + " " + zmu); - - // The logic will be: - // Login then do an api detect and cgi-detect together - $ionicLoading.show( - { - template: $translate.instant('kDiscoveringPortal') + "...", - noBackdrop: true, - duration: zm.httpTimeout - }); - login(u, zmu, zmp) - .then(function(success) - { - $ionicLoading.hide(); - NVRDataModel.log("zmWizard: login succeeded"); - - // API Detection - $ionicLoading.show( - { - template: $translate.instant('kDiscoveringAPI') + "...", - noBackdrop: true, - duration: zm.httpTimeout - }); - detectapi() - .then(function(success) - { - $ionicLoading.hide(); - NVRDataModel.log("zmWizard: API succeeded"); - - $ionicLoading.show( - { - template: $translate.instant('kDiscoveringCGI') + "...", - noBackdrop: true, - duration: zm.httpTimeout - }); - // CGI detection - detectcgi() - .then(function(success) - { - $ionicLoading.hide(); - // return true here because we want to progress - return d.resolve(true); - }, - function(error) - { - $ionicLoading.hide(); - // return true here because we want to progress - return d.resolve(true); - }); - }, - function(error) - { - $ionicLoading.hide(); - NVRDataModel.log("zmWizard: api failed"); - - // return true here because we want to progress - return d.resolve(true); - }); - + login(u, zmu, zmp) + .then(function (success) { + $ionicLoading.hide(); + NVRDataModel.log("zmWizard: login succeeded"); + + // API Detection + $ionicLoading.show({ + template: $translate.instant('kDiscoveringAPI') + "...", + noBackdrop: true, + duration: zm.httpTimeout + }); + detectapi() + .then(function (success) { + $ionicLoading.hide(); + NVRDataModel.log("zmWizard: API succeeded"); + + $ionicLoading.show({ + template: $translate.instant('kDiscoveringCGI') + "...", + noBackdrop: true, + duration: zm.httpTimeout + }); + // CGI detection + detectcgi() + .then(function (success) { + $ionicLoading.hide(); + // return true here because we want to progress + return d.resolve(true); }, - - // if login failed, don't progress in the wizard - function(error) - { - $ionicLoading.hide(); - NVRDataModel.log("zmWizard: login failed"); - $scope.wizard.portalValidText = $translate.instant('kPortalLoginUnsuccessful'); - $scope.wizard.portalColor = "#e74c3c"; - return d.resolve(true); - + function (error) { + $ionicLoading.hide(); + // return true here because we want to progress + return d.resolve(true); }); + }, + function (error) { + $ionicLoading.hide(); + NVRDataModel.log("zmWizard: api failed"); - }); //finally - return d.promise; - } - - //-------------------------------------------------------------------------- - // checks for a protocol - //-------------------------------------------------------------------------- - function checkscheme(url) - { + // return true here because we want to progress + return d.resolve(true); + }); - if ((!/^(f|ht)tps?:\/\//i.test(url)) && (url != "")) - { - return false; - } - else - return true; - } + }, - //-------------------------------------------------------------------------- - // exit validator for auth wizard - //-------------------------------------------------------------------------- + // if login failed, don't progress in the wizard + function (error) { + $ionicLoading.hide(); + NVRDataModel.log("zmWizard: login failed"); + $scope.wizard.portalValidText = $translate.instant('kPortalLoginUnsuccessful'); + $scope.wizard.portalColor = "#e74c3c"; + return d.resolve(true); - $scope.exitAuth = function() - { - NVRDataModel.log("Wizard: validating auth syntax"); - if ($scope.wizard.useauth) - { - if (!$scope.wizard.usezmauth && !$scope.wizard.usebasicauth) - { - $rootScope.zmPopup = SecuredPopups.show('show', - { - title: $translate.instant('kError'), - template: $translate.instant('kOneAuth'), - buttons: [ - { - text: $translate.instant('kButtonOk') - }] - - }); - return false; - } - if ($scope.wizard.usezmauth) - { - if ((!$scope.wizard.zmuser) || (!$scope.wizard.zmpassword)) - { - $rootScope.zmPopup = SecuredPopups.show('show', - { - title: $translate.instant('kError'), - template: $translate.instant('kValidNameZMAuth'), - buttons: [ - { - text: $translate.instant('kButtonOk') - }] - - }); - return false; - } - } + }); - if ($scope.wizard.usebasicauth) - { - if ((!$scope.wizard.basicuser) || (!$scope.wizard.basicpassword)) - { - $rootScope.zmPopup = SecuredPopups.show('show', - { - title: $translate.instant('kError'), - template: $translate.instant('kValidNameBasicAuth'), - buttons: [ - { - text: $translate.instant('kButtonOk') - }] + }); //finally + return d.promise; + } + + //-------------------------------------------------------------------------- + // checks for a protocol + //-------------------------------------------------------------------------- + function checkscheme(url) { + + if ((!/^(f|ht)tps?:\/\//i.test(url)) && (url != "")) { + return false; + } else + return true; + } + + //-------------------------------------------------------------------------- + // exit validator for auth wizard + //-------------------------------------------------------------------------- + + $scope.exitAuth = function () { + NVRDataModel.log("Wizard: validating auth syntax"); + if ($scope.wizard.useauth) { + if (!$scope.wizard.usezmauth && !$scope.wizard.usebasicauth) { + $rootScope.zmPopup = SecuredPopups.show('show', { + title: $translate.instant('kError'), + template: $translate.instant('kOneAuth'), + buttons: [{ + text: $translate.instant('kButtonOk') + }] - }); - return false; - } - } + }); + return false; + } + if ($scope.wizard.usezmauth) { + if ((!$scope.wizard.zmuser) || (!$scope.wizard.zmpassword)) { + $rootScope.zmPopup = SecuredPopups.show('show', { + title: $translate.instant('kError'), + template: $translate.instant('kValidNameZMAuth'), + buttons: [{ + text: $translate.instant('kButtonOk') + }] + + }); + return false; } - // Coming here means we can go to the next step - // load the step - WizardHandler.wizard().next(); - // start discovery; - validateData(); - - }; - - //-------------------------------------------------------------------------- - // validator for portal url wizard - //-------------------------------------------------------------------------- - - $scope.exitPortal = function() - { - NVRDataModel.log("Wizard: validating portal url syntax"); - - if (!$scope.wizard.portalurl) - { - $rootScope.zmPopup = SecuredPopups.show('show', - { - title: $translate.instant('kError'), - template: $translate.instant('kPortalEmpty'), - buttons: [ - { - text: $translate.instant('kButtonOk') - }] - - }); - return false; + } + + if ($scope.wizard.usebasicauth) { + if ((!$scope.wizard.basicuser) || (!$scope.wizard.basicpassword)) { + $rootScope.zmPopup = SecuredPopups.show('show', { + title: $translate.instant('kError'), + template: $translate.instant('kValidNameBasicAuth'), + buttons: [{ + text: $translate.instant('kButtonOk') + }] + + }); + return false; } + } + } + // Coming here means we can go to the next step + // load the step + WizardHandler.wizard().next(); + // start discovery; + validateData(); + + }; + + //-------------------------------------------------------------------------- + // validator for portal url wizard + //-------------------------------------------------------------------------- + + $scope.exitPortal = function () { + NVRDataModel.log("Wizard: validating portal url syntax"); + + if (!$scope.wizard.portalurl) { + $rootScope.zmPopup = SecuredPopups.show('show', { + title: $translate.instant('kError'), + template: $translate.instant('kPortalEmpty'), + buttons: [{ + text: $translate.instant('kButtonOk') + }] + + }); + return false; + } - if (!checkscheme($scope.wizard.portalurl)) - { - - $scope.portalproto = [ - { - text: "http", - value: "http://" - }, - { - text: "https", - value: "https://" - }]; - $scope.myproto = { - proto: "" - }; - - $rootScope.zmPopup = $ionicPopup.show( - { - title: $translate.instant('kPortalNoProto'), - scope: $scope, - template: $translate.instant('kPortalPleaseSelect') + ': <ion-radio-fix ng-repeat="item in portalproto" ng-value="item.value" ng-model="myproto.proto">{{item.text}}</ion-radio-fix>', - buttons: [ - { - text: $translate.instant('kButtonOk'), - onTap: function(e) - { - NVRDataModel.debug("Protocol selected:" + $scope.myproto.proto); - $scope.wizard.portalurl = $scope.myproto.proto + stripProto($scope.wizard.portalurl); - } - - }] + if (!checkscheme($scope.wizard.portalurl)) { - }); - return false; + $scope.portalproto = [{ + text: "http", + value: "http://" + }, + { + text: "https", + value: "https://" } + ]; + $scope.myproto = { + proto: "" + }; + + $rootScope.zmPopup = $ionicPopup.show({ + title: $translate.instant('kPortalNoProto'), + scope: $scope, + template: $translate.instant('kPortalPleaseSelect') + ': <ion-radio-fix ng-repeat="item in portalproto" ng-value="item.value" ng-model="myproto.proto">{{item.text}}</ion-radio-fix>', + buttons: [{ + text: $translate.instant('kButtonOk'), + onTap: function (e) { + NVRDataModel.debug("Protocol selected:" + $scope.myproto.proto); + $scope.wizard.portalurl = $scope.myproto.proto + stripProto($scope.wizard.portalurl); + } + + }] + + }); + return false; + } - //$scope.wizard.portalurl = $scope.wizard.portalurl.toLowerCase().trim(); - $scope.wizard.portalurl = $scope.wizard.portalurl.trim(); + //$scope.wizard.portalurl = $scope.wizard.portalurl.toLowerCase().trim(); + $scope.wizard.portalurl = $scope.wizard.portalurl.trim(); - NVRDataModel.log("Wizard: stripped url:" + $scope.wizard.portalurl); + NVRDataModel.log("Wizard: stripped url:" + $scope.wizard.portalurl); - var c = URI.parse($scope.wizard.portalurl); + var c = URI.parse($scope.wizard.portalurl); - if (!c.scheme) - { - $rootScope.zmPopup = SecuredPopups.show('show', - { - title: $translate.instant('kError'), - template: $translate.instant('kPortalInvalidUrl'), - buttons: [ - { - text: $translate.instant('kButtonOk') - }] + if (!c.scheme) { + $rootScope.zmPopup = SecuredPopups.show('show', { + title: $translate.instant('kError'), + template: $translate.instant('kPortalInvalidUrl'), + buttons: [{ + text: $translate.instant('kButtonOk') + }] - }); - return false; - } - - if (c.userinfo) // basic auth stuff in here, take it out and put it into the next screen - { - $scope.wizard.useauth = true; - $scope.wizard.usebasicauth = true; - var barray = c.userinfo.split(":", 2); - $scope.wizard.basicuser = barray[0]; - $scope.wizard.basicpassword = barray[1]; - } + }); + return false; + } - $scope.wizard.portalurl = c.scheme + "://"; - if (c.host) $scope.wizard.portalurl += c.host; - if (c.port) $scope.wizard.portalurl += ":" + c.port; - if (c.path) $scope.wizard.portalurl += c.path; + if (c.userinfo) // basic auth stuff in here, take it out and put it into the next screen + { + $scope.wizard.useauth = true; + $scope.wizard.usebasicauth = true; + var barray = c.userinfo.split(":", 2); + $scope.wizard.basicuser = barray[0]; + $scope.wizard.basicpassword = barray[1]; + } - $scope.wizard.portalurl = $scope.wizard.portalurl.toLowerCase(); - NVRDataModel.log("Wizard: normalized url:" + $scope.wizard.portalurl); - return true; - }; + $scope.wizard.portalurl = c.scheme + "://"; + if (c.host) $scope.wizard.portalurl += c.host; + if (c.port) $scope.wizard.portalurl += ":" + c.port; + if (c.path) $scope.wizard.portalurl += c.path; - //-------------------------------------------------------------------------- - // part of auth wizard - toggles display of auth components - //-------------------------------------------------------------------------- - $scope.toggleAuth = function() - { + $scope.wizard.portalurl = $scope.wizard.portalurl.toLowerCase(); + NVRDataModel.log("Wizard: normalized url:" + $scope.wizard.portalurl); + return true; + }; - if (!$scope.wizard.useauth) - { - $scope.wizard.usebasicauth = false; - $scope.wizard.usezmauth = false; - } - }; + //-------------------------------------------------------------------------- + // part of auth wizard - toggles display of auth components + //-------------------------------------------------------------------------- + $scope.toggleAuth = function () { - //-------------------------------------------------------------------------- - // global tip toggler for all wizard steps - //-------------------------------------------------------------------------- - $scope.toggleTip = function() - { - $scope.wizard.tipshow = !$scope.wizard.tipshow; - if ($scope.wizard.tipshow) - $scope.wizard.tiptext = $translate.instant('kHideTip'); - else - $scope.wizard.tiptext = $translate.instant('kShowTip'); - }; + if (!$scope.wizard.useauth) { + $scope.wizard.usebasicauth = false; + $scope.wizard.usezmauth = false; + } + }; + + //-------------------------------------------------------------------------- + // global tip toggler for all wizard steps + //-------------------------------------------------------------------------- + $scope.toggleTip = function () { + $scope.wizard.tipshow = !$scope.wizard.tipshow; + if ($scope.wizard.tipshow) + $scope.wizard.tiptext = $translate.instant('kHideTip'); + else + $scope.wizard.tiptext = $translate.instant('kShowTip'); + }; + + $scope.gotoLoginState = function () { + $rootScope.wizard = angular.copy($scope.wizard); + $ionicHistory.nextViewOptions({ + disableBack: true + }); + $state.go("app.login", { + "wizard": true + }); + return; + }; + + //-------------------------------------------------------------------------- + // initial + //-------------------------------------------------------------------------- + $scope.$on('$ionicView.beforeEnter', function () { + //console.log("**VIEW ** Help Ctrl Entered"); + + var monId = -1; + $scope.wizard = { + tipshow: false, + tiptext: $translate.instant('kShowTip'), + useauth: false, + usebasicauth: false, + usezmauth: false, + portalurl: "", + basicuser: "", + basicpassword: "", + zmuser: "", + zmpassword: "", + /////////////////////// + loginURL: "", + apiURL: "", + streamingURL: "", + fqportal: "", + portalValidText: "", + portalColor: "", + apiValidText: "", + apiColor: "", + streamingValidText: "", + streamingColor: "", + serverName: "", - $scope.gotoLoginState = function() - { - $rootScope.wizard = angular.copy($scope.wizard); - $ionicHistory.nextViewOptions( - { - disableBack: true - }); - $state.go("app.login", - { - "wizard": true - }); - return; }; - //-------------------------------------------------------------------------- - // initial - //-------------------------------------------------------------------------- - $scope.$on('$ionicView.beforeEnter', function() - { - //console.log("**VIEW ** Help Ctrl Entered"); - - var monId = -1; - $scope.wizard = { - tipshow: false, - tiptext: $translate.instant('kShowTip'), - useauth: false, - usebasicauth: false, - usezmauth: false, - portalurl: "", - basicuser: "", - basicpassword: "", - zmuser: "", - zmpassword: "", - /////////////////////// - loginURL: "", - apiURL: "", - streamingURL: "", - fqportal: "", - portalValidText: "", - portalColor: "", - apiValidText: "", - apiColor: "", - streamingValidText: "", - streamingColor: "", - serverName: "", - - }; - - }); + }); }]); diff --git a/www/js/app.js b/www/js/app.js index 08cd18f5..284bc90d 100755 --- a/www/js/app.js +++ b/www/js/app.js @@ -29,7 +29,7 @@ angular.module('zmApp', [ 'uk.ac.soton.ecs.videogular.plugins.cuepoints', 'dcbImgFallback', 'ngImageAppear', - 'angular-websocket' + 'angular-websocket' ]) @@ -51,7 +51,7 @@ angular.module('zmApp', [ logFile: 'zmNinjaLog.txt', authoremail: 'pliablepixels+zmNinja@gmail.com', logFileMaxSize: 20000, // after this limit log gets reset - + updateCheckInterval: 86400000, // 24 hrs loadingTimeout: 15000, slowLoadingTimeout: 60000, @@ -104,9 +104,9 @@ angular.module('zmApp', [ hashSecret: 'unused at the moment', forceMontageReloadDelay: 4500000, // 1 hr 15m, //forceMontageReloadDelay: 10000, // testing 10s - thumbWidth:200, + thumbWidth: 200, alarmStatusTime: 10000, - eventServerErrorDelay:5000, // time to wait till I report initial connect errors + eventServerErrorDelay: 5000, // time to wait till I report initial connect errors zmVersionCheckNag: 60 * 24, // in hrs waitTimeTillResume: 5 // in sec, for ES error @@ -146,8 +146,7 @@ angular.module('zmApp', [ angular.forEach(input, function (item) { - if (!item.Event.hide ) - { + if (!item.Event.hide) { out.push(item); } @@ -169,7 +168,7 @@ angular.module('zmApp', [ angular.forEach(input, function (item) { if ((item.Monitor.Function != 'None') && - (item.Monitor.Enabled != '0') + (item.Monitor.Enabled != '0') ) { out.push(item); } @@ -511,35 +510,38 @@ angular.module('zmApp', [ // console.log ("DIRECTIVE: IMAGE ERROR"); loader.remove(); - + var url = 'img/novideo.png'; var w = $attributes.imgSpinnerW; var h = $attributes.imgSpinnerH; - /* $element.css({ - //width: w+'px', - // height: h+'px', - display: ($attributes.imgSpinnerW && $attributes.imgSpinnerH? 'inline-block' : null), - background:'red', - objectFit: 'fill' - });*/ - + /* $element.css({ + //width: w+'px', + // height: h+'px', + display: ($attributes.imgSpinnerW && $attributes.imgSpinnerH? 'inline-block' : null), + background:'red', + objectFit: 'fill' + });*/ - // console.log ("**********"+w+"X"+h); - // var hurl = "holder.js/2000x$2000?auto=yes&theme=sky&text=..."; - $attributes.$set('data-src', 'holder.js/'+w+'x'+h+'?auto=yes&theme=industrial&text=...'); - Holder.run({images:$element[0], nocss:false}); + // console.log ("**********"+w+"X"+h); + // var hurl = "holder.js/2000x$2000?auto=yes&theme=sky&text=..."; + + $attributes.$set('data-src', 'holder.js/' + w + 'x' + h + '?auto=yes&theme=industrial&text=...'); + Holder.run({ + images: $element[0], + nocss: false + }); + + // $element.prop ('width', w+'px'); + // $element.prop ('height', h+'px'); - // $element.prop ('width', w+'px'); - // $element.prop ('height', h+'px'); - - // $element.css({backgroundImage: 'url("' + url + '")'}); - //$attributes.$set('src', url); - // $element.prop('data-src', hurl); + // $element.css({backgroundImage: 'url("' + url + '")'}); + //$attributes.$set('src', url); + // $element.prop('data-src', hurl); imageLoadingDataShare.set(0); }); @@ -627,47 +629,47 @@ angular.module('zmApp', [ if (!config.url) return config; - + if ($rootScope.basicAuthHeader) { // console.log ("BASIC AUTH="+$rootScope.basicAuthHeader); - config.headers.Authorization = $rootScope.basicAuthHeader; + config.headers.Authorization = $rootScope.basicAuthHeader; } - + // handle basic auth properly if (config.url.indexOf("@") > -1) { - NVRDataModel.debug (">>>>>>>>>> ERROR!!!!! url has a basic auth u:p!"+config.url); - - /* var components = URI.parse(config.url); - var credentials = btoa(components.userinfo); - var authorization = {'Authorization': 'Basic ' + credentials}; - config.headers.Authorization = 'Basic ' + credentials; - console.log ("Full headers: " + JSON.stringify(config.headers)); - config.url = components.scheme + "://" + components.host; - if (components.port) config.url = config.url + ":" + components.port; - if (components.path) config.url = config.url + components.path; + NVRDataModel.debug(">>>>>>>>>> ERROR!!!!! url has a basic auth u:p!" + config.url); + + /* var components = URI.parse(config.url); + var credentials = btoa(components.userinfo); + var authorization = {'Authorization': 'Basic ' + credentials}; + config.headers.Authorization = 'Basic ' + credentials; + console.log ("Full headers: " + JSON.stringify(config.headers)); + config.url = components.scheme + "://" + components.host; + if (components.port) config.url = config.url + ":" + components.port; + if (components.path) config.url = config.url + components.path; - console.log ("REWRITING URL TO: "+config.url);} */ + console.log ("REWRITING URL TO: "+config.url);} */ - - //console.log (">>>>>>>>>>>>> INTERCEPT OBJECT " + JSON.stringify(config)); - // if ($rootScope.zmCookie) { - // config.headers.Cookie = "ZMSESSID=" + // $rootScope.zmCookie; - // console.log (">>>>> WOOOT HAVE COOKIE AND USING: "+$rootScope.zmCookie); - // } else { + //console.log (">>>>>>>>>>>>> INTERCEPT OBJECT " + JSON.stringify(config)); + + // if ($rootScope.zmCookie) { + // config.headers.Cookie = "ZMSESSID=" + // $rootScope.zmCookie; + // console.log (">>>>> WOOOT HAVE COOKIE AND USING: "+$rootScope.zmCookie); + // } else { // console.log ("No cookie present in " + config.url); - // } + // } - // if ($rootScope.apiAuth) { - // console.log("********** API AUTH"); + // if ($rootScope.apiAuth) { + // console.log("********** API AUTH"); /*if (config.url.indexOf("/api/") > -1) { config.url = config.url + "&auth=" + $rootScope.authSession;*/ - // console.log("********** API AUTH muggled to:" + config.url); + // console.log("********** API AUTH muggled to:" + config.url); - // } + // } } if ((config.url.indexOf("/api/states/change/") > -1) || @@ -680,7 +682,7 @@ angular.module('zmApp', [ // these can take time, so lets bump up timeout config.timeout = zm.largeHttpTimeout; - } + } return config; }, @@ -768,7 +770,9 @@ angular.module('zmApp', [ $http.get(zm.blogUrl, { transformResponse: function (d, h) { var trunc = "])}while(1);</x>"; - if (d) {d = d.substr(trunc.length);} + if (d) { + d = d.substr(trunc.length); + } return d; } }) @@ -866,7 +870,7 @@ angular.module('zmApp', [ - + //------------------------------------------------------------------ @@ -916,11 +920,11 @@ angular.module('zmApp', [ function doLogoutAndLogin(str) { - return NVRDataModel.logout() - .then(function(ans) { - doLogin(str); + return NVRDataModel.logout() + .then(function (ans) { + doLogin(str); - }); + }); } @@ -938,7 +942,7 @@ angular.module('zmApp', [ // coming here means login is needed function (error) { - // console.log(">>>>>>>>>>>> FAST FAILED - THIS IS OK"); + // console.log(">>>>>>>>>>>> FAST FAILED - THIS IS OK"); var statename = $ionicHistory.currentStateName(); @@ -1058,7 +1062,7 @@ angular.module('zmApp', [ }); var loginData = NVRDataModel.getLogin(); - + var hDelay = loginData.enableSlowLoading ? zm.largeHttpTimeout : zm.httpTimeout; //NVRDataModel.debug ("*** AUTH LOGIN URL IS " + loginData.url); $http({ @@ -1088,7 +1092,7 @@ angular.module('zmApp', [ } }) .success(function (data, status, headers) { - // console.log(">>>>>>>>>>>>>> PARALLEL POST SUCCESS"); + // console.log(">>>>>>>>>>>>>> PARALLEL POST SUCCESS"); $ionicLoading.hide(); // Coming here does not mean success @@ -1143,7 +1147,7 @@ angular.module('zmApp', [ }) .error(function (error, status) { - // console.log(">>>>>>>>>>>>>> PARALLEL POST ERROR"); + // console.log(">>>>>>>>>>>>>> PARALLEL POST ERROR"); $ionicLoading.hide(); //console.log("**** ZM Login FAILED"); @@ -1263,7 +1267,7 @@ angular.module('zmApp', [ $rootScope.tappedEid = 0; //var eventsToDisplay=[]; $rootScope.alarmCount = "0"; - + $rootScope.currentServerGroup = "defaultServer"; $rootScope.validMonitorId = ""; $rootScope.newVersionAvailable = ""; @@ -1316,9 +1320,9 @@ angular.module('zmApp', [ // lets see if it really works $rootScope.online = navigator.onLine; - document.addEventListener("offline", function () { + document.addEventListener("offline", function () { //console.log ("OFFLINE------------------------------------"); - $timeout(function () { + $timeout(function () { $rootScope.online = false; NVRDataModel.log("Your network went offline"); @@ -1331,12 +1335,12 @@ angular.module('zmApp', [ //console.log ("ONLINE------------------------------------"); $timeout(function () { NVRDataModel.log("Your network came back online"); - + $rootScope.online = true; $timeout(function () { - var networkState="browser not supported"; - if (navigator.connection) networkState = navigator.connection.type; + var networkState = "browser not supported"; + if (navigator.connection) networkState = navigator.connection.type; NVRDataModel.debug("Detected network type as: " + networkState); var strState = NVRDataModel.getBandwidth(); NVRDataModel.debug("getBandwidth() normalized it as: " + strState); @@ -1419,7 +1423,7 @@ angular.module('zmApp', [ //console.log("HERE"); - if ($rootScope.apiValid == false && toState.name != 'app.invalidapi' && toState.data.requireLogin == true) { + if ($rootScope.apiValid == false && toState.name != 'app.invalidapi' && toState.data.requireLogin == true) { event.preventDefault(); $state.transitionTo('app.invalidapi'); return; @@ -1485,7 +1489,7 @@ angular.module('zmApp', [ // handles URL launches - + window.handleOpenURL = function (url) { $rootScope.tappedNotification = 2; // 1 is push $rootScope.tappedMid = 0; @@ -1496,7 +1500,7 @@ angular.module('zmApp', [ var qe = getQueryVariable(c.query, "eid"); if (qe) $rootScope.tappedEid = parseInt(qe); if (qm) $rootScope.tappedMid = parseInt(qm); - NVRDataModel.log("external URL called with MID=" + $rootScope.tappedMid + " and/or EID="+$rootScope.tappedEid); + NVRDataModel.log("external URL called with MID=" + $rootScope.tappedMid + " and/or EID=" + $rootScope.tappedEid); //console.log (">>>>>>>>> EID="+getQueryVariable(c.query, "eid")); } @@ -1505,7 +1509,7 @@ angular.module('zmApp', [ }; - + //console.log("Mobile acc"); if (window.cordova) MobileAccessibility.getTextZoom(getTextZoomCallback); @@ -1634,7 +1638,7 @@ angular.module('zmApp', [ }); function continueInitialInit() { - // console.log("continueinit"); + // console.log("continueinit"); var pixelRatio = window.devicePixelRatio || 1; $rootScope.pixelRatio = pixelRatio; $rootScope.devWidth = ((window.innerWidth > 0) ? window.innerWidth : screen.width); @@ -1645,29 +1649,29 @@ angular.module('zmApp', [ $rootScope.$stateParams = $stateParams; if (window.cordova && window.cordova.plugins.Keyboard) { - // console.log("no keyboard"); + // console.log("no keyboard"); // cordova.plugins.Keyboard.disableScroll(true); } if (window.StatusBar) { // org.apache.cordova.statusbar required - // console.log("statusbar"); + // console.log("statusbar"); NVRDataModel.log("Updating statusbar"); StatusBar.styleDefault(); - if ($rootScope.platformOS=='ios') { - // console.log ("<<<<<<<<<<<<<<<< OVERLAY"); + if ($rootScope.platformOS == 'ios') { + // console.log ("<<<<<<<<<<<<<<<< OVERLAY"); StatusBar.overlaysWebView(false); } - + StatusBar.backgroundColorByHexString("#2980b9"); } if (window.cordova) { - // console.log("Hiding splash"); + // console.log("Hiding splash"); $cordovaSplashscreen.hide(); - // console.log("app version"); + // console.log("app version"); cordova.getAppVersion.getVersionNumber().then(function (version) { appVersion = version; NVRDataModel.log("App Version: " + appVersion); @@ -1675,7 +1679,7 @@ angular.module('zmApp', [ }); } - // console.log("file logger"); + // console.log("file logger"); $fileLogger.checkFile().then(function (resp) { if (parseInt(resp.size) > zm.logFileMaxSize) { //console.log("inside file logger"); @@ -1750,7 +1754,7 @@ angular.module('zmApp', [ .then(function (succ) { //console.log ("FOUND STATE" + JSON.stringify(succ) + ":"+succ); if (succ) { - if ( succ.name == 'app.invalidapi' || succ.name == 'app.refresh' || succ.name == 'app.importantmessage') { + if (succ.name == 'app.invalidapi' || succ.name == 'app.refresh' || succ.name == 'app.importantmessage') { succ.name = 'app.montage'; } $rootScope.lastState = succ.name; @@ -1760,7 +1764,7 @@ angular.module('zmApp', [ $rootScope.lastStateParam = succ.params; - NVRDataModel.debug ("last state="+$rootScope.lastState+" param="+$rootScope.lastStateParam); + NVRDataModel.debug("last state=" + $rootScope.lastState + " param=" + $rootScope.lastStateParam); } loadServices(); @@ -1779,7 +1783,7 @@ angular.module('zmApp', [ NVRDataModel.log("Language file loaded, continuing with rest"); NVRDataModel.init(); - + zmCheckUpdates.start(); NVRDataModel.log("Setting up POST LOGIN timer"); zmAutoLogin.start(); @@ -1857,7 +1861,7 @@ angular.module('zmApp', [ document.addEventListener("pause", function () { NVRDataModel.setBackground(true); NVRDataModel.setJustResumed(false); - // NVRDataModel.setJustResumed(true); // used for window stop + // NVRDataModel.setJustResumed(true); // used for window stop NVRDataModel.log("ROOT APP:App is going into background"); EventServer.disconnect(); @@ -1869,7 +1873,7 @@ angular.module('zmApp', [ $rootScope.zmPopup.close(); - // NVRDataModel.log("ROOT APP: Stopping network "); + // NVRDataModel.log("ROOT APP: Stopping network "); //NVRDataModel.stopNetwork("called from app.js"); // dont call stopNetwork - we need to stop here @@ -1878,7 +1882,7 @@ angular.module('zmApp', [ - + if (ld.exitOnSleep && $rootScope.platformOS == "android") { NVRDataModel.log("user exited app"); diff --git a/www/js/controllers.js b/www/js/controllers.js index 0f4d3976..d7f5d6df 100644 --- a/www/js/controllers.js +++ b/www/js/controllers.js @@ -6,24 +6,24 @@ angular.module('zmApp.controllers', ['ionic', 'ionic.utils', 'ngCordova', 'ng-mfb', 'angularCircularNavigation', 'jett.ionic.content.banner', 'ionic-pullup']) -.controller('zmApp.BaseController', function ($scope, $ionicSideMenuDelegate, $ionicPlatform, $timeout, $rootScope) { + .controller('zmApp.BaseController', function ($scope, $ionicSideMenuDelegate, $ionicPlatform, $timeout, $rootScope) { $scope.openMenu = function () { - $ionicSideMenuDelegate.toggleLeft(); + $ionicSideMenuDelegate.toggleLeft(); }; $ionicPlatform.registerBackButtonAction(function (event) { - $ionicSideMenuDelegate.toggleLeft(); - $timeout(function () { - $rootScope.stateofSlide = $ionicSideMenuDelegate.isOpen() + new Date(); - }, 500); + $ionicSideMenuDelegate.toggleLeft(); + $timeout(function () { + $rootScope.stateofSlide = $ionicSideMenuDelegate.isOpen() + new Date(); + }, 500); }, 100); // Added for electron build to stop title propagation $scope.$on('$ionicView.afterEnter', function (ev, data) { - ev.stopPropagation(); + ev.stopPropagation(); }); -});
\ No newline at end of file + }); diff --git a/www/js/ionicUtils.js b/www/js/ionicUtils.js index c593624c..5cfa5d7b 100644 --- a/www/js/ionicUtils.js +++ b/www/js/ionicUtils.js @@ -6,27 +6,22 @@ angular.module('ionic.utils', []) -.factory('$localstorage', ['$window', function($window) -{ + .factory('$localstorage', ['$window', function ($window) { return { - init: function() {}, + init: function () {}, - set: function(key, value) - { - $window.localStorage[key] = value; - }, - get: function(key, defaultValue) - { - return $window.localStorage[key] || defaultValue; - }, - setObject: function(key, value) - { - $window.localStorage[key] = JSON.stringify(value); - }, - getObject: function(key) - { - return JSON.parse($window.localStorage[key] || '{}'); - } + set: function (key, value) { + $window.localStorage[key] = value; + }, + get: function (key, defaultValue) { + return $window.localStorage[key] || defaultValue; + }, + setObject: function (key, value) { + $window.localStorage[key] = JSON.stringify(value); + }, + getObject: function (key) { + return JSON.parse($window.localStorage[key] || '{}'); + } }; -}]); + }]); diff --git a/www/templates/devoptions.html b/www/templates/devoptions.html index 86c19561..e81e536f 100644 --- a/www/templates/devoptions.html +++ b/www/templates/devoptions.html @@ -1,48 +1,63 @@ <ion-view view-title="{{'kDevOptions' | translate}}"> - <ion-nav-buttons side="left"> - <button class="button button-icon button-clear ion-navicon" ng-click="openMenu()"></button> - <button data-badge="{{$root.alarmCount}}" class="animated infinite tada button button-icon button-clear ion-ios-bell notification-badge" ng-click="handleAlarms();" ng-if="$root.isAlarm"></button> - </ion-nav-buttons> - <ion-nav-buttons side="right"> - <button class="button button-clear" ng-click="saveDevOptions()">{{'kSave' | translate}}</button> - </ion-nav-buttons> - <ion-content delegate-handle="none" overflow-scroll="false" mouse-wheel-scroll> - <div class="list list-inset"> - <span style="color:rgb(100,100,100)"> - <i class="ion-android-settings" style="font-size:150%"></i> {{'kDeveloperOptionsFor'|translate}} {{loginData.serverName}} + <ion-nav-buttons side="left"> + <button class="button button-icon button-clear ion-navicon" ng-click="openMenu()"></button> + + <button data-badge="{{$root.alarmCount}}" class="animated infinite tada button button-icon button-clear ion-ios-bell notification-badge" + ng-click="handleAlarms();" ng-if="$root.isAlarm"></button> + </ion-nav-buttons> + <ion-nav-buttons side="right"> + <button class="button button-clear" ng-click="saveDevOptions()">{{'kSave' | translate}}</button> + </ion-nav-buttons> + <ion-content delegate-handle="none" overflow-scroll="false" mouse-wheel-scroll> + <div class="list list-inset"> + <span style="color:rgb(100,100,100)"> + <i class="ion-android-settings" style="font-size:150%"></i> {{'kDeveloperOptionsFor'|translate}} {{loginData.serverName}} + </span> + <div class="item item-input-inset"> + {{'kFrameUpdate'|translate}} ({{'kSec'|translate}}.) + <label class="item-input-wrapper"> + <input type="tel" placeholder="min is 1s" ng-model="loginData.refreshSec"> + </label> + </div> + <label> + <ion-toggle ng-model="loginData.use24hr" toggle-class="toggle-calm"> + <span class="item-text-wrap">{{'kEnable24hr' | translate}}</span> + </ion-toggle> + </label> + <label> + <ion-toggle ng-model="loginData.useLocalTimeZone" ng-disabled="!isTzSupported()" toggle-class="toggle-calm"> + <span class="item-text-wrap">{{'kLocalTimeZone' | translate}} + <span ng-if="!isTzSupported()"> + <p>{{'kTimeZoneNotSupported' | translate}}</p> </span> - <div class="item item-input-inset"> - {{'kFrameUpdate'|translate}} ({{'kSec'|translate}}.) - <label class="item-input-wrapper"> - <input type="tel" placeholder="min is 1s" ng-model="loginData.refreshSec"> - </label> - </div> - <label> - <ion-toggle ng-model="loginData.use24hr" toggle-class="toggle-calm"><span class="item-text-wrap">{{'kEnable24hr' | translate}}</span></ion-toggle> - </label> - <label> - <ion-toggle ng-model="loginData.useLocalTimeZone" ng-disabled="!isTzSupported()" toggle-class="toggle-calm"><span class="item-text-wrap">{{'kLocalTimeZone' | translate}}<span ng-if="!isTzSupported()"><p>{{'kTimeZoneNotSupported' | translate}}</p></span><span ng-if="isTzSupported()"><p>{{'kServerTimeZone' | translate}}:{{getTimeZoneNow()}}</p></span></span> - </ion-toggle> - </label> - - <label> - <ion-toggle ng-model="loginData.showLiveForInProgressEvents" toggle-class="toggle-calm"><span class="item-text-wrap">{{'kShowLiveForInProgress' | translate}}</span> - </ion-toggle> - </label> - - <div ng-if="$root.platformOS=='android'"> - <label> - <ion-toggle ng-model="loginData.exitOnSleep" toggle-class="toggle-calm"><span class="item-text-wrap">{{'kExitAppBackground' | translate}}</span></ion-toggle> - </label> - </div> - - <div class="item item-text-wrap item-input-inset"> - {{'kMaxMonitorsMontage' | translate }} - <label class="item-input-wrapper"> - <input type="tel" placeholder="{{'kBeCareful' | translate}}" ng-model="loginData.maxMontage"> - </label> - </div> - <!-- + <span ng-if="isTzSupported()"> + <p>{{'kServerTimeZone' | translate}}:{{getTimeZoneNow()}}</p> + </span> + </span> + </ion-toggle> + </label> + + <label> + <ion-toggle ng-model="loginData.showLiveForInProgressEvents" toggle-class="toggle-calm"> + <span class="item-text-wrap">{{'kShowLiveForInProgress' | translate}}</span> + </ion-toggle> + </label> + + <div ng-if="$root.platformOS=='android'"> + <label> + <ion-toggle ng-model="loginData.exitOnSleep" toggle-class="toggle-calm"> + <span class="item-text-wrap">{{'kExitAppBackground' | translate}}</span> + </ion-toggle> + </label> + </div> + + <div class="item item-text-wrap item-input-inset"> + {{'kMaxMonitorsMontage' | translate }} + <label class="item-input-wrapper"> + <input type="tel" placeholder="{{'kBeCareful' | translate}}" ng-model="loginData.maxMontage"> + </label> + </div> + <!-- <div class="item item-input-inset"> maxfps for streaming <label class="item-input-wrapper"> @@ -50,25 +65,25 @@ </label> </div> --> - <div class="item item-text-wrap item-input-inset"> - {{'kMontageImageScale' | translate}}(%) - <label class="item-input-wrapper"> - <input type="tel" placeholder="max is 70" ng-model="loginData.montageQuality"> - </label> - </div> - <div class="item item-text-wrap item-input-inset"> - {{'kEventSingleImageScale' | translate}}(%) - <label class="item-input-wrapper"> - <input type="tel" placeholder="" ng-model="loginData.singleImageQuality"> - </label> - </div> - <div class="item item-text-wrap item-input-inset"> - {{'kMonitorSingleImageScale' | translate}}(%) - <label class="item-input-wrapper"> - <input type="tel" placeholder="" ng-model="loginData.monSingleImageQuality"> - </label> - </div> - <!--<div class="item item-input-inset"> + <div class="item item-text-wrap item-input-inset"> + {{'kMontageImageScale' | translate}}(%) + <label class="item-input-wrapper"> + <input type="tel" placeholder="max is 70" ng-model="loginData.montageQuality"> + </label> + </div> + <div class="item item-text-wrap item-input-inset"> + {{'kEventSingleImageScale' | translate}}(%) + <label class="item-input-wrapper"> + <input type="tel" placeholder="" ng-model="loginData.singleImageQuality"> + </label> + </div> + <div class="item item-text-wrap item-input-inset"> + {{'kMonitorSingleImageScale' | translate}}(%) + <label class="item-input-wrapper"> + <input type="tel" placeholder="" ng-model="loginData.monSingleImageQuality"> + </label> + </div> + <!--<div class="item item-input-inset"> {{'kResumeDelay' | translate}}(ms) <label class="item-input-wrapper"> <input type="tel" placeholder="" ng-model="loginData.resumeDelay"> @@ -76,117 +91,132 @@ </label> </div>--> - <div class="item item-text-wrap item-input-inset"> - {{'kEventMontageImageScale'|translate}}(%) - <label class="item-input-wrapper"> - <input type="tel" placeholder="" ng-model="loginData.montageHistoryQuality"> - </label> - </div> - <div class="item item-text-wrap item-input-inset"> - {{'kMaxItemsForTimeline' | translate}} - <label class="item-input-wrapper"> - <input type="tel" placeholder="" ng-model="loginData.graphSize"> - <br/> - </label> - <br/> - </div> - <div class="item item-text-wrap item-input-inset"> - {{'kMinAlarmCount' | translate}} - <label class="item-input-wrapper"> - <input type="tel" placeholder="" ng-model="loginData.minAlarmCount"> - <br/> - </label> - <br/> - </div> - <div class="item" style="background-color:#C8F7C5" ng-if="loginData.graphSize > 5000"> - <label class="animated fadeInDown item-text-wrap"> - {{'kWarningLargeTimeline' | translate}} - </label> - </div> - - <label> - <ion-toggle ng-model="loginData.hideArchived" toggle-class="toggle-calm"><span class="item-text-wrap">{{'kHideArchived' | translate}} - </span> - </ion-toggle> - </label> - - <label ng-if="$root.platformOS!='desktop'"> - <ion-toggle ng-model="loginData.enableStrictSSL" toggle-class="toggle-calm"><span class="item-text-wrap">{{'kEnableStrictSSL' | translate}} - - </span> - </ion-toggle> - </label> - - <label> - <ion-toggle ng-model="loginData.enableGIFMP4" toggle-class="toggle-calm"><span class="item-text-wrap">{{'kEnableGIFMP4' | translate}} - </span> - </ion-toggle> - </label> - - - <label> - <ion-toggle ng-model="loginData.enableThumbs" toggle-class="toggle-calm"><span class="item-text-wrap">{{'kEnableThumbs' | translate}} - <p>{{'kEnableThumbsSub' | translate}}</p> - </span> - </ion-toggle> - </label> - - <label> - <ion-toggle ng-model="loginData.enableSlowLoading" toggle-class="toggle-calm"><span class="item-text-wrap">{{'kEnableSlowLoading' | translate}} - </span> - </ion-toggle> - </label> - - <label> - <ion-toggle ng-model="loginData.disableAlarmCheckMontage" toggle-class="toggle-calm"><span class="item-text-wrap">{{'kDisableAlarmMontage' | translate}} - <p>{{'kDisableAlarmMontageSub' | translate}}</p></span> - </ion-toggle> - </label> - - <label> - <ion-toggle ng-model="loginData.insertBasicAuthToken" toggle-class="toggle-calm"><span class="item-text-wrap">{{'kInsertBasicAuthToken' | translate}} - <p>{{'kInsertBasicAuthTokenNote' | translate}}</p></span> - </ion-toggle> - </label> - - <label ng-if="isMultiPort"> - <ion-toggle ng-model="loginData.disableSimulStreaming" - ng-change="checkMultiPortToggle()" toggle-class="toggle-calm"><span class="item-text-wrap">{{'kDisableSimulStreaming' | translate}} - <p ng-if="$root.platformOS=='ios'">{{'kDisableSimulStreamingNote' | translate}}</p> - </span> - </ion-toggle> - </label> - - <label> - <ion-toggle ng-model="loginData.enableLogs" toggle-class="toggle-calm"><span class="item-text-wrap">{{'kEnableLogs' | translate}}</span></ion-toggle> - </label> - - <label> - <ion-toggle ng-if="loginData.enableLogs" ng-model="loginData.enableDebug" toggle-class="toggle-calm"><span class="item-text-wrap">{{'kEnableDebug' | translate}}</span></ion-toggle> - </label> - - <div class="item item-text-wrap item-input-inset"> - {{'kCycleMonitorsInterval'|translate}}({{'kSec'|translate}}.) - <label class="item-input-wrapper"> - <input type="tel" placeholder="" ng-model="loginData.cycleMonitorsInterval"> - </label> - </div> - - <div class="item item-text-wrap item-input-inset"> - {{'kCycleMontageInterval'|translate}}({{'kSec'|translate}}.) - <label class="item-input-wrapper"> - <input type="tel" placeholder="" ng-model="loginData.cycleMontageInterval"> - </label> - </div> - - - - - <label ng-if="$root.platformOS != 'desktop'"> - <ion-toggle ng-model="loginData.disableNative" toggle-class="toggle-calm"> <span class="item-text-wrap">{{'kDisableNative' | translate}} - <p>{{'kDisableNativeSub' | translate}}</p></span> - </ion-toggle> - </label> - </div> - </ion-content> + <div class="item item-text-wrap item-input-inset"> + {{'kEventMontageImageScale'|translate}}(%) + <label class="item-input-wrapper"> + <input type="tel" placeholder="" ng-model="loginData.montageHistoryQuality"> + </label> + </div> + <div class="item item-text-wrap item-input-inset"> + {{'kMaxItemsForTimeline' | translate}} + <label class="item-input-wrapper"> + <input type="tel" placeholder="" ng-model="loginData.graphSize"> + <br/> + </label> + <br/> + </div> + <div class="item item-text-wrap item-input-inset"> + {{'kMinAlarmCount' | translate}} + <label class="item-input-wrapper"> + <input type="tel" placeholder="" ng-model="loginData.minAlarmCount"> + <br/> + </label> + <br/> + </div> + <div class="item" style="background-color:#C8F7C5" ng-if="loginData.graphSize > 5000"> + <label class="animated fadeInDown item-text-wrap"> + {{'kWarningLargeTimeline' | translate}} + </label> + </div> + + <label> + <ion-toggle ng-model="loginData.hideArchived" toggle-class="toggle-calm"> + <span class="item-text-wrap">{{'kHideArchived' | translate}} + </span> + </ion-toggle> + </label> + + <label ng-if="$root.platformOS!='desktop'"> + <ion-toggle ng-model="loginData.enableStrictSSL" toggle-class="toggle-calm"> + <span class="item-text-wrap">{{'kEnableStrictSSL' | translate}} + + </span> + </ion-toggle> + </label> + + <label> + <ion-toggle ng-model="loginData.enableGIFMP4" toggle-class="toggle-calm"> + <span class="item-text-wrap">{{'kEnableGIFMP4' | translate}} + </span> + </ion-toggle> + </label> + + + <label> + <ion-toggle ng-model="loginData.enableThumbs" toggle-class="toggle-calm"> + <span class="item-text-wrap">{{'kEnableThumbs' | translate}} + <p>{{'kEnableThumbsSub' | translate}}</p> + </span> + </ion-toggle> + </label> + + <label> + <ion-toggle ng-model="loginData.enableSlowLoading" toggle-class="toggle-calm"> + <span class="item-text-wrap">{{'kEnableSlowLoading' | translate}} + </span> + </ion-toggle> + </label> + + <label> + <ion-toggle ng-model="loginData.disableAlarmCheckMontage" toggle-class="toggle-calm"> + <span class="item-text-wrap">{{'kDisableAlarmMontage' | translate}} + <p>{{'kDisableAlarmMontageSub' | translate}}</p> + </span> + </ion-toggle> + </label> + + <label> + <ion-toggle ng-model="loginData.insertBasicAuthToken" toggle-class="toggle-calm"> + <span class="item-text-wrap">{{'kInsertBasicAuthToken' | translate}} + <p>{{'kInsertBasicAuthTokenNote' | translate}}</p> + </span> + </ion-toggle> + </label> + + <label ng-if="isMultiPort"> + <ion-toggle ng-model="loginData.disableSimulStreaming" ng-change="checkMultiPortToggle()" toggle-class="toggle-calm"> + <span class="item-text-wrap">{{'kDisableSimulStreaming' | translate}} + <p ng-if="$root.platformOS=='ios'">{{'kDisableSimulStreamingNote' | translate}}</p> + </span> + </ion-toggle> + </label> + + <label> + <ion-toggle ng-model="loginData.enableLogs" toggle-class="toggle-calm"> + <span class="item-text-wrap">{{'kEnableLogs' | translate}}</span> + </ion-toggle> + </label> + + <label> + <ion-toggle ng-if="loginData.enableLogs" ng-model="loginData.enableDebug" toggle-class="toggle-calm"> + <span class="item-text-wrap">{{'kEnableDebug' | translate}}</span> + </ion-toggle> + </label> + + <div class="item item-text-wrap item-input-inset"> + {{'kCycleMonitorsInterval'|translate}}({{'kSec'|translate}}.) + <label class="item-input-wrapper"> + <input type="tel" placeholder="" ng-model="loginData.cycleMonitorsInterval"> + </label> + </div> + + <div class="item item-text-wrap item-input-inset"> + {{'kCycleMontageInterval'|translate}}({{'kSec'|translate}}.) + <label class="item-input-wrapper"> + <input type="tel" placeholder="" ng-model="loginData.cycleMontageInterval"> + </label> + </div> + + + + + <label ng-if="$root.platformOS != 'desktop'"> + <ion-toggle ng-model="loginData.disableNative" toggle-class="toggle-calm"> + <span class="item-text-wrap">{{'kDisableNative' | translate}} + <p>{{'kDisableNativeSub' | translate}}</p> + </span> + </ion-toggle> + </label> + </div> + </ion-content> </ion-view> diff --git a/www/templates/events-date-time-filter.html b/www/templates/events-date-time-filter.html index 2aa2d6d5..395c29d2 100644 --- a/www/templates/events-date-time-filter.html +++ b/www/templates/events-date-time-filter.html @@ -1,27 +1,27 @@ <ion-view view-title="{{'kFilterEvents' | translate}}"> - <ion-content delegate-handle="none" overflow-scroll="false" mouse-wheel-scroll> - <label class="item item-input"> - <span class="input-label">{{'kFromDate'|translate}}:</span> - <input type="date" ng-model="$root.fromDate" max={{today}}> - </label> - <label class="item item-input"> - <span class="input-label">{{'kFromTime'|translate}}</span> - <input type="time" ng-model="$root.fromTime"> - </label> - <label class="item item-input"> - <span class="input-label">{{'kToDate'|translate}}</span> - <input type="date" ng-model="$root.toDate" max={{today}}> - </label> - <label class="item item-input"> - <span class="input-label">{{'kToTime'|translate}}</span> - <input type="time" ng-model="$root.toTime"> - </label> - <br/> - <center> - <button class="button" ng-click="saveFilters();"> {{'kSave'|translate}} - </button> - <button class="button" ng-click="removeFilters();"> {{'kReset'|translate}} - </button> - </center> - </ion-content> + <ion-content delegate-handle="none" overflow-scroll="false" mouse-wheel-scroll> + <label class="item item-input"> + <span class="input-label">{{'kFromDate'|translate}}:</span> + <input type="date" ng-model="$root.fromDate" max={{today}}> + </label> + <label class="item item-input"> + <span class="input-label">{{'kFromTime'|translate}}</span> + <input type="time" ng-model="$root.fromTime"> + </label> + <label class="item item-input"> + <span class="input-label">{{'kToDate'|translate}}</span> + <input type="date" ng-model="$root.toDate" max={{today}}> + </label> + <label class="item item-input"> + <span class="input-label">{{'kToTime'|translate}}</span> + <input type="time" ng-model="$root.toTime"> + </label> + <br/> + <center> + <button class="button" ng-click="saveFilters();"> {{'kSave'|translate}} + </button> + <button class="button" ng-click="removeFilters();"> {{'kReset'|translate}} + </button> + </center> + </ion-content> </ion-view> diff --git a/www/templates/events-graphs.html b/www/templates/events-graphs.html index 0e14016f..573bf6ad 100644 --- a/www/templates/events-graphs.html +++ b/www/templates/events-graphs.html @@ -1,65 +1,66 @@ <!----- NOT USED --------> <ion-view view-title="Monitor Event Summary" cache-view="false"> - <ion-nav-buttons side="left"> - <button class="button button-icon button-clear ion-navicon" ng-click="openMenu()"></button> - <button data-badge="{{$root.alarmCount}}" class="animated infinite tada button button-icon button-clear ion-ios-bell notification-badge" ng-click="handleAlarms();" ng-if="$root.isAlarm"></button> - </ion-nav-buttons> - <!-- I'm calling the same controller function but with different parameters when + <ion-nav-buttons side="left"> + <button class="button button-icon button-clear ion-navicon" ng-click="openMenu()"></button> + <button data-badge="{{$root.alarmCount}}" class="animated infinite tada button button-icon button-clear ion-ios-bell notification-badge" + ng-click="handleAlarms();" ng-if="$root.isAlarm"></button> + </ion-nav-buttons> + <!-- I'm calling the same controller function but with different parameters when you switch between tabs --> - <!-- Oddly, unless I add a "div ng-controller" before each canvas + <!-- Oddly, unless I add a "div ng-controller" before each canvas onClick handler does not work --> - <!-- All Events view --> - <div id="visualization"></div> - <ion-tabs class="tabs-icon-top tabs-stable"> - <ion-tab title="All" icon="ion-stats-bars" on-select="generateTCChart(0,'All Events',0)"> - <ion-nav-view> - <ion-content class="has-header"> - <div ng-controller="zmApp.EventsGraphsCtrl"> - <canvas tc-chartjs-bar chart-data="chart.data" chart-options="chart.options" ng-click="handleChartClick($event)" chart="chartwithbars"> - </canvas> - </div> - </ion-content> - </ion-nav-view> - </ion-tab> - <!-- All Events in the last hour --> - <ion-tab title="Last Hour" icon="ion-stats-bars" on-select="generateTCChart(1,'Events in the last hour',1)"> - <ion-nav-view> - <ion-content> - <div ng-controller="zmApp.EventsGraphsCtrl"> - <div style="overflow:scroll;"> - <canvas tc-chartjs-bar chart-data="chart.data" chart-options="chart.options" ng-click="handleChartClick($event)" chart="chartwithbars"> - </canvas> - </div> - </div> - </ion-content> - </ion-nav-view> - </ion-tab> - <!-- All Events in last 24 hrs--> - <ion-tab title="Day" icon="ion-stats-bars" on-select="generateTCChart(2,'Events in the last day',24)"> - <ion-nav-view> - <ion-content> - <div ng-controller="zmApp.EventsGraphsCtrl"> - <div style="overflow:scroll;"> - <canvas tc-chartjs-bar chart-data="chart.data" chart-options="chart.options" chart="chartwithbars" ng-click="handleChartClick($event)"> - </canvas> - </div> - </div> - </ion-content> - </ion-nav-view> - </ion-tab> - <!-- All Events in last week --> - <ion-tab title="Week" icon="ion-stats-bars" on-select="generateTCChart(3,'Events in the last week',168)"> - <ion-nav-view> - <ion-content> - <div ng-controller="zmApp.EventsGraphsCtrl"> - <div style="overflow:scroll;"> - <canvas tc-chartjs-bar chart-data="chart.data" chart-options="chart.options" chart="chartwithbars" ng-click="handleChartClick($event)"> - </canvas> - </div> - </div> - </ion-content> - </ion-nav-view> - </ion-tab> - </ion-tabs> + <!-- All Events view --> + <div id="visualization"></div> + <ion-tabs class="tabs-icon-top tabs-stable"> + <ion-tab title="All" icon="ion-stats-bars" on-select="generateTCChart(0,'All Events',0)"> + <ion-nav-view> + <ion-content class="has-header"> + <div ng-controller="zmApp.EventsGraphsCtrl"> + <canvas tc-chartjs-bar chart-data="chart.data" chart-options="chart.options" ng-click="handleChartClick($event)" chart="chartwithbars"> + </canvas> + </div> + </ion-content> + </ion-nav-view> + </ion-tab> + <!-- All Events in the last hour --> + <ion-tab title="Last Hour" icon="ion-stats-bars" on-select="generateTCChart(1,'Events in the last hour',1)"> + <ion-nav-view> + <ion-content> + <div ng-controller="zmApp.EventsGraphsCtrl"> + <div style="overflow:scroll;"> + <canvas tc-chartjs-bar chart-data="chart.data" chart-options="chart.options" ng-click="handleChartClick($event)" chart="chartwithbars"> + </canvas> + </div> + </div> + </ion-content> + </ion-nav-view> + </ion-tab> + <!-- All Events in last 24 hrs--> + <ion-tab title="Day" icon="ion-stats-bars" on-select="generateTCChart(2,'Events in the last day',24)"> + <ion-nav-view> + <ion-content> + <div ng-controller="zmApp.EventsGraphsCtrl"> + <div style="overflow:scroll;"> + <canvas tc-chartjs-bar chart-data="chart.data" chart-options="chart.options" chart="chartwithbars" ng-click="handleChartClick($event)"> + </canvas> + </div> + </div> + </ion-content> + </ion-nav-view> + </ion-tab> + <!-- All Events in last week --> + <ion-tab title="Week" icon="ion-stats-bars" on-select="generateTCChart(3,'Events in the last week',168)"> + <ion-nav-view> + <ion-content> + <div ng-controller="zmApp.EventsGraphsCtrl"> + <div style="overflow:scroll;"> + <canvas tc-chartjs-bar chart-data="chart.data" chart-options="chart.options" chart="chartwithbars" ng-click="handleChartClick($event)"> + </canvas> + </div> + </div> + </ion-content> + </ion-nav-view> + </ion-tab> + </ion-tabs> </ion-view> diff --git a/www/templates/events-modal.html b/www/templates/events-modal.html index e372929b..c51ef443 100644 --- a/www/templates/events-modal.html +++ b/www/templates/events-modal.html @@ -1,163 +1,186 @@ <div ng-controller="EventModalCtrl"> - <!-- style="width: 90%; height: 90%; top: 5%; left: 5%; right: 5%; bottom: 5%;"--> - <ion-modal-view cache-view="false"> - <ion-content style="background-color:#444444" ng-cloak> - - - <!-- alarm frames in snapshot--> - <div ng-if="isSnapShot() && !liveFeedMid"> - <ion-scroll direction="x" overflow-scroll="false" > - <div style="white-space:nowrap;"> - <span ng-repeat="alarm in alarm_images"> - <figure class="animated slideInLeft" style="display:inline-block"> - <img ng-src="{{constructFrame(alarm.frameid)}}" fallback-src="img/frameerror.png" style="width: auto; height: auto;max-width: 100%;max-height: 100px" ng-click="changeSnapshot(alarm.frameid)" on-double-tap="closeModal();" /> - </figure> - </span> - </div> - - </ion-scroll> - </div> + <!-- style="width: 90%; height: 90%; top: 5%; left: 5%; right: 5%; bottom: 5%;"--> + <ion-modal-view cache-view="false"> + <ion-content style="background-color:#444444" ng-cloak> + + + <!-- alarm frames in snapshot--> + <div ng-if="isSnapShot() && !liveFeedMid"> + <ion-scroll direction="x" overflow-scroll="false"> + <div style="white-space:nowrap;"> + <span ng-repeat="alarm in alarm_images"> + <figure class="animated slideInLeft" style="display:inline-block"> + <img ng-src="{{constructFrame(alarm.frameid)}}" fallback-src="img/frameerror.png" style="width: auto; height: auto;max-width: 100%;max-height: 100px" + ng-click="changeSnapshot(alarm.frameid)" on-double-tap="closeModal();" /> + </figure> + </span> + </div> + + </ion-scroll> + </div> + + <ion-scroll has-bouncing=false min-zoom=1 zooming="true" direction="xy" delegate-handle="imgscroll" overflow-scroll="false" + scrollbar-x="false" scrollbar-y="false"> + <div id="full-screen-event" style="height: 100vh;"> + + <div ng-if="defaultVideo=='' || isSnapShot()"> + <!--<div style="color:white">connkey:{{connKey}}</div>--> + <div style="width:100vw; height:100vh;"> + + <div ng-if="isSnapShot() && !liveFeedMid" class="event-modal-play"> + + <button class="button button-assertive icon ion-play" ng-click="convertSnapShotToStream()"> {{'kPlay'|translate}}</button> + </div> + + + + <img ng-if="!liveFeedMid" image-spinner-src="{{constructStream()}}" ng-class="{'object-fit_cover':imageFit==false, 'object-fit_contain':imageFit==true}" + on-double-tap="closeModal();" img-spinner-w="1024" img-spinner-h="768" image-spinner-loader="lines" imageonload="modalImageLoaded()" + on-swipe-left="onSwipeEvent(nextId,1)" on-swipe-right="onSwipeEvent(prevId,-1)" /> + + + <div ng-if="liveFeedMid"> + <img image-spinner-src="{{loginData.streamingurl}}/nph-zms?mode=jpeg&monitor={{liveFeedMid}}&connkey={{connKey}}{{$root.authSession}}" + ng-class="{'object-fit_cover':imageFit==false, 'object-fit_contain':imageFit==true}" on-double-tap="closeModal();" + img-spinner-w="1024" img-spinner-h="768" image-spinner-loader="lines" imageonload="modalImageLoaded()" on-swipe-left="onSwipeEvent(nextId,1)" + on-swipe-right="onSwipeEvent(prevId,-1)" /> + <div class="events-range-modal-text"> + <span class="events-range-modal-warning-text">{{eventWarning}}</span> + </div> + </div> - <ion-scroll has-bouncing=false min-zoom=1 zooming="true" direction="xy" delegate-handle="imgscroll" overflow-scroll="false" scrollbar-x="false" scrollbar-y="false"> - <div id="full-screen-event" style="height: 100vh;"> - - <div ng-if="defaultVideo=='' || isSnapShot()"> - <!--<div style="color:white">connkey:{{connKey}}</div>--> - <div style="width:100vw; height:100vh;"> - - <div ng-if="isSnapShot() && !liveFeedMid" class="event-modal-play"> - - <button class="button button-assertive icon ion-play" ng-click="convertSnapShotToStream()"> {{'kPlay'|translate}}</button> - </div> - - - - <img ng-if="!liveFeedMid" image-spinner-src="{{constructStream()}}" ng-class="{'object-fit_cover':imageFit==false, 'object-fit_contain':imageFit==true}" on-double-tap="closeModal();" - img-spinner-w="1024" img-spinner-h="768" image-spinner-loader="lines" - imageonload="modalImageLoaded()" on-swipe-left="onSwipeEvent(nextId,1)" on-swipe-right="onSwipeEvent(prevId,-1)" - /> - - - <div ng-if="liveFeedMid"> - <img image-spinner-src="{{loginData.streamingurl}}/nph-zms?mode=jpeg&monitor={{liveFeedMid}}&connkey={{connKey}}{{$root.authSession}}" ng-class="{'object-fit_cover':imageFit==false, 'object-fit_contain':imageFit==true}" on-double-tap="closeModal();" - img-spinner-w="1024" img-spinner-h="768" - image-spinner-loader="lines" - imageonload="modalImageLoaded()" on-swipe-left="onSwipeEvent(nextId,1)" on-swipe-right="onSwipeEvent(prevId,-1)" - /> - <div class="events-range-modal-text"><span class="events-range-modal-warning-text">{{eventWarning}}</span> </div> - </div> - - - - <div ng-if="isPaused" style="position:absolute; top:50%; left:50%;white-space:nowrap;overflow:hidden;z-index:999" class="header-paused"> - <i class="ion-pause"></i> {{'kPaused' | translate}} - </div> - </div> - </div> - <!-- no default video --> - <div ng-if="defaultVideo!==undefined && defaultVideo!='' && !isSnapShot() && !isStreamStopped()"> - <div ng-if="videoIsReady"> - - <!-- <div style="height:{{$root.devHeight}}px; width:{{$root.devWidth}}px;">--> - <div on-swipe-left="onSwipeEvent(nextId,1)" on-swipe-right="onSwipeEvent(prevId,-1)" ng-style="{'height':$root.devHeight+'px', 'width':$root.devWidth+'px'}"> - - <videogular vg-can-play="onCanPlay()" vg-native-fullscreen="videoObject.config.nativeFullScreen" vg-player-ready="onPlayerReady($API)" - vg-update-playback="onPlaybackUpdate($playBack)" - vg-plays-inline="videoObject.config.playsInline" vg-theme="videoObject.config.theme" vg-complete="playbackFinished()" on-double-tap="closeModal();" vg-autoplay="videoObject.config.autoPlay" vg-responsive="videoObject.config.responsive" vg-update-time="videoTime(event.Event.StartTime,$currentTime)" vg-error="onVideoError($event)"> - <vg-media vg-src="videoObject.config.sources" vg-native-controls="videoObject.config.nativeControls"> - </vg-media> - <vg-controls> - <vg-playback-button></vg-playback-button> - <vg-play-pause-button></vg-play-pause-button> - <vg-time-display>{{ videoTime(event.Event.StartTime, currentTime ); }}</vg-time-display> - <vg-scrub-bar> - <vg-scrub-bar-current-time></vg-scrub-bar-current-time> - <vg-cuepoints vg-cuepoints-config="videoObject.config.cuepoints" - vg-cuepoints-theme="videoObject.config.cuepoints.theme.url"> - </vg-cuepoints> - </vg-scrub-bar> - <vg-time-display>{{ timeLeft | date:'mm:ss':'+0000' }}</vg-time-display> - <vg-fullscreen-button></vg-fullscreen-button> - <vg-volume> - <vg-mute-button></vg-mute-button> - </vg-volume> - </vg-controls> - - </videogular> - </div> - </div> - <!--<div id="event_canvas_video"> + + + <div ng-if="isPaused" style="position:absolute; top:50%; left:50%;white-space:nowrap;overflow:hidden;z-index:999" class="header-paused"> + + <i class="ion-pause"></i> {{'kPaused' | translate}} + </div> + </div> + </div> + <!-- no default video --> + <div ng-if="defaultVideo!==undefined && defaultVideo!='' && !isSnapShot() && !isStreamStopped()"> + <div ng-if="videoIsReady"> + + <!-- <div style="height:{{$root.devHeight}}px; width:{{$root.devWidth}}px;">--> + <div on-swipe-left="onSwipeEvent(nextId,1)" on-swipe-right="onSwipeEvent(prevId,-1)" ng-style="{'height':$root.devHeight+'px', 'width':$root.devWidth+'px'}"> + + <videogular vg-can-play="onCanPlay()" vg-native-fullscreen="videoObject.config.nativeFullScreen" vg-player-ready="onPlayerReady($API)" + vg-update-playback="onPlaybackUpdate($playBack)" vg-plays-inline="videoObject.config.playsInline" vg-theme="videoObject.config.theme" + vg-complete="playbackFinished()" on-double-tap="closeModal();" vg-autoplay="videoObject.config.autoPlay" + vg-responsive="videoObject.config.responsive" vg-update-time="videoTime(event.Event.StartTime,$currentTime)" + vg-error="onVideoError($event)"> + <vg-media vg-src="videoObject.config.sources" vg-native-controls="videoObject.config.nativeControls"> + </vg-media> + <vg-controls> + <vg-playback-button></vg-playback-button> + <vg-play-pause-button></vg-play-pause-button> + <vg-time-display>{{ videoTime(event.Event.StartTime, currentTime ); }}</vg-time-display> + <vg-scrub-bar> + <vg-scrub-bar-current-time></vg-scrub-bar-current-time> + <vg-cuepoints vg-cuepoints-config="videoObject.config.cuepoints" vg-cuepoints-theme="videoObject.config.cuepoints.theme.url"> + </vg-cuepoints> + </vg-scrub-bar> + <vg-time-display>{{ timeLeft | date:'mm:ss':'+0000' }}</vg-time-display> + <vg-fullscreen-button></vg-fullscreen-button> + <vg-volume> + <vg-mute-button></vg-mute-button> + </vg-volume> + </vg-controls> + + </videogular> + </div> + </div> + <!--<div id="event_canvas_video"> <canvas id="eventchart" width="100%" height="20px"></canvas> </div>--> - </div> - </div> - <!-- 100vh --> - </ion-scroll> + </div> + </div> + <!-- 100vh --> + </ion-scroll> + - - <div ng-show="defaultVideo=='' && !liveFeedMid && !isSnapShot()"> - <div id="event_canvas"> - <canvas style="padding-left:23px; + <div ng-show="defaultVideo=='' && !liveFeedMid && !isSnapShot()"> + <div id="event_canvas"> + <canvas style="padding-left:23px; padding-right:23px;" id="eventchart" width="auto" height="20"></canvas> - </div> - - <div ng-if="checkEventOn" id="event_slider" data-tap-disabled="false"> - <div class="range"> - <input on-drag="enableSliderBlock()" on-release="youChangedSlider()" type="range" min="0" max="{{currentEventDuration}}" ng-model="sliderProgress.progress"> - </div> - </div> - <div id="event_rate_text"> - @{{currentRate}}x {{'kAt' | translate}}:{{currentProgress.progress}}s - </div> - </div> - - - - </ion-content> - </ion-modal-view> - - - - <div ng-show="!liveFeedMid"> - <nav mfb-menu position="br" effect="zoomin" label="{{'kCollapse'|translate}}" active-icon="ion-chevron-down" resting-icon="ion-chevron-up" toggling-method="click"> - <a mfb-button icon="ion-arrow-right-c" label="{{'kNextEvent'|translate}}" ng-click="jumpToEvent(nextId,1);"></a> - <a mfb-button icon="ion-arrow-left-c" label="{{'kPrevEvent'|translate}}" ng-click="jumpToEvent(prevId,-1);"></a> - <a ng-if="!isSnapShot()" mfb-button icon="ion-arrow-resize" label="{{imageFit? ('kFillScreen' | translate):('kFitScreen' | translate)}}" ng-click="scaleImage();"></a> - <a mfb-button icon="ion-close" label="{{'kExitEventView' | translate}}" ng-click="closeModal()"> </a> - </nav> - <nav ng-if=" !isSnapShot() && defaultVideo==''" mfb-menu position="tr" effect="zoomin" label="{{'kCollapse' | translate}}" active-icon="ion-chevron-up" resting-icon="ion-chevron-down" toggling-method="click"> - <a mfb-button icon="ion-skip-backward" label="{{'kFastRewind'|translate}}" ng-click="adjustSpeed('fr');"></a> - <a mfb-button icon="ion-skip-forward" label="{{'kFastForward'|translate}}" ng-click="adjustSpeed('ff');"></a> - <a mfb-button icon="ion-play" label="{{'kNormalPlay'|translate}}" ng-click="adjustSpeed('np');"></a> - <a mfb-button icon="ion-pause" label="{{'kPause'|translate}}" ng-click="adjustSpeed('p');"> </a> - </nav> - - <div class="events-range-modal-text">{{mName}} <i class="ion-arrow-right-b"></i> {{videoDynamicTime}} ({{humanizeTime}}) [{{d_eventId}}] <span class="events-range-modal-warning-text">{{eventWarning}}</span> </div> - <div id="flyoutmenu" style="position:absolute;bottom:100px;left:10px"> - <ul> - <li> - <a href="" ng-click="toggleListMenu()"> <i ng-class="(isToggleListMenu) ? 'icon ion-chevron-left': 'icon ion-chevron-right'"></i></a> - </li> - <li ng-if="defaultVideo=='' && isToggleListMenu" ng-style="{'background-color': loginData.gapless?'rgba(69, 170, 242,0.7)':'rgba(108, 122, 137, 0.7)'}"> - <a href="" ng-click="toggleGapless()"> <i class="ion-ios-loop-strong"></i>-{{loginData.gapless? ('kOn' | translate): ('kOff' | translate)}}</a> - </li> - <li ng-if="defaultVideo=='' && isToggleListMenu"> - <a href="" ng-click="saveEventImageToPhoneWithPerms(false)"> <i class="ion-ios-camera"></i></a> - </li> - <li ng-if="defaultVideo=='' && isToggleListMenu"> - <a href="" ng-click="saveEventImageToPhoneWithPerms(true)"> <i class="ion-android-notifications"></i></a> - </li> - <li ng-if="$root.isAlarm"> - <a data-badge="{{$root.alarmCount}}" class="notification-badge animated infinite tada" href="" ng-click="handleAlarms()"><i class="ion-ios-bell"></i></a> - </li> - - <li> - <a href="" ng-click="deleteAndMoveNext(eventId)"><i class="ion-trash-a"></i></a> - </li> - - - - </ul> </div> - </div> <!-- not live feed or snapshot --> + + <div ng-if="checkEventOn" id="event_slider" data-tap-disabled="false"> + <div class="range"> + <input on-drag="enableSliderBlock()" on-release="youChangedSlider()" type="range" min="0" max="{{currentEventDuration}}" + ng-model="sliderProgress.progress"> + </div> + </div> + <div id="event_rate_text"> + @{{currentRate}}x {{'kAt' | translate}}:{{currentProgress.progress}}s + </div> + </div> + + + + </ion-content> + </ion-modal-view> + + + + <div ng-show="!liveFeedMid"> + <nav mfb-menu position="br" effect="zoomin" label="{{'kCollapse'|translate}}" active-icon="ion-chevron-down" resting-icon="ion-chevron-up" + toggling-method="click"> + <a mfb-button icon="ion-arrow-right-c" label="{{'kNextEvent'|translate}}" ng-click="jumpToEvent(nextId,1);"></a> + <a mfb-button icon="ion-arrow-left-c" label="{{'kPrevEvent'|translate}}" ng-click="jumpToEvent(prevId,-1);"></a> + <a ng-if="!isSnapShot()" mfb-button icon="ion-arrow-resize" label="{{imageFit? ('kFillScreen' | translate):('kFitScreen' | translate)}}" + ng-click="scaleImage();"></a> + <a mfb-button icon="ion-close" label="{{'kExitEventView' | translate}}" ng-click="closeModal()"> </a> + </nav> + <nav ng-if=" !isSnapShot() && defaultVideo==''" mfb-menu position="tr" effect="zoomin" label="{{'kCollapse' | translate}}" + active-icon="ion-chevron-up" resting-icon="ion-chevron-down" toggling-method="click"> + <a mfb-button icon="ion-skip-backward" label="{{'kFastRewind'|translate}}" ng-click="adjustSpeed('fr');"></a> + <a mfb-button icon="ion-skip-forward" label="{{'kFastForward'|translate}}" ng-click="adjustSpeed('ff');"></a> + <a mfb-button icon="ion-play" label="{{'kNormalPlay'|translate}}" ng-click="adjustSpeed('np');"></a> + <a mfb-button icon="ion-pause" label="{{'kPause'|translate}}" ng-click="adjustSpeed('p');"> </a> + </nav> + + <div class="events-range-modal-text">{{mName}} + <i class="ion-arrow-right-b"></i> {{videoDynamicTime}} ({{humanizeTime}}) [{{d_eventId}}] + <span class="events-range-modal-warning-text">{{eventWarning}}</span> + </div> + <div id="flyoutmenu" style="position:absolute;bottom:100px;left:10px"> + <ul> + <li> + <a href="" ng-click="toggleListMenu()"> + <i ng-class="(isToggleListMenu) ? 'icon ion-chevron-left': 'icon ion-chevron-right'"></i> + </a> + </li> + <li ng-if="defaultVideo=='' && isToggleListMenu" ng-style="{'background-color': loginData.gapless?'rgba(69, 170, 242,0.7)':'rgba(108, 122, 137, 0.7)'}"> + <a href="" ng-click="toggleGapless()"> + <i class="ion-ios-loop-strong"></i>-{{loginData.gapless? ('kOn' | translate): ('kOff' | translate)}}</a> + </li> + <li ng-if="defaultVideo=='' && isToggleListMenu"> + <a href="" ng-click="saveEventImageToPhoneWithPerms(false)"> + <i class="ion-ios-camera"></i> + </a> + </li> + <li ng-if="defaultVideo=='' && isToggleListMenu"> + <a href="" ng-click="saveEventImageToPhoneWithPerms(true)"> + <i class="ion-android-notifications"></i> + </a> + </li> + <li ng-if="$root.isAlarm"> + <a data-badge="{{$root.alarmCount}}" class="notification-badge animated infinite tada" href="" ng-click="handleAlarms()"> + <i class="ion-ios-bell"></i> + </a> + </li> + + <li> + <a href="" ng-click="deleteAndMoveNext(eventId)"> + <i class="ion-trash-a"></i> + </a> + </li> + + + + </ul> + </div> + </div> + <!-- not live feed or snapshot --> </div> diff --git a/www/templates/events-modalgraph.html b/www/templates/events-modalgraph.html index 25b38543..75f2ec15 100644 --- a/www/templates/events-modalgraph.html +++ b/www/templates/events-modalgraph.html @@ -1,9 +1,9 @@ <div ng-controller="EventsModalGraphCtrl"> - <ion-modal-view cache-view="false" style="width:80%;height:80%; top: 10%; left: 10%; right: 10%; bottom: 10%;"> - <ion-content ng-cloak on-double-tap="closeModal()" delegate-handle="eventgraph-modal-delegate"> - <div data-tap-disabled="true"> - <canvas id="eventchart" width="auto" height="70%"></canvas> - </div> - </ion-content> - </ion-modal-view> + <ion-modal-view cache-view="false" style="width:80%;height:80%; top: 10%; left: 10%; right: 10%; bottom: 10%;"> + <ion-content ng-cloak on-double-tap="closeModal()" delegate-handle="eventgraph-modal-delegate"> + <div data-tap-disabled="true"> + <canvas id="eventchart" width="auto" height="70%"></canvas> + </div> + </ion-content> + </ion-modal-view> </div> diff --git a/www/templates/events-popover.html b/www/templates/events-popover.html index 43c3ee88..5c7e7c15 100644 --- a/www/templates/events-popover.html +++ b/www/templates/events-popover.html @@ -1,15 +1,15 @@ <ion-popover-view class="fit"> - <ion-content> - <div class="list" ng-click="popover.hide()"> - <a class="item" ng-href="" ng-click="popover.hide();$state.go('app.events-date-time-filter');">{{'kFilterByDateTime' | translate}}</a> - <!-- <a class="item" ng-href="" ng-click=" popover.hide();$state.go('events-graphs');" > + <ion-content> + <div class="list" ng-click="popover.hide()"> + <a class="item" ng-href="" ng-click="popover.hide();$state.go('app.events-date-time-filter');">{{'kFilterByDateTime' | translate}}</a> + <!-- <a class="item" ng-href="" ng-click=" popover.hide();$state.go('events-graphs');" > Event Graphs </a>--> - <a class="item" ng-href="" ng-click="popover.hide();doRefresh();"> - {{'kRefresh' | translate}} - </a> - <a class="item" ng-href="" ng-click="popover.hide();toggleMinAlarmFrameCount();" ng-if="loginData.enableAlarmCount">{{'kShowAllEvents' | translate}}</a> - <a class="item" ng-href="" ng-click="popover.hide();toggleMinAlarmFrameCount();" ng-if="!loginData.enableAlarmCount"> {{'kShowAlarmedEvents' | translate}}</a> - </div> - </ion-content> + <a class="item" ng-href="" ng-click="popover.hide();doRefresh();"> + {{'kRefresh' | translate}} + </a> + <a class="item" ng-href="" ng-click="popover.hide();toggleMinAlarmFrameCount();" ng-if="loginData.enableAlarmCount">{{'kShowAllEvents' | translate}}</a> + <a class="item" ng-href="" ng-click="popover.hide();toggleMinAlarmFrameCount();" ng-if="!loginData.enableAlarmCount"> {{'kShowAlarmedEvents' | translate}}</a> + </div> + </ion-content> </ion-popover-view> diff --git a/www/templates/events.html b/www/templates/events.html index a07d98a1..6167603e 100644 --- a/www/templates/events.html +++ b/www/templates/events.html @@ -44,32 +44,32 @@ depending on the cause of the event --> <span ng-switch on="event.Event.Cause"> <span ng-switch-when="Motion"> - <i class="ion-android-walk" style="font-size:150%;" ></i> - <!-- <i ng-class="(event.Event.DefaultVideo !== undefined && event.Event.DefaultVideo!='')? 'ion-ios-videocam':'ion-images'" style="float:left; padding-left:5px; font-size:100%;"></i>--> - + <i class="ion-android-walk" style="font-size:150%;"></i> + <!-- <i ng-class="(event.Event.DefaultVideo !== undefined && event.Event.DefaultVideo!='')? 'ion-ios-videocam':'ion-images'" style="float:left; padding-left:5px; font-size:100%;"></i>--> + </span> <span ng-switch-when="Signal"> - <i class="ion-wifi" style="font-size:150%;" ></i> + <i class="ion-wifi" style="font-size:150%;"></i> <!--<i ng-class="(event.Event.DefaultVideo !== undefined && event.Event.DefaultVideo!='')? 'ion-ios-videocam':'ion-images'" style="float:left; padding-left:5px; font-size:100%;"></i>--> - + </span> <span ng-switch-default> <i class="ion-ionic" style="font-size:150%;"></i> - - + + </span> </span> <!-- ng switch --> <!-- {{event.Event.Cause}} --> - - - - <!-- col col left--> - - <b> - <i ng-if="event.Event.Archived=='1'" class="ion-ios-flag" style="color:red"> </i>{{event.Event.MonitorName}}</b> - <span ng-if="!loginData.enableThumbs">({{event.Event.Id}})</span> - <br/> + + + + <!-- col col left--> + + <b> + <i ng-if="event.Event.Archived=='1'" class="ion-ios-flag" style="color:red"> </i>{{event.Event.MonitorName}}</b> + <span ng-if="!loginData.enableThumbs">({{event.Event.Id}})</span> + <br/> <i class="ion-images"></i> {{event.Event.Frames}} <i class="ion-ios-bell-outline"></i> {{event.Event.AlarmFrames}} @@ -90,22 +90,21 @@ </button> <!--<i class="ion-arrow-graph-up-right"></i> {{event.Event.TotScore}}--> - </div> + </div> - <div class="col col-40" align="right" ng-if="loginData.enableThumbs"> - <!-- thumbnail --> - - <!-- ng-image-appear transition-duration="0.5s" animation="fillIn" bg-color="#50a4e2" {{event.Event.thumbWidth}}X{{event.Event.thumbHeight}}--> - <div style="max-height:200px; max-width:200px"> - <img ng-image-appear transition-duration="0.3s" animation="fillIn" bg-color="#6C7A89" - ng-src="{{constructThumbnail(event)}}" on-tap="closeIfOpen(event);openModalWithSnapshot(event)" width="100%" - height="100%" /> - <!--<p>{{event.Event.thumbWidth}}px*{{event.Event.thumbHeight}}px</p>--> - </div> + <div class="col col-40" align="right" ng-if="loginData.enableThumbs"> + <!-- thumbnail --> + <!-- ng-image-appear transition-duration="0.5s" animation="fillIn" bg-color="#50a4e2" {{event.Event.thumbWidth}}X{{event.Event.thumbHeight}}--> + <div style="max-height:200px; max-width:200px"> + <img ng-image-appear transition-duration="0.3s" animation="fillIn" bg-color="#6C7A89" ng-src="{{constructThumbnail(event)}}" + on-tap="closeIfOpen(event);openModalWithSnapshot(event)" width="100%" height="100%" /> + <!--<p>{{event.Event.thumbWidth}}px*{{event.Event.thumbHeight}}px</p>--> </div> - + + </div> + </div> <!--row--> <div class="row" style="font-size:80%; color:rgb(110,110,110)"> diff --git a/www/templates/eventserversettings.html b/www/templates/eventserversettings.html index 1eff634b..602f8ca4 100644 --- a/www/templates/eventserversettings.html +++ b/www/templates/eventserversettings.html @@ -1,55 +1,57 @@ <ion-view cache-view="false"> - <ion-nav-title>{{'kEventServer' | translate}}/{{getTitle();}} </ion-nav-title> - <ion-nav-buttons side="left"> - <button class="button button-icon button-clear ion-navicon" ng-click="openMenu()"></button> - <button data-badge="{{$root.alarmCount}}" class="animated infinite tada button button-icon button-clear ion-ios-bell notification-badge" ng-click="handleAlarms();" ng-if="$root.isAlarm"></button> - </ion-nav-buttons> - <ion-nav-buttons side="right"> - <button class="button button-clear" ng-click="saveItems()">{{'kSave'|translate}}</button> - </ion-nav-buttons> - <ion-content delegate-handle="none" overflow-scroll="false" mouse-wheel-scroll> - <div class="list list-inset"> - {{'kEventServerConfig1' | translate }} - </div> - <ion-checkbox ng-model="loginData.isUseEventServer">{{'kUseEventServer' | translate}}</ion-checkbox> - <ion-item ng-href="" ng-click="selectScreen()"> - {{'kOnTapNavigate' | translate}}: {{defScreen}} + <ion-nav-title>{{'kEventServer' | translate}}/{{getTitle();}} </ion-nav-title> + <ion-nav-buttons side="left"> + <button class="button button-icon button-clear ion-navicon" ng-click="openMenu()"></button> + <button data-badge="{{$root.alarmCount}}" class="animated infinite tada button button-icon button-clear ion-ios-bell notification-badge" + ng-click="handleAlarms();" ng-if="$root.isAlarm"></button> + </ion-nav-buttons> + <ion-nav-buttons side="right"> + <button class="button button-clear" ng-click="saveItems()">{{'kSave'|translate}}</button> + </ion-nav-buttons> + <ion-content delegate-handle="none" overflow-scroll="false" mouse-wheel-scroll> + <div class="list list-inset"> + {{'kEventServerConfig1' | translate }} + </div> + <ion-checkbox ng-model="loginData.isUseEventServer">{{'kUseEventServer' | translate}}</ion-checkbox> + <ion-item ng-href="" ng-click="selectScreen()"> + {{'kOnTapNavigate' | translate}}: {{defScreen}} + </ion-item> + <label class="item item-input item-floating-label" ng-if="loginData.isUseEventServer"> + <span class="input-label">{{'kEventServer' | translate}}</span> + <input autocapitalize="none" autocomplete="off" autocorrect="off" type="text" placeholder="{{'kEventNotificationUrl' | translate}}" + ng-model="loginData.eventServer"> + </label> + <ion-toggle ng-if="loginData.isUseEventServer" ng-model="loginData.disablePush" toggle-class="toggle-calm" class="item-text-wrap">{{'kOnlyUseWebSocket'| translate }} + <br/> + <p>{{'kDisablePush' | translate }}</p> + </ion-toggle> + <!-- vibrate app setting is not av. on iOS--> + <ion-toggle ng-if="loginData.isUseEventServer && $root.platformOS !='ios'" ng-model="loginData.vibrateOnPush" toggle-class="toggle-calm">{{'kVibrateOnPush'| translate }}</ion-toggle> + <ion-toggle ng-if="loginData.isUseEventServer" ng-model="loginData.soundOnPush" toggle-class="toggle-calm" class="item-text-wrap">{{'kSoundOnPush'| translate }}</ion-toggle> + + <ion-list> + <div ng-repeat="monitor in monitors"> + <ion-item class="custom-list" ng-click="toggleGroup(monitor)" ng-class="{active: isGroupShown(monitor)}"> + <i class="icon" ng-class="isGroupShown(monitor) ? 'ion-minus' : 'ion-plus'"></i> {{monitor.Monitor.Name}} </ion-item> - <label class="item item-input item-floating-label" ng-if="loginData.isUseEventServer"> - <span class="input-label">{{'kEventServer' | translate}}</span> - <input autocapitalize="none" autocomplete="off" autocorrect="off" type="text" placeholder="{{'kEventNotificationUrl' | translate}}" ng-model="loginData.eventServer"> - </label> - <ion-toggle ng-if="loginData.isUseEventServer" ng-model="loginData.disablePush" toggle-class="toggle-calm" class="item-text-wrap">{{'kOnlyUseWebSocket'| translate }} - <br/> - <p>{{'kDisablePush' | translate }}</p> - </ion-toggle> - <!-- vibrate app setting is not av. on iOS--> - <ion-toggle ng-if="loginData.isUseEventServer && $root.platformOS !='ios'" ng-model="loginData.vibrateOnPush" toggle-class="toggle-calm">{{'kVibrateOnPush'| translate }}</ion-toggle> - <ion-toggle ng-if="loginData.isUseEventServer" ng-model="loginData.soundOnPush" toggle-class="toggle-calm" class="item-text-wrap">{{'kSoundOnPush'| translate }}</ion-toggle> - - <ion-list> - <div ng-repeat="monitor in monitors"> - <ion-item class="custom-list" ng-click="toggleGroup(monitor)" ng-class="{active: isGroupShown(monitor)}"> - <i class="icon" ng-class="isGroupShown(monitor) ? 'ion-minus' : 'ion-plus'"></i> {{monitor.Monitor.Name}} - </ion-item> - <ion-item class="item-accordion" ng-show="isGroupShown(monitor)"> - <span class="item-checkbox"> - - {{'kReportEvents' | translate }} - <label class="checkbox"> - <input type="checkbox" ng-model="monitor.Monitor.isChecked" > - </label> - </span> - </ion-item> - <ion-item class="item-accordion" ng-show="isGroupShown(monitor)"> - <div class="item-input-inset"> - <label class="item-input-wrapper"> - <input type="tel" placeholder="{{'kSec' | translate}}" ng-model="monitor.Monitor.reportingInterval"> - </label> - {{'kMinimumIntervals' | translate}} - </div> - </ion-item> - </div> - </ion-list> - </ion-content> + <ion-item class="item-accordion" ng-show="isGroupShown(monitor)"> + <span class="item-checkbox"> + + {{'kReportEvents' | translate }} + <label class="checkbox"> + <input type="checkbox" ng-model="monitor.Monitor.isChecked"> + </label> + </span> + </ion-item> + <ion-item class="item-accordion" ng-show="isGroupShown(monitor)"> + <div class="item-input-inset"> + <label class="item-input-wrapper"> + <input type="tel" placeholder="{{'kSec' | translate}}" ng-model="monitor.Monitor.reportingInterval"> + </label> + {{'kMinimumIntervals' | translate}} + </div> + </ion-item> + </div> + </ion-list> + </ion-content> </ion-view> diff --git a/www/templates/first-use.html b/www/templates/first-use.html index 884fb0c9..aa1475bf 100644 --- a/www/templates/first-use.html +++ b/www/templates/first-use.html @@ -1,38 +1,39 @@ <ion-view view-title="{{$root.appName}}" hide-nav-bar="true" hide-back-button="true" cache-view="false"> - <ion-content class="pin-background"> - <div style="margin-left:20px; margin-right:20px"> - <center> - <br/> - <br/> - <div id="responsive-image"> - <img src="img/authlogo.png"> - </div> - <br/> - <span style="color:white"> - <h2 style="color:white" >Hi There!</h2> - <br/> - <h4 style="color:white">{{'kThanksForUsing' | translate}} {{$root.appName}}. <br/><br/> - {{'kNeedToKnow' | translate}} - </h4> - <br/> - - </span> - <br/> - <div id="firstuse"> - <button class="button icon icon-left ion-wand button-stable animated bounceInUp" ng-click="goToWizard()"> - {{'kWizard' | translate}} - </button> - <button class="button icon icon-left ion-university button-stable animated bounceInUp" ng-click="goToLogin()"> - {{'kExpert' | translate }} - </button> - <br/> - <center> - <button class="button button-clear icon icon-left ion-android-globe white-button-text animated bounceInUp" ng-click="switchLang()"> - {{'kLanguage' | translate}} - </button> - </center> - </div> - </center> + <ion-content class="pin-background"> + <div style="margin-left:20px; margin-right:20px"> + <center> + <br/> + <br/> + <div id="responsive-image"> + <img src="img/authlogo.png"> </div> - </ion-content> + <br/> + <span style="color:white"> + <h2 style="color:white">Hi There!</h2> + <br/> + <h4 style="color:white">{{'kThanksForUsing' | translate}} {{$root.appName}}. + <br/> + <br/> {{'kNeedToKnow' | translate}} + </h4> + <br/> + + </span> + <br/> + <div id="firstuse"> + <button class="button icon icon-left ion-wand button-stable animated bounceInUp" ng-click="goToWizard()"> + {{'kWizard' | translate}} + </button> + <button class="button icon icon-left ion-university button-stable animated bounceInUp" ng-click="goToLogin()"> + {{'kExpert' | translate }} + </button> + <br/> + <center> + <button class="button button-clear icon icon-left ion-android-globe white-button-text animated bounceInUp" ng-click="switchLang()"> + {{'kLanguage' | translate}} + </button> + </center> + </div> + </center> + </div> + </ion-content> </ion-view> diff --git a/www/templates/help.html b/www/templates/help.html index e9a9876b..8a497c5e 100644 --- a/www/templates/help.html +++ b/www/templates/help.html @@ -1,12 +1,15 @@ <ion-view cache-view="false" view-title="{{'kHelp' | translate}}"> - <ion-nav-buttons side="left"> - <button class="button button-icon button-clear ion-navicon" ng-click="openMenu()"></button> - <button data-badge="{{$root.alarmCount}}" class="animated infinite tada button button-icon button-clear ion-ios-bell notification-badge" ng-click="handleAlarms();" ng-if="$root.isAlarm"></button> - </ion-nav-buttons> - <ion-content class="padding" delegate-handle="none" overflow-scroll="false" mouse-wheel-scroll> - <p><small>{{$root.appName}} v{{zmAppVersion}}</small></p> - <div class="list"> - <div id="insertHelp"></div> - </div> - </ion-content> + <ion-nav-buttons side="left"> + <button class="button button-icon button-clear ion-navicon" ng-click="openMenu()"></button> + <button data-badge="{{$root.alarmCount}}" class="animated infinite tada button button-icon button-clear ion-ios-bell notification-badge" + ng-click="handleAlarms();" ng-if="$root.isAlarm"></button> + </ion-nav-buttons> + <ion-content class="padding" delegate-handle="none" overflow-scroll="false" mouse-wheel-scroll> + <p> + <small>{{$root.appName}} v{{zmAppVersion}}</small> + </p> + <div class="list"> + <div id="insertHelp"></div> + </div> + </ion-content> </ion-view> diff --git a/www/templates/image-modal.html b/www/templates/image-modal.html index 2ac07f40..c1e0e5e6 100644 --- a/www/templates/image-modal.html +++ b/www/templates/image-modal.html @@ -3,12 +3,11 @@ <div id="imagecontainer"> - <ion-scroll has-bouncing=false min-zoom=1 zooming="true" - direction="xy" style="width: 100%;" overflow-scroll="false"> - <img on-double-tap="closeModal();" ng-src="{{thumbnailLarge}}" style="display:block; width:100%;" /> + <ion-scroll has-bouncing=false min-zoom=1 zooming="true" direction="xy" style="width: 100%;" overflow-scroll="false"> + <img on-double-tap="closeModal();" ng-src="{{thumbnailLarge}}" style="display:block; width:100%;" /> </ion-scroll> - </div> + </div> </ion-content> </ion-modal-view> diff --git a/www/templates/important_message.html b/www/templates/important_message.html index f0fd245e..3838dd76 100644 --- a/www/templates/important_message.html +++ b/www/templates/important_message.html @@ -1,34 +1,37 @@ <ion-view view-title="{{$root.appName}}" hide-nav-bar="false" hide-back-button="false" cache-view="false"> - <ion-nav-buttons side="left"> - <button class="button button-icon button-clear ion-navicon" ng-click="openMenu()"></button> - </ion-nav-buttons> - <ion-content class="pin-background"> - <div style="margin-left:20px; margin-right:20px"> - <center> - <br/> - <br/> - <div id="responsive-image"> - <img src="img/authlogo.png"> - </div> - <br/> - <span style="color:white"> - <h2 style="color:white" class="animated bounce">{{'kImpMsg1' | translate}}</h2> - <br/> - <h4 style="color:white">{{'kImpMsg2' | translate}}</h4> - <br/> - {{'kImpMsg3' | translate}} v{{currentVersion}}.<br/> v{{recommendedVersion}} {{'kImpMsg4' | translate}} - <br/> - {{'kImpMsg5' | translate}}: <b>v{{currentVersion}}</b><br/> - {{'kImpMsg6' | translate}}:<b>v{{recommendedVersion}}</b><br/><br/> - - <button class="button button-stable animated bounceInUp" ng-click="openMenu()"> - {{'kImpMsg7' | translate}} - </button> - - - </span> - </center> - <br/> + <ion-nav-buttons side="left"> + <button class="button button-icon button-clear ion-navicon" ng-click="openMenu()"></button> + </ion-nav-buttons> + <ion-content class="pin-background"> + <div style="margin-left:20px; margin-right:20px"> + <center> + <br/> + <br/> + <div id="responsive-image"> + <img src="img/authlogo.png"> </div> - </ion-content> + <br/> + <span style="color:white"> + <h2 style="color:white" class="animated bounce">{{'kImpMsg1' | translate}}</h2> + <br/> + <h4 style="color:white">{{'kImpMsg2' | translate}}</h4> + <br/> {{'kImpMsg3' | translate}} v{{currentVersion}}. + <br/> v{{recommendedVersion}} {{'kImpMsg4' | translate}} + <br/> {{'kImpMsg5' | translate}}: + <b>v{{currentVersion}}</b> + <br/> {{'kImpMsg6' | translate}}: + <b>v{{recommendedVersion}}</b> + <br/> + <br/> + + <button class="button button-stable animated bounceInUp" ng-click="openMenu()"> + {{'kImpMsg7' | translate}} + </button> + + + </span> + </center> + <br/> + </div> + </ion-content> </ion-view> diff --git a/www/templates/invalidapi.html b/www/templates/invalidapi.html index af3a6977..032a8693 100644 --- a/www/templates/invalidapi.html +++ b/www/templates/invalidapi.html @@ -1,30 +1,31 @@ <ion-view view-title="{{$root.appName}}" hide-nav-bar="false" hide-back-button="false" cache-view="false"> - <ion-nav-buttons side="left"> - <button class="button button-icon button-clear ion-navicon" ng-click="openMenu()"></button> - </ion-nav-buttons> - <ion-content class="pin-background"> - <div style="margin-left:20px; margin-right:20px"> - <center> - <br/> - <br/> - <div id="responsive-image"> - <img src="img/authlogo.png"> - </div> - <br/> - <span style="color:white"> - <h2 style="color:white" class="animated bounce">{{'kInvalidAPIHeader' | translate}}</h2> - <br/> - <h4 style="color:white">{{'kInvalidAPIBody' | translate}}</h4> - - <br/><br/> - - <button class="button button-stable animated bounceInUp" ng-click="readFAQ()"> - {{'kInvalidAPIRead' | translate}}</button> - - - </span> - </center> - <br/> + <ion-nav-buttons side="left"> + <button class="button button-icon button-clear ion-navicon" ng-click="openMenu()"></button> + </ion-nav-buttons> + <ion-content class="pin-background"> + <div style="margin-left:20px; margin-right:20px"> + <center> + <br/> + <br/> + <div id="responsive-image"> + <img src="img/authlogo.png"> </div> - </ion-content> + <br/> + <span style="color:white"> + <h2 style="color:white" class="animated bounce">{{'kInvalidAPIHeader' | translate}}</h2> + <br/> + <h4 style="color:white">{{'kInvalidAPIBody' | translate}}</h4> + + <br/> + <br/> + + <button class="button button-stable animated bounceInUp" ng-click="readFAQ()"> + {{'kInvalidAPIRead' | translate}}</button> + + + </span> + </center> + <br/> + </div> + </ion-content> </ion-view> diff --git a/www/templates/log.html b/www/templates/log.html index 144ada6a..e505bda1 100644 --- a/www/templates/log.html +++ b/www/templates/log.html @@ -1,42 +1,45 @@ <ion-view view-title="{{logEntity}} {{'kLogs' | translate}}"> - <ion-nav-buttons side="left"> - <button class="button button-icon button-clear ion-navicon" ng-click="openMenu()"></button> - - <button ng-class="selectOn? 'button button-icon button-clear ion-ios-copy':'button button-icon button-clear ion-ios-copy-outline'" ng-click="selectToggle()"></button> - - <button data-badge="{{$root.alarmCount}}" class="animated infinite tada button button-icon button-clear ion-ios-bell notification-badge" ng-click="handleAlarms();" ng-if="$root.isAlarm"></button> - </ion-nav-buttons> - <ion-nav-buttons side="right"> - <a class="button button-icon icon ion-arrow-swap" ng-href="" ng-click="flipLogs()"></a> - <a ng-if="logEntity == $root.appName" class="button button-icon icon ion-trash-a" ng-href="" ng-click="deleteLogs()"></a> - <div ng-if="$root.platformOS!='desktop'"> - <a class="button button-icon icon ion-email" ng-href="" ng-click="sendEmail(log.logString)"> </a> - </div> - <div ng-if="$root.platformOS=='desktop'"> - <a class="button button-icon icon ion-android-download" ng-href="" ng-click="sendEmail(log.logString)"> </a> - </div> - </ion-nav-buttons> - <ion-content delegate-handle="none" overflow-scroll="false" mouse-wheel-scroll> - - <div ng-if="logEntity=='ZoneMinder'"> - - <button class="button button-small button-stable icon ion-chevron-left" ng-click="changePage(1)"> - </button> - <button class="button button-small button-stable icon ion-chevron-right" ng-click="changePage(-1)"> - </button> - </div> - - <div ng-if="logEntity==$root.appName"> - <b>{{$root.appName}} {{'kVersion'|translate}}: {{zmAppVersion}} ({{$root.platformOS}})</b> - </div> - - <div ng-if="selectOn" class="aside-1">{{'kLogsCopyPaste' | translate }}</div> - <div ng-if="logEntity!=$root.appName"> - <b>ZoneMinder</b> - </div> - - - <br/> - <!-- don't indent here its a pre--> - <pre class="selectable" data-tap-disabled="{{selectOn}}">{{log.logString}}</pre> - </ion-content> + <ion-nav-buttons side="left"> + <button class="button button-icon button-clear ion-navicon" ng-click="openMenu()"></button> + + + <button ng-class="selectOn? 'button button-icon button-clear ion-ios-copy':'button button-icon button-clear ion-ios-copy-outline'" + ng-click="selectToggle()"></button> + + <button data-badge="{{$root.alarmCount}}" class="animated infinite tada button button-icon button-clear ion-ios-bell notification-badge" + ng-click="handleAlarms();" ng-if="$root.isAlarm"></button> + </ion-nav-buttons> + <ion-nav-buttons side="right"> + <a class="button button-icon icon ion-arrow-swap" ng-href="" ng-click="flipLogs()"></a> + <a ng-if="logEntity == $root.appName" class="button button-icon icon ion-trash-a" ng-href="" ng-click="deleteLogs()"></a> + <div ng-if="$root.platformOS!='desktop'"> + <a class="button button-icon icon ion-email" ng-href="" ng-click="sendEmail(log.logString)"> </a> + </div> + <div ng-if="$root.platformOS=='desktop'"> + <a class="button button-icon icon ion-android-download" ng-href="" ng-click="sendEmail(log.logString)"> </a> + </div> + </ion-nav-buttons> + <ion-content delegate-handle="none" overflow-scroll="false" mouse-wheel-scroll> + + <div ng-if="logEntity=='ZoneMinder'"> + + <button class="button button-small button-stable icon ion-chevron-left" ng-click="changePage(1)"> + </button> + <button class="button button-small button-stable icon ion-chevron-right" ng-click="changePage(-1)"> + </button> + </div> + + <div ng-if="logEntity==$root.appName"> + <b>{{$root.appName}} {{'kVersion'|translate}}: {{zmAppVersion}} ({{$root.platformOS}})</b> + </div> + + <div ng-if="selectOn" class="aside-1">{{'kLogsCopyPaste' | translate }}</div> + <div ng-if="logEntity!=$root.appName"> + <b>ZoneMinder</b> + </div> + + + <br/> + <!-- don't indent here its a pre--> + <pre class="selectable" data-tap-disabled="{{selectOn}}">{{log.logString}}</pre> + </ion-content> diff --git a/www/templates/login.html b/www/templates/login.html index cbd5a024..e3c6e6fc 100644 --- a/www/templates/login.html +++ b/www/templates/login.html @@ -1,102 +1,110 @@ <ion-view view-title="{{'kSettings' | translate}}" cache-view="false"> - <ion-nav-buttons side="left"> - <button class="button button-icon button-clear ion-navicon" ng-click="openMenu()"></button> - <button class="button button-icon button-clear ion-arrow-down-b" ng-click="serverActionSheet()"></button> - <button data-badge="{{$root.alarmCount}}" class="animated infinite tada button button-icon button-clear ion-ios-bell notification-badge" ng-click="handleAlarms();" ng-if="$root.isAlarm"></button> - </ion-nav-buttons> - <ion-nav-buttons side="right"> - <button class="button button-clear" ng-click="saveItems()">{{'kSave' | translate}}</button> - </ion-nav-buttons> - <ion-content delegate-handle="none" overflow-scroll="false" mouse-wheel-scroll> - <div class="item item-text-wrap item-input-inset"> - {{'kServerName' | translate }}: - <label class="item-input-wrapper"> - <input autocorrect="off" type="text" placeholder="{{'kExampleServer' | translate}}" ng-model="loginData.serverName"> - </label> + <ion-nav-buttons side="left"> + <button class="button button-icon button-clear ion-navicon" ng-click="openMenu()"></button> + <button class="button button-icon button-clear ion-arrow-down-b" ng-click="serverActionSheet()"></button> + <button data-badge="{{$root.alarmCount}}" class="animated infinite tada button button-icon button-clear ion-ios-bell notification-badge" + ng-click="handleAlarms();" ng-if="$root.isAlarm"></button> + </ion-nav-buttons> + <ion-nav-buttons side="right"> + <button class="button button-clear" ng-click="saveItems()">{{'kSave' | translate}}</button> + </ion-nav-buttons> + <ion-content delegate-handle="none" overflow-scroll="false" mouse-wheel-scroll> + <div class="item item-text-wrap item-input-inset"> + {{'kServerName' | translate }}: + <label class="item-input-wrapper"> + <input autocorrect="off" type="text" placeholder="{{'kExampleServer' | translate}}" ng-model="loginData.serverName"> + </label> + </div> + <label> + <ion-toggle ng-model="loginData.enableLowBandwidth" toggle-class="toggle-calm"> + <span class="item-text-wrap">{{'kLowBandwidth'|translate}}</span> + </ion-toggle> + </label> + <label ng-if="loginData.enableLowBandwidth"> + <ion-toggle ng-model="loginData.autoSwitchBandwidth" toggle-class="toggle-calm"> + <span class="item-text-wrap">{{'kAutoSwitchBW'|translate}}</span> + </ion-toggle> + </label> + <div class="list list-inset"> + <span style="color:rgb(100,100,100)"> + <i class="ion-android-home" style="font-size:150%"></i> + {{'kZMSettingsFor' | translate}} {{loginData.serverName || ('kUnknown' | translate)}} + </span> + <p ng-if="$root.platformOS!='desktop'" style="font-size:0.8em; color:gray">{{'kDisableSamsung' | translate}}</p> + <div class="item item-text-wrap"> + <ion-checkbox ng-model="loginData.isUseAuth">{{'kUseZmAuth' | translate }}</ion-checkbox> + <div ng-if="loginData.isUseAuth"> + <label class="item item-input item-floating-label"> + <span class="input-label">{{'kUserName'|translate}}</span> + <input autocapitalize="none" autocomplete="off" autocorrect="off" type="text" placeholder="{{'kUserName' | translate}}" ng-model="loginData.username"> + </label> + <label class="item item-input item-floating-label"> + <span class="input-label">{{'kPassword' | translate}}</span> + <input type="password" placeholder="{{'kPassword' | translate}}" ng-model="loginData.password"> + </label> </div> - <label> - <ion-toggle ng-model="loginData.enableLowBandwidth" toggle-class="toggle-calm"><span class="item-text-wrap">{{'kLowBandwidth'|translate}}</span> - </ion-toggle> - </label> - <label ng-if="loginData.enableLowBandwidth"> - <ion-toggle ng-model="loginData.autoSwitchBandwidth" toggle-class="toggle-calm"><span class="item-text-wrap">{{'kAutoSwitchBW'|translate}}</span> - </ion-toggle> - </label> - <div class="list list-inset"> - <span style="color:rgb(100,100,100)"> - <i class="ion-android-home" style="font-size:150%"></i> - {{'kZMSettingsFor' | translate}} {{loginData.serverName || ('kUnknown' | translate)}} - </span> - <p ng-if="$root.platformOS!='desktop'" style="font-size:0.8em; color:gray">{{'kDisableSamsung' | translate}}</p> - <div class="item item-text-wrap"> - <ion-checkbox ng-model="loginData.isUseAuth">{{'kUseZmAuth' | translate }}</ion-checkbox> - <div ng-if="loginData.isUseAuth"> - <label class="item item-input item-floating-label"> - <span class="input-label">{{'kUserName'|translate}}</span> - <input autocapitalize="none" autocomplete="off" autocorrect="off" type="text" - placeholder="{{'kUserName' | translate}}" ng-model="loginData.username"> - </label> - <label class="item item-input item-floating-label"> - <span class="input-label">{{'kPassword' | translate}}</span> - <input type="password" placeholder="{{'kPassword' | translate}}" ng-model="loginData.password"> - </label> - </div> - </div> + </div> - <div class="item item-text-wrap"> - <ion-checkbox ng-model="loginData.isUseBasicAuth">{{'kUseBasicAuth' | translate }}</ion-checkbox> - <div ng-if="loginData.isUseBasicAuth"> - <label class="item item-input item-floating-label"> - <span class="input-label">{{'kUserName'|translate}}</span> - <input autocapitalize="none" autocomplete="off" autocorrect="off" type="text" - placeholder="{{'kUserName' | translate}}" ng-model="loginData.basicAuthUser"> - </label> - <label class="item item-input item-floating-label"> - <span class="input-label">{{'kPassword' | translate}}</span> - <input type="password" placeholder="{{'kPassword' | translate}}" ng-model="loginData.basicAuthPassword"> - </label> - </div> - </div> + <div class="item item-text-wrap"> + <ion-checkbox ng-model="loginData.isUseBasicAuth">{{'kUseBasicAuth' | translate }}</ion-checkbox> + <div ng-if="loginData.isUseBasicAuth"> + <label class="item item-input item-floating-label"> + <span class="input-label">{{'kUserName'|translate}}</span> + <input autocapitalize="none" autocomplete="off" autocorrect="off" type="text" placeholder="{{'kUserName' | translate}}" ng-model="loginData.basicAuthUser"> + </label> + <label class="item item-input item-floating-label"> + <span class="input-label">{{'kPassword' | translate}}</span> + <input type="password" placeholder="{{'kPassword' | translate}}" ng-model="loginData.basicAuthPassword"> + </label> + </div> + </div> - <p ng-if="loginData.isUseBasicAuth" style="font-size:0.8em; color:#e84118">{{'kWarningBasicAuth' | translate}}</p> + <p ng-if="loginData.isUseBasicAuth" style="font-size:0.8em; color:#e84118">{{'kWarningBasicAuth' | translate}}</p> - <label class="item item-input item-floating-label"> - <span class="input-label">{{'kPortalUrl' | translate}}</span> - <input hidepassword autocapitalize="none" autocomplete="off" autocorrect="off" type="text" placeholder="{{'kPortalUrlExample' | translate}}" ng-model="loginData.url" ng-keyup="portalKeypress($event)"> - </label> - <!--<button class="button button-small button-clear icon-left ion-wand" ng-click="detectCgi()">tap here to discover cgi-bin + <label class="item item-input item-floating-label"> + <span class="input-label">{{'kPortalUrl' | translate}}</span> + <input hidepassword autocapitalize="none" autocomplete="off" autocorrect="off" type="text" placeholder="{{'kPortalUrlExample' | translate}}" + ng-model="loginData.url" ng-keyup="portalKeypress($event)"> + </label> + <!--<button class="button button-small button-clear icon-left ion-wand" ng-click="detectCgi()">tap here to discover cgi-bin </button>--> - <label class="item item-input item-floating-label"> - <!--<span style="float:right;margin-top:-7px;background-color:#6d0909;color:#fff;font-size:14px;opacity:0.7;width:90px;border-radius: 0px 0px 5px 5px;" on-tap="detectCgi();"> <i class="ion-wand"></i>discover</span>--> - <span class="input-label">{{'kPathToCgi' | translate}}</span> - <input hidepassword autocapitalize="none" autocomplete="off" autocorrect="off" type="text" placeholder="{{'kPathToCgiExample' | translate}}" ng-model="loginData.streamingurl"> - </label> - <label class="item item-input item-floating-label"> - <span class="input-label">{{'kApiUrl' | translate}}</span> - <input hidepassword autocapitalize="none" autocomplete="off" autocorrect="off" type="text" placeholder="{{'kApiUrlExample' | translate}}" ng-model="loginData.apiurl"> - </label> - <a class="item item-icon-right" href="" ng-click="selectFallback()"> - <i class="icon ion-ios-arrow-right"> - </i> {{'kFallback' | translate}} - <p>{{loginData.fallbackConfiguration}}</p> - </a> - <a class="item item-icon-right" href="" ng-click="eventServerSettings()"> - <i class="icon ion-ios-arrow-right"> - </i> {{'kEventServer' | translate}} - </a> - <div ng-if="$root.platformOS != 'desktop'"> - <label> - <ion-toggle ng-model="loginData.usePin" ng-change="pinPrompt();" toggle-class="toggle-calm"><span class="item-text-wrap">{{'kPassword' | translate}} {{'kProtect'|translate}}</span></ion-toggle> - </label> - </div> - - <div ng-if="$root.platformOS != 'desktop'"> - <label> - <ion-toggle ng-model="loginData.keepAwake" toggle-class="toggle-calm"><span class="item-text-wrap">{{'kAwake1'|translate}} - <p>{{'kAwake2'| translate}}</p></span> - </ion-toggle> - </label> - </div> - </div> - </ion-content> + <label class="item item-input item-floating-label"> + <!--<span style="float:right;margin-top:-7px;background-color:#6d0909;color:#fff;font-size:14px;opacity:0.7;width:90px;border-radius: 0px 0px 5px 5px;" on-tap="detectCgi();"> <i class="ion-wand"></i>discover</span>--> + <span class="input-label">{{'kPathToCgi' | translate}}</span> + <input hidepassword autocapitalize="none" autocomplete="off" autocorrect="off" type="text" placeholder="{{'kPathToCgiExample' | translate}}" + ng-model="loginData.streamingurl"> + </label> + <label class="item item-input item-floating-label"> + <span class="input-label">{{'kApiUrl' | translate}}</span> + <input hidepassword autocapitalize="none" autocomplete="off" autocorrect="off" type="text" placeholder="{{'kApiUrlExample' | translate}}" + ng-model="loginData.apiurl"> + </label> + <a class="item item-icon-right" href="" ng-click="selectFallback()"> + <i class="icon ion-ios-arrow-right"> + </i> {{'kFallback' | translate}} + <p>{{loginData.fallbackConfiguration}}</p> + </a> + <a class="item item-icon-right" href="" ng-click="eventServerSettings()"> + <i class="icon ion-ios-arrow-right"> + </i> {{'kEventServer' | translate}} + </a> + <div ng-if="$root.platformOS != 'desktop'"> + <label> + <ion-toggle ng-model="loginData.usePin" ng-change="pinPrompt();" toggle-class="toggle-calm"> + <span class="item-text-wrap">{{'kPassword' | translate}} {{'kProtect'|translate}}</span> + </ion-toggle> + </label> + </div> + + <div ng-if="$root.platformOS != 'desktop'"> + <label> + <ion-toggle ng-model="loginData.keepAwake" toggle-class="toggle-calm"> + <span class="item-text-wrap">{{'kAwake1'|translate}} + <p>{{'kAwake2'| translate}}</p> + </span> + </ion-toggle> + </label> + </div> + </div> + </ion-content> </ion-view> diff --git a/www/templates/lowversion.html b/www/templates/lowversion.html index d6b9cb7e..50a3e978 100644 --- a/www/templates/lowversion.html +++ b/www/templates/lowversion.html @@ -1,25 +1,27 @@ <ion-view view-title="{{$root.appName}}" hide-nav-bar="true" hide-back-button="true" cache-view="false"> - <ion-content class="pin-background"> - <div style="margin-left:20px; margin-right:20px"> - <center> - <br/> - <br/> - <div id="responsive-image"> - <img src="img/authlogo.png"> - </div> - <br/> - <span style="color:white"> - <h2 style="color:white" class="animated bounce">{{'kZMUpgradeNeeded' | translate}}</h2> - <br/> - <h4 style="color:white">{{'kVersionIncompatible' | translate }}</h4> - <br/> - {{'kReportedVersion' | translate}}: <b>{{currentVersion}}</b><br/> - {{'kMinVersion' | translate}}:<b>{{requiredVersion}}</b><br/> - - - </span> - <br/> - </center> + <ion-content class="pin-background"> + <div style="margin-left:20px; margin-right:20px"> + <center> + <br/> + <br/> + <div id="responsive-image"> + <img src="img/authlogo.png"> </div> - </ion-content> + <br/> + <span style="color:white"> + <h2 style="color:white" class="animated bounce">{{'kZMUpgradeNeeded' | translate}}</h2> + <br/> + <h4 style="color:white">{{'kVersionIncompatible' | translate }}</h4> + <br/> {{'kReportedVersion' | translate}}: + <b>{{currentVersion}}</b> + <br/> {{'kMinVersion' | translate}}: + <b>{{requiredVersion}}</b> + <br/> + + + </span> + <br/> + </center> + </div> + </ion-content> </ion-view> diff --git a/www/templates/menu.html b/www/templates/menu.html index 5e189029..3b69b544 100644 --- a/www/templates/menu.html +++ b/www/templates/menu.html @@ -1,150 +1,153 @@ <div ng-controller="MenuController"> -<ion-side-menus delegate-handle="sideMenu" ng-cloak> + <ion-side-menus delegate-handle="sideMenu" ng-cloak> <ion-side-menu-content> - <ion-nav-bar class="bar-stable nav-title-slide-ios7"> - <ion-nav-back-button class="button-icon"> - <span class="icon ion-ios7-arrow-left"></span> - </ion-nav-back-button> - </ion-nav-bar> - <ion-nav-view></ion-nav-view> + <ion-nav-bar class="bar-stable nav-title-slide-ios7"> + <ion-nav-back-button class="button-icon"> + <span class="icon ion-ios7-arrow-left"></span> + </ion-nav-back-button> + </ion-nav-bar> + <ion-nav-view></ion-nav-view> </ion-side-menu-content> <ion-side-menu> - <ion-header-bar class="bar bar-header bar-stable"> - <h1 class="title">{{'kMenuOptions'|translate}}</h1> - </ion-header-bar> - <ion-content has-header="true" mouse-wheel-scroll> - <!-- <ion-scroll scrollbar-y="false" style="height:100%" >--> - <ion-list> - <!--<ion-item ng-click="navigateView('app.montage')" menu-close>--> - <ion-item href="#/app/montage" menu-close> - - <!--<span ng-if="$root.runMode=='lowbw'" style="float:right;margin-top:-18px;background-color:#f1c40f;color:#000;font-size:11px;opacity:0.7;width:20px;border-radius: 0px 0px 5px 5px;display:inline-block;text-align:center;"> <i class="icon ion-arrow-graph-down-left"></i> </span>--> - <span class=" item-icon-left"> - <i class="icon ion-grid"></i> - </span>{{'kMenuMontage'|translate}} - </ion-item> - - <!--<ion-item ng-click="navigateView('app.timeline')" menu-close>--> - <ion-item href="#/app/timeline" menu-close> - <span class=" item-icon-left"> - <i class="icon ion-android-time"></i> - </span>{{'kMenuTimeline'|translate}} - </ion-item> - - <!--<ion-item ng-click="navigateView('app.events', {id:0,playEvent:false})" menu-close>--> - <ion-item href="#/app/events/0/false" menu-close> - <span class=" item-icon-left"> - <i class="icon ion-ios-calendar-outline"></i> - </span>{{'kMenuEvents'|translate}} - </ion-item> - - <!--<ion-item ng-click="navigateView('app.moment')" menu-close>--> - <ion-item href="#/app/moment" menu-close> - <span class=" item-icon-left"> - <i class="icon ion-star"></i> - </span>{{'kMoment24Heading'|translate}} - </ion-item> - - <!-- <ion-item ng-click="navigateView('app.montage-history')" menu-close>--> - <ion-item href="#/app/montage-history" menu-close> - <span class=" item-icon-left"> - <i class="icon ion-ios-keypad-outline"></i> - </span>{{'kMenuEventMontage'|translate}} - </ion-item> - - - <!--<ion-item ng-click="navigateView('app.monitors')" menu-close>--> - <ion-item href="#/app/monitors" menu-close> - <span class=" item-icon-left"> - <i class="icon ion-ios-videocam-outline"></i> - </span>{{'kMenuMonitors'|translate}} - </ion-item> - - <!--<ion-item ng-click="navigateView('app.state')" menu-close>--> - <ion-item href="#/app/state" menu-close> - <span class=" item-icon-left"> - <i class="icon ion-information-circled"></i> - </span> {{'kMenuSystemStatus'|translate}} - </ion-item> - - <!--<ion-item nav-clear menu-close ng-click="navigateView('app.login', {wizard:false})" >--> - <ion-item nav-clear menu-close href="#/app/login/false"> - <span class=" item-icon-left"> - <i class="icon ion-person"></i> - {{'kMenuZMSettings'|translate}} - <!--<span class="item-note" style="width:90px"> + <ion-header-bar class="bar bar-header bar-stable"> + <h1 class="title">{{'kMenuOptions'|translate}}</h1> + </ion-header-bar> + <ion-content has-header="true" mouse-wheel-scroll> + <!-- <ion-scroll scrollbar-y="false" style="height:100%" >--> + <ion-list> + <!--<ion-item ng-click="navigateView('app.montage')" menu-close>--> + <ion-item href="#/app/montage" menu-close> + + <!--<span ng-if="$root.runMode=='lowbw'" style="float:right;margin-top:-18px;background-color:#f1c40f;color:#000;font-size:11px;opacity:0.7;width:20px;border-radius: 0px 0px 5px 5px;display:inline-block;text-align:center;"> <i class="icon ion-arrow-graph-down-left"></i> </span>--> + <span class=" item-icon-left"> + <i class="icon ion-grid"></i> + </span>{{'kMenuMontage'|translate}} + </ion-item> + + <!--<ion-item ng-click="navigateView('app.timeline')" menu-close>--> + <ion-item href="#/app/timeline" menu-close> + <span class=" item-icon-left"> + <i class="icon ion-android-time"></i> + </span>{{'kMenuTimeline'|translate}} + </ion-item> + + <!--<ion-item ng-click="navigateView('app.events', {id:0,playEvent:false})" menu-close>--> + <ion-item href="#/app/events/0/false" menu-close> + <span class=" item-icon-left"> + <i class="icon ion-ios-calendar-outline"></i> + </span>{{'kMenuEvents'|translate}} + </ion-item> + + <!--<ion-item ng-click="navigateView('app.moment')" menu-close>--> + <ion-item href="#/app/moment" menu-close> + <span class=" item-icon-left"> + <i class="icon ion-star"></i> + </span>{{'kMoment24Heading'|translate}} + </ion-item> + + <!-- <ion-item ng-click="navigateView('app.montage-history')" menu-close>--> + <ion-item href="#/app/montage-history" menu-close> + <span class=" item-icon-left"> + <i class="icon ion-ios-keypad-outline"></i> + </span>{{'kMenuEventMontage'|translate}} + </ion-item> + + + <!--<ion-item ng-click="navigateView('app.monitors')" menu-close>--> + <ion-item href="#/app/monitors" menu-close> + <span class=" item-icon-left"> + <i class="icon ion-ios-videocam-outline"></i> + </span>{{'kMenuMonitors'|translate}} + </ion-item> + + <!--<ion-item ng-click="navigateView('app.state')" menu-close>--> + <ion-item href="#/app/state" menu-close> + <span class=" item-icon-left"> + <i class="icon ion-information-circled"></i> + </span> {{'kMenuSystemStatus'|translate}} + </ion-item> + + <!--<ion-item nav-clear menu-close ng-click="navigateView('app.login', {wizard:false})" >--> + <ion-item nav-clear menu-close href="#/app/login/false"> + <span class=" item-icon-left"> + <i class="icon ion-person"></i> + {{'kMenuZMSettings'|translate}} + <!--<span class="item-note" style="width:90px"> {{$root.getProfileName();}} </span>--> - <span style="float:right; margin-top:-18px;background-color:#444444;color:#fff;font-size:11px;opacity:0.7;width:90px;border-radius: 0px 0px 5px 5px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;text-align:center;"> {{$root.getProfileName();}} </span> - </span> - </ion-item> - - <ion-item nav-clear menu-close href="#/app/devoptions"> - <!--<ion-item nav-clear menu-close ng-click="navigateView('app.devoptions')">--> - <span class=" item-icon-left"> - <i class="icon ion-settings"></i> - </span> {{'kMenuDevSettings'|translate}} - </ion-item> - - <ion-item ng-click="switchLang()" nav-clear menu-close> - <span class=" item-icon-left"> - <i class="icon ion-earth"></i> - </span> {{'kLanguage'|translate}} - </ion-item> - - <!--<ion-item nav-clear menu-close ng-click="navigateView('app.help')" >--> - <ion-item nav-clear menu-close href="#/app/help"> - <span class=" item-icon-left"> - <i class="icon ion-help"></i> - </span> {{'kMenuHelp'|translate}} - </ion-item> - - - <!--<ion-item nav-clear menu-close ng-click="navigateView('app.wizard')" >--> - <ion-item nav-clear menu-close href="#/app/wizard"> - <span class=" item-icon-left"> - <i class="icon ion-wand"></i> - </span> {{'kMenuWizard'|translate}} - </ion-item> - - <div ng-if="$root.showBlog"> - <!--<ion-item nav-clear menu-close ng-click="navigateView('app.news')" >--> - <ion-item nav-clear menu-close href="#/app/news"> - <span class=" item-icon-left"> - <i class="icon ion-radio-waves"></i> - </span>{{'kMenuNews'|translate}}<span style="color:#268d3a;"> {{$root.newBlogPost}}</span> - </ion-item> - </div> - - <!--<ion-item nav-clear menu-close ng-click="navigateView('app.log')" >--> - <ion-item nav-clear menu-close href="#/app/log"> - <span class=" item-icon-left"> - <i class="icon ion-clipboard"></i> - </span> {{'kMenuLogs'|translate}} - </ion-item> - - <div ng-if="$root.newVersionAvailable && $root.platformOS=='desktop'"> - <ion-item nav-clear menu-close href=""> - <span class=" item-icon-left"> - <i class="icon ion-email-unread"></i> - </span> <span style="color:#268d3a;">{{$root.newVersionAvailable}}</span> - </ion-item> - </div> - <div ng-if="$root.platformOS=='android'"> - <ion-item ng-click="$root.exitApp();"> - <span class=" item-icon-left"> - <i class="icon ion-close-circled"></i> - </span> {{'kMenuExit'|translate}} - </ion-item> - </div> - <ion-item style="color:rgb(106, 106, 106); font-size:90%;"> - <i class="ion-ios-location"></i> {{$root.getLocalTimeZone();}} - <br/> - <span ng-if="$root.isTzSupported()"><i class="icon icon-server"></i> {{$root.getServerTimeZoneNow();}} </span> - </ion-item> - </ion-list> - <!--</ion-scroll>--> - </ion-content> + <span style="float:right; margin-top:-18px;background-color:#444444;color:#fff;font-size:11px;opacity:0.7;width:90px;border-radius: 0px 0px 5px 5px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;text-align:center;"> {{$root.getProfileName();}} </span> + </span> + </ion-item> + + <ion-item nav-clear menu-close href="#/app/devoptions"> + <!--<ion-item nav-clear menu-close ng-click="navigateView('app.devoptions')">--> + <span class=" item-icon-left"> + <i class="icon ion-settings"></i> + </span> {{'kMenuDevSettings'|translate}} + </ion-item> + + <ion-item ng-click="switchLang()" nav-clear menu-close> + <span class=" item-icon-left"> + <i class="icon ion-earth"></i> + </span> {{'kLanguage'|translate}} + </ion-item> + + <!--<ion-item nav-clear menu-close ng-click="navigateView('app.help')" >--> + <ion-item nav-clear menu-close href="#/app/help"> + <span class=" item-icon-left"> + <i class="icon ion-help"></i> + </span> {{'kMenuHelp'|translate}} + </ion-item> + + + <!--<ion-item nav-clear menu-close ng-click="navigateView('app.wizard')" >--> + <ion-item nav-clear menu-close href="#/app/wizard"> + <span class=" item-icon-left"> + <i class="icon ion-wand"></i> + </span> {{'kMenuWizard'|translate}} + </ion-item> + + <div ng-if="$root.showBlog"> + <!--<ion-item nav-clear menu-close ng-click="navigateView('app.news')" >--> + <ion-item nav-clear menu-close href="#/app/news"> + <span class=" item-icon-left"> + <i class="icon ion-radio-waves"></i> + </span>{{'kMenuNews'|translate}} + <span style="color:#268d3a;"> {{$root.newBlogPost}}</span> + </ion-item> + </div> + + <!--<ion-item nav-clear menu-close ng-click="navigateView('app.log')" >--> + <ion-item nav-clear menu-close href="#/app/log"> + <span class=" item-icon-left"> + <i class="icon ion-clipboard"></i> + </span> {{'kMenuLogs'|translate}} + </ion-item> + + <div ng-if="$root.newVersionAvailable && $root.platformOS=='desktop'"> + <ion-item nav-clear menu-close href=""> + <span class=" item-icon-left"> + <i class="icon ion-email-unread"></i> + </span> + <span style="color:#268d3a;">{{$root.newVersionAvailable}}</span> + </ion-item> + </div> + <div ng-if="$root.platformOS=='android'"> + <ion-item ng-click="$root.exitApp();"> + <span class=" item-icon-left"> + <i class="icon ion-close-circled"></i> + </span> {{'kMenuExit'|translate}} + </ion-item> + </div> + <ion-item style="color:rgb(106, 106, 106); font-size:90%;"> + <i class="ion-ios-location"></i> {{$root.getLocalTimeZone();}} + <br/> + <span ng-if="$root.isTzSupported()"> + <i class="icon icon-server"></i> {{$root.getServerTimeZoneNow();}} </span> + </ion-item> + </ion-list> + <!--</ion-scroll>--> + </ion-content> </ion-side-menu> -</ion-side-menus> + </ion-side-menus> </div> diff --git a/www/templates/moment-mask.html b/www/templates/moment-mask.html index 51657b19..6493e4be 100644 --- a/www/templates/moment-mask.html +++ b/www/templates/moment-mask.html @@ -1,24 +1,30 @@ <ion-modal-view cache-view="false" style="width: 90%; height: 90%; top: 5%; left: 5%; right: 5%; bottom: 5%;"> - <ion-header-bar class="bar-stable"> - <h1 class="title"></h1> - <div class="buttons"> - <button class="button button-icon icon ion-checkmark" ng-click="saveMask()"></button> - <button class="button button-icon icon ion-close" ng-click="cancelMask()"></button> - </div> - </ion-header-bar> - <ion-content> - <div class="list"> - <span ng-repeat="item in monitors"> - - <a ng-class="{ 'item item-icon-right' : item.Monitor.listDisplay == 'show', 'item item-icon-right eye-background-red' : item.Monitor.listDisplay!='show' }" ng-click="toggleHide($index)" href="" > + <ion-header-bar class="bar-stable"> + <h1 class="title"></h1> + <div class="buttons"> + <button class="button button-icon icon ion-checkmark" ng-click="saveMask()"></button> + <button class="button button-icon icon ion-close" ng-click="cancelMask()"></button> + </div> + </ion-header-bar> + <ion-content> + <div class="list"> + <span ng-repeat="item in monitors"> - + <a ng-class="{ 'item item-icon-right' : item.Monitor.listDisplay == 'show', 'item item-icon-right eye-background-red' : item.Monitor.listDisplay!='show' }" + ng-click="toggleHide($index)" href=""> - <i ng-class="{'icon ion-eye':item.Monitor.listDisplay=='show','eye-red icon ion-eye-disabled':item.Monitor.listDisplay!='show'}"> </i><h2><span ng-class="{'eye-red':item.Monitor.listDisplay!='show'}">{{item.Monitor.Name}}</span></h2><p>{{'kId' | translate}}:{{item.Monitor.Id}}, {{'kMode' | translate}}:{{item.Monitor.Function}}</p> - - </a> - - </span> - </div> - </ion-content> + + + <i ng-class="{'icon ion-eye':item.Monitor.listDisplay=='show','eye-red icon ion-eye-disabled':item.Monitor.listDisplay!='show'}"> + </i> + <h2> + <span ng-class="{'eye-red':item.Monitor.listDisplay!='show'}">{{item.Monitor.Name}}</span> + </h2> + <p>{{'kId' | translate}}:{{item.Monitor.Id}}, {{'kMode' | translate}}:{{item.Monitor.Function}}</p> + + </a> + + </span> + </div> + </ion-content> </ion-modal-view> diff --git a/www/templates/moment-popover.html b/www/templates/moment-popover.html index 6d2f49fc..8cc8cab4 100644 --- a/www/templates/moment-popover.html +++ b/www/templates/moment-popover.html @@ -1,18 +1,23 @@ <ion-popover-view class="fit"> - <ion-content> - <div class="list" ng-click="popover.remove()"> - - <a class="item" ng-href="" ng-click="popover.remove();getMoments('StartTime');"> - {{'kMomentMenuByTime' | translate}} <i ng-if="::isChecked('kMomentMenuByTime')" class="ion-checkmark"></i> - - </a> + <ion-content> + <div class="list" ng-click="popover.remove()"> - <a class="item" ng-href="" ng-click="popover.remove();getMoments('monitorName');">{{'kMomentMenuByMonitor' | translate}} <i ng-if="::isChecked('kMomentMenuByMonitor')" class="ion-checkmark"></i></a> + <a class="item" ng-href="" ng-click="popover.remove();getMoments('StartTime');"> + {{'kMomentMenuByTime' | translate}} + <i ng-if="::isChecked('kMomentMenuByTime')" class="ion-checkmark"></i> + </a> - <a class="item" ng-href="" ng-click="popover.remove();getMoments('MaxScore');">{{'kMomentMenuByScore' | translate}} <i ng-if="::isChecked('kMomentMenuByScore')" class="ion-checkmark"></i></a> + <a class="item" ng-href="" ng-click="popover.remove();getMoments('monitorName');">{{'kMomentMenuByMonitor' | translate}} + <i ng-if="::isChecked('kMomentMenuByMonitor')" class="ion-checkmark"></i> + </a> - - </div> - </ion-content> + + <a class="item" ng-href="" ng-click="popover.remove();getMoments('MaxScore');">{{'kMomentMenuByScore' | translate}} + <i ng-if="::isChecked('kMomentMenuByScore')" class="ion-checkmark"></i> + </a> + + + </div> + </ion-content> </ion-popover-view> diff --git a/www/templates/moment.html b/www/templates/moment.html index f349bba5..6bc8d5da 100644 --- a/www/templates/moment.html +++ b/www/templates/moment.html @@ -1,8 +1,10 @@ <ion-view cache-view="false"> - <ion-nav-title><i class="{{typeIcon}}"></i> {{'kMoment24Heading' | translate}}</ion-nav-title> + <ion-nav-title> + <i class="{{typeIcon}}"></i> {{'kMoment24Heading' | translate}}</ion-nav-title> <ion-nav-buttons side="left"> <button class="button button-icon button-clear ion-navicon" ng-click="openMenu()"></button> - <button class="button button-icon button-clear ion-gear-b" ng-click="hideUnhide()"></button> + + <button class="button button-icon button-clear ion-gear-b" ng-click="hideUnhide()"></button> <button data-badge="{{$root.alarmCount}}" class="animated infinite tada button button-icon button-clear ion-ios-bell notification-badge" ng-click="handleAlarms();" ng-if="$root.isAlarm"></button> @@ -25,10 +27,10 @@ <ion-content delegate-handle="moment-delegate" overflow-scroll="false" mouse-wheel-scroll style="background-color:#444444"> - <div ng-if="areImagesLoading" class="screen-note"> {{ 'kArrangingImages' | translate }}... </div> + <div ng-if="areImagesLoading" class="screen-note"> {{ 'kArrangingImages' | translate }}... </div> + + <div ng-if="!areImagesLoading && !isMaxScoreFramePresent" class="screen-note"> {{ 'kApiUpgrade' | translate }} </div> - <div ng-if="!areImagesLoading && !isMaxScoreFramePresent" class="screen-note"> {{ 'kApiUpgrade' | translate }} </div> - <div ng-if="isSubMenu"> <br/> <div id="flyoutmenu" style="float:left"> @@ -49,9 +51,9 @@ </a> </li> <li> - <a href="" ng-click="toggleExpandOrCollapse()"> - <i ng-class="expand ? 'ion-arrow-expand':'ion-arrow-shrink'"></i> - </a> + <a href="" ng-click="toggleExpandOrCollapse()"> + <i ng-class="expand ? 'ion-arrow-expand':'ion-arrow-shrink'"></i> + </a> </li> <li> <a href="" ng-click="toggleIcons()"> @@ -65,17 +67,20 @@ <ul> <li> <a href="" ng-click="changeFrom(-1)"> - <i class="ion-chevron-left"></i> + + <i class="ion-chevron-left"></i> </a> </li> <li> <a href="" ng-click="getMoments()"> - <i class="ion-location"></i> + + <i class="ion-location"></i> </a> </li> <li> <a href="" ng-click="changeFrom(1)"> - <i class="ion-chevron-right"></i> + + <i class="ion-chevron-right"></i> </a> </li> @@ -99,13 +104,14 @@ <span style="float:right"> <button class="button button-small button-icon icon {{moment.Event.icon}}" ng-click="toggleCollapse(moment.Event.MonitorId, moment.Event.Id)"></button>{{moment.Event.collapseCount}} </span> </figcaption> - <img image-spinner-src="{{constructFrame(moment)}}" - img-spinner-w="{{moment.Event.width}}" img-spinner-h="{{moment.Event.height}}" image-spinner-loader="lines" on-tap="playEvent(moment)" on-swipe-left="showThumbnail(moment.Event.baseURL,moment.Event.MaxScoreFrameId)" + <img image-spinner-src="{{constructFrame(moment)}}" img-spinner-w="{{moment.Event.width}}" img-spinner-h="{{moment.Event.height}}" + image-spinner-loader="lines" on-tap="playEvent(moment)" on-swipe-left="showThumbnail(moment.Event.baseURL,moment.Event.MaxScoreFrameId)" /> - <div ng-if="showIcons" class="normal-subfigcaption" > - <button ng-class="moment.Event.pinned? 'button button-small button-icon icon ion-ios-flag assertive': 'button button-small button-icon icon ion-pin'" ng-click="togglePin(moment.Event.Id)"></button> - + <div ng-if="showIcons" class="normal-subfigcaption"> + <button ng-class="moment.Event.pinned? 'button button-small button-icon icon ion-ios-flag assertive': 'button button-small button-icon icon ion-pin'" + ng-click="togglePin(moment.Event.Id)"></button> + </div> <!--on-tap="showThumbnail(moment.Event.baseURL,moment.Event.MaxScoreFrameId)"--> <figcaption ng-if="showIcons" class="normal-figcaption"> {{moment.Event.humanizeTime}} diff --git a/www/templates/monitors-modal.html b/www/templates/monitors-modal.html index 65d70dd4..980e2384 100644 --- a/www/templates/monitors-modal.html +++ b/www/templates/monitors-modal.html @@ -10,7 +10,7 @@ <div id="monitorimage" style="height: 100vh;" class="main"> <div ng-if="$root.authSession!='undefined'"> <div ng-if="!animationInProgress"> - + <!--<span style="color:white">{{currentStreamMode}}</span>--> <img id="singlemonitor" style="width:100vw; height:100vh;" image-spinner-loader="lines" image-spinner-src="{{constructSingleStream()}}" @@ -29,7 +29,7 @@ </ion-scroll> - + <!-- egads, ion-scroll is a bind-on-start directive, so I have to repeat this thanks to zooming = false. Must be a better way --> <ion-scroll ng-if="isZoneEdit" delegate-handle="imgscroll" has-bouncing=false min-zoom=1 zooming="false" direction="xy" style="width: 100%;" @@ -90,7 +90,7 @@ </ion-scroll> <button ng-if="!ptzButtonsShown" class="button {{ptzPresets[0].icon}} button-small {{ptzPresets[0].style}}" style="float:left;margin-right:10px;margin-bottom:10px;" - ng-click="controlPTZ(monitorId, ptzPresets[0].cmd);">{{ptzPresets[0].name}}</button> + ng-click="controlPTZ(monitorId, ptzPresets[0].cmd);">{{ptzPresets[0].name}}</button> </div> @@ -158,7 +158,7 @@ </a> </li> - <!-- <li ng-if="isToggleListMenu"> + <!-- <li ng-if="isToggleListMenu"> <a href="" ng-click="toggleZone()"> <i class="icon ion-qr-scanner"></i> </a> @@ -183,7 +183,7 @@ </a> </li> - <li ng-if="isToggleListMenu" ng-style="{'background-color': isCycle?'rgba(69, 170, 242,0.7)':'rgba(108, 122, 137, 0.7)'}" > + <li ng-if="isToggleListMenu" ng-style="{'background-color': isCycle?'rgba(69, 170, 242,0.7)':'rgba(108, 122, 137, 0.7)'}"> <a href="" ng-click="toggleCycle()"> <i class="icon ion-android-bicycle"></i>-{{cycleText}}</a> </li> diff --git a/www/templates/monitors.html b/www/templates/monitors.html index f9b92e86..2bd5d819 100644 --- a/www/templates/monitors.html +++ b/www/templates/monitors.html @@ -1,62 +1,64 @@ <ion-view view-title="{{'kMonitors' | translate}}" cache-view="false"> - <ion-nav-buttons side="left"> - <button class="button button-icon button-clear ion-navicon" ng-click="openMenu()"> - </button> - <button data-badge="{{$root.alarmCount}}" class="animated infinite tada button button-icon button-clear ion-ios-bell notification-badge" ng-click="handleAlarms();" ng-if="$root.isAlarm"></button> - </ion-nav-buttons> - <ion-content delegate-handle="none" overflow-scroll="false" mouse-wheel-scroll> - <ion-refresher pulling-text="Pull to reload Monitors..." spinner="bubbles" on-refresh="doRefresh()"> - </ion-refresher> - <div style="float:right;margin-top:3px;margin-right:8px;"> - <a class="button button-small icon icon-left icon ion-ios-world-outline" href="" ng-click="changeConfig('All', '','1','Monitor');">{{'kGlobalConfiguration' | translate}}</a> + <ion-nav-buttons side="left"> + <button class="button button-icon button-clear ion-navicon" ng-click="openMenu()"> + </button> + <button data-badge="{{$root.alarmCount}}" class="animated infinite tada button button-icon button-clear ion-ios-bell notification-badge" + ng-click="handleAlarms();" ng-if="$root.isAlarm"></button> + </ion-nav-buttons> + <ion-content delegate-handle="none" overflow-scroll="false" mouse-wheel-scroll> + <ion-refresher pulling-text="Pull to reload Monitors..." spinner="bubbles" on-refresh="doRefresh()"> + </ion-refresher> + <div style="float:right;margin-top:3px;margin-right:8px;"> + <a class="button button-small icon icon-left icon ion-ios-world-outline" href="" ng-click="changeConfig('All', '','1','Monitor');">{{'kGlobalConfiguration' | translate}}</a> + </div> + <br/> + <div class="list card" ng-repeat="monitor in monitors"> + <div class="item" ng-style="{'background-color': monitor.Monitor.Enabled=='1'?'white':'white'}"> + <div ng-if="monitor.Monitor.Enabled == '1'"> + <div class='item'> + <span class="item-icon-left"> + + <div class="icon"> + <span class="ion-ios-videocam-outline"></span> + <span ng-class="{'ion-eye':monitor.Monitor.listDisplay=='show','ion-eye-disabled':monitor.Monitor.listDisplay!='show'}"> + </span> + </div> + + <b>{{monitor.Monitor.Name}}</b> + </span> + <span class="item-icon-right"> + <i class="icon {{monitor.Monitor.char}}" ng-style="{'color':monitor.Monitor.color}"></i> + </span> + <!-- <i ng-class="{'icon ion-eye':monitor.Monitor.listDisplay=='show','icon ion-eye-disabled':monitor.Monitor.listDisplay!='show'}"> </i>--> + </div> </div> - <br/> - <div class="list card" ng-repeat="monitor in monitors"> - <div class="item" ng-style="{'background-color': monitor.Monitor.Enabled=='1'?'white':'white'}"> - <div ng-if="monitor.Monitor.Enabled == '1'"> - <div class='item'> - <span class="item-icon-left"> - - <div class="icon"> - <span class="ion-ios-videocam-outline"></span> - <span ng-class="{'ion-eye':monitor.Monitor.listDisplay=='show','ion-eye-disabled':monitor.Monitor.listDisplay!='show'}"> </span> - </div> - - <b>{{monitor.Monitor.Name}}</b> - </span> - <span class="item-icon-right"> - <i class="icon {{monitor.Monitor.char}}" ng-style="{'color':monitor.Monitor.color}"></i> - </span> - <!-- <i ng-class="{'icon ion-eye':monitor.Monitor.listDisplay=='show','icon ion-eye-disabled':monitor.Monitor.listDisplay!='show'}"> </i>--> - </div> - </div> - <div ng-if="monitor.Monitor.Enabled != '1'"> - <span class='item item-icon-left item-icon-right'> - <i class="icon ion-ios-videocam-outline"></i> - <b>{{monitor.Monitor.Name}}</b> - <i class="icon {{monitor.Monitor.char}}" style="color:grey;"></i> - </span> - </div> - <p>{{'kMode' | translate}} :{{monitor.Monitor.Function}} - <br/> {{'kResolution' | translate}}: {{monitor.Monitor.Width}}*{{monitor.Monitor.Height}} - <br/> {{'kMaxFPS' | translate}}: {{monitor.Monitor.MaxFPS}} - <br/> {{'kAlarmMaxFPS' | translate}}:{{monitor.Monitor.AlarmMaxFPS}} - <br/> {{'kAlarmFrameCount' |translate}}: {{monitor.Monitor.AlarmFrameCount}} - <br/> {{'kStatus' | translate}}: {{monitor.Monitor.isRunningText}} - <br/> {{'kId' | translate}}: {{monitor.Monitor.Id}} - <br/> {{'kEventRecording' | translate}}: {{(monitor.Monitor.VideoWriter>0?'kVideo':'kImages') | translate}} - <br/> - <br/> - </p> - <div style="float:right;"> - <a class="button button-small icon icon-left icon ion-gear-a" href="" ng-click="changeConfig(monitor.Monitor.Name, monitor.Monitor.Id,monitor.Monitor.Enabled,monitor.Monitor.Function);">{{'kConfiguration' | translate}}</a> - <a class="button button-small icon icon-left ion-calendar" href="#/app/events/{{monitor.Monitor.Id}}/false">{{'kEventsCap'|translate}}</a> - <a class="button button-small icon icon-left ion-ios-eye" ng-click="openModal(monitor.Monitor.Id, monitor.Monitor.Controllable, monitor.Monitor.ControlId, monitor.Monitor.connKey, monitor)">{{'kLiveView' | translate}}</a> - </div> + <div ng-if="monitor.Monitor.Enabled != '1'"> + <span class='item item-icon-left item-icon-right'> + <i class="icon ion-ios-videocam-outline"></i> + <b>{{monitor.Monitor.Name}}</b> + <i class="icon {{monitor.Monitor.char}}" style="color:grey;"></i> + </span> </div> + <p>{{'kMode' | translate}} :{{monitor.Monitor.Function}} + <br/> {{'kResolution' | translate}}: {{monitor.Monitor.Width}}*{{monitor.Monitor.Height}} + <br/> {{'kMaxFPS' | translate}}: {{monitor.Monitor.MaxFPS}} + <br/> {{'kAlarmMaxFPS' | translate}}:{{monitor.Monitor.AlarmMaxFPS}} + <br/> {{'kAlarmFrameCount' |translate}}: {{monitor.Monitor.AlarmFrameCount}} + <br/> {{'kStatus' | translate}}: {{monitor.Monitor.isRunningText}} + <br/> {{'kId' | translate}}: {{monitor.Monitor.Id}} + <br/> {{'kEventRecording' | translate}}: {{(monitor.Monitor.VideoWriter>0?'kVideo':'kImages') | translate}} + <br/> + <br/> + </p> + <div style="float:right;"> + <a class="button button-small icon icon-left icon ion-gear-a" href="" ng-click="changeConfig(monitor.Monitor.Name, monitor.Monitor.Id,monitor.Monitor.Enabled,monitor.Monitor.Function);">{{'kConfiguration' | translate}}</a> + <a class="button button-small icon icon-left ion-calendar" href="#/app/events/{{monitor.Monitor.Id}}/false">{{'kEventsCap'|translate}}</a> + <a class="button button-small icon icon-left ion-ios-eye" ng-click="openModal(monitor.Monitor.Id, monitor.Monitor.Controllable, monitor.Monitor.ControlId, monitor.Monitor.connKey, monitor)">{{'kLiveView' | translate}}</a> </div> - <ion-item ng-show="!monitors.length"> - {{'kNoMonitors' | translate}} - </ion-item> - </ion-content> + </div> + </div> + <ion-item ng-show="!monitors.length"> + {{'kNoMonitors' | translate}} + </ion-item> + </ion-content> </ion-view> diff --git a/www/templates/montage-history.html b/www/templates/montage-history.html index 67f84630..742aeccc 100644 --- a/www/templates/montage-history.html +++ b/www/templates/montage-history.html @@ -12,8 +12,7 @@ <button data-badge="{{$root.alarmCount}}" class="animated infinite tada button button-icon button-clear ion-ios-bell notification-badge" ng-click="handleAlarms();" ng-if="$root.isAlarm"></button> </ion-nav-buttons> - <ion-content has-bouncing="false" style="background-color:#444444" delegate-handle="none" overflow-scroll="false" - mouse-wheel-scroll> + <ion-content has-bouncing="false" style="background-color:#444444" delegate-handle="none" overflow-scroll="false" mouse-wheel-scroll> <div class="timeline_text"> {{'kFrom' | translate}}:{{prettifyDateTimeFirst(datetimeValueFrom.value)}} ({{humanizeTime(datetimeValueFrom.value)}}) <div ng-if="!isMultiPort">({{'kChromeMax' | translate}})</div> </div> @@ -115,7 +114,7 @@ </div> ({{humanizeTime(datetimeValueFrom.value)}}) </ion-item> - + <div class="row"> <div class="col col-75"> <br/> diff --git a/www/templates/montage.html b/www/templates/montage.html index 139799e7..876e1125 100644 --- a/www/templates/montage.html +++ b/www/templates/montage.html @@ -1,155 +1,182 @@ -<ion-view cache-view="false" hide-nav-bar="{{minimal}}"> - <ion-nav-title>{{currentProfileName}}</ion-nav-title> - <ion-nav-buttons side="left"> - <button class="button button-icon button-clear ion-navicon" ng-click="openMenu()"></button> - <button class="button button-icon button-clear ion-eye" ng-click="hideUnhide();"> - </button> - <button class="button button-icon button-clear ion-chevron-down" ng-click="toggleSubMenuFunction();"> - </button> - <button data-badge="{{$root.alarmCount}}" class="animated infinite tada button button-icon button-clear ion-ios-bell notification-badge" ng-click="handleAlarms();" ng-if="$root.isAlarm"></button> - </ion-nav-buttons> - <ion-nav-buttons side="right"> - <span ng-click="toggleTimeType()" class="icon montage-time"> - <i ng-class="(iconTimeNow=='server')?'icon-server':'ion-ios-location'"></i> - {{timeNow}} </span> - <button class="button button-icon button-clear ion-arrow-move" ng-click="dragToggle();"> - </button> - <!-- +<ion-view cache-view="false" hide-nav-bar="{{minimal}}"> + <ion-nav-title>{{currentProfileName}}</ion-nav-title> + <ion-nav-buttons side="left"> + <button class="button button-icon button-clear ion-navicon" ng-click="openMenu()"></button> + + <button class="button button-icon button-clear ion-eye" ng-click="hideUnhide();"> + </button> + <button class="button button-icon button-clear ion-chevron-down" ng-click="toggleSubMenuFunction();"> + </button> + <button data-badge="{{$root.alarmCount}}" class="animated infinite tada button button-icon button-clear ion-ios-bell notification-badge" + ng-click="handleAlarms();" ng-if="$root.isAlarm"></button> + </ion-nav-buttons> + <ion-nav-buttons side="right"> + <span ng-click="toggleTimeType()" class="icon montage-time"> + <i ng-class="(iconTimeNow=='server')?'icon-server':'ion-ios-location'"></i> + {{timeNow}} </span> + <button class="button button-icon button-clear ion-arrow-move" ng-click="dragToggle();"> + </button> + <!-- <button class="button button-icon button-clear ion-monitor" ng-click="cast();"> </button> --> - <button class="button button-icon button-clear ion-loop" ng-click="resetSizes();"> - </button> - <button class="button button-icon button-clear ion-android-contract" ng-click="switchMinimal()"> - </button> - </ion-nav-buttons> - <ion-content ng-cloak has-bouncing="false" style="background-color:#444444" delegate-handle="montage-delegate" overflow-scroll="false"> - - <div ng-if="areImagesLoading" class="screen-note"> {{ 'kArrangingImages' | translate }}... </div> - - - <div ng-if="!minimal && toggleSubMenu" > - <!-- this is header --> - <br/> - <div id="flyoutmenu" style="float:left"> - <ul> - <!-- <li> + <button class="button button-icon button-clear ion-loop" ng-click="resetSizes();"> + </button> + <button class="button button-icon button-clear ion-android-contract" ng-click="switchMinimal()"> + </button> + </ion-nav-buttons> + <ion-content ng-cloak has-bouncing="false" style="background-color:#444444" delegate-handle="montage-delegate" overflow-scroll="false"> + + <div ng-if="areImagesLoading" class="screen-note"> {{ 'kArrangingImages' | translate }}... </div> + + + <div ng-if="!minimal && toggleSubMenu"> + <!-- this is header --> + <br/> + <div id="flyoutmenu" style="float:left"> + <ul> + <!-- <li> <a href="" ng-click="killAllImages()"> <i class="ion-ionic"></i></a> </li>--> - <li> - <a href="" ng-click="sliderChanged(1)"> <i class="ion-plus-circled"></i></a> - </li> - <li> - <a href="" ng-click="sliderChanged(-1)"> <i class="ion-minus-circled"></i></a> - </li> - <li> - <a href="" ng-click="squeezeMonitors()"> <i class="ion-android-apps"></i></a> - </li> - - <li ng-style="{'background-color': isCycleOn()?'rgba(69, 170, 242,0.7)':'rgba(108, 122, 137, 0.7)'}" ng-if="!isDragabillyOn"> - <a href="" ng-click="toggleCycle()"> <i class="ion-android-bicycle"></i>:{{getCycleStatus()}}</a> - </li> - - <li ng-if="isDragabillyOn"> - <a href="" ng-click="hideMonitor(monitor.Monitor.Id)"> <i class="ion-close-circled"></i></a> - </li> - <li ng-if="isDragabillyOn"> - <a href="" ng-click="toggleStamp()"> <i class="ion-pin"></i></a> - </li> - - </ul> - </div> + <li> + <a href="" ng-click="sliderChanged(1)"> + <i class="ion-plus-circled"></i> + </a> + </li> + <li> + <a href="" ng-click="sliderChanged(-1)"> + <i class="ion-minus-circled"></i> + </a> + </li> + <li> + <a href="" ng-click="squeezeMonitors()"> + <i class="ion-android-apps"></i> + </a> + </li> + + <li ng-style="{'background-color': isCycleOn()?'rgba(69, 170, 242,0.7)':'rgba(108, 122, 137, 0.7)'}" ng-if="!isDragabillyOn"> + <a href="" ng-click="toggleCycle()"> + <i class="ion-android-bicycle"></i>:{{getCycleStatus()}}</a> + </li> + + <li ng-if="isDragabillyOn"> + <a href="" ng-click="hideMonitor(monitor.Monitor.Id)"> + <i class="ion-close-circled"></i> + </a> + </li> + <li ng-if="isDragabillyOn"> + <a href="" ng-click="toggleStamp()"> + <i class="ion-pin"></i> + </a> + </li> + + </ul> + </div> + + <div id="flyoutmenu" style="float:right"> + <ul> + <li> + <a href="" ng-click="switchMontageProfile()"> + <i class="ion-navicon-round"></i> + </a> + </li> + + <li> + <a href="" ng-click="saveMontageProfile()"> + <i class="ion-heart"></i> + </a> + </li> + + <li> + <a href="" ng-click="deleteMontageProfile()"> + <i class="ion-trash-a"></i> + </a> + </li> + + + </ul> + </div> + <div style="clear: both;"></div> + + <br/> + </div> + <!-- now lets draw the montage windows --> + <div class="grid" id="mygrid"> + <div class="grid-sizer grid-item-5"></div> + <!-- <span ng-repeat="monitor in MontageMonitors|limitTo: monLimit" + ng-if="monitor.Monitor.Function!='None' && monitor.Monitor.Enabled !='0' ">--> - <div id="flyoutmenu" style="float:right"> - <ul> - <li> - <a href="" ng-click="switchMontageProfile()"> <i class="ion-navicon-round"></i></a> - </li> - <li> - <a href="" ng-click="saveMontageProfile()"> <i class="ion-heart"></i></a> - </li> - <li> - <a href="" ng-click="deleteMontageProfile()"> <i class="ion-trash-a"></i></a> - </li> - + <span ng-repeat="monitor in MontageMonitors | onlyEnabled |limitTo: monLimit"> + <div class="grid-item grid-item-{{monitor.Monitor.gridScale}} " data-item-id="{{monitor.Monitor.Id}}" data-item-size="{{monitor.Monitor.gridScale}}" + data-item-listdisplay="{{monitor.Monitor.listDisplay}} "> - </ul> - </div> - <div style="clear: both;"></div> + <!-- <figure> + <iframe width="200" height="100" src="https://news.google.com" frameborder="2" ></iframe> + </figure>--> - <br/> - </div> - <!-- now lets draw the montage windows --> - <div class="grid" id="mygrid"> - <div class="grid-sizer grid-item-5"></div> - <!-- <span ng-repeat="monitor in MontageMonitors|limitTo: monLimit" - ng-if="monitor.Monitor.Function!='None' && monitor.Monitor.Enabled !='0' ">--> - + <figure class="{{dragBorder}}" ng-show="monitor.Monitor.listDisplay!='noshow'"> + <!--<div ng-if="!isModalActive" >--> + <!--<div ng-if="$root.authSession!='undefined' && !isBackground() && !areImagesLoading">--> - <span ng-repeat="monitor in MontageMonitors | onlyEnabled |limitTo: monLimit"> - <div class="grid-item grid-item-{{monitor.Monitor.gridScale}} " data-item-id="{{monitor.Monitor.Id}}" data-item-size="{{monitor.Monitor.gridScale}}" data-item-listdisplay="{{monitor.Monitor.listDisplay}} "> + <div ng-if="!minimal"> + <img class="{{monitor.Monitor.selectStyle}}" id="img-{{$index}}" image-spinner-src="{{constructStream(monitor)}}" ng-click="!isDragabillyOn?openModal(monitor.Monitor.Id, monitor.Monitor.Controllable, monitor.Monitor.ControlId, monitor.Monitor.connKey,monitor):toggleSelectItem(monitor.Monitor.Id);" + image-spinner-loader="lines" img-spinner-w="{{monitor.Monitor.Width}}" img-spinner-h="{{monitor.Monitor.Height}}" + /> - <!-- <figure> - <iframe width="200" height="100" src="https://news.google.com" frameborder="2" ></iframe> - </figure>--> + </div> + + <div ng-if="minimal"> + <img id="img-{{$index}}" image-spinner-src="{{constructStream(monitor)}}" ng-click="!isDragabillyOn?openModal(monitor.Monitor.Id, monitor.Monitor.Controllable, monitor.Monitor.ControlId, monitor.Monitor.connKey,monitor):toggleSelectItem(monitor.Monitor.Id);" + image-spinner-loader="lines" img-spinner-w="{{monitor.Monitor.Width}}" img-spinner-h="{{monitor.Monitor.Height}}" + /> + </div> - <figure class="{{dragBorder}}" ng-show="monitor.Monitor.listDisplay!='noshow'"> - <!--<div ng-if="!isModalActive" >--> - <!--<div ng-if="$root.authSession!='undefined' && !isBackground() && !areImagesLoading">--> - - <div ng-if = "!minimal" > - <img class="{{monitor.Monitor.selectStyle}}" id="img-{{$index}}" image-spinner-src="{{constructStream(monitor)}}" ng-click="!isDragabillyOn?openModal(monitor.Monitor.Id, monitor.Monitor.Controllable, monitor.Monitor.ControlId, monitor.Monitor.connKey,monitor):toggleSelectItem(monitor.Monitor.Id);" image-spinner-loader="lines" img-spinner-w="{{monitor.Monitor.Width}}" img-spinner-h="{{monitor.Monitor.Height}}" /> - - </div> - <div ng-if = "minimal"> - <img id="img-{{$index}}" image-spinner-src="{{constructStream(monitor)}}" ng-click="!isDragabillyOn?openModal(monitor.Monitor.Id, monitor.Monitor.Controllable, monitor.Monitor.ControlId, monitor.Monitor.connKey,monitor):toggleSelectItem(monitor.Monitor.Id);" image-spinner-loader="lines" img-spinner-w="{{monitor.Monitor.Width}}" img-spinner-h="{{monitor.Monitor.Height}}" /> - </div> - - + <figcaption id="slowpulse" ng-class="monitor.Monitor.isAlarmed==true?'alarmed-figcaption animated infinite flash':'normal-figcaption'"> - <figcaption id="slowpulse" ng-class="monitor.Monitor.isAlarmed==true?'alarmed-figcaption animated infinite flash':'normal-figcaption'" > - - <span ng-if="monitor.Monitor.isStamp && isDragabillyOn"><i class="animated infinite flash ion-pin"></i> </span><i class="ion-ios-videocam"></i> - {{monitor.Monitor.Name}} <i ng-if="$root.runMode!='lowbw'" ng-style="{'color':monitor.Monitor.alarmState}" class="ion-record"></i> + <span ng-if="monitor.Monitor.isStamp && isDragabillyOn"> + <i class="animated infinite flash ion-pin"></i> </span> + <i class="ion-ios-videocam"></i> {{monitor.Monitor.Name}} + <i ng-if="$root.runMode!='lowbw'" ng-style="{'color':monitor.Monitor.alarmState}" class="ion-record"></i> - </figcaption> + </figcaption> + + </figure> - </figure> - - </div> - </span> - <!-- ngrepeat --> </div> - <ion-item style="background-color:#444444; color:#fff;border:none;" ng-show="!MontageMonitors.length"> - {{'kNoMonitors' | translate}} - </ion-item> - </ion-content> - <div class="bwmode" ng-if="$root.runMode=='lowbw'"> - {{ 'kLowBWDisplay' | translate }} + </span> + <!-- ngrepeat --> </div> - <div ng-show="minimal"> - <nav mfb-menu position="br" effect="zoomin" label="{{'kCollapse' | translate}}" active-icon="ion-chevron-down" resting-icon="ion-chevron-up" toggling-method="click"> - <button mfb-button icon="ion-arrow-expand" label="{{'kIncreaseSize' | translate}}" ng-click="sliderChanged(1)"> - </button> - <button mfb-button icon="ion-arrow-shrink" label="{{'kDecreaseSize' | translate}}" ng-click="sliderChanged(-1)"> - </button> - <!-- <button mfb-button icon="ion-refresh" label="{{'kRefresh' | translate}}" ng-click="resetSizes();"> + <ion-item style="background-color:#444444; color:#fff;border:none;" ng-show="!MontageMonitors.length"> + {{'kNoMonitors' | translate}} + </ion-item> + </ion-content> + <div class="bwmode" ng-if="$root.runMode=='lowbw'"> + {{ 'kLowBWDisplay' | translate }} + </div> + <div ng-show="minimal"> + <nav mfb-menu position="br" effect="zoomin" label="{{'kCollapse' | translate}}" active-icon="ion-chevron-down" resting-icon="ion-chevron-up" + toggling-method="click"> + <button mfb-button icon="ion-arrow-expand" label="{{'kIncreaseSize' | translate}}" ng-click="sliderChanged(1)"> + </button> + <button mfb-button icon="ion-arrow-shrink" label="{{'kDecreaseSize' | translate}}" ng-click="sliderChanged(-1)"> + </button> + <!-- <button mfb-button icon="ion-refresh" label="{{'kRefresh' | translate}}" ng-click="resetSizes();"> </button>--> - <button mfb-button icon="ion-close" label="{{'kExitFullScreen'| translate}}" ng-click="switchMinimal()"> - </button> - </nav> - <span class="modal-alarm-badge"> - <a data-badge="{{$root.alarmCount}}" class="animated infinite tada button icon ion-ios-bell notification-badge button-assertive" - ng-click="handleAlarmsWhileMinimized();" ng-if="$root.isAlarm"></a> - </span> - </div> - <br/> + <button mfb-button icon="ion-close" label="{{'kExitFullScreen'| translate}}" ng-click="switchMinimal()"> + </button> + </nav> + <span class="modal-alarm-badge"> + <a data-badge="{{$root.alarmCount}}" class="animated infinite tada button icon ion-ios-bell notification-badge button-assertive" + ng-click="handleAlarmsWhileMinimized();" ng-if="$root.isAlarm"></a> + </span> + </div> + <br/> </ion-view> diff --git a/www/templates/news.html b/www/templates/news.html index 98d0af12..2512bb4c 100644 --- a/www/templates/news.html +++ b/www/templates/news.html @@ -1,24 +1,25 @@ <ion-view view-title="{{'kNews' | translate}}"> - <ion-nav-buttons side="left"> - <button class="button button-icon button-clear ion-navicon" ng-click="openMenu()"></button> - <button data-badge="{{$root.alarmCount}}" class="animated infinite tada button button-icon button-clear ion-ios-bell notification-badge" ng-click="handleAlarms();" ng-if="$root.isAlarm"></button> - </ion-nav-buttons> - <ion-content delegate-handle="none" overflow-scroll="false" mouse-wheel-scroll> - - <div class="list"> - - <span ng-repeat="post in newsItems"> - <a class="item item-text-wrap item-icon-left" ng-click="loadPost(post.url, post.date)" href=""> - <i ng-class="isUnread(post.date) ? 'icon ion-email-unread': 'icon ion-ios-email-outline'"></i> - {{post.title}} - <p>{{post.date}}</p> - - </a> - - </span> - <div ng-if="!newsItems.length"> - <ion-item>{{'kLoading' | translate}}...</ion-item> - </div> - </div> - </ion-content> + <ion-nav-buttons side="left"> + <button class="button button-icon button-clear ion-navicon" ng-click="openMenu()"></button> + <button data-badge="{{$root.alarmCount}}" class="animated infinite tada button button-icon button-clear ion-ios-bell notification-badge" + ng-click="handleAlarms();" ng-if="$root.isAlarm"></button> + </ion-nav-buttons> + <ion-content delegate-handle="none" overflow-scroll="false" mouse-wheel-scroll> + + <div class="list"> + + <span ng-repeat="post in newsItems"> + <a class="item item-text-wrap item-icon-left" ng-click="loadPost(post.url, post.date)" href=""> + <i ng-class="isUnread(post.date) ? 'icon ion-email-unread': 'icon ion-ios-email-outline'"></i> + {{post.title}} + <p>{{post.date}}</p> + + </a> + + </span> + <div ng-if="!newsItems.length"> + <ion-item>{{'kLoading' | translate}}...</ion-item> + </div> + </div> + </ion-content> </ion-view> diff --git a/www/templates/refresh.html b/www/templates/refresh.html index e320f99b..d9081ffa 100644 --- a/www/templates/refresh.html +++ b/www/templates/refresh.html @@ -1,17 +1,17 @@ <ion-view view-title="{{$root.appName}}" hide-nav-bar="true" hide-back-button="true" cache-view="false"> - <ion-content class="pin-background"> - <div style="margin-left:20px; margin-right:20px"> - <center> - <br/> - <br/> - <br/> - <span style="color:white"> - <h4 style="color:rgb(156, 156, 156)">{{'kLoading' | translate}}</h2> - - - </span> - <br/> - </center> - </div> - </ion-content> + <ion-content class="pin-background"> + <div style="margin-left:20px; margin-right:20px"> + <center> + <br/> + <br/> + <br/> + <span style="color:white"> + <h4 style="color:rgb(156, 156, 156)">{{'kLoading' | translate}}</h2> + + + </span> + <br/> + </center> + </div> + </ion-content> </ion-view> diff --git a/www/templates/reorder-modal.html b/www/templates/reorder-modal.html index 4ed54fb6..d60133d9 100644 --- a/www/templates/reorder-modal.html +++ b/www/templates/reorder-modal.html @@ -1,23 +1,29 @@ <ion-modal-view cache-view="false" style="width: 90%; height: 90%; top: 5%; left: 5%; right: 5%; bottom: 5%;"> - <ion-header-bar class="bar-stable"> - <h1 class="title"></h1> - <div class="buttons"> - <button class="button button-icon icon ion-checkmark" ng-click="saveReorder()"></button> - <button class="button button-icon icon ion-close" ng-click="cancelReorder()"></button> - </div> - </ion-header-bar> - <ion-content> - <div class="list"> - <span ng-repeat="item in copyMontage"> - <a ng-class="{ 'item item-avatar item-icon-right' : item.Monitor.listDisplay == 'show', 'item item-avatar item-icon-right eye-background-red' : item.Monitor.listDisplay!='show' }" ng-click="toggleHide($index)" href="" > + <ion-header-bar class="bar-stable"> + <h1 class="title"></h1> + <div class="buttons"> + <button class="button button-icon icon ion-checkmark" ng-click="saveReorder()"></button> + <button class="button button-icon icon ion-close" ng-click="cancelReorder()"></button> + </div> + </ion-header-bar> + <ion-content> + <div class="list"> + <span ng-repeat="item in copyMontage"> + <a ng-class="{ 'item item-avatar item-icon-right' : item.Monitor.listDisplay == 'show', 'item item-avatar item-icon-right eye-background-red' : item.Monitor.listDisplay!='show' }" + ng-click="toggleHide($index)" href=""> - <img src="{{reorderFrame(item)}}" fallback-src /> + <img src="{{reorderFrame(item)}}" fallback-src /> - <i ng-class="{'icon ion-eye':item.Monitor.listDisplay=='show','eye-red icon ion-eye-disabled':item.Monitor.listDisplay!='show'}"> </i><h2><span ng-class="{'eye-red':item.Monitor.listDisplay!='show'}">{{item.Monitor.Name}}</span></h2><p>{{'kId' | translate}}:{{item.Monitor.Id}}, {{'kMode' | translate}}:{{item.Monitor.Function}}</p> - - </a> - - </span> - </div> - </ion-content> + <i ng-class="{'icon ion-eye':item.Monitor.listDisplay=='show','eye-red icon ion-eye-disabled':item.Monitor.listDisplay!='show'}"> + </i> + <h2> + <span ng-class="{'eye-red':item.Monitor.listDisplay!='show'}">{{item.Monitor.Name}}</span> + </h2> + <p>{{'kId' | translate}}:{{item.Monitor.Id}}, {{'kMode' | translate}}:{{item.Monitor.Function}}</p> + + </a> + + </span> + </div> + </ion-content> </ion-modal-view> diff --git a/www/templates/state.html b/www/templates/state.html index bb41b876..d227bb5b 100644 --- a/www/templates/state.html +++ b/www/templates/state.html @@ -1,40 +1,41 @@ <ion-view view-title="{{'kSystemStatus' | translate}}" cache-view="false"> - <ion-nav-buttons side="left"> - <button class="button button-icon button-clear ion-navicon" ng-click="openMenu()"></button> - <button data-badge="{{$root.alarmCount}}" class="animated infinite tada button button-icon button-clear ion-ios-bell notification-badge" ng-click="handleAlarms();" ng-if="$root.isAlarm"></button> - </ion-nav-buttons> - <ion-content delegate-handle="none" overflow-scroll="false" mouse-wheel-scroll> - <ion-refresher pulling-text="{{'kPullToReload' | translate}}..." spinner="bubbles" on-refresh="doRefresh()"></ion-refresher> - <ion-list> - <ion-item> - <div class="row"> - <div class="col col-10"> - <i class="ion-home" style="font-size:150%;"></i> - </div> - <div class="col"> - ZoneMinder: - </div> + <ion-nav-buttons side="left"> + <button class="button button-icon button-clear ion-navicon" ng-click="openMenu()"></button> + <button data-badge="{{$root.alarmCount}}" class="animated infinite tada button button-icon button-clear ion-ios-bell notification-badge" + ng-click="handleAlarms();" ng-if="$root.isAlarm"></button> + </ion-nav-buttons> + <ion-content delegate-handle="none" overflow-scroll="false" mouse-wheel-scroll> + <ion-refresher pulling-text="{{'kPullToReload' | translate}}..." spinner="bubbles" on-refresh="doRefresh()"></ion-refresher> + <ion-list> + <ion-item> + <div class="row"> + <div class="col col-10"> + <i class="ion-home" style="font-size:150%;"></i> + </div> + <div class="col"> + ZoneMinder: + </div> - <div class="col" ng-style="{'text-align':'right','color':color}"> - {{zmRun}} - <p>{{customState}}</p> - </div> - </div> - </ion-item> - <ion-item> - <div class="row"> - <div class="col col-10"> - <i class="ion-arrow-graph-up-right" style="font-size:150%;"></i> - </div> - <div class="col"> - ZoneMinder {{'kLoad' | translate}}: - </div> - <div class="col" style="text-align:right;"> - {{zmLoad}} - </div> - </div> - </ion-item> - <!-- + <div class="col" ng-style="{'text-align':'right','color':color}"> + {{zmRun}} + <p>{{customState}}</p> + </div> + </div> + </ion-item> + <ion-item> + <div class="row"> + <div class="col col-10"> + <i class="ion-arrow-graph-up-right" style="font-size:150%;"></i> + </div> + <div class="col"> + ZoneMinder {{'kLoad' | translate}}: + </div> + <div class="col" style="text-align:right;"> + {{zmLoad}} + </div> + </div> + </ion-item> + <!-- <ion-item> <div class="row"> <div class="col col-10"> @@ -51,21 +52,21 @@ </div> </ion-item> --> - <ion-item> - <button class="button button-full {{dangerButtonColor[showDanger?1:0]}}" ng-click="showDanger=!showDanger"> - <i class="ion-alert-circled" "style:font-size:300%;"></i> {{dangerText[showDanger?1:0]}} - </button> - <div ng-show="showDanger"> - <div class="row"> - <div class="col text-center"> - <a class="button button-small button-outline button-dark " ng-click="selectCustomState();" href="">{{'kChangeState'|translate}}</a> - <a class="button button-small button-outline button-dark " ng-click="controlZM('restart');" href="">{{'kRestart' | translate}}</a> - <a class="button button-small button-outline button-dark" href="" ng-click="controlZM('stop');">{{'kStop' | translate}}</a> - <a class="button button-small button-outline button-dark" ng-click="controlZM('start');" href="">{{'kStart' | translate}}</a> - </div> - </div> - </div> - </ion-item> - </ion-list> - </ion-content> + <ion-item> + <button class="button button-full {{dangerButtonColor[showDanger?1:0]}}" ng-click="showDanger=!showDanger"> + <i class="ion-alert-circled" "style:font-size:300%;"></i> {{dangerText[showDanger?1:0]}} + </button> + <div ng-show="showDanger"> + <div class="row"> + <div class="col text-center"> + <a class="button button-small button-outline button-dark " ng-click="selectCustomState();" href="">{{'kChangeState'|translate}}</a> + <a class="button button-small button-outline button-dark " ng-click="controlZM('restart');" href="">{{'kRestart' | translate}}</a> + <a class="button button-small button-outline button-dark" href="" ng-click="controlZM('stop');">{{'kStop' | translate}}</a> + <a class="button button-small button-outline button-dark" ng-click="controlZM('start');" href="">{{'kStart' | translate}}</a> + </div> + </div> + </div> + </ion-item> + </ion-list> + </ion-content> </ion-view> diff --git a/www/templates/timeline-modal.html b/www/templates/timeline-modal.html index a728541f..64b854ff 100644 --- a/www/templates/timeline-modal.html +++ b/www/templates/timeline-modal.html @@ -1,46 +1,50 @@ <!-- style="width: 90%; height: 90%; top: 5%; left: 5%; right: 5%; bottom: 5%;"--> <ion-modal-view cache-view="false"> - <ion-content ng-cloak on-double-tap="closeModal()" delegate-handle="timeline-modal-delegate"> - <div ng-controller="TimelineModalCtrl"> - <br/> - <div class="item item-divider">{{mName}} <i class="ion-arrow-right-b"></i> {{'kEvent' | translate}}:{{eid}} ({{humanizeTime}}) - <button class="button icon-left button-small button-positive" style="float:right; opacity:0.7" ng-click="switchType()"> - <i class="ion-shuffle"></i> - </button> - </div> - <center> - <h5>{{'kEvent' | translate}} {{graphType}} {{'kFrames' | translate}} </h5> - <p>{{'kTimelineMessage' | translate}}</p> - {{errorDetails}} - <!--<p>scroll left/right if needed</p>--> - </center> - <div data-tap-disabled="true"> - <canvas id="tcchart" width="auto" height="70%"></canvas> - </div> - <ion-spinner icon="spiral" style="position:absolute; top:50%;left:50%" ng-if="!dataReady"></ion-spinner> - <div style="height:190px;"> - <!-- <ion-scroll direction="x" class="wide-as-needed">--> - <span ng-repeat="alarm in alarm_images"> - - - <figure style="display:inline-block"> - <figcaption class="smallnote">f:{{alarm.fid}} scr:{{alarm.score}} @ {{alarm.time}}</figcaption> - <img image-spinner-src="{{constructFrames(event,alarm)}}" style="width: auto; height: auto;max-width: 100%;max-height: 170px" on-tap="showImage(event.Event.baseURL,event.Event.relativePath,alarm.fname, alarm.fid, event.Event.Id, event.Event.imageMode, alarm.id)" image-spinner-loader="lines"/> - - - </figure> - - </span> - <!--</ion-scroll>--> - </div> - </div> - - - </ion-content> - - <nav mfb-menu position="br" effect="zoomin" label="{{'kCollapse'|translate}}" active-icon="ion-chevron-down" resting-icon="ion-chevron-up" toggling-method="click"> - <a mfb-button icon="ion-close" label="{{'kExit' | translate}}" ng-click="closeModal()"> </a> - - </nav> + <ion-content ng-cloak on-double-tap="closeModal()" delegate-handle="timeline-modal-delegate"> + <div ng-controller="TimelineModalCtrl"> + <br/> + <div class="item item-divider">{{mName}} + <i class="ion-arrow-right-b"></i> {{'kEvent' | translate}}:{{eid}} ({{humanizeTime}}) + <button class="button icon-left button-small button-positive" style="float:right; opacity:0.7" ng-click="switchType()"> + <i class="ion-shuffle"></i> + </button> + </div> + <center> + <h5>{{'kEvent' | translate}} {{graphType}} {{'kFrames' | translate}} </h5> + <p>{{'kTimelineMessage' | translate}}</p> + {{errorDetails}} + <!--<p>scroll left/right if needed</p>--> + </center> + <div data-tap-disabled="true"> + <canvas id="tcchart" width="auto" height="70%"></canvas> + </div> + <ion-spinner icon="spiral" style="position:absolute; top:50%;left:50%" ng-if="!dataReady"></ion-spinner> + <div style="height:190px;"> + <!-- <ion-scroll direction="x" class="wide-as-needed">--> + <span ng-repeat="alarm in alarm_images"> + + + <figure style="display:inline-block"> + <figcaption class="smallnote">f:{{alarm.fid}} scr:{{alarm.score}} @ {{alarm.time}}</figcaption> + <img image-spinner-src="{{constructFrames(event,alarm)}}" style="width: auto; height: auto;max-width: 100%;max-height: 170px" + on-tap="showImage(event.Event.baseURL,event.Event.relativePath,alarm.fname, alarm.fid, event.Event.Id, event.Event.imageMode, alarm.id)" + image-spinner-loader="lines" /> + + + </figure> + + </span> + <!--</ion-scroll>--> + </div> + </div> + + + </ion-content> + + <nav mfb-menu position="br" effect="zoomin" label="{{'kCollapse'|translate}}" active-icon="ion-chevron-down" resting-icon="ion-chevron-up" + toggling-method="click"> + <a mfb-button icon="ion-close" label="{{'kExit' | translate}}" ng-click="closeModal()"> </a> + + </nav> </ion-modal-view> diff --git a/www/templates/timeline-popover.html b/www/templates/timeline-popover.html index 373ea09e..b1bd802e 100644 --- a/www/templates/timeline-popover.html +++ b/www/templates/timeline-popover.html @@ -1,21 +1,21 @@ <ion-popover-view class="fit"> - <ion-content> + <ion-content> - <div class="list" ng-click="popover.hide()"> - + <div class="list" ng-click="popover.hide()"> - <a class="item" ng-href="" ng-click="popover.hide();toggleMinAlarmFrameCount();" ng-if="loginData.enableAlarmCount">{{'kShowAllEvents' | translate}}</a> - <a class="item" ng-href="" ng-click="popover.hide();toggleMinAlarmFrameCount();" ng-if="!loginData.enableAlarmCount"> {{'kShowAlarmedEvents' | translate}}</a> - <a class="item" ng-href="" ng-click="popover.hide();buttonClicked(0);">{{'kMonth' | translate}}</a> - <a class="item" ng-href="" ng-click=" popover.hide();buttonClicked(1);"> - {{'kWeek' | translate}} - </a> - <a class="item" ng-href="" ng-click="popover.hide();buttonClicked(2);"> - {{'kDay' | translate}} - </a> - <a class="item" ng-href="" ng-click="popover.hide();buttonClicked(3);"> - {{'kCustomRange' | translate}} - </a> - </div> - </ion-content> + + <a class="item" ng-href="" ng-click="popover.hide();toggleMinAlarmFrameCount();" ng-if="loginData.enableAlarmCount">{{'kShowAllEvents' | translate}}</a> + <a class="item" ng-href="" ng-click="popover.hide();toggleMinAlarmFrameCount();" ng-if="!loginData.enableAlarmCount"> {{'kShowAlarmedEvents' | translate}}</a> + <a class="item" ng-href="" ng-click="popover.hide();buttonClicked(0);">{{'kMonth' | translate}}</a> + <a class="item" ng-href="" ng-click=" popover.hide();buttonClicked(1);"> + {{'kWeek' | translate}} + </a> + <a class="item" ng-href="" ng-click="popover.hide();buttonClicked(2);"> + {{'kDay' | translate}} + </a> + <a class="item" ng-href="" ng-click="popover.hide();buttonClicked(3);"> + {{'kCustomRange' | translate}} + </a> + </div> + </ion-content> </ion-popover-view> diff --git a/www/templates/timeline.html b/www/templates/timeline.html index 80f83e8a..34847eea 100644 --- a/www/templates/timeline.html +++ b/www/templates/timeline.html @@ -38,9 +38,9 @@ <br/> <div style="padding-left:15px; font-size:10px; color:grey"> - <button ng-click="toggleTap()" class="button button-small button-dark"> - {{'kTimelineTap' | translate}}:{{onTap}} - </button> + <button ng-click="toggleTap()" class="button button-small button-dark"> + {{'kTimelineTap' | translate}}:{{onTap}} + </button> <button ng-click="toggleFollowTime()" ng-class="follow.time? 'button button-small button-balanced':'button button-small button-assertive'"> {{'kUpdateTimeline' | translate}}: {{follow.time? ('kTrue' | translate) : ('kFalse' | translate)}} diff --git a/www/templates/wizard.html b/www/templates/wizard.html index 7c6dc887..c7b3694b 100644 --- a/www/templates/wizard.html +++ b/www/templates/wizard.html @@ -1,87 +1,100 @@ <ion-view view-title="{{'kWizard' | translate}}" ng-cloak cache-view="false"> - <ion-nav-buttons side="left"> - <button class="button button-icon button-clear ion-navicon" ng-click="openMenu()"></button> - </ion-nav-buttons> - <ion-content class="padding" overflow-scroll="false"> - <wizard on-finish="finishedWizard()"> - <!-- portal url --> - <wz-step wz-title="1" canexit="exitPortal"> - <h4><i id="transition-delay" class="animated swing ion-wand" style="font-size:2em"></i> {{'kWelcomeWizard' | translate}}</h4> - <img src="img/wizard.svg" width="100px" style="float:left" /> - <p>{{'kWizConfigPain' | translate}}</p> - <h4>{{'kWizPortalUrl' | translate}}</h4> - <label class="item item-input"> - <input autocorrect="off" autocapitalize="none" autocomplete="off" type="text" placeholder="{{'kPortalUrlExample' | translate}}" ng-model="wizard.portalurl"> - </label> - <p ng-if="$root.platformOS=='android'" style="font-size:0.8em; color:gray">{{'kDisableSamsung' | translate}}</p> - <a class="button icon-left ion-information-circled button-clear button-dark" ng-click="toggleTip()">{{wizard.tiptext}}</a> - <div class="wizardtip" ng-show="wizard.tipshow"> - <b>{{'kWizTip' | translate}}: </b>{{'kWizPortalTip' | translate}} - <br/> - <img src="img/portalurl.png" width="30%"> - </div> - <br/> - <button class="button button-small icon icon-right ion-chevron-right" wz-next>{{'kNext' | translate}}</button> - </wz-step> - <!-- auth mode --> - <wz-step wz-title="2"> - <h4>{{'kWizPortalAuth' | translate}}</h4> - <!--<img src="img/wizard.svg" width="100px" style="float:left"/>--> - <p>{{'kWizPortalText' | translate}}</p> - <ion-toggle ng-change="toggleAuth()" ng-model="wizard.useauth" toggle-class="toggle-calm">{{'kWizUseAuth' | translate}}</ion-toggle> - <ion-toggle ng-show="wizard.useauth" ng-model="wizard.usezmauth" toggle-class="toggle-calm">{{'kWizZMAuth' | translate}}</ion-toggle> - <div ng-if="wizard.usezmauth"> - <label class="item item-input item-floating-label"> - <span class="input-label">{{'kUserName' | translate}}</span> - <input autocorrect="off" autocapitalize="none" autocomplete="off" type="text" ng-model="wizard.zmuser" placeholder="{{'kPlaceHolderZMAuthUser'|translate}}"> - </label> - <label class="item item-text-wrap item-input item-floating-label"> - <span class="input-label">{{'kPassword' | translate}}</span> - <input type="password" ng-model="wizard.zmpassword" placeholder="{{'kPlaceHolderZMAuthPass'|translate}}"> - <!--<p >{{'kWizPasswdNote' | translate}}</p>--> - </label> - </div> - <ion-toggle ng-show="wizard.useauth" ng-model="wizard.usebasicauth" toggle-class="toggle-calm">{{'kWizBasicAuth' | translate}}<p ng-show="wizard.usebasicauth">{{'kWarningBasicAuth'|translate}}</p></ion-toggle> - - <label class="item item-input item-floating-label" ng-show="wizard.usebasicauth"> - <span class="input-label">{{'kUserName' | translate}}</span> - <input autocorrect="off" autocapitalize="none" autocomplete="off" type="text" ng-model="wizard.basicuser" placeholder="{{'kPlaceHolderBasicAuthUser'|translate}}"> - </label> - <label class="item item-input item-text-wrap item-floating-label" ng-show="wizard.usebasicauth"> - <span class="input-label">{{'kPassword' | translate}}</span> - - <input type="password" ng-model="wizard.basicpassword" placeholder="{{'kPlaceHolderBasicAuthPass'|translate}}"> - <p>{{'kWizPasswdNote' | translate}}</p> - </label> - <a class="button icon-left ion-information-circled button-clear button-dark" ng-click="toggleTip()">{{wizard.tiptext}}</a> - <div class="wizardtip" ng-show="wizard.tipshow"> - <b>{{'kWizTip'| translate}} </b> {{'kWizAuthText1' | translate}} - <br/> {{'kWizAuthText2' | translate}} - </div> - <br/> - <button class="button button-small icon icon-left ion-chevron-left" wz-previous>{{'kPrev' | translate}}</button> - <button class="button button-small icon icon-right ion-chevron-right" ng-click="exitAuth()">{{'kNext' | translate}}</button> - </wz-step> - <wz-step wz-title="3"> - <br/> - <br/> - <h4>{{'kWizResults' | translate}}</h4> - <span ng-if="wizard.portalValidText" ng-style="{'color':wizard.portalColor}"><i ng-class="wizard.portalColor=='#16a085' ? 'ion-checkmark-circled':'ion-close-circled'"></i> {{wizard.portalValidText}}<br/></span> - <span ng-if="wizard.apiValidText" ng-style="{'color':wizard.apiColor}"><i ng-class=" wizard.apiColor=='#16a085' ? 'ion-checkmark-circled':'ion-close-circled'"></i> {{wizard.apiValidText}}<br/></span> - <span ng-if="wizard.streamingValidText" ng-style="{'color':wizard.streamingColor}"><i ng-class="wizard.streamingColor=='#16a085' ? 'ion-checkmark-circled':'ion-close-circled'"></i> {{wizard.streamingValidText}}<br/></span> - <br/> - <div class="wizardtip"> - {{'kWizNextStep1' | translate}}: - <ul class="wiz-list"> - <li>{{'kWizNextStep2' | translate}}</li> - <li>{{'kWizNextStep3' | translate}}</li> - </ul> - </div> - <br/> - <br/> - <button class="button button-small icon icon-left ion-chevron-left" wz-previous>{{'kPrev' | translate}}</button> - <button class="button button-small icon icon-right ion-chevron-right" ng-click="gotoLoginState()">{{'kWizGotoLogin' | translate}}</button> - </wz-step> - </wizard> - </ion-content> + <ion-nav-buttons side="left"> + <button class="button button-icon button-clear ion-navicon" ng-click="openMenu()"></button> + </ion-nav-buttons> + <ion-content class="padding" overflow-scroll="false"> + <wizard on-finish="finishedWizard()"> + <!-- portal url --> + <wz-step wz-title="1" canexit="exitPortal"> + <h4> + <i id="transition-delay" class="animated swing ion-wand" style="font-size:2em"></i> {{'kWelcomeWizard' | translate}}</h4> + <img src="img/wizard.svg" width="100px" style="float:left" /> + <p>{{'kWizConfigPain' | translate}}</p> + <h4>{{'kWizPortalUrl' | translate}}</h4> + <label class="item item-input"> + <input autocorrect="off" autocapitalize="none" autocomplete="off" type="text" placeholder="{{'kPortalUrlExample' | translate}}" + ng-model="wizard.portalurl"> + </label> + <p ng-if="$root.platformOS=='android'" style="font-size:0.8em; color:gray">{{'kDisableSamsung' | translate}}</p> + <a class="button icon-left ion-information-circled button-clear button-dark" ng-click="toggleTip()">{{wizard.tiptext}}</a> + <div class="wizardtip" ng-show="wizard.tipshow"> + <b>{{'kWizTip' | translate}}: </b>{{'kWizPortalTip' | translate}} + <br/> + <img src="img/portalurl.png" width="30%"> + </div> + <br/> + <button class="button button-small icon icon-right ion-chevron-right" wz-next>{{'kNext' | translate}}</button> + </wz-step> + <!-- auth mode --> + <wz-step wz-title="2"> + <h4>{{'kWizPortalAuth' | translate}}</h4> + <!--<img src="img/wizard.svg" width="100px" style="float:left"/>--> + <p>{{'kWizPortalText' | translate}}</p> + <ion-toggle ng-change="toggleAuth()" ng-model="wizard.useauth" toggle-class="toggle-calm">{{'kWizUseAuth' | translate}}</ion-toggle> + <ion-toggle ng-show="wizard.useauth" ng-model="wizard.usezmauth" toggle-class="toggle-calm">{{'kWizZMAuth' | translate}}</ion-toggle> + <div ng-if="wizard.usezmauth"> + <label class="item item-input item-floating-label"> + <span class="input-label">{{'kUserName' | translate}}</span> + <input autocorrect="off" autocapitalize="none" autocomplete="off" type="text" ng-model="wizard.zmuser" placeholder="{{'kPlaceHolderZMAuthUser'|translate}}"> + </label> + <label class="item item-text-wrap item-input item-floating-label"> + <span class="input-label">{{'kPassword' | translate}}</span> + <input type="password" ng-model="wizard.zmpassword" placeholder="{{'kPlaceHolderZMAuthPass'|translate}}"> + <!--<p >{{'kWizPasswdNote' | translate}}</p>--> + </label> + </div> + <ion-toggle ng-show="wizard.useauth" ng-model="wizard.usebasicauth" toggle-class="toggle-calm">{{'kWizBasicAuth' | translate}} + <p ng-show="wizard.usebasicauth">{{'kWarningBasicAuth'|translate}}</p> + </ion-toggle> + + <label class="item item-input item-floating-label" ng-show="wizard.usebasicauth"> + <span class="input-label">{{'kUserName' | translate}}</span> + <input autocorrect="off" autocapitalize="none" autocomplete="off" type="text" ng-model="wizard.basicuser" placeholder="{{'kPlaceHolderBasicAuthUser'|translate}}"> + </label> + <label class="item item-input item-text-wrap item-floating-label" ng-show="wizard.usebasicauth"> + <span class="input-label">{{'kPassword' | translate}}</span> + + <input type="password" ng-model="wizard.basicpassword" placeholder="{{'kPlaceHolderBasicAuthPass'|translate}}"> + <p>{{'kWizPasswdNote' | translate}}</p> + </label> + <a class="button icon-left ion-information-circled button-clear button-dark" ng-click="toggleTip()">{{wizard.tiptext}}</a> + <div class="wizardtip" ng-show="wizard.tipshow"> + <b>{{'kWizTip'| translate}} </b> {{'kWizAuthText1' | translate}} + <br/> {{'kWizAuthText2' | translate}} + </div> + <br/> + <button class="button button-small icon icon-left ion-chevron-left" wz-previous>{{'kPrev' | translate}}</button> + <button class="button button-small icon icon-right ion-chevron-right" ng-click="exitAuth()">{{'kNext' | translate}}</button> + </wz-step> + <wz-step wz-title="3"> + <br/> + <br/> + <h4>{{'kWizResults' | translate}}</h4> + <span ng-if="wizard.portalValidText" ng-style="{'color':wizard.portalColor}"> + <i ng-class="wizard.portalColor=='#16a085' ? 'ion-checkmark-circled':'ion-close-circled'"></i> {{wizard.portalValidText}} + <br/> + </span> + <span ng-if="wizard.apiValidText" ng-style="{'color':wizard.apiColor}"> + <i ng-class=" wizard.apiColor=='#16a085' ? 'ion-checkmark-circled':'ion-close-circled'"></i> {{wizard.apiValidText}} + <br/> + </span> + <span ng-if="wizard.streamingValidText" ng-style="{'color':wizard.streamingColor}"> + <i ng-class="wizard.streamingColor=='#16a085' ? 'ion-checkmark-circled':'ion-close-circled'"></i> {{wizard.streamingValidText}} + <br/> + </span> + <br/> + <div class="wizardtip"> + {{'kWizNextStep1' | translate}}: + <ul class="wiz-list"> + <li>{{'kWizNextStep2' | translate}}</li> + <li>{{'kWizNextStep3' | translate}}</li> + </ul> + </div> + <br/> + <br/> + <button class="button button-small icon icon-left ion-chevron-left" wz-previous>{{'kPrev' | translate}}</button> + <button class="button button-small icon icon-right ion-chevron-right" ng-click="gotoLoginState()">{{'kWizGotoLogin' | translate}}</button> + </wz-step> + </wizard> + </ion-content> </ion-view> diff --git a/www/templates/zm-portal-login.html b/www/templates/zm-portal-login.html index 877dbb97..903ae7c6 100644 --- a/www/templates/zm-portal-login.html +++ b/www/templates/zm-portal-login.html @@ -1,26 +1,27 @@ <ion-view view-title="{{$root.appName}}" hide-nav-bar="true" hide-back-button="true" cache-view="false"> - <ion-content class="pin-background" scroll="false"> - <div style="margin-left:20px; margin-right:20px"> - <center> - <br/> - <br/> - <div id="responsive-image"> - <img src="img/authlogo.png"> - </div> - <div ng-if="pinPrompt"> - <span style="color:white">{{'kEnterPin' | translate}}</span> - <div class="pinCode"> - <input id="pin-box" type="number" pattern="[0-9]*" ng-model="pindata.pin" ng-keyup="pinChange()" /> - </div> - <br/> <span style="color:white">{{pindata.status}}</span> - <br/> - <button class="button button-dark icon ion-unlocked" ng-click="unlock()"> Unlock - </button> - </div> - <div id="really-your-fault" class="animated fadeIn" style="color:white">{{'kPortalNotice' | translate}} - <br/> - <br/>{{'kPortalNoticeSub' | translate}}</div> - </center> + <ion-content class="pin-background" scroll="false"> + <div style="margin-left:20px; margin-right:20px"> + <center> + <br/> + <br/> + <div id="responsive-image"> + <img src="img/authlogo.png"> </div> - </ion-content> + <div ng-if="pinPrompt"> + <span style="color:white">{{'kEnterPin' | translate}}</span> + <div class="pinCode"> + <input id="pin-box" type="number" pattern="[0-9]*" ng-model="pindata.pin" ng-keyup="pinChange()" /> + </div> + <br/> + <span style="color:white">{{pindata.status}}</span> + <br/> + <button class="button button-dark icon ion-unlocked" ng-click="unlock()"> Unlock + </button> + </div> + <div id="really-your-fault" class="animated fadeIn" style="color:white">{{'kPortalNotice' | translate}} + <br/> + <br/>{{'kPortalNoticeSub' | translate}}</div> + </center> + </div> + </ion-content> </ion-view> |
