summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPliable Pixels <pliablepixels@gmail.com>2018-05-12 08:12:23 -0400
committerPliable Pixels <pliablepixels@gmail.com>2018-05-12 08:12:23 -0400
commit0d81a588d42c73c92d313f853461b433f8543ae4 (patch)
tree08590e3caad35938ec92c7a04bc3206409011284
parent971741dc3e0eaa26c3a56ceeab6ce6eece61b6ce (diff)
file formatting
-rw-r--r--www/index.html331
-rw-r--r--www/js/DevOptionsCtrl.js264
-rw-r--r--www/js/EventCtrl.js4985
-rw-r--r--www/js/EventDateTimeFilterCtrl.js238
-rw-r--r--www/js/EventModalCtrl.js80
-rw-r--r--www/js/EventServerSettingsCtrl.js583
-rw-r--r--www/js/EventsGraphsCtrl.js426
-rw-r--r--www/js/EventsModalGraphCtrl.js684
-rw-r--r--www/js/FirstUseCtrl.js139
-rw-r--r--www/js/HelpCtrl.js143
-rw-r--r--www/js/ImportantMessageCtrl.js45
-rw-r--r--www/js/InvalidApiCtrl.js48
-rw-r--r--www/js/LogCtrl.js549
-rw-r--r--www/js/LoginCtrl.js25
-rw-r--r--www/js/LowVersionCtrl.js29
-rw-r--r--www/js/MenuController.js116
-rw-r--r--www/js/MomentCtrl.js139
-rw-r--r--www/js/MonitorCtrl.js930
-rw-r--r--www/js/MonitorModalCtrl.js133
-rw-r--r--www/js/MontageCtrl.js180
-rw-r--r--www/js/MontageHistoryCtrl.js189
-rw-r--r--www/js/NewsCtrl.js221
-rw-r--r--www/js/PortalLoginCtrl.js1025
-rw-r--r--www/js/RefreshCtrl.js37
-rw-r--r--www/js/StateCtrl.js709
-rw-r--r--www/js/TimelineCtrl.js2705
-rw-r--r--www/js/TimelineModalCtrl.js867
-rw-r--r--www/js/WizardCtrl.js1465
-rwxr-xr-xwww/js/app.js178
-rw-r--r--www/js/controllers.js16
-rw-r--r--www/js/ionicUtils.js35
-rw-r--r--www/templates/devoptions.html380
-rw-r--r--www/templates/events-date-time-filter.html50
-rw-r--r--www/templates/events-graphs.html119
-rw-r--r--www/templates/events-modal.html333
-rw-r--r--www/templates/events-modalgraph.html14
-rw-r--r--www/templates/events-popover.html22
-rw-r--r--www/templates/events.html55
-rw-r--r--www/templates/eventserversettings.html106
-rw-r--r--www/templates/first-use.html71
-rw-r--r--www/templates/help.html23
-rw-r--r--www/templates/image-modal.html7
-rw-r--r--www/templates/important_message.html65
-rw-r--r--www/templates/invalidapi.html55
-rw-r--r--www/templates/log.html85
-rw-r--r--www/templates/login.html198
-rw-r--r--www/templates/lowversion.html46
-rw-r--r--www/templates/menu.html287
-rw-r--r--www/templates/moment-mask.html46
-rw-r--r--www/templates/moment-popover.html29
-rw-r--r--www/templates/moment.html38
-rw-r--r--www/templates/monitors-modal.html10
-rw-r--r--www/templates/monitors.html116
-rw-r--r--www/templates/montage-history.html5
-rw-r--r--www/templates/montage.html285
-rw-r--r--www/templates/news.html45
-rw-r--r--www/templates/refresh.html30
-rw-r--r--www/templates/reorder-modal.html44
-rw-r--r--www/templates/state.html105
-rw-r--r--www/templates/timeline-modal.html88
-rw-r--r--www/templates/timeline-popover.html34
-rw-r--r--www/templates/timeline.html6
-rw-r--r--www/templates/wizard.html183
-rw-r--r--www/templates/zm-portal-login.html47
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>&nbsp;" + $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>&nbsp;" + $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>&nbsp;" + $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>&nbsp;" + $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>
- &nbsp;<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>
+ &nbsp;
+ <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}}.)&nbsp;
+ <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}}.)&nbsp;
- <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 }}&nbsp;
- <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 }}&nbsp;
+ <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&nbsp;
<label class="item-input-wrapper">
@@ -50,25 +65,25 @@
</label>
</div>
-->
- <div class="item item-text-wrap item-input-inset">
- {{'kMontageImageScale' | translate}}(%)&nbsp;
- <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}}(%)&nbsp;
- <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}}(%)&nbsp;
- <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}}(%)&nbsp;
+ <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}}(%)&nbsp;
+ <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}}(%)&nbsp;
+ <label class="item-input-wrapper">
+ <input type="tel" placeholder="" ng-model="loginData.monSingleImageQuality">
+ </label>
+ </div>
+ <!--<div class="item item-input-inset">
{{'kResumeDelay' | translate}}(ms)&nbsp;
<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}}(%)&nbsp;
- <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}}&nbsp;
- <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}}&nbsp;
- <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}}.)&nbsp;
- <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}}.)&nbsp;
- <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}}(%)&nbsp;
+ <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}}&nbsp;
+ <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}}&nbsp;
+ <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}}.)&nbsp;
+ <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}}.)&nbsp;
+ <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()">&nbsp;{{'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()">&nbsp;{{'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">
- &nbsp;<i class="ion-pause"></i> {{'kPaused' | translate}}&nbsp;
- </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">
+ &nbsp;
+ <i class="ion-pause"></i> {{'kPaused' | translate}}&nbsp;
+ </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}}&nbsp;<i class="ion-arrow-right-b"></i>&nbsp;{{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}}&nbsp;
+ <i class="ion-arrow-right-b"></i>&nbsp;{{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>&nbsp;
- <!-- <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>&nbsp;
+ <!-- <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>&nbsp;
+ <i class="ion-wifi" style="font-size:150%;"></i>&nbsp;
<!--<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>&nbsp;
-
-
+
+
</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">&nbsp;</i>{{event.Event.MonitorName}}</b>
- <span ng-if="!loginData.enableThumbs">({{event.Event.Id}})</span> &nbsp;
- <br/>
+
+
+
+ <!-- col col left-->
+
+ <b>
+ <i ng-if="event.Event.Archived=='1'" class="ion-ios-flag" style="color:red">&nbsp;</i>{{event.Event.MonitorName}}</b>
+ <span ng-if="!loginData.enableThumbs">({{event.Event.Id}})</span> &nbsp;
+ <br/>
<i class="ion-images"></i> {{event.Event.Frames}} &nbsp;
<i class="ion-ios-bell-outline"></i> {{event.Event.AlarmFrames}} &nbsp;
@@ -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> &nbsp; {{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> &nbsp; {{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>
- &nbsp;{{'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>
+ &nbsp;{{'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>
-
- &nbsp;<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>
+
+ &nbsp;
+ <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>&nbsp;
- <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 }}:&nbsp;
- <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>&nbsp;
+ <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 }}:&nbsp;
+ <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();">&nbsp;&nbsp;&nbsp;<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();">&nbsp;&nbsp;&nbsp;<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;">&nbsp;<i class="icon ion-arrow-graph-down-left"></i>&nbsp;</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;">&nbsp;<i class="icon ion-arrow-graph-down-left"></i>&nbsp;</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;">&nbsp;{{$root.getProfileName();}}&nbsp;</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;">&nbsp;{{$root.getProfileName();}}&nbsp;</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>
- &nbsp;<button class="button button-icon button-clear ion-gear-b" ng-click="hideUnhide()"></button>
+ &nbsp;
+ <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">&nbsp;{{ 'kArrangingImages' | translate }}...&nbsp;</div>
+ <div ng-if="areImagesLoading" class="screen-note">&nbsp;{{ 'kArrangingImages' | translate }}...&nbsp;</div>
+
+ <div ng-if="!areImagesLoading && !isMaxScoreFramePresent" class="screen-note">&nbsp;{{ 'kApiUpgrade' | translate }}&nbsp;</div>
- <div ng-if="!areImagesLoading && !isMaxScoreFramePresent" class="screen-note">&nbsp;{{ 'kApiUpgrade' | translate }}&nbsp;</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)">
- &nbsp;<i class="ion-chevron-left"></i>&nbsp;
+ &nbsp;
+ <i class="ion-chevron-left"></i>&nbsp;
</a>
</li>
<li>
<a href="" ng-click="getMoments()">
- &nbsp;<i class="ion-location"></i>&nbsp;
+ &nbsp;
+ <i class="ion-location"></i>&nbsp;
</a>
</li>
<li>
<a href="" ng-click="changeFrom(1)">
- &nbsp;<i class="ion-chevron-right"></i>&nbsp;
+ &nbsp;
+ <i class="ion-chevron-right"></i>&nbsp;
</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}}&nbsp;</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">&nbsp;{{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> &nbsp;
+ <span ng-class="{'ion-eye':monitor.Monitor.listDisplay=='show','ion-eye-disabled':monitor.Monitor.listDisplay!='show'}">
+ </span>
+ </div>
+ &nbsp;
+ <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> &nbsp;
- <span ng-class="{'ion-eye':monitor.Monitor.listDisplay=='show','ion-eye-disabled':monitor.Monitor.listDisplay!='show'}"> </span>
- </div>
- &nbsp;
- <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>
- &nbsp;<button class="button button-icon button-clear ion-eye" ng-click="hideUnhide();">&nbsp;
- </button>
- <button class="button button-icon button-clear ion-chevron-down" ng-click="toggleSubMenuFunction();">&nbsp;
- </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}}&nbsp;</span>
- <button class="button button-icon button-clear ion-arrow-move" ng-click="dragToggle();">&nbsp;
- </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>
+ &nbsp;
+ <button class="button button-icon button-clear ion-eye" ng-click="hideUnhide();">&nbsp;
+ </button>
+ <button class="button button-icon button-clear ion-chevron-down" ng-click="toggleSubMenuFunction();">&nbsp;
+ </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}}&nbsp;</span>
+ <button class="button button-icon button-clear ion-arrow-move" ng-click="dragToggle();">&nbsp;
+ </button>
+ <!--
<button class="button button-icon button-clear ion-monitor" ng-click="cast();">&nbsp;
</button>
-->
- <button class="button button-icon button-clear ion-loop" ng-click="resetSizes();">&nbsp;
- </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">&nbsp;{{ 'kArrangingImages' | translate }}...&nbsp;</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();">&nbsp;
+ </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">&nbsp;{{ 'kArrangingImages' | translate }}...&nbsp;</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'">&nbsp;
- <figcaption id="slowpulse" ng-class="monitor.Monitor.isAlarmed==true?'alarmed-figcaption animated infinite flash':'normal-figcaption'" >&nbsp;
-
- <span ng-if="monitor.Monitor.isStamp && isDragabillyOn"><i class="animated infinite flash ion-pin"></i>&nbsp;</span><i class="ion-ios-videocam"></i>&nbsp;
- {{monitor.Monitor.Name}}&nbsp;<i ng-if="$root.runMode!='lowbw'" ng-style="{'color':monitor.Monitor.alarmState}" class="ion-record"></i>&nbsp;
+ <span ng-if="monitor.Monitor.isStamp && isDragabillyOn">
+ <i class="animated infinite flash ion-pin"></i>&nbsp;</span>
+ <i class="ion-ios-videocam"></i>&nbsp; {{monitor.Monitor.Name}}&nbsp;
+ <i ng-if="$root.runMode!='lowbw'" ng-style="{'color':monitor.Monitor.alarmState}" class="ion-record"></i>&nbsp;
- </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}}&nbsp;<i class="ion-arrow-right-b"></i>&nbsp;{{'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}}&nbsp;
+ <i class="ion-arrow-right-b"></i>&nbsp;{{'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}}:&nbsp;{{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>&nbsp;{{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>&nbsp;{{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>&nbsp;{{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>&nbsp;{{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>&nbsp;{{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>&nbsp;{{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>