summaryrefslogtreecommitdiff
path: root/www/js
diff options
context:
space:
mode:
authorPliable Pixels <pliablepixels@gmail.com>2018-04-23 09:34:06 -0400
committerPliable Pixels <pliablepixels@gmail.com>2018-04-23 09:34:06 -0400
commit3d47ee0db30c2c550183a5c9bce14080d73b0b30 (patch)
treebe268a7caaec257c909ef562ec5511cf188a78e9 /www/js
parentf7bdc28142f1a4375256c481c2d1ff99b10596d1 (diff)
#606 step one in cleaning up montage history
Diffstat (limited to 'www/js')
-rw-r--r--www/js/MontageHistoryCtrl.js2738
1 files changed, 1259 insertions, 1479 deletions
diff --git a/www/js/MontageHistoryCtrl.js b/www/js/MontageHistoryCtrl.js
index acf02d1b..d096012d 100644
--- a/www/js/MontageHistoryCtrl.js
+++ b/www/js/MontageHistoryCtrl.js
@@ -3,1486 +3,1280 @@
/* jslint browser: true*/
/* global cordova,StatusBar,angular,console,ionic,Masonry,moment,Packery, Draggabilly, imagesLoaded, Chart */
// FIXME: This is a copy of montageCtrl - needs a lot of code cleanup
-angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$scope', '$rootScope', 'NVRDataModel', 'message', '$ionicSideMenuDelegate', '$timeout', '$interval', '$ionicModal', '$ionicLoading', '$http', '$state', '$ionicPopup', '$stateParams', '$ionicHistory', '$ionicScrollDelegate', '$ionicPlatform', 'zm', '$ionicPopover', '$controller', 'imageLoadingDataShare', '$window', '$translate', 'qHttp', '$q', function($scope, $rootScope, NVRDataModel, message, $ionicSideMenuDelegate, $timeout, $interval, $ionicModal, $ionicLoading, $http, $state, $ionicPopup, $stateParams, $ionicHistory, $ionicScrollDelegate, $ionicPlatform, zm, $ionicPopover, $controller, imageLoadingDataShare, $window, $translate, qHttp, $q)
-{
- var broadcastHandles = [];
- var isSimulStreaming = false;
- $scope.isSimulStreaming = isSimulStreaming;
- var areStreamsStopped = false;
- var viewCleaned = false;
- //--------------------------------------------------------------------------------------
- // Handles bandwidth change, if required
- //
- //--------------------------------------------------------------------------------------
- var bc = $scope.$on("bandwidth-change", function(e, data)
- {
- // nothing to do for now
- // eventUrl will use lower BW in next query cycle
- });
- broadcastHandles.push(bc);
-
- $scope.getLocalTZ = function()
- {
- return moment.tz.guess();
- };
- //--------------------------------------
- // formats events dates in a nice way
- //---------------------------------------
- $scope.prettifyDateTimeFirst = function(str)
- {
- if (NVRDataModel.getLogin().useLocalTimeZone)
- return moment.tz(str, NVRDataModel.getTimeZoneNow()).tz(moment.tz.guess()).format(NVRDataModel.getTimeFormat() + '/MMM Do');
- else
- return moment(str).format(NVRDataModel.getTimeFormat() + '/MMM Do');
- };
- $scope.prettifyDate = function(str)
- {
- return moment(str).format('MMM Do, YYYY ' + NVRDataModel.getTimeFormat());
- };
-
- function prettifyDate(str)
- {
- if (NVRDataModel.getLogin().useLocalTimeZone)
- return moment.tz(str, NVRDataModel.getTimeZoneNow()).tz(moment.tz.guess()).format('MMM Do');
- else
- return moment(str).format('MMM Do');
+angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$scope', '$rootScope', 'NVRDataModel', 'message', '$ionicSideMenuDelegate', '$timeout', '$interval', '$ionicModal', '$ionicLoading', '$http', '$state', '$ionicPopup', '$stateParams', '$ionicHistory', '$ionicScrollDelegate', '$ionicPlatform', 'zm', '$ionicPopover', '$controller', 'imageLoadingDataShare', '$window', '$translate', 'qHttp', '$q', function ($scope, $rootScope, NVRDataModel, message, $ionicSideMenuDelegate, $timeout, $interval, $ionicModal, $ionicLoading, $http, $state, $ionicPopup, $stateParams, $ionicHistory, $ionicScrollDelegate, $ionicPlatform, zm, $ionicPopover, $controller, imageLoadingDataShare, $window, $translate, qHttp, $q) {
+ var broadcastHandles = [];
+ var isSimulStreaming = false;
+ $scope.isSimulStreaming = isSimulStreaming;
+ var areStreamsStopped = false;
+ var viewCleaned = false;
+ //--------------------------------------------------------------------------------------
+ // Handles bandwidth change, if required
+ //
+ //--------------------------------------------------------------------------------------
+ var bc = $scope.$on("bandwidth-change", function (e, data) {
+ // nothing to do for now
+ // eventUrl will use lower BW in next query cycle
+ });
+
+ $scope.getLocalTZ = function () {
+ return moment.tz.guess();
+ };
+ //--------------------------------------
+ // formats events dates in a nice way
+ //---------------------------------------
+ $scope.prettifyDateTimeFirst = function (str) {
+ if (NVRDataModel.getLogin().useLocalTimeZone)
+ return moment.tz(str, NVRDataModel.getTimeZoneNow()).tz(moment.tz.guess()).format(NVRDataModel.getTimeFormat() + '/MMM Do');
+ else
+ return moment(str).format(NVRDataModel.getTimeFormat() + '/MMM Do');
+ };
+ $scope.prettifyDate = function (str) {
+ return moment(str).format('MMM Do, YYYY ' + NVRDataModel.getTimeFormat());
+ };
+
+ function prettifyDate(str) {
+ if (NVRDataModel.getLogin().useLocalTimeZone)
+ return moment.tz(str, NVRDataModel.getTimeZoneNow()).tz(moment.tz.guess()).format('MMM Do');
+ else
+ return moment(str).format('MMM Do');
+ }
+ $scope.prettifyTime = function (str) {
+ if (NVRDataModel.getLogin().useLocalTimeZone)
+ return moment.tz(str, NVRDataModel.getTimeZoneNow()).tz(moment.tz.guess()).format('h:mm a');
+ else
+ return moment(str).format('h:mm a');
+ };
+ $scope.prettify = function (str) {
+ if (NVRDataModel.getLogin().useLocalTimeZone)
+ return moment.tz(str, NVRDataModel.getTimeZoneNow()).tz(moment.tz.guess()).format(NVRDataModel.getTimeFormat() + ' on MMMM Do YYYY');
+ else
+ return moment(str).format(NVRDataModel.getTimeFormat() + ' on MMMM Do YYYY');
+ };
+ $scope.humanizeTime = function (str) {
+ // if (NVRDataModel.getLogin().useLocalTimeZone)
+ return moment.tz(str, NVRDataModel.getTimeZoneNow()).fromNow();
+ // else
+ // return moment(str).fromNow();
+
+ };
+ // if you change date in footer, change hrs
+ $scope.dateChanged = function () {
+ $scope.datetimeValueFrom.hrs = Math.round(moment.duration(moment().diff(moment($scope.datetimeValueFrom.value))).asHours());
+ };
+ // if you change hrs in footer, change date
+ $scope.hrsChanged = function () {
+ $scope.datetimeValueFrom.value = moment().subtract($scope.datetimeValueFrom.hrs, 'hours').toDate();
+ timefrom.toDate();
+ };
+
+ function orientationChanged() {
+ // NVRDataModel.debug("Detected orientation change, redoing packery resize");
+ /* $timeout(function () {
+ pckry.onresize();
+ });*/
+ }
+ //--------------------------------------
+ // pause/unpause nph-zms
+ //---------------------------------------
+ $scope.togglePause = function (mid) {
+ //console.log ("TOGGLE PAUSE " + mid);
+ var m = -1;
+ for (var i = 0; i < $scope.MontageMonitors.length; i++) {
+ if ($scope.MontageMonitors[i].Monitor.Id == mid) {
+ m = i;
+ break;
+ }
}
- $scope.prettifyTime = function(str)
- {
- if (NVRDataModel.getLogin().useLocalTimeZone)
- return moment.tz(str, NVRDataModel.getTimeZoneNow()).tz(moment.tz.guess()).format('h:mm a');
- else
- return moment(str).format('h:mm a');
- };
- $scope.prettify = function(str)
- {
- if (NVRDataModel.getLogin().useLocalTimeZone)
- return moment.tz(str, NVRDataModel.getTimeZoneNow()).tz(moment.tz.guess()).format(NVRDataModel.getTimeFormat() + ' on MMMM Do YYYY');
- else
- return moment(str).format(NVRDataModel.getTimeFormat() + ' on MMMM Do YYYY');
- };
- $scope.humanizeTime = function(str)
- {
- // if (NVRDataModel.getLogin().useLocalTimeZone)
- return moment.tz(str, NVRDataModel.getTimeZoneNow()).fromNow();
- // else
- // return moment(str).fromNow();
-
- };
- // if you change date in footer, change hrs
- $scope.dateChanged = function()
- {
- $scope.datetimeValueFrom.hrs = Math.round(moment.duration(moment().diff(moment($scope.datetimeValueFrom.value))).asHours());
- };
- // if you change hrs in footer, change date
- $scope.hrsChanged = function()
- {
- $scope.datetimeValueFrom.value = moment().subtract($scope.datetimeValueFrom.hrs, 'hours').toDate();
- timefrom.toDate();
- };
+ if (m != -1) {
- function orientationChanged()
- {
- // NVRDataModel.debug("Detected orientation change, redoing packery resize");
- /* $timeout(function () {
- pckry.onresize();
- });*/
+ $scope.MontageMonitors[m].Monitor.isPaused = !$scope.MontageMonitors[m].Monitor.isPaused;
+ var cmd = 1;
+ NVRDataModel.debug("Sending CMD:" + cmd + " for monitor " + $scope.MontageMonitors[m].Monitor.Name);
+ controlEventStream(cmd, "", $scope.MontageMonitors[m].Monitor.connKey, -1);
}
- //--------------------------------------
- // pause/unpause nph-zms
- //---------------------------------------
- $scope.togglePause = function(mid)
- {
- //console.log ("TOGGLE PAUSE " + mid);
- var m = -1;
- for (var i = 0; i < $scope.MontageMonitors.length; i++)
- {
- if ($scope.MontageMonitors[i].Monitor.Id == mid)
- {
- m = i;
- break;
- }
- }
- if (m != -1)
- {
+ };
- $scope.MontageMonitors[m].Monitor.isPaused = !$scope.MontageMonitors[m].Monitor.isPaused;
- var cmd = 1;
- NVRDataModel.debug("Sending CMD:" + cmd + " for monitor " + $scope.MontageMonitors[m].Monitor.Name);
- controlEventStream(cmd, "", $scope.MontageMonitors[m].Monitor.connKey, -1);
- }
- };
+ function sendCmd(mid, cmd, extra) {
- function sendCmd(mid, cmd, extra)
- {
+ var m = -1;
+ for (var i = 0; i < $scope.MontageMonitors.length; i++) {
+ if ($scope.MontageMonitors[i].Monitor.Id == mid) {
+ m = i;
+ break;
+ }
+ }
+ if (m != -1) {
+ NVRDataModel.debug("Sending CMD:" + cmd + " for monitor " + $scope.MontageMonitors[m].Monitor.Name);
+ return controlEventStream(cmd, "", $scope.MontageMonitors[m].Monitor.connKey, -1, extra);
+ }
- var m = -1;
- for (var i = 0; i < $scope.MontageMonitors.length; i++)
- {
- if ($scope.MontageMonitors[i].Monitor.Id == mid)
- {
- m = i;
- break;
- }
- }
- if (m != -1)
- {
- NVRDataModel.debug("Sending CMD:" + cmd + " for monitor " + $scope.MontageMonitors[m].Monitor.Name);
- return controlEventStream(cmd, "", $scope.MontageMonitors[m].Monitor.connKey, -1, extra);
- }
+ }
+ $scope.seek = function (mid, p) {
+ NVRDataModel.debug("Slider called with mid=" + mid + " progress=" + p);
+ var m = -1;
+ for (var i = 0; i < $scope.MontageMonitors.length; i++) {
+ if ($scope.MontageMonitors[i].Monitor.Id == mid) {
+ m = i;
+ break;
+ }
+ }
+ if (m != -1) {
+ $scope.MontageMonitors[i].Monitor.seek = true;
}
- $scope.seek = function(mid, p)
- {
- NVRDataModel.debug("Slider called with mid=" + mid + " progress=" + p);
- var m = -1;
- for (var i = 0; i < $scope.MontageMonitors.length; i++)
- {
- if ($scope.MontageMonitors[i].Monitor.Id == mid)
- {
- m = i;
- break;
- }
- }
- if (m != -1)
- {
- $scope.MontageMonitors[i].Monitor.seek = true;
- }
+ sendCmd(mid, '14', "&offset=" + p)
+ .then(function (success) {
+ //console.log ("Removing seek status from " + $scope.MontageMonitors[i].Monitor.Name);
+ $scope.MontageMonitors[i].Monitor.seek = false;
- sendCmd(mid, '14', "&offset=" + p)
- .then(function(success)
- {
- //console.log ("Removing seek status from " + $scope.MontageMonitors[i].Monitor.Name);
- $scope.MontageMonitors[i].Monitor.seek = false;
+ },
+ function (err) {
+ //console.log ("Removing seek status from " + $scope.MontageMonitors[i].Monitor.Name);
+ $scope.MontageMonitors[i].Monitor.seek = false;
+ });
- },
- function(err)
- {
- //console.log ("Removing seek status from " + $scope.MontageMonitors[i].Monitor.Name);
- $scope.MontageMonitors[i].Monitor.seek = false;
- });
+ };
+ $scope.moveFaster = function (mid) {
+ sendCmd(mid, 4);
+ };
+ $scope.moveSlower = function (mid) {
+ sendCmd(mid, 5);
+ };
+ $scope.movePlay = function (mid) {
+
+ var m = -1;
+ for (var i = 0; i < $scope.MontageMonitors.length; i++) {
+ if ($scope.MontageMonitors[i].Monitor.Id == mid) {
+ m = i;
+ break;
+ }
+ }
+ if (m != -1) {
+ $scope.MontageMonitors[m].Monitor.isPaused = false;
+ var cmd = 2;
+ NVRDataModel.debug("Sending CMD:" + cmd + " for monitor " + $scope.MontageMonitors[m].Monitor.Name);
+ controlEventStream(cmd, "", $scope.MontageMonitors[m].Monitor.connKey, -1);
+ }
+ };
+ //--------------------------------------
+ // Called when ion-footer collapses
+ // note that on init it is also called
+ //---------------------------------------
+ $scope.footerExpand = function () {
+ // console.log ("**************** EXPAND CALLED ***************");
+ $ionicSideMenuDelegate.canDragContent(false);
+ };
+
+
+ $scope.footerCollapse = function () {
+ footerCollapse();
+ };
+ /* Note this is also called when the view is first loaded */
+ function footerCollapse() {
+
+ if (readyToRun == false) {
+ NVRDataModel.debug("fake call to footerCollapse - ignoring");
+ return;
+ }
- };
- $scope.moveFaster = function(mid)
- {
- sendCmd(mid, 4);
- };
- $scope.moveSlower = function(mid)
- {
- sendCmd(mid, 5);
- };
- $scope.movePlay = function(mid)
- {
+ if ($scope.MontageMonitors == undefined) {
+ NVRDataModel.debug("montage array is undefined and not ready");
+ return;
+ }
- var m = -1;
- for (var i = 0; i < $scope.MontageMonitors.length; i++)
- {
- if ($scope.MontageMonitors[i].Monitor.Id == mid)
- {
- m = i;
- break;
- }
- }
- if (m != -1)
- {
- $scope.MontageMonitors[m].Monitor.isPaused = false;
- var cmd = 2;
- NVRDataModel.debug("Sending CMD:" + cmd + " for monitor " + $scope.MontageMonitors[m].Monitor.Name);
- controlEventStream(cmd, "", $scope.MontageMonitors[m].Monitor.connKey, -1);
- }
- };
- //--------------------------------------
- // Called when ion-footer collapses
- // note that on init it is also called
- //---------------------------------------
- $scope.footerExpand = function()
- {
- // console.log ("**************** EXPAND CALLED ***************");
- $ionicSideMenuDelegate.canDragContent(false);
- };
- $scope.footerCollapse = function()
- {
- footerCollapse();
- };
- /* Note this is also called when the view is first loaded */
- function footerCollapse()
- {
- if (readyToRun == false)
- {
- NVRDataModel.debug("fake call to footerCollapse - ignoring");
- return;
- }
+ $interval.cancel($rootScope.eventQueryInterval);
+ $ionicLoading.show({
+ template: $translate.instant('kPleaseWait'),
+ noBackdrop: true,
+ duration: zm.httpTimeout
+ });
- if ($scope.MontageMonitors == undefined)
- {
- NVRDataModel.debug("montage array is undefined and not ready");
- return;
- }
+ $scope.dragBorder = "";
+ $scope.isDragabillyOn = false;
+ $ionicSideMenuDelegate.canDragContent(false);
- $interval.cancel($rootScope.eventQueryInterval);
- $ionicLoading.show(
- {
- template: $translate.instant('kPleaseWait'),
- noBackdrop: true,
- duration: zm.httpTimeout
- });
+ var apiurl;
+ var ld = NVRDataModel.getLogin();
+ $scope.sliderVal.realRate = $scope.sliderVal.rate * 100;
- $scope.dragBorder = "";
- $scope.isDragabillyOn = false;
- $ionicSideMenuDelegate.canDragContent(false);
+ var TimeObjectFrom = moment($scope.datetimeValueFrom.value).format("YYYY-MM-DD HH:mm");
+ var TimeObjectTo = moment().format('YYYY-MM-DD HH:mm');
- areStreamsStopped = true;
+ // At this point of time, we need to ensure From and To are changed to server time
+ //if (NVRDataModel.getLogin().useLocalTimeZone)
- $timeout (function () {
+ var localtz = moment.tz.guess();
+ var servertz = NVRDataModel.getTimeZoneNow();
- for (var i=0; i < $scope.MontageMonitors.length; i++) {
- if ($scope.MontageMonitors[i].Monitor.listDisplay == 'show') NVRDataModel.killLiveStream($scope.MontageMonitors[i].Monitor.connKey, $scope.MontageMonitors[i].Monitor.controlURL, $scope.MontageMonitors[i].Monitor.Name);
- }
-
- NVRDataModel.regenConnKeys();
- $scope.monitors = NVRDataModel.getMonitorsNow();
- $scope.MontageMonitors = angular.copy($scope.monitors);
+ NVRDataModel.log("Local timezone conversion is on, converting from " + localtz + " to " + servertz);
+ NVRDataModel.log("Original From: " + TimeObjectFrom + " Original To: " + TimeObjectTo);
- NVRDataModel.debug(">>Initializing connkeys and images...");
- for ( i = 0; i < $scope.MontageMonitors.length; i++)
- {
- //$scope.MontageMonitors[i].Monitor.connKey='';
- $scope.MontageMonitors[i].Monitor.eid = "-1";
- $scope.MontageMonitors[i].Monitor.eventUrl = 'img/noevent.png';
- $scope.MontageMonitors[i].Monitor.eid = "-1";
- $scope.MontageMonitors[i].Monitor.eventUrlTime = "";
- $scope.MontageMonitors[i].Monitor.isPaused = false;
- $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.sliderProgress = {
- progress: 0
- };
- }
- $timeout(function () {
- initPackery();
- }, zm.packeryTimer);
-
+ TimeObjectFrom = moment.tz(TimeObjectFrom, localtz).tz(servertz).format("YYYY-MM-DD HH:mm");
+ TimeObjectTo = moment.tz(TimeObjectTo, localtz).tz(servertz).format("YYYY-MM-DD HH:mm");
- });
-
-
- var ld = NVRDataModel.getLogin();
- $scope.sliderVal.realRate = $scope.sliderVal.rate * 100;
+ NVRDataModel.log("Converted From: " + TimeObjectFrom + " Converted To: " + TimeObjectTo);
- var TimeObjectFrom = moment($scope.datetimeValueFrom.value).format("YYYY-MM-DD HH:mm");
- var TimeObjectTo = moment().format('YYYY-MM-DD HH:mm');
- // At this point of time, we need to ensure From and To are changed to server time
- //if (NVRDataModel.getLogin().useLocalTimeZone)
- if (1)
- {
- var localtz = moment.tz.guess();
- var servertz = NVRDataModel.getTimeZoneNow();
- NVRDataModel.log("Local timezone conversion is on, converting from " + localtz + " to " + servertz);
- NVRDataModel.log("Original From: " + TimeObjectFrom + " Original To: " + TimeObjectTo);
+ areStreamsStopped = true; // kill current view
- TimeObjectFrom = moment.tz(TimeObjectFrom, localtz).tz(servertz).format("YYYY-MM-DD HH:mm");
- TimeObjectTo = moment.tz(TimeObjectTo, localtz).tz(servertz).format("YYYY-MM-DD HH:mm");
+ $timeout(function () {
- NVRDataModel.log("Converted From: " + TimeObjectFrom + " Converted To: " + TimeObjectTo);
+ NVRDataModel.debug("Killing existing streams, if alive...");
+ for (var i = 0; i < $scope.MontageMonitors.length; i++) {
+ if ($scope.MontageMonitors[i].Monitor.listDisplay == 'show' && $scope.MontageMonitors[i].Monitor.eventUrl != 'img/noevent.png') NVRDataModel.killLiveStream($scope.MontageMonitors[i].Monitor.connKey, $scope.MontageMonitors[i].Monitor.controlURL, $scope.MontageMonitors[i].Monitor.Name);
+ }
- }
+ //NVRDataModel.regenConnKeys();
+ //$scope.monitors = NVRDataModel.getMonitorsNow();
+ //$scope.MontageMonitors = angular.copy($scope.monitors);
+
+ NVRDataModel.debug(">>Initializing monitor array with history specific stuff...");
+ for (i = 0; i < $scope.MontageMonitors.length; i++) {
+ //$scope.MontageMonitors[i].Monitor.connKey='';
+ //$scope.MontageMonitors[i].Monitor.connKey = (Math.floor((Math.random() * 99999) + 1)).toString();
+ $scope.MontageMonitors[i].Monitor.eventUrl = 'img/noevent.png';
+ $scope.MontageMonitors[i].Monitor.eid = "-1";
+ $scope.MontageMonitors[i].Monitor.eventUrlTime = "";
+ $scope.MontageMonitors[i].Monitor.isPaused = false;
+ $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.sliderProgress = {
+ progress: 0
+ };
+ }
- var apiurl;
+ getNextSetHistory();
- // release all active streams
- for (var i = 0; i < $scope.MontageMonitors.length; i++)
- {
- $scope.MontageMonitors[i].Monitor.selectStyle = "";
- $scope.MontageMonitors[i].Monitor.eid = "-1";
- // generate new connKeys if timeline changes
- if ($scope.MontageMonitors[i].Monitor.eventUrl != 'img/noevent.png')
- {
- // this means this mid was showing a message, now we need to change it
- // so kill prev. stream first
- NVRDataModel.log("footerCollapse: Calling kill with " + $scope.MontageMonitors[i].Monitor.connKey + " for Monitor:" + $scope.MontageMonitors[i].Monitor.Name);
- //var tmpCK = angular.copy($scope.MontageMonitors[i].Monitor.connKey);
- //timedControlEventStream(2500, 17, "", tmpCK, -1);
- controlEventStream(17, "", $scope.MontageMonitors[i].Monitor.connKey, -1);
- $scope.MontageMonitors[i].Monitor.eventUrl = "img/noevent.png";
- $scope.MontageMonitors[i].Monitor.eid = "-1";
- $scope.MontageMonitors[i].Monitor.connKey = (Math.floor((Math.random() * 999999) + 1)).toString();
- $scope.MontageMonitors[i].Monitor.noGraph = true;
- //console.log ("Generating connkey: " +$scope.MontageMonitors[i].Monitor.connKey);
- }
- }
- // grab events that start on or after the time
- apiurl = ld.apiurl + "/events/index/StartTime >=:" + TimeObjectFrom + "/AlarmFrames >=:" + (ld.enableAlarmCount ? ld.minAlarmCount : 0) + ".json";
- NVRDataModel.log("Event timeline API is " + apiurl);
- // make sure there are no more than 5 active streams (noevent is ok)
- $scope.currentLimit = $scope.monLimit;
- //qHttp.get(apiurl)
- $http(
- {
- method: 'get',
- url: apiurl
- }).then(function(succ)
- {
- var data = succ.data;
- var ld = NVRDataModel.getLogin();
- NVRDataModel.debug("Got " + data.events.length + "new history events...");
- var eid, mid, stime;
- for (i = 0; i < data.events.length; i++)
- {
- mid = data.events[i].Event.MonitorId;
- eid = data.events[i].Event.Id;
- //console.log ("Event ID:"+eid);
- stime = data.events[i].Event.StartTime;
- // only take the first one for each monitor
- for (var j = 0; j < $scope.MontageMonitors.length; j++)
- {
- $scope.MontageMonitors[j].Monitor.isPaused = false;
- // that's the earliest match and play gapless from there
- if ($scope.MontageMonitors[j].Monitor.Id == mid)
- {
- if ($scope.MontageMonitors[j].Monitor.eventUrl == 'img/noevent.png')
- {
- // console.log ("Old value of event url " + $scope.MontageMonitors[j].eventUrl);
- //console.log ("ldurl is " + ld.streamingurl);
- var bw = NVRDataModel.getBandwidth() == "lowbw" ? zm.eventMontageQualityLowBW : ld.montageHistoryQuality;
- $scope.MontageMonitors[j].Monitor.eventUrl = $scope.MontageMonitors[j].Monitor.streamingURL + "/nph-zms?source=event&mode=jpeg&event=" + eid + "&frame=1&replay=gapless&rate=" + $scope.sliderVal.realRate + "&connkey=" + $scope.MontageMonitors[j].Monitor.connKey + "&scale=" + bw + "&rand=" + $rootScope.rand;
- //console.log ("Setting event URL to " +$scope.MontageMonitors[j].Monitor.eventUrl);
- // console.log ("SWITCHING TO " + $scope.MontageMonitors[j].eventUrl);
- $scope.MontageMonitors[j].Monitor.eventUrlTime = stime;
- $scope.MontageMonitors[j].Monitor.eid = eid;
- $scope.MontageMonitors[j].Monitor.eventDuration = data.events[i].Event.Length;
- $scope.MontageMonitors[j].Monitor.sliderProgress = {
- progress: 0
- };
- //console.log(">>> Setting Event for " + $scope.MontageMonitors[j].Monitor.Name + " to " + eid);
- // now lets get the API for that event for graphing
- $scope.MontageMonitors[j].Monitor.noGraph = true;
-
- }
- }
- }
- }
- // make sure we do our best to get that duration for all monitors
- // in the above call, is possible some did not make the cut in the first page
- NVRDataModel.log("Making sure all monitors have a fair chance...");
- var promises = [];
- for (i = 0; i < $scope.MontageMonitors.length; i++)
- {
- //console.log("Fair chance check for " + $scope.MontageMonitors[i].Monitor.Name);
- if ($scope.MontageMonitors[i].Monitor.eventUrl == 'img/noevent.png')
- {
- var indivGrab = ld.apiurl + "/events/index/MonitorId:" + $scope.MontageMonitors[i].Monitor.Id + "/StartTime >=:" + TimeObjectFrom + "/AlarmFrames >=:" + (ld.enableAlarmCount ? ld.minAlarmCount : 0) + ".json";
- NVRDataModel.debug("Monitor " + $scope.MontageMonitors[i].Monitor.Id + ":" + $scope.MontageMonitors[i].Monitor.Name + " does not have events, trying " + indivGrab);
- var p = getExpandedEvents(i, indivGrab);
- promises.push(p);
+ });
- }
- }
- $q.all(promises).then(doPackery);
+ function getNextSetHistory() {
- // At this stage, we have both a general events grab, and specific event grabs for MIDS that were empty
+ // grab events that start on or after the time
+ apiurl = ld.apiurl + "/events/index/StartTime >=:" + TimeObjectFrom + "/AlarmFrames >=:" + (ld.enableAlarmCount ? ld.minAlarmCount : 0) + ".json";
+ NVRDataModel.log("Grabbing history using: " + apiurl);
+ // make sure there are no more than 5 active streams (noevent is ok)
+ $scope.currentLimit = $scope.monLimit;
+ //qHttp.get(apiurl)
+ $http({
+ method: 'get',
+ url: apiurl
+ }).then(function (succ) {
+ var data = succ.data;
+ var ld = NVRDataModel.getLogin();
+ NVRDataModel.debug("Got " + data.events.length + "new history events...");
+ var eid, mid, stime;
+ for (i = 0; i < data.events.length; i++) {
+ mid = data.events[i].Event.MonitorId;
+ eid = data.events[i].Event.Id;
+ //console.log ("Event ID:"+eid);
+ stime = data.events[i].Event.StartTime;
+ // only take the first one for each monitor
+ for (var j = 0; j < $scope.MontageMonitors.length; j++) {
+ $scope.MontageMonitors[j].Monitor.isPaused = false;
+ // that's the earliest match and play gapless from there
+ if ($scope.MontageMonitors[j].Monitor.Id == mid) {
+ if ($scope.MontageMonitors[j].Monitor.eventUrl == 'img/noevent.png') {
+ // console.log ("Old value of event url " + $scope.MontageMonitors[j].eventUrl);
+ //console.log ("ldurl is " + ld.streamingurl);
+ var bw = NVRDataModel.getBandwidth() == "lowbw" ? zm.eventMontageQualityLowBW : ld.montageHistoryQuality;
+ $scope.MontageMonitors[j].Monitor.eventUrl = $scope.MontageMonitors[j].Monitor.streamingURL + "/nph-zms?source=event&mode=jpeg&event=" + eid + "&frame=1&replay=gapless&rate=" + $scope.sliderVal.realRate + "&connkey=" + $scope.MontageMonitors[j].Monitor.connKey + "&scale=" + bw + "&rand=" + $rootScope.rand;
+ //console.log ("Setting event URL to " +$scope.MontageMonitors[j].Monitor.eventUrl);
+ // console.log ("SWITCHING TO " + $scope.MontageMonitors[j].eventUrl);
+ $scope.MontageMonitors[j].Monitor.eventUrlTime = stime;
+ $scope.MontageMonitors[j].Monitor.eid = eid;
+ $scope.MontageMonitors[j].Monitor.eventDuration = data.events[i].Event.Length;
+ $scope.MontageMonitors[j].Monitor.sliderProgress = {
+ progress: 0
+ };
+ //console.log(">>> Setting Event for " + $scope.MontageMonitors[j].Monitor.Name + " to " + eid);
+ // now lets get the API for that event for graphing
+ $scope.MontageMonitors[j].Monitor.noGraph = true;
- function doPackery()
- {
- // $ionicLoading.hide();
- //console.log("REDOING PACKERY & DRAG");
- NVRDataModel.debug("Re-creating packery and draggy");
- if (pckry !== undefined)
- {
- // remove current draggies
- draggies.forEach(function(drag)
- {
- drag.destroy();
- });
- draggies = [];
- // destroy existing packery object
- pckry.destroy();
- initPackery();
-
- $rootScope.eventQueryInterval = $interval(function()
- {
- checkAllEvents();
- }.bind(this), zm.eventHistoryTimer);
- }
+ }
}
- }, function(err)
- {
- NVRDataModel.debug("history ERROR:" + JSON.stringify(err));
- });
-
- function getExpandedEvents(i, indivGrab)
- {
- var d = $q.defer();
- var ld = NVRDataModel.getLogin();
- // console.log ("Expanded API: " + indivGrab);
- $http(
- {
- method: 'get',
- url: indivGrab
- }).then(function(succ)
- {
- var data = succ.data;
- // console.log ("EXPANDED DATA FOR MONITOR " + i + JSON.stringify(data));
- if (data.events.length > 0)
- {
- if (!NVRDataModel.isBackground())
- {
- var bw = NVRDataModel.getBandwidth() == "lowbw" ? zm.eventMontageQualityLowBW : ld.montageHistoryQuality;
- $scope.MontageMonitors[i].Monitor.eventUrl = $scope.MontageMonitors[i].Monitor.streamingURL + "/nph-zms?source=event&mode=jpeg&event=" + data.events[0].Event.Id + "&frame=1&replay=gapless&rate=" + $scope.sliderVal.realRate + "&connkey=" + $scope.MontageMonitors[i].Monitor.connKey + "&scale=" + bw + "&rand=" + $rootScope.rand;
- //console.log ("SWITCHING TO " + $scope.MontageMonitors[i].eventUrl);
- $scope.MontageMonitors[i].Monitor.eventUrlTime = data.events[0].Event.StartTime;
- $scope.MontageMonitors[i].Monitor.eid = data.events[0].Event.Id;
- $scope.MontageMonitors[i].Monitor.noGraph = true;
- $scope.MontageMonitors[i].Monitor.sliderProgress = {
- progress: 0
- };
- $scope.MontageMonitors[i].Monitor.eventDuration = data.events[0].Event.Length;
- //console.log(">>> Setting Event for " + $scope.MontageMonitors[i].Monitor.Name + " to " + data.events[0].Event.Id);
- NVRDataModel.log("Found expanded event " + data.events[0].Event.Id + " for monitor " + $scope.MontageMonitors[i].Monitor.Id);
- }
- else
- {
- // $scope.MontageMonitors[i].eventUrl="img/noevent.png";
- // $scope.MontageMonitors[i].eventUrlTime = "";
- // NVRDataModel.log ("Setting img src to null as data received in background");
- }
- }
- d.resolve(true);
- return d.promise;
- },
- function(err)
- {
- d.resolve(true);
- return d.promise;
- }
-
- );
- return d.promise;
+ }
}
- }
- //---------------------------------------------------------
- // This is periodically called to get the current playing
- // event by zms. I use this to display a timestamp
- // Its a 2 step process - get event Id then go a Event
- // API call to get time stamp. Sucks
- //---------------------------------------------------------
- function checkAllEvents()
- {
- //console.log("Timer:Events are checked....");
-
- //if (pckry && !$scope.isDragabillyOn) pckry.shiftLayout();
+ // make sure we do our best to get that duration for all monitors
+ // in the above call, is possible some did not make the cut in the first page
+ NVRDataModel.log("Making sure all monitors have a fair chance...");
+ var promises = [];
+ for (i = 0; i < $scope.MontageMonitors.length; i++) {
+ //console.log("Fair chance check for " + $scope.MontageMonitors[i].Monitor.Name);
+ if ($scope.MontageMonitors[i].Monitor.eventUrl == 'img/noevent.png') {
+ var indivGrab = ld.apiurl + "/events/index/MonitorId:" + $scope.MontageMonitors[i].Monitor.Id + "/StartTime >=:" + TimeObjectFrom + "/AlarmFrames >=:" + (ld.enableAlarmCount ? ld.minAlarmCount : 0) + ".json";
+ NVRDataModel.debug("Monitor " + $scope.MontageMonitors[i].Monitor.Id + ":" + $scope.MontageMonitors[i].Monitor.Name + " does not have events, trying " + indivGrab);
+ var p = getExpandedEvents(i, indivGrab);
+ promises.push(p);
+
+ }
- for (var i = 0; i < $scope.MontageMonitors.length; i++)
- {
- // don't check for monitors that are not shown
- // because nph connkey won't exist and the response
- // will fail
- if ($scope.MontageMonitors[i].Monitor.eventUrl != "" && $scope.MontageMonitors[i].Monitor.eventUrl != 'img/noevent.png' && $scope.MontageMonitors[i].Monitor.connKey != '' && $scope.MontageMonitors[i].Monitor.Function != 'None' && $scope.MontageMonitors[i].Monitor.listDisplay != 'noshow' && $scope.MontageMonitors[i].Monitor.Enabled != '0')
- {
- // NVRDataModel.debug("Checking event status for " + $scope.MontageMonitors[i].Monitor.Name + ":" + $scope.MontageMonitors[i].Monitor.eventUrl + ":" + $scope.MontageMonitors[i].Monitor.Function + ":" + $scope.MontageMonitors[i].Monitor.listDisplay);
- // console.log ("Sending query 99 for " + $scope.MontageMonitors[i].Monitor.Name + " with ck="+$scope.MontageMonitors[i].Monitor.connKey);
- controlEventStream('99', '', $scope.MontageMonitors[i].Monitor.connKey, i);
- }
}
- }
- //--------------------------------------------------------------
- // Used to control zms for a connkey. If ndx is not -1,
- // then it also calls an event API for the returned eid
- // and stores its time in the montage monitors array
- //--------------------------------------------------------------
- $scope.controlEventStream = function(cmd, disp, connkey, ndx)
- {
- controlEventStream(cmd, disp, connkey, ndx);
- };
+ $q.all(promises).then(doPackery);
- function timedControlEventStream(mTime, cmd, disp, connkey, ndx)
- {
- var mMtime = mTime || 2000;
- NVRDataModel.debug("Deferring control " + cmd + " by " + mMtime);
- $timeout(function()
- {
- subControlStream(cmd, connkey);
- }, mMtime);
- }
+ // At this stage, we have both a general events grab, and specific event grabs for MIDS that were empty
- function subControlStream(cmd, connkey)
- {
- var loginData = NVRDataModel.getLogin();
- var myauthtoken = $rootScope.authSession.replace("&auth=", "");
- //&auth=
- var req = qHttp(
- {
- method: 'POST',
- /*timeout: 15000,*/
- url: loginData.url + '/index.php',
- headers:
- {
- 'Content-Type': 'application/x-www-form-urlencoded', //'Accept': '*/*',
- },
- transformRequest: function(obj)
- {
- var str = [];
- for (var p in obj) str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
- var foo = str.join("&");
- //console.log("****SUB RETURNING " + foo);
- return foo;
- },
- data:
- {
- view: "request",
- request: "stream",
- connkey: connkey,
- command: cmd,
- auth: myauthtoken, // user: loginData.username,
- // pass: loginData.password
- }
- });
- req.then(function(succ)
- {
- NVRDataModel.debug("subControl success:" + JSON.stringify(succ));
- }, function(err)
- {
- NVRDataModel.debug("subControl error:" + JSON.stringify(err));
- });
- }
-
- function controlEventStream(cmd, disp, connkey, ndx, extras)
- {
- // console.log("Command value " + cmd);
-
- var d = $q.defer();
- if (disp)
- {
- $ionicLoading.hide();
- $ionicLoading.show(
- {
- template: $translate.instant('kPleaseWait') + "...",
- noBackdrop: true,
- duration: zm.loadingTimeout,
+ function doPackery() {
+ // $ionicLoading.hide();
+ //console.log("REDOING PACKERY & DRAG");
+ NVRDataModel.debug("Re-creating packery and draggy");
+
+ // remove current draggies
+ draggies.forEach(function (drag) {
+ drag.destroy();
});
+ draggies = [];
+ // destroy existing packery object
+ if (pckry) pckry.destroy();
+ initPackery();
+
+ $interval.cancel($rootScope.eventQueryInterval);
+ $rootScope.eventQueryInterval = $interval(function () {
+ checkAllEvents();
+ }.bind(this), zm.eventHistoryTimer);
+
}
- var loginData = NVRDataModel.getLogin();
- /*
- var CMD_NONE = 0;
- var CMD_PAUSE = 1;
- var CMD_PLAY = 2;
- var CMD_STOP = 3;
- var CMD_FASTFWD = 4;
- var CMD_SLOWFWD = 5;
- var CMD_SLOWREV = 6;
- var CMD_FASTREV = 7;
- var CMD_ZOOMIN = 8;
- var CMD_ZOOMOUT = 9;
- var CMD_PAN = 10;
- var CMD_SCALE = 11;
- var CMD_PREV = 12;
- var CMD_NEXT = 13;
- var CMD_SEEK = 14;
- var CMD_QUERY = 99;
- */
- // You need to POST commands to control zms
- // Note that I am url encoding the parameters into the URL
- // If I leave it as JSON, it gets converted to OPTONS due
- // to CORS behaviour and ZM/Apache don't seem to handle it
- //console.log("POST: " + loginData.url + '/index.php');
- //console.log ("AUTH IS " + $rootScope.authSession);
- var myauthtoken = $rootScope.authSession.replace("&auth=", "");
- //&auth=
- var req = qHttp(
- {
- method: 'POST',
- /*timeout: 15000,*/
- url: loginData.url + '/index.php',
- headers:
- {
- 'Content-Type': 'application/x-www-form-urlencoded', //'Accept': '*/*',
- },
- transformRequest: function(obj)
- {
- var str = [];
- for (var p in obj) str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
- var foo = str.join("&");
- if (extras) foo = foo + extras;
- //console.log("****RETURNING " + foo);
- return foo;
- },
- data:
- {
- view: "request",
- request: "stream",
- connkey: connkey,
- command: cmd,
- auth: myauthtoken, // user: loginData.username,
- // pass: loginData.password
- }
- });
- req.then(function(succ)
- {
- var resp = succ.data;
-
- //console.log ("zms response: " + JSON.stringify(resp));
-
- // move progress bar if event id is the same
- if (resp.result == "Ok" && ndx != -1 && (resp.status.event == $scope.MontageMonitors[ndx].Monitor.eid))
- {
- if (!$scope.MontageMonitors[ndx].Monitor.seek)
- {
- $scope.MontageMonitors[ndx].Monitor.sliderProgress.progress = resp.status.progress;
- }
- else
- {
- NVRDataModel.debug("Skipping progress as seek is active for " + $scope.MontageMonitors[ndx].Monitor.Name);
- }
- }
+ }, function (err) {
+ NVRDataModel.debug("history ERROR:" + JSON.stringify(err));
+ });
- if (resp.result == "Ok" && ndx != -1 && ((resp.status.event != $scope.MontageMonitors[ndx].Monitor.eid) || $scope.MontageMonitors[ndx].Monitor.noGraph == true))
- {
- $scope.MontageMonitors[ndx].Monitor.noGraph = false;
- // $scope.MontageMonitors[ndx].Monitor.sliderProgress.progress = 0;
- NVRDataModel.debug("Fetching details, as event changed for " + $scope.MontageMonitors[ndx].Monitor.Name + " from " + $scope.MontageMonitors[ndx].Monitor.eid + " to " + resp.status.event);
- var ld = NVRDataModel.getLogin();
- var apiurl = ld.apiurl + "/events/" + resp.status.event + ".json";
- //console.log ("API " + apiurl);
- qHttp(
- {
- method: 'get',
- url: apiurl
- }).then(function(succ)
- {
- var data = succ.data;
- var currentEventTime = moment(data.event.Event.StartTime);
- var maxTime = moment();
- //NVRDataModel.debug ("Monitor: " + $scope.MontageMonitors[ndx].Monitor.Id + " max time="+maxTime + "("+$scope.datetimeValueTo.value+")"+ " current="+currentEventTime + "("+data.event.Event.StartTime+")");
-
- NVRDataModel.debug("creating graph for " + $scope.MontageMonitors[ndx].Monitor.Name);
- var framearray = {
- labels: [],
- datasets: [
- {
- backgroundColor: 'rgba(242, 12, 12, 0.5)',
- borderColor: 'rgba(242, 12, 12, 0.5)',
- data: [],
- }]
- };
- framearray.labels = [];
- var ld = NVRDataModel.getLogin();
- //console.log(">>>>> GRAPH");
- for (i = 0; i < data.event.Frame.length; i++)
- {
- var ts = moment(data.event.Frame[i].TimeStamp).format(timeFormat);
- //console.log ("pushing s:" + event.Frame[i].Score+" t:"+ts);
- framearray.datasets[0].data.push(
- {
- x: ts,
- y: data.event.Frame[i].Score
- });
- framearray.labels.push("");
- }
- $timeout(function()
- {
- drawGraph(framearray, $scope.MontageMonitors[ndx].Monitor.Id);
- }, 100);
- var element = angular.element(document.getElementById($scope.MontageMonitors[ndx].Monitor.Id + "-timeline"));
- element.removeClass('animated flipInX');
- element.addClass('animated flipOutX');
- $timeout(function()
- {
- element.removeClass('animated flipOutX');
- element.addClass('animated flipInX');
- $scope.MontageMonitors[ndx].Monitor.eventUrlTime = data.event.Event.StartTime;
- var bw = NVRDataModel.getBandwidth() == "lowbw" ? zm.eventMontageQualityLowBW : ld.montageHistoryQuality;
- $scope.MontageMonitors[ndx].Monitor.eventUrl = $scope.MontageMonitors[ndx].Monitor.streamingURL + "/nph-zms?source=event&mode=jpeg&event=" + data.event.Event.Id + "&frame=1&replay=gapless&rate=" + $scope.sliderVal.realRate + "&connkey=" + $scope.MontageMonitors[ndx].Monitor.connKey + "&scale=" + bw + "&rand=" + $rootScope.rand;
- $scope.MontageMonitors[ndx].Monitor.eid = data.event.Event.Id;
- $scope.MontageMonitors[ndx].Monitor.sliderProgress = {
- progress: 0
- };
- $scope.MontageMonitors[ndx].Monitor.eventDuration = data.event.Event.Length;
- //console.log(">>> Setting Event for " + $scope.MontageMonitors[ndx].Monitor.Name + " to " + data.event.Event.Id);
- }, 700);
-
- }, function(err)
- {
- NVRDataModel.debug("skipping graph as detailed API failed for " + $scope.MontageMonitors[ndx].Monitor.Name);
- $scope.MontageMonitors[ndx].Monitor.eventUrlTime = "-";
- });
+ function getExpandedEvents(i, indivGrab) {
+ var d = $q.defer();
+ var ld = NVRDataModel.getLogin();
+ // console.log ("Expanded API: " + indivGrab);
+ $http({
+ method: 'get',
+ url: indivGrab
+ }).then(function (succ) {
+ var data = succ.data;
+ // console.log ("EXPANDED DATA FOR MONITOR " + i + JSON.stringify(data));
+ if (data.events.length > 0) {
+ if (!NVRDataModel.isBackground()) {
+ var bw = NVRDataModel.getBandwidth() == "lowbw" ? zm.eventMontageQualityLowBW : ld.montageHistoryQuality;
+ $scope.MontageMonitors[i].Monitor.eventUrl = $scope.MontageMonitors[i].Monitor.streamingURL + "/nph-zms?source=event&mode=jpeg&event=" + data.events[0].Event.Id + "&frame=1&replay=gapless&rate=" + $scope.sliderVal.realRate + "&connkey=" + $scope.MontageMonitors[i].Monitor.connKey + "&scale=" + bw + "&rand=" + $rootScope.rand;
+ //console.log ("SWITCHING TO " + $scope.MontageMonitors[i].eventUrl);
+ $scope.MontageMonitors[i].Monitor.eventUrlTime = data.events[0].Event.StartTime;
+ $scope.MontageMonitors[i].Monitor.eid = data.events[0].Event.Id;
+ $scope.MontageMonitors[i].Monitor.noGraph = true;
+ $scope.MontageMonitors[i].Monitor.sliderProgress = {
+ progress: 0
+ };
+ $scope.MontageMonitors[i].Monitor.eventDuration = data.events[0].Event.Length;
+ //console.log(">>> Setting Event for " + $scope.MontageMonitors[i].Monitor.Name + " to " + data.events[0].Event.Id);
+ NVRDataModel.log("Found expanded event " + data.events[0].Event.Id + " for monitor " + $scope.MontageMonitors[i].Monitor.Id);
+ } else {
+ // $scope.MontageMonitors[i].eventUrl="img/noevent.png";
+ // $scope.MontageMonitors[i].eventUrlTime = "";
+ // NVRDataModel.log ("Setting img src to null as data received in background");
+ }
}
d.resolve(true);
return d.promise;
- }, function(err)
- {
- d.reject(false);
- NVRDataModel.log("Error sending event command " + JSON.stringify(err), "error");
+ },
+ function (err) {
+ d.resolve(true);
return d.promise;
- });
+ }
+
+ );
return d.promise;
- }
- $scope.isBackground = function()
- {
- return NVRDataModel.isBackground();
- };
- //----------------------------------------------------------------
- // Alarm notification handling
- //----------------------------------------------------------------
- $scope.handleAlarms = function()
- {
- $rootScope.isAlarm = !$rootScope.isAlarm;
- if (!$rootScope.isAlarm)
- {
- $rootScope.alarmCount = "0";
- $ionicHistory.nextViewOptions(
- {
- disableBack: true
- });
- $state.go("app.events",
- {
- "id": 0,
- "playEvent": false
- },
- {
- reload: true
- });
- return;
- }
- };
- $scope.handleAlarmsWhileMinimized = function()
- {
- $rootScope.isAlarm = !$rootScope.isAlarm;
- $scope.minimal = !$scope.minimal;
- NVRDataModel.debug("MontageHistoryCtrl: switch minimal is " + $scope.minimal);
- ionic.Platform.fullScreen($scope.minimal, !$scope.minimal);
- $interval.cancel(intervalHandle);
- $interval.cancel($rootScope.eventQueryInterval);
- if (!$rootScope.isAlarm)
- {
- $rootScope.alarmCount = "0";
- $ionicHistory.nextViewOptions(
- {
- disableBack: true
- });
- $state.go("app.events",
- {
- "id": 0,
- "playEvent": false,
- },
- {
- reload: true
- });
- return;
- }
- };
- //-------------------------------------------------------------
- // 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 Montage and returned " +
- //NVRDataModel.isBackground());
- return NVRDataModel.isBackground();
- };
- $scope.toggleControls = function()
- {
- $scope.showControls = !$scope.showControls;
- };
- $scope.toggleSelectItem = function(ndx)
- {
- 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();
- };
+ }
- function dragToggle()
- {
- var i;
- $scope.isDragabillyOn = !$scope.isDragabillyOn;
- $ionicSideMenuDelegate.canDragContent($scope.isDragabillyOn ? false : true);
- //$timeout(function(){pckry.reloadItems();},10);
- NVRDataModel.debug("setting dragabilly to " + $scope.isDragabillyOn);
- if ($scope.isDragabillyOn)
- {
- $scope.showSizeButtons = 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()
- {
- pckry.shiftLayout();
- /*var positions = pckry.getShiftPositions('data-item-id');
- //console.log ("POSITIONS MAP " + JSON.stringify(positions));
- var ld = NVRDataModel.getLogin();
- ld.packeryPositions = JSON.stringify(positions);
- NVRDataModel.setLogin(ld);*/
- }, 300);
- }, 100);
- }
+ }// getNextHistory
+
+
+ }
+ //---------------------------------------------------------
+ // This is periodically called to get the current playing
+ // event by zms. I use this to display a timestamp
+ // Its a 2 step process - get event Id then go a Event
+ // API call to get time stamp. Sucks
+ //---------------------------------------------------------
+ function checkAllEvents() {
+ //console.log("Timer:Events are checked....");
+
+ //if (pckry && !$scope.isDragabillyOn) pckry.shiftLayout();
+
+ for (var i = 0; i < $scope.MontageMonitors.length; i++) {
+ // don't check for monitors that are not shown
+ // because nph connkey won't exist and the response
+ // will fail
+ if ($scope.MontageMonitors[i].Monitor.eventUrl != "" && $scope.MontageMonitors[i].Monitor.eventUrl != 'img/noevent.png' && $scope.MontageMonitors[i].Monitor.connKey != '' && $scope.MontageMonitors[i].Monitor.Function != 'None' && $scope.MontageMonitors[i].Monitor.listDisplay != 'noshow' && $scope.MontageMonitors[i].Monitor.Enabled != '0') {
+ // NVRDataModel.debug("Checking event status for " + $scope.MontageMonitors[i].Monitor.Name + ":" + $scope.MontageMonitors[i].Monitor.eventUrl + ":" + $scope.MontageMonitors[i].Monitor.Function + ":" + $scope.MontageMonitors[i].Monitor.listDisplay);
+ // console.log ("Sending query 99 for " + $scope.MontageMonitors[i].Monitor.Name + " with ck="+$scope.MontageMonitors[i].Monitor.connKey);
+ controlEventStream('99', '', $scope.MontageMonitors[i].Monitor.connKey, i);
+ }
}
-
-
- //---------------------------------------------------------------------
- // Show/Hide PTZ control in monitor view
- //---------------------------------------------------------------------
- $scope.togglePTZ = function()
- {
- $scope.showPTZ = !$scope.showPTZ;
- };
- $scope.callback = function()
- {
- // console.log("dragging");
- };
- $scope.onDropComplete = function(index, obj, event)
- {
- //console.log("dragged");
- var otherObj = $scope.MontageMonitors[index];
- var otherIndex = $scope.MontageMonitors.indexOf(obj);
- $scope.MontageMonitors[index] = obj;
- $scope.MontageMonitors[otherIndex] = otherObj;
- };
- //---------------------------------------------------------------------
- // changes order of montage display
- //---------------------------------------------------------------------
- $scope.toggleMontageDisplayOrder = function()
- {
- $scope.packMontage = !$scope.packMontage;
- loginData.packMontage = $scope.packMontage;
- NVRDataModel.setLogin(loginData);
- //console.log ("Switching orientation");
- };
- //---------------------------------------------------------------------
- // In Android, the app runs full steam while in background mode
- // while in iOS it gets suspended unless you ask for specific resources
- // So while this view, we DON'T want Android to keep sending 1 second
- // refreshes to the server for images we are not seeing
- //---------------------------------------------------------------------
- function onPause()
- {
- NVRDataModel.debug("MontageHistoryCtrl: onpause called");
- viewCleanup();
- viewCleaned = true;
+ }
+ //--------------------------------------------------------------
+ // Used to control zms for a connkey. If ndx is not -1,
+ // then it also calls an event API for the returned eid
+ // and stores its time in the montage monitors array
+ //--------------------------------------------------------------
+ $scope.controlEventStream = function (cmd, disp, connkey, ndx) {
+ controlEventStream(cmd, disp, connkey, ndx);
+ };
+
+ function timedControlEventStream(mTime, cmd, disp, connkey, ndx) {
+ var mMtime = mTime || 2000;
+ NVRDataModel.debug("Deferring control " + cmd + " by " + mMtime);
+ $timeout(function () {
+ subControlStream(cmd, connkey);
+ }, mMtime);
+ }
+
+ function subControlStream(cmd, connkey) {
+ var loginData = NVRDataModel.getLogin();
+ var myauthtoken = $rootScope.authSession.replace("&auth=", "");
+ //&auth=
+ var req = qHttp({
+ method: 'POST',
+ /*timeout: 15000,*/
+ url: loginData.url + '/index.php',
+ headers: {
+ 'Content-Type': 'application/x-www-form-urlencoded', //'Accept': '*/*',
+ },
+ transformRequest: function (obj) {
+ var str = [];
+ for (var p in obj) str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
+ var foo = str.join("&");
+ //console.log("****SUB RETURNING " + foo);
+ return foo;
+ },
+ data: {
+ view: "request",
+ request: "stream",
+ connkey: connkey,
+ command: cmd,
+ auth: myauthtoken, // user: loginData.username,
+ // pass: loginData.password
+ }
+ });
+ req.then(function (succ) {
+ NVRDataModel.debug("subControl success:" + JSON.stringify(succ));
+ }, function (err) {
+ NVRDataModel.debug("subControl error:" + JSON.stringify(err));
+ });
+ }
+
+ function controlEventStream(cmd, disp, connkey, ndx, extras) {
+ // console.log("Command value " + cmd);
+
+ var d = $q.defer();
+ if (disp) {
+ $ionicLoading.hide();
+ $ionicLoading.show({
+ template: $translate.instant('kPleaseWait') + "...",
+ noBackdrop: true,
+ duration: zm.loadingTimeout,
+ });
}
+ var loginData = NVRDataModel.getLogin();
+ /*
+ var CMD_NONE = 0;
+ var CMD_PAUSE = 1;
+ var CMD_PLAY = 2;
+ var CMD_STOP = 3;
+ var CMD_FASTFWD = 4;
+ var CMD_SLOWFWD = 5;
+ var CMD_SLOWREV = 6;
+ var CMD_FASTREV = 7;
+ var CMD_ZOOMIN = 8;
+ var CMD_ZOOMOUT = 9;
+ var CMD_PAN = 10;
+ var CMD_SCALE = 11;
+ var CMD_PREV = 12;
+ var CMD_NEXT = 13;
+ var CMD_SEEK = 14;
+ var CMD_QUERY = 99;
+ */
+ // You need to POST commands to control zms
+ // Note that I am url encoding the parameters into the URL
+ // If I leave it as JSON, it gets converted to OPTONS due
+ // to CORS behaviour and ZM/Apache don't seem to handle it
+ //console.log("POST: " + loginData.url + '/index.php');
+ //console.log ("AUTH IS " + $rootScope.authSession);
+ var myauthtoken = $rootScope.authSession.replace("&auth=", "");
+ //&auth=
+ var req = qHttp({
+ method: 'POST',
+ /*timeout: 15000,*/
+ url: loginData.url + '/index.php',
+ headers: {
+ 'Content-Type': 'application/x-www-form-urlencoded', //'Accept': '*/*',
+ },
+ transformRequest: function (obj) {
+ var str = [];
+ for (var p in obj) str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
+ var foo = str.join("&");
+ if (extras) foo = foo + extras;
+ //console.log("****RETURNING " + foo);
+ return foo;
+ },
+ data: {
+ view: "request",
+ request: "stream",
+ connkey: connkey,
+ command: cmd,
+ auth: myauthtoken, // user: loginData.username,
+ // pass: loginData.password
+ }
+ });
+ req.then(function (succ) {
+ var resp = succ.data;
- function viewCleanup() {
+ //console.log ("zms response: " + JSON.stringify(resp));
- if (viewCleaned) {
- NVRDataModel.debug("Montage History View Cleanup was already done, skipping");
- return;
+ // move progress bar if event id is the same
+ if (resp.result == "Ok" && ndx != -1 && (resp.status.event == $scope.MontageMonitors[ndx].Monitor.eid)) {
+ if (!$scope.MontageMonitors[ndx].Monitor.seek) {
+ $scope.MontageMonitors[ndx].Monitor.sliderProgress.progress = resp.status.progress;
+ } else {
+ NVRDataModel.debug("Skipping progress as seek is active for " + $scope.MontageMonitors[ndx].Monitor.Name);
}
- $interval.cancel(eventQueryHandle);
- if (pckry) pckry.destroy();
-
-
- broadcastHandles = [];
-
- areStreamsStopped = true;
-
- $timeout(function () {
-
- NVRDataModel.debug("Killing all streams in montage to save memory/nw...");
- for (i = 0; i < $scope.MontageMonitors.length; i++) {
- if ($scope.MontageMonitors[i].Monitor.listDisplay == 'show') NVRDataModel.killLiveStream($scope.MontageMonitors[i].Monitor.connKey, $scope.MontageMonitors[i].Monitor.controlURL);
-
- }
-
- });
- }
-
- function onResume()
- {}
+ }
- $scope.openMenu = function()
- {
- $timeout(function()
- {
- $rootScope.stateofSlide = $ionicSideMenuDelegate.isOpen();
- }, 500);
- $ionicSideMenuDelegate.toggleLeft();
- };
- $scope.$on('$destroy', function()
- {
- NVRDataModel.debug("Cancelling eventQueryInterval");
- $interval.cancel($rootScope.eventQueryInterval);
- });
- $scope.$on('$ionicView.loaded', function()
- {
- //console.log("**VIEW ** MontageHistoryCtrl Loaded");
- });
- $scope.$on('$ionicView.enter', function()
- {
- NVRDataModel.debug("**VIEW ** MontageHistory Ctrl Entered");
+ if (resp.result == "Ok" && ndx != -1 && ((resp.status.event != $scope.MontageMonitors[ndx].Monitor.eid) || $scope.MontageMonitors[ndx].Monitor.noGraph == true)) {
+ $scope.MontageMonitors[ndx].Monitor.noGraph = false;
+ // $scope.MontageMonitors[ndx].Monitor.sliderProgress.progress = 0;
+ NVRDataModel.debug("Fetching details, as event changed for " + $scope.MontageMonitors[ndx].Monitor.Name + " from " + $scope.MontageMonitors[ndx].Monitor.eid + " to " + resp.status.event);
var ld = NVRDataModel.getLogin();
- //console.log("Setting Awake to " + NVRDataModel.getKeepAwake());
- NVRDataModel.setAwake(NVRDataModel.getKeepAwake());
- NVRDataModel.debug("query timer started");
- $interval.cancel($rootScope.eventQueryInterval);
- //console.log ("****************** TIMER STARTED INSIDE ENTER");
- $rootScope.eventQueryInterval = $interval(function()
- {
- checkAllEvents();
- }.bind(this), zm.eventHistoryTimer);
- });
-
- $scope.$on('$ionicView.beforeLeave', function()
- {
- //console.log("**VIEW ** Event History Ctrl Left, force removing modal");
- areStreamsStopped = true;
- viewCleanup();
- viewCleaned = true;
-
-
- // if ($scope.modal) $scope.modal.remove();
- NVRDataModel.log("Cancelling event query timer");
- $interval.cancel($rootScope.eventQueryInterval);
- // NVRDataModel.log("MontageHistory:Stopping network pull...");
- // make sure this is applied in scope digest to stop network pull
- // 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");
-
- areStreamsStopped = true;
- $timeout (function () {
- for (var i=0; i < $scope.MontageMonitors.length; i++) {
- if ($scope.MontageMonitors[i].Monitor.listDisplay == 'show') NVRDataModel.killLiveStream($scope.MontageMonitors[i].Monitor.connKey, $scope.MontageMonitors[i].Monitor.controlURL, $scope.MontageMonitors[i].Monitor.Name);
- }
+ var apiurl = ld.apiurl + "/events/" + resp.status.event + ".json";
+ //console.log ("API " + apiurl);
+ qHttp({
+ method: 'get',
+ url: apiurl
+ }).then(function (succ) {
+ var data = succ.data;
+ var currentEventTime = moment(data.event.Event.StartTime);
+ var maxTime = moment();
+ //NVRDataModel.debug ("Monitor: " + $scope.MontageMonitors[ndx].Monitor.Id + " max time="+maxTime + "("+$scope.datetimeValueTo.value+")"+ " current="+currentEventTime + "("+data.event.Event.StartTime+")");
+
+ NVRDataModel.debug("creating graph for " + $scope.MontageMonitors[ndx].Monitor.Name);
+ var framearray = {
+ labels: [],
+ datasets: [{
+ backgroundColor: 'rgba(242, 12, 12, 0.5)',
+ borderColor: 'rgba(242, 12, 12, 0.5)',
+ data: [],
+ }]
+ };
+ framearray.labels = [];
+ var ld = NVRDataModel.getLogin();
+ //console.log(">>>>> GRAPH");
+ for (i = 0; i < data.event.Frame.length; i++) {
+ var ts = moment(data.event.Frame[i].TimeStamp).format(timeFormat);
+ //console.log ("pushing s:" + event.Frame[i].Score+" t:"+ts);
+ framearray.datasets[0].data.push({
+ x: ts,
+ y: data.event.Frame[i].Score
+ });
+ framearray.labels.push("");
+ }
+ $timeout(function () {
+ drawGraph(framearray, $scope.MontageMonitors[ndx].Monitor.Id);
+ }, 100);
+ var element = angular.element(document.getElementById($scope.MontageMonitors[ndx].Monitor.Id + "-timeline"));
+ element.removeClass('animated flipInX');
+ element.addClass('animated flipOutX');
+ $timeout(function () {
+ element.removeClass('animated flipOutX');
+ element.addClass('animated flipInX');
+ $scope.MontageMonitors[ndx].Monitor.eventUrlTime = data.event.Event.StartTime;
+ var bw = NVRDataModel.getBandwidth() == "lowbw" ? zm.eventMontageQualityLowBW : ld.montageHistoryQuality;
+ $scope.MontageMonitors[ndx].Monitor.eventUrl = $scope.MontageMonitors[ndx].Monitor.streamingURL + "/nph-zms?source=event&mode=jpeg&event=" + data.event.Event.Id + "&frame=1&replay=gapless&rate=" + $scope.sliderVal.realRate + "&connkey=" + $scope.MontageMonitors[ndx].Monitor.connKey + "&scale=" + bw + "&rand=" + $rootScope.rand;
+ $scope.MontageMonitors[ndx].Monitor.eid = data.event.Event.Id;
+ $scope.MontageMonitors[ndx].Monitor.sliderProgress = {
+ progress: 0
+ };
+ $scope.MontageMonitors[ndx].Monitor.eventDuration = data.event.Event.Length;
+ //console.log(">>> Setting Event for " + $scope.MontageMonitors[ndx].Monitor.Name + " to " + data.event.Event.Id);
+ }, 700);
+ }, function (err) {
+ NVRDataModel.debug("skipping graph as detailed API failed for " + $scope.MontageMonitors[ndx].Monitor.Name);
+ $scope.MontageMonitors[ndx].Monitor.eventUrlTime = "-";
});
-
+ }
+ d.resolve(true);
+ return d.promise;
+ }, function (err) {
+ d.reject(false);
+ NVRDataModel.log("Error sending event command " + JSON.stringify(err), "error");
+ return d.promise;
});
- $scope.$on('$ionicView.unloaded', function() {});
- $scope.sliderChanged = function(dirn)
- {
- //console.log("SLIDER CHANGED");
- if ($scope.sliderChanging)
- {
- // console.log ("too fast my friend");
- //$scope.slider.monsize = oldSliderVal;
- // return;
- }
- $scope.sliderChanging = true;
- var somethingReset = false;
- // this only changes items that are selected
- for (var i = 0; i < $scope.MontageMonitors.length; i++)
- {
- var curVal = parseInt($scope.MontageMonitors[i].Monitor.gridScale);
- curVal = curVal + (10 * dirn);
- if (curVal < 10) curVal = 10;
- if (curVal > 100) curVal = 100;
- //console.log ("For Index: " + i + " From: " + $scope.MontageMonitors[i].Monitor.gridScale + " To: " + curVal);
- 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);
- cv = cv + (10 * dirn);
- if (cv < 10) cv = 10;
- if (cv > 100) cv = 100;
- $scope.MontageMonitors[i].Monitor.gridScale = cv;
- }
- }
- //pckry.reloadItems();
- pckry.once('layoutComplete', function()
- {
- /* $timeout(function () {
- var positions = pckry.EHgetShiftPositions('eh-data-item-id');
- //console.log ("POSITIONS MAP " + JSON.stringify(positions));
- var ld = NVRDataModel.getLogin();
- ld.EHpackeryPositions = JSON.stringify(positions);
- NVRDataModel.setLogin(ld);
- $ionicLoading.hide();
- $scope.sliderChanging = false;
- }, zm.packeryTimer);*/
- });
- 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 layout(pckry)
- {
- pckry.shiftLayout();
+ return d.promise;
+ }
+ $scope.isBackground = function () {
+ return NVRDataModel.isBackground();
+ };
+ //----------------------------------------------------------------
+ // Alarm notification handling
+ //----------------------------------------------------------------
+ $scope.handleAlarms = function () {
+ $rootScope.isAlarm = !$rootScope.isAlarm;
+ if (!$rootScope.isAlarm) {
+ $rootScope.alarmCount = "0";
+ $ionicHistory.nextViewOptions({
+ disableBack: true
+ });
+ $state.go("app.events", {
+ "id": 0,
+ "playEvent": false
+ }, {
+ reload: true
+ });
+ return;
}
- $scope.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();
- $timeout(function()
- {
- pckry.layout();
- }, zm.packeryTimer); // force here - no shiftlayout
- }, 100);
- };
-
- function isEmpty(obj)
- {
- for (var prop in obj)
- {
- return false;
- }
- return true;
+ };
+ $scope.handleAlarmsWhileMinimized = function () {
+ $rootScope.isAlarm = !$rootScope.isAlarm;
+ $scope.minimal = !$scope.minimal;
+ NVRDataModel.debug("MontageHistoryCtrl: switch minimal is " + $scope.minimal);
+ ionic.Platform.fullScreen($scope.minimal, !$scope.minimal);
+ $interval.cancel(intervalHandle);
+ $interval.cancel($rootScope.eventQueryInterval);
+ if (!$rootScope.isAlarm) {
+ $rootScope.alarmCount = "0";
+ $ionicHistory.nextViewOptions({
+ disableBack: true
+ });
+ $state.go("app.events", {
+ "id": 0,
+ "playEvent": false,
+ }, {
+ reload: true
+ });
+ return;
}
- // called by afterEnter to load Packery
- function initPackery()
- {
- areStreamsStopped = true;
- $ionicLoading.show(
- {
- template: $translate.instant('kArrangingImages'),
- noBackdrop: true,
- duration: zm.loadingTimeout
- });
- var progressCalled = false;
- draggies = [];
- var layouttype = true;
- var ld = NVRDataModel.getLogin();
-
- var elem = angular.element(document.getElementById("mygrid"));
- pckry = new Packery('.grid',
- {
- itemSelector: '.grid-item',
- percentPosition: true,
- columnWidth: '.grid-sizer',
- gutter: 0,
- initLayout: true
-
- });
- //console.log ("**** mygrid is " + JSON.stringify(elem));
- imagesLoaded(elem).on('progress', function(instance, img)
- {
- var result = img.isLoaded ? 'loaded' : 'broken';
- NVRDataModel.debug('~~loaded image is ' + result + ' for ' + img.img.src);
- pckry.layout();
- progressCalled = true;
- // if (layouttype) $timeout (function(){layout(pckry);},100);
- });
- imagesLoaded(elem).once('always', function()
- {
- //console.log("******** ALL IMAGES LOADED");
- //$scope.$digest();
- areStreamsStopped = false;
-
- NVRDataModel.debug("All images loaded");
- $ionicLoading.hide();
-
- $scope.areImagesLoading = false;
+ };
+ //-------------------------------------------------------------
+ // 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 Montage and returned " +
+ //NVRDataModel.isBackground());
+ return NVRDataModel.isBackground();
+ };
+ $scope.toggleControls = function () {
+ $scope.showControls = !$scope.showControls;
+ };
+ $scope.toggleSelectItem = function (ndx) {
+ 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();
+ };
+
+ function dragToggle() {
+ var i;
+ $scope.isDragabillyOn = !$scope.isDragabillyOn;
+ $ionicSideMenuDelegate.canDragContent($scope.isDragabillyOn ? false : true);
+ //$timeout(function(){pckry.reloadItems();},10);
+ NVRDataModel.debug("setting dragabilly to " + $scope.isDragabillyOn);
+ if ($scope.isDragabillyOn) {
+ $scope.showSizeButtons = 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 () {
+ pckry.shiftLayout();
+ /*var positions = pckry.getShiftPositions('data-item-id');
+ //console.log ("POSITIONS MAP " + JSON.stringify(positions));
+ var ld = NVRDataModel.getLogin();
+ ld.packeryPositions = JSON.stringify(positions);
+ NVRDataModel.setLogin(ld);*/
+ }, 300);
+ }, 100);
+ }
+ }
+
+
+ //---------------------------------------------------------------------
+ // Show/Hide PTZ control in monitor view
+ //---------------------------------------------------------------------
+ $scope.togglePTZ = function () {
+ $scope.showPTZ = !$scope.showPTZ;
+ };
+ $scope.callback = function () {
+ // console.log("dragging");
+ };
+ $scope.onDropComplete = function (index, obj, event) {
+ //console.log("dragged");
+ var otherObj = $scope.MontageMonitors[index];
+ var otherIndex = $scope.MontageMonitors.indexOf(obj);
+ $scope.MontageMonitors[index] = obj;
+ $scope.MontageMonitors[otherIndex] = otherObj;
+ };
+ //---------------------------------------------------------------------
+ // changes order of montage display
+ //---------------------------------------------------------------------
+ $scope.toggleMontageDisplayOrder = function () {
+ $scope.packMontage = !$scope.packMontage;
+ loginData.packMontage = $scope.packMontage;
+ NVRDataModel.setLogin(loginData);
+ //console.log ("Switching orientation");
+ };
+ //---------------------------------------------------------------------
+ // In Android, the app runs full steam while in background mode
+ // while in iOS it gets suspended unless you ask for specific resources
+ // So while this view, we DON'T want Android to keep sending 1 second
+ // refreshes to the server for images we are not seeing
+ //---------------------------------------------------------------------
+ function onPause() {
+ NVRDataModel.debug("MontageHistoryCtrl: onpause called");
+ viewCleanup();
+ viewCleaned = true;
+ }
+
+ function viewCleanup() {
+
+ if (viewCleaned) {
+ NVRDataModel.debug("Montage History View Cleanup was already done, skipping");
+ return;
+ }
+ $interval.cancel(eventQueryHandle);
+ if (pckry) pckry.destroy();
- if (!progressCalled)
- {
- NVRDataModel.log("*** PROGRESS WAS NOT CALLED");
- pckry.reloadItems();
- }
- $timeout(function()
- {
+ broadcastHandles = [];
- pckry.getItemElements().forEach(function(itemElem)
- {
- draggie = new Draggabilly(itemElem);
- pckry.bindDraggabillyEvents(draggie);
- draggies.push(draggie);
- draggie.disable();
- draggie.unbindHandles();
- });
-
- pckry.on('dragItemPositioned', itemDragged);
-
- /*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) {
- $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);
- }
- }
+ areStreamsStopped = true;
+ $timeout(function () {
- NVRDataModel.debug("All images loaded, doing image layout");
- $timeout(function () {
- pckry.initShiftLayout(positions, 'data-item-id');
- }, 0);
- }*/
+ NVRDataModel.debug("Killing all streams in montage to save memory/nw...");
+ for (i = 0; i < $scope.MontageMonitors.length; i++) {
+ if ($scope.MontageMonitors[i].Monitor.listDisplay == 'show') NVRDataModel.killLiveStream($scope.MontageMonitors[i].Monitor.connKey, $scope.MontageMonitors[i].Monitor.controlURL);
- $timeout(function()
- {
- NVRDataModel.log("Force calling resize");
- pckry.layout();
- $scope.packeryDone = true;
- }, zm.packeryTimer); // don't ask
+ }
- }, zm.packeryTimer);
+ });
+ }
+
+ function onResume() {
+ areStreamsStopped = false;
+ }
+
+ $scope.openMenu = function () {
+ $timeout(function () {
+ $rootScope.stateofSlide = $ionicSideMenuDelegate.isOpen();
+ }, 500);
+ $ionicSideMenuDelegate.toggleLeft();
+ };
+ $scope.$on('$destroy', function () {
+ NVRDataModel.debug("Cancelling eventQueryInterval");
+ $interval.cancel($rootScope.eventQueryInterval);
+ });
+ $scope.$on('$ionicView.loaded', function () {
+ //console.log("**VIEW ** MontageHistoryCtrl Loaded");
+ });
+ $scope.$on('$ionicView.enter', function () {
+ NVRDataModel.debug("**VIEW ** MontageHistory Ctrl Entered");
+ var ld = NVRDataModel.getLogin();
+ //console.log("Setting Awake to " + NVRDataModel.getKeepAwake());
+ NVRDataModel.setAwake(NVRDataModel.getKeepAwake());
+ NVRDataModel.debug("query timer started");
+ $interval.cancel($rootScope.eventQueryInterval);
+ //console.log ("****************** TIMER STARTED INSIDE ENTER");
+ $rootScope.eventQueryInterval = $interval(function () {
+ checkAllEvents();
+ }.bind(this), zm.eventHistoryTimer);
+ });
+
+ $scope.$on('$ionicView.beforeLeave', function () {
+ //console.log("**VIEW ** Event History Ctrl Left, force removing modal");
+ areStreamsStopped = true;
+ viewCleanup();
+ viewCleaned = true;
+
+
+ // if ($scope.modal) $scope.modal.remove();
+ NVRDataModel.log("Cancelling event query timer");
+ $interval.cancel($rootScope.eventQueryInterval);
+ // NVRDataModel.log("MontageHistory:Stopping network pull...");
+ // make sure this is applied in scope digest to stop network pull
+ // 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");
+
+ areStreamsStopped = true;
+ $timeout(function () {
+ for (var i = 0; i < $scope.MontageMonitors.length; i++) {
+ if ($scope.MontageMonitors[i].Monitor.listDisplay == 'show') NVRDataModel.killLiveStream($scope.MontageMonitors[i].Monitor.connKey, $scope.MontageMonitors[i].Monitor.controlURL, $scope.MontageMonitors[i].Monitor.Name);
+ }
- });
+ });
- function itemDragged(item)
- {
- NVRDataModel.debug("drag complete");
+ });
+ $scope.$on('$ionicView.unloaded', function () {});
+ $scope.sliderChanged = function (dirn) {
+ //console.log("SLIDER CHANGED");
+ if ($scope.sliderChanging) {
+ // console.log ("too fast my friend");
+ //$scope.slider.monsize = oldSliderVal;
+ // return;
+ }
+ $scope.sliderChanging = true;
+ var somethingReset = false;
+ // this only changes items that are selected
+ for (var i = 0; i < $scope.MontageMonitors.length; i++) {
+ var curVal = parseInt($scope.MontageMonitors[i].Monitor.gridScale);
+ curVal = curVal + (10 * dirn);
+ if (curVal < 10) curVal = 10;
+ if (curVal > 100) curVal = 100;
+ //console.log ("For Index: " + i + " From: " + $scope.MontageMonitors[i].Monitor.gridScale + " To: " + curVal);
+ 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;
+ }
}
- $scope.$on('$ionicView.beforeEnter', function()
+ // this changes all items if none were selected
+ if (!somethingReset && $scope.isDragabillyOn) // nothing was selected
{
- // 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.showControls = true;
- $scope.packeryDone = false;
- readyToRun = false;
- // $scope.MontageMonitors = message;
-
-
- isSimulStreaming = NVRDataModel.getCurrentServerMultiPortSupported();
- if ($rootScope.platformOS == 'ios') {
- isSimulStreaming = false;
- NVRDataModel.log ("IOS detected, disabling simulstreaming");
- }
- $scope.isSimulStreaming = isSimulStreaming;
- areStreamsStopped = true;
-
- NVRDataModel.regenConnKeys();
- $scope.monitors = NVRDataModel.getMonitorsNow();
- $scope.MontageMonitors = angular.copy($scope.monitors);
-
- var loginData = NVRDataModel.getLogin();
- // init monitors
-
- NVRDataModel.debug(">>Initializing connkeys and images...");
- for (var i = 0; i < $scope.MontageMonitors.length; i++)
- {
- //$scope.MontageMonitors[i].Monitor.connKey='';
- $scope.MontageMonitors[i].Monitor.eid = "-1";
- $scope.MontageMonitors[i].Monitor.eventUrl = 'img/noevent.png';
- $scope.MontageMonitors[i].Monitor.eid = "-1";
- $scope.MontageMonitors[i].Monitor.eventUrlTime = "";
- $scope.MontageMonitors[i].Monitor.isPaused = false;
- $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.sliderProgress = {
- progress: 0
- };
+ for (i = 0; i < $scope.MontageMonitors.length; i++) {
+ var cv = parseInt($scope.MontageMonitors[i].Monitor.gridScale);
+ cv = cv + (10 * dirn);
+ if (cv < 10) cv = 10;
+ if (cv > 100) cv = 100;
+ $scope.MontageMonitors[i].Monitor.gridScale = cv;
+ }
+ }
+ //pckry.reloadItems();
+ pckry.once('layoutComplete', function () {
+ /* $timeout(function () {
+ var positions = pckry.EHgetShiftPositions('eh-data-item-id');
+ //console.log ("POSITIONS MAP " + JSON.stringify(positions));
+ var ld = NVRDataModel.getLogin();
+ ld.EHpackeryPositions = JSON.stringify(positions);
+ NVRDataModel.setLogin(ld);
+ $ionicLoading.hide();
+ $scope.sliderChanging = false;
+ }, zm.packeryTimer);*/
+ });
+ 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 layout(pckry) {
+ pckry.shiftLayout();
+ }
+ $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;
}
- doInitCode();
+ } 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();
+ $timeout(function () {
+ pckry.layout();
+ }, zm.packeryTimer); // force here - no shiftlayout
+ }, 100);
+ };
+
+ function isEmpty(obj) {
+ for (var prop in obj) {
+ return false;
+ }
+ return true;
+ }
+ // called by afterEnter to load Packery
+ function initPackery() {
+ areStreamsStopped = true;
+ $ionicLoading.show({
+ template: $translate.instant('kArrangingImages'),
+ noBackdrop: true,
+ duration: zm.loadingTimeout
+ });
+ var progressCalled = false;
+ draggies = [];
+ var layouttype = true;
+ var ld = NVRDataModel.getLogin();
+
+ var elem = angular.element(document.getElementById("mygrid"));
+ pckry = new Packery('.grid', {
+ itemSelector: '.grid-item',
+ percentPosition: true,
+ columnWidth: '.grid-sizer',
+ gutter: 0,
+ initLayout: true
});
- $scope.reloadView = function()
- {
- $rootScope.rand = Math.floor((Math.random() * 100000) + 1);
- NVRDataModel.log("User action: image reload " + $rootScope.rand);
- };
- $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.MontageMonitors = [];
- imageLoadingDataShare.set(0);
- var refresh = NVRDataModel.getMonitors(1);
- refresh.then(function(data)
- {
- $scope.MontageMonitors = data.data;
- $scope.$broadcast('scroll.refreshComplete');
- });
- };
+ //console.log ("**** mygrid is " + JSON.stringify(elem));
+ imagesLoaded(elem).on('progress', function (instance, img) {
+ var result = img.isLoaded ? 'loaded' : 'broken';
+ NVRDataModel.debug('~~loaded image is ' + result + ' for ' + img.img.src);
+ pckry.layout();
+ progressCalled = true;
+ // if (layouttype) $timeout (function(){layout(pckry);},100);
+ });
+ imagesLoaded(elem).once('always', function () {
+ //console.log("******** ALL IMAGES LOADED");
+ //$scope.$digest();
+ areStreamsStopped = false;
- function drawGraph(f, mid)
- {
- //console.log("Graphing on " + "eventchart-" + mid);
- var cv = document.getElementById("eventchart-" + mid);
- var ctx = cv.getContext("2d");
- frameoptions = {
- responsive: true,
- legend: false,
- title:
- {
- display: false,
- text: ""
- },
- scales:
- {
- yAxes: [
- {
- display: false,
- scaleLabel:
- {
- display: false,
- labelString: 'value',
- }
- }],
- xAxes: [
- {
- type: 'time',
- display: false,
- time:
- {
- format: timeFormat,
- tooltipFormat: 'll HH:mm',
- min: f.datasets[0].data[0].x,
- max: f.datasets[0].data[f.datasets[0].data.length - 1].x,
- displayFormats:
- {}
- },
- scaleLabel:
- {
- display: false,
- labelString: ''
- }
- }]
- }
- };
- $timeout(function()
- {
- var myChart = new Chart(ctx,
- {
- type: 'line',
- data: f,
- options: frameoptions,
- });
- });
- }
- //---------------------------------------------------------------------
- // Controller main
- //---------------------------------------------------------------------
- var intervalHandle;
- var modalIntervalHandle;
- var timeFormat;
- var curYear;
- var readyToRun;
- var frameoptions;
- var timeto, timefrom;
- var commonCss;
- var sizeInProgress;
- var ld;
- var pckry;
- var draggies;
- var i;
- var draggie;
- var loginData;
- var oldmonitors;
- var gridcontainer;
- var montageOrder, hiddenOrder;
-
- $scope.sliderVal = {
- rate: 2,
- realRate: 200,
- hideNoEvents: false,
- enableGapless: true,
- exactMatch: false,
- showTimeline: true
- };
- $scope.timeFormat = "yyyy-MM-dd " + NVRDataModel.getTimeFormat();
- $scope.displayDateTimeSliders = true;
- $scope.showtimers = true;
- $scope.loginData = NVRDataModel.getLogin();
-
- $scope.slider_modal_options_rate = {
- from: 1,
- to: 10,
- realtime: true,
- step: 1,
- className: "mySliderClass", //modelLabels:function(val) {return "";},
- smooth: false,
- css: commonCss,
- dimension: 'X'
- };
+ NVRDataModel.debug("All images loaded");
+ $ionicLoading.hide();
- $scope.datetimeValueFrom = {
- value: "",
- hrs: ""
- };
- $scope.datetimeValueTo = {
- value: ""
- };
+ $scope.areImagesLoading = false;
- $rootScope.eventQueryInterval = "";
+ if (!progressCalled) {
+ NVRDataModel.log("*** PROGRESS WAS NOT CALLED");
+ pckry.reloadItems();
+ }
+ $timeout(function () {
- $scope.constructStream = function (monitor) {
+ pckry.getItemElements().forEach(function (itemElem) {
+ draggie = new Draggabilly(itemElem);
+ pckry.bindDraggabillyEvents(draggie);
+ draggies.push(draggie);
+ draggie.disable();
+ draggie.unbindHandles();
+ });
-
- var stream;
- if (areStreamsStopped) return "";
- stream = monitor.Monitor.eventUrl +
- $rootScope.authSession +
- appendConnKey(monitor.Monitor.connKey);
- //console.log (JSON.stringify(monitor));
- //console.log("STREAM=" + stream);
- return stream;
-
- };
-
- function appendConnKey(ck) {
- if (isSimulStreaming)
- return "&connkey=" + ck;
- else
- return "";
- }
+ pckry.on('dragItemPositioned', itemDragged);
- function doInitCode()
+ /*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) {
+ $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);
+ }
+ }
- $scope.isModalActive = false;
- $scope.hrsAgo = 4;
- window.addEventListener("resize", orientationChanged, false);
- document.addEventListener("pause", onPause, false);
- document.addEventListener("resume", onResume, false);
+ NVRDataModel.debug("All images loaded, doing image layout");
+ $timeout(function () {
+ pckry.initShiftLayout(positions, 'data-item-id');
+ }, 0);
+ }*/
- timeFormat = 'MM/DD/YYYY HH:mm:ss';
- curYear = new Date().getFullYear();
- readyToRun = false;
+ $timeout(function () {
+ NVRDataModel.log("Force calling resize");
+ pckry.layout();
+ $scope.packeryDone = true;
+ }, zm.packeryTimer); // don't ask
- frameoptions = [];
- // default = start of day
- timeto = moment();
- timefrom = moment().startOf('day');
- $scope.datetimeValueTo.value = timeto.toDate();
- $scope.sliderVal.rate = 1;
- $scope.sliderVal.realRate = $scope.sliderVal.rate * 100;
+ }, zm.packeryTimer);
- $scope.datetimeValueFrom.value = timefrom.toDate();
- $scope.datetimeValueFrom.hrs = Math.round(moment.duration(moment().diff(moment($scope.datetimeValueFrom.value))).asHours());
+ });
- commonCss = {
- background:
- {
- "background-color": "silver"
- },
- before:
- {
- "background-color": "purple"
- },
- default:
- {
- "background-color": "white"
- }, // default value: 1px
- after:
- {
- "background-color": "green"
- }, // zone after default value
- pointer:
- {
- "background-color": "red"
- }, // circle pointer
- range:
- {
- "background-color": "red"
- } // use it if double value
- };
+ function itemDragged(item) {
+ NVRDataModel.debug("drag complete");
+ }
+ }
+ $scope.$on('$ionicView.beforeEnter', 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.showControls = true;
+ $scope.packeryDone = false;
+ readyToRun = false;
+ // $scope.MontageMonitors = message;
+
+
+ isSimulStreaming = NVRDataModel.getCurrentServerMultiPortSupported();
+ if ($rootScope.platformOS == 'ios') {
+ isSimulStreaming = false;
+ NVRDataModel.log("IOS detected, disabling simulstreaming");
+ }
+ $scope.isSimulStreaming = isSimulStreaming;
+ areStreamsStopped = true;
+
+ NVRDataModel.regenConnKeys();
+ $scope.monitors = NVRDataModel.getMonitorsNow();
+ $scope.MontageMonitors = angular.copy($scope.monitors);
+
+ var loginData = NVRDataModel.getLogin();
+ // init monitors
+
+ NVRDataModel.debug(">>Initializing connkeys and images...");
+ for (var i = 0; i < $scope.MontageMonitors.length; i++) {
+ //$scope.MontageMonitors[i].Monitor.connKey='';
+ $scope.MontageMonitors[i].Monitor.eid = "-1";
+ $scope.MontageMonitors[i].Monitor.eventUrl = 'img/noevent.png';
+ $scope.MontageMonitors[i].Monitor.eid = "-1";
+ $scope.MontageMonitors[i].Monitor.eventUrlTime = "";
+ $scope.MontageMonitors[i].Monitor.isPaused = false;
+ $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.sliderProgress = {
+ progress: 0
+ };
+ }
+ doInitCode();
+
+ });
+ $scope.reloadView = function () {
+ $rootScope.rand = Math.floor((Math.random() * 100000) + 1);
+ NVRDataModel.log("User action: image reload " + $rootScope.rand);
+ };
+ $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.MontageMonitors = [];
+ imageLoadingDataShare.set(0);
+ var refresh = NVRDataModel.getMonitors(1);
+ refresh.then(function (data) {
+ $scope.MontageMonitors = data.data;
+ $scope.$broadcast('scroll.refreshComplete');
+ });
+ };
+
+ function drawGraph(f, mid) {
+ //console.log("Graphing on " + "eventchart-" + mid);
+ var cv = document.getElementById("eventchart-" + mid);
+ var ctx = cv.getContext("2d");
+ frameoptions = {
+ responsive: true,
+ legend: false,
+ title: {
+ display: false,
+ text: ""
+ },
+ scales: {
+ yAxes: [{
+ display: false,
+ scaleLabel: {
+ display: false,
+ labelString: 'value',
+ }
+ }],
+ xAxes: [{
+ type: 'time',
+ display: false,
+ time: {
+ format: timeFormat,
+ tooltipFormat: 'll HH:mm',
+ min: f.datasets[0].data[0].x,
+ max: f.datasets[0].data[f.datasets[0].data.length - 1].x,
+ displayFormats: {}
+ },
+ scaleLabel: {
+ display: false,
+ labelString: ''
+ }
+ }]
+ }
+ };
+ $timeout(function () {
+ var myChart = new Chart(ctx, {
+ type: 'line',
+ data: f,
+ options: frameoptions,
+ });
+ });
+ }
+ //---------------------------------------------------------------------
+ // Controller main
+ //---------------------------------------------------------------------
+ var intervalHandle;
+ var modalIntervalHandle;
+ var timeFormat;
+ var curYear;
+ var readyToRun;
+ var frameoptions;
+ var timeto, timefrom;
+ var commonCss;
+ var sizeInProgress;
+ var ld;
+ var pckry;
+ var draggies;
+ var i;
+ var draggie;
+ var loginData;
+ var oldmonitors;
+ var gridcontainer;
+ var montageOrder, hiddenOrder;
+
+ $scope.sliderVal = {
+ rate: 2,
+ realRate: 200,
+ hideNoEvents: false,
+ enableGapless: true,
+ exactMatch: false,
+ showTimeline: true
+ };
+ $scope.timeFormat = "yyyy-MM-dd " + NVRDataModel.getTimeFormat();
+ $scope.displayDateTimeSliders = true;
+ $scope.showtimers = true;
+ $scope.loginData = NVRDataModel.getLogin();
+
+ $scope.slider_modal_options_rate = {
+ from: 1,
+ to: 10,
+ realtime: true,
+ step: 1,
+ className: "mySliderClass", //modelLabels:function(val) {return "";},
+ smooth: false,
+ css: commonCss,
+ dimension: 'X'
+ };
+
+ $scope.datetimeValueFrom = {
+ value: "",
+ hrs: ""
+ };
+ $scope.datetimeValueTo = {
+ value: ""
+ };
+
+ $rootScope.eventQueryInterval = "";
+
+
+ $scope.constructStream = function (monitor) {
+
+
+ var stream;
+ if (areStreamsStopped) return "";
+ stream = monitor.Monitor.eventUrl +
+ $rootScope.authSession +
+ appendConnKey(monitor.Monitor.connKey);
+ //console.log (JSON.stringify(monitor));
+ //console.log("STREAM=" + stream);
+ return stream;
+
+ };
+
+ function appendConnKey(ck) {
+ if (isSimulStreaming)
+ return "&connkey=" + ck;
+ else
+ return "";
+ }
+
+ function doInitCode()
+
+ {
+
+ $scope.isModalActive = false;
+
+ $scope.hrsAgo = 4;
+ window.addEventListener("resize", orientationChanged, false);
+ document.addEventListener("pause", onPause, false);
+ document.addEventListener("resume", onResume, false);
+
+ timeFormat = 'MM/DD/YYYY HH:mm:ss';
+ curYear = new Date().getFullYear();
+ readyToRun = false;
+
+ frameoptions = [];
+ // default = start of day
+ timeto = moment();
+ timefrom = moment().startOf('day');
+ $scope.datetimeValueTo.value = timeto.toDate();
+ $scope.sliderVal.rate = 1;
+ $scope.sliderVal.realRate = $scope.sliderVal.rate * 100;
+
+ $scope.datetimeValueFrom.value = timefrom.toDate();
+ $scope.datetimeValueFrom.hrs = Math.round(moment.duration(moment().diff(moment($scope.datetimeValueFrom.value))).asHours());
+
+ commonCss = {
+ background: {
+ "background-color": "silver"
+ },
+ before: {
+ "background-color": "purple"
+ },
+ default: {
+ "background-color": "white"
+ }, // default value: 1px
+ after: {
+ "background-color": "green"
+ }, // zone after default value
+ pointer: {
+ "background-color": "red"
+ }, // circle pointer
+ range: {
+ "background-color": "red"
+ } // use it if double value
+ };
- $scope.monitorSize = []; // array with montage sizes per monitor
- $scope.scaleDirection = []; // 1 = increase -1 = decrease
- // The difference between old and original is this:
- // old will have a copy of the last re-arranged monitor list
- // while original will have a copy of the order returned by ZM
- var oldMonitors = []; // To keep old order if user cancels after sort;
- // Montage display order may be different so don't
- // mangle monitors as it will affect other screens
- // in Montage screen we will work with this local copy
- //$scope.MontageMonitors = angular.copy ($scope.monitors);
- var montageOrder = []; // This array will keep the ordering in montage view
- var hiddenOrder = []; // 1 = hide, 0 = don't hide
- var tempMonitors = message;
- if (tempMonitors.length == 0)
+ $scope.monitorSize = []; // array with montage sizes per monitor
+ $scope.scaleDirection = []; // 1 = increase -1 = decrease
+ // The difference between old and original is this:
+ // old will have a copy of the last re-arranged monitor list
+ // while original will have a copy of the order returned by ZM
+ var oldMonitors = []; // To keep old order if user cancels after sort;
+ // Montage display order may be different so don't
+ // mangle monitors as it will affect other screens
+ // in Montage screen we will work with this local copy
+ //$scope.MontageMonitors = angular.copy ($scope.monitors);
+ var montageOrder = []; // This array will keep the ordering in montage view
+ var hiddenOrder = []; // 1 = hide, 0 = don't hide
+ var tempMonitors = message;
+ /* if (tempMonitors.length == 0)
{
$rootScope.zmPopup = $ionicPopup.alert(
{
@@ -1498,97 +1292,83 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
$state.go("app.login");
return;
}
-
- NVRDataModel.log("Inside MontageHistoryCtrl:We found " + $scope.MontageMonitors.length + " monitors");
- // $scope.MontageMonitors = NVRDataModel.applyMontageMonitorPrefs(message, 1)[0];
-
-
- // --------------------------------------------------------
- // Handling of back button in case modal is open should
- // close the modal
- // --------------------------------------------------------
- $ionicPlatform.registerBackButtonAction(function(e)
- {
- e.preventDefault();
- if ($scope.modal && $scope.modal.isShown())
- {
- // switch off awake, as liveview is finished
- NVRDataModel.debug("Modal is open, closing it");
- NVRDataModel.setAwake(false);
- $scope.modal.remove();
- $scope.isModalActive = false;
- }
- else
- {
- NVRDataModel.debug("Modal is closed, so toggling or exiting");
- if (!$ionicSideMenuDelegate.isOpenLeft())
- {
- $ionicSideMenuDelegate.toggleLeft();
- }
- else
- {
- navigator.app.exitApp();
- }
- }
- }, 1000);
- $scope.isRefresh = $stateParams.isRefresh;
- sizeInProgress = false;
- $ionicSideMenuDelegate.canDragContent(false);
- $scope.LoginData = NVRDataModel.getLogin();
- $scope.monLimit = $scope.LoginData.maxMontage;
- $scope.currentLimit = $scope.LoginData.maxMontage;
- if (!isSimulStreaming)
- {
-
- NVRDataModel.log("Limiting montage to 5, thanks to max connection per domain limit");
- $scope.currentLimit = 5;
- $scope.monLimit = 5;
+*/
+ NVRDataModel.log("Inside MontageHistoryCtrl:We found " + $scope.MontageMonitors.length + " monitors");
+ // $scope.MontageMonitors = NVRDataModel.applyMontageMonitorPrefs(message, 1)[0];
+
+
+ // --------------------------------------------------------
+ // Handling of back button in case modal is open should
+ // close the modal
+ // --------------------------------------------------------
+ $ionicPlatform.registerBackButtonAction(function (e) {
+ e.preventDefault();
+ if ($scope.modal && $scope.modal.isShown()) {
+ // switch off awake, as liveview is finished
+ NVRDataModel.debug("Modal is open, closing it");
+ NVRDataModel.setAwake(false);
+ $scope.modal.remove();
+ $scope.isModalActive = false;
+ } else {
+ NVRDataModel.debug("Modal is closed, so toggling or exiting");
+ if (!$ionicSideMenuDelegate.isOpenLeft()) {
+ $ionicSideMenuDelegate.toggleLeft();
+ } else {
+ navigator.app.exitApp();
}
- else {
+ }
+ }, 1000);
+ $scope.isRefresh = $stateParams.isRefresh;
+ sizeInProgress = false;
+ $ionicSideMenuDelegate.canDragContent(false);
+ $scope.LoginData = NVRDataModel.getLogin();
+ $scope.monLimit = $scope.LoginData.maxMontage;
+ $scope.currentLimit = $scope.LoginData.maxMontage;
+ if (!isSimulStreaming) {
+
+ NVRDataModel.log("Limiting montage to 5, thanks to max connection per domain limit");
+ $scope.currentLimit = 5;
+ $scope.monLimit = 5;
+ } else {
+
+ NVRDataModel.log("You have multiport on, so no montage limits");
+ }
- NVRDataModel.log("You have multiport on, so no montage limits");
- }
-
-
- // $rootScope.authSession = "undefined";
- $ionicLoading.show(
- {
- template: $translate.instant('kNegotiatingStreamAuth'),
- animation: 'fade-in',
- showBackdrop: true,
- duration: zm.loadingTimeout,
- maxWidth: 300,
- showDelay: 0
- });
- ld = NVRDataModel.getLogin();
- //console.log ("MONITORS " + JSON.stringify($scope.monitors));
- $rootScope.validMonitorId = $scope.MontageMonitors[0].Monitor.Id;
- NVRDataModel.getAuthKey($rootScope.validMonitorId).then(function(success)
- {
- $ionicLoading.hide();
- //console.log(success);
- $rootScope.authSession = success;
- NVRDataModel.log("Stream authentication construction: " + $rootScope.authSession);
- $timeout(function()
- {
- initPackery();
- readyToRun = true;
- footerCollapse();
- }, zm.packeryTimer);
- }, function(error)
- {
- $ionicLoading.hide();
- NVRDataModel.debug("MontageHistoryCtrl: Error in authkey retrieval " + error);
- //$rootScope.authSession="";
- NVRDataModel.log("MontageHistoryCtrl: Error returned Stream authentication construction. Retaining old value of: " + $rootScope.authSession);
- $timeout(function()
- {
- initPackery();
- readyToRun = true;
- footerCollapse();
- }, zm.packeryTimer);
- });
- }
+ // $rootScope.authSession = "undefined";
+ $ionicLoading.show({
+ template: $translate.instant('kNegotiatingStreamAuth'),
+ animation: 'fade-in',
+ showBackdrop: true,
+ duration: zm.loadingTimeout,
+ maxWidth: 300,
+ showDelay: 0
+ });
+ ld = NVRDataModel.getLogin();
+ //console.log ("MONITORS " + JSON.stringify($scope.monitors));
+ $rootScope.validMonitorId = $scope.MontageMonitors[0].Monitor.Id;
+ NVRDataModel.getAuthKey($rootScope.validMonitorId).then(function (success) {
+ $ionicLoading.hide();
+ //console.log(success);
+ $rootScope.authSession = success;
+ NVRDataModel.log("Stream authentication construction: " + $rootScope.authSession);
+ $timeout(function () {
+ initPackery();
+ readyToRun = true;
+ footerCollapse();
+ }, zm.packeryTimer);
+
+ }, function (error) {
+ $ionicLoading.hide();
+ NVRDataModel.debug("MontageHistoryCtrl: Error in authkey retrieval " + error);
+ //$rootScope.authSession="";
+ NVRDataModel.log("MontageHistoryCtrl: Error returned Stream authentication construction. Retaining old value of: " + $rootScope.authSession);
+ $timeout(function () {
+ initPackery();
+ readyToRun = true;
+ footerCollapse();
+ }, zm.packeryTimer);
+ });
+ }
}]);