diff options
Diffstat (limited to 'www/js')
| -rwxr-xr-x | www/js/DataModel.js | 66 | ||||
| -rw-r--r-- | www/js/MonitorModalCtrl.js | 2919 | ||||
| -rw-r--r-- | www/js/MontageCtrl.js | 111 | ||||
| -rw-r--r-- | www/js/MontageHistoryCtrl.js | 4 | ||||
| -rwxr-xr-x | www/js/app.js | 13 |
5 files changed, 1533 insertions, 1580 deletions
diff --git a/www/js/DataModel.js b/www/js/DataModel.js index 3b19b686..55485aba 100755 --- a/www/js/DataModel.js +++ b/www/js/DataModel.js @@ -292,8 +292,18 @@ angular.module('zmApp.controllers') $http.get(myurl) .success(function (data) { configParams.ZM_MIN_STREAMING_PORT = data.config.Value; - setCurrentServerMultiPortSupported(true); + + if (!data.config.Value) { + setCurrentServerMultiPortSupported(false); + log ("ZM_MIN_STREAMING_PORT not configure, disabling"); + configParams.ZM_MIN_STREAMING_PORT = 0; + } + else { + setCurrentServerMultiPortSupported(true); log("Got min streaming port value of: " + configParams.ZM_MIN_STREAMING_PORT); + } + + d.resolve(configParams.ZM_MIN_STREAMING_PORT); return (d.promise); }) @@ -1517,6 +1527,58 @@ angular.module('zmApp.controllers') return monitors; }, + killStream: function (ck) { + debug ("Killing connKey: "+ck); + var myauthtoken = $rootScope.authSession.replace("&auth=", ""); + var req = $http( + { + method: 'POST', + /*timeout: 15000,*/ + url: loginData.url + '/index.php', + 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); + return foo; + }, + + data: + { + view: "request", + request: "stream", + connkey: ck, + command: 17, + auth: myauthtoken, + + } + }) + .then (function (succ) { + console.log ("KILL OK WITH: " + JSON.stringify(succ)); + }, + function (err) { + console.log ("KILL ERROR WITH: " + JSON.stringify(err)); + }); + + + }, + + regenConnKeys: function () { + + ddebug ("Regenerating connkeys..."); + for (var i=0; i < monitors.length; i++){ + monitors[i].Monitor.connKey = (Math.floor((Math.random() * 999999) + 1)).toString(); + } + }, + getMonitors: function (forceReload) { //console.log("** Inside ZMData getMonitors with forceReload=" + forceReload); @@ -1556,6 +1618,7 @@ angular.module('zmApp.controllers') reloadMonitorDisplayStatus(); + debug ("Inside getMonitors, will also regen connkeys"); debug("Now trying to get multi-server data, if present"); $http.get(apiurl + "/servers.json") .success(function (data) { @@ -1564,6 +1627,7 @@ angular.module('zmApp.controllers') log("multi server list loaded" + JSON.stringify(data)); multiservers = data.servers; + for (var i = 0; i < monitors.length; i++) { // make them all show for now diff --git a/www/js/MonitorModalCtrl.js b/www/js/MonitorModalCtrl.js index 4351ce1a..ff0368cd 100644 --- a/www/js/MonitorModalCtrl.js +++ b/www/js/MonitorModalCtrl.js @@ -3,1807 +3,1620 @@ /* jslint browser: true*/ /* global saveAs, cordova,StatusBar,angular,console,ionic, moment, imagesLoaded, chrome */ -angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$rootScope', 'zm', 'NVRDataModel', '$ionicSideMenuDelegate', '$timeout', '$interval', '$ionicModal', '$ionicLoading', '$http', '$state', '$stateParams', '$ionicHistory', '$ionicScrollDelegate', '$q', '$sce', 'carouselUtils', '$ionicPopup', 'SecuredPopups', '$translate', function($scope, $rootScope, zm, NVRDataModel, $ionicSideMenuDelegate, $timeout, $interval, $ionicModal, $ionicLoading, $http, $state, $stateParams, $ionicHistory, $ionicScrollDelegate, $q, $sce, carouselUtils, $ionicPopup, SecuredPopups, $translate) -{ +angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$rootScope', 'zm', 'NVRDataModel', '$ionicSideMenuDelegate', '$timeout', '$interval', '$ionicModal', '$ionicLoading', '$http', '$state', '$stateParams', '$ionicHistory', '$ionicScrollDelegate', '$q', '$sce', 'carouselUtils', '$ionicPopup', 'SecuredPopups', '$translate', function ($scope, $rootScope, zm, NVRDataModel, $ionicSideMenuDelegate, $timeout, $interval, $ionicModal, $ionicLoading, $http, $state, $stateParams, $ionicHistory, $ionicScrollDelegate, $q, $sce, carouselUtils, $ionicPopup, SecuredPopups, $translate) { - $scope.animationInProgress = false; - $scope.imageFit = true; - $scope.isModalActive = true; - var intervalModalHandle; - var cycleHandle; - var nphTimer; - var ld = NVRDataModel.getLogin(); - $scope.svgReady = false; - $scope.zoneArray = []; - var originalZones = []; - $scope.isZoneEdit = false; - var _moveStart = false; - var targetID = ""; - $scope.imageZoomable = true; - $scope.ptzButtonsShown = true; + $scope.animationInProgress = false; + $scope.imageFit = true; + $scope.isModalActive = true; + var intervalModalHandle; + var cycleHandle; + var nphTimer; + var ld = NVRDataModel.getLogin(); + $scope.svgReady = false; + $scope.zoneArray = []; + var originalZones = []; + $scope.isZoneEdit = false; + var _moveStart = false; + var targetID = ""; + $scope.imageZoomable = true; + $scope.ptzButtonsShown = true; - $scope.csize = ($rootScope.platformOS == 'desktop') ? 10:20; + $scope.csize = ($rootScope.platformOS == 'desktop') ? 10 : 20; - window.addEventListener("resize", function(){imageLoaded();}, false); + window.addEventListener("resize", function () { + imageLoaded(); + }, false); - $rootScope.authSession = "undefined"; + $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); + $scope.currentStreamMode = 'single'; + NVRDataModel.log("Using stream mode " + $scope.currentStreamMode); - NVRDataModel.debug("MonitorModalCtrl called from " + $ionicHistory.currentStateName()); + NVRDataModel.debug("MonitorModalCtrl called from " + $ionicHistory.currentStateName()); + - $rootScope.validMonitorId = $scope.monitors[0].Monitor.Id; - NVRDataModel.getAuthKey($rootScope.validMonitorId, $scope.monitors[0].Monitor.connKey) - .then(function(success) - { - $ionicLoading.hide(); - $rootScope.authSession = success; - NVRDataModel.log("Modal: Stream authentication construction: " + $rootScope.authSession); + $rootScope.validMonitorId = $scope.monitors[0].Monitor.Id; + NVRDataModel.getAuthKey($rootScope.validMonitorId, $scope.monitors[0].Monitor.connKey) + .then(function (success) { + $ionicLoading.hide(); + $rootScope.authSession = success; + NVRDataModel.log("Modal: Stream authentication construction: " + $rootScope.authSession); - }, - function(error) - { + }, + function (error) { - $ionicLoading.hide(); - NVRDataModel.debug("ModalCtrl: Error details of stream auth:" + error); - //$rootScope.authSession=""; - NVRDataModel.log("Modal: Error returned Stream authentication construction. Retaining old value of: " + $rootScope.authSession); - }); + $ionicLoading.hide(); + NVRDataModel.debug("ModalCtrl: Error details of stream auth:" + error); + //$rootScope.authSession=""; + NVRDataModel.log("Modal: Error returned Stream authentication construction. Retaining old value of: " + $rootScope.authSession); + }); + + + $interval.cancel(intervalModalHandle); + $interval.cancel(cycleHandle); + + intervalModalHandle = $interval(function () { + loadModalNotifications(); + // console.log ("Refreshing Image..."); + }.bind(this), 5000); + + $timeout.cancel(nphTimer); + nphTimer = $timeout(function () { + $scope.currentStreamMode = 'jpeg'; + NVRDataModel.log("Switching playback via nphzms"); + }, zm.nphSwitchTimer); + + // This is the PTZ menu + + $scope.ptzRadialMenuOptions = { + content: '', + + background: '#2F4F4F', + isOpen: true, + toggleOnClick: false, + size: 'small', + button: { + cssClass: "fa fa-arrows-alt", + }, + items: [{ + content: '', + cssClass: 'fa fa-chevron-circle-up', + empty: false, - $interval.cancel(intervalModalHandle); - $interval.cancel(cycleHandle); + onclick: function () { + controlPTZ($scope.monitorId, $scope.ptzMoveCommand + 'Down'); + } + }, - intervalModalHandle = $interval(function() - { - loadModalNotifications(); - // console.log ("Refreshing Image..."); - }.bind(this), 5000); + { + content: '', + cssClass: 'fa fa-chevron-circle-up', + empty: false, + onclick: function () { + controlPTZ($scope.monitorId, $scope.ptzMoveCommand + 'DownLeft'); + } + }, - $timeout.cancel(nphTimer); - nphTimer = $timeout(function() - { - $scope.currentStreamMode = 'jpeg'; - NVRDataModel.log("Switching playback via nphzms"); - }, zm.nphSwitchTimer); + { + content: '', + cssClass: 'fa fa-chevron-circle-up', + empty: false, + + onclick: function () { + controlPTZ($scope.monitorId, $scope.ptzMoveCommand + 'Left'); + } + }, + { + content: 'D', + empty: true, - // This is the PTZ menu + onclick: function () { + // console.log('About'); + } + }, - $scope.ptzRadialMenuOptions = { + { content: '', + cssClass: 'fa fa-chevron-circle-up', + empty: false, + onclick: function () { + controlPTZ($scope.monitorId, $scope.ptzMoveCommand + 'UpLeft'); + } + }, - background: '#2F4F4F', - isOpen: true, - toggleOnClick: false, - size: 'small', - button: - { - cssClass: "fa fa-arrows-alt", - }, - items: [ - { - content: '', - cssClass: 'fa fa-chevron-circle-up', - empty: false, - - onclick: function() - { - controlPTZ($scope.monitorId, $scope.ptzMoveCommand + 'Down'); - } - }, - - { - content: '', - cssClass: 'fa fa-chevron-circle-up', - empty: false, - onclick: function() - { - controlPTZ($scope.monitorId, $scope.ptzMoveCommand + 'DownLeft'); - } - }, + { + content: '', + cssClass: 'fa fa-chevron-circle-up', + empty: false, + onclick: function () { + controlPTZ($scope.monitorId, $scope.ptzMoveCommand + 'Up'); + } + }, - { - content: '', - cssClass: 'fa fa-chevron-circle-up', - empty: false, + { + content: '', + cssClass: 'fa fa-chevron-circle-up', + empty: false, + onclick: function () { + controlPTZ($scope.monitorId, $scope.ptzMoveCommand + 'UpRight'); + } + }, - onclick: function() - { - controlPTZ($scope.monitorId, $scope.ptzMoveCommand + 'Left'); - } - }, - { - content: 'D', - empty: true, - - onclick: function() - { - // console.log('About'); - } - }, - - { - content: '', - cssClass: 'fa fa-chevron-circle-up', - empty: false, - onclick: function() - { - controlPTZ($scope.monitorId, $scope.ptzMoveCommand + 'UpLeft'); - } - }, - - { - content: '', - cssClass: 'fa fa-chevron-circle-up', - empty: false, - onclick: function() - { - controlPTZ($scope.monitorId, $scope.ptzMoveCommand + 'Up'); - } - }, - - { - content: '', - cssClass: 'fa fa-chevron-circle-up', - empty: false, - onclick: function() - { - controlPTZ($scope.monitorId, $scope.ptzMoveCommand + 'UpRight'); - } - }, - - { - content: 'H', - empty: true, - onclick: function() - { - //console.log('About'); - } - }, - - { - content: '', - cssClass: 'fa fa-chevron-circle-up', - empty: false, - onclick: function() - { - controlPTZ($scope.monitorId, $scope.ptzMoveCommand + 'Right'); - } - }, - - { - content: '', - cssClass: 'fa fa-chevron-circle-up', - empty: false, - onclick: function() - { - controlPTZ($scope.monitorId, $scope.ptzMoveCommand + 'DownRight'); - } - }, - - { - content: 'K', - empty: true, - onclick: function() - { - //console.log('About'); - } - }, - ] - }; + { + content: 'H', + empty: true, + onclick: function () { + //console.log('About'); + } + }, - //------------------------------------------------------------- - // On re-auth, we need a new zms - //------------------------------------------------------------- + { + content: '', + cssClass: 'fa fa-chevron-circle-up', + empty: false, + onclick: function () { + controlPTZ($scope.monitorId, $scope.ptzMoveCommand + 'Right'); + } + }, - $rootScope.$on("auth-success", function() - { + { + content: '', + cssClass: 'fa fa-chevron-circle-up', + empty: false, + onclick: function () { + controlPTZ($scope.monitorId, $scope.ptzMoveCommand + 'DownRight'); + } + }, - NVRDataModel.debug("MonitorModalCtrl: Re-login detected, resetting everything & re-generating connkey"); - NVRDataModel.stopNetwork("MonitorModal-auth success"); - $scope.connKey = (Math.floor((Math.random() * 999999) + 1)).toString(); + { + content: 'K', + empty: true, + onclick: function () { + //console.log('About'); + } + }, + ] + }; - }); + //------------------------------------------------------------- + // On re-auth, we need a new zms + //------------------------------------------------------------- - $scope.cast = function(mid, mon) { + $rootScope.$on("auth-success", function () { - }; + NVRDataModel.debug("MonitorModalCtrl: Re-login detected, resetting everything & re-generating connkey"); + //NVRDataModel.stopNetwork("MonitorModal-auth success"); + NVRDataModel.killStream($scope.connKey); + $scope.connKey = (Math.floor((Math.random() * 999999) + 1)).toString(); - //---------------------------------- - // toggles monitor cycling - //---------------------------------- - $scope.toggleCycle = function() - { - //console.log ("HERE"); - $scope.isCycle = !$scope.isCycle; - var ld = NVRDataModel.getLogin(); - ld.cycleMonitors = $scope.isCycle; - NVRDataModel.setLogin(ld); - $scope.cycleText = $scope.isCycle ? $translate.instant('kOn') : $translate.instant('kOff'); - - if ($scope.isCycle) - { - NVRDataModel.log("re-starting cycle timer"); - $interval.cancel(cycleHandle); - - cycleHandle = $interval(function() - { - moveToMonitor($scope.monitorId, 1); - // console.log ("Refreshing Image..."); - }.bind(this), ld.cycleMonitorsInterval * 1000); - } - else - { - NVRDataModel.log("cancelling cycle timer"); - $interval.cancel(cycleHandle); - } + }); - }; + $scope.cast = function (mid, mon) { - //------------------------------------------------------------- - // PTZ enable/disable - //------------------------------------------------------------- + }; - $scope.togglePTZ = function() - { + //---------------------------------- + // toggles monitor cycling + //---------------------------------- + $scope.toggleCycle = function () { + //console.log ("HERE"); + $scope.isCycle = !$scope.isCycle; + var ld = NVRDataModel.getLogin(); + ld.cycleMonitors = $scope.isCycle; + NVRDataModel.setLogin(ld); + $scope.cycleText = $scope.isCycle ? $translate.instant('kOn') : $translate.instant('kOff'); - //console.log("PTZ"); + if ($scope.isCycle) { + NVRDataModel.log("re-starting cycle timer"); + $interval.cancel(cycleHandle); - if ($scope.isControllable == '1') - { - //console.log ("iscontrollable is true"); - $scope.showPTZ = !$scope.showPTZ; + cycleHandle = $interval(function () { + moveToMonitor($scope.monitorId, 1); + // console.log ("Refreshing Image..."); + }.bind(this), ld.cycleMonitorsInterval * 1000); + } else { + NVRDataModel.log("cancelling cycle timer"); + $interval.cancel(cycleHandle); + } - } - else - { - $ionicLoading.show( - { - template: $translate.instant('kPTZnotConfigured'), - noBackdrop: true, - duration: 3000, - }); - } + }; - }; + //------------------------------------------------------------- + // PTZ enable/disable + //------------------------------------------------------------- - //------------------------------------------------------------- - // Pause and resume handlers - //------------------------------------------------------------- + $scope.togglePTZ = function () { + + //console.log("PTZ"); + + if ($scope.isControllable == '1') { + //console.log ("iscontrollable is true"); + $scope.showPTZ = !$scope.showPTZ; + + } else { + $ionicLoading.show({ + template: $translate.instant('kPTZnotConfigured'), + noBackdrop: true, + duration: 3000, + }); + } + + }; + + //------------------------------------------------------------- + // Pause and resume handlers + //------------------------------------------------------------- + + function onPause() { + NVRDataModel.debug("ModalCtrl: onpause called"); + $interval.cancel(intervalModalHandle); + $interval.cancel(cycleHandle); + + NVRDataModel.debug("Killing single stream..."); + NVRDataModel.killStream($scope.connKey); + // $interval.cancel(modalIntervalHandle); + + // FIXME: Do I need to setAwake(false) here? + } + + function onResume() { + if (1) return; // Do we really need this as it should go to Portal Login + NVRDataModel.debug("ModalCtrl: Modal resume called"); + if ($scope.isModalActive) { + NVRDataModel.log("ModalCtrl: Restarting Modal timer on resume"); + + $interval.cancel(intervalModalHandle); + $interval.cancel(cycleHandle); + + var ld = NVRDataModel.getLogin(); + + intervalModalHandle = $interval(function () { + loadModalNotifications(); + }.bind(this), 5000); + + if (ld.cycleMonitors) { + NVRDataModel.debug("Cycling enabled at " + ld.cycleMonitorsInterval); - function onPause() - { - NVRDataModel.debug("ModalCtrl: onpause called"); - $interval.cancel(intervalModalHandle); $interval.cancel(cycleHandle); - // $interval.cancel(modalIntervalHandle); - // FIXME: Do I need to setAwake(false) here? + cycleHandle = $interval(function () { + moveToMonitor($scope.monitorId, 1); + // console.log ("Refreshing Image..."); + }.bind(this), ld.cycleMonitorsInterval * 1000); + + } + + $rootScope.modalRand = Math.floor((Math.random() * 100000) + 1); + } - function onResume() - { - if (1) return; // Do we really need this as it should go to Portal Login - NVRDataModel.debug("ModalCtrl: Modal resume called"); - if ($scope.isModalActive) - { - NVRDataModel.log("ModalCtrl: Restarting Modal timer on resume"); + } - $interval.cancel(intervalModalHandle); - $interval.cancel(cycleHandle); + //------------------------------------------------------------- + // Queries the 1.30 API for recording state of current monitor + //------------------------------------------------------------- + function loadModalNotifications() { - var ld = NVRDataModel.getLogin(); + if (NVRDataModel.versionCompare($rootScope.apiVersion, "1.30") == -1) { - intervalModalHandle = $interval(function() - { - loadModalNotifications(); - }.bind(this), 5000); + return; + } - if (ld.cycleMonitors) - { - NVRDataModel.debug("Cycling enabled at " + ld.cycleMonitorsInterval); + if (NVRDataModel.getLogin().enableLowBandwidth) + return; - $interval.cancel(cycleHandle); + var status = [$translate.instant('kMonIdle'), + $translate.instant('kMonPreAlarm'), + $translate.instant('kMonAlarmed'), + $translate.instant('kMonAlert'), + $translate.instant('kMonRecord') + ]; + //console.log ("Inside Modal timer..."); + var apiurl = NVRDataModel.getLogin().apiurl; + var alarmurl = apiurl + "/monitors/alarm/id:" + $scope.monitorId + "/command:status.json"; + NVRDataModel.log("Invoking " + alarmurl); - cycleHandle = $interval(function() - { - moveToMonitor($scope.monitorId, 1); - // console.log ("Refreshing Image..."); - }.bind(this), ld.cycleMonitorsInterval * 1000); + $http.get(alarmurl) + .then(function (data) { + // NVRDataModel.debug ("Success in monitor alarmed status " + JSON.stringify(data)); - } + $scope.monStatus = status[parseInt(data.data.status)]; - $rootScope.modalRand = Math.floor((Math.random() * 100000) + 1); + }, + function (error) { - } + $scope.monStatus = ""; + NVRDataModel.debug("Error in monitor alarmed status "); + }); + + } + + //------------------------------------------------------------- + // Enable/Disable preset list + //------------------------------------------------------------- + $scope.togglePresets = function () { + $scope.presetOn = !$scope.presetOn; + + if ($scope.presetOn) { + $scope.controlToggle = "hide buttons"; + } else { + $scope.controlToggle = "show buttons"; } + //console.log("Changing preset to " + $scope.presetOn); - //------------------------------------------------------------- - // Queries the 1.30 API for recording state of current monitor - //------------------------------------------------------------- - function loadModalNotifications() - { + var element = angular.element(document.getElementById("presetlist")); + // bring it in + if ($scope.presetOn) { + element.removeClass("animated fadeOutUp"); + + } else { + element.removeClass("animated fadeInDown"); + element.addClass("animated fadeOutUp"); + } - if (NVRDataModel.versionCompare($rootScope.apiVersion, "1.30") == -1) - { + }; - return; - } - if (NVRDataModel.getLogin().enableLowBandwidth) - return; - - var status = [$translate.instant('kMonIdle'), - $translate.instant('kMonPreAlarm'), - $translate.instant('kMonAlarmed'), - $translate.instant('kMonAlert'), - $translate.instant('kMonRecord') - ]; - //console.log ("Inside Modal timer..."); - var apiurl = NVRDataModel.getLogin().apiurl; - var alarmurl = apiurl + "/monitors/alarm/id:" + $scope.monitorId + "/command:status.json"; - NVRDataModel.log("Invoking " + alarmurl); - - $http.get(alarmurl) - .then(function(data) - { - // NVRDataModel.debug ("Success in monitor alarmed status " + JSON.stringify(data)); - - $scope.monStatus = status[parseInt(data.data.status)]; - - }, - function(error) - { - - $scope.monStatus = ""; - NVRDataModel.debug("Error in monitor alarmed status "); - }); + $scope.saveZones = function () { + var str = ""; + for (var i = 0; i < originalZones.length; i++) { + str = str + "o:" + originalZones[i].coords + "<br/>n:" + $scope.zoneArray[i].coords + "--------------------------------------------------<br/>"; } - //------------------------------------------------------------- - // Enable/Disable preset list - //------------------------------------------------------------- + $rootScope.zmPopup = SecuredPopups.show('confirm', { + title: 'Sure', + template: str, + okText: $translate.instant('kButtonOk'), + cancelText: $translate.instant('kButtonCancel'), + }); - $scope.togglePresets = function() - { - $scope.presetOn = !$scope.presetOn; + }; - if ($scope.presetOn) - { - $scope.controlToggle = "hide buttons"; - } - else - { - $scope.controlToggle = "show buttons"; - } - //console.log("Changing preset to " + $scope.presetOn); + $scope.changeCircleSize = function () { + $scope.csize = Math.max(($scope.csize + 5) % 31, 10); - var element = angular.element(document.getElementById("presetlist")); - // bring it in - if ($scope.presetOn) - { - element.removeClass("animated fadeOutUp"); + }; - } - else - { - element.removeClass("animated fadeInDown"); - element.addClass("animated fadeOutUp"); - } + $scope.toggleZoneEdit = function () { + $scope.isZoneEdit = !$scope.isZoneEdit; - }; + $scope.connKey = (Math.floor((Math.random() * 999999) + 1)).toString(); - $scope.saveZones = function() - { - var str=""; - for (var i=0; i < originalZones.length; i++) - { - str = str + "o:"+originalZones[i].coords+"<br/>n:"+$scope.zoneArray[i].coords+"--------------------------------------------------<br/>"; - } + if ($scope.isZoneEdit) { + $ionicScrollDelegate.$getByHandle("imgscroll").zoomTo(1, true); + $scope.imageZoomable = false; + //document.getElementById("imgscroll").zooming="false"; - $rootScope.zmPopup = SecuredPopups.show('confirm', - { - title: 'Sure', - template: str, - okText: $translate.instant('kButtonOk'), - cancelText: $translate.instant('kButtonCancel'), - }); + for (var i = 0; i < $scope.circlePoints.length; i++) { + var t = document.getElementById("circle-" + i); + if (t) { + t.removeEventListener("touchstart", moveStart); + t.removeEventListener("mousedown", moveStart); + //t.removeEventListener("mousemove",moveContinue); + //t.removeEventListener("mouseup",moveStop); - }; - $scope.changeCircleSize = function() - { - $scope.csize = Math.max (($scope.csize + 5) % 31, 10); + t.addEventListener("touchstart", moveStart); + t.addEventListener("mousedown", moveStart); + //t.addEventListener("mousemove",moveContinue); + //t.addEventListener("mouseup",moveStop); - }; - $scope.toggleZoneEdit = function() - { - $scope.isZoneEdit = !$scope.isZoneEdit; - - - $scope.connKey = (Math.floor((Math.random() * 999999) + 1)).toString(); - - - if ($scope.isZoneEdit) - { - $ionicScrollDelegate.$getByHandle("imgscroll").zoomTo(1, true); - $scope.imageZoomable = false; - //document.getElementById("imgscroll").zooming="false"; - - for (var i=0; i < $scope.circlePoints.length; i++) - { - var t = document.getElementById("circle-"+i); - if (t) - { - t.removeEventListener("touchstart",moveStart); - t.removeEventListener("mousedown",moveStart); - //t.removeEventListener("mousemove",moveContinue); - //t.removeEventListener("mouseup",moveStop); - - - t.addEventListener("touchstart",moveStart); - t.addEventListener("mousedown",moveStart); - //t.addEventListener("mousemove",moveContinue); - //t.addEventListener("mouseup",moveStop); - - - //console.log ("Found circle-"+i); - } - else - { - // console.log ("did not find circle-"+i); - } - - } + //console.log ("Found circle-"+i); + } else { + // console.log ("did not find circle-"+i); } - else // get out of edit - { - $scope.imageZoomable = true; - } + } + } else // get out of edit + { - }; + $scope.imageZoomable = true; + } - $scope.toggleZone = function() - { - $scope.showZones = !$scope.showZones; - if (!$scope.showZones) - $scope.isZoneEdit = false; - }; + }; - $scope.imageLoaded = function() - { - imageLoaded(); - }; + $scope.toggleZone = function () { + $scope.showZones = !$scope.showZones; + if (!$scope.showZones) + $scope.isZoneEdit = false; + }; - $scope.checkZoom = function() - { - //var z = $ionicScrollDelegate.$getByHandle("imgscroll").getScrollPosition().zoom; - //imageLoaded(); + $scope.imageLoaded = function () { + imageLoaded(); + }; - }; + $scope.checkZoom = function () { + //var z = $ionicScrollDelegate.$getByHandle("imgscroll").getScrollPosition().zoom; + //imageLoaded(); - $scope.circleTouch = function (evt) - { - // console.log ("TOUCH"); - }; + }; - //$scope.circleOnDrag = function (evt, ndx) - function recomputePolygons (ax, ay, ndx,z) - { + $scope.circleTouch = function (evt) { + // console.log ("TOUCH"); + }; - - // we get screen X/Y - need to translate - // to SVG points - //console.log ("recompute with",ax,"&",ay); - var svg=document.getElementById('zsvg'); - var pt = svg.createSVGPoint(); - pt.x = ax; - pt.y = ay; - var svgP = pt.matrixTransform(svg.getScreenCTM().inverse()); - - $scope.circlePoints[ndx].x = Math.round(svgP.x); - $scope.circlePoints[ndx].y = Math.round(svgP.y); - - // get related polygon set - var zi = $scope.circlePoints[ndx].zoneIndex; - var newPoints=""; - for ( var i=0; i < $scope.circlePoints.length; i++) - { - if ($scope.circlePoints[i].zoneIndex == zi) - { - newPoints = newPoints + " " +$scope.circlePoints[i].x+","+$scope.circlePoints[i].y; - } - //console.log ("recomputed polygon:", newPoints); - } - // console.log ("OLD ZONE FOR:"+zi+" is "+$scope.zoneArray[zi].coords ); - //console.log ("NEW ZONE FOR:"+zi+" is "+newPoints); - $scope.zoneArray[zi].coords = newPoints; + //$scope.circleOnDrag = function (evt, ndx) + function recomputePolygons(ax, ay, ndx, z) { - //console.log ("INDEX="+ndx+" DRAG="+svgP.x+":"+svgP.y); - } + // we get screen X/Y - need to translate + // to SVG points + //console.log ("recompute with",ax,"&",ay); + var svg = document.getElementById('zsvg'); + var pt = svg.createSVGPoint(); + pt.x = ax; + pt.y = ay; + var svgP = pt.matrixTransform(svg.getScreenCTM().inverse()); + + $scope.circlePoints[ndx].x = Math.round(svgP.x); + $scope.circlePoints[ndx].y = Math.round(svgP.y); - // credit: http://stackoverflow.com/questions/41411891/most-elegant-way-to-parse-scale-and-re-string-a-string-of-number-co-ordinates?noredirect=1#41411927 - // This function scales coords of zones based on current image size - function scaleCoords(string, sx, sy) { - var f = [sx, sy]; - return string.split(' ').map(function (a) { - return a.split(',').map(function (b, i) { - return Math.round(b * f[i]); - }).join(','); - }).join(' '); + // get related polygon set + var zi = $scope.circlePoints[ndx].zoneIndex; + var newPoints = ""; + for (var i = 0; i < $scope.circlePoints.length; i++) { + if ($scope.circlePoints[i].zoneIndex == zi) { + newPoints = newPoints + " " + $scope.circlePoints[i].x + "," + $scope.circlePoints[i].y; + } + //console.log ("recomputed polygon:", newPoints); + } + // console.log ("OLD ZONE FOR:"+zi+" is "+$scope.zoneArray[zi].coords ); + //console.log ("NEW ZONE FOR:"+zi+" is "+newPoints); + $scope.zoneArray[zi].coords = newPoints; + + //console.log ("INDEX="+ndx+" DRAG="+svgP.x+":"+svgP.y); + + } + + // credit: http://stackoverflow.com/questions/41411891/most-elegant-way-to-parse-scale-and-re-string-a-string-of-number-co-ordinates?noredirect=1#41411927 + // This function scales coords of zones based on current image size + function scaleCoords(string, sx, sy) { + var f = [sx, sy]; + return string.split(' ').map(function (a) { + return a.split(',').map(function (b, i) { + return Math.round(b * f[i]); + }).join(','); + }).join(' '); + } + + function moveContinue(event) { + if (!_moveStart) { + return; } - function moveContinue(event) - { - if (!_moveStart) {return;} - - // console.log ("CONTINUE: target id="+targetID); - - - /*if(event.preventDefault) event.preventDefault(); - if (event.gesture) event.gesture.preventDefault() ; - if (event.gesture) event.gesture.stopPropagation();*/ - - var x,y; - - var z = $ionicScrollDelegate.$getByHandle("imgscroll").getScrollPosition().zoom; - // console.log ("zoom is:"+z); - - //console.log(event, this, "t"); - if (event.touches) - { - //console.log ("TOUCH"); - x = event.targetTouches[0].pageX; - y = event.targetTouches[0].pageY; - - } - else - { - //console.log ("MOUSE"); - x = event.clientX ; - y = event.clientY ; + // console.log ("CONTINUE: target id="+targetID); - } - - - // console.log ("X="+x+" Y="+y + " sl="+document.body.scrollLeft+ " sy="+document.body.scrollTop); - $timeout (function() {recomputePolygons (x,y,targetID,1);}); + /*if(event.preventDefault) event.preventDefault(); + if (event.gesture) event.gesture.preventDefault() ; + if (event.gesture) event.gesture.stopPropagation();*/ + + var x, y; + + var z = $ionicScrollDelegate.$getByHandle("imgscroll").getScrollPosition().zoom; + // console.log ("zoom is:"+z); + + //console.log(event, this, "t"); + if (event.touches) { + //console.log ("TOUCH"); + x = event.targetTouches[0].pageX; + y = event.targetTouches[0].pageY; + + } else { + //console.log ("MOUSE"); + x = event.clientX; + y = event.clientY; } - function moveStop (event) - { - _moveStart = false; - // console.log ("STOP"); + + // console.log ("X="+x+" Y="+y + " sl="+document.body.scrollLeft+ " sy="+document.body.scrollTop); + $timeout(function () { + recomputePolygons(x, y, targetID, 1); + }); + + + } + + function moveStop(event) { + _moveStart = false; + // console.log ("STOP"); + } + + function moveStart(event) { + + _moveStart = true; + targetID = event.target.id.substring(7); + // console.log ("START: target id="+targetID); + + if (event.preventDefault) event.preventDefault(); + if (event.gesture) event.gesture.preventDefault(); + if (event.gesture) event.gesture.stopPropagation(); + + var z = $ionicScrollDelegate.$getByHandle("imgscroll").getScrollPosition().zoom; + //console.log ("zoom is:"+z); + + var x, y; + // perhaps event.targetTouches[0]? + if (event.touches) { + //console.log(event.changedTouches[0], this, "t"); + x = event.touches[0].pageX; + y = event.touches[0].pageY; + + } else { + //console.log(event, this, "t"); + x = event.clientX; + y = event.clientY; + } + //console.log ("X="+x+" Y="+y + " sl="+document.body.scrollLeft+ " sy="+document.body.scrollTop); - function moveStart(event) - { - - _moveStart=true; - targetID = event.target.id.substring(7); - // console.log ("START: target id="+targetID); - - if(event.preventDefault) event.preventDefault(); - if (event.gesture) event.gesture.preventDefault() ; - if (event.gesture) event.gesture.stopPropagation(); - - var z = $ionicScrollDelegate.$getByHandle("imgscroll").getScrollPosition().zoom; - //console.log ("zoom is:"+z); - - var x,y; - // perhaps event.targetTouches[0]? - if (event.touches) - { - //console.log(event.changedTouches[0], this, "t"); - x = event.touches[0].pageX; - y = event.touches[0].pageY; + } - } - else - { - //console.log(event, this, "t"); - x = event.clientX ; - y = event.clientY ; - } - //console.log ("X="+x+" Y="+y + " sl="+document.body.scrollLeft+ " sy="+document.body.scrollTop); + // called when the live monitor image loads + // this is a good time to calculate scaled zone points + function imageLoaded() { + + var img = document.getElementById("singlemonitor"); + + //$scope.cw = img.naturalWidth; + //$scope.ch = img.naturalHeight; + + $scope.cw = img.naturalWidth; + $scope.ch = img.naturalHeight; + + //console.log ("REPORTED DIM:" + $scope.cw+ "x"+$scope.ch ); + //console.log ("ORIGINAL DIM:" + img.naturalWidth+ "x"+img.naturalHeight); + //https://server/zm/api/zones/forMonitor/7.json + // + $scope.zoneArray = []; + $scope.circlePoints = []; + + var ow = $scope.monitor.Monitor.Width; + var oh = $scope.monitor.Monitor.Height; + + // console.log ("MONITOR IS: "+JSON.stringify($scope.monitor)); + + // console.log ("ORIGINAL WH="+ow+"x"+oh); + + for (var i = 0; i < originalZones.length; i++) { + var sx = $scope.cw / ow; + var sy = $scope.ch / oh; + //$scope.zoneArray.push({ + // coords:scaleCoords(originalZones[i].coords,sx,sy), + // type:originalZones[i].type}); + $scope.zoneArray.push({ + coords: originalZones[i].coords, + type: originalZones[i].type + }); + } - - // called when the live monitor image loads - // this is a good time to calculate scaled zone points - function imageLoaded() - { - - var img =document.getElementById("singlemonitor"); - - //$scope.cw = img.naturalWidth; - //$scope.ch = img.naturalHeight; - - $scope.cw = img.naturalWidth; - $scope.ch = img.naturalHeight; - - //console.log ("REPORTED DIM:" + $scope.cw+ "x"+$scope.ch ); - //console.log ("ORIGINAL DIM:" + img.naturalWidth+ "x"+img.naturalHeight); - //https://server/zm/api/zones/forMonitor/7.json - // - $scope.zoneArray = []; - $scope.circlePoints = []; + // now create a points array for circle handles + for (i = 0; i < $scope.zoneArray.length; i++) { + /*jshint loopfunc: true */ + // console.log ("ZONE ARRAY="+$scope.zoneArray[i].coords); + $scope.zoneArray[i].coords.split(' ') + .forEach(function (itm) { + var o = itm.split(','); + $scope.circlePoints.push({ + x: o[0], + y: o[1], + zoneIndex: i + }); + + // console.log ("CIRCLE X="+o[0]+"Y="+o[1]); + }); - var ow = $scope.monitor.Monitor.Width; - var oh = $scope.monitor.Monitor.Height; - - // console.log ("MONITOR IS: "+JSON.stringify($scope.monitor)); - - // console.log ("ORIGINAL WH="+ow+"x"+oh); - - for (var i=0; i < originalZones.length; i++) - { - var sx = $scope.cw/ow; - var sy = $scope.ch/oh; - //$scope.zoneArray.push({ - // coords:scaleCoords(originalZones[i].coords,sx,sy), - // type:originalZones[i].type}); - $scope.zoneArray.push({ - coords:originalZones[i].coords, - type:originalZones[i].type}); - - - } + } - // now create a points array for circle handles - for (i=0; i < $scope.zoneArray.length; i++) - { - /*jshint loopfunc: true */ - // console.log ("ZONE ARRAY="+$scope.zoneArray[i].coords); - $scope.zoneArray[i].coords.split(' ') - .forEach( function(itm) - { - var o=itm.split(','); - $scope.circlePoints.push({x:o[0],y:o[1], zoneIndex:i}); - - // console.log ("CIRCLE X="+o[0]+"Y="+o[1]); - }); - } + } + //------------------------------------------------------------- + // this is checked to make sure we are not pulling images + // when app is in background. This is a problem with Android, + // for example + //------------------------------------------------------------- + $scope.isBackground = function () { + // console.log ("Is background called from ModalCtrl and returned " + + // NVRDataModel.isBackground()); + return NVRDataModel.isBackground(); + }; + + //------------------------------------------------------------- + // Send PTZ command to ZM + // Note: PTZ fails on desktop, don't bother about it + //------------------------------------------------------------- + + $scope.controlPTZ = function (monitorId, cmd) { + + if (cmd == "special-hide-unhide") { + hideUnhidePresets(); + return; } + //console.log ("PTZ command is"+cmd); + controlPTZ(monitorId, cmd); + }; - //------------------------------------------------------------- - // this is checked to make sure we are not pulling images - // when app is in background. This is a problem with Android, - // for example - //------------------------------------------------------------- + function hideUnhidePresets() { + //console.log ("**********HIDEUNHIDE"); + $scope.ptzButtonsShown = !$scope.ptzButtonsShown; - $scope.isBackground = function() - { - // console.log ("Is background called from ModalCtrl and returned " + - // NVRDataModel.isBackground()); - return NVRDataModel.isBackground(); - }; + if ($scope.ptzPresets.length > 0) { + dirn = $scope.ptzButtonsShown ? "up" : "down"; - //------------------------------------------------------------- - // Send PTZ command to ZM - // Note: PTZ fails on desktop, don't bother about it - //------------------------------------------------------------- + $scope.ptzPresets[0].icon = "ion-chevron-" + dirn; + } - $scope.controlPTZ = function(monitorId, cmd) - { + } - if (cmd == "special-hide-unhide") { - hideUnhidePresets(); - return; - } - //console.log ("PTZ command is"+cmd); - controlPTZ(monitorId, cmd); - }; + function controlPTZ(monitorId, cmd) { - function hideUnhidePresets() { - //console.log ("**********HIDEUNHIDE"); - $scope.ptzButtonsShown = !$scope.ptzButtonsShown; + //presetGotoX + //presetHome + //curl -X POST "http://server.com/zm/index.php?view=request" -d + //"request=control&user=admin&passwd=xx&id=4&control=moveConLeft" - if ($scope.ptzPresets.length > 0) { - dirn = $scope.ptzButtonsShown ? "up":"down"; - - $scope.ptzPresets[0].icon = "ion-chevron-"+dirn; - } + if ($scope.ptzMoveCommand == "undefined") { + $ionicLoading.show({ + template: $translate.instant('kPTZNotReady'), + noBackdrop: true, + duration: 2000, + }); + return; + } + var ptzData = ""; + if (cmd.lastIndexOf("preset", 0) === 0) { + NVRDataModel.debug("PTZ command is a preset, so skipping xge/lge"); + ptzData = { + view: "request", + request: "control", + id: monitorId, + control: cmd, + // xge: "30", //wtf + // yge: "30", //wtf + }; + + } else { + + ptzData = { + view: "request", + request: "control", + id: monitorId, + control: cmd, + xge: "30", //wtf + yge: "30", //wtf + }; } - function controlPTZ(monitorId, cmd) - { + //console.log("Command value " + cmd + " with MID=" + monitorId); + //console.log("PTZDATA is " + JSON.stringify(ptzData)); + $ionicLoading.hide(); + $ionicLoading.show({ + template: $translate.instant('kPleaseWait') + "...", + noBackdrop: true, + duration: zm.loadingTimeout, + }); - //presetGotoX - //presetHome - //curl -X POST "http://server.com/zm/index.php?view=request" -d - //"request=control&user=admin&passwd=xx&id=4&control=moveConLeft" - - if ($scope.ptzMoveCommand=="undefined") - { - $ionicLoading.show( - { - template: $translate.instant('kPTZNotReady'), - noBackdrop: true, - duration: 2000, - }); - return; - } + var loginData = NVRDataModel.getLogin(); + $ionicLoading.hide(); + $ionicLoading.show({ + template: $translate.instant('kSendingPTZ') + "...", + noBackdrop: true, + duration: zm.loadingTimeout, + }); - var ptzData = ""; - if (cmd.lastIndexOf("preset", 0) === 0) - { - NVRDataModel.debug("PTZ command is a preset, so skipping xge/lge"); - ptzData = { - view: "request", - request: "control", - id: monitorId, - control: cmd, - // xge: "30", //wtf - // yge: "30", //wtf - }; + var req = $http({ + method: 'POST', + /*timeout: 15000,*/ + url: loginData.url + '/index.php', + 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 foo = str.join("&"); + //console.log("****RETURNING " + foo); + return foo; + }, + + data: ptzData - } - else - { - - ptzData = { - view: "request", - request: "control", - id: monitorId, - control: cmd, - xge: "30", //wtf - yge: "30", //wtf - }; - } + }); - //console.log("Command value " + cmd + " with MID=" + monitorId); - //console.log("PTZDATA is " + JSON.stringify(ptzData)); - $ionicLoading.hide(); - $ionicLoading.show( - { - template: $translate.instant('kPleaseWait') + "...", - noBackdrop: true, - duration: zm.loadingTimeout, - }); + req.success(function (resp) { + //console.log("SUCCESS: " + JSON.stringify(resp)); + $ionicLoading.hide(); - var loginData = NVRDataModel.getLogin(); - $ionicLoading.hide(); - $ionicLoading.show( - { - template: $translate.instant('kSendingPTZ') + "...", - noBackdrop: true, - duration: zm.loadingTimeout, - }); + }); - var req = $http( - { - method: 'POST', - /*timeout: 15000,*/ - url: loginData.url + '/index.php', - 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 foo = str.join("&"); - //console.log("****RETURNING " + foo); - return foo; - }, - - data: ptzData + req.error(function (resp) { + $ionicLoading.hide(); + //console.log("ERROR: " + JSON.stringify(resp)); + NVRDataModel.log("Error sending PTZ:" + JSON.stringify(resp), "error"); + }); + } - }); + $scope.getZoomLevel = function () { + //console.log("ON RELEASE"); + var zl = $ionicScrollDelegate.$getByHandle("imgscroll").getScrollPosition(); + //console.log(JSON.stringify(zl)); + }; - req.success(function(resp) - { - //console.log("SUCCESS: " + JSON.stringify(resp)); - $ionicLoading.hide(); + $scope.onTap = function (m, d) { - }); + moveToMonitor(m, d); + }; - req.error(function(resp) - { - $ionicLoading.hide(); - //console.log("ERROR: " + JSON.stringify(resp)); - NVRDataModel.log("Error sending PTZ:" + JSON.stringify(resp), "error"); - }); + $scope.onSwipe = function (m, d) { + if ($scope.isZoneEdit) { + NVRDataModel.log("swipe disabled as you are in edit mode"); + return; } + var ld = NVRDataModel.getLogin(); + if (!ld.canSwipeMonitors) return; - $scope.getZoomLevel = function() - { - //console.log("ON RELEASE"); - var zl = $ionicScrollDelegate.$getByHandle("imgscroll").getScrollPosition(); - //console.log(JSON.stringify(zl)); - }; + if ($ionicScrollDelegate.$getByHandle("imgscroll").getScrollPosition().zoom != 1) { + //console.log("Image is zoomed in - not honoring swipe"); + return; + } + $scope.monStatus = ""; + moveToMonitor(m, d); - $scope.onTap = function(m, d) - { + }; - moveToMonitor(m, d); - }; + function moveToMonitor(m, d) { - $scope.onSwipe = function(m, d) - { - if ($scope.isZoneEdit) - { - NVRDataModel.log ("swipe disabled as you are in edit mode"); - return; + if ($scope.isZoneEdit) { + NVRDataModel.log("Not cycling, as you are editing zones"); + } + var curstate = $ionicHistory.currentStateName(); + var found = 0; + var mid; + mid = NVRDataModel.getNextMonitor(m, d); + + $scope.showPTZ = false; + + // FIXME: clean this up - in a situation where + // no monitors are enabled, will it loop for ever? + do { + mid = NVRDataModel.getNextMonitor(m, d); + m = mid; + //console.log("Next Monitor is " + m); + + found = 0; + for (var i = 0; i < $scope.monitors.length; i++) { + if ($scope.monitors[i].Monitor.Id == mid && + // if you came from monitors, then ignore noshow + ($scope.monitors[i].Monitor.listDisplay != 'noshow' || curstate == "monitors") && + $scope.monitors[i].Monitor.Function != 'None' && + $scope.monitors[i].Monitor.Enabled != '0') { + found = 1; + //console.log(mid + "is part of the monitor list"); + NVRDataModel.debug("ModalCtrl: swipe detected, moving to " + mid); + break; + } else { + NVRDataModel.debug("skipping " + $scope.monitors[i].Monitor.Id + + " listDisplay=" + $scope.monitors[i].Monitor.listDisplay + + " Function=" + $scope.monitors[i].Monitor.Function + + " Enabled=" + $scope.monitors[i].Monitor.Enabled); } - var ld = NVRDataModel.getLogin(); - if (!ld.canSwipeMonitors) return; + } - if ($ionicScrollDelegate.$getByHandle("imgscroll").getScrollPosition().zoom != 1) - { - //console.log("Image is zoomed in - not honoring swipe"); - return; - } - $scope.monStatus = ""; - moveToMonitor(m, d); + } + while (found != 1); + + var slidein; + var slideout; + var dirn = d; + if (dirn == 1) { + slideout = "animated slideOutLeft"; + slidein = "animated slideInRight"; + } else { + slideout = "animated slideOutRight"; + slidein = "animated slideInLeft"; + } - }; + var element = angular.element(document.getElementById("monitorimage")); + element.addClass(slideout) + .one('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend', outWithOld); - function moveToMonitor(m, d) - { + function outWithOld() { - if ($scope.isZoneEdit) - { - NVRDataModel.log ("Not cycling, as you are editing zones"); - } - var curstate = $ionicHistory.currentStateName(); - var found = 0; - var mid; - mid = NVRDataModel.getNextMonitor(m, d); - - $scope.showPTZ = false; - - // FIXME: clean this up - in a situation where - // no monitors are enabled, will it loop for ever? - do { - mid = NVRDataModel.getNextMonitor(m, d); - m = mid; - //console.log("Next Monitor is " + m); - - found = 0; - for (var i = 0; i < $scope.monitors.length; i++) - { - if ($scope.monitors[i].Monitor.Id == mid && - // if you came from monitors, then ignore noshow - ($scope.monitors[i].Monitor.listDisplay != 'noshow' || curstate == "monitors") && - $scope.monitors[i].Monitor.Function != 'None' && - $scope.monitors[i].Monitor.Enabled != '0') - { - found = 1; - //console.log(mid + "is part of the monitor list"); - NVRDataModel.debug("ModalCtrl: swipe detected, moving to " + mid); - break; - } - else - { - NVRDataModel.debug("skipping " + $scope.monitors[i].Monitor.Id + - " listDisplay=" + $scope.monitors[i].Monitor.listDisplay + - " Function=" + $scope.monitors[i].Monitor.Function + - " Enabled=" + $scope.monitors[i].Monitor.Enabled); - } - } + NVRDataModel.log("ModalCtrl:Stopping network pull..."); + NVRDataModel.stopNetwork("MonitorModal-outwithOld"); + $scope.rand = Math.floor((Math.random() * 100000) + 1); + $scope.animationInProgress = true; - } - while (found != 1); - - var slidein; - var slideout; - var dirn = d; - if (dirn == 1) - { - slideout = "animated slideOutLeft"; - slidein = "animated slideInRight"; - } - else - { - slideout = "animated slideOutRight"; - slidein = "animated slideInLeft"; - } + $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.zoneArray = []; + $scope.circlePoints = []; + getZones(); + configurePTZ($scope.monitorId); + }, 200); + } - var element = angular.element(document.getElementById("monitorimage")); - element.addClass(slideout) - .one('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend', outWithOld); - - function outWithOld() - { - - NVRDataModel.log("ModalCtrl:Stopping network pull..."); - NVRDataModel.stopNetwork("MonitorModal-outwithOld"); - $scope.rand = Math.floor((Math.random() * 100000) + 1); - $scope.animationInProgress = true; - - $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.zoneArray=[]; - $scope.circlePoints=[]; - getZones(); - configurePTZ($scope.monitorId); - }, 200); - } + function inWithNew() { + + element.removeClass(slidein); + $scope.animationInProgress = false; + + NVRDataModel.log("New image loaded in"); + var ld = NVRDataModel.getLogin(); + carouselUtils.setStop(false); + if (ld.useNphZms == true) { + $scope.currentStreamMode = 'single'; + NVRDataModel.log("Setting timer to play nph-zms mode"); + // first 5 seconds, load a snapshot, then switch to real FPS display + // this is to avoid initial image load delay + // FIXME: 5 seconds fair? + $timeout.cancel(nphTimer); + nphTimer = $timeout(function () { + $scope.currentStreamMode = 'jpeg'; + NVRDataModel.log("Switching playback via nphzms"); + }, zm.nphSwitchTimer); + } - function inWithNew() - { - - element.removeClass(slidein); - $scope.animationInProgress = false; - - NVRDataModel.log("New image loaded in"); - var ld = NVRDataModel.getLogin(); - carouselUtils.setStop(false); - if (ld.useNphZms == true) - { - $scope.currentStreamMode = 'single'; - NVRDataModel.log("Setting timer to play nph-zms mode"); - // first 5 seconds, load a snapshot, then switch to real FPS display - // this is to avoid initial image load delay - // FIXME: 5 seconds fair? - $timeout.cancel(nphTimer); - nphTimer = $timeout(function() - { - $scope.currentStreamMode = 'jpeg'; - NVRDataModel.log("Switching playback via nphzms"); - }, zm.nphSwitchTimer); - } + } - } + $ionicLoading.hide(); - $ionicLoading.hide(); + } - } + //----------------------------------------------------------------------- + // Sucess/Error handlers for saving a snapshot of the + // monitor image to phone storage + //----------------------------------------------------------------------- + + 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); + //console.log("***ERROR"); + } - //----------------------------------------------------------------------- - // Sucess/Error handlers for saving a snapshot of the - // monitor image to phone storage - //----------------------------------------------------------------------- + //------------------------------------------------------------- + // Turns on or off an alarm forcibly (mode true = on, false = off) + //------------------------------------------------------------- + $scope.enableAlarm = function (mid, mode) { - function SaveSuccess() + if (mode) // trigger alarm { - $ionicLoading.show( - { - template: $translate.instant('kDone'), - noBackdrop: true, - duration: 1000 - }); - NVRDataModel.debug("ModalCtrl:Photo saved successfuly"); + $rootScope.zmPopup = SecuredPopups.show('show', { + title: 'Confirm', + template: $translate.instant('kForceAlarmConfirm') + $scope.monitorName + "?", + buttons: [{ + text: $translate.instant('kButtonYes'), + onTap: function (e) { + enableAlarm(mid, mode); + } + }, + { + text: $translate.instant('kButtonNo'), + onTap: function (e) { + return; + } + } + ] + + }); + } else + enableAlarm(mid, mode); + + function enableAlarm(mid, mode) { + var apiurl = NVRDataModel.getLogin().apiurl; + var c = mode ? "on" : "off"; + var alarmurl = apiurl + "/monitors/alarm/id:" + mid + "/command:" + c + ".json"; + NVRDataModel.log("Invoking " + alarmurl); + + var status = mode ? $translate.instant('kForcingAlarm') : $translate.instant('kCancellingAlarm'); + $ionicLoading.show({ + template: status, + noBackdrop: true, + duration: zm.largeHttpTimeout, + }); + + $http.get(alarmurl) + .then(function (data) { + $ionicLoading.show({ + template: $translate.instant('kSuccess'), + noBackdrop: true, + duration: 2000, + }); + }, + function (error) { + + $ionicLoading.show({ + template: $translate.instant('kAlarmAPIError'), + noBackdrop: true, + duration: 3000, + }); + NVRDataModel.debug("Error in enableAlarm " + JSON.stringify(error)); + }); } - function SaveError(e) - { - $ionicLoading.show( - { - template: $translate.instant('kErrorSave'), - noBackdrop: true, - duration: 2000 - }); - NVRDataModel.log("Error saving image: " + e); - //console.log("***ERROR"); + }; + + //----------------------------------------------------------------------- + // color for monitor state + //----------------------------------------------------------------------- + + $scope.stateColor = function () { + var status = [$translate.instant('kMonIdle'), + $translate.instant('kMonPreAlarm'), + $translate.instant('kMonAlarmed'), + $translate.instant('kMonAlert'), + $translate.instant('kMonRecord') + ]; + //console.log ("***MONSTATUS**"+$scope.monStatus+"**"); + var color = ""; + switch ($scope.monStatus) { + case "": + color = "background-color:none"; + break; + case status[0]: + color = "background-color:#4B77BE"; + break; + case status[1]: + color = "background-color:#e67e22"; + break; + case status[2]: + color = "background-color:#D91E18"; + break; + case status[3]: + color = "background-color:#e67e22"; + break; + case status[4]: + color = "background-color:#26A65B"; + break; } - //------------------------------------------------------------- - // Turns on or off an alarm forcibly (mode true = on, false = off) - //------------------------------------------------------------- - $scope.enableAlarm = function(mid, mode) - { + return "padding-left:4px;padding-right:4px;" + color; + }; - if (mode) // trigger alarm - { - $rootScope.zmPopup = SecuredPopups.show('show', - { - title: 'Confirm', - template: $translate.instant('kForceAlarmConfirm') + $scope.monitorName + "?", - buttons: [ - { - text: $translate.instant('kButtonYes'), - onTap: function(e) - { - enableAlarm(mid, mode); - } - }, - { - text: $translate.instant('kButtonNo'), - onTap: function(e) - { - return; - } - }] + //----------------------------------------------------------------------- + // Saves a snapshot of the monitor image to phone storage + //----------------------------------------------------------------------- - }); - } - else - enableAlarm(mid, mode); - - function enableAlarm(mid, mode) - { - var apiurl = NVRDataModel.getLogin().apiurl; - var c = mode ? "on" : "off"; - var alarmurl = apiurl + "/monitors/alarm/id:" + mid + "/command:" + c + ".json"; - NVRDataModel.log("Invoking " + alarmurl); - - var status = mode ? $translate.instant('kForcingAlarm') : $translate.instant('kCancellingAlarm'); - $ionicLoading.show( - { - template: status, - noBackdrop: true, - duration: zm.largeHttpTimeout, - }); + $scope.saveImageToPhoneWithPerms = function (mid) { + if ($rootScope.platformOS != 'android') { + saveImageToPhone(mid); + return; + } - $http.get(alarmurl) - .then(function(data) - { - $ionicLoading.show( - { - template: $translate.instant('kSuccess'), - noBackdrop: true, - duration: 2000, - }); - }, - function(error) - { - - $ionicLoading.show( - { - template: $translate.instant('kAlarmAPIError'), - noBackdrop: true, - duration: 3000, - }); - NVRDataModel.debug("Error in enableAlarm " + JSON.stringify(error)); - }); - } + NVRDataModel.debug("ModalCtrl: Permission checking for write"); + var permissions = cordova.plugins.permissions; + permissions.hasPermission(permissions.WRITE_EXTERNAL_STORAGE, checkPermissionCallback, null); - }; + function checkPermissionCallback(status) { + if (!status.hasPermission) { + SaveError("No permission to write to external storage"); + } + permissions.requestPermission(permissions.WRITE_EXTERNAL_STORAGE, succ, err); + } - //----------------------------------------------------------------------- - // color for monitor state - //----------------------------------------------------------------------- + function succ(s) { + saveImageToPhone(mid); + } - $scope.stateColor = function() - { - var status = [$translate.instant('kMonIdle'), - $translate.instant('kMonPreAlarm'), - $translate.instant('kMonAlarmed'), - $translate.instant('kMonAlert'), - $translate.instant('kMonRecord') - ]; - //console.log ("***MONSTATUS**"+$scope.monStatus+"**"); - var color = ""; - switch ($scope.monStatus) - { - case "": - color = "background-color:none"; - break; - case status[0]: - color = "background-color:#4B77BE"; - break; - case status[1]: - color = "background-color:#e67e22"; - break; - case status[2]: - color = "background-color:#D91E18"; - break; - case status[3]: - color = "background-color:#e67e22"; - break; - case status[4]: - color = "background-color:#26A65B"; - break; + function err(e) { + SaveError("Error in requestPermission"); + } + }; + + function saveImageToPhone(mid) { + $ionicLoading.show({ + template: $translate.instant('kSavingSnapshot') + '...', + noBackdrop: true, + duration: zm.httpTimeout + }); + + NVRDataModel.debug("ModalCtrl: SaveImageToPhone called"); + var canvas, context, imageDataUrl, imageData; + var loginData = NVRDataModel.getLogin(); + var url = loginData.streamingurl + + '/zms?mode=single&monitor=' + mid + + $rootScope.authSession; + NVRDataModel.log("SavetoPhone:Trying to save image from " + url); + + var img = new Image(); + img.onload = function () { + // console.log("********* ONLOAD"); + canvas = document.createElement('canvas'); + canvas.width = img.width; + canvas.height = img.height; + context = canvas.getContext('2d'); + context.drawImage(img, 0, 0); + + imageDataUrl = canvas.toDataURL('image/jpeg', 1.0); + imageData = imageDataUrl.replace(/data:image\/jpeg;base64,/, ''); + + if ($rootScope.platformOS != "desktop") { + try { + + cordova.exec( + SaveSuccess, + SaveError, + 'Canvas2ImagePlugin', + 'saveImageDataToLibrary', [imageData] + ); + } catch (e) { + + SaveError(e.message); } + } else { + + var fname = $scope.monitorName + "-" + + moment().format('MMM-DD-YY_HH-mm-ss') + ".png"; + canvas.toBlob(function (blob) { + saveAs(blob, fname); + SaveSuccess(); - return "padding-left:4px;padding-right:4px;" + color; + }); + } }; + try { + img.src = url; + // console.log ("SAVING IMAGE SOURCE"); + } catch (e) { + SaveError(e.message); - //----------------------------------------------------------------------- - // Saves a snapshot of the monitor image to phone storage - //----------------------------------------------------------------------- + } + } - $scope.saveImageToPhoneWithPerms = function(mid) - { - if ($rootScope.platformOS != 'android') - { - saveImageToPhone(mid); - return; - } + //------------------------------------------------------------- + //reloaads mon - do we need it? + //------------------------------------------------------------- - NVRDataModel.debug("ModalCtrl: Permission checking for write"); - var permissions = cordova.plugins.permissions; - permissions.hasPermission(permissions.WRITE_EXTERNAL_STORAGE, checkPermissionCallback, null); + $scope.reloadView = function () { + NVRDataModel.log("Reloading view for modal view, recomputing rand"); + $rootScope.modalRand = Math.floor((Math.random() * 100000) + 1); + $scope.isModalActive = true; + }; - function checkPermissionCallback(status) - { - if (!status.hasPermission) - { - SaveError("No permission to write to external storage"); - } - permissions.requestPermission(permissions.WRITE_EXTERNAL_STORAGE, succ, err); - } + $scope.scaleImage = function () { - function succ(s) - { - saveImageToPhone(mid); - } + $scope.imageFit = !$scope.imageFit; + if ($scope.imageFit) + $scope.aspectFit = "xMidYMid meet"; + else + $scope.aspectFit = "xMidYMid slice"; - function err(e) - { - SaveError("Error in requestPermission"); - } - }; + // console.log("Switching image style to " + $scope.imageFit); + }; - function saveImageToPhone(mid) - { - $ionicLoading.show( - { - template: $translate.instant('kSavingSnapshot') + '...', - noBackdrop: true, - duration: zm.httpTimeout - }); + $scope.$on('$ionicView.enter', function () { - NVRDataModel.debug("ModalCtrl: SaveImageToPhone called"); - var canvas, context, imageDataUrl, imageData; - var loginData = NVRDataModel.getLogin(); - var url = loginData.streamingurl + - '/zms?mode=single&monitor=' + mid + - $rootScope.authSession; - NVRDataModel.log("SavetoPhone:Trying to save image from " + url); - - var img = new Image(); - img.onload = function() - { - // console.log("********* ONLOAD"); - canvas = document.createElement('canvas'); - canvas.width = img.width; - canvas.height = img.height; - context = canvas.getContext('2d'); - context.drawImage(img, 0, 0); - - imageDataUrl = canvas.toDataURL('image/jpeg', 1.0); - imageData = imageDataUrl.replace(/data:image\/jpeg;base64,/, ''); - - if ($rootScope.platformOS != "desktop") - { - try - { - - cordova.exec( - SaveSuccess, - SaveError, - 'Canvas2ImagePlugin', - 'saveImageDataToLibrary', [imageData] - ); - } - catch (e) - { + //https://server/zm/api/zones/forMonitor/X.json - SaveError(e.message); - } - } - else - { + }); - var fname = $scope.monitorName + "-" + - moment().format('MMM-DD-YY_HH-mm-ss') + ".png"; - canvas.toBlob(function(blob) - { - saveAs(blob, fname); - SaveSuccess(); + $scope.$on('$ionicView.leave', function () { + // console.log("**MODAL: Stopping modal timer"); + $scope.isModalActive = false; + $interval.cancel(intervalModalHandle); + $interval.cancel(cycleHandle); + }); - }); - } - }; - try - { - img.src = url; - // console.log ("SAVING IMAGE SOURCE"); - } - catch (e) - { - SaveError(e.message); + $scope.$on('$ionicView.beforeLeave', function () { - } + NVRDataModel.log("Nullifying the streams..."); + + var element = document.getElementById("singlemonitor"); + if (element) { + NVRDataModel.debug("Nullifying " + element.src); + element.src = ""; } - //------------------------------------------------------------- - //reloaads mon - do we need it? - //------------------------------------------------------------- + }); - $scope.reloadView = function() - { - NVRDataModel.log("Reloading view for modal view, recomputing rand"); - $rootScope.modalRand = Math.floor((Math.random() * 100000) + 1); - $scope.isModalActive = true; - }; + $scope.$on('$ionicView.unloaded', function () { + $scope.isModalActive = false; - $scope.scaleImage = function() - { + $interval.cancel(intervalModalHandle); + $interval.cance(cycleHandle); - $scope.imageFit = !$scope.imageFit; - if ($scope.imageFit) - $scope.aspectFit="xMidYMid meet"; - else - $scope.aspectFit = "xMidYMid slice"; + }); - // console.log("Switching image style to " + $scope.imageFit); - }; + $scope.$on('modal.removed', function () { - $scope.$on('$ionicView.enter', function() - { + $scope.isModalActive = false; + NVRDataModel.debug("Single monitor exited, killing stream"); + NVRDataModel.killStream($scope.connKey); - //https://server/zm/api/zones/forMonitor/X.json - }); - $scope.$on('$ionicView.leave', function() - { - // console.log("**MODAL: Stopping modal timer"); - $scope.isModalActive = false; - $interval.cancel(intervalModalHandle); - $interval.cancel(cycleHandle); - }); + //console.log("**MODAL REMOVED: Stopping modal timer"); + $interval.cancel(intervalModalHandle); + $interval.cancel(cycleHandle); - $scope.$on('$ionicView.beforeLeave', function() - { + // NVRDataModel.debug("Modal removed - killing connkey"); + // controlStream(17, "", $scope.connKey, -1); - NVRDataModel.log("Nullifying the streams..."); + // Execute action + }); - var element = document.getElementById("singlemonitor"); - if (element) - { - NVRDataModel.debug("Nullifying " + element.src); - element.src = ""; - } + //------------------------------------------------------------- + // called to kill connkey, not sure if we really need it + // I think we are calling window.stop() which is a hammer + // anyway + //------------------------------------------------------------- + function controlStream(cmd, disp, connkey, ndx) { + // console.log("Command value " + cmd); + + if (disp) { + $ionicLoading.hide(); + $ionicLoading.show({ + template: $translate.instant('kPleaseWait') + '...', + noBackdrop: true, + duration: zm.loadingTimeout, + }); + } + var loginData = NVRDataModel.getLogin(); + + /* + var CMD_NONE = 0; + var CMD_PAUSE = 1; + var CMD_PLAY = 2; + var CMD_STOP = 3; + var CMD_FASTFWD = 4; + var CMD_SLOWFWD = 5; + var CMD_SLOWREV = 6; + var CMD_FASTREV = 7; + var CMD_ZOOMIN = 8; + var CMD_ZOOMOUT = 9; + var CMD_PAN = 10; + var CMD_SCALE = 11; + var CMD_PREV = 12; + var CMD_NEXT = 13; + var CMD_SEEK = 14; + var CMD_QUIT = 17; + var CMD_QUERY = 99; + */ + + var myauthtoken = $rootScope.authSession.replace("&auth=", ""); + //&auth= + var req = $http({ + method: 'POST', + /*timeout: 15000,*/ + url: loginData.url + '/index.php', + 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); + return foo; + }, + + data: { + view: "request", + request: "stream", + connkey: connkey, + command: cmd, + auth: myauthtoken, + + } }); + req.success(function (resp) { - $scope.$on('$ionicView.unloaded', function() - { - $scope.isModalActive = false; + if (resp.result == "Ok" && ndx != -1) { + var ld = NVRDataModel.getLogin(); + var apiurl = ld.apiurl + "/events/" + resp.status.event + ".json"; + //console.log ("API " + apiurl); + $http.get(apiurl) + .success(function (data) { + if ($scope.MontageMonitors[ndx].eventUrlTime != data.event.Event.StartTime) { + + var element = angular.element(document.getElementById($scope.MontageMonitors[ndx].Monitor.Id + "-timeline")); + element.removeClass('animated slideInRight'); + element.addClass('animated slideOutRight'); + $timeout(function () { + element.removeClass('animated slideOutRight'); + element.addClass('animated slideInRight'); + $scope.MontageMonitors[ndx].eventUrlTime = data.event.Event.StartTime; + }, 300); - $interval.cancel(intervalModalHandle); - $interval.cance(cycleHandle); + } - }); + }) + .error(function (data) { + $scope.MontageMonitors[ndx].eventUrlTime = "-"; + }); - $scope.$on('modal.removed', function() - { - $scope.isModalActive = false; - //console.log("**MODAL REMOVED: Stopping modal timer"); - $interval.cancel(intervalModalHandle); - $interval.cancel(cycleHandle); + } - NVRDataModel.debug("Modal removed - killing connkey"); - controlStream(17, "", $scope.connKey, -1); + }); - // Execute action + req.error(function (resp) { + //console.log("ERROR: " + JSON.stringify(resp)); + NVRDataModel.log("Error sending event command " + JSON.stringify(resp), "error"); }); + } - //------------------------------------------------------------- - // called to kill connkey, not sure if we really need it - // I think we are calling window.stop() which is a hammer - // anyway - //------------------------------------------------------------- + $scope.toggleListMenu = function () { - function controlStream(cmd, disp, connkey, ndx) - { - // console.log("Command value " + cmd); - - if (disp) - { - $ionicLoading.hide(); - $ionicLoading.show( - { - template: $translate.instant('kPleaseWait') + '...', - noBackdrop: true, - duration: zm.loadingTimeout, - }); - } - var loginData = NVRDataModel.getLogin(); - - /* - var CMD_NONE = 0; - var CMD_PAUSE = 1; - var CMD_PLAY = 2; - var CMD_STOP = 3; - var CMD_FASTFWD = 4; - var CMD_SLOWFWD = 5; - var CMD_SLOWREV = 6; - var CMD_FASTREV = 7; - var CMD_ZOOMIN = 8; - var CMD_ZOOMOUT = 9; - var CMD_PAN = 10; - var CMD_SCALE = 11; - var CMD_PREV = 12; - var CMD_NEXT = 13; - var CMD_SEEK = 14; - var CMD_QUIT = 17; - var CMD_QUERY = 99; - */ - - var myauthtoken = $rootScope.authSession.replace("&auth=", ""); - //&auth= - var req = $http( - { - method: 'POST', - /*timeout: 15000,*/ - url: loginData.url + '/index.php', - 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); - return foo; - }, - - data: - { - view: "request", - request: "stream", - connkey: connkey, - command: cmd, - auth: myauthtoken, - } - }); - req.success(function(resp) - { - - if (resp.result == "Ok" && ndx != -1) - { - var ld = NVRDataModel.getLogin(); - var apiurl = ld.apiurl + "/events/" + resp.status.event + ".json"; - //console.log ("API " + apiurl); - $http.get(apiurl) - .success(function(data) - { - if ($scope.MontageMonitors[ndx].eventUrlTime != data.event.Event.StartTime) - { - - var element = angular.element(document.getElementById($scope.MontageMonitors[ndx].Monitor.Id + "-timeline")); - element.removeClass('animated slideInRight'); - element.addClass('animated slideOutRight'); - $timeout(function() - { - element.removeClass('animated slideOutRight'); - element.addClass('animated slideInRight'); - $scope.MontageMonitors[ndx].eventUrlTime = data.event.Event.StartTime; - }, 300); - - } - - }) - .error(function(data) - { - $scope.MontageMonitors[ndx].eventUrlTime = "-"; - }); + $scope.isToggleListMenu = !$scope.isToggleListMenu; + //console.log ("isToggleListMenu:"+$scope.isToggleListMenu); + }; - } + //------------------------------------------------------------- + // Zoom in and out via +- for desktops + //------------------------------------------------------------- + $scope.zoomImage = function (val) { - }); + if ($scope.isZoneEdit) { + $ionicLoading.show({ + //template: $translate.instant('kError'), + template: 'zoom disabled in zone edit mode', + noBackdrop: true, + duration: 2000 + }); - req.error(function(resp) - { - //console.log("ERROR: " + JSON.stringify(resp)); - NVRDataModel.log("Error sending event command " + JSON.stringify(resp), "error"); - }); + return; + } + var zl = parseInt($ionicScrollDelegate.$getByHandle("imgscroll").getScrollPosition().zoom); + if (zl == 1 && val == -1) { + NVRDataModel.debug("Already zoomed out max"); + return; } - $scope.toggleListMenu = function() - { + zl += val; + NVRDataModel.debug("Zoom level is " + zl); + $ionicScrollDelegate.$getByHandle("imgscroll").zoomTo(zl, true); + + }; + + //------------------------------------------------------------- + // Retrieves PTZ state for each monitor + //------------------------------------------------------------- + // make sure following are correct: + // $scope.isControllable + // $scope.controlid + // + function configurePTZ(mid) { + $scope.presetAndControl = $translate.instant('kMore'); + $scope.ptzWakeCommand = ""; + $scope.ptzSleepCommand = ""; + $scope.ptzResetCommand = ""; + + $scope.ptzMoveCommand = "undefined"; + $scope.ptzStopCommand = ""; + + $scope.zoomInCommand = ""; + $scope.zoomOutCommand = ""; + $scope.zoomStopCommand = "zoomStop"; + $scope.canZoom = false; + + $scope.presetOn = true; + $scope.controlToggle = "hide buttons"; + + NVRDataModel.debug("configurePTZ: called with mid=" + mid); + var ld = NVRDataModel.getLogin(); + var url = ld.apiurl + "/monitors/" + mid + ".json"; + $http.get(url) + .success(function (data) { + $scope.isControllable = data.monitor.Monitor.Controllable; + + // *** Only for testing - comment out // + //$scope.isControllable = '1'; + // for testing only + // $scope.isControllable = 1; + $scope.controlid = data.monitor.Monitor.ControlId; + if ($scope.isControllable == '1') { + + var apiurl = NVRDataModel.getLogin().apiurl; + var myurl = apiurl + "/controls/" + $scope.controlid + ".json"; + NVRDataModel.debug("configurePTZ : getting controllable data " + myurl); + + $http.get(myurl) + .success(function (data) { + + // *** Only for testing - comment out - start// + /*data.Control.Control.CanSleep = '1'; + data.Control.Control.CanWake = '1'; + data.Control.Control.CanReset = '1'; + data.Control.Control.CanZoom = '1'; + data.control.Control.HasPresets = '1'; + data.control.Control.HasHomePreset = '1';*/ + // *** Only for testing - comment out - end // + + + //data.control.Control.HasPresets = '1'; + //data.control.Control.HasHomePreset = '1' + + + $scope.ptzMoveCommand = "move"; // start with as move; + $scope.ptzStopCommand = ""; + + // console.log ("GOT CONTROL "+JSON.stringify(data.control.Control)); + + if (data.control.Control.CanZoom == '1') { + $scope.canZoom = true; + if (data.control.Control.CanZoomCon == '1') { + $scope.zoomInCommand = "zoomConTele"; + $scope.zoomOutCommand = "zoomConWide"; + + } else if (data.control.Control.CanZoomRel == '1') { + $scope.zoomInCommand = "zoomRelTele"; + $scope.zoomOutCommand = "zoomRelWide"; + } else if (data.control.Control.CanZoomAbs == '1') { + $scope.zoomInCommand = "zoomRelAbs"; + $scope.zoomOutCommand = "zoomRelAbs"; + } + } - - $scope.isToggleListMenu = !$scope.isToggleListMenu; - //console.log ("isToggleListMenu:"+$scope.isToggleListMenu); - }; + NVRDataModel.debug("configurePTZ: control data returned " + JSON.stringify(data)); - //------------------------------------------------------------- - // Zoom in and out via +- for desktops - //------------------------------------------------------------- - $scope.zoomImage = function(val) - { - if ($scope.isZoneEdit) - { - $ionicLoading.show( - { - //template: $translate.instant('kError'), - template: 'zoom disabled in zone edit mode', - noBackdrop: true, - duration: 2000 - }); + if (data.control.Control.CanMoveMap == '1') { - return; - } - var zl = parseInt($ionicScrollDelegate.$getByHandle("imgscroll").getScrollPosition().zoom); - if (zl == 1 && val == -1) - { - NVRDataModel.debug("Already zoomed out max"); - return; - } + //seems moveMap uses Up/Down/Left/Right, + // so no prefix + $scope.ptzMoveCommand = ""; + $scope.ptzStopCommand = "moveStop"; + // console.log ("MoveAbs set"); + } - zl += val; - NVRDataModel.debug("Zoom level is " + zl); - $ionicScrollDelegate.$getByHandle("imgscroll").zoomTo(zl, true); + if (data.control.Control.CanMoveAbs == '1') { - }; + $scope.ptzMoveCommand = "moveAbs"; + $scope.ptzStopCommand = "moveStop"; + // console.log ("MoveAbs set"); + } - //------------------------------------------------------------- - // Retrieves PTZ state for each monitor - //------------------------------------------------------------- - // make sure following are correct: - // $scope.isControllable - // $scope.controlid - // - function configurePTZ(mid) - { - $scope.presetAndControl = $translate.instant('kMore'); - $scope.ptzWakeCommand = ""; - $scope.ptzSleepCommand = ""; - $scope.ptzResetCommand = ""; + if (data.control.Control.CanMoveRel == '1') { - $scope.ptzMoveCommand = "undefined"; - $scope.ptzStopCommand = ""; + $scope.ptzMoveCommand = "moveRel"; + $scope.ptzStopCommand = "moveStop"; + } - $scope.zoomInCommand = ""; - $scope.zoomOutCommand = ""; - $scope.zoomStopCommand = "zoomStop"; - $scope.canZoom = false; - $scope.presetOn = true; - $scope.controlToggle = "hide buttons"; - NVRDataModel.debug("configurePTZ: called with mid=" + mid); - var ld = NVRDataModel.getLogin(); - var url = ld.apiurl + "/monitors/" + mid + ".json"; - $http.get(url) - .success(function(data) - { - $scope.isControllable = data.monitor.Monitor.Controllable; - - // *** Only for testing - comment out // - //$scope.isControllable = '1'; - // for testing only - // $scope.isControllable = 1; - $scope.controlid = data.monitor.Monitor.ControlId; - if ($scope.isControllable == '1') - { + // Prefer con over rel if both enabled + // I've tested con + + if (data.control.Control.CanMoveCon == '1') { - var apiurl = NVRDataModel.getLogin().apiurl; - var myurl = apiurl + "/controls/" + $scope.controlid + ".json"; - NVRDataModel.debug("configurePTZ : getting controllable data " + myurl); + $scope.ptzMoveCommand = "moveCon"; + $scope.ptzStopCommand = "moveStop"; + } + //CanMoveMap - $http.get(myurl) - .success(function(data) - { + // presets + NVRDataModel.debug("ConfigurePTZ Preset value is " + data.control.Control.HasPresets); + $scope.ptzPresets = []; - // *** Only for testing - comment out - start// - /*data.Control.Control.CanSleep = '1'; - data.Control.Control.CanWake = '1'; - data.Control.Control.CanReset = '1'; - data.Control.Control.CanZoom = '1'; - data.control.Control.HasPresets = '1'; - data.control.Control.HasHomePreset = '1';*/ - // *** Only for testing - comment out - end // - //data.control.Control.HasPresets = '1'; - //data.control.Control.HasHomePreset = '1' - - - $scope.ptzMoveCommand = "move"; // start with as move; - $scope.ptzStopCommand = ""; - - // console.log ("GOT CONTROL "+JSON.stringify(data.control.Control)); - - if (data.control.Control.CanZoom == '1') - { - $scope.canZoom = true; - if (data.control.Control.CanZoomCon == '1') - { - $scope.zoomInCommand = "zoomConTele"; - $scope.zoomOutCommand = "zoomConWide"; - - } - else if (data.control.Control.CanZoomRel == '1') - { - $scope.zoomInCommand = "zoomRelTele"; - $scope.zoomOutCommand = "zoomRelWide"; - } - else if (data.control.Control.CanZoomAbs == '1') - { - $scope.zoomInCommand = "zoomRelAbs"; - $scope.zoomOutCommand = "zoomRelAbs"; - } - } - - NVRDataModel.debug("configurePTZ: control data returned " + JSON.stringify(data)); - - - if (data.control.Control.CanMoveMap == '1') - { - - //seems moveMap uses Up/Down/Left/Right, - // so no prefix - $scope.ptzMoveCommand = ""; - $scope.ptzStopCommand = "moveStop"; - // console.log ("MoveAbs set"); - } - - if (data.control.Control.CanMoveAbs == '1') - { - - $scope.ptzMoveCommand = "moveAbs"; - $scope.ptzStopCommand = "moveStop"; - // console.log ("MoveAbs set"); - } - - if (data.control.Control.CanMoveRel == '1') - { - - $scope.ptzMoveCommand = "moveRel"; - $scope.ptzStopCommand = "moveStop"; - } - - - - // Prefer con over rel if both enabled - // I've tested con - - if (data.control.Control.CanMoveCon == '1') - { - - $scope.ptzMoveCommand = "moveCon"; - $scope.ptzStopCommand = "moveStop"; - } - //CanMoveMap - - // presets - NVRDataModel.debug("ConfigurePTZ Preset value is " + data.control.Control.HasPresets); - $scope.ptzPresets = []; - - - - - if (data.control.Control.HasPresets == '1') - { - //$scope.presetAndControl = $translate.instant('kPresets'); - - $scope.ptzPresetCount = parseInt(data.control.Control.NumPresets); - //$scope.ptzPresetCount =80; - - NVRDataModel.debug("ConfigurePTZ Number of presets is " + $scope.ptzPresetCount); - - for (var p = 0; p < $scope.ptzPresetCount; p++) - { - $scope.ptzPresets.push( - { - name: (p + 1).toString(), - icon: '', - cmd: "presetGoto" + (p + 1).toString(), - style: 'button-royal' - }); - - } - - if (data.control.Control.HasHomePreset == '1') - { - $scope.ptzPresets.unshift( - { - name: '', - icon: "ion-ios-home", - cmd: 'presetHome', - style: 'button-royal' - }); - - } - - /* MAKE SURE THIS IS THE FIRST ICON */ - $scope.ptzPresets.unshift( - { - // name: 'W', - icon: "ion-chevron-up", - cmd: 'special-hide-unhide', - style: 'button-royal button-dark ', - }); - - - } - /*else - { - $scope.presetAndControl = $translate.instant('kMore'); - }*/ - // lets add these to the end - // strictly speaking, they aren't really presets, but meh for now - - // no need to darken these buttons if presets are not there - var buttonAccent = "button-dark"; - if ($scope.ptzPresets.length == 0) - { - buttonAccent = ""; - } - - if (data.control.Control.CanWake == '1') - { - - $scope.ptzPresets.push( - { - name: 'W', - icon: "ion-eye", - cmd: 'wake', - style: 'button-royal ' + buttonAccent - }); - - } - - if (data.control.Control.CanSleep == '1') - { - $scope.ptzPresets.push( - { - name: 'S', - icon: "ion-eye-disabled", - cmd: 'sleep', - style: 'button-royal ' + buttonAccent - }); - - } - - if (data.control.Control.CanReset == '1') - { - $scope.ptzPresets.push( - { - name: 'R', - icon: "ion-ios-loop-strong", - cmd: 'reset', - style: 'button-royal ' + buttonAccent - }); - - } - - NVRDataModel.log("ConfigurePTZ Modal: ControlDB reports PTZ command to be " + $scope.ptzMoveCommand); - }) - .error(function(data) - { - // console.log("** Error retrieving move PTZ command"); - NVRDataModel.log("ConfigurePTZ : Error retrieving PTZ command " + JSON.stringify(data), "error"); - }); - + + if (data.control.Control.HasPresets == '1') { + //$scope.presetAndControl = $translate.instant('kPresets'); + + $scope.ptzPresetCount = parseInt(data.control.Control.NumPresets); + //$scope.ptzPresetCount =80; + + NVRDataModel.debug("ConfigurePTZ Number of presets is " + $scope.ptzPresetCount); + + for (var p = 0; p < $scope.ptzPresetCount; p++) { + $scope.ptzPresets.push({ + name: (p + 1).toString(), + icon: '', + cmd: "presetGoto" + (p + 1).toString(), + style: 'button-royal' + }); + } - else - { - NVRDataModel.log("configurePTZ " + mid + " is not PTZ controllable"); + + if (data.control.Control.HasHomePreset == '1') { + $scope.ptzPresets.unshift({ + name: '', + icon: "ion-ios-home", + cmd: 'presetHome', + style: 'button-royal' + }); + } + + /* MAKE SURE THIS IS THE FIRST ICON */ + $scope.ptzPresets.unshift({ + // name: 'W', + icon: "ion-chevron-up", + cmd: 'special-hide-unhide', + style: 'button-royal button-dark ', + }); + + + } + /*else + { + $scope.presetAndControl = $translate.instant('kMore'); + }*/ + // lets add these to the end + // strictly speaking, they aren't really presets, but meh for now + + // no need to darken these buttons if presets are not there + var buttonAccent = "button-dark"; + if ($scope.ptzPresets.length == 0) { + buttonAccent = ""; + } + + if (data.control.Control.CanWake == '1') { + + $scope.ptzPresets.push({ + name: 'W', + icon: "ion-eye", + cmd: 'wake', + style: 'button-royal ' + buttonAccent + }); + + } + + if (data.control.Control.CanSleep == '1') { + $scope.ptzPresets.push({ + name: 'S', + icon: "ion-eye-disabled", + cmd: 'sleep', + style: 'button-royal ' + buttonAccent + }); + + } + + if (data.control.Control.CanReset == '1') { + $scope.ptzPresets.push({ + name: 'R', + icon: "ion-ios-loop-strong", + cmd: 'reset', + style: 'button-royal ' + buttonAccent + }); + + } + + NVRDataModel.log("ConfigurePTZ Modal: ControlDB reports PTZ command to be " + $scope.ptzMoveCommand); }) - .error(function(data) - { - // console.log("** Error retrieving move PTZ command"); - NVRDataModel.log("configurePTZ : Error retrieving PTZ command " + JSON.stringify(data), "error"); + .error(function (data) { + // console.log("** Error retrieving move PTZ command"); + NVRDataModel.log("ConfigurePTZ : Error retrieving PTZ command " + JSON.stringify(data), "error"); }); - } - - function getZones() - { - //https://server/zm/api/zones/forMonitor/7.json - var api = NVRDataModel.getLogin().apiurl+"/zones/forMonitor/"+$scope.monitorId+".json"; - NVRDataModel.debug ("Getting zones using:"+api); - originalZones = []; - $http.get (api) - .then (function (succ) { - // console.log (JSON.stringify(succ)); - for (var i=0; i < succ.data.zones.length; i++) - { - originalZones.push ({ - coords:succ.data.zones[i].Zone.Coords, - area: succ.data.zones[i].Zone.Area, - type:succ.data.zones[i].Zone.Type}); - } + } else { + NVRDataModel.log("configurePTZ " + mid + " is not PTZ controllable"); + } + }) + .error(function (data) { + // console.log("** Error retrieving move PTZ command"); + NVRDataModel.log("configurePTZ : Error retrieving PTZ command " + JSON.stringify(data), "error"); + }); + + } + + function getZones() { + //https://server/zm/api/zones/forMonitor/7.json + var api = NVRDataModel.getLogin().apiurl + "/zones/forMonitor/" + $scope.monitorId + ".json"; + NVRDataModel.debug("Getting zones using:" + api); + originalZones = []; + $http.get(api) + .then(function (succ) { + // console.log (JSON.stringify(succ)); + for (var i = 0; i < succ.data.zones.length; i++) { + originalZones.push({ + coords: succ.data.zones[i].Zone.Coords, + area: succ.data.zones[i].Zone.Area, + type: succ.data.zones[i].Zone.Type + }); + } }, function (err) { - NVRDataModel.debug ("Error getting zones :"+JSON.stringify(err)); + NVRDataModel.debug("Error getting zones :" + JSON.stringify(err)); }); - } + } - $scope.$on('modal.shown', function() - { + $scope.$on('modal.shown', function () { + $scope.connKey = (Math.floor((Math.random() * 999999) + 1)).toString(); + $scope.monStatus = ""; + $scope.isToggleListMenu = true; + //console.log (">>>>>>>>>>>>>>>>>>>STOOOP"); + document.addEventListener("pause", onPause, false); + document.addEventListener("resume", onResume, false); - $scope.monStatus = ""; - $scope.isToggleListMenu = true; - //console.log (">>>>>>>>>>>>>>>>>>>STOOOP"); - document.addEventListener("pause", onPause, false); - document.addEventListener("resume", onResume, false); + /*document.addEventListener("mouseup", moveStop, false); + document.addEventListener("touchend", moveStop, false); - /*document.addEventListener("mouseup", moveStop, false); - document.addEventListener("touchend", moveStop, false); + document.addEventL`istener("mousemove", moveContinue, false); + document.addEventListener("touchmove", moveContinue, false);*/ - document.addEventL`istener("mousemove", moveContinue, false); - document.addEventListener("touchmove", moveContinue, false);*/ - - $scope.showZones = false; + $scope.showZones = false; - getZones(); + getZones(); - var ld = NVRDataModel.getLogin(); - //currentEvent = $scope.currentEvent; - $scope.connKey = (Math.floor((Math.random() * 999999) + 1)).toString(); - //console.log ("************* GENERATED CONNKEY " + $scope.connKey); - $scope.currentFrame = 1; - $scope.monStatus = ""; - $scope.isCycle = ld.cycleMonitors; - $scope.cycleText = $scope.isCycle ? $translate.instant('kOn') : $translate.instant('kOff'); + var ld = NVRDataModel.getLogin(); + //currentEvent = $scope.currentEvent; - $scope.quality = (NVRDataModel.getBandwidth() == "lowbw") ? zm.monSingleImageQualityLowBW : ld.monSingleImageQuality; + //console.log ("************* GENERATED CONNKEY " + $scope.connKey); + $scope.currentFrame = 1; + $scope.monStatus = ""; + $scope.isCycle = ld.cycleMonitors; + $scope.cycleText = $scope.isCycle ? $translate.instant('kOn') : $translate.instant('kOff'); - configurePTZ($scope.monitorId); + $scope.quality = (NVRDataModel.getBandwidth() == "lowbw") ? zm.monSingleImageQualityLowBW : ld.monSingleImageQuality; - if (ld.cycleMonitors) - { - NVRDataModel.debug("Cycling enabled at " + ld.cycleMonitorsInterval); + configurePTZ($scope.monitorId); - $interval.cancel(cycleHandle); + if (ld.cycleMonitors) { + NVRDataModel.debug("Cycling enabled at " + ld.cycleMonitorsInterval); - cycleHandle = $interval(function() - { - moveToMonitor($scope.monitorId, 1); - // console.log ("Refreshing Image..."); - }.bind(this), ld.cycleMonitorsInterval * 1000); + $interval.cancel(cycleHandle); - } + cycleHandle = $interval(function () { + moveToMonitor($scope.monitorId, 1); + // console.log ("Refreshing Image..."); + }.bind(this), ld.cycleMonitorsInterval * 1000); - }); + } + + }); }]); diff --git a/www/js/MontageCtrl.js b/www/js/MontageCtrl.js index 5c5fb5ca..4a825d2c 100644 --- a/www/js/MontageCtrl.js +++ b/www/js/MontageCtrl.js @@ -30,7 +30,7 @@ angular.module('zmApp.controllers') var reloadPage = zm.forceMontageReloadDelay; //var reloadPage = 30; - var multiPortZms = 0; + var simulStreaming = 0; // will be 1 if you are on iOS or have multiport $rootScope.$on("auth-success", function () { @@ -258,6 +258,8 @@ angular.module('zmApp.controllers') //console.log ("**** mygrid is " + JSON.stringify(elem)); + if (pckry) pckry.destroy(); + pckry = new Packery('.grid', { itemSelector: '.grid-item', @@ -599,8 +601,8 @@ angular.module('zmApp.controllers') function loadNotifications() { - if (multiPortZms) { - // console.log ("Skipping timer as multiportZMS="+multiPortZms); + if (simulStreaming=='1') { + // console.log ("Skipping timer as simulStreaming"); return; } @@ -1105,11 +1107,25 @@ angular.module('zmApp.controllers') $scope.openModal = function(mid, controllable, controlid, connKey, monitor) { + + if (simulStreaming=='1') { + NVRDataModel.debug ("Killing all streams in montage to save memory/nw..."); + for (var i=0; i < $scope.MontageMonitors.length; i++) { + NVRDataModel.killStream($scope.MontageMonitors[i].Monitor.connKey); + } + } + + openModal(mid, controllable, controlid, connKey, monitor); + + + }; function openModal(mid, controllable, controlid, connKey, monitor) { + + $scope.singleMonitorModalOpen = true; NVRDataModel.debug("MontageCtrl: Open Monitor Modal with monitor Id=" + mid + " and Controllable:" + controllable + " with control ID:" + controlid); // $scope.isModalActive = true; // Note: no need to setAwake(true) as its already awake @@ -1142,8 +1158,6 @@ angular.module('zmApp.controllers') $scope.canZoom = false; $scope.presetOn = false; - - $scope.connKey = (Math.floor((Math.random() * 999999) + 1)).toString(); $scope.isControllable = controllable; $scope.refMonitor = monitor; @@ -1186,12 +1200,26 @@ angular.module('zmApp.controllers') function cleanupOnClose() { + + // single connkey is removed in monitorModal + + NVRDataModel.debug ("Regenerating connkeys for montage..."); + for (var i=0; i < $scope.MontageMonitors.length; i++) { + $scope.MontageMonitors[i].Monitor.connKey = (Math.floor((Math.random() * 999999) + 1)).toString(); + } + $scope.modal.remove(); - $timeout(function() + // we did the montage, so redo flow + $timeout (function() {initPackery();},zm.packeryTimer); + + + /* $timeout(function() { NVRDataModel.log("MontageCtrl:Stopping network pull..."); if (NVRDataModel.isForceNetworkStop()) NVRDataModel.stopNetwork(); - }, 50); + }, 50);*/ + + $rootScope.rand = Math.floor((Math.random() * 100000) + 1); $scope.isModalActive = false; @@ -1236,8 +1264,15 @@ angular.module('zmApp.controllers') $scope.closeModal = function() { - NVRDataModel.debug("MontageCtrl: Close & Destroy Monitor Modal"); - cleanupOnClose(); + if ($scope.singleMonitorModalOpen) { + $scope.singleMonitorModalOpen = false; + NVRDataModel.debug("MontageCtrl: Close & Destroy Monitor Modal"); + cleanupOnClose(); + } + else { + NVRDataModel.debug ("Ignoring double-invocation"); + } + // $scope.isModalActive = false; // Note: no need to setAwake(false) as needs to be awake // in montage view @@ -1259,6 +1294,15 @@ angular.module('zmApp.controllers') $interval.cancel(intervalHandleAlarmStatus); $interval.cancel(intervalHandleReloadPage); + // if modal is open stream gets killed + // inside monitorModal + if (!$scope.singleMonitorModalOpen && simulStreaming=='1') { + NVRDataModel.debug ("Killing all streams in montage to save memory/nw..."); + for (var i=0; i < $scope.MontageMonitors.length; i++) { + NVRDataModel.killStream($scope.MontageMonitors[i].Monitor.connKey); + } + } + // $interval.cancel(modalIntervalHandle); // FIXME: Do I need to setAwake(false) here? } @@ -1266,6 +1310,10 @@ angular.module('zmApp.controllers') function onResume() { + NVRDataModel.debug ("Montage resume called, regenerating all connkeys"); + NVRDataModel.regenConnKeys(); + $scope.MontageMonitors = NVRDataModel.getMonitorsNow(); + } $scope.openMenu = function() @@ -1412,6 +1460,7 @@ angular.module('zmApp.controllers') draggies = []; pckry.destroy(); NVRDataModel.reloadMonitorDisplayStatus(); + NVRDataModel.regenConnKeys(); $scope.MontageMonitors = NVRDataModel.getMonitorsNow(); $timeout (function() {initPackery();},zm.packeryTimer); @@ -1616,14 +1665,19 @@ angular.module('zmApp.controllers') $scope.getMode = function() { - var x = multiPortZms == 0 ? 'single': 'jpeg'; - // console.log ("Port="+x); - return x; - + + // console.log ("SIMUL="+simulStreaming); + return (simulStreaming == '1') ? 'jpeg': 'single'; }; - + // using connkey in snapshot results in error + $scope.appendConnKey =function(ck) { + if (simulStreaming == '1') + return "&connkey="+ck; + else + return ""; + } $scope.toggleSubMenuFunction = function() { @@ -1642,6 +1696,7 @@ angular.module('zmApp.controllers') { + $scope.singleMonitorModalOpen = false; // $scope.minimal = $stateParams.minimal; var ld = NVRDataModel.getLogin(); $scope.minimal = ld.isFullScreen; @@ -1650,13 +1705,19 @@ angular.module('zmApp.controllers') NVRDataModel.getZmsMultiPortSupport() .then ( function (data) { - multiPortZms = data; + //multiPortZms = data; + simulStreaming = data > 0 ? '1':'0'; //console.log ("****** MULTIPORT="+multiPortZms); - NVRDataModel.debug ("Multiport="+multiPortZms); + NVRDataModel.debug ("Multiport="+data); + + if ($rootScope.platformOS == 'ios') { + simulStreaming = '1'; + NVRDataModel.debug ("IOS detected, force enabling simulStreams"); + } }, function (err) { NVRDataModel.debug("******* SHOULD NEVER HAPPEN - MULTIPORT ERROR"); - multiPortZms = 0; + simulStreaming = '0'; } ); @@ -1718,6 +1779,7 @@ angular.module('zmApp.controllers') $scope.monLimit = $scope.LoginData.maxMontage; $scope.toggleSubMenu = NVRDataModel.getLogin().showMontageSubMenu; + $scope.monitors = message; $scope.MontageMonitors = angular.copy(message); $scope.sliderChanging = false; @@ -1868,15 +1930,26 @@ angular.module('zmApp.controllers') pckry.destroy(); window.removeEventListener("resize", orientationChanged, false); + // killing connkeys STILL leaks apache + NVRDataModel.log("MontageCtrl:Stopping network pull..."); + NVRDataModel.stopNetwork(); + + /* if (!$scope.singleMonitorModalOpen) { + NVRDataModel.debug ("Killing all streams in montage before exit"); + for (var i=0; i < $scope.MontageMonitors.length; i++) { + NVRDataModel.killStream($scope.MontageMonitors[i].Monitor.connKey); + } + }*/ + // make sure this is applied in scope digest to stop network pull // thats why we are doing it beforeLeave - if (NVRDataModel.isForceNetworkStop()) + /*if (NVRDataModel.isForceNetworkStop()) { NVRDataModel.log("MontageCtrl:Stopping network pull..."); NVRDataModel.stopNetwork(); - } + }*/ }); diff --git a/www/js/MontageHistoryCtrl.js b/www/js/MontageHistoryCtrl.js index c9f78499..be160413 100644 --- a/www/js/MontageHistoryCtrl.js +++ b/www/js/MontageHistoryCtrl.js @@ -1449,13 +1449,13 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc $scope.currentLimit = $scope.LoginData.maxMontage; if ($rootScope.platformOS != 'ios') { - if (!NVRDataModel.getCurrentServerMultiPortSupported()) { + if (!NVRDataModel.getCurrentServerMultiPortSupported() && $rootScope.platformOS != 'ios') { NVRDataModel.log("Limiting montage to 5, thanks to Chrome's stupid connection limit"); $scope.currentLimit = 5; $scope.monLimit = 5; } else { - NVRDataModel.debug ("Since Multiport is supported, taking off Chrome limit!"); + NVRDataModel.debug ("Since Multiport is supported, or you are on iOS, taking off Chrome limit!"); } diff --git a/www/js/app.js b/www/js/app.js index 0cd1ddb7..487a0d0e 100755 --- a/www/js/app.js +++ b/www/js/app.js @@ -765,7 +765,7 @@ angular.module('zmApp', [ $http.get(zm.blogUrl, { transformResponse: function (d, h) { var trunc = "])}while(1);</x>"; - d = d.substr(trunc.length); + if (d) {d = d.substr(trunc.length);} return d; } }) @@ -1411,7 +1411,7 @@ angular.module('zmApp', [ //console.log("HERE"); - if ($rootScope.apiValid == false && toState.name != 'invalidapi' && toState.data.requireLogin == true) { + if ($rootScope.apiValid == false && toState.name != 'app.invalidapi' && toState.data.requireLogin == true) { event.preventDefault(); $state.transitionTo('app.invalidapi'); return; @@ -1740,10 +1740,10 @@ angular.module('zmApp', [ localforage.getItem('last-desktop-state') .then(function (succ) { - // console.log ("FOUND " + JSON.stringify(succ) + ":"+succ); + //console.log ("FOUND STATE" + JSON.stringify(succ) + ":"+succ); if (succ) { - if ( succ == 'app.invalidapi' || succ == 'app.refresh') { - succ = 'app.montage'; + if ( succ.name == 'app.invalidapi' || succ.name == 'app.refresh') { + succ.name = 'app.montage'; } $rootScope.lastState = succ.name; if ($rootScope.lastState.indexOf("app.") == -1) { @@ -1751,6 +1751,9 @@ angular.module('zmApp', [ } $rootScope.lastStateParam = succ.params; + + NVRDataModel.debug ("last state="+$rootScope.lastState+" param="+$rootScope.lastStateParam); + } loadServices(); }, function (err) { |
