summaryrefslogtreecommitdiff
path: root/www/js/TimelineCtrl.js
diff options
context:
space:
mode:
Diffstat (limited to 'www/js/TimelineCtrl.js')
-rw-r--r--www/js/TimelineCtrl.js464
1 files changed, 14 insertions, 450 deletions
diff --git a/www/js/TimelineCtrl.js b/www/js/TimelineCtrl.js
index b8321e00..c32d530e 100644
--- a/www/js/TimelineCtrl.js
+++ b/www/js/TimelineCtrl.js
@@ -94,23 +94,7 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
};
- function padToN(number, digits) {
-
- var i;
- var stringMax = "";
- var stringLeading = "";
- for (i = 1; i <= digits; i++) {
- stringMax = stringMax + "9";
- if (i != digits) stringLeading = stringLeading + "0";
- }
- var numMax = parseInt(stringMax);
-
- if (number <= numMax) {
- number = (stringLeading + number).slice(-digits);
- }
- //console.log ("PADTON: returning " + number);
- return number;
- }
+
//--------------------------------------------------------
@@ -120,12 +104,15 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
function openModal(event) {
ZMDataModel.setAwake(ZMDataModel.getKeepAwake());
- currentEvent = event;
+ // pass this event to ModalCtrl
+ $scope.currentEvent = event;
+ // in Timeline view, make sure events stick to same monitor
+ $scope.followSameMonitor="1";
- prepareModalEvent(event.Event.Id);
+ //prepareModalEvent(event.Event.Id);
$ionicModal.fromTemplateUrl('templates/events-modal.html', {
- scope: $scope,
+ scope: $scope, // give ModalCtrl access to this scope
animation: 'slide-in-up'
})
.then(function (modal) {
@@ -162,13 +149,13 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
};
- $scope.toggleGapless = function()
+ /* $scope.toggleGapless = function()
{
console.log ("GAPLESS TOGGLE");
$scope.loginData.gapless = !$scope.loginData.gapless;
ZMDataModel.setLogin($scope.loginData);
- };
+ };*/
//-------------------------------------------------------------------------
@@ -197,404 +184,7 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
- // This function returns neighbor events if applicable
- function neighborEvents(eid) {
- var d = $q.defer();
- // now get event details to show alarm frames
- var loginData = ZMDataModel.getLogin();
- var myurl = loginData.apiurl + '/events/' + eid + ".json";
- var neighbors = {
- prev: "",
- next: ""
- };
- $http.get(myurl)
- .success(function (data) {
-
- // In Timeline view, gapless should stick to the same monitor
- if (1) // we are viewing only one monitor
- {
- ZMDataModel.zmDebug ("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
- {
- neighbors.prev = data.event.Event.Prev ? data.event.Event.Prev : "";
- neighbors.next = data.event.Event.Next ? data.event.Event.Next : "";
- }*/
- ZMDataModel.zmDebug("Neighbor events of " + eid + "are Prev:" +
- neighbors.prev + " and Next:" + neighbors.next);
-
-
- d.resolve(neighbors);
- return (d.promise);
- })
- .error(function (err) {
- ZMDataModel.zmLog("Error retrieving neighbors" + JSON.stringify(err));
- d.reject(neighbors);
- return (d.promise);
-
-
- });
- return (d.promise);
-
- }
-
- $scope.toggleGapless = function()
- {
- console.log ("GAPLESS TOGGLE");
- $scope.loginData.gapless = !$scope.loginData.gapless;
- ZMDataModel.setLogin($scope.loginData);
-
- };
-
-
- //--------------------------------------------------------
- //Navigate to next/prev event in full screen mode
- //--------------------------------------------------------
-
- $scope.onSwipeEvent = function(eid,dirn)
- {
- console.log ("HERE");
- var ld = ZMDataModel.getLogin();
- if (!ld.canSwipeMonitors) return;
-
- if
- ($ionicScrollDelegate.$getByHandle("imgscroll").getScrollPosition().zoom!=1)
- {
- console.log("Image is zoomed in - not honoring swipe");
- return;
- }
- console.log ("JUMPING");
- jumpToEvent(eid,dirn);
-
- };
-
- $scope.jumpToEvent = function (eid, dirn) {
- console.log ("jumptoevent");
-
- jumpToEvent(eid, dirn);
-
- };
-
- function jumpToEvent (eid, dirn)
- {
- ZMDataModel.zmLog("Event jump called with:" + eid);
- if (eid == "") {
- $ionicLoading.show({
- template: "no more events",
- noBackdrop: true,
- duration: 2000
- });
-
- return;
- }
-
- var slidein;
- var slideout;
- if (dirn==1)
- {
- slideout = "animated slideOutLeft";
- slidein = "animated slideInRight";
- }
- 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()
- {
-
-
- $scope.animationInProgress = true;
- // give digest time for image to swap
- // 100 should be enough
- $timeout(function()
- {
- element.removeClass(slideout);
- element.addClass(slidein)
- .one('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend', inWithNew );
- prepareModalEvent(eid);
- },200);
- }
-
- function inWithNew()
- {
- element.removeClass(slidein);
- $scope.animationInProgress = false;
- }
-
- }
-
- //--------------------------------------------------------
- // utility function
- //--------------------------------------------------------
-
- function computeRelativePath(event) {
- var relativePath = "";
- var loginData = ZMDataModel.getLogin();
- var str = event.Event.StartTime;
- var yy = moment(str).format('YY');
- var mm = moment(str).format('MM');
- var dd = moment(str).format('DD');
- var hh = moment(str).format('HH');
- var min = moment(str).format('mm');
- var sec = moment(str).format('ss');
- relativePath = event.Event.MonitorId + "/" +
- yy + "/" +
- mm + "/" +
- dd + "/" +
- hh + "/" +
- min + "/" +
- sec + "/";
- return relativePath;
-
- }
-
- //--------------------------------------------------------
- // utility function
- //--------------------------------------------------------
-
- function computeBasePath(event) {
- var basePath = "";
- var loginData = ZMDataModel.getLogin();
- var str = event.Event.StartTime;
- var yy = moment(str).format('YY');
- var mm = moment(str).format('MM');
- var dd = moment(str).format('DD');
- var hh = moment(str).format('HH');
- var min = moment(str).format('mm');
- var sec = moment(str).format('ss');
-
- basePath = loginData.url + "/events/" +
- event.Event.MonitorId + "/" +
- yy + "/" +
- mm + "/" +
- dd + "/" +
- hh + "/" +
- min + "/" +
- sec + "/";
- return basePath;
- }
-
-
- //-------------------------------------------------------------------------
- // Called when rncarousel or video player finished playing event
- //-------------------------------------------------------------------------
-
- $scope.playbackFinished = function()
- {
- playbackFinished();
- };
-
- function playbackFinished()
- {
- // currentEvent is updated with the currently playing event in prepareModalEvent()
- ZMDataModel.zmLog ("Playback of event " + currentEvent.Event.Id + " is finished");
-
- if ($scope.loginData.gapless)
- {
-
- neighborEvents(currentEvent.Event.Id)
- .then(function (success) {
-
- // lets give a second before gapless transition to the next event
- $timeout ( function() {
- $scope.nextId = success.next;
- $scope.prevId = success.prev;
- ZMDataModel.zmDebug ("Gapless move to event " + $scope.nextId);
- jumpToEvent($scope.nextId, 1);
- },1000);
- },
- function (error) {
- ZMDataModel.zmDebug("Error in neighbor call " +
- JSON.stringify(error));
- });
- }
- else
- {
- ZMDataModel.zmDebug ("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
- // for an event ID and constructs required playback
- // parameters
- // Note that openModal is called with the top level event
- // API. Some parameters are repeated across both
- //--------------------------------------------------------
-
-
- function prepareModalEvent(eid) {
-
- // Lets get the detailed event API
- var loginData = ZMDataModel.getLogin();
- var myurl = loginData.apiurl + '/events/' + eid + ".json";
- ZMDataModel.zmLog("*** Constructed API for detailed events: " + myurl);
- $http.get(myurl)
- .then(function (success) {
-
-
-
- var event = success.data.event;
- currentEvent = event;
-
- event.Event.BasePath = computeBasePath(event);
- event.Event.relativePath = computeRelativePath(event);
-
-
- //console.log (JSON.stringify( success));
- $scope.eventName = event.Event.Name;
- $scope.eventId = event.Event.Id;
- $scope.eFramesNum = event.Event.Frames;
- $scope.eventDur = Math.round(event.Event.Length);
- $scope.loginData = ZMDataModel.getLogin();
-
- //console.log("**** VIDEO STATE IS " + event.Event.DefaultVideo);
- if (typeof event.Event.DefaultVideo === 'undefined')
- event.Event.DefaultVideo = "";
-
- $scope.defaultVideo = event.Event.DefaultVideo;
-
-
- neighborEvents(event.Event.Id)
- .then(function (success) {
- $scope.nextId = success.next;
- $scope.prevId = success.prev;
- },
- function (error) {
- console.log(JSON.stringify(error));
- });
-
- $scope.nextId = "...";
- $scope.prevId = "...";
-
-
-
-
- event.Event.video = {};
- var videoURL = $scope.loginData.url + "/events/" + event.Event.relativePath + event.Event.DefaultVideo;
-
- //console.log("************** VIDEO IS " + videoURL);
- event.Event.video.config = {
- autoPlay: true,
- sources: [
- {
- src: $sce.trustAsResourceUrl(videoURL),
- type: "video/mp4"
- }
-
- ],
-
- theme: "lib/videogular-themes-default/videogular.css",
-
- };
-
- $scope.videoObject = event.Event.video;
-
- $scope.playbackURL = $scope.loginData.url;
-
- /* we don't need this for electron
- if ($rootScope.platformOS == "desktop") {
- $scope.playbackURL = zm.desktopUrl;
- } */
-
- $scope.eventBasePath = event.Event.BasePath;
- $scope.relativePath = event.Event.relativePath;
- $rootScope.rand = Math.floor(Math.random() * (999999 - 111111 + 1)) + 111111;
-
- $scope.slider_modal_options = {
- from: 1,
- to: event.Event.Frames,
- realtime: true,
- step: 1,
- className: "mySliderClass",
- callback: function (value, released) {
- //console.log("CALLBACK"+value+released);
- $ionicScrollDelegate.freezeScroll(!released);
-
-
- },
- //modelLabels:function(val) {return "";},
- smooth: false,
- css: {
- background: {
- "background-color": "silver"
- },
- before: {
- "background-color": "purple"
- },
- default: {
- "background-color": "white"
- }, // default value: 1px
- after: {
- "background-color": "green"
- }, // zone after default value
- pointer: {
- "background-color": "red"
- }, // circle pointer
- range: {
- "background-color": "red"
- } // use it if double value
- },
- scale: []
-
- };
-
-
- $scope.mycarousel.index = 0;
- $scope.ionRange.index = 1;
- //console.log("**Resetting range");
- $scope.slides = [];
- var i;
- for (i = 1; i <= event.Event.Frames; i++) {
- var fname = padToN(i, eventImageDigits) + "-capture.jpg";
- // console.log ("Building " + fname);
- $scope.slides.push({
- id: i,
- img: fname
- });
- }
-
-
- // now get event details to show alarm frames
-
- $scope.FrameArray = event.Frame;
- // $scope.slider_options.scale=[];
- $scope.slider_modal_options.scale = [];
-
-
- for (i = 0; i < event.Frame.length; i++) {
- if (event.Frame[i].Type == "Alarm") {
-
- $scope.slider_modal_options.scale.push({
- val: i + 1,
- label: ' '
- });
- } else {
- //$scope.slider_options.scale.push(' ');
- }
-
- }
- $scope.totalEventTime = Math.round(parseFloat(event.Event.Length)) - 1;
- $scope.currentEventTime = 0;
- },
- function (err) {
- ZMDataModel.zmLog("Error retrieving detailed frame API " + JSON.stringify(err));
- ZMDataModel.displayBanner('error', ['could not retrieve frame details', 'please try again']);
- });
-
-
- }
-
+
//-------------------------------------------------
// Make sure we delete the timeline
@@ -652,7 +242,7 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
// Controller main
//-------------------------------------------------
- var currentEvent="";
+ //var currentEvent="";
// Make sure sliding for menu is disabled so it
// does not interfere with graph panning
@@ -663,36 +253,10 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
// FIXME: Timeline awake to avoid graph redrawing
ZMDataModel.setAwake(ZMDataModel.getKeepAwake());
- $scope.$watch('ionRange.index', function () {
- // console.log ("***ION RANGE CHANGED");
-
- $scope.mycarousel.index = parseInt($scope.ionRange.index) - 1;
- });
-
- $scope.$watch('mycarousel.index', function () {
-
- $scope.ionRange.index = ($scope.mycarousel.index + 1).toString();
-
- if (currentEvent && $scope.ionRange.index == parseInt(currentEvent.Event.Frames))
- {
- playbackFinished();
- }
- });
-
- $scope.mycarousel = {
- index: 0
- };
- $scope.ionRange = {
- index: 1
- };
+
+
- var eventImageDigits = 5; // failsafe
- ZMDataModel.getKeyConfigParams(0)
- .then(function (data) {
- //console.log ("***GETKEY: " + JSON.stringify(data));
- eventImageDigits = parseInt(data);
- ZMDataModel.zmLog("Image padding digits reported as " + eventImageDigits);
- });
+
// fromDate and toDate will be used to plot the range for the graph
// We start in day mode