diff options
Diffstat (limited to 'www')
| -rw-r--r-- | www/css/style.css | 8 | ||||
| -rwxr-xr-x | www/js/DataModel.js | 137 | ||||
| -rw-r--r-- | www/js/DevOptionsCtrl.js | 7 | ||||
| -rw-r--r-- | www/js/EventCtrl.js | 12 | ||||
| -rw-r--r-- | www/js/EventModalCtrl.js | 14 | ||||
| -rw-r--r-- | www/js/EventServer.js | 4 | ||||
| -rw-r--r-- | www/js/EventsModalGraphCtrl.js | 4 | ||||
| -rw-r--r-- | www/js/LogCtrl.js | 4 | ||||
| -rw-r--r-- | www/js/LoginCtrl.js | 4 | ||||
| -rw-r--r-- | www/js/MenuController.js | 2 | ||||
| -rw-r--r-- | www/js/MonitorCtrl.js | 3 | ||||
| -rw-r--r-- | www/js/MonitorModalCtrl.js | 219 | ||||
| -rw-r--r-- | www/js/MontageCtrl.js | 3281 | ||||
| -rw-r--r-- | www/js/MontageHistoryCtrl.js | 22 | ||||
| -rw-r--r-- | www/js/PortalLoginCtrl.js | 10 | ||||
| -rw-r--r-- | www/js/TimelineCtrl.js | 6 | ||||
| -rwxr-xr-x | www/js/app.js | 52 | ||||
| -rw-r--r-- | www/lang/locale-en.json | 1 | ||||
| -rw-r--r-- | www/templates/devoptions.html | 5 | ||||
| -rw-r--r-- | www/templates/monitors-modal.html | 12 | ||||
| -rw-r--r-- | www/templates/montage.html | 11 |
21 files changed, 1938 insertions, 1880 deletions
diff --git a/www/css/style.css b/www/css/style.css index 5b32a033..c850fb41 100644 --- a/www/css/style.css +++ b/www/css/style.css @@ -125,6 +125,14 @@ ion-popover-view.fit ion-content { width: 100% } +/*.modal { + top: 100; + + left: 100; + + width: 10% +}*/ + /* I am using flexboxes to dynamicall adapt content in montage view. diff --git a/www/js/DataModel.js b/www/js/DataModel.js index f930be8d..a7badad8 100755 --- a/www/js/DataModel.js +++ b/www/js/DataModel.js @@ -848,7 +848,13 @@ angular.module('zmApp.controllers') if (typeof loginData.disableSimulStreaming == 'undefined') { loginData.disableSimulStreaming = false; + } + // iOS it is always off, webkit bug + + if ($rootScope.platformOS=='ios') { + loginData.disableSimulStreaming = true; + } if (typeof loginData.exitOnSleep == 'undefined') { debug("exitOnSleep does not exist. Setting to false"); @@ -1108,12 +1114,8 @@ angular.module('zmApp.controllers') loginData.showLiveForInProgressEvents = true; } - - - - - - log("DataModel init recovered this loginData as " + JSON.stringify(loginData)); + + log("DataModel init retrieved store loginData"); } else { log("defaultServer configuration NOT found. Keeping login at defaults"); } @@ -1125,7 +1127,7 @@ angular.module('zmApp.controllers') // FIXME: HACK: This is the latest entry point into dataModel init, so start portal login after this // not the neatest way - $rootScope.$emit('init-complete'); + $rootScope.$broadcast('init-complete'); }); monitorsLoaded = 0; @@ -1142,7 +1144,7 @@ angular.module('zmApp.controllers') }, setJustResumed: function (val) { - justResumed = true; + justResumed = val; }, stopNetwork: function (str) { @@ -1151,10 +1153,11 @@ angular.module('zmApp.controllers') if (justResumed) { // we don't call stop as we did stop on pause log(s + " Not calling window stop as we just resumed"); - justResumed = false; + } else { - log(s + " Calling window.stop()"); - window.stop(); + log(s + " stopNework: Calling window.stop()"); + $timeout (function() {window.stop();}); + } }, @@ -1395,7 +1398,7 @@ angular.module('zmApp.controllers') // Skipping monitor number as I only need an auth key // so no need to generate an image - var myurl = loginData.url + "/index.php?view=watch&mid=" + mid + "&connkey=" + ck; + var myurl = loginData.url + "/index.php?view=watch&mid=" + mid ; debug("DataModel: Getting auth from " + myurl + " with mid=" + mid); $http.get(myurl) .then(function (success) { @@ -1534,18 +1537,84 @@ angular.module('zmApp.controllers') return monitors; }, - killStream: function (ck) { + pauseLiveStream: function (ck,url) { + if (!url) url = loginData.url; + + var myauthtoken = $rootScope.authSession.replace("&auth=", ""); + var req = url+'/index.php'; + req = req + "?view=request&request=stream"; + req = req + "&connkey="+ck; + req = req + "&auth="+myauthtoken; + // req = req + "&command=17"; + + debug ("DataModel: Pausing live stream ck:"+ck); + return $http.get(req+"&command=1") + .then ( + function (s) { + debug ("pause success for ck:"+ck+" with:"+JSON.stringify(s)); + + }, + function (e) {debug ("pause success for ck:"+ck+" with:"+JSON.stringify(e));} + ); + + }, + + resumeLiveStream: function (ck,url) { + if (!url) url = loginData.url; + + var myauthtoken = $rootScope.authSession.replace("&auth=", ""); + var req = url+'/index.php'; + req = req + "?view=request&request=stream"; + req = req + "&connkey="+ck; + req = req + "&auth="+myauthtoken; + // req = req + "&command=17"; + + debug ("DataModel: Resuming live stream ck:"+ck); + return $http.get(req+"&command=2") + .then ( + function (s) { + debug ("play success for ck:"+ck+" with:"+JSON.stringify(s)); + + }, + function (e) {debug ("play success for ck:"+ck+" with:"+JSON.stringify(e));} + ); + + }, + + killLiveStream: function (ck,url,name) { + + if (!url) url = loginData.url; + + var myauthtoken = $rootScope.authSession.replace("&auth=", ""); + var req = url+'/index.php'; + req = req + "?view=request&request=stream"; + req = req + "&connkey="+ck; + req = req + "&auth="+myauthtoken; + // req = req + "&command=17"; + if (name==undefined) name=""; + debug ("DataModel: killing "+name+" live stream ck:"+ck); + return $http.get(req+"&command=17") + .then ( + function (s) { + debug ("kill success for ck:"+ck+" with:"+JSON.stringify(s)); + + }, + function (e) {debug ("kill success for ck:"+ck+" with:"+JSON.stringify(e));} + ); + }, + + /*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) { @@ -1563,26 +1632,27 @@ angular.module('zmApp.controllers') view: "request", request: "stream", connkey: ck, - command: 17, + command: 3, auth: myauthtoken, } }) .then (function (succ) { - console.log ("KILL OK WITH: " + JSON.stringify(succ)); + console.log ("STOP/KILL OK WITH: " + JSON.stringify(succ)); }, function (err) { console.log ("KILL ERROR WITH: " + JSON.stringify(err)); }); - }, + },*/ regenConnKeys: function () { - debug ("Regenerating connkeys..."); + debug ("DataModel: Regenerating connkeys..."); for (var i=0; i < monitors.length; i++){ monitors[i].Monitor.connKey = (Math.floor((Math.random() * 999999) + 1)).toString(); + monitors[i].Monitor.rndKey = (Math.floor((Math.random() * 999999) + 1)).toString(); } }, @@ -1610,6 +1680,8 @@ angular.module('zmApp.controllers') // console.log ("gettign zms port"); getZmsMultiPortSupport() .then(function (zmsPort) { + + var controlURL = ""; debug ("ZMS Multiport reported: "+zmsPort); debug ("Monitor URL to fetch is:"+myurl); @@ -1641,6 +1713,7 @@ angular.module('zmApp.controllers') monitors[i].Monitor.listDisplay = 'show'; monitors[i].Monitor.isAlarmed = false; monitors[i].Monitor.connKey = (Math.floor((Math.random() * 999999) + 1)).toString(); + monitors[i].Monitor.rndKey = (Math.floor((Math.random() * 999999) + 1)).toString(); var serverFound = false; for (var j = 0; j < multiservers.length; j++) { @@ -1668,9 +1741,12 @@ angular.module('zmApp.controllers') var st = ""; var baseurl = ""; var streamingurl = ""; + st += (s.scheme ? s.scheme : p.scheme) + "://"; // server scheme overrides + + // if server doesn't have a protocol, what we want is in path if (!s.host) { s.host = s.path; @@ -1678,6 +1754,7 @@ angular.module('zmApp.controllers') } st += s.host; + // console.log ("STEP 1: ST="+st); if (zmsPort <=0 ) @@ -1688,6 +1765,7 @@ angular.module('zmApp.controllers') // console.log ("STEP 2 no ZMS: ST="+st); } + } else { var sport = parseInt(zmsPort) + parseInt(monitors[i].Monitor.Id); @@ -1701,6 +1779,7 @@ angular.module('zmApp.controllers') baseurl = st; + controlURL =st; st += (s.path ? s.path : p.path); streamingurl += (s.path ? s.path : p.path); @@ -1712,18 +1791,20 @@ angular.module('zmApp.controllers') monitors[i].Monitor.streamingURL = st; monitors[i].Monitor.baseURL = baseurl; + monitors[i].Monitor.controlURL = controlURL; //console.log ("** Streaming="+st+" **base="+baseurl); // starting 1.30 we have fid=xxx mode to return images monitors[i].Monitor.imageMode = (versionCompare($rootScope.apiVersion, "1.30") == -1) ? "path" : "fid"; // debug("API " + $rootScope.apiVersion + ": Monitor " + monitors[i].Monitor.Id + " will use " + monitors[i].Monitor.imageMode + " for direct image access"); - debug ("Streaming URL for Monitor " + monitors[i].Monitor.Id + " is " + monitors[i].Monitor.streamingURL ); + //debug ("Streaming URL for Monitor " + monitors[i].Monitor.Id + " is " + monitors[i].Monitor.streamingURL ); //debug ("Base URL for Monitor " + monitors[i].Monitor.Id + " is " + monitors[i].Monitor.baseURL ); } else { //monitors[i].Monitor.listDisplay = 'show'; monitors[i].Monitor.isAlarmed = false; monitors[i].Monitor.connKey = (Math.floor((Math.random() * 999999) + 1)).toString(); + monitors[i].Monitor.rndKey = (Math.floor((Math.random() * 999999) + 1)).toString(); var st2 = loginData.streamingurl; @@ -1731,6 +1812,7 @@ angular.module('zmApp.controllers') // we need to insert minport st2 = ""; var p2 = URI.parse(loginData.streamingurl); + var p3 = URI.parse( loginData.url); st2 += p2.scheme + "://"; if (!p2.host) { p2.host = p2.path; @@ -1739,11 +1821,16 @@ angular.module('zmApp.controllers') st2 += p2.host; var sport2 = parseInt(zmsPort) + parseInt(monitors[i].Monitor.Id); st2 = st2 + ':'+sport2; + + controlURL = st2; + if (p2.path) st2 += p2.path; + if (p3.path) controlURL +=p3.path; } monitors[i].Monitor.streamingURL = st2; - debug ("Streaming URL for Monitor " + monitors[i].Monitor.Id + " is " + monitors[i].Monitor.streamingURL ); + monitors[i].Monitor.controlURL = controlURL; + //debug ("Streaming URL for Monitor " + monitors[i].Monitor.Id + " is " + monitors[i].Monitor.streamingURL ); //console.log ("NO SERVER MATCH CONSTRUCTED STREAMING PATH="+st2); monitors[i].Monitor.baseURL = loginData.url; monitors[i].Monitor.imageMode = (versionCompare($rootScope.apiVersion, "1.30") == -1) ? "path" : "fid"; @@ -1769,6 +1856,7 @@ angular.module('zmApp.controllers') //monitors[i].Monitor.listDisplay = 'show'; monitors[i].Monitor.isAlarmed = false; monitors[i].Monitor.connKey = (Math.floor((Math.random() * 999999) + 1)).toString(); + monitors[i].Monitor.rndKey = (Math.floor((Math.random() * 999999) + 1)).toString(); var st = loginData.streamingurl; if (zmsPort >0) { // we need to insert minport @@ -1789,10 +1877,11 @@ angular.module('zmApp.controllers') } monitors[i].Monitor.streamingURL = st; - console.log ("CONSTRUCTED STREAMING PATH="+st); + // console.log ("CONSTRUCTED STREAMING PATH="+st); monitors[i].Monitor.baseURL = loginData.url; + monitors[i].Monitor.imageMode = (versionCompare($rootScope.apiVersion, "1.30") == -1) ? "path" : "fid"; - debug("API " + $rootScope.apiVersion + ": Monitor " + monitors[i].Monitor.Id + " will use " + monitors[i].Monitor.imageMode + " for direct image access"); + //debug("API " + $rootScope.apiVersion + ": Monitor " + monitors[i].Monitor.Id + " will use " + monitors[i].Monitor.imageMode + " for direct image access"); } d.resolve(monitors); @@ -1932,7 +2021,7 @@ angular.module('zmApp.controllers') isTzSupported = true; else isTzSupported = false; - $rootScope.$emit('tz-updated'); + $rootScope.$broadcast('tz-updated'); return (d.promise); }, diff --git a/www/js/DevOptionsCtrl.js b/www/js/DevOptionsCtrl.js index e6f107c2..92c1e2c0 100644 --- a/www/js/DevOptionsCtrl.js +++ b/www/js/DevOptionsCtrl.js @@ -72,6 +72,10 @@ angular.module('zmApp.controllers').controller('zmApp.DevOptionsCtrl', ['$scope' return NVRDataModel.getTimeZoneNow(); }; + $scope.checkMultiPortToggle = function() { + if ($rootScope.platformOS == 'ios') + $scope.loginData.disableSimulStreaming = true; + }; //------------------------------------------------------------------ // Perform the login action when the user submits the login form //------------------------------------------------------------------ @@ -109,6 +113,9 @@ angular.module('zmApp.controllers').controller('zmApp.DevOptionsCtrl', ['$scope' $scope.loginData.singleImageQuality = zm.safeImageQuality.toString(); } + if (!$scope.loginData.disableSimulStreaming && $rootScope.platformOS=='ios') { + $scope.loginData.disableSimulStreaming = true; + } NVRDataModel.debug("SaveDevOptions: Saving to disk"); NVRDataModel.setLogin($scope.loginData); NVRDataModel.getMonitors(1); diff --git a/www/js/EventCtrl.js b/www/js/EventCtrl.js index b39921fd..423de0d2 100644 --- a/www/js/EventCtrl.js +++ b/www/js/EventCtrl.js @@ -77,14 +77,14 @@ angular.module('zmApp.controllers') //--------------------------------------------------- //we come here is TZ is updated after the view loads - var tzu = $rootScope.$on('tz-updated', function() + var tzu = $scope.$on('tz-updated', function() { $scope.tzAbbr = NVRDataModel.getTimeZoneNow(); NVRDataModel.debug("Timezone API updated timezone to " + NVRDataModel.getTimeZoneNow()); }); broadcastHandles.push(tzu); - var lc = $rootScope.$on("language-changed", function() + var lc = $scope.$on("language-changed", function() { NVRDataModel.log(">>>>>>>>>>>>>>> language changed"); doRefresh(); @@ -158,9 +158,9 @@ angular.module('zmApp.controllers') $scope.$on('$ionicView.beforeLeave', function() { - NVRDataModel.debug ("Deregistering broadcast handles"); + NVRDataModel.debug ("EventCtrl: Deregistering broadcast handles"); for (var i=0; i < broadcastHandles.length; i++) { - broadcastHandles[i](); + // broadcastHandles[i](); } broadcastHandles = []; }); @@ -2152,9 +2152,9 @@ angular.module('zmApp.controllers') { NVRDataModel.debug("EventCtrl:onpause called"); if ($scope.popover) $scope.popover.remove(); - NVRDataModel.debug ("Deregistering broadcast handles"); + NVRDataModel.debug ("EventCtrl Pause:Deregistering broadcast handles"); for (var i=0; i < broadcastHandles.length; i++) { - broadcastHandles[i](); + // broadcastHandles[i](); } broadcastHandles = []; diff --git a/www/js/EventModalCtrl.js b/www/js/EventModalCtrl.js index 9fb6f25e..4f9a12ce 100644 --- a/www/js/EventModalCtrl.js +++ b/www/js/EventModalCtrl.js @@ -108,7 +108,7 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro // //-------------------------------------------------------------------------------------- - var bc = $rootScope.$on("bandwidth-change", function(e, data) + var bc = $scope.$on("bandwidth-change", function(e, data) { // not called for offline, I'm only interested in BW switches NVRDataModel.debug("Got network change:" + data); @@ -133,7 +133,7 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro // we use this to reload the connkey if authkey changed //------------------------------------------------------ - var as = $rootScope.$on("auth-success", function() + var as = $scope.$on("auth-success", function() { NVRDataModel.debug("EventModalCtrl: Re-login detected, resetting everything & re-generating connkey"); @@ -440,9 +440,9 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro function onPause() { - NVRDataModel.debug ("Deregistering broadcast handles"); + NVRDataModel.debug ("EventModal Pause: Deregistering broadcast handles"); for (var i=0; i < broadcastHandles.length; i++) { - broadcastHandles[i](); + // broadcastHandles[i](); } broadcastHandles = []; @@ -457,8 +457,8 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro function onResume() { - NVRDataModel.debug("EventModalCtrl: Modal resume called"); - $rootScope.modalRand = Math.floor((Math.random() * 100000) + 1); + /* NVRDataModel.debug("EventModalCtrl: Modal resume called"); + $rootScope.modalRand = Math.floor((Math.random() * 100000) + 1);*/ } @@ -1093,7 +1093,7 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro { NVRDataModel.debug ("Deregistering broadcast handles"); for (var i=0; i < broadcastHandles.length; i++) { - broadcastHandles[i](); + // broadcastHandles[i](); } broadcastHandles = []; diff --git a/www/js/EventServer.js b/www/js/EventServer.js index ee606a63..2d5831e9 100644 --- a/www/js/EventServer.js +++ b/www/js/EventServer.js @@ -292,7 +292,7 @@ angular.module('zmApp.controllers') { //emit alarm details - this is when received over websockets - $rootScope.$emit('alarm', + $rootScope.$broadcast('alarm', { message: listOfMonitors }); @@ -658,7 +658,7 @@ angular.module('zmApp.controllers') $rootScope.tappedEid = 0; $rootScope.tappedMid = 0; } - $rootScope.$emit('process-push'); + $rootScope.$broadcast('process-push'); } else // app is foreground diff --git a/www/js/EventsModalGraphCtrl.js b/www/js/EventsModalGraphCtrl.js index 65e42b12..3db8b31e 100644 --- a/www/js/EventsModalGraphCtrl.js +++ b/www/js/EventsModalGraphCtrl.js @@ -27,7 +27,7 @@ angular.module('zmApp.controllers').controller('EventsModalGraphCtrl', ['$scope' { NVRDataModel.debug ("Deregistering broadcast handles"); for (var i=0; i < broadcastHandles.length; i++) { - broadcastHandles[i](); + // broadcastHandles[i](); } broadcastHandles = []; }); @@ -115,7 +115,7 @@ angular.module('zmApp.controllers').controller('EventsModalGraphCtrl', ['$scope' // we use this to reload the connkey if authkey changed //------------------------------------------------------ - var as = $rootScope.$on("auth-success", function() + var as = $scope.$on("auth-success", function() { NVRDataModel.debug("EventModalCtrl: Re-login detected, resetting everything & re-generating connkey"); diff --git a/www/js/LogCtrl.js b/www/js/LogCtrl.js index fe18fe22..9f00a8f7 100644 --- a/www/js/LogCtrl.js +++ b/www/js/LogCtrl.js @@ -26,8 +26,8 @@ angular.module('zmApp.controllers').controller('zmApp.LogCtrl', ['$scope', '$roo function onResume() { - NVRDataModel.debug("LogCtrl: resume called, starting log timer"); - loadLogs(); + // NVRDataModel.debug("LogCtrl: resume called, starting log timer"); + loadLogs(); } $scope.flipLogs = function() diff --git a/www/js/LoginCtrl.js b/www/js/LoginCtrl.js index 1a728de4..56d6d4a7 100644 --- a/www/js/LoginCtrl.js +++ b/www/js/LoginCtrl.js @@ -30,7 +30,7 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r document.addEventListener("resume", onResume, false); function onResume() { - NVRDataModel.log("Login screen resumed"); + // NVRDataModel.log("Login screen resumed"); } @@ -358,7 +358,7 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r } });*/ - $rootScope.$on('$stateChangeSuccess', function () { + $scope.$on('$stateChangeSuccess', function () { $scope.ignoreDirty = false; }); diff --git a/www/js/MenuController.js b/www/js/MenuController.js index 071db4df..c7e96604 100644 --- a/www/js/MenuController.js +++ b/www/js/MenuController.js @@ -42,7 +42,7 @@ angular.module('zmApp.controllers').controller('MenuController', ['$scope', '$io { NVRDataModel.log("Language selected:" + $scope.myopt.lang); NVRDataModel.setDefaultLanguage($scope.myopt.lang, true); - $rootScope.$emit('language-changed'); + $rootScope.$broadcast('language-changed'); //return "OK"; diff --git a/www/js/MonitorCtrl.js b/www/js/MonitorCtrl.js index eca22d15..928a15b9 100644 --- a/www/js/MonitorCtrl.js +++ b/www/js/MonitorCtrl.js @@ -374,6 +374,7 @@ angular.module('zmApp.controllers') NVRDataModel.debug("MonitorCtrl:Open Monitor Modal with monitor Id=" + mid + " and Controllable:" + controllable + " with control ID:" + controlid); + $scope.controlURL = monitor.Monitor.controlURL; $scope.monitor = monitor; //console.log (">>>>>>>>>>>> MONITOR CRL " + $scope.monitor. $scope.monitorId = mid; @@ -402,7 +403,7 @@ angular.module('zmApp.controllers') $scope.presetOn = false; - $scope.connKey = (Math.floor((Math.random() * 999999) + 1)).toString(); + $scope.isControllable = controllable; $rootScope.modalRand = Math.floor(Math.random() * (999999 - 111111 + 1)) + 111111; diff --git a/www/js/MonitorModalCtrl.js b/www/js/MonitorModalCtrl.js index ff0368cd..51f08fd5 100644 --- a/www/js/MonitorModalCtrl.js +++ b/www/js/MonitorModalCtrl.js @@ -10,7 +10,6 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$ $scope.isModalActive = true; var intervalModalHandle; var cycleHandle; - var nphTimer; var ld = NVRDataModel.getLogin(); $scope.svgReady = false; $scope.zoneArray = []; @@ -20,6 +19,8 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$ var targetID = ""; $scope.imageZoomable = true; $scope.ptzButtonsShown = true; + + @@ -31,16 +32,16 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$ }, false); - $rootScope.authSession = "undefined"; + //$rootScope.authSession = "undefined"; - $ionicLoading.show({ + /* $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); @@ -48,7 +49,8 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$ NVRDataModel.debug("MonitorModalCtrl called from " + $ionicHistory.currentStateName()); - $rootScope.validMonitorId = $scope.monitors[0].Monitor.Id; + //no need to recompute auth in modal + /*$rootScope.validMonitorId = $scope.monitors[0].Monitor.Id; NVRDataModel.getAuthKey($rootScope.validMonitorId, $scope.monitors[0].Monitor.connKey) .then(function (success) { $ionicLoading.hide(); @@ -63,7 +65,7 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$ //$rootScope.authSession=""; NVRDataModel.log("Modal: Error returned Stream authentication construction. Retaining old value of: " + $rootScope.authSession); }); - +*/ $interval.cancel(intervalModalHandle); $interval.cancel(cycleHandle); @@ -71,13 +73,9 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$ intervalModalHandle = $interval(function () { loadModalNotifications(); // console.log ("Refreshing Image..."); - }.bind(this), 5000); + }.bind(this), zm.alarmStatusTime); - $timeout.cancel(nphTimer); - nphTimer = $timeout(function () { - $scope.currentStreamMode = 'jpeg'; - NVRDataModel.log("Switching playback via nphzms"); - }, zm.nphSwitchTimer); + // This is the PTZ menu @@ -195,12 +193,28 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$ // On re-auth, we need a new zms //------------------------------------------------------------- - $rootScope.$on("auth-success", function () { + var as = $scope.$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.isModalStreamPaused = false; + + $timeout (function() { + + if (0 && $rootScope.platformOS == 'ios') { + NVRDataModel.debug ("Webkit hack, hammering window.stop();"); + NVRDataModel.stopNetwork(); + } + else { + NVRDataModel.killLiveStream($scope.connKey, $scope.controlURL); + } + + + $scope.connKey = (Math.floor((Math.random() * 999999) + 1)).toString(); + }); + + }); @@ -266,7 +280,13 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$ $interval.cancel(cycleHandle); NVRDataModel.debug("Killing single stream..."); - NVRDataModel.killStream($scope.connKey); + + if (0 && $rootScope.platformOS == 'ios') { + NVRDataModel.debug ("Webkit hack, hammering window.stop();"); + NVRDataModel.stopNetwork(); + } else { + NVRDataModel.killLiveStream($scope.connKey, $scope.controlURL); + } // $interval.cancel(modalIntervalHandle); // FIXME: Do I need to setAwake(false) here? @@ -285,7 +305,7 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$ intervalModalHandle = $interval(function () { loadModalNotifications(); - }.bind(this), 5000); + }.bind(this), zm.alarmStatusTime); if (ld.cycleMonitors) { NVRDataModel.debug("Cycling enabled at " + ld.cycleMonitorsInterval); @@ -577,46 +597,38 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$ // this is a good time to calculate scaled zone points function imageLoaded() { + if ($scope.animationInProgress) return; + /* 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; + 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++) { + /*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); + + /* for (i = 0; i < $scope.zoneArray.length; i++) { + //jshint loopfunc: true $scope.zoneArray[i].coords.split(' ') .forEach(function (itm) { var o = itm.split(','); @@ -629,8 +641,10 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$ // console.log ("CIRCLE X="+o[0]+"Y="+o[1]); }); - } + }*/ + $scope.isModalStreamPaused = false; + NVRDataModel.debug ("Modal image loaded, switching to streaming"); @@ -638,18 +652,7 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$ } - //------------------------------------------------------------- - // 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 @@ -799,6 +802,7 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$ function moveToMonitor(m, d) { + $scope.animationInProgress = true; if ($scope.isZoneEdit) { NVRDataModel.log("Not cycling, as you are editing zones"); } @@ -838,38 +842,57 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$ } while (found != 1); + // now kill stream and set up next + NVRDataModel.debug("Killing stream before we move on to next monitor..."); + + $scope.isModalStreamPaused = true; + var element = angular.element(document.getElementById("monitorimage")); 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() { + NVRDataModel.killLiveStream($scope.connKey, $scope.controlURL); + + // we should now have a paused stream, time to animate out + + + + var dirn = d; + if (dirn == 1) { + slideout = "animated slideOutLeft"; + slidein = "animated slideInRight"; + } else { + slideout = "animated slideOutRight"; + slidein = "animated slideInLeft"; + } + + + element.addClass(slideout) + .one('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend', outWithOld); + }); + + - 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"); + NVRDataModel.log(">>>Old image out"); + // 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.controlURL = $scope.monitor.Monitor.controlURL; $scope.zoneArray = []; $scope.circlePoints = []; - getZones(); + // getZones(); configurePTZ($scope.monitorId); }, 200); } @@ -877,24 +900,15 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$ function inWithNew() { element.removeClass(slidein); - $scope.animationInProgress = false; + + $scope.isModalStreamPaused = 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); - } - + $scope.connKey = (Math.floor((Math.random() * 999999) + 1)).toString(); // get new key for new id + $scope.animationInProgress = false; // has to be AFTER new connkey + NVRDataModel.log("<<<New image loaded in with ck:"+$scope.connKey); } $ionicLoading.hide(); @@ -1114,6 +1128,36 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$ } } + + $scope.constructSingleStream = function() { + + + var stream; + stream = $scope.monitor.Monitor.streamingURL + + "/nph-zms?mode="+getSingleStreamMode() + + "&monitor="+$scope.monitorId + + "&scale="+$scope.quality + + $rootScope.authSession + + "&rand="+$rootScope.modalRand + + appendSingleStreamConnKey(); + + //console.log ("STREAM="+stream); + + return stream; + + + }; + + + function getSingleStreamMode() { + return $scope.isModalStreamPaused ? 'single': 'jpeg'; + } + +function appendSingleStreamConnKey() { + return $scope.isModalStreamPaused ? "": "&connkey="+$scope.connKey; + + } + //------------------------------------------------------------- //reloaads mon - do we need it? //------------------------------------------------------------- @@ -1170,11 +1214,21 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$ $scope.$on('modal.removed', function () { + as(); // dregister auth success $scope.isModalActive = false; - NVRDataModel.debug("Single monitor exited, killing stream"); - NVRDataModel.killStream($scope.connKey); + if (1 || $rootScope.platformOS != 'ios') { + + // ios calls window stop... + NVRDataModel.debug("Single monitor exited killing stream"); + NVRDataModel.killLiveStream($scope.connKey, $scope.controlURL); + } + else { + + NVRDataModel.debug("Webkit hack, hammering window.stop();"); + NVRDataModel.stopNetwork(); + } //console.log("**MODAL REMOVED: Stopping modal timer"); $interval.cancel(intervalModalHandle); @@ -1572,6 +1626,13 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$ } $scope.$on('modal.shown', function () { + + + if (0 && $rootScope.platformOS == 'ios') { + NVRDataModel.debug("Webkit hack, hammering window.stop();"); + NVRDataModel.stopNetwork(); + } + $scope.connKey = (Math.floor((Math.random() * 999999) + 1)).toString(); $scope.monStatus = ""; $scope.isToggleListMenu = true; @@ -1590,7 +1651,7 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$ $scope.showZones = false; - getZones(); + //getZones(); var ld = NVRDataModel.getLogin(); //currentEvent = $scope.currentEvent; diff --git a/www/js/MontageCtrl.js b/www/js/MontageCtrl.js index 9cf5e77d..f8ff4b01 100644 --- a/www/js/MontageCtrl.js +++ b/www/js/MontageCtrl.js @@ -1,4 +1,3 @@ - // Controller for the montage view /* jshint -W041 */ @@ -6,8 +5,7 @@ /* global cordova,StatusBar,angular,console,ionic,Packery, Draggabilly, imagesLoaded, ConnectSDK, moment */ angular.module('zmApp.controllers') -.controller('zmApp.MontageCtrl', ['$scope', '$rootScope', 'NVRDataModel', 'message', '$ionicSideMenuDelegate', '$timeout', '$interval', '$ionicModal', '$ionicLoading', '$http', '$state', '$ionicPopup', '$stateParams', '$ionicHistory', '$ionicScrollDelegate', '$ionicPlatform', 'zm', '$ionicPopover', '$controller', 'imageLoadingDataShare', '$window', '$localstorage', '$translate', 'SecuredPopups', 'EventServer', function($scope, $rootScope, NVRDataModel, message, $ionicSideMenuDelegate, $timeout, $interval, $ionicModal, $ionicLoading, $http, $state, $ionicPopup, $stateParams, $ionicHistory, $ionicScrollDelegate, $ionicPlatform, zm, $ionicPopover, $controller, imageLoadingDataShare, $window, $localstorage, $translate, SecuredPopups, EventServer) -{ + .controller('zmApp.MontageCtrl', ['$scope', '$rootScope', 'NVRDataModel', '$ionicSideMenuDelegate', '$timeout', '$interval', '$ionicModal', '$ionicLoading', '$http', '$state', '$ionicPopup', '$stateParams', '$ionicHistory', '$ionicScrollDelegate', '$ionicPlatform', 'zm', '$ionicPopover', '$controller', 'imageLoadingDataShare', '$window', '$localstorage', '$translate', 'SecuredPopups', 'EventServer', function ($scope, $rootScope, NVRDataModel, $ionicSideMenuDelegate, $timeout, $interval, $ionicModal, $ionicLoading, $http, $state, $ionicPopup, $stateParams, $ionicHistory, $ionicScrollDelegate, $ionicPlatform, zm, $ionicPopover, $controller, imageLoadingDataShare, $window, $localstorage, $translate, SecuredPopups, EventServer) { //--------------------------------------------------------------------- // Controller main @@ -28,72 +26,91 @@ angular.module('zmApp.controllers') var ld; var refreshSec; var reloadPage = zm.forceMontageReloadDelay; + var viewCleaned = false; + var randToAvoidCacheMem; + + + var areStreamsStopped = true; // first load snapshot + $scope.isModalStreamPaused = false; // used in Monitor Modal + //var reloadPage = 30; - var simulStreaming = 0; // will be 1 if you multiport + var simulStreaming = false; // will be true if you multiport var broadcastHandles = []; + var as = $scope.$on("auth-success", function () { - var as = $rootScope.$on("auth-success", function () { - NVRDataModel.debug("Montage Re-auth handler"); - //console.log ("RETAUTH"); - // NVRDataModel.stopNetwork(); - - }); - broadcastHandles.push(as); + if ($scope.singleMonitorModalOpen) { + NVRDataModel.debug("Montage: Not creating streams, as modal is open"); + return; + } + + + NVRDataModel.debug("Montage Re-auth handler"); + + areStreamsStopped = true; + $timeout(function () { // after render + if (simulStreaming) { + NVRDataModel.debug("Re-creating all stream connkeys in montage ..."); + NVRDataModel.regenConnKeys(); + $scope.monitors = NVRDataModel.getMonitorsNow(); + $scope.MontageMonitors = angular.copy($scope.monitors); + $timeout(function () // after render + { + initPackery(); + }, zm.packeryTimer); + + + } + }); + broadcastHandles.push(as); + //console.log (">>>>>>>>>>>>>>>>>>>>>>>>>>>AS="+as); + }); //-------------------------------------------------------------------------------------- // Handles bandwidth change, if required // //-------------------------------------------------------------------------------------- - var bc = $rootScope.$on("bandwidth-change", function(e, data) - { - // not called for offline, I'm only interested in BW switches - NVRDataModel.debug("Got network change:" + data); - var ds; - if (data == 'lowbw') - { - ds = $translate.instant('kLowBWDisplay'); - } - else - { - ds = $translate.instant('kHighBWDisplay'); - } - NVRDataModel.displayBanner('net', [ds]); - var ld = NVRDataModel.getLogin(); - refreshSec = (NVRDataModel.getBandwidth() == 'lowbw') ? ld.refreshSecLowBW : ld.refreshSec; - - $interval.cancel(intervalHandleMontage); - $interval.cancel(intervalHandleMontageCycle); - $interval.cancel(intervalHandleReloadPage); - - - intervalHandleMontage = $interval(function() - { - loadNotifications(); - }.bind(this), refreshSec * 1000); + var bc = $scope.$on("bandwidth-change", function (e, data) { + // not called for offline, I'm only interested in BW switches + NVRDataModel.debug("Got network change:" + data); + var ds; + if (data == 'lowbw') { + ds = $translate.instant('kLowBWDisplay'); + } else { + ds = $translate.instant('kHighBWDisplay'); + } + NVRDataModel.displayBanner('net', [ds]); + var ld = NVRDataModel.getLogin(); + refreshSec = (NVRDataModel.getBandwidth() == 'lowbw') ? ld.refreshSecLowBW : ld.refreshSec; + + $interval.cancel(intervalHandleMontage); + $interval.cancel(intervalHandleMontageCycle); + $interval.cancel(intervalHandleReloadPage); + + + intervalHandleMontage = $interval(function () { + loadNotifications(); + }.bind(this), refreshSec * 1000); - intervalHandleMontageCycle = $interval(function() - { - cycleMontageProfiles(); - }.bind(this), NVRDataModel.getLogin().cycleMontageInterval* 1000); + intervalHandleMontageCycle = $interval(function () { + cycleMontageProfiles(); + }.bind(this), NVRDataModel.getLogin().cycleMontageInterval * 1000); - intervalHandleReloadPage = $interval(function() - { - forceReloadPage(); - }.bind(this), reloadPage * 1000); + intervalHandleReloadPage = $interval(function () { + forceReloadPage(); + }.bind(this), reloadPage); - if (NVRDataModel.getBandwidth() == 'lowbw') - { - NVRDataModel.debug("Enabling low bandwidth parameters"); - $scope.LoginData.montageQuality = zm.montageQualityLowBW; - $scope.LoginData.singleImageQuality = zm.eventSingleImageQualityLowBW; - $scope.LoginData.montageHistoryQuality = zm.montageQualityLowBW; + if (NVRDataModel.getBandwidth() == 'lowbw') { + NVRDataModel.debug("Enabling low bandwidth parameters"); + $scope.LoginData.montageQuality = zm.montageQualityLowBW; + $scope.LoginData.singleImageQuality = zm.eventSingleImageQualityLowBW; + $scope.LoginData.montageHistoryQuality = zm.montageQualityLowBW; - } + } }); broadcastHandles.push(bc); @@ -103,32 +120,24 @@ angular.module('zmApp.controllers') // close the modal // -------------------------------------------------------- - $ionicPlatform.registerBackButtonAction(function(e) - { - e.preventDefault(); - if ($scope.modal != undefined && $scope.modal.isShown()) - { - // switch off awake, as liveview is finished - NVRDataModel.debug("Modal is open, closing it"); - NVRDataModel.setAwake(false); - $scope.isModalActive = false; - cleanupOnClose(); - } - else - { - NVRDataModel.debug("Modal is closed, so toggling or exiting"); - if (!$ionicSideMenuDelegate.isOpenLeft()) - { - $ionicSideMenuDelegate.toggleLeft(); - - } - else - { - navigator.app.exitApp(); - } + $ionicPlatform.registerBackButtonAction(function (e) { + e.preventDefault(); + if ($scope.modal != undefined && $scope.modal.isShown()) { + // switch off awake, as liveview is finished + NVRDataModel.debug("Modal is open, closing it"); + NVRDataModel.setAwake(false); + cleanupOnCloseModal(); + } else { + NVRDataModel.debug("Modal is closed, so toggling or exiting"); + if (!$ionicSideMenuDelegate.isOpenLeft()) { + $ionicSideMenuDelegate.toggleLeft(); + } else { + navigator.app.exitApp(); } + } + }, 1000); /*$scope.toggleHide = function(mon) @@ -146,322 +155,298 @@ angular.module('zmApp.controllers') function forceReloadPage() { - if ($scope.isDragabillyOn) - { - NVRDataModel.debug ("not cycling, edit in progress"); - return; + if ($scope.isDragabillyOn) { + NVRDataModel.debug("not reloading, edit in progress"); + return; - } + } - var ld = NVRDataModel.getLogin(); - ld.reloadInMontage = true; - NVRDataModel.log ("Reloading view to keep memory in check..."); - NVRDataModel.setLogin(ld) - .then (function() { - //window.location.reload(true); - //location.reload(); - //$ionicHistory.clearCache(); - //$state.go('app.montage'); - - /*$ionicHistory.clearCache([$state.current.name]).then(function() { - $state.go('app.montage', $stateParams, {reload:true, inherit:false}); - });*/ - $ionicHistory.nextViewOptions({ - disableAnimate: true, - disableBack: true - }); - - $state.go('app.refresh', - { - "view": 'app.montage' - }); - + var ld = NVRDataModel.getLogin(); + ld.reloadInMontage = true; + NVRDataModel.log("Reloading view to keep memory in check..."); + NVRDataModel.setLogin(ld) + .then(function () { + //window.location.reload(true); + //location.reload(); + //$ionicHistory.clearCache(); + //$state.go('app.montage'); - /* $state.transitionTo($state.current, $stateParams, { - reload: true, - inherit: false, - notify: true + /*$ionicHistory.clearCache([$state.current.name]).then(function() { + $state.go('app.montage', $stateParams, {reload:true, inherit:false}); });*/ - - }); - - - - - - /*$ionicHistory.nextViewOptions( - { + $ionicHistory.nextViewOptions({ disableAnimate: true, disableBack: true + }); + + $state.go('app.refresh', { + "view": 'app.montage' + }); + + + /* $state.transitionTo($state.current, $stateParams, { + reload: true, + inherit: false, + notify: true + });*/ + }); - $state.go("app.montage", - { - minimal: $scope.minimal, - isRefresh: true - });*/ + + + + + + /*$ionicHistory.nextViewOptions( + { + disableAnimate: true, + disableBack: true + }); + $state.go("app.montage", + { + minimal: $scope.minimal, + isRefresh: true + });*/ } // called by afterEnter to load Packery - function initPackery() - { + function initPackery() { - /* $ionicLoading.show( - { - template: $translate.instant('kArrangingImages'), - noBackdrop: true, - duration: zm.loadingTimeout - });*/ + /* $ionicLoading.show( + { + template: $translate.instant('kArrangingImages'), + noBackdrop: true, + duration: zm.loadingTimeout + });*/ + areStreamsStopped = true; - $scope.areImagesLoading = true; - var progressCalled = false; - draggies = []; - var layouttype = true; - var ld = NVRDataModel.getLogin(); + $scope.areImagesLoading = true; + var progressCalled = false; + draggies = []; + var layouttype = true; + var ld = NVRDataModel.getLogin(); - var positionsStr = ld.packeryPositions; - var positions = {}; + var positionsStr = ld.packeryPositions; + var positions = {}; - if (positionsStr == '' || positionsStr == undefined) - { - NVRDataModel.log("Did NOT find a packery layout"); - layouttype = true; - } - else - { + if (positionsStr == '' || positionsStr == undefined) { + NVRDataModel.log("Did NOT find a packery layout"); + layouttype = true; + } else { - //console.log ("POSITION STR IS " + positionsStr); - positions = JSON.parse(positionsStr); - NVRDataModel.log("found a packery layout"); + //console.log ("POSITION STR IS " + positionsStr); + positions = JSON.parse(positionsStr); + NVRDataModel.log("found a packery layout"); - layouttype = false; - } + layouttype = false; + } - var cnt = 0; - $scope.MontageMonitors.forEach(function(elem) - { - if ((elem.Monitor.Enabled != '0') && (elem.Monitor.Function != 'None') ) - cnt++; - }); + var cnt = 0; + $scope.MontageMonitors.forEach(function (elem) { + if ((elem.Monitor.Enabled != '0') && (elem.Monitor.Function != 'None')) + cnt++; + }); - NVRDataModel.log("Monitors that are active and not DOM hidden: " + cnt + " while grid has " + positions.length); + NVRDataModel.log("Monitors that are active and not DOM hidden: " + cnt + " while grid has " + positions.length); - if (cnt > NVRDataModel.getLogin().maxMontage) - { - cnt = NVRDataModel.getLogin().maxMontage; - NVRDataModel.log("restricting monitor count to " + cnt + " due to max-montage setting"); - } + if (cnt > NVRDataModel.getLogin().maxMontage) { + cnt = NVRDataModel.getLogin().maxMontage; + NVRDataModel.log("restricting monitor count to " + cnt + " due to max-montage setting"); + } - if (cnt != positions.length) - { + if (cnt != positions.length) { - NVRDataModel.log("Whoops!! Monitors have changed. I'm resetting layouts, sorry!"); - layouttype = true; - positions = {}; - } + NVRDataModel.log("Whoops!! Monitors have changed. I'm resetting layouts, sorry!"); + layouttype = true; + positions = {}; + } - var elem = angular.element(document.getElementById("mygrid")); + var elem = angular.element(document.getElementById("mygrid")); - //console.log ("**** mygrid is " + JSON.stringify(elem)); + //console.log ("**** mygrid is " + JSON.stringify(elem)); - if (pckry) pckry.destroy(); + if (pckry) pckry.destroy(); - pckry = new Packery('.grid', - { - itemSelector: '.grid-item', - percentPosition: true, - columnWidth: '.grid-sizer', - gutter: 0, - initLayout: layouttype, - shiftPercentResize: true + pckry = new Packery('.grid', { + itemSelector: '.grid-item', + percentPosition: true, + columnWidth: '.grid-sizer', + gutter: 0, + initLayout: layouttype, + shiftPercentResize: true - }); + }); - imagesLoaded(elem).on('progress', function(instance, img) - { + imagesLoaded(elem).on('progress', function (instance, img) { - var result = img.isLoaded ? 'loaded' : 'broken'; - // NVRDataModel.debug('~~loaded image is ' + result + ' for ' + img.img.src); + var result = img.isLoaded ? 'loaded' : 'broken'; + // NVRDataModel.debug('~~loaded image is ' + result + ' for ' + img.img.src); - // lay out every image if a pre-arranged position has not been found + // lay out every image if a pre-arranged position has not been found - $timeout(function() - { - if (layouttype) pckry.layout(); - }, 100); + $timeout(function () { + if (layouttype) pckry.layout(); + }, 100); - progressCalled = true; + progressCalled = true; - // if (layouttype) $timeout (function(){layout(pckry);},100); - }); + // if (layouttype) $timeout (function(){layout(pckry);},100); + }); - imagesLoaded(elem).on('always', function() - { - //console.log ("******** ALL IMAGES LOADED"); - // $scope.$digest(); - NVRDataModel.debug("All images loaded"); + imagesLoaded(elem).on('always', function () { + //console.log ("******** ALL IMAGES LOADED"); + // $scope.$digest(); + NVRDataModel.debug("All images loaded, switching to streaming if applicable"); - $scope.areImagesLoading = false; + $scope.areImagesLoading = false; + areStreamsStopped = false; - $ionicLoading.hide(); + $ionicLoading.hide(); - if (!progressCalled) - { - NVRDataModel.log("*** PROGRESS WAS NOT CALLED"); - // pckry.reloadItems(); - } + if (!progressCalled) { + NVRDataModel.log("*** PROGRESS WAS NOT CALLED"); + // pckry.reloadItems(); + } - $timeout(function() - { + $timeout(function () { - pckry.getItemElements().forEach(function(itemElem) - { + pckry.getItemElements().forEach(function (itemElem) { - draggie = new Draggabilly(itemElem); - pckry.bindDraggabillyEvents(draggie); - draggies.push(draggie); - draggie.disable(); - draggie.unbindHandles(); - }); + draggie = new Draggabilly(itemElem); + pckry.bindDraggabillyEvents(draggie); + draggies.push(draggie); + draggie.disable(); + draggie.unbindHandles(); + }); - pckry.on('dragItemPositioned', itemDragged); + pckry.on('dragItemPositioned', itemDragged); - if (!isEmpty(positions)) - { - NVRDataModel.log("Arranging as per packery grid"); + if (!isEmpty(positions)) { + NVRDataModel.log("Arranging as per packery grid"); - for (var i = 0; i < $scope.MontageMonitors.length; i++) - { - for (var j = 0; j < positions.length; j++) - { - if ($scope.MontageMonitors[i].Monitor.Id == positions[j].attr) - { - if (isNaN(positions[j].size)) positions[j].size=20; - $scope.MontageMonitors[i].Monitor.gridScale = positions[j].size; - $scope.MontageMonitors[i].Monitor.listDisplay = positions[j].display; - // NVRDataModel.debug("Setting monitor ID: " + $scope.MontageMonitors[i].Monitor.Id + " to size: " + positions[j].size + " and display:" + positions[j].display); - } - //console.log ("Index:"+positions[j].attr+ " with size: " + positions[j].size); - } - } + for (var i = 0; i < $scope.MontageMonitors.length; i++) { + for (var j = 0; j < positions.length; j++) { + if ($scope.MontageMonitors[i].Monitor.Id == positions[j].attr) { + if (isNaN(positions[j].size)) positions[j].size = 20; + $scope.MontageMonitors[i].Monitor.gridScale = positions[j].size; + $scope.MontageMonitors[i].Monitor.listDisplay = positions[j].display; + // NVRDataModel.debug("Setting monitor ID: " + $scope.MontageMonitors[i].Monitor.Id + " to size: " + positions[j].size + " and display:" + positions[j].display); + } + //console.log ("Index:"+positions[j].attr+ " with size: " + positions[j].size); + } + } - NVRDataModel.debug("All images loaded, doing image layout"); + NVRDataModel.debug("All images loaded, doing image layout"); - } - $timeout(function() - { - //NVRDataModel.log("Force calling resize"); - ///pckry.reloadItems(); - ///positions is defined only if layouttype was false - // console.log (">>> Positions is "+ JSON.stringify(positions)); - if (!layouttype) pckry.initShiftLayout(positions, "data-item-id"); - // now do a jiggle - $timeout(function() - { - NVRDataModel.debug("doing the jiggle and dance..."); - pckry.resize(true); - }, 300); - - }, 100); - - //pckry.onresize(); - - }, 20); + } + $timeout(function () { + //NVRDataModel.log("Force calling resize"); + ///pckry.reloadItems(); + ///positions is defined only if layouttype was false + // console.log (">>> Positions is "+ JSON.stringify(positions)); + if (!layouttype) pckry.initShiftLayout(positions, "data-item-id"); + // now do a jiggle + $timeout(function () { + NVRDataModel.debug("doing the jiggle and dance..."); + pckry.resize(true); + }, 300); - }); + }, 100); - function itemDragged(item) - { - NVRDataModel.debug("drag complete"); - $timeout (function(){pckry.shiftLayout();},20); + //pckry.onresize(); - pckry.once ('layoutComplete', function() { + }, 20); - var positions = pckry.getShiftPositions('data-item-id'); - //console.log ("POSITIONS MAP " + JSON.stringify(positions)); - var ld = NVRDataModel.getLogin(); - ld.packeryPositions = JSON.stringify(positions); - // console.log ("Saving " + ld.packeryPositions); - // console.log ("FULL OBJECT "+ JSON.stringify(ld)); - ld.currentMontageProfile = ""; - $scope.currentProfileName = $translate.instant ('kMontage'); - NVRDataModel.setLogin(ld); - NVRDataModel.debug("saved new positions"); - }); + }); - //pckry.getItemElements().forEach(function (itemElem) { + function itemDragged(item) { + NVRDataModel.debug("drag complete"); + $timeout(function () { + pckry.shiftLayout(); + }, 20); - //console.log (itemElem.attributes['data-item-id'].value+" size "+itemElem.attributes['data-item-size'].value ); - // }); + pckry.once('layoutComplete', function () { + + var positions = pckry.getShiftPositions('data-item-id'); + //console.log ("POSITIONS MAP " + JSON.stringify(positions)); + var ld = NVRDataModel.getLogin(); + ld.packeryPositions = JSON.stringify(positions); + // console.log ("Saving " + ld.packeryPositions); + // console.log ("FULL OBJECT "+ JSON.stringify(ld)); + ld.currentMontageProfile = ""; + $scope.currentProfileName = $translate.instant('kMontage'); + NVRDataModel.setLogin(ld); + NVRDataModel.debug("saved new positions"); + }); + + //pckry.getItemElements().forEach(function (itemElem) { + + //console.log (itemElem.attributes['data-item-id'].value+" size "+itemElem.attributes['data-item-size'].value ); + // }); - - } + + } } - function isEmpty(obj) - { - for (var prop in obj) - { - return false; - } - return true; + function isEmpty(obj) { + for (var prop in obj) { + return false; + } + return true; } //----------------------------------------------------------------------- // color for monitor state in montage //----------------------------------------------------------------------- - $scope.stateColor = function() - { - //console.log ("***MONSTATUS**"+$scope.monStatus+"**"); - var attr = ""; - switch ($scope.monStatus) - { - case "": - attr = "color:rgba(0, 0, 0, 0)"; - break; - case "idle": - attr = "color:rgba(0, 0, 0, 0)"; - break; - case "pre-alarm": - attr = "color:#e67e22"; - break; - case "alarmed": - attr = "color:#D91E18"; - break; - case "alert": - attr = "color:#e67e22"; - break; - case "record": - attr = "color:#26A65B"; - break; - } + $scope.stateColor = function () { + //console.log ("***MONSTATUS**"+$scope.monStatus+"**"); + var attr = ""; + switch ($scope.monStatus) { + case "": + attr = "color:rgba(0, 0, 0, 0)"; + break; + case "idle": + attr = "color:rgba(0, 0, 0, 0)"; + break; + case "pre-alarm": + attr = "color:#e67e22"; + break; + case "alarmed": + attr = "color:#D91E18"; + break; + case "alert": + attr = "color:#e67e22"; + break; + case "record": + attr = "color:#26A65B"; + break; + } - return attr; + return attr; }; - function findNext (key,obj) - { + function findNext(key, obj) { - // console.log (" key is: "+ key); - // console.log ("array is " + JSON.stringify (obj)); - var keys = Object.keys(obj); + // console.log (" key is: "+ key); + // console.log ("array is " + JSON.stringify (obj)); + var keys = Object.keys(obj); - var len = keys.length; - var curindex = keys.indexOf(key); - var modulus = (curindex + 1) % len; + var len = keys.length; + var curindex = keys.indexOf(key); + var modulus = (curindex + 1) % len; - //console.log ("*********** len="+len+" curr="+curindex+" next="+modulus); + //console.log ("*********** len="+len+" curr="+curindex+" next="+modulus); - //console.log ("Keys array "+ JSON.stringify(keys)); + //console.log ("Keys array "+ JSON.stringify(keys)); - //console.log ("Current index: "+ keys.indexOf(key) ); - //console.log ("returning index of " + (keys.indexOf(key) + 1) % (keys.length)); + //console.log ("Current index: "+ keys.indexOf(key) ); + //console.log ("returning index of " + (keys.indexOf(key) + 1) % (keys.length)); // console.log ("keys length is "+ keys.length); - return keys[modulus]; + return keys[modulus]; /* var size = Object.keys(obj).length; var i; @@ -472,131 +457,116 @@ angular.module('zmApp.controllers') } i = (i + 1) % size; return Object.keys(obj)[i];*/ - + } //---------------------------------------------- // cycle profiles //----------------------------------------------- - function cycleMontageProfiles() - { + function cycleMontageProfiles() { - var ld = NVRDataModel.getLogin(); + var ld = NVRDataModel.getLogin(); - if (!ld.cycleMontageProfiles) - { - // NVRDataModel.debug ("cycling disabled"); - return; + if (!ld.cycleMontageProfiles) { + // NVRDataModel.debug ("cycling disabled"); + return; - } + } - if ($scope.reOrderActive) - { - NVRDataModel.debug ("not cycling, re-order in progress"); - return; - } + if ($scope.reOrderActive) { + NVRDataModel.debug("not cycling, re-order in progress"); + return; + } - if ($scope.isDragabillyOn) - { - NVRDataModel.debug ("not cycling, edit in progress"); - return; + if ($scope.isDragabillyOn) { + NVRDataModel.debug("not cycling, edit in progress"); + return; - } - - var nextProfile = findNext(ld.currentMontageProfile, ld.packeryPositionsArray); + } - if (nextProfile == ld.currentMontageProfile) - { - NVRDataModel.debug ("Not cycling profiles, looks like you only have one"); - } - else - { - NVRDataModel.debug ("Cycling profile from: "+ld.currentMontageProfile+" to:"+nextProfile); - switchMontageProfile(nextProfile); + var nextProfile = findNext(ld.currentMontageProfile, ld.packeryPositionsArray); + + if (nextProfile == ld.currentMontageProfile) { + NVRDataModel.debug("Not cycling profiles, looks like you only have one"); + } else { + NVRDataModel.debug("Cycling profile from: " + ld.currentMontageProfile + " to:" + nextProfile); + switchMontageProfile(nextProfile); + + } - } - } //----------------------------------------------------------------------- // cycle through all displayed monitors and check alarm status //----------------------------------------------------------------------- - function loadAlarmStatus() - { + function loadAlarmStatus() { - if ((NVRDataModel.versionCompare($rootScope.apiVersion, "1.30") == -1) || - (NVRDataModel.getBandwidth() == 'lowbw') || - (NVRDataModel.getLogin().disableAlarmCheckMontage == true)) - { - - return; - } + if ((NVRDataModel.versionCompare($rootScope.apiVersion, "1.30") == -1) || + (NVRDataModel.getBandwidth() == 'lowbw') || + (NVRDataModel.getLogin().disableAlarmCheckMontage == true)) { - for (var i = 0; i < $scope.MontageMonitors.length; i++) - { - if (($scope.MontageMonitors[i].Monitor.Function == 'None') || - ($scope.MontageMonitors[i].Monitor.Enabled == '0') || - ($scope.MontageMonitors[i].Monitor.listDisplay == 'noshow')) - { - continue; - } - getAlarmStatus($scope.MontageMonitors[i]); + return; + } + for (var i = 0; i < $scope.MontageMonitors.length; i++) { + if (($scope.MontageMonitors[i].Monitor.Function == 'None') || + ($scope.MontageMonitors[i].Monitor.Enabled == '0') || + ($scope.MontageMonitors[i].Monitor.listDisplay == 'noshow')) { + continue; } + getAlarmStatus($scope.MontageMonitors[i]); + + } } //----------------------------------------------------------------------- // get alarm status over HTTP for a single monitor //----------------------------------------------------------------------- - function getAlarmStatus(monitor) - { - var apiurl = NVRDataModel.getLogin().apiurl; - //console.log ("ALARM CALLED WITH " +JSON.stringify(monitor)); - - var alarmurl = apiurl + "/monitors/alarm/id:" + monitor.Monitor.Id + "/command:status.json"; - // console.log("Alarm Check: Invoking " + alarmurl); - - $http.get(alarmurl) - .then(function(data) - { - // NVRDataModel.debug ("Success in monitor alarmed status " + JSON.stringify(data)); - - var sid = parseInt(data.data.status); - switch (sid) - { - case 0: // idle - monitor.Monitor.alarmState = 'color:rgba(0,0,0,0);'; - break; - case 1: // pre alarm - monitor.Monitor.alarmState = 'color:#e67e22;'; - break; - case 2: // alarm - monitor.Monitor.alarmState = 'color:#D91E18;'; - break; - case 3: // alert - monitor.Monitor.alarmState = 'color:#e67e22;'; - break; - case 4: - monitor.Monitor.alarmState = 'color:#26A65B;'; - break; - - } - - }, - function(error) - { - - monitor.Monitor.alarmState = 'color:rgba(0,0,0,0);'; - NVRDataModel.debug("Error in monitor alarmed status "); - }); + function getAlarmStatus(monitor) { + var apiurl = NVRDataModel.getLogin().apiurl; + //console.log ("ALARM CALLED WITH " +JSON.stringify(monitor)); + + var alarmurl = apiurl + "/monitors/alarm/id:" + monitor.Monitor.Id + "/command:status.json"; + // console.log("Alarm Check: Invoking " + alarmurl); + + $http.get(alarmurl) + .then(function (data) { + // NVRDataModel.debug ("Success in monitor alarmed status " + JSON.stringify(data)); + + var sid = parseInt(data.data.status); + switch (sid) { + case 0: // idle + monitor.Monitor.alarmState = 'color:rgba(0,0,0,0);'; + break; + case 1: // pre alarm + monitor.Monitor.alarmState = 'color:#e67e22;'; + break; + case 2: // alarm + monitor.Monitor.alarmState = 'color:#D91E18;'; + break; + case 3: // alert + monitor.Monitor.alarmState = 'color:#e67e22;'; + break; + case 4: + monitor.Monitor.alarmState = 'color:#26A65B;'; + break; + + } + + }, + function (error) { + + monitor.Monitor.alarmState = 'color:rgba(0,0,0,0);'; + NVRDataModel.debug("Error in monitor alarmed status "); + }); } function randEachTime() { - $scope.randToAvoidCacheMem = new Date().getTime(); + randToAvoidCacheMem = new Date().getTime(); //$scope.randToAvoidCacheMem = "1"; //console.log ("Generating:"+$scope.randToAvoidCacheMem); } @@ -605,160 +575,143 @@ angular.module('zmApp.controllers') // re-compute rand so snapshot in montage reloads //----------------------------------------------------------------------- - function loadNotifications() - { - if (simulStreaming=='1') { - // console.log ("Skipping timer as simulStreaming"); - return; - } + function loadNotifications() { + if (simulStreaming) { + // console.log ("Skipping timer as simulStreaming"); + return; + } - randEachTime(); - //console.log ($scope.randToAvoidCacheMem); + randEachTime(); + //console.log ($scope.randToAvoidCacheMem); - if ($scope.areImagesLoading) - { - NVRDataModel.debug("skipping image refresh, packery is still loading"); - return; - } + if ($scope.areImagesLoading) { + NVRDataModel.debug("skipping image refresh, packery is still loading"); + return; + } - //if (pckry && !$scope.isDragabillyOn) pckry.shiftLayout(); - $rootScope.rand = Math.floor((Math.random() * 100000) + 1); + //if (pckry && !$scope.isDragabillyOn) pckry.shiftLayout(); + $rootScope.rand = Math.floor((Math.random() * 100000) + 1); - // if you see the time move, montage should move + // if you see the time move, montage should move - if ($scope.iconTimeNow == 'local') - $scope.timeNow = moment().format(NVRDataModel.getTimeFormatSec()); - else - $scope.timeNow = moment().tz(NVRDataModel.getTimeZoneNow()).format(NVRDataModel.getTimeFormatSec()); - //$scope.timeNow = moment().format(NVRDataModel.getTimeFormatSec()); + if ($scope.iconTimeNow == 'local') + $scope.timeNow = moment().format(NVRDataModel.getTimeFormatSec()); + else + $scope.timeNow = moment().tz(NVRDataModel.getTimeZoneNow()).format(NVRDataModel.getTimeFormatSec()); + //$scope.timeNow = moment().format(NVRDataModel.getTimeFormatSec()); - //console.log ("Inside Montage timer..."); + //console.log ("Inside Montage timer..."); } - $scope.cancelReorder = function() - { - $scope.modal.remove(); + $scope.cancelReorder = function () { + $scope.modal.remove(); }; - $scope.saveReorder = function() - { - NVRDataModel.debug("Saving monitor hide/unhide"); + $scope.saveReorder = function () { + NVRDataModel.debug("Saving monitor hide/unhide"); - // redo packery as monitor status has changed - // DOM may need reloading if you've hidden/unhidden stuff - $scope.MontageMonitors = $scope.copyMontage; - $scope.modal.remove(); + // redo packery as monitor status has changed + // DOM may need reloading if you've hidden/unhidden stuff + $scope.MontageMonitors = $scope.copyMontage; + $scope.modal.remove(); - $timeout(function() - { + $timeout(function () { - draggies.forEach(function(drag) - { - drag.destroy(); - }); + draggies.forEach(function (drag) { + drag.destroy(); + }); - pckry.reloadItems(); - draggies = []; - pckry.once('layoutComplete', savePackeryOrder); - pckry.layout(); + pckry.reloadItems(); + draggies = []; + pckry.once('layoutComplete', savePackeryOrder); + pckry.layout(); - }, 400); + }, 400); }; - function savePackeryOrder() - { - $timeout(function() - { - var positions = pckry.getShiftPositions('data-item-id'); - NVRDataModel.debug("POSITIONS MAP " + JSON.stringify(positions)); - var ld = NVRDataModel.getLogin(); - ld.packeryPositions = JSON.stringify(positions); - //console.log ("Savtogging " + ld.packeryPositions); - ld.currentMontageProfile = ""; - $scope.currentProfileName = $translate.instant ('kMontage'); - NVRDataModel.setLogin(ld); - - pckry.getItemElements().forEach(function(itemElem) - { - draggie = new Draggabilly(itemElem); - pckry.bindDraggabillyEvents(draggie); - draggies.push(draggie); - draggie.disable(); - }); + function savePackeryOrder() { + $timeout(function () { + var positions = pckry.getShiftPositions('data-item-id'); + NVRDataModel.debug("POSITIONS MAP " + JSON.stringify(positions)); + var ld = NVRDataModel.getLogin(); + ld.packeryPositions = JSON.stringify(positions); + //console.log ("Savtogging " + ld.packeryPositions); + ld.currentMontageProfile = ""; + $scope.currentProfileName = $translate.instant('kMontage'); + NVRDataModel.setLogin(ld); - $ionicScrollDelegate.$getByHandle("montage-delegate").scrollTop(); + pckry.getItemElements().forEach(function (itemElem) { + draggie = new Draggabilly(itemElem); + pckry.bindDraggabillyEvents(draggie); + draggies.push(draggie); + draggie.disable(); + }); - // Now also ask DataModel to update its monitor display status - NVRDataModel.reloadMonitorDisplayStatus(); - //$scope.MontageMonitors = angular.copy(NVRDataModel.getMonitorsNow()); - //$scope.MontageMonitors = NVRDataModel.getMonitorsNow(); - pckry.layout(); - }, 20); - } + $ionicScrollDelegate.$getByHandle("montage-delegate").scrollTop(); - $scope.getCycleStatus = function() - { - var c = NVRDataModel.getLogin().cycleMontageProfiles; - var str = (c) ? $translate.instant('kOn'):$translate.instant('kOff'); - return str; + // Now also ask DataModel to update its monitor display status + NVRDataModel.reloadMonitorDisplayStatus(); + //$scope.MontageMonitors = angular.copy(NVRDataModel.getMonitorsNow()); + //$scope.MontageMonitors = NVRDataModel.getMonitorsNow(); + pckry.layout(); + }, 20); + } + + $scope.getCycleStatus = function () { + var c = NVRDataModel.getLogin().cycleMontageProfiles; + var str = (c) ? $translate.instant('kOn') : $translate.instant('kOff'); + return str; }; - $scope.toggleCycle = function() - { - var ld = NVRDataModel.getLogin(); - ld.cycleMontageProfiles = !ld.cycleMontageProfiles; - NVRDataModel.setLogin(ld); - NVRDataModel.debug ("cycle="+ld.cycleMontageProfiles); - NVRDataModel.debug ("cycle interval="+ld.cycleMontageInterval); + $scope.toggleCycle = function () { + var ld = NVRDataModel.getLogin(); + ld.cycleMontageProfiles = !ld.cycleMontageProfiles; + NVRDataModel.setLogin(ld); + NVRDataModel.debug("cycle=" + ld.cycleMontageProfiles); + NVRDataModel.debug("cycle interval=" + ld.cycleMontageInterval); }; - $scope.toggleHide = function(i) - { + $scope.toggleHide = function (i) { - if ($scope.copyMontage[i].Monitor.listDisplay == 'show') - $scope.copyMontage[i].Monitor.listDisplay = 'noshow'; - else - $scope.copyMontage[i].Monitor.listDisplay = 'show'; + if ($scope.copyMontage[i].Monitor.listDisplay == 'show') + $scope.copyMontage[i].Monitor.listDisplay = 'noshow'; + else + $scope.copyMontage[i].Monitor.listDisplay = 'show'; - NVRDataModel.debug("index " + i + " is now " + $scope.copyMontage[i].Monitor.listDisplay); + NVRDataModel.debug("index " + i + " is now " + $scope.copyMontage[i].Monitor.listDisplay); }; - $scope.hideUnhide = function() - { - if ($scope.isDragabillyOn) - { - dragToggle(); - } - // make a copy of the current list and work on that - // this is to avoid packery screw ups while you are hiding/unhiding - $scope.copyMontage = angular.copy($scope.MontageMonitors); - $ionicModal.fromTemplateUrl('templates/reorder-modal.html', - { - scope: $scope, - animation: 'slide-in-up', - id:'reorder', - }) - .then(function(modal) - { - $scope.modal = modal; - $scope.reOrderActive = true; - $scope.modal.show(); - }); + $scope.hideUnhide = function () { + if ($scope.isDragabillyOn) { + dragToggle(); + } + // make a copy of the current list and work on that + // this is to avoid packery screw ups while you are hiding/unhiding + $scope.copyMontage = angular.copy($scope.MontageMonitors); + $ionicModal.fromTemplateUrl('templates/reorder-modal.html', { + scope: $scope, + animation: 'slide-in-up', + id: 'reorder', + }) + .then(function (modal) { + $scope.modal = modal; + $scope.reOrderActive = true; + $scope.modal.show(); + }); }; - $scope.$on('modal.removed', function(e, m) - { + $scope.$on('modal.removed', function (e, m) { - if (m.id != 'reorder') - return; - $scope.reOrderActive = false; + if (m.id != 'reorder') + return; + $scope.reOrderActive = false; - //console.log ("************** FOOTAGE CLOSED"); + //console.log ("************** FOOTAGE CLOSED"); }); @@ -773,104 +726,92 @@ angular.module('zmApp.controllers') //---------------------------------------------------------------- // Alarm emit handling //---------------------------------------------------------------- - var al = $rootScope.$on("alarm", function(event, args) - { - // FIXME: I should probably unregister this instead - if (typeof $scope.monitors === undefined) - return; - //console.log ("***EVENT TRAP***"); - var alarmMonitors = args.message; - for (var i = 0; i < alarmMonitors.length; i++) - { - //console.log ("**** TRAPPED EVENT: "+alarmMonitors[i]); - - for (var j = 0; j < $scope.MontageMonitors.length; j++) - { - if ($scope.MontageMonitors[j].Monitor.Id == alarmMonitors[i]) - { - NVRDataModel.debug("Enabling alarm for Monitor:" + $scope.monitors[j].Monitor.Id); - $scope.MontageMonitors[j].Monitor.isAlarmed = true; - scheduleRemoveFlash(j); - } - } + var al = $scope.$on("alarm", function (event, args) { + // FIXME: I should probably unregister this instead + if (typeof $scope.monitors === undefined) + return; + //console.log ("***EVENT TRAP***"); + var alarmMonitors = args.message; + for (var i = 0; i < alarmMonitors.length; i++) { + //console.log ("**** TRAPPED EVENT: "+alarmMonitors[i]); + for (var j = 0; j < $scope.MontageMonitors.length; j++) { + if ($scope.MontageMonitors[j].Monitor.Id == alarmMonitors[i]) { + NVRDataModel.debug("Enabling alarm for Monitor:" + $scope.monitors[j].Monitor.Id); + $scope.MontageMonitors[j].Monitor.isAlarmed = true; + scheduleRemoveFlash(j); + } } + } + }); broadcastHandles.push(al); - function scheduleRemoveFlash(id) - { - NVRDataModel.debug("Scheduled a " + zm.alarmFlashTimer + "ms timer for dis-alarming monitor ID:" + $scope.MontageMonitors[id].Monitor.Id); - $timeout(function() - { - $scope.MontageMonitors[id].Monitor.isAlarmed = false; - NVRDataModel.debug("dis-alarming monitor ID:" + $scope.MontageMonitors[id].Monitor.Id); - }, zm.alarmFlashTimer); + function scheduleRemoveFlash(id) { + NVRDataModel.debug("Scheduled a " + zm.alarmFlashTimer + "ms timer for dis-alarming monitor ID:" + $scope.MontageMonitors[id].Monitor.Id); + $timeout(function () { + $scope.MontageMonitors[id].Monitor.isAlarmed = false; + NVRDataModel.debug("dis-alarming monitor ID:" + $scope.MontageMonitors[id].Monitor.Id); + }, zm.alarmFlashTimer); } //---------------------------------------------------------------- // Alarm notification handling //---------------------------------------------------------------- - $scope.handleAlarms = function() - { - $rootScope.isAlarm = !$rootScope.isAlarm; - if (!$rootScope.isAlarm) - // if (1) - { - $rootScope.alarmCount = "0"; - $ionicHistory.nextViewOptions( - { - disableBack: true - }); - $state.go("app.events", - { - "id": 0, - "playEvent": false - }/*, - { - reload: true - }*/); - return; - } + $scope.handleAlarms = function () { + $rootScope.isAlarm = !$rootScope.isAlarm; + if (!$rootScope.isAlarm) + // if (1) + { + $rootScope.alarmCount = "0"; + $ionicHistory.nextViewOptions({ + disableBack: true + }); + $state.go("app.events", { + "id": 0, + "playEvent": false + } + /*, + { + reload: true + }*/ + ); + return; + } }; - $scope.handleAlarmsWhileMinimized = function() - { - $rootScope.isAlarm = !$rootScope.isAlarm; + $scope.handleAlarmsWhileMinimized = function () { + $rootScope.isAlarm = !$rootScope.isAlarm; - $scope.minimal = !$scope.minimal; - var ld = NVRDataModel.getLogin(); - ld.isFullScreen = $scope.minimal; - NVRDataModel.setLogin(ld); + $scope.minimal = !$scope.minimal; + var ld = NVRDataModel.getLogin(); + ld.isFullScreen = $scope.minimal; + NVRDataModel.setLogin(ld); - NVRDataModel.debug("MontageCtrl: switch minimal is " + $scope.minimal); - ionic.Platform.fullScreen($scope.minimal, !$scope.minimal); - //console.log ("alarms:Cancelling timer"); - $interval.cancel(intervalHandleMontage); - $interval.cancel(intervalHandleMontageCycle); - $interval.cancel(intervalHandleAlarmStatus); - $interval.cancel(intervalHandleReloadPage); - + NVRDataModel.debug("MontageCtrl: switch minimal is " + $scope.minimal); + ionic.Platform.fullScreen($scope.minimal, !$scope.minimal); + //console.log ("alarms:Cancelling timer"); + $interval.cancel(intervalHandleMontage); + $interval.cancel(intervalHandleMontageCycle); + $interval.cancel(intervalHandleAlarmStatus); + $interval.cancel(intervalHandleReloadPage); - if (!$rootScope.isAlarm) - { - $rootScope.alarmCount = "0"; - $ionicHistory.nextViewOptions( - { - disableBack: true - }); - $state.go("app.events", - { - "id": 0, - "playEvent": false - }, - { - reload: true - }); - return; - } + + if (!$rootScope.isAlarm) { + $rootScope.alarmCount = "0"; + $ionicHistory.nextViewOptions({ + disableBack: true + }); + $state.go("app.events", { + "id": 0, + "playEvent": false + }, { + reload: true + }); + return; + } }; //------------------------------------------------------------- @@ -879,411 +820,384 @@ angular.module('zmApp.controllers') // for example //------------------------------------------------------------- - $scope.isBackground = function() - { - //console.log ("Is background called from Montage and returned " + - //NVRDataModel.isBackground()); - return NVRDataModel.isBackground(); + $scope.isBackground = function () { + //console.log ("Is background called from Montage and returned " + + //NVRDataModel.isBackground()); + return NVRDataModel.isBackground(); }; //--------------------------------------------------------------------- // Triggered when you enter/exit full screen //--------------------------------------------------------------------- - $scope.switchMinimal = function() - { - $scope.minimal = !$scope.minimal; - NVRDataModel.debug("MontageCtrl: switch minimal is " + $scope.minimal); - // console.log("Hide Statusbar"); - ionic.Platform.fullScreen($scope.minimal, !$scope.minimal); - //console.log ("minimal switch:Cancelling timer"); - $interval.cancel(intervalHandleMontage); //we will renew on reload - $interval.cancel(intervalHandleMontageCycle); - $interval.cancel(intervalHandleAlarmStatus); - $interval.cancel(intervalHandleReloadPage); - - var ld = NVRDataModel.getLogin(); - ld.isFullScreen = $scope.minimal; - NVRDataModel.setLogin(ld); - - - // We are reloading this view, so we don't want entry animations - $ionicHistory.nextViewOptions( - { - disableAnimate: true, - disableBack: true - }); - $state.go("app.montage", - { - minimal: $scope.minimal, - isRefresh: true - }); - return; + $scope.switchMinimal = function () { + $scope.minimal = !$scope.minimal; + NVRDataModel.debug("MontageCtrl: switch minimal is " + $scope.minimal); + // console.log("Hide Statusbar"); + ionic.Platform.fullScreen($scope.minimal, !$scope.minimal); + //console.log ("minimal switch:Cancelling timer"); + $interval.cancel(intervalHandleMontage); //we will renew on reload + $interval.cancel(intervalHandleMontageCycle); + $interval.cancel(intervalHandleAlarmStatus); + $interval.cancel(intervalHandleReloadPage); + + var ld = NVRDataModel.getLogin(); + ld.isFullScreen = $scope.minimal; + NVRDataModel.setLogin(ld); + + + // We are reloading this view, so we don't want entry animations + $ionicHistory.nextViewOptions({ + disableAnimate: true, + disableBack: true + }); + $state.go("app.montage", { + minimal: $scope.minimal, + isRefresh: true + }); + return; }; //--------------------------------------------------------------------- // Show/Hide PTZ control in monitor view //--------------------------------------------------------------------- - $scope.togglePTZ = function() - { - $scope.showPTZ = !$scope.showPTZ; + $scope.togglePTZ = function () { + $scope.showPTZ = !$scope.showPTZ; }; - function getIndex (mid) - { - var ndx = 0; - for (var i=0; i< $scope.MontageMonitors.length; i++) - { - if ($scope.MontageMonitors[i].Monitor.Id == mid) - { - ndx = i; - break; - } + function getIndex(mid) { + var ndx = 0; + for (var i = 0; i < $scope.MontageMonitors.length; i++) { + if ($scope.MontageMonitors[i].Monitor.Id == mid) { + ndx = i; + break; } - return ndx; + } + return ndx; } - $scope.toggleStamp = function () - { - if (!$scope.isDragabillyOn) return; - var found = false; - + $scope.toggleStamp = function () { + if (!$scope.isDragabillyOn) return; + var found = false; - for (var i=0; i< $scope.MontageMonitors.length; i++) - { - if ($scope.MontageMonitors[i].Monitor.selectStyle == 'dragborder-selected') - { - - findPackeryElement(i); - } + + for (var i = 0; i < $scope.MontageMonitors.length; i++) { + if ($scope.MontageMonitors[i].Monitor.selectStyle == 'dragborder-selected') { + + findPackeryElement(i); } + } - function findPackeryElement(i) - { - pckry.getItemElements().forEach(function(elem) - { + function findPackeryElement(i) { + pckry.getItemElements().forEach(function (elem) { - var id = elem.getAttribute("data-item-id"); - if (id == $scope.MontageMonitors[i].Monitor.Id) - { - if ($scope.MontageMonitors[i].Monitor.isStamp) - pckry.unstamp(elem); - else - pckry.stamp(elem); + var id = elem.getAttribute("data-item-id"); + if (id == $scope.MontageMonitors[i].Monitor.Id) { + if ($scope.MontageMonitors[i].Monitor.isStamp) + pckry.unstamp(elem); + else + pckry.stamp(elem); - $scope.MontageMonitors[i].Monitor.isStamp = !$scope.MontageMonitors[i].Monitor.isStamp; - NVRDataModel.debug ("Stamp for "+$scope.MontageMonitors[i].Monitor.Name + " is:"+$scope.MontageMonitors[i].Monitor.isStamp ); - //break; + $scope.MontageMonitors[i].Monitor.isStamp = !$scope.MontageMonitors[i].Monitor.isStamp; + NVRDataModel.debug("Stamp for " + $scope.MontageMonitors[i].Monitor.Name + " is:" + $scope.MontageMonitors[i].Monitor.isStamp); + //break; - } - }); - } + } + }); + } }; - $scope.hideMonitor = function (mid) - { - if (!$scope.isDragabillyOn) return; - var found = false; - for (var i=0; i< $scope.MontageMonitors.length; i++) - { - if ($scope.MontageMonitors[i].Monitor.selectStyle == 'dragborder-selected') - { - $scope.MontageMonitors[i].Monitor.listDisplay = 'noshow'; - $scope.MontageMonitors[i].Monitor.selectStyle = ""; - found = true; - } + $scope.hideMonitor = function (mid) { + if (!$scope.isDragabillyOn) return; + var found = false; + for (var i = 0; i < $scope.MontageMonitors.length; i++) { + if ($scope.MontageMonitors[i].Monitor.selectStyle == 'dragborder-selected') { + $scope.MontageMonitors[i].Monitor.listDisplay = 'noshow'; + $scope.MontageMonitors[i].Monitor.selectStyle = ""; + found = true; + } + + } + if (found) { + pckry.once('layoutComplete', saveUpdatedLayout); + $timeout(function () { + pckry.shiftLayout(); + }, 300); + } + + function saveUpdatedLayout() { + $timeout(function () { + var positions = pckry.getShiftPositions('data-item-id'); + // console.log("SAVING"); + var ld = NVRDataModel.getLogin(); + + ld.packeryPositions = JSON.stringify(positions); + //console.log ("Saving " + ld.packeryPositions); + ld.currentMontageProfile = ""; + $scope.currentProfileName = $translate.instant('kMontage'); + NVRDataModel.setLogin(ld); + $ionicLoading.hide(); + //$scope.sliderChanging = false; + }, 20); + } - } - if (found) - { - pckry.once ('layoutComplete', saveUpdatedLayout); - $timeout (function() {pckry.shiftLayout();},300); - } - - function saveUpdatedLayout() - { - $timeout(function() - { - var positions = pckry.getShiftPositions('data-item-id'); - // console.log("SAVING"); - var ld = NVRDataModel.getLogin(); - - ld.packeryPositions = JSON.stringify(positions); - //console.log ("Saving " + ld.packeryPositions); - ld.currentMontageProfile = ""; - $scope.currentProfileName = $translate.instant ('kMontage'); - NVRDataModel.setLogin(ld); - $ionicLoading.hide(); - //$scope.sliderChanging = false; - }, 20); - } - }; - $scope.toggleSelectItem = function(mid) - { - var ndx = getIndex(mid); - //console.log ("TOGGLE DETECTED AT INDEX:"+ndx+" NAME="+$scope.MontageMonitors[ndx].Monitor.Name); - if ($scope.MontageMonitors[ndx].Monitor.selectStyle !== "undefined" && $scope.MontageMonitors[ndx].Monitor.selectStyle == "dragborder-selected") - { - $scope.MontageMonitors[ndx].Monitor.selectStyle = ""; - } - else - { - $scope.MontageMonitors[ndx].Monitor.selectStyle = "dragborder-selected"; - } - //console.log ("Switched value to " + $scope.MontageMonitors[ndx] .Monitor.selectStyle); + $scope.toggleSelectItem = function (mid) { + var ndx = getIndex(mid); + //console.log ("TOGGLE DETECTED AT INDEX:"+ndx+" NAME="+$scope.MontageMonitors[ndx].Monitor.Name); + if ($scope.MontageMonitors[ndx].Monitor.selectStyle !== "undefined" && $scope.MontageMonitors[ndx].Monitor.selectStyle == "dragborder-selected") { + $scope.MontageMonitors[ndx].Monitor.selectStyle = ""; + } else { + $scope.MontageMonitors[ndx].Monitor.selectStyle = "dragborder-selected"; + } + //console.log ("Switched value to " + $scope.MontageMonitors[ndx] .Monitor.selectStyle); }; //--------------------------------------------------------------------- // Called when you enable/disable dragging //--------------------------------------------------------------------- - $scope.dragToggle = function() - { - dragToggle(); + $scope.dragToggle = function () { + dragToggle(); }; - function dragToggle() - { - var i; - $scope.isDragabillyOn = !$scope.isDragabillyOn; - - for ( i = 0; i < $scope.MontageMonitors.length; i++) - { - $scope.MontageMonitors[i].Monitor.isStamp = false; - } - - $ionicSideMenuDelegate.canDragContent($scope.isDragabillyOn ? false : true); - - //$timeout(function(){pckry.reloadItems();},10); - NVRDataModel.debug("setting dragabilly to " + $scope.isDragabillyOn); - if ($scope.isDragabillyOn) - { - $scope.toggleSubMenu = true; - - $scope.dragBorder = "dragborder"; - NVRDataModel.debug("Enabling drag for " + draggies.length + " items"); - for (i = 0; i < draggies.length; i++) - { - draggies[i].enable(); - draggies[i].bindHandles(); - } - - // reflow and reload as some may be hidden - // $timeout(function(){pckry.reloadItems();$timeout(function(){pckry.layout();},300);},100); - } - else - { - $scope.dragBorder = ""; - NVRDataModel.debug("Disabling drag for " + draggies.length + " items"); - for (i = 0; i < draggies.length; i++) - { - draggies[i].disable(); - draggies[i].unbindHandles(); - } - for (i = 0; i < $scope.MontageMonitors.length; i++) - { - $scope.MontageMonitors[i].Monitor.selectStyle = ""; - } - // reflow and reload as some may be hidden - $timeout(function() - { - $timeout(function() - { - var positions = pckry.getShiftPositions('data-item-id'); - //console.log ("POSITIONS MAP " + JSON.stringify(positions)); - var ld = NVRDataModel.getLogin(); - ld.packeryPositions = JSON.stringify(positions); - //console.log ("Saving " + ld.packeryPositions); - ld.currentMontageProfile = ""; - $scope.currentProfileName =$translate.instant ('kMontage'); - NVRDataModel.setLogin(ld); - }, 300); - }, 100); + function dragToggle() { + var i; + $scope.isDragabillyOn = !$scope.isDragabillyOn; + + for (i = 0; i < $scope.MontageMonitors.length; i++) { + $scope.MontageMonitors[i].Monitor.isStamp = false; + } + + $ionicSideMenuDelegate.canDragContent($scope.isDragabillyOn ? false : true); + + //$timeout(function(){pckry.reloadItems();},10); + NVRDataModel.debug("setting dragabilly to " + $scope.isDragabillyOn); + if ($scope.isDragabillyOn) { + $scope.toggleSubMenu = true; + + $scope.dragBorder = "dragborder"; + NVRDataModel.debug("Enabling drag for " + draggies.length + " items"); + for (i = 0; i < draggies.length; i++) { + draggies[i].enable(); + draggies[i].bindHandles(); + } + + // reflow and reload as some may be hidden + // $timeout(function(){pckry.reloadItems();$timeout(function(){pckry.layout();},300);},100); + } else { + $scope.dragBorder = ""; + NVRDataModel.debug("Disabling drag for " + draggies.length + " items"); + for (i = 0; i < draggies.length; i++) { + draggies[i].disable(); + draggies[i].unbindHandles(); + } + for (i = 0; i < $scope.MontageMonitors.length; i++) { + $scope.MontageMonitors[i].Monitor.selectStyle = ""; + } + // reflow and reload as some may be hidden + $timeout(function () { + $timeout(function () { + var positions = pckry.getShiftPositions('data-item-id'); + //console.log ("POSITIONS MAP " + JSON.stringify(positions)); + var ld = NVRDataModel.getLogin(); + ld.packeryPositions = JSON.stringify(positions); + //console.log ("Saving " + ld.packeryPositions); + ld.currentMontageProfile = ""; + $scope.currentProfileName = $translate.instant('kMontage'); + NVRDataModel.setLogin(ld); + }, 300); + }, 100); - } + } } //--------------------------------------------------------------------- // main monitor modal open - if drag is not on, this is called on touch //--------------------------------------------------------------------- - $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); + $scope.openModal = function (mid, controllable, controlid, connKey, monitor) { + + areStreamsStopped = true; + $scope.isModalStreamPaused = true; // we stop montage and start modal stream in snapshot first + $timeout(function () { // after render + + + if (simulStreaming) { + NVRDataModel.debug("Killing all streams in montage to save memory/nw..."); + + if ($rootScope.platformOS == 'ios') { + + } else { + for (var i = 0; i < $scope.MontageMonitors.length; i++) { + NVRDataModel.killLiveStream($scope.MontageMonitors[i].Monitor.connKey, $scope.MontageMonitors[i].Monitor.controlURL, $scope.MontageMonitors[i].Monitor.Name); } + } } - - openModal(mid, controllable, controlid, connKey, monitor); + }); + + + $scope.controlURL = monitor.Monitor.controlURL; + openModal(mid, controllable, controlid, connKey, monitor); + - }; - function 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 - // in montage view - - NVRDataModel.log("Cancelling montage timer, opening Modal"); - // NVRDataModel.log("Starting Modal timer"); - //console.log ("openModal:Cancelling timer"); - $interval.cancel(intervalHandleMontage); - $interval.cancel(intervalHandleMontageCycle); - $interval.cancel(intervalHandleAlarmStatus); - $interval.cancel(intervalHandleReloadPage); - + $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 + // in montage view - $scope.monitor = monitor; - $scope.showPTZ = false; - $scope.monitorId = mid; - $scope.monitorName = NVRDataModel.getMonitorName(mid); - $scope.controlid = controlid; + NVRDataModel.log("Cancelling montage timer, opening Modal"); + // NVRDataModel.log("Starting Modal timer"); + //console.log ("openModal:Cancelling timer"); + $interval.cancel(intervalHandleMontage); + $interval.cancel(intervalHandleMontageCycle); + $interval.cancel(intervalHandleAlarmStatus); + $interval.cancel(intervalHandleReloadPage); - //$scope.LoginData = NVRDataModel.getLogin(); - $rootScope.modalRand = Math.floor(Math.random() * (999999 - 111111 + 1)) + 111111; - $scope.ptzMoveCommand = ""; - $scope.ptzStopCommand = ""; + $scope.monitor = monitor; + $scope.showPTZ = false; + $scope.monitorId = mid; + $scope.monitorName = NVRDataModel.getMonitorName(mid); + $scope.controlid = controlid; - $scope.zoomInCommand = ""; - $scope.zoomOutCommand = ""; - $scope.zoomStopCommand = "zoomStop"; - $scope.canZoom = false; + //$scope.LoginData = NVRDataModel.getLogin(); + $rootScope.modalRand = Math.floor(Math.random() * (999999 - 111111 + 1)) + 111111; - $scope.presetOn = false; - $scope.isControllable = controllable; - $scope.refMonitor = monitor; + $scope.ptzMoveCommand = ""; + $scope.ptzStopCommand = ""; - // This is a modal to show the monitor footage - // We need to switch to always awake if set so the feed doesn't get interrupted - NVRDataModel.setAwake(NVRDataModel.getKeepAwake()); + $scope.zoomInCommand = ""; + $scope.zoomOutCommand = ""; + $scope.zoomStopCommand = "zoomStop"; + $scope.canZoom = false; - // This is a modal to show the monitor footage - $ionicModal.fromTemplateUrl('templates/monitors-modal.html', - { - scope: $scope, - animation: 'slide-in-up', - id: 'monitorsmodal' + $scope.presetOn = false; + $scope.isControllable = controllable; + $scope.refMonitor = monitor; - }) - .then(function(modal) - { - $scope.modal = modal; + // This is a modal to show the monitor footage + // We need to switch to always awake if set so the feed doesn't get interrupted + NVRDataModel.setAwake(NVRDataModel.getKeepAwake()); - $ionicLoading.show( - { - template: $translate.instant('kPleaseWait'), - noBackdrop: true, - duration: zm.loadingTimeout - }); + // This is a modal to show the monitor footage + $ionicModal.fromTemplateUrl('templates/monitors-modal.html', { + scope: $scope, + animation: 'slide-in-up', + id: 'monitorsmodal' + + }) + .then(function (modal) { + $scope.modal = modal; + + /* $ionicLoading.show( + { + template: $translate.instant('kPleaseWait'), + noBackdrop: true, + duration: zm.loadingTimeout + });*/ - // we don't really need this as we have stopped the timer - // $scope.isModalActive = true; + // we don't really need this as we have stopped the timer + // $scope.isModalActive = true; - //$timeout (function() {pckry.shiftLayout();},zm.packeryTimer); - $scope.modal.show(); + //$timeout (function() {pckry.shiftLayout();},zm.packeryTimer); + $scope.modal.show(); - }); + }); } //--------------------------------------------------------------------- - // + // This is ONLY called when we exit modal to montage //--------------------------------------------------------------------- - function cleanupOnClose() - { - - // single connkey is removed in monitorModal + function cleanupOnCloseModal() { - 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(); - // we did the montage, so redo flow - $timeout (function() {initPackery();},zm.packeryTimer); + NVRDataModel.log("Restarting montage timers..."); + var ld = NVRDataModel.getLogin(); + // console.log ("closeModal: Cancelling timer"); + $interval.cancel(intervalHandleMontage); + $interval.cancel(intervalHandleAlarmStatus); + $interval.cancel(intervalHandleMontageCycle); + $interval.cancel(intervalHandleReloadPage); - /* $timeout(function() - { - NVRDataModel.log("MontageCtrl:Stopping network pull..."); - if (NVRDataModel.isForceNetworkStop()) NVRDataModel.stopNetwork(); - }, 50);*/ + intervalHandleMontage = $interval(function () { + loadNotifications(); + // console.log ("Refreshing Image..."); + }.bind(this), refreshSec * 1000); + intervalHandleAlarmStatus = $interval(function () { + loadAlarmStatus(); + // console.log ("Refreshing Image..."); + }.bind(this), zm.alarmStatusTime); + intervalHandleMontageCycle = $interval(function () { + cycleMontageProfiles(); + // console.log ("Refreshing Image..."); + }.bind(this), 5000); - $rootScope.rand = Math.floor((Math.random() * 100000) + 1); - $scope.isModalActive = false; + intervalHandleReloadPage = $interval(function () { + forceReloadPage(); + }.bind(this), reloadPage); - NVRDataModel.log("Restarting montage timer, closing Modal..."); - var ld = NVRDataModel.getLogin(); - // console.log ("closeModal: Cancelling timer"); - $interval.cancel(intervalHandleMontage); - $interval.cancel(intervalHandleAlarmStatus); - $interval.cancel(intervalHandleMontageCycle); - $interval.cancel(intervalHandleReloadPage); - - intervalHandleMontage = $interval(function() - { - loadNotifications(); - // console.log ("Refreshing Image..."); - }.bind(this), refreshSec * 1000); + $scope.isModalStreamPaused = true; + // let modal go to snapshot mode in render + $timeout(function () { + $scope.modal.remove(); + }); - intervalHandleAlarmStatus = $interval(function() - { - loadAlarmStatus(); - // console.log ("Refreshing Image..."); - }.bind(this), 5000); + // We now need to regen connkeys + // once regenerated + if (simulStreaming) { - intervalHandleMontageCycle = $interval(function() - { - cycleMontageProfiles(); - // console.log ("Refreshing Image..."); - }.bind(this), 5000); + NVRDataModel.debug("Re-creating all stream connkeys in montage ..."); + NVRDataModel.regenConnKeys(); + $scope.monitors = NVRDataModel.getMonitorsNow(); + $scope.MontageMonitors = angular.copy($scope.monitors); + } + + // we need to do this as we hide the view for snapshot as well + //areStreamsStopped = false; + $timeout(function () // after render + { + initPackery(); + }, zm.packeryTimer); + + } + - intervalHandleReloadPage = $interval(function() - { - forceReloadPage(); - }.bind(this), reloadPage * 1000); - + // for some reason, double tap calls this twice + $scope.closeModal = function () { + NVRDataModel.debug("MontageCtrl: Close & Destroy Monitor Modal"); + + if ($scope.singleMonitorModalOpen) { + $scope.singleMonitorModalOpen = false; - // $timeout (function() {pckry.shiftLayout();},zm.packeryTimer); + cleanupOnCloseModal(); - } + } else { + NVRDataModel.debug("Ignoring double-invocation"); + } - $scope.closeModal = function() - { - 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 + // $scope.isModalActive = false; + // Note: no need to setAwake(false) as needs to be awake + // in montage view }; @@ -1294,786 +1208,765 @@ angular.module('zmApp.controllers') // refreshes to the server for images we are not seeing //--------------------------------------------------------------------- - function onPause() - { - NVRDataModel.debug("MontageCtrl: onpause called"); - $interval.cancel(intervalHandleMontage); - $interval.cancel(intervalHandleMontageCycle); - $interval.cancel(intervalHandleAlarmStatus); - $interval.cancel(intervalHandleReloadPage); - - NVRDataModel.debug ("Deregistering broadcast handles"); - for (var i=0; i < broadcastHandles.length; i++) { - broadcastHandles[i](); - } - broadcastHandles = []; - - // 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 (i=0; i < $scope.MontageMonitors.length; i++) { - NVRDataModel.killStream($scope.MontageMonitors[i].Monitor.connKey); + + function viewCleanup() { + + if (viewCleaned) { + NVRDataModel.debug("Montage View Cleanup was already done, skipping"); + return; + } + viewCleaned = true; + $interval.cancel(intervalHandleMontage); + $interval.cancel(intervalHandleMontageCycle); + $interval.cancel(intervalHandleAlarmStatus); + $interval.cancel(intervalHandleReloadPage); + if (pckry) pckry.destroy(); + + NVRDataModel.debug("Montage: Deregistering broadcast handles"); + for (var i = 0; i < broadcastHandles.length; i++) { + // broadcastHandles[i](); + //console.log ("DEREGISTER "+broadcastHandles[i]); + } + broadcastHandles = []; + + areStreamsStopped = true; + + + + // if modal is open stream gets killed + // inside monitorModal + + $timeout(function () { + if (!$scope.singleMonitorModalOpen && simulStreaming) { + NVRDataModel.debug("Killing all streams in montage to save memory/nw..."); + + if (0 && $rootScope.platformOS == 'ios') { + NVRDataModel.debug("Webkit hack, hammering window.stop();"); + NVRDataModel.stopNetwork(); + } else { + for (i = 0; i < $scope.MontageMonitors.length; i++) { + NVRDataModel.killLiveStream($scope.MontageMonitors[i].Monitor.connKey, $scope.MontageMonitors[i].Monitor.controlURL); + } + } + + } - // $interval.cancel(modalIntervalHandle); - // FIXME: Do I need to setAwake(false) here? + }); + + + } - function onResume() - { + function onPause() { + NVRDataModel.debug("MontageCtrl: onpause called"); + viewCleanup(); + } - NVRDataModel.debug ("Montage resume called, regenerating all connkeys"); - NVRDataModel.regenConnKeys(); - $scope.MontageMonitors = NVRDataModel.getMonitorsNow(); + function onResume() { + + // we should be going to portal login so no need here + //NVRDataModel.debug ("Montage resume called, regenerating all connkeys"); + //NVRDataModel.regenConnKeys(); + // $scope.MontageMonitors = NVRDataModel.getMonitorsNow(); } - $scope.openMenu = function() - { - $timeout(function() - { - $rootScope.stateofSlide = $ionicSideMenuDelegate.isOpen(); - }, 500); + $scope.openMenu = function () { + $timeout(function () { + $rootScope.stateofSlide = $ionicSideMenuDelegate.isOpen(); + }, 500); - $ionicSideMenuDelegate.toggleLeft(); + $ionicSideMenuDelegate.toggleLeft(); }; - $scope.$on('$destroy', function() { - }); + $scope.$on('$destroy', function () {}); - $scope.$on('$ionicView.loaded', function() - { - // console.log("**VIEW ** Montage Ctrl Loaded"); + $scope.$on('$ionicView.loaded', function () { + // console.log("**VIEW ** Montage Ctrl Loaded"); }); - $scope.$on('$ionicView.leave', function() - { - // console.log("**VIEW ** Montage Ctrl Left, force removing modal"); - if ($scope.modal) $scope.modal.remove(); + $scope.$on('$ionicView.leave', function () { + // console.log("**VIEW ** Montage Ctrl Left, force removing modal"); + if ($scope.modal) $scope.modal.remove(); }); - function orientationChanged() - { - + function orientationChanged() { + } // remove a saved montage profile - $scope.deleteMontageProfile = function() - { - var posArray; + $scope.deleteMontageProfile = function () { + var posArray; - try - { - posArray = NVRDataModel.getLogin().packeryPositionsArray; - //console.log ("PA="+JSON.stringify(posArray)); + try { + posArray = NVRDataModel.getLogin().packeryPositionsArray; + //console.log ("PA="+JSON.stringify(posArray)); - } - catch (e) - { - NVRDataModel.debug("error parsing packery array positions"); - posArray = {}; - } + } catch (e) { + NVRDataModel.debug("error parsing packery array positions"); + posArray = {}; + } - //console.log ("posArray="+JSON.stringify(posArray)); + //console.log ("posArray="+JSON.stringify(posArray)); - $scope.listdata = []; - for (var key in posArray) - { - if (posArray.hasOwnProperty(key)) - { - $scope.listdata.push(key); - } + $scope.listdata = []; + for (var key in posArray) { + if (posArray.hasOwnProperty(key)) { + $scope.listdata.push(key); } + } - if (!$scope.listdata.length) - { + if (!$scope.listdata.length) { + + $rootScope.zmPopup = $ionicPopup.alert({ + title: $translate.instant('kError'), + template: $translate.instant('kMontageNoSavedProfiles'), + okText: $translate.instant('kButtonOk'), + cancelText: $translate.instant('kButtonCancel'), + }); + return; + } + + $scope.data = { + 'selectedVal': '' + }; + + $rootScope.zmPopup = SecuredPopups.show('confirm', { + template: '<ion-list> ' + + ' <ion-radio-fix ng-repeat="item in listdata" ng-value="item" ng-model="data.selectedVal"> ' + + ' {{item}} ' + + ' </ion-item> ' + + '</ion-list> ', + + title: $translate.instant('kSelect'), + subTitle: $translate.instant('kSelectDelete'), + scope: $scope, + okText: $translate.instant('kButtonOk'), + cancelText: $translate.instant('kButtonCancel'), + + }).then(function (res) { + NVRDataModel.debug("Deleting profile: " + $scope.data.selectedVal); + delete posArray[$scope.data.selectedVal]; + var ld = NVRDataModel.getLogin(); + ld.packeryPositionsArray = posArray; + + if (ld.currentMontageProfile == $scope.data.selectedVal) { + ld.currentMontageProfile = ""; + $scope.currentProfileName = $translate.instant('kMontage'); - $rootScope.zmPopup = $ionicPopup.alert( - { - title: $translate.instant('kError'), - template: $translate.instant('kMontageNoSavedProfiles'), - okText: $translate.instant('kButtonOk'), - cancelText: $translate.instant('kButtonCancel'), - }); - return; } - $scope.data = { - 'selectedVal': '' - }; + if ($scope.currentMontageProfile == $scope.data.selectedVal) + $scope.currentProfileName = $translate.instant('kMontage'); - $rootScope.zmPopup = SecuredPopups.show('confirm', - { - template: '<ion-list> ' + - ' <ion-radio-fix ng-repeat="item in listdata" ng-value="item" ng-model="data.selectedVal"> ' + - ' {{item}} ' + - ' </ion-item> ' + - '</ion-list> ', - - title: $translate.instant('kSelect'), - subTitle:$translate.instant('kSelectDelete'), - scope: $scope, - okText: $translate.instant('kButtonOk'), - cancelText: $translate.instant('kButtonCancel'), - - }).then(function(res) - { - NVRDataModel.debug("Deleting profile: " + $scope.data.selectedVal); - delete posArray[$scope.data.selectedVal]; - var ld = NVRDataModel.getLogin(); - ld.packeryPositionsArray = posArray; + NVRDataModel.setLogin(ld); - if (ld.currentMontageProfile == $scope.data.selectedVal) - { - ld.currentMontageProfile = ""; - $scope.currentProfileName = $translate.instant ('kMontage'); + }); - } + }; - if ($scope.currentMontageProfile == $scope.data.selectedVal) - $scope.currentProfileName = $translate.instant('kMontage'); - NVRDataModel.setLogin(ld); + function switchMontageProfile(mName) { + $interval.cancel(intervalHandleMontageCycle); + intervalHandleMontageCycle = $interval(function () { + cycleMontageProfiles(); + // console.log ("Refreshing Image..."); + }.bind(this), NVRDataModel.getLogin().cycleMontageInterval * 1000); - }); - }; + //console.log ("SELECTED " + $scope.data.selectedVal); + var ld = NVRDataModel.getLogin(); + //console.log ("OLD POS="+ld.packeryPositions); + ld.packeryPositions = ld.packeryPositionsArray[mName]; + ld.currentMontageProfile = mName; + $scope.currentProfileName = mName; + //console.log ("NEW POS="+ld.packeryPositions); + NVRDataModel.setLogin(ld); + //console.log ("SAVING "+ld.packeryPositions.name+ " but "+$scope.data.selectedVal); + //$scope.MontageMonitors = angular.copy(NVRDataModel.getMonitorsNow()); + + + draggies.forEach(function (drag) { + drag.destroy(); + }); + draggies = []; + pckry.destroy(); + NVRDataModel.reloadMonitorDisplayStatus(); + NVRDataModel.regenConnKeys(); + $scope.monitors = NVRDataModel.getMonitorsNow(); + $scope.MontageMonitors = angular.copy($scope.monitors); + $timeout(function () { + initPackery(); + }, zm.packeryTimer); - function switchMontageProfile (mName) - { - $interval.cancel(intervalHandleMontageCycle); - intervalHandleMontageCycle = $interval(function() - { - cycleMontageProfiles(); - // console.log ("Refreshing Image..."); - }.bind(this), NVRDataModel.getLogin().cycleMontageInterval* 1000); - - //console.log ("SELECTED " + $scope.data.selectedVal); - var ld = NVRDataModel.getLogin(); - //console.log ("OLD POS="+ld.packeryPositions); - ld.packeryPositions = ld.packeryPositionsArray[mName]; - ld.currentMontageProfile = mName; - $scope.currentProfileName =mName; - //console.log ("NEW POS="+ld.packeryPositions); - NVRDataModel.setLogin(ld); - //console.log ("SAVING "+ld.packeryPositions.name+ " but "+$scope.data.selectedVal); - - //$scope.MontageMonitors = angular.copy(NVRDataModel.getMonitorsNow()); - - - draggies.forEach(function(drag) - { - drag.destroy(); - }); - draggies = []; - pckry.destroy(); - NVRDataModel.reloadMonitorDisplayStatus(); - NVRDataModel.regenConnKeys(); - $scope.MontageMonitors = NVRDataModel.getMonitorsNow(); - $timeout (function() {initPackery();},zm.packeryTimer); - - } // switch to another montage profile - $scope.switchMontageProfile = function() - { - var posArray; + $scope.switchMontageProfile = function () { + var posArray; - try - { - posArray = NVRDataModel.getLogin().packeryPositionsArray; - //console.log ("PA="+JSON.stringify(posArray)); + try { + posArray = NVRDataModel.getLogin().packeryPositionsArray; + //console.log ("PA="+JSON.stringify(posArray)); - } - catch (e) - { - NVRDataModel.debug("error parsing packery array positions"); - posArray = {}; - } + } catch (e) { + NVRDataModel.debug("error parsing packery array positions"); + posArray = {}; + } - //console.log ("posArray="+JSON.stringify(posArray)); + //console.log ("posArray="+JSON.stringify(posArray)); - $scope.listdata = []; - for (var key in posArray) - { - if (posArray.hasOwnProperty(key)) - { - $scope.listdata.push(key); - } + $scope.listdata = []; + for (var key in posArray) { + if (posArray.hasOwnProperty(key)) { + $scope.listdata.push(key); } - if ($scope.listdata.indexOf($translate.instant('kMontageDefaultProfile')) == -1) - $scope.listdata.push($translate.instant('kMontageDefaultProfile')); + } + if ($scope.listdata.indexOf($translate.instant('kMontageDefaultProfile')) == -1) + $scope.listdata.push($translate.instant('kMontageDefaultProfile')); - if (!$scope.listdata.length) - { - - $rootScope.zmPopup = $ionicPopup.alert( - { - title: $translate.instant('kError'), - template: $translate.instant('kMontageNoSavedProfiles'), - - }); - return; - } + if (!$scope.listdata.length) { - $scope.data = { - 'selectedVal': '' - }; + $rootScope.zmPopup = $ionicPopup.alert({ + title: $translate.instant('kError'), + template: $translate.instant('kMontageNoSavedProfiles'), - $rootScope.zmPopup = SecuredPopups.show('confirm', - { - template: '<ion-list> ' + - ' <ion-radio-fix ng-repeat="item in listdata" ng-value="item" ng-model="data.selectedVal"> ' + - ' {{item}} ' + - ' </ion-item> ' + - '</ion-list> ', - - title: $translate.instant('kSelect'), - subTitle:$translate.instant('kSelectSwitch'), - scope: $scope, - okText: $translate.instant('kButtonOk'), - cancelText: $translate.instant('kButtonCancel'), - - - }).then(function(res) - { - if (res) - { - // destroy cycle timer and redo it - // - switchMontageProfile($scope.data.selectedVal); + }); + return; + } - - //pckry.reloadItems(); - } + $scope.data = { + 'selectedVal': '' + }; - }); + $rootScope.zmPopup = SecuredPopups.show('confirm', { + template: '<ion-list> ' + + ' <ion-radio-fix ng-repeat="item in listdata" ng-value="item" ng-model="data.selectedVal"> ' + + ' {{item}} ' + + ' </ion-item> ' + + '</ion-list> ', - }; + title: $translate.instant('kSelect'), + subTitle: $translate.instant('kSelectSwitch'), + scope: $scope, + okText: $translate.instant('kButtonOk'), + cancelText: $translate.instant('kButtonCancel'), - // save current configuration into a profile - $scope.saveMontageProfile = function() - { - var posArray; + }).then(function (res) { + if (res) { + // destroy cycle timer and redo it + // + switchMontageProfile($scope.data.selectedVal); - try - { - posArray = NVRDataModel.getLogin().packeryPositionsArray; - //console.log ("PA="+JSON.stringify(posArray)); + //pckry.reloadItems(); } - catch (e) - { - NVRDataModel.debug("error parsing packery array positions"); - posArray = {}; - } - $scope.data = { - montageName: "" - }; - $scope.listdata = []; - for (var key in posArray) - { - if (posArray.hasOwnProperty(key)) - { - $scope.listdata.push(key); - } - } - if ($scope.listdata.indexOf($translate.instant('kMontageDefaultProfile')) == -1) - $scope.listdata.push($translate.instant('kMontageDefaultProfile')); + }); + }; - var templ = "<input autocapitalize='none' autocomplete='off' autocorrect='off' type='text' ng-model='data.montageName'>"; + // save current configuration into a profile + $scope.saveMontageProfile = function () { + + var posArray; + + try { + posArray = NVRDataModel.getLogin().packeryPositionsArray; + //console.log ("PA="+JSON.stringify(posArray)); + + } catch (e) { + NVRDataModel.debug("error parsing packery array positions"); + posArray = {}; + } + $scope.data = { + montageName: "" + }; + + $scope.listdata = []; + for (var key in posArray) { + if (posArray.hasOwnProperty(key)) { + $scope.listdata.push(key); + } + } + if ($scope.listdata.indexOf($translate.instant('kMontageDefaultProfile')) == -1) + $scope.listdata.push($translate.instant('kMontageDefaultProfile')); + + + var templ = "<input autocapitalize='none' autocomplete='off' autocorrect='off' type='text' ng-model='data.montageName'>"; + + if ($scope.listdata.length) + templ += '<br/><div class="item item-divider">' + $translate.instant('kMontageSavedProfiles') + '</div>' + + '<ion-list> ' + + ' <ion-radio-fix ng-repeat="item in listdata" ng-value="item" ng-model="data.montageName"> ' + + ' {{item}} ' + + ' </ion-item> ' + + '</ion-list> '; + + + $rootScope.zmPopup = SecuredPopups.show('confirm', { + title: $translate.instant('kMontageSave'), + template: templ, + subTitle: $translate.instant('kMontageSaveSubtitle'), + scope: $scope, + okText: $translate.instant('kButtonOk'), + cancelText: $translate.instant('kButtonCancel'), + + }).then(function (res) { + //console.log(res); + if (res) // ok + { + + var ld = NVRDataModel.getLogin(); + + if ($scope.data.montageName != '') { + // lets allow them to save default + //if ($scope.data.montageName != $translate.instant('kMontageDefaultProfile')) + if (1) { + var getMonPos = pckry.getShiftPositions('data-item-id'); + var unHidden = false; + + // if you are saving to default all monitor profile + // then I will undo any hidden monitors + if ($scope.data.montageName == $translate.instant('kMontageDefaultProfile')) { + for (var p = 0; p < getMonPos.length; p++) { + //console.log ("CHECK"); + if (getMonPos[p].display != 'show') { + getMonPos[p].display = 'show'; + unHidden = true; + } + } + } - if ($scope.listdata.length) - templ += '<br/><div class="item item-divider">'+$translate.instant('kMontageSavedProfiles')+'</div>'+ - '<ion-list> ' + - ' <ion-radio-fix ng-repeat="item in listdata" ng-value="item" ng-model="data.montageName"> ' + - ' {{item}} ' + - ' </ion-item> ' + - '</ion-list> '; + var pos = JSON.stringify(getMonPos); + //console.log ("SAVING POS = "+pos); - $rootScope.zmPopup = SecuredPopups.show('confirm', - { - title: $translate.instant('kMontageSave'), - template: templ, - subTitle: $translate.instant('kMontageSaveSubtitle'), - scope: $scope, - okText: $translate.instant('kButtonOk'), - cancelText: $translate.instant('kButtonCancel'), - - }).then(function(res) - { - //console.log(res); - if (res) // ok - { - - var ld = NVRDataModel.getLogin(); - - if ($scope.data.montageName != '') - { - // lets allow them to save default - //if ($scope.data.montageName != $translate.instant('kMontageDefaultProfile')) - if (1) - { - var getMonPos = pckry.getShiftPositions('data-item-id'); - var unHidden = false; - - // if you are saving to default all monitor profile - // then I will undo any hidden monitors - if ($scope.data.montageName == $translate.instant('kMontageDefaultProfile')) - { - for ( var p=0; p < getMonPos.length; p++) - { - //console.log ("CHECK"); - if (getMonPos[p].display != 'show') - { - getMonPos[p].display = 'show'; - unHidden = true; - } - } - } - - var pos = JSON.stringify(getMonPos); - - //console.log ("SAVING POS = "+pos); - - ld.packeryPositionsArray[$scope.data.montageName] = pos; - NVRDataModel.debug("Saving " + $scope.data.montageName + " with:" + pos); - ld.currentMontageProfile =$scope.data.montageName ; - NVRDataModel.setLogin(ld); - $scope.currentProfileName = $scope.data.montageName; - - if (unHidden) - { - $rootScope.zmPopup = SecuredPopups.show('alert', - { - title: $translate.instant('kNote'), - template: $translate.instant('kMontageSaveDefaultWarning'), - okText: $translate.instant('kButtonOk'), - - }); - switchMontageProfile($translate.instant('kMontageDefaultProfile')); - - - } - - } - - - } + ld.packeryPositionsArray[$scope.data.montageName] = pos; + NVRDataModel.debug("Saving " + $scope.data.montageName + " with:" + pos); + ld.currentMontageProfile = $scope.data.montageName; + NVRDataModel.setLogin(ld); + $scope.currentProfileName = $scope.data.montageName; - } - }); + if (unHidden) { + $rootScope.zmPopup = SecuredPopups.show('alert', { + title: $translate.instant('kNote'), + template: $translate.instant('kMontageSaveDefaultWarning'), + okText: $translate.instant('kButtonOk'), - }; + }); + switchMontageProfile($translate.instant('kMontageDefaultProfile')); - $scope.getMode = function() { + } - // 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() - { + } - $scope.toggleSubMenu = !$scope.toggleSubMenu; + } + }); - NVRDataModel.debug("toggling size buttons:" + $scope.toggleSubMenu); - if ($scope.toggleSubMenu) $ionicScrollDelegate.$getByHandle("montage-delegate").scrollTop(); - var ld = NVRDataModel.getLogin(); - ld.showMontageSubMenu = $scope.toggleSubMenu; - NVRDataModel.setLogin(ld); }; - // minimal has to be beforeEnter or header won't hide - $scope.$on('$ionicView.beforeEnter', function() - { - - $scope.singleMonitorModalOpen = false; - // $scope.minimal = $stateParams.minimal; - var ld = NVRDataModel.getLogin(); - $scope.minimal = ld.isFullScreen; - //console.log ("**************** MINIMAL ENTER " + $scope.minimal); - $scope.zmMarginTop = $scope.minimal ? 0 : 15; + function getMode() { - NVRDataModel.getZmsMultiPortSupport() - .then ( function (data) { - //multiPortZms = data; - simulStreaming = data > 0 ? '1':'0'; - //console.log ("****** MULTIPORT="+multiPortZms); - NVRDataModel.debug ("Multiport="+data); + var mode = (simulStreaming && !areStreamsStopped) ? 'jpeg' : 'single'; + //console.log ("mode="+mode); + return mode; - /* if ($rootScope.platformOS == 'ios') { - simulStreaming = '1'; - NVRDataModel.debug ("IOS detected, force enabling simulStreams"); - } -*/ - if (ld.disableSimulStreaming) { - simulStreaming = '0'; - NVRDataModel.debug ("Forcing simulStreams off as you have disabled it"); + } - } - }, - function (err) { - NVRDataModel.debug("******* SHOULD NEVER HAPPEN - MULTIPORT ERROR"); - simulStreaming = '0'; + // only for testing + $scope.killAllImages = function () { + areStreamsStopped = !areStreamsStopped; // inside timeout, because we need DOM to hide + $timeout(function () { + if (simulStreaming && areStreamsStopped) { + NVRDataModel.debug("Killing all streams in montage to save memory/nw..."); + for (var i = 0; i < $scope.MontageMonitors.length; i++) { + NVRDataModel.killLiveStream($scope.MontageMonitors[i].Monitor.connKey, $scope.MontageMonitors[i].Monitor.controlURL); + } } - ); - }); + }); - //avoid bogus scale error - $scope.LoginData = NVRDataModel.getLogin(); - $scope.toggleTimeType = function() - { - if (NVRDataModel.isTzSupported()) - { - if ($scope.iconTimeNow == 'server') - { - $scope.iconTimeNow = 'local'; - $scope.timeNow = $translate.instant('kPleaseWait'); - } - else - { - $scope.iconTimeNow = 'server'; - $scope.timeNow = $translate.instant('kPleaseWait'); - } - } - else - NVRDataModel.debug("timezone API not supported, can't display"); - }; + if (simulStreaming && !areStreamsStopped) { + NVRDataModel.debug("Re-creating all streams in montage to save memory/nw..."); + NVRDataModel.regenConnKeys(); - $scope.$on('$ionicView.afterEnter', function() - { - NVRDataModel.debug("Setting image mode to snapshot, will change to image when packery is all done"); - $scope.areImagesLoading = true; - $scope.isDragabillyOn = false; - $scope.reOrderActive = false; + $scope.monitors = NVRDataModel.getMonitorsNow(); + $scope.MontageMonitors = angular.copy($scope.monitors); - if (NVRDataModel.isTzSupported()) - $scope.iconTimeNow = 'server'; - else - $scope.iconTimeNow = 'local'; + $timeout(function () { + initPackery(); + }, zm.packeryTimer); - if ($scope.iconTimeNow == 'local') - $scope.timeNow = moment().format(NVRDataModel.getTimeFormatSec()); - else - $scope.timeNow = moment().tz(NVRDataModel.getTimeZoneNow()).format(NVRDataModel.getTimeFormatSec()); - $scope.gridScale = "grid-item-50"; - $scope.LoginData = NVRDataModel.getLogin(); - //FIXME + } - if (NVRDataModel.getBandwidth() == 'lowbw') - { - NVRDataModel.debug("Enabling low bandwidth parameters"); - $scope.LoginData.montageQuality = zm.montageQualityLowBW; - $scope.LoginData.singleImageQuality = zm.eventSingleImageQualityLowBW; - $scope.LoginData.montageHistoryQuality = zm.montageQualityLowBW; - } - $scope.monLimit = $scope.LoginData.maxMontage; - $scope.toggleSubMenu = NVRDataModel.getLogin().showMontageSubMenu; + }; + $scope.constructStream = function (monitor) { + + var stream; + //if (areStreamsStopped) return ""; //getmode doing snapshot now + stream = monitor.Monitor.streamingURL + + "/nph-zms?mode=" + getMode() + + "&monitor=" + monitor.Monitor.Id + + "&scale=" + $scope.LoginData.montageQuality + + $rootScope.authSession + + "&rand=" + randToAvoidCacheMem; + //"&rand="+$scope.randToAvoidCacheMem + + appendConnKey(monitor.Monitor.connKey); + //console.log("STREAM=" + stream); + return stream; - $scope.monitors = message; - $scope.MontageMonitors = angular.copy(message); - $scope.sliderChanging = false; - loginData = NVRDataModel.getLogin(); + }; - $scope.isRefresh = $stateParams.isRefresh; - sizeInProgress = false; - $scope.imageStyle = true; - intervalHandleMontage = ""; - intervalHandleMontageCycle = ""; - $scope.isModalActive = false; - $scope.isReorder = false; + function appendConnKey(ck) { + if (simulStreaming) + return "&connkey=" + ck; + else + return ""; + } - $ionicSideMenuDelegate.canDragContent($scope.minimal ? true : true); + // using connkey in snapshot results in error + $scope.appendConnKey = function (ck) { + if (simulStreaming && !areStreamsStopped) + return "&connkey=" + ck; + else + return ""; + }; - $scope.areImagesLoading = true; - var ld = NVRDataModel.getLogin(); + $scope.toggleSubMenuFunction = function () { - refreshSec = (NVRDataModel.getBandwidth() == 'lowbw') ? ld.refreshSecLowBW : ld.refreshSec; + $scope.toggleSubMenu = !$scope.toggleSubMenu; - NVRDataModel.debug("bandwidth: " + NVRDataModel.getBandwidth() + " montage refresh set to: " + refreshSec); + NVRDataModel.debug("toggling size buttons:" + $scope.toggleSubMenu); + if ($scope.toggleSubMenu) $ionicScrollDelegate.$getByHandle("montage-delegate").scrollTop(); + var ld = NVRDataModel.getLogin(); + ld.showMontageSubMenu = $scope.toggleSubMenu; + NVRDataModel.setLogin(ld); + }; - //console.log("Setting Awake to " + NVRDataModel.getKeepAwake()); - NVRDataModel.setAwake(NVRDataModel.getKeepAwake()); + // minimal has to be beforeEnter or header won't hide + $scope.$on('$ionicView.beforeEnter', function () { + + broadcastHandles = []; + randToAvoidCacheMem = new Date().getTime(); + areStreamsStopped = true; + // NVRDataModel.regenConnKeys(); + $scope.monitors = NVRDataModel.getMonitorsNow(); + $scope.MontageMonitors = angular.copy($scope.monitors); + + for (var ck = 0; ck < $scope.MontageMonitors.length; ck++) { + console.log("Monitor: " + $scope.MontageMonitors[ck].Monitor.Name + " Connkey:" + $scope.MontageMonitors[ck].Monitor.connKey); + } + + $scope.singleMonitorModalOpen = false; + // $scope.minimal = $stateParams.minimal; + var ld = NVRDataModel.getLogin(); + $scope.minimal = ld.isFullScreen; + //console.log ("**************** MINIMAL ENTER " + $scope.minimal); + $scope.zmMarginTop = $scope.minimal ? 0 : 15; + + NVRDataModel.getZmsMultiPortSupport() + .then(function (data) { + //multiPortZms = data; + simulStreaming = data > 0 ? true : false; + //console.log ("****** MULTIPORT="+multiPortZms); + NVRDataModel.debug("Multiport=" + data); - $interval.cancel(intervalHandleMontage); - $interval.cancel(intervalHandleMontageCycle); - $interval.cancel(intervalHandleAlarmStatus); - $interval.cancel(intervalHandleReloadPage); + if ($rootScope.platformOS == 'ios') { + simulStreaming = false; + NVRDataModel.debug ("IOS detected, DISABLING simul streaming"); + } + if (ld.disableSimulStreaming) { + simulStreaming = false; + NVRDataModel.debug("Forcing simulStreams off as you have disabled it"); - intervalHandleMontage = $interval(function() - { - loadNotifications(); - // console.log ("Refreshing Image..."); - }.bind(this), refreshSec * 1000); + } + }, + function (err) { + NVRDataModel.debug("******* SHOULD NEVER HAPPEN - MULTIPORT ERROR"); + simulStreaming = false; - NVRDataModel.debug ("Setting up cycle interval of:"+ NVRDataModel.getLogin().cycleMontageInterval* 1000); - intervalHandleMontageCycle = $interval(function() - { - cycleMontageProfiles(); - // console.log ("Refreshing Image..."); - }.bind(this), NVRDataModel.getLogin().cycleMontageInterval* 1000); + } + ); - intervalHandleAlarmStatus = $interval(function() - { - loadAlarmStatus(); - // console.log ("Refreshing Image..."); - }.bind(this), 5000); + }); - intervalHandleReloadPage = $interval(function() - { - forceReloadPage(); - }.bind(this), reloadPage * 1000); + //avoid bogus scale error + $scope.LoginData = NVRDataModel.getLogin(); - loadNotifications(); + $scope.toggleTimeType = function () { + if (NVRDataModel.isTzSupported()) { + if ($scope.iconTimeNow == 'server') { + $scope.iconTimeNow = 'local'; + $scope.timeNow = $translate.instant('kPleaseWait'); + } else { + $scope.iconTimeNow = 'server'; + $scope.timeNow = $translate.instant('kPleaseWait'); + } + } else + NVRDataModel.debug("timezone API not supported, can't display"); + }; - if ($scope.MontageMonitors.length == 0) - { - $rootScope.zmPopup = $ionicPopup.alert( - { - title: $translate.instant('kNoMonitors'), - template: $translate.instant('kCheckCredentials'), - okText: $translate.instant('kButtonOk'), - cancelText: $translate.instant('kButtonCancel'), - }); - $ionicHistory.nextViewOptions( - { - disableBack: true - }); - $state.go("app.login", - { - "wizard": false - }); - return; - } + $scope.$on('$ionicView.afterEnter', function () { + NVRDataModel.debug("Setting image mode to snapshot, will change to image when packery is all done"); + $scope.areImagesLoading = true; + $scope.isDragabillyOn = false; + $scope.reOrderActive = false; - ld = NVRDataModel.getLogin(); + if (NVRDataModel.isTzSupported()) + $scope.iconTimeNow = 'server'; + else + $scope.iconTimeNow = 'local'; - $rootScope.authSession = "undefined"; - $ionicLoading.show( - { - template: $translate.instant('kNegotiatingStreamAuth'), - animation: 'fade-in', - showBackdrop: true, - duration: zm.loadingTimeout, - maxWidth: 300, - showDelay: 0 - }); + if ($scope.iconTimeNow == 'local') + $scope.timeNow = moment().format(NVRDataModel.getTimeFormatSec()); + else + $scope.timeNow = moment().tz(NVRDataModel.getTimeZoneNow()).format(NVRDataModel.getTimeFormatSec()); - NVRDataModel.log("Inside Montage Ctrl:We found " + $scope.monitors.length + " monitors"); + $scope.gridScale = "grid-item-50"; + $scope.LoginData = NVRDataModel.getLogin(); + //FIXME - // set them all at 50% for packery - for (var i = 0; i < $scope.MontageMonitors.length; i++) - { - $scope.MontageMonitors[i].Monitor.gridScale = "50"; - $scope.MontageMonitors[i].Monitor.selectStyle = ""; - $scope.MontageMonitors[i].Monitor.alarmState = 'color:rgba(0,0,0,0);'; - $scope.MontageMonitors[i].Monitor.isStamp = false; + if (NVRDataModel.getBandwidth() == 'lowbw') { + NVRDataModel.debug("Enabling low bandwidth parameters"); + $scope.LoginData.montageQuality = zm.montageQualityLowBW; + $scope.LoginData.singleImageQuality = zm.eventSingleImageQualityLowBW; + $scope.LoginData.montageHistoryQuality = zm.montageQualityLowBW; - } + } - $rootScope.validMonitorId = $scope.monitors[0].Monitor.Id; - NVRDataModel.getAuthKey($rootScope.validMonitorId, (Math.floor((Math.random() * 999999) + 1)).toString()) - .then(function(success) - { - $ionicLoading.hide(); - //console.log(success); - $rootScope.authSession = success; - NVRDataModel.log("Stream authentication construction: " + - $rootScope.authSession); - $timeout(function() - { - initPackery(); - }, zm.packeryTimer); - - }, - function(error) - { - - $ionicLoading.hide(); - NVRDataModel.debug("MontageCtrl: Error in authkey retrieval " + error); - //$rootScope.authSession=""; - NVRDataModel.log("MontageCtrl: Error returned Stream authentication construction. Retaining old value of: " + $rootScope.authSession); - $timeout(function() - { - initPackery(); - }, zm.packeryTimer); - }); + $scope.monLimit = $scope.LoginData.maxMontage; + $scope.toggleSubMenu = NVRDataModel.getLogin().showMontageSubMenu; - //console.log("**VIEW ** Montage Ctrl AFTER ENTER"); - window.addEventListener("resize", orientationChanged, false); + $scope.sliderChanging = false; + loginData = NVRDataModel.getLogin(); - document.addEventListener("pause", onPause, false); - document.addEventListener("resume", onResume, false); + $scope.isRefresh = $stateParams.isRefresh; + sizeInProgress = false; + $scope.imageStyle = true; + intervalHandleMontage = ""; + intervalHandleMontageCycle = ""; + $scope.isReorder = false; - }); + $ionicSideMenuDelegate.canDragContent($scope.minimal ? true : true); - $scope.$on('$ionicView.beforeLeave', function() - { + $scope.areImagesLoading = true; + var ld = NVRDataModel.getLogin(); - NVRDataModel.debug ("Deregistering broadcast handles"); - for (var i=0; i < broadcastHandles.length; i++) { - broadcastHandles[i](); - } - broadcastHandles = []; + refreshSec = (NVRDataModel.getBandwidth() == 'lowbw') ? ld.refreshSecLowBW : ld.refreshSec; - // console.log("**VIEW ** Montage Ctrl Left, force removing modal"); + NVRDataModel.debug("bandwidth: " + NVRDataModel.getBandwidth() + " montage refresh set to: " + refreshSec); - //console.log ("beforeLeave:Cancelling timer"); - $interval.cancel(intervalHandleMontage); - $interval.cancel(intervalHandleMontageCycle); - $interval.cancel(intervalHandleAlarmStatus); - $interval.cancel(intervalHandleReloadPage); - pckry.destroy(); - window.removeEventListener("resize", orientationChanged, false); + //console.log("Setting Awake to " + NVRDataModel.getKeepAwake()); + NVRDataModel.setAwake(NVRDataModel.getKeepAwake()); - // killing connkeys STILL leaks apache - NVRDataModel.log("MontageCtrl:Stopping network pull..."); - NVRDataModel.stopNetwork(); + $interval.cancel(intervalHandleMontage); + $interval.cancel(intervalHandleMontageCycle); + $interval.cancel(intervalHandleAlarmStatus); + $interval.cancel(intervalHandleReloadPage); - /* 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 + intervalHandleMontage = $interval(function () { + loadNotifications(); + // console.log ("Refreshing Image..."); + }.bind(this), refreshSec * 1000); + + NVRDataModel.debug("Setting up cycle interval of:" + NVRDataModel.getLogin().cycleMontageInterval * 1000); + intervalHandleMontageCycle = $interval(function () { + cycleMontageProfiles(); + // console.log ("Refreshing Image..."); + }.bind(this), NVRDataModel.getLogin().cycleMontageInterval * 1000); + + intervalHandleAlarmStatus = $interval(function () { + loadAlarmStatus(); + // console.log ("Refreshing Image..."); + }.bind(this), zm.alarmStatusTime); + + intervalHandleReloadPage = $interval(function () { + forceReloadPage(); + }.bind(this), reloadPage); + + loadNotifications(); + + if ($scope.MontageMonitors.length == 0) { + $rootScope.zmPopup = $ionicPopup.alert({ + title: $translate.instant('kNoMonitors'), + template: $translate.instant('kCheckCredentials'), + okText: $translate.instant('kButtonOk'), + cancelText: $translate.instant('kButtonCancel'), + }); + $ionicHistory.nextViewOptions({ + disableBack: true + }); + $state.go("app.login", { + "wizard": false + }); + return; + } + + ld = NVRDataModel.getLogin(); + + $rootScope.authSession = "undefined"; + $ionicLoading.show({ + template: $translate.instant('kNegotiatingStreamAuth'), + animation: 'fade-in', + showBackdrop: true, + duration: zm.loadingTimeout, + maxWidth: 300, + showDelay: 0 + }); + + NVRDataModel.log("Inside Montage Ctrl:We found " + $scope.monitors.length + " monitors"); + + // set them all at 50% for packery + for (var i = 0; i < $scope.MontageMonitors.length; i++) { + $scope.MontageMonitors[i].Monitor.gridScale = "50"; + $scope.MontageMonitors[i].Monitor.selectStyle = ""; + $scope.MontageMonitors[i].Monitor.alarmState = 'color:rgba(0,0,0,0);'; + $scope.MontageMonitors[i].Monitor.isStamp = false; + + } + + $rootScope.validMonitorId = $scope.monitors[0].Monitor.Id; + NVRDataModel.getAuthKey($rootScope.validMonitorId, (Math.floor((Math.random() * 999999) + 1)).toString()) + .then(function (success) { + $ionicLoading.hide(); + //console.log(success); + $rootScope.authSession = success; + NVRDataModel.log("Stream authentication construction: " + + $rootScope.authSession); + $timeout(function () { + initPackery(); + }, zm.packeryTimer); - /*if (NVRDataModel.isForceNetworkStop()) - { - NVRDataModel.log("MontageCtrl:Stopping network pull..."); - NVRDataModel.stopNetwork(); + }, + function (error) { - }*/ + $ionicLoading.hide(); + NVRDataModel.debug("MontageCtrl: Error in authkey retrieval " + error); + //$rootScope.authSession=""; + NVRDataModel.log("MontageCtrl: Error returned Stream authentication construction. Retaining old value of: " + $rootScope.authSession); + $timeout(function () { + initPackery(); + }, zm.packeryTimer); + }); + + //console.log("**VIEW ** Montage Ctrl AFTER ENTER"); + window.addEventListener("resize", orientationChanged, false); + + document.addEventListener("pause", onPause, false); + // document.addEventListener("resume", onResume, false); }); - $scope.$on('$ionicView.unloaded', function() { + $scope.$on('$ionicView.beforeLeave', function () { + + areStreamsStopped = true; + viewCleanup(); }); - $scope.resetSizes = function() - { - var somethingReset = false; - for (var i = 0; i < $scope.MontageMonitors.length; i++) - { - if ($scope.isDragabillyOn) - { - if ($scope.MontageMonitors[i].Monitor.selectStyle == "dragborder-selected") - { - $scope.MontageMonitors[i].Monitor.gridScale = "50"; - somethingReset = true; - } - } - else - { - $scope.MontageMonitors[i].Monitor.gridScale = "50"; - // somethingReset = true; - } - } - if (!somethingReset && $scope.isDragabillyOn) // nothing was selected - { - for (i = 0; i < $scope.MontageMonitors.length; i++) - { - $scope.MontageMonitors[i].Monitor.gridScale = "50"; - } - } + $scope.$on('$ionicView.unloaded', function () { - $timeout(function() - { - pckry.reloadItems(); + }); - pckry.once('layoutComplete', function() - { - //console.log ("Layout complete"); - var positions = pckry.getShiftPositions('data-item-id'); - //console.log ("POSITIONS MAP " + JSON.stringify(positions)); - var ld = NVRDataModel.getLogin(); - - ld.packeryPositions = JSON.stringify(positions); - //console.log ("Saving " + ld.packeryPositions); - ld.currentMontageProfile = ""; - $scope.currentProfileName = $translate.instant ('kMontage'); - NVRDataModel.setLogin(ld); - - $timeout(function() - { - NVRDataModel.debug("doing the jiggle and dance..."); - pckry.resize(true); - }, 300); - - // $scope.slider.monsize = 2; - }); - pckry.layout(); + $scope.resetSizes = function () { + var somethingReset = false; + for (var i = 0; i < $scope.MontageMonitors.length; i++) { + if ($scope.isDragabillyOn) { + if ($scope.MontageMonitors[i].Monitor.selectStyle == "dragborder-selected") { + $scope.MontageMonitors[i].Monitor.gridScale = "50"; + somethingReset = true; + } + } else { + $scope.MontageMonitors[i].Monitor.gridScale = "50"; + // somethingReset = true; + } + } + if (!somethingReset && $scope.isDragabillyOn) // nothing was selected + { + for (i = 0; i < $scope.MontageMonitors.length; i++) { + $scope.MontageMonitors[i].Monitor.gridScale = "50"; + } + } + + $timeout(function () { + pckry.reloadItems(); + + pckry.once('layoutComplete', function () { + //console.log ("Layout complete"); + var positions = pckry.getShiftPositions('data-item-id'); + //console.log ("POSITIONS MAP " + JSON.stringify(positions)); + var ld = NVRDataModel.getLogin(); + + ld.packeryPositions = JSON.stringify(positions); + //console.log ("Saving " + ld.packeryPositions); + ld.currentMontageProfile = ""; + $scope.currentProfileName = $translate.instant('kMontage'); + NVRDataModel.setLogin(ld); + + $timeout(function () { + NVRDataModel.debug("doing the jiggle and dance..."); + pckry.resize(true); + }, 300); + + // $scope.slider.monsize = 2; + }); + pckry.layout(); - }, 20); + }, 20); }; - function layout(pckry) - { - pckry.shiftLayout(); + function layout(pckry) { + pckry.shiftLayout(); } - $scope.squeezeMonitors = function() - { - pckry.once('layoutComplete', resizeComplete); - $timeout (function() {pckry.layout();}); + $scope.squeezeMonitors = function () { + pckry.once('layoutComplete', resizeComplete); + $timeout(function () { + pckry.layout(); + }); + + function resizeComplete() { + //console.log ("HERE"); + $timeout(function () { + var positions = pckry.getShiftPositions('data-item-id'); + //console.log("SAVING"); + var ld = NVRDataModel.getLogin(); + + ld.packeryPositions = JSON.stringify(positions); + //console.log ("Saving " + ld.packeryPositions); + ld.currentMontageProfile = ""; + $scope.currentProfileName = $translate.instant('kMontage'); + NVRDataModel.setLogin(ld); + $ionicLoading.hide(); + $scope.sliderChanging = false; + }, 20); - function resizeComplete() - { - //console.log ("HERE"); - $timeout(function() - { - var positions = pckry.getShiftPositions('data-item-id'); - //console.log("SAVING"); - var ld = NVRDataModel.getLogin(); - - ld.packeryPositions = JSON.stringify(positions); - //console.log ("Saving " + ld.packeryPositions); - ld.currentMontageProfile = ""; - $scope.currentProfileName =$translate.instant ('kMontage'); - NVRDataModel.setLogin(ld); - $ionicLoading.hide(); - $scope.sliderChanging = false; - }, 20); + } - } - }; //--------------------------------------------------------- @@ -2083,181 +1976,161 @@ angular.module('zmApp.controllers') // a copy and the value never changes //--------------------------------------------------------- - $scope.sliderChanged = function(dirn) - { + $scope.sliderChanged = function (dirn) { - if ($scope.sliderChanging) - { - // console.log("too fast my friend"); - //$scope.slider.monsize = oldSliderVal; - return; - } - - $scope.sliderChanging = true; + if ($scope.sliderChanging) { + // console.log("too fast my friend"); + //$scope.slider.monsize = oldSliderVal; + return; + } - $ionicLoading.show( - { - template: $translate.instant('kPleaseWait'), - noBackdrop: true, - duration: 5000 - }); + $scope.sliderChanging = true; - var somethingReset = false; + $ionicLoading.show({ + template: $translate.instant('kPleaseWait'), + noBackdrop: true, + duration: 5000 + }); - var oldScales = {}; - pckry.getItemElements().forEach(function(elem) - { - var id = elem.getAttribute("data-item-id"); - var sz = elem.getAttribute("data-item-size"); - if (isNaN(sz)) sz=20; - oldScales[id] = sz; - // console.log("REMEMBERING " + id + ":" + sz); + var somethingReset = false; - }); + var oldScales = {}; + pckry.getItemElements().forEach(function (elem) { + var id = elem.getAttribute("data-item-id"); + var sz = elem.getAttribute("data-item-size"); + if (isNaN(sz)) sz = 20; + oldScales[id] = sz; + // console.log("REMEMBERING " + id + ":" + sz); - // this only changes items that are selected - for (var i = 0; i < $scope.MontageMonitors.length; i++) - { + }); - var curVal = parseInt($scope.MontageMonitors[i].Monitor.gridScale) || 20; - curVal = curVal + (5 * dirn); - if (curVal < 10) curVal = 10; - if (curVal > 100) curVal = 100; - //console.log ("For Index: " + i + " From: " + $scope.MontageMonitors[i].Monitor.gridScale + " To: " + curVal); + // this only changes items that are selected + for (var i = 0; i < $scope.MontageMonitors.length; i++) { - if ($scope.isDragabillyOn) - { - // only do this for selected monitors - if ($scope.MontageMonitors[i].Monitor.selectStyle == "dragborder-selected") - { + var curVal = parseInt($scope.MontageMonitors[i].Monitor.gridScale) || 20; + curVal = curVal + (5 * dirn); + if (curVal < 10) curVal = 10; + if (curVal > 100) curVal = 100; + //console.log ("For Index: " + i + " From: " + $scope.MontageMonitors[i].Monitor.gridScale + " To: " + curVal); - $scope.MontageMonitors[i].Monitor.gridScale = curVal; - somethingReset = true; - } - } - else - { - $scope.MontageMonitors[i].Monitor.gridScale = curVal; - //somethingReset = true; + if ($scope.isDragabillyOn) { + // only do this for selected monitors + if ($scope.MontageMonitors[i].Monitor.selectStyle == "dragborder-selected") { - } + $scope.MontageMonitors[i].Monitor.gridScale = curVal; + somethingReset = true; + } + } else { + $scope.MontageMonitors[i].Monitor.gridScale = curVal; + //somethingReset = true; } - // this changes all items if none were selected - if (!somethingReset && $scope.isDragabillyOn) // nothing was selected - { - for (i = 0; i < $scope.MontageMonitors.length; i++) - { - var cv = parseInt($scope.MontageMonitors[i].Monitor.gridScale) || 20; - cv = cv + (5 * dirn); - if (cv < 10) cv = 10; - if (cv > 100) cv = 100; - $scope.MontageMonitors[i].Monitor.gridScale = cv; - //console.log ("*******GRIDSCALE="+) - } + } + + // this changes all items if none were selected + if (!somethingReset && $scope.isDragabillyOn) // nothing was selected + { + for (i = 0; i < $scope.MontageMonitors.length; i++) { + var cv = parseInt($scope.MontageMonitors[i].Monitor.gridScale) || 20; + cv = cv + (5 * dirn); + if (cv < 10) cv = 10; + if (cv > 100) cv = 100; + $scope.MontageMonitors[i].Monitor.gridScale = cv; + //console.log ("*******GRIDSCALE="+) } + } - // reload sizes from DOM and trigger a layout + // reload sizes from DOM and trigger a layout - $timeout(function() - { - //console.log("Calling re-layout"); - //pckry.reloadItems(); + $timeout(function () { + //console.log("Calling re-layout"); + //pckry.reloadItems(); - if (dirn == 1) //expand - { - pckry.getItemElements().forEach(function(elem) - { - var id = elem.getAttribute("data-item-id"); - var sz = elem.getAttribute("data-item-size"); - if (isNaN(sz)) sz=20; - //console.log("NOW IT IS-> " + id + ":" + sz); - if (oldScales[id] != sz) - { - //console.log("Calling FIT on " + id + " size:" + oldScales[id] + "->" + sz); - pckry.once('fitComplete', resizeComplete); - pckry.fit(elem); - - } - }); - } - else //shrink - { - //console.log("Calling shift"); - pckry.once('layoutComplete', resizeComplete); - pckry.shiftLayout(); + if (dirn == 1) //expand + { + pckry.getItemElements().forEach(function (elem) { + var id = elem.getAttribute("data-item-id"); + var sz = elem.getAttribute("data-item-size"); + if (isNaN(sz)) sz = 20; + //console.log("NOW IT IS-> " + id + ":" + sz); + if (oldScales[id] != sz) { + //console.log("Calling FIT on " + id + " size:" + oldScales[id] + "->" + sz); + pckry.once('fitComplete', resizeComplete); + pckry.fit(elem); } - + }); + } else //shrink + { + //console.log("Calling shift"); + pckry.once('layoutComplete', resizeComplete); + pckry.shiftLayout(); + + } + + }, 20); + + /* if (!somethingReset) { + //console.log (">>>SOMETHING NOT RESET"); + $timeout(function () { + pckry.layout(); + }, zm.packeryTimer); + } else { + + //console.log (">>>SOMETHING RESET"); + $timeout(function () { + layout(pckry); + }, zm.packeryTimer); + }*/ + function resizeComplete() { + //console.log ("HERE"); + $timeout(function () { + var positions = pckry.getShiftPositions('data-item-id'); + //console.log("SAVING"); + var ld = NVRDataModel.getLogin(); + + ld.packeryPositions = JSON.stringify(positions); + //console.log ("Saving " + ld.packeryPositions); + ld.currentMontageProfile = ""; + $scope.currentProfileName = $translate.instant('kMontage'); + NVRDataModel.setLogin(ld); + $ionicLoading.hide(); + $scope.sliderChanging = false; }, 20); - /* if (!somethingReset) { - //console.log (">>>SOMETHING NOT RESET"); - $timeout(function () { - pckry.layout(); - }, zm.packeryTimer); - } else { - - //console.log (">>>SOMETHING RESET"); - $timeout(function () { - layout(pckry); - }, zm.packeryTimer); - }*/ - function resizeComplete() - { - //console.log ("HERE"); - $timeout(function() - { - var positions = pckry.getShiftPositions('data-item-id'); - //console.log("SAVING"); - var ld = NVRDataModel.getLogin(); - - ld.packeryPositions = JSON.stringify(positions); - //console.log ("Saving " + ld.packeryPositions); - ld.currentMontageProfile = ""; - $scope.currentProfileName = $translate.instant ('kMontage'); - NVRDataModel.setLogin(ld); - $ionicLoading.hide(); - $scope.sliderChanging = false; - }, 20); - - } + } }; - $scope.$on('$ionicView.afterEnter', function() - { - // This rand is really used to reload the monitor image in img-src so it is not cached - // I am making sure the image in montage view is always fresh - // I don't think I am using this anymore FIXME: check and delete if needed - // $rootScope.rand = Math.floor((Math.random() * 100000) + 1); + $scope.$on('$ionicView.afterEnter', function () { + // This rand is really used to reload the monitor image in img-src so it is not cached + // I am making sure the image in montage view is always fresh + // I don't think I am using this anymore FIXME: check and delete if needed + // $rootScope.rand = Math.floor((Math.random() * 100000) + 1); }); - $scope.currentProfileName = NVRDataModel.getLogin().currentMontageProfile || $translate.instant ('kMontage'); + $scope.currentProfileName = NVRDataModel.getLogin().currentMontageProfile || $translate.instant('kMontage'); - $scope.reloadView = function() - { - $rootScope.rand = Math.floor((Math.random() * 100000) + 1); - NVRDataModel.log("User action: image reload " + $rootScope.rand); + $scope.reloadView = function () { + $rootScope.rand = Math.floor((Math.random() * 100000) + 1); + NVRDataModel.log("User action: image reload " + $rootScope.rand); }; - $scope.doRefresh = function() - { + $scope.doRefresh = function () { - // console.log("***Pull to Refresh, recomputing Rand"); - NVRDataModel.log("Reloading view for montage view, recomputing rand"); - $rootScope.rand = Math.floor((Math.random() * 100000) + 1); - $scope.monitors = []; - imageLoadingDataShare.set(0); + // console.log("***Pull to Refresh, recomputing Rand"); + NVRDataModel.log("Reloading view for montage view, recomputing rand"); + $rootScope.rand = Math.floor((Math.random() * 100000) + 1); + $scope.monitors = []; + imageLoadingDataShare.set(0); - var refresh = NVRDataModel.getMonitors(1); + var refresh = NVRDataModel.getMonitors(1); - refresh.then(function(data) - { - $scope.monitors = data; - $scope.$broadcast('scroll.refreshComplete'); - }); + refresh.then(function (data) { + $scope.monitors = data; + $scope.$broadcast('scroll.refreshComplete'); + }); }; -}]); + }]); diff --git a/www/js/MontageHistoryCtrl.js b/www/js/MontageHistoryCtrl.js index 43cb8f8f..0df27dce 100644 --- a/www/js/MontageHistoryCtrl.js +++ b/www/js/MontageHistoryCtrl.js @@ -10,7 +10,7 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc // Handles bandwidth change, if required // //-------------------------------------------------------------------------------------- - var bc = $rootScope.$on("bandwidth-change", function(e, data) + var bc = $scope.$on("bandwidth-change", function(e, data) { // nothing to do for now // eventUrl will use lower BW in next query cycle @@ -227,7 +227,10 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc $scope.dragBorder = ""; $scope.isDragabillyOn = false; $ionicSideMenuDelegate.canDragContent(false); - NVRDataModel.stopNetwork("MontageHistory-footerCollapse"); + + for (i=0; i < $scope.MontageMonitors.length; i++) { + NVRDataModel.killLiveStream($scope.MontageMonitors[i]); + } NVRDataModel.regenConnKeys(); var ld = NVRDataModel.getLogin(); @@ -865,6 +868,7 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc function onResume() {} + $scope.openMenu = function() { $timeout(function() @@ -911,13 +915,13 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc { //console.log("**VIEW ** Event History Ctrl Left, force removing modal"); - NVRDataModel.debug ("Deregistering broadcast handles"); + NVRDataModel.debug ("Montage History: Deregistering broadcast handles"); for (var i=0; i < broadcastHandles.length; i++) { - broadcastHandles[i](); + //broadcastHandles[i](); } broadcastHandles = []; - + if ($scope.modal) $scope.modal.remove(); NVRDataModel.log("Cancelling event query timer"); $interval.cancel($rootScope.eventQueryInterval); @@ -926,8 +930,12 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc // thats why we are doing it beforeLeave pckry.destroy(); window.removeEventListener("resize", orientationChanged, false); - NVRDataModel.log("Forcing a window.stop() here"); - NVRDataModel.stopNetwork("MontageHistory-beforeLeave"); + //NVRDataModel.log("Forcing a window.stop() here"); + //NVRDataModel.stopNetwork("MontageHistory-beforeLeave"); + + for (i=0; i < $scope.MontageMonitors.length; i++) { + NVRDataModel.killLiveStream($scope.MontageMonitors[i]); + } }); $scope.$on('$ionicView.unloaded', function() {}); $scope.sliderChanged = function(dirn) diff --git a/www/js/PortalLoginCtrl.js b/www/js/PortalLoginCtrl.js index 9971de86..f7ade984 100644 --- a/www/js/PortalLoginCtrl.js +++ b/www/js/PortalLoginCtrl.js @@ -9,15 +9,15 @@ angular.module('zmApp.controllers').controller('zmApp.PortalLoginCtrl', ['$ionic var processPush = false; var broadcastHandles = []; - $scope.$on ('$ionicView.beforeEnter', function() { + $scope.$on ('$ionicView.beforeLeave', function() { //processPush = false; // NVRDataModel.debug ("BeforeEnter in Portal: setting ProcessPush to false"); }); $scope.$on ('$ionicView.beforeLeave', function() { - NVRDataModel.debug ("Deregistering broadcast handles"); + NVRDataModel.debug ("Portal: Deregistering broadcast handles"); for (var i=0; i < broadcastHandles.length; i++) { - broadcastHandles[i](); + //broadcastHandles[i](); } broadcastHandles = []; }); @@ -25,7 +25,7 @@ angular.module('zmApp.controllers').controller('zmApp.PortalLoginCtrl', ['$ionic $scope.$on('$ionicView.enter', function() { - + NVRDataModel.setJustResumed(false); NVRDataModel.debug("Inside Portal login Enter handler"); loginData = NVRDataModel.getLogin(); @@ -285,7 +285,7 @@ angular.module('zmApp.controllers').controller('zmApp.PortalLoginCtrl', ['$ionic } - var pp = $rootScope.$on("process-push", function () { + var pp = $scope.$on("process-push", function () { NVRDataModel.debug("*** PROCESS PUSH HANDLER CALLED INSIDE PORTAL LOGIN, setting ProcessPush to true"); processPush = true; evaluateTappedNotification(); diff --git a/www/js/TimelineCtrl.js b/www/js/TimelineCtrl.js index a1060265..d689ec4f 100644 --- a/www/js/TimelineCtrl.js +++ b/www/js/TimelineCtrl.js @@ -283,7 +283,7 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla } - var tzu = $rootScope.$on('tz-updated', function() + var tzu = $scope.$on('tz-updated', function() { $scope.tzAbbr = NVRDataModel.getTimeZoneNow(); NVRDataModel.debug("Timezone API updated timezone to " + NVRDataModel.getTimeZoneNow()); @@ -298,9 +298,9 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla $scope.$on('$ionicView.leave', function() { - NVRDataModel.debug ("Deregistering broadcast handles"); + NVRDataModel.debug ("Timeline: Deregistering broadcast handles"); for (var i=0; i < broadcastHandles.length; i++) { - broadcastHandles[i](); + // broadcastHandles[i](); } broadcastHandles = []; diff --git a/www/js/app.js b/www/js/app.js index 92fed8e1..01928d5e 100755 --- a/www/js/app.js +++ b/www/js/app.js @@ -52,14 +52,11 @@ angular.module('zmApp', [ logFile: 'zmNinjaLog.txt', authoremail: 'pliablepixels+zmNinja@gmail.com', logFileMaxSize: 20000, // after this limit log gets reset - //loginInterval: 300000, //5m*60s*1000 - ZM auto login after 5 mins - loginInterval: 1800000, //30m*60s*1000 - ZM auto login after 30 mins - - //loginInterval: 30000, + updateCheckInterval: 86400000, // 24 hrs loadingTimeout: 15000, slowLoadingTimeout: 60000, - safeMontageLimit: 100, + safeMontageLimit: 10, safeImageQuality: 10, maxFPS: 30, defaultFPS: 3, @@ -93,6 +90,8 @@ angular.module('zmApp', [ cipherKey: 'sdf#@#%FSXSA_AR', minCycleTime: 5, + loginInterval: 1800000, //30m*60s*1000 - ZM auto login after 30 mins + //loginInterval: 20000, eventPlaybackQueryLowBW: 6000, loginIntervalLowBW: 1800000, //30m login eventSingleImageQualityLowBW: 70, @@ -104,8 +103,9 @@ angular.module('zmApp', [ maxGifWidth: 800.0, quantSample: 15, hashSecret: 'unused at the moment', - forceMontageReloadDelay: 3600, // 1 hr, - thumbWidth:200 + forceMontageReloadDelay: 4500000, // 1 hr 15m, + thumbWidth:200, + alarmStatusTime: 10000, }) @@ -840,7 +840,7 @@ angular.module('zmApp', [ $rootScope.$on("auth-error", function () { - NVRDataModel.debug("zmAutoLogin: Inside auth-error emit"); + NVRDataModel.debug("zmAutoLogin: Inside auth-error broadcast"); NVRDataModel.displayBanner('error', ['ZoneMinder authentication failed', 'Please check settings']); }); @@ -853,7 +853,7 @@ angular.module('zmApp', [ //------------------------------------------------------------------ $rootScope.$on("init-complete", function () { - NVRDataModel.log(">>>>>>>>>>>>>>> All init over, going to portal login"); + NVRDataModel.log("Inside init-complete in app.js: All init over, going to portal login"); $ionicHistory.nextViewOptions({ disableAnimate: true }); @@ -883,7 +883,7 @@ angular.module('zmApp', [ $timeout(function () { contentBannerInstance(); }, 2000); - NVRDataModel.debug("auth-success emit:Successful"); + NVRDataModel.debug("auth-success broadcast:Successful"); }); $rootScope.getProfileName = function () { @@ -929,7 +929,7 @@ angular.module('zmApp', [ // coming here means login not needed, old login is valid .then(function (success) { d.resolve("Login Success due to fast login"); - $rootScope.$emit('auth-success', "fast login mode"); + $rootScope.$broadcast('auth-success', "fast login mode"); return d.promise; }, @@ -1010,7 +1010,7 @@ angular.module('zmApp', [ NVRDataModel.log("Auth is disabled!"); d.resolve("Login Success"); - $rootScope.$emit('auth-success', 'no auth'); + $rootScope.$broadcast('auth-success', 'no auth'); return (d.promise); } @@ -1102,14 +1102,14 @@ angular.module('zmApp', [ d.resolve("Login Success"); - $rootScope.$emit('auth-success', data); + $rootScope.$broadcast('auth-success', data); } else // this means login error { $rootScope.loggedIntoZm = -1; //console.log("**** ZM Login FAILED"); NVRDataModel.log("zmAutologin Error: Bad Credentials ", "error"); - $rootScope.$emit('auth-error', "incorrect credentials"); + $rootScope.$broadcast('auth-error', "incorrect credentials"); d.reject("Login Error"); return (d.promise); @@ -1150,7 +1150,7 @@ angular.module('zmApp', [ NVRDataModel.log("zmAutologin Error " + JSON.stringify(error) + " and status " + status); // bad urls etc come here $rootScope.loggedIntoZm = -1; - $rootScope.$emit('auth-error', error); + $rootScope.$broadcast('auth-error', error); d.reject("Login Error"); return d.promise; @@ -1337,7 +1337,7 @@ angular.module('zmApp', [ if ((NVRDataModel.getLogin().autoSwitchBandwidth == true) && (NVRDataModel.getLogin().enableLowBandwidth == true)) { NVRDataModel.debug("Setting app state to: " + strState); - $rootScope.$emit('bandwidth-change', strState); + $rootScope.$broadcast('bandwidth-change', strState); } else { NVRDataModel.debug("Not changing bandwidth state, as auto change is not on"); } @@ -1795,6 +1795,7 @@ angular.module('zmApp', [ //---------------------------------------------------------------------------- document.addEventListener("resume", function () { + NVRDataModel.setJustResumed(true); $ionicPlatform.ready(function () { NVRDataModel.log("App is resuming from background"); $rootScope.isDownloading = false; @@ -1851,7 +1852,8 @@ angular.module('zmApp', [ //---------------------------------------------------------------------------- document.addEventListener("pause", function () { NVRDataModel.setBackground(true); - NVRDataModel.setJustResumed(true); // used for window stop + NVRDataModel.setJustResumed(false); + // NVRDataModel.setJustResumed(true); // used for window stop EventServer.disconnect(); @@ -1859,18 +1861,21 @@ angular.module('zmApp', [ $interval.cancel($rootScope.eventQueryInterval); $interval.cancel($rootScope.intervalHandle); + zmAutoLogin.stop(); + if ($rootScope.zmPopup) + $rootScope.zmPopup.close(); - NVRDataModel.log("ROOT APP: Stopping network pull..."); - window.stop(); // dont call stopNetwork - we need to stop here - var ld = NVRDataModel.getLogin(); + NVRDataModel.log("ROOT APP: Stopping network "); + NVRDataModel.stopNetwork("called from app.js"); + // dont call stopNetwork - we need to stop here + + var ld = NVRDataModel.getLogin(); - zmAutoLogin.stop(); - if ($rootScope.zmPopup) - $rootScope.zmPopup.close(); + if (ld.exitOnSleep && $rootScope.platformOS == "android") { NVRDataModel.log("user exited app"); @@ -2259,6 +2264,7 @@ angular.module('zmApp', [ resolve: { message: function (NVRDataModel) { //console.log("Inside app.events resolve"); + NVRDataModel.regenConnKeys(); return NVRDataModel.getMonitors(0); } diff --git a/www/lang/locale-en.json b/www/lang/locale-en.json index d49aa5a2..2ff00d64 100644 --- a/www/lang/locale-en.json +++ b/www/lang/locale-en.json @@ -68,6 +68,7 @@ "kDisablePush" :"disable APNS/GCM", "kDisableSamsung" :"If you are on a samsung device and are facing input issues, please temporarily disable auto-correction", "kDisableSimulStreaming" :"Disable Montage real-time streaming", + "kDisableSimulStreamingNote" :"(always disabled in iOS)", "kDiscovering" :"discovering", "kDiscoveringAPI" :"discovering api", "kDiscoveringCGI" :"discovering cgi", diff --git a/www/templates/devoptions.html b/www/templates/devoptions.html index 5be3fd65..61076042 100644 --- a/www/templates/devoptions.html +++ b/www/templates/devoptions.html @@ -124,6 +124,7 @@ <label ng-if="$root.platformOS!='desktop'"> <ion-toggle ng-model="loginData.enableStrictSSL" ng-checked="loginData.enableStrictSSL" toggle-class="toggle-calm"><span class="item-text-wrap">{{'kEnableStrictSSL' | translate}} + </span> </ion-toggle> </label> @@ -155,7 +156,9 @@ </label> <label> - <ion-toggle ng-model="loginData.disableSimulStreaming" ng-checked="loginData.disableSimulStreaming" toggle-class="toggle-calm"><span class="item-text-wrap">{{'kDisableSimulStreaming' | translate}} + <ion-toggle ng-model="loginData.disableSimulStreaming" ng-checked="loginData.disableSimulStreaming" + ng-change="checkMultiPortToggle()" toggle-class="toggle-calm"><span class="item-text-wrap">{{'kDisableSimulStreaming' | translate}} + <p ng-if="$root.platformOS=='ios'">{{'kDisableSimulStreamingNote' | translate}}</p> </span> </ion-toggle> </label> diff --git a/www/templates/monitors-modal.html b/www/templates/monitors-modal.html index 79f443da..02b46a37 100644 --- a/www/templates/monitors-modal.html +++ b/www/templates/monitors-modal.html @@ -2,9 +2,6 @@ <ion-modal-view cache-view="false" style="background-color:#444444"> <ion-content ng-cloak on-double-tap="closeModal();" scroll="false"> - - - <div id="imagecontainer"> <ion-scroll ng-if="!isZoneEdit" on-scroll="checkZoom()" delegate-handle="imgscroll" has-bouncing=false min-zoom=1 zooming="true" direction="xy" style="width: 100%;" overflow-scroll="false"> @@ -12,14 +9,15 @@ <!-- --> <div id="monitorimage" style="height: 100vh;" class="main"> <div ng-if="$root.authSession!='undefined'"> - <div ng-if="!animationInProgress && !isBackground() && connKey"> + <div ng-if="!animationInProgress"> + <!--<span style="color:white">{{currentStreamMode}}</span>--> - <img id="singlemonitor" style="width:100vw; height:100vh;" image-spinner-loader="lines" image-spinner-src="{{monitor.Monitor.streamingURL}}/nph-zms?mode={{currentStreamMode}}&monitor={{monitorId}}&scale={{quality}}{{$root.authSession}}&rand={{$root.modalRand}}&connkey={{connKey}}" + <img id="singlemonitor" style="width:100vw; height:100vh;" image-spinner-loader="lines" image-spinner-src="{{constructSingleStream()}}" ng-class="{'object-fit_cover':imageFit==false, 'object-fit_contain':imageFit==true}" on-swipe-left="onSwipe(monitorId,1)" on-swipe-right="onSwipe(monitorId,-1)" on-double-tap="closeModal();" imageonload="imageLoaded()" /> </div> - <div ng-if="animationInProgress || isBackground()"> + <div ng-if="animationInProgress"> <img style="width:100vw; height:100vh" ng-src="img/pausevideo.png" class="object-fit_contain" /> </div> </div> @@ -43,7 +41,7 @@ <div ng-if="!animationInProgress && !isBackground() && connKey"> <!--<span style="color:white">{{currentStreamMode}}</span>--> - <img id="singlemonitor" style="width:100vw; height:100vh;" image-spinner-loader="lines" image-spinner-src="{{monitor.Monitor.streamingURL}}/nph-zms?mode={{currentStreamMode}}&monitor={{monitorId}}&scale={{quality}}{{$root.authSession}}&rand={{$root.modalRand}}&connkey={{connKey}}" + <img id="singlemonitor" style="width:100vw; height:100vh;" image-spinner-loader="lines" image-spinner-src="{{constructSingleStream()}}" ng-class="{'object-fit_cover':imageFit==false, 'object-fit_contain':imageFit==true}" on-swipe-left="onSwipe(monitorId,1)" on-swipe-right="onSwipe(monitorId,-1)" on-double-tap="closeModal();" imageonload="imageLoaded()" /> </div> diff --git a/www/templates/montage.html b/www/templates/montage.html index 5abf9b22..0742e3d3 100644 --- a/www/templates/montage.html +++ b/www/templates/montage.html @@ -33,6 +33,10 @@ <br/> <div id="flyoutmenu" style="float:left"> <ul> + <!-- <li> + <a href="" ng-click="killAllImages()"> <i class="ion-ionic"></i></a> + </li>--> + <li> <a href="" ng-click="sliderChanged(1)"> <i class="ion-plus-circled"></i></a> </li> @@ -97,16 +101,15 @@ <figure class="{{dragBorder}}" ng-show="monitor.Monitor.listDisplay!='noshow'"> <!--<div ng-if="!isModalActive" >--> <!--<div ng-if="$root.authSession!='undefined' && !isBackground() && !areImagesLoading">--> - <div ng-if="$root.authSession!='undefined' && !isBackground() "> + <div ng-if="$root.authSession!='undefined' && $root.authSession!=''"> <div ng-if = "!minimal" > - - <img class="{{monitor.Monitor.selectStyle}}" id="img-{{$index}}" image-spinner-src="{{monitor.Monitor.streamingURL}}/nph-zms?mode={{getMode()}}&monitor={{monitor.Monitor.Id}}&scale={{LoginData.montageQuality}}{{$root.authSession}}&rand={{randToAvoidCacheMem}}{{appendConnKey(monitor.Monitor.connKey)}}" ng-click="!isDragabillyOn?openModal(monitor.Monitor.Id, monitor.Monitor.Controllable, monitor.Monitor.ControlId, monitor.Monitor.connKey,monitor):toggleSelectItem(monitor.Monitor.Id);" image-spinner-loader="lines" img-spinner-w="{{monitor.Monitor.Width}}" img-spinner-h="{{monitor.Monitor.Height}}" /> + <img class="{{monitor.Monitor.selectStyle}}" id="img-{{$index}}" image-spinner-src="{{constructStream(monitor)}}" ng-click="!isDragabillyOn?openModal(monitor.Monitor.Id, monitor.Monitor.Controllable, monitor.Monitor.ControlId, monitor.Monitor.connKey,monitor):toggleSelectItem(monitor.Monitor.Id);" image-spinner-loader="lines" img-spinner-w="{{monitor.Monitor.Width}}" img-spinner-h="{{monitor.Monitor.Height}}" /> </div> <div ng-if = "minimal"> - <img id="img-{{$index}}" image-spinner-src="{{monitor.Monitor.streamingURL}}/zms?mode={{getMode()}}&monitor={{monitor.Monitor.Id}}&scale={{LoginData.montageQuality}}{{$root.authSession}}&rand={{randToAvoidCacheMem}}{{appendConnKey(monitor.Monitor.connKey)}}" ng-click="!isDragabillyOn?openModal(monitor.Monitor.Id, monitor.Monitor.Controllable, monitor.Monitor.ControlId, monitor.Monitor.connKey,monitor):toggleSelectItem(monitor.Monitor.Id);" image-spinner-loader="lines" img-spinner-w="{{monitor.Monitor.Width}}" img-spinner-h="{{monitor.Monitor.Height}}" /> + <img id="img-{{$index}}" image-spinner-src="{{constructStream(monitor)}}" ng-click="!isDragabillyOn?openModal(monitor.Monitor.Id, monitor.Monitor.Controllable, monitor.Monitor.ControlId, monitor.Monitor.connKey,monitor):toggleSelectItem(monitor.Monitor.Id);" image-spinner-loader="lines" img-spinner-w="{{monitor.Monitor.Width}}" img-spinner-h="{{monitor.Monitor.Height}}" /> </div> </div> |
