summaryrefslogtreecommitdiff
path: root/www/js
diff options
context:
space:
mode:
authorPliable Pixels <pliablepixels@gmail.com>2016-11-18 09:28:08 -0500
committerPliable Pixels <pliablepixels@gmail.com>2016-11-18 09:28:08 -0500
commit31ca68739126f5740681238539a8c6a1b66e0000 (patch)
treeddd6317b70ae500f63a3231a0639c54a02129c20 /www/js
parentcf93ca01f3d54fca62d4222f110c2a63b526badb (diff)
mass formatting and normalization - tweaked JSBeautify options
Diffstat (limited to 'www/js')
-rw-r--r--www/js/DataModel.js895
-rw-r--r--www/js/DevOptionsCtrl.js72
-rw-r--r--www/js/EventCtrl.js925
-rw-r--r--www/js/EventDateTimeFilterCtrl.js79
-rw-r--r--www/js/EventModalCtrl.js771
-rw-r--r--www/js/EventServer.js259
-rw-r--r--www/js/EventServerSettingsCtrl.js192
-rw-r--r--www/js/EventsGraphsCtrl.js158
-rw-r--r--www/js/EventsModalGraphCtrl.js189
-rw-r--r--www/js/FirstUseCtrl.js67
-rw-r--r--www/js/HelpCtrl.js50
-rw-r--r--www/js/ImportantMessageCtrl.js20
-rw-r--r--www/js/LogCtrl.js120
-rw-r--r--www/js/LoginCtrl.js416
-rw-r--r--www/js/LowVersionCtrl.js16
-rw-r--r--www/js/MenuController.js72
-rw-r--r--www/js/MonitorCtrl.js446
-rw-r--r--www/js/MonitorModalCtrl.js617
-rw-r--r--www/js/MontageCtrl.js2144
-rw-r--r--www/js/MontageHistoryCtrl.js719
-rw-r--r--www/js/NewsCtrl.js61
-rw-r--r--www/js/PortalLoginCtrl.js221
-rw-r--r--www/js/StateCtrl.js195
-rw-r--r--www/js/TimelineCtrl.js712
-rw-r--r--www/js/TimelineModalCtrl.js198
-rw-r--r--www/js/WizardCtrl.js348
-rw-r--r--www/js/app.js1103
-rw-r--r--www/js/ionicUtils.js39
28 files changed, 6228 insertions, 4876 deletions
diff --git a/www/js/DataModel.js b/www/js/DataModel.js
index 2a49c454..f1df7a83 100644
--- a/www/js/DataModel.js
+++ b/www/js/DataModel.js
@@ -1,6 +1,5 @@
/* jshint -W041 */
-
/* jslint browser: true*/
/* global cordova,StatusBar,angular,console, URI, moment, localforage, CryptoJS, Connection */
@@ -13,7 +12,8 @@ angular.module('zmApp.controllers')
.service('NVRDataModel', ['$http', '$q', '$ionicLoading', '$ionicBackdrop', '$fileLogger', 'zm', '$rootScope', '$ionicContentBanner', '$timeout', '$cordovaPinDialog', '$ionicPopup', '$localstorage', '$state', '$ionicNativeTransitions', '$translate', '$cordovaSQLite',
function($http, $q, $ionicLoading, $ionicBackdrop, $fileLogger,
zm, $rootScope, $ionicContentBanner, $timeout, $cordovaPinDialog,
- $ionicPopup, $localstorage, $state, $ionicNativeTransitions, $translate) {
+ $ionicPopup, $localstorage, $state, $ionicNativeTransitions, $translate)
+ {
var zmAppVersion = "unknown";
var isBackground = false;
@@ -28,14 +28,15 @@ angular.module('zmApp.controllers')
var tz = "";
var isTzSupported = false;
-
- var languages = [{
+ var languages = [
+ {
text: 'English',
value: 'en'
- }, {
+ },
+ {
text: 'Italian',
value: 'it'
- },
+ },
{
text: 'Polski',
value: 'pl'
@@ -44,10 +45,12 @@ angular.module('zmApp.controllers')
{
text: 'Русский',
value: 'ru'
- }, {
+ },
+ {
text: 'Portugese',
value: 'pt'
- }, {
+ },
+ {
text: 'العربية',
value: 'ar'
},
@@ -132,21 +135,18 @@ angular.module('zmApp.controllers')
'followTimeLine': false,
'timelineScale': -1,
-
-
};
var defaultLoginData = angular.copy(loginData);
-
-
var configParams = {
'ZM_EVENT_IMAGE_DIGITS': '-1',
'ZM_PATH_ZMS': ''
};
// credit: http://stackoverflow.com/questions/4994201/is-object-empty
- function isEmpty(obj) {
+ function isEmpty(obj)
+ {
// null and undefined are "empty"
if (obj == null) return true;
@@ -159,30 +159,36 @@ angular.module('zmApp.controllers')
// Otherwise, does it have any properties of its own?
// Note that this doesn't handle
// toString and valueOf enumeration bugs in IE < 9
- for (var key in obj) {
+ for (var key in obj)
+ {
if (hasOwnProperty.call(obj, key)) return false;
}
return true;
}
- function getBandwidth() {
+ function getBandwidth()
+ {
// if mode is not on always return high
- if (loginData.enableLowBandwidth == false) {
+ if (loginData.enableLowBandwidth == false)
+ {
return "highbw";
}
// if mode is force on, return low
- if (loginData.enableLowBandwidth == true && loginData.autoSwitchBandwidth != true) {
+ if (loginData.enableLowBandwidth == true && loginData.autoSwitchBandwidth != true)
+ {
return "lowbw";
}
- if (loginData.enableLowBandwidth == true && loginData.autoSwitchBandwidth == true && $rootScope.platformOS == 'desktop') {
+ if (loginData.enableLowBandwidth == true && loginData.autoSwitchBandwidth == true && $rootScope.platformOS == 'desktop')
+ {
return "highbw";
}
// else return real state
var networkState = navigator.connection.type;
var strState;
- switch (networkState) {
+ switch (networkState)
+ {
case Connection.WIFI:
strState = "highbw";
@@ -203,9 +209,12 @@ angular.module('zmApp.controllers')
//--------------------------------------------------------------------------
// separate out a debug so we don't do this if comparison for normal logs
- function debug(val) {
- if (loginData.enableDebug && loginData.enableLogs) {
- if (val !== undefined) {
+ function debug(val)
+ {
+ if (loginData.enableDebug && loginData.enableLogs)
+ {
+ if (val !== undefined)
+ {
var regex1 = /"password":".*?"/g;
var regex2 = /&pass=.*?(?=["&]|$)/g;
@@ -218,9 +227,12 @@ angular.module('zmApp.controllers')
}
}
- function log(val, logtype) {
- if (loginData.enableLogs) {
- if (val !== undefined) {
+ function log(val, logtype)
+ {
+ if (loginData.enableLogs)
+ {
+ if (val !== undefined)
+ {
var regex1 = /"password":".*?"/g;
var regex2 = /&pass=.*?(?=["&]|$)/g;
@@ -237,31 +249,33 @@ angular.module('zmApp.controllers')
}
}
-
- function reloadMonitorDisplayStatus() {
+ function reloadMonitorDisplayStatus()
+ {
debug("Loading hidden/unhidden status...");
var positionsStr = loginData.packeryPositions;
//console.log ("positionStr="+positionsStr);
var positions = {};
- if (loginData.packeryPositions != '') {
+ if (loginData.packeryPositions != '')
+ {
positions = JSON.parse(positionsStr);
- for (var m = 0; m < monitors.length; m++) {
- for (var p = 0; p < positions.length; p++) {
- if (monitors[m].Monitor.Id == positions[p].attr) {
+ for (var m = 0; m < monitors.length; m++)
+ {
+ for (var p = 0; p < positions.length; p++)
+ {
+ if (monitors[m].Monitor.Id == positions[p].attr)
+ {
monitors[m].Monitor.listDisplay = positions[p].display;
debug("DataModel: Setting MID:" + monitors[m].Monitor.Id + " to " + monitors[m].Monitor.listDisplay);
}
-
}
}
-
}
}
-
- function setLogin(newLogin) {
+ function setLogin(newLogin)
+ {
loginData = angular.copy(newLogin);
serverGroupList[loginData.serverName] = angular.copy(loginData);
@@ -269,23 +283,21 @@ angular.module('zmApp.controllers')
//console.log ("****serverLogin was encrypted to " + ct);
//$localstorage.setObject("serverGroupList", serverGroupList);
- localforage.setItem("serverGroupList", ct, function(err) {
+ localforage.setItem("serverGroupList", ct, function(err)
+ {
if (err) log("localforage store error " + JSON.stringify(err));
});
//$localstorage.set("defaultServerName", loginData.serverName);
- localforage.setItem("defaultServerName", loginData.serverName, function(err) {
+ localforage.setItem("defaultServerName", loginData.serverName, function(err)
+ {
if (err) log("localforage store error " + JSON.stringify(err));
});
-
-
-
}
-
-
//credit: https://gist.github.com/alexey-bass/1115557
- function versionCompare(left, right) {
+ function versionCompare(left, right)
+ {
if (typeof left + typeof right != 'stringstring')
return false;
@@ -294,10 +306,14 @@ angular.module('zmApp.controllers')
var i = 0;
var len = Math.max(a.length, b.length);
- for (; i < len; i++) {
- if ((a[i] && !b[i] && parseInt(a[i]) > 0) || (parseInt(a[i]) > parseInt(b[i]))) {
+ for (; i < len; i++)
+ {
+ if ((a[i] && !b[i] && parseInt(a[i]) > 0) || (parseInt(a[i]) > parseInt(b[i])))
+ {
return 1;
- } else if ((b[i] && !a[i] && parseInt(b[i]) > 0) || (parseInt(a[i]) < parseInt(b[i]))) {
+ }
+ else if ((b[i] && !a[i] && parseInt(b[i]) > 0) || (parseInt(a[i]) < parseInt(b[i])))
+ {
return -1;
}
}
@@ -305,14 +321,15 @@ angular.module('zmApp.controllers')
return 0;
}
-
//--------------------------------------------------------------------------
// Banner display of messages
//--------------------------------------------------------------------------
- function displayBanner(mytype, mytext, myinterval, mytimer) {
+ function displayBanner(mytype, mytext, myinterval, mytimer)
+ {
var contentBannerInstance =
- $ionicContentBanner.show({
+ $ionicContentBanner.show(
+ {
text: mytext || 'no text',
interval: myinterval || 2000,
//autoClose: mytimer || 6000,
@@ -321,29 +338,30 @@ angular.module('zmApp.controllers')
//cancelOnStateChange: false
});
- $timeout(function() {
+ $timeout(function()
+ {
contentBannerInstance();
}, mytimer || 6000);
}
-
return {
//-------------------------------------------------------------
// used by various controllers to log messages to file
//-------------------------------------------------------------
- migrationComplete: function() {
+ migrationComplete: function()
+ {
migrationComplete = true;
},
-
-
- isEmpty: function(obj) {
+ isEmpty: function(obj)
+ {
return isEmpty(obj);
},
- log: function(val, type) {
+ log: function(val, type)
+ {
var logtype = 'info';
if (type != undefined)
logtype = type;
@@ -351,32 +369,35 @@ angular.module('zmApp.controllers')
},
- debug: function(val) {
-
+ debug: function(val)
+ {
debug(val);
},
- setLastUpdateCheck: function(val) {
+ setLastUpdateCheck: function(val)
+ {
lastUpdateCheck = val;
localforage.setItem("lastUpdateCheck", lastUpdateCheck);
},
- getLastUpdateCheck: function() {
+ getLastUpdateCheck: function()
+ {
return lastUpdateCheck;
},
- setLatestBlogPostChecked: function(val) {
+ setLatestBlogPostChecked: function(val)
+ {
//console.log (">>>>>>>>>>>> Setting blog date: " + val);
latestBlogPostChecked = val;
localforage.setItem("latestBlogPostChecked", latestBlogPostChecked);
},
- getLatestBlogPostChecked: function() {
+ getLatestBlogPostChecked: function()
+ {
return latestBlogPostChecked;
},
-
// This function is called when the app is ready to run
// sets up various variables
// including persistent login data for the ZM apis and portal
@@ -386,8 +407,8 @@ angular.module('zmApp.controllers')
// the ZM authors fix this and streamline the access of images
// from APIs, I don't have an option
-
- zmStateGo: function(state, p1, p2) {
+ zmStateGo: function(state, p1, p2)
+ {
if ($rootScope.platformOS == 'desktop')
$state.go(state, p1, p2);
else
@@ -395,14 +416,16 @@ angular.module('zmApp.controllers')
},
// used when an empty server profile is created
- getDefaultLoginObject: function() {
+ getDefaultLoginObject: function()
+ {
return angular.copy(defaultLoginData);
},
-
- getReachableConfig: function(skipFirst) {
+ getReachableConfig: function(skipFirst)
+ {
var d = $q.defer();
- if (loginData.serverName == "") {
+ if (loginData.serverName == "")
+ {
log("Reachable: No server name configured, likely first use?");
d.reject("No servers");
return d.promise;
@@ -413,9 +436,11 @@ angular.module('zmApp.controllers')
//log ("Making sure " + loginData.serverName + " is reachable...");
var tLd = serverGroupList[loginData.serverName];
- if (skipFirst && tLd.fallbackConfiguration) {
+ if (skipFirst && tLd.fallbackConfiguration)
+ {
tLd = serverGroupList[tLd.fallbackConfiguration];
- if (!tLd) {
+ if (!tLd)
+ {
d.reject("No available severs");
loginData = savedLoginData;
return d.promise;
@@ -423,38 +448,43 @@ angular.module('zmApp.controllers')
}
}
-
-
var keepBuilding = true;
- while (keepBuilding == true && tLd) {
+ while (keepBuilding == true && tLd)
+ {
if (arrayObjectIndexOf(chainURLs, tLd.url + "/index.php", "url") == -1 && tLd.url !== undefined && tLd.url != '') // no loop
{
log("Adding to chain stack: " + tLd.serverName + ">" + tLd.url);
- chainURLs.push({
+ chainURLs.push(
+ {
url: tLd.url + "/index.php",
server: tLd.serverName
});
log("Fallback of " + tLd.serverName + " is " + tLd.fallbackConfiguration);
- if (tLd.fallbackConfiguration) {
+ if (tLd.fallbackConfiguration)
+ {
tLd = serverGroupList[tLd.fallbackConfiguration];
- if (tLd === undefined) {
+ if (tLd === undefined)
+ {
// This can happen if the fallback profile was deleted
log("Looks like a server object was deleted, but is still in fallback");
keepBuilding = false;
}
- } else {
+ }
+ else
+ {
log("reached end of chain loop");
}
- } else {
+ }
+ else
+ {
log("detected loop when " + tLd.serverName + " fallsback to " + tLd.fallbackConfiguration);
keepBuilding = false;
}
}
-
-
//contactedServers.push(loginData.serverName);
- findFirstReachableUrl(chainURLs).then(function(firstReachableUrl) {
+ findFirstReachableUrl(chainURLs).then(function(firstReachableUrl)
+ {
d.resolve(firstReachableUrl);
// also make sure loginData points to this now
@@ -468,90 +498,96 @@ angular.module('zmApp.controllers')
return d.promise;
// OK: do something with firstReachableUrl
- }, function() {
+ }, function()
+ {
d.reject("No servers reachable");
loginData = savedLoginData;
return d.promise;
// KO: no url could be reached
});
-
- function arrayObjectIndexOf(myArray, searchTerm, property) {
- for (var i = 0, len = myArray.length; i < len; i++) {
+ function arrayObjectIndexOf(myArray, searchTerm, property)
+ {
+ for (var i = 0, len = myArray.length; i < len; i++)
+ {
if (myArray[i][property] === searchTerm)
return i;
}
return -1;
}
- function findFirstReachableUrl(urls) {
- if (urls.length > 0 && $rootScope.userCancelledAuth != true) {
- $ionicLoading.show({
+ function findFirstReachableUrl(urls)
+ {
+ if (urls.length > 0 && $rootScope.userCancelledAuth != true)
+ {
+ $ionicLoading.show(
+ {
template: $translate.instant('kTrying') + ' ' + urls[0].server
});
log("Reachability test.." + urls[0].url);
- if (loginData.reachability) {
+ if (loginData.reachability)
+ {
//console.log ("************* AUGH");
- return $http.get(urls[0].url).then(function() {
+ return $http.get(urls[0].url).then(function()
+ {
log("Success: reachability on " + urls[0].url);
$ionicLoading.hide();
return urls[0];
- }, function(err) {
+ }, function(err)
+ {
log("Failed reachability on " + urls[0].url + " with error " + JSON.stringify(err));
return findFirstReachableUrl(urls.slice(1));
});
- } else {
+ }
+ else
+ {
log("Reachability is disabled in config, faking this test and returning success on " + urls[0]);
return urls[0];
}
- } else {
+ }
+ else
+ {
$ionicLoading.hide();
return $q.reject("No reachable URL");
}
-
}
return d.promise;
-
},
- init: function() {
+ init: function()
+ {
// console.log("****** DATAMODEL INIT SERVICE CALLED ********");
-
-
-
-
-
-
-
log("ZMData init: checking for stored variables & setting up log file");
latestBlogPostChecked = localforage.getItem("latestBlogPostChecked") || null;
- $ionicLoading.show({
+ $ionicLoading.show(
+ {
template: "retrieving profile data..."
});
-
-
-
- localforage.getItem("serverGroupList").then(function(val) {
+ localforage.getItem("serverGroupList").then(function(val)
+ {
// decrypt it now
var decodedVal;
- if (typeof val == 'string') {
+ if (typeof val == 'string')
+ {
log("user profile encrypted, decoding...");
var bytes = CryptoJS.AES.decrypt(val.toString(), zm.cipherKey);
decodedVal = JSON.parse(bytes.toString(CryptoJS.enc.Utf8));
- } else {
+ }
+ else
+ {
log("user profile not encrypted");
decodedVal = val;
}
@@ -563,7 +599,6 @@ angular.module('zmApp.controllers')
$ionicLoading.hide();
serverGroupList = decodedVal;
-
// console.log(">>>> DECRYPTED serverGroupList " + JSON.stringify(serverGroupList));
var demoServer = "{\"serverName\":\"zmNinjaDemo\",\"username\":\"zmninja\",\"password\":\"zmNinja$xc129\",\"url\":\"https://demo.zoneminder.com/zm\",\"apiurl\":\"https://demo.zoneminder.com/zm/api\",\"eventServer\":\"\",\"maxMontage\":\"40\",\"streamingurl\":\"https://demo.zoneminder.com/cgi-bin-zm\",\"maxFPS\":\"3\",\"montageQuality\":\"50\",\"singleImageQuality\":\"100\",\"montageHistoryQuality\":\"50\",\"useSSL\":true,\"keepAwake\":true,\"isUseAuth\":\"1\",\"isUseEventServer\":false,\"disablePush\":false,\"eventServerMonitors\":\"\",\"eventServerInterval\":\"\",\"refreshSec\":\"2\",\"enableDebug\":false,\"usePin\":false,\"pinCode\":\"\",\"canSwipeMonitors\":true,\"persistMontageOrder\":false,\"onTapScreen\":\"Events\",\"enableh264\":true,\"gapless\":false,\"montageOrder\":\"\",\"montageHiddenOrder\":\"\",\"montageArraySize\":\"0\",\"graphSize\":2000,\"enableAlarmCount\":true,\"montageSize\":\"3\",\"useNphZms\":true,\"useNphZmsForEvents\":true,\"packMontage\":false,\"exitOnSleep\":false,\"forceNetworkStop\":false,\"defaultPushSound\":false,\"enableBlog\":true,\"use24hr\":false, \"packeryPositions\":\"\"}";
var demoS = JSON.parse(demoServer);
@@ -571,7 +606,8 @@ angular.module('zmApp.controllers')
var isFoundDemo = false;
var as = Object.keys(serverGroupList);
- for (var x = 0; x < as.length; x++) {
+ for (var x = 0; x < as.length; x++)
+ {
if (as[x] == 'zmNinjaDemo')
isFoundDemo = true;
//console.log ("************ FOUND SERVER NAME " + as[x]);
@@ -581,25 +617,29 @@ angular.module('zmApp.controllers')
// Don't add the demo if there is another server
// because this means the user deleted it
- if (!isFoundDemo && as.length == 0) {
+ if (!isFoundDemo && as.length == 0)
+ {
debug("Pushing demo server config to server groups");
//serverGroupList.push(demoS);
serverGroupList[demoS.serverName] = angular.copy(demoS);
}
var sname;
- $ionicLoading.show({
+ $ionicLoading.show(
+ {
template: "retrieving profile data..."
});
localforage.getItem("defaultServerName")
- .then(function(val) {
+ .then(function(val)
+ {
$ionicLoading.hide();
//console.log ("!!!!!!!!!!!!!!!!!!default server name is " + sname);
sname = val;
// console.log("!!!!!!!!!!!!!!!!!!!Got VAL " + sname);
var loadedData = serverGroupList[sname];
// console.log(">>>>>>>>>>> loadedData is: " + JSON.stringify(loadedData));
- if (!isEmpty(loadedData)) {
+ if (!isEmpty(loadedData))
+ {
loginData = loadedData;
// old version hacks for new variables
@@ -608,53 +648,57 @@ angular.module('zmApp.controllers')
loginData.persistMontageOrder = true;
loginData.enableh264 = true;
- if (typeof loginData.enableAlarmCount === 'undefined') {
+ if (typeof loginData.enableAlarmCount === 'undefined')
+ {
debug("enableAlarmCount does not exist, setting to true");
loginData.enableAlarmCount = true;
}
- if (typeof loginData.onTapScreen == 'undefined') {
+ if (typeof loginData.onTapScreen == 'undefined')
+ {
loginData.onTapScreen = $translate.instant('kTapMontage');
}
if (loginData.onTapScreen != $translate.instant('kTapMontage') &&
loginData.onTapScreen != $translate.instant('kTapEvents') &&
- loginData.onTapScreen != $translate.instant('kTapLiveMonitor')) {
+ loginData.onTapScreen != $translate.instant('kTapLiveMonitor'))
+ {
log("Invalid onTap setting found, resetting");
loginData.onTapScreen = $translate.instant('kMontage');
}
-
- if (typeof loginData.minAlarmCount === 'undefined') {
+ if (typeof loginData.minAlarmCount === 'undefined')
+ {
debug("minAlarmCount does not exist, setting to true");
loginData.minAlarmCount = 1;
}
-
- if (typeof loginData.montageSize == 'undefined') {
+ if (typeof loginData.montageSize == 'undefined')
+ {
debug("montageSize does not exist, setting to 2 (2 per col)");
loginData.montageSize = 2;
}
-
- if (typeof loginData.useNphZms == 'undefined') {
+ if (typeof loginData.useNphZms == 'undefined')
+ {
debug("useNphZms does not exist. Setting to true");
loginData.useNphZms = true;
}
-
-
- if (typeof loginData.useNphZmsForEvents == 'undefined') {
+ if (typeof loginData.useNphZmsForEvents == 'undefined')
+ {
debug("useNphZmsForEvents does not exist. Setting to true");
loginData.useNphZmsForEvents = true;
}
- if (typeof loginData.forceImageModePath == 'undefined') {
+ if (typeof loginData.forceImageModePath == 'undefined')
+ {
debug("forceImageModePath does not exist. Setting to false");
loginData.forceImageModePath = false;
}
- if (typeof loginData.reachability == 'undefined') {
+ if (typeof loginData.reachability == 'undefined')
+ {
debug("reachability does not exist. Setting to true");
loginData.reachability = true;
}
@@ -665,74 +709,80 @@ angular.module('zmApp.controllers')
loginData.useNphZms = true;
loginData.useNphZmsForEvents = true;
- if (typeof loginData.packMontage == 'undefined') {
+ if (typeof loginData.packMontage == 'undefined')
+ {
debug("packMontage does not exist. Setting to false");
loginData.packMontage = false;
}
- if (typeof loginData.forceNetworkStop == 'undefined') {
+ if (typeof loginData.forceNetworkStop == 'undefined')
+ {
debug("forceNetwork does not exist. Setting to false");
loginData.forceNetworkStop = false;
}
- if (typeof loginData.enableLogs == 'undefined') {
+ if (typeof loginData.enableLogs == 'undefined')
+ {
debug("enableLogs does not exist. Setting to true");
loginData.enableLogs = true;
}
-
-
- if (typeof loginData.defaultPushSound == 'undefined') {
+ if (typeof loginData.defaultPushSound == 'undefined')
+ {
debug("defaultPushSound does not exist. Setting to false");
loginData.defaultPushSound = false;
}
-
-
- if (typeof loginData.exitOnSleep == 'undefined') {
+ if (typeof loginData.exitOnSleep == 'undefined')
+ {
debug("exitOnSleep does not exist. Setting to false");
loginData.exitOnSleep = false;
}
- if (typeof loginData.enableBlog == 'undefined') {
+ if (typeof loginData.enableBlog == 'undefined')
+ {
debug("enableBlog does not exist. Setting to true");
loginData.enableBlog = true;
}
- if (typeof loginData.packeryPositions == 'undefined') {
+ if (typeof loginData.packeryPositions == 'undefined')
+ {
debug("packeryPositions does not exist. Setting to empty");
loginData.packeryPositions = "";
}
-
- if (typeof loginData.EHpackeryPositions == 'undefined') {
+ if (typeof loginData.EHpackeryPositions == 'undefined')
+ {
debug("EHpackeryPositions does not exist. Setting to empty");
loginData.EHpackeryPositions = "";
}
-
- if (typeof loginData.packerySizes == 'undefined') {
+ if (typeof loginData.packerySizes == 'undefined')
+ {
debug("packerySizes does not exist. Setting to empty");
loginData.packerySizes = "";
}
- if (typeof loginData.use24hr == 'undefined') {
+ if (typeof loginData.use24hr == 'undefined')
+ {
debug("use24hr does not exist. Setting to false");
loginData.use24hr = false;
}
- if (typeof timelineModalGraphType == 'undefined') {
+ if (typeof timelineModalGraphType == 'undefined')
+ {
debug("timeline graph type not set. Setting to all");
loginData.timelineModalGraphType = $translate.instant('kGraphAll');
//console.log(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" + loginData.timelineModalGraphType);
}
- if (typeof loginData.resumeDelay == 'undefined') {
+ if (typeof loginData.resumeDelay == 'undefined')
+ {
debug("resumeDelay does not exist. Setting to 0");
loginData.resumeDelay = 0;
@@ -740,47 +790,50 @@ angular.module('zmApp.controllers')
// override resumeDelay - it was developed on a wrong assumption
loginData.resumeDelay = 0;
-
-
- if (typeof loginData.montageHistoryQuality == 'undefined') {
+ if (typeof loginData.montageHistoryQuality == 'undefined')
+ {
debug("montageHistoryQuality does not exist. Setting to 50");
loginData.montageHistoryQuality = "50";
}
- if (typeof loginData.disableNative == 'undefined') {
+ if (typeof loginData.disableNative == 'undefined')
+ {
debug("disableNative not found, setting to false");
loginData.disableNative = false;
}
- if (typeof loginData.vibrateOnPush == 'undefined') {
+ if (typeof loginData.vibrateOnPush == 'undefined')
+ {
debug("vibrate on push not found, setting to true");
loginData.vibrateOnPush = true;
}
- if (typeof loginData.soundOnPush == 'undefined') {
+ if (typeof loginData.soundOnPush == 'undefined')
+ {
debug("sound on push not found, setting to true");
loginData.soundOnPush = true;
}
- if (typeof loginData.cycleMonitors == 'undefined') {
+ if (typeof loginData.cycleMonitors == 'undefined')
+ {
loginData.cycleMonitors = false;
}
- if (typeof loginData.cycleMonitorsInterval == 'undefined') {
+ if (typeof loginData.cycleMonitorsInterval == 'undefined')
+ {
loginData.cycleMonitorsInterval = 10;
}
-
- if (typeof loginData.enableLowBandwidth == 'undefined') {
-
+ if (typeof loginData.enableLowBandwidth == 'undefined')
+ {
loginData.enableLowBandwidth = false;
@@ -788,11 +841,8 @@ angular.module('zmApp.controllers')
// wtf is wrong with this ternary?
//$rootScope.runMode = (loginData.enableLowBandwith==true)? "low": "normal";
-
-
-
- if (typeof loginData.autoSwitchBandwidth == 'undefined') {
-
+ if (typeof loginData.autoSwitchBandwidth == 'undefined')
+ {
loginData.autoSwitchBandwidth = false;
@@ -801,66 +851,62 @@ angular.module('zmApp.controllers')
$rootScope.runMode = getBandwidth();
log("Setting DataModel init bandwidth to: " + $rootScope.runMode);
-
-
-
- if (typeof loginData.refreshSecLowBW == 'undefined') {
+ if (typeof loginData.refreshSecLowBW == 'undefined')
+ {
loginData.refreshSecLowBW = 8;
}
- if (typeof loginData.disableAlarmCheckMontage == 'undefined') {
+ if (typeof loginData.disableAlarmCheckMontage == 'undefined')
+ {
loginData.disableAlarmCheckMontage = false;
}
-
- if (typeof loginData.useLocalTimeZone == 'undefined') {
+ if (typeof loginData.useLocalTimeZone == 'undefined')
+ {
loginData.useLocalTimeZone = true;
}
-
- if (typeof loginData.fastLogin == 'undefined') {
+ if (typeof loginData.fastLogin == 'undefined')
+ {
loginData.fastLogin = true;
}
-
- if (typeof loginData.followTimeLine == 'undefined') {
+ if (typeof loginData.followTimeLine == 'undefined')
+ {
loginData.followTimeLine = false;
}
-
- if (typeof loginData.timelineScale == 'undefined') {
+ if (typeof loginData.timelineScale == 'undefined')
+ {
loginData.timelineScale = -1;
}
-
-
-
- if (typeof loginData.monSingleImageQuality == 'undefined') {
+ if (typeof loginData.monSingleImageQuality == 'undefined')
+ {
loginData.monSingleImageQuality = 100;
}
log("DataModel init recovered this loginData as " + JSON.stringify(loginData));
- } else {
+ }
+ else
+ {
log("defaultServer configuration NOT found. Keeping login at defaults");
}
-
-
-
// FIXME: HACK: This is the latest entry point into dataModel init, so start portal login after this
// not the neatest way
$rootScope.$emit('init-complete');
@@ -875,67 +921,82 @@ angular.module('zmApp.controllers')
},
- isForceNetworkStop: function() {
+ isForceNetworkStop: function()
+ {
return loginData.forceNetworkStop;
},
- setJustResumed: function(val) {
+ setJustResumed: function(val)
+ {
justResumed = true;
},
- stopNetwork: function(str) {
+ stopNetwork: function(str)
+ {
var s = "";
if (str) s = str + ":";
- if (justResumed) {
+ if (justResumed)
+ {
// we don't call stop as we did stop on pause
log(s + " Not calling window stop as we just resumed");
justResumed = false;
- } else {
+ }
+ else
+ {
log(s + " Calling window.stop()");
window.stop();
}
},
- isLoggedIn: function() {
+ isLoggedIn: function()
+ {
if ((loginData.username != "" && loginData.password != "" && loginData.url != "" &&
- loginData.apiurl != "") || (loginData.isUseAuth != '1')) {
+ loginData.apiurl != "") || (loginData.isUseAuth != '1'))
+ {
return 1;
- } else {
-
+ }
+ else
+ {
return 0;
}
},
- getLanguages: function() {
+ getLanguages: function()
+ {
return languages;
},
- setDefaultLanguage: function(l, permanent) {
+ setDefaultLanguage: function(l, permanent)
+ {
if (!l) l = 'en';
defaultLang = l;
var d = $q.defer();
- if (permanent) {
+ if (permanent)
+ {
//window.localStorage.setItem("defaultLang", l);
//console.log("setting default lang");
localforage.setItem("defaultLang", l)
- .then(function(val) {
+ .then(function(val)
+ {
log("Set language in localforage to: " + val);
});
}
//console.log("invoking translate use with " + l);
- $translate.use(l).then(function(data) {
+ $translate.use(l).then(function(data)
+ {
log("Device Language is:" + data);
moment.locale(data);
$translate.fallbackLanguage('en');
d.resolve(data);
return d.promise;
- }, function(error) {
+ }, function(error)
+ {
log("Device Language error: " + error);
$translate.use('en');
moment.locale('en');
@@ -945,65 +1006,77 @@ angular.module('zmApp.controllers')
return d.promise;
},
- getDefaultLanguage: function() {
+ getDefaultLanguage: function()
+ {
return defaultLang;
//return window.localStorage.getItem("defaultLang");
},
- reloadMonitorDisplayStatus: function() {
+ reloadMonitorDisplayStatus: function()
+ {
return reloadMonitorDisplayStatus();
},
- getLogin: function() {
-
+ getLogin: function()
+ {
return angular.copy(loginData);
},
- getServerGroups: function() {
+ getServerGroups: function()
+ {
return angular.copy(serverGroupList);
},
- setServerGroups: function(sg) {
+ setServerGroups: function(sg)
+ {
serverGroupList = angular.copy(sg);
},
- getKeepAwake: function() {
+ getKeepAwake: function()
+ {
return (loginData.keepAwake == '1') ? true : false;
},
- setAppVersion: function(ver) {
+ setAppVersion: function(ver)
+ {
zmAppVersion = ver;
},
- getAppVersion: function() {
+ getAppVersion: function()
+ {
return (zmAppVersion);
},
- setBackground: function(val) {
+ setBackground: function(val)
+ {
isBackground = val;
},
- isBackground: function() {
+ isBackground: function()
+ {
return isBackground;
},
- isFirstUse: function() {
+ isFirstUse: function()
+ {
// console.log("isFirstUse is " + isFirstUse);
return isFirstUse;
// return ((window.localStorage.getItem("isFirstUse") == undefined) ? true : false);
},
- versionCompare: function(l, r) {
+ versionCompare: function(l, r)
+ {
return versionCompare(l, r);
},
//-----------------------------------------------------------------
// Allow the option to reset first use if I need it in future
//-----------------------------------------------------------------
- setFirstUse: function(val) {
+ setFirstUse: function(val)
+ {
//window.localStorage.setItem("isFirstUse", val ? "1" : "0");
//localforage.setItem("isFirstUse", val,
// function(err) {if (err) log ("localforage error, //storing isFirstUse: " + JSON.stringify(err));});
@@ -1013,37 +1086,47 @@ angular.module('zmApp.controllers')
},
- getTimeFormat: function() {
+ getTimeFormat: function()
+ {
return (loginData.use24hr ? "HH:mm" : "hh:mm a");
},
- getTimeFormatSec: function() {
+ getTimeFormatSec: function()
+ {
return (loginData.use24hr ? "HH:mm:ss" : "hh:mm:ss a");
},
//------------------------------------------------------------------
// switches screen to 'always on' or 'auto'
//------------------------------------------------------------------
- setAwake: function(val) {
-
+ setAwake: function(val)
+ {
//console.log ("**** setAwake called with:" + val);
// log("Switching screen always on to " + val);
- if (val) {
+ if (val)
+ {
- if (window.cordova != undefined) {
+ if (window.cordova != undefined)
+ {
window.plugins.insomnia.keepAwake();
- } else {
+ }
+ else
+ {
//console.log ("Skipping insomnia, cordova does not exist");
}
- } else {
- if (window.cordova != undefined) {
+ }
+ else
+ {
+ if (window.cordova != undefined)
+ {
window.plugins.insomnia.allowSleepAgain();
- } else {
+ }
+ else
+ {
//console.log ("Skipping insomnia, cordova does not exist");
}
-
}
},
@@ -1052,7 +1135,8 @@ angular.module('zmApp.controllers')
// writes all params to local storage. FIXME: Move all of this into a JSON
// object
//--------------------------------------------------------------------------
- setLogin: function(newLogin) {
+ setLogin: function(newLogin)
+ {
setLogin(newLogin);
$rootScope.showBlog = newLogin.enableBlog;
@@ -1062,50 +1146,60 @@ angular.module('zmApp.controllers')
//-------------------------------------------------------
// returns API version or none
//-------------------------------------------------------
- getAPIversion: function() {
+ getAPIversion: function()
+ {
debug("getAPIversion called");
var d = $q.defer();
var apiurl = loginData.apiurl + '/host/getVersion.json';
$http.get(apiurl)
- .then(function(success) {
- if (success.data.version) {
+ .then(function(success)
+ {
+ if (success.data.version)
+ {
d.resolve(success.data.version);
- } else {
+ }
+ else
+ {
d.resolve("0.0.0");
}
return (d.promise);
},
- function(error) {
+ function(error)
+ {
debug("getAPIversion error handler " + JSON.stringify(error));
d.reject("-1.-1.-1");
return (d.promise);
});
return (d.promise);
-
},
- displayBanner: function(mytype, mytext, myinterval, mytimer) {
+ displayBanner: function(mytype, mytext, myinterval, mytimer)
+ {
displayBanner(mytype, mytext, myinterval, mytimer);
},
- isReCaptcha: function() {
+ isReCaptcha: function()
+ {
var d = $q.defer();
var myurl = loginData.url;
log("Checking if reCaptcha is enabled in ZM...");
$http.get(myurl)
- .then(function(success) {
- if (success.data.search("g-recaptcha") != -1) {
+ .then(function(success)
+ {
+ if (success.data.search("g-recaptcha") != -1)
+ {
// recaptcha enable. zmNinja won't work
log("ZM has recaptcha enabled", "error");
displayBanner('error', ['Recaptcha must be disabled in Zoneminder', $rootScope.appName + ' will not work with recaptcha'], "", 8000);
d.resolve(true);
return (d.promise);
-
- } else {
+ }
+ else
+ {
d.resolve(false);
log("ZM has recaptcha disabled - good");
return (d.promise);
@@ -1121,10 +1215,12 @@ angular.module('zmApp.controllers')
// need a mid as restricted users won't be able to get
// auth with just &watch
- getAuthKey: function(mid, ck) {
+ getAuthKey: function(mid, ck)
+ {
var d = $q.defer();
- if (!mid) {
+ if (!mid)
+ {
log("Deferring auth key, as monitorId unknown");
d.resolve("");
return (d.promise);
@@ -1135,20 +1231,27 @@ angular.module('zmApp.controllers')
var myurl = loginData.url + "/index.php?view=watch&mid=" + mid + "&connkey=" + ck;
debug("DataModel: Getting auth from " + myurl + " with mid=" + mid);
$http.get(myurl)
- .then(function(success) {
+ .then(function(success)
+ {
// console.log ("**** RESULT IS " + JSON.stringify(success));
// Look for auth=
var auth = success.data.match("auth=(.*?)&");
- if (auth && (auth[1] != null)) {
+ if (auth && (auth[1] != null))
+ {
log("DataModel: Extracted a stream authentication key of: " + auth[1]);
d.resolve("&auth=" + auth[1]);
- } else {
+ }
+ else
+ {
log("DataModel: Did not find a stream auth key, looking for user=");
auth = success.data.match("user=(.*?)&");
- if (auth && (auth[1] != null)) {
+ if (auth && (auth[1] != null))
+ {
log("DataModel: Found simple stream auth mode (user=)");
d.resolve("&user=" + loginData.username + "&pass=" + loginData.password);
- } else {
+ }
+ else
+ {
log("Data Model: Did not find any stream mode of auth");
d.resolve("");
}
@@ -1156,7 +1259,8 @@ angular.module('zmApp.controllers')
}
},
- function(error) {
+ function(error)
+ {
log("DataModel: Error resolving auth key " + JSON.stringify(error));
d.resolve("");
return (d.promise);
@@ -1169,23 +1273,27 @@ angular.module('zmApp.controllers')
// This function returns the numdigits for padding capture images
//-----------------------------------------------------------------------------
- getKeyConfigParams: function(forceReload) {
+ getKeyConfigParams: function(forceReload)
+ {
var d = $q.defer();
- if (forceReload == 1 || configParams.ZM_EVENT_IMAGE_DIGITS == '-1') {
+ if (forceReload == 1 || configParams.ZM_EVENT_IMAGE_DIGITS == '-1')
+ {
var apiurl = loginData.apiurl;
var myurl = apiurl + '/configs/viewByName/ZM_EVENT_IMAGE_DIGITS.json';
debug("Config URL for digits is:" + myurl);
$http.get(myurl)
- .success(function(data) {
+ .success(function(data)
+ {
log("ZM_EVENT_IMAGE_DIGITS is " + data.config.Value);
configParams.ZM_EVENT_IMAGE_DIGITS = data.config.Value;
d.resolve(configParams.ZM_EVENT_IMAGE_DIGITS);
return (d.promise);
})
- .error(function(err) {
+ .error(function(err)
+ {
log("Error retrieving ZM_EVENT_IMAGE_DIGITS" + JSON.stringify(err), "error");
log("Taking a guess, setting ZM_EVENT_IMAGE_DIGITS to 5");
// FIXME: take a plunge and keep it at 5?
@@ -1193,7 +1301,9 @@ angular.module('zmApp.controllers')
d.resolve(configParams.ZM_EVENT_IMAGE_DIGITS);
return (d.promise);
});
- } else {
+ }
+ else
+ {
log("ZM_EVENT_IMAGE_DIGITS is already configured for " +
configParams.ZM_EVENT_IMAGE_DIGITS);
d.resolve(configParams.ZM_EVENT_IMAGE_DIGITS);
@@ -1206,34 +1316,36 @@ angular.module('zmApp.controllers')
// Useful to know what ZMS is using as its cgi-bin. If people misconfigure
// the setting in the app, they can check their logs
//--------------------------------------------------------------------------
- getPathZms: function() {
+ getPathZms: function()
+ {
var d = $q.defer();
var apiurl = loginData.apiurl;
var myurl = apiurl + '/configs/viewByName/ZM_PATH_ZMS.json';
debug("Config URL for ZMS PATH is:" + myurl);
$http.get(myurl)
- .success(function(data) {
+ .success(function(data)
+ {
configParams.ZM_PATH_ZMS = data.config.Value;
d.resolve(configParams.ZM_PATH_ZMS);
return (d.promise);
})
- .error(function(error) {
+ .error(function(error)
+ {
log("Error retrieving ZM_PATH_ZMS: " + JSON.stringify(error));
d.reject("");
return (d.promise);
});
return (d.promise);
-
},
//--------------------------------------------------------------------------
// returns high or low BW mode
//--------------------------------------------------------------------------
- getBandwidth: function() {
+ getBandwidth: function()
+ {
return getBandwidth();
},
-
//-----------------------------------------------------------------------------
// This function returns a list of monitors
// if forceReload == 1 then it will force an HTTP API request to get a list of monitors
@@ -1243,12 +1355,12 @@ angular.module('zmApp.controllers')
// I've wrapped this function in my own promise even though http returns a promise.
//-----------------------------------------------------------------------------
- getMonitors: function(forceReload) {
+ getMonitors: function(forceReload)
+ {
//console.log("** Inside ZMData getMonitors with forceReload=" + forceReload);
-
-
- $ionicLoading.show({
+ $ionicLoading.show(
+ {
template: $translate.instant('kLoadingMonitors'),
animation: 'fade-in',
showBackdrop: true,
@@ -1257,9 +1369,6 @@ angular.module('zmApp.controllers')
showDelay: 0
});
-
-
-
var d = $q.defer();
if ((monitorsLoaded == 0) || (forceReload == 1)) // monitors are empty or force reload
{
@@ -1269,10 +1378,12 @@ angular.module('zmApp.controllers')
var myurl = apiurl + "/monitors.json";
//console.log ("API:"+myurl);
$http.get(myurl /*,{timeout:15000}*/ )
- .success(function(data) {
+ .success(function(data)
+ {
//console.log("HTTP success got " + JSON.stringify(data.monitors));
monitors = data.monitors;
- monitors.sort(function(a, b) {
+ monitors.sort(function(a, b)
+ {
return parseInt(a.Monitor.Sequence) - parseInt(b.Monitor.Sequence);
});
//console.log("promise resolved inside HTTP success");
@@ -1280,17 +1391,17 @@ angular.module('zmApp.controllers')
reloadMonitorDisplayStatus();
-
-
debug("Now trying to get multi-server data, if present");
$http.get(apiurl + "/servers.json")
- .success(function(data) {
+ .success(function(data)
+ {
// We found a server list API, so lets make sure
// we get the hostname as it will be needed for playback
log("multi server list loaded" + JSON.stringify(data));
multiservers = data.servers;
- for (var i = 0; i < monitors.length; i++) {
+ for (var i = 0; i < monitors.length; i++)
+ {
// make them all show for now
monitors[i].Monitor.listDisplay = 'show';
@@ -1298,16 +1409,19 @@ angular.module('zmApp.controllers')
monitors[i].Monitor.connKey = (Math.floor((Math.random() * 999999) + 1)).toString();
var serverFound = false;
- for (var j = 0; j < multiservers.length; j++) {
+ for (var j = 0; j < multiservers.length; j++)
+ {
//console.log ("Comparing " + multiservers[j].Server.Id + " AND " + monitors[i].Monitor.ServerId);
- if (multiservers[j].Server.Id == monitors[i].Monitor.ServerId) {
+ if (multiservers[j].Server.Id == monitors[i].Monitor.ServerId)
+ {
//console.log ("Found match");
serverFound = true;
break;
}
}
- if (serverFound) {
+ if (serverFound)
+ {
debug("Monitor " + monitors[i].Monitor.Id + " has a recording server hostname of " + multiservers[j].Server.Hostname);
@@ -1325,17 +1439,17 @@ angular.module('zmApp.controllers')
st += (s.scheme ? s.scheme : p.scheme) + "://"; // server scheme overrides
-
// if server doesn't have a protocol, what we want is in path
- if (!s.host) {
+ if (!s.host)
+ {
s.host = s.path;
s.path = undefined;
}
st += s.host;
-
- if (p.port || s.port) {
+ if (p.port || s.port)
+ {
st += (s.port ? ":" + s.port : ":" + p.port);
}
@@ -1355,8 +1469,9 @@ angular.module('zmApp.controllers')
//debug ("Streaming URL for Monitor " + monitors[i].Monitor.Id + " is " + monitors[i].Monitor.streamingURL );
//debug ("Base URL for Monitor " + monitors[i].Monitor.Id + " is " + monitors[i].Monitor.baseURL );
-
- } else {
+ }
+ else
+ {
//monitors[i].Monitor.listDisplay = 'show';
monitors[i].Monitor.isAlarmed = false;
monitors[i].Monitor.connKey = (Math.floor((Math.random() * 999999) + 1)).toString();
@@ -1364,9 +1479,9 @@ angular.module('zmApp.controllers')
monitors[i].Monitor.baseURL = loginData.url;
monitors[i].Monitor.imageMode = (versionCompare($rootScope.apiVersion, "1.30") == -1) ? "path" : "fid";
-
// but now check if forced path
- if (loginData.forceImageModePath) {
+ if (loginData.forceImageModePath)
+ {
debug("Overriding, setting image mode to true as you have requested force enable");
monitors[i].Monitor.imageMode = 'path';
}
@@ -1378,11 +1493,13 @@ angular.module('zmApp.controllers')
reloadMonitorDisplayStatus();
d.resolve(monitors);
})
- .error(function(err) {
+ .error(function(err)
+ {
log("multi server list loading error");
multiservers = [];
- for (var i = 0; i < monitors.length; i++) {
+ for (var i = 0; i < monitors.length; i++)
+ {
//monitors[i].Monitor.listDisplay = 'show';
monitors[i].Monitor.isAlarmed = false;
monitors[i].Monitor.connKey = (Math.floor((Math.random() * 999999) + 1)).toString();
@@ -1391,9 +1508,6 @@ angular.module('zmApp.controllers')
monitors[i].Monitor.imageMode = (versionCompare($rootScope.apiVersion, "1.30") == -1) ? "path" : "fid";
debug("API " + $rootScope.apiVersion + ": Monitor " + monitors[i].Monitor.Id + " will use " + monitors[i].Monitor.imageMode + " for direct image access");
-
-
-
}
d.resolve(monitors);
@@ -1402,10 +1516,9 @@ angular.module('zmApp.controllers')
$ionicLoading.hide();
log("Monitor load was successful, loaded " + monitors.length + " monitors");
-
-
})
- .error(function(err) {
+ .error(function(err)
+ {
//console.log("HTTP Error " + err);
log("Monitor load failed " + JSON.stringify(err), "error");
// To keep it simple for now, I'm translating an error
@@ -1419,7 +1532,8 @@ angular.module('zmApp.controllers')
});
return d.promise;
- } else // monitors are loaded
+ }
+ else // monitors are loaded
{
//console.log("Returning pre-loaded list of " + monitors.length + " monitors");
log("Returning pre-loaded list of " + monitors.length + " monitors");
@@ -1434,48 +1548,61 @@ angular.module('zmApp.controllers')
//-----------------------------------------------------------------------------
//
//-----------------------------------------------------------------------------
- setMonitors: function(mon) {
+ setMonitors: function(mon)
+ {
//console.log("ZMData setMonitors called with " + mon.length + " monitors");
monitors = mon;
},
- processFastLogin: function() {
+ processFastLogin: function()
+ {
var d = $q.defer();
- if (1) {
+ if (1)
+ {
d.reject("not implemented");
return d.promise;
}
console.log("inside processFastLogin");
- if (!loginData.fastLogin) {
+ if (!loginData.fastLogin)
+ {
console.log("Fast login not set");
d.reject("fast login not enabled");
debug("fast login not enabled");
return d.promise;
- } else //fastlogin is on
+ }
+ else //fastlogin is on
{
localforage.getItem("lastLogin")
- .then(function(succ) {
+ .then(function(succ)
+ {
console.log("fast login DB found");
var dt = moment(succ);
- if (dt.isValid()) {
+ if (dt.isValid())
+ {
debug("Got last login as " + dt.toString());
- if (moment.duration(moment().diff(dt)).asHours() >= 2) {
+ if (moment.duration(moment().diff(dt)).asHours() >= 2)
+ {
d.reject("duration since last login >=2hrs, need to relogin");
return d.promise;
- } else {
+ }
+ else
+ {
d.resolve("fast login is valid, less then 2 hrs");
return d.promise;
}
- } else {
+ }
+ else
+ {
console.log("Invalid date found");
d.reject("last-login invalid");
return d.promise;
}
},
- function(e) {
+ function(e)
+ {
console.log("fastlogin DB not found");
d.reject("last-login not found, fastlogin rejected");
return d.promise;
@@ -1486,10 +1613,13 @@ angular.module('zmApp.controllers')
},
// returns if this mid is hidden or not
- isNotHidden: function(mid) {
+ isNotHidden: function(mid)
+ {
var notHidden = true;
- for (var i = 0; i < monitors.length; i++) {
- if (monitors[i].Monitor.Id == mid) {
+ for (var i = 0; i < monitors.length; i++)
+ {
+ if (monitors[i].Monitor.Id == mid)
+ {
notHidden = (monitors[i].Monitor.listDisplay == 'show') ? true : false;
break;
}
@@ -1499,12 +1629,14 @@ angular.module('zmApp.controllers')
},
- getLocalTimeZoneNow: function() {
+ getLocalTimeZoneNow: function()
+ {
return moment.tz.guess();
},
//returns TZ value immediately (sync)
- getTimeZoneNow: function() {
+ getTimeZoneNow: function()
+ {
// console.log ("getTimeZoneNow: " + tz ? tz : moment.tz.guess());
return tz ? tz : moment.tz.guess();
},
@@ -1512,19 +1644,23 @@ angular.module('zmApp.controllers')
// returns server timezone, failing which local timezone
// always resolves true
- isTzSupported: function() {
+ isTzSupported: function()
+ {
return isTzSupported;
},
- getTimeZone: function(isForce) {
+ getTimeZone: function(isForce)
+ {
var d = $q.defer();
- if (!tz || isForce) {
+ if (!tz || isForce)
+ {
log("First invocation of TimeZone, asking server");
var apiurl = loginData.apiurl + '/host/getTimeZone.json';
$http.get(apiurl)
- .then(function(success) {
+ .then(function(success)
+ {
tz = success.data.tz;
d.resolve(tz);
debug("Timezone API response is:" + success.data.tz);
@@ -1536,7 +1672,8 @@ angular.module('zmApp.controllers')
return (d.promise);
},
- function(error) {
+ function(error)
+ {
tz = moment.tz.guess();
debug("Timezone API error handler, guessing local:" + tz);
d.resolve(tz);
@@ -1544,7 +1681,9 @@ angular.module('zmApp.controllers')
return (d.promise);
});
- } else {
+ }
+ else
+ {
d.resolve(tz);
return d.promise;
}
@@ -1560,7 +1699,8 @@ angular.module('zmApp.controllers')
// All this effort because the ZM APIs return events in sorted order, oldest first. Yeesh.
//-----------------------------------------------------------------------------
- getEventsPages: function(monitorId, startTime, endTime) {
+ getEventsPages: function(monitorId, startTime, endTime)
+ {
//console.log("********** INSIDE EVENTS PAGES ");
var apiurl = loginData.apiurl;
@@ -1574,11 +1714,11 @@ angular.module('zmApp.controllers')
myurl = myurl + "/AlarmFrames >=:" + (loginData.enableAlarmCount ? loginData.minAlarmCount : 0);
-
myurl = myurl + ".json";
//console.log (">>>>>Constructed URL " + myurl);
- $ionicLoading.show({
+ $ionicLoading.show(
+ {
template: $translate.instant('kCalcEventSize') + '...',
animation: 'fade-in',
showBackdrop: true,
@@ -1587,18 +1727,19 @@ angular.module('zmApp.controllers')
showDelay: 0
});
-
//var myurl = (monitorId == 0) ? apiurl + "/events.json?page=1" : apiurl + "/events/index/MonitorId:" + monitorId + ".json?page=1";
var d = $q.defer();
$http.get(myurl)
- .success(function(data) {
+ .success(function(data)
+ {
$ionicLoading.hide();
//console.log ("**** EVENTS PAGES I GOT "+JSON.stringify(data));
//console.log("**** PAGE COUNT IS " + data.pagination.pageCount);
d.resolve(data.pagination);
return d.promise;
})
- .error(function(error) {
+ .error(function(error)
+ {
$ionicLoading.hide();
// console.log("*** ERROR GETTING TOTAL PAGES ***");
log("Error retrieving page count of events " + JSON.stringify(error), "error");
@@ -1618,17 +1759,21 @@ angular.module('zmApp.controllers')
// monitorId == 0 means all monitors (ZM starts from 1)
//-----------------------------------------------------------------------------
- getEvents: function(monitorId, pageId, loadingStr, startTime, endTime) {
+ getEvents: function(monitorId, pageId, loadingStr, startTime, endTime)
+ {
//console.log("ZMData getEvents called with ID=" + monitorId + "and Page=" + pageId);
- if (!loadingStr) {
+ if (!loadingStr)
+ {
loadingStr = "loading events...";
}
//if (loadingStr) loa
- if (loadingStr != 'none') {
- $ionicLoading.show({
+ if (loadingStr != 'none')
+ {
+ $ionicLoading.show(
+ {
template: loadingStr,
animation: 'fade-in',
showBackdrop: true,
@@ -1653,10 +1798,12 @@ angular.module('zmApp.controllers')
myurl = myurl + "/AlarmFrames >=:" + (loginData.enableAlarmCount ? loginData.minAlarmCount : 0);
myurl = myurl + ".json";
-
- if (pageId) {
+ if (pageId)
+ {
myurl = myurl + "?page=" + pageId;
- } else {
+ }
+ else
+ {
//console.log("**** PAGE WAS " + pageId);
}
@@ -1666,15 +1813,14 @@ angular.module('zmApp.controllers')
//console.log (">>>>>Constructed URL " + myurl);
-
-
-
$http.get(myurl /*,{timeout:15000}*/ )
- .success(function(data) {
+ .success(function(data)
+ {
if (loadingStr != 'none') $ionicLoading.hide();
//myevents = data.events;
myevents = data.events.reverse();
- if (monitorId == 0) {
+ if (monitorId == 0)
+ {
oldevents = myevents;
}
//console.log (JSON.stringify(data));
@@ -1683,7 +1829,8 @@ angular.module('zmApp.controllers')
return d.promise;
})
- .error(function(err) {
+ .error(function(err)
+ {
if (loadingStr != 'none') $ionicLoading.hide();
displayBanner('error', ['error retrieving event list', 'please try again']);
//console.log("HTTP Events error " + err);
@@ -1696,7 +1843,8 @@ angular.module('zmApp.controllers')
d.reject(myevents);
// FIXME: Check what pagination does to this logic
- if (monitorId == 0) {
+ if (monitorId == 0)
+ {
oldevents = [];
}
return d.promise;
@@ -1707,26 +1855,28 @@ angular.module('zmApp.controllers')
//-----------------------------------------------------------------------------
//
//-----------------------------------------------------------------------------
- getMontageSize: function() {
+ getMontageSize: function()
+ {
return loginData.montageSize;
},
//-----------------------------------------------------------------------------
//
//-----------------------------------------------------------------------------
- setMontageSize: function(montage) {
+ setMontageSize: function(montage)
+ {
loginData.montageSize = montage;
},
-
-
//-----------------------------------------------------------------------------
//
//-----------------------------------------------------------------------------
- getMonitorsLoaded: function() {
+ getMonitorsLoaded: function()
+ {
// console.log("**** Inside promise function ");
var deferred = $q.defer();
- if (monitorsLoaded != 0) {
+ if (monitorsLoaded != 0)
+ {
deferred.resolve(monitorsLoaded);
}
@@ -1736,7 +1886,8 @@ angular.module('zmApp.controllers')
//-----------------------------------------------------------------------------
//
//-----------------------------------------------------------------------------
- setMonitorsLoaded: function(loaded) {
+ setMonitorsLoaded: function(loaded)
+ {
// console.log("ZMData.setMonitorsLoaded=" + loaded);
monitorsLoaded = loaded;
},
@@ -1745,38 +1896,45 @@ angular.module('zmApp.controllers')
// returns the next monitor ID in the list
// used for swipe next
//-----------------------------------------------------------------------------
- getNextMonitor: function(monitorId, direction) {
+ getNextMonitor: function(monitorId, direction)
+ {
var id = parseInt(monitorId);
var foundIndex = -1;
- for (var i = 0; i < monitors.length; i++) {
- if (parseInt(monitors[i].Monitor.Id) == id) {
+ for (var i = 0; i < monitors.length; i++)
+ {
+ if (parseInt(monitors[i].Monitor.Id) == id)
+ {
foundIndex = i;
break;
}
}
- if (foundIndex != -1) {
+ if (foundIndex != -1)
+ {
foundIndex = foundIndex + direction;
// wrap around if needed
if (foundIndex < 0) foundIndex = monitors.length - 1;
if (foundIndex >= monitors.length) foundIndex = 0;
return (monitors[foundIndex].Monitor.Id);
- } else {
+ }
+ else
+ {
log("getNextMonitor could not find monitor " + monitorId);
return (monitorId);
}
-
},
-
//-----------------------------------------------------------------------------
// Given a monitor Id it returns the monitor name
// FIXME: Can I do a better job with associative arrays?
//-----------------------------------------------------------------------------
- getMonitorName: function(id) {
+ getMonitorName: function(id)
+ {
var idnum = parseInt(id);
- for (var i = 0; i < monitors.length; i++) {
- if (parseInt(monitors[i].Monitor.Id) == idnum) {
+ for (var i = 0; i < monitors.length; i++)
+ {
+ if (parseInt(monitors[i].Monitor.Id) == idnum)
+ {
// console.log ("Matched, exiting getMonitorname");
return monitors[i].Monitor.Name;
}
@@ -1785,10 +1943,13 @@ angular.module('zmApp.controllers')
return "(Unknown)";
},
- getMonitorObject: function(id) {
+ getMonitorObject: function(id)
+ {
var idnum = parseInt(id);
- for (var i = 0; i < monitors.length; i++) {
- if (parseInt(monitors[i].Monitor.Id) == idnum) {
+ for (var i = 0; i < monitors.length; i++)
+ {
+ if (parseInt(monitors[i].Monitor.Id) == idnum)
+ {
// console.log ("Matched, exiting getMonitorname");
return monitors[i];
}
@@ -1797,10 +1958,13 @@ angular.module('zmApp.controllers')
return "(Unknown)";
},
- getImageMode: function(id) {
+ getImageMode: function(id)
+ {
var idnum = parseInt(id);
- for (var i = 0; i < monitors.length; i++) {
- if (parseInt(monitors[i].Monitor.Id) == idnum) {
+ for (var i = 0; i < monitors.length; i++)
+ {
+ if (parseInt(monitors[i].Monitor.Id) == idnum)
+ {
// console.log ("Matched, exiting getMonitorname");
return monitors[i].Monitor.imageMode;
}
@@ -1809,10 +1973,13 @@ angular.module('zmApp.controllers')
return "(Unknown)";
},
- getStreamingURL: function(id) {
+ getStreamingURL: function(id)
+ {
var idnum = parseInt(id);
- for (var i = 0; i < monitors.length; i++) {
- if (parseInt(monitors[i].Monitor.Id) == idnum) {
+ for (var i = 0; i < monitors.length; i++)
+ {
+ if (parseInt(monitors[i].Monitor.Id) == idnum)
+ {
// console.log ("Matched, exiting getMonitorname");
return monitors[i].Monitor.streamingURL;
}
@@ -1821,10 +1988,13 @@ angular.module('zmApp.controllers')
return "(Unknown)";
},
- getBaseURL: function(id) {
+ getBaseURL: function(id)
+ {
var idnum = parseInt(id);
- for (var i = 0; i < monitors.length; i++) {
- if (parseInt(monitors[i].Monitor.Id) == idnum) {
+ for (var i = 0; i < monitors.length; i++)
+ {
+ if (parseInt(monitors[i].Monitor.Id) == idnum)
+ {
// console.log ("Matched, exiting getMonitorname");
return monitors[i].Monitor.baseURL;
}
@@ -1833,7 +2003,6 @@ angular.module('zmApp.controllers')
return "(Unknown)";
},
-
};
}
]);
diff --git a/www/js/DevOptionsCtrl.js b/www/js/DevOptionsCtrl.js
index 984b59cc..d0b36299 100644
--- a/www/js/DevOptionsCtrl.js
+++ b/www/js/DevOptionsCtrl.js
@@ -2,10 +2,11 @@
/* jslint browser: true*/
/* global cordova,StatusBar,angular,console */
-angular.module('zmApp.controllers').controller('zmApp.DevOptionsCtrl', ['$scope', '$rootScope', '$ionicModal', 'zm', 'NVRDataModel', '$ionicSideMenuDelegate', '$ionicPopup', '$http', '$q', '$ionicLoading', '$ionicHistory', '$state', 'SecuredPopups', '$translate', function ($scope, $rootScope, $ionicModal, zm, NVRDataModel, $ionicSideMenuDelegate, $ionicPopup, $http, $q, $ionicLoading, $ionicHistory, $state, SecuredPopups, $translate) {
+angular.module('zmApp.controllers').controller('zmApp.DevOptionsCtrl', ['$scope', '$rootScope', '$ionicModal', 'zm', 'NVRDataModel', '$ionicSideMenuDelegate', '$ionicPopup', '$http', '$q', '$ionicLoading', '$ionicHistory', '$state', 'SecuredPopups', '$translate', function($scope, $rootScope, $ionicModal, zm, NVRDataModel, $ionicSideMenuDelegate, $ionicPopup, $http, $q, $ionicLoading, $ionicHistory, $state, SecuredPopups, $translate)
+{
-
- $scope.openMenu = function () {
+ $scope.openMenu = function()
+ {
$ionicSideMenuDelegate.toggleLeft();
// $scope.this.will.crash = 1;
@@ -14,32 +15,36 @@ angular.module('zmApp.controllers').controller('zmApp.DevOptionsCtrl', ['$scope'
//----------------------------------------------------------------
// Alarm notification handling
//----------------------------------------------------------------
- $scope.handleAlarms = function () {
+ $scope.handleAlarms = function()
+ {
$rootScope.isAlarm = !$rootScope.isAlarm;
- if (!$rootScope.isAlarm) {
+ if (!$rootScope.isAlarm)
+ {
$rootScope.alarmCount = "0";
- $ionicHistory.nextViewOptions({
+ $ionicHistory.nextViewOptions(
+ {
disableBack: true
});
- $state.go("events", {
+ $state.go("events",
+ {
"id": 0,
- "playEvent":false
- }, {
+ "playEvent": false
+ },
+ {
reload: true
});
return;
}
};
-
//----------------------------------------------------------------
// Save anyway when you exit
//----------------------------------------------------------------
- $scope.$on('$ionicView.beforeLeave', function () {
+ $scope.$on('$ionicView.beforeLeave', function()
+ {
saveDevOptions();
-
});
//-------------------------------------------------------------------------
@@ -49,18 +54,19 @@ angular.module('zmApp.controllers').controller('zmApp.DevOptionsCtrl', ['$scope'
// reset power state on exit as if it is called after we enter another
// state, that effectively overwrites current view power management needs
//------------------------------------------------------------------------
- $scope.$on('$ionicView.enter', function () {
+ $scope.$on('$ionicView.enter', function()
+ {
//console.log("**VIEW ** DevOptions Ctrl Entered");
$scope.loginData = NVRDataModel.getLogin();
NVRDataModel.setAwake(false);
});
-
+
$scope.isTzSupported = function()
{
return NVRDataModel.isTzSupported();
};
-
+
$scope.getTimeZoneNow = function()
{
return NVRDataModel.getTimeZoneNow();
@@ -70,53 +76,56 @@ angular.module('zmApp.controllers').controller('zmApp.DevOptionsCtrl', ['$scope'
// Perform the login action when the user submits the login form
//------------------------------------------------------------------
- function saveDevOptions() {
+ function saveDevOptions()
+ {
NVRDataModel.debug("SaveDevOptions: called");
-
if (parseInt($scope.loginData.cycleMonitorsInterval) < zm.minCycleTime)
{
$scope.loginData.cycleMonitorsInterval = zm.minCycleTime.toString();
}
- if ((parseInt($scope.loginData.maxFPS) < 0) || (parseInt($scope.loginData.maxFPS) > zm.maxFPS)) {
+ if ((parseInt($scope.loginData.maxFPS) < 0) || (parseInt($scope.loginData.maxFPS) > zm.maxFPS))
+ {
$scope.loginData.maxFPS = zm.defaultFPS.toString();
}
- if (parseInt($scope.loginData.refreshSec) <= 0) {
+ if (parseInt($scope.loginData.refreshSec) <= 0)
+ {
NVRDataModel.debug("SaveDevOptions: refresh sec was too low at " +
$scope.loginData.refreshSec + " reset to 1");
$scope.loginData.refreshSec = 1;
}
-
if ((parseInt($scope.loginData.montageQuality) < zm.safeMontageLimit) ||
- (parseInt($scope.loginData.montageQuality) > 100)) {
+ (parseInt($scope.loginData.montageQuality) > 100))
+ {
$scope.loginData.montageQuality = 100;
}
-
if ((parseInt($scope.loginData.singleImageQuality) < zm.safeImageQuality) ||
- (parseInt($scope.loginData.singleImageQuality) > 100)) {
+ (parseInt($scope.loginData.singleImageQuality) > 100))
+ {
$scope.loginData.singleImageQuality = zm.safeImageQuality.toString();
}
-
NVRDataModel.debug("SaveDevOptions: Saving to disk");
NVRDataModel.setLogin($scope.loginData);
NVRDataModel.getMonitors(1);
-
}
- $scope.saveDevOptions = function () {
+ $scope.saveDevOptions = function()
+ {
saveDevOptions();
// $rootScope.zmPopup.close();
- $rootScope.zmPopup = SecuredPopups.show('alert', {
+ $rootScope.zmPopup = SecuredPopups.show('alert',
+ {
title: $translate.instant('kSettingsSaved'),
template: "{{'kExploreEnjoy' | translate }} {{$root.appName}}"
- }).then(function (res) {
+ }).then(function(res)
+ {
$ionicSideMenuDelegate.toggleLeft();
});
@@ -125,9 +134,4 @@ angular.module('zmApp.controllers').controller('zmApp.DevOptionsCtrl', ['$scope'
// controller main
//------------------------------------------------------------------
-
-
-
-
-
-}]); \ No newline at end of file
+}]);
diff --git a/www/js/EventCtrl.js b/www/js/EventCtrl.js
index c076ea4d..7f1c0af0 100644
--- a/www/js/EventCtrl.js
+++ b/www/js/EventCtrl.js
@@ -9,21 +9,24 @@
angular.module('zmApp.controllers')
// alarm frames filter
-.filter('selectFrames', function ($filter, $translate) {
+.filter('selectFrames', function($filter, $translate)
+{
// Create the return function and set the required parameter name to **input**
- return function (input, typeOfFrames) {
-
+ return function(input, typeOfFrames)
+ {
var out = [];
- angular.forEach(input, function (item) {
-
+ angular.forEach(input, function(item)
+ {
- if (typeOfFrames == $translate.instant('kShowTimeDiffFrames')) {
+ if (typeOfFrames == $translate.instant('kShowTimeDiffFrames'))
+ {
if (item.type == $translate.instant('kShowTimeDiffFrames'))
out.push(item);
- } else
+ }
+ else
out.push(item);
});
@@ -33,7 +36,8 @@ angular.module('zmApp.controllers')
})
-.controller('zmApp.EventCtrl', ['$scope', '$rootScope', 'zm', 'NVRDataModel', 'message', '$ionicSideMenuDelegate', '$timeout', '$interval', '$ionicModal', '$ionicLoading', '$http', '$state', '$stateParams', '$ionicHistory', '$ionicScrollDelegate', '$ionicPlatform', '$ionicSlideBoxDelegate', '$ionicPosition', '$ionicPopover', '$ionicPopup', 'EventServer', '$sce', '$cordovaBadge', '$cordovaLocalNotification', '$q', 'carouselUtils', '$translate', function ($scope, $rootScope, zm, NVRDataModel, message, $ionicSideMenuDelegate, $timeout, $interval, $ionicModal, $ionicLoading, $http, $state, $stateParams, $ionicHistory, $ionicScrollDelegate, $ionicPlatform, $ionicSlideBoxDelegate, $ionicPosition, $ionicPopover, $ionicPopup, EventServer, $sce, $cordovaBadge, $cordovaLocalNotification, $q, carouselUtils, $translate) {
+.controller('zmApp.EventCtrl', ['$scope', '$rootScope', 'zm', 'NVRDataModel', 'message', '$ionicSideMenuDelegate', '$timeout', '$interval', '$ionicModal', '$ionicLoading', '$http', '$state', '$stateParams', '$ionicHistory', '$ionicScrollDelegate', '$ionicPlatform', '$ionicSlideBoxDelegate', '$ionicPosition', '$ionicPopover', '$ionicPopup', 'EventServer', '$sce', '$cordovaBadge', '$cordovaLocalNotification', '$q', 'carouselUtils', '$translate', function($scope, $rootScope, zm, NVRDataModel, message, $ionicSideMenuDelegate, $timeout, $interval, $ionicModal, $ionicLoading, $http, $state, $stateParams, $ionicHistory, $ionicScrollDelegate, $ionicPlatform, $ionicSlideBoxDelegate, $ionicPosition, $ionicPopover, $ionicPopup, EventServer, $sce, $cordovaBadge, $cordovaLocalNotification, $q, carouselUtils, $translate)
+{
// events in last 5 minutes
// TODO https://server/zm/api/events/consoleEvents/5%20minute.json
@@ -56,32 +60,34 @@ angular.module('zmApp.controllers')
var mycarouselWatcher;
var nolangFrom;
var nolangTo;
-
+
$scope.typeOfFrames = $translate.instant('kShowTimeDiffFrames');
var eventsListScrubHeight = eventsListScrubHeight;
var eventsListDetailsHeight = eventsListDetailsHeight;
-
//---------------------------------------------------
// initial code
//---------------------------------------------------
//we come here is TZ is updated after the view loads
- $rootScope.$on('tz-updated', function() {
+ $rootScope.$on('tz-updated', function()
+ {
$scope.tzAbbr = NVRDataModel.getTimeZoneNow();
- NVRDataModel.debug ("Timezone API updated timezone to " + NVRDataModel.getTimeZoneNow());
+ NVRDataModel.debug("Timezone API updated timezone to " + NVRDataModel.getTimeZoneNow());
});
-
- $rootScope.$on("language-changed", function () {
+
+ $rootScope.$on("language-changed", function()
+ {
NVRDataModel.log(">>>>>>>>>>>>>>> language changed");
doRefresh();
});
- $scope.$on('$ionicView.afterEnter', function () {
+ $scope.$on('$ionicView.afterEnter', function()
+ {
//console.log ("********* AFTER ENTER");
-
+
// see if we come from monitors, if so, don't filter events
- if ($ionicHistory.backTitle() =='Monitors')
+ if ($ionicHistory.backTitle() == 'Monitors')
{
showHiddenMonitors = true;
}
@@ -89,8 +95,8 @@ angular.module('zmApp.controllers')
{
showHiddenMonitors = false;
}
- // console.log (">>>>>>>>>>>>>>>>>SHOWHIDDEN IS " + showHiddenMonitors);
-
+ // console.log (">>>>>>>>>>>>>>>>>SHOWHIDDEN IS " + showHiddenMonitors);
+
// lets get the abbreviated version of TZ to display
if (NVRDataModel.getLogin().useLocalTimeZone)
{
@@ -100,41 +106,38 @@ angular.module('zmApp.controllers')
{
$scope.tzAbbr = moment().tz(NVRDataModel.getTimeZoneNow()).zoneAbbr();
}
-
+
$scope.events = [];
getInitialEvents();
setupWatchers();
footerExpand();
});
-
-
- $scope.$on('$ionicView.beforeEnter', function () {
+ $scope.$on('$ionicView.beforeEnter', function()
+ {
-
//console.log ("********* BEFORE ENTER");
document.addEventListener("pause", onPause, false);
//console.log("I got STATE PARAM " + $stateParams.id);
$scope.id = parseInt($stateParams.id, 10);
$scope.showEvent = $stateParams.playEvent || false;
-
- console.log (">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
-
-
- NVRDataModel.log ("EventCtrl called with: EID=" + $scope.id + " playEvent = "+$scope.showEvent);
-
+
+ console.log(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
+
+ NVRDataModel.log("EventCtrl called with: EID=" + $scope.id + " playEvent = " + $scope.showEvent);
+
// This is the only view that hardcodes row size due to
// collection repeat, so lets re-get the text size if it has changed
// note that there may be a delay as its a callback - so might involve
// a UI jiggle
-
+
if (window.cordova)
MobileAccessibility.getTextZoom(getTextZoomCallback);
-
+
eventsListDetailsHeight = parseInt(zm.eventsListDetailsHeight * $rootScope.textScaleFactor);
eventsListScrubHeight = parseInt(zm.eventsListScrubHeight * $rootScope.textScaleFactor);
-
- NVRDataModel.debug (">>>height of list/scrub set to " + eventsListDetailsHeight + " and " + eventsListScrubHeight);
+
+ NVRDataModel.debug(">>>height of list/scrub set to " + eventsListDetailsHeight + " and " + eventsListScrubHeight);
pageLoaded = false;
enableLoadMore = true;
@@ -153,7 +156,6 @@ angular.module('zmApp.controllers')
$scope.weeks = [];
$scope.months = [];
-
$scope.eventList = {
showDelete: false
};
@@ -167,13 +169,13 @@ angular.module('zmApp.controllers')
$scope.FrameArray = []; // will hold frame info from detailed Events API
loginData = NVRDataModel.getLogin();
NVRDataModel.getKeyConfigParams(0)
- .then(function (data) {
+ .then(function(data)
+ {
//console.log ("***GETKEY: " + JSON.stringify(data));
eventImageDigits = parseInt(data);
NVRDataModel.log("Image padding digits reported as " + eventImageDigits);
});
-
$scope.showSearch = false;
eventsPage = 1;
moreEvents = true;
@@ -191,18 +193,14 @@ angular.module('zmApp.controllers')
});
-
-
function getEventObject(eid)
{
-
- var apiurl = NVRDataModel.getLogin().apiurl + '/events/'+eid+'.json';
-
- $http.get (apiurl)
- .success (function (data) {
- })
- .error (function (err) {
- });
+
+ var apiurl = NVRDataModel.getLogin().apiurl + '/events/' + eid + '.json';
+
+ $http.get(apiurl)
+ .success(function(data) {})
+ .error(function(err) {});
/*
myevents[i].Event.humanizeTime = humanizeTime(myevents[i].Event.StartTime);
myevents[i].Event.MonitorName = NVRDataModel.getMonitorName(myevents[i].Event.MonitorId);
@@ -220,35 +218,38 @@ angular.module('zmApp.controllers')
myevents[i].Event.relativePath = computeRelativePath(myevents[i]);
*/
}
-
function getTextZoomCallback(tz)
{
- $rootScope.textScaleFactor = parseFloat(tz+"%") / 100.0;
- NVRDataModel.debug ("text zoom factor is " + $rootScope.textScaleFactor);
+ $rootScope.textScaleFactor = parseFloat(tz + "%") / 100.0;
+ NVRDataModel.debug("text zoom factor is " + $rootScope.textScaleFactor);
}
-
-
-
// --------------------------------------------------------
// Handling of back button in case modal is open should
// close the modal
// --------------------------------------------------------
- $ionicPlatform.registerBackButtonAction(function (e) {
+ $ionicPlatform.registerBackButtonAction(function(e)
+ {
e.preventDefault();
- if ($scope.modal != undefined && $scope.modal.isShown()) {
+ if ($scope.modal != undefined && $scope.modal.isShown())
+ {
// switch off awake, as liveview is finished
NVRDataModel.debug("Modal is open, closing it");
NVRDataModel.setAwake(false);
$scope.modal.remove();
- } else {
+ }
+ else
+ {
NVRDataModel.debug("Modal is closed, so toggling or exiting");
- if (!$ionicSideMenuDelegate.isOpenLeft()) {
+ if (!$ionicSideMenuDelegate.isOpenLeft())
+ {
$ionicSideMenuDelegate.toggleLeft();
- } else {
+ }
+ else
+ {
navigator.app.exitApp();
}
@@ -256,30 +257,30 @@ angular.module('zmApp.controllers')
}, 1000);
-
//--------------------------------------
// monitor the slider for carousels
//--------------------------------------
- function setupWatchers() {
+ function setupWatchers()
+ {
NVRDataModel.debug("Setting up carousel watchers");
- ionRangeWatcher = $scope.$watch('ionRange.index', function () {
+ ionRangeWatcher = $scope.$watch('ionRange.index', function()
+ {
// console.log ("Watching index");
$scope.mycarousel.index = parseInt($scope.ionRange.index) - 1;
if (carouselUtils.getStop() == true)
return;
-
//console.log ("***ION RANGE CHANGED TO " + $scope.mycarousel.index);
});
+ mycarouselWatcher = $scope.$watch('mycarousel.index', function()
+ {
-
- mycarouselWatcher = $scope.$watch('mycarousel.index', function () {
-
-
- if ($scope.event && $scope.ionRange.index == parseInt($scope.event.Event.Frames) - 1) {
- if (!$scope.modal || $scope.modal.isShown() == false) {
+ if ($scope.event && $scope.ionRange.index == parseInt($scope.event.Event.Frames) - 1)
+ {
+ if (!$scope.modal || $scope.modal.isShown() == false)
+ {
// console.log("quick scrub playback over");
carouselUtils.setStop(true);
$scope.ionRange.index = 0;
@@ -292,10 +293,8 @@ angular.module('zmApp.controllers')
$scope.ionRange.index = ($scope.mycarousel.index + 1).toString();
// console.log ("***IONRANGE RANGE CHANGED TO " + $scope.ionRange.index);
-
});
-
}
// --------------------------------------------------------
@@ -303,30 +302,32 @@ angular.module('zmApp.controllers')
// close the modal
// --------------------------------------------------------
- function getInitialEvents() {
+ function getInitialEvents()
+ {
NVRDataModel.debug("getInitialEvents called");
var lData = NVRDataModel.getLogin();
-
-
// If you came from Monitors, disregard hidden monitors in montage
- /* if (lData.persistMontageOrder && stackState != "Monitors") {
- var tempMon = message;
- $scope.monitors = NVRDataModel.applyMontageMonitorPrefs(tempMon, 2)[0];
- } else*/
- $scope.monitors = message;
-
+ /* if (lData.persistMontageOrder && stackState != "Monitors") {
+ var tempMon = message;
+ $scope.monitors = NVRDataModel.applyMontageMonitorPrefs(tempMon, 2)[0];
+ } else*/
+ $scope.monitors = message;
- if ($scope.monitors.length == 0) {
+ if ($scope.monitors.length == 0)
+ {
var pTitle = $translate.instant('kNoMonitors');
- $ionicPopup.alert({
+ $ionicPopup.alert(
+ {
title: pTitle,
template: "{{'kCheckCredentials' | translate }}"
});
- $ionicHistory.nextViewOptions({
+ $ionicHistory.nextViewOptions(
+ {
disableBack: true
});
- $state.go("login", {
+ $state.go("login",
+ {
"wizard": false
});
return;
@@ -345,7 +346,8 @@ angular.module('zmApp.controllers')
if ($rootScope.toString)
nolangTo = moment($rootScope.toString).locale('en').format("YYYY-MM-DD HH:mm:ss");
NVRDataModel.getEventsPages($scope.id, nolangFrom, nolangTo)
- .then(function (data) {
+ .then(function(data)
+ {
eventsPage = data.pageCount || 1;
NVRDataModel.debug("EventCtrl: found " + eventsPage + " pages of events");
@@ -361,18 +363,23 @@ angular.module('zmApp.controllers')
nolangTo = moment($rootScope.toString).locale('en').format("YYYY-MM-DD HH:mm:ss");
NVRDataModel.getEvents($scope.id, eventsPage, "", nolangFrom, nolangTo)
- .then(function (data) {
+ .then(function(data)
+ {
var myevents = data;
NVRDataModel.debug("EventCtrl: success, got " + myevents.length + " events");
var loginData = NVRDataModel.getLogin();
- for (var i = 0; i < myevents.length; i++) {
+ for (var i = 0; i < myevents.length; i++)
+ {
var idfound = true;
- if (loginData.persistMontageOrder) {
+ if (loginData.persistMontageOrder)
+ {
idfound = false;
- for (var ii = 0; ii < $scope.monitors.length; ii++) {
- if ($scope.monitors[ii].Monitor.Id == myevents[i].Event.MonitorId && (NVRDataModel.isNotHidden(myevents[i].Event.MonitorId) || showHiddenMonitors)) {
+ for (var ii = 0; ii < $scope.monitors.length; ii++)
+ {
+ if ($scope.monitors[ii].Monitor.Id == myevents[i].Event.MonitorId && (NVRDataModel.isNotHidden(myevents[i].Event.MonitorId) || showHiddenMonitors))
+ {
idfound = true;
break;
@@ -380,7 +387,6 @@ angular.module('zmApp.controllers')
}
}
-
myevents[i].Event.humanizeTime = humanizeTime(myevents[i].Event.StartTime);
myevents[i].Event.streamingURL = NVRDataModel.getStreamingURL(myevents[i].Event.MonitorId);
myevents[i].Event.baseURL = NVRDataModel.getBaseURL(myevents[i].Event.MonitorId);
@@ -397,26 +403,28 @@ angular.module('zmApp.controllers')
myevents[i].Event.BasePath = computeBasePath(myevents[i]);
myevents[i].Event.relativePath = computeRelativePath(myevents[i]);
-
// in multiserver BasePath is login url for frames
// http://login.url/index.php?view=frame&eid=19696772&fid=21
// console.log ("COMPARING "+NVRDataModel.getLogin().url+ " TO " +myevents[i].Event.baseURL);
- if (NVRDataModel.getLogin().url != myevents[i].Event.baseURL) {
+ if (NVRDataModel.getLogin().url != myevents[i].Event.baseURL)
+ {
//NVRDataModel.debug ("Multi server, changing base");
myevents[i].Event.baseURL = NVRDataModel.getLogin().url;
}
- if (idfound) {
+ if (idfound)
+ {
$scope.events.push(myevents[i]);
- } else {
+ }
+ else
+ {
//console.log ("Skipping Event MID = " + myevents[i].Event.MonitorId);
}
} //for
-
//$scope.events = myevents;
// we only need to stop the template from loading when the list is empty
// so this can be false once we have _some_ content
@@ -425,7 +433,8 @@ angular.module('zmApp.controllers')
// to avoid only few events being displayed
// if last page has less events
//console.log("**Loading Next Page ***");
- if (myevents.length < 50) {
+ if (myevents.length < 50)
+ {
NVRDataModel.debug("EventCtrl:loading one more page just in case we don't have enough to display");
loadMore();
}
@@ -434,14 +443,14 @@ angular.module('zmApp.controllers')
});
}
-
-
//-------------------------------------------------------
// Tapping on a frame shows this image
//------------------------------------------------------
- function SaveSuccess() {
- $ionicLoading.show({
+ function SaveSuccess()
+ {
+ $ionicLoading.show(
+ {
template: $translate.instant('kDone'),
noBackdrop: true,
duration: 1000
@@ -449,8 +458,10 @@ angular.module('zmApp.controllers')
NVRDataModel.debug("ModalCtrl:Photo saved successfuly");
}
- function SaveError(e) {
- $ionicLoading.show({
+ function SaveError(e)
+ {
+ $ionicLoading.show(
+ {
template: $translate.instant('kErrorSave'),
noBackdrop: true,
duration: 2000
@@ -459,10 +470,11 @@ angular.module('zmApp.controllers')
//console.log("***ERROR");
}
+ function saveNow(imgsrc, r, f)
+ {
- function saveNow(imgsrc, r, f) {
-
- $ionicLoading.show({
+ $ionicLoading.show(
+ {
template: $translate.instant('kSavingSnapshot') + "...",
noBackdrop: true,
duration: zm.httpTimeout
@@ -471,7 +483,8 @@ angular.module('zmApp.controllers')
NVRDataModel.log("saveNow: File path to grab is " + url);
var img = new Image();
- img.onload = function () {
+ img.onload = function()
+ {
// console.log("********* ONLOAD");
var canvas = document.createElement('canvas');
canvas.width = img.width;
@@ -482,8 +495,10 @@ angular.module('zmApp.controllers')
var imageDataUrl = canvas.toDataURL('image/jpeg', 1.0);
var imageData = imageDataUrl.replace(/data:image\/jpeg;base64,/, '');
- if ($rootScope.platformOS != "desktop") {
- try {
+ if ($rootScope.platformOS != "desktop")
+ {
+ try
+ {
cordova.exec(
SaveSuccess,
@@ -492,37 +507,44 @@ angular.module('zmApp.controllers')
'saveImageDataToLibrary', [imageData]
);
// carouselUtils.setStop(curState);
- } catch (e) {
+ }
+ catch (e)
+ {
SaveError(e.message);
// carouselUtils.setStop(curState);
}
- } else {
-
+ }
+ else
+ {
var fname = r + f + ".png";
fname = fname.replace(/\//, "-");
fname = fname.replace(/\.jpg/, '');
- canvas.toBlob(function (blob) {
+ canvas.toBlob(function(blob)
+ {
saveAs(blob, fname);
SaveSuccess();
});
}
};
- try {
+ try
+ {
img.src = url;
// console.log ("SAVING IMAGE SOURCE");
- } catch (e) {
+ }
+ catch (e)
+ {
SaveError(e.message);
}
}
- $scope.showImage = function (p, r, f, fid, e, imode, id, parray, ndx) {
+ $scope.showImage = function(p, r, f, fid, e, imode, id, parray, ndx)
+ {
var img;
-
//console.log ("HERE");
$scope.kFrame = $translate.instant('kFrame');
$scope.kEvent = $translate.instant('kEvent');
@@ -534,42 +556,41 @@ angular.module('zmApp.controllers')
// at unique frames;
// NVRDataModel.debug("Hello");
- if ($scope.typeOfFrames == $translate.instant('kShowTimeDiffFrames')) {
+ if ($scope.typeOfFrames == $translate.instant('kShowTimeDiffFrames'))
+ {
var ic;
- for (ic = 0; ic < $scope.parray.length; ic++) {
+ for (ic = 0; ic < $scope.parray.length; ic++)
+ {
if ($scope.parray[ic].frameid == fid)
break;
}
-
NVRDataModel.debug("Readjusting selected frame ID from:" + $scope.ndx + " to actual frame ID of:" + ic);
$scope.ndx = ic;
- } else {
+ }
+ else
+ {
NVRDataModel.debug("No index adjustment necessary as we are using all frames");
}
-
-
-
// console.log ("Image Mode " + imode);
// console.log ("parray : " + JSON.stringify(parray));
// console.log ("index: " + ndx);
if ($scope.imode == 'path')
$scope.imgsrc = p + "/index.php?view=image&path=" + r + $scope.parray[$scope.ndx].fname;
- else {
+ else
+ {
$scope.imgsrc = p + "/index.php?view=image&fid=" + $scope.parray[$scope.ndx].id;
}
-
-
-
//$rootScope.zmPopup = $ionicPopup.alert({title: kFrame+':'+fid+'/'+kEvent+':'+e,template:img, cssClass:'popup80'});
- $rootScope.zmPopup = $ionicPopup.show({
+ $rootScope.zmPopup = $ionicPopup.show(
+ {
template: '<center>' + $translate.instant('kFrame') + ':{{parray[ndx].frameid}}@{{prettifyTimeSec(parray[ndx].time)}}</center><br/><img src="{{imgsrc}}" width="100%" />',
title: $translate.instant('kImages') + " (" + $translate.instant($scope.typeOfFrames) + ")",
subTitle: 'use left and right arrows to change',
@@ -580,7 +601,8 @@ angular.module('zmApp.controllers')
{
text: '',
type: 'button-assertive button-small ion-camera',
- onTap: function (e) {
+ onTap: function(e)
+ {
e.preventDefault();
saveNow($scope.imgsrc, r, parray[$scope.ndx].fname);
@@ -591,15 +613,18 @@ angular.module('zmApp.controllers')
// left 1
text: '',
type: 'button-small button-energized ion-chevron-left',
- onTap: function (e) {
+ onTap: function(e)
+ {
// look for next frame that matches the type of frame
// we are showing (all or diff timestamps);
// console.log ("TYPE OF FRAMES: " + $scope.typeOfFrames);
var nndx = null;
var alltype = $translate.instant('kShowAllFrames');
- for (var i = $scope.ndx - 1; i >= 0; i--) {
- if ($scope.parray[i].type == $scope.typeOfFrames || $scope.typeOfFrames == alltype) {
+ for (var i = $scope.ndx - 1; i >= 0; i--)
+ {
+ if ($scope.parray[i].type == $scope.typeOfFrames || $scope.typeOfFrames == alltype)
+ {
nndx = i;
break;
}
@@ -607,25 +632,26 @@ angular.module('zmApp.controllers')
if (nndx == null) nndx = $scope.ndx;
$scope.ndx = nndx;
- if ($scope.imode == 'path') {
+ if ($scope.imode == 'path')
+ {
$scope.imgsrc = p + "/index.php?view=image&path=" + r + $scope.parray[$scope.ndx].fname;
- } else {
+ }
+ else
+ {
$scope.imgsrc = p + "/index.php?view=image&fid=" + $scope.parray[$scope.ndx].id;
}
-
-
e.preventDefault();
-
}
},
{
// right 1
text: '',
type: 'button-small button-energized ion-chevron-right',
- onTap: function (e) {
+ onTap: function(e)
+ {
// look for next frame that matches the type of frame
// we are showing (all or diff timestamps);
@@ -633,9 +659,11 @@ angular.module('zmApp.controllers')
// console.log ("TYPE OF FRAMES: " + $scope.typeOfFrames);
var nndx = null;
var alltype = $translate.instant('kShowAllFrames');
- for (var i = $scope.ndx + 1; i < $scope.parray.length; i++) {
+ for (var i = $scope.ndx + 1; i < $scope.parray.length; i++)
+ {
//console.log ("Comparing: " +$scope.parray[i].type +" to " + $scope.typeOfFrames);
- if ($scope.parray[i].type == $scope.typeOfFrames || $scope.typeOfFrames == alltype) {
+ if ($scope.parray[i].type == $scope.typeOfFrames || $scope.typeOfFrames == alltype)
+ {
nndx = i;
break;
}
@@ -643,67 +671,63 @@ angular.module('zmApp.controllers')
if (nndx == null) nndx = $scope.ndx;
$scope.ndx = nndx;
- if ($scope.imode == 'path') {
+ if ($scope.imode == 'path')
+ {
$scope.imgsrc = p + "/index.php?view=image&path=" + r + $scope.parray[$scope.ndx].fname;
- } else {
+ }
+ else
+ {
$scope.imgsrc = p + "/index.php?view=image&fid=" + $scope.parray[$scope.ndx].id;
}
e.preventDefault();
-
}
},
-
-
{
text: '',
type: 'button-positive button-small ion-checkmark-round',
- onTap: function (e) {
-
+ onTap: function(e) {
}
- }]
+ }
+ ]
});
-
-
-
};
-
-
-
-
-
- $scope.toggleTypeOfAlarms = function () {
+ $scope.toggleTypeOfAlarms = function()
+ {
// "kShowAllFrames" : "all",
// "kShowTimeDiffFrames" : "different timestamps"
- if ($scope.typeOfFrames == $translate.instant('kShowAllFrames')) {
+ if ($scope.typeOfFrames == $translate.instant('kShowAllFrames'))
+ {
$scope.typeOfFrames = $translate.instant('kShowTimeDiffFrames');
- } else {
+ }
+ else
+ {
$scope.typeOfFrames = $translate.instant('kShowAllFrames');
}
};
-
// not explictly handling error --> I have a default "No events found" message
// displayed in the template if events list is null
//--------------------------------------------------------------------------
// This is what the pullup bar calls depending on what range is specified
//--------------------------------------------------------------------------
- $scope.showEvents = function (val, unit, monitorId) {
+ $scope.showEvents = function(val, unit, monitorId)
+ {
NVRDataModel.debug("ShowEvents called with val:" + val + " unit:" + unit + " for Monitor:" + monitorId);
- $ionicHistory.nextViewOptions({
+ $ionicHistory.nextViewOptions(
+ {
disableBack: true
});
-
// we have to convert from and to, to server time
var mToDate = moment().tz(NVRDataModel.getTimeZoneNow());
var mFromDate = moment().subtract(parseInt(val), unit).tz(NVRDataModel.getTimeZoneNow());
@@ -728,16 +752,17 @@ angular.module('zmApp.controllers')
.format("YYYY-MM-DD") + " " + mToDate
.format("HH:mm:ss");
-
// console.log("**************From String: " + $rootScope.fromString);
// console.log("**************To String: " + $rootScope.toString);
// reloading - may solve https://github.com/pliablepixels/zmNinja/issues/36
// if you are in the same mid event page $state.go won't work
- $state.go("events", {
+ $state.go("events",
+ {
"id": monitorId,
- "playEvent":false
- }, {
+ "playEvent": false
+ },
+ {
reload: true
});
};
@@ -745,17 +770,22 @@ angular.module('zmApp.controllers')
//----------------------------------------------------------------
// Alarm notification handling
//----------------------------------------------------------------
- $scope.handleAlarms = function () {
+ $scope.handleAlarms = function()
+ {
$rootScope.isAlarm = !$rootScope.isAlarm;
- if (!$rootScope.isAlarm) {
+ if (!$rootScope.isAlarm)
+ {
$rootScope.alarmCount = "0";
- $ionicHistory.nextViewOptions({
+ $ionicHistory.nextViewOptions(
+ {
disableBack: true
});
- $state.go("events", {
+ $state.go("events",
+ {
"id": 0,
- "playEvent":false
- }, {
+ "playEvent": false
+ },
+ {
reload: true
});
return;
@@ -765,7 +795,8 @@ angular.module('zmApp.controllers')
//--------------------------------------------------------------------------
// Takes care of deleting individual events
//--------------------------------------------------------------------------
- $scope.deleteEvent = function (id, itemid) {
+ $scope.deleteEvent = function(id, itemid)
+ {
//$scope.eventList.showDelete = false;
//curl -XDELETE http://server/zm/api/events/1.json
var loginData = NVRDataModel.getLogin();
@@ -773,14 +804,16 @@ angular.module('zmApp.controllers')
NVRDataModel.debug("DeleteEvent: ID=" + id + " item=" + itemid);
NVRDataModel.log("Delete event " + apiDelete);
- $ionicLoading.show({
+ $ionicLoading.show(
+ {
template: "{{'kDeletingEvent' | translate}}...",
noBackdrop: true,
duration: zm.httpTimeout
});
$http.delete(apiDelete)
- .success(function (data) {
+ .success(function(data)
+ {
$ionicLoading.hide();
NVRDataModel.debug("delete success: " + JSON.stringify(data));
NVRDataModel.displayBanner('info', [$translate.instant('kDeleteEventSuccess')], 2000, 2000);
@@ -789,30 +822,34 @@ angular.module('zmApp.controllers')
//doRefresh();
})
- .error(function (data) {
+ .error(function(data)
+ {
$ionicLoading.hide();
NVRDataModel.debug("delete error: " + JSON.stringify(data));
NVRDataModel.displayBanner('error', [$translate.instant('kDeleteEventError1'), $translate.instant('kDeleteEventError2')]);
});
-
};
//------------------------------------------------
// Tapping on the filter sign lets you reset it
//-------------------------------------------------
- $scope.filterTapped = function () {
+ $scope.filterTapped = function()
+ {
//console.log("FILTER TAPPED");
var myFrom = moment($rootScope.fromString).format("MMM/DD/YYYY " + NVRDataModel.getTimeFormat()).toString();
var toString = moment($rootScope.toString).format("MMM/DD/YYYY " + NVRDataModel.getTimeFormat()).toString();
- $rootScope.zmPopup = $ionicPopup.confirm({
+ $rootScope.zmPopup = $ionicPopup.confirm(
+ {
title: $translate.instant('kFilterSettings'),
template: $translate.instant('kFilterEventsBetween1') + ':<br/> <b>' + myFrom + "</b> " + $translate.instant('kTo') + " <b>" + toString + '</b><br/>' + $translate.instant('kFilterEventsBetween2')
});
- $rootScope.zmPopup.then(function (res) {
- if (res) {
+ $rootScope.zmPopup.then(function(res)
+ {
+ if (res)
+ {
NVRDataModel.log("Filter reset requested in popup");
$rootScope.isEventFilterOn = false;
$rootScope.fromDate = "";
@@ -821,15 +858,19 @@ angular.module('zmApp.controllers')
$rootScope.toTime = "";
$rootScope.fromString = "";
$rootScope.toString = "";
- $ionicHistory.nextViewOptions({
+ $ionicHistory.nextViewOptions(
+ {
disableBack: true
});
- $state.go("events", {
+ $state.go("events",
+ {
"id": 0,
- "playEvent":false
+ "playEvent": false
});
return;
- } else {
+ }
+ else
+ {
NVRDataModel.log("Filter reset cancelled in popup");
}
});
@@ -841,40 +882,44 @@ angular.module('zmApp.controllers')
// data for events ranges summaries using the consolveEvents facility of ZM
//--------------------------------------------------------------------------
- $scope.footerExpand = function () {
- footerExpand();
+ $scope.footerExpand = function()
+ {
+ footerExpand();
};
function footerExpand()
{
- //https://server/zm/api/events/consoleEvents/5%20minute.json
+ //https://server/zm/api/events/consoleEvents/5%20minute.json
var ld = NVRDataModel.getLogin();
- var af = "/AlarmFrames >=:" + (ld.enableAlarmCount ? ld.minAlarmCount : 0);
+ var af = "/AlarmFrames >=:" + (ld.enableAlarmCount ? ld.minAlarmCount : 0);
var apiurl = ld.apiurl + "/events/consoleEvents/1%20hour" + af + ".json";
NVRDataModel.debug("consoleEvents API:" + apiurl);
-
$http.get(apiurl)
- .success(function (data) {
+ .success(function(data)
+ {
NVRDataModel.debug(JSON.stringify(data));
$scope.hours = [];
var p = data.results;
- for (var key in data.results) {
-
-
+ for (var key in data.results)
+ {
- if (p.hasOwnProperty(key)) {
+ if (p.hasOwnProperty(key))
+ {
var idfound = true;
//console.log ("PERSIST IS " + ld.persistMontageOrder);
- if (ld.persistMontageOrder) {
+ if (ld.persistMontageOrder)
+ {
idfound = false;
- for (var ii = 0; ii < $scope.monitors.length; ii++) {
- if ($scope.monitors[ii].Monitor.Id == key && (NVRDataModel.isNotHidden(key) || showHiddenMonitors) ) {
- // console.log ("Authorizing "+$scope.monitors[ii].Monitor.Name);
+ for (var ii = 0; ii < $scope.monitors.length; ii++)
+ {
+ if ($scope.monitors[ii].Monitor.Id == key && (NVRDataModel.isNotHidden(key) || showHiddenMonitors))
+ {
+ // console.log ("Authorizing "+$scope.monitors[ii].Monitor.Name);
idfound = true;
break;
}
@@ -882,7 +927,8 @@ angular.module('zmApp.controllers')
}
//console.log(NVRDataModel.getMonitorName(key) + " -> " + p[key]);
if (idfound)
- $scope.hours.push({
+ $scope.hours.push(
+ {
monitor: NVRDataModel.getMonitorName(key),
events: p[key],
mid: key
@@ -892,21 +938,26 @@ angular.module('zmApp.controllers')
}
});
-
apiurl = ld.apiurl + "/events/consoleEvents/1%20day" + af + ".json";
NVRDataModel.debug("consoleEvents API:" + apiurl);
$http.get(apiurl)
- .success(function (data) {
+ .success(function(data)
+ {
NVRDataModel.debug(JSON.stringify(data));
$scope.days = [];
var p = data.results;
- for (var key in data.results) {
- if (p.hasOwnProperty(key)) {
+ for (var key in data.results)
+ {
+ if (p.hasOwnProperty(key))
+ {
var idfound = true;
- if (ld.persistMontageOrder) {
+ if (ld.persistMontageOrder)
+ {
idfound = false;
- for (var ii = 0; ii < $scope.monitors.length; ii++) {
- if ($scope.monitors[ii].Monitor.Id == key && (NVRDataModel.isNotHidden(key) || showHiddenMonitors)) {
+ for (var ii = 0; ii < $scope.monitors.length; ii++)
+ {
+ if ($scope.monitors[ii].Monitor.Id == key && (NVRDataModel.isNotHidden(key) || showHiddenMonitors))
+ {
idfound = true;
break;
}
@@ -915,7 +966,8 @@ angular.module('zmApp.controllers')
//console.log(NVRDataModel.getMonitorName(key) + " -> " + p[key]);
if (idfound)
//console.log(NVRDataModel.getMonitorName(key) + " -> " + p[key]);
- $scope.days.push({
+ $scope.days.push(
+ {
monitor: NVRDataModel.getMonitorName(key),
events: p[key],
mid: key
@@ -925,23 +977,27 @@ angular.module('zmApp.controllers')
}
});
-
-
apiurl = ld.apiurl + "/events/consoleEvents/1%20week" + af + ".json";
NVRDataModel.debug("consoleEvents API:" + apiurl);
$http.get(apiurl)
- .success(function (data) {
+ .success(function(data)
+ {
NVRDataModel.debug(JSON.stringify(data));
$scope.weeks = [];
var p = data.results;
- for (var key in data.results) {
- if (p.hasOwnProperty(key)) {
+ for (var key in data.results)
+ {
+ if (p.hasOwnProperty(key))
+ {
var idfound = true;
- if (ld.persistMontageOrder) {
+ if (ld.persistMontageOrder)
+ {
idfound = false;
- for (var ii = 0; ii < $scope.monitors.length; ii++) {
- if ($scope.monitors[ii].Monitor.Id == key && (NVRDataModel.isNotHidden(key)|| showHiddenMonitors)) {
+ for (var ii = 0; ii < $scope.monitors.length; ii++)
+ {
+ if ($scope.monitors[ii].Monitor.Id == key && (NVRDataModel.isNotHidden(key) || showHiddenMonitors))
+ {
idfound = true;
break;
}
@@ -950,7 +1006,8 @@ angular.module('zmApp.controllers')
//console.log(NVRDataModel.getMonitorName(key) + " -> " + p[key]);
if (idfound)
//console.log(NVRDataModel.getMonitorName(key) + " -> " + p[key]);
- $scope.weeks.push({
+ $scope.weeks.push(
+ {
monitor: NVRDataModel.getMonitorName(key),
events: p[key],
mid: key
@@ -960,23 +1017,28 @@ angular.module('zmApp.controllers')
}
});
-
apiurl = ld.apiurl + "/events/consoleEvents/1%20month" + af + ".json";
NVRDataModel.debug("consoleEvents API:" + apiurl);
$http.get(apiurl)
- .success(function (data) {
+ .success(function(data)
+ {
NVRDataModel.debug(JSON.stringify(data));
$scope.months = [];
var p = data.results;
- for (var key in data.results) {
- if (p.hasOwnProperty(key)) {
+ for (var key in data.results)
+ {
+ if (p.hasOwnProperty(key))
+ {
var idfound = true;
var ld = NVRDataModel.getLogin();
- if (ld.persistMontageOrder) {
+ if (ld.persistMontageOrder)
+ {
idfound = false;
- for (var ii = 0; ii < $scope.monitors.length; ii++) {
- if ($scope.monitors[ii].Monitor.Id == key && (NVRDataModel.isNotHidden(key)|| showHiddenMonitors)) {
+ for (var ii = 0; ii < $scope.monitors.length; ii++)
+ {
+ if ($scope.monitors[ii].Monitor.Id == key && (NVRDataModel.isNotHidden(key) || showHiddenMonitors))
+ {
idfound = true;
break;
}
@@ -985,7 +1047,8 @@ angular.module('zmApp.controllers')
//console.log(NVRDataModel.getMonitorName(key) + " -> " + p[key]);
if (idfound)
//console.log(NVRDataModel.getMonitorName(key) + " -> " + p[key]);
- $scope.months.push({
+ $scope.months.push(
+ {
monitor: NVRDataModel.getMonitorName(key),
events: p[key],
mid: key
@@ -997,16 +1060,21 @@ angular.module('zmApp.controllers')
}
- $scope.openMenu = function () {
+ $scope.openMenu = function()
+ {
$ionicSideMenuDelegate.toggleLeft();
};
- $scope.scrollPosition = function () {
+ $scope.scrollPosition = function()
+ {
var scrl = parseFloat($ionicScrollDelegate.$getByHandle("mainScroll").getScrollPosition().top);
- var item = Math.round(scrl / eventsListDetailsHeight );
- if ($scope.events == undefined || !$scope.events.length || $scope.events[item] == undefined) {
+ var item = Math.round(scrl / eventsListDetailsHeight);
+ if ($scope.events == undefined || !$scope.events.length || $scope.events[item] == undefined)
+ {
return "";
- } else {
+ }
+ else
+ {
//return prettifyDate($scope.events[item].Event.StartTime);
return ($scope.events[item].Event.humanizeTime);
}
@@ -1016,7 +1084,8 @@ angular.module('zmApp.controllers')
//-------------------------------------------------------------------------
// called when user switches to background
//-------------------------------------------------------------------------
- function onPause() {
+ function onPause()
+ {
NVRDataModel.debug("EventCtrl:onpause called");
if ($scope.popover) $scope.popover.remove();
@@ -1024,66 +1093,70 @@ angular.module('zmApp.controllers')
//-------------------------------------------------------------------------
// Pads the filename with leading 0s, depending on ZM_IMAGE_DIGITS
//-------------------------------------------------------------------------
- function padToN(number, digits) {
+ function padToN(number, digits)
+ {
var i;
var stringMax = "";
var stringLeading = "";
- for (i = 1; i <= digits; i++) {
+ for (i = 1; i <= digits; i++)
+ {
stringMax = stringMax + "9";
if (i != digits) stringLeading = stringLeading + "0";
}
var numMax = parseInt(stringMax);
- if (number <= numMax) {
+ if (number <= numMax)
+ {
number = (stringLeading + number).slice(-digits);
}
//console.log ("PADTON: returning " + number);
return number;
}
-
//-------------------------------------------------------------------------
// FIXME: Are we using this?
//-------------------------------------------------------------------------
- $scope.disableSlide = function () {
+ $scope.disableSlide = function()
+ {
NVRDataModel.debug("EventCtrl:DisableSlide called");
$ionicSlideBoxDelegate.$getByHandle("eventSlideBox").enableSlide(false);
};
-
-
-
//-------------------------------------------------------------------------
// This function is called when a user enables or disables
// scrub view for an event.
//-------------------------------------------------------------------------
- $scope.toggleGroupScrub = function (event, ndx, frames) {
+ $scope.toggleGroupScrub = function(event, ndx, frames)
+ {
$scope.groupType = "scrub";
toggleGroup(event, ndx, frames, $scope.groupType);
};
- $scope.toggleGroupAlarms = function (event, ndx, frames) {
+ $scope.toggleGroupAlarms = function(event, ndx, frames)
+ {
$scope.groupType = "alarms";
toggleGroup(event, ndx, frames, $scope.groupType);
};
- function toggleGroup(event, ndx, frames, groupType) {
-
+ function toggleGroup(event, ndx, frames, groupType)
+ {
// If we are here and there is a record of a previous scroll
// then we need to scroll back to hide that view
- if (scrollbynumber) {
+ if (scrollbynumber)
+ {
$ionicScrollDelegate.$getByHandle("mainScroll").scrollBy(0, -1 * scrollbynumber, true);
scrollbynumber = 0;
}
- if (oldEvent && event != oldEvent) {
+ if (oldEvent && event != oldEvent)
+ {
NVRDataModel.debug("EventCtrl:Old event scrub will hide now");
oldEvent.Event.ShowScrub = false;
- oldEvent.Event.height = eventsListDetailsHeight ;
+ oldEvent.Event.height = eventsListDetailsHeight;
oldEvent = "";
}
@@ -1095,14 +1168,16 @@ angular.module('zmApp.controllers')
if (event.Event.ShowScrub == true) // turn on display now
{
- if (groupType == 'alarms') {
+ if (groupType == 'alarms')
+ {
$scope.alarm_images = [];
event.Event.height = (eventsListDetailsHeight + eventsListScrubHeight);
$ionicScrollDelegate.resize();
var myurl = loginData.apiurl + '/events/' + event.Event.Id + ".json";
NVRDataModel.log("API for event details" + myurl);
$http.get(myurl)
- .success(function (data) {
+ .success(function(data)
+ {
$scope.FrameArray = data.event.Frame;
// $scope.slider_options.scale=[];
@@ -1110,18 +1185,24 @@ angular.module('zmApp.controllers')
var i;
var timestamp = null;
- for (i = 0; i < data.event.Frame.length; i++) {
- if (data.event.Frame[i].Type == "Alarm") {
+ for (i = 0; i < data.event.Frame.length; i++)
+ {
+ if (data.event.Frame[i].Type == "Alarm")
+ {
//console.log ("**ONLY ALARM AT " + i + "of " + data.event.Frame.length);
var atype;
- if (timestamp != data.event.Frame[i].TimeStamp) {
+ if (timestamp != data.event.Frame[i].TimeStamp)
+ {
atype = $translate.instant('kShowTimeDiffFrames');
- } else {
+ }
+ else
+ {
atype = $translate.instant('kShowAllFrames');
}
- $scope.alarm_images.push({
+ $scope.alarm_images.push(
+ {
type: atype,
id: data.event.Frame[i].Id,
frameid: data.event.Frame[i].FrameId,
@@ -1137,7 +1218,8 @@ angular.module('zmApp.controllers')
//console.log (JSON.stringify(data));
})
- .error(function (err) {
+ .error(function(err)
+ {
NVRDataModel.log("Error retrieving detailed frame API " + JSON.stringify(err));
NVRDataModel.displayBanner('error', ['could not retrieve frame details', 'please try again']);
});
@@ -1157,31 +1239,38 @@ angular.module('zmApp.controllers')
realtime: true,
step: 1,
className: "mySliderClass",
- callback: function (value, released) {
+ callback: function(value, released)
+ {
//console.log("CALLBACK"+value+released);
$ionicScrollDelegate.freezeScroll(!released);
//NVRDataModel.debug("EventCtrl: freezeScroll called with " + !released);
-
},
//modelLabels:function(val) {return "";},
- css: {
- background: {
+ css:
+ {
+ background:
+ {
"background-color": "silver"
},
- before: {
+ before:
+ {
"background-color": "purple"
},
- default: {
+ default:
+ {
"background-color": "white"
}, // default value: 1px
- after: {
+ after:
+ {
"background-color": "green"
}, // zone after default value
- pointer: {
+ pointer:
+ {
"background-color": "red"
}, // circle pointer
- range: {
+ range:
+ {
"background-color": "red"
} // use it if double value
},
@@ -1197,58 +1286,58 @@ angular.module('zmApp.controllers')
$scope.slides = [];
var i;
- if (event.Event.imageMode == 'path') {
+ if (event.Event.imageMode == 'path')
+ {
NVRDataModel.debug("EventCtrl: found " + frames + " frames to scrub");
-
-
- for (i = 1; i <= frames; i++) {
+ for (i = 1; i <= frames; i++)
+ {
var fname = padToN(i, eventImageDigits) + "-capture.jpg";
-
-
- $scope.slides.push({
+ $scope.slides.push(
+ {
id: i,
img: fname
});
}
- } else // we need fids
+ }
+ else // we need fids
{
var myurl_frames = loginData.apiurl + '/events/' + event.Event.Id + ".json";
NVRDataModel.log("API for event details" + myurl_frames);
$http.get(myurl_frames)
- .success(function (data) {
+ .success(function(data)
+ {
$scope.FrameArray = data.event.Frame;
// $scope.slider_options.scale=[];
//$scope.slider_options.scale = [];
var i;
- for (i = 0; i < data.event.Frame.length; i++) {
-
+ for (i = 0; i < data.event.Frame.length; i++)
+ {
//console.log ("**ONLY ALARM AT " + i + "of " + data.event.Frame.length);
- $scope.slides.push({
+ $scope.slides.push(
+ {
id: data.event.Frame[i].Id,
frameid: data.event.Frame[i].FrameId,
});
-
}
//console.log (JSON.stringify(data));
})
- .error(function (err) {
+ .error(function(err)
+ {
NVRDataModel.log("Error retrieving detailed frame API " + JSON.stringify(err));
NVRDataModel.displayBanner('error', [$translate.instant('kErrorFrameBanner'), $translate.instant('kErrorPleaseTryAgain')]);
});
}
-
-
// now get event details to show alarm frames
loginData = NVRDataModel.getLogin();
@@ -1270,7 +1359,7 @@ angular.module('zmApp.controllers')
{
src: $sce.trustAsResourceUrl(videoURL),
type: "video/mp4"
- }
+ }
],
@@ -1278,25 +1367,30 @@ angular.module('zmApp.controllers')
};
-
var myurl2 = loginData.apiurl + '/events/' + event.Event.Id + ".json";
NVRDataModel.log("API for event details" + myurl2);
$http.get(myurl2)
- .success(function (data) {
+ .success(function(data)
+ {
$scope.FrameArray = data.event.Frame;
// $scope.slider_options.scale=[];
$scope.slider_options.scale = [];
var i;
- for (i = 0; i < data.event.Frame.length; i++) {
- if (data.event.Frame[i].Type == "Alarm") {
+ for (i = 0; i < data.event.Frame.length; i++)
+ {
+ if (data.event.Frame[i].Type == "Alarm")
+ {
//console.log ("**ALARM AT " + i + "of " + data.event.Frame.length);
- $scope.slider_options.scale.push({
+ $scope.slider_options.scale.push(
+ {
val: data.event.Frame[i].FrameId,
label: ' '
});
- } else {
+ }
+ else
+ {
//$scope.slider_options.scale.push(' ');
}
@@ -1304,12 +1398,12 @@ angular.module('zmApp.controllers')
//console.log (JSON.stringify(data));
})
- .error(function (err) {
+ .error(function(err)
+ {
NVRDataModel.log("Error retrieving detailed frame API " + JSON.stringify(err));
NVRDataModel.displayBanner('error', [$translate.instant('kErrorFrameBanner'), $translate.instant('kErrorPleaseTryAgain')]);
});
-
oldEvent = event;
$rootScope.rand = Math.floor(Math.random() * (999999 - 111111 + 1)) + 111111;
var elem = angular.element(document.getElementById("item-" + ndx));
@@ -1331,13 +1425,15 @@ angular.module('zmApp.controllers')
} // end of groupType == scrub
} // end of ShowScrub == true
- else {
+ else
+ {
// $ionicScrollDelegate.freezeScroll(false);
$ionicSideMenuDelegate.canDragContent(true);
event.Event.height = eventsListDetailsHeight;
$ionicScrollDelegate.resize();
- if (scrollbynumber) {
+ if (scrollbynumber)
+ {
$ionicScrollDelegate.$getByHandle("mainScroll").scrollBy(0, -1 * scrollbynumber, true);
scrollbynumber = 0;
}
@@ -1346,15 +1442,18 @@ angular.module('zmApp.controllers')
}
- $scope.closeIfOpen = function (event) {
- if (event != undefined) {
+ $scope.closeIfOpen = function(event)
+ {
+ if (event != undefined)
+ {
if (event.Event.ShowScrub)
toggleGroup(event);
}
};
- $scope.isGroupShown = function (event) {
+ $scope.isGroupShown = function(event)
+ {
// console.log ("IS SHOW INDEX is " + ndx);
//console.log ("SHOW GROUP IS " + showGroup);
@@ -1365,7 +1464,8 @@ angular.module('zmApp.controllers')
//---------------------------------------------------
// reload view
//---------------------------------------------------
- $scope.reloadView = function () {
+ $scope.reloadView = function()
+ {
// All we really need to do here is change the random token
// in the image src and it will refresh. No need to reload the view
// and if you did reload the view, it would go back to events list
@@ -1373,7 +1473,8 @@ angular.module('zmApp.controllers')
//console.log("*** Refreshing Modal view ***");
//$state.go($state.current, {}, {reload: true});
$rootScope.rand = Math.floor(Math.random() * (999999 - 111111 + 1)) + 111111;
- $ionicLoading.show({
+ $ionicLoading.show(
+ {
template: $translate.instant('kRefreshedView'),
noBackdrop: true,
duration: 3000
@@ -1384,17 +1485,20 @@ angular.module('zmApp.controllers')
//---------------------------------------------------
// when you tap a list entry - to break search loop
//---------------------------------------------------
- $scope.tapped = function () {
+ $scope.tapped = function()
+ {
// console.log("*** TAPPED ****");
// if he tapped, the we are not infinite loading on ion-infinite
- if (enableLoadMore == false) {
+ if (enableLoadMore == false)
+ {
moreEvents = true;
enableLoadMore = true;
// console.log("REMOVING ARTIFICAL LOAD MORE BLOCK");
}
};
- $scope.$on('$ionicView.loaded', function () {
+ $scope.$on('$ionicView.loaded', function()
+ {
// console.log("**VIEW ** Events Ctrl Loaded");
});
@@ -1405,28 +1509,33 @@ angular.module('zmApp.controllers')
// reset power state on exit as if it is called after we enter another
// state, that effectively overwrites current view power management needs
//------------------------------------------------------------------------
- $scope.$on('$ionicView.enter', function () {
+ $scope.$on('$ionicView.enter', function()
+ {
// console.log("**VIEW ** Events Ctrl Entered");
NVRDataModel.setAwake(false);
- EventServer.sendMessage('push', {
+ EventServer.sendMessage('push',
+ {
type: 'badge',
badge: 0,
});
- $ionicPopover.fromTemplateUrl('templates/events-popover.html', {
+ $ionicPopover.fromTemplateUrl('templates/events-popover.html',
+ {
scope: $scope,
- }).then(function (popover) {
+ }).then(function(popover)
+ {
$scope.popover = popover;
});
-
-
//reset badge count
- if (window.cordova && window.cordova.plugins.notification) {
- $cordovaBadge.set(0).then(function () {
+ if (window.cordova && window.cordova.plugins.notification)
+ {
+ $cordovaBadge.set(0).then(function()
+ {
// You have permission, badge set.
- }, function (err) {
+ }, function(err)
+ {
NVRDataModel.debug("app does not have badge permissions. Please check your phone notification settings");
// You do not have permission.
});
@@ -1436,14 +1545,17 @@ angular.module('zmApp.controllers')
});
- $scope.$on('$ionicView.leave', function () {
+ $scope.$on('$ionicView.leave', function()
+ {
//console.log("**VIEW ** Events Ctrl Left");
});
- $scope.$on('$ionicView.unloaded', function () {
+ $scope.$on('$ionicView.unloaded', function()
+ {
//console.log("**VIEW ** Events Ctrl Unloaded");
//console.log("*** MODAL ** Destroying modal too");
- if ($scope.modal !== undefined) {
+ if ($scope.modal !== undefined)
+ {
$scope.modal.remove();
}
@@ -1452,7 +1564,8 @@ angular.module('zmApp.controllers')
//---------------------------------------------------
// used to hide loading image toast
//---------------------------------------------------
- $scope.finishedLoadingImage = function (ndx) {
+ $scope.finishedLoadingImage = function(ndx)
+ {
// console.log("*** Events image FINISHED loading index: "+ndx+"***");
$ionicLoading.hide();
};
@@ -1460,33 +1573,36 @@ angular.module('zmApp.controllers')
//---------------------------------------------------
//
//---------------------------------------------------
- $scope.clearSearch = function () {
+ $scope.clearSearch = function()
+ {
$scope.search.text = "";
};
//---------------------------------------------------
// Called when user toggles search
//---------------------------------------------------
- $scope.searchClicked = function () {
+ $scope.searchClicked = function()
+ {
$scope.showSearch = !$scope.showSearch;
// this helps greatly in repeat scroll gets
if ($scope.showSearch == false)
$scope.search.text = "";
//console.log("**** Setting search view to " + $scope.showSearch + " ****");
- if (enableLoadMore == false && $scope.showSearch == false) {
+ if (enableLoadMore == false && $scope.showSearch == false)
+ {
moreEvents = true;
enableLoadMore = true;
//console.log("REMOVING ARTIFICAL LOAD MORE BLOCK");
}
};
-
//--------------------------------------------------------
// utility function
//--------------------------------------------------------
- function computeRelativePath(event) {
+ function computeRelativePath(event)
+ {
var relativePath = "";
var loginData = NVRDataModel.getLogin();
var str = event.Event.StartTime;
@@ -1511,7 +1627,8 @@ angular.module('zmApp.controllers')
// utility function
//--------------------------------------------------------
- function computeBasePath(event) {
+ function computeBasePath(event)
+ {
var basePath = "";
var loginData = NVRDataModel.getLogin();
var str = event.Event.StartTime;
@@ -1533,43 +1650,44 @@ angular.module('zmApp.controllers')
return basePath;
}
- $scope.modalGraph = function () {
- $ionicModal.fromTemplateUrl('templates/events-modalgraph.html', {
+ $scope.modalGraph = function()
+ {
+ $ionicModal.fromTemplateUrl('templates/events-modalgraph.html',
+ {
scope: $scope, // give ModalCtrl access to this scope
animation: 'slide-in-up',
id: 'modalgraph',
})
- .then(function (modal) {
+ .then(function(modal)
+ {
$scope.modal = modal;
-
-
-
$scope.modal.show();
});
};
- $scope.analyzeEvent = function (ev) {
+ $scope.analyzeEvent = function(ev)
+ {
$scope.event = ev;
- $ionicModal.fromTemplateUrl('templates/timeline-modal.html', {
+ $ionicModal.fromTemplateUrl('templates/timeline-modal.html',
+ {
scope: $scope, // give ModalCtrl access to this scope
animation: 'slide-in-up',
id: 'analyze',
})
- .then(function (modal) {
+ .then(function(modal)
+ {
$scope.modal = modal;
-
-
-
$scope.modal.show();
});
};
- $scope.$on('modal.removed', function (e, m) {
+ $scope.$on('modal.removed', function(e, m)
+ {
if (m.id != 'footage')
return;
@@ -1588,7 +1706,8 @@ angular.module('zmApp.controllers')
//earlier won't work
//--------------------------------------------------------
- $scope.openModal = function (event) {
+ $scope.openModal = function(event)
+ {
NVRDataModel.debug("unbinding eventCtrl watchers as modal has its own");
ionRangeWatcher();
@@ -1602,17 +1721,18 @@ angular.module('zmApp.controllers')
$scope.currentEvent = event;
$scope.followSameMonitor = ($stateParams.id == "0") ? "0" : "1";
-
-
- $ionicModal.fromTemplateUrl('templates/events-modal.html', {
+ $ionicModal.fromTemplateUrl('templates/events-modal.html',
+ {
scope: $scope,
animation: 'slide-in-up',
id: 'footage',
})
- .then(function (modal) {
+ .then(function(modal)
+ {
$scope.modal = modal;
- $ionicLoading.show({
+ $ionicLoading.show(
+ {
template: $translate.instant('kPleaseWait') + "...",
noBackdrop: true,
duration: 10000
@@ -1622,8 +1742,6 @@ angular.module('zmApp.controllers')
var ld = NVRDataModel.getLogin();
-
-
});
};
@@ -1632,10 +1750,12 @@ angular.module('zmApp.controllers')
//We need to destroy because we are instantiating
// it on open
//--------------------------------------------------------
- $scope.closeModal = function () {
+ $scope.closeModal = function()
+ {
NVRDataModel.debug(">>>EventCtrl:Close & Destroy Modal");
NVRDataModel.setAwake(false);
- if ($scope.modal !== undefined) {
+ if ($scope.modal !== undefined)
+ {
$scope.modal.remove();
}
@@ -1645,9 +1765,11 @@ angular.module('zmApp.controllers')
//Cleanup the modal when we're done with it
// I Don't think it ever comes here
//--------------------------------------------------------
- $scope.$on('$destroy', function () {
+ $scope.$on('$destroy', function()
+ {
//console.log("Destroy Modal");
- if ($scope.modal !== undefined) {
+ if ($scope.modal !== undefined)
+ {
$scope.modal.remove();
}
if ($scope.popover !== undefined)
@@ -1658,18 +1780,21 @@ angular.module('zmApp.controllers')
// used by infinite scrolling to see if we can get more
//--------------------------------------------------------
- $scope.moreDataCanBeLoaded = function () {
+ $scope.moreDataCanBeLoaded = function()
+ {
return moreEvents;
};
//--------------------------------------------------------
// stop searching for more data
//--------------------------------------------------------
- $scope.cancelSearch = function () {
+ $scope.cancelSearch = function()
+ {
$ionicLoading.hide(); //Or whatever action you want to preform
enableLoadMore = false;
//console.log("**** CANCELLED ****");
- $ionicLoading.show({
+ $ionicLoading.show(
+ {
template: $translate.instant('kSearchCancelled'),
animation: 'fade-in',
showBackdrop: true,
@@ -1678,27 +1803,28 @@ angular.module('zmApp.controllers')
showDelay: 0
});
-
};
//--------------------------------------------------------
// loads next page of events
//--------------------------------------------------------
-
- function loadMore() {
+ function loadMore()
+ {
// the events API does not return an error for anything
// except greater page limits than reported
// console.log("***** LOADING MORE INFINITE SCROLL ****");
eventsPage--;
- if ((eventsPage <= 0) && (pageLoaded)) {
+ if ((eventsPage <= 0) && (pageLoaded))
+ {
moreEvents = false;
//console.log("*** At Page " + eventsPage + ", not proceeding");
return;
}
- if (!enableLoadMore) {
+ if (!enableLoadMore)
+ {
moreEvents = false; // Don't ion-scroll till enableLoadMore is true;
$scope.$broadcast('scroll.infiniteScrollComplete');
@@ -1707,9 +1833,11 @@ angular.module('zmApp.controllers')
}
var loadingStr = "";
- if ($scope.search.text != "") {
+ if ($scope.search.text != "")
+ {
var toastStr = $translate.instant('kToastSearchingPage') + eventsPage;
- $ionicLoading.show({
+ $ionicLoading.show(
+ {
maxwidth: 100,
scope: $scope,
template: '<button class="button button-clear icon-left ion-close-circled button-text-wrap" ng-click="cancelSearch()" >' + toastStr + '</button>'
@@ -1726,20 +1854,25 @@ angular.module('zmApp.controllers')
nolangTo = moment($rootScope.toString).locale('en').format("YYYY-MM-DD HH:mm:ss");
NVRDataModel.getEvents($scope.id, eventsPage, loadingStr, nolangFrom, nolangTo)
- .then(function (data) {
+ .then(function(data)
+ {
var loginData = NVRDataModel.getLogin();
// console.log("Got new page of events with Page=" + eventsPage);
var myevents = data;
- for (var i = 0; i < myevents.length; i++) {
+ for (var i = 0; i < myevents.length; i++)
+ {
var idfound = true;
var ld = NVRDataModel.getLogin();
- if (ld.persistMontageOrder) {
+ if (ld.persistMontageOrder)
+ {
idfound = false;
- for (var ii = 0; ii < $scope.monitors.length; ii++) {
- if ($scope.monitors[ii].Monitor.Id == myevents[i].Event.MonitorId && (NVRDataModel.isNotHidden(myevents[i].Event.MonitorId)|| showHiddenMonitors)) {
+ for (var ii = 0; ii < $scope.monitors.length; ii++)
+ {
+ if ($scope.monitors[ii].Monitor.Id == myevents[i].Event.MonitorId && (NVRDataModel.isNotHidden(myevents[i].Event.MonitorId) || showHiddenMonitors))
+ {
//console.log ( $scope.monitors[ii].Monitor.Id + " MATCHES " + myevents[i].Event.MonitorId);
idfound = true;
@@ -1749,7 +1882,6 @@ angular.module('zmApp.controllers')
}
}
-
myevents[i].Event.humanizeTime = humanizeTime(myevents[i].Event.StartTime);
myevents[i].Event.MonitorName = NVRDataModel.getMonitorName(myevents[i].Event.MonitorId);
// now construct base path
@@ -1773,7 +1905,8 @@ angular.module('zmApp.controllers')
$scope.$broadcast('scroll.infiniteScrollComplete');
},
- function (error) {
+ function(error)
+ {
// console.log("*** No More Events to Load, Stop Infinite Scroll ****");
moreEvents = false;
$scope.$broadcast('scroll.infiniteScrollComplete');
@@ -1781,13 +1914,14 @@ angular.module('zmApp.controllers')
});
}
- $scope.loadMore = function () {
+ $scope.loadMore = function()
+ {
loadMore();
};
- $scope.toggleMinAlarmFrameCount = function () {
-
+ $scope.toggleMinAlarmFrameCount = function()
+ {
var ld = NVRDataModel.getLogin();
@@ -1798,54 +1932,57 @@ angular.module('zmApp.controllers')
doRefresh();
};
-
//--------------------------------------
// formats events dates in a nice way
//---------------------------------------
-
- function humanizeTime(str) {
+ function humanizeTime(str)
+ {
//console.log ("Time:"+str+" TO LOCAL " + moment(str).local().toString());
//if (NVRDataModel.getLogin().useLocalTimeZone)
- return moment.tz(str, NVRDataModel.getTimeZoneNow()).fromNow();
- // else
- // return moment(str).fromNow();
-
+ return moment.tz(str, NVRDataModel.getTimeZoneNow()).fromNow();
+ // else
+ // return moment(str).fromNow();
+
}
- $scope.prettifyDate = function (str) {
+ $scope.prettifyDate = function(str)
+ {
if (NVRDataModel.getLogin().useLocalTimeZone)
return moment.tz(str, NVRDataModel.getTimeZoneNow()).tz(moment.tz.guess()).format('MMM Do');
else
- return moment(str).format('MMM Do');
+ return moment(str).format('MMM Do');
};
- function prettifyDate(str) {
+ 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) {
+ $scope.prettifyTime = function(str)
+ {
if (NVRDataModel.getLogin().useLocalTimeZone)
return moment.tz(str, NVRDataModel.getTimeZoneNow()).tz(moment.tz.guess()).format(NVRDataModel.getTimeFormat());
- else
+ else
return moment(str).format(NVRDataModel.getTimeFormat());
};
- $scope.prettifyTimeSec = function (str) {
+ $scope.prettifyTimeSec = function(str)
+ {
if (NVRDataModel.getLogin().useLocalTimeZone)
return moment.tz(str, NVRDataModel.getTimeZoneNow()).tz(moment.tz.guess()).format(NVRDataModel.getTimeFormatSec());
else
return moment(str).format(NVRDataModel.getTimeFormatSec());
};
-
- $scope.prettify = function (str) {
+ $scope.prettify = function(str)
+ {
if (NVRDataModel.getLogin().useLocalTimeZone)
return moment.tz(str, NVRDataModel.getTimeZoneNow()).tz(moment.tz.guess()).format(NVRDataModel.getTimeFormat() + ', MMMM Do YYYY');
- else
+ else
return moment(str).format(NVRDataModel.getTimeFormat() + ', MMMM Do YYYY');
};
//--------------------------------------------------------
@@ -1856,31 +1993,33 @@ angular.module('zmApp.controllers')
// a large list
//--------------------------------------------------------
- $scope.dummyDoRefresh = function () {
+ $scope.dummyDoRefresh = function()
+ {
$scope.$broadcast('scroll.refreshComplete');
};
-
- $scope.doRefresh = function () {
+ $scope.doRefresh = function()
+ {
doRefresh();
}; //dorefresh
- function doRefresh() {
+ function doRefresh()
+ {
// console.log("***Pull to Refresh");
NVRDataModel.debug("Reloading monitors");
var refresh = NVRDataModel.getMonitors(1);
- refresh.then(function (data) {
+ refresh.then(function(data)
+ {
$scope.monitors = data;
-
- /* var ld = NVRDataModel.getLogin();
- if (ld.persistMontageOrder) {
- var tempMon = data;
- $scope.monitors = NVRDataModel.applyMontageMonitorPrefs(tempMon, 2)[0];
- } else {
- $scope.monitors = data;
- }*/
+ /* var ld = NVRDataModel.getLogin();
+ if (ld.persistMontageOrder) {
+ var tempMon = data;
+ $scope.monitors = NVRDataModel.applyMontageMonitorPrefs(tempMon, 2)[0];
+ } else {
+ $scope.monitors = data;
+ }*/
getInitialEvents();
moreEvents = true;
@@ -1888,4 +2027,4 @@ angular.module('zmApp.controllers')
});
}
-}]); \ No newline at end of file
+}]);
diff --git a/www/js/EventDateTimeFilterCtrl.js b/www/js/EventDateTimeFilterCtrl.js
index 24df1f52..772b16be 100644
--- a/www/js/EventDateTimeFilterCtrl.js
+++ b/www/js/EventDateTimeFilterCtrl.js
@@ -2,40 +2,46 @@
/* jslint browser: true*/
/* global cordova,StatusBar,angular,console,moment */
-
-
angular.module('zmApp.controllers')
- .controller('zmApp.EventDateTimeFilterCtrl', ['$scope', '$ionicSlideBoxDelegate', '$ionicSideMenuDelegate', '$rootScope', '$ionicHistory', 'NVRDataModel', '$state', function ($scope, $ionicScrollDelegate, $ionicSideMenuDelegate, $rootScope, $ionicHistory, NVRDataModel, $state) {
+ .controller('zmApp.EventDateTimeFilterCtrl', ['$scope', '$ionicSlideBoxDelegate', '$ionicSideMenuDelegate', '$rootScope', '$ionicHistory', 'NVRDataModel', '$state', function($scope, $ionicScrollDelegate, $ionicSideMenuDelegate, $rootScope, $ionicHistory, NVRDataModel, $state)
+ {
//----------------------------------------------------------------
// Alarm notification handling
//----------------------------------------------------------------
- $scope.handleAlarms = function () {
+ $scope.handleAlarms = function()
+ {
$rootScope.isAlarm = !$rootScope.isAlarm;
- if (!$rootScope.isAlarm) {
+ if (!$rootScope.isAlarm)
+ {
$rootScope.alarmCount = "0";
- $ionicHistory.nextViewOptions({
+ $ionicHistory.nextViewOptions(
+ {
disableBack: true
});
- $state.go("events", {
+ $state.go("events",
+ {
"id": 0,
- "playEvent":false
- }, {
+ "playEvent": false
+ },
+ {
reload: true
});
return;
}
};
- $scope.$on('$ionicView.beforeEnter', function () {
+ $scope.$on('$ionicView.beforeEnter', function()
+ {
$scope.today = moment().format("YYYY-MM-DD");
});
-
+
//--------------------------------------------------------------------------
// Clears filters
//--------------------------------------------------------------------------
- $scope.removeFilters = function () {
+ $scope.removeFilters = function()
+ {
$rootScope.isEventFilterOn = false;
$rootScope.fromDate = "";
$rootScope.fromTime = "";
@@ -57,16 +63,17 @@ angular.module('zmApp.controllers')
}
else // in events, backview is undefined?
{
- $ionicHistory.nextViewOptions({
- disableBack: true
- });
- $state.go("events", {
- "id": 0,
- "playEvent":false
- });
- return;
+ $ionicHistory.nextViewOptions(
+ {
+ disableBack: true
+ });
+ $state.go("events",
+ {
+ "id": 0,
+ "playEvent": false
+ });
+ return;
}
-
//$ionicHistory.goBack();
};
@@ -75,51 +82,50 @@ angular.module('zmApp.controllers')
// Saves filters in root variables so EventFilter can access it. I know:
// don't root.
//--------------------------------------------------------------------------
- $scope.saveFilters = function () {
- if (!$rootScope.fromDate) {
+ $scope.saveFilters = function()
+ {
+ if (!$rootScope.fromDate)
+ {
//console.log("RESET fromDate");
$rootScope.fromDate = new Date();
NVRDataModel.debug("DateTimeFilter: resetting from date");
}
- if (!$rootScope.toDate) {
+ if (!$rootScope.toDate)
+ {
// console.log("RESET toDate");
$rootScope.toDate = new Date();
NVRDataModel.debug("DateTimeFilter: resetting to date");
}
- if (!$rootScope.fromTime) {
+ if (!$rootScope.fromTime)
+ {
// console.log("RESET fromTime");
$rootScope.fromTime = new Date(99, 5, 24, 0, 0, 0, 0); //moment().format("hh:mm:ss");
NVRDataModel.debug("DateTimeFilter: resetting from time");
}
-
- if (!$rootScope.toTime) {
+ if (!$rootScope.toTime)
+ {
//console.log("RESET toTime");
$rootScope.toTime = new Date(99, 5, 24, 23, 59, 59, 0);
//$rootScope.toTime = "01:01:02"; //moment().format("hh:mm:ss");
NVRDataModel.debug("DateTimeFilter: resetting to time");
}
-
if ($rootScope.fromDate > $rootScope.toDate)
{
- NVRDataModel.log ("From date > To Date, swapping");
+ NVRDataModel.log("From date > To Date, swapping");
var t = $rootScope.fromDate;
$rootScope.fromDate = $rootScope.toDate;
$rootScope.toDate = t;
}
-
+
$rootScope.isEventFilterOn = true;
$rootScope.fromString = moment($rootScope.fromDate).format("YYYY-MM-DD") + " " + moment($rootScope.fromTime).format("HH:mm:ss");
$rootScope.toString = moment($rootScope.toDate).format("YYYY-MM-DD") + " " + moment($rootScope.toTime).format("HH:mm:ss");
-
-
-
-
//console.log("CONCAT DATES " + temp);
//
// var startDate = moment(temp).format("YYYY-MM-DD hh:mm:ss");
@@ -127,7 +133,6 @@ angular.module('zmApp.controllers')
$ionicHistory.goBack();
};
+ }
-}
-
-]); \ No newline at end of file
+ ]);
diff --git a/www/js/EventModalCtrl.js b/www/js/EventModalCtrl.js
index 9067bd0e..5773c5ef 100644
--- a/www/js/EventModalCtrl.js
+++ b/www/js/EventModalCtrl.js
@@ -3,11 +3,8 @@
/* jslint browser: true*/
/* global saveAs, cordova,StatusBar,angular,console,ionic, moment, Chart */
-
-
-
-angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$rootScope', 'zm', 'NVRDataModel', '$ionicSideMenuDelegate', '$timeout', '$interval', '$ionicModal', '$ionicLoading', '$http', '$state', '$stateParams', '$ionicHistory', '$ionicScrollDelegate', '$q', '$sce', 'carouselUtils', '$ionicPopup', '$translate', '$filter', 'SecuredPopups', function($scope, $rootScope, zm, NVRDataModel, $ionicSideMenuDelegate, $timeout, $interval, $ionicModal, $ionicLoading, $http, $state, $stateParams, $ionicHistory, $ionicScrollDelegate, $q, $sce, carouselUtils, $ionicPopup, $translate, $filter, SecuredPopups) {
-
+angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$rootScope', 'zm', 'NVRDataModel', '$ionicSideMenuDelegate', '$timeout', '$interval', '$ionicModal', '$ionicLoading', '$http', '$state', '$stateParams', '$ionicHistory', '$ionicScrollDelegate', '$q', '$sce', 'carouselUtils', '$ionicPopup', '$translate', '$filter', 'SecuredPopups', function($scope, $rootScope, zm, NVRDataModel, $ionicSideMenuDelegate, $timeout, $interval, $ionicModal, $ionicLoading, $http, $state, $stateParams, $ionicHistory, $ionicScrollDelegate, $q, $sce, carouselUtils, $ionicPopup, $translate, $filter, SecuredPopups)
+{
// from parent scope
var currentEvent = $scope.currentEvent;
@@ -17,11 +14,11 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
$scope.currentRate = '-';
var timeFormat = 'MM/DD/YYYY HH:mm:ss';
-
var framearray = {
labels: [],
- datasets: [{
+ datasets: [
+ {
//label: '# of Votes',
backgroundColor: 'rgba(242, 12, 12, 0.5)',
borderColor: 'rgba(242, 12, 12, 0.5)',
@@ -31,7 +28,6 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
var frameoptions = [];
-
var eventImageDigits = 5; // failsafe
$scope.currentProgress = {
progress: 0
@@ -40,7 +36,8 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
progress: 0
};
NVRDataModel.getKeyConfigParams(0)
- .then(function(data) {
+ .then(function(data)
+ {
//console.log ("***GETKEY: " + JSON.stringify(data));
eventImageDigits = parseInt(data);
NVRDataModel.log("Image padding digits reported as " + eventImageDigits);
@@ -54,8 +51,8 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
$scope.showModalRangeSider = false;
$scope.isModalActive = true;
-
- $timeout(function() {
+ $timeout(function()
+ {
$scope.showModalRangeSider = true;
}, 2000);
@@ -64,7 +61,8 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
document.addEventListener("resume", onResume, false);
$rootScope.authSession = "undefined";
- $ionicLoading.show({
+ $ionicLoading.show(
+ {
template: $translate.instant('kNegotiatingStreamAuth'),
animation: 'fade-in',
showBackdrop: true,
@@ -74,27 +72,25 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
});
var ld = NVRDataModel.getLogin();
-
$scope.currentStreamMode = ld.gapless ? 'gapless' : 'single';
NVRDataModel.log("Using stream mode " + $scope.currentStreamMode);
NVRDataModel.debug("EventModalCtrl called from " + $ionicHistory.currentStateName());
// This is not needed for event mode
-
-
NVRDataModel.debug("Setting playback to " + $scope.streamMode);
-
$rootScope.validMonitorId = $scope.monitors[0].Monitor.Id;
NVRDataModel.getAuthKey($rootScope.validMonitorId, (Math.floor((Math.random() * 999999) + 1)).toString())
- .then(function(success) {
+ .then(function(success)
+ {
$ionicLoading.hide();
$rootScope.authSession = success;
NVRDataModel.log("Modal: Stream authentication construction: " + $rootScope.authSession);
},
- function(error) {
+ function(error)
+ {
$ionicLoading.hide();
NVRDataModel.debug("ModalCtrl: Error details of stream auth:" + error);
@@ -102,20 +98,22 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
NVRDataModel.log("Modal: Error returned Stream authentication construction. Retaining old value of: " + $rootScope.authSession);
});
-
-
//--------------------------------------------------------------------------------------
// Handles bandwidth change, if required
//
//--------------------------------------------------------------------------------------
- $rootScope.$on("bandwidth-change", function(e, data) {
+ $rootScope.$on("bandwidth-change", function(e, data)
+ {
// not called for offline, I'm only interested in BW switches
NVRDataModel.debug("Got network change:" + data);
var ds;
- if (data == 'lowbw') {
+ if (data == 'lowbw')
+ {
ds = $translate.instant('kLowBWDisplay');
- } else {
+ }
+ else
+ {
ds = $translate.instant('kHighBWDisplay');
}
NVRDataModel.displayBanner('net', [ds]);
@@ -125,78 +123,80 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
$scope.singleImageQuality = (NVRDataModel.getBandwidth() == "lowbw") ? zm.eventSingleImageQualityLowBW : ld.singleImageQuality;
});
-
-
-
//-------------------------------------------------------
// we use this to reload the connkey if authkey changed
//------------------------------------------------------
-
- $rootScope.$on("auth-success", function() {
+ $rootScope.$on("auth-success", function()
+ {
NVRDataModel.debug("EventModalCtrl: Re-login detected, resetting everything & re-generating connkey");
NVRDataModel.stopNetwork("Auth-Success inside EventModalCtrl");
$scope.connKey = (Math.floor((Math.random() * 999999) + 1)).toString();
//console.log ("********* OFFSET FROM AUTH SUCC");
- $timeout(function() {
+ $timeout(function()
+ {
sendCommand('14', $scope.connKey, '&offset=' + $scope.currentProgress.progress);
}, 500);
//$timeout.cancel(eventQueryHandle);
//eventQueryHandle = $timeout (function(){checkEvent();}, zm.eventPlaybackQuery);
-
-
});
//-------------------------------------------------------
// tap to pause
//------------------------------------------------------
- $scope.togglePause = function() {
+ $scope.togglePause = function()
+ {
$scope.isPaused = !$scope.isPaused;
NVRDataModel.debug("Paused is " + $scope.isPaused);
-
-
sendCommand($scope.isPaused ? '1' : '2', $scope.connKey);
};
-
- $scope.onPlayerReady = function(handle) {
+ $scope.onPlayerReady = function(handle)
+ {
// we need this timeout to avoid load interrupting
// play -- I suppose its an angular digest foo thing
NVRDataModel.debug("Player is ready");
- $timeout(function() { handle.play(); }, 400);
+ $timeout(function()
+ {
+ handle.play();
+ }, 400);
// window.stop();
};
- $scope.onCanPlay = function() {
+ $scope.onCanPlay = function()
+ {
NVRDataModel.debug("This video can be played");
};
- $scope.onVideoError = function(event) {
+ $scope.onVideoError = function(event)
+ {
if (!$scope.isModalActive) return;
NVRDataModel.debug("player reported a video error:" + JSON.stringify(event));
- $rootScope.zmPopup = SecuredPopups.show('alert', {
+ $rootScope.zmPopup = SecuredPopups.show('alert',
+ {
title: $translate.instant('kError'),
template: $rootScope.platformOS == 'desktop' ? $translate.instant('kVideoError') : $translate.instant('kVideoErrorMobile')
});
};
-
//-------------------------------------------------------
// This is what we call every zm.EventQueryInterval
// it really only queries to get status to it can display
// zms takes care of the display
//------------------------------------------------------
- function checkEvent() {
+ function checkEvent()
+ {
- if ($scope.modalFromTimelineIsOpen == false) {
+ if ($scope.modalFromTimelineIsOpen == false)
+ {
NVRDataModel.log("Modal was closed in timeline, cancelling timer");
$interval.cancel(eventQueryHandle);
return;
@@ -205,45 +205,51 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
//console.log ("Event timer");
//console.log ("Event timer");
$scope.checkEventOn = true;
- if ($scope.defaultVideo !== undefined && $scope.defaultVideo != '') {
+ if ($scope.defaultVideo !== undefined && $scope.defaultVideo != '')
+ {
//console.log("playing video, not using zms, skipping event commands");
- } else {
+ }
+ else
+ {
processEvent('99', $scope.connKey);
}
}
-
- function sendCommand(cmd, connkey, extras, rq) {
+ function sendCommand(cmd, connkey, extras, rq)
+ {
var d = $q.defer();
- if ($scope.defaultVideo !== undefined && $scope.defaultVideo != '') {
+ if ($scope.defaultVideo !== undefined && $scope.defaultVideo != '')
+ {
// console.log("playing video, not using zms, skipping event commands");
d.resolve(true);
return (d.promise);
}
-
-
var loginData = NVRDataModel.getLogin();
//console.log("Sending CGI command to " + loginData.url);
var rqtoken = rq ? rq : "stream";
var myauthtoken = $rootScope.authSession.replace("&auth=", "");
//&auth=
- $http({
+ $http(
+ {
method: 'POST',
/*timeout: 15000,*/
url: loginData.url + '/index.php',
- headers: {
+ headers:
+ {
'Content-Type': 'application/x-www-form-urlencoded',
//'Accept': '*/*',
},
- transformRequest: function(obj) {
+ transformRequest: function(obj)
+ {
var str = [];
for (var p in obj)
str.push(encodeURIComponent(p) + "=" +
encodeURIComponent(obj[p]));
var foo = str.join("&");
- if (extras) {
+ if (extras)
+ {
foo = foo + extras;
//console.log("EXTRAS****SUB RETURNING " + foo);
}
@@ -252,7 +258,8 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
},
- data: {
+ data:
+ {
view: "request",
request: rqtoken,
connkey: connkey,
@@ -262,14 +269,15 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
// pass: loginData.password
}
})
- .then(function(resp) {
+ .then(function(resp)
+ {
NVRDataModel.debug("sendCmd response:" + JSON.stringify(resp));
d.resolve(resp);
return (d.promise);
-
},
- function(resp) {
+ function(resp)
+ {
NVRDataModel.debug("sendCmd error:" + JSON.stringify(resp));
d.reject(resp);
return (d.promise);
@@ -278,10 +286,11 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
return (d.promise);
}
+ function processEvent(cmd, connkey)
+ {
- function processEvent(cmd, connkey) {
-
- if ($scope.blockSlider) {
+ if ($scope.blockSlider)
+ {
//console.log("Not doing ZMS Command as slider is depressed...");
return;
}
@@ -290,15 +299,18 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
//console.log("sending process Event command to " + loginData.url);
var myauthtoken = $rootScope.authSession.replace("&auth=", "");
//&auth=
- var req = $http({
+ var req = $http(
+ {
method: 'POST',
/*timeout: 15000,*/
url: loginData.url + '/index.php',
- headers: {
+ headers:
+ {
'Content-Type': 'application/x-www-form-urlencoded',
//'Accept': '*/*',
},
- transformRequest: function(obj) {
+ transformRequest: function(obj)
+ {
var str = [];
for (var p in obj)
str.push(encodeURIComponent(p) + "=" +
@@ -308,7 +320,8 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
return foo;
},
- data: {
+ data:
+ {
view: "request",
request: "stream",
connkey: connkey,
@@ -319,17 +332,18 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
}
});
- req.success(function(resp) {
+ req.success(function(resp)
+ {
// NVRDataModel.debug ("processEvent success:"+JSON.stringify(resp));
- if (resp.result == "Ok") {
+ if (resp.result == "Ok")
+ {
$scope.currentProgress.progress = resp.status.progress;
$scope.eventId = resp.status.event;
$scope.d_eventId = $scope.eventId;
$scope.currentRate = resp.status.rate;
-
if ($scope.currentProgress.progress > $scope.currentEventDuration) $scope.currentProgress.progress = $scope.currentEventDuration;
$scope.progressText = "At " + $scope.currentProgress.progress + "s of " + $scope.currentEventDuration + "s";
@@ -339,12 +353,11 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
// as this code conflicts with fast rev etc
//if (Math.floor(resp.status.progress) >=$scope.currentEventDuration)
-
-
//$timeout (checkEvent(), zm.eventPlaybackQuery);
//eventQueryHandle = $timeout (function(){checkEvent();}, zm.eventPlaybackQuery);
- } else // resp.result was messed up
+ }
+ else // resp.result was messed up
{
NVRDataModel.debug("Hmm I found an error " + JSON.stringify(resp));
@@ -352,7 +365,8 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
$scope.connKey = (Math.floor((Math.random() * 999999) + 1)).toString();
// console.log (JSON.stringify(resp));
- $timeout(function() {
+ $timeout(function()
+ {
sendCommand('14', $scope.connKey, '&offset=' + $scope.currentProgress.progress);
}, 500);
NVRDataModel.debug("so I'm regenerating Connkey to " + $scope.connKey);
@@ -360,8 +374,8 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
}
});
-
- req.error(function(resp) {
+ req.error(function(resp)
+ {
NVRDataModel.debug("processEvent error:" + JSON.stringify(resp));
//eventQueryHandle = $timeout (function(){checkEvent();}, zm.eventPlaybackQuery);
@@ -369,9 +383,8 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
}
-
-
- function onPause() {
+ function onPause()
+ {
// $interval.cancel(modalIntervalHandle);
@@ -381,53 +394,50 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
}
-
- function onResume() {
+ function onResume()
+ {
NVRDataModel.debug("EventModalCtrl: Modal resume called");
-
-
$rootScope.modalRand = Math.floor((Math.random() * 100000) + 1);
}
-
-
-
-
-
-
-
- $scope.finishedLoadingImage = function() {
+ $scope.finishedLoadingImage = function()
+ {
// console.log("***Monitor image FINISHED Loading***");
$ionicLoading.hide();
};
- $scope.enableSliderBlock = function() {
+ $scope.enableSliderBlock = function()
+ {
$scope.blockSlider = true;
};
- $scope.youChangedSlider = function() {
+ $scope.youChangedSlider = function()
+ {
//console.log("YOU changed " + $scope.sliderProgress.progress);
$scope.currentProgress.progress = $scope.sliderProgress.progress;
sendCommand('14', $scope.connKey, '&offset=' + $scope.currentProgress.progress)
- .then(function(s) { $scope.blockSlider = false; }, function(e) { $scope.blockSlider = false; });
-
+ .then(function(s)
+ {
+ $scope.blockSlider = false;
+ }, function(e)
+ {
+ $scope.blockSlider = false;
+ });
};
-
-
-
-
//-----------------------------------------------------------------------
// Sucess/Error handlers for saving a snapshot of the
// monitor image to phone storage
//-----------------------------------------------------------------------
- function SaveSuccess() {
- $ionicLoading.show({
+ function SaveSuccess()
+ {
+ $ionicLoading.show(
+ {
template: $translate.instant('kDone'),
noBackdrop: true,
duration: 1000
@@ -435,8 +445,10 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
NVRDataModel.debug("ModalCtrl:Photo saved successfuly");
}
- function SaveError(e) {
- $ionicLoading.show({
+ function SaveError(e)
+ {
+ $ionicLoading.show(
+ {
template: $translate.instant('kErrorSave'),
noBackdrop: true,
duration: 2000
@@ -445,21 +457,20 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
//console.log("***ERROR");
}
-
- $scope.jumpToOffsetInEvent = function() {
+ $scope.jumpToOffsetInEvent = function()
+ {
// streamReq.send( streamParms+"&command="+CMD_SEEK+"&offset="+offset );
};
-
-
//-----------------------------------------------------------------------
// Saves a snapshot of the monitor image to phone storage
//-----------------------------------------------------------------------
+ $scope.saveEventImageToPhoneWithPerms = function(onlyAlarms)
+ {
- $scope.saveEventImageToPhoneWithPerms = function(onlyAlarms) {
-
- if ($rootScope.platformOS != 'android') {
+ if ($rootScope.platformOS != 'android')
+ {
processSaveEventImageToPhone(onlyAlarms);
return;
}
@@ -469,51 +480,59 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
var permissions = cordova.plugins.permissions;
permissions.hasPermission(permissions.WRITE_EXTERNAL_STORAGE, checkPermissionCallback, null);
- function checkPermissionCallback(status) {
- if (!status.hasPermission) {
+ function checkPermissionCallback(status)
+ {
+ if (!status.hasPermission)
+ {
SaveError("No permission to write to external storage");
}
permissions.requestPermission(permissions.WRITE_EXTERNAL_STORAGE, succ, err);
}
- function succ(s) {
+ function succ(s)
+ {
processSaveEventImageToPhone(onlyAlarms);
}
- function err(e) {
+ function err(e)
+ {
SaveError("Error in requestPermission");
}
};
+ function processSaveEventImageToPhone(onlyAlarms)
+ {
- function processSaveEventImageToPhone(onlyAlarms) {
-
- if ($scope.loginData.useNphZmsForEvents) {
+ if ($scope.loginData.useNphZmsForEvents)
+ {
NVRDataModel.log("Use ZMS stream to save to phone");
saveEventImageToPhoneZms(onlyAlarms);
-
- } else {
+ }
+ else
+ {
saveEventImageToPhone(onlyAlarms);
}
-
}
- function saveEventImageToPhoneZms(onlyAlarms) {
+ function saveEventImageToPhoneZms(onlyAlarms)
+ {
// The strategy here is to build the array now so we can grab frames
// $scope.currentProgress.progress is the seconds where we are
// $scope.eventId is the event Id
$scope.isPaused = true;
- $ionicLoading.show({
+ $ionicLoading.show(
+ {
template: $translate.instant('kPleaseWait'),
noBackdrop: true,
duration: zm.httpTimeout
});
sendCommand('1', $scope.connKey).
- then(function(resp) {
+ then(function(resp)
+ {
// console.log ("PAUSE ANSWER IS " + JSON.stringify(resp));
$scope.currentProgress.progress = resp.data.status.progress;
@@ -523,7 +542,8 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
var apiurl = $scope.loginData.apiurl + "/events/" + $scope.eventId + ".json";
NVRDataModel.debug("prepared to get frame details using " + apiurl);
$http.get(apiurl)
- .then(function(success) {
+ .then(function(success)
+ {
var event = success.data.event;
@@ -549,23 +569,29 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
$scope.mycarousel.index = myFrame;
// console.log ("STEP 1 : Computed index as "+ $scope.mycarousel.index);
var i;
- for (i = 1; i <= event.Frame.length; i++) {
+ for (i = 1; i <= event.Frame.length; i++)
+ {
var fname = padToN(event.Frame[i - 1].FrameId, eventImageDigits) + "-capture.jpg";
// console.log ("Building " + fname);
// console.log ("DUMPING ONE " + JSON.stringify(event.Frame[i-1]));
// onlyAlarms means only copy alarmed frames
- if (onlyAlarms) {
- if (event.Frame[i - 1] && event.Frame[i - 1].Type == 'Alarm') {
- $scope.slides.push({
+ if (onlyAlarms)
+ {
+ if (event.Frame[i - 1] && event.Frame[i - 1].Type == 'Alarm')
+ {
+ $scope.slides.push(
+ {
id: event.Frame[i - 1].FrameId,
img: fname,
});
//console.log ("ALARM PUSHED " + fname);
}
- } else // push all frames
+ }
+ else // push all frames
{
- $scope.slides.push({
+ $scope.slides.push(
+ {
id: event.Frame[i - 1].FrameId,
img: fname,
});
@@ -577,13 +603,14 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
$ionicLoading.hide();
saveEventImageToPhone(onlyAlarms);
-
},
- function(err) {
+ function(err)
+ {
$ionicLoading.hide();
NVRDataModel.log("snapshot API Error: Could not get frames " + JSON.stringify(err));
- $ionicLoading.show({
+ $ionicLoading.show(
+ {
template: $translate.instant('kErrorRetrievingFrames'),
noBackdrop: true,
duration: 4000
@@ -591,18 +618,18 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
});
},
- function(err) {
+ function(err)
+ {
NVRDataModel.debug("Error pausing stream before snapshot " + JSON.stringify(err));
$ionicLoading.hide();
}
); // then
-
}
-
- function saveEventImageToPhone(onlyAlarms) {
+ function saveEventImageToPhone(onlyAlarms)
+ {
var curState = carouselUtils.getStop();
carouselUtils.setStop(true);
@@ -613,30 +640,30 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
var canvas, context, imageDataUrl, imageData;
var loginData = NVRDataModel.getLogin();
-
// for alarms only
if (onlyAlarms) $scope.mycarousel.index = 0;
var url = $scope.playbackURL + '/index.php?view=image&rand=' + $rootScope.rand + "&path=" + $scope.relativePath + $scope.slides[$scope.mycarousel.index].img;
-
$scope.selectEventUrl = url;
$scope.slideIndex = $scope.mycarousel.index;
$scope.slideLastIndex = $scope.slides.length - 1;
// console.log ("URL TO DISPLAY " + url);
-
- $rootScope.zmPopup = $ionicPopup.show({
+ $rootScope.zmPopup = $ionicPopup.show(
+ {
template: '<center>Frame: {{slideIndex+1}} / {{slideLastIndex+1}}</center><br/><img src="{{selectEventUrl}}" width="100%" />',
title: 'Select ' + (onlyAlarms ? 'Alarmed ' : '') + 'frame to save',
subTitle: 'use left and right arrows to change',
scope: $scope,
cssClass: 'popup95',
- buttons: [{
+ buttons: [
+ {
// left 1
text: '',
type: 'button-small button-energized ion-chevron-left',
- onTap: function(e) {
+ onTap: function(e)
+ {
if ($scope.slideIndex > 0) $scope.slideIndex--;
$scope.selectEventUrl = $scope.playbackURL + '/index.php?view=image&rand=' + $rootScope.rand + "&path=" + $scope.relativePath + $scope.slides[$scope.slideIndex].img;
//NVRDataModel.log("selected frame is " + $scope.slideIndex);
@@ -645,22 +672,26 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
e.preventDefault();
}
- }, {
+ },
+ {
// right 1
text: '',
type: 'button-small button-energized ion-chevron-right',
- onTap: function(e) {
+ onTap: function(e)
+ {
if ($scope.slideIndex < $scope.slideLastIndex) $scope.slideIndex++;
$scope.selectEventUrl = $scope.playbackURL + '/index.php?view=image&rand=' + $rootScope.rand + "&path=" + $scope.relativePath + $scope.slides[$scope.slideIndex].img;
//NVRDataModel.log("selected frame is " + $scope.slideIndex);
console.log("URL TO DISPLAY " + $scope.slides[$scope.slideIndex].img);
e.preventDefault();
}
- }, {
+ },
+ {
// left 10
text: '',
type: 'button-small button-energized ion-skip-backward',
- onTap: function(e) {
+ onTap: function(e)
+ {
var tempVar = $scope.slideIndex;
tempVar -= 10;
if (tempVar < 0) tempVar = 0;
@@ -671,11 +702,13 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
e.preventDefault();
}
- }, {
+ },
+ {
// right 10
text: '',
type: 'button-small button-energized ion-skip-forward',
- onTap: function(e) {
+ onTap: function(e)
+ {
var tempVar = $scope.slideIndex;
tempVar += 10;
if (tempVar > $scope.slideLastIndex) tempVar = $scope.slideLastIndex;
@@ -690,10 +723,12 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
{
text: '',
type: 'button-assertive button-small ion-close-round'
- }, {
+ },
+ {
text: '',
type: 'button-positive button-small ion-checkmark-round',
- onTap: function(e) {
+ onTap: function(e)
+ {
saveNow();
}
@@ -701,8 +736,10 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
]
});
- function saveNow() {
- $ionicLoading.show({
+ function saveNow()
+ {
+ $ionicLoading.show(
+ {
template: $translate.instant('kSavingSnapshot') + "...",
noBackdrop: true,
duration: zm.httpTimeout
@@ -711,7 +748,8 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
NVRDataModel.log("saveNow: File path to grab is " + url);
var img = new Image();
- img.onload = function() {
+ img.onload = function()
+ {
// console.log("********* ONLOAD");
canvas = document.createElement('canvas');
canvas.width = img.width;
@@ -722,8 +760,10 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
imageDataUrl = canvas.toDataURL('image/jpeg', 1.0);
imageData = imageDataUrl.replace(/data:image\/jpeg;base64,/, '');
- if ($rootScope.platformOS != "desktop") {
- try {
+ if ($rootScope.platformOS != "desktop")
+ {
+ try
+ {
cordova.exec(
SaveSuccess,
@@ -732,54 +772,62 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
'saveImageDataToLibrary', [imageData]
);
// carouselUtils.setStop(curState);
- } catch (e) {
+ }
+ catch (e)
+ {
SaveError(e.message);
// carouselUtils.setStop(curState);
}
- } else {
-
+ }
+ else
+ {
var fname = $scope.relativePath + $scope.slides[$scope.slideIndex].img + ".png";
fname = fname.replace(/\//, "-");
fname = fname.replace(/\.jpg/, '');
- canvas.toBlob(function(blob) {
+ canvas.toBlob(function(blob)
+ {
saveAs(blob, fname);
SaveSuccess();
});
}
};
- try {
+ try
+ {
img.src = url;
// console.log ("SAVING IMAGE SOURCE");
- } catch (e) {
+ }
+ catch (e)
+ {
SaveError(e.message);
}
}
}
-
- $scope.reloadView = function() {
+ $scope.reloadView = function()
+ {
NVRDataModel.log("Reloading view for modal view, recomputing rand");
$rootScope.modalRand = Math.floor((Math.random() * 100000) + 1);
$scope.isModalActive = true;
};
- $scope.scaleImage = function() {
+ $scope.scaleImage = function()
+ {
$scope.imageFit = !$scope.imageFit;
console.log("Switching image style to " + $scope.imageFit);
};
- $scope.$on('$ionicView.enter', function() {
+ $scope.$on('$ionicView.enter', function()
+ {
//console.log (">>>>>>>>>>>>>>>>>>>> MODAL VIEW ENTER");
-
-
});
- $scope.$on('modal.shown', function(e, m) {
+ $scope.$on('modal.shown', function(e, m)
+ {
if (m.id != 'footage')
@@ -795,8 +843,6 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
$scope.checkEventOn = false;
//$scope.singleImageQuality = 100;
-
-
//$scope.commandURL = $scope.currentEvent.Event.baseURL+"/index.php";
// NVRDataModel.log (">>>>>>>>>>>>>>>>>>ZMS url command is " + $scope.commandURL);
@@ -811,23 +857,30 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
//console.log ("CURRENT EVENT " + JSON.stringify($scope.currentEvent));
$scope.currentEventDuration = Math.floor($scope.currentEvent.Event.Length);
//console.log ($scope.event.Event.Frames);
- if (currentEvent && currentEvent.Event) {
+ if (currentEvent && currentEvent.Event)
+ {
//console.log ("************ CALLING PREPARE MODAL ***********");
prepareModalEvent(currentEvent.Event.Id);
- if (ld.useNphZmsForEvents) {
- $timeout(function() {
+ if (ld.useNphZmsForEvents)
+ {
+ $timeout(function()
+ {
- if ($scope.modal != undefined && $scope.modal.isShown()) {
+ if ($scope.modal != undefined && $scope.modal.isShown())
+ {
NVRDataModel.log(">>>Starting checkAllEvents interval...");
//eventQueryHandle = $timeout (checkEvent(), zm.eventPlaybackQuery);
$interval.cancel(eventQueryHandle);
- eventQueryHandle = $interval(function() {
+ eventQueryHandle = $interval(function()
+ {
checkEvent();
// console.log ("Refreshing Image...");
}.bind(this), (NVRDataModel.getBandwidth() == "lowbw") ? zm.eventPlaybackQueryLowBW : zm.eventPlaybackQuery);
- } else {
+ }
+ else
+ {
NVRDataModel.log(">>>Modal was exited, not starting checkAllEvents");
}
@@ -836,51 +889,53 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
}
-
-
-
-
-
});
//var current_data;
- function drawGraph() {
-
+ function drawGraph()
+ {
var cv = document.getElementById("eventchart");
var ctx = cv.getContext("2d");
-
frameoptions = {
responsive: true,
legend: false,
- title: {
+ title:
+ {
display: false,
text: ""
},
- scales: {
- yAxes: [{
+ scales:
+ {
+ yAxes: [
+ {
display: false,
- scaleLabel: {
+ scaleLabel:
+ {
display: false,
labelString: 'value',
}
}],
- xAxes: [{
+ xAxes: [
+ {
type: 'time',
display: false,
- time: {
+ time:
+ {
format: timeFormat,
tooltipFormat: 'll HH:mm',
min: framearray.datasets[0].data[0].x,
max: framearray.datasets[0].data[framearray.datasets[0].data.length - 1].x,
- displayFormats: {
+ displayFormats:
+ {
}
},
- scaleLabel: {
+ scaleLabel:
+ {
display: false,
labelString: ''
}
@@ -889,11 +944,11 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
}
};
+ $timeout(function()
+ {
- $timeout(function() {
-
-
- var myChart = new Chart(ctx, {
+ var myChart = new Chart(ctx,
+ {
type: 'line',
data: framearray,
options: frameoptions,
@@ -902,12 +957,16 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
});
}
- $scope.videoTime = function(s, c) {
+ $scope.videoTime = function(s, c)
+ {
var a, o;
- if (NVRDataModel.getLogin().useLocalTimeZone) {
+ if (NVRDataModel.getLogin().useLocalTimeZone)
+ {
a = moment.tz(s, NVRDataModel.getTimeZoneNow()).tz(moment.tz.guess());
- } else {
+ }
+ else
+ {
a = moment(s);
}
a.add(c);
@@ -918,13 +977,13 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
};
- $scope.$on('modal.removed', function(e, m) {
+ $scope.$on('modal.removed', function(e, m)
+ {
console.log("************* REMOVE CALLED");
$interval.cancel(eventQueryHandle);
if (m.id != 'footage')
return;
-
$scope.isModalActive = false;
NVRDataModel.debug("Modal removed - killing connkey");
@@ -934,13 +993,15 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
// Execute action
});
-
// Playback speed adjuster
- $scope.adjustSpeed = function(val) {
+ $scope.adjustSpeed = function(val)
+ {
- if ($scope.defaultVideo !== undefined && $scope.defaultVideo != '') {
+ if ($scope.defaultVideo !== undefined && $scope.defaultVideo != '')
+ {
- $ionicLoading.show({
+ $ionicLoading.show(
+ {
template: $translate.instant('kUseVideoControls'),
noBackdrop: true,
duration: 3000
@@ -950,11 +1011,13 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
var ld = NVRDataModel.getLogin();
- if (ld.useNphZmsForEvents) {
+ if (ld.useNphZmsForEvents)
+ {
var cmd;
$scope.isPaused = false;
- switch (val) {
+ switch (val)
+ {
case 'ff':
cmd = 4;
break;
@@ -972,28 +1035,32 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
cmd = 0;
}
- $ionicLoading.show({
+ $ionicLoading.show(
+ {
template: $translate.instant('kPleaseWait') + "...",
noBackdrop: true,
duration: zm.httpTimeout
});
sendCommand(cmd, $scope.connKey)
- .then(function(success) {
+ .then(function(success)
+ {
$ionicLoading.hide();
},
- function(err) {
+ function(err)
+ {
$ionicLoading.hide();
NVRDataModel.debug("Error in adjust speed: " + JSON.stringify(err));
}
);
-
- } else // not using nph
+ }
+ else // not using nph
{
- switch (val) {
+ switch (val)
+ {
case "super":
$scope.eventSpeed = 20 / $scope.event.Event.Frames;
@@ -1021,7 +1088,8 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
}
NVRDataModel.debug("Set playback speed to " + $scope.eventSpeed);
- $ionicLoading.show({
+ $ionicLoading.show(
+ {
template: $translate.instant('kPlaybackInterval') + ': ' + $scope.eventSpeed.toFixed(3) + "ms",
animation: 'fade-in',
showBackdrop: false,
@@ -1031,12 +1099,10 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
});
}
-
-
};
-
- $scope.toggleGapless = function() {
+ $scope.toggleGapless = function()
+ {
// console.log(">>>>>>>>>>>>>>GAPLESS TOGGLE INSIDE MODAL");
$scope.loginData.gapless = !$scope.loginData.gapless;
NVRDataModel.setLogin($scope.loginData);
@@ -1046,18 +1112,18 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
NVRDataModel.debug("Regenerating connkey as gapless has changed");
// console.log ("********* OFFSET FROM TOGGLE GAPLESS");
$scope.connKey = (Math.floor((Math.random() * 999999) + 1)).toString();
- $timeout(function() {
+ $timeout(function()
+ {
sendCommand('14', $scope.connKey, '&offset=' + $scope.currentProgress.progress);
}, 500);
//$timeout.cancel(eventQueryHandle);
//eventQueryHandle = $timeout (function(){checkEvent();}, zm.eventPlaybackQuery);
-
};
-
// This function returns neighbor events if applicable
- function neighborEvents(eid) {
+ function neighborEvents(eid)
+ {
var d = $q.defer();
// now get event details to show alarm frames
var loginData = NVRDataModel.getLogin();
@@ -1067,7 +1133,8 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
next: ""
};
$http.get(myurl)
- .success(function(data) {
+ .success(function(data)
+ {
// In Timeline view, gapless should stick to the same monitor
if ($scope.followSameMonitor == "1") // we are viewing only one monitor
@@ -1075,90 +1142,101 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
NVRDataModel.debug("Getting next event for same monitor Id ");
neighbors.prev = data.event.Event.PrevOfMonitor ? data.event.Event.PrevOfMonitor : "";
neighbors.next = data.event.Event.NextOfMonitor ? data.event.Event.NextOfMonitor : "";
- } else {
+ }
+ else
+ {
neighbors.prev = data.event.Event.Prev ? data.event.Event.Prev : "";
neighbors.next = data.event.Event.Next ? data.event.Event.Next : "";
}
NVRDataModel.debug("Neighbor events of " + eid + "are Prev:" +
neighbors.prev + " and Next:" + neighbors.next);
-
d.resolve(neighbors);
return (d.promise);
})
- .error(function(err) {
+ .error(function(err)
+ {
NVRDataModel.log("Error retrieving neighbors" + JSON.stringify(err));
d.reject(neighbors);
return (d.promise);
-
});
return (d.promise);
}
-
- $scope.zoomImage = function(val) {
+ $scope.zoomImage = function(val)
+ {
var zl = parseInt($ionicScrollDelegate.$getByHandle("imgscroll").getScrollPosition().zoom);
- if (zl == 1 && val == -1) {
+ if (zl == 1 && val == -1)
+ {
NVRDataModel.debug("Already zoomed out max");
return;
}
-
zl += val;
NVRDataModel.debug("Zoom level is " + zl);
$ionicScrollDelegate.$getByHandle("imgscroll").zoomTo(zl, true);
};
-
//--------------------------------------------------------
//Navigate to next/prev event in full screen mode
//--------------------------------------------------------
- $scope.onSwipeEvent = function(eid, dirn) {
+ $scope.onSwipeEvent = function(eid, dirn)
+ {
//console.log("HERE");
var ld = NVRDataModel.getLogin();
if (!ld.canSwipeMonitors) return;
- if ($ionicScrollDelegate.$getByHandle("imgscroll").getScrollPosition().zoom != 1) {
+ if ($ionicScrollDelegate.$getByHandle("imgscroll").getScrollPosition().zoom != 1)
+ {
//console.log("Image is zoomed in - not honoring swipe");
return;
}
- if (ld.useNphZmsForEvents) {
+ if (ld.useNphZmsForEvents)
+ {
NVRDataModel.log("using zms to move ");
jumpToEventZms($scope.connKey, dirn);
// sendCommand ( dirn==1?'13':'12',$scope.connKey);
- } else {
+ }
+ else
+ {
jumpToEvent(eid, dirn);
}
//console.log("JUMPING");
-
};
- $scope.jumpToEvent = function(eid, dirn) {
+ $scope.jumpToEvent = function(eid, dirn)
+ {
// console.log("jumptoevent");
var ld = NVRDataModel.getLogin();
- if (ld.useNphZmsForEvents) {
+ if (ld.useNphZmsForEvents)
+ {
NVRDataModel.log("using zms to move ");
jumpToEventZms($scope.connKey, dirn);
// sendCommand ( dirn==1?'13':'12',$scope.connKey);
- } else {
+ }
+ else
+ {
jumpToEvent(eid, dirn);
}
};
- function jumpToEvent(eid, dirn) {
+ function jumpToEvent(eid, dirn)
+ {
NVRDataModel.log("Event jump called with:" + eid);
- if (eid == "") {
- $ionicLoading.show({
+ if (eid == "")
+ {
+ $ionicLoading.show(
+ {
template: $translate.instant('kNoMoreEvents'),
noBackdrop: true,
duration: 2000
@@ -1169,26 +1247,29 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
var slidein;
var slideout;
- if (dirn == 1) {
+ if (dirn == 1)
+ {
slideout = "animated slideOutLeft";
slidein = "animated slideInRight";
- } else {
+ }
+ else
+ {
slideout = "animated slideOutRight";
slidein = "animated slideInLeft";
}
var element = angular.element(document.getElementById("full-screen-event"));
element.addClass(slideout).one('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend', outWithOld);
-
-
- function outWithOld() {
+ function outWithOld()
+ {
NVRDataModel.log("ModalCtrl:Stopping network pull...");
NVRDataModel.stopNetwork("EventModalCtrl-out with old");
$scope.animationInProgress = true;
// give digest time for image to swap
// 100 should be enough
- $timeout(function() {
+ $timeout(function()
+ {
element.removeClass(slideout);
element.addClass(slidein)
.one('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend', inWithNew);
@@ -1196,7 +1277,8 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
}, 200);
}
- function inWithNew() {
+ function inWithNew()
+ {
element.removeClass(slidein);
$scope.animationInProgress = false;
carouselUtils.setStop(false);
@@ -1204,7 +1286,8 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
}
- function humanizeTime(str) {
+ function humanizeTime(str)
+ {
// if (NVRDataModel.getLogin().useLocalTimeZone)
return moment.tz(str, NVRDataModel.getTimeZoneNow()).fromNow();
// else
@@ -1212,12 +1295,14 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
}
- function jumpToEventZms(connkey, dirn) {
+ function jumpToEventZms(connkey, dirn)
+ {
+ if ($scope.defaultVideo !== undefined && $scope.defaultVideo != '')
+ {
- if ($scope.defaultVideo !== undefined && $scope.defaultVideo != '') {
-
- $ionicLoading.show({
+ $ionicLoading.show(
+ {
template: $translate.instant('kEventNavVidFeeds'),
noBackdrop: true,
duration: 3000
@@ -1229,7 +1314,8 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
$scope.d_eventId = "...";
NVRDataModel.debug("Sending " + cmd + " to " + connkey);
- $ionicLoading.show({
+ $ionicLoading.show(
+ {
template: $translate.instant('kSwitchingEvents') + "...",
noBackdrop: true,
duration: zm.httpTimeout
@@ -1238,17 +1324,20 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
//console.log("Send command connkey: " + connkey);
sendCommand(cmd, connkey)
.then(
- function(success) {
+ function(success)
+ {
//console.log ("jump success " + JSON.stringify(success));
$ionicLoading.hide();
},
- function(error) {
+ function(error)
+ {
NVRDataModel.debug("Hmm jump error " + JSON.stringify(error));
NVRDataModel.stopNetwork("EventModalCtrl-jumptoEventZms error");
$scope.connKey = (Math.floor((Math.random() * 999999) + 1)).toString();
// console.log ("********* OFFSET FROM JUMPTOEVENTZMS ERROR");
- $timeout(function() {
+ $timeout(function()
+ {
sendCommand('14', $scope.connKey, '&offset=' + $scope.currentProgress.progress);
}, 500);
NVRDataModel.debug("so I'm regenerating Connkey to " + $scope.connKey);
@@ -1258,23 +1347,24 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
});
var slidein;
var slideout;
- if (dirn == 1) {
+ if (dirn == 1)
+ {
slideout = "animated slideOutLeft";
slidein = "animated slideInRight";
- } else {
+ }
+ else
+ {
slideout = "animated slideOutRight";
slidein = "animated slideInLeft";
}
var element = angular.element(document.getElementById("full-screen-event"));
element.addClass(slideout).one('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend', outWithOld);
+ function outWithOld()
+ {
-
- function outWithOld() {
-
-
-
- $timeout(function() {
+ $timeout(function()
+ {
element.removeClass(slideout);
element.addClass(slidein)
.one('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend', inWithNew);
@@ -1282,20 +1372,20 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
}, 200);
}
- function inWithNew() {
+ function inWithNew()
+ {
element.removeClass(slidein);
-
}
}
-
//--------------------------------------------------------
// utility function
//--------------------------------------------------------
- function computeRelativePath(event) {
+ function computeRelativePath(event)
+ {
var relativePath = "";
var loginData = NVRDataModel.getLogin();
var str = event.Event.StartTime;
@@ -1320,7 +1410,8 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
// utility function
//--------------------------------------------------------
- function computeBasePath(event) {
+ function computeBasePath(event)
+ {
var basePath = "";
var loginData = NVRDataModel.getLogin();
var str = event.Event.StartTime;
@@ -1342,42 +1433,48 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
return basePath;
}
-
//-------------------------------------------------------------------------
// Called when rncarousel or video player finished playing event
//-------------------------------------------------------------------------
- $scope.playbackFinished = function() {
+ $scope.playbackFinished = function()
+ {
playbackFinished();
};
- function playbackFinished() {
+ function playbackFinished()
+ {
// currentEvent is updated with the currently playing event in prepareModalEvent()
NVRDataModel.log("Playback of event " + currentEvent.Event.Id + " is finished");
- if ($scope.loginData.gapless) {
+ if ($scope.loginData.gapless)
+ {
neighborEvents(currentEvent.Event.Id)
- .then(function(success) {
+ .then(function(success)
+ {
// lets give a second before gapless transition to the next event
- $timeout(function() {
+ $timeout(function()
+ {
$scope.nextId = success.next;
$scope.prevId = success.prev;
NVRDataModel.debug("Gapless move to event " + $scope.nextId);
jumpToEvent($scope.nextId, 1);
}, 1000);
},
- function(error) {
+ function(error)
+ {
NVRDataModel.debug("Error in neighbor call " +
JSON.stringify(error));
});
- } else {
+ }
+ else
+ {
NVRDataModel.debug("not going to next event, gapless is off");
}
}
-
//--------------------------------------------------------
// Called by openModal as well as jump to event
// what it basically does is get a detailed event API
@@ -1387,10 +1484,8 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
// API. Some parameters are repeated across both
//--------------------------------------------------------
-
-
-
- function prepareModalEvent(eid) {
+ function prepareModalEvent(eid)
+ {
// Lets get the detailed event API
var loginData = NVRDataModel.getLogin();
@@ -1399,8 +1494,8 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
$scope.humanizeTime = "...";
$scope.mName = "...";
$http.get(myurl)
- .then(function(success) {
-
+ .then(function(success)
+ {
// console.log ("DUCCESS::"+JSON.stringify(success));
var event = success.data.event;
@@ -1435,22 +1530,20 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
//console.log("Event ID is " + $scope.eventId);
//console.log("video is " + $scope.defaultVideo);
-
neighborEvents(event.Event.Id)
- .then(function(success) {
+ .then(function(success)
+ {
$scope.nextId = success.next;
$scope.prevId = success.prev;
},
- function(error) {
+ function(error)
+ {
//console.log(JSON.stringify(error));
});
$scope.nextId = "...";
$scope.prevId = "...";
-
-
-
event.Event.video = {};
var videoURL;
@@ -1472,15 +1565,16 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
//console.log("************** VIDEO IS " + videoURL);
-
$scope.videoObject = {
- config: {
+ config:
+ {
autoPlay: true,
responsive: false,
nativeControls: false,
playsInline: true,
- sources: [{
+ sources: [
+ {
src: $sce.trustAsResourceUrl(videoURL),
type: "video/mp4"
}
@@ -1512,31 +1606,38 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
realtime: true,
step: 1,
className: "mySliderClass",
- callback: function(value, released) {
+ callback: function(value, released)
+ {
//console.log("CALLBACK"+value+released);
$ionicScrollDelegate.freezeScroll(!released);
-
},
//modelLabels:function(val) {return "";},
smooth: false,
- css: {
- background: {
+ css:
+ {
+ background:
+ {
"background-color": "silver"
},
- before: {
+ before:
+ {
"background-color": "purple"
},
- default: {
+ default:
+ {
"background-color": "white"
}, // default value: 1px
- after: {
+ after:
+ {
"background-color": "green"
}, // zone after default value
- pointer: {
+ pointer:
+ {
"background-color": "red"
}, // circle pointer
- range: {
+ range:
+ {
"background-color": "red"
} // use it if double value
},
@@ -1544,8 +1645,6 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
};
-
-
$scope.mycarousel.index = 0;
$scope.ionRange.index = 1;
$scope.eventSpeed = $scope.event.Event.Length / $scope.event.Event.Frames;
@@ -1553,16 +1652,17 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
//console.log("**Resetting range");
$scope.slides = [];
var i;
- for (i = 1; i <= event.Event.Frames; i++) {
+ for (i = 1; i <= event.Event.Frames; i++)
+ {
var fname = padToN(i, eventImageDigits) + "-capture.jpg";
// console.log ("Building " + fname);
- $scope.slides.push({
+ $scope.slides.push(
+ {
id: i,
img: fname
});
}
-
// now get event details to show alarm frames
//$scope.FrameArray = event.Frame;
@@ -1571,65 +1671,72 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
// lets
framearray.datasets[0].data = [];
- for (i = 0; i < event.Frame.length; i++) {
+ for (i = 0; i < event.Frame.length; i++)
+ {
var ts = moment(event.Frame[i].TimeStamp).format(timeFormat);
//console.log ("pushing s:" + event.Frame[i].Score+" t:"+ts);
- framearray.datasets[0].data.push({
+ framearray.datasets[0].data.push(
+ {
x: ts,
y: event.Frame[i].Score
});
framearray.labels.push("");
-
}
$scope.totalEventTime = Math.round(parseFloat(event.Event.Length)) - 1;
$scope.currentEventTime = 0;
// video mode doesn't need this graph - it won't really work
- if ($scope.defaultVideo == undefined || $scope.defaultVideo == '') {
- $timeout(function() {
+ if ($scope.defaultVideo == undefined || $scope.defaultVideo == '')
+ {
+ $timeout(function()
+ {
drawGraph();
}, 500);
}
-
},
- function(err) {
+ function(err)
+ {
NVRDataModel.log("Error retrieving detailed frame API " + JSON.stringify(err));
NVRDataModel.displayBanner('error', ['could not retrieve frame details', 'please try again']);
});
-
}
-
- if (typeof $scope.ionRange !== 'undefined') {
- $scope.$watch('ionRange.index', function() {
+ if (typeof $scope.ionRange !== 'undefined')
+ {
+ $scope.$watch('ionRange.index', function()
+ {
//
$scope.mycarousel.index = parseInt($scope.ionRange.index) - 1;
if (carouselUtils.getStop() == true)
return;
-
//console.log ("***ION RANGE CHANGED TO " + $scope.mycarousel.index);
});
}
- if (typeof $scope.mycarousel !== 'undefined') {
- $scope.$watch('mycarousel.index', function() {
+ if (typeof $scope.mycarousel !== 'undefined')
+ {
+ $scope.$watch('mycarousel.index', function()
+ {
- if (currentEvent && $scope.ionRange.index == parseInt(currentEvent.Event.Frames - 1)) {
+ if (currentEvent && $scope.ionRange.index == parseInt(currentEvent.Event.Frames - 1))
+ {
playbackFinished();
}
// end of playback from quick scrub
// so ignore gapless
- if ($scope.event && $scope.ionRange.index == parseInt($scope.event.Event.Frames) - 1) {
- if (!$scope.modal || $scope.modal.isShown() == false) {
+ if ($scope.event && $scope.ionRange.index == parseInt($scope.event.Event.Frames) - 1)
+ {
+ if (!$scope.modal || $scope.modal.isShown() == false)
+ {
// console.log("quick scrub playback over");
carouselUtils.setStop(true);
$scope.ionRange.index = 0;
@@ -1642,28 +1749,28 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
$scope.ionRange.index = ($scope.mycarousel.index + 1).toString();
// console.log ("***IONRANGE RANGE CHANGED TO " + $scope.ionRange.index);
-
});
}
- function padToN(number, digits) {
+ function padToN(number, digits)
+ {
var i;
var stringMax = "";
var stringLeading = "";
- for (i = 1; i <= digits; i++) {
+ for (i = 1; i <= digits; i++)
+ {
stringMax = stringMax + "9";
if (i != digits) stringLeading = stringLeading + "0";
}
var numMax = parseInt(stringMax);
- if (number <= numMax) {
+ if (number <= numMax)
+ {
number = (stringLeading + number).slice(-digits);
}
//console.log ("PADTON: returning " + number);
return number;
}
-
-
}]);
diff --git a/www/js/EventServer.js b/www/js/EventServer.js
index 8ea63531..8ea89c4e 100644
--- a/www/js/EventServer.js
+++ b/www/js/EventServer.js
@@ -1,6 +1,5 @@
/* jshint -W041 */
-
/* jslint browser: true*/
/* global cordova,StatusBar,angular,console ,PushNotification*/
@@ -10,8 +9,8 @@
//--------------------------------------------------------------------------
angular.module('zmApp.controllers')
-.factory('EventServer', ['NVRDataModel', '$rootScope', '$websocket', '$ionicPopup', '$timeout', '$q', 'zm', '$ionicPlatform', '$cordovaMedia', '$translate', function
- (NVRDataModel, $rootScope, $websocket, $ionicPopup, $timeout, $q, zm, $ionicPlatform, $cordovaMedia, $translate) {
+ .factory('EventServer', ['NVRDataModel', '$rootScope', '$websocket', '$ionicPopup', '$timeout', '$q', 'zm', '$ionicPlatform', '$cordovaMedia', '$translate', function(NVRDataModel, $rootScope, $websocket, $ionicPopup, $timeout, $q, zm, $ionicPlatform, $cordovaMedia, $translate)
+ {
var lastEventServerCheck = Date.now();
var ws;
@@ -19,24 +18,27 @@ angular.module('zmApp.controllers')
var localNotificationId = 0;
var firstError = true;
-
//--------------------------------------------------------------------------
// called when the websocket is opened
//--------------------------------------------------------------------------
- function openHandshake() {
+ function openHandshake()
+ {
var loginData = NVRDataModel.getLogin();
- if (loginData.isUseEventServer == false || loginData.eventServer == "") {
+ if (loginData.isUseEventServer == false || loginData.eventServer == "")
+ {
NVRDataModel.log("openHandShake: no event server");
return;
}
NVRDataModel.log("openHandshake: Websocket open");
- ws.$emit('auth', {
+ ws.$emit('auth',
+ {
user: loginData.username,
password: loginData.password
});
- if ($rootScope.apnsToken != '') {
+ if ($rootScope.apnsToken != '')
+ {
var plat = $ionicPlatform.is('ios') ? 'ios' : 'android';
var ld = NVRDataModel.getLogin();
var pushstate = "enabled";
@@ -44,7 +46,8 @@ angular.module('zmApp.controllers')
pushstate = "disabled";
NVRDataModel.debug("openHandShake: state of push is " + pushstate);
- ws.$emit('push', {
+ ws.$emit('push',
+ {
type: 'token',
platform: plat,
token: $rootScope.apnsToken,
@@ -54,15 +57,12 @@ angular.module('zmApp.controllers')
}
-
-
//--------------------------------------------------------------------------
// Called once at app start. Does a lazy definition of websockets open
//--------------------------------------------------------------------------
- function init() {
-
-
-
+ function init()
+ {
+
$rootScope.isAlarm = 0;
$rootScope.alarmCount = "0";
@@ -72,7 +72,8 @@ angular.module('zmApp.controllers')
//console.log ("INIT GOT " + JSON.stringify(loginData));
- if (loginData.isUseEventServer == false || !loginData.eventServer) {
+ if (loginData.isUseEventServer == false || !loginData.eventServer)
+ {
NVRDataModel.log("No Event Server present. Not initializing");
d.reject("false");
return d.promise;
@@ -81,63 +82,65 @@ angular.module('zmApp.controllers')
//if (!$rootScope.apnsToken)
pushInit();
-
-
- if (typeof ws !== 'undefined') {
+ if (typeof ws !== 'undefined')
+ {
NVRDataModel.debug("Event server already initialized");
d.resolve("true");
return d.promise;
}
-
NVRDataModel.log("Initializing Websocket with URL " +
loginData.eventServer + " , will connect later...");
- ws = $websocket.$new({
+ ws = $websocket.$new(
+ {
url: loginData.eventServer,
reconnect: true,
reconnectInterval: 60000,
lazy: true
});
-
-
// Transmit auth information to server
ws.$on('$open', openHandshake);
- NVRDataModel.debug ("Setting up websocket error handler" );
- ws.$on('$error', function (e){
-
+ NVRDataModel.debug("Setting up websocket error handler");
+ ws.$on('$error', function(e)
+ {
+
// we don't need this check as I changed reconnect interval to 60s
//if ((Date.now() - lastEventServerCheck > 30000.0) || firstError)
if (1)
{
- NVRDataModel.debug ("Websocket Errorhandler called");
- $timeout( function(){
- NVRDataModel.displayBanner('error',['Event Server connection error']);
- },3000); // leave 3 seconds for transitions
+ NVRDataModel.debug("Websocket Errorhandler called");
+ $timeout(function()
+ {
+ NVRDataModel.displayBanner('error', ['Event Server connection error']);
+ }, 3000); // leave 3 seconds for transitions
firstError = false;
lastEventServerCheck = Date.now();
}
//console.log ("VALUE TIME " + lastEventServerCheck);
//console.log ("NOW TIME " + Date.now());
- });
+ });
- ws.$on('$close', function () {
+ ws.$on('$close', function()
+ {
NVRDataModel.log("Websocket closed");
});
// Handles responses back from ZM ES
- ws.$on('$message', function (str) {
+ ws.$on('$message', function(str)
+ {
NVRDataModel.log("Real-time event: " + JSON.stringify(str));
-
// Error messages
- if (str.status != 'Success') {
+ if (str.status != 'Success')
+ {
NVRDataModel.log("Event Error: " + JSON.stringify(str));
- if (str.reason == 'APNSDISABLED') {
+ if (str.reason == 'APNSDISABLED')
+ {
ws.$close();
NVRDataModel.displayBanner('error', ['Event Server: APNS disabled'], 2000, 6000);
$rootScope.apnsToken = "";
@@ -145,11 +148,14 @@ angular.module('zmApp.controllers')
}
- if (str.status == 'Success' && (str.event == 'auth')) {
+ if (str.status == 'Success' && (str.event == 'auth'))
+ {
if (str.version == undefined)
str.version = "0.1";
- if (NVRDataModel.versionCompare(str.version, zm.minEventServerVersion) == -1) {
- $rootScope.zmPopup = $ionicPopup.alert({
+ if (NVRDataModel.versionCompare(str.version, zm.minEventServerVersion) == -1)
+ {
+ $rootScope.zmPopup = $ionicPopup.alert(
+ {
title: $translate.instant('kEventServerVersionTitle'),
template: $translate.instant('kEventServerVersionBody1') + " " + str.version + ". " + $translate.instant('kEventServerVersionBody2') +
zm.minEventServerVersion
@@ -158,60 +164,69 @@ angular.module('zmApp.controllers')
}
-
-
-
if (str.status == 'Success' && str.event == 'alarm') // new events
{
var localNotText;
// ZMN specific hack for Event Server
- if (str.supplementary != 'true') {
+ if (str.supplementary != 'true')
+ {
new Audio('sounds/blop.mp3').play();
localNotText = "Latest Alarms: ";
$rootScope.isAlarm = 1;
// Show upto a max of 99 when it comes to display
// so aesthetics are maintained
- if ($rootScope.alarmCount == "99") {
+ if ($rootScope.alarmCount == "99")
+ {
$rootScope.alarmCount = "99+";
}
- if ($rootScope.alarmCount != "99+") {
+ if ($rootScope.alarmCount != "99+")
+ {
$rootScope.alarmCount = (parseInt($rootScope.alarmCount) + 1).toString();
}
- } else {
+ }
+ else
+ {
NVRDataModel.debug("received supplementary event information over websockets");
}
var eventsToDisplay = [];
var listOfMonitors = [];
- for (var iter = 0; iter < str.events.length; iter++) {
+ for (var iter = 0; iter < str.events.length; iter++)
+ {
// lets stack the display so they don't overwrite
eventsToDisplay.push(str.events[iter].Name + ": latest new alarm (" + str.events[iter].EventId + ")");
localNotText = localNotText + str.events[iter].Name + ",";
listOfMonitors.push(str.events[iter].MonitorId);
-
}
localNotText = localNotText.substring(0, localNotText.length - 1);
// if we are in background, do a local notification, else do an in app display
- if (!NVRDataModel.isBackground()) {
+ if (!NVRDataModel.isBackground())
+ {
//emit alarm details - this is when received over websockets
- $rootScope.$emit('alarm', {
+ $rootScope.$emit('alarm',
+ {
message: listOfMonitors
});
- if (str.supplementary != 'true') {
+ if (str.supplementary != 'true')
+ {
NVRDataModel.debug("App is in foreground, displaying banner");
- if (eventsToDisplay.length > 0) {
+ if (eventsToDisplay.length > 0)
+ {
- if (eventsToDisplay.length == 1) {
+ if (eventsToDisplay.length == 1)
+ {
//console.log("Single Display: " + eventsToDisplay[0]);
NVRDataModel.displayBanner('alarm', [eventsToDisplay[0]], 5000, 5000);
- } else {
+ }
+ else
+ {
NVRDataModel.displayBanner('alarm', eventsToDisplay,
5000, 5000 * eventsToDisplay.length);
}
@@ -220,21 +235,16 @@ angular.module('zmApp.controllers')
}
}
-
-
} //end of success handler
-
-
-
-
});
d.resolve("true");
return (d.promise);
}
- function disconnect() {
+ function disconnect()
+ {
NVRDataModel.log("Disconnecting and deleting Event Server socket...");
if (typeof ws === 'undefined')
@@ -256,28 +266,30 @@ angular.module('zmApp.controllers')
// you turn off ES and then we need sendMessage to
// let ZMES know not to send us messages
//--------------------------------------------------------------------------
- function sendMessage(type, obj, isForce) {
+ function sendMessage(type, obj, isForce)
+ {
var ld = NVRDataModel.getLogin();
- if (ld.isUseEventServer == false && isForce != 1) {
+ if (ld.isUseEventServer == false && isForce != 1)
+ {
NVRDataModel.debug("Not sending WSS message as event server is off");
return;
}
-
- if (typeof ws === 'undefined') {
+ if (typeof ws === 'undefined')
+ {
NVRDataModel.debug("Event server not initalized, not sending message");
return;
}
-
- if (ws.$status() == ws.$CLOSED) {
+ if (ws.$status() == ws.$CLOSED)
+ {
NVRDataModel.log("Websocket was closed, trying to re-open");
ws.$un('$open');
//ws.$on ('$open', openHandshake);
ws.$open();
-
- ws.$on('$open', openHandshake, function () {
+ ws.$on('$open', openHandshake, function()
+ {
//console.log(" sending " + type + " " +
// JSON.stringify(obj));
@@ -286,33 +298,35 @@ angular.module('zmApp.controllers')
ws.$un('$open');
ws.$on('$open', openHandshake);
-
});
-
- } else {
+ }
+ else
+ {
ws.$emit(type, obj);
//console.log("sending " + type + " " + JSON.stringify(obj));
}
-
-
}
//--------------------------------------------------------------------------
// Called each time we resume
//--------------------------------------------------------------------------
- function refresh() {
+ function refresh()
+ {
var loginData = NVRDataModel.getLogin();
- if ((!loginData.eventServer) || (loginData.isUseEventServer == false)) {
+ if ((!loginData.eventServer) || (loginData.isUseEventServer == false))
+ {
NVRDataModel.log("No Event Server configured, skipping refresh");
// Let's also make sure that if the socket was open
// we close it - this may happen if you disable it after using it
- if (typeof ws !== 'undefined') {
- if (ws.$status() != ws.$CLOSED) {
+ if (typeof ws !== 'undefined')
+ {
+ if (ws.$status() != ws.$CLOSED)
+ {
NVRDataModel.debug("Closing open websocket as event server was disabled");
ws.$close();
}
@@ -321,7 +335,8 @@ angular.module('zmApp.controllers')
return;
}
- if (typeof ws === 'undefined') {
+ if (typeof ws === 'undefined')
+ {
NVRDataModel.debug("Calling websocket init");
init();
}
@@ -333,16 +348,16 @@ angular.module('zmApp.controllers')
// c) The network died
// Seems to me in all cases we should give re-open a shot
-
- if (ws.$status() == ws.$CLOSED) {
+ if (ws.$status() == ws.$CLOSED)
+ {
NVRDataModel.log("Websocket was closed, trying to re-open");
ws.$open();
}
-
}
- function pushInit() {
+ function pushInit()
+ {
NVRDataModel.log(">>>Setting up push registration");
var push;
var mediasrc;
@@ -351,20 +366,20 @@ angular.module('zmApp.controllers')
var plat = $ionicPlatform.is('ios') ? 'ios' : 'android';
-
- if ($rootScope.platformOS == 'desktop') {
+ if ($rootScope.platformOS == 'desktop')
+ {
NVRDataModel.log("Desktop instance, not setting up push. Websockets only, I hope");
return;
}
-
-
- if (plat == 'ios') {
+ if (plat == 'ios')
+ {
mediasrc = "sounds/blop.mp3";
push = PushNotification.init(
{
- "ios": {
+ "ios":
+ {
"alert": true,
"badge": true,
"sound": ld.soundOnPush,
@@ -374,17 +389,17 @@ angular.module('zmApp.controllers')
);
- } else {
+ }
+ else
+ {
mediasrc = "/android_asset/www/sounds/blop.mp3";
var android_media_file = "blop";
-
-
-
push = PushNotification.init(
{
- "android": {
+ "android":
+ {
"senderID": zm.gcmSenderId,
"icon": "ic_stat_notification",
sound: ld.soundOnPush,
@@ -395,13 +410,13 @@ angular.module('zmApp.controllers')
);
-
}
// console.log("*********** MEDIA BLOG IS " + mediasrc);
media = $cordovaMedia.newMedia(mediasrc);
- push.on('registration', function (data) {
+ push.on('registration', function(data)
+ {
NVRDataModel.debug("Push Notification registration ID received: " + JSON.stringify(data));
$rootScope.apnsToken = data.registrationId;
@@ -411,29 +426,30 @@ angular.module('zmApp.controllers')
if (ld.disablePush == true)
pushstate = "disabled";
- sendMessage('push', {
+ sendMessage('push',
+ {
type: 'token',
platform: plat,
token: $rootScope.apnsToken,
state: pushstate
}, 1);
-
});
-
- push.on('notification', function (data) {
+ push.on('notification', function(data)
+ {
NVRDataModel.debug("received push notification");
var ld = NVRDataModel.getLogin();
- if (ld.isUseEventServer == false) {
+ if (ld.isUseEventServer == false)
+ {
NVRDataModel.debug("received push notification, but event server disabled. Not acting on it");
return;
}
-
- if (data.additionalData.foreground == false) {
+ if (data.additionalData.foreground == false)
+ {
// This means push notification tap in background
NVRDataModel.debug("*** PUSH NOTFN.>>>>" + JSON.stringify(data));
@@ -449,7 +465,8 @@ angular.module('zmApp.controllers')
// if Multiple mids, take the first one
var mi = mid.indexOf(',');
- if (mi > 0) {
+ if (mi > 0)
+ {
mid = mid.slice(0, mi);
}
mid = parseInt(mid);
@@ -457,23 +474,26 @@ angular.module('zmApp.controllers')
$rootScope.tappedMid = mid;
NVRDataModel.log("Push notification: Tapped Monitor taken as:" + $rootScope.tappedMid);
-
-
- if ($rootScope.platformOS == 'ios') {
-
+ if ($rootScope.platformOS == 'ios')
+ {
NVRDataModel.debug("iOS only: clearing background push");
- push.finish(function () {
+ push.finish(function()
+ {
NVRDataModel.debug("processing of push data is finished");
});
}
- } else {
+ }
+ else
+ {
// this flag honors the HW mute button. Go figure
// http://ilee.co.uk/phonegap-plays-sound-on-mute/
- if (ld.soundOnPush) {
- media.play({
+ if (ld.soundOnPush)
+ {
+ media.play(
+ {
playAudioWhenScreenIsLocked: false
});
}
@@ -482,25 +502,25 @@ angular.module('zmApp.controllers')
// console.log ("***STRING: " + str + " " +str.status);
var eventsToDisplay = [];
-
-
NVRDataModel.displayBanner('alarm', [str], 0, 5000 * eventsToDisplay.length);
-
$rootScope.isAlarm = 1;
// Show upto a max of 99 when it comes to display
// so aesthetics are maintained
- if ($rootScope.alarmCount == "99") {
+ if ($rootScope.alarmCount == "99")
+ {
$rootScope.alarmCount = "99+";
}
- if ($rootScope.alarmCount != "99+") {
+ if ($rootScope.alarmCount != "99+")
+ {
$rootScope.alarmCount = (parseInt($rootScope.alarmCount) + 1).toString();
}
}
});
- push.on('error', function (e) {
+ push.on('error', function(e)
+ {
NVRDataModel.debug("Push error: " + JSON.stringify(e));
// console.log("************* PUSH ERROR ******************");
});
@@ -515,5 +535,4 @@ angular.module('zmApp.controllers')
};
-
-}]); \ No newline at end of file
+ }]);
diff --git a/www/js/EventServerSettingsCtrl.js b/www/js/EventServerSettingsCtrl.js
index 7bee989d..064c785f 100644
--- a/www/js/EventServerSettingsCtrl.js
+++ b/www/js/EventServerSettingsCtrl.js
@@ -2,46 +2,51 @@
/* jslint browser: true*/
/* global cordova,StatusBar,angular,console */
- angular.module('zmApp.controllers').controller('zmApp.EventServerSettingsCtrl', ['$scope', '$ionicSideMenuDelegate', 'zm', '$stateParams', 'EventServer', '$ionicHistory', '$rootScope', '$state', 'message', 'NVRDataModel', '$ionicPlatform', '$ionicPopup', '$timeout', '$translate', function ($scope, $ionicSideMenuDelegate, zm, $stateParams, EventServer, $ionicHistory, $rootScope, $state, message, NVRDataModel, $ionicPlatform, $ionicPopup, $timeout, $translate) {
- $scope.openMenu = function () {
+ angular.module('zmApp.controllers').controller('zmApp.EventServerSettingsCtrl', ['$scope', '$ionicSideMenuDelegate', 'zm', '$stateParams', 'EventServer', '$ionicHistory', '$rootScope', '$state', 'message', 'NVRDataModel', '$ionicPlatform', '$ionicPopup', '$timeout', '$translate', function($scope, $ionicSideMenuDelegate, zm, $stateParams, EventServer, $ionicHistory, $rootScope, $state, message, NVRDataModel, $ionicPlatform, $ionicPopup, $timeout, $translate)
+ {
+ $scope.openMenu = function()
+ {
$ionicSideMenuDelegate.toggleLeft();
};
-
- $scope.openMenu = function () {
+ $scope.openMenu = function()
+ {
$ionicSideMenuDelegate.toggleLeft();
};
-
//----------------------------------------------------------------
// Alarm notification handling
//----------------------------------------------------------------
- $scope.handleAlarms = function () {
+ $scope.handleAlarms = function()
+ {
$rootScope.isAlarm = !$rootScope.isAlarm;
- if (!$rootScope.isAlarm) {
+ if (!$rootScope.isAlarm)
+ {
$rootScope.alarmCount = "0";
- $ionicHistory.nextViewOptions({
+ $ionicHistory.nextViewOptions(
+ {
disableBack: true
});
-
- $state.go("events", {
+ $state.go("events",
+ {
"id": 0,
- "playEvent":false
- }, {
+ "playEvent": false
+ },
+ {
reload: true
});
return;
}
};
-
// we need this to dynamically get title
// name as ion-view is set in stone and
// we don't get title till beforeEnter
// which is odd - I'd expect beforeEnter to load
// before View is loaded
- $scope.getTitle = function () {
+ $scope.getTitle = function()
+ {
return $scope.loginData.serverName;
};
@@ -49,38 +54,39 @@
// Save anyway when you exit
//----------------------------------------------------------------
- $scope.$on('$ionicView.beforeLeave', function () {
+ $scope.$on('$ionicView.beforeLeave', function()
+ {
saveItems();
-
});
-
- $scope.$on('$ionicView.beforeEnter', function () {
+ $scope.$on('$ionicView.beforeEnter', function()
+ {
$scope.loginData = NVRDataModel.getLogin();
//console.log ("Event server - before Enter, loginData is " + JSON.stringify($scope.loginData));
$scope.defScreen = $scope.loginData.onTapScreen;
- if ($scope.loginData.eventServer == "") {
+ if ($scope.loginData.eventServer == "")
+ {
$scope.loginData.eventServer = "wss://" + extractDomain($scope.loginData.url) + ":9000";
}
-
-
res = $scope.loginData.eventServerMonitors.split(",");
minterval = $scope.loginData.eventServerInterval.split(",");
+ for (var i = 0; i < $scope.monitors.length; i++)
+ {
- for (var i = 0; i < $scope.monitors.length; i++) {
-
-
- if (!isEnabled($scope.monitors[i].Monitor.Id)) {
+ if (!isEnabled($scope.monitors[i].Monitor.Id))
+ {
// if the filter list has IDs and this is not part of it, uncheck it
$scope.monitors[i].Monitor.isChecked = false;
//console.log("Marking false");
$scope.monitors[i].Monitor.reportingInterval = 0;
- } else {
+ }
+ else
+ {
// console.log("Marking true");
$scope.monitors[i].Monitor.isChecked = true;
$scope.monitors[i].Monitor.reportingInterval = getInterval($scope.monitors[i].Monitor.Id);
@@ -89,14 +95,12 @@
}
});
-
//--------------------------------------------------
// notification tap action
//--------------------------------------------------
-
-
- $scope.selectScreen = function () {
+ $scope.selectScreen = function()
+ {
var ld = NVRDataModel.getLogin();
@@ -104,62 +108,62 @@
selectedState: ld.onTapScreen
};
-
var options = '<ion-radio-fix ng-model="myopt.selectedState" ng-value="\'' + $translate.instant('kTapEvents') + '\'">' + $translate.instant('kTapEvents') + '</ion-radio-fix>';
options += '<ion-radio-fix ng-model="myopt.selectedState" ng-value="\'' + $translate.instant('kTapMontage') + '\'">' + $translate.instant('kTapMontage') + '</ion-radio-fix>';
options += '<ion-radio-fix ng-model="myopt.selectedState" ng-value="\'' + $translate.instant('kTapLiveMonitor') + '\'">' + $translate.instant('kTapLiveMonitor') + '</ion-radio-fix>';
-
-
- $rootScope.zmPopup = $ionicPopup.show({
+ $rootScope.zmPopup = $ionicPopup.show(
+ {
scope: $scope,
template: options,
-
title: 'View to navigate to:',
subTitle: 'currently set to: ' + ld.onTapScreen,
buttons: [
- {
- text: $translate.instant('kButtonCancel'),
-
+ {
+ text: $translate.instant('kButtonCancel'),
- },
+ },
+ {
+ text: $translate.instant('kButtonOk'),
+ onTap: function(e)
{
- text: $translate.instant('kButtonOk'),
- onTap: function (e) {
-
- ld.onTapScreen = $scope.myopt.selectedState;
- NVRDataModel.log("Setting new onTap State:" + ld.onTapScreen);
- NVRDataModel.setLogin(ld);
- $scope.defScreen = $scope.myopt.selectedState;
- $scope.loginData = ld;
+ ld.onTapScreen = $scope.myopt.selectedState;
+ NVRDataModel.log("Setting new onTap State:" + ld.onTapScreen);
+ NVRDataModel.setLogin(ld);
+ $scope.defScreen = $scope.myopt.selectedState;
+ $scope.loginData = ld;
- }
- }
- ]
+ }
+ }]
});
-
};
//----------------------------------------------------------------
// Accordion list show/hide
//----------------------------------------------------------------
- $scope.toggleGroup = function (group) {
- if ($scope.isGroupShown(group)) {
+ $scope.toggleGroup = function(group)
+ {
+ if ($scope.isGroupShown(group))
+ {
$scope.shownGroup = null;
- } else {
+ }
+ else
+ {
$scope.shownGroup = group;
}
};
- $scope.isGroupShown = function (group) {
+ $scope.isGroupShown = function(group)
+ {
return $scope.shownGroup === group;
};
- $scope.saveItems = function () {
+ $scope.saveItems = function()
+ {
saveItems();
};
@@ -167,16 +171,20 @@
// Saves ES data
//----------------------------------------------------------------
- function saveItems() {
+ function saveItems()
+ {
NVRDataModel.debug("Saving Event Server data");
var monstring = "";
var intervalstring = "";
var plat = $ionicPlatform.is('ios') ? 'ios' : 'android';
- for (var i = 0; i < $scope.monitors.length; i++) {
- if (isNaN($scope.monitors[i].Monitor.reportingInterval)) {
+ for (var i = 0; i < $scope.monitors.length; i++)
+ {
+ if (isNaN($scope.monitors[i].Monitor.reportingInterval))
+ {
$scope.monitors[i].Monitor.reportingInterval = 0;
}
- if ($scope.monitors[i].Monitor.isChecked) {
+ if ($scope.monitors[i].Monitor.isChecked)
+ {
monstring = monstring + $scope.monitors[i].Monitor.Id + ",";
var tint = parseInt($scope.monitors[i].Monitor.reportingInterval);
if (isNaN(tint)) tint = 0;
@@ -194,7 +202,6 @@
$scope.loginData.eventServerMonitors = monstring;
$scope.loginData.eventServerInterval = intervalstring;
-
//console.log ("SAVED: " + JSON.stringify($scope.loginData));
NVRDataModel.setLogin($scope.loginData);
@@ -202,12 +209,15 @@
if ($scope.loginData.disablePush == true || $scope.loginData.isUseEventServer == false)
pushstate = "disabled";
- if ($scope.loginData.isUseEventServer == true) {
+ if ($scope.loginData.isUseEventServer == true)
+ {
EventServer.init()
- .then(function (data) {
+ .then(function(data)
+ {
// console.log("Sending control filter");
NVRDataModel.debug("Sending Control message 'filter' with monlist=" + monstring + " and interval=" + intervalstring);
- EventServer.sendMessage("control", {
+ EventServer.sendMessage("control",
+ {
type: 'filter',
monlist: monstring,
intlist: intervalstring
@@ -220,7 +230,8 @@
{
// we need to disable the token
NVRDataModel.debug("Sending token state " + pushstate);
- EventServer.sendMessage('push', {
+ EventServer.sendMessage('push',
+ {
type: 'token',
platform: plat,
token: $rootScope.apnsToken,
@@ -229,12 +240,11 @@
}
-
});
-
-
- } else {
+ }
+ else
+ {
if ($rootScope.apnsToken != "")
// if its defined then this is post init work
// so lets transmit state here
@@ -242,7 +252,8 @@
{
// we need to disable the token
NVRDataModel.debug("Sending token state " + pushstate);
- EventServer.sendMessage('push', {
+ EventServer.sendMessage('push',
+ {
type: 'token',
platform: plat,
token: $rootScope.apnsToken,
@@ -254,11 +265,8 @@
EventServer.disconnect();
-
}
-
-
NVRDataModel.displayBanner('info', ['settings saved']);
}
@@ -266,12 +274,16 @@
// returns domain name in string -
// http://stackoverflow.com/questions/8498592/extract-root-domain-name-from-string
//----------------------------------------------------------------
- function extractDomain(url) {
+ function extractDomain(url)
+ {
var domain;
//find & remove protocol (http, ftp, etc.) and get domain
- if (url.indexOf("://") > -1) {
+ if (url.indexOf("://") > -1)
+ {
domain = url.split('/')[2];
- } else {
+ }
+ else
+ {
domain = url.split('/')[0];
}
@@ -281,18 +293,20 @@
return domain;
}
-
//----------------------------------------------------------------
// returns reporting interval for monitor ID
//----------------------------------------------------------------
- function getInterval(id) {
+ function getInterval(id)
+ {
// means no interval, should only happen one time
// till we save
if ($scope.loginData.eventServerInterval == "")
return 0;
var retval = 0;
- for (var i = 0; i < res.length; i++) {
- if (res[i] == id) {
+ for (var i = 0; i < res.length; i++)
+ {
+ if (res[i] == id)
+ {
retval = parseInt(minterval[i]);
break;
}
@@ -303,13 +317,16 @@
//----------------------------------------------------------------
// Returns true/false if monitor ID is in event monitor list
//----------------------------------------------------------------
- function isEnabled(id) {
+ function isEnabled(id)
+ {
if ($scope.loginData.eventServerMonitors == "")
return true;
var isThere = false;
- for (var i = 0; i < res.length; i++) {
- if (res[i] == id) {
+ for (var i = 0; i < res.length; i++)
+ {
+ if (res[i] == id)
+ {
isThere = true;
//console.log("isRes found: " + id);
break;
@@ -325,11 +342,4 @@
$scope.monitors = message;
var res, minterval;
-
-
-
-
-
-
-
-}]); \ No newline at end of file
+ }]);
diff --git a/www/js/EventsGraphsCtrl.js b/www/js/EventsGraphsCtrl.js
index 19d963ea..5f21b09b 100644
--- a/www/js/EventsGraphsCtrl.js
+++ b/www/js/EventsGraphsCtrl.js
@@ -8,31 +8,38 @@
// the main function is generateChart. I call generate chart with required parameters
// from the template file
-angular.module('zmApp.controllers').controller('zmApp.EventsGraphsCtrl', ['$ionicPlatform', '$scope', 'zm', 'NVRDataModel', '$ionicSideMenuDelegate', '$rootScope', '$http', '$ionicHistory', '$state', function ($ionicPlatform, $scope, zm, NVRDataModel, $ionicSideMenuDelegate, $rootScope, $http, $ionicHistory, $state) {
+angular.module('zmApp.controllers').controller('zmApp.EventsGraphsCtrl', ['$ionicPlatform', '$scope', 'zm', 'NVRDataModel', '$ionicSideMenuDelegate', '$rootScope', '$http', '$ionicHistory', '$state', function($ionicPlatform, $scope, zm, NVRDataModel, $ionicSideMenuDelegate, $rootScope, $http, $ionicHistory, $state)
+{
//console.log("Inside Graphs controller");
- $scope.openMenu = function () {
+ $scope.openMenu = function()
+ {
$ionicSideMenuDelegate.toggleLeft();
};
- $scope.$on('$ionicView.loaded', function () {
+ $scope.$on('$ionicView.loaded', function()
+ {
// console.log("**VIEW ** Graph Ctrl Loaded");
});
-
//----------------------------------------------------------------
// Alarm notification handling
//----------------------------------------------------------------
- $scope.handleAlarms = function () {
+ $scope.handleAlarms = function()
+ {
$rootScope.isAlarm = !$rootScope.isAlarm;
- if (!$rootScope.isAlarm) {
+ if (!$rootScope.isAlarm)
+ {
$rootScope.alarmCount = "0";
- $ionicHistory.nextViewOptions({
+ $ionicHistory.nextViewOptions(
+ {
disableBack: true
});
- $state.go("events", {
+ $state.go("events",
+ {
"id": 0,
- "playEvent":false
- }, {
+ "playEvent": false
+ },
+ {
reload: true
});
return;
@@ -46,20 +53,22 @@ angular.module('zmApp.controllers').controller('zmApp.EventsGraphsCtrl', ['$ioni
// reset power state on exit as if it is called after we enter another
// state, that effectively overwrites current view power management needs
//------------------------------------------------------------------------
- $scope.$on('$ionicView.enter', function () {
+ $scope.$on('$ionicView.enter', function()
+ {
// console.log("**VIEW ** EventsGraphs Ctrl Entered");
NVRDataModel.setAwake(false);
});
- $scope.$on('$ionicView.leave', function () {
+ $scope.$on('$ionicView.leave', function()
+ {
// console.log("**VIEW ** Graph Ctrl Left");
});
- $scope.$on('$ionicView.unloaded', function () {
+ $scope.$on('$ionicView.unloaded', function()
+ {
// console.log("**VIEW ** Graph Ctrl Unloaded");
});
-
//-------------------------------------------------
// Controller main
//-------------------------------------------------
@@ -67,56 +76,57 @@ angular.module('zmApp.controllers').controller('zmApp.EventsGraphsCtrl', ['$ioni
// $scope.chart = "";
$scope.navTitle = 'Tab Page';
// $scope.chart="";
- $scope.leftButtons = [{
+ $scope.leftButtons = [
+ {
type: 'button-icon icon ion-navicon',
- tap: function (e) {
+ tap: function(e)
+ {
$scope.toggleMenu();
}
- }];
-
+ }];
var container = angular.element(document.getElementById('visualization'));
//console.log(JSON.stringify(container));
var data = [
- {
- id: 1,
- content: 'item 1',
- start: '2013-04-20'
- },
- {
- id: 2,
- content: 'item 2',
- start: '2013-04-14'
- },
- {
- id: 3,
- content: 'item 3',
- start: '2013-04-18'
- },
- {
- id: 4,
- content: 'item 4',
- start: '2013-04-16',
- end: '2013-04-19'
- },
- {
- id: 5,
- content: 'item 5',
- start: '2013-04-25'
- },
- {
- id: 6,
- content: 'item 6',
- start: '2013-04-27'
- }
- ];
+ {
+ id: 1,
+ content: 'item 1',
+ start: '2013-04-20'
+ },
+ {
+ id: 2,
+ content: 'item 2',
+ start: '2013-04-14'
+ },
+ {
+ id: 3,
+ content: 'item 3',
+ start: '2013-04-18'
+ },
+ {
+ id: 4,
+ content: 'item 4',
+ start: '2013-04-16',
+ end: '2013-04-19'
+ },
+ {
+ id: 5,
+ content: 'item 5',
+ start: '2013-04-25'
+ },
+ {
+ id: 6,
+ content: 'item 6',
+ start: '2013-04-27'
+ }];
var options = {};
//var timeline = new vis.Timeline(container[0], data, options);
// -------------------------------------------------
// Called when user taps on a bar
//---------------------------------------------------
- $scope.handleChartClick = function (event) {
+ $scope.handleChartClick = function(event)
+ {
//console.log(JSON.stringify($scope.chartwithbars.getBarsAtEvent(event)));
//console.log(angular.element[0].getContext('2d'));
@@ -127,7 +137,8 @@ angular.module('zmApp.controllers').controller('zmApp.EventsGraphsCtrl', ['$ioni
//-------------------------------------------------
// Generates a bar graph with data provided
//-------------------------------------------------
- $scope.generateTCChart = function (id, chartTitle, hrs) {
+ $scope.generateTCChart = function(id, chartTitle, hrs)
+ {
var monitors = [];
var dateRange = "";
var startDate = "";
@@ -140,11 +151,10 @@ angular.module('zmApp.controllers').controller('zmApp.EventsGraphsCtrl', ['$ioni
};
-
$scope.chart.barHeight = $rootScope.devHeight;
-
- if (hrs) {
+ if (hrs)
+ {
// Apply a time based filter if I am not watching all events
var cur = moment();
endDate = cur.format("YYYY-MM-DD " + NVRDataModel.getTimeFormat());
@@ -159,27 +169,30 @@ angular.module('zmApp.controllers').controller('zmApp.EventsGraphsCtrl', ['$ioni
$scope.chart.data = {
labels: [],
datasets: [
- {
- label: '',
- fillColor: zm.graphFillColor,
- strokeColor: zm.graphStrokeColor,
- highlightFill: zm.graphHighlightFill,
- data: []
- },
- ]
+ {
+ label: '',
+ fillColor: zm.graphFillColor,
+ strokeColor: zm.graphStrokeColor,
+ highlightFill: zm.graphHighlightFill,
+ data: []
+ }, ]
};
- NVRDataModel.getMonitors(0).then(function (data) {
+ NVRDataModel.getMonitors(0).then(function(data)
+ {
monitors = data;
var adjustedHeight = monitors.length * 30;
- if (adjustedHeight > $rootScope.devHeight) {
+ if (adjustedHeight > $rootScope.devHeight)
+ {
$scope.chart.barHeight = adjustedHeight;
//console.log("********* BAR HEIGHT TO " + $scope.chart.barHeight);
}
- for (var i = 0; i < monitors.length; i++) {
- (function (j) { // loop closure - http is async, so success returns after i goes out of scope
+ for (var i = 0; i < monitors.length; i++)
+ {
+ (function(j)
+ { // loop closure - http is async, so success returns after i goes out of scope
// so we need to bind j to i when http returns so its not out of scope. Gak.
// I much prefer the old days of passing context data from request to response
@@ -189,7 +202,8 @@ angular.module('zmApp.controllers').controller('zmApp.EventsGraphsCtrl', ['$ioni
// $scope.chartObject.data[j+1]=([monitors[j].Monitor.Name,'100','color:#76A7FA','0']);
var dateString = "";
- if (hrs) {
+ if (hrs)
+ {
dateString = "/StartTime >=:" + startDate + "/EndTime <=:" + endDate;
}
var url = loginData.apiurl +
@@ -198,12 +212,14 @@ angular.module('zmApp.controllers').controller('zmApp.EventsGraphsCtrl', ['$ioni
// console.log("Monitor event URL:" + url);
NVRDataModel.log("EventGraph: composed url is " + url);
$http.get(url /*,{timeout:15000}*/ )
- .success(function (data) {
+ .success(function(data)
+ {
NVRDataModel.debug("Event count for monitor" +
monitors[j].Monitor.Id + " is " + data.pagination.count);
$scope.chart.data.datasets[0].data[j] = data.pagination.count;
})
- .error(function (data) {
+ .error(function(data)
+ {
// ideally I should be treating it as an error
// but what I am really doing now is treating it like no events
// works but TBD: make this into a proper error handler
@@ -231,4 +247,4 @@ angular.module('zmApp.controllers').controller('zmApp.EventsGraphsCtrl', ['$ioni
// legendTemplate : '<ul class="tc-chart-js-legend"><% for (var i=0; i<datasets.length; i++){%><li><span style="background-color:<%=datasets[i].fillColor%>"></span><%if(datasets[i].label){%><%=datasets[i].label%><%}%></li><%}%></ul>'
};
}; //generateTCChart
-}]); \ No newline at end of file
+}]);
diff --git a/www/js/EventsModalGraphCtrl.js b/www/js/EventsModalGraphCtrl.js
index 0874e4f7..fc9a9c42 100644
--- a/www/js/EventsModalGraphCtrl.js
+++ b/www/js/EventsModalGraphCtrl.js
@@ -3,13 +3,8 @@
/* jslint browser: true*/
/* global saveAs, cordova,StatusBar,angular,console,ionic, moment, vis , Chart, DJS*/
-
-
-
-angular.module('zmApp.controllers').controller('EventsModalGraphCtrl', ['$scope', '$rootScope', 'zm', 'NVRDataModel', '$ionicSideMenuDelegate', '$timeout', '$interval', '$ionicModal', '$ionicLoading', '$http', '$state', '$stateParams', '$ionicHistory', '$ionicScrollDelegate', '$q', '$sce', 'carouselUtils', '$ionicPopup', '$translate', function ($scope, $rootScope, zm, NVRDataModel, $ionicSideMenuDelegate, $timeout, $interval, $ionicModal, $ionicLoading, $http, $state, $stateParams, $ionicHistory, $ionicScrollDelegate, $q, $sce, carouselUtils, $ionicPopup, $translate) {
-
-
-
+angular.module('zmApp.controllers').controller('EventsModalGraphCtrl', ['$scope', '$rootScope', 'zm', 'NVRDataModel', '$ionicSideMenuDelegate', '$timeout', '$interval', '$ionicModal', '$ionicLoading', '$http', '$state', '$stateParams', '$ionicHistory', '$ionicScrollDelegate', '$q', '$sce', 'carouselUtils', '$ionicPopup', '$translate', function($scope, $rootScope, zm, NVRDataModel, $ionicSideMenuDelegate, $timeout, $interval, $ionicModal, $ionicLoading, $http, $state, $stateParams, $ionicHistory, $ionicScrollDelegate, $q, $sce, carouselUtils, $ionicPopup, $translate)
+{
var Graph2d;
var tcGraph;
@@ -26,52 +21,50 @@ angular.module('zmApp.controllers').controller('EventsModalGraphCtrl', ['$scope'
var btype;
var data, options;
-
-
-
-
-
- $scope.$on('modal.shown', function (e, m) {
+ $scope.$on('modal.shown', function(e, m)
+ {
if (m.id != 'modalgraph')
return;
-
//console.log ("INSIDE MODAL GRAPH>>>>>>>>>>>>>>>>>");
data = {
labels: ["January", "February", "March", "April", "May", "June", "July"],
datasets: [
- {
- label: "My First dataset",
- fillColor: "rgba(220,220,220,0.5)",
- strokeColor: "rgba(220,220,220,0.8)",
- highlightFill: "rgba(220,220,220,0.75)",
- highlightStroke: "rgba(220,220,220,1)",
- data: [65, 59, 80, 81, 56, 55, 40]
- },
- {
- label: "My Second dataset",
- fillColor: "rgba(151,187,205,0.5)",
- strokeColor: "rgba(151,187,205,0.8)",
- highlightFill: "rgba(151,187,205,0.75)",
- highlightStroke: "rgba(151,187,205,1)",
- data: [28, 48, 40, 19, 86, 27, 90]
- }
- ]
+ {
+ label: "My First dataset",
+ fillColor: "rgba(220,220,220,0.5)",
+ strokeColor: "rgba(220,220,220,0.8)",
+ highlightFill: "rgba(220,220,220,0.75)",
+ highlightStroke: "rgba(220,220,220,1)",
+ data: [65, 59, 80, 81, 56, 55, 40]
+ },
+ {
+ label: "My Second dataset",
+ fillColor: "rgba(151,187,205,0.5)",
+ strokeColor: "rgba(151,187,205,0.8)",
+ highlightFill: "rgba(151,187,205,0.75)",
+ highlightStroke: "rgba(151,187,205,1)",
+ data: [28, 48, 40, 19, 86, 27, 90]
+ }]
};
options = {
- scales: {
- yAxes: [{
- ticks: {
+ scales:
+ {
+ yAxes: [
+ {
+ ticks:
+ {
// beginAtZero:true,
min: -1,
},
- }],
- xAxes: [{
+ }],
+ xAxes: [
+ {
display: false
- }]
+ }]
},
responsive: true,
@@ -80,10 +73,11 @@ angular.module('zmApp.controllers').controller('EventsModalGraphCtrl', ['$scope'
scaleGridLineColor: "rgba(0,0,0,.05)",
scaleGridLineWidth: 1,
-
- hover: {
+ hover:
+ {
mode: 'single',
- onHover: function (obj) {
+ onHover: function(obj)
+ {
if (obj.length > 0)
tapOrHover(obj[0]._index);
}
@@ -95,8 +89,10 @@ angular.module('zmApp.controllers').controller('EventsModalGraphCtrl', ['$scope'
cv = document.getElementById("eventchart");
ctx = cv.getContext("2d");
- $timeout(function () {
- var tcGraph2 = new Chart(ctx, {
+ $timeout(function()
+ {
+ var tcGraph2 = new Chart(ctx,
+ {
type: 'bar',
data: data,
options: options
@@ -108,24 +104,20 @@ angular.module('zmApp.controllers').controller('EventsModalGraphCtrl', ['$scope'
// we use this to reload the connkey if authkey changed
//------------------------------------------------------
-
- $rootScope.$on("auth-success", function () {
+ $rootScope.$on("auth-success", function()
+ {
NVRDataModel.debug("EventModalCtrl: Re-login detected, resetting everything & re-generating connkey");
-
});
-
-
-
-
//-------------------------------------------------------
// I was kidding, this is where it really is drawn
// scout's promise
//------------------------------------------------------
- function drawGraphTC(event) {
+ function drawGraphTC(event)
+ {
$scope.eid = event.event.Event.Id;
@@ -155,7 +147,6 @@ angular.module('zmApp.controllers').controller('EventsModalGraphCtrl', ['$scope'
]
};*/
-
data = {
labels: [],
datasets: [
@@ -176,9 +167,9 @@ angular.module('zmApp.controllers').controller('EventsModalGraphCtrl', ['$scope'
data: [],
frames: []
- },
+ },
- ]
+ ]
};
onlyalarm_data = {
@@ -192,24 +183,28 @@ angular.module('zmApp.controllers').controller('EventsModalGraphCtrl', ['$scope'
hoverBorderColor: 'rgba(248, 148, 6,1.0)',
data: [],
frames: []
- },
+ },
- ]
+ ]
};
// Chart.js Options
options = {
- scales: {
- yAxes: [{
- ticks: {
+ scales:
+ {
+ yAxes: [
+ {
+ ticks:
+ {
// beginAtZero:true,
min: -1,
},
- }],
- xAxes: [{
+ }],
+ xAxes: [
+ {
display: false
- }]
+ }]
},
responsive: true,
@@ -218,10 +213,11 @@ angular.module('zmApp.controllers').controller('EventsModalGraphCtrl', ['$scope'
scaleGridLineColor: "rgba(0,0,0,.05)",
scaleGridLineWidth: 1,
-
- hover: {
+ hover:
+ {
mode: 'single',
- onHover: function (obj) {
+ onHover: function(obj)
+ {
if (obj.length > 0)
tapOrHover(obj[0]._index);
}
@@ -237,13 +233,14 @@ angular.module('zmApp.controllers').controller('EventsModalGraphCtrl', ['$scope'
// NVRDataModel.log ("Changing graph width to " + $scope.graphWidth);
- for (var i = 0; i < event.event.Frame.length; i++) {
-
+ for (var i = 0; i < event.event.Frame.length; i++)
+ {
data.labels.push(event.event.Frame[i].TimeStamp);
//data.labels.push(' ');
data.datasets[0].data.push(event.event.Frame[i].Score);
- data.datasets[0].frames.push({
+ data.datasets[0].frames.push(
+ {
x: event.event.Frame[i].TimeStamp,
y: event.event.Frame[i].Score,
eid: event.event.Event.Id,
@@ -255,12 +252,14 @@ angular.module('zmApp.controllers').controller('EventsModalGraphCtrl', ['$scope'
});
- if (event.event.Frame[i].Type == "Alarm") {
+ if (event.event.Frame[i].Type == "Alarm")
+ {
onlyalarm_data.labels.push(event.event.Frame[i].TimeStamp);
//data.labels.push(' ');
onlyalarm_data.datasets[0].data.push(event.event.Frame[i].Score);
- onlyalarm_data.datasets[0].frames.push({
+ onlyalarm_data.datasets[0].frames.push(
+ {
x: event.event.Frame[i].TimeStamp,
y: event.event.Frame[i].Score,
eid: event.event.Event.Id,
@@ -280,39 +279,48 @@ angular.module('zmApp.controllers').controller('EventsModalGraphCtrl', ['$scope'
cv = document.getElementById("tcchart");
ctx = cv.getContext("2d");
- if (NVRDataModel.getLogin().timelineModalGraphType == 'all') {
+ if (NVRDataModel.getLogin().timelineModalGraphType == 'all')
+ {
btype = 'line';
current_data = data;
- } else {
+ }
+ else
+ {
btype = 'bar';
current_data = onlyalarm_data;
}
- $timeout(function () {
- tcGraph = new Chart(ctx, {
+ $timeout(function()
+ {
+ tcGraph = new Chart(ctx,
+ {
type: btype,
data: current_data,
options: options
});
});
- cv.onclick = function (e) {
+ cv.onclick = function(e)
+ {
var b = tcGraph.getElementAtEvent(e);
- if (b.length > 0) {
+ if (b.length > 0)
+ {
tapOrHover(b[0]._index);
}
};
}
- function tapOrHover(ndx) {
-
- $timeout(function () {
+ function tapOrHover(ndx)
+ {
+ $timeout(function()
+ {
//console.log ("You tapped " + ndx);
$scope.alarm_images = [];
$scope.playbackURL = NVRDataModel.getLogin().url;
var items = current_data.datasets[0].frames[ndx];
- $scope.alarm_images.push({
+ $scope.alarm_images.push(
+ {
relativePath: items.relativePath,
fid: items.fid,
fname: items.fname,
@@ -324,13 +332,12 @@ angular.module('zmApp.controllers').controller('EventsModalGraphCtrl', ['$scope'
}
-
-
//--------------------------------------------------------
// utility function
//--------------------------------------------------------
- function computeRelativePath(event) {
+ function computeRelativePath(event)
+ {
var relativePath = "";
var loginData = NVRDataModel.getLogin();
var str = event.Event.StartTime;
@@ -355,7 +362,8 @@ angular.module('zmApp.controllers').controller('EventsModalGraphCtrl', ['$scope'
// utility function
//--------------------------------------------------------
- function computeBasePath(event) {
+ function computeBasePath(event)
+ {
var basePath = "";
var loginData = NVRDataModel.getLogin();
var str = event.Event.StartTime;
@@ -377,26 +385,25 @@ angular.module('zmApp.controllers').controller('EventsModalGraphCtrl', ['$scope'
return basePath;
}
-
-
- function padToN(number, digits) {
+ function padToN(number, digits)
+ {
var i;
var stringMax = "";
var stringLeading = "";
- for (i = 1; i <= digits; i++) {
+ for (i = 1; i <= digits; i++)
+ {
stringMax = stringMax + "9";
if (i != digits) stringLeading = stringLeading + "0";
}
var numMax = parseInt(stringMax);
- if (number <= numMax) {
+ if (number <= numMax)
+ {
number = (stringLeading + number).slice(-digits);
}
//console.log ("PADTON: returning " + number);
return number;
}
-
-
-}]); \ No newline at end of file
+}]);
diff --git a/www/js/FirstUseCtrl.js b/www/js/FirstUseCtrl.js
index 8df81f82..e5692188 100644
--- a/www/js/FirstUseCtrl.js
+++ b/www/js/FirstUseCtrl.js
@@ -2,74 +2,79 @@
/* jslint browser: true*/
/* global cordova,StatusBar,angular,console */
-angular.module('zmApp.controllers').controller('zmApp.FirstUseCtrl', ['$scope', '$ionicSideMenuDelegate', 'zm', '$stateParams', '$ionicHistory', '$state', 'NVRDataModel', '$rootScope', '$ionicPopup', '$translate', function ($scope, $ionicSideMenuDelegate, zm, $stateParams, $ionicHistory, $state, NVRDataModel, $rootScope, $ionicPopup, $translate) {
- $scope.openMenu = function () {
+angular.module('zmApp.controllers').controller('zmApp.FirstUseCtrl', ['$scope', '$ionicSideMenuDelegate', 'zm', '$stateParams', '$ionicHistory', '$state', 'NVRDataModel', '$rootScope', '$ionicPopup', '$translate', function($scope, $ionicSideMenuDelegate, zm, $stateParams, $ionicHistory, $state, NVRDataModel, $rootScope, $ionicPopup, $translate)
+{
+ $scope.openMenu = function()
+ {
$ionicSideMenuDelegate.toggleLeft();
};
-
-
//-------------------------------------------------------------------------
// Controller Main
//------------------------------------------------------------------------
- $scope.$on('$ionicView.enter', function () {
+ $scope.$on('$ionicView.enter', function()
+ {
//console.log("**VIEW ** FirstUse Ctrl Entered");
$ionicSideMenuDelegate.canDragContent(true);
-
});
- $scope.switchLang = function () {
+ $scope.switchLang = function()
+ {
$scope.lang = NVRDataModel.getLanguages();
$scope.myopt = {
lang: ""
};
- $rootScope.zmPopup = $ionicPopup.show({
+ $rootScope.zmPopup = $ionicPopup.show(
+ {
scope: $scope,
template: '<ion-radio-fix ng-repeat="item in lang" ng-value="item.value" ng-model="myopt.lang"> {{item.text}} </ion-radio-fix>',
-
title: $translate.instant('kSelectLanguage'),
buttons: [
+ {
+ text: $translate.instant('kButtonCancel'),
+ onTap: function(e)
{
- text: $translate.instant('kButtonCancel'),
- onTap: function (e) {
- //return "CANCEL";
- }
+ //return "CANCEL";
+ }
- },
+ },
+ {
+ text: $translate.instant('kButtonOk'),
+ onTap: function(e)
{
- text: $translate.instant('kButtonOk'),
- onTap: function (e) {
- NVRDataModel.log("Language selected:" + $scope.myopt.lang);
- NVRDataModel.setDefaultLanguage($scope.myopt.lang, true);
+ NVRDataModel.log("Language selected:" + $scope.myopt.lang);
+ NVRDataModel.setDefaultLanguage($scope.myopt.lang, true);
+ //return "OK";
- //return "OK";
-
- }
- }
- ]
+ }
+ }]
});
-
};
- $scope.goToLogin = function () {
- $ionicHistory.nextViewOptions({
+ $scope.goToLogin = function()
+ {
+ $ionicHistory.nextViewOptions(
+ {
disableAnimate: false,
disableBack: true
});
- $state.go("login", {
+ $state.go("login",
+ {
"wizard": false
});
return;
};
- $scope.goToWizard = function () {
- $ionicHistory.nextViewOptions({
+ $scope.goToWizard = function()
+ {
+ $ionicHistory.nextViewOptions(
+ {
disableAnimate: false,
disableBack: true
});
@@ -77,6 +82,4 @@ angular.module('zmApp.controllers').controller('zmApp.FirstUseCtrl', ['$scope',
return;
};
-
-
-}]); \ No newline at end of file
+}]);
diff --git a/www/js/HelpCtrl.js b/www/js/HelpCtrl.js
index ce4ec761..51da877b 100644
--- a/www/js/HelpCtrl.js
+++ b/www/js/HelpCtrl.js
@@ -2,26 +2,32 @@
/* jslint browser: true*/
/* global cordova,StatusBar,angular,console, Masonry */
-angular.module('zmApp.controllers').controller('zmApp.HelpCtrl', ['$scope', '$rootScope', '$ionicModal', 'NVRDataModel', '$ionicSideMenuDelegate', '$ionicHistory', '$state', '$translate', '$q', '$templateRequest', '$sce', '$compile', function ($scope, $rootScope, $ionicModal, NVRDataModel, $ionicSideMenuDelegate, $ionicHistory, $state, $translate, $q, $templateRequest, $sce, $compile) {
- $scope.openMenu = function () {
+angular.module('zmApp.controllers').controller('zmApp.HelpCtrl', ['$scope', '$rootScope', '$ionicModal', 'NVRDataModel', '$ionicSideMenuDelegate', '$ionicHistory', '$state', '$translate', '$q', '$templateRequest', '$sce', '$compile', function($scope, $rootScope, $ionicModal, NVRDataModel, $ionicSideMenuDelegate, $ionicHistory, $state, $translate, $q, $templateRequest, $sce, $compile)
+{
+ $scope.openMenu = function()
+ {
$ionicSideMenuDelegate.toggleLeft();
};
-
//----------------------------------------------------------------
// Alarm notification handling
//----------------------------------------------------------------
- $scope.handleAlarms = function () {
+ $scope.handleAlarms = function()
+ {
$rootScope.isAlarm = !$rootScope.isAlarm;
- if (!$rootScope.isAlarm) {
+ if (!$rootScope.isAlarm)
+ {
$rootScope.alarmCount = "0";
- $ionicHistory.nextViewOptions({
+ $ionicHistory.nextViewOptions(
+ {
disableBack: true
});
- $state.go("events", {
+ $state.go("events",
+ {
"id": 0,
- "playEvent":false
- }, {
+ "playEvent": false
+ },
+ {
reload: true
});
return;
@@ -33,7 +39,8 @@ angular.module('zmApp.controllers').controller('zmApp.HelpCtrl', ['$scope', '$ro
// based on selected language
//----------------------------------------------------------------
- function insertHelp() {
+ function insertHelp()
+ {
var l = NVRDataModel.getDefaultLanguage() || 'en';
var lang = "lang/help/help-" + l + ".html";
@@ -43,25 +50,27 @@ angular.module('zmApp.controllers').controller('zmApp.HelpCtrl', ['$scope', '$ro
var templateUrlFB = $sce.getTrustedResourceUrl(lang_fb);
$templateRequest(lang)
- .then(function (template) {
+ .then(function(template)
+ {
var elem = angular.element(document.getElementById('insertHelp'));
$compile(elem.html(template).contents())($scope);
},
- function (error) {
+ function(error)
+ {
NVRDataModel.log("Language file " + lang + " not found, falling back");
$templateRequest(templateUrlFB)
- .then(function (template) {
+ .then(function(template)
+ {
var elem = angular.element(document.getElementById('insertHelp'));
$compile(elem.html(template).contents())($scope);
},
- function (error) {
+ function(error)
+ {
NVRDataModel.log("fallback help not found");
});
}
);
-
-
}
//-------------------------------------------------------------------------
@@ -71,16 +80,13 @@ angular.module('zmApp.controllers').controller('zmApp.HelpCtrl', ['$scope', '$ro
// reset power state on exit as if it is called after we enter another
// state, that effectively overwrites current view power management needs
//------------------------------------------------------------------------
- $scope.$on('$ionicView.enter', function () {
+ $scope.$on('$ionicView.enter', function()
+ {
//console.log("**VIEW ** Help Ctrl Entered");
NVRDataModel.setAwake(false);
$scope.zmAppVersion = NVRDataModel.getAppVersion();
insertHelp();
-
-
-
-
});
-}]); \ No newline at end of file
+}]);
diff --git a/www/js/ImportantMessageCtrl.js b/www/js/ImportantMessageCtrl.js
index 29e27d2f..0f948d7f 100644
--- a/www/js/ImportantMessageCtrl.js
+++ b/www/js/ImportantMessageCtrl.js
@@ -2,18 +2,18 @@
/* jslint browser: true*/
/* global cordova,StatusBar,angular,console */
-angular.module('zmApp.controllers').controller('zmApp.ImportantMessageCtrl', ['$scope', '$ionicSideMenuDelegate', 'zm', '$stateParams', '$timeout', '$rootScope', function ($scope, $ionicSideMenuDelegate, zm, $stateParams, $timeout, $rootScope) {
- $scope.openMenu = function () {
+angular.module('zmApp.controllers').controller('zmApp.ImportantMessageCtrl', ['$scope', '$ionicSideMenuDelegate', 'zm', '$stateParams', '$timeout', '$rootScope', function($scope, $ionicSideMenuDelegate, zm, $stateParams, $timeout, $rootScope)
+{
+ $scope.openMenu = function()
+ {
$ionicSideMenuDelegate.toggleLeft();
};
-
-
-
//-------------------------------------------------------------------------
// Controller Main
//------------------------------------------------------------------------
- $scope.$on('$ionicView.enter', function () {
+ $scope.$on('$ionicView.enter', function()
+ {
console.log("**VIEW ** LowVersion Ctrl Entered");
$ionicSideMenuDelegate.canDragContent(true);
$scope.requiredVersion = zm.minAppVersion;
@@ -22,12 +22,14 @@ angular.module('zmApp.controllers').controller('zmApp.ImportantMessageCtrl', ['$
});
- $scope.openMenu = function () {
- $timeout(function () {
+ $scope.openMenu = function()
+ {
+ $timeout(function()
+ {
$rootScope.stateofSlide = $ionicSideMenuDelegate.isOpen();
}, 500);
$ionicSideMenuDelegate.toggleLeft();
};
-}]); \ No newline at end of file
+}]);
diff --git a/www/js/LogCtrl.js b/www/js/LogCtrl.js
index f204e8db..f8809661 100644
--- a/www/js/LogCtrl.js
+++ b/www/js/LogCtrl.js
@@ -2,8 +2,10 @@
/* jslint browser: true*/
/* global saveAs, cordova,StatusBar,angular,console,moment */
-angular.module('zmApp.controllers').controller('zmApp.LogCtrl', ['$scope', '$rootScope', 'zm', '$ionicModal', 'NVRDataModel', '$ionicSideMenuDelegate', '$fileLogger', '$cordovaEmailComposer', '$ionicPopup', '$timeout', '$ionicHistory', '$state', '$interval', '$ionicLoading', '$translate', function ($scope, $rootScope, zm, $ionicModal, NVRDataModel, $ionicSideMenuDelegate, $fileLogger, $cordovaEmailComposer, $ionicPopup, $timeout, $ionicHistory, $state, $interval, $ionicLoading, $translate) {
- $scope.openMenu = function () {
+angular.module('zmApp.controllers').controller('zmApp.LogCtrl', ['$scope', '$rootScope', 'zm', '$ionicModal', 'NVRDataModel', '$ionicSideMenuDelegate', '$fileLogger', '$cordovaEmailComposer', '$ionicPopup', '$timeout', '$ionicHistory', '$state', '$interval', '$ionicLoading', '$translate', function($scope, $rootScope, zm, $ionicModal, NVRDataModel, $ionicSideMenuDelegate, $fileLogger, $cordovaEmailComposer, $ionicPopup, $timeout, $ionicHistory, $state, $interval, $ionicLoading, $translate)
+{
+ $scope.openMenu = function()
+ {
$ionicSideMenuDelegate.toggleLeft();
};
@@ -16,34 +18,33 @@ angular.module('zmApp.controllers').controller('zmApp.LogCtrl', ['$scope', '$roo
document.addEventListener("pause", onPause, false);
document.addEventListener("resume", onResume, false);
- function onPause() {
+ function onPause()
+ {
NVRDataModel.debug("LogCtrl: pause called, killing log timer");
// $interval.cancel(intervalLogUpdateHandle);
}
-
- function onResume() {
+ function onResume()
+ {
NVRDataModel.debug("LogCtrl: resume called, starting log timer");
- /* intervalLogUpdateHandle = $interval(function ()
- {
- loadLogs();
-
- }.bind(this), 3000);*/
-
loadLogs();
}
+ $scope.deleteLogs = function()
+ {
- $scope.deleteLogs = function () {
-
- $rootScope.zmPopup = $ionicPopup.confirm({
+ $rootScope.zmPopup = $ionicPopup.confirm(
+ {
title: $translate.instant('kPleaseConfirm'),
template: $translate.instant('kDeleteLogsConfirm'),
});
- $rootScope.zmPopup.then(function (res) {
- if (res) {
- $fileLogger.deleteLogfile().then(function () {
+ $rootScope.zmPopup.then(function(res)
+ {
+ if (res)
+ {
+ $fileLogger.deleteLogfile().then(function()
+ {
//console.log('Logfile deleted');
$fileLogger.setStorageFilename(zm.logFile);
$scope.log.logString = "";
@@ -55,17 +56,22 @@ angular.module('zmApp.controllers').controller('zmApp.LogCtrl', ['$scope', '$roo
//----------------------------------------------------------------
// Alarm notification handling
//----------------------------------------------------------------
- $scope.handleAlarms = function () {
+ $scope.handleAlarms = function()
+ {
$rootScope.isAlarm = !$rootScope.isAlarm;
- if (!$rootScope.isAlarm) {
+ if (!$rootScope.isAlarm)
+ {
$rootScope.alarmCount = "0";
- $ionicHistory.nextViewOptions({
+ $ionicHistory.nextViewOptions(
+ {
disableBack: true
});
- $state.go("events", {
+ $state.go("events",
+ {
"id": 0,
- "playEvent":false
- }, {
+ "playEvent": false
+ },
+ {
reload: true
});
return;
@@ -76,15 +82,18 @@ angular.module('zmApp.controllers').controller('zmApp.LogCtrl', ['$scope', '$roo
// Make sure user knows information masking is best effort
//--------------------------------------------------------------------------
- $scope.sendEmail = function (logstring) {
- $ionicPopup.confirm({
+ $scope.sendEmail = function(logstring)
+ {
+ $ionicPopup.confirm(
+ {
title: $translate.instant('kSensitiveTitle'),
template: $rootScope.appName + ' ' + $translate.instant('kSensitiveBody')
})
- .then(function (res) {
- if (res)
+ .then(function(res)
+ {
+ if (res)
{
- logstring = "Logs for version:"+$scope.zmAppVersion+"\n"+logstring;
+ logstring = "Logs for version:" + $scope.zmAppVersion + "\n" + logstring;
sendEmailReally(logstring);
}
@@ -94,14 +103,14 @@ angular.module('zmApp.controllers').controller('zmApp.LogCtrl', ['$scope', '$roo
//--------------------------------------------------------------------------
// Convenience function to send logs via email
//--------------------------------------------------------------------------
- function sendEmailReally(logstring) {
- if (window.cordova) {
-
+ function sendEmailReally(logstring)
+ {
+ if (window.cordova)
+ {
// do my best to replace sensitive information
var loginData = NVRDataModel.getLogin();
-
// We don't need this anymore as log and debug now strip passwords
/*if (loginData.password !="")
{
@@ -110,35 +119,39 @@ angular.module('zmApp.controllers').controller('zmApp.LogCtrl', ['$scope', '$roo
}*/
// keep the protocol, helps to debug
var urlNoProtocol = loginData.url.replace(/.*?:\/\//, "");
- if (urlNoProtocol != "") {
+ if (urlNoProtocol != "")
+ {
var re2 = new RegExp(urlNoProtocol, "g");
// just replacing baseurl - that will take care of
// masking api but may not be cgi
logstring = logstring.replace(re2, "<server>");
}
urlNoProtocol = loginData.streamingurl.replace(/.*?:\/\//, "");
- if (urlNoProtocol != "") {
+ if (urlNoProtocol != "")
+ {
var re3 = new RegExp(urlNoProtocol, "g");
logstring = logstring.replace(re3, "<server>");
}
urlNoProtocol = loginData.eventServer.replace(/.*?:\/\//, "");
- if (urlNoProtocol != "") {
+ if (urlNoProtocol != "")
+ {
var re4 = new RegExp(urlNoProtocol, "g");
logstring = logstring.replace(re4, "<server>");
}
window.plugins.emailComposer.showEmailComposerWithCallback(callback, $rootScope.appName + ' logs', logstring, [zm.authoremail]);
-
- } else {
+ }
+ else
+ {
// console.log("Using default email client to send data");
var fname = $rootScope.appName + "-logs-" +
moment().format('MMM-DD-YY_HH-mm-ss') + ".txt";
-
- var blob = new Blob([logstring], {
+ var blob = new Blob([logstring],
+ {
type: "text/plain;charset=utf-8"
});
saveAs(blob, fname);
@@ -146,28 +159,32 @@ angular.module('zmApp.controllers').controller('zmApp.LogCtrl', ['$scope', '$roo
}
- function callback() {
+ function callback()
+ {
// console.log ("EMAIL SENT");
NVRDataModel.debug("Email sent callback called");
}
- function loadLogs() {
+ function loadLogs()
+ {
//console.log ("GETTING LOGS");
- $ionicLoading.show({
+ $ionicLoading.show(
+ {
template: $translate.instant('kLoading'),
noBackdrop: true,
duration: zm.loadingTimeout
});
- $fileLogger.getLogfile().then(function (l) {
-
+ $fileLogger.getLogfile().then(function(l)
+ {
$scope.log.logString = l.split('\n').reverse().join('\n');
-
+
$ionicLoading.hide();
},
- function (error) {
+ function(error)
+ {
$scope.log.logString = "Error getting log: " + JSON.stringify(error);
$ionicLoading.hide();
});
@@ -180,7 +197,8 @@ angular.module('zmApp.controllers').controller('zmApp.LogCtrl', ['$scope', '$roo
// reset power state on exit as if it is called after we enter another
// state, that effectively overwrites current view power management needs
//------------------------------------------------------------------------
- $scope.$on('$ionicView.enter', function () {
+ $scope.$on('$ionicView.enter', function()
+ {
//console.log("**VIEW ** Log Ctrl Entered");
NVRDataModel.setAwake(false);
@@ -190,7 +208,6 @@ angular.module('zmApp.controllers').controller('zmApp.LogCtrl', ['$scope', '$roo
$scope.zmAppVersion = NVRDataModel.getAppVersion();
-
/* intervalLogUpdateHandle = $interval(function ()
{
loadLogs();
@@ -199,13 +216,12 @@ angular.module('zmApp.controllers').controller('zmApp.LogCtrl', ['$scope', '$roo
loadLogs();
-
-
});
- $scope.$on('$ionicView.leave', function () {
+ $scope.$on('$ionicView.leave', function()
+ {
//console.log ("Deleting Log interval...");
// $interval.cancel(intervalLogUpdateHandle);
});
-}]); \ No newline at end of file
+}]);
diff --git a/www/js/LoginCtrl.js b/www/js/LoginCtrl.js
index db0440b4..2cf490e3 100644
--- a/www/js/LoginCtrl.js
+++ b/www/js/LoginCtrl.js
@@ -2,14 +2,15 @@
/* jslint browser: true*/
/* global cordova,StatusBar,angular,console,alert,URI, localforage */
-angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$rootScope', 'zm', '$ionicModal', 'NVRDataModel', '$ionicSideMenuDelegate', '$ionicPopup', '$http', '$q', '$ionicLoading', 'zmAutoLogin', '$cordovaPinDialog', 'EventServer', '$ionicHistory', '$state', '$ionicActionSheet', 'SecuredPopups', '$stateParams', '$translate', function ($scope, $rootScope, zm, $ionicModal, NVRDataModel, $ionicSideMenuDelegate, $ionicPopup, $http, $q, $ionicLoading, zmAutoLogin, $cordovaPinDialog, EventServer, $ionicHistory, $state, $ionicActionSheet, SecuredPopups, $stateParams, $translate) {
- $scope.openMenu = function () {
-
+angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$rootScope', 'zm', '$ionicModal', 'NVRDataModel', '$ionicSideMenuDelegate', '$ionicPopup', '$http', '$q', '$ionicLoading', 'zmAutoLogin', '$cordovaPinDialog', 'EventServer', '$ionicHistory', '$state', '$ionicActionSheet', 'SecuredPopups', '$stateParams', '$translate', function($scope, $rootScope, zm, $ionicModal, NVRDataModel, $ionicSideMenuDelegate, $ionicPopup, $http, $q, $ionicLoading, zmAutoLogin, $cordovaPinDialog, EventServer, $ionicHistory, $state, $ionicActionSheet, SecuredPopups, $stateParams, $translate)
+{
+ $scope.openMenu = function()
+ {
+
saveItems(false);
$ionicSideMenuDelegate.toggleLeft();
-
- };
+ };
var oldName;
var serverbuttons = [];
@@ -24,72 +25,85 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r
$scope.check.isUseAuth = ($scope.loginData.isUseAuth) ? true : false;
$scope.check.isUseEventServer = ($scope.loginData.isUseEventServer == true) ? true : false;
-
document.addEventListener("pause", onPause, false);
document.addEventListener("resume", onResume, false);
- function onResume() {
+ function onResume()
+ {
NVRDataModel.log("Login screen resumed");
}
- function onPause() {
+ function onPause()
+ {
NVRDataModel.log("Login screen going to background, saving data");
localforage.setItem("settings-temp-data", $scope.loginData);
}
-
//----------------------------------------------------------------
// Alarm notification handling
//----------------------------------------------------------------
- $scope.handleAlarms = function () {
+ $scope.handleAlarms = function()
+ {
$rootScope.isAlarm = !$rootScope.isAlarm;
- if (!$rootScope.isAlarm) {
+ if (!$rootScope.isAlarm)
+ {
$rootScope.alarmCount = "0";
- $ionicHistory.nextViewOptions({
+ $ionicHistory.nextViewOptions(
+ {
disableBack: true
});
- $state.go("events", {
+ $state.go("events",
+ {
"id": 0,
- "playEvent":false
- }, {
+ "playEvent": false
+ },
+ {
reload: true
});
return;
}
-
+
};
//----------------------------------------------------------------
// Specifies a linked profile to try if this profile fails
//----------------------------------------------------------------
- $scope.selectFallback = function () {
+ $scope.selectFallback = function()
+ {
var as = Object.keys(NVRDataModel.getServerGroups());
- if (as.length < 2) {
- $rootScope.zmPopup = SecuredPopups.show('alert', {
+ if (as.length < 2)
+ {
+ $rootScope.zmPopup = SecuredPopups.show('alert',
+ {
title: $translate.instant('kError'),
template: $translate.instant('kFallback2Configs')
});
return;
}
- var ab = [{
+ var ab = [
+ {
text: $translate.instant('kClear')
}];
var ld = NVRDataModel.getLogin();
- as.forEach(function (item) {
- if (item != ld.serverName) ab.push({
+ as.forEach(function(item)
+ {
+ if (item != ld.serverName) ab.push(
+ {
text: item
});
});
- var sheet = $ionicActionSheet.show({
+ var sheet = $ionicActionSheet.show(
+ {
buttons: ab,
titleText: $translate.instant('kSelectFallback'),
cancelText: $translate.instant('kButtonCancel'),
- cancel: function () {},
- buttonClicked: function (index) {
+ cancel: function() {},
+ buttonClicked: function(index)
+ {
//console.log ("YOU WANT " + ab[index].text + index);
if (index == 0)
$scope.loginData.fallbackConfiguration = "";
@@ -100,27 +114,30 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r
}
});
-
-
};
//----------------------------------------------------------------
// This is called when the user changes profiles
//----------------------------------------------------------------
- $scope.serverActionSheet = function () {
- var hideSheet = $ionicActionSheet.show({
+ $scope.serverActionSheet = function()
+ {
+ var hideSheet = $ionicActionSheet.show(
+ {
buttons: serverbuttons,
destructiveText: $translate.instant('kDelete'),
titleText: $translate.instant('kManageServerGroups'),
cancelText: $translate.instant('kButtonCancel'),
- cancel: function () {
+ cancel: function()
+ {
// add cancel code..
},
- buttonClicked: function (index) {
+ buttonClicked: function(index)
+ {
//console.log ("YOU WANT " + serverbuttons[index].text + " INDEX " + index);
- if (serverbuttons[index].text == $translate.instant('kServerAdd') + "...") {
+ if (serverbuttons[index].text == $translate.instant('kServerAdd') + "...")
+ {
$scope.loginData = angular.copy(NVRDataModel.getDefaultLoginObject());
return true;
@@ -131,7 +148,6 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r
//console.log ("NEW LOGIN OBJECT IS " + JSON.stringify($scope.loginData));
-
$scope.check.isUseAuth = ($scope.loginData.isUseAuth) ? true : false;
$scope.check.isUseEventServer = ($scope.loginData.isUseEventServer == true) ? true : false;
@@ -147,19 +163,20 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r
return true;
},
- destructiveButtonClicked: function () {
+ destructiveButtonClicked: function()
+ {
-
- if (!$scope.loginData.serverName) {
+ if (!$scope.loginData.serverName)
+ {
NVRDataModel.debug("cannot delete empty entry");
return true;
-
}
var zmServers = NVRDataModel.getServerGroups();
//console.log ("YOU WANT TO DELETE " + $scope.loginData.serverName);
//console.log ("LENGTH OF SERVERS IS " + Object.keys(zmServers).length);
- if (Object.keys(zmServers).length > 1) {
+ if (Object.keys(zmServers).length > 1)
+ {
NVRDataModel.log("Deleting " + $scope.loginData.serverName);
delete zmServers[$scope.loginData.serverName];
@@ -171,33 +188,37 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r
NVRDataModel.setLogin($scope.loginData);
availableServers = Object.keys(NVRDataModel.getServerGroups());
- serverbuttons = [{
+ serverbuttons = [
+ {
text: $translate.instant('kServerAdd') + "..."
}];
- for (var servIter = 0; servIter < availableServers.length; servIter++) {
- serverbuttons.push({
+ for (var servIter = 0; servIter < availableServers.length; servIter++)
+ {
+ serverbuttons.push(
+ {
text: availableServers[servIter]
});
//console.log("ADDING : " + availableServers[servIter]);
}
//console.log (">>>>>>>delete: server buttons " + JSON.stringify(serverbuttons));
- } else {
+ }
+ else
+ {
NVRDataModel.displayBanner('error', [$translate.instant('kBannerCannotDeleteNeedOne')]);
}
return true;
}
-
});
};
-
//----------------------------------------------------------------
// This is when you tap on event server settings
//----------------------------------------------------------------
- $scope.eventServerSettings = function () {
+ $scope.eventServerSettings = function()
+ {
NVRDataModel.debug("Saving settings before going to Event Server settings");
//console.log ( "My loginData saved " + JSON.stringify($scope.loginData));
NVRDataModel.setLogin($scope.loginData);
@@ -205,8 +226,6 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r
return;
};
-
-
//-------------------------------------------------------------------------
// Lets make sure we set screen dim properly as we enter
// The problem is we enter other states before we leave previous states
@@ -214,73 +233,81 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r
// reset power state on exit as if it is called after we enter another
// state, that effectively overwrites current view power management needs
//------------------------------------------------------------------------
- $scope.$on('$ionicView.enter', function () {
+ $scope.$on('$ionicView.enter', function()
+ {
//console.log("**VIEW ** LoginCtrl Entered");
NVRDataModel.setAwake(false);
var ld = NVRDataModel.getLogin();
oldName = ld.serverName;
availableServers = Object.keys(NVRDataModel.getServerGroups());
- serverbuttons = [{
+ serverbuttons = [
+ {
text: $translate.instant('kServerAdd') + "..."
}];
- for (var servIter = 0; servIter < availableServers.length; servIter++) {
- serverbuttons.push({
+ for (var servIter = 0; servIter < availableServers.length; servIter++)
+ {
+ serverbuttons.push(
+ {
text: availableServers[servIter]
});
-
//console.log (">>>>>>>ionicview enter: server buttons " + JSON.stringify(serverbuttons));
}
-
-
NVRDataModel.debug("Does login need to hear the wizard? " + $stateParams.wizard);
- if ($stateParams.wizard == "true") {
+ if ($stateParams.wizard == "true")
+ {
NVRDataModel.log("Creating new login entry for wizard");
$scope.loginData = angular.copy(NVRDataModel.getDefaultLoginObject());
$scope.loginData.serverName = $rootScope.wizard.serverName;
$scope.loginData.url = $rootScope.wizard.loginURL;
$scope.loginData.apiurl = $rootScope.wizard.apiURL;
$scope.loginData.streamingurl = $rootScope.wizard.streamingURL;
- if ($rootScope.wizard.useauth && $rootScope.wizard.usezmauth) {
+ if ($rootScope.wizard.useauth && $rootScope.wizard.usezmauth)
+ {
$scope.loginData.username = $rootScope.wizard.zmuser;
$scope.loginData.password = $rootScope.wizard.zmpassword;
- } else {
+ }
+ else
+ {
$scope.loginData.isUseAuth = false;
}
- if ((/^https:\/\//i.test($scope.loginData.url))) {
+ if ((/^https:\/\//i.test($scope.loginData.url)))
+ {
$scope.loginData.useSSL = true;
}
-
- } else {
+ }
+ else
+ {
var savedData;
- localforage.getItem("settings-temp-data").then(function (value) {
+ localforage.getItem("settings-temp-data").then(function(value)
+ {
savedData = value;
//= zmStorageService.getObject ("settings-temp-data");
- if (!NVRDataModel.isEmpty(savedData)) {
+ if (!NVRDataModel.isEmpty(savedData))
+ {
$scope.loginData = savedData;
NVRDataModel.log("retrieved pre-stored loginData on past pause: " + JSON.stringify($scope.loginData));
localforage.removeItem("settings-temp-data");
//zmStorageService.setObject("settings-temp-data", {});
- } else {
+ }
+ else
+ {
NVRDataModel.log("Not recovering login data as its empty");
}
});
}
-
});
-
- $scope.$on('$ionicView.beforeLeave', function () {
+ $scope.$on('$ionicView.beforeLeave', function()
+ {
//console.log("**VIEW ** LoginCtrl Entered");
-
-
});
//----------------------------------------------------------------
@@ -315,54 +342,65 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r
}
});*/
- $rootScope.$on('$stateChangeSuccess', function () {
+ $rootScope.$on('$stateChangeSuccess', function()
+ {
$scope.ignoreDirty = false;
});
// Make a noble attempt at deciphering
-
-
//--------------------------------------------------------------------------
// When PIN is enabled, this is called to specify a PIN
// FIXME: Get rid of cordovaPinDialog. It's really not needed
//--------------------------------------------------------------------------
- $scope.pinPrompt = function (evt) {
+ $scope.pinPrompt = function(evt)
+ {
NVRDataModel.log("Password prompt");
- if ($scope.loginData.usePin) {
+ if ($scope.loginData.usePin)
+ {
$scope.loginData.pinCode = "";
$cordovaPinDialog.prompt($translate.instant('kEnterPin'), $translate.instant('kPinProtect')).then(
- function (result1) {
+ function(result1)
+ {
// console.log (JSON.stringify(result1));
- if (result1.input1 && result1.buttonIndex == 1) {
+ if (result1.input1 && result1.buttonIndex == 1)
+ {
$cordovaPinDialog.prompt($translate.instant('kReconfirmPin'), $translate.instant('kPinProtect'))
- .then(function (result2) {
- if (result1.input1 == result2.input1) {
+ .then(function(result2)
+ {
+ if (result1.input1 == result2.input1)
+ {
NVRDataModel.log("Pin code match");
$scope.loginData.pinCode = result1.input1;
- } else {
+ }
+ else
+ {
NVRDataModel.log("Pin code mismatch");
$scope.loginData.usePin = false;
NVRDataModel.displayBanner('error', [$translate.instant('kBannerPinMismatch')]);
}
},
- function (error) {
+ function(error)
+ {
//console.log("Error inside");
$scope.loginData.usePin = false;
});
- } else {
+ }
+ else
+ {
$scope.loginData.usePin = false;
}
},
- function (error) {
+ function(error)
+ {
//console.log("Error outside");
$scope.loginData.usePin = false;
});
-
-
- } else {
+ }
+ else
+ {
NVRDataModel.debug("Password disabled");
}
};
@@ -371,47 +409,56 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r
// Makes input easier
//-------------------------------------------------------------------------------
- $scope.portalKeypress = function (evt) {
+ $scope.portalKeypress = function(evt)
+ {
- if (/^https:\/\//i.test($scope.loginData.url)) {
+ if (/^https:\/\//i.test($scope.loginData.url))
+ {
$scope.loginData.useSSL = true;
- } else {
+ }
+ else
+ {
$scope.loginData.useSSL = false;
}
- if ($scope.loginData.url.slice(-1) == '/') {
+ if ($scope.loginData.url.slice(-1) == '/')
+ {
$scope.loginData.apiurl = $scope.loginData.url + "api";
$scope.loginData.streamingurl = $scope.loginData.url + "cgi-bin";
- } else {
+ }
+ else
+ {
$scope.loginData.apiurl = $scope.loginData.url + "/api";
$scope.loginData.streamingurl = $scope.loginData.url + "/cgi-bin";
}
-
};
//-------------------------------------------------------------------------------
// Adds http to url if not present
// http://stackoverflow.com/questions/11300906/check-if-a-string-starts-with-http-using-javascript
//-------------------------------------------------------------------------------
- function addhttp(url) {
+ function addhttp(url)
+ {
- if ((!/^(f|ht)tps?:\/\//i.test(url)) && (url != "")) {
+ if ((!/^(f|ht)tps?:\/\//i.test(url)) && (url != ""))
+ {
url = "http://" + url;
}
return url;
}
+ function addWsOrWss(url)
+ {
- function addWsOrWss(url) {
-
- if ((!/^wss?:\/\//i.test(url)) && (url != "")) {
+ if ((!/^wss?:\/\//i.test(url)) && (url != ""))
+ {
url = "ws://" + url;
}
return url;
}
-
- function endsWith(str, suffix) {
+ function endsWith(str, suffix)
+ {
return str.indexOf(suffix, str.length - suffix.length) !== -1;
}
@@ -419,15 +466,14 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r
// Perform the login action when the user submits the login form
//-----------------------------------------------------------------------------
- function saveItems(showalert) {
-
+ function saveItems(showalert)
+ {
//console.log ("*********** SAVE ITEMS CALLED ");
//console.log('Saving login');
NVRDataModel.setFirstUse(false);
-
+
// used for menu display
-
// lets so some basic sanitization of the data
// I am already adding "/" so lets remove spurious ones
@@ -443,29 +489,29 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r
$scope.loginData.username = $scope.loginData.username.trim();
-
-
-
$scope.loginData.isUseAuth = ($scope.check.isUseAuth) ? true : false;
$scope.loginData.isUseEventServer = ($scope.check.isUseEventServer) ? true : false;
- if ($scope.loginData.url.slice(-1) == '/') {
+ if ($scope.loginData.url.slice(-1) == '/')
+ {
$scope.loginData.url = $scope.loginData.url.slice(0, -1);
}
- if ($scope.loginData.apiurl.slice(-1) == '/') {
+ if ($scope.loginData.apiurl.slice(-1) == '/')
+ {
$scope.loginData.apiurl = $scope.loginData.apiurl.slice(0, -1);
}
-
- if ($scope.loginData.streamingurl.slice(-1) == '/') {
+ if ($scope.loginData.streamingurl.slice(-1) == '/')
+ {
$scope.loginData.streamingurl = $scope.loginData.streamingurl.slice(0, -1);
}
- if ($scope.loginData.eventServer.slice(-1) == '/') {
+ if ($scope.loginData.eventServer.slice(-1) == '/')
+ {
$scope.loginData.eventServer = $scope.loginData.eventServer.slice(0, -1);
}
@@ -483,15 +529,17 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r
$scope.loginData.streamingurl = addhttp($scope.loginData.streamingurl);
$scope.loginData.eventServer = addWsOrWss($scope.loginData.eventServer);
- if ($scope.loginData.useSSL) {
+ if ($scope.loginData.useSSL)
+ {
// replace all http with https
$scope.loginData.url = $scope.loginData.url.replace("http:", "https:");
$scope.loginData.apiurl = $scope.loginData.apiurl.replace("http:", "https:");
$scope.loginData.streamingurl = $scope.loginData.streamingurl.replace("http:", "https:");
$scope.loginData.eventServer = $scope.loginData.eventServer.replace("ws:", "wss:");
-
- } else {
+ }
+ else
+ {
// replace all https with http
$scope.loginData.url = $scope.loginData.url.replace("https:", "http:");
$scope.loginData.apiurl = $scope.loginData.apiurl.replace("https:", "http:");
@@ -502,27 +550,29 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r
var apiurl = $scope.loginData.apiurl + '/host/getVersion.json';
var portalurl = $scope.loginData.url + '/index.php';
-
-
// Check if isUseAuth is set make sure u/p have a dummy value
- if ($scope.check.isUseAuth) {
+ if ($scope.check.isUseAuth)
+ {
if (!$scope.loginData.username) $scope.loginData.username = "x";
if (!$scope.loginData.password) $scope.loginData.password = "x";
//NVRDataModel.log("Authentication is disabled, setting dummy user & pass");
}
- if (parseInt($scope.loginData.maxMontage) <= 0) {
+ if (parseInt($scope.loginData.maxMontage) <= 0)
+ {
$scope.loginData.maxMontage = "100";
}
-
// do this before setLogin so message is sent
- if (!$scope.check.isUseEventServer) {
+ if (!$scope.check.isUseEventServer)
+ {
$rootScope.isAlarm = 0;
- if ($rootScope.apnsToken) {
+ if ($rootScope.apnsToken)
+ {
NVRDataModel.log("Making sure we don't get push notifications");
- EventServer.sendMessage('push', {
+ EventServer.sendMessage('push',
+ {
type: 'token',
platform: $rootScope.platformOS,
token: $rootScope.apnsToken,
@@ -532,23 +582,27 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r
}
NVRDataModel.setLogin($scope.loginData);
-
+
$rootScope.runMode = NVRDataModel.getBandwidth();
-
+
oldName = $scope.loginData.serverName;
- if ($scope.check.isUseEventServer) {
+ if ($scope.check.isUseEventServer)
+ {
EventServer.init();
- if ($rootScope.apnsToken && $scope.loginData.disablePush != true) {
+ if ($rootScope.apnsToken && $scope.loginData.disablePush != true)
+ {
NVRDataModel.log("Making sure we get push notifications");
- EventServer.sendMessage('push', {
+ EventServer.sendMessage('push',
+ {
type: 'token',
platform: $rootScope.platformOS,
token: $rootScope.apnsToken,
state: "enabled"
}, 1);
}
- EventServer.sendMessage("control", {
+ EventServer.sendMessage("control",
+ {
type: 'filter',
monlist: $scope.loginData.eventServerMonitors,
intlist: $scope.loginData.eventServerInterval
@@ -556,19 +610,21 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r
}
-
// lets logout
NVRDataModel.debug("Logging out of current session...");
$rootScope.authSession = "undefined";
- $http({
+ $http(
+ {
method: 'POST',
//withCredentials: true,
url: $scope.loginData.url + '/index.php',
- headers: {
+ headers:
+ {
'Content-Type': 'application/x-www-form-urlencoded',
'Accept': 'application/json',
},
- transformRequest: function (obj) {
+ transformRequest: function(obj)
+ {
var str = [];
for (var p in obj)
str.push(encodeURIComponent(p) + "=" +
@@ -577,12 +633,14 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r
return params;
},
- data: {
+ data:
+ {
action: "logout",
view: "login"
}
})
- .finally(function (ans) {
+ .finally(function(ans)
+ {
zmAutoLogin.doLogin("<button class='button button-clear' style='line-height: normal; min-height: 0; min-width: 0; color:#fff;' ng-click='$root.cancelAuth()'><i class='ion-close-circled'></i>&nbsp;" + $translate.instant('kAuthenticating') + "...</button>")
// Do the happy menu only if authentication works
@@ -590,13 +648,15 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r
// fail in app.js that will be called to show an error
// box
- .then(function (data) {
+ .then(function(data)
+ {
// Now let's validate if the API works
// note that due to reachability, it might have switched to another server
- if ($scope.loginData.serverName != NVRDataModel.getLogin().serverName) {
+ if ($scope.loginData.serverName != NVRDataModel.getLogin().serverName)
+ {
NVRDataModel.debug(">>> Server information has changed, likely a fallback took over!");
$scope.loginData = NVRDataModel.getLogin();
apiurl = $scope.loginData.apiurl + '/host/getVersion.json';
@@ -606,21 +666,19 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r
// possible image digits changed between servers
NVRDataModel.getKeyConfigParams(0);
-
NVRDataModel.log("Validating APIs at " + apiurl);
$http.get(apiurl)
- .success(function (data) {
+ .success(function(data)
+ {
-
NVRDataModel.getTimeZone(true);
var loginStatus = $translate.instant('kExploreEnjoy') + " " + $rootScope.appName + "!";
EventServer.refresh();
-
-
// now grab and report PATH_ZMS
NVRDataModel.getPathZms()
- .then(function (data) {
+ .then(function(data)
+ {
var ld = NVRDataModel.getLogin();
var zm_cgi = data.toLowerCase();
@@ -628,27 +686,33 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r
NVRDataModel.log("ZM relative cgi-path: " + zm_cgi + ", you entered: " + user_cgi);
$http.get(ld.streamingurl + "/zms")
- .success(function (data) {
+ .success(function(data)
+ {
NVRDataModel.debug("Urk! cgi-path returned success, but it should not have come here");
loginStatus = $translate.instant('kLoginStatusNoCgi');
NVRDataModel.debug("refreshing API version...");
NVRDataModel.getAPIversion()
- .then(function (data) {
+ .then(function(data)
+ {
var refresh = NVRDataModel.getMonitors(1);
$rootScope.apiVersion = data;
},
- function (error) {
+ function(error)
+ {
var refresh = NVRDataModel.getMonitors(1);
$rootScope.apiVersion = "0.0.0";
NVRDataModel.debug("Error, failed API version, setting to " + $rootScope.apiVersion);
});
- if (showalert) {
- $rootScope.zmPopup = SecuredPopups.show('alert', {
+ if (showalert)
+ {
+ $rootScope.zmPopup = SecuredPopups.show('alert',
+ {
title: $translate.instant('kLoginValidatedTitle'),
template: loginStatus
- }).then(function (res) {
+ }).then(function(res)
+ {
$ionicSideMenuDelegate.toggleLeft();
NVRDataModel.debug("Force reloading monitors...");
@@ -656,19 +720,24 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r
});
}
})
- .error(function (error, status) {
+ .error(function(error, status)
+ {
// If its 5xx, then the cgi-bin path is valid
// if its 4xx then the cgi-bin path is not valid
- if (status < 500) {
+ if (status < 500)
+ {
loginStatus = $translate.instant('kLoginStatusNoCgiAlt');
}
- if (showalert) {
- $rootScope.zmPopup = SecuredPopups.show('alert', {
+ if (showalert)
+ {
+ $rootScope.zmPopup = SecuredPopups.show('alert',
+ {
title: $translate.instant('kLoginValidatedTitle'),
template: loginStatus
- }).then(function (res) {
+ }).then(function(res)
+ {
$ionicSideMenuDelegate.toggleLeft();
NVRDataModel.debug("Force reloading monitors...");
@@ -677,11 +746,13 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r
}
NVRDataModel.debug("refreshing API version...");
NVRDataModel.getAPIversion()
- .then(function (data) {
+ .then(function(data)
+ {
var refresh = NVRDataModel.getMonitors(1);
$rootScope.apiVersion = data;
},
- function (error) {
+ function(error)
+ {
var refresh = NVRDataModel.getMonitors(1);
$rootScope.apiVersion = "0.0.0";
NVRDataModel.debug("Error, failed API version, setting to " + $rootScope.apiVersion);
@@ -690,22 +761,20 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r
});
});
-
-
})
- .error(function (error) {
+ .error(function(error)
+ {
NVRDataModel.displayBanner('error', [$translate.instant('kBannerAPICheckFailed'), $translate.instant('kBannerPleaseCheck')]);
NVRDataModel.log("API login error " + JSON.stringify(error));
- $rootScope.zmPopup = SecuredPopups.show('alert', {
+ $rootScope.zmPopup = SecuredPopups.show('alert',
+ {
title: $translate.instant('kLoginValidAPIFailedTitle'),
template: $translate.instant('kBannerPleaseCheck')
});
});
});
-
-
});
}
@@ -714,24 +783,33 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r
// calling saveItems also updates the defaultServer
//-----------------------------------------------
- $scope.saveItems = function () {
+ $scope.saveItems = function()
+ {
- if (!$scope.loginData.serverName) {
- $rootScope.zmPopup = $ionicPopup.alert({
+ if (!$scope.loginData.serverName)
+ {
+ $rootScope.zmPopup = $ionicPopup.alert(
+ {
title: $translate.instant('kError'),
template: $translate.instant('kServerEmptyError'),
})
- .then(function (res) {
+ .then(function(res)
+ {
return;
});
- } else {
+ }
+ else
+ {
saveItems(true);
availableServers = Object.keys(NVRDataModel.getServerGroups());
- serverbuttons = [{
+ serverbuttons = [
+ {
text: $translate.instant('kServerAdd') + "..."
}];
- for (var servIter = 0; servIter < availableServers.length; servIter++) {
- serverbuttons.push({
+ for (var servIter = 0; servIter < availableServers.length; servIter++)
+ {
+ serverbuttons.push(
+ {
text: availableServers[servIter]
});
}
@@ -739,8 +817,6 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r
}
-
};
-
-}]); \ No newline at end of file
+}]);
diff --git a/www/js/LowVersionCtrl.js b/www/js/LowVersionCtrl.js
index 3ceda222..a7fbb7ff 100644
--- a/www/js/LowVersionCtrl.js
+++ b/www/js/LowVersionCtrl.js
@@ -2,18 +2,18 @@
/* jslint browser: true*/
/* global cordova,StatusBar,angular,console */
-angular.module('zmApp.controllers').controller('zmApp.LowVersionCtrl', ['$scope','$ionicSideMenuDelegate', 'zm', '$stateParams', function ($scope,$ionicSideMenuDelegate,zm, $stateParams) {
-$scope.openMenu = function () {
- $ionicSideMenuDelegate.toggleLeft();
- };
-
-
-
+angular.module('zmApp.controllers').controller('zmApp.LowVersionCtrl', ['$scope', '$ionicSideMenuDelegate', 'zm', '$stateParams', function($scope, $ionicSideMenuDelegate, zm, $stateParams)
+{
+ $scope.openMenu = function()
+ {
+ $ionicSideMenuDelegate.toggleLeft();
+ };
//-------------------------------------------------------------------------
// Controller Main
//------------------------------------------------------------------------
- $scope.$on('$ionicView.enter', function () {
+ $scope.$on('$ionicView.enter', function()
+ {
//console.log("**VIEW ** LowVersion Ctrl Entered");
$ionicSideMenuDelegate.canDragContent(true);
$scope.requiredVersion = zm.minAppVersion;
diff --git a/www/js/MenuController.js b/www/js/MenuController.js
index 94e15b0a..071db4df 100644
--- a/www/js/MenuController.js
+++ b/www/js/MenuController.js
@@ -2,52 +2,54 @@
/* jslint browser: true*/
/* global cordova,StatusBar,angular,console */
-angular.module('zmApp.controllers').controller('MenuController', ['$scope','$ionicSideMenuDelegate', 'zm', '$stateParams', '$ionicHistory','$state', 'NVRDataModel', '$rootScope', '$ionicPopup', '$translate', function ($scope,$ionicSideMenuDelegate,zm, $stateParams, $ionicHistory, $state, NVRDataModel, $rootScope, $ionicPopup, $translate) {
-$scope.openMenu = function () {
- $ionicSideMenuDelegate.toggleLeft();
- };
-
-//----------------------------------------------------------------
-// This controller sits along with the main app to bring up
-// the language menu from the main menu
-//----------------------------------------------------------------
+angular.module('zmApp.controllers').controller('MenuController', ['$scope', '$ionicSideMenuDelegate', 'zm', '$stateParams', '$ionicHistory', '$state', 'NVRDataModel', '$rootScope', '$ionicPopup', '$translate', function($scope, $ionicSideMenuDelegate, zm, $stateParams, $ionicHistory, $state, NVRDataModel, $rootScope, $ionicPopup, $translate)
+{
+ $scope.openMenu = function()
+ {
+ $ionicSideMenuDelegate.toggleLeft();
+ };
+
+ //----------------------------------------------------------------
+ // This controller sits along with the main app to bring up
+ // the language menu from the main menu
+ //----------------------------------------------------------------
$scope.switchLang = function()
{
$scope.lang = NVRDataModel.getLanguages();
- $scope.myopt = {lang:""};
-
- $rootScope.zmPopup = $ionicPopup.show({
+ $scope.myopt = {
+ lang: ""
+ };
+
+ $rootScope.zmPopup = $ionicPopup.show(
+ {
scope: $scope,
template: '<ion-radio-fix ng-repeat="item in lang" ng-value="item.value" ng-model="myopt.lang"> {{item.text}} </ion-radio-fix>',
-
title: $translate.instant('kSelectLanguage'),
-
+
buttons: [
+ {
+ text: $translate.instant('kButtonCancel'),
+ onTap: function(e)
{
- text: $translate.instant('kButtonCancel'),
- onTap: function (e) {
- //return "CANCEL";
- }
+ //return "CANCEL";
+ }
- },
+ },
+ {
+ text: $translate.instant('kButtonOk'),
+ onTap: function(e)
{
- text: $translate.instant('kButtonOk'),
- onTap: function (e) {
- NVRDataModel.log("Language selected:"+$scope.myopt.lang);
- NVRDataModel.setDefaultLanguage($scope.myopt.lang, true);
- $rootScope.$emit('language-changed');
-
-
- //return "OK";
-
- }
- }
- ]
+ NVRDataModel.log("Language selected:" + $scope.myopt.lang);
+ NVRDataModel.setDefaultLanguage($scope.myopt.lang, true);
+ $rootScope.$emit('language-changed');
+
+ //return "OK";
+
+ }
+ }]
});
-
-
+
};
-
-
+
}]);
diff --git a/www/js/MonitorCtrl.js b/www/js/MonitorCtrl.js
index e9ec2f4b..6a91a52e 100644
--- a/www/js/MonitorCtrl.js
+++ b/www/js/MonitorCtrl.js
@@ -7,8 +7,8 @@
angular.module('zmApp.controllers')
.controller('zmApp.MonitorCtrl', ['$ionicPopup', 'zm', '$scope', 'NVRDataModel', 'message', '$ionicSideMenuDelegate', '$ionicLoading', '$ionicModal', '$state', '$http', '$rootScope', '$timeout', '$ionicHistory', '$ionicPlatform', '$translate', '$q',
- function ($ionicPopup, zm, $scope, NVRDataModel, message, $ionicSideMenuDelegate, $ionicLoading, $ionicModal, $state, $http, $rootScope, $timeout, $ionicHistory, $ionicPlatform, $translate, $q) {
-
+ function($ionicPopup, zm, $scope, NVRDataModel, message, $ionicSideMenuDelegate, $ionicLoading, $ionicModal, $state, $http, $rootScope, $timeout, $ionicHistory, $ionicPlatform, $translate, $q)
+ {
//-----------------------------------------------------------------------
// Controller Main
@@ -18,8 +18,6 @@ angular.module('zmApp.controllers')
// console.log("***EVENTS: Waiting for Monitors to load before I proceed");
-
-
var loginData;
// --------------------------------------------------------
@@ -27,19 +25,26 @@ angular.module('zmApp.controllers')
// close the modal
// --------------------------------------------------------
- $ionicPlatform.registerBackButtonAction(function (e) {
+ $ionicPlatform.registerBackButtonAction(function(e)
+ {
e.preventDefault();
- if ($scope.modal != undefined && $scope.modal.isShown()) {
+ if ($scope.modal != undefined && $scope.modal.isShown())
+ {
// switch off awake, as liveview is finished
NVRDataModel.debug("Modal is open, closing it");
NVRDataModel.setAwake(false);
$scope.modal.remove();
- } else {
+ }
+ else
+ {
NVRDataModel.debug("Modal is closed, so toggling or exiting");
- if (!$ionicSideMenuDelegate.isOpenLeft()) {
+ if (!$ionicSideMenuDelegate.isOpenLeft())
+ {
$ionicSideMenuDelegate.toggleLeft();
- } else {
+ }
+ else
+ {
navigator.app.exitApp();
}
@@ -47,28 +52,31 @@ angular.module('zmApp.controllers')
}, 1000);
-
- $scope.openMenu = function () {
+ $scope.openMenu = function()
+ {
$ionicSideMenuDelegate.toggleLeft();
};
-
//----------------------------------------------------------------
// Alarm notification handling
//----------------------------------------------------------------
- $scope.handleAlarms = function () {
+ $scope.handleAlarms = function()
+ {
$rootScope.isAlarm = !$rootScope.isAlarm;
- if (!$rootScope.isAlarm) {
+ if (!$rootScope.isAlarm)
+ {
$rootScope.alarmCount = "0";
- $ionicHistory.nextViewOptions({
+ $ionicHistory.nextViewOptions(
+ {
disableBack: true
});
-
- $state.go("events", {
+ $state.go("events",
+ {
"id": 0,
- "playEvent":false
- }, {
+ "playEvent": false
+ },
+ {
reload: true
});
return;
@@ -79,10 +87,12 @@ angular.module('zmApp.controllers')
// For now, I've only limited it to enable/disable and change monitor mode
// and changing monitor function
//-----------------------------------------------------------------------
- $scope.changeConfig = function (monitorName, monitorId, enabled, func) {
+ $scope.changeConfig = function(monitorName, monitorId, enabled, func)
+ {
var checked = false;
- if (monitorName == 'All') {
+ if (monitorName == 'All')
+ {
monitorName = $translate.instant('kAll');
}
@@ -91,40 +101,43 @@ angular.module('zmApp.controllers')
//if monitorId is not specified, all monitors will be changed
var monitorsIds = [];
- if (monitorId == '') {
- for (var i = 0; i < $scope.monitors.length; i++) {
+ if (monitorId == '')
+ {
+ for (var i = 0; i < $scope.monitors.length; i++)
+ {
monitorsIds[i] = $scope.monitors[i].Monitor.Id;
}
- } else {
+ }
+ else
+ {
monitorsIds[0] = monitorId;
}
$scope.monFunctions = [
- {
- text: $translate.instant('kMonModect'),
- value: "Modect"
- },
- {
- text: $translate.instant('kMonMocord'),
- value: "Mocord"
- },
- {
- text: $translate.instant('kMonRecord'),
- value: "Record"
- },
- {
- text: $translate.instant('kMonNodect'),
- value: "Nodect"
- },
- {
- text: $translate.instant('kMonMonitor'),
- value: "Monitor"
- },
- {
- text: $translate.instant('kMonNone'),
- value: "None"
- }
- ];
+ {
+ text: $translate.instant('kMonModect'),
+ value: "Modect"
+ },
+ {
+ text: $translate.instant('kMonMocord'),
+ value: "Mocord"
+ },
+ {
+ text: $translate.instant('kMonRecord'),
+ value: "Record"
+ },
+ {
+ text: $translate.instant('kMonNodect'),
+ value: "Nodect"
+ },
+ {
+ text: $translate.instant('kMonMonitor'),
+ value: "Monitor"
+ },
+ {
+ text: $translate.instant('kMonNone'),
+ value: "None"
+ }];
$scope.monfunc = {
mymonitorsIds: monitorsIds,
@@ -134,134 +147,140 @@ angular.module('zmApp.controllers')
mypromises: []
};
- $rootScope.zmPopup = $ionicPopup.show({
+ $rootScope.zmPopup = $ionicPopup.show(
+ {
scope: $scope,
template: '<ion-toggle ng-model="monfunc.myenabled" ng-checked="monfunc.myenabled" toggle-class="toggle-calm">Enabled</ion-toggle><ion-radio-fix ng-repeat="item in monFunctions" ng-value="item.value" ng-model="monfunc.myfunc"> {{item.text}} </ion-radio-fix>',
-
title: $translate.instant('kChangeSettingsFor') + ' ' + monitorName,
buttons: [
- {
- text: $translate.instant('kButtonCancel'),
+ {
+ text: $translate.instant('kButtonCancel'),
- },
+ },
+ {
+ text: $translate.instant('kButtonSave'),
+ onTap: function(e)
{
- text: $translate.instant('kButtonSave'),
- onTap: function (e) {
- $scope.monfunc.mymonitorsIds.forEach(function (item, index) {
- NVRDataModel.debug("MonitorCtrl:changeConfig selection:" + $scope.monfunc.myenabled +
- $scope.monfunc.myfunc);
- var loginData = NVRDataModel.getLogin();
- var apiRestart = loginData.apiurl + "/states/change/restart.json";
- var apiMon = loginData.apiurl + "/monitors/" + item + ".json";
+ $scope.monfunc.mymonitorsIds.forEach(function(item, index)
+ {
+ NVRDataModel.debug("MonitorCtrl:changeConfig selection:" + $scope.monfunc.myenabled +
+ $scope.monfunc.myfunc);
+ var loginData = NVRDataModel.getLogin();
+ var apiRestart = loginData.apiurl + "/states/change/restart.json";
+ var apiMon = loginData.apiurl + "/monitors/" + item + ".json";
+
+ NVRDataModel.debug("MonitorCtrl: URLs for changeConfig save:" + apiMon);
+
+ var isEnabled = "";
+ isEnabled = ($scope.monfunc.myenabled == true) ? '1' : '0';
+
+ $ionicLoading.show(
+ {
+ template: $translate.instant('kApplyingChanges') + "...",
+ noBackdrop: true,
+ duration: zm.largeHttpTimeout,
+ });
- NVRDataModel.debug("MonitorCtrl: URLs for changeConfig save:" + apiMon);
+ var httpPromise = $http(
+ {
+ url: apiMon,
+ method: 'post',
+ headers:
+ {
+ 'Content-Type': 'application/x-www-form-urlencoded',
+ 'Accept': '*/*',
+ },
+ transformRequest: function(obj)
+ {
+ var str = [];
+ for (var p in obj)
+ str.push(encodeURIComponent(p) + "=" +
+ encodeURIComponent(obj[p]));
+ var foo = str.join("&");
+ // console.log("****RETURNING " + foo);
+ NVRDataModel.debug("MonitorCtrl: parmeters constructed: " + foo);
+ return foo;
+ },
+ data:
+ {
+ 'Monitor[Function]': $scope.monfunc.myfunc,
+ 'Monitor[Enabled]': isEnabled,
+ }
+
+ })
+ .success(function()
+ {
+ NVRDataModel.debug("MonitorCtrl: Not restarting ZM - Make sure you have the patch installed in MonitorsController.php or this won't work");
+ })
+ .error(function(data, status, headers, config)
+ {
+ NVRDataModel.debug("MonitorCtrl: Error changing monitor " + JSON.stringify(data));
+ $scope.monfunc.myfailedIds.push(item);
+ });
- var isEnabled = "";
- isEnabled = ($scope.monfunc.myenabled == true) ? '1' : '0';
+ $scope.monfunc.mypromises.push(httpPromise);
+ });
+ $q.all($scope.monfunc.mypromises).then(function(e)
+ {
+ $ionicLoading.hide();
+ // if there's a failed ID, an error has occurred
+ if ($scope.monfunc.myfailedIds.length != 0)
+ {
+ $ionicLoading.show(
+ {
+ template: $translate.instant('kErrorChangingMonitors') + ". Monitor IDs : " + $scope.monfunc.myfailedIds.toString(),
+ noBackdrop: true,
+ duration: 3000,
+ });
+ }
+ else
+ {
+ // I am not restarting ZM after monitor change
+ /* NVRDataModel.debug ("MonitorCtrl: Restarting ZM");
$ionicLoading.show({
- template: $translate.instant('kApplyingChanges') + "...",
+ template: "Successfully changed Monitor. Please wait, restarting ZoneMinder...",
noBackdrop: true,
duration: zm.largeHttpTimeout,
});
+ $http.post(apiRestart)
+ .then(function (success) {
+ $ionicLoading.hide();
+ var refresh = NVRDataModel.getMonitors(1);
+ refresh.then(function (data) {
+ $scope.monitors = data;
+ $scope.$broadcast('scroll.refreshComplete');
+ });
+
+ },
+ function (error) {
+ $ionicLoading.hide();
+
+ });*/
+ doRefresh();
+ }
+ });
+ }
- var httpPromise = $http({
- url: apiMon,
- method: 'post',
- headers: {
- 'Content-Type': 'application/x-www-form-urlencoded',
- 'Accept': '*/*',
- },
- transformRequest: function (obj) {
- var str = [];
- for (var p in obj)
- str.push(encodeURIComponent(p) + "=" +
- encodeURIComponent(obj[p]));
- var foo = str.join("&");
- // console.log("****RETURNING " + foo);
- NVRDataModel.debug("MonitorCtrl: parmeters constructed: " + foo);
- return foo;
- },
- data: {
- 'Monitor[Function]': $scope.monfunc.myfunc,
- 'Monitor[Enabled]': isEnabled,
- }
-
- })
- .success(function () {
- NVRDataModel.debug("MonitorCtrl: Not restarting ZM - Make sure you have the patch installed in MonitorsController.php or this won't work");
- })
- .error(function (data, status, headers, config) {
- NVRDataModel.debug("MonitorCtrl: Error changing monitor " + JSON.stringify(data));
- $scope.monfunc.myfailedIds.push(item);
- });
-
- $scope.monfunc.mypromises.push(httpPromise);
- });
-
- $q.all($scope.monfunc.mypromises).then(function (e) {
- $ionicLoading.hide();
- // if there's a failed ID, an error has occurred
- if ($scope.monfunc.myfailedIds.length != 0) {
- $ionicLoading.show({
- template: $translate.instant('kErrorChangingMonitors') + ". Monitor IDs : " + $scope.monfunc.myfailedIds.toString(),
- noBackdrop: true,
- duration: 3000,
- });
- } else {
- // I am not restarting ZM after monitor change
- /* NVRDataModel.debug ("MonitorCtrl: Restarting ZM");
- $ionicLoading.show({
- template: "Successfully changed Monitor. Please wait, restarting ZoneMinder...",
- noBackdrop: true,
- duration: zm.largeHttpTimeout,
- });
- $http.post(apiRestart)
- .then(function (success) {
- $ionicLoading.hide();
- var refresh = NVRDataModel.getMonitors(1);
- refresh.then(function (data) {
- $scope.monitors = data;
- $scope.$broadcast('scroll.refreshComplete');
- });
-
- },
- function (error) {
- $ionicLoading.hide();
-
- });*/
- doRefresh();
- }
- });
- }
-
-
-
- },
- ]
+ }, ]
});
};
-
-
// same logic as EventCtrl.js
- $scope.finishedLoadingImage = function () {
+ $scope.finishedLoadingImage = function()
+ {
// console.log("***Monitor image FINISHED Loading***");
$ionicLoading.hide();
};
-
- $scope.$on('$ionicView.loaded', function () {
+ $scope.$on('$ionicView.loaded', function()
+ {
// console.log("**VIEW ** Monitor Ctrl Loaded");
});
-
-
-
-
//-------------------------------------------------------------------------
// Lets make sure we set screen dim properly as we enter
// The problem is we enter other states before we leave previous states
@@ -269,32 +288,35 @@ angular.module('zmApp.controllers')
// reset power state on exit as if it is called after we enter another
// state, that effectively overwrites current view power management needs
//------------------------------------------------------------------------
- $scope.$on('$ionicView.enter', function () {
+ $scope.$on('$ionicView.enter', function()
+ {
// console.log("**VIEW ** Monitor Ctrl Entered");
NVRDataModel.setAwake(false);
$ionicSideMenuDelegate.canDragContent(true);
$scope.areImagesLoading = true;
});
-
- $scope.$on('$ionicView.afterEnter', function () {
+ $scope.$on('$ionicView.afterEnter', function()
+ {
// console.log("**VIEW ** Monitor Ctrl Entered");
$scope.monitors = [];
$scope.monitors = message;
-
+
//console.log (">>>>>>>>>>>> MONITOR CTRL " + JSON.stringify($scope.monitors));
-
-
- if ($scope.monitors.length == 0) {
- $rootScope.zmPopup = $ionicPopup.alert({
+ if ($scope.monitors.length == 0)
+ {
+ $rootScope.zmPopup = $ionicPopup.alert(
+ {
title: $translate.instant('kNoMonitors'),
template: $translate.instant('kPleaseCheckCredentials')
});
- $ionicHistory.nextViewOptions({
+ $ionicHistory.nextViewOptions(
+ {
disableBack: true
});
- $state.go("login", {
+ $state.go("login",
+ {
"wizard": false
});
return;
@@ -307,14 +329,17 @@ angular.module('zmApp.controllers')
// Now lets see if we need to load live screen
// $rootScope.tappedMid = 1;
- if ($rootScope.tappedMid != 0) {
+ if ($rootScope.tappedMid != 0)
+ {
NVRDataModel.log("Notification tapped, we need to go to monitor " + $rootScope.tappedMid);
var tm = $rootScope.tappedMid;
$rootScope.tappedMid = 0;
var monitem;
- for (var m = 0; m < $scope.monitors.length; m++) {
- if ($scope.monitors[m].Monitor.Id == tm) {
+ for (var m = 0; m < $scope.monitors.length; m++)
+ {
+ if ($scope.monitors[m].Monitor.Id == tm)
+ {
monitem = $scope.monitors[m];
break;
}
@@ -324,31 +349,31 @@ angular.module('zmApp.controllers')
openModal(monitem.Monitor.Id, monitem.Monitor.Controllable, monitem.Monitor.ControlId, monitem.Monitor.connKey, monitem);
}
-
});
-
- $scope.$on('$ionicView.leave', function () {
+ $scope.$on('$ionicView.leave', function()
+ {
// console.log("**VIEW ** Monitor Ctrl Left, force removing modal");
if ($scope.modal) $scope.modal.remove();
});
- $scope.$on('$ionicView.unloaded', function () {
+ $scope.$on('$ionicView.unloaded', function()
+ {
// console.log("**VIEW ** Monitor Ctrl Unloaded");
});
-
- $scope.openModal = function (mid, controllable, controlid, connKey, monitor) {
+ $scope.openModal = function(mid, controllable, controlid, connKey, monitor)
+ {
openModal(mid, controllable, controlid, connKey, monitor);
};
- function openModal(mid, controllable, controlid, connKey, monitor) {
+ function openModal(mid, controllable, controlid, connKey, monitor)
+ {
NVRDataModel.debug("MonitorCtrl:Open Monitor Modal with monitor Id=" + mid +
" and Controllable:" + controllable + " with control ID:" + controlid);
-
$scope.monitor = monitor;
//console.log (">>>>>>>>>>>> MONITOR CRL " + $scope.monitor.
$scope.monitorId = mid;
@@ -359,8 +384,6 @@ angular.module('zmApp.controllers')
NVRDataModel.log("Monitor Orientation is: " + $scope.orientation);
$rootScope.rand = Math.floor(Math.random() * (999999 - 111111 + 1)) + 111111;
-
-
$scope.showPTZ = false;
$scope.monitorId = mid;
$scope.monitorName = NVRDataModel.getMonitorName(mid);
@@ -369,7 +392,6 @@ angular.module('zmApp.controllers')
$scope.LoginData = NVRDataModel.getLogin();
$rootScope.modalRand = Math.floor(Math.random() * (999999 - 111111 + 1)) + 111111;
-
$scope.ptzMoveCommand = "";
$scope.ptzStopCommand = "";
@@ -382,24 +404,24 @@ angular.module('zmApp.controllers')
$scope.connKey = (Math.floor((Math.random() * 999999) + 1)).toString();
$scope.isControllable = controllable;
-
- $rootScope.modalRand = Math.floor(Math.random() * (999999 - 111111 + 1)) + 111111;
+ $rootScope.modalRand = Math.floor(Math.random() * (999999 - 111111 + 1)) + 111111;
// This is a modal to show the monitor footage
// We need to switch to always awake if set so the feed doesn't get interrupted
NVRDataModel.setAwake(NVRDataModel.getKeepAwake());
-
-
- $ionicModal.fromTemplateUrl('templates/monitors-modal.html', {
+ $ionicModal.fromTemplateUrl('templates/monitors-modal.html',
+ {
scope: $scope,
animation: 'slide-in-up'
})
- .then(function (modal) {
+ .then(function(modal)
+ {
$scope.modal = modal;
- $ionicLoading.show({
+ $ionicLoading.show(
+ {
template: $translate.instant('kPleaseWait') + "...",
noBackdrop: true,
duration: zm.loadingTimeout
@@ -410,7 +432,8 @@ angular.module('zmApp.controllers')
}
- $scope.closeModal = function () {
+ $scope.closeModal = function()
+ {
// console.log("Close & Destroy Monitor Modal");
// stop networking -nph-zms keeps sucking data
@@ -418,73 +441,78 @@ angular.module('zmApp.controllers')
// switch off awake, as liveview is finished
NVRDataModel.setAwake(false);
$scope.modal.remove();
- $timeout(function () {
+ $timeout(function()
+ {
NVRDataModel.log("MonitorCtrl:Stopping network pull...");
if (NVRDataModel.isForceNetworkStop()) NVRDataModel.stopNetwork("MonitorCtrl-closeModal");
}, 300);
-
};
//Cleanup the modal when we're done with it!
- $scope.$on('$destroy', function () {
+ $scope.$on('$destroy', function()
+ {
//console.log("Destroy Monitor Modal");
if ($scope.modal) $scope.modal.remove();
});
-
-
-
//-----------------------------------------------------------------------
// Controller Main
//-----------------------------------------------------------------------
-
- function monitorStateCheck() {
+ function monitorStateCheck()
+ {
var apiMonCheck;
// The status is provided by zmdc.pl
// "not running", "pending", "running since", "Unable to connect"
var i;
- for (i = 0; i < $scope.monitors.length; i++) {
- (function (j) {
+ for (i = 0; i < $scope.monitors.length; i++)
+ {
+ (function(j)
+ {
$scope.monitors[j].Monitor.isRunningText = "...";
$scope.monitors[j].Monitor.isRunning = "...";
$scope.monitors[j].Monitor.color = zm.monitorCheckingColor;
$scope.monitors[j].Monitor.char = "ion-checkmark-circled";
apiMonCheck = loginData.apiurl + "/monitors/daemonStatus/id:" + $scope.monitors[j].Monitor.Id + "/daemon:zmc.json";
-
//apiMonCheck = apiMonCheck.replace(loginData.url, $scope.monitors[j].Monitor.baseURL);
-
// in multiserver replace apiurl with baseurl
-
NVRDataModel.debug("MonitorCtrl:monitorStateCheck: " + apiMonCheck);
//console.log("**** ZMC CHECK " + apiMonCheck);
$http.get(apiMonCheck)
- .success(function (data) {
+ .success(function(data)
+ {
NVRDataModel.debug("MonitorCtrl: monitor check state returned: " + JSON.stringify(data));
- if (data.statustext.indexOf("not running") > -1) {
+ if (data.statustext.indexOf("not running") > -1)
+ {
$scope.monitors[j].Monitor.isRunning = "false";
$scope.monitors[j].Monitor.color = zm.monitorNotRunningColor;
$scope.monitors[j].Monitor.char = "ion-close-circled";
- } else if (data.statustext.indexOf("pending") > -1) {
+ }
+ else if (data.statustext.indexOf("pending") > -1)
+ {
$scope.monitors[j].Monitor.isRunning = "pending";
$scope.monitors[j].Monitor.color = zm.monitorPendingColor;
- } else if (data.statustext.indexOf("running since") > -1) {
+ }
+ else if (data.statustext.indexOf("running since") > -1)
+ {
$scope.monitors[j].Monitor.isRunning = "true";
$scope.monitors[j].Monitor.color = zm.monitorRunningColor;
- } else if (data.statustext.indexOf("Unable to connect") > -1) {
+ }
+ else if (data.statustext.indexOf("Unable to connect") > -1)
+ {
$scope.monitors[j].Monitor.isRunning = "false";
$scope.monitors[j].Monitor.color = zm.monitorNotRunningColor;
$scope.monitors[j].Monitor.char = "ion-close-circled";
}
-
$scope.monitors[j].Monitor.isRunningText = data.statustext;
})
- .error(function (data) {
+ .error(function(data)
+ {
NVRDataModel.debug("MonitorCtrl: Error->monitor check state returned: " +
JSON.stringify(data));
NVRDataModel.displayBanner('error', [$translate.instant('kErrorRetrievingState'), $translate.instant('kPleaseTryAgain')]);
@@ -493,30 +521,30 @@ angular.module('zmApp.controllers')
$scope.monitors[j].Monitor.char = "ion-help-circled";
});
-
})(i);
}
}
-
- function doRefresh() {
+ function doRefresh()
+ {
$scope.monitors = [];
var refresh = NVRDataModel.getMonitors(1);
- refresh.then(function (data) {
+ refresh.then(function(data)
+ {
$scope.monitors = data;
monitorStateCheck();
$scope.$broadcast('scroll.refreshComplete');
});
}
- $scope.doRefresh = function () {
+ $scope.doRefresh = function()
+ {
//console.log("***Pull to Refresh");
doRefresh();
-
};
-
-}]); \ No newline at end of file
+ }
+ ]);
diff --git a/www/js/MonitorModalCtrl.js b/www/js/MonitorModalCtrl.js
index cff63da1..4b3a7288 100644
--- a/www/js/MonitorModalCtrl.js
+++ b/www/js/MonitorModalCtrl.js
@@ -3,13 +3,8 @@
/* jslint browser: true*/
/* global saveAs, cordova,StatusBar,angular,console,ionic, moment, imagesLoaded, chrome */
-
-
-angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$rootScope', 'zm', 'NVRDataModel', '$ionicSideMenuDelegate', '$timeout', '$interval', '$ionicModal', '$ionicLoading', '$http', '$state', '$stateParams', '$ionicHistory', '$ionicScrollDelegate', '$q', '$sce', 'carouselUtils', '$ionicPopup', 'SecuredPopups', '$translate', function ($scope, $rootScope, zm, NVRDataModel, $ionicSideMenuDelegate, $timeout, $interval, $ionicModal, $ionicLoading, $http, $state, $stateParams, $ionicHistory, $ionicScrollDelegate, $q, $sce, carouselUtils, $ionicPopup, SecuredPopups, $translate) {
-
-
-
-
+angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$rootScope', 'zm', 'NVRDataModel', '$ionicSideMenuDelegate', '$timeout', '$interval', '$ionicModal', '$ionicLoading', '$http', '$state', '$stateParams', '$ionicHistory', '$ionicScrollDelegate', '$q', '$sce', 'carouselUtils', '$ionicPopup', 'SecuredPopups', '$translate', function($scope, $rootScope, zm, NVRDataModel, $ionicSideMenuDelegate, $timeout, $interval, $ionicModal, $ionicLoading, $http, $state, $stateParams, $ionicHistory, $ionicScrollDelegate, $q, $sce, carouselUtils, $ionicPopup, SecuredPopups, $translate)
+{
$scope.animationInProgress = false;
$scope.imageFit = true;
@@ -21,7 +16,8 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
$rootScope.authSession = "undefined";
- $ionicLoading.show({
+ $ionicLoading.show(
+ {
template: $translate.instant('kNegotiatingStreamAuth') + '...',
animation: 'fade-in',
showBackdrop: true,
@@ -30,7 +26,6 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
showDelay: 0
});
-
$scope.currentStreamMode = 'single';
NVRDataModel.log("Using stream mode " + $scope.currentStreamMode);
@@ -38,13 +33,15 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
$rootScope.validMonitorId = $scope.monitors[0].Monitor.Id;
NVRDataModel.getAuthKey($rootScope.validMonitorId, $scope.monitors[0].Monitor.connKey)
- .then(function (success) {
+ .then(function(success)
+ {
$ionicLoading.hide();
$rootScope.authSession = success;
NVRDataModel.log("Modal: Stream authentication construction: " + $rootScope.authSession);
},
- function (error) {
+ function(error)
+ {
$ionicLoading.hide();
NVRDataModel.debug("ModalCtrl: Error details of stream auth:" + error);
@@ -52,19 +49,18 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
NVRDataModel.log("Modal: Error returned Stream authentication construction. Retaining old value of: " + $rootScope.authSession);
});
-
-
$interval.cancel(intervalModalHandle);
$interval.cancel(cycleHandle);
- intervalModalHandle = $interval(function () {
+ intervalModalHandle = $interval(function()
+ {
loadModalNotifications();
// console.log ("Refreshing Image...");
}.bind(this), 5000);
-
$timeout.cancel(nphTimer);
- nphTimer = $timeout(function () {
+ nphTimer = $timeout(function()
+ {
$scope.currentStreamMode = 'jpeg';
NVRDataModel.log("Switching playback via nphzms");
}, zm.nphSwitchTimer);
@@ -77,7 +73,8 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
background: '#2F4F4F',
isOpen: true,
toggleOnClick: false,
- button: {
+ button:
+ {
cssClass: "fa fa-arrows-alt",
},
items: [
@@ -85,7 +82,8 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
content: '',
cssClass: 'fa fa-chevron-circle-up',
empty: false,
- onclick: function () {
+ onclick: function()
+ {
controlPTZ($scope.monitorId, $scope.ptzMoveCommand + 'Down');
}
},
@@ -94,7 +92,8 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
content: '',
cssClass: 'fa fa-chevron-circle-up',
empty: false,
- onclick: function () {
+ onclick: function()
+ {
controlPTZ($scope.monitorId, $scope.ptzMoveCommand + 'DownLeft');
}
},
@@ -104,7 +103,8 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
cssClass: 'fa fa-chevron-circle-up',
empty: false,
- onclick: function () {
+ onclick: function()
+ {
controlPTZ($scope.monitorId, $scope.ptzMoveCommand + 'Left');
}
},
@@ -112,7 +112,8 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
content: 'D',
empty: true,
- onclick: function () {
+ onclick: function()
+ {
// console.log('About');
}
},
@@ -121,7 +122,8 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
content: '',
cssClass: 'fa fa-chevron-circle-up',
empty: false,
- onclick: function () {
+ onclick: function()
+ {
controlPTZ($scope.monitorId, $scope.ptzMoveCommand + 'UpLeft');
}
},
@@ -130,7 +132,8 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
content: '',
cssClass: 'fa fa-chevron-circle-up',
empty: false,
- onclick: function () {
+ onclick: function()
+ {
controlPTZ($scope.monitorId, $scope.ptzMoveCommand + 'Up');
}
},
@@ -139,7 +142,8 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
content: '',
cssClass: 'fa fa-chevron-circle-up',
empty: false,
- onclick: function () {
+ onclick: function()
+ {
controlPTZ($scope.monitorId, $scope.ptzMoveCommand + 'UpRight');
}
},
@@ -147,7 +151,8 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
{
content: 'H',
empty: true,
- onclick: function () {
+ onclick: function()
+ {
//console.log('About');
}
},
@@ -156,17 +161,18 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
content: '',
cssClass: 'fa fa-chevron-circle-up',
empty: false,
- onclick: function () {
+ onclick: function()
+ {
controlPTZ($scope.monitorId, $scope.ptzMoveCommand + 'Right');
}
},
-
{
content: '',
cssClass: 'fa fa-chevron-circle-up',
empty: false,
- onclick: function () {
+ onclick: function()
+ {
controlPTZ($scope.monitorId, $scope.ptzMoveCommand + 'DownRight');
}
},
@@ -174,36 +180,36 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
{
content: 'K',
empty: true,
- onclick: function () {
+ onclick: function()
+ {
//console.log('About');
}
},
- ]
+ ]
};
//-------------------------------------------------------------
// On re-auth, we need a new zms
//-------------------------------------------------------------
- $rootScope.$on("auth-success", function () {
+ $rootScope.$on("auth-success", function()
+ {
NVRDataModel.debug("MonitorModalCtrl: Re-login detected, resetting everything & re-generating connkey");
NVRDataModel.stopNetwork("MonitorModal-auth success");
$scope.connKey = (Math.floor((Math.random() * 999999) + 1)).toString();
-
});
-
- $scope.cast = function (mid, mon) {
-
+ $scope.cast = function(mid, mon) {
};
//----------------------------------
// toggles monitor cycling
//----------------------------------
- $scope.toggleCycle = function () {
+ $scope.toggleCycle = function()
+ {
//console.log ("HERE");
$scope.isCycle = !$scope.isCycle;
var ld = NVRDataModel.getLogin();
@@ -211,15 +217,19 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
NVRDataModel.setLogin(ld);
$scope.cycleText = $scope.isCycle ? $translate.instant('kOn') : $translate.instant('kOff');
- if ($scope.isCycle) {
+ if ($scope.isCycle)
+ {
NVRDataModel.log("re-starting cycle timer");
$interval.cancel(cycleHandle);
- cycleHandle = $interval(function () {
+ cycleHandle = $interval(function()
+ {
moveToMonitor($scope.monitorId, 1);
// console.log ("Refreshing Image...");
}.bind(this), ld.cycleMonitorsInterval * 1000);
- } else {
+ }
+ else
+ {
NVRDataModel.log("cancelling cycle timer");
$interval.cancel(cycleHandle);
}
@@ -230,19 +240,21 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
// PTZ enable/disable
//-------------------------------------------------------------
-
- $scope.togglePTZ = function () {
+ $scope.togglePTZ = function()
+ {
//console.log("PTZ");
- if ($scope.isControllable == '1') {
+ if ($scope.isControllable == '1')
+ {
//console.log ("iscontrollable is true");
$scope.showPTZ = !$scope.showPTZ;
-
-
- } else {
- $ionicLoading.show({
+ }
+ else
+ {
+ $ionicLoading.show(
+ {
template: $translate.instant('kPTZnotConfigured'),
noBackdrop: true,
duration: 3000,
@@ -251,13 +263,12 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
};
-
-
//-------------------------------------------------------------
// Pause and resume handlers
//-------------------------------------------------------------
- function onPause() {
+ function onPause()
+ {
NVRDataModel.debug("ModalCtrl: onpause called");
$interval.cancel(intervalModalHandle);
$interval.cancel(cycleHandle);
@@ -266,10 +277,11 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
// FIXME: Do I need to setAwake(false) here?
}
-
- function onResume() {
+ function onResume()
+ {
NVRDataModel.debug("ModalCtrl: Modal resume called");
- if ($scope.isModalActive) {
+ if ($scope.isModalActive)
+ {
NVRDataModel.log("ModalCtrl: Restarting Modal timer on resume");
$interval.cancel(intervalModalHandle);
@@ -277,16 +289,19 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
var ld = NVRDataModel.getLogin();
- intervalModalHandle = $interval(function () {
+ intervalModalHandle = $interval(function()
+ {
loadModalNotifications();
}.bind(this), 5000);
- if (ld.cycleMonitors) {
+ if (ld.cycleMonitors)
+ {
NVRDataModel.debug("Cycling enabled at " + ld.cycleMonitorsInterval);
$interval.cancel(cycleHandle);
- cycleHandle = $interval(function () {
+ cycleHandle = $interval(function()
+ {
moveToMonitor($scope.monitorId, 1);
// console.log ("Refreshing Image...");
}.bind(this), ld.cycleMonitorsInterval * 1000);
@@ -299,116 +314,117 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
}
-
//-------------------------------------------------------------
// Queries the 1.30 API for recording state of current monitor
//-------------------------------------------------------------
- function loadModalNotifications() {
+ function loadModalNotifications()
+ {
- if (NVRDataModel.versionCompare($rootScope.apiVersion, "1.30") == -1) {
+ 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')
- ];
+ $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) {
+ .then(function(data)
+ {
// NVRDataModel.debug ("Success in monitor alarmed status " + JSON.stringify(data));
$scope.monStatus = status[parseInt(data.data.status)];
},
- function (error) {
-
+ function(error)
+ {
$scope.monStatus = "";
NVRDataModel.debug("Error in monitor alarmed status ");
});
-
}
-
//-------------------------------------------------------------
// Enable/Disable preset list
//-------------------------------------------------------------
- $scope.togglePresets = function () {
+ $scope.togglePresets = function()
+ {
$scope.presetOn = !$scope.presetOn;
- if ($scope.presetOn) {
+ if ($scope.presetOn)
+ {
$scope.controlToggle = "hide buttons";
- } else {
+ }
+ 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) {
+ if ($scope.presetOn)
+ {
element.removeClass("animated fadeOutUp");
-
- } else {
+ }
+ else
+ {
element.removeClass("animated fadeInDown");
element.addClass("animated fadeOutUp");
}
-
-
};
-
//-------------------------------------------------------------
// 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 () {
+ $scope.isBackground = function()
+ {
// console.log ("Is background called from ModalCtrl and returned " +
// NVRDataModel.isBackground());
return NVRDataModel.isBackground();
};
-
-
-
-
-
//-------------------------------------------------------------
// Send PTZ command to ZM
// Note: PTZ fails on desktop, don't bother about it
//-------------------------------------------------------------
-
- $scope.controlPTZ = function (monitorId, cmd) {
+ $scope.controlPTZ = function(monitorId, cmd)
+ {
controlPTZ(monitorId, cmd);
};
- function controlPTZ(monitorId, cmd) {
+ 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) {
- $ionicLoading.show({
+ if (!$scope.ptzMoveCommand)
+ {
+ $ionicLoading.show(
+ {
template: $translate.instant('kPTZNotReady'),
noBackdrop: true,
duration: 2000,
@@ -417,7 +433,8 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
}
var ptzData = "";
- if (cmd.lastIndexOf("preset", 0) === 0) {
+ if (cmd.lastIndexOf("preset", 0) === 0)
+ {
NVRDataModel.debug("PTZ command is a preset, so skipping xge/lge");
ptzData = {
view: "request",
@@ -428,7 +445,9 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
// yge: "30", //wtf
};
- } else {
+ }
+ else
+ {
ptzData = {
view: "request",
@@ -443,7 +462,8 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
//console.log("Command value " + cmd + " with MID=" + monitorId);
//console.log("PTZDATA is " + JSON.stringify(ptzData));
$ionicLoading.hide();
- $ionicLoading.show({
+ $ionicLoading.show(
+ {
template: $translate.instant('kPleaseWait') + "...",
noBackdrop: true,
duration: zm.loadingTimeout,
@@ -451,22 +471,25 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
var loginData = NVRDataModel.getLogin();
$ionicLoading.hide();
- $ionicLoading.show({
+ $ionicLoading.show(
+ {
template: $translate.instant('kSendingPTZ') + "...",
noBackdrop: true,
duration: zm.loadingTimeout,
});
-
- var req = $http({
+ var req = $http(
+ {
method: 'POST',
/*timeout: 15000,*/
url: loginData.url + '/index.php',
- headers: {
+ headers:
+ {
'Content-Type': 'application/x-www-form-urlencoded',
'Accept': 'application/json',
},
- transformRequest: function (obj) {
+ transformRequest: function(obj)
+ {
var str = [];
for (var p in obj)
str.push(encodeURIComponent(p) + "=" +
@@ -480,49 +503,50 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
});
- req.success(function (resp) {
+ req.success(function(resp)
+ {
$ionicLoading.hide();
});
- req.error(function (resp) {
+ req.error(function(resp)
+ {
$ionicLoading.hide();
//console.log("ERROR: " + JSON.stringify(resp));
NVRDataModel.log("Error sending PTZ:" + JSON.stringify(resp), "error");
});
}
-
-
-
- $scope.getZoomLevel = function () {
+ $scope.getZoomLevel = function()
+ {
//console.log("ON RELEASE");
var zl = $ionicScrollDelegate.$getByHandle("imgscroll").getScrollPosition();
//console.log(JSON.stringify(zl));
};
- $scope.onTap = function (m, d) {
+ $scope.onTap = function(m, d)
+ {
moveToMonitor(m, d);
};
-
- $scope.onSwipe = function (m, d) {
+ $scope.onSwipe = function(m, d)
+ {
var ld = NVRDataModel.getLogin();
if (!ld.canSwipeMonitors) return;
- if ($ionicScrollDelegate.$getByHandle("imgscroll").getScrollPosition().zoom != 1) {
+ 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) {
+ function moveToMonitor(m, d)
+ {
var curstate = $ionicHistory.currentStateName();
var found = 0;
var mid;
@@ -537,19 +561,22 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
m = mid;
//console.log("Next Monitor is " + m);
-
found = 0;
- for (var i = 0; i < $scope.monitors.length; i++) {
+ 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') {
+ $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 {
+ }
+ else
+ {
NVRDataModel.debug("skipping " + $scope.monitors[i].Monitor.Id +
" listDisplay=" + $scope.monitors[i].Monitor.listDisplay +
" Function=" + $scope.monitors[i].Monitor.Function +
@@ -557,18 +584,19 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
}
}
-
}
while (found != 1);
-
var slidein;
var slideout;
var dirn = d;
- if (dirn == 1) {
+ if (dirn == 1)
+ {
slideout = "animated slideOutLeft";
slidein = "animated slideInRight";
- } else {
+ }
+ else
+ {
slideout = "animated slideOutRight";
slidein = "animated slideInLeft";
}
@@ -577,16 +605,16 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
element.addClass(slideout)
.one('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend', outWithOld);
-
-
- function outWithOld() {
+ function outWithOld()
+ {
NVRDataModel.log("ModalCtrl:Stopping network pull...");
NVRDataModel.stopNetwork("MonitorModal-outwithOld");
$scope.rand = Math.floor((Math.random() * 100000) + 1);
$scope.animationInProgress = true;
- $timeout(function () {
+ $timeout(function()
+ {
element.removeClass(slideout);
element.addClass(slidein)
.one('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend', inWithNew);
@@ -597,7 +625,8 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
}, 200);
}
- function inWithNew() {
+ function inWithNew()
+ {
element.removeClass(slidein);
$scope.animationInProgress = false;
@@ -605,14 +634,16 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
NVRDataModel.log("New image loaded in");
var ld = NVRDataModel.getLogin();
carouselUtils.setStop(false);
- if (ld.useNphZms == true) {
+ if (ld.useNphZms == true)
+ {
$scope.currentStreamMode = 'single';
NVRDataModel.log("Setting timer to play nph-zms mode");
// first 5 seconds, load a snapshot, then switch to real FPS display
// this is to avoid initial image load delay
// FIXME: 5 seconds fair?
$timeout.cancel(nphTimer);
- nphTimer = $timeout(function () {
+ nphTimer = $timeout(function()
+ {
$scope.currentStreamMode = 'jpeg';
NVRDataModel.log("Switching playback via nphzms");
}, zm.nphSwitchTimer);
@@ -620,21 +651,19 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
}
-
$ionicLoading.hide();
-
}
-
-
//-----------------------------------------------------------------------
// Sucess/Error handlers for saving a snapshot of the
// monitor image to phone storage
//-----------------------------------------------------------------------
- function SaveSuccess() {
- $ionicLoading.show({
+ function SaveSuccess()
+ {
+ $ionicLoading.show(
+ {
template: $translate.instant('kDone'),
noBackdrop: true,
duration: 1000
@@ -642,8 +671,10 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
NVRDataModel.debug("ModalCtrl:Photo saved successfuly");
}
- function SaveError(e) {
- $ionicLoading.show({
+ function SaveError(e)
+ {
+ $ionicLoading.show(
+ {
template: $translate.instant('kErrorSave'),
noBackdrop: true,
duration: 2000
@@ -652,60 +683,69 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
//console.log("***ERROR");
}
-
//-------------------------------------------------------------
// Turns on or off an alarm forcibly (mode true = on, false = off)
//-------------------------------------------------------------
- $scope.enableAlarm = function (mid, mode) {
+ $scope.enableAlarm = function(mid, mode)
+ {
if (mode) // trigger alarm
{
- $rootScope.zmPopup = SecuredPopups.show('show', {
+ $rootScope.zmPopup = SecuredPopups.show('show',
+ {
title: 'Confirm',
template: $translate.instant('kForceAlarmConfirm') + $scope.monitorName + "?",
buttons: [
+ {
+ text: $translate.instant('kButtonYes'),
+ onTap: function(e)
{
- text: $translate.instant('kButtonYes'),
- onTap: function (e) {
- enableAlarm(mid, mode);
- }
- },
+ enableAlarm(mid, mode);
+ }
+ },
+ {
+ text: $translate.instant('kButtonNo'),
+ onTap: function(e)
{
- text: $translate.instant('kButtonNo'),
- onTap: function (e) {
- return;
- }
- }
- ]
+ return;
+ }
+ }]
});
- } else
+ }
+ else
enableAlarm(mid, mode);
- function enableAlarm(mid, mode) {
+ function enableAlarm(mid, mode)
+ {
var apiurl = NVRDataModel.getLogin().apiurl;
var c = mode ? "on" : "off";
var alarmurl = apiurl + "/monitors/alarm/id:" + mid + "/command:" + c + ".json";
NVRDataModel.log("Invoking " + alarmurl);
var status = mode ? $translate.instant('kForcingAlarm') : $translate.instant('kCancellingAlarm');
- $ionicLoading.show({
+ $ionicLoading.show(
+ {
template: status,
noBackdrop: true,
duration: zm.largeHttpTimeout,
});
$http.get(alarmurl)
- .then(function (data) {
- $ionicLoading.show({
+ .then(function(data)
+ {
+ $ionicLoading.show(
+ {
template: $translate.instant('kSuccess'),
noBackdrop: true,
duration: 2000,
});
},
- function (error) {
+ function(error)
+ {
- $ionicLoading.show({
+ $ionicLoading.show(
+ {
template: $translate.instant('kAlarmAPIError'),
noBackdrop: true,
duration: 3000,
@@ -714,25 +754,24 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
});
}
-
-
};
-
//-----------------------------------------------------------------------
// color for monitor state
//-----------------------------------------------------------------------
- $scope.stateColor = function () {
+ $scope.stateColor = function()
+ {
var status = [$translate.instant('kMonIdle'),
- $translate.instant('kMonPreAlarm'),
- $translate.instant('kMonAlarmed'),
- $translate.instant('kMonAlert'),
- $translate.instant('kMonRecord')
- ];
+ $translate.instant('kMonPreAlarm'),
+ $translate.instant('kMonAlarmed'),
+ $translate.instant('kMonAlert'),
+ $translate.instant('kMonRecord')
+ ];
//console.log ("***MONSTATUS**"+$scope.monStatus+"**");
var color = "";
- switch ($scope.monStatus) {
+ switch ($scope.monStatus)
+ {
case "":
color = "background-color:none";
break;
@@ -756,44 +795,46 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
return "padding-left:4px;padding-right:4px;" + color;
};
-
//-----------------------------------------------------------------------
// Saves a snapshot of the monitor image to phone storage
//-----------------------------------------------------------------------
- $scope.saveImageToPhoneWithPerms = function (mid)
+ $scope.saveImageToPhoneWithPerms = function(mid)
{
if ($rootScope.platformOS != 'android')
{
saveImageToPhone(mid);
return;
}
-
-
+
NVRDataModel.debug("ModalCtrl: Permission checking for write");
var permissions = cordova.plugins.permissions;
permissions.hasPermission(permissions.WRITE_EXTERNAL_STORAGE, checkPermissionCallback, null);
-
- function checkPermissionCallback(status) {
+
+ function checkPermissionCallback(status)
+ {
if (!status.hasPermission)
{
SaveError("No permission to write to external storage");
}
- permissions.requestPermission(permissions.WRITE_EXTERNAL_STORAGE, succ,err);
+ permissions.requestPermission(permissions.WRITE_EXTERNAL_STORAGE, succ, err);
}
-
+
function succ(s)
{
saveImageToPhone(mid);
}
+
function err(e)
{
- SaveError ("Error in requestPermission");
+ SaveError("Error in requestPermission");
}
};
-
- function saveImageToPhone(mid) {
- $ionicLoading.show({
+
+ function saveImageToPhone(mid)
+ {
+ $ionicLoading.show(
+ {
template: $translate.instant('kSavingSnapshot') + '...',
noBackdrop: true,
duration: zm.httpTimeout
@@ -808,7 +849,8 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
NVRDataModel.log("SavetoPhone:Trying to save image from " + url);
var img = new Image();
- img.onload = function () {
+ img.onload = function()
+ {
// console.log("********* ONLOAD");
canvas = document.createElement('canvas');
canvas.width = img.width;
@@ -819,8 +861,10 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
imageDataUrl = canvas.toDataURL('image/jpeg', 1.0);
imageData = imageDataUrl.replace(/data:image\/jpeg;base64,/, '');
- if ($rootScope.platformOS != "desktop") {
- try {
+ if ($rootScope.platformOS != "desktop")
+ {
+ try
+ {
cordova.exec(
SaveSuccess,
@@ -828,82 +872,87 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
'Canvas2ImagePlugin',
'saveImageDataToLibrary', [imageData]
);
- } catch (e) {
+ }
+ catch (e)
+ {
SaveError(e.message);
}
- } else {
-
+ }
+ else
+ {
var fname = $scope.monitorName + "-" +
moment().format('MMM-DD-YY_HH-mm-ss') + ".png";
- canvas.toBlob(function (blob) {
+ canvas.toBlob(function(blob)
+ {
saveAs(blob, fname);
SaveSuccess();
});
}
};
- try {
+ try
+ {
img.src = url;
// console.log ("SAVING IMAGE SOURCE");
- } catch (e) {
+ }
+ catch (e)
+ {
SaveError(e.message);
}
}
-
-
-
//-------------------------------------------------------------
//reloaads mon - do we need it?
//-------------------------------------------------------------
-
- $scope.reloadView = function () {
+ $scope.reloadView = function()
+ {
NVRDataModel.log("Reloading view for modal view, recomputing rand");
$rootScope.modalRand = Math.floor((Math.random() * 100000) + 1);
$scope.isModalActive = true;
};
- $scope.scaleImage = function () {
+ $scope.scaleImage = function()
+ {
$scope.imageFit = !$scope.imageFit;
// console.log("Switching image style to " + $scope.imageFit);
};
- $scope.$on('$ionicView.enter', function () {
-
+ $scope.$on('$ionicView.enter', function()
+ {
//https://server/zm/api/zones/forMonitor/X.json
});
- $scope.$on('$ionicView.leave', function () {
+ $scope.$on('$ionicView.leave', function()
+ {
// console.log("**MODAL: Stopping modal timer");
$scope.isModalActive = false;
$interval.cancel(intervalModalHandle);
$interval.cancel(cycleHandle);
});
-
- $scope.$on('$ionicView.beforeLeave', function () {
+ $scope.$on('$ionicView.beforeLeave', function()
+ {
NVRDataModel.log("Nullifying the streams...");
-
var element = document.getElementById("singlemonitor");
- if (element) {
+ if (element)
+ {
NVRDataModel.debug("Nullifying " + element.src);
element.src = "";
}
-
-
});
- $scope.$on('$ionicView.unloaded', function () {
+ $scope.$on('$ionicView.unloaded', function()
+ {
$scope.isModalActive = false;
$interval.cancel(intervalModalHandle);
@@ -911,7 +960,8 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
});
- $scope.$on('modal.removed', function () {
+ $scope.$on('modal.removed', function()
+ {
$scope.isModalActive = false;
//console.log("**MODAL REMOVED: Stopping modal timer");
$interval.cancel(intervalModalHandle);
@@ -920,8 +970,6 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
NVRDataModel.debug("Modal removed - killing connkey");
controlStream(17, "", $scope.connKey, -1);
-
-
// Execute action
});
@@ -931,13 +979,15 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
// anyway
//-------------------------------------------------------------
-
- function controlStream(cmd, disp, connkey, ndx) {
+ function controlStream(cmd, disp, connkey, ndx)
+ {
// console.log("Command value " + cmd);
- if (disp) {
+ if (disp)
+ {
$ionicLoading.hide();
- $ionicLoading.show({
+ $ionicLoading.show(
+ {
template: $translate.instant('kPleaseWait') + '...',
noBackdrop: true,
duration: zm.loadingTimeout,
@@ -967,15 +1017,18 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
var myauthtoken = $rootScope.authSession.replace("&auth=", "");
//&auth=
- var req = $http({
+ var req = $http(
+ {
method: 'POST',
/*timeout: 15000,*/
url: loginData.url + '/index.php',
- headers: {
+ headers:
+ {
'Content-Type': 'application/x-www-form-urlencoded',
//'Accept': '*/*',
},
- transformRequest: function (obj) {
+ transformRequest: function(obj)
+ {
var str = [];
for (var p in obj)
str.push(encodeURIComponent(p) + "=" +
@@ -985,7 +1038,8 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
return foo;
},
- data: {
+ data:
+ {
view: "request",
request: "stream",
connkey: connkey,
@@ -994,20 +1048,25 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
}
});
- req.success(function (resp) {
+ req.success(function(resp)
+ {
- if (resp.result == "Ok" && ndx != -1) {
+ if (resp.result == "Ok" && ndx != -1)
+ {
var ld = NVRDataModel.getLogin();
var apiurl = ld.apiurl + "/events/" + resp.status.event + ".json";
//console.log ("API " + apiurl);
$http.get(apiurl)
- .success(function (data) {
- if ($scope.MontageMonitors[ndx].eventUrlTime != data.event.Event.StartTime) {
+ .success(function(data)
+ {
+ if ($scope.MontageMonitors[ndx].eventUrlTime != data.event.Event.StartTime)
+ {
var element = angular.element(document.getElementById($scope.MontageMonitors[ndx].Monitor.Id + "-timeline"));
element.removeClass('animated slideInRight');
element.addClass('animated slideOutRight');
- $timeout(function () {
+ $timeout(function()
+ {
element.removeClass('animated slideOutRight');
element.addClass('animated slideInRight');
$scope.MontageMonitors[ndx].eventUrlTime = data.event.Event.StartTime;
@@ -1016,7 +1075,8 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
}
})
- .error(function (data) {
+ .error(function(data)
+ {
$scope.MontageMonitors[ndx].eventUrlTime = "-";
});
@@ -1024,31 +1084,31 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
});
- req.error(function (resp) {
+ req.error(function(resp)
+ {
//console.log("ERROR: " + JSON.stringify(resp));
NVRDataModel.log("Error sending event command " + JSON.stringify(resp), "error");
});
}
-
//-------------------------------------------------------------
// Zoom in and out via +- for desktops
//-------------------------------------------------------------
- $scope.zoomImage = function (val) {
+ $scope.zoomImage = function(val)
+ {
var zl = parseInt($ionicScrollDelegate.$getByHandle("imgscroll").getScrollPosition().zoom);
- if (zl == 1 && val == -1) {
+ if (zl == 1 && val == -1)
+ {
NVRDataModel.debug("Already zoomed out max");
return;
}
-
zl += val;
NVRDataModel.debug("Zoom level is " + zl);
$ionicScrollDelegate.$getByHandle("imgscroll").zoomTo(zl, true);
};
-
//-------------------------------------------------------------
// Retrieves PTZ state for each monitor
//-------------------------------------------------------------
@@ -1056,7 +1116,8 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
// $scope.isControllable
// $scope.controlid
//
- function configurePTZ(mid) {
+ function configurePTZ(mid)
+ {
$scope.presetAndControl = $translate.instant('kMore');
$scope.ptzWakeCommand = "";
$scope.ptzSleepCommand = "";
@@ -1077,7 +1138,8 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
var ld = NVRDataModel.getLogin();
var url = ld.apiurl + "/monitors/" + mid + ".json";
$http.get(url)
- .success(function (data) {
+ .success(function(data)
+ {
$scope.isControllable = data.monitor.Monitor.Controllable;
// *** Only for testing - comment out //
@@ -1085,15 +1147,16 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
// for testing only
// $scope.isControllable = 1;
$scope.controlid = data.monitor.Monitor.ControlId;
- if ($scope.isControllable == '1') {
-
+ if ($scope.isControllable == '1')
+ {
var apiurl = NVRDataModel.getLogin().apiurl;
var myurl = apiurl + "/controls/" + $scope.controlid + ".json";
NVRDataModel.debug("configurePTZ : getting controllable data " + myurl);
$http.get(myurl)
- .success(function (data) {
+ .success(function(data)
+ {
// *** Only for testing - comment out - start//
/*data.Control.Control.CanSleep = '1';
@@ -1104,30 +1167,34 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
data.control.Control.HasHomePreset = '1';*/
// *** Only for testing - comment out - end //
-
-
$scope.ptzMoveCommand = "move"; // start with as move;
$scope.ptzStopCommand = "";
- if (data.control.Control.CanZoom == '1') {
+ if (data.control.Control.CanZoom == '1')
+ {
$scope.canZoom = true;
- if (data.control.Control.CanZoomCon == '1') {
+ if (data.control.Control.CanZoomCon == '1')
+ {
$scope.zoomInCommand = "zoomConTele";
$scope.zoomOutCommand = "zoomConWide";
- } else if (data.control.Control.CanZoomRel == '1') {
+ }
+ else if (data.control.Control.CanZoomRel == '1')
+ {
$scope.zoomInCommand = "zoomRelTele";
$scope.zoomOutCommand = "zoomRelWide";
- } else if (data.control.Control.CanZoomAbs == '1') {
+ }
+ else if (data.control.Control.CanZoomAbs == '1')
+ {
$scope.zoomInCommand = "zoomRelAbs";
$scope.zoomOutCommand = "zoomRelAbs";
}
}
-
NVRDataModel.debug("configurePTZ: control data returned " + JSON.stringify(data));
- if (data.control.Control.CanMoveRel == '1') {
+ if (data.control.Control.CanMoveRel == '1')
+ {
$scope.ptzMoveCommand = "moveRel";
$scope.ptzStopCommand = "moveStop";
@@ -1136,28 +1203,29 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
// Prefer con over rel if both enabled
// I've tested con
- if (data.control.Control.CanMoveCon == '1') {
+ if (data.control.Control.CanMoveCon == '1')
+ {
$scope.ptzMoveCommand = "moveCon";
$scope.ptzStopCommand = "moveStop";
}
-
-
// presets
NVRDataModel.debug("ConfigurePTZ Preset value is " + data.control.Control.HasPresets);
$scope.ptzPresets = [];
- if (data.control.Control.HasPresets == '1') {
+ if (data.control.Control.HasPresets == '1')
+ {
//$scope.presetAndControl = $translate.instant('kPresets');
$scope.ptzPresetCount = parseInt(data.control.Control.NumPresets);
NVRDataModel.debug("ConfigurePTZ Number of presets is " + $scope.ptzPresetCount);
-
- for (var p = 0; p < $scope.ptzPresetCount; p++) {
- $scope.ptzPresets.push({
+ for (var p = 0; p < $scope.ptzPresetCount; p++)
+ {
+ $scope.ptzPresets.push(
+ {
name: (p + 1).toString(),
icon: '',
cmd: "presetGoto" + (p + 1).toString(),
@@ -1166,8 +1234,10 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
}
- if (data.control.Control.HasHomePreset == '1') {
- $scope.ptzPresets.unshift({
+ if (data.control.Control.HasHomePreset == '1')
+ {
+ $scope.ptzPresets.unshift(
+ {
name: '',
icon: "ion-ios-home",
cmd: 'presetHome',
@@ -1176,8 +1246,6 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
}
-
-
}
/*else
{
@@ -1188,13 +1256,16 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
// no need to darken these buttons if presets are not there
var buttonAccent = "button-dark";
- if ($scope.ptzPresets.length == 0) {
+ if ($scope.ptzPresets.length == 0)
+ {
buttonAccent = "";
}
- if (data.control.Control.CanWake == '1') {
+ if (data.control.Control.CanWake == '1')
+ {
- $scope.ptzPresets.push({
+ $scope.ptzPresets.push(
+ {
name: 'W',
icon: "ion-eye",
cmd: 'wake',
@@ -1203,8 +1274,10 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
}
- if (data.control.Control.CanSleep == '1') {
- $scope.ptzPresets.push({
+ if (data.control.Control.CanSleep == '1')
+ {
+ $scope.ptzPresets.push(
+ {
name: 'S',
icon: "ion-eye-disabled",
cmd: 'sleep',
@@ -1213,8 +1286,10 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
}
- if (data.control.Control.CanReset == '1') {
- $scope.ptzPresets.push({
+ if (data.control.Control.CanReset == '1')
+ {
+ $scope.ptzPresets.push(
+ {
name: 'R',
icon: "ion-ios-loop-strong",
cmd: 'reset',
@@ -1223,29 +1298,30 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
}
-
NVRDataModel.log("ConfigurePTZ Modal: ControlDB reports PTZ command to be " + $scope.ptzMoveCommand);
})
- .error(function (data) {
+ .error(function(data)
+ {
// console.log("** Error retrieving move PTZ command");
NVRDataModel.log("ConfigurePTZ : Error retrieving PTZ command " + JSON.stringify(data), "error");
});
- } else {
+ }
+ else
+ {
NVRDataModel.log("configurePTZ " + mid + " is not PTZ controllable");
}
})
- .error(function (data) {
+ .error(function(data)
+ {
// console.log("** Error retrieving move PTZ command");
NVRDataModel.log("configurePTZ : Error retrieving PTZ command " + JSON.stringify(data), "error");
});
-
-
}
-
- $scope.$on('modal.shown', function () {
+ $scope.$on('modal.shown', function()
+ {
$scope.monStatus = "";
document.addEventListener("pause", onPause, false);
@@ -1259,24 +1335,25 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
$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;
+
+ $scope.quality = (NVRDataModel.getBandwidth() == "lowbw") ? zm.monSingleImageQualityLowBW : ld.monSingleImageQuality;
configurePTZ($scope.monitorId);
- if (ld.cycleMonitors) {
+ if (ld.cycleMonitors)
+ {
NVRDataModel.debug("Cycling enabled at " + ld.cycleMonitorsInterval);
$interval.cancel(cycleHandle);
- cycleHandle = $interval(function () {
+ cycleHandle = $interval(function()
+ {
moveToMonitor($scope.monitorId, 1);
// console.log ("Refreshing Image...");
}.bind(this), ld.cycleMonitorsInterval * 1000);
}
-
});
-}]); \ No newline at end of file
+}]);
diff --git a/www/js/MontageCtrl.js b/www/js/MontageCtrl.js
index 6e7571ce..376356b9 100644
--- a/www/js/MontageCtrl.js
+++ b/www/js/MontageCtrl.js
@@ -3,164 +3,173 @@
/* jslint browser: true*/
/* global cordova,StatusBar,angular,console,ionic,Packery, Draggabilly, imagesLoaded, ConnectSDK, moment */
-
angular.module('zmApp.controllers')
- .controller('zmApp.MontageCtrl', ['$scope', '$rootScope', 'NVRDataModel', 'message', '$ionicSideMenuDelegate', '$timeout', '$interval', '$ionicModal', '$ionicLoading', '$http', '$state', '$ionicPopup', '$stateParams', '$ionicHistory', '$ionicScrollDelegate', '$ionicPlatform', 'zm', '$ionicPopover', '$controller', 'imageLoadingDataShare', '$window', '$localstorage', '$translate', function ($scope, $rootScope, NVRDataModel, message, $ionicSideMenuDelegate, $timeout, $interval, $ionicModal, $ionicLoading, $http, $state, $ionicPopup, $stateParams, $ionicHistory, $ionicScrollDelegate, $ionicPlatform, zm, $ionicPopover, $controller, imageLoadingDataShare, $window, $localstorage, $translate) {
-
- //---------------------------------------------------------------------
- // Controller main
- //---------------------------------------------------------------------
-
- var intervalHandleMontage; // image re-load handler
- var intervalHandleAlarmStatus; // status of each alarm state
-
-
- var gridcontainer;
- var pckry, draggie;
- var draggies;
- var loginData;
- var timestamp;
- var sizeInProgress;
- var modalIntervalHandle;
- var ld;
- var refreshSec;
-
-
- //--------------------------------------------------------------------------------------
- // Handles bandwidth change, if required
- //
- //--------------------------------------------------------------------------------------
-
- $rootScope.$on("bandwidth-change", function (e,data) {
- // not called for offline, I'm only interested in BW switches
- NVRDataModel.debug("Got network change:" + data);
- var ds;
- if (data == 'lowbw') {
- ds = $translate.instant('kLowBWDisplay');
- } else {
- ds = $translate.instant('kHighBWDisplay');
- }
- NVRDataModel.displayBanner('net', [ds]);
- var ld = NVRDataModel.getLogin();
- refreshSec = (NVRDataModel.getBandwidth()=='lowbw') ? ld.refreshSecLowBW : ld.refreshSec;
- $interval.cancel(intervalHandleMontage);
- intervalHandleMontage = $interval(function () {
- loadNotifications();
- }.bind(this), refreshSec * 1000);
-
-
- if (NVRDataModel.getBandwidth() == 'lowbw')
- {
- NVRDataModel.debug("Enabling low bandwidth parameters");
- $scope.LoginData.montageQuality = zm.montageQualityLowBW;
- $scope.LoginData.singleImageQuality = zm.eventSingleImageQualityLowBW;
- $scope.LoginData.montageHistoryQuality = zm.montageQualityLowBW;
-
- }
- });
-
-
- // --------------------------------------------------------
- // Handling of back button in case modal is open should
- // close the modal
- // --------------------------------------------------------
+ .controller('zmApp.MontageCtrl', ['$scope', '$rootScope', 'NVRDataModel', 'message', '$ionicSideMenuDelegate', '$timeout', '$interval', '$ionicModal', '$ionicLoading', '$http', '$state', '$ionicPopup', '$stateParams', '$ionicHistory', '$ionicScrollDelegate', '$ionicPlatform', 'zm', '$ionicPopover', '$controller', 'imageLoadingDataShare', '$window', '$localstorage', '$translate', function($scope, $rootScope, NVRDataModel, message, $ionicSideMenuDelegate, $timeout, $interval, $ionicModal, $ionicLoading, $http, $state, $ionicPopup, $stateParams, $ionicHistory, $ionicScrollDelegate, $ionicPlatform, zm, $ionicPopover, $controller, imageLoadingDataShare, $window, $localstorage, $translate)
+ {
+ //---------------------------------------------------------------------
+ // Controller main
+ //---------------------------------------------------------------------
+
+ var intervalHandleMontage; // image re-load handler
+ var intervalHandleAlarmStatus; // status of each alarm state
+
+ var gridcontainer;
+ var pckry, draggie;
+ var draggies;
+ var loginData;
+ var timestamp;
+ var sizeInProgress;
+ var modalIntervalHandle;
+ var ld;
+ var refreshSec;
+
+ //--------------------------------------------------------------------------------------
+ // Handles bandwidth change, if required
+ //
+ //--------------------------------------------------------------------------------------
+
+ $rootScope.$on("bandwidth-change", function(e, data)
+ {
+ // not called for offline, I'm only interested in BW switches
+ NVRDataModel.debug("Got network change:" + data);
+ var ds;
+ if (data == 'lowbw')
+ {
+ ds = $translate.instant('kLowBWDisplay');
+ }
+ else
+ {
+ ds = $translate.instant('kHighBWDisplay');
+ }
+ NVRDataModel.displayBanner('net', [ds]);
+ var ld = NVRDataModel.getLogin();
+ refreshSec = (NVRDataModel.getBandwidth() == 'lowbw') ? ld.refreshSecLowBW : ld.refreshSec;
+ $interval.cancel(intervalHandleMontage);
+ intervalHandleMontage = $interval(function()
+ {
+ loadNotifications();
+ }.bind(this), refreshSec * 1000);
- $ionicPlatform.registerBackButtonAction(function (e) {
- e.preventDefault();
- if ($scope.modal != undefined && $scope.modal.isShown()) {
- // switch off awake, as liveview is finished
- NVRDataModel.debug("Modal is open, closing it");
- NVRDataModel.setAwake(false);
- $scope.isModalActive = false;
- cleanupOnClose();
- } else {
- NVRDataModel.debug("Modal is closed, so toggling or exiting");
- if (!$ionicSideMenuDelegate.isOpenLeft()) {
- $ionicSideMenuDelegate.toggleLeft();
+ if (NVRDataModel.getBandwidth() == 'lowbw')
+ {
+ NVRDataModel.debug("Enabling low bandwidth parameters");
+ $scope.LoginData.montageQuality = zm.montageQualityLowBW;
+ $scope.LoginData.singleImageQuality = zm.eventSingleImageQualityLowBW;
+ $scope.LoginData.montageHistoryQuality = zm.montageQualityLowBW;
- } else {
- navigator.app.exitApp();
}
+ });
- }
+ // --------------------------------------------------------
+ // Handling of back button in case modal is open should
+ // close the modal
+ // --------------------------------------------------------
- }, 1000);
+ $ionicPlatform.registerBackButtonAction(function(e)
+ {
+ e.preventDefault();
+ if ($scope.modal != undefined && $scope.modal.isShown())
+ {
+ // switch off awake, as liveview is finished
+ NVRDataModel.debug("Modal is open, closing it");
+ NVRDataModel.setAwake(false);
+ $scope.isModalActive = false;
+ cleanupOnClose();
+ }
+ else
+ {
+ NVRDataModel.debug("Modal is closed, so toggling or exiting");
+ if (!$ionicSideMenuDelegate.isOpenLeft())
+ {
+ $ionicSideMenuDelegate.toggleLeft();
- /*$scope.toggleHide = function(mon)
- {
-
-
- if (mon.Monitor.listDisplay == 'noshow')
- mon.Monitor.listDisplay = 'show';
- else
- mon.Monitor.listDisplay = 'noshow';
+ }
+ else
+ {
+ navigator.app.exitApp();
+ }
-
-
- };*/
+ }
+ }, 1000);
+ /*$scope.toggleHide = function(mon)
+ {
+
+ if (mon.Monitor.listDisplay == 'noshow')
+ mon.Monitor.listDisplay = 'show';
+ else
+ mon.Monitor.listDisplay = 'noshow';
- // called by afterEnter to load Packery
- function initPackery() {
+
+
+ };*/
+ // called by afterEnter to load Packery
+ function initPackery()
+ {
- $ionicLoading.show({
- template: $translate.instant('kArrangingImages'),
- noBackdrop: true,
- duration: zm.loadingTimeout
- });
+ $ionicLoading.show(
+ {
+ template: $translate.instant('kArrangingImages'),
+ noBackdrop: true,
+ duration: zm.loadingTimeout
+ });
- var progressCalled = false;
- draggies = [];
- var layouttype = true;
- var ld = NVRDataModel.getLogin();
+ var progressCalled = false;
+ draggies = [];
+ var layouttype = true;
+ var ld = NVRDataModel.getLogin();
+ var positionsStr = ld.packeryPositions;
+ var positions = {};
- var positionsStr = ld.packeryPositions;
- var positions = {};
+ if (positionsStr == '')
+ {
+ NVRDataModel.log("Did NOT find a packery layout");
+ layouttype = true;
+ }
+ else
+ {
- if (positionsStr == '') {
- NVRDataModel.log("Did NOT find a packery layout");
- layouttype = true;
- } else {
+ //console.log ("POSITION STR IS " + positionsStr);
+ positions = JSON.parse(positionsStr);
+ NVRDataModel.log("found a packery layout");
- //console.log ("POSITION STR IS " + positionsStr);
- positions = JSON.parse(positionsStr);
- NVRDataModel.log("found a packery layout");
-
- layouttype = false;
- }
+ layouttype = false;
+ }
+ var cnt = 0;
+ $scope.MontageMonitors.forEach(function(elem)
+ {
+ if ((elem.Monitor.Enabled != '0') && (elem.Monitor.Function != 'None'))
+ cnt++;
+ });
- var cnt = 0;
- $scope.MontageMonitors.forEach(function (elem) {
- if ((elem.Monitor.Enabled != '0') && (elem.Monitor.Function != 'None'))
- cnt++;
- });
+ NVRDataModel.log("Monitors that are active and not DOM hidden: " + cnt + " while grid has " + positions.length);
- NVRDataModel.log("Monitors that are active and not DOM hidden: " + cnt + " while grid has " + positions.length);
+ if (cnt > NVRDataModel.getLogin().maxMontage)
+ {
+ cnt = NVRDataModel.getLogin().maxMontage;
+ NVRDataModel.log("restricting monitor count to " + cnt + " due to max-montage setting");
+ }
- if (cnt > NVRDataModel.getLogin().maxMontage) {
- cnt = NVRDataModel.getLogin().maxMontage;
- NVRDataModel.log("restricting monitor count to " + cnt + " due to max-montage setting");
- }
+ if (cnt != positions.length)
+ {
- if (cnt != positions.length) {
+ NVRDataModel.log("Whoops!! Monitors have changed. I'm resetting layouts, sorry!");
+ layouttype = true;
+ positions = {};
+ }
- NVRDataModel.log("Whoops!! Monitors have changed. I'm resetting layouts, sorry!");
- layouttype = true;
- positions = {};
- }
+ var elem = angular.element(document.getElementById("mygrid"));
- var elem = angular.element(document.getElementById("mygrid"));
+ //console.log ("**** mygrid is " + JSON.stringify(elem));
- //console.log ("**** mygrid is " + JSON.stringify(elem));
-
-
- pckry = new Packery('.grid', {
+ pckry = new Packery('.grid',
+ {
itemSelector: '.grid-item',
percentPosition: true,
columnWidth: '.grid-sizer',
@@ -169,1163 +178,1206 @@ angular.module('zmApp.controllers')
});
- imagesLoaded(elem).on('progress', function (instance, img) {
+ imagesLoaded(elem).on('progress', function(instance, img)
+ {
- var result = img.isLoaded ? 'loaded' : 'broken';
- NVRDataModel.debug( '~~loaded image is ' + result + ' for ' + img.img.src );
- pckry.layout();
- progressCalled = true;
-
+ 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);
- });
+ // if (layouttype) $timeout (function(){layout(pckry);},100);
+ });
- imagesLoaded(elem).on('always', function () {
- //console.log ("******** ALL IMAGES LOADED");
- // $scope.$digest();
- NVRDataModel.debug("All images loaded");
-
- $scope.areImagesLoading = false;
-
+ imagesLoaded(elem).on('always', function()
+ {
+ //console.log ("******** ALL IMAGES LOADED");
+ // $scope.$digest();
+ NVRDataModel.debug("All images loaded");
- $ionicLoading.hide();
+ $scope.areImagesLoading = false;
- if (!progressCalled) {
- NVRDataModel.log("*** PROGRESS WAS NOT CALLED");
- pckry.reloadItems();
- }
-
-
- $timeout(function () {
-
- pckry.getItemElements().forEach(function (itemElem) {
-
- draggie = new Draggabilly(itemElem);
- pckry.bindDraggabillyEvents(draggie);
- draggies.push(draggie);
- draggie.disable();
- draggie.unbindHandles();
- });
+ $ionicLoading.hide();
- pckry.on('dragItemPositioned', itemDragged);
+ if (!progressCalled)
+ {
+ NVRDataModel.log("*** PROGRESS WAS NOT CALLED");
+ pckry.reloadItems();
+ }
+ $timeout(function()
+ {
+ pckry.getItemElements().forEach(function(itemElem)
+ {
- if (!isEmpty(positions)) {
- NVRDataModel.log("Arranging as per packery grid");
+ draggie = new Draggabilly(itemElem);
+ pckry.bindDraggabillyEvents(draggie);
+ draggies.push(draggie);
+ draggie.disable();
+ draggie.unbindHandles();
+ });
- 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);
+ 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);
}
- //console.log ("Index:"+positions[j].attr+ " with size: " + positions[j].size);
}
- }
+ NVRDataModel.debug("All images loaded, doing image layout");
- NVRDataModel.debug("All images loaded, doing image layout");
-
-
- }
- $timeout(function () {
- NVRDataModel.log("Force calling resize");
- pckry.reloadItems();
- //pckry.initShiftLayout(positions,"data-item-id");
- // now do a jiggle
- $timeout (function() {pckry.layout(); } ,300);
-
- }, 20);
-
-
+ }
+ $timeout(function()
+ {
+ NVRDataModel.log("Force calling resize");
+ pckry.reloadItems();
+ //pckry.initShiftLayout(positions,"data-item-id");
+ // now do a jiggle
+ $timeout(function()
+ {
+ pckry.layout();
+ }, 300);
- //pckry.onresize();
+ }, 20);
- }, 20);
+ //pckry.onresize();
- });
+ }, 20);
+ });
+ function itemDragged(item)
+ {
+ NVRDataModel.debug("drag complete");
- function itemDragged(item) {
- NVRDataModel.debug("drag complete");
+ //pckry.getItemElements().forEach(function (itemElem) {
- //pckry.getItemElements().forEach(function (itemElem) {
+ //console.log (itemElem.attributes['data-item-id'].value+" size "+itemElem.attributes['data-item-size'].value );
+ // });
- //console.log (itemElem.attributes['data-item-id'].value+" size "+itemElem.attributes['data-item-size'].value );
- // });
+ var positions = pckry.getShiftPositions('data-item-id');
+ //console.log ("POSITIONS MAP " + JSON.stringify(positions));
+ var ld = NVRDataModel.getLogin();
+ ld.packeryPositions = JSON.stringify(positions);
+ //console.log ("Saving " + ld.packeryPositions);
+ NVRDataModel.setLogin(ld);
+ }
- var positions = pckry.getShiftPositions('data-item-id');
- //console.log ("POSITIONS MAP " + JSON.stringify(positions));
- var ld = NVRDataModel.getLogin();
- ld.packeryPositions = JSON.stringify(positions);
- //console.log ("Saving " + ld.packeryPositions);
- NVRDataModel.setLogin(ld);
}
-
- }
-
-
- function isEmpty(obj) {
- for (var prop in obj) {
- return false;
- }
- return true;
- }
-
- //-----------------------------------------------------------------------
- // color for monitor state in montage
- //-----------------------------------------------------------------------
-
- $scope.stateColor = function () {
- //console.log ("***MONSTATUS**"+$scope.monStatus+"**");
- var attr = "";
- switch ($scope.monStatus) {
- case "":
- attr = "color:rgba(0, 0, 0, 0)";
- break;
- case "idle":
- attr = "color:rgba(0, 0, 0, 0)";
- break;
- case "pre-alarm":
- attr = "color:#e67e22";
- break;
- case "alarmed":
- attr = "color:#D91E18";
- break;
- case "alert":
- attr = "color:#e67e22";
- break;
- case "record":
- attr = "color:#26A65B";
- break;
+ function isEmpty(obj)
+ {
+ for (var prop in obj)
+ {
+ return false;
+ }
+ return true;
}
- return attr;
- };
+ //-----------------------------------------------------------------------
+ // color for monitor state in montage
+ //-----------------------------------------------------------------------
- //-----------------------------------------------------------------------
- // cycle through all displayed monitors and check alarm status
- //-----------------------------------------------------------------------
+ $scope.stateColor = function()
+ {
+ //console.log ("***MONSTATUS**"+$scope.monStatus+"**");
+ var attr = "";
+ switch ($scope.monStatus)
+ {
+ case "":
+ attr = "color:rgba(0, 0, 0, 0)";
+ break;
+ case "idle":
+ attr = "color:rgba(0, 0, 0, 0)";
+ break;
+ case "pre-alarm":
+ attr = "color:#e67e22";
+ break;
+ case "alarmed":
+ attr = "color:#D91E18";
+ break;
+ case "alert":
+ attr = "color:#e67e22";
+ break;
+ case "record":
+ attr = "color:#26A65B";
+ break;
+ }
- function loadAlarmStatus() {
+ return attr;
+ };
+
+ //-----------------------------------------------------------------------
+ // cycle through all displayed monitors and check alarm status
+ //-----------------------------------------------------------------------
- if ((NVRDataModel.versionCompare($rootScope.apiVersion, "1.30") == -1) ||
- (NVRDataModel.getBandwidth() == 'lowbw') ||
- (NVRDataModel.getLogin().disableAlarmCheckMontage == true))
+ function loadAlarmStatus()
{
- return;
- }
+ if ((NVRDataModel.versionCompare($rootScope.apiVersion, "1.30") == -1) ||
+ (NVRDataModel.getBandwidth() == 'lowbw') ||
+ (NVRDataModel.getLogin().disableAlarmCheckMontage == true))
+ {
-
+ return;
+ }
+
+ for (var i = 0; i < $scope.MontageMonitors.length; i++)
+ {
+ if (($scope.MontageMonitors[i].Monitor.Function == 'None') ||
+ ($scope.MontageMonitors[i].Monitor.Enabled == '0') ||
+ ($scope.MontageMonitors[i].Monitor.listDisplay == 'noshow'))
+ {
+ continue;
+ }
+ getAlarmStatus($scope.MontageMonitors[i]);
- for (var i = 0; i < $scope.MontageMonitors.length; i++) {
- if (($scope.MontageMonitors[i].Monitor.Function == 'None') ||
- ($scope.MontageMonitors[i].Monitor.Enabled == '0') ||
- ($scope.MontageMonitors[i].Monitor.listDisplay == 'noshow')) {
- continue;
}
- getAlarmStatus($scope.MontageMonitors[i]);
}
- }
-
- //-----------------------------------------------------------------------
- // get alarm status over HTTP for a single monitor
- //-----------------------------------------------------------------------
- function getAlarmStatus(monitor) {
- var apiurl = NVRDataModel.getLogin().apiurl;
- //console.log ("ALARM CALLED WITH " +JSON.stringify(monitor));
-
- var alarmurl = apiurl + "/monitors/alarm/id:" + monitor.Monitor.Id + "/command:status.json";
- // console.log("Alarm Check: Invoking " + alarmurl);
-
-
- $http.get(alarmurl)
- .then(function (data) {
- // NVRDataModel.debug ("Success in monitor alarmed status " + JSON.stringify(data));
-
- var sid = parseInt(data.data.status);
- switch (sid) {
- case 0: // idle
- monitor.Monitor.alarmState = 'color:rgba(0,0,0,0);';
- break;
- case 1: // pre alarm
- monitor.Monitor.alarmState = 'color:#e67e22;';
- break;
- case 2: // alarm
- monitor.Monitor.alarmState = 'color:#D91E18;';
- break;
- case 3: // alert
- monitor.Monitor.alarmState = 'color:#e67e22;';
- break;
- case 4:
- monitor.Monitor.alarmState = 'color:#26A65B;';
- break;
+ //-----------------------------------------------------------------------
+ // get alarm status over HTTP for a single monitor
+ //-----------------------------------------------------------------------
+ function getAlarmStatus(monitor)
+ {
+ var apiurl = NVRDataModel.getLogin().apiurl;
+ //console.log ("ALARM CALLED WITH " +JSON.stringify(monitor));
+
+ var alarmurl = apiurl + "/monitors/alarm/id:" + monitor.Monitor.Id + "/command:status.json";
+ // console.log("Alarm Check: Invoking " + alarmurl);
+
+ $http.get(alarmurl)
+ .then(function(data)
+ {
+ // NVRDataModel.debug ("Success in monitor alarmed status " + JSON.stringify(data));
+
+ var sid = parseInt(data.data.status);
+ switch (sid)
+ {
+ case 0: // idle
+ monitor.Monitor.alarmState = 'color:rgba(0,0,0,0);';
+ break;
+ case 1: // pre alarm
+ monitor.Monitor.alarmState = 'color:#e67e22;';
+ break;
+ case 2: // alarm
+ monitor.Monitor.alarmState = 'color:#D91E18;';
+ break;
+ case 3: // alert
+ monitor.Monitor.alarmState = 'color:#e67e22;';
+ break;
+ case 4:
+ monitor.Monitor.alarmState = 'color:#26A65B;';
+ break;
- }
+ }
- },
- function (error) {
+ },
+ function(error)
+ {
+ monitor.Monitor.alarmState = 'color:rgba(0,0,0,0);';
+ NVRDataModel.debug("Error in monitor alarmed status ");
+ });
+ }
- monitor.Monitor.alarmState = 'color:rgba(0,0,0,0);';
- NVRDataModel.debug("Error in monitor alarmed status ");
- });
- }
+ //-----------------------------------------------------------------------
+ // re-compute rand so snapshot in montage reloads
+ //-----------------------------------------------------------------------
+
+ function loadNotifications()
+ {
+ if ($scope.areImagesLoading)
+ {
+ NVRDataModel.debug("skipping image refresh, packery is still loading");
+ return;
+ }
- //-----------------------------------------------------------------------
- // re-compute rand so snapshot in montage reloads
- //-----------------------------------------------------------------------
+ //if (pckry && !$scope.isDragabillyOn) pckry.shiftLayout();
+ $rootScope.rand = Math.floor((Math.random() * 100000) + 1);
- function loadNotifications() {
+ // if you see the time move, montage should move
+
+ if ($scope.iconTimeNow == 'local')
+ $scope.timeNow = moment().format(NVRDataModel.getTimeFormatSec());
+ else
+ $scope.timeNow = moment().tz(NVRDataModel.getTimeZoneNow()).format(NVRDataModel.getTimeFormatSec());
+ //$scope.timeNow = moment().format(NVRDataModel.getTimeFormatSec());
+
+ //console.log ("Inside Montage timer...");
- if ($scope.areImagesLoading) {
- NVRDataModel.debug("skipping image refresh, packery is still loading");
- return;
}
- //if (pckry && !$scope.isDragabillyOn) pckry.shiftLayout();
- $rootScope.rand = Math.floor((Math.random() * 100000) + 1);
-
- // if you see the time move, montage should move
-
- if ($scope.iconTimeNow == 'local')
- $scope.timeNow = moment().format(NVRDataModel.getTimeFormatSec());
- else
- $scope.timeNow = moment().tz(NVRDataModel.getTimeZoneNow()).format(NVRDataModel.getTimeFormatSec());
- //$scope.timeNow = moment().format(NVRDataModel.getTimeFormatSec());
+ $scope.cancelReorder = function()
+ {
+ $scope.modal.remove();
+ };
- //console.log ("Inside Montage timer...");
+ $scope.saveReorder = function()
+ {
+ NVRDataModel.debug("Saving monitor hide/unhide");
- }
+ // redo packery as monitor status has changed
+ // DOM may need reloading if you've hidden/unhidden stuff
+ $scope.MontageMonitors = $scope.copyMontage;
+ $scope.modal.remove();
- $scope.cancelReorder = function () {
- $scope.modal.remove();
- };
+ $timeout(function()
+ {
-
-
-
- $scope.saveReorder = function () {
- NVRDataModel.debug("Saving monitor hide/unhide");
+ draggies.forEach(function(drag)
+ {
+ drag.destroy();
+ });
+ pckry.reloadItems();
+ draggies = [];
+ pckry.once('layoutComplete', savePackeryOrder);
+ pckry.layout();
+ }, 400);
- // redo packery as monitor status has changed
- // DOM may need reloading if you've hidden/unhidden stuff
- $scope.MontageMonitors = $scope.copyMontage;
- $scope.modal.remove();
-
- $timeout(function () {
-
- draggies.forEach(function (drag) {
- drag.destroy();
- });
-
- pckry.reloadItems();
- draggies = [];
- pckry.once ('layoutComplete', savePackeryOrder);
- pckry.layout();
-
-
-
- }, 400);
-
- function savePackeryOrder ()
- {
- $timeout(function () {
+ function savePackeryOrder()
+ {
+ $timeout(function()
+ {
var positions = pckry.getShiftPositions('data-item-id');
NVRDataModel.debug("POSITIONS MAP " + JSON.stringify(positions));
var ld = NVRDataModel.getLogin();
ld.packeryPositions = JSON.stringify(positions);
//console.log ("Savtogging " + ld.packeryPositions);
NVRDataModel.setLogin(ld);
-
- pckry.getItemElements().forEach(function (itemElem) {
+
+ pckry.getItemElements().forEach(function(itemElem)
+ {
draggie = new Draggabilly(itemElem);
pckry.bindDraggabillyEvents(draggie);
draggies.push(draggie);
draggie.disable();
});
-
+
$ionicScrollDelegate.$getByHandle("montage-delegate").scrollTop();
-
- // Now also ask DataModel to update its monitor display status
- NVRDataModel.reloadMonitorDisplayStatus();
- pckry.layout();
- },20);
- }
-
- };
+ // Now also ask DataModel to update its monitor display status
+ NVRDataModel.reloadMonitorDisplayStatus();
+ pckry.layout();
+ }, 20);
+ }
+ };
- $scope.toggleHide = function (i) {
+ $scope.toggleHide = function(i)
+ {
- if ($scope.copyMontage[i].Monitor.listDisplay == 'show')
- $scope.copyMontage[i].Monitor.listDisplay = 'noshow';
- else
- $scope.copyMontage[i].Monitor.listDisplay = 'show';
+ if ($scope.copyMontage[i].Monitor.listDisplay == 'show')
+ $scope.copyMontage[i].Monitor.listDisplay = 'noshow';
+ else
+ $scope.copyMontage[i].Monitor.listDisplay = 'show';
- NVRDataModel.debug("index " + i + " is now " + $scope.copyMontage[i].Monitor.listDisplay);
- };
+ NVRDataModel.debug("index " + i + " is now " + $scope.copyMontage[i].Monitor.listDisplay);
+ };
- $scope.hideUnhide = function () {
- if ($scope.isDragabillyOn) {
- dragToggle();
- }
- // make a copy of the current list and work on that
- // this is to avoid packery screw ups while you are hiding/unhiding
- $scope.copyMontage = angular.copy($scope.MontageMonitors);
- $ionicModal.fromTemplateUrl('templates/reorder-modal.html', {
- scope: $scope,
- animation: 'slide-in-up'
- })
- .then(function (modal) {
- $scope.modal = modal;
- $scope.modal.show();
- });
- };
+ $scope.hideUnhide = function()
+ {
+ if ($scope.isDragabillyOn)
+ {
+ dragToggle();
+ }
+ // make a copy of the current list and work on that
+ // this is to avoid packery screw ups while you are hiding/unhiding
+ $scope.copyMontage = angular.copy($scope.MontageMonitors);
+ $ionicModal.fromTemplateUrl('templates/reorder-modal.html',
+ {
+ scope: $scope,
+ animation: 'slide-in-up'
+ })
+ .then(function(modal)
+ {
+ $scope.modal = modal;
+ $scope.modal.show();
+ });
+ };
+ /*
+ $scope.closeReorderModal = function () {
+
+ $scope.modal.remove();
+ };
+ */
- /*
- $scope.closeReorderModal = function () {
-
- $scope.modal.remove();
+ //----------------------------------------------------------------
+ // Alarm emit handling
+ //----------------------------------------------------------------
+ $rootScope.$on("alarm", function(event, args)
+ {
+ // FIXME: I should probably unregister this instead
+ if (typeof $scope.monitors === undefined)
+ return;
+ //console.log ("***EVENT TRAP***");
+ var alarmMonitors = args.message;
+ for (var i = 0; i < alarmMonitors.length; i++)
+ {
+ //console.log ("**** TRAPPED EVENT: "+alarmMonitors[i]);
- };
- */
-
- //----------------------------------------------------------------
- // Alarm emit handling
- //----------------------------------------------------------------
- $rootScope.$on("alarm", function (event, args) {
- // FIXME: I should probably unregister this instead
- if (typeof $scope.monitors === undefined)
- return;
- //console.log ("***EVENT TRAP***");
- var alarmMonitors = args.message;
- for (var i = 0; i < alarmMonitors.length; i++) {
- //console.log ("**** TRAPPED EVENT: "+alarmMonitors[i]);
-
- for (var j = 0; j < $scope.MontageMonitors.length; j++) {
- if ($scope.MontageMonitors[j].Monitor.Id == alarmMonitors[i]) {
- NVRDataModel.debug("Enabling alarm for Monitor:" + $scope.monitors[j].Monitor.Id);
- $scope.MontageMonitors[j].Monitor.isAlarmed = true;
- scheduleRemoveFlash(j);
+ for (var j = 0; j < $scope.MontageMonitors.length; j++)
+ {
+ if ($scope.MontageMonitors[j].Monitor.Id == alarmMonitors[i])
+ {
+ NVRDataModel.debug("Enabling alarm for Monitor:" + $scope.monitors[j].Monitor.Id);
+ $scope.MontageMonitors[j].Monitor.isAlarmed = true;
+ scheduleRemoveFlash(j);
+ }
}
+
}
+ });
+
+ function scheduleRemoveFlash(id)
+ {
+ NVRDataModel.debug("Scheduled a " + zm.alarmFlashTimer + "ms timer for dis-alarming monitor ID:" + $scope.MontageMonitors[id].Monitor.Id);
+ $timeout(function()
+ {
+ $scope.MontageMonitors[id].Monitor.isAlarmed = false;
+ NVRDataModel.debug("dis-alarming monitor ID:" + $scope.MontageMonitors[id].Monitor.Id);
+ }, zm.alarmFlashTimer);
}
+ //----------------------------------------------------------------
+ // Alarm notification handling
+ //----------------------------------------------------------------
+ $scope.handleAlarms = function()
+ {
+ $rootScope.isAlarm = !$rootScope.isAlarm;
+ if (!$rootScope.isAlarm)
+ {
+ $rootScope.alarmCount = "0";
+ $ionicHistory.nextViewOptions(
+ {
+ disableBack: true
+ });
+ $state.go("events",
+ {
+ "id": 0,
+ "playEvent": false
+ },
+ {
+ reload: true
+ });
+ return;
+ }
+ };
+
+ $scope.handleAlarmsWhileMinimized = function()
+ {
+ $rootScope.isAlarm = !$rootScope.isAlarm;
- });
-
- function scheduleRemoveFlash(id) {
- NVRDataModel.debug("Scheduled a " + zm.alarmFlashTimer + "ms timer for dis-alarming monitor ID:" + $scope.MontageMonitors[id].Monitor.Id);
- $timeout(function () {
- $scope.MontageMonitors[id].Monitor.isAlarmed = false;
- NVRDataModel.debug("dis-alarming monitor ID:" + $scope.MontageMonitors[id].Monitor.Id);
- }, zm.alarmFlashTimer);
- }
-
- //----------------------------------------------------------------
- // Alarm notification handling
- //----------------------------------------------------------------
- $scope.handleAlarms = function () {
- $rootScope.isAlarm = !$rootScope.isAlarm;
- if (!$rootScope.isAlarm) {
- $rootScope.alarmCount = "0";
- $ionicHistory.nextViewOptions({
- disableBack: true
- });
- $state.go("events", {
- "id": 0,
- "playEvent":false
- }, {
- reload: true
- });
- return;
- }
- };
+ $scope.minimal = !$scope.minimal;
+ NVRDataModel.debug("MontageCtrl: switch minimal is " + $scope.minimal);
+ ionic.Platform.fullScreen($scope.minimal, !$scope.minimal);
+ //console.log ("alarms:Cancelling timer");
+ $interval.cancel(intervalHandleMontage);
+ $interval.cancel(intervalHandleAlarmStatus);
- $scope.handleAlarmsWhileMinimized = function () {
- $rootScope.isAlarm = !$rootScope.isAlarm;
+ if (!$rootScope.isAlarm)
+ {
+ $rootScope.alarmCount = "0";
+ $ionicHistory.nextViewOptions(
+ {
+ disableBack: true
+ });
+ $state.go("events",
+ {
+ "id": 0,
+ "playEvent": false
+ },
+ {
+ reload: true
+ });
+ return;
+ }
+ };
- $scope.minimal = !$scope.minimal;
- NVRDataModel.debug("MontageCtrl: switch minimal is " + $scope.minimal);
- ionic.Platform.fullScreen($scope.minimal, !$scope.minimal);
- //console.log ("alarms:Cancelling timer");
- $interval.cancel(intervalHandleMontage);
- $interval.cancel(intervalHandleAlarmStatus);
+ //-------------------------------------------------------------
+ // this is checked to make sure we are not pulling images
+ // when app is in background. This is a problem with Android,
+ // for example
+ //-------------------------------------------------------------
- if (!$rootScope.isAlarm) {
- $rootScope.alarmCount = "0";
- $ionicHistory.nextViewOptions({
+ $scope.isBackground = function()
+ {
+ //console.log ("Is background called from Montage and returned " +
+ //NVRDataModel.isBackground());
+ return NVRDataModel.isBackground();
+ };
+
+ //---------------------------------------------------------------------
+ // Triggered when you enter/exit full screen
+ //---------------------------------------------------------------------
+ $scope.switchMinimal = function()
+ {
+ $scope.minimal = !$scope.minimal;
+ NVRDataModel.debug("MontageCtrl: switch minimal is " + $scope.minimal);
+ // console.log("Hide Statusbar");
+ ionic.Platform.fullScreen($scope.minimal, !$scope.minimal);
+ //console.log ("minimal switch:Cancelling timer");
+ $interval.cancel(intervalHandleMontage); //we will renew on reload
+ $interval.cancel(intervalHandleAlarmStatus);
+ // We are reloading this view, so we don't want entry animations
+ $ionicHistory.nextViewOptions(
+ {
+ disableAnimate: true,
disableBack: true
});
- $state.go("events", {
- "id": 0,
- "playEvent":false
- }, {
- reload: true
+ $state.go("montage",
+ {
+ minimal: $scope.minimal,
+ isRefresh: 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();
- };
-
-
- //---------------------------------------------------------------------
- // Triggered when you enter/exit full screen
- //---------------------------------------------------------------------
- $scope.switchMinimal = function () {
- $scope.minimal = !$scope.minimal;
- NVRDataModel.debug("MontageCtrl: switch minimal is " + $scope.minimal);
- // console.log("Hide Statusbar");
- ionic.Platform.fullScreen($scope.minimal, !$scope.minimal);
- //console.log ("minimal switch:Cancelling timer");
- $interval.cancel(intervalHandleMontage); //we will renew on reload
- $interval.cancel(intervalHandleAlarmStatus);
- // We are reloading this view, so we don't want entry animations
- $ionicHistory.nextViewOptions({
- disableAnimate: true,
- disableBack: true
- });
- $state.go("montage", {
- minimal: $scope.minimal,
- isRefresh: true
- });
- return;
- };
-
- //---------------------------------------------------------------------
- // Show/Hide PTZ control in monitor view
- //---------------------------------------------------------------------
- $scope.togglePTZ = function () {
- $scope.showPTZ = !$scope.showPTZ;
- };
-
+ };
+ //---------------------------------------------------------------------
+ // Show/Hide PTZ control in monitor view
+ //---------------------------------------------------------------------
+ $scope.togglePTZ = function()
+ {
+ $scope.showPTZ = !$scope.showPTZ;
+ };
- $scope.toggleSelectItem = function (ndx) {
+ $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);
- };
+ 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
- //---------------------------------------------------------------------
+ //---------------------------------------------------------------------
+ // Called when you enable/disable dragging
+ //---------------------------------------------------------------------
- $scope.dragToggle = function () {
- dragToggle();
+ $scope.dragToggle = function()
+ {
+ dragToggle();
+ };
- };
+ function dragToggle()
+ {
+ var i;
+ $scope.isDragabillyOn = !$scope.isDragabillyOn;
- function dragToggle() {
- var i;
- $scope.isDragabillyOn = !$scope.isDragabillyOn;
+ $ionicSideMenuDelegate.canDragContent($scope.isDragabillyOn ? false : true);
- $ionicSideMenuDelegate.canDragContent($scope.isDragabillyOn ? false : true);
+ //$timeout(function(){pckry.reloadItems();},10);
+ NVRDataModel.debug("setting dragabilly to " + $scope.isDragabillyOn);
+ if ($scope.isDragabillyOn)
+ {
+ $scope.showSizeButtons = 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();
+ }
- $scope.dragBorder = "dragborder";
- NVRDataModel.debug("Enabling drag for " + draggies.length + " items");
- for (i = 0; i < draggies.length; i++) {
- draggies[i].enable();
- draggies[i].bindHandles();
+ // reflow and reload as some may be hidden
+ // $timeout(function(){pckry.reloadItems();$timeout(function(){pckry.layout();},300);},100);
}
+ else
+ {
+ $scope.dragBorder = "";
+ NVRDataModel.debug("Disabling drag for " + draggies.length + " items");
+ for (i = 0; i < draggies.length; i++)
+ {
+ draggies[i].disable();
+ draggies[i].unbindHandles();
+ }
+ for (i = 0; i < $scope.MontageMonitors.length; i++)
+ {
+ $scope.MontageMonitors[i].Monitor.selectStyle = "";
+ }
+ // reflow and reload as some may be hidden
+ $timeout(function()
+ {
+ $timeout(function()
+ {
+ var positions = pckry.getShiftPositions('data-item-id');
+ //console.log ("POSITIONS MAP " + JSON.stringify(positions));
+ var ld = NVRDataModel.getLogin();
+ ld.packeryPositions = JSON.stringify(positions);
+ //console.log ("Saving " + ld.packeryPositions);
+ NVRDataModel.setLogin(ld);
+ }, 300);
+ }, 100);
- // reflow and reload as some may be hidden
- // $timeout(function(){pckry.reloadItems();$timeout(function(){pckry.layout();},300);},100);
- } else {
- $scope.dragBorder = "";
- NVRDataModel.debug("Disabling drag for " + draggies.length + " items");
- for (i = 0; i < draggies.length; i++) {
- draggies[i].disable();
- draggies[i].unbindHandles();
- }
- for (i = 0; i < $scope.MontageMonitors.length; i++) {
- $scope.MontageMonitors[i].Monitor.selectStyle = "";
}
- // reflow and reload as some may be hidden
- $timeout(function () {
- $timeout(function () {
- var positions = pckry.getShiftPositions('data-item-id');
- //console.log ("POSITIONS MAP " + JSON.stringify(positions));
- var ld = NVRDataModel.getLogin();
- ld.packeryPositions = JSON.stringify(positions);
- //console.log ("Saving " + ld.packeryPositions);
- NVRDataModel.setLogin(ld);
- }, 300);
- }, 100);
-
}
- }
-
-
-
- //---------------------------------------------------------------------
- // main monitor modal open - if drag is not on, this is called on touch
- //---------------------------------------------------------------------
-
- $scope.openModal = function (mid, controllable, controlid, connKey, monitor) {
- openModal(mid, controllable, controlid, connKey, monitor);
- };
-
- function openModal(mid, controllable, controlid, connKey, monitor) {
- NVRDataModel.debug("MontageCtrl: Open Monitor Modal with monitor Id=" + mid + " and Controllable:" + controllable + " with control ID:" + controlid);
- // $scope.isModalActive = true;
- // Note: no need to setAwake(true) as its already awake
- // in montage view
-
- NVRDataModel.log("Cancelling montage timer, opening Modal");
- // NVRDataModel.log("Starting Modal timer");
- //console.log ("openModal:Cancelling timer");
- $interval.cancel(intervalHandleMontage);
- $interval.cancel(intervalHandleAlarmStatus);
-
- $scope.monitor = monitor;
- $scope.showPTZ = false;
- $scope.monitorId = mid;
- $scope.monitorName = NVRDataModel.getMonitorName(mid);
- $scope.controlid = controlid;
-
- //$scope.LoginData = NVRDataModel.getLogin();
- $rootScope.modalRand = Math.floor(Math.random() * (999999 - 111111 + 1)) + 111111;
-
-
- $scope.ptzMoveCommand = "";
- $scope.ptzStopCommand = "";
- $scope.zoomInCommand = "";
- $scope.zoomOutCommand = "";
- $scope.zoomStopCommand = "zoomStop";
- $scope.canZoom = false;
-
- $scope.presetOn = false;
-
- $scope.connKey = (Math.floor((Math.random() * 999999) + 1)).toString();
- $scope.isControllable = controllable;
- $scope.refMonitor = monitor;
+ //---------------------------------------------------------------------
+ // main monitor modal open - if drag is not on, this is called on touch
+ //---------------------------------------------------------------------
+ $scope.openModal = function(mid, controllable, controlid, connKey, monitor)
+ {
+ openModal(mid, controllable, controlid, connKey, monitor);
+ };
- // This is a modal to show the monitor footage
- // We need to switch to always awake if set so the feed doesn't get interrupted
- NVRDataModel.setAwake(NVRDataModel.getKeepAwake());
+ function openModal(mid, controllable, controlid, connKey, monitor)
+ {
+ NVRDataModel.debug("MontageCtrl: Open Monitor Modal with monitor Id=" + mid + " and Controllable:" + controllable + " with control ID:" + controlid);
+ // $scope.isModalActive = true;
+ // Note: no need to setAwake(true) as its already awake
+ // in montage view
+
+ NVRDataModel.log("Cancelling montage timer, opening Modal");
+ // NVRDataModel.log("Starting Modal timer");
+ //console.log ("openModal:Cancelling timer");
+ $interval.cancel(intervalHandleMontage);
+ $interval.cancel(intervalHandleAlarmStatus);
+
+ $scope.monitor = monitor;
+ $scope.showPTZ = false;
+ $scope.monitorId = mid;
+ $scope.monitorName = NVRDataModel.getMonitorName(mid);
+ $scope.controlid = controlid;
+
+ //$scope.LoginData = NVRDataModel.getLogin();
+ $rootScope.modalRand = Math.floor(Math.random() * (999999 - 111111 + 1)) + 111111;
+
+ $scope.ptzMoveCommand = "";
+ $scope.ptzStopCommand = "";
+
+ $scope.zoomInCommand = "";
+ $scope.zoomOutCommand = "";
+ $scope.zoomStopCommand = "zoomStop";
+ $scope.canZoom = false;
+
+ $scope.presetOn = false;
+
+ $scope.connKey = (Math.floor((Math.random() * 999999) + 1)).toString();
+ $scope.isControllable = controllable;
+ $scope.refMonitor = monitor;
+
+ // This is a modal to show the monitor footage
+ // We need to switch to always awake if set so the feed doesn't get interrupted
+ NVRDataModel.setAwake(NVRDataModel.getKeepAwake());
+
+ // This is a modal to show the monitor footage
+ $ionicModal.fromTemplateUrl('templates/monitors-modal.html',
+ {
+ scope: $scope,
+ animation: 'slide-in-up'
+ })
+ .then(function(modal)
+ {
+ $scope.modal = modal;
+ $ionicLoading.show(
+ {
+ template: $translate.instant('kPleaseWait'),
+ noBackdrop: true,
+ duration: zm.loadingTimeout
+ });
- // This is a modal to show the monitor footage
- $ionicModal.fromTemplateUrl('templates/monitors-modal.html', {
- scope: $scope,
- animation: 'slide-in-up'
+ // we don't really need this as we have stopped the timer
+ // $scope.isModalActive = true;
- })
- .then(function (modal) {
- $scope.modal = modal;
+ //$timeout (function() {pckry.shiftLayout();},zm.packeryTimer);
+ $scope.modal.show();
- $ionicLoading.show({
- template: $translate.instant('kPleaseWait'),
- noBackdrop: true,
- duration: zm.loadingTimeout
});
+ }
- // we don't really need this as we have stopped the timer
- // $scope.isModalActive = true;
-
- //$timeout (function() {pckry.shiftLayout();},zm.packeryTimer);
- $scope.modal.show();
-
- });
-
- }
-
- //---------------------------------------------------------------------
- //
- //---------------------------------------------------------------------
-
- function cleanupOnClose() {
- $scope.modal.remove();
- $timeout(function () {
- NVRDataModel.log("MontageCtrl:Stopping network pull...");
- if (NVRDataModel.isForceNetworkStop()) NVRDataModel.stopNetwork();
- }, 50);
-
- $rootScope.rand = Math.floor((Math.random() * 100000) + 1);
- $scope.isModalActive = false;
-
- NVRDataModel.log("Restarting montage timer, closing Modal...");
- var ld = NVRDataModel.getLogin();
- // console.log ("closeModal: Cancelling timer");
- $interval.cancel(intervalHandleMontage);
- $interval.cancel(intervalHandleAlarmStatus);
-
- intervalHandleMontage = $interval(function () {
- loadNotifications();
- // console.log ("Refreshing Image...");
- }.bind(this), refreshSec * 1000);
-
- intervalHandleAlarmStatus = $interval(function () {
- loadAlarmStatus();
- // console.log ("Refreshing Image...");
- }.bind(this), 5000);
-
- // $timeout (function() {pckry.shiftLayout();},zm.packeryTimer);
-
-
- }
-
- $scope.closeModal = function () {
- NVRDataModel.debug("MontageCtrl: Close & Destroy Monitor Modal");
- cleanupOnClose();
- // $scope.isModalActive = false;
- // Note: no need to setAwake(false) as needs to be awake
- // in montage view
-
-
-
- };
+ //---------------------------------------------------------------------
+ //
+ //---------------------------------------------------------------------
+ function cleanupOnClose()
+ {
+ $scope.modal.remove();
+ $timeout(function()
+ {
+ NVRDataModel.log("MontageCtrl:Stopping network pull...");
+ if (NVRDataModel.isForceNetworkStop()) NVRDataModel.stopNetwork();
+ }, 50);
+ $rootScope.rand = Math.floor((Math.random() * 100000) + 1);
+ $scope.isModalActive = false;
+ NVRDataModel.log("Restarting montage timer, closing Modal...");
+ var ld = NVRDataModel.getLogin();
+ // console.log ("closeModal: Cancelling timer");
+ $interval.cancel(intervalHandleMontage);
+ $interval.cancel(intervalHandleAlarmStatus);
- //---------------------------------------------------------------------
- // 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
- //---------------------------------------------------------------------
+ intervalHandleMontage = $interval(function()
+ {
+ loadNotifications();
+ // console.log ("Refreshing Image...");
+ }.bind(this), refreshSec * 1000);
- function onPause() {
- NVRDataModel.debug("MontageCtrl: onpause called");
- $interval.cancel(intervalHandleMontage);
- $interval.cancel(intervalHandleAlarmStatus);
- // $interval.cancel(modalIntervalHandle);
+ intervalHandleAlarmStatus = $interval(function()
+ {
+ loadAlarmStatus();
+ // console.log ("Refreshing Image...");
+ }.bind(this), 5000);
- // FIXME: Do I need to setAwake(false) here?
- }
+ // $timeout (function() {pckry.shiftLayout();},zm.packeryTimer);
+ }
- function onResume() {
+ $scope.closeModal = function()
+ {
+ NVRDataModel.debug("MontageCtrl: Close & Destroy Monitor Modal");
+ cleanupOnClose();
+ // $scope.isModalActive = false;
+ // Note: no need to setAwake(false) as needs to be awake
+ // in montage view
+ };
- }
+ //---------------------------------------------------------------------
+ // 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
+ //---------------------------------------------------------------------
- $scope.openMenu = function () {
- $timeout(function () {
- $rootScope.stateofSlide = $ionicSideMenuDelegate.isOpen();
- }, 500);
+ function onPause()
+ {
+ NVRDataModel.debug("MontageCtrl: onpause called");
+ $interval.cancel(intervalHandleMontage);
+ $interval.cancel(intervalHandleAlarmStatus);
+ // $interval.cancel(modalIntervalHandle);
- $ionicSideMenuDelegate.toggleLeft();
- };
+ // FIXME: Do I need to setAwake(false) here?
+ }
- $scope.$on('$destroy', function () {
+ function onResume()
+ {
- });
+ }
+ $scope.openMenu = function()
+ {
+ $timeout(function()
+ {
+ $rootScope.stateofSlide = $ionicSideMenuDelegate.isOpen();
+ }, 500);
- $scope.$on('$ionicView.loaded', function () {
- // console.log("**VIEW ** Montage Ctrl Loaded");
- });
+ $ionicSideMenuDelegate.toggleLeft();
+ };
+ $scope.$on('$destroy', function() {
+ });
- $scope.$on('$ionicView.leave', function () {
- // console.log("**VIEW ** Montage Ctrl Left, force removing modal");
- if ($scope.modal) $scope.modal.remove();
- });
+ $scope.$on('$ionicView.loaded', function()
+ {
+ // console.log("**VIEW ** Montage Ctrl Loaded");
+ });
+ $scope.$on('$ionicView.leave', function()
+ {
+ // console.log("**VIEW ** Montage Ctrl Left, force removing modal");
+ if ($scope.modal) $scope.modal.remove();
+ });
+ function orientationChanged()
+ {
+ /* NVRDataModel.debug("Detected orientation change, redoing packery resize");
+ $timeout(function () {
+ if (pckry) pckry.onresize();
+ }, zm.packeryTimer);*/
+
+ /* var positions = pckry.getShiftPositions('data-item-id');
+ $timeout(function () {
+ NVRDataModel.log("init shift layout");
+ pckry.initShiftLayout(positions,"data-item-id");
+ $ionicScrollDelegate.$getByHandle("montage-delegate").scrollTop();
+ }, 20);*/
- function orientationChanged() {
- /* NVRDataModel.debug("Detected orientation change, redoing packery resize");
- $timeout(function () {
- if (pckry) pckry.onresize();
- }, zm.packeryTimer);*/
-
- /* var positions = pckry.getShiftPositions('data-item-id');
- $timeout(function () {
- NVRDataModel.log("init shift layout");
- pckry.initShiftLayout(positions,"data-item-id");
- $ionicScrollDelegate.$getByHandle("montage-delegate").scrollTop();
- }, 20);*/
-
//console.log ("POSITIONS MAP " + JSON.stringify(positions));
- // var ld = NVRDataModel.getLogin();
- // ld.packeryPositions = JSON.stringify(positions);
+ // var ld = NVRDataModel.getLogin();
+ // ld.packeryPositions = JSON.stringify(positions);
//console.log ("Saving " + ld.packeryPositions);
- // NVRDataModel.setLogin(ld);
- }
-
- $scope.toggleSizeButtons = function () {
-
- $scope.showSizeButtons = !$scope.showSizeButtons;
-
- NVRDataModel.debug("toggling size buttons:" + $scope.showSizeButtons);
- if ($scope.showSizeButtons) $ionicScrollDelegate.$getByHandle("montage-delegate").scrollTop();
- };
+ // NVRDataModel.setLogin(ld);
+ }
- // minimal has to be beforeEnter or header won't hide
- $scope.$on('$ionicView.beforeEnter', function () {
- $scope.minimal = $stateParams.minimal;
- //console.log ("**************** MINIMAL ENTER " + $scope.minimal);
- $scope.zmMarginTop = $scope.minimal ? 0 : 15;
+ $scope.toggleSizeButtons = function()
+ {
+ $scope.showSizeButtons = !$scope.showSizeButtons;
+ NVRDataModel.debug("toggling size buttons:" + $scope.showSizeButtons);
+ if ($scope.showSizeButtons) $ionicScrollDelegate.$getByHandle("montage-delegate").scrollTop();
+ };
+ // minimal has to be beforeEnter or header won't hide
+ $scope.$on('$ionicView.beforeEnter', function()
+ {
+ $scope.minimal = $stateParams.minimal;
+ //console.log ("**************** MINIMAL ENTER " + $scope.minimal);
+ $scope.zmMarginTop = $scope.minimal ? 0 : 15;
- });
+ });
- $scope.toggleTimeType = function()
- {
- if (NVRDataModel.isTzSupported())
+ $scope.toggleTimeType = function()
{
- if ($scope.iconTimeNow == 'server')
+ if (NVRDataModel.isTzSupported())
{
+ if ($scope.iconTimeNow == 'server')
+ {
$scope.iconTimeNow = 'local';
$scope.timeNow = $translate.instant('kPleaseWait');
- }
- else
- {
+ }
+ else
+ {
$scope.iconTimeNow = 'server';
$scope.timeNow = $translate.instant('kPleaseWait');
+ }
}
- }
- else
- NVRDataModel.debug ("timezone API not supported, can't display");
- };
-
-
- $scope.$on('$ionicView.afterEnter', function () {
- NVRDataModel.debug("Setting image mode to snapshot, will change to image when packery is all done");
- $scope.areImagesLoading = true;
- $scope.isDragabillyOn = false;
-
-
- if (NVRDataModel.isTzSupported())
- $scope.iconTimeNow = 'server';
- else
- $scope.iconTimeNow = 'local';
-
- if ($scope.iconTimeNow == 'local')
- $scope.timeNow = moment().format(NVRDataModel.getTimeFormatSec());
- else
- $scope.timeNow = moment().tz(NVRDataModel.getTimeZoneNow()).format(NVRDataModel.getTimeFormatSec());
-
-
- $scope.gridScale = "grid-item-50";
- $scope.LoginData = NVRDataModel.getLogin();
- //FIXME
-
- if (NVRDataModel.getBandwidth() == 'lowbw') {
- NVRDataModel.debug("Enabling low bandwidth parameters");
- $scope.LoginData.montageQuality = zm.montageQualityLowBW;
- $scope.LoginData.singleImageQuality = zm.eventSingleImageQualityLowBW;
- $scope.LoginData.montageHistoryQuality = zm.montageQualityLowBW;
-
+ else
+ NVRDataModel.debug("timezone API not supported, can't display");
+ };
- }
+ $scope.$on('$ionicView.afterEnter', function()
+ {
+ NVRDataModel.debug("Setting image mode to snapshot, will change to image when packery is all done");
+ $scope.areImagesLoading = true;
+ $scope.isDragabillyOn = false;
+ if (NVRDataModel.isTzSupported())
+ $scope.iconTimeNow = 'server';
+ else
+ $scope.iconTimeNow = 'local';
- $scope.monLimit = $scope.LoginData.maxMontage;
- $scope.showSizeButtons = false;
+ if ($scope.iconTimeNow == 'local')
+ $scope.timeNow = moment().format(NVRDataModel.getTimeFormatSec());
+ else
+ $scope.timeNow = moment().tz(NVRDataModel.getTimeZoneNow()).format(NVRDataModel.getTimeFormatSec());
+ $scope.gridScale = "grid-item-50";
+ $scope.LoginData = NVRDataModel.getLogin();
+ //FIXME
- $scope.monitors = message;
- $scope.MontageMonitors = angular.copy(message);
- $scope.sliderChanging = false;
- loginData = NVRDataModel.getLogin();
+ if (NVRDataModel.getBandwidth() == 'lowbw')
+ {
+ NVRDataModel.debug("Enabling low bandwidth parameters");
+ $scope.LoginData.montageQuality = zm.montageQualityLowBW;
+ $scope.LoginData.singleImageQuality = zm.eventSingleImageQualityLowBW;
+ $scope.LoginData.montageHistoryQuality = zm.montageQualityLowBW;
- $scope.isRefresh = $stateParams.isRefresh;
- sizeInProgress = false;
- $scope.imageStyle = true;
- intervalHandleMontage = "";
- $scope.isModalActive = false;
- $scope.isReorder = false;
+ }
- $ionicSideMenuDelegate.canDragContent($scope.minimal ? true : true);
+ $scope.monLimit = $scope.LoginData.maxMontage;
+ $scope.showSizeButtons = false;
+ $scope.monitors = message;
+ $scope.MontageMonitors = angular.copy(message);
+ $scope.sliderChanging = false;
+ loginData = NVRDataModel.getLogin();
- $scope.areImagesLoading = true;
- var ld = NVRDataModel.getLogin();
+ $scope.isRefresh = $stateParams.isRefresh;
+ sizeInProgress = false;
+ $scope.imageStyle = true;
+ intervalHandleMontage = "";
+ $scope.isModalActive = false;
+ $scope.isReorder = false;
- refreshSec = (NVRDataModel.getBandwidth()=='lowbw') ? ld.refreshSecLowBW : ld.refreshSec;
+ $ionicSideMenuDelegate.canDragContent($scope.minimal ? true : true);
- NVRDataModel.debug("bandwidth: " + NVRDataModel.getBandwidth() + " montage refresh set to: " + refreshSec);
+ $scope.areImagesLoading = true;
+ var ld = NVRDataModel.getLogin();
- //console.log("Setting Awake to " + NVRDataModel.getKeepAwake());
- NVRDataModel.setAwake(NVRDataModel.getKeepAwake());
+ refreshSec = (NVRDataModel.getBandwidth() == 'lowbw') ? ld.refreshSecLowBW : ld.refreshSec;
- $interval.cancel(intervalHandleMontage);
- $interval.cancel(intervalHandleAlarmStatus);
+ NVRDataModel.debug("bandwidth: " + NVRDataModel.getBandwidth() + " montage refresh set to: " + refreshSec);
- intervalHandleMontage = $interval(function () {
- loadNotifications();
- // console.log ("Refreshing Image...");
- }.bind(this), refreshSec * 1000);
+ //console.log("Setting Awake to " + NVRDataModel.getKeepAwake());
+ NVRDataModel.setAwake(NVRDataModel.getKeepAwake());
- intervalHandleAlarmStatus = $interval(function () {
- loadAlarmStatus();
- // console.log ("Refreshing Image...");
- }.bind(this), 5000);
+ $interval.cancel(intervalHandleMontage);
+ $interval.cancel(intervalHandleAlarmStatus);
+ intervalHandleMontage = $interval(function()
+ {
+ loadNotifications();
+ // console.log ("Refreshing Image...");
+ }.bind(this), refreshSec * 1000);
- loadNotifications();
+ intervalHandleAlarmStatus = $interval(function()
+ {
+ loadAlarmStatus();
+ // console.log ("Refreshing Image...");
+ }.bind(this), 5000);
- if ($scope.MontageMonitors.length == 0) {
- $rootScope.zmPopup = $ionicPopup.alert({
- title: $translate.instant('kNoMonitors'),
- template: $translate.instant('kCheckCredentials')
- });
- $ionicHistory.nextViewOptions({
- disableBack: true
- });
- $state.go("login", {
- "wizard": false
- });
- return;
- }
+ loadNotifications();
- ld = NVRDataModel.getLogin();
+ if ($scope.MontageMonitors.length == 0)
+ {
+ $rootScope.zmPopup = $ionicPopup.alert(
+ {
+ title: $translate.instant('kNoMonitors'),
+ template: $translate.instant('kCheckCredentials')
+ });
+ $ionicHistory.nextViewOptions(
+ {
+ disableBack: true
+ });
+ $state.go("login",
+ {
+ "wizard": false
+ });
+ return;
+ }
- $rootScope.authSession = "undefined";
- $ionicLoading.show({
- template: $translate.instant('kNegotiatingStreamAuth'),
- animation: 'fade-in',
- showBackdrop: true,
- duration: zm.loadingTimeout,
- maxWidth: 300,
- showDelay: 0
- });
+ ld = NVRDataModel.getLogin();
+ $rootScope.authSession = "undefined";
+ $ionicLoading.show(
+ {
+ template: $translate.instant('kNegotiatingStreamAuth'),
+ animation: 'fade-in',
+ showBackdrop: true,
+ duration: zm.loadingTimeout,
+ maxWidth: 300,
+ showDelay: 0
+ });
- NVRDataModel.log("Inside Montage Ctrl:We found " + $scope.monitors.length + " monitors");
+ NVRDataModel.log("Inside Montage Ctrl:We found " + $scope.monitors.length + " monitors");
- // set them all at 50% for packery
- for (var i = 0; i < $scope.MontageMonitors.length; i++) {
- $scope.MontageMonitors[i].Monitor.gridScale = "50";
- $scope.MontageMonitors[i].Monitor.selectStyle = "";
- $scope.MontageMonitors[i].Monitor.alarmState = 'color:rgba(0,0,0,0);';
+ // set them all at 50% for packery
+ for (var i = 0; i < $scope.MontageMonitors.length; i++)
+ {
+ $scope.MontageMonitors[i].Monitor.gridScale = "50";
+ $scope.MontageMonitors[i].Monitor.selectStyle = "";
+ $scope.MontageMonitors[i].Monitor.alarmState = 'color:rgba(0,0,0,0);';
- }
+ }
- $rootScope.validMonitorId = $scope.monitors[0].Monitor.Id;
- NVRDataModel.getAuthKey($rootScope.validMonitorId, (Math.floor((Math.random() * 999999) + 1)).toString())
- .then(function (success) {
- $ionicLoading.hide();
- //console.log(success);
- $rootScope.authSession = success;
- NVRDataModel.log("Stream authentication construction: " +
- $rootScope.authSession);
- $timeout(function () {
+ $rootScope.validMonitorId = $scope.monitors[0].Monitor.Id;
+ NVRDataModel.getAuthKey($rootScope.validMonitorId, (Math.floor((Math.random() * 999999) + 1)).toString())
+ .then(function(success)
+ {
+ $ionicLoading.hide();
+ //console.log(success);
+ $rootScope.authSession = success;
+ NVRDataModel.log("Stream authentication construction: " +
+ $rootScope.authSession);
+ $timeout(function()
+ {
initPackery();
}, zm.packeryTimer);
- },
- function (error) {
+ },
+ function(error)
+ {
- $ionicLoading.hide();
- NVRDataModel.debug("MontageCtrl: Error in authkey retrieval " + error);
- //$rootScope.authSession="";
- NVRDataModel.log("MontageCtrl: Error returned Stream authentication construction. Retaining old value of: " + $rootScope.authSession);
- $timeout(function () {
+ $ionicLoading.hide();
+ NVRDataModel.debug("MontageCtrl: Error in authkey retrieval " + error);
+ //$rootScope.authSession="";
+ NVRDataModel.log("MontageCtrl: Error returned Stream authentication construction. Retaining old value of: " + $rootScope.authSession);
+ $timeout(function()
+ {
initPackery();
}, zm.packeryTimer);
- });
-
- //console.log("**VIEW ** Montage Ctrl AFTER ENTER");
- window.addEventListener("resize", orientationChanged, false);
-
- document.addEventListener("pause", onPause, false);
- document.addEventListener("resume", onResume, false);
-
-
-
-
- });
-
- $scope.$on('$ionicView.beforeLeave', function () {
- // console.log("**VIEW ** Montage Ctrl Left, force removing modal");
-
- //console.log ("beforeLeave:Cancelling timer");
- $interval.cancel(intervalHandleMontage);
- $interval.cancel(intervalHandleAlarmStatus);
- pckry.destroy();
- window.removeEventListener("resize", orientationChanged, false);
+ });
+ //console.log("**VIEW ** Montage Ctrl AFTER ENTER");
+ window.addEventListener("resize", orientationChanged, false);
- // make sure this is applied in scope digest to stop network pull
- // thats why we are doing it beforeLeave
+ document.addEventListener("pause", onPause, false);
+ document.addEventListener("resume", onResume, false);
- if (NVRDataModel.isForceNetworkStop()) {
- NVRDataModel.log("MontageCtrl:Stopping network pull...");
- NVRDataModel.stopNetwork();
+ });
- }
+ $scope.$on('$ionicView.beforeLeave', function()
+ {
+ // console.log("**VIEW ** Montage Ctrl Left, force removing modal");
- });
+ //console.log ("beforeLeave:Cancelling timer");
+ $interval.cancel(intervalHandleMontage);
+ $interval.cancel(intervalHandleAlarmStatus);
+ pckry.destroy();
+ window.removeEventListener("resize", orientationChanged, false);
+ // make sure this is applied in scope digest to stop network pull
+ // thats why we are doing it beforeLeave
+ if (NVRDataModel.isForceNetworkStop())
+ {
+ NVRDataModel.log("MontageCtrl:Stopping network pull...");
+ NVRDataModel.stopNetwork();
+ }
- $scope.$on('$ionicView.unloaded', function () {
+ });
- });
+ $scope.$on('$ionicView.unloaded', function() {
+ });
- $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.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;
+ // 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";
+ 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.reloadItems();
+
+ pckry.once('layoutComplete', function()
+ {
+ //console.log ("Layout complete");
+ var positions = pckry.getShiftPositions('data-item-id');
+ //console.log ("POSITIONS MAP " + JSON.stringify(positions));
+ var ld = NVRDataModel.getLogin();
+
+ ld.packeryPositions = JSON.stringify(positions);
+ //console.log ("Saving " + ld.packeryPositions);
+ NVRDataModel.setLogin(ld);
+ // $scope.slider.monsize = 2;
+ });
+ //layout(pckry);
- pckry.once('layoutComplete', function () {
- //console.log ("Layout complete");
- var positions = pckry.getShiftPositions('data-item-id');
- //console.log ("POSITIONS MAP " + JSON.stringify(positions));
- var ld = NVRDataModel.getLogin();
-
- ld.packeryPositions = JSON.stringify(positions);
- //console.log ("Saving " + ld.packeryPositions);
- NVRDataModel.setLogin(ld);
- // $scope.slider.monsize = 2;
- });
- //layout(pckry);
-
pckry.layout();
-
+ }, 20);
- }, 20);
+ };
- };
+ function layout(pckry)
+ {
+ pckry.shiftLayout();
+ }
+ //---------------------------------------------------------
+ // slider is tied to the view slider for montage
+ //Remember not to use a variable. I'm using an object
+ // so it's passed as a reference - otherwise it makes
+ // a copy and the value never changes
+ //---------------------------------------------------------
- function layout(pckry) {
- pckry.shiftLayout();
- }
+ $scope.sliderChanged = function(dirn)
+ {
- //---------------------------------------------------------
- // slider is tied to the view slider for montage
- //Remember not to use a variable. I'm using an object
- // so it's passed as a reference - otherwise it makes
- // a copy and the value never changes
- //---------------------------------------------------------
+ if ($scope.sliderChanging)
+ {
+ console.log("too fast my friend");
+ //$scope.slider.monsize = oldSliderVal;
+ return;
+ }
- $scope.sliderChanged = function (dirn) {
+ $scope.sliderChanging = true;
- if ($scope.sliderChanging) {
- console.log ("too fast my friend");
- //$scope.slider.monsize = oldSliderVal;
- return;
- }
+ $ionicLoading.show(
+ {
+ template: $translate.instant('kPleaseWait'),
+ noBackdrop: true,
+ duration: 5000
+ });
-
-
- $scope.sliderChanging = true;
-
- $ionicLoading.show({
- template: $translate.instant('kPleaseWait'),
- noBackdrop: true,
- duration: 5000
- });
+ var somethingReset = false;
- var somethingReset = false;
-
- var oldScales = {};
- pckry.getItemElements().forEach(function (elem) {
+ var oldScales = {};
+ pckry.getItemElements().forEach(function(elem)
+ {
var id = elem.getAttribute("data-item-id");
var sz = elem.getAttribute("data-item-size");
oldScales[id] = sz;
- console.log ("REMEMBERING "+id+":"+sz);
-
+ console.log("REMEMBERING " + id + ":" + sz);
+
});
-
- // this only changes items that are selected
- for (var i = 0; i < $scope.MontageMonitors.length; i++) {
+ // 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);
+ 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") {
+ 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;
+ //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;
- }
- }
-
- // reload sizes from DOM and trigger a layout
-
- $timeout (function() {
- console.log ("Calling re-layout");
- //pckry.reloadItems();
-
- if (dirn == 1) //expand
- {
- pckry.getItemElements().forEach(function (elem) {
- var id = elem.getAttribute("data-item-id");
- var sz = elem.getAttribute("data-item-size");
- console.log ("NOW IT IS-> "+id+":"+sz);
- if (oldScales[id] != sz)
+ // this changes all items if none were selected
+ if (!somethingReset && $scope.isDragabillyOn) // nothing was selected
+ {
+ for (i = 0; i < $scope.MontageMonitors.length; i++)
{
- console.log ("Calling FIT on " + id + " size:"+oldScales[id]+"->"+sz);
- pckry.once('fitComplete', resizeComplete);
- pckry.fit(elem);
-
+ 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;
}
- });
- }
- else //shrink
- {
- console.log ("Calling shift");
- pckry.once('layoutComplete', resizeComplete);
- pckry.shiftLayout();
-
-
- }
-
- },20);
-
-
-
+ }
+ // reload sizes from DOM and trigger a layout
- /* if (!somethingReset) {
- //console.log (">>>SOMETHING NOT RESET");
- $timeout(function () {
- pckry.layout();
- }, zm.packeryTimer);
- } else {
-
- //console.log (">>>SOMETHING RESET");
- $timeout(function () {
- layout(pckry);
- }, zm.packeryTimer);
- }*/
- function resizeComplete()
- {
- //console.log ("HERE");
- $timeout(function () {
- var positions = pckry.getShiftPositions('data-item-id');
- console.log ("SAVING");
- var ld = NVRDataModel.getLogin();
-
- ld.packeryPositions = JSON.stringify(positions);
- //console.log ("Saving " + ld.packeryPositions);
- NVRDataModel.setLogin(ld);
- $ionicLoading.hide();
- $scope.sliderChanging = false;
- }, 20);
-
- }
+ $timeout(function()
+ {
+ console.log("Calling re-layout");
+ //pckry.reloadItems();
+ if (dirn == 1) //expand
+ {
+ pckry.getItemElements().forEach(function(elem)
+ {
+ var id = elem.getAttribute("data-item-id");
+ var sz = elem.getAttribute("data-item-size");
+ console.log("NOW IT IS-> " + id + ":" + sz);
+ if (oldScales[id] != sz)
+ {
+ console.log("Calling FIT on " + id + " size:" + oldScales[id] + "->" + sz);
+ pckry.once('fitComplete', resizeComplete);
+ pckry.fit(elem);
+ }
+ });
+ }
+ else //shrink
+ {
+ console.log("Calling shift");
+ pckry.once('layoutComplete', resizeComplete);
+ pckry.shiftLayout();
- };
+ }
+ }, 20);
+ /* if (!somethingReset) {
+ //console.log (">>>SOMETHING NOT RESET");
+ $timeout(function () {
+ pckry.layout();
+ }, zm.packeryTimer);
+ } else {
+
+ //console.log (">>>SOMETHING RESET");
+ $timeout(function () {
+ layout(pckry);
+ }, zm.packeryTimer);
+ }*/
+ function resizeComplete()
+ {
+ //console.log ("HERE");
+ $timeout(function()
+ {
+ var positions = pckry.getShiftPositions('data-item-id');
+ console.log("SAVING");
+ var ld = NVRDataModel.getLogin();
- $scope.$on('$ionicView.afterEnter', function () {
- // This rand is really used to reload the monitor image in img-src so it is not cached
- // I am making sure the image in montage view is always fresh
- // I don't think I am using this anymore FIXME: check and delete if needed
- // $rootScope.rand = Math.floor((Math.random() * 100000) + 1);
- });
+ ld.packeryPositions = JSON.stringify(positions);
+ //console.log ("Saving " + ld.packeryPositions);
+ NVRDataModel.setLogin(ld);
+ $ionicLoading.hide();
+ $scope.sliderChanging = false;
+ }, 20);
- $scope.reloadView = function () {
- $rootScope.rand = Math.floor((Math.random() * 100000) + 1);
- NVRDataModel.log("User action: image reload " + $rootScope.rand);
- };
+ }
- $scope.doRefresh = function () {
+ };
+ $scope.$on('$ionicView.afterEnter', function()
+ {
+ // This rand is really used to reload the monitor image in img-src so it is not cached
+ // I am making sure the image in montage view is always fresh
+ // I don't think I am using this anymore FIXME: check and delete if needed
+ // $rootScope.rand = Math.floor((Math.random() * 100000) + 1);
+ });
- // console.log("***Pull to Refresh, recomputing Rand");
- NVRDataModel.log("Reloading view for montage view, recomputing rand");
- $rootScope.rand = Math.floor((Math.random() * 100000) + 1);
- $scope.monitors = [];
- imageLoadingDataShare.set(0);
+ $scope.reloadView = function()
+ {
+ $rootScope.rand = Math.floor((Math.random() * 100000) + 1);
+ NVRDataModel.log("User action: image reload " + $rootScope.rand);
+ };
+
+ $scope.doRefresh = function()
+ {
- var refresh = NVRDataModel.getMonitors(1);
+ // console.log("***Pull to Refresh, recomputing Rand");
+ NVRDataModel.log("Reloading view for montage view, recomputing rand");
+ $rootScope.rand = Math.floor((Math.random() * 100000) + 1);
+ $scope.monitors = [];
+ imageLoadingDataShare.set(0);
- refresh.then(function (data) {
- $scope.monitors = data;
- $scope.$broadcast('scroll.refreshComplete');
- });
- };
+ var refresh = NVRDataModel.getMonitors(1);
+ refresh.then(function(data)
+ {
+ $scope.monitors = data;
+ $scope.$broadcast('scroll.refreshComplete');
+ });
+ };
-}]);
+ }]);
diff --git a/www/js/MontageHistoryCtrl.js b/www/js/MontageHistoryCtrl.js
index 7b1ca2c1..ab902973 100644
--- a/www/js/MontageHistoryCtrl.js
+++ b/www/js/MontageHistoryCtrl.js
@@ -3,16 +3,18 @@
/* 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) {
+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)
+{
//--------------------------------------------------------------------------------------
// Handles bandwidth change, if required
//
//--------------------------------------------------------------------------------------
- $rootScope.$on("bandwidth-change", function (e, data) {
+ $rootScope.$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();
@@ -20,70 +22,83 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
//--------------------------------------
// 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');
+ $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) {
+ $scope.prettifyDate = function(str)
+ {
return moment(str).format('MMM Do, YYYY ' + NVRDataModel.getTimeFormat());
};
- function prettifyDate(str) {
- if (NVRDataModel.getLogin().useLocalTimeZone)
+ 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');
+ return moment(str).format('MMM Do');
}
- $scope.prettifyTime = function (str) {
+ $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) {
+ $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();
-
+ $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.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.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();
- });*/
+ function orientationChanged()
+ {
+ // NVRDataModel.debug("Detected orientation change, redoing packery resize");
+ /* $timeout(function () {
+ pckry.onresize();
+ });*/
}
//--------------------------------------
// pause/unpause nph-zms
//---------------------------------------
- $scope.togglePause = function (mid) {
+ $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) {
+ for (var i = 0; i < $scope.MontageMonitors.length; i++)
+ {
+ if ($scope.MontageMonitors[i].Monitor.Id == mid)
+ {
m = i;
break;
}
}
- if (m != -1) {
+ if (m != -1)
+ {
$scope.MontageMonitors[m].Monitor.isPaused = !$scope.MontageMonitors[m].Monitor.isPaused;
var cmd = 1;
@@ -92,66 +107,79 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
}
};
- 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) {
+ for (var i = 0; i < $scope.MontageMonitors.length; i++)
+ {
+ if ($scope.MontageMonitors[i].Monitor.Id == mid)
+ {
m = i;
break;
}
}
- if (m != -1) {
+ 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) {
+ $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) {
+ for (var i = 0; i < $scope.MontageMonitors.length; i++)
+ {
+ if ($scope.MontageMonitors[i].Monitor.Id == mid)
+ {
m = i;
break;
}
}
- if (m != -1) {
+ if (m != -1)
+ {
$scope.MontageMonitors[i].Monitor.seek = true;
}
-
sendCmd(mid, '14', "&offset=" + p)
- .then(function (success) {
+ .then(function(success)
+ {
//console.log ("Removing seek status from " + $scope.MontageMonitors[i].Monitor.Name);
$scope.MontageMonitors[i].Monitor.seek = false;
},
- function (err) {
+ function(err)
+ {
//console.log ("Removing seek status from " + $scope.MontageMonitors[i].Monitor.Name);
$scope.MontageMonitors[i].Monitor.seek = false;
});
};
- $scope.moveFaster = function (mid) {
+ $scope.moveFaster = function(mid)
+ {
sendCmd(mid, 4);
};
- $scope.moveSlower = function (mid) {
+ $scope.moveSlower = function(mid)
+ {
sendCmd(mid, 5);
};
- $scope.movePlay = function (mid) {
+ $scope.movePlay = function(mid)
+ {
var m = -1;
- for (var i = 0; i < $scope.MontageMonitors.length; i++) {
- if ($scope.MontageMonitors[i].Monitor.Id == mid) {
+ for (var i = 0; i < $scope.MontageMonitors.length; i++)
+ {
+ if ($scope.MontageMonitors[i].Monitor.Id == mid)
+ {
m = i;
break;
}
}
- if (m != -1) {
+ if (m != -1)
+ {
$scope.MontageMonitors[m].Monitor.isPaused = false;
var cmd = 2;
NVRDataModel.debug("Sending CMD:" + cmd + " for monitor " + $scope.MontageMonitors[m].Monitor.Name);
@@ -162,20 +190,24 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
// Called when ion-footer collapses
// note that on init it is also called
//---------------------------------------
- $scope.footerExpand = function () {
+ $scope.footerExpand = function()
+ {
// console.log ("**************** EXPAND CALLED ***************");
$ionicSideMenuDelegate.canDragContent(false);
};
- $scope.footerCollapse = function () {
+ $scope.footerCollapse = function()
+ {
footerCollapse();
};
/* Note this is also called when the view is first loaded */
- function footerCollapse() {
- if (readyToRun == false) {
+ function footerCollapse()
+ {
+ if (readyToRun == false)
+ {
NVRDataModel.debug("fake call to footerCollapse - ignoring");
return;
}
-
+
if ($scope.MontageMonitors == undefined)
{
NVRDataModel.debug("montage array is undefined and not ready");
@@ -183,7 +215,8 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
}
$interval.cancel($rootScope.eventQueryInterval);
- $ionicLoading.show({
+ $ionicLoading.show(
+ {
template: $translate.instant('kPleaseWait'),
noBackdrop: true,
duration: zm.httpTimeout
@@ -195,39 +228,37 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
NVRDataModel.stopNetwork("MontageHistory-footerCollapse");
var ld = NVRDataModel.getLogin();
$scope.sliderVal.realRate = $scope.sliderVal.rate * 100;
-
-
-
+
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);
-
+
+ NVRDataModel.log("Local timezone conversion is on, converting from " + localtz + " to " + servertz);
+ NVRDataModel.log("Original From: " + TimeObjectFrom + " Original To: " + TimeObjectTo);
+
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");
-
- NVRDataModel.log ("Converted From: " + TimeObjectFrom + " Converted To: " + TimeObjectTo);
-
+
+ NVRDataModel.log("Converted From: " + TimeObjectFrom + " Converted To: " + TimeObjectTo);
+
}
-
-
-
+
var apiurl;
// release all active streams
- for (var i = 0; i < $scope.MontageMonitors.length; i++) {
+ 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') {
+ 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);
@@ -247,24 +278,30 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
// make sure there are no more than 5 active streams (noevent is ok)
$scope.currentLimit = $scope.monLimit;
//qHttp.get(apiurl)
- $http({
+ $http(
+ {
method: 'get',
url: apiurl
- }).then(function (succ) {
+ }).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++) {
+ for (i = 0; i < data.events.length; i++)
+ {
mid = data.events[i].Event.MonitorId;
eid = data.events[i].Event.Id;
stime = data.events[i].Event.StartTime;
// only take the first one for each monitor
- for (var j = 0; j < $scope.MontageMonitors.length; j++) {
+ 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') {
+ 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;
@@ -281,7 +318,6 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
// now lets get the API for that event for graphing
$scope.MontageMonitors[j].Monitor.noGraph = true;
-
}
}
}
@@ -290,9 +326,11 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
// 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++) {
+ 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') {
+ 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);
@@ -305,13 +343,16 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
// At this stage, we have both a general events grab, and specific event grabs for MIDS that were empty
- function doPackery() {
+ function doPackery()
+ {
// $ionicLoading.hide();
//console.log("REDOING PACKERY & DRAG");
NVRDataModel.debug("Re-creating packery and draggy");
- if (pckry !== undefined) {
+ if (pckry !== undefined)
+ {
// remove current draggies
- draggies.forEach(function (drag) {
+ draggies.forEach(function(drag)
+ {
drag.destroy();
});
draggies = [];
@@ -319,27 +360,34 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
pckry.destroy();
initPackery();
- $rootScope.eventQueryInterval = $interval(function () {
+ $rootScope.eventQueryInterval = $interval(function()
+ {
checkAllEvents();
}.bind(this), zm.eventHistoryTimer);
}
}
- }, function (err) {
+ }, function(err)
+ {
NVRDataModel.debug("history ERROR:" + JSON.stringify(err));
});
- function getExpandedEvents(i, indivGrab) {
+ function getExpandedEvents(i, indivGrab)
+ {
var d = $q.defer();
var ld = NVRDataModel.getLogin();
// console.log ("Expanded API: " + indivGrab);
- $http({
+ $http(
+ {
method: 'get',
url: indivGrab
- }).then(function (succ) {
+ }).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()) {
+ if (data.events.length > 0)
+ {
+ if (!NVRDataModel.isBackground())
+ {
var bw = NVRDataModel.getBandwidth() == "lowbw" ? zm.eventMontageQualityLowBW : ld.montageHistoryQuality;
$scope.MontageMonitors[i].Monitor.eventUrl = ld.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);
@@ -352,7 +400,9 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
$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 {
+ }
+ else
+ {
// $scope.MontageMonitors[i].eventUrl="img/noevent.png";
// $scope.MontageMonitors[i].eventUrlTime = "";
// NVRDataModel.log ("Setting img src to null as data received in background");
@@ -361,7 +411,8 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
d.resolve(true);
return d.promise;
},
- function (err) {
+ function(err)
+ {
d.resolve(true);
return d.promise;
}
@@ -376,16 +427,19 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
// Its a 2 step process - get event Id then go a Event
// API call to get time stamp. Sucks
//---------------------------------------------------------
- function checkAllEvents() {
+ function checkAllEvents()
+ {
//console.log("Timer:Events are checked....");
- //if (pckry && !$scope.isDragabillyOn) pckry.shiftLayout();
+ //if (pckry && !$scope.isDragabillyOn) pckry.shiftLayout();
- for (var i = 0; i < $scope.MontageMonitors.length; i++) {
+ 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') {
+ 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);
@@ -397,37 +451,45 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
// 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) {
+ $scope.controlEventStream = function(cmd, disp, connkey, ndx)
+ {
controlEventStream(cmd, disp, connkey, ndx);
};
- function timedControlEventStream(mTime, cmd, disp, connkey, ndx) {
+ function timedControlEventStream(mTime, cmd, disp, connkey, ndx)
+ {
var mMtime = mTime || 2000;
NVRDataModel.debug("Deferring control " + cmd + " by " + mMtime);
- $timeout(function () {
+ $timeout(function()
+ {
subControlStream(cmd, connkey);
}, mMtime);
}
- function subControlStream(cmd, connkey) {
+ function subControlStream(cmd, connkey)
+ {
var loginData = NVRDataModel.getLogin();
var myauthtoken = $rootScope.authSession.replace("&auth=", "");
//&auth=
- var req = qHttp({
+ var req = qHttp(
+ {
method: 'POST',
/*timeout: 15000,*/
url: loginData.url + '/index.php',
- headers: {
+ headers:
+ {
'Content-Type': 'application/x-www-form-urlencoded', //'Accept': '*/*',
},
- transformRequest: function (obj) {
+ 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: {
+ data:
+ {
view: "request",
request: "stream",
connkey: connkey,
@@ -436,20 +498,25 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
// pass: loginData.password
}
});
- req.then(function (succ) {
+ req.then(function(succ)
+ {
NVRDataModel.debug("subControl success:" + JSON.stringify(succ));
- }, function (err) {
+ }, function(err)
+ {
NVRDataModel.debug("subControl error:" + JSON.stringify(err));
});
}
- function controlEventStream(cmd, disp, connkey, ndx, extras) {
+ function controlEventStream(cmd, disp, connkey, ndx, extras)
+ {
// console.log("Command value " + cmd);
var d = $q.defer();
- if (disp) {
+ if (disp)
+ {
$ionicLoading.hide();
- $ionicLoading.show({
+ $ionicLoading.show(
+ {
template: $translate.instant('kPleaseWait') + "...",
noBackdrop: true,
duration: zm.loadingTimeout,
@@ -482,14 +549,17 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
//console.log ("AUTH IS " + $rootScope.authSession);
var myauthtoken = $rootScope.authSession.replace("&auth=", "");
//&auth=
- var req = qHttp({
+ var req = qHttp(
+ {
method: 'POST',
/*timeout: 15000,*/
url: loginData.url + '/index.php',
- headers: {
+ headers:
+ {
'Content-Type': 'application/x-www-form-urlencoded', //'Accept': '*/*',
},
- transformRequest: function (obj) {
+ transformRequest: function(obj)
+ {
var str = [];
for (var p in obj) str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
var foo = str.join("&");
@@ -497,7 +567,8 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
//console.log("****RETURNING " + foo);
return foo;
},
- data: {
+ data:
+ {
view: "request",
request: "stream",
connkey: connkey,
@@ -506,31 +577,39 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
// pass: loginData.password
}
});
- req.then(function (succ) {
+ 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) {
+ 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 {
+ }
+ else
+ {
NVRDataModel.debug("Skipping progress as seek is active for " + $scope.MontageMonitors[ndx].Monitor.Name);
}
}
- if (resp.result == "Ok" && ndx != -1 && ((resp.status.event != $scope.MontageMonitors[ndx].Monitor.eid) || $scope.MontageMonitors[ndx].Monitor.noGraph == true)) {
+ 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({
+ qHttp(
+ {
method: 'get',
url: apiurl
- }).then(function (succ) {
+ }).then(function(succ)
+ {
var data = succ.data;
var currentEventTime = moment(data.event.Event.StartTime);
var maxTime = moment();
@@ -539,31 +618,36 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
NVRDataModel.debug("creating graph for " + $scope.MontageMonitors[ndx].Monitor.Name);
var framearray = {
labels: [],
- datasets: [{
+ 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++) {
+ 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({
+ framearray.datasets[0].data.push(
+ {
x: ts,
y: data.event.Frame[i].Score
});
framearray.labels.push("");
}
- $timeout(function () {
+ $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 () {
+ $timeout(function()
+ {
element.removeClass('animated flipOutX');
element.addClass('animated flipInX');
$scope.MontageMonitors[ndx].Monitor.eventUrlTime = data.event.Event.StartTime;
@@ -577,59 +661,71 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
//console.log(">>> Setting Event for " + $scope.MontageMonitors[ndx].Monitor.Name + " to " + data.event.Event.Id);
}, 700);
-
- }, function (err) {
+ }, 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) {
+ }, function(err)
+ {
d.reject(false);
NVRDataModel.log("Error sending event command " + JSON.stringify(err), "error");
return d.promise;
});
return d.promise;
}
- $scope.isBackground = function () {
+ $scope.isBackground = function()
+ {
return NVRDataModel.isBackground();
};
//----------------------------------------------------------------
// Alarm notification handling
//----------------------------------------------------------------
- $scope.handleAlarms = function () {
+ $scope.handleAlarms = function()
+ {
$rootScope.isAlarm = !$rootScope.isAlarm;
- if (!$rootScope.isAlarm) {
+ if (!$rootScope.isAlarm)
+ {
$rootScope.alarmCount = "0";
- $ionicHistory.nextViewOptions({
+ $ionicHistory.nextViewOptions(
+ {
disableBack: true
});
- $state.go("events", {
+ $state.go("events",
+ {
"id": 0,
"playEvent": false
- }, {
+ },
+ {
reload: true
});
return;
}
};
- $scope.handleAlarmsWhileMinimized = function () {
+ $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) {
+ if (!$rootScope.isAlarm)
+ {
$rootScope.alarmCount = "0";
- $ionicHistory.nextViewOptions({
+ $ionicHistory.nextViewOptions(
+ {
disableBack: true
});
- $state.go("events", {
+ $state.go("events",
+ {
"id": 0,
"playEvent": false,
- }, {
+ },
+ {
reload: true
});
return;
@@ -640,18 +736,24 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
// when app is in background. This is a problem with Android,
// for example
//-------------------------------------------------------------
- $scope.isBackground = function () {
+ $scope.isBackground = function()
+ {
//console.log ("Is background called from Montage and returned " +
//NVRDataModel.isBackground());
return NVRDataModel.isBackground();
};
- $scope.toggleControls = function () {
+ $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.toggleSelectItem = function(ndx)
+ {
+ if ($scope.MontageMonitors[ndx].Monitor.selectStyle !== "undefined" && $scope.MontageMonitors[ndx].Monitor.selectStyle == "dragborder-selected")
+ {
$scope.MontageMonitors[ndx].Monitor.selectStyle = "";
- } else {
+ }
+ else
+ {
$scope.MontageMonitors[ndx].Monitor.selectStyle = "dragborder-selected";
}
//console.log ("Switched value to " + $scope.MontageMonitors[ndx].Monitor.selectStyle);
@@ -659,39 +761,49 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
//---------------------------------------------------------------------
// Called when you enable/disable dragging
//---------------------------------------------------------------------
- $scope.dragToggle = function () {
+ $scope.dragToggle = function()
+ {
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) {
+ if ($scope.isDragabillyOn)
+ {
$scope.showSizeButtons = true;
$scope.dragBorder = "dragborder";
NVRDataModel.debug("Enabling drag for " + draggies.length + " items");
- for (i = 0; i < draggies.length; i++) {
+ 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 {
+ }
+ else
+ {
$scope.dragBorder = "";
NVRDataModel.debug("Disabling drag for " + draggies.length + " items");
- for (i = 0; i < draggies.length; i++) {
+ for (i = 0; i < draggies.length; i++)
+ {
draggies[i].disable();
draggies[i].unbindHandles();
}
- for (i = 0; i < $scope.MontageMonitors.length; i++) {
+ 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 () {
+ $timeout(function()
+ {
+ $timeout(function()
+ {
pckry.shiftLayout();
/*var positions = pckry.getShiftPositions('data-item-id');
//console.log ("POSITIONS MAP " + JSON.stringify(positions));
@@ -705,13 +817,16 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
//---------------------------------------------------------------------
// Show/Hide PTZ control in monitor view
//---------------------------------------------------------------------
- $scope.togglePTZ = function () {
+ $scope.togglePTZ = function()
+ {
$scope.showPTZ = !$scope.showPTZ;
};
- $scope.callback = function () {
+ $scope.callback = function()
+ {
// console.log("dragging");
};
- $scope.onDropComplete = function (index, obj, event) {
+ $scope.onDropComplete = function(index, obj, event)
+ {
//console.log("dragged");
var otherObj = $scope.MontageMonitors[index];
var otherIndex = $scope.MontageMonitors.indexOf(obj);
@@ -721,7 +836,8 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
//---------------------------------------------------------------------
// changes order of montage display
//---------------------------------------------------------------------
- $scope.toggleMontageDisplayOrder = function () {
+ $scope.toggleMontageDisplayOrder = function()
+ {
$scope.packMontage = !$scope.packMontage;
loginData.packMontage = $scope.packMontage;
NVRDataModel.setLogin(loginData);
@@ -733,7 +849,8 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
// 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() {
+ function onPause()
+ {
NVRDataModel.debug("MontageHistoryCtrl: onpause called");
$interval.cancel($rootScope.eventQueryInterval);
$interval.cancel(intervalHandle);
@@ -741,21 +858,27 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
// FIXME: Do I need to setAwake(false) here?
}
- function onResume() {}
- $scope.openMenu = function () {
- $timeout(function () {
+ function onResume()
+ {}
+ $scope.openMenu = function()
+ {
+ $timeout(function()
+ {
$rootScope.stateofSlide = $ionicSideMenuDelegate.isOpen();
}, 500);
$ionicSideMenuDelegate.toggleLeft();
};
- $scope.$on('$destroy', function () {
+ $scope.$on('$destroy', function()
+ {
NVRDataModel.debug("Cancelling eventQueryInterval");
$interval.cancel($rootScope.eventQueryInterval);
});
- $scope.$on('$ionicView.loaded', function () {
+ $scope.$on('$ionicView.loaded', function()
+ {
//console.log("**VIEW ** MontageHistoryCtrl Loaded");
});
- $scope.$on('$ionicView.enter', function () {
+ $scope.$on('$ionicView.enter', function()
+ {
NVRDataModel.debug("**VIEW ** MontageHistory Ctrl Entered");
var ld = NVRDataModel.getLogin();
//console.log("Setting Awake to " + NVRDataModel.getKeepAwake());
@@ -763,7 +886,8 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
NVRDataModel.debug("query timer started");
$interval.cancel($rootScope.eventQueryInterval);
//console.log ("****************** TIMER STARTED INSIDE ENTER");
- $rootScope.eventQueryInterval = $interval(function () {
+ $rootScope.eventQueryInterval = $interval(function()
+ {
checkAllEvents();
}.bind(this), zm.eventHistoryTimer);
});
@@ -771,14 +895,17 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
console.log ("******** HISTORY UNLOADED KILLING WINDOW ************");
window.stop();
});*/
- $scope.$on('$ionicView.beforeEnter', function () {
+ $scope.$on('$ionicView.beforeEnter', function()
+ {
// NVRDataModel.log ("Before Enter History: initing connkeys");
});
- $scope.$on('$ionicView.beforeLeave', function () {
+ $scope.$on('$ionicView.beforeLeave', function()
+ {
//console.log("**VIEW ** Event History Ctrl Left, force removing modal");
if ($scope.modal) $scope.modal.remove();
NVRDataModel.log("BeforeLeave: Nullifying the streams...");
- for (i = 0; i < $scope.MontageMonitors.length; i++) {
+ for (i = 0; i < $scope.MontageMonitors.length; i++)
+ {
var element = document.getElementById("img-" + i);
/*if (element)
{
@@ -795,8 +922,10 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
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
- for (i = 0; i < $scope.MontageMonitors.length; i++) {
- if ($scope.MontageMonitors[i].Monitor.connKey != '' && $scope.MontageMonitors[i].Monitor.eventUrl != 'img/noevent.png' && $scope.MontageMonitors[i].Monitor.Function != 'None' && $scope.MontageMonitors[i].Monitor.lisDisplay != 'noshow' && $scope.MontageMonitors[i].Monitor.Enabled != '0') {
+ for (i = 0; i < $scope.MontageMonitors.length; i++)
+ {
+ if ($scope.MontageMonitors[i].Monitor.connKey != '' && $scope.MontageMonitors[i].Monitor.eventUrl != 'img/noevent.png' && $scope.MontageMonitors[i].Monitor.Function != 'None' && $scope.MontageMonitors[i].Monitor.lisDisplay != 'noshow' && $scope.MontageMonitors[i].Monitor.Enabled != '0')
+ {
NVRDataModel.log("Before leave: Calling kill with " + $scope.MontageMonitors[i].Monitor.connKey);
var tmpCK = angular.copy($scope.MontageMonitors[i].Monitor.connKey);
timedControlEventStream(2500, 17, "", tmpCK, -1);
@@ -807,10 +936,12 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
NVRDataModel.log("Forcing a window.stop() here");
NVRDataModel.stopNetwork("MontageHistory-beforeLeave");
});
- $scope.$on('$ionicView.unloaded', function () {});
- $scope.sliderChanged = function (dirn) {
+ $scope.$on('$ionicView.unloaded', function() {});
+ $scope.sliderChanged = function(dirn)
+ {
//console.log("SLIDER CHANGED");
- if ($scope.sliderChanging) {
+ if ($scope.sliderChanging)
+ {
// console.log ("too fast my friend");
//$scope.slider.monsize = oldSliderVal;
// return;
@@ -818,19 +949,24 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
$scope.sliderChanging = true;
var somethingReset = false;
// this only changes items that are selected
- for (var i = 0; i < $scope.MontageMonitors.length; i++) {
+ 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) {
+ if ($scope.isDragabillyOn)
+ {
// only do this for selected monitors
- if ($scope.MontageMonitors[i].Monitor.selectStyle == "dragborder-selected") {
+ if ($scope.MontageMonitors[i].Monitor.selectStyle == "dragborder-selected")
+ {
$scope.MontageMonitors[i].Monitor.gridScale = curVal;
somethingReset = true;
}
- } else {
+ }
+ else
+ {
$scope.MontageMonitors[i].Monitor.gridScale = curVal;
//somethingReset = true;
}
@@ -838,7 +974,8 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
// this changes all items if none were selected
if (!somethingReset && $scope.isDragabillyOn) // nothing was selected
{
- for (i = 0; i < $scope.MontageMonitors.length; i++) {
+ 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;
@@ -847,7 +984,8 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
}
}
//pckry.reloadItems();
- pckry.once('layoutComplete', function () {
+ pckry.once('layoutComplete', function()
+ {
/* $timeout(function () {
var positions = pckry.EHgetShiftPositions('eh-data-item-id');
//console.log ("POSITIONS MAP " + JSON.stringify(positions));
@@ -858,58 +996,77 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
$scope.sliderChanging = false;
}, zm.packeryTimer);*/
});
- if (!somethingReset) {
+ if (!somethingReset)
+ {
//console.log (">>>SOMETHING NOT RESET");
- $timeout(function () {
+ $timeout(function()
+ {
pckry.layout();
}, zm.packeryTimer);
- } else {
+ }
+ else
+ {
//console.log (">>>SOMETHING RESET");
- $timeout(function () {
+ $timeout(function()
+ {
layout(pckry);
}, zm.packeryTimer);
}
};
- function layout(pckry) {
+ function layout(pckry)
+ {
pckry.shiftLayout();
}
- $scope.resetSizes = function () {
+ $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") {
+ 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 {
+ }
+ else
+ {
$scope.MontageMonitors[i].Monitor.gridScale = "50";
// somethingReset = true;
}
}
if (!somethingReset && $scope.isDragabillyOn) // nothing was selected
{
- for (i = 0; i < $scope.MontageMonitors.length; i++) {
+ for (i = 0; i < $scope.MontageMonitors.length; i++)
+ {
$scope.MontageMonitors[i].Monitor.gridScale = "50";
}
}
- $timeout(function () {
+ $timeout(function()
+ {
pckry.reloadItems();
- $timeout(function () {
+ $timeout(function()
+ {
pckry.layout();
}, zm.packeryTimer); // force here - no shiftlayout
}, 100);
};
- function isEmpty(obj) {
- for (var prop in obj) {
+ function isEmpty(obj)
+ {
+ for (var prop in obj)
+ {
return false;
}
return true;
}
// called by afterEnter to load Packery
- function initPackery() {
- $ionicLoading.show({
+ function initPackery()
+ {
+ $ionicLoading.show(
+ {
template: $translate.instant('kArrangingImages'),
noBackdrop: true,
duration: zm.loadingTimeout
@@ -920,40 +1077,44 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
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
+ 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) {
+ imagesLoaded(elem).on('progress', function(instance, img)
+ {
var result = img.isLoaded ? 'loaded' : 'broken';
- NVRDataModel.debug( '~~loaded image is ' + result + ' for ' + img.img.src );
+ 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 () {
+ imagesLoaded(elem).once('always', function()
+ {
//console.log("******** ALL IMAGES LOADED");
$scope.$digest();
NVRDataModel.debug("All images loaded");
$ionicLoading.hide();
$scope.areImagesLoading = false;
-
-
- if (!progressCalled) {
+
+ if (!progressCalled)
+ {
NVRDataModel.log("*** PROGRESS WAS NOT CALLED");
pckry.reloadItems();
}
+ $timeout(function()
+ {
- $timeout(function () {
-
- pckry.getItemElements().forEach(function (itemElem) {
+ pckry.getItemElements().forEach(function(itemElem)
+ {
draggie = new Draggabilly(itemElem);
pckry.bindDraggabillyEvents(draggie);
draggies.push(draggie);
@@ -963,8 +1124,6 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
pckry.on('dragItemPositioned', itemDragged);
-
-
/*if (!isEmpty(positions)) {
NVRDataModel.log("Arranging as per packery grid");
@@ -986,26 +1145,24 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
}, 0);
}*/
-
-
- $timeout(function () {
+ $timeout(function()
+ {
NVRDataModel.log("Force calling resize");
pckry.layout();
$scope.packeryDone = true;
}, zm.packeryTimer); // don't ask
-
-
}, zm.packeryTimer);
-
});
- function itemDragged(item) {
+ function itemDragged(item)
+ {
NVRDataModel.debug("drag complete");
}
}
- $scope.$on('$ionicView.beforeEnter', function () {
+ $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
@@ -1014,69 +1171,79 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
$scope.packeryDone = false;
readyToRun = false;
$scope.MontageMonitors = message;
-
doInitCode();
-
-
-
});
- $scope.reloadView = function () {
+ $scope.reloadView = function()
+ {
$rootScope.rand = Math.floor((Math.random() * 100000) + 1);
NVRDataModel.log("User action: image reload " + $rootScope.rand);
};
- $scope.doRefresh = function () {
+ $scope.doRefresh = function()
+ {
//console.log("***Pull to Refresh, recomputing Rand");
NVRDataModel.log("Reloading view for montage view, recomputing rand");
$rootScope.rand = Math.floor((Math.random() * 100000) + 1);
$scope.MontageMonitors = [];
imageLoadingDataShare.set(0);
var refresh = NVRDataModel.getMonitors(1);
- refresh.then(function (data) {
+ refresh.then(function(data)
+ {
$scope.MontageMonitors = data.data;
$scope.$broadcast('scroll.refreshComplete');
});
};
- function drawGraph(f, mid) {
+ 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: {
+ title:
+ {
display: false,
text: ""
},
- scales: {
- yAxes: [{
+ scales:
+ {
+ yAxes: [
+ {
display: false,
- scaleLabel: {
+ scaleLabel:
+ {
display: false,
labelString: 'value',
}
- }],
- xAxes: [{
+ }],
+ xAxes: [
+ {
type: 'time',
display: false,
- time: {
+ 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: {}
+ displayFormats:
+ {}
},
- scaleLabel: {
+ scaleLabel:
+ {
display: false,
labelString: ''
}
}]
}
};
- $timeout(function () {
- var myChart = new Chart(ctx, {
+ $timeout(function()
+ {
+ var myChart = new Chart(ctx,
+ {
type: 'line',
data: f,
options: frameoptions,
@@ -1166,27 +1333,32 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
$scope.datetimeValueFrom.hrs = Math.round(moment.duration(moment().diff(moment($scope.datetimeValueFrom.value))).asHours());
commonCss = {
- background: {
+ background:
+ {
"background-color": "silver"
},
- before: {
+ before:
+ {
"background-color": "purple"
},
- default: {
+ default:
+ {
"background-color": "white"
}, // default value: 1px
- after: {
+ after:
+ {
"background-color": "green"
}, // zone after default value
- pointer: {
+ pointer:
+ {
"background-color": "red"
}, // circle pointer
- range: {
+ 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:
@@ -1200,24 +1372,28 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
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({
+ if (tempMonitors.length == 0)
+ {
+ $rootScope.zmPopup = $ionicPopup.alert(
+ {
title: $translate.instant('kNoMonitors'),
template: $translate.instant('kPleaseCheckCredentials')
});
- $ionicHistory.nextViewOptions({
+ $ionicHistory.nextViewOptions(
+ {
disableBack: true
});
$state.go("login");
return;
}
-
+
NVRDataModel.log("Inside MontageHistoryCtrl:We found " + $scope.MontageMonitors.length + " monitors");
// $scope.MontageMonitors = NVRDataModel.applyMontageMonitorPrefs(message, 1)[0];
var loginData = NVRDataModel.getLogin();
// init monitors
NVRDataModel.debug(">>Initializing connkeys and images...");
- for (i = 0; i < $scope.MontageMonitors.length; i++) {
+ for (i = 0; i < $scope.MontageMonitors.length; i++)
+ {
//$scope.MontageMonitors[i].Monitor.connKey='';
$scope.MontageMonitors[i].Monitor.eid = "-1";
$scope.MontageMonitors[i].Monitor.connKey = (Math.floor((Math.random() * 999999) + 1)).toString();
@@ -1237,19 +1413,26 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
// Handling of back button in case modal is open should
// close the modal
// --------------------------------------------------------
- $ionicPlatform.registerBackButtonAction(function (e) {
+ $ionicPlatform.registerBackButtonAction(function(e)
+ {
e.preventDefault();
- if ($scope.modal && $scope.modal.isShown()) {
+ 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 {
+ }
+ else
+ {
NVRDataModel.debug("Modal is closed, so toggling or exiting");
- if (!$ionicSideMenuDelegate.isOpenLeft()) {
+ if (!$ionicSideMenuDelegate.isOpenLeft())
+ {
$ionicSideMenuDelegate.toggleLeft();
- } else {
+ }
+ else
+ {
navigator.app.exitApp();
}
}
@@ -1260,13 +1443,15 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
$scope.LoginData = NVRDataModel.getLogin();
$scope.monLimit = $scope.LoginData.maxMontage;
$scope.currentLimit = $scope.LoginData.maxMontage;
- if ($rootScope.platformOS != 'ios') {
+ if ($rootScope.platformOS != 'ios')
+ {
NVRDataModel.log("Limiting montage to 5, thanks to Chrome's stupid connection limit");
$scope.currentLimit = 5;
$scope.monLimit = 5;
}
$rootScope.authSession = "undefined";
- $ionicLoading.show({
+ $ionicLoading.show(
+ {
template: $translate.instant('kNegotiatingStreamAuth'),
animation: 'fade-in',
showBackdrop: true,
@@ -1277,23 +1462,27 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
ld = NVRDataModel.getLogin();
//console.log ("MONITORS " + JSON.stringify($scope.monitors));
$rootScope.validMonitorId = $scope.MontageMonitors[0].Monitor.Id;
- NVRDataModel.getAuthKey($rootScope.validMonitorId).then(function (success) {
+ NVRDataModel.getAuthKey($rootScope.validMonitorId).then(function(success)
+ {
$ionicLoading.hide();
//console.log(success);
$rootScope.authSession = success;
NVRDataModel.log("Stream authentication construction: " + $rootScope.authSession);
- $timeout(function () {
+ $timeout(function()
+ {
initPackery();
readyToRun = true;
footerCollapse();
}, zm.packeryTimer);
- }, function (error) {
+ }, 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 () {
+ $timeout(function()
+ {
initPackery();
readyToRun = true;
footerCollapse();
@@ -1301,4 +1490,4 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
});
}
-}]); \ No newline at end of file
+}]);
diff --git a/www/js/NewsCtrl.js b/www/js/NewsCtrl.js
index 5328cf6b..752a97e2 100644
--- a/www/js/NewsCtrl.js
+++ b/www/js/NewsCtrl.js
@@ -2,33 +2,38 @@
/* jslint browser: true*/
/* global cordova,StatusBar,angular,console,moment*/
-angular.module('zmApp.controllers').controller('zmApp.NewsCtrl', ['$scope', '$rootScope', '$ionicModal', 'NVRDataModel', '$ionicSideMenuDelegate', '$ionicHistory', '$state', '$http', 'zm', function ($scope, $rootScope, $ionicModal, NVRDataModel, $ionicSideMenuDelegate, $ionicHistory, $state, $http, zm) {
- $scope.openMenu = function () {
+angular.module('zmApp.controllers').controller('zmApp.NewsCtrl', ['$scope', '$rootScope', '$ionicModal', 'NVRDataModel', '$ionicSideMenuDelegate', '$ionicHistory', '$state', '$http', 'zm', function($scope, $rootScope, $ionicModal, NVRDataModel, $ionicSideMenuDelegate, $ionicHistory, $state, $http, zm)
+{
+ $scope.openMenu = function()
+ {
$ionicSideMenuDelegate.toggleLeft();
};
-
//----------------------------------------------------------------
// Alarm notification handling
//----------------------------------------------------------------
- $scope.handleAlarms = function () {
+ $scope.handleAlarms = function()
+ {
$rootScope.isAlarm = !$rootScope.isAlarm;
- if (!$rootScope.isAlarm) {
+ if (!$rootScope.isAlarm)
+ {
$rootScope.alarmCount = "0";
- $ionicHistory.nextViewOptions({
+ $ionicHistory.nextViewOptions(
+ {
disableBack: true
});
- $state.go("events", {
+ $state.go("events",
+ {
"id": 0,
- "playEvent":false
- }, {
+ "playEvent": false
+ },
+ {
reload: true
});
return;
}
};
-
//-------------------------------------------------------------------------
// Lets make sure we set screen dim properly as we enter
// The problem is we enter other states before we leave previous states
@@ -36,14 +41,15 @@ angular.module('zmApp.controllers').controller('zmApp.NewsCtrl', ['$scope', '$ro
// reset power state on exit as if it is called after we enter another
// state, that effectively overwrites current view power management needs
//------------------------------------------------------------------------
- $scope.$on('$ionicView.enter', function () {
+ $scope.$on('$ionicView.enter', function()
+ {
// console.log("**VIEW ** News Ctrl Entered");
NVRDataModel.setAwake(false);
-
});
- $scope.isUnread = function (itemdate) {
+ $scope.isUnread = function(itemdate)
+ {
var lastDate = NVRDataModel.getLatestBlogPostChecked();
//get("latestBlogPostChecked");
if (!lastDate) return true;
@@ -53,30 +59,34 @@ angular.module('zmApp.controllers').controller('zmApp.NewsCtrl', ['$scope', '$ro
//console.log (unread);
return (mItemDate.diff(mLastDate) > 0) ? true : false;
-
};
- $scope.loadPost = function (item, itemdate) {
+ $scope.loadPost = function(item, itemdate)
+ {
var lastDate =
NVRDataModel.getLatestBlogPostChecked(); //zmStorageService.get("latestBlogPostChecked");
-
- if (!lastDate) {
+ if (!lastDate)
+ {
NVRDataModel.debug("First time checking blog posts, I see");
NVRDataModel.setLatestBlogPostChecked(itemdate);
//zmStorageService.set("latestBlogPostChecked", itemdate);
- } else {
+ }
+ else
+ {
NVRDataModel.debug("last post checked is " + lastDate);
NVRDataModel.debug("current post dated is " + itemdate);
var mLastDate = moment(lastDate);
var mItemDate = moment(itemdate);
- if (mItemDate.diff(mLastDate) > 0) {
+ if (mItemDate.diff(mLastDate) > 0)
+ {
NVRDataModel.debug("Updating lastDate to this post");
NVRDataModel.setLatestBlogPostChecked(itemdate); //zmStorageService.set("latestBlogPostChecked", itemdate);
- if (itemdate == $scope.newsItems[0].date) {
+ if (itemdate == $scope.newsItems[0].date)
+ {
// we are reading the latest post
$rootScope.newBlogPost = "";
}
@@ -90,11 +100,14 @@ angular.module('zmApp.controllers').controller('zmApp.NewsCtrl', ['$scope', '$ro
$scope.newsItems = [];
$http.get(zm.blogUrl)
- .success(function (data) {
+ .success(function(data)
+ {
//console.log ("Here2");
// console.log (JSON.stringify(data));
- for (var i = 0; i < data.length; i++) {
- $scope.newsItems.push({
+ for (var i = 0; i < data.length; i++)
+ {
+ $scope.newsItems.push(
+ {
title: data[i].title,
url: data[i].url,
date: data[i].date
@@ -103,4 +116,4 @@ angular.module('zmApp.controllers').controller('zmApp.NewsCtrl', ['$scope', '$ro
});
-}]); \ No newline at end of file
+}]);
diff --git a/www/js/PortalLoginCtrl.js b/www/js/PortalLoginCtrl.js
index f99932a2..ff2f61d0 100644
--- a/www/js/PortalLoginCtrl.js
+++ b/www/js/PortalLoginCtrl.js
@@ -3,90 +3,108 @@
/*This is for the loop closure I am using in line 143 */
/* jslint browser: true*/
/* global vis,cordova,StatusBar,angular,console,moment */
-angular.module('zmApp.controllers').controller('zmApp.PortalLoginCtrl', ['$ionicPlatform', '$scope', 'zm', 'NVRDataModel', '$ionicSideMenuDelegate', '$rootScope', '$http', '$q', '$state', '$ionicLoading', '$ionicPopover', '$ionicScrollDelegate', '$ionicModal', '$timeout', 'zmAutoLogin', '$ionicHistory', '$cordovaTouchID', 'EventServer', '$translate', function($ionicPlatform, $scope, zm, NVRDataModel, $ionicSideMenuDelegate, $rootScope, $http, $q, $state, $ionicLoading, $ionicPopover, $ionicScrollDelegate, $ionicModal, $timeout, zmAutoLogin, $ionicHistory, $cordovaTouchID, EventServer, $translate) {
-
+angular.module('zmApp.controllers').controller('zmApp.PortalLoginCtrl', ['$ionicPlatform', '$scope', 'zm', 'NVRDataModel', '$ionicSideMenuDelegate', '$rootScope', '$http', '$q', '$state', '$ionicLoading', '$ionicPopover', '$ionicScrollDelegate', '$ionicModal', '$timeout', 'zmAutoLogin', '$ionicHistory', '$cordovaTouchID', 'EventServer', '$translate', function($ionicPlatform, $scope, zm, NVRDataModel, $ionicSideMenuDelegate, $rootScope, $http, $q, $state, $ionicLoading, $ionicPopover, $ionicScrollDelegate, $ionicModal, $timeout, zmAutoLogin, $ionicHistory, $cordovaTouchID, EventServer, $translate)
+{
$scope.$on('$ionicView.enter',
- function() {
+ function()
+ {
NVRDataModel.debug("Inside Portal login Enter handler");
loginData = NVRDataModel.getLogin();
- $ionicHistory.nextViewOptions({
+ $ionicHistory.nextViewOptions(
+ {
disableBack: true
});
-
$scope.pindata = {};
- if ($ionicSideMenuDelegate.isOpen()) {
+ if ($ionicSideMenuDelegate.isOpen())
+ {
$ionicSideMenuDelegate.toggleLeft();
NVRDataModel.debug("Sliding menu close");
}
-
$scope.pinPrompt = false; // if true, then PIN is displayed else skip
- if (NVRDataModel.isLoggedIn()) {
+ if (NVRDataModel.isLoggedIn())
+ {
NVRDataModel.log("User credentials are provided");
-
-
// You can login either via touch ID or typing in your code
- if ($ionicPlatform.is('ios') && loginData.usePin) {
+ if ($ionicPlatform.is('ios') && loginData.usePin)
+ {
$cordovaTouchID.checkSupport()
- .then(function() {
+ .then(function()
+ {
// success, TouchID supported
$cordovaTouchID.authenticate("")
- .then(function() {
+ .then(function()
+ {
NVRDataModel.log("Touch Success");
// Don't assign pin as it may be alphanum
unlock(true);
},
- function() {
+ function()
+ {
NVRDataModel.log("Touch Failed");
});
- }, function(error) {
+ }, function(error)
+ {
NVRDataModel.log("TouchID not supported");
});
- } else // touch was not used
+ }
+ else // touch was not used
{
NVRDataModel.log("not checking for touchID");
}
- if (loginData.usePin) {
+ if (loginData.usePin)
+ {
// this shows the pin prompt on screen
$scope.pinPrompt = true;
// dont call unlock, let the user type in code
- } else // no PIN Code so go directly to auth
+ }
+ else // no PIN Code so go directly to auth
{
unlock(true);
}
- } else // login creds are not present
+ }
+ else // login creds are not present
{
NVRDataModel.debug("PortalLogin: Not logged in, so going to login");
- if (NVRDataModel.isFirstUse()) {
+ if (NVRDataModel.isFirstUse())
+ {
NVRDataModel.debug("First use, showing warm and fuzzy...");
- $ionicHistory.nextViewOptions({
+ $ionicHistory.nextViewOptions(
+ {
disableAnimate: true,
disableBack: true
});
$state.go('first-use');
return;
- } else {
- if (!$rootScope.userCancelledAuth) {
- $ionicHistory.nextViewOptions({
+ }
+ else
+ {
+ if (!$rootScope.userCancelledAuth)
+ {
+ $ionicHistory.nextViewOptions(
+ {
disableAnimate: true,
disableBack: true
});
- $state.go("login", {
+ $state.go("login",
+ {
"wizard": false
});
return;
- } else {
+ }
+ else
+ {
// do this only once - rest for next time
$rootScope.userCancelledAuth = false;
}
@@ -99,8 +117,10 @@ angular.module('zmApp.controllers').controller('zmApp.PortalLoginCtrl', ['$ionic
// remove status is pin is empty
//-------------------------------------------------------------------------------
- $scope.pinChange = function() {
- if ($scope.pindata.pin == null) {
+ $scope.pinChange = function()
+ {
+ if ($scope.pindata.pin == null)
+ {
$scope.pindata.status = "";
}
};
@@ -108,17 +128,18 @@ angular.module('zmApp.controllers').controller('zmApp.PortalLoginCtrl', ['$ionic
//-------------------------------------------------------------------------------
// unlock app if PIN is correct
//-------------------------------------------------------------------------------
- $scope.unlock = function() {
+ $scope.unlock = function()
+ {
// call with false meaning check for pin
unlock(false);
};
-
//------------------------------------------------------------------------
// Aaron Lager hack - can't figure out why he gets a 401 after
// successful login and then it works after resaving
//------------------------------------------------------------------------
- function tryLoggingSecondTimeHack() {
+ function tryLoggingSecondTimeHack()
+ {
var d = $q.defer();
zmAutoLogin.doLogin("<button class='button button-clear' style='line-height: normal; min-height: 0; min-width: 0;color:#fff;' ng-click='$root.cancelAuth()'><i class='ion-close-circled'></i>&nbsp;" + $translate.instant('kAuthenticating') + "...</button>")
@@ -126,32 +147,39 @@ angular.module('zmApp.controllers').controller('zmApp.PortalLoginCtrl', ['$ionic
{
NVRDataModel.debug("2nd auth login worked");
NVRDataModel.getAPIversion()
- .then(function(data) {
+ .then(function(data)
+ {
NVRDataModel.getKeyConfigParams(1);
NVRDataModel.log("2nd auth:Got API version: " + data);
$rootScope.apiVersion = data;
var ld = NVRDataModel.getLogin();
- if (NVRDataModel.versionCompare(data, zm.minAppVersion) == -1 && data != "0.0.0") {
+ if (NVRDataModel.versionCompare(data, zm.minAppVersion) == -1 && data != "0.0.0")
+ {
- $state.go('lowversion', {
+ $state.go('lowversion',
+ {
"ver": data
});
return;
}
- if (NVRDataModel.versionCompare(data, zm.recommendedAppVersion) == -1 && data != "0.0.0") {
+ if (NVRDataModel.versionCompare(data, zm.recommendedAppVersion) == -1 && data != "0.0.0")
+ {
- $state.go('importantmessage', {
+ $state.go('importantmessage',
+ {
"ver": data
});
return;
}
- if (data == "0.0.0") {
+ if (data == "0.0.0")
+ {
NVRDataModel.log("2nd Auth:API getVersion succeeded but returned 0.0.0 " + JSON.stringify(data));
NVRDataModel.displayBanner('error', ['ZoneMinder authentication failed']);
- $state.go("login", {
+ $state.go("login",
+ {
"wizard": false
});
return;
@@ -159,8 +187,6 @@ angular.module('zmApp.controllers').controller('zmApp.PortalLoginCtrl', ['$ionic
// coming here means continue
EventServer.refresh();
-
-
var statetoGo = $rootScope.lastState ? $rootScope.lastState : 'montage';
//NVRDataModel.debug ("logging state transition");
NVRDataModel.debug("2nd Auth: Transitioning state to: " +
@@ -169,16 +195,17 @@ angular.module('zmApp.controllers').controller('zmApp.PortalLoginCtrl', ['$ionic
return;
},
- function(error) {
+ function(error)
+ {
NVRDataModel.debug("2nd auth API failed, going to login");
d.reject("failed 2nd auth");
return (d.promise);
});
-
},
- function(error) {
+ function(error)
+ {
NVRDataModel.debug("2nd auth hack failed, going to login");
d.reject("failed 2nd auth");
return (d.promise);
@@ -187,14 +214,16 @@ angular.module('zmApp.controllers').controller('zmApp.PortalLoginCtrl', ['$ionic
return (d.promise);
}
- function unlock(idVerified) {
+ function unlock(idVerified)
+ {
/*
idVerified == true means no pin check needed
== false means check PIN
*/
NVRDataModel.debug("unlock called with check PIN=" + idVerified);
- if (idVerified || ($scope.pindata.pin == loginData.pinCode)) {
+ if (idVerified || ($scope.pindata.pin == loginData.pinCode))
+ {
NVRDataModel.debug("PIN code entered is correct, or there is no PIN set");
$rootScope.rand = Math.floor((Math.random() * 100000) + 1);
zmAutoLogin.stop(); //safety
@@ -211,33 +240,40 @@ angular.module('zmApp.controllers').controller('zmApp.PortalLoginCtrl', ['$ionic
// $state.go("login" ,{"wizard": false});
//login was ok, so get API details
NVRDataModel.getAPIversion()
- .then(function(data) {
+ .then(function(data)
+ {
NVRDataModel.log("Got API version: " + data);
$rootScope.apiVersion = data;
var ld = NVRDataModel.getLogin();
- if (NVRDataModel.versionCompare(data, zm.minAppVersion) == -1 && data != "0.0.0") {
+ if (NVRDataModel.versionCompare(data, zm.minAppVersion) == -1 && data != "0.0.0")
+ {
- $state.go('lowversion', {
+ $state.go('lowversion',
+ {
"ver": data
});
return;
}
- if (NVRDataModel.versionCompare(data, zm.recommendedAppVersion) == -1 && data != "0.0.0") {
+ if (NVRDataModel.versionCompare(data, zm.recommendedAppVersion) == -1 && data != "0.0.0")
+ {
// console.log (">>>>>>>>>>>>> HERE AND VERSION SAYS " +NVRDataModel.versionCompare(data, zm.recommendedAppVersion));
//console.log ("GOING TO IMPORTANT");
- $state.go('importantmessage', {
+ $state.go('importantmessage',
+ {
"ver": data
});
return;
}
- if (data == "0.0.0") {
+ if (data == "0.0.0")
+ {
NVRDataModel.log("API getVersion succeeded but returned 0.0.0 " + JSON.stringify(data));
NVRDataModel.displayBanner('error', ['ZoneMinder authentication failed']);
- $state.go("login", {
+ $state.go("login",
+ {
"wizard": false
});
return;
@@ -247,31 +283,33 @@ angular.module('zmApp.controllers').controller('zmApp.PortalLoginCtrl', ['$ionic
// console.log (">>>>>>>>>>>>>>>>>>>>>>>>>NEVER");
EventServer.refresh();
-
-
var statetoGo = $rootScope.lastState ? $rootScope.lastState : 'montage';
NVRDataModel.debug("logging state transition");
NVRDataModel.debug("Transitioning state to: " +
statetoGo + " with param " + JSON.stringify($rootScope.lastStateParam));
-
$state.go(statetoGo, $rootScope.lastStateParam);
return;
},
- function(error) { // API Error
+ function(error)
+ { // API Error
NVRDataModel.log("API Error handler: going to login getAPI returned error: " + JSON.stringify(error));
//NVRDataModel.displayBanner('error', ['ZoneMinder authentication failed']);
NVRDataModel.debug("Doing the Aaron Hack after 1 sec....");
- $timeout(function() {
+ $timeout(function()
+ {
tryLoggingSecondTimeHack()
- .then(function success(s) {
+ .then(function success(s)
+ {
NVRDataModel.log("2nd time login hack worked!, nothing to do");
NVRDataModel.getTimeZone();
},
- function error(e) {
- $state.go("login", {
+ function error(e)
+ {
+ $state.go("login",
+ {
"wizard": false
});
});
@@ -281,71 +319,89 @@ angular.module('zmApp.controllers').controller('zmApp.PortalLoginCtrl', ['$ionic
});
-
- if ($rootScope.tappedNotification) {
-
+ if ($rootScope.tappedNotification)
+ {
var ld = NVRDataModel.getLogin();
NVRDataModel.log("Came via push tap. onTapScreen=" + ld.onTapScreen);
//console.log ("***** NOTIFICATION TAPPED ");
$rootScope.tappedNotification = 0;
- $ionicHistory.nextViewOptions({
+ $ionicHistory.nextViewOptions(
+ {
disableBack: true
});
- if (ld.onTapScreen == $translate.instant('kTapMontage')) {
+ if (ld.onTapScreen == $translate.instant('kTapMontage'))
+ {
NVRDataModel.debug("Going to montage");
- $state.go("montage", {}, {
+ $state.go("montage",
+ {},
+ {
reload: true
});
return;
- } else if (ld.onTapScreen == $translate.instant('kTapEvents')) {
+ }
+ else if (ld.onTapScreen == $translate.instant('kTapEvents'))
+ {
NVRDataModel.debug("Going to events");
- $state.go("events", {
+ $state.go("events",
+ {
"id": 0,
"playEvent": false
- }, {
+ },
+ {
reload: true
});
return;
- } else // we go to live
+ }
+ else // we go to live
{
NVRDataModel.debug("Going to live view ");
- $state.go("monitors", {}, {
+ $state.go("monitors",
+ {},
+ {
reload: true
});
return;
}
}
-
},
// coming here means auth error
// so go back to login
- function(error) {
+ function(error)
+ {
NVRDataModel.debug("PortalLogin: error authenticating " +
JSON.stringify(error));
- if (!$rootScope.userCancelledAuth) {
+ if (!$rootScope.userCancelledAuth)
+ {
NVRDataModel.displayBanner('error', ['ZoneMinder authentication failed', 'Please check API settings']);
- $ionicHistory.nextViewOptions({
+ $ionicHistory.nextViewOptions(
+ {
disableAnimate: true,
disableBack: true
});
- $state.go("login", {
+ $state.go("login",
+ {
"wizard": false
});
return;
- } else {
+ }
+ else
+ {
// if user cancelled auth I guess we go to login
$rootScope.userCancelledAuth = false;
- $state.go("login", {
+ $state.go("login",
+ {
"wizard": false
});
return;
}
});
- } else {
+ }
+ else
+ {
$scope.pindata.status = "Invalid PIN";
// wobble the input box on error
@@ -353,7 +409,8 @@ angular.module('zmApp.controllers').controller('zmApp.PortalLoginCtrl', ['$ionic
element.addClass("animated shake")
.one('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend',
- function() {
+ function()
+ {
element.removeClass("animated shake");
});
}
@@ -367,6 +424,4 @@ angular.module('zmApp.controllers').controller('zmApp.PortalLoginCtrl', ['$ionic
var loginData;
$ionicSideMenuDelegate.canDragContent(true);
-
-
-}]); \ No newline at end of file
+}]);
diff --git a/www/js/StateCtrl.js b/www/js/StateCtrl.js
index 58f13c4b..54a2c4c9 100644
--- a/www/js/StateCtrl.js
+++ b/www/js/StateCtrl.js
@@ -4,8 +4,9 @@
// controller for State View
-angular.module('zmApp.controllers').controller('zmApp.StateCtrl', ['$ionicPopup', '$scope', 'zm', 'NVRDataModel', '$ionicSideMenuDelegate', '$ionicLoading', '$ionicModal', '$state', '$http', '$rootScope', '$timeout', '$ionicHistory', '$translate', function (
- $ionicPopup, $scope, zm, NVRDataModel, $ionicSideMenuDelegate, $ionicLoading, $ionicModal, $state, $http, $rootScope, $timeout, $ionicHistory, $translate) {
+angular.module('zmApp.controllers').controller('zmApp.StateCtrl', ['$ionicPopup', '$scope', 'zm', 'NVRDataModel', '$ionicSideMenuDelegate', '$ionicLoading', '$ionicModal', '$state', '$http', '$rootScope', '$timeout', '$ionicHistory', '$translate', function(
+ $ionicPopup, $scope, zm, NVRDataModel, $ionicSideMenuDelegate, $ionicLoading, $ionicModal, $state, $http, $rootScope, $timeout, $ionicHistory, $translate)
+{
//----------------------------------------------------------------------
// Controller main
@@ -22,8 +23,6 @@ angular.module('zmApp.controllers').controller('zmApp.StateCtrl', ['$ionicPopup'
$rootScope.zmPopup = "";
-
-
var loginData = NVRDataModel.getLogin();
var apiRun = loginData.apiurl + "/host/daemonCheck.json";
@@ -39,12 +38,14 @@ angular.module('zmApp.controllers').controller('zmApp.StateCtrl', ['$ionicPopup'
// Let's stagger this by 500ms each to see if Chrome lets these through
// This may also help if your Apache is not configured to let multiple connections through
- $timeout(function () {
+ $timeout(function()
+ {
NVRDataModel.debug("invoking LoadStatus...");
getLoadStatus();
}, 2000);
- $timeout(function () {
+ $timeout(function()
+ {
NVRDataModel.debug("invoking CurrentState...");
getCurrentState();
}, 4000);
@@ -62,7 +63,8 @@ angular.module('zmApp.controllers').controller('zmApp.StateCtrl', ['$ionicPopup'
// reset power state on exit as if it is called after we enter another
// state, that effectively overwrites current view power management needs
//------------------------------------------------------------------------
- $scope.$on('$ionicView.enter', function () {
+ $scope.$on('$ionicView.enter', function()
+ {
// console.log("**VIEW ** Montage Ctrl Entered");
NVRDataModel.setAwake(false);
});
@@ -71,19 +73,23 @@ angular.module('zmApp.controllers').controller('zmApp.StateCtrl', ['$ionicPopup'
// This gets the current run state custom name
// if applicable
//---------------------------------------------------------
- function getCurrentState() {
+ function getCurrentState()
+ {
NVRDataModel.debug("StateCtrl: getting state using " + apiCurrentState);
$http.get(apiCurrentState)
.then(
- function (success) {
+ function(success)
+ {
NVRDataModel.debug("State results: " + JSON.stringify(success));
var customStateArray = success.data.states;
var i = 0;
var found = false;
$scope.allStateNames = [];
- for (i = 0; i < customStateArray.length; i++) {
+ for (i = 0; i < customStateArray.length; i++)
+ {
$scope.allStateNames.push(customStateArray[i].State.Name);
- if (customStateArray[i].State.IsActive == '1') {
+ if (customStateArray[i].State.IsActive == '1')
+ {
$scope.customState = customStateArray[i].State.Name;
found = true;
}
@@ -91,7 +97,8 @@ angular.module('zmApp.controllers').controller('zmApp.StateCtrl', ['$ionicPopup'
if (!found) $scope.customState = "";
},
- function (error) {
+ function(error)
+ {
NVRDataModel.debug("StateCtrl: Error retrieving state list " + JSON.stringify(error));
$scope.customState = "";
@@ -100,21 +107,25 @@ angular.module('zmApp.controllers').controller('zmApp.StateCtrl', ['$ionicPopup'
}
-
//----------------------------------------------------------------
// Alarm notification handling
//----------------------------------------------------------------
- $scope.handleAlarms = function () {
+ $scope.handleAlarms = function()
+ {
$rootScope.isAlarm = !$rootScope.isAlarm;
- if (!$rootScope.isAlarm) {
+ if (!$rootScope.isAlarm)
+ {
$rootScope.alarmCount = "0";
- $ionicHistory.nextViewOptions({
+ $ionicHistory.nextViewOptions(
+ {
disableBack: true
});
- $state.go("events", {
+ $state.go("events",
+ {
"id": 0,
- "playEvent":false
- }, {
+ "playEvent": false
+ },
+ {
reload: true
});
}
@@ -123,69 +134,78 @@ angular.module('zmApp.controllers').controller('zmApp.StateCtrl', ['$ionicPopup'
//---------------------------------------------------------
// Allows the user to select a custom run state
//---------------------------------------------------------
- $scope.selectCustomState = function () {
+ $scope.selectCustomState = function()
+ {
$scope.myopt = {
selectedState: ""
};
//console.log(JSON.stringify($scope.allStateNames));
NVRDataModel.log("List of custom states: " + JSON.stringify($scope.allStateNames));
- $rootScope.zmPopup = $ionicPopup.show({
+ $rootScope.zmPopup = $ionicPopup.show(
+ {
scope: $scope,
template: '<ion-radio-fix ng-repeat="item in allStateNames" ng-value="item" ng-model="myopt.selectedState"> {{item}} </ion-radio-fix>',
-
title: $translate.instant('kSelectRunState'),
subTitle: $translate.instant('kCurrentState') + $scope.customState ? ($translate.instant('kCurrentState') + ": " + $scope.customState) : "",
buttons: [
+ {
+ text: $translate.instant('kButtonCancel'),
+ onTap: function(e)
{
- text: $translate.instant('kButtonCancel'),
- onTap: function (e) {
- return "CANCEL";
- }
+ return "CANCEL";
+ }
- },
+ },
+ {
+ text: $translate.instant('kButtonOk'),
+ onTap: function(e)
{
- text: $translate.instant('kButtonOk'),
- onTap: function (e) {
- return "OK";
+ return "OK";
- }
- }
- ]
+ }
+ }]
});
// It seems invoking a popup within a popup handler
// causes issues. Doing this outside due to that reason
- $rootScope.zmPopup.then(function (res) {
+ $rootScope.zmPopup.then(function(res)
+ {
// console.log("GOT : " + JSON.stringify(res));
- if (res == "OK") {
+ if (res == "OK")
+ {
if ($scope.myopt.selectedState != "")
controlZM($scope.myopt.selectedState);
}
});
};
-
//----------------------------------------------------------------------
// returns disk space in gigs taken up by events
//----------------------------------------------------------------------
- function getDiskStatus() {
+ function getDiskStatus()
+ {
NVRDataModel.debug("StateCtrl/getDiskStatus: " + apiDisk);
$http.get(apiDisk)
.then(
- function (success) {
+ function(success)
+ {
NVRDataModel.debug("StateCtrl/getDiskStatus: success");
NVRDataModel.debug("Disk results: " + JSON.stringify(success));
var obj = success.data.usage;
- if (obj.Total.space != undefined) {
+ if (obj.Total.space != undefined)
+ {
$scope.zmDisk = parseFloat(obj.Total.space).toFixed(1).toString() + "G";
- } else {
+ }
+ else
+ {
$scope.zmDisk = "unknown";
NVRDataModel.log("Error retrieving disk space, API returned null for obj.Total.space");
}
},
- function (error) {
+ function(error)
+ {
$scope.zmDisk = "unknown";
// console.log("ERROR:" + JSON.stringify(error));
NVRDataModel.log("Error retrieving DiskStatus: " + JSON.stringify(error), "error");
@@ -196,14 +216,17 @@ angular.module('zmApp.controllers').controller('zmApp.StateCtrl', ['$ionicPopup'
//----------------------------------------------------------------------
// returns ZM running status
//----------------------------------------------------------------------
- function getRunStatus() {
+ function getRunStatus()
+ {
NVRDataModel.debug("StateCtrl/getRunStatus: " + apiRun);
$http.get(apiRun)
.then(
- function (success) {
+ function(success)
+ {
NVRDataModel.debug("StateCtrl/getRunStatus: success");
NVRDataModel.debug("Run results: " + JSON.stringify(success));
- switch (success.data.result) {
+ switch (success.data.result)
+ {
case 1:
$scope.zmRun = $translate.instant('kZMRunning');
$scope.color = 'color:green;';
@@ -219,10 +242,10 @@ angular.module('zmApp.controllers').controller('zmApp.StateCtrl', ['$ionicPopup'
break;
}
-
// console.log("X"+success.data.result+"X");
},
- function (error) {
+ function(error)
+ {
//console.log("ERROR in getRun: " + JSON.stringify(error));
NVRDataModel.log("Error getting RunStatus " + JSON.stringify(error), "error");
$scope.color = 'color:red;';
@@ -232,25 +255,26 @@ angular.module('zmApp.controllers').controller('zmApp.StateCtrl', ['$ionicPopup'
}
-
//----------------------------------------------------------------------
// gets ZM load - max[0], avg[1], min[2]
//----------------------------------------------------------------------
- function getLoadStatus() {
+ function getLoadStatus()
+ {
NVRDataModel.debug("StateCtrl/getLoadStatus: " + apiLoad);
$http.get(apiLoad)
.then(
- function (success) {
+ function(success)
+ {
NVRDataModel.debug("Load results: " + JSON.stringify(success));
//console.log(JSON.stringify(success));
// load returns 3 params - one in the middle is avg.
NVRDataModel.debug("StateCtrl/getLoadStatus: success");
$scope.zmLoad = success.data.load[1];
-
// console.log("X"+success.data.result+"X");
},
- function (error) {
+ function(error)
+ {
//console.log("ERROR in getLoad: " + JSON.stringify(error));
NVRDataModel.log("Error retrieving loadStatus " + JSON.stringify(error), "error");
$scope.zmLoad = 'undetermined';
@@ -258,17 +282,15 @@ angular.module('zmApp.controllers').controller('zmApp.StateCtrl', ['$ionicPopup'
);
}
-
//----------------------------------------------------------------------
// start/stop/restart ZM
//----------------------------------------------------------------------
- function performZMoperation(str) {
-
+ function performZMoperation(str)
+ {
NVRDataModel.debug("inside performZMoperation with " + str);
-
$scope.zmRun = "...";
$scope.color = 'color:orange;';
$scope.customState = "";
@@ -276,10 +298,12 @@ angular.module('zmApp.controllers').controller('zmApp.StateCtrl', ['$ionicPopup'
inProgress = 1;
$http.post(apiExec + str + ".json")
.then(
- function (success) {
+ function(success)
+ {
NVRDataModel.debug("StateCtrl/controlZM: returned success");
inProgress = 0;
- switch (str) {
+ switch (str)
+ {
case "stop":
$scope.zmRun = $translate.instant('kZMStopped');
$scope.color = 'color:red;';
@@ -293,7 +317,8 @@ angular.module('zmApp.controllers').controller('zmApp.StateCtrl', ['$ionicPopup'
}
},
- function (error) {
+ function(error)
+ {
//if (error.status) // it seems to return error with status 0 if ok
// {
//console.log("ERROR in Change State:" + JSON.stringify(error));
@@ -306,11 +331,13 @@ angular.module('zmApp.controllers').controller('zmApp.StateCtrl', ['$ionicPopup'
});
}
-
- function controlZM(str) {
- if (inProgress) {
+ function controlZM(str)
+ {
+ if (inProgress)
+ {
NVRDataModel.debug("StateCtrl/controlZM: operation in progress");
- $ionicPopup.alert({
+ $ionicPopup.alert(
+ {
title: $translate.instant('kOperationInProgressTitle'),
template: $translate.instant('kOperationInProgressBody') + '...'
});
@@ -320,43 +347,45 @@ angular.module('zmApp.controllers').controller('zmApp.StateCtrl', ['$ionicPopup'
var statesearch = "startstoprestart";
var promptstring = $translate.instant('kStateAreYouSure') + str + ' Zoneminder?';
- if (statesearch.indexOf(str) == -1) {
+ if (statesearch.indexOf(str) == -1)
+ {
promptstring = "Are you sure you want to change state to " + str;
}
-
- $rootScope.zmPopup = $ionicPopup.show({
+ $rootScope.zmPopup = $ionicPopup.show(
+ {
title: 'Please Confirm',
template: promptstring,
buttons: [
+ {
+ text: 'Cancel',
+ type: 'button-positive'
+ },
+ {
+ text: 'Yes',
+ type: 'button-assertive',
+ onTap: function(e)
{
- text: 'Cancel',
- type: 'button-positive'
- },
- {
- text: 'Yes',
- type: 'button-assertive',
- onTap: function (e) {
- performZMoperation(str);
- }
+ performZMoperation(str);
}
- ]
+ }]
});
-
}
// Binder so template can call controlZM
- $scope.controlZM = function (str) {
+ $scope.controlZM = function(str)
+ {
controlZM(str);
};
-
- $scope.openMenu = function () {
+ $scope.openMenu = function()
+ {
$ionicSideMenuDelegate.toggleLeft();
};
- $scope.$on('$ionicView.leave', function () {
+ $scope.$on('$ionicView.leave', function()
+ {
console.log("**VIEW ** State Ctrl Left");
// FIXME not the best way...
// If the user exits a view before its complete,
@@ -364,8 +393,8 @@ angular.module('zmApp.controllers').controller('zmApp.StateCtrl', ['$ionicPopup'
inProgress = 0;
});
-
- $scope.doRefresh = function () {
+ $scope.doRefresh = function()
+ {
console.log("***Pull to Refresh");
NVRDataModel.debug("StateCtrl/refresh: calling getRun/Load/Disk/CurrentState");
getRunStatus();
@@ -376,4 +405,4 @@ angular.module('zmApp.controllers').controller('zmApp.StateCtrl', ['$ionicPopup'
};
-}]); \ No newline at end of file
+}]);
diff --git a/www/js/TimelineCtrl.js b/www/js/TimelineCtrl.js
index 0f67b085..101e7166 100644
--- a/www/js/TimelineCtrl.js
+++ b/www/js/TimelineCtrl.js
@@ -9,40 +9,48 @@
// I've disabled pan and zoom and used buttons instead
// also limits # of items to maxItems
-
// FIXME: too much redundant code between EventCtrl and Timeline
// Move to ModalCtrl and see if it works
-angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPlatform', '$scope', 'zm', 'NVRDataModel', '$ionicSideMenuDelegate', '$rootScope', '$http', '$q', 'message', '$state', '$ionicLoading', '$ionicPopover', '$ionicScrollDelegate', '$ionicModal', '$timeout', '$ionicContentBanner', '$ionicHistory', '$sce', '$stateParams', '$translate', '$ionicPopup', '$interval', function($ionicPlatform, $scope, zm, NVRDataModel, $ionicSideMenuDelegate, $rootScope, $http, $q, message, $state, $ionicLoading, $ionicPopover, $ionicScrollDelegate, $ionicModal, $timeout, $ionicContentBanner, $ionicHistory, $sce, $stateParams, $translate, $ionicPopup, $interval) {
+angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPlatform', '$scope', 'zm', 'NVRDataModel', '$ionicSideMenuDelegate', '$rootScope', '$http', '$q', 'message', '$state', '$ionicLoading', '$ionicPopover', '$ionicScrollDelegate', '$ionicModal', '$timeout', '$ionicContentBanner', '$ionicHistory', '$sce', '$stateParams', '$translate', '$ionicPopup', '$interval', function($ionicPlatform, $scope, zm, NVRDataModel, $ionicSideMenuDelegate, $rootScope, $http, $q, message, $state, $ionicLoading, $ionicPopover, $ionicScrollDelegate, $ionicModal, $timeout, $ionicContentBanner, $ionicHistory, $sce, $stateParams, $translate, $ionicPopup, $interval)
+{
//console.log("Inside Timeline controller");
- $scope.openMenu = function() {
+ $scope.openMenu = function()
+ {
$ionicSideMenuDelegate.toggleLeft();
};
//---------------------------------------f-------------------------
// Alarm notification handling
//----------------------------------------------------------------
- $scope.handleAlarms = function() {
+ $scope.handleAlarms = function()
+ {
$rootScope.isAlarm = !$rootScope.isAlarm;
- if (!$rootScope.isAlarm) {
+ if (!$rootScope.isAlarm)
+ {
$rootScope.alarmCount = "0";
- $ionicHistory.nextViewOptions({
+ $ionicHistory.nextViewOptions(
+ {
disableBack: true
});
- $state.go("events", {
+ $state.go("events",
+ {
"id": 0,
"playEvent": false
- }, {
+ },
+ {
reload: true
});
return;
}
};
- $scope.leftButtons = [{
+ $scope.leftButtons = [
+ {
type: 'button-icon icon ion-navicon',
- tap: function(e) {
+ tap: function(e)
+ {
$scope.toggleMenu();
}
}];
@@ -50,7 +58,8 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
//-----------------------------------------------------------
// Used to display date range for timeline
//-----------------------------------------------------------
- $scope.prettify = function(str) {
+ $scope.prettify = function(str)
+ {
if (NVRDataModel.getLogin().useLocalTimeZone)
return moment.tz(str, NVRDataModel.getTimeZoneNow()).tz(moment.tz.guess()).format('MMMM Do YYYY, ' + NVRDataModel.getTimeFormat());
else
@@ -60,7 +69,8 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
//-----------------------------------------------------------
// used for playback when you tap on a timeline event
//-----------------------------------------------------------
- $scope.calcMsTimer = function(frames, len) {
+ $scope.calcMsTimer = function(frames, len)
+ {
var myframes, mylen;
myframes = parseFloat(frames);
mylen = parseFloat(len);
@@ -69,8 +79,8 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
return (Math.round(1000 / (myframes / mylen)));
};
-
- $scope.toggleMinAlarmFrameCount = function() {
+ $scope.toggleMinAlarmFrameCount = function()
+ {
// console.log("Toggling");
var ld = NVRDataModel.getLogin();
@@ -78,7 +88,6 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
NVRDataModel.setLogin(ld);
-
drawGraph(curFromDate, curToDate, curCount);
};
@@ -86,11 +95,13 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
//-----------------------------------------------------------
// Move/Zoom are used to move the timeline around
//-----------------------------------------------------------
- function move(percentage) {
+ function move(percentage)
+ {
var range = timeline.getWindow();
var interval = range.end - range.start;
- timeline.setWindow({
+ timeline.setWindow(
+ {
start: range.start.valueOf() - interval * percentage,
end: range.end.valueOf() - interval * percentage
});
@@ -101,19 +112,19 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
$scope.gotoNow = function()
{
timeline.moveTo(timeline.getCurrentTime());
- };
+ };
- $scope.move = function(percentage) {
+ $scope.move = function(percentage)
+ {
move(percentage);
};
-
-
//-----------------------------------------
// Move by X days
//-----------------------------------------
- $scope.moveDays = function(d) {
+ $scope.moveDays = function(d)
+ {
var range = timeline.getWindow();
var ds = moment(range.start);
if (d > 0)
@@ -127,7 +138,6 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
fromDate = ds.format("YYYY-MM-DD HH:mm:ss");
toDate = es.format("YYYY-MM-DD HH:mm:ss");
-
$scope.fromDate = fromDate;
$scope.toDate = toDate;
$rootScope.customTimelineRange = false;
@@ -136,35 +146,34 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
};
-
- function eventDetails(ev) {
+ function eventDetails(ev)
+ {
$scope.event = ev;
- $ionicModal.fromTemplateUrl('templates/timeline-modal.html', {
+ $ionicModal.fromTemplateUrl('templates/timeline-modal.html',
+ {
scope: $scope, // give ModalCtrl access to this scope
animation: 'slide-in-up',
id: 'analyze',
})
- .then(function(modal) {
+ .then(function(modal)
+ {
$scope.modal = modal;
-
-
-
$scope.modal.show();
});
}
-
-
//--------------------------------------------------------
// To show a modal dialog with the event tapped on in timeline
// FIXME : code repeat from Events
//--------------------------------------------------------
- function openModal(event) {
+ function openModal(event)
+ {
- if ($scope.modalFromTimelineIsOpen == true) {
+ if ($scope.modalFromTimelineIsOpen == true)
+ {
// don't know why but some conflict from angular to timeline lib
// results in double modals at times
NVRDataModel.log(">>-- duplicate modal detected, preventing");
@@ -182,15 +191,18 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
//prepareModalEvent(event.Event.Id);
- $ionicModal.fromTemplateUrl('templates/events-modal.html', {
+ $ionicModal.fromTemplateUrl('templates/events-modal.html',
+ {
scope: $scope, // give ModalCtrl access to this scope
animation: 'slide-in-up',
id: 'footage'
})
- .then(function(modal) {
+ .then(function(modal)
+ {
$scope.modal = modal;
- $ionicLoading.show({
+ $ionicLoading.show(
+ {
template: $translate.instant('kPleaseWait') + "...",
noBackdrop: true,
duration: 10000,
@@ -201,8 +213,6 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
var ld = NVRDataModel.getLogin();
-
-
});
}
@@ -211,14 +221,16 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
//We need to destroy because we are instantiating
// it on open
//--------------------------------------------------------
- $scope.closeModal = function() {
+ $scope.closeModal = function()
+ {
$scope.modalFromTimelineIsOpen = false;
// $interval.cancel(eventsInterval);
//$interval.cancel(segmentHandle);
NVRDataModel.debug("TimelineCtrl:Close & Destroy Modal");
NVRDataModel.stopNetwork("TimelineCtrl: closeModal");
NVRDataModel.setAwake(false);
- if ($scope.modal !== undefined) {
+ if ($scope.modal !== undefined)
+ {
$scope.modal.remove();
}
@@ -232,11 +244,11 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
};*/
-
//-------------------------------------------------------------------------
// called when user switches to background
//-------------------------------------------------------------------------
- function onPause() {
+ function onPause()
+ {
NVRDataModel.debug("TimelineCtrl:onpause called");
$interval.cancel(updateInterval);
// console.log("*** Moving to Background ***"); // Handle the pause event
@@ -245,37 +257,39 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
}
-
//--------------------------------------------------------
// This function is called by the graph ontapped function
// which in turn calls openModal
//--------------------------------------------------------
- function showEvent(event) {
+ function showEvent(event)
+ {
// in context of angular
- $timeout(function() {
+ $timeout(function()
+ {
openModal(event);
});
}
- $rootScope.$on('tz-updated', function() {
+ $rootScope.$on('tz-updated', function()
+ {
$scope.tzAbbr = NVRDataModel.getTimeZoneNow();
NVRDataModel.debug("Timezone API updated timezone to " + NVRDataModel.getTimeZoneNow());
});
-
-
//-------------------------------------------------
// Make sure we delete the timeline
// This may be redundant as the root view gets
// destroyed but no harm
//-------------------------------------------------
- $scope.$on('$ionicView.leave', function() {
+ $scope.$on('$ionicView.leave', function()
+ {
- if (timeline) {
+ if (timeline)
+ {
$interval.cancel(updateInterval);
timeline.destroy();
console.log("**Destroying Timeline");
@@ -283,7 +297,6 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
}
});
-
/*$scope.$on('$ionicView.enter', function() {
@@ -291,7 +304,8 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
});*/
- $scope.$on('$ionicView.beforeEnter', function() {
+ $scope.$on('$ionicView.beforeEnter', function()
+ {
//$ionicHistory.clearCache();
//$ionicHistory.clearHistory();
@@ -310,16 +324,19 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
// graph range
//-------------------------------------------------
- $scope.$on('$ionicView.afterEnter', function() {
+ $scope.$on('$ionicView.afterEnter', function()
+ {
- $scope.monitors = message;
+ $scope.monitors = message;
//console.log("***AFTER ENTER");
- $scope.follow = { 'time': NVRDataModel.getLogin().followTimeLine };
+ $scope.follow = {
+ 'time': NVRDataModel.getLogin().followTimeLine
+ };
$interval.cancel(updateInterval);
- // Make sure sliding for menu is disabled so it
+ // Make sure sliding for menu is disabled so it
// does not interfere with graph panning
$ionicSideMenuDelegate.canDragContent(false);
var ld = NVRDataModel.getLogin();
@@ -338,11 +355,13 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
$scope.modalFromTimelineIsOpen = false;
//var tempMon = message;
-
// lets timeline.onget the abbreviated version of TZ to display
- if (NVRDataModel.getLogin().useLocalTimeZone) {
+ if (NVRDataModel.getLogin().useLocalTimeZone)
+ {
$scope.tzAbbr = moment().tz(moment.tz.guess()).zoneAbbr();
- } else {
+ }
+ else
+ {
$scope.tzAbbr = moment().tz(NVRDataModel.getTimeZoneNow()).zoneAbbr();
}
@@ -355,80 +374,91 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
$scope.monitors = iMon[0];
} else*/
-
-
-
//console.log ("MONITORS:"+JSON.stringify($scope.monitors));
- if ($rootScope.customTimelineRange) {
+ if ($rootScope.customTimelineRange)
+ {
$scope.currentMode = 'custom';
- //console.log("***** CUSTOM RANGE");
+ //console.log("***** CUSTOM RANGE");
if (moment($rootScope.fromString).isValid() &&
- moment($rootScope.toString).isValid()) {
+ moment($rootScope.toString).isValid())
+ {
// console.log("FROM & TO IS CUSTOM");
fromDate = $rootScope.fromString;
toDate = $rootScope.toString;
$scope.fromDate = fromDate;
$scope.toDate = toDate;
drawGraph(fromDate, toDate, maxItems);
- } else {
- console.log ("From:"+$rootScope.fromString + " To:"+$rootScope.toString);
+ }
+ else
+ {
+ console.log("From:" + $rootScope.fromString + " To:" + $rootScope.toString);
//console.log("FROM & TO IS CUSTOM INVALID");
if (NVRDataModel.getLogin().useLocalTimeZone)
{
fromDate = moment().startOf('day').format("YYYY-MM-DD HH:mm:ss");
- toDate = moment().endOf('day').format("YYYY-MM-DD HH:mm:ss");
+ toDate = moment().endOf('day').format("YYYY-MM-DD HH:mm:ss");
}
else
{
fromDate = moment().tz(NVRDataModel.getTimeZoneNow()).startOf('day').format("YYYY-MM-DD HH:mm:ss");
- toDate = moment().tz(NVRDataModel.getTimeZoneNow()).endOf('day').format("YYYY-MM-DD HH:mm:ss");
+ toDate = moment().tz(NVRDataModel.getTimeZoneNow()).endOf('day').format("YYYY-MM-DD HH:mm:ss");
}
-
+
drawGraph(fromDate, toDate, maxItems);
}
- } else {
+ }
+ else
+ {
$scope.currentMode = 'day';
if (NVRDataModel.getLogin().useLocalTimeZone)
- {
- fromDate = moment().startOf('day').format("YYYY-MM-DD HH:mm:ss");
- toDate = moment().endOf('day').format("YYYY-MM-DD HH:mm:ss");
- }
- else
- {
- fromDate = moment().tz(NVRDataModel.getTimeZoneNow()).startOf('day').format("YYYY-MM-DD HH:mm:ss");
- toDate = moment().tz(NVRDataModel.getTimeZoneNow()).endOf('day').format("YYYY-MM-DD HH:mm:ss");
- }
+ {
+ fromDate = moment().startOf('day').format("YYYY-MM-DD HH:mm:ss");
+ toDate = moment().endOf('day').format("YYYY-MM-DD HH:mm:ss");
+ }
+ else
+ {
+ fromDate = moment().tz(NVRDataModel.getTimeZoneNow()).startOf('day').format("YYYY-MM-DD HH:mm:ss");
+ toDate = moment().tz(NVRDataModel.getTimeZoneNow()).endOf('day').format("YYYY-MM-DD HH:mm:ss");
+ }
drawGraph(fromDate, toDate, maxItems);
}
- $ionicPopover.fromTemplateUrl('templates/timeline-popover.html', {
+ $ionicPopover.fromTemplateUrl('templates/timeline-popover.html',
+ {
scope: $scope,
- }).then(function(popover) {
+ }).then(function(popover)
+ {
$scope.popover = popover;
});
-
// --------------------------------------------------------
// Handling of back button in case modal is open should
// close the modal
// --------------------------------------------------------
- $ionicPlatform.registerBackButtonAction(function(e) {
+ $ionicPlatform.registerBackButtonAction(function(e)
+ {
e.preventDefault();
- if ($scope.modal != undefined && $scope.modal.isShown()) {
+ if ($scope.modal != undefined && $scope.modal.isShown())
+ {
// switch off awake, as liveview is finished
NVRDataModel.debug("Modal is open, closing it");
NVRDataModel.setAwake(false);
$scope.modal.remove();
- } else {
+ }
+ else
+ {
NVRDataModel.debug("Modal is closed, so toggling or exiting");
- if (!$ionicSideMenuDelegate.isOpenLeft()) {
+ if (!$ionicSideMenuDelegate.isOpenLeft())
+ {
$ionicSideMenuDelegate.toggleLeft();
- } else {
+ }
+ else
+ {
navigator.app.exitApp();
}
@@ -436,14 +466,12 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
}, 1000);
-
});
//-------------------------------------------------
// Controller main
//-------------------------------------------------
-
var graphIndex;
var updateInterval;
var lastTimeForEvent;
@@ -460,40 +488,28 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
var curFromDate, curToDate, curCount;
-
document.addEventListener("pause", onPause, false);
// FIXME: Timeline awake to avoid graph redrawing
NVRDataModel.setAwake(NVRDataModel.getKeepAwake());
-
-
-
-
-
// fromDate and toDate will be used to plot the range for the graph
// We start in day mode
//
var fromDate, toDate;
-
- fromDate = moment().tz(NVRDataModel.getLogin().useLocalTimeZone?NVRDataModel.getLocalTimeZoneNow():NVRDataModel.getTimeZoneNow()).startOf('day').format("YYYY-MM-DD HH:mm:ss");
- toDate = moment().tz(NVRDataModel.getLogin().useLocalTimeZone?NVRDataModel.getLocalTimeZoneNow():NVRDataModel.getTimeZoneNow()).endOf('day').format("YYYY-MM-DD HH:mm:ss");
-
-
+ fromDate = moment().tz(NVRDataModel.getLogin().useLocalTimeZone ? NVRDataModel.getLocalTimeZoneNow() : NVRDataModel.getTimeZoneNow()).startOf('day').format("YYYY-MM-DD HH:mm:ss");
+ toDate = moment().tz(NVRDataModel.getLogin().useLocalTimeZone ? NVRDataModel.getLocalTimeZoneNow() : NVRDataModel.getTimeZoneNow()).endOf('day').format("YYYY-MM-DD HH:mm:ss");
$scope.fromDate = fromDate;
$scope.toDate = toDate;
-
// maxItems will be ignored during timeline draw if its desktop
var maxItemsConf;
var ld = NVRDataModel.getLogin();
var maxItems;
-
-
//flat colors for graph - https://flatuicolors.com http://www.flatuicolorpicker.com
var colors = ['#3498db', '#E57373', '#EB974E', '#95A5A6', '#e74c3c', '#03C9A9', ];
@@ -501,8 +517,6 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
container = angular.element(document.getElementById('visualization'));
var timeline;
-
-
//console.log ("RETURNING MONITORS " + JSON.stringify($scope.monitors));
//$scope.monitors = message;
@@ -511,8 +525,6 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
$scope.navControls = false;
var navControls = false;
-
-
//drawGraph(fromDate, toDate, maxItems);
//dummyDrawGraph(fromDate, toDate,maxItems);
@@ -520,42 +532,53 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
// Rest graph to sane state after you went
// wild zooming and panning :-)
//-------------------------------------------------
- $scope.fit = function() {
+ $scope.fit = function()
+ {
timeline.fit();
};
- $scope.toggleNav = function() {
- if (navControls == true) {
+ $scope.toggleNav = function()
+ {
+ if (navControls == true)
+ {
navControls = !navControls;
// $scope.navControls = navControls;
// give out animation time
- $timeout(function() {
+ $timeout(function()
+ {
$scope.navControls = navControls;
}, 2000);
- } else {
+ }
+ else
+ {
navControls = !navControls;
$scope.navControls = navControls;
}
var element = angular.element(document.getElementById("timeline-ctrl"));
- if (navControls) {
+ if (navControls)
+ {
element.removeClass("animated bounceOutLeft");
element.addClass("animated bounceInRight");
- } else {
+ }
+ else
+ {
element.removeClass("animated bounceInRight");
element.addClass("animated bounceOutLeft");
}
};
- function shortenTime(str) {
+ function shortenTime(str)
+ {
if (NVRDataModel.getLogin().useLocalTimeZone)
return moment.tz(str, NVRDataModel.getTimeZoneNow()).tz(moment.tz.guess()).format(NVRDataModel.getTimeFormat());
else
return moment(str).format(NVRDataModel.getTimeFormat());
}
- $scope.toggleFollowTime = function() {
+ $scope.toggleFollowTime = function()
+ {
/*if ($scope.currentMode != 'day') {
$rootScope.zmPopup = $ionicPopup.alert({
title: $translate.instant('kError'),
@@ -573,8 +596,8 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
// so we can redraw the graph
//-------------------------------------------------
-
- $scope.buttonClicked = function(index) {
+ $scope.buttonClicked = function(index)
+ {
//console.log (index);
if (index == 0) //month
{
@@ -588,30 +611,33 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
$scope.fromDate = fromDate;
$scope.toDate = toDate;
drawGraph(fromDate, toDate, maxItems);
- } else if (index == 1) //week
+ }
+ else if (index == 1) //week
{
$scope.follow.time = NVRDataModel.getLogin().followTimeLine;
$scope.currentMode = "week";
$rootScope.customTimelineRange = false;
NVRDataModel.log("Week view");
- toDate = moment().tz(NVRDataModel.getLogin().useLocalTimeZone?NVRDataModel.getLocalTimeZoneNow():NVRDataModel.getTimeZoneNow()).format("YYYY-MM-DD HH:mm:ss");
- fromDate = moment().tz(NVRDataModel.getLogin().useLocalTimeZone?NVRDataModel.getLocalTimeZoneNow():NVRDataModel.getTimeZoneNow()).subtract(1, 'week').startOf('day').format("YYYY-MM-DD HH:mm:ss");
+ toDate = moment().tz(NVRDataModel.getLogin().useLocalTimeZone ? NVRDataModel.getLocalTimeZoneNow() : NVRDataModel.getTimeZoneNow()).format("YYYY-MM-DD HH:mm:ss");
+ fromDate = moment().tz(NVRDataModel.getLogin().useLocalTimeZone ? NVRDataModel.getLocalTimeZoneNow() : NVRDataModel.getTimeZoneNow()).subtract(1, 'week').startOf('day').format("YYYY-MM-DD HH:mm:ss");
$scope.fromDate = fromDate;
$scope.toDate = toDate;
drawGraph(fromDate, toDate, maxItems);
- } else if (index == 2) //day
+ }
+ else if (index == 2) //day
{
$scope.currentMode = "day";
$rootScope.customTimelineRange = false;
NVRDataModel.log("Day view");
//toDate = moment().format("YYYY-MM-DD HH:mm:ss");
- fromDate = moment().tz(NVRDataModel.getLogin().useLocalTimeZone?NVRDataModel.getLocalTimeZoneNow():NVRDataModel.getTimeZoneNow()).startOf('day').format("YYYY-MM-DD HH:mm:ss");
- toDate = moment().tz(NVRDataModel.getLogin().useLocalTimeZone?NVRDataModel.getLocalTimeZoneNow():NVRDataModel.getTimeZoneNow()).endOf('day').format("YYYY-MM-DD HH:mm:ss");
+ fromDate = moment().tz(NVRDataModel.getLogin().useLocalTimeZone ? NVRDataModel.getLocalTimeZoneNow() : NVRDataModel.getTimeZoneNow()).startOf('day').format("YYYY-MM-DD HH:mm:ss");
+ toDate = moment().tz(NVRDataModel.getLogin().useLocalTimeZone ? NVRDataModel.getLocalTimeZoneNow() : NVRDataModel.getTimeZoneNow()).endOf('day').format("YYYY-MM-DD HH:mm:ss");
$scope.fromDate = fromDate;
$scope.toDate = toDate;
drawGraph(fromDate, toDate, maxItems);
- } else // custom
+ }
+ else // custom
{
$scope.follow.time = NVRDataModel.getLogin().followTimeLine;
$scope.currentMode = "custom";
@@ -622,12 +648,12 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
};
-
/**
* [processNewEvents is called every X seconds when dynamic update is on. X = 10 for now]
* @return {[type]}
*/
- function processNewEvents() {
+ function processNewEvents()
+ {
//safeguard in the event http calls are still going on
if (!$scope.follow.time || isProcessNewEventsWaiting) return;
@@ -636,7 +662,6 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
// check for last 2 minutes to account for late DB updates and what not. 5 mins was likely enough
//
-
// make sure these are server time
var from = moment(lastTimeForEvent).tz(NVRDataModel.getTimeZoneNow());
@@ -645,7 +670,7 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
var to = moment(lastTimeForEvent).tz(NVRDataModel.getTimeZoneNow());
to = to.locale('en').format("YYYY-MM-DD HH:mm:ss");
- lastTimeForEvent = moment().tz(NVRDataModel.getLogin().useLocalTimeZone?NVRDataModel.getLocalTimeZoneNow():NVRDataModel.getTimeZoneNow());
+ lastTimeForEvent = moment().tz(NVRDataModel.getLogin().useLocalTimeZone ? NVRDataModel.getLocalTimeZoneNow() : NVRDataModel.getTimeZoneNow());
// FIXME: totally ignoring event pages - hoping it wont be more than 100 or 150 whatever
// the events per page limit is. Why? laziness.
@@ -660,15 +685,14 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
// as it turns out various events get stored withn null and never recover
// so, lets limiy to 15 m
//
-
+
var st = moment(lastTimeForEvent).tz(NVRDataModel.getTimeZoneNow());
- st = st.subtract (10,'minutes').locale('en').format("YYYY-MM-DD HH:mm:ss");
- var ongoingEvents = ld.apiurl + '/events/index/StartTime >=:'+st+'/EndTime =:.json';
+ st = st.subtract(10, 'minutes').locale('en').format("YYYY-MM-DD HH:mm:ss");
+ var ongoingEvents = ld.apiurl + '/events/index/StartTime >=:' + st + '/EndTime =:.json';
//NVRDataModel.debug("Getting incremental events using: " + completedEvents);
-
- NVRDataModel.debug ("Completed events API:"+completedEvents);
- NVRDataModel.debug ("Ongoing events API:+"+ongoingEvents);
+ NVRDataModel.debug("Completed events API:" + completedEvents);
+ NVRDataModel.debug("Ongoing events API:+" + ongoingEvents);
isProcessNewEventsWaiting = true;
@@ -676,32 +700,36 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
var $httpOngoing = $http.get(ongoingEvents);
$q.all([$httpApi, $httpOngoing])
- .then(function(dataarray) {
+ .then(function(dataarray)
+ {
var myevents = dataarray[0].data.events;
- if (dataarray.length > 1) {
+ if (dataarray.length > 1)
+ {
myevents = myevents.concat(dataarray[1].data.events);
-
+
}
$scope.newEvents = '';
var localNewEvents = '';
//console.log ("GOT "+JSON.stringify(data));
- for (var j = 0; j < myevents.length; j++) {
+ for (var j = 0; j < myevents.length; j++)
+ {
// these are all in server timezone but no TZ
-
+
myevents[j].Event.StartTime = moment.tz(myevents[j].Event.StartTime, NVRDataModel.getTimeZoneNow()).format('YYYY-MM-DD HH:mm:ss');
myevents[j].Event.EndTime = moment.tz(myevents[j].Event.EndTime, NVRDataModel.getTimeZoneNow()).format('YYYY-MM-DD HH:mm:ss');
-
+
var itm = graphData.get(myevents[j].Event.Id);
- if (itm) {
- // console.log(myevents[j].Event.Id + " already exists, updating params");
+ if (itm)
+ {
+ // console.log(myevents[j].Event.Id + " already exists, updating params");
- var content = "<span class='my-vis-font'>" + "("+myevents[j].Event.Id+")"+myevents[j].Event.Notes + " " + $translate.instant('kRecordingProgress') + "</span>";
+ var content = "<span class='my-vis-font'>" + "(" + myevents[j].Event.Id + ")" + myevents[j].Event.Notes + " " + $translate.instant('kRecordingProgress') + "</span>";
var style;
var recordingInProgress = false;
@@ -710,16 +738,17 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
{
//console.log ("EVENT "+myevents[j].Event.Id+" emded at "+myevents[j].Event.EndTime);
- content = "<span class='my-vis-font'>" + "( <i class='ion-android-notifications'></i>" + myevents[j].Event.AlarmFrames + ") " + " ("+myevents[j].Event.Id+") "+ myevents[j].Event.Notes + "</span>";
+ content = "<span class='my-vis-font'>" + "( <i class='ion-android-notifications'></i>" + myevents[j].Event.AlarmFrames + ") " + " (" + myevents[j].Event.Id + ") " + myevents[j].Event.Notes + "</span>";
style = "background-color:" + colors[parseInt(myevents[j].Event.MonitorId) % colors.length] +
";border-color:" + colors[parseInt(myevents[j].Event.MonitorId) % colors.length];
- } else // still recording
+ }
+ else // still recording
{
- var tze;
+ var tze;
tze = moment().tz(NVRDataModel.getTimeZoneNow());
-
+
myevents[j].Event.EndTime = tze.format('YYYY-MM-DD HH:mm:ss');
//console.log ("END TIME = "+ myevents[j].Event.EndTime);
@@ -729,42 +758,44 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
}
-
-
// right at this point we need to decide if we keep or remove this event
//
- if (ld.enableAlarmCount && ld.minAlarmCount > myevents[j].Event.AlarmFrames && !recordingInProgress) {
+ if (ld.enableAlarmCount && ld.minAlarmCount > myevents[j].Event.AlarmFrames && !recordingInProgress)
+ {
// remove
NVRDataModel.debug("Removing Event:" + myevents[j].Event.Id + "as it doesn't have " + myevents[j].Event.AlarmFrames + " alarm frames");
- // var old = timeline.getWindow();
+ // var old = timeline.getWindow();
graphData.remove(myevents[j].Event.Id);
- // timeline.setWindow (old.start, old.end);
- } else {
+ // timeline.setWindow (old.start, old.end);
+ }
+ else
+ {
var tzs1, tze1;
if (NVRDataModel.getLogin().useLocalTimeZone)
{
- tzs1 = moment.tz(myevents[j].Event.StartTime, NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow());
- tze1 = moment.tz(myevents[j].Event.EndTime, NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow());
+ tzs1 = moment.tz(myevents[j].Event.StartTime, NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow());
+ tze1 = moment.tz(myevents[j].Event.EndTime, NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow());
}
else
{
- tzs1 = moment.tz(myevents[j].Event.StartTime,NVRDataModel.getTimeZoneNow());
- tze1 = moment.tz(myevents[j].Event.EndTime,NVRDataModel.getTimeZoneNow());
+ tzs1 = moment.tz(myevents[j].Event.StartTime, NVRDataModel.getTimeZoneNow());
+ tze1 = moment.tz(myevents[j].Event.EndTime, NVRDataModel.getTimeZoneNow());
}
//tzs1 = tzs1.format("YYYY-MM-DD HH:mm:ss");
//tze1 = tze1.format("YYYY-MM-DD HH:mm:ss");
- NVRDataModel.debug("Updating Event:" + myevents[j].Event.Id + "StartTime:"+tzs1.format()+" EndTime:" + tze1.format());
- graphData.update({
+ NVRDataModel.debug("Updating Event:" + myevents[j].Event.Id + "StartTime:" + tzs1.format() + " EndTime:" + tze1.format());
+ graphData.update(
+ {
id: myevents[j].Event.Id,
content: content,
- start:tzs1,
- // start: myevents[j].Event.StartTime,
- // end: myevents[j].Event.EndTime,
- end:tze1,
+ start: tzs1,
+ // start: myevents[j].Event.StartTime,
+ // end: myevents[j].Event.EndTime,
+ end: tze1,
//group: myevents[j].Event.MonitorId,
//type: "range",
style: style,
@@ -783,33 +814,33 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
//console.log ("Focus EID="+myevents[j].Event.Id);
localNewEvents = localNewEvents + NVRDataModel.getMonitorName(myevents[j].Event.MonitorId) + '@' + shortenTime(myevents[j].Event.StartTime) + ' (' + myevents[j].Event.Id + '),';
-
}
-
-
- } else { // event is new
+ }
+ else
+ { // event is new
var isBeingRecorded = false;
var idfound = false;
- for (var ii = 0; ii < $scope.monitors.length; ii++) {
- if ($scope.monitors[ii].Monitor.Id == myevents[j].Event.MonitorId && NVRDataModel.isNotHidden(myevents[j].Event.MonitorId)) {
+ for (var ii = 0; ii < $scope.monitors.length; ii++)
+ {
+ if ($scope.monitors[ii].Monitor.Id == myevents[j].Event.MonitorId && NVRDataModel.isNotHidden(myevents[j].Event.MonitorId))
+ {
idfound = true;
break;
}
}
- if (idfound) {
-
-
+ if (idfound)
+ {
myevents[j].Event.MonitorName = NVRDataModel.getMonitorName(myevents[j].Event.MonitorId);
-
myevents[j].Event.streamingURL = NVRDataModel.getStreamingURL(myevents[j].Event.MonitorId);
myevents[j].Event.baseURL = NVRDataModel.getBaseURL(myevents[j].Event.MonitorId);
myevents[j].Event.imageMode = NVRDataModel.getImageMode(myevents[j].Event.MonitorId);
- if (NVRDataModel.getLogin().url != myevents[j].Event.baseURL) {
+ if (NVRDataModel.getLogin().url != myevents[j].Event.baseURL)
+ {
myevents[j].Event.baseURL = NVRDataModel.getLogin().url;
}
@@ -818,8 +849,6 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
// console.log (JSON.stringify(myevents[j]));
myevents[j].Event.DefaultVideo = "";
-
-
// now lets make sure we don't infinitely increase
if (graphIndex >= curCount)
@@ -827,7 +856,8 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
{
var mv = graphData.min('id');
//console.log("MIN="+JSON.stringify(mv));
- if (mv) {
+ if (mv)
+ {
graphData.remove(mv.id);
graphIndex--;
NVRDataModel.debug("Removed Event " + mv.id + " to make space");
@@ -836,26 +866,24 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
}
// since this is a new add its possible dates are not defined
- if (!moment(myevents[j].Event.StartTime).isValid()) {
+ if (!moment(myevents[j].Event.StartTime).isValid())
+ {
NVRDataModel.log("Event:" + myevents[j].Event.Id + "-Invalid Start time - this should really not happen ");
}
-
- if (!moment(myevents[j].Event.EndTime).isValid()) {
- var t1 = moment().tz(NVRDataModel.getTimeZoneNow());
-
-
+ if (!moment(myevents[j].Event.EndTime).isValid())
+ {
+ var t1 = moment().tz(NVRDataModel.getTimeZoneNow());
myevents[j].Event.EndTime = t1.format('YYYY-MM-DD HH:mm:ss');
- NVRDataModel.debug ("Event:" + myevents[j].Event.Id +"-End time is invalid, setting to current time");
-
+ NVRDataModel.debug("Event:" + myevents[j].Event.Id + "-End time is invalid, setting to current time");
+
isBeingRecorded = true;
}
-
// if range doesn't allow for current time, we need to fix that
/*if (moment(options.max).isBefore(moment())) {
// console.log("Adjusting Range to fit in new event");
@@ -865,41 +893,43 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
var eventText = "<span class='my-vis-font'>" + "( <i class='ion-android-notifications'></i>" + (myevents[j].Event.AlarmFrames || ' unknown ') + ") " + myevents[j].Event.Notes + "</span>";
- if (isBeingRecorded) {
- eventText = "<span class='my-vis-font'>" + "("+myevents[j].Event.Id+") "+ myevents[j].Event.Notes + " " + $translate.instant('kRecordingProgress') + "</span>";
+ if (isBeingRecorded)
+ {
+ eventText = "<span class='my-vis-font'>" + "(" + myevents[j].Event.Id + ") " + myevents[j].Event.Notes + " " + $translate.instant('kRecordingProgress') + "</span>";
}
// since we concated, its possible events may be repeated
- if (!graphData.get(myevents[j].Event.Id)) {
-
+ if (!graphData.get(myevents[j].Event.Id))
+ {
localNewEvents = localNewEvents + NVRDataModel.getMonitorName(myevents[j].Event.MonitorId) + '@' + shortenTime(myevents[j].Event.StartTime) + ' (' + myevents[j].Event.Id + '),';
var tzs2, tze2;
if (NVRDataModel.getLogin().useLocalTimeZone)
{
- tzs2 = moment.tz(myevents[j].Event.StartTime, NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow());
- tze2 = moment.tz(myevents[j].Event.EndTime, NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow());
+ tzs2 = moment.tz(myevents[j].Event.StartTime, NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow());
+ tze2 = moment.tz(myevents[j].Event.EndTime, NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow());
}
else
{
- tzs2 = moment.tz(myevents[j].Event.StartTime,NVRDataModel.getTimeZoneNow());
- tze2 = moment.tz(myevents[j].Event.EndTime,NVRDataModel.getTimeZoneNow());
+ tzs2 = moment.tz(myevents[j].Event.StartTime, NVRDataModel.getTimeZoneNow());
+ tze2 = moment.tz(myevents[j].Event.EndTime, NVRDataModel.getTimeZoneNow());
}
//tzs2 = tzs2.format("YYYY-MM-DD HH:mm:ss");
//tze2 = tze2.format("YYYY-MM-DD HH:mm:ss");
-
- NVRDataModel.debug(">>> "+myevents[j].Event.Id + " New event updating graph " + " from:" + tzs2.format()+" to:"+tze2.format() );
-
- graphData.add({
+
+ NVRDataModel.debug(">>> " + myevents[j].Event.Id + " New event updating graph " + " from:" + tzs2.format() + " to:" + tze2.format());
+
+ graphData.add(
+ {
id: myevents[j].Event.Id,
content: eventText,
- start:tzs2,
+ start: tzs2,
//start: myevents[j].Event.StartTime,
- // end: myevents[j].Event.EndTime,
- end:tze2,
+ // end: myevents[j].Event.EndTime,
+ end: tze2,
group: myevents[j].Event.MonitorId,
style: "background-color:orange",
//type: "range",
@@ -914,22 +944,20 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
});
graphIndex++;
//timeline.focus(myevents[j].Event.Id);
- timeline.moveTo(timeline.getCurrentTime());
+ timeline.moveTo(timeline.getCurrentTime());
}
//options.max = moment(fromDate).locale('en').format("YYYY-MM-DD HH:mm:ss");
-
-
} //idfound
-
} // new event
} // for j
// At this stage, see if we need to display new events
- if (localNewEvents.length > 0) {
+ if (localNewEvents.length > 0)
+ {
localNewEvents = $translate.instant('kLatestEvents') + ':' + localNewEvents;
localNewEvents = localNewEvents.slice(0, -1);
$scope.newEvents = localNewEvents;
@@ -937,28 +965,25 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
isProcessNewEventsWaiting = false;
},
- function(err) {
+ function(err)
+ {
NVRDataModel.debug("Error getting incremental timeline data");
isProcessNewEventsWaiting = false;
});
-
-
-
// check all events that started 10+10 seconds ago
-
}
-
//-------------------------------------------------
// This function draws the graph
//-------------------------------------------------
- function drawGraph(fromDate, toDate, count) {
+ function drawGraph(fromDate, toDate, count)
+ {
- console.log ("INSIDE DRAW");
+ console.log("INSIDE DRAW");
$scope.newEvents = "";
// we only need this for day mode
@@ -968,7 +993,6 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
curToDate = toDate;
curCount = count;
-
var isFirstItem = true;
var fromDateNoLang = moment(fromDate).locale('en').format("YYYY-MM-DD HH:mm:ss");
@@ -976,7 +1000,8 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
//latestDateDrawn =toDateNoLang;
- $ionicLoading.show({
+ $ionicLoading.show(
+ {
template: $translate.instant('kLoadingGraph') + "...",
animation: 'fade-in',
showBackdrop: true,
@@ -989,30 +1014,29 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
$scope.graphLoaded = false;
NVRDataModel.debug("TimelineCtrl/drawgraph: graphLoaded:" + $scope.graphLoaded);
- if (timeline) {
+ if (timeline)
+ {
NVRDataModel.debug("TimelineCtrl/drawgraph: destroying timeline as it exists");
timeline.destroy();
}
-
groups = new vis.DataSet();
graphData = new vis.DataSet();
//console.log ("AFTER VIS");
-
var tzs, tze;
// lets scope the time graph to either local or remote time zone
-
+
if (NVRDataModel.getLogin().useLocalTimeZone)
{
- tzs = moment.tz(fromDate, NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow());
- tze = moment.tz(toDate, NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow());
+ tzs = moment.tz(fromDate, NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow());
+ tze = moment.tz(toDate, NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow());
}
else
{
- tzs = moment.tz(fromDate,NVRDataModel.getTimeZoneNow());
- tze = moment.tz(toDate,NVRDataModel.getTimeZoneNow());
+ tzs = moment.tz(fromDate, NVRDataModel.getTimeZoneNow());
+ tze = moment.tz(toDate, NVRDataModel.getTimeZoneNow());
}
//tzs = tzs.format("YYYY-MM-DD HH:mm:ss");
@@ -1022,15 +1046,16 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
showCurrentTime: true,
editable: false,
- moment: function (date) {
+ moment: function(date)
+ {
//var t;
if (NVRDataModel.getLogin().useLocalTimeZone)
//if (0)
- return moment.tz(date,NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow());
+ return moment.tz(date, NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow());
else
- // typecast to server time zone - its in server time anyway
- return moment.tz(date,NVRDataModel.getTimeZoneNow());
+ // typecast to server time zone - its in server time anyway
+ return moment.tz(date, NVRDataModel.getTimeZoneNow());
},
//throttleRedraw: 100,
moveable: true,
@@ -1043,13 +1068,16 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
//max: tze,
zoomMin: 5 * 60 * 1000, // 1 min
stack: false,
- format: {
- minorLabels: {
+ format:
+ {
+ minorLabels:
+ {
minute: NVRDataModel.getTimeFormat(),
hour: NVRDataModel.getTimeFormat(),
second: 's',
},
- majorLabels: {
+ majorLabels:
+ {
second: "D MMM " + NVRDataModel.getTimeFormat(),
}
},
@@ -1058,11 +1086,11 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
graphIndex = 1; // will be used for graph ID
-
//console.log ("**NOLANG" + fromDateNoLang + " " + toDateNoLang);
NVRDataModel.getEventsPages(0, fromDateNoLang, toDateNoLang)
- .then(function(data) {
+ .then(function(data)
+ {
var pages = data.pageCount || 1;
var itemsPerPage = parseInt(data.limit);
var iterCount;
@@ -1076,7 +1104,8 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
// for dynamic binding which was easier, but due to performance reasons
// I am waiting for the full data to load before I draw
var promises = [];
- while ((pages > 0) && (iterCount > 0)) {
+ while ((pages > 0) && (iterCount > 0))
+ {
var promise = NVRDataModel.getEvents(0, pages, "none", fromDateNoLang, toDateNoLang);
promises.push(promise);
pages--;
@@ -1085,13 +1114,16 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
}
$q.all(promises)
- .then(function(data) {
+ .then(function(data)
+ {
NVRDataModel.debug("TimelineCtrl/drawgraph: all pages of graph data received");
graphIndex = 0;
NVRDataModel.log("Creating " + $scope.monitors.length + " groups for the graph");
// create groups
- for (var g = 0; g < $scope.monitors.length; g++) {
- groups.add({
+ for (var g = 0; g < $scope.monitors.length; g++)
+ {
+ groups.add(
+ {
id: $scope.monitors[g].Monitor.Id,
//mid: $scope.monitors[g].Monitor.Id,
content: NVRDataModel.getMonitorName($scope.monitors[g].Monitor.Id),
@@ -1101,28 +1133,32 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
NVRDataModel.getMonitorName($scope.monitors[g].Monitor.Id));
}
-
-
- for (var j = 0; j < data.length; j++) {
+ for (var j = 0; j < data.length; j++)
+ {
var myevents = data[j];
- if (graphIndex > count) {
+ if (graphIndex > count)
+ {
NVRDataModel.log("Exiting page count graph - reached limit of " + count);
break;
}
- for (var i = 0; i < myevents.length; i++) {
+ for (var i = 0; i < myevents.length; i++)
+ {
// make sure group id exists before adding
var idfound = true;
var ld = NVRDataModel.getLogin();
- if (ld.persistMontageOrder) {
+ if (ld.persistMontageOrder)
+ {
idfound = false;
- for (var ii = 0; ii < $scope.monitors.length; ii++) {
- if ($scope.monitors[ii].Monitor.Id == myevents[i].Event.MonitorId && NVRDataModel.isNotHidden(myevents[i].Event.MonitorId)) {
+ for (var ii = 0; ii < $scope.monitors.length; ii++)
+ {
+ if ($scope.monitors[ii].Monitor.Id == myevents[i].Event.MonitorId && NVRDataModel.isNotHidden(myevents[i].Event.MonitorId))
+ {
idfound = true;
//console.log ("****************** ID MATCH " + graphIndex);
@@ -1137,7 +1173,8 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
myevents[i].Event.streamingURL = NVRDataModel.getStreamingURL(myevents[i].Event.MonitorId);
myevents[i].Event.baseURL = NVRDataModel.getBaseURL(myevents[i].Event.MonitorId);
myevents[i].Event.imageMode = NVRDataModel.getImageMode(myevents[i].Event.MonitorId);
- if (NVRDataModel.getLogin().url != myevents[i].Event.baseURL) {
+ if (NVRDataModel.getLogin().url != myevents[i].Event.baseURL)
+ {
//NVRDataModel.debug ("Multi server, changing base");
myevents[i].Event.baseURL = NVRDataModel.getLogin().url;
@@ -1146,10 +1183,8 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
// console.log ("***** MULTISERVER BASE URL FOR EVENTS " + myevents[i].Event.baseURL);
-
-
-
- if (idfound) {
+ if (idfound)
+ {
if (typeof myevents[i].Event.DefaultVideo === 'undefined')
// console.log (JSON.stringify(myevents[i]));
@@ -1160,25 +1195,26 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
var tzs, tze;
if (NVRDataModel.getLogin().useLocalTimeZone)
{
- tzs = moment.tz(myevents[i].Event.StartTime,NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow());
- tze = moment.tz(myevents[i].Event.EndTime,NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow());
+ tzs = moment.tz(myevents[i].Event.StartTime, NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow());
+ tze = moment.tz(myevents[i].Event.EndTime, NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow());
}
else
{
- tzs = moment.tz(myevents[i].Event.StartTime,NVRDataModel.getTimeZoneNow());
- tze = moment.tz(myevents[i].Event.EndTime,NVRDataModel.getTimeZoneNow());
+ tzs = moment.tz(myevents[i].Event.StartTime, NVRDataModel.getTimeZoneNow());
+ tze = moment.tz(myevents[i].Event.EndTime, NVRDataModel.getTimeZoneNow());
}
//console.log ("ADDED "+tzs+" " +tze);
- graphData.add({
+ graphData.add(
+ {
//id: graphIndex,
id: myevents[i].Event.Id,
- content: "<span class='my-vis-font'>" + "( <i class='ion-android-notifications'></i>" + myevents[i].Event.AlarmFrames + ") "+ "("+myevents[j].Event.Id+") " + myevents[i].Event.Notes + "</span>",
+ content: "<span class='my-vis-font'>" + "( <i class='ion-android-notifications'></i>" + myevents[i].Event.AlarmFrames + ") " + "(" + myevents[j].Event.Id + ") " + myevents[i].Event.Notes + "</span>",
- start:tzs,
+ start: tzs,
//start: myevents[i].Event.StartTime,
//end: myevents[i].Event.EndTime,
- end:tze,
+ end: tze,
group: myevents[i].Event.MonitorId,
//type: "range",
style: "background-color:" + colors[parseInt(myevents[i].Event.MonitorId) % colors.length] +
@@ -1192,13 +1228,14 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
});
graphIndex++;
- } else {
+ }
+ else
+ {
//console.log ("SKIPPED GRAPH ID " + graphIndex);
}
-
-
- if (graphIndex > count) {
+ if (graphIndex > count)
+ {
NVRDataModel.log("Exiting event graph - reached limit of " + count);
break;
@@ -1207,7 +1244,7 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
}
}
- console.log(">>>>> CREATING NEW TIMELINE with "+JSON.stringify(options));
+ console.log(">>>>> CREATING NEW TIMELINE with " + JSON.stringify(options));
timeline = new vis.Timeline(container[0], null, options);
// console.log ("GRAPH DATA");
timeline.setItems(graphData);
@@ -1217,14 +1254,14 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
if (NVRDataModel.getLogin().timelineScale == -1)
{
- // console.log ("SCALE NOT FOUND");
-
- timeline.fit();
+ // console.log ("SCALE NOT FOUND");
+
+ timeline.fit();
}
else
{
- timeline.fit();
-
+ timeline.fit();
+
/*var d = NVRDataModel.getLogin().timelineScale;
console.log ("SCALE FOUND "+d+" SECONDS");
var w = timeline.getWindow();
@@ -1241,13 +1278,12 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
console.log ("Start="+s+" End="+e);
$timeout (function() {timeline.setWindow(s,e);},1000);*/
-
}
-
- lastTimeForEvent = moment().tz(NVRDataModel.getLogin().useLocalTimeZone?NVRDataModel.getLocalTimeZoneNow():NVRDataModel.getTimeZoneNow());
- updateInterval = $interval(function() {
+ lastTimeForEvent = moment().tz(NVRDataModel.getLogin().useLocalTimeZone ? NVRDataModel.getLocalTimeZoneNow() : NVRDataModel.getTimeZoneNow());
+ updateInterval = $interval(function()
+ {
processNewEvents();
}.bind(this), 10 * 1000);
@@ -1272,8 +1308,8 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
});*/
- timeline.on('rangechanged', function(s)
- {
+ timeline.on('rangechanged', function(s)
+ {
///console.log ("Range Changed:"+JSON.stringify(s));
if (s.byUser)
{
@@ -1282,24 +1318,25 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
//console.log ("start:"+w.start+" end:"+w.end);
var a = moment(w.start);
var b = moment(w.end);
- var d = b.diff(a,'seconds');
+ var d = b.diff(a, 'seconds');
var ld = NVRDataModel.getLogin();
ld.timelineScale = d;
NVRDataModel.setLogin(ld);
//console.log ("Stored user scale of "+d+" seconds");
}
-
-
- });
-
- timeline.on('click', function(prop) {
+ });
+ timeline.on('click', function(prop)
+ {
- $timeout(function() {
- if (dblclick) {
+ $timeout(function()
+ {
+ if (dblclick)
+ {
//console.log ("IGNORING CLICK AS DBL CLICK");
- $timeout(function() {
+ $timeout(function()
+ {
dblclick = false;
}, 400);
return;
@@ -1311,25 +1348,31 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
// console.log ( "I GOT " + properties);
var itm = prop.item;
//console.log ("ITEM CLICKED " + itm);
- if (itm && !isNaN(itm)) {
+ if (itm && !isNaN(itm))
+ {
NVRDataModel.debug("TimelineCtrl/drawGraph:You clicked on item " + itm);
var item = graphData.get(itm);
NVRDataModel.debug("TimelineCtrl/drawGraph: clicked item details:" + JSON.stringify(item));
showEvent(item.myevent);
-
- } else {
+ }
+ else
+ {
NVRDataModel.debug("exact match not found, guessing item with co-ordinates X=" + prop.x + " group=" + prop.group);
- if (prop.group) {
+ if (prop.group)
+ {
var visible = timeline.getVisibleItems();
NVRDataModel.debug("Visible items=" + JSON.stringify(visible));
var closestItem = null;
var minDist = 99999;
var _item;
- for (var x = 0; x < visible.length; x++) {
+ for (var x = 0; x < visible.length; x++)
+ {
_item = timeline.itemSet.items[x];
- if (_item.data.group == prop.group) {
- if (Math.abs(_item.left - prop.x) < minDist) {
+ if (_item.data.group == prop.group)
+ {
+ if (Math.abs(_item.left - prop.x) < minDist)
+ {
closestItem = _item;
minDist = Math.abs(_item.left - prop.x);
NVRDataModel.debug("Temporary closest " + _item.left);
@@ -1339,13 +1382,17 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
}
- if (closestItem != null) {
+ if (closestItem != null)
+ {
NVRDataModel.log("Closest item " + closestItem.left + " group: " + closestItem.data.group);
showEvent(closestItem.data.myevent);
- } else {
+ }
+ else
+ {
NVRDataModel.log("Did not find a visible item match");
}
- } else // no group row tapped, do nothing
+ }
+ else // no group row tapped, do nothing
{
/*$ionicLoading.show({
@@ -1363,31 +1410,38 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
});
- timeline.on('doubleClick', function(prop) {
+ timeline.on('doubleClick', function(prop)
+ {
//console.log ("DOUBLE");
dblclick = true;
var itm = prop.item;
//console.log ("ITEM CLICKED " + itm);
- if (itm && !isNaN(itm)) {
+ if (itm && !isNaN(itm))
+ {
NVRDataModel.debug("TimelineCtrl/drawGraph:You clicked on item " + itm);
var item = graphData.get(itm);
NVRDataModel.debug("TimelineCtrl/drawGraph: clicked item details:" + JSON.stringify(item));
eventDetails(item.myevent);
-
- } else {
+ }
+ else
+ {
NVRDataModel.debug("exact match not found, guessing item with co-ordinates X=" + prop.x + " group=" + prop.group);
- if (prop.group) {
+ if (prop.group)
+ {
var visible = timeline.getVisibleItems();
NVRDataModel.debug("Visible items=" + JSON.stringify(visible));
var closestItem = null;
var minDist = 99999;
var _item;
- for (var x = 0; x < visible.length; x++) {
+ for (var x = 0; x < visible.length; x++)
+ {
_item = timeline.itemSet.items[x];
- if (_item.data.group == prop.group) {
- if (Math.abs(_item.left - prop.x) < minDist) {
+ if (_item.data.group == prop.group)
+ {
+ if (Math.abs(_item.left - prop.x) < minDist)
+ {
closestItem = _item;
minDist = Math.abs(_item.left - prop.x);
NVRDataModel.debug("Temporary closest " + _item.left);
@@ -1397,10 +1451,13 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
}
NVRDataModel.log("Closest item " + closestItem.left + " group: " + closestItem.data.group);
- if (closestItem != null) {
+ if (closestItem != null)
+ {
NVRDataModel.log("Closest item " + closestItem.left + " group: " + closestItem.data.group);
showEvent(closestItem.data.myevent);
- } else {
+ }
+ else
+ {
NVRDataModel.log("Did not find a visible item match");
}
}
@@ -1410,7 +1467,8 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
});
},
- function(error) {
+ function(error)
+ {
NVRDataModel.displayBanner('error', 'Timeline error', 'Please try again');
}
@@ -1419,7 +1477,6 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
});
}
-
$scope.radialMenuOptions = {
content: '',
//size: 'small',
@@ -1427,19 +1484,23 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
background: '#982112',
isOpen: true,
toggleOnClick: false,
- button: {
+ button:
+ {
cssClass: 'fa fa-compress fa-2x',
size: 'small',
- onclick: function() {
+ onclick: function()
+ {
//console.log("fitting");
timeline.fit();
}
},
- items: [{
+ items: [
+ {
content: '',
cssClass: 'fa fa-minus-circle',
empty: false,
- onclick: function() {
+ onclick: function()
+ {
//zoom(0.2);
timeline.zoomOut(0.2);
}
@@ -1459,16 +1520,18 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
cssClass: 'fa fa-chevron-circle-up',
empty: false,
- onclick: function() {
-
+ onclick: function()
+ {
move(0.2);
}
- }, {
+ },
+ {
content: 'D',
empty: true,
- onclick: function() {
+ onclick: function()
+ {
// console.log('About');
}
},
@@ -1486,7 +1549,8 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
content: '',
cssClass: 'fa fa-plus-circle',
empty: false,
- onclick: function() {
+ onclick: function()
+ {
//zoom(-0.2);
timeline.zoomIn(0.2);
@@ -1505,7 +1569,8 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
{
content: 'H',
empty: true,
- onclick: function() {
+ onclick: function()
+ {
// console.log('About');
}
},
@@ -1514,12 +1579,12 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
content: '',
cssClass: 'fa fa-chevron-circle-up',
empty: false,
- onclick: function() {
+ onclick: function()
+ {
move(-0.2);
}
},
-
{
content: '',
cssClass: 'fa fa-chevron-circle-up',
@@ -1532,15 +1597,12 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
{
content: 'K',
empty: true,
- onclick: function() {
+ onclick: function()
+ {
//console.log('About');
}
},
]
};
-
-
-
-
}]);
diff --git a/www/js/TimelineModalCtrl.js b/www/js/TimelineModalCtrl.js
index 6531117e..6bf0822b 100644
--- a/www/js/TimelineModalCtrl.js
+++ b/www/js/TimelineModalCtrl.js
@@ -3,13 +3,8 @@
/* jslint browser: true*/
/* global saveAs, cordova,StatusBar,angular,console,ionic, moment, vis , Chart, DJS*/
-
-
-
-angular.module('zmApp.controllers').controller('TimelineModalCtrl', ['$scope', '$rootScope', 'zm', 'NVRDataModel', '$ionicSideMenuDelegate', '$timeout', '$interval', '$ionicModal', '$ionicLoading', '$http', '$state', '$stateParams', '$ionicHistory', '$ionicScrollDelegate', '$q', '$sce', 'carouselUtils', '$ionicPopup', '$translate', function ($scope, $rootScope, zm, NVRDataModel, $ionicSideMenuDelegate, $timeout, $interval, $ionicModal, $ionicLoading, $http, $state, $stateParams, $ionicHistory, $ionicScrollDelegate, $q, $sce, carouselUtils, $ionicPopup, $translate) {
-
-
-
+angular.module('zmApp.controllers').controller('TimelineModalCtrl', ['$scope', '$rootScope', 'zm', 'NVRDataModel', '$ionicSideMenuDelegate', '$timeout', '$interval', '$ionicModal', '$ionicLoading', '$http', '$state', '$stateParams', '$ionicHistory', '$ionicScrollDelegate', '$q', '$sce', 'carouselUtils', '$ionicPopup', '$translate', function($scope, $rootScope, zm, NVRDataModel, $ionicSideMenuDelegate, $timeout, $interval, $ionicModal, $ionicLoading, $http, $state, $stateParams, $ionicHistory, $ionicScrollDelegate, $q, $sce, carouselUtils, $ionicPopup, $translate)
+{
var Graph2d;
var tcGraph;
@@ -29,64 +24,68 @@ angular.module('zmApp.controllers').controller('TimelineModalCtrl', ['$scope', '
//$scope.graphType = "all";
$scope.errorDetails = "";
-
-
//----------------------------------------------------------------
// Alarm notification handling
//----------------------------------------------------------------
- $scope.handleAlarms = function () {
+ $scope.handleAlarms = function()
+ {
$rootScope.isAlarm = !$rootScope.isAlarm;
- if (!$rootScope.isAlarm) {
+ if (!$rootScope.isAlarm)
+ {
$rootScope.alarmCount = "0";
- $ionicHistory.nextViewOptions({
+ $ionicHistory.nextViewOptions(
+ {
disableBack: true
});
- $state.go("events", {
+ $state.go("events",
+ {
"id": 0,
- "playEvent":false
- }, {
+ "playEvent": false
+ },
+ {
reload: true
});
return;
}
};
-
-
//-------------------------------------------------------
// we use this to reload the connkey if authkey changed
//------------------------------------------------------
-
- $rootScope.$on("auth-success", function () {
+ $rootScope.$on("auth-success", function()
+ {
NVRDataModel.debug("EventModalCtrl: Re-login detected, resetting everything & re-generating connkey");
-
});
-
- $scope.scrollUp = function () {
+ $scope.scrollUp = function()
+ {
//console.log ("SWIPE UP");
$ionicScrollDelegate.$getByHandle("timeline-modal-delegate").scrollTop(true);
};
- $scope.scrollDown = function () {
+ $scope.scrollDown = function()
+ {
//console.log ("SWIPE DOWN");
$ionicScrollDelegate.$getByHandle("timeline-modal-delegate").scrollBottom(true);
};
+ $scope.switchType = function()
+ {
- $scope.switchType = function () {
-
- if ($scope.graphType == $translate.instant('kGraphAll')) {
+ if ($scope.graphType == $translate.instant('kGraphAll'))
+ {
current_data = onlyalarm_data;
$scope.graphType = $translate.instant('kGraphAlarmed');
NVRDataModel.debug("Alarm array has " + onlyalarm_data.labels.length + " frames");
btype = 'bar';
//console.log (JSON.stringify(onlyalarm_data));
- } else {
+ }
+ else
+ {
current_data = data;
// tcGraph.data =
$scope.graphType = $translate.instant('kGraphAll');
@@ -99,8 +98,8 @@ angular.module('zmApp.controllers').controller('TimelineModalCtrl', ['$scope', '
ld.timelineModalGraphType = $scope.graphType;
NVRDataModel.setLogin(ld);
-
- $timeout(function () {
+ $timeout(function()
+ {
/*
if ($scope.graphType == 'alarmed')
@@ -110,44 +109,42 @@ angular.module('zmApp.controllers').controller('TimelineModalCtrl', ['$scope', '
tcGraph.update();*/
tcGraph.destroy();
console.log("GRAPH TYPE IS " + btype);
- tcGraph = new Chart(ctx, {
+ tcGraph = new Chart(ctx,
+ {
type: btype,
data: current_data,
options: options
});
});
-
-
};
-
//-------------------------------------------------------
// Tapping on a frame shows this image
//------------------------------------------------------
- $scope.showImage = function (p, r, f, fid, e, imode, id) {
+ $scope.showImage = function(p, r, f, fid, e, imode, id)
+ {
var img;
console.log("Image Mode " + imode);
if (imode == 'path')
img = "<img width='100%' ng-src='" + p + "/index.php?view=image&path=" + r + f + "'>";
- else {
+ else
+ {
img = "<img width='100%' ng-src='" + p + "/index.php?view=image&fid=" + id + "'>";
// console.log ("IS MULTISERVER SO IMAGE IS " + img);
}
- $rootScope.zmPopup = $ionicPopup.alert({
+ $rootScope.zmPopup = $ionicPopup.alert(
+ {
title: 'frame:' + fid + '/Event:' + e,
template: img,
cssClass: 'popup95'
});
};
-
-
-
-
- $scope.$on('modal.removed', function (e, m) {
+ $scope.$on('modal.removed', function(e, m)
+ {
if (m.id != 'analyze')
return;
@@ -160,7 +157,8 @@ angular.module('zmApp.controllers').controller('TimelineModalCtrl', ['$scope', '
// init drawing here
//------------------------------------------------------
- $scope.$on('modal.shown', function (e, m) {
+ $scope.$on('modal.shown', function(e, m)
+ {
if (m.id != 'analyze')
return;
@@ -171,7 +169,8 @@ angular.module('zmApp.controllers').controller('TimelineModalCtrl', ['$scope', '
$scope.dataReady = false;
NVRDataModel.getKeyConfigParams(0)
- .then(function (data) {
+ .then(function(data)
+ {
//console.log ("***GETKEY: " + JSON.stringify(data));
eventImageDigits = parseInt(data);
NVRDataModel.log("Image padding digits reported as " + eventImageDigits);
@@ -184,41 +183,42 @@ angular.module('zmApp.controllers').controller('TimelineModalCtrl', ['$scope', '
//$scope.eventdetails = JSON.stringify($scope.event);
});
-
//-------------------------------------------------------
// okay, really init drawing here
//------------------------------------------------------
- function processEvent() {
+ function processEvent()
+ {
var eid = $scope.event.Event.Id;
//eid = 22302;
var ld = NVRDataModel.getLogin();
var apiurl = ld.apiurl + "/events/" + eid + ".json";
NVRDataModel.log("Getting " + apiurl);
$http.get(apiurl)
- .then(function (success) {
+ .then(function(success)
+ {
//$scope.eventdetails = JSON.stringify(success);
drawGraphTC(success.data);
},
- function (error) {
+ function(error)
+ {
$scope.errorDetails = $translate.instant('kGraphError');
NVRDataModel.log("Error in timeline frames " + JSON.stringify(error));
});
}
-
//-------------------------------------------------------
// I was kidding, this is where it really is drawn
// scout's promise
//------------------------------------------------------
- function drawGraphTC(event) {
+ function drawGraphTC(event)
+ {
$scope.eid = event.event.Event.Id;
$scope.alarm_images = [];
-
data = {
labels: [],
datasets: [
@@ -239,9 +239,9 @@ angular.module('zmApp.controllers').controller('TimelineModalCtrl', ['$scope', '
data: [],
frames: []
- },
+ },
- ]
+ ]
};
onlyalarm_data = {
@@ -255,24 +255,28 @@ angular.module('zmApp.controllers').controller('TimelineModalCtrl', ['$scope', '
hoverBorderColor: 'rgba(249, 105, 14,1.0)',
data: [],
frames: []
- },
+ },
- ]
+ ]
};
// Chart.js Options
options = {
legend: false,
- scales: {
- yAxes: [{
- ticks: {
+ scales:
+ {
+ yAxes: [
+ {
+ ticks:
+ {
// beginAtZero:true,
min: -1,
},
- }],
- xAxes: [{
+ }],
+ xAxes: [
+ {
display: false
- }]
+ }]
},
responsive: true,
@@ -281,10 +285,11 @@ angular.module('zmApp.controllers').controller('TimelineModalCtrl', ['$scope', '
scaleGridLineColor: "rgba(0,0,0,.05)",
scaleGridLineWidth: 1,
-
- hover: {
+ hover:
+ {
mode: 'single',
- onHover: function (obj) {
+ onHover: function(obj)
+ {
if (obj.length > 0)
tapOrHover(obj[0]._index);
}
@@ -300,13 +305,14 @@ angular.module('zmApp.controllers').controller('TimelineModalCtrl', ['$scope', '
// NVRDataModel.log ("Changing graph width to " + $scope.graphWidth);
- for (var i = 0; i < event.event.Frame.length; i++) {
-
+ for (var i = 0; i < event.event.Frame.length; i++)
+ {
data.labels.push(event.event.Frame[i].TimeStamp);
//data.labels.push(' ');
data.datasets[0].data.push(event.event.Frame[i].Score);
- data.datasets[0].frames.push({
+ data.datasets[0].frames.push(
+ {
x: event.event.Frame[i].TimeStamp,
y: event.event.Frame[i].Score,
eid: event.event.Event.Id,
@@ -319,12 +325,14 @@ angular.module('zmApp.controllers').controller('TimelineModalCtrl', ['$scope', '
});
- if (event.event.Frame[i].Type == "Alarm") {
+ if (event.event.Frame[i].Type == "Alarm")
+ {
onlyalarm_data.labels.push(event.event.Frame[i].TimeStamp);
//data.labels.push(' ');
onlyalarm_data.datasets[0].data.push(event.event.Frame[i].Score);
- onlyalarm_data.datasets[0].frames.push({
+ onlyalarm_data.datasets[0].frames.push(
+ {
x: event.event.Frame[i].TimeStamp,
y: event.event.Frame[i].Score,
eid: event.event.Event.Id,
@@ -345,39 +353,48 @@ angular.module('zmApp.controllers').controller('TimelineModalCtrl', ['$scope', '
cv = document.getElementById("tcchart");
ctx = cv.getContext("2d");
- if (NVRDataModel.getLogin().timelineModalGraphType == $translate.instant('kGraphAll')) {
+ if (NVRDataModel.getLogin().timelineModalGraphType == $translate.instant('kGraphAll'))
+ {
btype = 'line';
current_data = data;
- } else {
+ }
+ else
+ {
btype = 'bar';
current_data = onlyalarm_data;
}
- $timeout(function () {
- tcGraph = new Chart(ctx, {
+ $timeout(function()
+ {
+ tcGraph = new Chart(ctx,
+ {
type: btype,
data: current_data,
options: options
});
});
- cv.onclick = function (e) {
+ cv.onclick = function(e)
+ {
var b = tcGraph.getElementAtEvent(e);
- if (b.length > 0) {
+ if (b.length > 0)
+ {
tapOrHover(b[0]._index);
}
};
}
- function tapOrHover(ndx) {
-
- $timeout(function () {
+ function tapOrHover(ndx)
+ {
+ $timeout(function()
+ {
//console.log ("You tapped " + ndx);
$scope.alarm_images = [];
$scope.playbackURL = $scope.event.Event.baseURL;
var items = current_data.datasets[0].frames[ndx];
- $scope.alarm_images.push({
+ $scope.alarm_images.push(
+ {
relativePath: items.relativePath,
fid: items.fid,
id: items.id,
@@ -390,13 +407,12 @@ angular.module('zmApp.controllers').controller('TimelineModalCtrl', ['$scope', '
}
-
-
//--------------------------------------------------------
// utility function
//--------------------------------------------------------
- function computeRelativePath(event) {
+ function computeRelativePath(event)
+ {
var relativePath = "";
var loginData = NVRDataModel.getLogin();
var str = event.Event.StartTime;
@@ -421,7 +437,8 @@ angular.module('zmApp.controllers').controller('TimelineModalCtrl', ['$scope', '
// utility function
//--------------------------------------------------------
- function computeBasePath(event) {
+ function computeBasePath(event)
+ {
var basePath = "";
var loginData = NVRDataModel.getLogin();
var str = event.Event.StartTime;
@@ -443,32 +460,31 @@ angular.module('zmApp.controllers').controller('TimelineModalCtrl', ['$scope', '
return basePath;
}
-
function humanizeTime(str)
{
return moment.tz(str, NVRDataModel.getTimeZoneNow()).fromNow();
-
-
+
}
- function padToN(number, digits) {
+ function padToN(number, digits)
+ {
var i;
var stringMax = "";
var stringLeading = "";
- for (i = 1; i <= digits; i++) {
+ for (i = 1; i <= digits; i++)
+ {
stringMax = stringMax + "9";
if (i != digits) stringLeading = stringLeading + "0";
}
var numMax = parseInt(stringMax);
- if (number <= numMax) {
+ if (number <= numMax)
+ {
number = (stringLeading + number).slice(-digits);
}
//console.log ("PADTON: returning " + number);
return number;
}
-
-
-}]); \ No newline at end of file
+}]);
diff --git a/www/js/WizardCtrl.js b/www/js/WizardCtrl.js
index 610dfcc5..537a6839 100644
--- a/www/js/WizardCtrl.js
+++ b/www/js/WizardCtrl.js
@@ -2,28 +2,33 @@
/* jslint browser: true*/
/* global cordova,StatusBar,angular,console, Masonry, URI */
-angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$rootScope', '$ionicModal', 'NVRDataModel', '$ionicSideMenuDelegate', '$ionicHistory', '$state', '$ionicPopup', 'SecuredPopups', '$http', '$q', 'zm', '$ionicLoading', 'WizardHandler', '$translate', function ($scope, $rootScope, $ionicModal, NVRDataModel, $ionicSideMenuDelegate, $ionicHistory, $state, $ionicPopup, SecuredPopups, $http, $q, zm, $ionicLoading, WizardHandler, $translate) {
- $scope.openMenu = function () {
+angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$rootScope', '$ionicModal', 'NVRDataModel', '$ionicSideMenuDelegate', '$ionicHistory', '$state', '$ionicPopup', 'SecuredPopups', '$http', '$q', 'zm', '$ionicLoading', 'WizardHandler', '$translate', function($scope, $rootScope, $ionicModal, NVRDataModel, $ionicSideMenuDelegate, $ionicHistory, $state, $ionicPopup, SecuredPopups, $http, $q, zm, $ionicLoading, WizardHandler, $translate)
+{
+ $scope.openMenu = function()
+ {
$ionicSideMenuDelegate.toggleLeft();
};
-
//--------------------------------------------------------------------------
// logs into ZM
//--------------------------------------------------------------------------
- function login(u, zmu, zmp) {
+ function login(u, zmu, zmp)
+ {
var d = $q.defer();
- $http({
+ $http(
+ {
method: 'POST',
//withCredentials: true,
url: u,
- headers: {
+ headers:
+ {
'Content-Type': 'application/x-www-form-urlencoded',
'Accept': 'application/json',
},
- transformRequest: function (obj) {
+ transformRequest: function(obj)
+ {
var str = [];
for (var p in obj)
str.push(encodeURIComponent(p) + "=" +
@@ -32,24 +37,29 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
return params;
},
- data: {
+ data:
+ {
username: zmu,
password: zmp,
action: "login",
view: "console"
}
})
- .success(function (data, status, headers) {
+ .success(function(data, status, headers)
+ {
//console.log("LOOKING FOR " + zm.loginScreenString);
//console.log("DATA RECEIVED " + JSON.stringify(data));
- if (data.indexOf(zm.loginScreenString) == -1) {
+ if (data.indexOf(zm.loginScreenString) == -1)
+ {
$scope.wizard.loginURL = $scope.wizard.fqportal;
$scope.wizard.portalValidText = $translate.instant('kPortal') + ": " + $scope.wizard.loginURL;
$scope.wizard.portalColor = "#16a085";
d.resolve(true);
return d.promise;
- } else {
+ }
+ else
+ {
//console.log("************ERROR");
$scope.wizard.portalValidText = $translate.instant('kPortalDetectionFailed');
$scope.wizard.portalColor = "#e74c3c";
@@ -57,7 +67,8 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
return d.promise;
}
})
- .error(function (error) {
+ .error(function(error)
+ {
//console.log("************ERROR");
$scope.wizard.portalValidText = $translate.instant('kPortalDetectionFailed');
$scope.wizard.portalColor = "#e74c3c";
@@ -75,38 +86,47 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
// monitors configured, cgi-bin won't work
//--------------------------------------------------------------------------
- function getFirstMonitor() {
+ function getFirstMonitor()
+ {
var d = $q.defer();
$http.get($scope.wizard.apiURL + "/monitors.json")
- .then(function (success) {
+ .then(function(success)
+ {
// console.log("getfirst monitor success: " + JSON.stringify(success));
- if (success.data.monitors.length > 0) {
+ if (success.data.monitors.length > 0)
+ {
var foundMid = -1;
- for (var i = 0; i < success.data.monitors.length; i++) {
+ for (var i = 0; i < success.data.monitors.length; i++)
+ {
if (success.data.monitors[i].Monitor.Function != 'None' &&
- success.data.monitors[i].Monitor.Enabled == '1') {
+ success.data.monitors[i].Monitor.Enabled == '1')
+ {
foundMid = success.data.monitors[i].Monitor.Id;
break;
}
}
- if (foundMid != -1) {
+ if (foundMid != -1)
+ {
NVRDataModel.debug("zmWizard - getFirstMonitor returned " + foundMid);
d.resolve(foundMid);
return d.promise;
- } else {
+ }
+ else
+ {
d.reject(false);
return d.promise;
}
-
-
- } else {
+ }
+ else
+ {
d.reject(false);
return d.promise;
}
},
- function (error) {
+ function(error)
+ {
//console.log("getfirst monitor error: " + JSON.stringify(error));
d.reject(false);
return d.promise;
@@ -120,22 +140,28 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
// through multiple options - not the same as fallback
//--------------------------------------------------------------------------
- function findFirstReachableUrl(urls, tail) {
+ function findFirstReachableUrl(urls, tail)
+ {
var d = $q.defer();
- if (urls.length > 0) {
+ if (urls.length > 0)
+ {
var t = "";
if (tail) t = tail;
//$ionicLoading.show({template: 'trying ' + urls[0].server});
NVRDataModel.log("zmWizard test.." + urls[0] + t);
- return $http.get(urls[0] + t).then(function () {
+ return $http.get(urls[0] + t).then(function()
+ {
NVRDataModel.log("Success: on " + urls[0] + t);
//$ionicLoading.hide();
return urls[0];
- }, function (err) {
+ }, function(err)
+ {
NVRDataModel.log("zmWizard:Failed on " + urls[0] + t + " with error " + JSON.stringify(err));
return findFirstReachableUrl(urls.slice(1), tail);
});
- } else {
+ }
+ else
+ {
// $ionicLoading.hide();
NVRDataModel.log("zmWizard: findFirst returned no success");
d.reject("No reachable URL");
@@ -151,7 +177,8 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
// removes proto scheme from string
//--------------------------------------------------------------------------
- function stripProto(u) {
+ function stripProto(u)
+ {
if (u.indexOf('://') != -1)
return u.substr(u.indexOf('://') + 3);
else
@@ -162,7 +189,8 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
// tries to detect cgi-bin
//--------------------------------------------------------------------------
- function detectcgi() {
+ function detectcgi()
+ {
var d = $q.defer();
var c = URI.parse($scope.wizard.loginURL);
var p1, p2;
@@ -184,12 +212,11 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
var a2 = baseUri + "/cgi-bin-zm"; //fedora/centos/rhel
var a1 = baseUri + "/cgi-bin"; // doofus
-
- var urls = [a1, a2, a3, a4,a5];
-
+ var urls = [a1, a2, a3, a4, a5];
NVRDataModel.getPathZms() // what does ZM have stored in PATH_ZMS?
- .then(function (data) {
+ .then(function(data)
+ {
// remove zms or nph-zms
var path = data.trim();
path = path.replace("/nph-zms", "");
@@ -198,58 +225,71 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
NVRDataModel.log("zmWizard: getPathZMS succeeded, adding " + baseUri + path + " to things to try");
continueCgi(urls);
},
- function (error) {
+ function(error)
+ {
NVRDataModel.log("zmWizard: getPathZMS failed, but continuing...");
continueCgi(urls);
});
// Well, PATH_ZMS or not, lets call this function and brute force it
- function continueCgi(urls) {
- $ionicLoading.show({
+ function continueCgi(urls)
+ {
+ $ionicLoading.show(
+ {
template: $translate.instant('kDiscovering') + "...",
noBackdrop: true,
duration: zm.httpTimeout
});
getFirstMonitor()
- .then(function (success) {
+ .then(function(success)
+ {
$ionicLoading.hide();
var tail = "/nph-zms?mode=single&monitor=" + success;
- if ($scope.wizard.useauth && $scope.wizard.usezmauth) {
+ if ($scope.wizard.useauth && $scope.wizard.usezmauth)
+ {
var ck = Math.floor(Math.random() * (50000 - 10000 + 1)) + 10000;
NVRDataModel.getAuthKey(success, ck)
- .then(function (success) {
- if (success == "") {
+ .then(function(success)
+ {
+ if (success == "")
+ {
NVRDataModel.log("getAuthKey returned null, so going user=&pwd= way");
tail += "&user=" + $scope.wizard.zmuser + "&pass=" + $scope.wizard.zmpassword;
- } else {
+ }
+ else
+ {
tail += success;
}
NVRDataModel.log("auth computed is : " + tail);
proceedwithCgiAfterAuth(urls, tail);
},
- function (error) {
+ function(error)
+ {
NVRDataModel.log("Should never come here, getAuthKey doesn't return error");
});
-
//console.log ("****CDING " + tail);
- } else // no auth case
+ }
+ else // no auth case
{
proceedwithCgiAfterAuth(urls, tail);
}
- function proceedwithCgiAfterAuth(urls, tail) {
+ function proceedwithCgiAfterAuth(urls, tail)
+ {
- $ionicLoading.show({
+ $ionicLoading.show(
+ {
template: $translate.instant('kDiscovering') + "...",
noBackdrop: true,
duration: zm.httpTimeout
});
findFirstReachableUrl(urls, tail)
- .then(function (success) {
+ .then(function(success)
+ {
$ionicLoading.hide();
NVRDataModel.log("Valid cgi-bin found with: " + success);
$scope.wizard.streamingURL = success;
@@ -259,7 +299,8 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
return d.promise;
},
- function (error) {
+ function(error)
+ {
$ionicLoading.hide();
//console.log("No cgi-bin found: " + error);
$scope.wizard.streamingValidText = $translate.instant('kPortalCgiBinFailed');
@@ -269,7 +310,8 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
});
}
},
- function (error) {
+ function(error)
+ {
$ionicLoading.hide();
$scope.wizard.streamingValidText = $translate.instant('kPortalCgiBinFailed') + " -" + $translate.instant('kPortalNoMonitorFound');
$scope.wizard.streamingColor = "#e74c3c";
@@ -285,12 +327,12 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
}
-
//--------------------------------------------------------------------------
// Finds an appropriate API to use
//--------------------------------------------------------------------------
- function detectapi() {
+ function detectapi()
+ {
var u = $scope.wizard.loginURL;
var d = $q.defer();
var api1 = u + "/api";
@@ -304,24 +346,22 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
if (c.port) api2 += ":" + c.port;
api2 += "/api";
-
-
// lets try both /zm/api and /api. What else is there?
var apilist = [api1, api2, api3];
findFirstReachableUrl(apilist, '/host/getVersion.json')
- .then(function (success) {
+ .then(function(success)
+ {
NVRDataModel.log("Valid API response found with:" + success);
$scope.wizard.apiURL = success;
-
-
$scope.wizard.apiValidText = "API: " + $scope.wizard.apiURL;
$scope.wizard.apiColor = "#16a085";
d.resolve(true);
return d.promise;
},
- function (error) {
+ function(error)
+ {
//console.log("No APIs found: " + error);
$scope.wizard.apiValidText = $translate.instant('kPortalAPIFailed');
$scope.wizard.apiColor = "#e74c3c";
@@ -336,18 +376,21 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
// logs out of ZM
//--------------------------------------------------------------------------
-
- function logout(u) {
+ function logout(u)
+ {
var d = $q.defer();
- $http({
+ $http(
+ {
method: 'POST',
url: u,
- headers: {
+ headers:
+ {
'Content-Type': 'application/x-www-form-urlencoded',
'Accept': 'application/json',
},
- transformRequest: function (obj) {
+ transformRequest: function(obj)
+ {
var str = [];
for (var p in obj)
str.push(encodeURIComponent(p) + "=" +
@@ -356,23 +399,25 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
return params;
},
- data: {
+ data:
+ {
action: "logout",
view: "login"
}
})
- .then(function (success) {
+ .then(function(success)
+ {
$rootScope.zmCookie = "";
//console.log("ZMlogout success, cookie removed");
d.resolve(true);
return d.promise;
- }, function (error) {
+ }, function(error)
+ {
//console.log("ZMlogout success");
d.resolve(true);
return d.promise;
});
-
return d.promise;
}
@@ -382,7 +427,8 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
// get back to it
//--------------------------------------------------------------------------
- $scope.enterResults = function () {
+ $scope.enterResults = function()
+ {
$scope.portalValidText = "";
$scope.apiValidateText = "";
$scope.streamingValidateText = "";
@@ -393,7 +439,8 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
// tries to log into the portal and then discover api and cgi-bin
//--------------------------------------------------------------------------
- function validateData() {
+ function validateData()
+ {
$rootScope.authSession = 'undefined';
$rootScope.zmCookie = '';
@@ -415,7 +462,8 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
$scope.wizard.serverName += "-" + c.port;
var b = "";
- if ($scope.wizard.useauth && $scope.wizard.usebasicauth) {
+ if ($scope.wizard.useauth && $scope.wizard.usebasicauth)
+ {
b = $scope.wizard.basicuser + ":" + $scope.wizard.basicpassword + "@";
//console.log("B=" + b);
}
@@ -423,8 +471,8 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
if (c.port) u += ":" + c.port;
if (c.path) u += c.path;
-
- if (u.slice(-1) == '/') {
+ if (u.slice(-1) == '/')
+ {
u = u.slice(0, -1);
}
@@ -438,7 +486,8 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
var zmu = "x";
var zmp = "x";
- if ($scope.wizard.usezmauth) {
+ if ($scope.wizard.usezmauth)
+ {
zmu = $scope.wizard.zmuser;
zmp = $scope.wizard.zmpassword;
}
@@ -446,59 +495,69 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
// logout first for the adventurers amongst us who must
// use it even after logging in
NVRDataModel.log("zmWizard: logging out");
- $ionicLoading.show({
+ $ionicLoading.show(
+ {
template: $translate.instant('kCleaningUp') + "...",
noBackdrop: true,
duration: zm.httpTimeout
});
logout(u)
- .then(function (ans) {
+ .then(function(ans)
+ {
// login now
$ionicLoading.hide();
NVRDataModel.log("zmWizard: logging in with " + u + " " + zmu);
// The logic will be:
// Login then do an api detect and cgi-detect together
- $ionicLoading.show({
+ $ionicLoading.show(
+ {
template: $translate.instant('kDiscoveringPortal') + "...",
noBackdrop: true,
duration: zm.httpTimeout
});
login(u, zmu, zmp)
- .then(function (success) {
+ .then(function(success)
+ {
$ionicLoading.hide();
NVRDataModel.log("zmWizard: login succeeded");
// API Detection
- $ionicLoading.show({
+ $ionicLoading.show(
+ {
template: $translate.instant('kDiscoveringAPI') + "...",
noBackdrop: true,
duration: zm.httpTimeout
});
detectapi()
- .then(function (success) {
+ .then(function(success)
+ {
$ionicLoading.hide();
NVRDataModel.log("zmWizard: API succeeded");
- $ionicLoading.show({
+ $ionicLoading.show(
+ {
template: $translate.instant('kDiscoveringCGI') + "...",
noBackdrop: true,
duration: zm.httpTimeout
});
// CGI detection
detectcgi()
- .then(function (success) {
+ .then(function(success)
+ {
$ionicLoading.hide();
// return true here because we want to progress
return d.resolve(true);
},
- function (error) {
+ function(error)
+ {
$ionicLoading.hide();
// return true here because we want to progress
return d.resolve(true);
});
},
- function (error) {
+ function(error)
+ {
$ionicLoading.hide();
NVRDataModel.log("zmWizard: api failed");
@@ -506,11 +565,11 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
return d.resolve(true);
});
-
},
// if login failed, don't progress in the wizard
- function (error) {
+ function(error)
+ {
$ionicLoading.hide();
NVRDataModel.log("zmWizard: login failed");
$scope.wizard.portalValidText = $translate.instant('kPortalLoginUnsuccessful');
@@ -519,49 +578,57 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
});
-
}); //finally
return d.promise;
}
-
//--------------------------------------------------------------------------
// checks for a protocol
//--------------------------------------------------------------------------
- function checkscheme(url) {
+ function checkscheme(url)
+ {
- if ((!/^(f|ht)tps?:\/\//i.test(url)) && (url != "")) {
+ if ((!/^(f|ht)tps?:\/\//i.test(url)) && (url != ""))
+ {
return false;
- } else
+ }
+ else
return true;
}
-
-
//--------------------------------------------------------------------------
// exit validator for auth wizard
//--------------------------------------------------------------------------
- $scope.exitAuth = function () {
+ $scope.exitAuth = function()
+ {
NVRDataModel.log("Wizard: validating auth syntax");
- if ($scope.wizard.useauth) {
- if (!$scope.wizard.usezmauth && !$scope.wizard.usebasicauth) {
- $rootScope.zmPopup = SecuredPopups.show('show', {
+ if ($scope.wizard.useauth)
+ {
+ if (!$scope.wizard.usezmauth && !$scope.wizard.usebasicauth)
+ {
+ $rootScope.zmPopup = SecuredPopups.show('show',
+ {
title: $translate.instant('kError'),
template: $translate.instant('kOneAuth'),
- buttons: [{
+ buttons: [
+ {
text: $translate.instant('kButtonOk')
}]
});
return false;
}
- if ($scope.wizard.usezmauth) {
- if ((!$scope.wizard.zmuser) || (!$scope.wizard.zmpassword)) {
- $rootScope.zmPopup = SecuredPopups.show('show', {
+ if ($scope.wizard.usezmauth)
+ {
+ if ((!$scope.wizard.zmuser) || (!$scope.wizard.zmpassword))
+ {
+ $rootScope.zmPopup = SecuredPopups.show('show',
+ {
title: $translate.instant('kError'),
template: $translate.instant('kValidNameZMAuth'),
- buttons: [{
+ buttons: [
+ {
text: $translate.instant('kButtonOk')
}]
@@ -570,12 +637,16 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
}
}
- if ($scope.wizard.usebasicauth) {
- if ((!$scope.wizard.basicuser) || (!$scope.wizard.basicpassword)) {
- $rootScope.zmPopup = SecuredPopups.show('show', {
+ if ($scope.wizard.usebasicauth)
+ {
+ if ((!$scope.wizard.basicuser) || (!$scope.wizard.basicpassword))
+ {
+ $rootScope.zmPopup = SecuredPopups.show('show',
+ {
title: $translate.instant('kError'),
template: $translate.instant('kValidNameBasicAuth'),
- buttons: [{
+ buttons: [
+ {
text: $translate.instant('kButtonOk')
}]
@@ -596,14 +667,18 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
// validator for portal url wizard
//--------------------------------------------------------------------------
- $scope.exitPortal = function () {
+ $scope.exitPortal = function()
+ {
NVRDataModel.log("Wizard: validating portal url syntax");
- if (!$scope.wizard.portalurl) {
- $rootScope.zmPopup = SecuredPopups.show('show', {
+ if (!$scope.wizard.portalurl)
+ {
+ $rootScope.zmPopup = SecuredPopups.show('show',
+ {
title: $translate.instant('kError'),
template: $translate.instant('kPortalEmpty'),
- buttons: [{
+ buttons: [
+ {
text: $translate.instant('kButtonOk')
}]
@@ -611,12 +686,15 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
return false;
}
- if (!checkscheme($scope.wizard.portalurl)) {
+ if (!checkscheme($scope.wizard.portalurl))
+ {
- $scope.portalproto = [{
+ $scope.portalproto = [
+ {
text: "http",
value: "http://"
- }, {
+ },
+ {
text: "https",
value: "https://"
}];
@@ -624,15 +702,16 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
proto: ""
};
-
-
- $rootScope.zmPopup = $ionicPopup.show({
+ $rootScope.zmPopup = $ionicPopup.show(
+ {
title: $translate.instant('kPortalNoProto'),
scope: $scope,
template: $translate.instant('kPortalPleaseSelect') + ': <ion-radio-fix ng-repeat="item in portalproto" ng-value="item.value" ng-model="myproto.proto">{{item.text}}</ion-radio-fix>',
- buttons: [{
+ buttons: [
+ {
text: $translate.instant('kButtonOk'),
- onTap: function (e) {
+ onTap: function(e)
+ {
NVRDataModel.debug("Protocol selected:" + $scope.myproto.proto);
$scope.wizard.portalurl = $scope.myproto.proto + stripProto($scope.wizard.portalurl);
}
@@ -649,11 +728,14 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
var c = URI.parse($scope.wizard.portalurl);
- if (!c.scheme) {
- $rootScope.zmPopup = SecuredPopups.show('show', {
+ if (!c.scheme)
+ {
+ $rootScope.zmPopup = SecuredPopups.show('show',
+ {
title: $translate.instant('kError'),
template: $translate.instant('kPortalInvalidUrl'),
- buttons: [{
+ buttons: [
+ {
text: $translate.instant('kButtonOk')
}]
@@ -661,7 +743,6 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
return false;
}
-
if (c.userinfo) // basic auth stuff in here, take it out and put it into the next screen
{
$scope.wizard.useauth = true;
@@ -682,19 +763,21 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
//--------------------------------------------------------------------------
// part of auth wizard - toggles display of auth components
//--------------------------------------------------------------------------
- $scope.toggleAuth = function () {
+ $scope.toggleAuth = function()
+ {
- if (!$scope.wizard.useauth) {
+ if (!$scope.wizard.useauth)
+ {
$scope.wizard.usebasicauth = false;
$scope.wizard.usezmauth = false;
}
};
-
//--------------------------------------------------------------------------
// global tip toggler for all wizard steps
//--------------------------------------------------------------------------
- $scope.toggleTip = function () {
+ $scope.toggleTip = function()
+ {
$scope.wizard.tipshow = !$scope.wizard.tipshow;
if ($scope.wizard.tipshow)
$scope.wizard.tiptext = $translate.instant('kHideTip');
@@ -702,12 +785,15 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
$scope.wizard.tiptext = $translate.instant('kShowTip');
};
- $scope.gotoLoginState = function () {
+ $scope.gotoLoginState = function()
+ {
$rootScope.wizard = angular.copy($scope.wizard);
- $ionicHistory.nextViewOptions({
+ $ionicHistory.nextViewOptions(
+ {
disableBack: true
});
- $state.go("login", {
+ $state.go("login",
+ {
"wizard": true
});
return;
@@ -716,7 +802,8 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
//--------------------------------------------------------------------------
// initial
//--------------------------------------------------------------------------
- $scope.$on('$ionicView.beforeEnter', function () {
+ $scope.$on('$ionicView.beforeEnter', function()
+ {
//console.log("**VIEW ** Help Ctrl Entered");
var monId = -1;
@@ -744,9 +831,8 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
streamingColor: "",
serverName: "",
-
};
});
-}]); \ No newline at end of file
+}]);
diff --git a/www/js/app.js b/www/js/app.js
index 36b67869..07ed9ca4 100644
--- a/www/js/app.js
+++ b/www/js/app.js
@@ -11,36 +11,32 @@
var appVersion = "0.0.0";
-
-
// core app start stuff
angular.module('zmApp', [
- 'ionic',
- 'ion-datetime-picker',
- 'ngIOS9UIWebViewPatch',
- 'zmApp.controllers',
- 'fileLogger',
- 'angular-carousel',
- 'angularAwesomeSlider',
- 'com.2fdevs.videogular',
- 'com.2fdevs.videogular.plugins.controls',
- 'com.2fdevs.videogular.plugins.overlayplay',
- 'ionic-native-transitions',
- 'mgo-angular-wizard',
- 'pascalprecht.translate',
- 'jett.ionic.scroll.sista'
-
-
-
+ 'ionic',
+ 'ion-datetime-picker',
+ 'ngIOS9UIWebViewPatch',
+ 'zmApp.controllers',
+ 'fileLogger',
+ 'angular-carousel',
+ 'angularAwesomeSlider',
+ 'com.2fdevs.videogular',
+ 'com.2fdevs.videogular.plugins.controls',
+ 'com.2fdevs.videogular.plugins.overlayplay',
+ 'ionic-native-transitions',
+ 'mgo-angular-wizard',
+ 'pascalprecht.translate',
+ 'jett.ionic.scroll.sista'
- ])
+])
// ------------------------------------------
// Various constants central repository
// Feel free to change them as you see fit
//------------------------------------------------
-.constant('zm', {
+.constant('zm',
+{
minAppVersion: '1.28.107', // if ZM is less than this, the app won't work
recommendedAppVersion: '1.29',
minEventServerVersion: '0.9',
@@ -98,21 +94,23 @@ angular.module('zmApp', [
montageQualityLowBW: 50,
eventMontageQualityLowBW: 50
-
})
-
// filter for montage iteration
-.filter('onlyEnabled', function () {
+.filter('onlyEnabled', function()
+{
// Create the return function and set the required parameter name to **input**
- return function (input) {
+ return function(input)
+ {
var out = [];
- angular.forEach(input, function (item) {
+ angular.forEach(input, function(item)
+ {
- if ((item.Monitor.Function != 'None') && (item.Monitor.Enabled != '0')) {
+ if ((item.Monitor.Function != 'None') && (item.Monitor.Enabled != '0'))
+ {
out.push(item);
}
@@ -124,16 +122,20 @@ angular.module('zmApp', [
})
// filter for EH iteration
-.filter('onlyEnabledAndEventHas', function () {
+.filter('onlyEnabledAndEventHas', function()
+{
// Create the return function and set the required parameter name to **input**
- return function (input) {
+ return function(input)
+ {
var out = [];
- angular.forEach(input, function (item) {
+ angular.forEach(input, function(item)
+ {
- if ((item.Monitor.Function != 'None') && (item.Monitor.Enabled != '0') && (item.Monitor.eventUrl != 'img/noevent.png')) {
+ if ((item.Monitor.Function != 'None') && (item.Monitor.Enabled != '0') && (item.Monitor.eventUrl != 'img/noevent.png'))
+ {
out.push(item);
}
@@ -144,20 +146,23 @@ angular.module('zmApp', [
})
-
// credit https://gist.github.com/Zren/beaafd64f395e23f4604
-.directive('mouseWheelScroll', function ($timeout) {
+.directive('mouseWheelScroll', function($timeout)
+{
return {
restrict: 'A',
- link: function ($scope, $element, $attrs) {
+ link: function($scope, $element, $attrs)
+ {
var onMouseWheel, scrollCtrl;
scrollCtrl = $element.controller('$ionicScroll');
//console.log(scrollCtrl);
- if (!scrollCtrl) {
+ if (!scrollCtrl)
+ {
return console.error('mouseWheelScroll must be attached to a $ionicScroll controller.');
}
- onMouseWheel = function (e) {
+ onMouseWheel = function(e)
+ {
return scrollCtrl.scrollBy(0, -e.wheelDeltaY, false);
};
return scrollCtrl.element.addEventListener('wheel', onMouseWheel);
@@ -170,15 +175,17 @@ angular.module('zmApp', [
// (keeps reading data). Hence not using it now
//credit: http://stackoverflow.com/questions/34958575/intercepting-img-src-via-http-interceptor-as-well-as-not-lose-the-ability-to-kee
.directive('httpSrc', [
- '$http', 'imageLoadingDataShare', 'NVRDataModel',
- function ($http, imageLoadingDataShare, NVRDataModel) {
+ '$http', 'imageLoadingDataShare', 'NVRDataModel',
+ function($http, imageLoadingDataShare, NVRDataModel)
+ {
var directive = {
link: postLink,
restrict: 'A'
};
return directive;
- function postLink(scope, element, attrs) {
+ function postLink(scope, element, attrs)
+ {
//console.log ("HELLO NEW");
var requestConfig = {
method: 'GET',
@@ -187,26 +194,29 @@ angular.module('zmApp', [
cache: 'true'
};
- function base64Img(data) {
+ function base64Img(data)
+ {
var arr = new Uint8Array(data);
var raw = '';
var i, j, subArray, chunk = 5000;
- for (i = 0, j = arr.length; i < j; i += chunk) {
+ for (i = 0, j = arr.length; i < j; i += chunk)
+ {
subArray = arr.subarray(i, i + chunk);
raw += String.fromCharCode.apply(null, subArray);
}
return btoa(raw);
}
- attrs.$observe('httpSrc', function (newValue) {
+ attrs.$observe('httpSrc', function(newValue)
+ {
requestConfig.url = newValue;
//console.log ("requestConfig is " + JSON.stringify(requestConfig));
imageLoadingDataShare.set(1);
$http(requestConfig)
- .success(function (data) {
+ .success(function(data)
+ {
//console.log ("Inside HTTP after Calling " + requestConfig.url);
//console.log ("data got " + JSON.stringify(data));
-
var b64 = base64Img(data);
attrs.$set('src', "data:image/jpeg;base64," + b64);
imageLoadingDataShare.set(0);
@@ -217,16 +227,17 @@ angular.module('zmApp', [
}
])
-
//------------------------------------------------------------------
// switch between collection repeat or ng-repeat
//-------------------------------------------------------------------
-.directive('repeatsmart', function ($compile, $rootScope) {
+.directive('repeatsmart', function($compile, $rootScope)
+{
return {
restrict: 'A',
priority: 2000,
terminal: true,
- link: function (scope, element) {
+ link: function(scope, element)
+ {
var repeatDirective = ($rootScope.platformOS == 'desktop') ? 'ng-repeat' : 'collection-repeat';
//console.log("*********** REPEAT SCROLL IS " + repeatDirective);
@@ -237,26 +248,27 @@ angular.module('zmApp', [
};
})
-
//------------------------------------------------------------------
// I use this factory to share data between carousel and lazy load
// carousel will not progress autoslide till imageLoading is 0 or -1
//-------------------------------------------------------------------
-.factory('imageLoadingDataShare', function () {
+.factory('imageLoadingDataShare', function()
+{
var imageLoading = 0; // 0 = not loading, 1 = loading, -1 = error;
return {
- 'set': function (val) {
+ 'set': function(val)
+ {
imageLoading = val;
//console.log ("** IMAGE LOADING **"+val);
},
- 'get': function () {
+ 'get': function()
+ {
return imageLoading;
}
};
})
-
/*.factory('qHttp', function($q, $http) {
//credit: http://stackoverflow.com/a/29719693
var queue = $q.when();
@@ -269,33 +281,39 @@ angular.module('zmApp', [
};
})*/
-
//credit: http://stackoverflow.com/a/14468276
-.factory('qHttp', function ($q, $http) {
+.factory('qHttp', function($q, $http)
+{
var queue = [];
- var execNext = function () {
+ var execNext = function()
+ {
var task = queue[0];
//console.log ("qHTTP>>> Executing:"+JSON.stringify(task.c)+">>> pending:"+queue.length);
- $http(task.c).then(function (data) {
+ $http(task.c).then(function(data)
+ {
queue.shift();
task.d.resolve(data);
if (queue.length > 0) execNext();
- }, function (err) {
+ }, function(err)
+ {
queue.shift();
task.d.reject(err);
if (queue.length > 0) execNext();
});
};
- return function (config) {
+ return function(config)
+ {
var d = $q.defer();
//config.headers.push({'X-qHttp':'enabled'});
- queue.push({
+ queue.push(
+ {
c: config,
d: d
});
- if (queue.length === 1) {
+ if (queue.length === 1)
+ {
execNext();
}
//else
@@ -308,7 +326,8 @@ angular.module('zmApp', [
.factory('SecuredPopups', [
'$ionicPopup',
'$q',
- function ($ionicPopup, $q) {
+ function($ionicPopup, $q)
+ {
var firstDeferred = $q.defer();
firstDeferred.resolve();
@@ -319,26 +338,32 @@ angular.module('zmApp', [
var closeAndOpen = false;
return {
- 'show': function (method, object) {
+ 'show': function(method, object)
+ {
var deferred = $q.defer();
var closeMethod = null;
deferred.promise.isOpen = false;
- deferred.promise.close = function () {
- if (deferred.promise.isOpen && angular.isFunction(closeMethod)) {
+ deferred.promise.close = function()
+ {
+ if (deferred.promise.isOpen && angular.isFunction(closeMethod))
+ {
closeMethod();
}
};
- if (closeAndOpen && lastPopupPromise.isOpen) {
+ if (closeAndOpen && lastPopupPromise.isOpen)
+ {
lastPopupPromise.close();
}
- lastPopupPromise.then(function () {
+ lastPopupPromise.then(function()
+ {
deferred.promise.isOpen = true;
var popupInstance = $ionicPopup[method](object);
closeMethod = popupInstance.close;
- popupInstance.then(function (res) {
+ popupInstance.then(function(res)
+ {
deferred.promise.isOpen = false;
deferred.resolve(res);
});
@@ -352,7 +377,6 @@ angular.module('zmApp', [
}
])
-
//------------------------------------------------------------------
// this directive will be called any time an image completes loading
// via img tags where this directive is added (I am using this in
@@ -360,48 +384,53 @@ angular.module('zmApp', [
// downloading from ZM
//------------------------------------------------------------------
-.directive('imageonload', function () {
+.directive('imageonload', function()
+{
return {
restrict: 'A',
- link: function (scope, element, attrs) {
- element.bind('load', function () {
+ link: function(scope, element, attrs)
+ {
+ element.bind('load', function()
+ {
//call the function that was passed
scope.$apply(attrs.imageonload);
});
}
-
};
})
-
-
//--------------------------------------------------------------------------------------------
// This directive is adapted from https://github.com/paveisistemas/ionic-image-lazy-load
// I've removed lazyLoad and only made it show a spinner when an image is loading
//--------------------------------------------------------------------------------------------
.directive('imageSpinnerSrc', ['$document', '$compile', 'imageLoadingDataShare', '$timeout',
- function ($document, $compile, imageLoadingDataShare, $timeout) {
+ function($document, $compile, imageLoadingDataShare, $timeout)
+ {
return {
restrict: 'A',
- scope: {
+ scope:
+ {
imageSpinnerBackgroundImage: "@imageSpinnerBackgroundImage"
},
- link: function ($scope, $element, $attributes) {
+ link: function($scope, $element, $attributes)
+ {
/*if ($attributes.imageSpinnerLoader) {
var loader = $compile('<div class="image-loader-container"><ion-spinner class="image-loader" icon="' + $attributes.imageSpinnerLoader + '"></ion-spinner></div>')($scope);
$element.after(loader);
}*/
- if ($attributes.imageSpinnerLoader) {
+ if ($attributes.imageSpinnerLoader)
+ {
var loader = $compile('<div class="image-loader-container"><ion-spinner class="image-loader" icon="' + 'bubbles' + '"></ion-spinner></div>')($scope);
$element.after(loader);
}
imageLoadingDataShare.set(1);
loadImage();
- $attributes.$observe('imageSpinnerSrc', function (value) {
+ $attributes.$observe('imageSpinnerSrc', function(value)
+ {
//console.log ("DIRECTIVE SOURCE CHANGED");
imageLoadingDataShare.set(1);
loadImage();
@@ -409,30 +438,34 @@ angular.module('zmApp', [
});
-
// show an image-missing image
- $element.bind('error', function () {
+ $element.bind('error', function()
+ {
// console.log ("DIRECTIVE: IMAGE ERROR");
loader.remove();
-
var url = 'img/novideo.png';
$element.prop('src', url);
imageLoadingDataShare.set(0);
});
- function waitForFrame1() {
+ function waitForFrame1()
+ {
ionic.DomUtil.requestAnimationFrame(
- function () {
+ function()
+ {
imageLoadingDataShare.set(0);
//console.log ("IMAGE LOADED");
});
}
- function loadImage() {
- $element.bind("load", function (e) {
- if ($attributes.imageSpinnerLoader) {
+ function loadImage()
+ {
+ $element.bind("load", function(e)
+ {
+ if ($attributes.imageSpinnerLoader)
+ {
//console.log ("DIRECTIVE: IMAGE LOADED");
loader.remove();
//imageLoadingDataShare.set(0);
@@ -442,20 +475,21 @@ angular.module('zmApp', [
// to render - hoping this will improve tear
// of images
ionic.DomUtil.requestAnimationFrame(
- function () {
+ function()
+ {
waitForFrame1();
});
}
});
-
-
-
- if ($scope.imageSpinnerBackgroundImage == "true") {
+ if ($scope.imageSpinnerBackgroundImage == "true")
+ {
var bgImg = new Image();
- bgImg.onload = function () {
- if ($attributes.imageSpinnerLoader) {
+ bgImg.onload = function()
+ {
+ if ($attributes.imageSpinnerLoader)
+ {
loader.remove();
}
// set style attribute on element (it will load image)
@@ -467,29 +501,29 @@ angular.module('zmApp', [
};
-
bgImg.src = $attributes.imageSpinnerSrc;
- } else {
+ }
+ else
+ {
$element[0].src = $attributes.imageSpinnerSrc; // set src attribute on element (it will load image)
}
}
- function isInView() {
+ function isInView()
+ {
return true;
}
- $element.on('$destroy', function () {
+ $element.on('$destroy', function() {
});
-
}
};
- }])
-
-
+ }
+])
//------------------------------------------------------------------
// In Android, HTTP requests seem to get stuck once in a while
@@ -499,23 +533,23 @@ angular.module('zmApp', [
// That way the user can try again, and won't get stuck
// Also remember you need to add it to .config
//------------------------------------------------------------------
-.factory('timeoutHttpIntercept', ['$rootScope', '$q', 'zm', '$injector', function ($rootScope, $q, zm, $injector) {
+.factory('timeoutHttpIntercept', ['$rootScope', '$q', 'zm', '$injector', function($rootScope, $q, zm, $injector)
+{
$rootScope.zmCookie = "";
return {
-
-
- 'request': function (config) {
+ 'request': function(config)
+ {
// NOTE ON TIMEOUTS: As of Oct 10 2016, it seems
// the Http queue often gets messed up when there is a timeout
// and the # of requests are plentiful. I'm going to disable it and see
-
// console.log (">>>>"+config.url);
// handle basic auth properly
- if (config.url.indexOf("@") > -1) {
+ if (config.url.indexOf("@") > -1)
+ {
//console.log ("HTTP basic auth INTERCEPTOR URL IS " + config.url);
var components = URI.parse(config.url);
// console.log ("Parsed data is " + JSON.stringify(components));
@@ -529,9 +563,12 @@ angular.module('zmApp', [
//console.log (">>>>>>>>>>>>> INTERCEPT OBJECT " + JSON.stringify(config));
- if ($rootScope.zmCookie) {
+ if ($rootScope.zmCookie)
+ {
config.headers.Cookie = "ZMSESSID=" + $rootScope.zmCookie;
- } else {
+ }
+ else
+ {
// console.log ("No cookie present in " + config.url);
}
@@ -540,31 +577,38 @@ angular.module('zmApp', [
(config.url.indexOf("daemonCheck.json") > -1) ||
(config.url.indexOf("getLoad.json") > -1))
-
{
// these can take time, so lets bump up timeout
config.timeout = zm.largeHttpTimeout;
- } else if ((config.url.indexOf("view=view_video") > -1) ||
- config.url.indexOf(".mp4") > -1) {
+ }
+ else if ((config.url.indexOf("view=view_video") > -1) ||
+ config.url.indexOf(".mp4") > -1)
+ {
// console.log(">>> skipping timers for MP4");
// put a timeout for zms urls
- } else if (config.url.indexOf("zms?") > -1) {
+ }
+ else if (config.url.indexOf("zms?") > -1)
+ {
// config.timeout = zm.httpTimeout;
}
return config;
},
- 'response': function (response) {
+ 'response': function(response)
+ {
var cookies = response.headers("Set-Cookie");
- if (cookies != null) {
+ if (cookies != null)
+ {
var zmSess = cookies.match("ZMSESSID=(.*?);");
- if (zmSess) {
- if (zmSess[1]) {
+ if (zmSess)
+ {
+ if (zmSess[1])
+ {
// console.log ("***** SETTING COOKIE TO " + zmCookie);
$rootScope.zmCookie = zmSess[1];
@@ -576,48 +620,53 @@ angular.module('zmApp', [
return response;
}
-
};
}])
-
//-----------------------------------------------------------------
// This service automatically checks for new versions every 24 hrs
//------------------------------------------------------------------
-.factory('zmCheckUpdates', function ($interval, $http, zm, $timeout, $localstorage, NVRDataModel, $rootScope) {
+.factory('zmCheckUpdates', function($interval, $http, zm, $timeout, $localstorage, NVRDataModel, $rootScope)
+{
var zmUpdateHandle;
var zmUpdateVersion = "";
- function start() {
+ function start()
+ {
checkUpdate();
$interval.cancel(zmUpdateHandle);
- zmUpdateHandle = $interval(function () {
+ zmUpdateHandle = $interval(function()
+ {
checkUpdate();
}, zm.updateCheckInterval);
-
- function checkUpdate() {
+ function checkUpdate()
+ {
var lastdateString = NVRDataModel.getLastUpdateCheck();
var lastdate;
- if (!lastdateString) {
+ if (!lastdateString)
+ {
lastdate = moment().subtract(2, 'day');
- } else {
+ }
+ else
+ {
lastdate = moment(lastdateString);
}
var timdiff = moment().diff(lastdate, 'hours');
- if (timdiff < 24) {
+ if (timdiff < 24)
+ {
NVRDataModel.log("Checked for update " + timdiff + " hours ago. Not checking again");
return;
}
NVRDataModel.log("Checking for new version updates...");
-
$http.get(zm.latestRelease)
- .then(function (success) {
+ .then(function(success)
+ {
NVRDataModel.setLastUpdateCheck(moment().toISOString());
// $localstorage.set("lastUpdateCheck", moment().toISOString());
@@ -625,13 +674,17 @@ angular.module('zmApp', [
var res = success.data.tag_name.match("v(.*)");
zmUpdateVersion = res[1];
var currentVersion = NVRDataModel.getAppVersion();
- if ($rootScope.platformOS == "desktop") {
+ if ($rootScope.platformOS == "desktop")
+ {
zmUpdateVersion = zmUpdateVersion + "D";
}
//if (NVRDataModel.getAppVersion() != zmUpdateVersion) {
- if (NVRDataModel.versionCompare(NVRDataModel.getAppVersion(), zmUpdateVersion) == -1) {
+ if (NVRDataModel.versionCompare(NVRDataModel.getAppVersion(), zmUpdateVersion) == -1)
+ {
$rootScope.newVersionAvailable = "v" + zmUpdateVersion + " available";
- } else {
+ }
+ else
+ {
$rootScope.newVersionAvailable = "";
}
NVRDataModel.debug("current version: " + currentVersion + " & available version " + zmUpdateVersion);
@@ -642,16 +695,19 @@ angular.module('zmApp', [
NVRDataModel.log("Checking for news updates");
$http.get(zm.blogUrl)
- .success(function (data) {
+ .success(function(data)
+ {
$rootScope.newBlogPost = "";
- if (data.length <= 0) {
+ if (data.length <= 0)
+ {
$rootScope.newBlogPost = "";
return;
}
var lastDate = NVRDataModel.getLatestBlogPostChecked();
//console.log ("************ BLOG LAST DATE " + lastDate);
- if (!lastDate) {
+ if (!lastDate)
+ {
$rootScope.newBlogPost = "(new post)";
return;
@@ -660,24 +716,30 @@ angular.module('zmApp', [
var mLastDate = moment(lastDate);
var mItemDate = moment(data[0].date);
- if (mItemDate.diff(mLastDate) > 0) {
+ if (mItemDate.diff(mLastDate) > 0)
+ {
NVRDataModel.debug("New post dated " + data[0].date + " found");
- if (data[0].level == "critical") {
+ if (data[0].level == "critical")
+ {
$rootScope.newBlogPost = "(new post)";
- } else {
+ }
+ else
+ {
NVRDataModel.debug("Not showing a notification in menu as this is not critical");
}
- } else {
+ }
+ else
+ {
NVRDataModel.debug("Latest post dated " + data[0].date + " but you read " + lastDate);
}
-
});
}
}
- function getLatestUpdateVersion() {
+ function getLatestUpdateVersion()
+ {
return (zmUpdateVersion == "") ? "(unknown)" : zmUpdateVersion;
}
@@ -688,23 +750,22 @@ angular.module('zmApp', [
};
-
})
-
-
//-----------------------------------------------------------------
// This service automatically logs into ZM at periodic intervals
//------------------------------------------------------------------
-.factory('zmAutoLogin', function ($interval, NVRDataModel, $http, zm, $browser, $timeout, $q, $rootScope, $ionicLoading, $ionicPopup, $state, $ionicContentBanner, EventServer, $ionicHistory, $translate) {
+.factory('zmAutoLogin', function($interval, NVRDataModel, $http, zm, $browser, $timeout, $q, $rootScope, $ionicLoading, $ionicPopup, $state, $ionicContentBanner, EventServer, $ionicHistory, $translate)
+{
var zmAutoLoginHandle;
//------------------------------------------------------------------
// doLogin() emits this when there is an auth error in the portal
//------------------------------------------------------------------
- $rootScope.$on("auth-error", function () {
+ $rootScope.$on("auth-error", function()
+ {
NVRDataModel.debug("zmAutoLogin: Inside auth-error emit");
NVRDataModel.displayBanner('error', ['ZoneMinder authentication failed', 'Please check settings']);
@@ -718,9 +779,11 @@ angular.module('zmApp', [
// c) localforage data loaded
//------------------------------------------------------------------
- $rootScope.$on("init-complete", function () {
+ $rootScope.$on("init-complete", function()
+ {
NVRDataModel.log(">>>>>>>>>>>>>>> All init over, going to portal login");
- $ionicHistory.nextViewOptions({
+ $ionicHistory.nextViewOptions(
+ {
disableAnimate: true
});
$state.go("zm-portal-login");
@@ -731,38 +794,43 @@ angular.module('zmApp', [
// doLogin() emits this when our auth credentials work
//------------------------------------------------------------------
- $rootScope.$on("auth-success", function () {
- var contentBannerInstance = $ionicContentBanner.show({
+ $rootScope.$on("auth-success", function()
+ {
+ var contentBannerInstance = $ionicContentBanner.show(
+ {
text: ['ZoneMinder' + $translate.instant('kAuthSuccess')],
interval: 2000,
type: 'info',
transition: 'vertical'
});
- $timeout(function () {
+ $timeout(function()
+ {
contentBannerInstance();
}, 2000);
NVRDataModel.debug("auth-success emit:Successful");
});
-
- $rootScope.getProfileName = function () {
+ $rootScope.getProfileName = function()
+ {
var ld = NVRDataModel.getLogin();
return (ld.serverName || '(none)');
};
- $rootScope.getLocalTimeZone = function () {
+ $rootScope.getLocalTimeZone = function()
+ {
return moment.tz.guess();
};
-
- $rootScope.getServerTimeZoneNow = function () {
+ $rootScope.getServerTimeZoneNow = function()
+ {
return NVRDataModel.getTimeZoneNow();
};
- $rootScope.isTzSupported = function () {
+ $rootScope.isTzSupported = function()
+ {
return NVRDataModel.isTzSupported();
};
@@ -772,25 +840,28 @@ angular.module('zmApp', [
// which actually means auth failed, but ZM treats it as a success
//------------------------------------------------------------------
- function doLogin(str) {
+ function doLogin(str)
+ {
var d = $q.defer();
NVRDataModel.processFastLogin()
// coming here means login not needed, old login is valid
- .then(function (success) {
+ .then(function(success)
+ {
d.resolve("Login Success due to fast login");
$rootScope.$emit('auth-success', "fast login mode");
return d.promise;
},
// coming here means login is needed
- function (error) {
-
+ function(error)
+ {
var statename = $ionicHistory.currentStateName();
- if (statename == "montage-history") {
+ if (statename == "montage-history")
+ {
NVRDataModel.log("Skipping login process as we are in montage history. Re-logging will mess up the stream");
d.resolve("success");
return d.promise;
@@ -802,56 +873,60 @@ angular.module('zmApp', [
// first try to login, if it works, good
// else try to do reachability
proceedWithLogin()
- .then(function (success) {
+ .then(function(success)
+ {
NVRDataModel.debug("Storing login time as " + moment().toString());
localforage.setItem("lastLogin", moment().toString());
d.resolve(success);
return d.promise;
},
- function (error)
+ function(error)
// login to main failed, so try others
{
NVRDataModel.getReachableConfig(true)
- .then(function (data) {
+ .then(function(data)
+ {
proceedWithLogin()
- .then(function (success) {
+ .then(function(success)
+ {
d.resolve(success);
return d.promise;
},
- function (error) {
+ function(error)
+ {
d.reject(error);
return d.promise;
});
},
- function (error) {
+ function(error)
+ {
d.reject(error);
return d.promise;
});
});
-
return d.promise;
-
- function proceedWithLogin() {
+ function proceedWithLogin()
+ {
// recompute rand anyway so even if you don't have auth
// your stream should not get frozen
$rootScope.rand = Math.floor((Math.random() * 100000) + 1);
$rootScope.modalRand = Math.floor((Math.random() * 100000) + 1);
-
-
// console.log ("***** STATENAME IS " + statename);
var d = $q.defer();
var ld = NVRDataModel.getLogin();
NVRDataModel.log("zmAutologin called");
- if (str) {
- $ionicLoading.show({
+ if (str)
+ {
+ $ionicLoading.show(
+ {
template: str,
noBackdrop: true,
duration: zm.httpTimeout
@@ -859,20 +934,21 @@ angular.module('zmApp', [
}
NVRDataModel.isReCaptcha()
- .then(function (result) {
- if (result == true) {
+ .then(function(result)
+ {
+ if (result == true)
+ {
$ionicLoading.hide();
- NVRDataModel.displayBanner('error', ['reCaptcha must be disabled',
- ], "", 8000);
- var alertPopup = $ionicPopup.alert({
+ NVRDataModel.displayBanner('error', ['reCaptcha must be disabled', ], "", 8000);
+ var alertPopup = $ionicPopup.alert(
+ {
title: 'reCaptcha enabled',
template: $translate.instant('kRecaptcha')
});
-
-
// close it after 5 seconds
- $timeout(function () {
+ $timeout(function()
+ {
alertPopup.close();
}, 5000);
@@ -881,23 +957,22 @@ angular.module('zmApp', [
return (d.promise);
}
-
-
});
-
-
var loginData = NVRDataModel.getLogin();
//NVRDataModel.debug ("*** AUTH LOGIN URL IS " + loginData.url);
- $http({
+ $http(
+ {
method: 'POST',
//withCredentials: true,
url: loginData.url + '/index.php',
- headers: {
+ headers:
+ {
'Content-Type': 'application/x-www-form-urlencoded',
'Accept': 'application/json',
},
- transformRequest: function (obj) {
+ transformRequest: function(obj)
+ {
var str = [];
for (var p in obj)
str.push(encodeURIComponent(p) + "=" +
@@ -906,14 +981,16 @@ angular.module('zmApp', [
return params;
},
- data: {
+ data:
+ {
username: loginData.username,
password: loginData.password,
action: "login",
view: "console"
}
})
- .success(function (data, status, headers) {
+ .success(function(data, status, headers)
+ {
$ionicLoading.hide();
// Coming here does not mean success
@@ -922,8 +999,8 @@ angular.module('zmApp', [
// so we will check if the data has
// <title>ZM - Login</title> -- it it does then its the login page
-
- if (data.indexOf(zm.loginScreenString) == -1) {
+ if (data.indexOf(zm.loginScreenString) == -1)
+ {
//eventServer.start();
$rootScope.loggedIntoZm = 1;
@@ -933,7 +1010,8 @@ angular.module('zmApp', [
$rootScope.$emit('auth-success', data);
- } else // this means login error
+ }
+ else // this means login error
{
$rootScope.loggedIntoZm = -1;
//console.log("**** ZM Login FAILED");
@@ -949,7 +1027,8 @@ angular.module('zmApp', [
$rootScope.authSession = "undefined";
var ld = NVRDataModel.getLogin();
NVRDataModel.getAuthKey($rootScope.validMonitorId)
- .then(function (success) {
+ .then(function(success)
+ {
//console.log(success);
$rootScope.authSession = success;
@@ -957,7 +1036,8 @@ angular.module('zmApp', [
$rootScope.authSession);
},
- function (error) {
+ function(error)
+ {
//console.log(error);
NVRDataModel.log("Modal: Error returned Stream authentication construction. Retaining old value of: " + $rootScope.authSession);
@@ -967,7 +1047,8 @@ angular.module('zmApp', [
return (d.promise);
})
- .error(function (error, status) {
+ .error(function(error, status)
+ {
$ionicLoading.hide();
//console.log("**** ZM Login FAILED");
@@ -989,13 +1070,15 @@ angular.module('zmApp', [
}
- function start() {
+ function start()
+ {
var ld = NVRDataModel.getLogin();
// lets keep this timer irrespective of auth or no auth
$rootScope.loggedIntoZm = 0;
$interval.cancel(zmAutoLoginHandle);
//doLogin();
- zmAutoLoginHandle = $interval(function () {
+ zmAutoLoginHandle = $interval(function()
+ {
doLogin("");
}, zm.loginInterval); // Auto login every 5 minutes
@@ -1004,7 +1087,8 @@ angular.module('zmApp', [
}
- function stop() {
+ function stop()
+ {
var ld = NVRDataModel.getLogin();
$interval.cancel(zmAutoLoginHandle);
@@ -1020,16 +1104,12 @@ angular.module('zmApp', [
};
})
-
//====================================================================
// First run in ionic
//====================================================================
-
-.run(function ($ionicPlatform, $ionicPopup, $rootScope, zm, $state, $stateParams, NVRDataModel, $cordovaSplashscreen, $http, $interval, zmAutoLogin, zmCheckUpdates, $fileLogger, $timeout, $ionicHistory, $window, $ionicSideMenuDelegate, EventServer, $ionicContentBanner, $ionicLoading, $ionicNativeTransitions, $translate, $localstorage) {
-
-
-
+.run(function($ionicPlatform, $ionicPopup, $rootScope, zm, $state, $stateParams, NVRDataModel, $cordovaSplashscreen, $http, $interval, zmAutoLogin, zmCheckUpdates, $fileLogger, $timeout, $ionicHistory, $window, $ionicSideMenuDelegate, EventServer, $ionicContentBanner, $ionicLoading, $ionicNativeTransitions, $translate, $localstorage)
+ {
$rootScope.appName = "zmNinja";
$rootScope.zmGlobalCookie = "";
@@ -1056,49 +1136,54 @@ angular.module('zmApp', [
$rootScope.newBlogPost = "";
$rootScope.apiVersion = "";
-
-
// only for android
- $rootScope.exitApp = function () {
+ $rootScope.exitApp = function()
+ {
NVRDataModel.log("user exited app");
ionic.Platform.exitApp();
};
-
// This is a global exception interceptor
- $rootScope.exceptionMessage = function (error) {
+ $rootScope.exceptionMessage = function(error)
+ {
NVRDataModel.debug("**EXCEPTION**" + error.reason + " caused by " + error.cause);
};
-
-
- window.addEventListener('beforeunload', function(ev) {
-
+ window.addEventListener('beforeunload', function(ev)
+ {
+
if ($rootScope.platformOS != 'desktop')
{
- ev.returnValue = "true";
+ ev.returnValue = "true";
return;
}
-
-
-
- localforage.setItem('last-desktop-state', {'name':$ionicHistory.currentView().stateName, 'params' : $ionicHistory.currentView().stateParams}).then(function () {
- return localforage.getItem('last-desktop-state');
- }).then(function (value) {
- ev.returnValue = "true";
- }).catch(function (err) {
- ev.returnValue = "true";
+
+ localforage.setItem('last-desktop-state',
+ {
+ 'name': $ionicHistory.currentView().stateName,
+ 'params': $ionicHistory.currentView().stateParams
+ }).then(function()
+ {
+ return localforage.getItem('last-desktop-state');
+ }).then(function(value)
+ {
+ ev.returnValue = "true";
+ }).catch(function(err)
+ {
+ ev.returnValue = "true";
});
-
+
});
-
+
// register callbacks for online/offline
// lets see if it really works
$rootScope.online = navigator.onLine;
-
- $window.addEventListener("offline", function () {
- $rootScope.$apply(function () {
+
+ $window.addEventListener("offline", function()
+ {
+ $rootScope.$apply(function()
+ {
$rootScope.online = false;
NVRDataModel.log("Your network went offline");
@@ -1107,21 +1192,27 @@ angular.module('zmApp', [
});
}, false);
- $window.addEventListener("online", function () {
- $rootScope.$apply(function () {
+ $window.addEventListener("online", function()
+ {
+ $rootScope.$apply(function()
+ {
$rootScope.online = true;
- $timeout(function () {
+ $timeout(function()
+ {
var networkState = navigator.connection.type;
NVRDataModel.debug("Detected network type as: " + networkState);
var strState = NVRDataModel.getBandwidth();
NVRDataModel.debug("getBandwidth() normalized it as: " + strState);
$rootScope.runMode = strState;
if ((NVRDataModel.getLogin().autoSwitchBandwidth == true) &&
- (NVRDataModel.getLogin().enableLowBandwidth == true)) {
+ (NVRDataModel.getLogin().enableLowBandwidth == true))
+ {
NVRDataModel.debug("Setting app state to: " + strState);
$rootScope.$emit('bandwidth-change', strState);
- } else {
+ }
+ else
+ {
NVRDataModel.debug("Not changing bandwidth state, as auto change is not on");
}
@@ -1133,45 +1224,47 @@ angular.module('zmApp', [
});
}, false);
-
-
// This code takes care of trapping the Android back button
// and takes it to the menu.
//console.log (">>>>>>>>>>>>>>>>>>BACK BUTTON REGISTERED");
- $ionicPlatform.registerBackButtonAction(function (e) {
+ $ionicPlatform.registerBackButtonAction(function(e)
+ {
e.preventDefault();
//console.log ("******** back called with isOpenLeft: " + $ionicSideMenuDelegate.isOpenLeft());
- if (!$ionicSideMenuDelegate.isOpenLeft()) {
+ if (!$ionicSideMenuDelegate.isOpenLeft())
+ {
$ionicSideMenuDelegate.toggleLeft();
//console.log("Status of SIDE MENU IS : " + $ionicSideMenuDelegate.isOpen());
- } else {
+ }
+ else
+ {
navigator.app.exitApp();
}
}, 501);
-
// this works reliably on both Android and iOS. The "onorientation" seems to reverse w/h in Android. Go figure.
// http://stackoverflow.com/questions/1649086/detect-rotation-of-android-phone-in-the-browser-with-javascript
- var checkOrientation = function () {
+ var checkOrientation = function()
+ {
var pixelRatio = window.devicePixelRatio || 1;
$rootScope.devWidth = ((window.innerWidth > 0) ? window.innerWidth : screen.width);
$rootScope.devHeight = ((window.innerHeight > 0) ? window.innerHeight : screen.height);
//console.log("********NEW Computed Dev Width & Height as" + $rootScope.devWidth + "*" + $rootScope.devHeight);
-
};
window.addEventListener("resize", checkOrientation, false);
-
// we come here when a user forcibly cancels portal auth
// useful when you know your auth won't succeed and you need to
// switch to another server
- $rootScope.cancelAuth = function () {
+ $rootScope.cancelAuth = function()
+ {
$ionicLoading.hide();
NVRDataModel.log("User cancelled login");
- $ionicHistory.nextViewOptions({
+ $ionicHistory.nextViewOptions(
+ {
disableAnimate: true,
disableBack: true
});
@@ -1179,7 +1272,8 @@ angular.module('zmApp', [
window.stop();
//console.log ("inside cancelAuth , calling wizard");
- $state.go("login", {
+ $state.go("login",
+ {
"wizard": false
});
return;
@@ -1189,26 +1283,31 @@ angular.module('zmApp', [
// authorize state transitions
//----------------------------------------------------------------------------
- $rootScope.$on('$stateChangeStart', function (event, toState, toParams) {
+ $rootScope.$on('$stateChangeStart', function(event, toState, toParams)
+ {
var requireLogin = toState.data.requireLogin;
- if (NVRDataModel.isLoggedIn() || toState.data.requireLogin == false) {
+ if (NVRDataModel.isLoggedIn() || toState.data.requireLogin == false)
+ {
//console.log("State transition is authorized");
return;
- } else {
+ }
+ else
+ {
NVRDataModel.log("In Auth State trans: Not logged in, requested to go to " + JSON.stringify(toState));
// event.preventDefault();
//
$state.transitionTo('login');
-
}
- if (requireLogin) {
+ if (requireLogin)
+ {
- $ionicPopup.alert({
+ $ionicPopup.alert(
+ {
title: $translate.instant('kCredentialsTitle'),
template: $translate.instant('kCredentialsBody')
});
@@ -1222,22 +1321,21 @@ angular.module('zmApp', [
});
-
//---------------------------------------------------------------------
// called when device is ready
//---------------------------------------------------------------------
- function getTextZoomCallback(tz) {
+ function getTextZoomCallback(tz)
+ {
$rootScope.textScaleFactor = parseFloat(tz + "%") / 100.0;
NVRDataModel.debug("text zoom factor is " + $rootScope.textScaleFactor);
}
- $ionicPlatform.ready(function () {
-
+ $ionicPlatform.ready(function()
+ {
$rootScope.textScaleFactor = 1.0;
-
$rootScope.db = null;
$rootScope.runMode = NVRDataModel.getBandwidth();
@@ -1253,42 +1351,48 @@ angular.module('zmApp', [
if (window.cordova)
MobileAccessibility.getTextZoom(getTextZoomCallback);
-
- // $rootScope.lastState = "events";
+
+ // $rootScope.lastState = "events";
//$rootScope.lastStateParam = "0";
- localforage.config({
+ localforage.config(
+ {
name: zm.dbName
});
var order = [];
- if ($rootScope.platformOS == 'ios') {
+ if ($rootScope.platformOS == 'ios')
+ {
order = [window.cordovaSQLiteDriver._driver,
- localforage.INDEXEDDB,
- localforage.WEBSQL,
- localforage.LOCALSTORAGE];
- } else
+ localforage.INDEXEDDB,
+ localforage.WEBSQL,
+ localforage.LOCALSTORAGE
+ ];
+ }
+ else
{
// don't do SQL for non IOS - seems to hang?
order = [
- localforage.INDEXEDDB,
- localforage.WEBSQL,
- localforage.LOCALSTORAGE,
- ];
+ localforage.INDEXEDDB,
+ localforage.WEBSQL,
+ localforage.LOCALSTORAGE,
+ ];
}
- localforage.defineDriver(window.cordovaSQLiteDriver).then(function () {
+ localforage.defineDriver(window.cordovaSQLiteDriver).then(function()
+ {
return localforage.setDriver(
// Try setting cordovaSQLiteDriver if available,
order
);
- }).then(function () {
+ }).then(function()
+ {
// this should alert "cordovaSQLiteDriver" when in an emulator or a device
NVRDataModel.log("localforage driver for storage:" + localforage.driver());
@@ -1296,10 +1400,12 @@ angular.module('zmApp', [
var defaultServerName = $localstorage.get("defaultServerName");
localforage.getItem("defaultServerName")
- .then(function (val) {
+ .then(function(val)
+ {
// console.log (">>>> localforage reported defaultServerName as " + val);
// if neither, we are in first use, mates!
- if (!val && !defaultServerName) {
+ if (!val && !defaultServerName)
+ {
continueInitialInit();
/* NVRDataModel.debug ("Neither localstorage or forage - First use, showing warm and fuzzy...");
$ionicHistory.nextViewOptions({
@@ -1307,11 +1413,11 @@ angular.module('zmApp', [
disableBack: true
});
$state.go('first-use');*/
- } else if (!val && defaultServerName) {
+ }
+ else if (!val && defaultServerName)
+ {
NVRDataModel.log(">>>>Importing data from localstorage....");
-
-
var dsn = defaultServerName;
var dl = $localstorage.get('defaultLang') || 'en';
var ifu = ($localstorage.get('isFirstUse') == '0' ? false : true);
@@ -1328,21 +1434,25 @@ angular.module('zmApp', [
NVRDataModel.log("server group list:" + JSON.stringify(sgl));
localforage.setItem('defaultLang', dl)
- .then(function () {
+ .then(function()
+ {
NVRDataModel.log(">>>>migrated defaultLang...");
NVRDataModel.setFirstUse(ifu);
return localforage.setItem('isFirstUse', ifu);
})
- .then(function () {
+ .then(function()
+ {
NVRDataModel.log(">>>>migrated isFirstUse...");
return localforage.setItem('lastUpdateCheck', ifu);
})
- .then(function () {
+ .then(function()
+ {
NVRDataModel.log(">>>>migrated lastUpdateCheck...");
return localforage.setItem('latestBlogPostChecked', lbpc);
})
- .then(function () {
+ .then(function()
+ {
NVRDataModel.log(">>>>migrated latestBlogPostChecked...");
// lets encrypt serverGroupList
NVRDataModel.log("server group list is " + JSON.stringify(sgl));
@@ -1351,36 +1461,38 @@ angular.module('zmApp', [
ct = sgl;
return localforage.setItem('serverGroupList', ct);
})
- .then(function () {
+ .then(function()
+ {
NVRDataModel.log(">>>>migrated serverGroupList...");
return localforage.setItem('defaultServerName', dsn);
})
- .then(function () {
+ .then(function()
+ {
NVRDataModel.log(">>>>migrated defaultServerName...");
NVRDataModel.log(">>>>Migrated all values, continuing...");
//NVRDataModel.migrationComplete();
continueInitialInit();
})
- .catch(function (err) {
+ .catch(function(err)
+ {
NVRDataModel.log("Migration error : " + JSON.stringify(err));
continueInitialInit();
});
- } else {
+ }
+ else
+ {
NVRDataModel.log(">>>>No data to import....");
//NVRDataModel.migrationComplete();
continueInitialInit();
}
-
-
});
});
-
-
- function continueInitialInit() {
+ function continueInitialInit()
+ {
var pixelRatio = window.devicePixelRatio || 1;
$rootScope.devWidth = ((window.innerWidth > 0) ? window.innerWidth : screen.width);
$rootScope.devHeight = ((window.innerHeight > 0) ? window.innerHeight : screen.height);
@@ -1389,11 +1501,12 @@ angular.module('zmApp', [
$rootScope.$state = $state;
$rootScope.$stateParams = $stateParams;
-
- if (window.cordova && window.cordova.plugins.Keyboard) {
+ if (window.cordova && window.cordova.plugins.Keyboard)
+ {
cordova.plugins.Keyboard.disableScroll(true);
}
- if (window.StatusBar) {
+ if (window.StatusBar)
+ {
// org.apache.cordova.statusbar required
NVRDataModel.log("Updating statusbar");
StatusBar.styleDefault();
@@ -1401,24 +1514,28 @@ angular.module('zmApp', [
StatusBar.backgroundColorByHexString("#2980b9");
}
-
- if (window.cordova) {
+ if (window.cordova)
+ {
$cordovaSplashscreen.hide();
NVRDataModel.log("Enabling insecure SSL");
cordova.plugins.certificates.trustUnsecureCerts(true);
- cordova.getAppVersion.getVersionNumber().then(function (version) {
+ cordova.getAppVersion.getVersionNumber().then(function(version)
+ {
appVersion = version;
NVRDataModel.log("App Version: " + appVersion);
NVRDataModel.setAppVersion(appVersion);
});
}
- $fileLogger.checkFile().then(function (resp) {
- if (parseInt(resp.size) > zm.logFileMaxSize) {
+ $fileLogger.checkFile().then(function(resp)
+ {
+ if (parseInt(resp.size) > zm.logFileMaxSize)
+ {
- $fileLogger.deleteLogfile().then(function () {
+ $fileLogger.deleteLogfile().then(function()
+ {
NVRDataModel.log("Deleting old log file as it exceeds " + zm.logFileMaxSize + " bytes");
});
@@ -1428,12 +1545,13 @@ angular.module('zmApp', [
$fileLogger.setStorageFilename(zm.logFile);
$fileLogger.setTimestampFormat('MMM d, y ' + NVRDataModel.getTimeFormat());
-
-
- if (NVRDataModel.getLogin().disableNative) {
+ if (NVRDataModel.getLogin().disableNative)
+ {
NVRDataModel.log("Disabling native transitions...");
$ionicNativeTransitions.enable(false);
- } else {
+ }
+ else
+ {
NVRDataModel.log("Enabling native transitions...");
$ionicNativeTransitions.enable(true);
}
@@ -1442,78 +1560,82 @@ angular.module('zmApp', [
NVRDataModel.log("Retrieving language before init is called...");
localforage.getItem("defaultLang")
- .then(function (val) {
+ .then(function(val)
+ {
var lang = val;
//console.log (">>>>>>>>>>>>>> LANG IS " + val);
-
- if (lang == undefined || lang == null) {
+ if (lang == undefined || lang == null)
+ {
NVRDataModel.log("No language set, switching to en");
lang = "en";
-
- } else {
+ }
+ else
+ {
NVRDataModel.log("Language stored as:" + lang);
}
NVRDataModel.setDefaultLanguage(lang, false)
- .then(function (success) {
+ .then(function(success)
+ {
NVRDataModel.log(">>>>Language to be used:" + $translate.proposedLanguage());
moment.locale($translate.proposedLanguage());
// Remember this is before data Init
// so I need to do a direct forage fetch
localforage.getItem("isFirstUse")
- .then(function (val) {
+ .then(function(val)
+ {
//console.log ("isFirstUse is " + val);
- if (val == null || val == true) {
+ if (val == null || val == true)
+ {
NVRDataModel.log("First time detected");
$state.go("first-use");
return;
- } else {
+ }
+ else
+ {
continueRestOfInit();
}
});
-
});
});
}
+ function continueRestOfInit()
+ {
-
-
-
-
- function continueRestOfInit() {
-
- if ($rootScope.platformOS == 'desktop' )
+ if ($rootScope.platformOS == 'desktop')
{
$rootScope.lastState = "";
$rootScope.lastStateParam = {};
-
+
localforage.getItem('last-desktop-state')
- .then (function (succ) {
- // console.log ("FOUND " + JSON.stringify(succ) + ":"+succ);
- if (succ)
+ .then(function(succ)
{
- $rootScope.lastState = succ.name;
- $rootScope.lastStateParam = succ.params;
-
- }
- loadServices();
- }, function (err) {
- console.log ("ERR " + JSON.stringify(err));
- loadServices();
- });
+ // console.log ("FOUND " + JSON.stringify(succ) + ":"+succ);
+ if (succ)
+ {
+ $rootScope.lastState = succ.name;
+ $rootScope.lastStateParam = succ.params;
+
+ }
+ loadServices();
+ }, function(err)
+ {
+ console.log("ERR " + JSON.stringify(err));
+ loadServices();
+ });
}
else
-
+
{
-
+
loadServices();
}
@@ -1528,76 +1650,78 @@ angular.module('zmApp', [
setupPauseAndResume();
}
-
-
}
-
- function setupPauseAndResume() {
+ function setupPauseAndResume()
+ {
NVRDataModel.log("Setting up pause and resume handler AFTER language is loaded...");
//---------------------------------------------------------------------------
// resume handler
//----------------------------------------------------------------------------
- document.addEventListener("resume", function () {
+ document.addEventListener("resume", function()
+ {
NVRDataModel.log("App is resuming from background");
var forceDelay = NVRDataModel.getLogin().resumeDelay;
NVRDataModel.log(">>> Resume delayed for " + forceDelay + " ms, to wait for network stack...");
- $timeout(function () {
+ $timeout(function()
+ {
var ld = NVRDataModel.getLogin();
-
NVRDataModel.setBackground(false);
// don't animate
- $ionicHistory.nextViewOptions({
+ $ionicHistory.nextViewOptions(
+ {
disableAnimate: true,
disableBack: true
});
-
-
-
-
-
- // remember the last state so we can
- // go back there after auth
- if ($ionicHistory.currentView()) {
- $rootScope.lastState = $ionicHistory.currentView().stateName;
- $rootScope.lastStateParam =
- $ionicHistory.currentView().stateParams;
- NVRDataModel.debug("Last State recorded:" +
- JSON.stringify($ionicHistory.currentView()));
-
- if ($rootScope.lastState == "zm-portal-login") {
- NVRDataModel.debug("Last state was portal-login, so forcing montage");
- $rootScope.lastState = "montage";
- }
- NVRDataModel.debug("going to portal login");
- $ionicHistory.nextViewOptions({
- disableAnimate: true
- });
- $state.go("zm-portal-login");
- return;
- } else {
- $rootScope.lastState = "";
- $rootScope.lastStateParam = "";
- NVRDataModel.debug("reset lastState to null");
- $ionicHistory.nextViewOptions({
- disableAnimate: true
- });
- $state.go("zm-portal-login");
- return;
+ // remember the last state so we can
+ // go back there after auth
+ if ($ionicHistory.currentView())
+ {
+ $rootScope.lastState = $ionicHistory.currentView().stateName;
+ $rootScope.lastStateParam =
+ $ionicHistory.currentView().stateParams;
+ NVRDataModel.debug("Last State recorded:" +
+ JSON.stringify($ionicHistory.currentView()));
+
+ if ($rootScope.lastState == "zm-portal-login")
+ {
+ NVRDataModel.debug("Last state was portal-login, so forcing montage");
+ $rootScope.lastState = "montage";
}
-
+
+ NVRDataModel.debug("going to portal login");
+ $ionicHistory.nextViewOptions(
+ {
+ disableAnimate: true
+ });
+ $state.go("zm-portal-login");
+ return;
+ }
+ else
+ {
+ $rootScope.lastState = "";
+ $rootScope.lastStateParam = "";
+ NVRDataModel.debug("reset lastState to null");
+ $ionicHistory.nextViewOptions(
+ {
+ disableAnimate: true
+ });
+ $state.go("zm-portal-login");
+ return;
+ }
+
}, forceDelay);
}, false);
-
//---------------------------------------------------------------------------
// background handler
//----------------------------------------------------------------------------
- document.addEventListener("pause", function () {
+ document.addEventListener("pause", function()
+ {
NVRDataModel.setBackground(true);
NVRDataModel.setJustResumed(true); // used for window stop
@@ -1606,32 +1730,25 @@ angular.module('zmApp', [
$interval.cancel($rootScope.eventQueryInterval);
$interval.cancel($rootScope.intervalHandle);
-
NVRDataModel.log("ROOT APP: Stopping network pull...");
window.stop(); // dont call stopNetwork - we need to stop here
-
var ld = NVRDataModel.getLogin();
- if (ld.exitOnSleep && $rootScope.platformOS == "android") {
+ if (ld.exitOnSleep && $rootScope.platformOS == "android")
+ {
NVRDataModel.log("user exited app");
ionic.Platform.exitApp();
}
-
-
zmAutoLogin.stop();
if ($rootScope.zmPopup)
$rootScope.zmPopup.close();
}, false);
-
-
-
}
-
}); //platformReady
}) //run
@@ -1641,7 +1758,8 @@ angular.module('zmApp', [
//------------------------------------------------------------------
// My route map connecting menu options to their respective templates and controllers
-.config(function ($stateProvider, $urlRouterProvider, $httpProvider, $ionicConfigProvider, $provide, $compileProvider, $ionicNativeTransitionsProvider, $logProvider, $translateProvider) {
+.config(function($stateProvider, $urlRouterProvider, $httpProvider, $ionicConfigProvider, $provide, $compileProvider, $ionicNativeTransitionsProvider, $logProvider, $translateProvider)
+{
//$logProvider.debugEnabled(false);
//$compileProvider.debugInfoEnabled(false);
@@ -1650,12 +1768,14 @@ angular.module('zmApp', [
// if they occur. I suspect digest and other errors will be useful
// for me to see
- $provide.decorator("$exceptionHandler", ['$delegate', '$injector', function ($delegate, $injector) {
- return function (exception, cause) {
-
+ $provide.decorator("$exceptionHandler", ['$delegate', '$injector', function($delegate, $injector)
+ {
+ return function(exception, cause)
+ {
var $rootScope = $injector.get("$rootScope");
- $rootScope.exceptionMessage({
+ $rootScope.exceptionMessage(
+ {
reason: exception,
cause: cause
});
@@ -1675,25 +1795,27 @@ angular.module('zmApp', [
//$ionicConfigProvider.scrolling.jsScrolling(false);
$compileProvider.debugInfoEnabled(false);
- $ionicNativeTransitionsProvider.setDefaultOptions({
+ $ionicNativeTransitionsProvider.setDefaultOptions(
+ {
duration: 250,
});
- $translateProvider.useStaticFilesLoader({
+ $translateProvider.useStaticFilesLoader(
+ {
prefix: 'lang/locale-',
suffix: '.json'
});
//$translateProvider.useLocalStorage();
-
- $translateProvider.registerAvailableLanguageKeys(['en', 'de', 'es', 'fr', 'it', 'ru', 'ja', 'ko', 'pl','zh', 'zh_CN', 'zh_TW', 'pt', 'ar', 'hi'], {
+ $translateProvider.registerAvailableLanguageKeys(['en', 'de', 'es', 'fr', 'it', 'ru', 'ja', 'ko', 'pl', 'zh', 'zh_CN', 'zh_TW', 'pt', 'ar', 'hi'],
+ {
'en_*': 'en',
'de_*': 'de',
'es_*': 'es',
'fr_*': 'fr',
'it_*': 'it',
- 'ru_*': 'ru',
+ 'ru_*': 'ru',
'ja_*': 'ja',
'ko_*': 'ko',
'pt_*': 'pt',
@@ -1703,15 +1825,14 @@ angular.module('zmApp', [
'*': 'en' // must be last
});
-
-
//$translateProvider.determinePreferredLanguage();
//$translateProvider.preferredLanguage("en");
$translateProvider.fallbackLanguage("en");
$translateProvider.useSanitizeValueStrategy('escape');
$stateProvider
- .state('app', {
+ .state('app',
+ {
url: '/',
abstract: true,
templateUrl: 'index.html',
@@ -1720,22 +1841,23 @@ angular.module('zmApp', [
//controller: 'AppCtrl'
})
-
-
- .state('login', {
- data: {
+ .state('login',
+ {
+ data:
+ {
requireLogin: false
},
url: "/login/:wizard",
- cache: false,
+ cache: false,
templateUrl: "templates/login.html",
controller: 'zmApp.LoginCtrl',
})
-
- .state('help', {
- data: {
+ .state('help',
+ {
+ data:
+ {
requireLogin: false
},
url: "/help",
@@ -1745,8 +1867,10 @@ angular.module('zmApp', [
})
- .state('news', {
- data: {
+ .state('news',
+ {
+ data:
+ {
requireLogin: false
},
url: "/news",
@@ -1756,14 +1880,16 @@ angular.module('zmApp', [
})
-
-
- .state('monitors', {
- data: {
+ .state('monitors',
+ {
+ data:
+ {
requireLogin: true
},
- resolve: {
- message: function (NVRDataModel) {
+ resolve:
+ {
+ message: function(NVRDataModel)
+ {
// console.log("Inside app.montage resolve");
return NVRDataModel.getMonitors(0);
}
@@ -1773,15 +1899,18 @@ angular.module('zmApp', [
templateUrl: "templates/monitors.html",
controller: 'zmApp.MonitorCtrl',
-
})
- .state('events', {
- data: {
+ .state('events',
+ {
+ data:
+ {
requireLogin: true
},
- resolve: {
- message: function (NVRDataModel) {
+ resolve:
+ {
+ message: function(NVRDataModel)
+ {
//console.log("Inside app.events resolve");
return NVRDataModel.getMonitors(0);
}
@@ -1791,11 +1920,12 @@ angular.module('zmApp', [
templateUrl: "templates/events.html",
controller: 'zmApp.EventCtrl',
-
})
- .state('lowversion', {
- data: {
+ .state('lowversion',
+ {
+ data:
+ {
requireLogin: false
},
@@ -1804,11 +1934,12 @@ angular.module('zmApp', [
templateUrl: "templates/lowversion.html",
controller: 'zmApp.LowVersionCtrl',
-
})
- .state('importantmessage', {
- data: {
+ .state('importantmessage',
+ {
+ data:
+ {
requireLogin: false
},
@@ -1817,13 +1948,12 @@ angular.module('zmApp', [
templateUrl: "templates/important_message.html",
controller: 'zmApp.ImportantMessageCtrl',
-
})
-
-
- .state('events-graphs', {
- data: {
+ .state('events-graphs',
+ {
+ data:
+ {
requireLogin: true
},
cache: false,
@@ -1833,9 +1963,10 @@ angular.module('zmApp', [
})
-
- .state('events-date-time-filter', {
- data: {
+ .state('events-date-time-filter',
+ {
+ data:
+ {
requireLogin: true
},
cache: false,
@@ -1845,8 +1976,10 @@ angular.module('zmApp', [
})
- .state('state', {
- data: {
+ .state('state',
+ {
+ data:
+ {
requireLogin: true
},
cache: false,
@@ -1856,8 +1989,10 @@ angular.module('zmApp', [
})
- .state('devoptions', {
- data: {
+ .state('devoptions',
+ {
+ data:
+ {
requireLogin: true
},
url: "/devoptions",
@@ -1866,29 +2001,37 @@ angular.module('zmApp', [
controller: 'zmApp.DevOptionsCtrl',
})
- .state('timeline', {
- data: {
+ .state('timeline',
+ {
+ data:
+ {
requireLogin: true
},
- resolve: {
- message: function (NVRDataModel) {
+ resolve:
+ {
+ message: function(NVRDataModel)
+ {
//console.log("Inside app.events resolve");
return NVRDataModel.getMonitors(0);
}
},
url: "/timeline",
- cache:false,
+ cache: false,
templateUrl: "templates/timeline.html",
controller: 'zmApp.TimelineCtrl',
})
- .state('eventserversettings', {
- data: {
+ .state('eventserversettings',
+ {
+ data:
+ {
requireLogin: true
},
- resolve: {
- message: function (NVRDataModel) {
+ resolve:
+ {
+ message: function(NVRDataModel)
+ {
return NVRDataModel.getMonitors(0);
}
},
@@ -1899,8 +2042,10 @@ angular.module('zmApp', [
})
- .state('log', {
- data: {
+ .state('log',
+ {
+ data:
+ {
requireLogin: false
},
url: "/log",
@@ -1910,8 +2055,10 @@ angular.module('zmApp', [
})
- .state('wizard', {
- data: {
+ .state('wizard',
+ {
+ data:
+ {
requireLogin: false
},
url: "/wizard",
@@ -1921,8 +2068,10 @@ angular.module('zmApp', [
})
- .state('zm-portal-login', {
- data: {
+ .state('zm-portal-login',
+ {
+ data:
+ {
requireLogin: false
},
url: "/zm-portal-login",
@@ -1933,8 +2082,10 @@ angular.module('zmApp', [
})
- .state('first-use', {
- data: {
+ .state('first-use',
+ {
+ data:
+ {
requireLogin: false
},
url: "/first-use",
@@ -1944,12 +2095,16 @@ angular.module('zmApp', [
})
- .state('montage-history', {
- data: {
+ .state('montage-history',
+ {
+ data:
+ {
requireLogin: true
},
- resolve: {
- message: function (NVRDataModel) {
+ resolve:
+ {
+ message: function(NVRDataModel)
+ {
//console.log("Inside app.events resolve");
return NVRDataModel.getMonitors(0);
}
@@ -1959,20 +2114,24 @@ angular.module('zmApp', [
url: "/montage-history",
templateUrl: "templates/montage-history.html",
controller: 'zmApp.MontageHistoryCtrl',
- params: {
+ params:
+ {
minimal: false,
isRefresh: false
},
-
})
- .state('montage', {
- data: {
+ .state('montage',
+ {
+ data:
+ {
requireLogin: true
},
- resolve: {
- message: function (NVRDataModel) {
+ resolve:
+ {
+ message: function(NVRDataModel)
+ {
//console.log("Inside app.events resolve");
return NVRDataModel.getMonitors(0);
}
@@ -1982,15 +2141,15 @@ angular.module('zmApp', [
cache: false,
templateUrl: "templates/montage.html",
controller: 'zmApp.MontageCtrl',
- params: {
+ params:
+ {
minimal: false,
isRefresh: false
},
-
});
// We are NOT going to default route. Routing to a view will start on
// a broadcast of "init-complete"
-}); //config \ No newline at end of file
+}); //config
diff --git a/www/js/ionicUtils.js b/www/js/ionicUtils.js
index ae05293b..c593624c 100644
--- a/www/js/ionicUtils.js
+++ b/www/js/ionicUtils.js
@@ -6,22 +6,27 @@
angular.module('ionic.utils', [])
-.factory('$localstorage', ['$window', function($window) {
- return {
+.factory('$localstorage', ['$window', function($window)
+{
+ return {
- init: function() {},
+ init: function() {},
- set: function(key, value) {
- $window.localStorage[key] = value;
- },
- get: function(key, defaultValue) {
- return $window.localStorage[key] || defaultValue;
- },
- setObject: function(key, value) {
- $window.localStorage[key] = JSON.stringify(value);
- },
- getObject: function(key) {
- return JSON.parse($window.localStorage[key] || '{}');
- }
- };
-}]); \ No newline at end of file
+ set: function(key, value)
+ {
+ $window.localStorage[key] = value;
+ },
+ get: function(key, defaultValue)
+ {
+ return $window.localStorage[key] || defaultValue;
+ },
+ setObject: function(key, value)
+ {
+ $window.localStorage[key] = JSON.stringify(value);
+ },
+ getObject: function(key)
+ {
+ return JSON.parse($window.localStorage[key] || '{}');
+ }
+ };
+}]);