// Common Controller for the montage view
/* jshint -W041 */
/* jslint browser: true*/
/* global saveAs, cordova,StatusBar,angular,console,ionic, moment, imagesLoaded, chrome */
angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$rootScope', 'zm', 'NVRDataModel', '$ionicSideMenuDelegate', '$timeout', '$interval', '$ionicModal', '$ionicLoading', '$http', '$state', '$stateParams', '$ionicHistory', '$ionicScrollDelegate', '$q', '$sce', 'carouselUtils', '$ionicPopup', 'SecuredPopups', '$translate', function ($scope, $rootScope, zm, NVRDataModel, $ionicSideMenuDelegate, $timeout, $interval, $ionicModal, $ionicLoading, $http, $state, $stateParams, $ionicHistory, $ionicScrollDelegate, $q, $sce, carouselUtils, $ionicPopup, SecuredPopups, $translate) {
$scope.animationInProgress = false;
$scope.imageFit = true;
$scope.isModalActive = true;
var intervalModalHandle;
var cycleHandle;
var ld = NVRDataModel.getLogin();
$scope.svgReady = false;
$scope.zoneArray = [];
var originalZones = [];
$scope.isZoneEdit = false;
var _moveStart = false;
var targetID = "";
$scope.imageZoomable = true;
$scope.ptzButtonsShown = true;
$scope.csize = ($rootScope.platformOS == 'desktop') ? 10 : 20;
window.addEventListener("resize", function () {
imageLoaded();
}, false);
//$rootScope.authSession = "undefined";
/* $ionicLoading.show({
template: $translate.instant('kNegotiatingStreamAuth') + '...',
animation: 'fade-in',
showBackdrop: true,
duration: zm.loadingTimeout,
maxWidth: 300,
showDelay: 0
});*/
$scope.currentStreamMode = 'single';
NVRDataModel.log("Using stream mode " + $scope.currentStreamMode);
NVRDataModel.debug("MonitorModalCtrl called from " + $ionicHistory.currentStateName());
//no need to recompute auth in modal
/*$rootScope.validMonitorId = $scope.monitors[0].Monitor.Id;
NVRDataModel.getAuthKey($rootScope.validMonitorId, $scope.monitors[0].Monitor.connKey)
.then(function (success) {
$ionicLoading.hide();
$rootScope.authSession = success;
NVRDataModel.log("Modal: Stream authentication construction: " + $rootScope.authSession);
},
function (error) {
$ionicLoading.hide();
NVRDataModel.debug("ModalCtrl: Error details of stream auth:" + error);
//$rootScope.authSession="";
NVRDataModel.log("Modal: Error returned Stream authentication construction. Retaining old value of: " + $rootScope.authSession);
});
*/
$interval.cancel(intervalModalHandle);
$interval.cancel(cycleHandle);
intervalModalHandle = $interval(function () {
loadModalNotifications();
// console.log ("Refreshing Image...");
}.bind(this), zm.alarmStatusTime);
// This is the PTZ menu
$scope.ptzRadialMenuOptions = {
content: '',
background: '#2F4F4F',
isOpen: true,
toggleOnClick: false,
size: 'small',
button: {
cssClass: "fa fa-arrows-alt",
},
items: [{
content: '',
cssClass: 'fa fa-chevron-circle-up',
empty: false,
onclick: function () {
controlPTZ($scope.monitorId, $scope.ptzMoveCommand + 'Down');
}
},
{
content: '',
cssClass: 'fa fa-chevron-circle-up',
empty: false,
onclick: function () {
controlPTZ($scope.monitorId, $scope.ptzMoveCommand + 'DownLeft');
}
},
{
content: '',
cssClass: 'fa fa-chevron-circle-up',
empty: false,
onclick: function () {
controlPTZ($scope.monitorId, $scope.ptzMoveCommand + 'Left');
}
},
{
content: 'D',
empty: true,
onclick: function () {
// console.log('About');
}
},
{
content: '',
cssClass: 'fa fa-chevron-circle-up',
empty: false,
onclick: function () {
controlPTZ($scope.monitorId, $scope.ptzMoveCommand + 'UpLeft');
}
},
{
content: '',
cssClass: 'fa fa-chevron-circle-up',
empty: false,
onclick: function () {
controlPTZ($scope.monitorId, $scope.ptzMoveCommand + 'Up');
}
},
{
content: '',
cssClass: 'fa fa-chevron-circle-up',
empty: false,
onclick: function () {
controlPTZ($scope.monitorId, $scope.ptzMoveCommand + 'UpRight');
}
},
{
content: 'H',
empty: true,
onclick: function () {
//console.log('About');
}
},
{
content: '',
cssClass: 'fa fa-chevron-circle-up',
empty: false,
onclick: function () {
controlPTZ($scope.monitorId, $scope.ptzMoveCommand + 'Right');
}
},
{
content: '',
cssClass: 'fa fa-chevron-circle-up',
empty: false,
onclick: function () {
controlPTZ($scope.monitorId, $scope.ptzMoveCommand + 'DownRight');
}
},
{
content: 'K',
empty: true,
onclick: function () {
//console.log('About');
}
},
]
};
//-------------------------------------------------------------
// On re-auth, we need a new zms
//-------------------------------------------------------------
var as = $scope.$on("auth-success", function () {
NVRDataModel.debug("MonitorModalCtrl: Re-login detected, resetting everything & re-generating connkey");
//NVRDataModel.stopNetwork("MonitorModal-auth success");
$scope.isModalStreamPaused = false;
$timeout (function() {
if (0 && $rootScope.platformOS == 'ios') {
NVRDataModel.debug ("Webkit hack, hammering window.stop();");
NVRDataModel.stopNetwork();
}
else {
NVRDataModel.killLiveStream($scope.connKey, $scope.controlURL);
}
$scope.connKey = (Math.floor((Math.random() * 999999) + 1)).toString();
});
});
$scope.cast = function (mid, mon) {
};
//----------------------------------
// toggles monitor cycling
//----------------------------------
$scope.toggleCycle = function () {
//console.log ("HERE");
$scope.isCycle = !$scope.isCycle;
var ld = NVRDataModel.getLogin();
ld.cycleMonitors = $scope.isCycle;
NVRDataModel.setLogin(ld);
$scope.cycleText = $scope.isCycle ? $translate.instant('kOn') : $translate.instant('kOff');
if ($scope.isCycle) {
NVRDataModel.log("re-starting cycle timer");
$interval.cancel(cycleHandle);
cycleHandle = $interval(function () {
moveToMonitor($scope.monitorId, 1);
// console.log ("Refreshing Image...");
}.bind(this), ld.cycleMonitorsInterval * 1000);
} else {
NVRDataModel.log("cancelling cycle timer");
$interval.cancel(cycleHandle);
}
};
//-------------------------------------------------------------
// PTZ enable/disable
//-------------------------------------------------------------
$scope.togglePTZ = function () {
//console.log("PTZ");
if ($scope.isControllable == '1') {
//console.log ("iscontrollable is true");
$scope.showPTZ = !$scope.showPTZ;
} else {
$ionicLoading.show({
template: $translate.instant('kPTZnotConfigured'),
noBackdrop: true,
duration: 3000,
});
}
};
//-------------------------------------------------------------
// Pause and resume handlers
//-------------------------------------------------------------
function onPause() {
NVRDataModel.debug("ModalCtrl: onpause called");
$interval.cancel(intervalModalHandle);
$interval.cancel(cycleHandle);
NVRDataModel.debug("Killing single stream...");
if (0 && $rootScope.platformOS == 'ios') {
NVRDataModel.debug ("Webkit hack, hammering window.stop();");
NVRDataModel.stopNetwork();
} else {
NVRDataModel.killLiveStream($scope.connKey, $scope.controlURL);
}
// $interval.cancel(modalIntervalHandle)
// FIXME: Do I need to setAwake(false) here?
}
function onResume() {
if (1) return; // Do we really need this as it should go to Portal Login
NVRDataModel.debug("ModalCtrl: Modal resume called");
if ($scope.isModalActive) {
NVRDataModel.log("ModalCtrl: Restarting Modal timer on resume");
$interval.cancel(intervalModalHandle);
$interval.cancel(cycleHandle);
var ld = NVRDataModel.getLogin();
intervalModalHandle = $interval(function () {
loadModalNotifications();
}.bind(this), zm.alarmStatusTime);
if (ld.cycleMonitors) {
NVRDataModel.debug("Cycling enabled at " + ld.cycleMonitorsInterval);
$interval.cancel(cycleHandle);
cycleHandle = $interval(function () {
moveToMonitor($scope.monitorId, 1);
// console.log ("Refreshing Image...");
}.bind(this), ld.cycleMonitorsInterval * 1000);
}
$rootScope.modalRand = Math.floor((Math.random() * 100000) + 1);
}
}
//-------------------------------------------------------------
// Queries the 1.30 API for recording state of current monitor
//-------------------------------------------------------------
function loadModalNotifications() {
if (NVRDataModel.versionCompare($rootScope.apiVersion, "1.30") == -1) {
return;
}
if (NVRDataModel.getLogin().enableLowBandwidth)
return;
var status = [$translate.instant('kMonIdle'),
$translate.instant('kMonPreAlarm'),
$translate.instant('kMonAlarmed'),
$translate.instant('kMonAlert'),
$translate.instant('kMonRecord')
];
//console.log ("Inside Modal timer...");
var apiurl = NVRDataModel.getLogin().apiurl;
var alarmurl = apiurl + "/monitors/alarm/id:" + $scope.monitorId + "/command:status.json";
NVRDataModel.log("Invoking " + alarmurl);
$http.get(alarmurl)
.then(function (data) {
// NVRDataModel.debug ("Success in monitor alarmed status " + JSON.stringify(data));
$scope.monStatus = status[parseInt(data.data.status)];
},
function (error) {
$scope.monStatus = "";
NVRDataModel.debug("Error in monitor alarmed status ");
});
}
//-------------------------------------------------------------
// Enable/Disable preset list
//-------------------------------------------------------------
$scope.togglePresets = function () {
$scope.presetOn = !$scope.presetOn;
if ($scope.presetOn) {
$scope.controlToggle = "hide buttons";
} else {
$scope.controlToggle = "show buttons";
}
//console.log("Changing preset to " + $scope.presetOn);
var element = angular.element(document.getElementById("presetlist"));
// bring it in
if ($scope.presetOn) {
element.removeClass("animated fadeOutUp");
} else {
element.removeClass("animated fadeInDown");
element.addClass("animated fadeOutUp");
}
};
$scope.saveZones = function () {
var str = "";
for (var i = 0; i < originalZones.length; i++) {
str = str + "o:" + originalZones[i].coords + "
n:" + $scope.zoneArray[i].coords + "--------------------------------------------------
";
}
$rootScope.zmPopup = SecuredPopups.show('confirm', {
title: 'Sure',
template: str,
okText: $translate.instant('kButtonOk'),
cancelText: $translate.instant('kButtonCancel'),
});
};
$scope.changeCircleSize = function () {
$scope.csize = Math.max(($scope.csize + 5) % 31, 10);
};
$scope.toggleZoneEdit = function () {
$scope.isZoneEdit = !$scope.isZoneEdit;
$scope.connKey = (Math.floor((Math.random() * 999999) + 1)).toString();
if ($scope.isZoneEdit) {
$ionicScrollDelegate.$getByHandle("imgscroll").zoomTo(1, true);
$scope.imageZoomable = false;
//document.getElementById("imgscroll").zooming="false";
for (var i = 0; i < $scope.circlePoints.length; i++) {
var t = document.getElementById("circle-" + i);
if (t) {
t.removeEventListener("touchstart", moveStart);
t.removeEventListener("mousedown", moveStart);
//t.removeEventListener("mousemove",moveContinue);
//t.removeEventListener("mouseup",moveStop);
t.addEventListener("touchstart", moveStart);
t.addEventListener("mousedown", moveStart);
//t.addEventListener("mousemove",moveContinue);
//t.addEventListener("mouseup",moveStop);
//console.log ("Found circle-"+i);
} else {
// console.log ("did not find circle-"+i);
}
}
} else // get out of edit
{
$scope.imageZoomable = true;
}
};
$scope.toggleZone = function () {
$scope.showZones = !$scope.showZones;
if (!$scope.showZones)
$scope.isZoneEdit = false;
};
$scope.imageLoaded = function () {
imageLoaded();
};
$scope.checkZoom = function () {
//var z = $ionicScrollDelegate.$getByHandle("imgscroll").getScrollPosition().zoom;
//imageLoaded();
};
$scope.circleTouch = function (evt) {
// console.log ("TOUCH");
};
//$scope.circleOnDrag = function (evt, ndx)
function recomputePolygons(ax, ay, ndx, z) {
// we get screen X/Y - need to translate
// to SVG points
//console.log ("recompute with",ax,"&",ay);
var svg = document.getElementById('zsvg');
var pt = svg.createSVGPoint();
pt.x = ax;
pt.y = ay;
var svgP = pt.matrixTransform(svg.getScreenCTM().inverse());
$scope.circlePoints[ndx].x = Math.round(svgP.x);
$scope.circlePoints[ndx].y = Math.round(svgP.y);
// get related polygon set
var zi = $scope.circlePoints[ndx].zoneIndex;
var newPoints = "";
for (var i = 0; i < $scope.circlePoints.length; i++) {
if ($scope.circlePoints[i].zoneIndex == zi) {
newPoints = newPoints + " " + $scope.circlePoints[i].x + "," + $scope.circlePoints[i].y;
}
//console.log ("recomputed polygon:", newPoints);
}
// console.log ("OLD ZONE FOR:"+zi+" is "+$scope.zoneArray[zi].coords );
//console.log ("NEW ZONE FOR:"+zi+" is "+newPoints);
$scope.zoneArray[zi].coords = newPoints;
//console.log ("INDEX="+ndx+" DRAG="+svgP.x+":"+svgP.y);
}
// credit: http://stackoverflow.com/questions/41411891/most-elegant-way-to-parse-scale-and-re-string-a-string-of-number-co-ordinates?noredirect=1#41411927
// This function scales coords of zones based on current image size
function scaleCoords(string, sx, sy) {
var f = [sx, sy];
return string.split(' ').map(function (a) {
return a.split(',').map(function (b, i) {
return Math.round(b * f[i]);
}).join(',');
}).join(' ');
}
function moveContinue(event) {
if (!_moveStart) {
return;
}
// console.log ("CONTINUE: target id="+targetID);
/*if(event.preventDefault) event.preventDefault();
if (event.gesture) event.gesture.preventDefault() ;
if (event.gesture) event.gesture.stopPropagation();*/
var x, y;
var z = $ionicScrollDelegate.$getByHandle("imgscroll").getScrollPosition().zoom;
// console.log ("zoom is:"+z);
//console.log(event, this, "t");
if (event.touches) {
//console.log ("TOUCH");
x = event.targetTouches[0].pageX;
y = event.targetTouches[0].pageY;
} else {
//console.log ("MOUSE");
x = event.clientX;
y = event.clientY;
}
// console.log ("X="+x+" Y="+y + " sl="+document.body.scrollLeft+ " sy="+document.body.scrollTop);
$timeout(function () {
recomputePolygons(x, y, targetID, 1);
});
}
function moveStop(event) {
_moveStart = false;
// console.log ("STOP");
}
function moveStart(event) {
_moveStart = true;
targetID = event.target.id.substring(7);
// console.log ("START: target id="+targetID);
if (event.preventDefault) event.preventDefault();
if (event.gesture) event.gesture.preventDefault();
if (event.gesture) event.gesture.stopPropagation();
var z = $ionicScrollDelegate.$getByHandle("imgscroll").getScrollPosition().zoom;
//console.log ("zoom is:"+z);
var x, y;
// perhaps event.targetTouches[0]?
if (event.touches) {
//console.log(event.changedTouches[0], this, "t");
x = event.touches[0].pageX;
y = event.touches[0].pageY;
} else {
//console.log(event, this, "t");
x = event.clientX;
y = event.clientY;
}
//console.log ("X="+x+" Y="+y + " sl="+document.body.scrollLeft+ " sy="+document.body.scrollTop);
}
// called when the live monitor image loads
// this is a good time to calculate scaled zone points
function imageLoaded() {
if ($scope.animationInProgress) return;
/*
var img = document.getElementById("singlemonitor");
$scope.cw = img.naturalWidth;
$scope.ch = img.naturalHeight;
$scope.zoneArray = [];
$scope.circlePoints = [];
var ow = $scope.monitor.Monitor.Width;
var oh = $scope.monitor.Monitor.Height;*/
// console.log ("MONITOR IS: "+JSON.stringify($scope.monitor));
// console.log ("ORIGINAL WH="+ow+"x"+oh);
/*for (var i = 0; i < originalZones.length; i++) {
var sx = $scope.cw / ow;
var sy = $scope.ch / oh;
$scope.zoneArray.push({
coords: originalZones[i].coords,
type: originalZones[i].type
});
}*/
// now create a points array for circle handles
/* for (i = 0; i < $scope.zoneArray.length; i++) {
//jshint loopfunc: true
$scope.zoneArray[i].coords.split(' ')
.forEach(function (itm) {
var o = itm.split(',');
$scope.circlePoints.push({
x: o[0],
y: o[1],
zoneIndex: i
});
// console.log ("CIRCLE X="+o[0]+"Y="+o[1]);
});
}*/
$scope.isModalStreamPaused = false;
NVRDataModel.debug ("Modal image loaded, switching to streaming");
}
//-------------------------------------------------------------
// Send PTZ command to ZM
// Note: PTZ fails on desktop, don't bother about it
//-------------------------------------------------------------
$scope.controlPTZ = function (monitorId, cmd) {
if (cmd == "special-hide-unhide") {
hideUnhidePresets();
return;
}
//console.log ("PTZ command is"+cmd);
controlPTZ(monitorId, cmd);
};
function hideUnhidePresets() {
//console.log ("**********HIDEUNHIDE");
$scope.ptzButtonsShown = !$scope.ptzButtonsShown;
if ($scope.ptzPresets.length > 0) {
dirn = $scope.ptzButtonsShown ? "up" : "down";
$scope.ptzPresets[0].icon = "ion-chevron-" + dirn;
}
}
function controlPTZ(monitorId, cmd) {
//presetGotoX
//presetHome
//curl -X POST "http://server.com/zm/index.php?view=request" -d
//"request=control&user=admin&passwd=xx&id=4&control=moveConLeft"
if ($scope.ptzMoveCommand == "undefined") {
$ionicLoading.show({
template: $translate.instant('kPTZNotReady'),
noBackdrop: true,
duration: 2000,
});
return;
}
var ptzData = "";
if (cmd.lastIndexOf("preset", 0) === 0) {
NVRDataModel.debug("PTZ command is a preset, so skipping xge/lge");
ptzData = {
view: "request",
request: "control",
id: monitorId,
control: cmd,
// xge: "30", //wtf
// yge: "30", //wtf
};
} else {
ptzData = {
view: "request",
request: "control",
id: monitorId,
control: cmd,
xge: "30", //wtf
yge: "30", //wtf
};
}
//console.log("Command value " + cmd + " with MID=" + monitorId);
//console.log("PTZDATA is " + JSON.stringify(ptzData));
$ionicLoading.hide();
$ionicLoading.show({
template: $translate.instant('kPleaseWait') + "...",
noBackdrop: true,
duration: zm.loadingTimeout,
});
var loginData = NVRDataModel.getLogin();
$ionicLoading.hide();
$ionicLoading.show({
template: $translate.instant('kSendingPTZ') + "...",
noBackdrop: true,
duration: zm.loadingTimeout,
});
var req = $http({
method: 'POST',
/*timeout: 15000,*/
url: loginData.url + '/index.php',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Accept': 'application/json',
},
transformRequest: function (obj) {
var str = [];
for (var p in obj)
str.push(encodeURIComponent(p) + "=" +
encodeURIComponent(obj[p]));
var foo = str.join("&");
//console.log("****RETURNING " + foo);
return foo;
},
data: ptzData
});
req.success(function (resp) {
//console.log("SUCCESS: " + JSON.stringify(resp));
$ionicLoading.hide();
});
req.error(function (resp) {
$ionicLoading.hide();
//console.log("ERROR: " + JSON.stringify(resp));
NVRDataModel.log("Error sending PTZ:" + JSON.stringify(resp), "error");
});
}
$scope.getZoomLevel = function () {
//console.log("ON RELEASE");
var zl = $ionicScrollDelegate.$getByHandle("imgscroll").getScrollPosition();
//console.log(JSON.stringify(zl));
};
$scope.onTap = function (m, d) {
moveToMonitor(m, d);
};
$scope.onSwipe = function (m, d) {
if ($scope.isZoneEdit) {
NVRDataModel.log("swipe disabled as you are in edit mode");
return;
}
var ld = NVRDataModel.getLogin();
if (!ld.canSwipeMonitors) return;
if ($ionicScrollDelegate.$getByHandle("imgscroll").getScrollPosition().zoom != 1) {
//console.log("Image is zoomed in - not honoring swipe");
return;
}
$scope.monStatus = "";
moveToMonitor(m, d);
};
function moveToMonitor(m, d) {
$scope.animationInProgress = true;
if ($scope.isZoneEdit) {
NVRDataModel.log("Not cycling, as you are editing zones");
}
var curstate = $ionicHistory.currentStateName();
var found = 0;
var mid;
mid = NVRDataModel.getNextMonitor(m, d);
$scope.showPTZ = false;
// FIXME: clean this up - in a situation where
// no monitors are enabled, will it loop for ever?
do {
mid = NVRDataModel.getNextMonitor(m, d);
m = mid;
//console.log("Next Monitor is " + m);
found = 0;
for (var i = 0; i < $scope.monitors.length; i++) {
if ($scope.monitors[i].Monitor.Id == mid &&
// if you came from monitors, then ignore noshow
($scope.monitors[i].Monitor.listDisplay != 'noshow' || curstate == "monitors") &&
$scope.monitors[i].Monitor.Function != 'None' &&
$scope.monitors[i].Monitor.Enabled != '0') {
found = 1;
//console.log(mid + "is part of the monitor list");
NVRDataModel.debug("ModalCtrl: swipe detected, moving to " + mid);
break;
} else {
NVRDataModel.debug("skipping " + $scope.monitors[i].Monitor.Id +
" listDisplay=" + $scope.monitors[i].Monitor.listDisplay +
" Function=" + $scope.monitors[i].Monitor.Function +
" Enabled=" + $scope.monitors[i].Monitor.Enabled);
}
}
}
while (found != 1);
// now kill stream and set up next
NVRDataModel.debug("Killing stream before we move on to next monitor...");
$scope.isModalStreamPaused = true;
var element = angular.element(document.getElementById("monitorimage"));
var slidein;
var slideout;
$timeout (function() {
NVRDataModel.killLiveStream($scope.connKey, $scope.controlURL);
// we should now have a paused stream, time to animate out
var dirn = d;
if (dirn == 1) {
slideout = "animated slideOutLeft";
slidein = "animated slideInRight";
} else {
slideout = "animated slideOutRight";
slidein = "animated slideInLeft";
}
element.addClass(slideout)
.one('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend', outWithOld);
});
function outWithOld() {
NVRDataModel.log(">>>Old image out");
// NVRDataModel.log("ModalCtrl:Stopping network pull...");
//NVRDataModel.stopNetwork("MonitorModal-outwithOld");
$scope.rand = Math.floor((Math.random() * 100000) + 1);
$timeout(function () {
element.removeClass(slideout);
element.addClass(slidein)
.one('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend', inWithNew);
$scope.monitorId = mid;
$scope.monitorName = NVRDataModel.getMonitorName(mid);
$scope.monitor = NVRDataModel.getMonitorObject(mid);
$scope.controlURL = $scope.monitor.Monitor.controlURL;
$scope.zoneArray = [];
$scope.circlePoints = [];
// getZones();
configurePTZ($scope.monitorId);
}, 200);
}
function inWithNew() {
element.removeClass(slidein);
$scope.isModalStreamPaused = false;
var ld = NVRDataModel.getLogin();
carouselUtils.setStop(false);
$scope.connKey = (Math.floor((Math.random() * 999999) + 1)).toString(); // get new key for new id
$scope.animationInProgress = false; // has to be AFTER new connkey
NVRDataModel.log("<<>>>>>>>>>>>>>>>>>>STOOOP");
document.addEventListener("pause", onPause, false);
document.addEventListener("resume", onResume, false);
/*document.addEventListener("mouseup", moveStop, false);
document.addEventListener("touchend", moveStop, false);
document.addEventL`istener("mousemove", moveContinue, false);
document.addEventListener("touchmove", moveContinue, false);*/
$scope.showZones = false;
//getZones();
var ld = NVRDataModel.getLogin();
//currentEvent = $scope.currentEvent;
//console.log ("************* GENERATED CONNKEY " + $scope.connKey);
$scope.currentFrame = 1;
$scope.monStatus = "";
$scope.isCycle = ld.cycleMonitors;
$scope.cycleText = $scope.isCycle ? $translate.instant('kOn') : $translate.instant('kOff');
$scope.quality = (NVRDataModel.getBandwidth() == "lowbw") ? zm.monSingleImageQualityLowBW : ld.monSingleImageQuality;
configurePTZ($scope.monitorId);
if (ld.cycleMonitors) {
NVRDataModel.debug("Cycling enabled at " + ld.cycleMonitorsInterval);
$interval.cancel(cycleHandle);
cycleHandle = $interval(function () {
moveToMonitor($scope.monitorId, 1);
// console.log ("Refreshing Image...");
}.bind(this), ld.cycleMonitorsInterval * 1000);
}
});
}]);