diff options
| author | Pliable Pixels <pliablepixels@gmail.com> | 2016-11-18 09:28:08 -0500 |
|---|---|---|
| committer | Pliable Pixels <pliablepixels@gmail.com> | 2016-11-18 09:28:08 -0500 |
| commit | 31ca68739126f5740681238539a8c6a1b66e0000 (patch) | |
| tree | ddd6317b70ae500f63a3231a0639c54a02129c20 /www/js | |
| parent | cf93ca01f3d54fca62d4222f110c2a63b526badb (diff) | |
mass formatting and normalization - tweaked JSBeautify options
Diffstat (limited to 'www/js')
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> " + $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> " + $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] || '{}'); + } + }; +}]); |
