summaryrefslogtreecommitdiff
path: root/www
diff options
context:
space:
mode:
Diffstat (limited to 'www')
-rw-r--r--www/external/gifshot.min.js8
-rw-r--r--www/index.html235
-rw-r--r--www/js/DataModel.js895
-rw-r--r--www/js/DevOptionsCtrl.js72
-rw-r--r--www/js/EventCtrl.js1168
-rw-r--r--www/js/EventDateTimeFilterCtrl.js79
-rw-r--r--www/js/EventModalCtrl.js773
-rw-r--r--www/js/EventServer.js259
-rw-r--r--www/js/EventServerSettingsCtrl.js192
-rw-r--r--www/js/EventsGraphsCtrl.js158
-rw-r--r--www/js/EventsModalGraphCtrl.js189
-rw-r--r--www/js/FirstUseCtrl.js67
-rw-r--r--www/js/HelpCtrl.js50
-rw-r--r--www/js/ImportantMessageCtrl.js20
-rw-r--r--www/js/LogCtrl.js120
-rw-r--r--www/js/LoginCtrl.js416
-rw-r--r--www/js/LowVersionCtrl.js16
-rw-r--r--www/js/MenuController.js72
-rw-r--r--www/js/MonitorCtrl.js446
-rw-r--r--www/js/MonitorModalCtrl.js617
-rw-r--r--www/js/MontageCtrl.js2144
-rw-r--r--www/js/MontageHistoryCtrl.js719
-rw-r--r--www/js/NewsCtrl.js61
-rw-r--r--www/js/PortalLoginCtrl.js221
-rw-r--r--www/js/StateCtrl.js195
-rw-r--r--www/js/TimelineCtrl.js712
-rw-r--r--www/js/TimelineModalCtrl.js198
-rw-r--r--www/js/WizardCtrl.js348
-rw-r--r--www/js/app.js1107
-rw-r--r--www/js/ionicUtils.js39
-rw-r--r--www/lang/locale-en.json1
-rw-r--r--www/lang/locale-pl.json16
-rw-r--r--www/templates/devoptions.html6
-rw-r--r--www/templates/events-graphs.html58
-rw-r--r--www/templates/events-modal.html45
-rw-r--r--www/templates/events-modalgraph.html9
-rw-r--r--www/templates/events-popover.html15
-rw-r--r--www/templates/events.html330
-rw-r--r--www/templates/eventserversettings.html82
-rw-r--r--www/templates/first-use.html16
-rw-r--r--www/templates/help.html15
-rw-r--r--www/templates/important_message.html9
-rw-r--r--www/templates/log.html19
-rw-r--r--www/templates/login.html44
-rw-r--r--www/templates/lowversion.html8
-rw-r--r--www/templates/monitors-modal.html116
-rw-r--r--www/templates/monitors.html104
-rw-r--r--www/templates/montage-history.html197
-rw-r--r--www/templates/montage.html69
-rw-r--r--www/templates/news.html15
-rw-r--r--www/templates/reorder-modal.html43
-rw-r--r--www/templates/state.html22
-rw-r--r--www/templates/timeline-modal.html52
-rw-r--r--www/templates/timeline-popover.html24
-rw-r--r--www/templates/wizard.html183
-rw-r--r--www/templates/zm-portal-login.html14
56 files changed, 7085 insertions, 6023 deletions
diff --git a/www/external/gifshot.min.js b/www/external/gifshot.min.js
new file mode 100644
index 00000000..d20775fc
--- /dev/null
+++ b/www/external/gifshot.min.js
@@ -0,0 +1,8 @@
+/*Copyrights for code authored by Yahoo Inc. is licensed under the following terms:
+MIT License
+Copyright 2015 Yahoo Inc.
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+!function(e,t,r,i){var n,o,a,s,d,c,l,u,m,f,g,h,p,v,b,w,y,C,S,k,F,x;n=function(){var i={URL:e.URL||e.webkitURL||e.mozURL||e.msURL,getUserMedia:function(){var e=r.getUserMedia||r.webkitGetUserMedia||r.mozGetUserMedia||r.msGetUserMedia;return e?e.bind(r):e}(),requestAnimFrame:e.requestAnimationFrame||e.webkitRequestAnimationFrame||e.mozRequestAnimationFrame||e.oRequestAnimationFrame||e.msRequestAnimationFrame,requestTimeout:function(e,t){function r(){var i=(new Date).getTime(),s=i-n;s>=t?e.call():o.value=a(r)}if(e=e||i.noop,t=t||0,!i.requestAnimFrame)return setTimeout(e,t);var n=(new Date).getTime(),o=new Object,a=i.requestAnimFrame;return o.value=a(r),o},Blob:e.Blob||e.BlobBuilder||e.WebKitBlobBuilder||e.MozBlobBuilder||e.MSBlobBuilder,btoa:function(){var t=e.btoa||function(e){for(var t,r,i,n,o,a,s,d="",c=0,l=e.length,u="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";l>c;)t=e.charCodeAt(c++),r=e.charCodeAt(c++),i=e.charCodeAt(c++),n=t>>2,o=(3&t)<<4|r>>4,a=(15&r)<<2|i>>6,s=63&i,isNaN(r)?a=s=64:isNaN(i)&&(s=64),d=d+u.charAt(n)+u.charAt(o)+u.charAt(a)+u.charAt(s);return d};return t?t.bind(e):function(){}}(),isObject:function(e){return e&&"[object Object]"===Object.prototype.toString.call(e)},isEmptyObject:function(e){return i.isObject(e)&&!Object.keys(e).length},isArray:function(e){return e&&Array.isArray(e)},isFunction:function(e){return e&&"function"==typeof e},isElement:function(e){return e&&1===e.nodeType},isString:function(e){return"string"==typeof e||"[object String]"===Object.prototype.toString.call(e)},isSupported:{canvas:function(){var e=t.createElement("canvas");return e&&e.getContext&&e.getContext("2d")},webworkers:function(){return e.Worker},blob:function(){return i.Blob},Uint8Array:function(){return e.Uint8Array},Uint32Array:function(){return e.Uint32Array},videoCodecs:function(){var e=t.createElement("video"),r={mp4:!1,h264:!1,ogv:!1,ogg:!1,webm:!1};try{e&&e.canPlayType&&(r.mp4=""!==e.canPlayType('video/mp4; codecs="mp4v.20.8"'),r.h264=""!==(e.canPlayType('video/mp4; codecs="avc1.42E01E"')||e.canPlayType('video/mp4; codecs="avc1.42E01E, mp4a.40.2"')),r.ogv=""!==e.canPlayType('video/ogg; codecs="theora"'),r.ogg=""!==e.canPlayType('video/ogg; codecs="theora"'),r.webm=-1!==e.canPlayType('video/webm; codecs="vp8, vorbis"'))}catch(i){}return r}()},noop:function(){},each:function(e,t){var r,n;if(i.isArray(e))for(r=-1,n=e.length;++r<n&&t(r,e[r])!==!1;);else if(i.isObject(e))for(r in e)if(e.hasOwnProperty(r)&&t(r,e[r])===!1)break},mergeOptions:function n(e,t){if(i.isObject(e)&&i.isObject(t)&&Object.keys){var r={};return i.each(e,function(t){r[t]=e[t]}),i.each(t,function(o){var a=t[o];r[o]=i.isObject(a)?e[o]?n(e[o],a):a:a}),r}},setCSSAttr:function(e,t,r){i.isElement(e)&&(i.isString(t)&&i.isString(r)?e.style[t]=r:i.isObject(t)&&i.each(t,function(t,r){e.style[t]=r}))},removeElement:function(e){i.isElement(e)&&e.parentNode&&e.parentNode.removeChild(e)},createWebWorker:function(e){if(!i.isString(e))return{};try{var t=new i.Blob([e],{type:"text/javascript"}),r=i.URL.createObjectURL(t),n=new Worker(r);return{objectUrl:r,worker:n}}catch(o){return""+o}},getExtension:function(e){return e.substr(e.lastIndexOf(".")+1,e.length)},getFontSize:function(e){if(e=e||{},!t.body||e.resizeFont===!1)return e.fontSize;var r=e.text,i=e.gifWidth,n=parseInt(e.fontSize,10),o=parseInt(e.minFontSize,10),a=t.createElement("div"),s=t.createElement("span");for(a.setAttribute("width",i),a.appendChild(s),s.innerHTML=r,s.style.fontSize=n+"px",s.style.textIndent="-9999px",s.style.visibility="hidden",t.body.appendChild(s);s.offsetWidth>i&&n>=o;)s.style.fontSize=--n+"px";return t.body.removeChild(s),n+"px"},webWorkerError:!1};return i}(),o=function(e){var t={validate:function(r){r=e.isObject(r)?r:{};var i={};return e.each(t.validators,function(e,t){var n=t.errorCode;return r[n]||t.condition?void 0:(i=t,i.error=!0,!1)}),delete i.condition,i},isValid:function(e){var r=t.validate(e),i=r.error!==!0?!0:!1;return i},validators:[{condition:e.isFunction(e.getUserMedia),errorCode:"getUserMedia",errorMsg:"The getUserMedia API is not supported in your browser"},{condition:e.isSupported.canvas(),errorCode:"canvas",errorMsg:"Canvas elements are not supported in your browser"},{condition:e.isSupported.webworkers(),errorCode:"webworkers",errorMsg:"The Web Workers API is not supported in your browser"},{condition:e.isFunction(e.URL),errorCode:"window.URL",errorMsg:"The window.URL API is not supported in your browser"},{condition:e.isSupported.blob(),errorCode:"window.Blob",errorMsg:"The window.Blob File API is not supported in your browser"},{condition:e.isSupported.Uint8Array(),errorCode:"window.Uint8Array",errorMsg:"The window.Uint8Array function constructor is not supported in your browser"},{condition:e.isSupported.Uint32Array(),errorCode:"window.Uint32Array",errorMsg:"The window.Uint32Array function constructor is not supported in your browser"}],messages:{videoCodecs:{errorCode:"videocodec",errorMsg:"The video codec you are trying to use is not supported in your browser"}}};return t}(n),a={sampleInterval:10,numWorkers:2,gifWidth:200,gifHeight:200,interval:.1,numFrames:10,keepCameraOn:!1,images:[],video:null,webcamVideoElement:null,cameraStream:null,text:"",fontWeight:"normal",fontSize:"16px",minFontSize:"10px",resizeFont:!1,fontFamily:"sans-serif",fontColor:"#ffffff",textAlign:"center",textBaseline:"bottom",textXCoordinate:null,textYCoordinate:null,progressCallback:function(){},completeCallback:function(){},saveRenderingContexts:!1,savedRenderingContexts:[],crossOrigin:"Anonymous"},s=function(){return o.isValid()},d=function(){return o.isValid()},c=function(){var e={getUserMedia:!0};return o.isValid(e)},l=function(e){var t=!1;if(n.isArray(e)&&e.length){if(n.each(e,function(e,r){n.isSupported.videoCodecs[r]&&(t=!0)}),!t)return!1}else if(n.isString(e)&&e.length&&!n.isSupported.videoCodecs[e])return!1;return o.isValid({getUserMedia:!0})},u=function(){function e(){function e(e,t,r){var i,n;for(u=e,m=t,f=r,g=new Array(h),i=0;h>i;i++)g[i]=new Array(4),n=g[i],n[0]=n[1]=n[2]=(i<<S+8)/h|0,D[i]=x/h|0,G[i]=0}function t(){for(var e=[],t=new Array(h),r=0;h>r;r++)t[g[r][3]]=r;for(var i=0,n=0;h>n;n++){var o=t[n];e[i++]=g[o][0],e[i++]=g[o][1],e[i++]=g[o][2]}return e}function r(){var e,t,r,i,n,o,a,s;for(a=0,s=0,e=0;h>e;e++){for(n=g[e],r=e,i=n[1],t=e+1;h>t;t++)o=g[t],o[1]<i&&(r=t,i=o[1]);if(o=g[r],e!=r&&(t=o[0],o[0]=n[0],n[0]=t,t=o[1],o[1]=n[1],n[1]=t,t=o[2],o[2]=n[2],n[2]=t,t=o[3],o[3]=n[3],n[3]=t),i!=a){for(B[a]=s+e>>1,t=a+1;i>t;t++)B[t]=e;a=i,s=e}}for(B[a]=s+C>>1,t=a+1;256>t;t++)B[t]=C}function i(){var e,t,r,i,n,o,a,g,h,C,F,x,E,W;for(y>m&&(f=1),l=30+(f-1)/3,x=u,E=0,W=m,F=m/(3*f),C=F/k|0,g=j,o=I,a=o>>R,1>=a&&(a=0),e=0;a>e;e++)q[e]=g*((a*a-e*e)*z/(a*a));for(h=y>m?3:m%p!==0?3*p:m%v!==0?3*v:m%b!==0?3*b:3*w,e=0;F>e;)if(r=(255&x[E+0])<<S,i=(255&x[E+1])<<S,n=(255&x[E+2])<<S,t=c(r,i,n),d(g,t,r,i,n),0!==a&&s(a,t,r,i,n),E+=h,E>=W&&(E-=m),e++,0===C&&(C=1),e%C===0)for(g-=g/l,o-=o/T,a=o>>R,1>=a&&(a=0),t=0;a>t;t++)q[t]=g*((a*a-t*t)*z/(a*a))}function n(e,t,r){var i,n,o,a,s,d,c;for(s=1e3,c=-1,i=B[t],n=i-1;h>i||n>=0;)h>i&&(d=g[i],o=d[1]-t,o>=s?i=h:(i++,0>o&&(o=-o),a=d[0]-e,0>a&&(a=-a),o+=a,s>o&&(a=d[2]-r,0>a&&(a=-a),o+=a,s>o&&(s=o,c=d[3])))),n>=0&&(d=g[n],o=t-d[1],o>=s?n=-1:(n--,0>o&&(o=-o),a=d[0]-e,0>a&&(a=-a),o+=a,s>o&&(a=d[2]-r,0>a&&(a=-a),o+=a,s>o&&(s=o,c=d[3]))));return c}function o(){return i(),a(),r(),t()}function a(){var e;for(e=0;h>e;e++)g[e][0]>>=S,g[e][1]>>=S,g[e][2]>>=S,g[e][3]=e}function s(e,t,r,i,n){var o,a,s,d,c,l,u;for(s=t-e,-1>s&&(s=-1),d=t+e,d>h&&(d=h),o=t+1,a=t-1,l=1;d>o||a>s;){if(c=q[l++],d>o){u=g[o++];try{u[0]-=c*(u[0]-r)/P|0,u[1]-=c*(u[1]-i)/P|0,u[2]-=c*(u[2]-n)/P|0}catch(m){}}if(a>s){u=g[a--];try{u[0]-=c*(u[0]-r)/P|0,u[1]-=c*(u[1]-i)/P|0,u[2]-=c*(u[2]-n)/P|0}catch(m){}}}}function d(e,t,r,i,n){var o=g[t],a=e/j;o[0]-=a*(o[0]-r)|0,o[1]-=a*(o[1]-i)|0,o[2]-=a*(o[2]-n)|0}function c(e,t,r){var i,n,o,a,s,d,c,l,u,m;for(l=~(1<<31),u=l,d=-1,c=d,i=0;h>i;i++)m=g[i],n=m[0]-e,0>n&&(n=-n),o=m[1]-t,0>o&&(o=-o),n+=o,o=m[2]-r,0>o&&(o=-o),n+=o,l>n&&(l=n,d=i),a=n-(G[i]>>F-S),u>a&&(u=a,c=i),s=D[i]>>W,D[i]-=s,G[i]+=s<<E;return D[d]+=O,G[d]-=A,c}var l,u,m,f,g,h=256,p=499,v=491,b=487,w=503,y=3*w,C=h-1,S=4,k=100,F=16,x=1<<F,E=10,W=10,O=x>>W,A=x<<E-W,U=h>>3,R=6,M=1<<R,I=U*M,T=30,V=10,j=1<<V,H=8,z=1<<H,L=V+H,P=1<<L,B=[],G=[],D=[],q=[];e.apply(this,arguments);var N={};return N.map=n,N.process=o,N}return e}(),m=function(e){var t=function(){try{self.onmessage=function(e){var t,i=e.data||{};i.gifshot&&(t=r.run(i),postMessage(t))}}catch(t){}var r={dataToRGB:function(e,t,r){for(var i=0,n=t*r*4,o=[];n>i;)o.push(e[i++]),o.push(e[i++]),o.push(e[i++]),i++;return o},componentizedPaletteToArray:function(e){var t,r,i,n,o=[];for(t=0;t<e.length;t+=3)r=e[t],i=e[t+1],n=e[t+2],o.push(r<<16|i<<8|n);return o},processFrameWithQuantizer:function(t,r,i,n){var o,a,s,d,c=this.dataToRGB(t,r,i),l=new e(c,c.length,n),u=l.process(),m=new Uint32Array(this.componentizedPaletteToArray(u)),f=r*i,g=new Uint8Array(f),h=0;for(o=0;f>o;o++)a=c[h++],s=c[h++],d=c[h++],g[o]=l.map(a,s,d);return{pixels:g,palette:m}},run:function(e){var t=e.width,r=e.height,i=e.data,n=(e.palette,e.sampleInterval);return this.processFrameWithQuantizer(i,t,r,n)}};return r};return t}(u),f=function(e,t,r,n){function o(e){var t=e.length;if(2>t||t>256||t&t-1)throw"Invalid code/color length, must be power of 2 and 2 .. 256.";return t}function a(e,t,r,n){function o(r){for(;f>=r;)e[t++]=255&g,g>>=8,f-=8,t===s+256&&(e[s]=255,s=t++)}function a(e){g|=e<<f,f+=m,o(8)}e[t++]=r;var s=t++,d=1<<r,c=d-1,l=d+1,u=l+1,m=r+1,f=0,g=0,h=n[0]&c,p={};a(d);for(var v=1,b=n.length;b>v;++v){var w=n[v]&c,y=h<<8|w,C=p[y];if(C===i){for(g|=h<<f,f+=m;f>=8;)e[t++]=255&g,g>>=8,f-=8,t===s+256&&(e[s]=255,s=t++);4096===u?(a(d),u=l+1,m=r+1,p={}):(u>=1<<m&&++m,p[y]=u++),h=w}else h=C}return a(h),a(l),o(1),s+1===t?e[s]=0:(e[s]=t-s-1,e[t++]=0),t}var s=0;n=n===i?{}:n;var d=n.loop===i?null:n.loop,c=n.palette===i?null:n.palette;if(0>=t||0>=r||t>65535||r>65535)throw"Width/Height invalid.";e[s++]=71,e[s++]=73,e[s++]=70,e[s++]=56,e[s++]=57,e[s++]=97;var l=0,u=0;if(e[s++]=255&t,e[s++]=t>>8&255,e[s++]=255&r,e[s++]=r>>8&255,e[s++]=(null!==c?128:0)|l,e[s++]=u,e[s++]=0,null!==d){if(0>d||d>65535)throw"Loop count invalid.";e[s++]=33,e[s++]=255,e[s++]=11,e[s++]=78,e[s++]=69,e[s++]=84,e[s++]=83,e[s++]=67,e[s++]=65,e[s++]=80,e[s++]=69,e[s++]=50,e[s++]=46,e[s++]=48,e[s++]=3,e[s++]=1,e[s++]=255&d,e[s++]=d>>8&255,e[s++]=0}var m=!1;this.addFrame=function(t,r,n,d,l,u){if(m===!0&&(--s,m=!1),u=u===i?{}:u,0>t||0>r||t>65535||r>65535)throw"x/y invalid.";if(0>=n||0>=d||n>65535||d>65535)throw"Width/Height invalid.";if(l.length<n*d)throw"Not enough pixels for the frame size.";var f=!0,g=u.palette;if((g===i||null===g)&&(f=!1,g=c),g===i||null===g)throw"Must supply either a local or global palette.";for(var h=o(g),p=0;h>>=1;)++p;h=1<<p;var v=u.delay===i?0:u.delay,b=u.disposal===i?0:u.disposal;if(0>b||b>3)throw"Disposal out of range.";var w=!1,y=0;if(u.transparent!==i&&null!==u.transparent&&(w=!0,y=u.transparent,0>y||y>=h))throw"Transparent color index.";if((0!==b||w||0!==v)&&(e[s++]=33,e[s++]=249,e[s++]=4,e[s++]=b<<2|(w===!0?1:0),e[s++]=255&v,e[s++]=v>>8&255,e[s++]=y,e[s++]=0),e[s++]=44,e[s++]=255&t,e[s++]=t>>8&255,e[s++]=255&r,e[s++]=r>>8&255,e[s++]=255&n,e[s++]=n>>8&255,e[s++]=255&d,e[s++]=d>>8&255,e[s++]=f===!0?128|p-1:0,f===!0)for(var C=0,S=g.length;S>C;++C){var k=g[C];e[s++]=k>>16&255,e[s++]=k>>8&255,e[s++]=255&k}s=a(e,s,2>p?2:p,l)},this.end=function(){return m===!1&&(e[s++]=59,m=!0),s}},g=function(e,r,i,n){var o=function(t){this.canvas=null,this.ctx=null,this.repeat=0,this.frames=[],this.numRenderedFrames=0,this.onRenderCompleteCallback=e.noop,this.onRenderProgressCallback=e.noop,this.workers=[],this.availableWorkers=[],this.generatingGIF=!1,this.options=t,this.initializeWebWorkers(t)};return o.prototype={workerMethods:r(),initializeWebWorkers:function(n){var o,a,s,d,c=i.toString()+"("+r.toString()+"());",l=-1,u="";for(d=n.numWorkers;++l<d;)o=e.createWebWorker(c),e.isObject(o)?(a=o.objectUrl,s=o.worker,this.workers.push({worker:s,objectUrl:a}),this.availableWorkers.push(s)):(u=o,e.webWorkerError=!!o);this.workerError=u,this.canvas=t.createElement("canvas"),this.canvas.width=n.gifWidth,this.canvas.height=n.gifHeight,this.ctx=this.canvas.getContext("2d"),this.frames=[]},getWorker:function(){return this.availableWorkers.pop()},freeWorker:function(e){this.availableWorkers.push(e)},byteMap:function(){for(var e=[],t=0;256>t;t++)e[t]=String.fromCharCode(t);return e}(),bufferToString:function(e){for(var t=e.length,r="",i=-1;++i<t;)r+=this.byteMap[e[i]];return r},onFrameFinished:function(t){var r=this,i=r.frames,n=r.options;hasExistingImages=!!(n.images||[]).length,allDone=i.every(function(e){return!e.beingProcessed&&e.done}),r.numRenderedFrames++,hasExistingImages&&t(r.numRenderedFrames/i.length),r.onRenderProgressCallback(.75*r.numRenderedFrames/i.length),allDone?r.generatingGIF||r.generateGIF(i,r.onRenderCompleteCallback):e.requestTimeout(function(){r.processNextFrame()},1)},processFrame:function(e){var t,r,i=this,n=this.options,o=n.progressCallback,a=n.sampleInterval,s=this.frames,d=function(e){var n=e.data;delete t.data,t.pixels=Array.prototype.slice.call(n.pixels),t.palette=Array.prototype.slice.call(n.palette),t.done=!0,t.beingProcessed=!1,i.freeWorker(r),i.onFrameFinished(o)};return t=s[e],t.beingProcessed||t.done?(this.onFrameFinished(),void 0):(t.sampleInterval=a,t.beingProcessed=!0,t.gifshot=!0,r=this.getWorker(),r?(r.onmessage=d,r.postMessage(t)):d({data:i.workerMethods.run(t)}),void 0)},startRendering:function(e){this.onRenderCompleteCallback=e;for(var t=0;t<this.options.numWorkers&&t<this.frames.length;t++)this.processFrame(t)},processNextFrame:function(){for(var e=-1,t=0;t<this.frames.length;t++){var r=this.frames[t];if(!r.done&&!r.beingProcessed){e=t;break}}e>=0&&this.processFrame(e)},generateGIF:function(t,r){var i,o,a=[],s={loop:this.repeat},d=this.options,c=d.interval,l=d.images,u=!!l.length,m=d.gifHeight,f=d.gifWidth,g=new n(a,f,m,s),h=this.onRenderProgressCallback,p=u?100*c:0;this.generatingGIF=!0,e.each(t,function(e,r){var i=r.palette;h(.75+.25*r.position*1/t.length),g.addFrame(0,0,f,m,r.pixels,{palette:i,delay:p})}),g.end(),h(1),this.frames=[],this.generatingGIF=!1,e.isFunction(r)&&(i=this.bufferToString(a),o="data:image/gif;base64,"+e.btoa(i),r(o))},setRepeat:function(e){this.repeat=e},addFrame:function(t,r){r=e.isObject(r)?r:{};var i,n=this,o=n.ctx,a=n.options,s=a.gifWidth,d=a.gifHeight,c=(r.gifHeight,r.gifWidth,r.text),l=r.fontWeight,u=e.getFontSize(r),m=r.fontFamily,f=r.fontColor,g=r.textAlign,h=r.textBaseline,p=r.textXCoordinate?r.textXCoordinate:"left"===g?1:"right"===g?s:s/2,v=r.textYCoordinate?r.textYCoordinate:"top"===h?1:"center"===h?d/2:d,b=l+" "+u+" "+m;try{o.drawImage(t,0,0,s,d),c&&(o.font=b,o.fillStyle=f,o.textAlign=g,o.textBaseline=h,o.fillText(c,p,v)),i=o.getImageData(0,0,s,d),n.addFrameImageData(i)}catch(w){return""+w}},addFrameImageData:function(e){var t=this.frames,r=e.data;this.frames.push({data:r,width:e.width,height:e.height,palette:null,dithering:null,done:!1,beingProcessed:!1,position:t.length})},onRenderProgress:function(e){this.onRenderProgressCallback=e},isRendering:function(){return this.generatingGIF},getBase64GIF:function(t){var r=this,i=function(i){r.destroyWorkers(),e.requestTimeout(function(){t(i)},0)};r.startRendering(i)},destroyWorkers:function(){if(!this.workerError){var t=this.workers;e.each(t,function(t,r){var i=r.worker,n=r.objectUrl;i.terminate(),e.URL.revokeObjectURL(n)})}}},o}(n,m,u,f),h=function(e,t){e.getBase64GIF(function(e){t({error:!1,errorCode:"",errorMsg:"",image:e})})},p=function(e){function r(){n.each(p,function(e,t){t&&s.addFrame(t,u)}),h(s,l)}var a,s,d=e.images,c=e.imagesLength,l=e.callback,u=e.options,m={getUserMedia:!0,"window.URL":!0},f=o.validate(m),p=[],v=0;return f.error?l(f):(s=new g(u),n.each(d,function(e,o){n.isElement(o)?(u.crossOrigin&&(o.crossOrigin=u.crossOrigin),p[e]=o,v+=1,v===c&&r()):n.isString(o)&&(a=t.createElement("img"),u.crossOrigin&&(a.crossOrigin=u.crossOrigin),a.onerror=function(){p.length>e&&(p[e]=i)}(function(t){t.onload=function(){p[e]=t,v+=1,v===c&&r(),n.removeElement(t)}}(a)),a.src=o,n.setCSSAttr(a,{position:"fixed",opacity:"0"}),t.body.appendChild(a))}),void 0)},v={getGIF:function(e,r){r=n.isFunction(r)?r:n.noop;var i,o=t.createElement("canvas"),a=e.images,s=!!a.length,d=e.videoElement,c=e.keepCameraOn,l=e.webcamVideoElement,u=e.cameraStream,m=+e.gifWidth,f=+e.gifHeight,h=e.videoWidth,p=e.videoHeight,v=(+e.sampleInterval,+e.numWorkers,e.crop),b=+e.interval,w=s?0:1e3*b,y=e.progressCallback,C=e.savedRenderingContexts,S=e.saveRenderingContexts,k=[],F=C.length?C.length:e.numFrames,x=F,E=new g(e),W=e.text,O=e.fontWeight,A=n.getFontSize(e),U=e.fontFamily,R=e.fontColor,M=e.textAlign,I=e.textBaseline,T=e.textXCoordinate?e.textXCoordinate:"left"===M?1:"right"===M?m:m/2,V=e.textYCoordinate?e.textYCoordinate:"top"===I?1:"center"===I?f/2:f,j=O+" "+A+" "+U,H=v?Math.floor(v.scaledWidth/2):0,z=v?h-v.scaledWidth:0,L=v?Math.floor(v.scaledHeight/2):0,P=v?p-v.scaledHeight:0,B=function G(){function e(){try{z>h&&(z=h),P>p&&(P=p),0>H&&(H=0),0>L&&(L=0),i.drawImage(d,H,L,z,P,0,0,m,f),t()}catch(r){if("NS_ERROR_NOT_AVAILABLE"!==r.name)throw r;n.requestTimeout(e,100)}}function t(){x=o;var t,a,s,g,h=F-x;S&&k.push(i.getImageData(0,0,m,f)),W&&(i.font=j,i.fillStyle=R,i.textAlign=M,i.textBaseline=I,i.fillText(W,T,V)),t=i.getImageData(0,0,m,f),a=t.data,s=a[0]+a[1]+a[2]+a[3],g=0===s,g?1===h&&1===F&&e():E.addFrameImageData(t),y(h/F),o>0&&n.requestTimeout(G,w),x||E.getBase64GIF(function(e){r({error:!1,errorCode:"",errorMsg:"",image:e,cameraStream:u,videoElement:d,webcamVideoElement:l,savedRenderingContexts:k,keepCameraOn:c})})}var o=x-1;C.length?(i.putImageData(C[F-x],0,0),t()):e()};F=null!=F?F:10,b=null!=b?b:.1,o.width=m,o.height=f,i=o.getContext("2d"),function D(){return C.length||0!==d.currentTime?(B(),void 0):(n.requestTimeout(D,100),void 0)}()},getCropDimensions:function(e){var t=e.videoWidth,r=e.videoHeight,i=e.gifWidth,n=e.gifHeight,o={width:0,height:0,scaledWidth:0,scaledHeight:0};return t>r?(o.width=Math.round(t*(n/r))-i,o.scaledWidth=Math.round(o.width*(r/n))):(o.height=Math.round(r*(i/t))-n,o.scaledHeight=Math.round(o.height*(t/i))),o}},b={loadedData:!1,defaultVideoDimensions:{width:640,height:480},findVideoSize:function E(e){E.attempts=E.attempts||0;var t=this,r=e.videoElement,i=e.cameraStream,o=e.completedCallback;r&&(r.videoWidth>0&&r.videoHeight>0?(r.removeEventListener("loadeddata",t.findVideoSize),o({videoElement:r,cameraStream:i,videoWidth:r.videoWidth,videoHeight:r.videoHeight})):E.attempts<10?(E.attempts+=1,n.requestTimeout(function(){t.findVideoSize(e)},200)):o({videoElement:r,cameraStream:i,videoWidth:t.defaultVideoDimensions.width,videoHeight:t.defaultVideoDimensions.height}))},onStreamingTimeout:function(e){n.isFunction(e)&&e({error:!0,errorCode:"getUserMedia",errorMsg:"There was an issue with the getUserMedia API - Timed out while trying to start streaming",image:null,cameraStream:{}})},stream:function(e){var t=this,r=n.isArray(e.existingVideo)?e.existingVideo[0]:e.existingVideo,i=e.videoElement,o=e.cameraStream,a=e.streamedCallback,s=e.completedCallback;n.isFunction(a)&&a(),r?n.isString(r)&&(i.src=r,i.innerHTML='<source src="'+r+'" type="video/'+n.getExtension(r)+'" />'):i.mozSrcObject?i.mozSrcObject=o:n.URL&&(i.src=n.URL.createObjectURL(o)),i.play(),n.requestTimeout(function d(){d.count=d.count||0,t.loadedData===!0?(t.findVideoSize({videoElement:i,cameraStream:o,completedCallback:s}),t.loadedData=!1):(d.count+=1,d.count>10?t.findVideoSize({videoElement:i,cameraStream:o,completedCallback:s}):d())},100)},startStreaming:function(e){var r=this,i=n.isFunction(e.error)?e.error:n.noop,o=n.isFunction(e.streamed)?e.streamed:n.noop,a=n.isFunction(e.completed)?e.completed:n.noop,s=e.existingVideo,d=e.webcamVideoElement,c=n.isElement(s)?s:d?d:t.createElement("video"),l=e.lastCameraStream,u=e.crossOrigin,m=e.options;u&&(c.crossOrigin=m.crossOrigin),c.autoplay=!0,c.loop=!0,c.muted=!0,c.addEventListener("loadeddata",function(){r.loadedData=!0}),s?r.stream({videoElement:c,existingVideo:s,completedCallback:a}):l?r.stream({videoElement:c,cameraStream:l,streamedCallback:o,completedCallback:a}):n.getUserMedia({video:!0},function(e){r.stream({videoElement:c,cameraStream:e,streamedCallback:o,completedCallback:a})},i)},startVideoStreaming:function(e,t){t=t||{};var r,o=this,a=t.timeout!==i?t.timeout:0,s=t.callback,d=t.webcamVideoElement;a>0&&(r=n.requestTimeout(function(){o.onStreamingTimeout(s)},1e4)),this.startStreaming({error:function(){s({error:!0,errorCode:"getUserMedia",errorMsg:"There was an issue with the getUserMedia API - the user probably denied permission",image:null,cameraStream:{}})},streamed:function(){clearTimeout(r)},completed:function(t){var r=t.cameraStream,i=t.videoElement,n=t.videoWidth,o=t.videoHeight;e({cameraStream:r,videoElement:i,videoWidth:n,videoHeight:o})},lastCameraStream:t.lastCameraStream,webcamVideoElement:d,crossOrigin:t.crossOrigin,options:t})},stopVideoStreaming:function(e){e=n.isObject(e)?e:{};var t=e.cameraStream,r=e.videoElement,i=e.keepCameraOn,o=e.webcamVideoElement;!i&&t&&n.isFunction(t.stop)&&t.stop(),n.isElement(r)&&!o&&(r.pause(),n.isFunction(n.URL.revokeObjectURL)&&!n.webWorkerError&&r.src&&n.URL.revokeObjectURL(r.src),n.removeElement(r))}},w=function(e){e=n.isObject(e)?e:{};var t=(n.isObject(e.options)?e.options:{},e.cameraStream),r=e.videoElement,i=e.webcamVideoElement,o=e.keepCameraOn;b.stopVideoStreaming({cameraStream:t,videoElement:r,keepCameraOn:o,webcamVideoElement:i})},y=function(e,r){var i=e.options||{},o=i.images,a=i.video,s=(+i.numFrames,e.cameraStream),d=e.videoElement,c=e.videoWidth,l=e.videoHeight,u=+i.gifWidth,m=+i.gifHeight,f=v.getCropDimensions({videoWidth:c,videoHeight:l,gifHeight:m,gifWidth:u}),g=r;i.crop=f,i.videoElement=d,i.videoWidth=c,i.videoHeight=l,i.cameraStream=s,n.isElement(d)&&(d.width=u+f.width,d.height=m+f.height,i.webcamVideoElement||(n.setCSSAttr(d,{position:"fixed",opacity:"0"}),t.body.appendChild(d)),d.play(),v.getGIF(i,function(e){o&&o.length||a&&a.length||w(e),g(e)}))},C=function(e){var t,r,i=e.existingVideo,a=e.callback,s=e.options,d={getUserMedia:!0,"window.URL":!0},c=o.validate(d);if(c.error)return a(c);if(n.isElement(i)&&i.src){if(r=i.src,t=n.getExtension(r),!n.isSupported.videoCodecs[t])return a(o.messages.videoCodecs)}else n.isArray(i)&&n.each(i,function(e,r){return t=r.substr(r.lastIndexOf(".")+1,r.length),n.isSupported.videoCodecs[t]?(i=r,!1):void 0});b.startStreaming({completed:function(e){e.options=s||{},y(e,a)},existingVideo:i,crossOrigin:s.crossOrigin,options:s})},S=function(e){var t=e.lastCameraStream,r=e.callback,i=e.webcamVideoElement,n=e.options;return d()?n.savedRenderingContexts.length?(v.getWebcamGIF(n,function(e){r(e)}),void 0):(b.startVideoStreaming(function(e){e.options=n||{},y(e,r)},{lastCameraStream:t,callback:r,webcamVideoElement:i,crossOrigin:n.crossOrigin}),void 0):r(o.validate())},k=function(e,t){if(t=n.isFunction(e)?e:t,e=n.isObject(e)?e:{},n.isFunction(t)){var r=n.mergeOptions(a,e)||{},i=e.cameraStream,o=r.images,s=o?o.length:0,d=r.video,c=r.webcamVideoElement;r=n.mergeOptions(r,{gifWidth:Math.floor(r.gifWidth),gifHeight:Math.floor(r.gifHeight)}),s?p({images:o,imagesLength:s,callback:t,options:r}):d?C({existingVideo:d,callback:t,options:r}):S({lastCameraStream:i,callback:t,webcamVideoElement:c,options:r})}},F=function(e,t){if(t=n.isFunction(e)?e:t,e=n.isObject(e)?e:{},n.isFunction(t)){var r=n.mergeOptions(a,e),i=n.mergeOptions(r,{interval:.1,numFrames:1,gifWidth:Math.floor(r.gifWidth),gifHeight:Math.floor(r.gifHeight)});k(i,t)}},x=function(e,t,r,i,n,o,a,s,d,c){var l={utils:e,error:t,defaultOptions:r,createGIF:s,takeSnapShot:d,stopVideoStreaming:c,isSupported:i,isWebCamGIFSupported:n,isExistingVideoGIFSupported:a,isExistingImagesGIFSupported:o,VERSION:"0.3.2"};return l}(n,o,a,s,d,c,l,k,F,w),function(t){"function"==typeof define&&define.amd?define([],function(){return t}):"undefined"!=typeof exports?module.exports=t:e.gifshot=t}(x)}("undefined"!=typeof window?window:{},"undefined"!=typeof document?document:{createElement:function(){}},"undefined"!=typeof window?window.navigator:{}); \ No newline at end of file
diff --git a/www/index.html b/www/index.html
index 635b23fc..301d967e 100644
--- a/www/index.html
+++ b/www/index.html
@@ -2,16 +2,11 @@
<html>
<head>
-
-
<meta charset="utf-8">
<meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no, width=device-width">
-
- <meta http-equiv="Content-Security-Policy" content="img-src * android-webview-video-poster: 'self' data:; default-src * 'self' gap: wss: ws: ; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval';">
-
- <title></title>
+ <meta http-equiv="Content-Security-Policy" content="img-src * android-webview-video-poster: cdvphotolibrary: 'self' data:; default-src * blob: 'self' gap: wss: ws: ; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval';">
+ <title></title>
<meta name="format-detection" content="telephone=no">
-
<link rel="stylesheet" href="css/animate.min.css">
<link rel="stylesheet" href="css/angular-circular-navigation.css">
<link rel="stylesheet" href="css/custommfb.css">
@@ -23,13 +18,9 @@
<link rel="stylesheet" href="lib/angular-wizard/dist/angular-wizard.min.css">
<link href="css/ionic.app.min.css" rel="stylesheet">
<link href="css/style.css" rel="stylesheet">
-
<!-- unmanaged externals -->
<link rel="stylesheet" href="external/ionic.content.banner.min.css">
<link rel="stylesheet" href="external/radio.css">
-
-
-
<script src="lib/ionic/js/ionic.bundle.min.js"></script>
<script src="lib/ngCordova/dist/ng-cordova.min.js"></script>
<script src="lib/filelogger/dist/filelogger.min.js"></script>
@@ -51,12 +42,10 @@
<script src="lib/angular-translate-loader-static-files/angular-translate-loader-static-files.min.js"></script>
<script src="lib/vis/dist/vis-timeline-graph2d.min.js"></script>
<script src="lib/moment/min/moment-with-locales.min.js"></script>
-
<script src="lib/ng-mfb/src/mfb-directive.js"></script>
<script src="lib/angular-touch/angular-touch.js"></script>
-
<!-- unmanaged externals -->
- <script src="external/moment-timezone-with-data.min.js"></script>
+ <script src="external/moment-timezone-with-data.min.js"></script>
<script src="external/angular-ios9-uiwebview.patch.js"></script>
<script src="external/ionRadio.js"></script>
<script src="external/ng-websocket.js"></script>
@@ -72,11 +61,8 @@
<script src="external/ionic.scroll.sista.js"></script>
<script src="external/angular-circular-navigation.js"></script>
<script src="external/Chart2.min.js"></script>
-
-
-
-
- <!-- app related JS -->
+ <script src="external/gifshot.min.js"></script>
+ <!-- app related JS -->
<script src="js/app.js"></script>
<script src="js/controllers.js"></script>
<script src="js/DataModel.js"></script>
@@ -105,25 +91,14 @@
<script src="js/WizardCtrl.js"></script>
<script src="js/MenuController.js"></script>
<script src="js/EventsModalGraphCtrl.js"></script>
-
-
-
</head>
-
-
-
-
-
<!-- <body ng-app="starter" > -->
<!-- I want to start angular only after cordova device is ready, so I'll tag it on device ready -->
-
<body bgcolor="#555555">
-
<!-- For some reason - which I haven't debugged yet, when I was using the ionic side menu template
I was having problems with tabs/sliders in views, I think its to do with controls being alive in
the menu. this approach puts controls in each page and that works well -->
-
<!-- This is the Side menu options -->
<!-- ng-cloak makes sure no HTML items load up before Angular is initialized -->
<!-- This avoids sudden flashes of odd/mis-aligned icons-->
@@ -136,176 +111,140 @@
</ion-nav-bar>
<ion-nav-view></ion-nav-view>
</ion-side-menu-content>
-
<ion-side-menu>
<ion-header-bar class="bar bar-header bar-stable">
<h1 class="title">{{'kMenuOptions'|translate}}</h1>
-
</ion-header-bar>
<ion-content has-header="true" mouse-wheel-scroll>
- <!-- <ion-scroll scrollbar-y="false" style="height:100%" >-->
- <ion-list>
-
- <ion-item href="#/montage" menu-close>
-
- <!--<span ng-if="$root.runMode=='lowbw'" style="float:right;margin-top:-18px;background-color:#f1c40f;color:#000;font-size:11px;opacity:0.7;width:20px;border-radius: 0px 0px 5px 5px;display:inline-block;text-align:center;">&nbsp;<i class="icon ion-arrow-graph-down-left"></i>&nbsp;</span>-->
-
- <span class=" item-icon-left">
+ <!-- <ion-scroll scrollbar-y="false" style="height:100%" >-->
+ <ion-list>
+ <ion-item href="#/montage" menu-close>
+ <!--<span ng-if="$root.runMode=='lowbw'" style="float:right;margin-top:-18px;background-color:#f1c40f;color:#000;font-size:11px;opacity:0.7;width:20px;border-radius: 0px 0px 5px 5px;display:inline-block;text-align:center;">&nbsp;<i class="icon ion-arrow-graph-down-left"></i>&nbsp;</span>-->
+ <span class=" item-icon-left">
<i class="icon ion-ios-eye"></i>
</span>{{'kMenuMontage'|translate}}
- </ion-item>
-
- <ion-item href="#/montage-history" menu-close>
- <span class=" item-icon-left">
+ </ion-item>
+ <ion-item href="#/montage-history" menu-close>
+ <span class=" item-icon-left">
<i class="icon ion-calendar"></i>
</span>{{'kMenuEventMontage'|translate}}
- </ion-item>
-
- <ion-item href="#/timeline" menu-close>
- <span class=" item-icon-left">
+ </ion-item>
+ <ion-item href="#/timeline" menu-close>
+ <span class=" item-icon-left">
<i class="icon ion-android-time"></i>
</span>{{'kMenuTimeline'|translate}}
- </ion-item>
-
- <ion-item href="#/events/0/false" menu-close>
- <span class=" item-icon-left">
+ </ion-item>
+ <ion-item href="#/events/0/false" menu-close>
+ <span class=" item-icon-left">
<i class="icon ion-ios-calendar-outline"></i>
</span>{{'kMenuEvents'|translate}}
- </ion-item>
-
- <ion-item href="#/monitors" menu-close>
- <span class=" item-icon-left">
+ </ion-item>
+ <ion-item href="#/monitors" menu-close>
+ <span class=" item-icon-left">
<i class="icon ion-ios-videocam-outline"></i>
</span>{{'kMenuMonitors'|translate}}
- </ion-item>
-
- <ion-item href="#/state" menu-close>
- <span class=" item-icon-left">
+ </ion-item>
+ <ion-item href="#/state" menu-close>
+ <span class=" item-icon-left">
<i class="icon ion-information-circled"></i>
</span> {{'kMenuSystemStatus'|translate}}
- </ion-item>
-
- <ion-item nav-clear menu-close href="#/login/false">
- <span class=" item-icon-left">
+ </ion-item>
+ <ion-item nav-clear menu-close href="#/login/false">
+ <span class=" item-icon-left">
<i class="icon ion-person"></i>
{{'kMenuZMSettings'|translate}}
<!--<span class="item-note" style="width:90px">
{{$root.getProfileName();}}
</span>-->
- <span style="float:right;margin-top:-18px;background-color:#444444;color:#fff;font-size:11px;opacity:0.7;width:90px;border-radius: 0px 0px 5px 5px;:text-overflow:ellipsis;overflow:hidden;white-space:nowrap;display:inline-block;text-align:center;">&nbsp;{{$root.getProfileName();}}&nbsp;</span>
- </span>
- </ion-item>
-
- <ion-item nav-clear menu-close href="#/devoptions">
- <span class=" item-icon-left">
+ <span style="float:right;margin-top:-18px;background-color:#444444;color:#fff;font-size:11px;opacity:0.7;width:90px;border-radius: 0px 0px 5px 5px;:text-overflow:ellipsis;overflow:hidden;white-space:nowrap;display:inline-block;text-align:center;">&nbsp;{{$root.getProfileName();}}&nbsp;</span>
+ </span>
+ </ion-item>
+ <ion-item nav-clear menu-close href="#/devoptions">
+ <span class=" item-icon-left">
<i class="icon ion-settings"></i>
</span> {{'kMenuDevSettings'|translate}}
- </ion-item>
-
-
- <div ng-controller="MenuController">
- <ion-item ng-click="switchLang()" nav-clear menu-close href="">
- <span class=" item-icon-left">
+ </ion-item>
+ <div ng-controller="MenuController">
+ <ion-item ng-click="switchLang()" nav-clear menu-close href="">
+ <span class=" item-icon-left">
<i class="icon ion-earth"></i>
</span> {{'kLanguage'|translate}}
- </ion-item>
- </div>
-
- <ion-item nav-clear menu-close href="#/help">
- <span class=" item-icon-left">
+ </ion-item>
+ </div>
+ <ion-item nav-clear menu-close href="#/help">
+ <span class=" item-icon-left">
<i class="icon ion-help"></i>
</span> {{'kMenuHelp'|translate}}
- </ion-item>
-
- <ion-item nav-clear menu-close href="#/wizard">
- <span class=" item-icon-left">
+ </ion-item>
+ <ion-item nav-clear menu-close href="#/wizard">
+ <span class=" item-icon-left">
<i class="icon ion-wand"></i>
</span> {{'kMenuWizard'|translate}}
- </ion-item>
-
- <div ng-if="$root.showBlog">
- <ion-item nav-clear menu-close href="#/news">
- <span class=" item-icon-left">
+ </ion-item>
+ <div ng-if="$root.showBlog">
+ <ion-item nav-clear menu-close href="#/news">
+ <span class=" item-icon-left">
<i class="icon ion-radio-waves"></i>
</span>{{'kMenuNews'|translate}}<span style="color:#268d3a;"> {{$root.newBlogPost}}</span>
- </ion-item>
- </div>
-
- <ion-item nav-clear menu-close href="#/log">
- <span class=" item-icon-left">
+ </ion-item>
+ </div>
+ <ion-item nav-clear menu-close href="#/log">
+ <span class=" item-icon-left">
<i class="icon ion-clipboard"></i>
</span> {{'kMenuLogs'|translate}}
- </ion-item>
-
-
-
- <div ng-if="$root.newVersionAvailable && $root.platformOS=='desktop'">
- <ion-item nav-clear menu-close href="">
- <span class=" item-icon-left">
+ </ion-item>
+ <div ng-if="$root.newVersionAvailable && $root.platformOS=='desktop'">
+ <ion-item nav-clear menu-close href="">
+ <span class=" item-icon-left">
<i class="icon ion-email-unread"></i>
</span> <span style="color:#268d3a;">{{$root.newVersionAvailable}}</span>
- </ion-item>
- </div>
-
-
-
- <div ng-if="$root.platformOS=='android'">
- <ion-item ng-click="$root.exitApp();">
- <span class=" item-icon-left">
+ </ion-item>
+ </div>
+ <div ng-if="$root.platformOS=='android'">
+ <ion-item ng-click="$root.exitApp();">
+ <span class=" item-icon-left">
<i class="icon ion-close-circled"></i>
</span> {{'kMenuExit'|translate}}
- </ion-item>
-
- </div>
-
- <ion-item style="color:rgb(106, 106, 106); font-size:90%;">
- <i class="ion-ios-location"></i> {{$root.getLocalTimeZone();}} <br/>
- <span ng-if="$root.isTzSupported()"><i class="icon icon-server"></i> {{$root.getServerTimeZoneNow();}} </span>
</ion-item>
-
-
-
-
-
- </ion-list>
+ </div>
+ <ion-item style="color:rgb(106, 106, 106); font-size:90%;">
+ <i class="ion-ios-location"></i> {{$root.getLocalTimeZone();}}
+ <br/>
+ <span ng-if="$root.isTzSupported()"><i class="icon icon-server"></i> {{$root.getServerTimeZoneNow();}} </span>
+ </ion-item>
+ </ion-list>
<!--</ion-scroll>-->
</ion-content>
</ion-side-menu>
</ion-side-menus>
-
-
-
-
<!-- This is where is bootstrap angular - if I don't do this, then the window jumps around
after the status bar comes on - because the window kicked in before phonegap got ready -->
-
<script>
- window.ionic.Platform.ready(function() {
- console.log("******* PLATFORM READY ****");
+ window.ionic.Platform.ready(function()
+ {
+ console.log("******* PLATFORM READY ****");
- angular.bootstrap(document, ['zmApp']);
- });
+ angular.bootstrap(document, ['zmApp']);
+ });
</script>
-
<!-- keyboard input jump fix
https://forum.ionicframework.com/t/ionic-keyboard-scroll-issue-ios/34420/2?u=pliablepixels
-->
-
<script>
- /* global angular, $*/
- window.addEventListener('native.keyboardshow', keyboardShowHandler);
-
- function keyboardShowHandler(e) {
- setTimeout(function() {
- $('html, body').animate({
- scrollTop: 0
- }, 1000);
- }, 0);
- }
+ /* global angular, $*/
+ window.addEventListener('native.keyboardshow', keyboardShowHandler);
+
+ function keyboardShowHandler(e)
+ {
+ setTimeout(function()
+ {
+ $('html, body').animate(
+ {
+ scrollTop: 0
+ }, 1000);
+ }, 0);
+ }
</script>
-
-
-
</body>
-</html> \ No newline at end of file
+</html>
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..98557f7a 100644
--- a/www/js/EventCtrl.js
+++ b/www/js/EventCtrl.js
@@ -1,6 +1,6 @@
/* jshint -W041 */
/* jslint browser: true*/
-/* global saveAs, cordova,StatusBar,angular,console,moment, MobileAccessibility */
+/* global saveAs, cordova,StatusBar,angular,console,moment, MobileAccessibility, gifshot, AnimatedGIF */
// This is the controller for Event view. StateParams is if I recall the monitor ID.
// This was before I got access to the new APIs. FIXME: Revisit this code to see what I am doing with it
@@ -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,40 @@ 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");
+ //
+ $scope.gifshotSupported = gifshot.isExistingImagesGIFSupported();
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 +158,6 @@ angular.module('zmApp.controllers')
$scope.weeks = [];
$scope.months = [];
-
$scope.eventList = {
showDelete: false
};
@@ -167,13 +171,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 +195,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 +220,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 +259,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 +295,8 @@ angular.module('zmApp.controllers')
$scope.ionRange.index = ($scope.mycarousel.index + 1).toString();
// console.log ("***IONRANGE RANGE CHANGED TO " + $scope.ionRange.index);
-
});
-
}
// --------------------------------------------------------
@@ -303,30 +304,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 +348,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 +365,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 +389,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 +405,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 +435,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 +445,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 +460,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 +472,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 +485,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 +497,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 +509,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 +558,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 +603,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 +615,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 +634,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 +661,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 +673,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 +754,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,27 +772,272 @@ 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;
}
};
+ // credit:http://stackoverflow.com/a/20151856/1361529
+ function base64toBlob(base64Data, contentType)
+ {
+ contentType = contentType || '';
+ var sliceSize = 1024;
+ var byteCharacters = atob(base64Data);
+ var bytesLength = byteCharacters.length;
+ var slicesCount = Math.ceil(bytesLength / sliceSize);
+ var byteArrays = new Array(slicesCount);
+
+ for (var sliceIndex = 0; sliceIndex < slicesCount; ++sliceIndex)
+ {
+ var begin = sliceIndex * sliceSize;
+ var end = Math.min(begin + sliceSize, bytesLength);
+
+ var bytes = new Array(end - begin);
+ for (var offset = begin, i = 0; offset < end; ++i, ++offset)
+ {
+ bytes[i] = byteCharacters[offset].charCodeAt(0);
+ }
+ byteArrays[sliceIndex] = new Uint8Array(bytes);
+ }
+ return new Blob(byteArrays,
+ {
+ type: contentType
+ });
+ }
+
+ //----------------------------------------------------------
+ // create an array of images
+ // too keep memory manageable, we are only going to pick up alarmed frames
+ // and that too, max 1ps
+ // --------------------------------------------------------------
+ function prepareImages(e)
+ {
+ var d = $q.defer();
+ var imglist = [];
+ var myurl = loginData.apiurl + '/events/' + e.Event.Id + ".json";
+ $http.get(myurl)
+ .then(function(succ)
+ {
+ var data = succ.data;
+ var fps = 0;
+ var lastTime = "";
+
+ for (var i = 0; i < data.event.Frame.length; i++)
+ {
+ if (data.event.Frame[i].Type == "Alarm")
+ //if (1)
+ {
+ var fname;
+ //console.log ("PATH="+e.Event.imageMode);
+ if (e.Event.imageMode == 'path')
+ //if (1)
+ {
+ var rfp = padToN(data.event.Frame[i].FrameId, eventImageDigits) + "-capture.jpg";
+ fname = e.Event.baseURL + "/index.php?view=image&width=800&path=" + e.Event.relativePath + rfp;
+ }
+ else
+ {
+ fname = e.Event.baseURL + "/index.php?view=image&width=800&fid=" + data.event.Frame[i].Id;
+ }
+
+ if (data.event.Frame[i].TimeStamp != lastTime /*|| fps < 2*/)
+ {
+ imglist.push(fname);
+ //fps = data.event.Frame[i].TimeStamp != lastTime ? 0 : fps+1;
+ lastTime = data.event.Frame[i].TimeStamp;
+ }
+
+ }
+
+ }
+
+ // next up make sure we are not processing more than 100 images
+
+ while (imglist.length > zm.maxGifCount)
+ {
+ NVRDataModel.debug ("Too many images: " +imglist.length+", deleting alternate frames to keep it <="+zm.maxGifCount);
+
+ for(var l = 0; l < imglist.length; l++) {
+ imglist.splice(l+1,2);
+ if (imglist.length <=zm.maxGifCount) break;
+ }
+
+ }
+
+ d.resolve(imglist);
+ return d.promise;
+ },
+ function(err)
+ {
+ d.reject(err);
+ return d.promise;
+ });
+ return d.promise;
+ }
+
+ // force image to be 800px. TBD: rotated foo
+ function adjustAspect(e)
+ {
+
+ var w = 800;
+ var h = Math.round(e.Event.Height / e.Event.Width * 800.0);
+ return {
+ w: w,
+ h: h
+ };
+
+ }
+
+ $scope.permissionsDownload = function(e)
+ {
+ if ($rootScope.platformOS == 'desktop')
+ {
+ downloadAsGif(e);
+ }
+ else
+ {
+
+ console.log ("in perms");
+ cordova.plugins.photoLibrary.getLibrary(
+ function (library) { downloadAsGif(e);},
+ function (err) {
+ if (err.startsWith('Permission')) {
+ // call requestAuthorization, and retry
+ cordova.plugins.photoLibrary.requestAuthorization(
+ function () {
+ // User gave us permission to his library, retry reading it!
+ downloadAsGif(e);
+ },
+ function (err) {
+ NVRDataModel.log ("ERROR with saving permissions "+err);
+ // User denied the access
+ }, // if options not provided, defaults to {read: true}.
+ {
+ read: true,
+ write: true
+ }
+ );
+ }
+ // Handle error - it's not permission-related
+ }
+ );
+
+ }
+ };
+
+ function downloadAsGif(e)
+ {
+ $ionicLoading.show(
+ {
+ template: $translate.instant('kPleaseWait') + "...",
+ noBackdrop: true,
+ //duration: 10000
+ });
+
+ prepareImages(e)
+ .then(function(imgs)
+ {
+
+ console.log ("TOTAL IMAGES TO GIF="+imgs.length);
+ console.log(JSON.stringify(imgs));
+
+ var ad = adjustAspect(e);
+ console.log("SAVING W=" + ad.w + " H=" + ad.h);
+
+ //AnimatedGIF.setRepeat(null);
+ gifshot.createGIF(
+ {
+ //'images': ['http://i.imgur.com/2OO33vX.jpg', 'http://i.imgur.com/qOwVaSN.png', 'http://i.imgur.com/Vo5mFZJ.gif'],
+ 'gifWidth': ad.w,
+ 'gifHeight': ad.h,
+ 'images': imgs,
+ 'interval':1,
+ //'loop':null,
+ 'sampleInterval':20,
+ //'frameDur':5, // 1/2 a sec
+ 'text': 'zmNinja',
+ 'crossOrigin': 'use-credentials',
+ 'progressCallback': function (cp)
+ {
+ var p = Math.round(cp * 100);
+ $ionicLoading.show({template: $translate.instant('kPleaseWait') + "...("+p+"%)",noBackdrop: true});}
+ }, function(obj)
+ {
+ if (!obj.error)
+ {
+ //console.log(obj.image);
+
+ var blob;
+
+ if ($rootScope.platformOS == 'desktop')
+ {
+
+ obj.image = obj.image.replace(/data:image\/gif;base64,/, '');
+ blob = base64toBlob(obj.image, "image/gif");
+ var f = NVRDataModel.getMonitorName(e.Event.MonitorId);
+ f = f + "-" + e.Event.Id + ".gif";
+ saveAs(blob, f);
+ $ionicLoading.hide();
+ }
+
+ else
+ {
+ NVRDataModel.debug("Saving blob to gallery...");
+ var album = "zmNinja";
+ cordova.plugins.photoLibrary.saveImage(obj.image, album,
+ function()
+ {
+ $ionicLoading.hide();
+ NVRDataModel.debug("Event saved");
+ },
+ function(err)
+ {
+ $ionicLoading.hide();
+ NVRDataModel.debug("Saving ERROR=" + err);
+ });
+
+ }
+
+ }
+ else
+ {
+ $ionicLoading.hide();
+ console.log("Error creating GIF");
+ }
+ });
+ },
+ function(err)
+ {
+ $ionicLoading.hide();
+ console.log("Error getting frames");
+ }
+
+ );
+ }
+
//--------------------------------------------------------------------------
// 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 +1045,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 +1063,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 +1099,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 +1123,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 +1168,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 +1179,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 +1207,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 +1218,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 +1247,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 +1258,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 +1288,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 +1301,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 +1325,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 +1334,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 +1409,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 +1426,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 +1459,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 +1480,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 +1527,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 +1600,7 @@ angular.module('zmApp.controllers')
{
src: $sce.trustAsResourceUrl(videoURL),
type: "video/mp4"
- }
+ }
],
@@ -1278,25 +1608,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 +1639,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 +1666,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 +1683,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 +1705,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 +1714,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 +1726,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 +1750,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 +1786,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 +1805,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 +1814,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 +1868,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 +1891,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 +1947,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 +1962,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 +1983,6 @@ angular.module('zmApp.controllers')
var ld = NVRDataModel.getLogin();
-
-
});
};
@@ -1632,10 +1991,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 +2006,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 +2021,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 +2044,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 +2074,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 +2095,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 +2123,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 +2146,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 +2155,14 @@ angular.module('zmApp.controllers')
});
}
- $scope.loadMore = function () {
+ $scope.loadMore = function()
+ {
loadMore();
};
- $scope.toggleMinAlarmFrameCount = function () {
-
+ $scope.toggleMinAlarmFrameCount = function()
+ {
var ld = NVRDataModel.getLogin();
@@ -1798,54 +2173,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 +2234,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 +2268,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..62609e5a 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,82 @@ 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.setPlayback(2);
+ 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 +207,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 +260,8 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
},
- data: {
+ data:
+ {
view: "request",
request: rqtoken,
connkey: connkey,
@@ -262,14 +271,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 +288,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 +301,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 +322,8 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
return foo;
},
- data: {
+ data:
+ {
view: "request",
request: "stream",
connkey: connkey,
@@ -319,17 +334,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 +355,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 +367,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 +376,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 +385,8 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
}
-
-
- function onPause() {
+ function onPause()
+ {
// $interval.cancel(modalIntervalHandle);
@@ -381,53 +396,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 +447,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 +459,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 +482,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 +544,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 +571,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 +605,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 +620,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 +642,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 +674,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 +704,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 +725,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 +738,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 +750,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 +762,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 +774,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 +845,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 +859,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 +891,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 +946,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 +959,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 +979,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 +995,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 +1013,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 +1037,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 +1090,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 +1101,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 +1114,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 +1135,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 +1144,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 +1249,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 +1279,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 +1288,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 +1297,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 +1316,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 +1326,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 +1349,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 +1374,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 +1412,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 +1435,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 +1486,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 +1496,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 +1532,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 +1567,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 +1608,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 +1647,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 +1654,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 +1673,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 +1751,28 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
$scope.ionRange.index = ($scope.mycarousel.index + 1).toString();
// console.log ("***IONRANGE RANGE CHANGED TO " + $scope.ionRange.index);
-
});
}
- function padToN(number, digits) {
+ function padToN(number, digits)
+ {
var i;
var stringMax = "";
var stringLeading = "";
- for (i = 1; i <= digits; i++) {
+ for (i = 1; i <= digits; i++)
+ {
stringMax = stringMax + "9";
if (i != digits) stringLeading = stringLeading + "0";
}
var numMax = parseInt(stringMax);
- if (number <= numMax) {
+ if (number <= numMax)
+ {
number = (stringLeading + number).slice(-digits);
}
//console.log ("PADTON: returning " + number);
return number;
}
-
-
}]);
diff --git a/www/js/EventServer.js b/www/js/EventServer.js
index 8ea63531..8ea89c4e 100644
--- a/www/js/EventServer.js
+++ b/www/js/EventServer.js
@@ -1,6 +1,5 @@
/* jshint -W041 */
-
/* jslint browser: true*/
/* global cordova,StatusBar,angular,console ,PushNotification*/
@@ -10,8 +9,8 @@
//--------------------------------------------------------------------------
angular.module('zmApp.controllers')
-.factory('EventServer', ['NVRDataModel', '$rootScope', '$websocket', '$ionicPopup', '$timeout', '$q', 'zm', '$ionicPlatform', '$cordovaMedia', '$translate', function
- (NVRDataModel, $rootScope, $websocket, $ionicPopup, $timeout, $q, zm, $ionicPlatform, $cordovaMedia, $translate) {
+ .factory('EventServer', ['NVRDataModel', '$rootScope', '$websocket', '$ionicPopup', '$timeout', '$q', 'zm', '$ionicPlatform', '$cordovaMedia', '$translate', function(NVRDataModel, $rootScope, $websocket, $ionicPopup, $timeout, $q, zm, $ionicPlatform, $cordovaMedia, $translate)
+ {
var lastEventServerCheck = Date.now();
var ws;
@@ -19,24 +18,27 @@ angular.module('zmApp.controllers')
var localNotificationId = 0;
var firstError = true;
-
//--------------------------------------------------------------------------
// called when the websocket is opened
//--------------------------------------------------------------------------
- function openHandshake() {
+ function openHandshake()
+ {
var loginData = NVRDataModel.getLogin();
- if (loginData.isUseEventServer == false || loginData.eventServer == "") {
+ if (loginData.isUseEventServer == false || loginData.eventServer == "")
+ {
NVRDataModel.log("openHandShake: no event server");
return;
}
NVRDataModel.log("openHandshake: Websocket open");
- ws.$emit('auth', {
+ ws.$emit('auth',
+ {
user: loginData.username,
password: loginData.password
});
- if ($rootScope.apnsToken != '') {
+ if ($rootScope.apnsToken != '')
+ {
var plat = $ionicPlatform.is('ios') ? 'ios' : 'android';
var ld = NVRDataModel.getLogin();
var pushstate = "enabled";
@@ -44,7 +46,8 @@ angular.module('zmApp.controllers')
pushstate = "disabled";
NVRDataModel.debug("openHandShake: state of push is " + pushstate);
- ws.$emit('push', {
+ ws.$emit('push',
+ {
type: 'token',
platform: plat,
token: $rootScope.apnsToken,
@@ -54,15 +57,12 @@ angular.module('zmApp.controllers')
}
-
-
//--------------------------------------------------------------------------
// Called once at app start. Does a lazy definition of websockets open
//--------------------------------------------------------------------------
- function init() {
-
-
-
+ function init()
+ {
+
$rootScope.isAlarm = 0;
$rootScope.alarmCount = "0";
@@ -72,7 +72,8 @@ angular.module('zmApp.controllers')
//console.log ("INIT GOT " + JSON.stringify(loginData));
- if (loginData.isUseEventServer == false || !loginData.eventServer) {
+ if (loginData.isUseEventServer == false || !loginData.eventServer)
+ {
NVRDataModel.log("No Event Server present. Not initializing");
d.reject("false");
return d.promise;
@@ -81,63 +82,65 @@ angular.module('zmApp.controllers')
//if (!$rootScope.apnsToken)
pushInit();
-
-
- if (typeof ws !== 'undefined') {
+ if (typeof ws !== 'undefined')
+ {
NVRDataModel.debug("Event server already initialized");
d.resolve("true");
return d.promise;
}
-
NVRDataModel.log("Initializing Websocket with URL " +
loginData.eventServer + " , will connect later...");
- ws = $websocket.$new({
+ ws = $websocket.$new(
+ {
url: loginData.eventServer,
reconnect: true,
reconnectInterval: 60000,
lazy: true
});
-
-
// Transmit auth information to server
ws.$on('$open', openHandshake);
- NVRDataModel.debug ("Setting up websocket error handler" );
- ws.$on('$error', function (e){
-
+ NVRDataModel.debug("Setting up websocket error handler");
+ ws.$on('$error', function(e)
+ {
+
// we don't need this check as I changed reconnect interval to 60s
//if ((Date.now() - lastEventServerCheck > 30000.0) || firstError)
if (1)
{
- NVRDataModel.debug ("Websocket Errorhandler called");
- $timeout( function(){
- NVRDataModel.displayBanner('error',['Event Server connection error']);
- },3000); // leave 3 seconds for transitions
+ NVRDataModel.debug("Websocket Errorhandler called");
+ $timeout(function()
+ {
+ NVRDataModel.displayBanner('error', ['Event Server connection error']);
+ }, 3000); // leave 3 seconds for transitions
firstError = false;
lastEventServerCheck = Date.now();
}
//console.log ("VALUE TIME " + lastEventServerCheck);
//console.log ("NOW TIME " + Date.now());
- });
+ });
- ws.$on('$close', function () {
+ ws.$on('$close', function()
+ {
NVRDataModel.log("Websocket closed");
});
// Handles responses back from ZM ES
- ws.$on('$message', function (str) {
+ ws.$on('$message', function(str)
+ {
NVRDataModel.log("Real-time event: " + JSON.stringify(str));
-
// Error messages
- if (str.status != 'Success') {
+ if (str.status != 'Success')
+ {
NVRDataModel.log("Event Error: " + JSON.stringify(str));
- if (str.reason == 'APNSDISABLED') {
+ if (str.reason == 'APNSDISABLED')
+ {
ws.$close();
NVRDataModel.displayBanner('error', ['Event Server: APNS disabled'], 2000, 6000);
$rootScope.apnsToken = "";
@@ -145,11 +148,14 @@ angular.module('zmApp.controllers')
}
- if (str.status == 'Success' && (str.event == 'auth')) {
+ if (str.status == 'Success' && (str.event == 'auth'))
+ {
if (str.version == undefined)
str.version = "0.1";
- if (NVRDataModel.versionCompare(str.version, zm.minEventServerVersion) == -1) {
- $rootScope.zmPopup = $ionicPopup.alert({
+ if (NVRDataModel.versionCompare(str.version, zm.minEventServerVersion) == -1)
+ {
+ $rootScope.zmPopup = $ionicPopup.alert(
+ {
title: $translate.instant('kEventServerVersionTitle'),
template: $translate.instant('kEventServerVersionBody1') + " " + str.version + ". " + $translate.instant('kEventServerVersionBody2') +
zm.minEventServerVersion
@@ -158,60 +164,69 @@ angular.module('zmApp.controllers')
}
-
-
-
if (str.status == 'Success' && str.event == 'alarm') // new events
{
var localNotText;
// ZMN specific hack for Event Server
- if (str.supplementary != 'true') {
+ if (str.supplementary != 'true')
+ {
new Audio('sounds/blop.mp3').play();
localNotText = "Latest Alarms: ";
$rootScope.isAlarm = 1;
// Show upto a max of 99 when it comes to display
// so aesthetics are maintained
- if ($rootScope.alarmCount == "99") {
+ if ($rootScope.alarmCount == "99")
+ {
$rootScope.alarmCount = "99+";
}
- if ($rootScope.alarmCount != "99+") {
+ if ($rootScope.alarmCount != "99+")
+ {
$rootScope.alarmCount = (parseInt($rootScope.alarmCount) + 1).toString();
}
- } else {
+ }
+ else
+ {
NVRDataModel.debug("received supplementary event information over websockets");
}
var eventsToDisplay = [];
var listOfMonitors = [];
- for (var iter = 0; iter < str.events.length; iter++) {
+ for (var iter = 0; iter < str.events.length; iter++)
+ {
// lets stack the display so they don't overwrite
eventsToDisplay.push(str.events[iter].Name + ": latest new alarm (" + str.events[iter].EventId + ")");
localNotText = localNotText + str.events[iter].Name + ",";
listOfMonitors.push(str.events[iter].MonitorId);
-
}
localNotText = localNotText.substring(0, localNotText.length - 1);
// if we are in background, do a local notification, else do an in app display
- if (!NVRDataModel.isBackground()) {
+ if (!NVRDataModel.isBackground())
+ {
//emit alarm details - this is when received over websockets
- $rootScope.$emit('alarm', {
+ $rootScope.$emit('alarm',
+ {
message: listOfMonitors
});
- if (str.supplementary != 'true') {
+ if (str.supplementary != 'true')
+ {
NVRDataModel.debug("App is in foreground, displaying banner");
- if (eventsToDisplay.length > 0) {
+ if (eventsToDisplay.length > 0)
+ {
- if (eventsToDisplay.length == 1) {
+ if (eventsToDisplay.length == 1)
+ {
//console.log("Single Display: " + eventsToDisplay[0]);
NVRDataModel.displayBanner('alarm', [eventsToDisplay[0]], 5000, 5000);
- } else {
+ }
+ else
+ {
NVRDataModel.displayBanner('alarm', eventsToDisplay,
5000, 5000 * eventsToDisplay.length);
}
@@ -220,21 +235,16 @@ angular.module('zmApp.controllers')
}
}
-
-
} //end of success handler
-
-
-
-
});
d.resolve("true");
return (d.promise);
}
- function disconnect() {
+ function disconnect()
+ {
NVRDataModel.log("Disconnecting and deleting Event Server socket...");
if (typeof ws === 'undefined')
@@ -256,28 +266,30 @@ angular.module('zmApp.controllers')
// you turn off ES and then we need sendMessage to
// let ZMES know not to send us messages
//--------------------------------------------------------------------------
- function sendMessage(type, obj, isForce) {
+ function sendMessage(type, obj, isForce)
+ {
var ld = NVRDataModel.getLogin();
- if (ld.isUseEventServer == false && isForce != 1) {
+ if (ld.isUseEventServer == false && isForce != 1)
+ {
NVRDataModel.debug("Not sending WSS message as event server is off");
return;
}
-
- if (typeof ws === 'undefined') {
+ if (typeof ws === 'undefined')
+ {
NVRDataModel.debug("Event server not initalized, not sending message");
return;
}
-
- if (ws.$status() == ws.$CLOSED) {
+ if (ws.$status() == ws.$CLOSED)
+ {
NVRDataModel.log("Websocket was closed, trying to re-open");
ws.$un('$open');
//ws.$on ('$open', openHandshake);
ws.$open();
-
- ws.$on('$open', openHandshake, function () {
+ ws.$on('$open', openHandshake, function()
+ {
//console.log(" sending " + type + " " +
// JSON.stringify(obj));
@@ -286,33 +298,35 @@ angular.module('zmApp.controllers')
ws.$un('$open');
ws.$on('$open', openHandshake);
-
});
-
- } else {
+ }
+ else
+ {
ws.$emit(type, obj);
//console.log("sending " + type + " " + JSON.stringify(obj));
}
-
-
}
//--------------------------------------------------------------------------
// Called each time we resume
//--------------------------------------------------------------------------
- function refresh() {
+ function refresh()
+ {
var loginData = NVRDataModel.getLogin();
- if ((!loginData.eventServer) || (loginData.isUseEventServer == false)) {
+ if ((!loginData.eventServer) || (loginData.isUseEventServer == false))
+ {
NVRDataModel.log("No Event Server configured, skipping refresh");
// Let's also make sure that if the socket was open
// we close it - this may happen if you disable it after using it
- if (typeof ws !== 'undefined') {
- if (ws.$status() != ws.$CLOSED) {
+ if (typeof ws !== 'undefined')
+ {
+ if (ws.$status() != ws.$CLOSED)
+ {
NVRDataModel.debug("Closing open websocket as event server was disabled");
ws.$close();
}
@@ -321,7 +335,8 @@ angular.module('zmApp.controllers')
return;
}
- if (typeof ws === 'undefined') {
+ if (typeof ws === 'undefined')
+ {
NVRDataModel.debug("Calling websocket init");
init();
}
@@ -333,16 +348,16 @@ angular.module('zmApp.controllers')
// c) The network died
// Seems to me in all cases we should give re-open a shot
-
- if (ws.$status() == ws.$CLOSED) {
+ if (ws.$status() == ws.$CLOSED)
+ {
NVRDataModel.log("Websocket was closed, trying to re-open");
ws.$open();
}
-
}
- function pushInit() {
+ function pushInit()
+ {
NVRDataModel.log(">>>Setting up push registration");
var push;
var mediasrc;
@@ -351,20 +366,20 @@ angular.module('zmApp.controllers')
var plat = $ionicPlatform.is('ios') ? 'ios' : 'android';
-
- if ($rootScope.platformOS == 'desktop') {
+ if ($rootScope.platformOS == 'desktop')
+ {
NVRDataModel.log("Desktop instance, not setting up push. Websockets only, I hope");
return;
}
-
-
- if (plat == 'ios') {
+ if (plat == 'ios')
+ {
mediasrc = "sounds/blop.mp3";
push = PushNotification.init(
{
- "ios": {
+ "ios":
+ {
"alert": true,
"badge": true,
"sound": ld.soundOnPush,
@@ -374,17 +389,17 @@ angular.module('zmApp.controllers')
);
- } else {
+ }
+ else
+ {
mediasrc = "/android_asset/www/sounds/blop.mp3";
var android_media_file = "blop";
-
-
-
push = PushNotification.init(
{
- "android": {
+ "android":
+ {
"senderID": zm.gcmSenderId,
"icon": "ic_stat_notification",
sound: ld.soundOnPush,
@@ -395,13 +410,13 @@ angular.module('zmApp.controllers')
);
-
}
// console.log("*********** MEDIA BLOG IS " + mediasrc);
media = $cordovaMedia.newMedia(mediasrc);
- push.on('registration', function (data) {
+ push.on('registration', function(data)
+ {
NVRDataModel.debug("Push Notification registration ID received: " + JSON.stringify(data));
$rootScope.apnsToken = data.registrationId;
@@ -411,29 +426,30 @@ angular.module('zmApp.controllers')
if (ld.disablePush == true)
pushstate = "disabled";
- sendMessage('push', {
+ sendMessage('push',
+ {
type: 'token',
platform: plat,
token: $rootScope.apnsToken,
state: pushstate
}, 1);
-
});
-
- push.on('notification', function (data) {
+ push.on('notification', function(data)
+ {
NVRDataModel.debug("received push notification");
var ld = NVRDataModel.getLogin();
- if (ld.isUseEventServer == false) {
+ if (ld.isUseEventServer == false)
+ {
NVRDataModel.debug("received push notification, but event server disabled. Not acting on it");
return;
}
-
- if (data.additionalData.foreground == false) {
+ if (data.additionalData.foreground == false)
+ {
// This means push notification tap in background
NVRDataModel.debug("*** PUSH NOTFN.>>>>" + JSON.stringify(data));
@@ -449,7 +465,8 @@ angular.module('zmApp.controllers')
// if Multiple mids, take the first one
var mi = mid.indexOf(',');
- if (mi > 0) {
+ if (mi > 0)
+ {
mid = mid.slice(0, mi);
}
mid = parseInt(mid);
@@ -457,23 +474,26 @@ angular.module('zmApp.controllers')
$rootScope.tappedMid = mid;
NVRDataModel.log("Push notification: Tapped Monitor taken as:" + $rootScope.tappedMid);
-
-
- if ($rootScope.platformOS == 'ios') {
-
+ if ($rootScope.platformOS == 'ios')
+ {
NVRDataModel.debug("iOS only: clearing background push");
- push.finish(function () {
+ push.finish(function()
+ {
NVRDataModel.debug("processing of push data is finished");
});
}
- } else {
+ }
+ else
+ {
// this flag honors the HW mute button. Go figure
// http://ilee.co.uk/phonegap-plays-sound-on-mute/
- if (ld.soundOnPush) {
- media.play({
+ if (ld.soundOnPush)
+ {
+ media.play(
+ {
playAudioWhenScreenIsLocked: false
});
}
@@ -482,25 +502,25 @@ angular.module('zmApp.controllers')
// console.log ("***STRING: " + str + " " +str.status);
var eventsToDisplay = [];
-
-
NVRDataModel.displayBanner('alarm', [str], 0, 5000 * eventsToDisplay.length);
-
$rootScope.isAlarm = 1;
// Show upto a max of 99 when it comes to display
// so aesthetics are maintained
- if ($rootScope.alarmCount == "99") {
+ if ($rootScope.alarmCount == "99")
+ {
$rootScope.alarmCount = "99+";
}
- if ($rootScope.alarmCount != "99+") {
+ if ($rootScope.alarmCount != "99+")
+ {
$rootScope.alarmCount = (parseInt($rootScope.alarmCount) + 1).toString();
}
}
});
- push.on('error', function (e) {
+ push.on('error', function(e)
+ {
NVRDataModel.debug("Push error: " + JSON.stringify(e));
// console.log("************* PUSH ERROR ******************");
});
@@ -515,5 +535,4 @@ angular.module('zmApp.controllers')
};
-
-}]); \ No newline at end of file
+ }]);
diff --git a/www/js/EventServerSettingsCtrl.js b/www/js/EventServerSettingsCtrl.js
index 7bee989d..064c785f 100644
--- a/www/js/EventServerSettingsCtrl.js
+++ b/www/js/EventServerSettingsCtrl.js
@@ -2,46 +2,51 @@
/* jslint browser: true*/
/* global cordova,StatusBar,angular,console */
- angular.module('zmApp.controllers').controller('zmApp.EventServerSettingsCtrl', ['$scope', '$ionicSideMenuDelegate', 'zm', '$stateParams', 'EventServer', '$ionicHistory', '$rootScope', '$state', 'message', 'NVRDataModel', '$ionicPlatform', '$ionicPopup', '$timeout', '$translate', function ($scope, $ionicSideMenuDelegate, zm, $stateParams, EventServer, $ionicHistory, $rootScope, $state, message, NVRDataModel, $ionicPlatform, $ionicPopup, $timeout, $translate) {
- $scope.openMenu = function () {
+ angular.module('zmApp.controllers').controller('zmApp.EventServerSettingsCtrl', ['$scope', '$ionicSideMenuDelegate', 'zm', '$stateParams', 'EventServer', '$ionicHistory', '$rootScope', '$state', 'message', 'NVRDataModel', '$ionicPlatform', '$ionicPopup', '$timeout', '$translate', function($scope, $ionicSideMenuDelegate, zm, $stateParams, EventServer, $ionicHistory, $rootScope, $state, message, NVRDataModel, $ionicPlatform, $ionicPopup, $timeout, $translate)
+ {
+ $scope.openMenu = function()
+ {
$ionicSideMenuDelegate.toggleLeft();
};
-
- $scope.openMenu = function () {
+ $scope.openMenu = function()
+ {
$ionicSideMenuDelegate.toggleLeft();
};
-
//----------------------------------------------------------------
// Alarm notification handling
//----------------------------------------------------------------
- $scope.handleAlarms = function () {
+ $scope.handleAlarms = function()
+ {
$rootScope.isAlarm = !$rootScope.isAlarm;
- if (!$rootScope.isAlarm) {
+ if (!$rootScope.isAlarm)
+ {
$rootScope.alarmCount = "0";
- $ionicHistory.nextViewOptions({
+ $ionicHistory.nextViewOptions(
+ {
disableBack: true
});
-
- $state.go("events", {
+ $state.go("events",
+ {
"id": 0,
- "playEvent":false
- }, {
+ "playEvent": false
+ },
+ {
reload: true
});
return;
}
};
-
// we need this to dynamically get title
// name as ion-view is set in stone and
// we don't get title till beforeEnter
// which is odd - I'd expect beforeEnter to load
// before View is loaded
- $scope.getTitle = function () {
+ $scope.getTitle = function()
+ {
return $scope.loginData.serverName;
};
@@ -49,38 +54,39 @@
// Save anyway when you exit
//----------------------------------------------------------------
- $scope.$on('$ionicView.beforeLeave', function () {
+ $scope.$on('$ionicView.beforeLeave', function()
+ {
saveItems();
-
});
-
- $scope.$on('$ionicView.beforeEnter', function () {
+ $scope.$on('$ionicView.beforeEnter', function()
+ {
$scope.loginData = NVRDataModel.getLogin();
//console.log ("Event server - before Enter, loginData is " + JSON.stringify($scope.loginData));
$scope.defScreen = $scope.loginData.onTapScreen;
- if ($scope.loginData.eventServer == "") {
+ if ($scope.loginData.eventServer == "")
+ {
$scope.loginData.eventServer = "wss://" + extractDomain($scope.loginData.url) + ":9000";
}
-
-
res = $scope.loginData.eventServerMonitors.split(",");
minterval = $scope.loginData.eventServerInterval.split(",");
+ for (var i = 0; i < $scope.monitors.length; i++)
+ {
- for (var i = 0; i < $scope.monitors.length; i++) {
-
-
- if (!isEnabled($scope.monitors[i].Monitor.Id)) {
+ if (!isEnabled($scope.monitors[i].Monitor.Id))
+ {
// if the filter list has IDs and this is not part of it, uncheck it
$scope.monitors[i].Monitor.isChecked = false;
//console.log("Marking false");
$scope.monitors[i].Monitor.reportingInterval = 0;
- } else {
+ }
+ else
+ {
// console.log("Marking true");
$scope.monitors[i].Monitor.isChecked = true;
$scope.monitors[i].Monitor.reportingInterval = getInterval($scope.monitors[i].Monitor.Id);
@@ -89,14 +95,12 @@
}
});
-
//--------------------------------------------------
// notification tap action
//--------------------------------------------------
-
-
- $scope.selectScreen = function () {
+ $scope.selectScreen = function()
+ {
var ld = NVRDataModel.getLogin();
@@ -104,62 +108,62 @@
selectedState: ld.onTapScreen
};
-
var options = '<ion-radio-fix ng-model="myopt.selectedState" ng-value="\'' + $translate.instant('kTapEvents') + '\'">' + $translate.instant('kTapEvents') + '</ion-radio-fix>';
options += '<ion-radio-fix ng-model="myopt.selectedState" ng-value="\'' + $translate.instant('kTapMontage') + '\'">' + $translate.instant('kTapMontage') + '</ion-radio-fix>';
options += '<ion-radio-fix ng-model="myopt.selectedState" ng-value="\'' + $translate.instant('kTapLiveMonitor') + '\'">' + $translate.instant('kTapLiveMonitor') + '</ion-radio-fix>';
-
-
- $rootScope.zmPopup = $ionicPopup.show({
+ $rootScope.zmPopup = $ionicPopup.show(
+ {
scope: $scope,
template: options,
-
title: 'View to navigate to:',
subTitle: 'currently set to: ' + ld.onTapScreen,
buttons: [
- {
- text: $translate.instant('kButtonCancel'),
-
+ {
+ text: $translate.instant('kButtonCancel'),
- },
+ },
+ {
+ text: $translate.instant('kButtonOk'),
+ onTap: function(e)
{
- text: $translate.instant('kButtonOk'),
- onTap: function (e) {
-
- ld.onTapScreen = $scope.myopt.selectedState;
- NVRDataModel.log("Setting new onTap State:" + ld.onTapScreen);
- NVRDataModel.setLogin(ld);
- $scope.defScreen = $scope.myopt.selectedState;
- $scope.loginData = ld;
+ ld.onTapScreen = $scope.myopt.selectedState;
+ NVRDataModel.log("Setting new onTap State:" + ld.onTapScreen);
+ NVRDataModel.setLogin(ld);
+ $scope.defScreen = $scope.myopt.selectedState;
+ $scope.loginData = ld;
- }
- }
- ]
+ }
+ }]
});
-
};
//----------------------------------------------------------------
// Accordion list show/hide
//----------------------------------------------------------------
- $scope.toggleGroup = function (group) {
- if ($scope.isGroupShown(group)) {
+ $scope.toggleGroup = function(group)
+ {
+ if ($scope.isGroupShown(group))
+ {
$scope.shownGroup = null;
- } else {
+ }
+ else
+ {
$scope.shownGroup = group;
}
};
- $scope.isGroupShown = function (group) {
+ $scope.isGroupShown = function(group)
+ {
return $scope.shownGroup === group;
};
- $scope.saveItems = function () {
+ $scope.saveItems = function()
+ {
saveItems();
};
@@ -167,16 +171,20 @@
// Saves ES data
//----------------------------------------------------------------
- function saveItems() {
+ function saveItems()
+ {
NVRDataModel.debug("Saving Event Server data");
var monstring = "";
var intervalstring = "";
var plat = $ionicPlatform.is('ios') ? 'ios' : 'android';
- for (var i = 0; i < $scope.monitors.length; i++) {
- if (isNaN($scope.monitors[i].Monitor.reportingInterval)) {
+ for (var i = 0; i < $scope.monitors.length; i++)
+ {
+ if (isNaN($scope.monitors[i].Monitor.reportingInterval))
+ {
$scope.monitors[i].Monitor.reportingInterval = 0;
}
- if ($scope.monitors[i].Monitor.isChecked) {
+ if ($scope.monitors[i].Monitor.isChecked)
+ {
monstring = monstring + $scope.monitors[i].Monitor.Id + ",";
var tint = parseInt($scope.monitors[i].Monitor.reportingInterval);
if (isNaN(tint)) tint = 0;
@@ -194,7 +202,6 @@
$scope.loginData.eventServerMonitors = monstring;
$scope.loginData.eventServerInterval = intervalstring;
-
//console.log ("SAVED: " + JSON.stringify($scope.loginData));
NVRDataModel.setLogin($scope.loginData);
@@ -202,12 +209,15 @@
if ($scope.loginData.disablePush == true || $scope.loginData.isUseEventServer == false)
pushstate = "disabled";
- if ($scope.loginData.isUseEventServer == true) {
+ if ($scope.loginData.isUseEventServer == true)
+ {
EventServer.init()
- .then(function (data) {
+ .then(function(data)
+ {
// console.log("Sending control filter");
NVRDataModel.debug("Sending Control message 'filter' with monlist=" + monstring + " and interval=" + intervalstring);
- EventServer.sendMessage("control", {
+ EventServer.sendMessage("control",
+ {
type: 'filter',
monlist: monstring,
intlist: intervalstring
@@ -220,7 +230,8 @@
{
// we need to disable the token
NVRDataModel.debug("Sending token state " + pushstate);
- EventServer.sendMessage('push', {
+ EventServer.sendMessage('push',
+ {
type: 'token',
platform: plat,
token: $rootScope.apnsToken,
@@ -229,12 +240,11 @@
}
-
});
-
-
- } else {
+ }
+ else
+ {
if ($rootScope.apnsToken != "")
// if its defined then this is post init work
// so lets transmit state here
@@ -242,7 +252,8 @@
{
// we need to disable the token
NVRDataModel.debug("Sending token state " + pushstate);
- EventServer.sendMessage('push', {
+ EventServer.sendMessage('push',
+ {
type: 'token',
platform: plat,
token: $rootScope.apnsToken,
@@ -254,11 +265,8 @@
EventServer.disconnect();
-
}
-
-
NVRDataModel.displayBanner('info', ['settings saved']);
}
@@ -266,12 +274,16 @@
// returns domain name in string -
// http://stackoverflow.com/questions/8498592/extract-root-domain-name-from-string
//----------------------------------------------------------------
- function extractDomain(url) {
+ function extractDomain(url)
+ {
var domain;
//find & remove protocol (http, ftp, etc.) and get domain
- if (url.indexOf("://") > -1) {
+ if (url.indexOf("://") > -1)
+ {
domain = url.split('/')[2];
- } else {
+ }
+ else
+ {
domain = url.split('/')[0];
}
@@ -281,18 +293,20 @@
return domain;
}
-
//----------------------------------------------------------------
// returns reporting interval for monitor ID
//----------------------------------------------------------------
- function getInterval(id) {
+ function getInterval(id)
+ {
// means no interval, should only happen one time
// till we save
if ($scope.loginData.eventServerInterval == "")
return 0;
var retval = 0;
- for (var i = 0; i < res.length; i++) {
- if (res[i] == id) {
+ for (var i = 0; i < res.length; i++)
+ {
+ if (res[i] == id)
+ {
retval = parseInt(minterval[i]);
break;
}
@@ -303,13 +317,16 @@
//----------------------------------------------------------------
// Returns true/false if monitor ID is in event monitor list
//----------------------------------------------------------------
- function isEnabled(id) {
+ function isEnabled(id)
+ {
if ($scope.loginData.eventServerMonitors == "")
return true;
var isThere = false;
- for (var i = 0; i < res.length; i++) {
- if (res[i] == id) {
+ for (var i = 0; i < res.length; i++)
+ {
+ if (res[i] == id)
+ {
isThere = true;
//console.log("isRes found: " + id);
break;
@@ -325,11 +342,4 @@
$scope.monitors = message;
var res, minterval;
-
-
-
-
-
-
-
-}]); \ No newline at end of file
+ }]);
diff --git a/www/js/EventsGraphsCtrl.js b/www/js/EventsGraphsCtrl.js
index 19d963ea..5f21b09b 100644
--- a/www/js/EventsGraphsCtrl.js
+++ b/www/js/EventsGraphsCtrl.js
@@ -8,31 +8,38 @@
// the main function is generateChart. I call generate chart with required parameters
// from the template file
-angular.module('zmApp.controllers').controller('zmApp.EventsGraphsCtrl', ['$ionicPlatform', '$scope', 'zm', 'NVRDataModel', '$ionicSideMenuDelegate', '$rootScope', '$http', '$ionicHistory', '$state', function ($ionicPlatform, $scope, zm, NVRDataModel, $ionicSideMenuDelegate, $rootScope, $http, $ionicHistory, $state) {
+angular.module('zmApp.controllers').controller('zmApp.EventsGraphsCtrl', ['$ionicPlatform', '$scope', 'zm', 'NVRDataModel', '$ionicSideMenuDelegate', '$rootScope', '$http', '$ionicHistory', '$state', function($ionicPlatform, $scope, zm, NVRDataModel, $ionicSideMenuDelegate, $rootScope, $http, $ionicHistory, $state)
+{
//console.log("Inside Graphs controller");
- $scope.openMenu = function () {
+ $scope.openMenu = function()
+ {
$ionicSideMenuDelegate.toggleLeft();
};
- $scope.$on('$ionicView.loaded', function () {
+ $scope.$on('$ionicView.loaded', function()
+ {
// console.log("**VIEW ** Graph Ctrl Loaded");
});
-
//----------------------------------------------------------------
// Alarm notification handling
//----------------------------------------------------------------
- $scope.handleAlarms = function () {
+ $scope.handleAlarms = function()
+ {
$rootScope.isAlarm = !$rootScope.isAlarm;
- if (!$rootScope.isAlarm) {
+ if (!$rootScope.isAlarm)
+ {
$rootScope.alarmCount = "0";
- $ionicHistory.nextViewOptions({
+ $ionicHistory.nextViewOptions(
+ {
disableBack: true
});
- $state.go("events", {
+ $state.go("events",
+ {
"id": 0,
- "playEvent":false
- }, {
+ "playEvent": false
+ },
+ {
reload: true
});
return;
@@ -46,20 +53,22 @@ angular.module('zmApp.controllers').controller('zmApp.EventsGraphsCtrl', ['$ioni
// reset power state on exit as if it is called after we enter another
// state, that effectively overwrites current view power management needs
//------------------------------------------------------------------------
- $scope.$on('$ionicView.enter', function () {
+ $scope.$on('$ionicView.enter', function()
+ {
// console.log("**VIEW ** EventsGraphs Ctrl Entered");
NVRDataModel.setAwake(false);
});
- $scope.$on('$ionicView.leave', function () {
+ $scope.$on('$ionicView.leave', function()
+ {
// console.log("**VIEW ** Graph Ctrl Left");
});
- $scope.$on('$ionicView.unloaded', function () {
+ $scope.$on('$ionicView.unloaded', function()
+ {
// console.log("**VIEW ** Graph Ctrl Unloaded");
});
-
//-------------------------------------------------
// Controller main
//-------------------------------------------------
@@ -67,56 +76,57 @@ angular.module('zmApp.controllers').controller('zmApp.EventsGraphsCtrl', ['$ioni
// $scope.chart = "";
$scope.navTitle = 'Tab Page';
// $scope.chart="";
- $scope.leftButtons = [{
+ $scope.leftButtons = [
+ {
type: 'button-icon icon ion-navicon',
- tap: function (e) {
+ tap: function(e)
+ {
$scope.toggleMenu();
}
- }];
-
+ }];
var container = angular.element(document.getElementById('visualization'));
//console.log(JSON.stringify(container));
var data = [
- {
- id: 1,
- content: 'item 1',
- start: '2013-04-20'
- },
- {
- id: 2,
- content: 'item 2',
- start: '2013-04-14'
- },
- {
- id: 3,
- content: 'item 3',
- start: '2013-04-18'
- },
- {
- id: 4,
- content: 'item 4',
- start: '2013-04-16',
- end: '2013-04-19'
- },
- {
- id: 5,
- content: 'item 5',
- start: '2013-04-25'
- },
- {
- id: 6,
- content: 'item 6',
- start: '2013-04-27'
- }
- ];
+ {
+ id: 1,
+ content: 'item 1',
+ start: '2013-04-20'
+ },
+ {
+ id: 2,
+ content: 'item 2',
+ start: '2013-04-14'
+ },
+ {
+ id: 3,
+ content: 'item 3',
+ start: '2013-04-18'
+ },
+ {
+ id: 4,
+ content: 'item 4',
+ start: '2013-04-16',
+ end: '2013-04-19'
+ },
+ {
+ id: 5,
+ content: 'item 5',
+ start: '2013-04-25'
+ },
+ {
+ id: 6,
+ content: 'item 6',
+ start: '2013-04-27'
+ }];
var options = {};
//var timeline = new vis.Timeline(container[0], data, options);
// -------------------------------------------------
// Called when user taps on a bar
//---------------------------------------------------
- $scope.handleChartClick = function (event) {
+ $scope.handleChartClick = function(event)
+ {
//console.log(JSON.stringify($scope.chartwithbars.getBarsAtEvent(event)));
//console.log(angular.element[0].getContext('2d'));
@@ -127,7 +137,8 @@ angular.module('zmApp.controllers').controller('zmApp.EventsGraphsCtrl', ['$ioni
//-------------------------------------------------
// Generates a bar graph with data provided
//-------------------------------------------------
- $scope.generateTCChart = function (id, chartTitle, hrs) {
+ $scope.generateTCChart = function(id, chartTitle, hrs)
+ {
var monitors = [];
var dateRange = "";
var startDate = "";
@@ -140,11 +151,10 @@ angular.module('zmApp.controllers').controller('zmApp.EventsGraphsCtrl', ['$ioni
};
-
$scope.chart.barHeight = $rootScope.devHeight;
-
- if (hrs) {
+ if (hrs)
+ {
// Apply a time based filter if I am not watching all events
var cur = moment();
endDate = cur.format("YYYY-MM-DD " + NVRDataModel.getTimeFormat());
@@ -159,27 +169,30 @@ angular.module('zmApp.controllers').controller('zmApp.EventsGraphsCtrl', ['$ioni
$scope.chart.data = {
labels: [],
datasets: [
- {
- label: '',
- fillColor: zm.graphFillColor,
- strokeColor: zm.graphStrokeColor,
- highlightFill: zm.graphHighlightFill,
- data: []
- },
- ]
+ {
+ label: '',
+ fillColor: zm.graphFillColor,
+ strokeColor: zm.graphStrokeColor,
+ highlightFill: zm.graphHighlightFill,
+ data: []
+ }, ]
};
- NVRDataModel.getMonitors(0).then(function (data) {
+ NVRDataModel.getMonitors(0).then(function(data)
+ {
monitors = data;
var adjustedHeight = monitors.length * 30;
- if (adjustedHeight > $rootScope.devHeight) {
+ if (adjustedHeight > $rootScope.devHeight)
+ {
$scope.chart.barHeight = adjustedHeight;
//console.log("********* BAR HEIGHT TO " + $scope.chart.barHeight);
}
- for (var i = 0; i < monitors.length; i++) {
- (function (j) { // loop closure - http is async, so success returns after i goes out of scope
+ for (var i = 0; i < monitors.length; i++)
+ {
+ (function(j)
+ { // loop closure - http is async, so success returns after i goes out of scope
// so we need to bind j to i when http returns so its not out of scope. Gak.
// I much prefer the old days of passing context data from request to response
@@ -189,7 +202,8 @@ angular.module('zmApp.controllers').controller('zmApp.EventsGraphsCtrl', ['$ioni
// $scope.chartObject.data[j+1]=([monitors[j].Monitor.Name,'100','color:#76A7FA','0']);
var dateString = "";
- if (hrs) {
+ if (hrs)
+ {
dateString = "/StartTime >=:" + startDate + "/EndTime <=:" + endDate;
}
var url = loginData.apiurl +
@@ -198,12 +212,14 @@ angular.module('zmApp.controllers').controller('zmApp.EventsGraphsCtrl', ['$ioni
// console.log("Monitor event URL:" + url);
NVRDataModel.log("EventGraph: composed url is " + url);
$http.get(url /*,{timeout:15000}*/ )
- .success(function (data) {
+ .success(function(data)
+ {
NVRDataModel.debug("Event count for monitor" +
monitors[j].Monitor.Id + " is " + data.pagination.count);
$scope.chart.data.datasets[0].data[j] = data.pagination.count;
})
- .error(function (data) {
+ .error(function(data)
+ {
// ideally I should be treating it as an error
// but what I am really doing now is treating it like no events
// works but TBD: make this into a proper error handler
@@ -231,4 +247,4 @@ angular.module('zmApp.controllers').controller('zmApp.EventsGraphsCtrl', ['$ioni
// legendTemplate : '<ul class="tc-chart-js-legend"><% for (var i=0; i<datasets.length; i++){%><li><span style="background-color:<%=datasets[i].fillColor%>"></span><%if(datasets[i].label){%><%=datasets[i].label%><%}%></li><%}%></ul>'
};
}; //generateTCChart
-}]); \ No newline at end of file
+}]);
diff --git a/www/js/EventsModalGraphCtrl.js b/www/js/EventsModalGraphCtrl.js
index 0874e4f7..fc9a9c42 100644
--- a/www/js/EventsModalGraphCtrl.js
+++ b/www/js/EventsModalGraphCtrl.js
@@ -3,13 +3,8 @@
/* jslint browser: true*/
/* global saveAs, cordova,StatusBar,angular,console,ionic, moment, vis , Chart, DJS*/
-
-
-
-angular.module('zmApp.controllers').controller('EventsModalGraphCtrl', ['$scope', '$rootScope', 'zm', 'NVRDataModel', '$ionicSideMenuDelegate', '$timeout', '$interval', '$ionicModal', '$ionicLoading', '$http', '$state', '$stateParams', '$ionicHistory', '$ionicScrollDelegate', '$q', '$sce', 'carouselUtils', '$ionicPopup', '$translate', function ($scope, $rootScope, zm, NVRDataModel, $ionicSideMenuDelegate, $timeout, $interval, $ionicModal, $ionicLoading, $http, $state, $stateParams, $ionicHistory, $ionicScrollDelegate, $q, $sce, carouselUtils, $ionicPopup, $translate) {
-
-
-
+angular.module('zmApp.controllers').controller('EventsModalGraphCtrl', ['$scope', '$rootScope', 'zm', 'NVRDataModel', '$ionicSideMenuDelegate', '$timeout', '$interval', '$ionicModal', '$ionicLoading', '$http', '$state', '$stateParams', '$ionicHistory', '$ionicScrollDelegate', '$q', '$sce', 'carouselUtils', '$ionicPopup', '$translate', function($scope, $rootScope, zm, NVRDataModel, $ionicSideMenuDelegate, $timeout, $interval, $ionicModal, $ionicLoading, $http, $state, $stateParams, $ionicHistory, $ionicScrollDelegate, $q, $sce, carouselUtils, $ionicPopup, $translate)
+{
var Graph2d;
var tcGraph;
@@ -26,52 +21,50 @@ angular.module('zmApp.controllers').controller('EventsModalGraphCtrl', ['$scope'
var btype;
var data, options;
-
-
-
-
-
- $scope.$on('modal.shown', function (e, m) {
+ $scope.$on('modal.shown', function(e, m)
+ {
if (m.id != 'modalgraph')
return;
-
//console.log ("INSIDE MODAL GRAPH>>>>>>>>>>>>>>>>>");
data = {
labels: ["January", "February", "March", "April", "May", "June", "July"],
datasets: [
- {
- label: "My First dataset",
- fillColor: "rgba(220,220,220,0.5)",
- strokeColor: "rgba(220,220,220,0.8)",
- highlightFill: "rgba(220,220,220,0.75)",
- highlightStroke: "rgba(220,220,220,1)",
- data: [65, 59, 80, 81, 56, 55, 40]
- },
- {
- label: "My Second dataset",
- fillColor: "rgba(151,187,205,0.5)",
- strokeColor: "rgba(151,187,205,0.8)",
- highlightFill: "rgba(151,187,205,0.75)",
- highlightStroke: "rgba(151,187,205,1)",
- data: [28, 48, 40, 19, 86, 27, 90]
- }
- ]
+ {
+ label: "My First dataset",
+ fillColor: "rgba(220,220,220,0.5)",
+ strokeColor: "rgba(220,220,220,0.8)",
+ highlightFill: "rgba(220,220,220,0.75)",
+ highlightStroke: "rgba(220,220,220,1)",
+ data: [65, 59, 80, 81, 56, 55, 40]
+ },
+ {
+ label: "My Second dataset",
+ fillColor: "rgba(151,187,205,0.5)",
+ strokeColor: "rgba(151,187,205,0.8)",
+ highlightFill: "rgba(151,187,205,0.75)",
+ highlightStroke: "rgba(151,187,205,1)",
+ data: [28, 48, 40, 19, 86, 27, 90]
+ }]
};
options = {
- scales: {
- yAxes: [{
- ticks: {
+ scales:
+ {
+ yAxes: [
+ {
+ ticks:
+ {
// beginAtZero:true,
min: -1,
},
- }],
- xAxes: [{
+ }],
+ xAxes: [
+ {
display: false
- }]
+ }]
},
responsive: true,
@@ -80,10 +73,11 @@ angular.module('zmApp.controllers').controller('EventsModalGraphCtrl', ['$scope'
scaleGridLineColor: "rgba(0,0,0,.05)",
scaleGridLineWidth: 1,
-
- hover: {
+ hover:
+ {
mode: 'single',
- onHover: function (obj) {
+ onHover: function(obj)
+ {
if (obj.length > 0)
tapOrHover(obj[0]._index);
}
@@ -95,8 +89,10 @@ angular.module('zmApp.controllers').controller('EventsModalGraphCtrl', ['$scope'
cv = document.getElementById("eventchart");
ctx = cv.getContext("2d");
- $timeout(function () {
- var tcGraph2 = new Chart(ctx, {
+ $timeout(function()
+ {
+ var tcGraph2 = new Chart(ctx,
+ {
type: 'bar',
data: data,
options: options
@@ -108,24 +104,20 @@ angular.module('zmApp.controllers').controller('EventsModalGraphCtrl', ['$scope'
// we use this to reload the connkey if authkey changed
//------------------------------------------------------
-
- $rootScope.$on("auth-success", function () {
+ $rootScope.$on("auth-success", function()
+ {
NVRDataModel.debug("EventModalCtrl: Re-login detected, resetting everything & re-generating connkey");
-
});
-
-
-
-
//-------------------------------------------------------
// I was kidding, this is where it really is drawn
// scout's promise
//------------------------------------------------------
- function drawGraphTC(event) {
+ function drawGraphTC(event)
+ {
$scope.eid = event.event.Event.Id;
@@ -155,7 +147,6 @@ angular.module('zmApp.controllers').controller('EventsModalGraphCtrl', ['$scope'
]
};*/
-
data = {
labels: [],
datasets: [
@@ -176,9 +167,9 @@ angular.module('zmApp.controllers').controller('EventsModalGraphCtrl', ['$scope'
data: [],
frames: []
- },
+ },
- ]
+ ]
};
onlyalarm_data = {
@@ -192,24 +183,28 @@ angular.module('zmApp.controllers').controller('EventsModalGraphCtrl', ['$scope'
hoverBorderColor: 'rgba(248, 148, 6,1.0)',
data: [],
frames: []
- },
+ },
- ]
+ ]
};
// Chart.js Options
options = {
- scales: {
- yAxes: [{
- ticks: {
+ scales:
+ {
+ yAxes: [
+ {
+ ticks:
+ {
// beginAtZero:true,
min: -1,
},
- }],
- xAxes: [{
+ }],
+ xAxes: [
+ {
display: false
- }]
+ }]
},
responsive: true,
@@ -218,10 +213,11 @@ angular.module('zmApp.controllers').controller('EventsModalGraphCtrl', ['$scope'
scaleGridLineColor: "rgba(0,0,0,.05)",
scaleGridLineWidth: 1,
-
- hover: {
+ hover:
+ {
mode: 'single',
- onHover: function (obj) {
+ onHover: function(obj)
+ {
if (obj.length > 0)
tapOrHover(obj[0]._index);
}
@@ -237,13 +233,14 @@ angular.module('zmApp.controllers').controller('EventsModalGraphCtrl', ['$scope'
// NVRDataModel.log ("Changing graph width to " + $scope.graphWidth);
- for (var i = 0; i < event.event.Frame.length; i++) {
-
+ for (var i = 0; i < event.event.Frame.length; i++)
+ {
data.labels.push(event.event.Frame[i].TimeStamp);
//data.labels.push(' ');
data.datasets[0].data.push(event.event.Frame[i].Score);
- data.datasets[0].frames.push({
+ data.datasets[0].frames.push(
+ {
x: event.event.Frame[i].TimeStamp,
y: event.event.Frame[i].Score,
eid: event.event.Event.Id,
@@ -255,12 +252,14 @@ angular.module('zmApp.controllers').controller('EventsModalGraphCtrl', ['$scope'
});
- if (event.event.Frame[i].Type == "Alarm") {
+ if (event.event.Frame[i].Type == "Alarm")
+ {
onlyalarm_data.labels.push(event.event.Frame[i].TimeStamp);
//data.labels.push(' ');
onlyalarm_data.datasets[0].data.push(event.event.Frame[i].Score);
- onlyalarm_data.datasets[0].frames.push({
+ onlyalarm_data.datasets[0].frames.push(
+ {
x: event.event.Frame[i].TimeStamp,
y: event.event.Frame[i].Score,
eid: event.event.Event.Id,
@@ -280,39 +279,48 @@ angular.module('zmApp.controllers').controller('EventsModalGraphCtrl', ['$scope'
cv = document.getElementById("tcchart");
ctx = cv.getContext("2d");
- if (NVRDataModel.getLogin().timelineModalGraphType == 'all') {
+ if (NVRDataModel.getLogin().timelineModalGraphType == 'all')
+ {
btype = 'line';
current_data = data;
- } else {
+ }
+ else
+ {
btype = 'bar';
current_data = onlyalarm_data;
}
- $timeout(function () {
- tcGraph = new Chart(ctx, {
+ $timeout(function()
+ {
+ tcGraph = new Chart(ctx,
+ {
type: btype,
data: current_data,
options: options
});
});
- cv.onclick = function (e) {
+ cv.onclick = function(e)
+ {
var b = tcGraph.getElementAtEvent(e);
- if (b.length > 0) {
+ if (b.length > 0)
+ {
tapOrHover(b[0]._index);
}
};
}
- function tapOrHover(ndx) {
-
- $timeout(function () {
+ function tapOrHover(ndx)
+ {
+ $timeout(function()
+ {
//console.log ("You tapped " + ndx);
$scope.alarm_images = [];
$scope.playbackURL = NVRDataModel.getLogin().url;
var items = current_data.datasets[0].frames[ndx];
- $scope.alarm_images.push({
+ $scope.alarm_images.push(
+ {
relativePath: items.relativePath,
fid: items.fid,
fname: items.fname,
@@ -324,13 +332,12 @@ angular.module('zmApp.controllers').controller('EventsModalGraphCtrl', ['$scope'
}
-
-
//--------------------------------------------------------
// utility function
//--------------------------------------------------------
- function computeRelativePath(event) {
+ function computeRelativePath(event)
+ {
var relativePath = "";
var loginData = NVRDataModel.getLogin();
var str = event.Event.StartTime;
@@ -355,7 +362,8 @@ angular.module('zmApp.controllers').controller('EventsModalGraphCtrl', ['$scope'
// utility function
//--------------------------------------------------------
- function computeBasePath(event) {
+ function computeBasePath(event)
+ {
var basePath = "";
var loginData = NVRDataModel.getLogin();
var str = event.Event.StartTime;
@@ -377,26 +385,25 @@ angular.module('zmApp.controllers').controller('EventsModalGraphCtrl', ['$scope'
return basePath;
}
-
-
- function padToN(number, digits) {
+ function padToN(number, digits)
+ {
var i;
var stringMax = "";
var stringLeading = "";
- for (i = 1; i <= digits; i++) {
+ for (i = 1; i <= digits; i++)
+ {
stringMax = stringMax + "9";
if (i != digits) stringLeading = stringLeading + "0";
}
var numMax = parseInt(stringMax);
- if (number <= numMax) {
+ if (number <= numMax)
+ {
number = (stringLeading + number).slice(-digits);
}
//console.log ("PADTON: returning " + number);
return number;
}
-
-
-}]); \ No newline at end of file
+}]);
diff --git a/www/js/FirstUseCtrl.js b/www/js/FirstUseCtrl.js
index 8df81f82..e5692188 100644
--- a/www/js/FirstUseCtrl.js
+++ b/www/js/FirstUseCtrl.js
@@ -2,74 +2,79 @@
/* jslint browser: true*/
/* global cordova,StatusBar,angular,console */
-angular.module('zmApp.controllers').controller('zmApp.FirstUseCtrl', ['$scope', '$ionicSideMenuDelegate', 'zm', '$stateParams', '$ionicHistory', '$state', 'NVRDataModel', '$rootScope', '$ionicPopup', '$translate', function ($scope, $ionicSideMenuDelegate, zm, $stateParams, $ionicHistory, $state, NVRDataModel, $rootScope, $ionicPopup, $translate) {
- $scope.openMenu = function () {
+angular.module('zmApp.controllers').controller('zmApp.FirstUseCtrl', ['$scope', '$ionicSideMenuDelegate', 'zm', '$stateParams', '$ionicHistory', '$state', 'NVRDataModel', '$rootScope', '$ionicPopup', '$translate', function($scope, $ionicSideMenuDelegate, zm, $stateParams, $ionicHistory, $state, NVRDataModel, $rootScope, $ionicPopup, $translate)
+{
+ $scope.openMenu = function()
+ {
$ionicSideMenuDelegate.toggleLeft();
};
-
-
//-------------------------------------------------------------------------
// Controller Main
//------------------------------------------------------------------------
- $scope.$on('$ionicView.enter', function () {
+ $scope.$on('$ionicView.enter', function()
+ {
//console.log("**VIEW ** FirstUse Ctrl Entered");
$ionicSideMenuDelegate.canDragContent(true);
-
});
- $scope.switchLang = function () {
+ $scope.switchLang = function()
+ {
$scope.lang = NVRDataModel.getLanguages();
$scope.myopt = {
lang: ""
};
- $rootScope.zmPopup = $ionicPopup.show({
+ $rootScope.zmPopup = $ionicPopup.show(
+ {
scope: $scope,
template: '<ion-radio-fix ng-repeat="item in lang" ng-value="item.value" ng-model="myopt.lang"> {{item.text}} </ion-radio-fix>',
-
title: $translate.instant('kSelectLanguage'),
buttons: [
+ {
+ text: $translate.instant('kButtonCancel'),
+ onTap: function(e)
{
- text: $translate.instant('kButtonCancel'),
- onTap: function (e) {
- //return "CANCEL";
- }
+ //return "CANCEL";
+ }
- },
+ },
+ {
+ text: $translate.instant('kButtonOk'),
+ onTap: function(e)
{
- text: $translate.instant('kButtonOk'),
- onTap: function (e) {
- NVRDataModel.log("Language selected:" + $scope.myopt.lang);
- NVRDataModel.setDefaultLanguage($scope.myopt.lang, true);
+ NVRDataModel.log("Language selected:" + $scope.myopt.lang);
+ NVRDataModel.setDefaultLanguage($scope.myopt.lang, true);
+ //return "OK";
- //return "OK";
-
- }
- }
- ]
+ }
+ }]
});
-
};
- $scope.goToLogin = function () {
- $ionicHistory.nextViewOptions({
+ $scope.goToLogin = function()
+ {
+ $ionicHistory.nextViewOptions(
+ {
disableAnimate: false,
disableBack: true
});
- $state.go("login", {
+ $state.go("login",
+ {
"wizard": false
});
return;
};
- $scope.goToWizard = function () {
- $ionicHistory.nextViewOptions({
+ $scope.goToWizard = function()
+ {
+ $ionicHistory.nextViewOptions(
+ {
disableAnimate: false,
disableBack: true
});
@@ -77,6 +82,4 @@ angular.module('zmApp.controllers').controller('zmApp.FirstUseCtrl', ['$scope',
return;
};
-
-
-}]); \ No newline at end of file
+}]);
diff --git a/www/js/HelpCtrl.js b/www/js/HelpCtrl.js
index ce4ec761..51da877b 100644
--- a/www/js/HelpCtrl.js
+++ b/www/js/HelpCtrl.js
@@ -2,26 +2,32 @@
/* jslint browser: true*/
/* global cordova,StatusBar,angular,console, Masonry */
-angular.module('zmApp.controllers').controller('zmApp.HelpCtrl', ['$scope', '$rootScope', '$ionicModal', 'NVRDataModel', '$ionicSideMenuDelegate', '$ionicHistory', '$state', '$translate', '$q', '$templateRequest', '$sce', '$compile', function ($scope, $rootScope, $ionicModal, NVRDataModel, $ionicSideMenuDelegate, $ionicHistory, $state, $translate, $q, $templateRequest, $sce, $compile) {
- $scope.openMenu = function () {
+angular.module('zmApp.controllers').controller('zmApp.HelpCtrl', ['$scope', '$rootScope', '$ionicModal', 'NVRDataModel', '$ionicSideMenuDelegate', '$ionicHistory', '$state', '$translate', '$q', '$templateRequest', '$sce', '$compile', function($scope, $rootScope, $ionicModal, NVRDataModel, $ionicSideMenuDelegate, $ionicHistory, $state, $translate, $q, $templateRequest, $sce, $compile)
+{
+ $scope.openMenu = function()
+ {
$ionicSideMenuDelegate.toggleLeft();
};
-
//----------------------------------------------------------------
// Alarm notification handling
//----------------------------------------------------------------
- $scope.handleAlarms = function () {
+ $scope.handleAlarms = function()
+ {
$rootScope.isAlarm = !$rootScope.isAlarm;
- if (!$rootScope.isAlarm) {
+ if (!$rootScope.isAlarm)
+ {
$rootScope.alarmCount = "0";
- $ionicHistory.nextViewOptions({
+ $ionicHistory.nextViewOptions(
+ {
disableBack: true
});
- $state.go("events", {
+ $state.go("events",
+ {
"id": 0,
- "playEvent":false
- }, {
+ "playEvent": false
+ },
+ {
reload: true
});
return;
@@ -33,7 +39,8 @@ angular.module('zmApp.controllers').controller('zmApp.HelpCtrl', ['$scope', '$ro
// based on selected language
//----------------------------------------------------------------
- function insertHelp() {
+ function insertHelp()
+ {
var l = NVRDataModel.getDefaultLanguage() || 'en';
var lang = "lang/help/help-" + l + ".html";
@@ -43,25 +50,27 @@ angular.module('zmApp.controllers').controller('zmApp.HelpCtrl', ['$scope', '$ro
var templateUrlFB = $sce.getTrustedResourceUrl(lang_fb);
$templateRequest(lang)
- .then(function (template) {
+ .then(function(template)
+ {
var elem = angular.element(document.getElementById('insertHelp'));
$compile(elem.html(template).contents())($scope);
},
- function (error) {
+ function(error)
+ {
NVRDataModel.log("Language file " + lang + " not found, falling back");
$templateRequest(templateUrlFB)
- .then(function (template) {
+ .then(function(template)
+ {
var elem = angular.element(document.getElementById('insertHelp'));
$compile(elem.html(template).contents())($scope);
},
- function (error) {
+ function(error)
+ {
NVRDataModel.log("fallback help not found");
});
}
);
-
-
}
//-------------------------------------------------------------------------
@@ -71,16 +80,13 @@ angular.module('zmApp.controllers').controller('zmApp.HelpCtrl', ['$scope', '$ro
// reset power state on exit as if it is called after we enter another
// state, that effectively overwrites current view power management needs
//------------------------------------------------------------------------
- $scope.$on('$ionicView.enter', function () {
+ $scope.$on('$ionicView.enter', function()
+ {
//console.log("**VIEW ** Help Ctrl Entered");
NVRDataModel.setAwake(false);
$scope.zmAppVersion = NVRDataModel.getAppVersion();
insertHelp();
-
-
-
-
});
-}]); \ No newline at end of file
+}]);
diff --git a/www/js/ImportantMessageCtrl.js b/www/js/ImportantMessageCtrl.js
index 29e27d2f..0f948d7f 100644
--- a/www/js/ImportantMessageCtrl.js
+++ b/www/js/ImportantMessageCtrl.js
@@ -2,18 +2,18 @@
/* jslint browser: true*/
/* global cordova,StatusBar,angular,console */
-angular.module('zmApp.controllers').controller('zmApp.ImportantMessageCtrl', ['$scope', '$ionicSideMenuDelegate', 'zm', '$stateParams', '$timeout', '$rootScope', function ($scope, $ionicSideMenuDelegate, zm, $stateParams, $timeout, $rootScope) {
- $scope.openMenu = function () {
+angular.module('zmApp.controllers').controller('zmApp.ImportantMessageCtrl', ['$scope', '$ionicSideMenuDelegate', 'zm', '$stateParams', '$timeout', '$rootScope', function($scope, $ionicSideMenuDelegate, zm, $stateParams, $timeout, $rootScope)
+{
+ $scope.openMenu = function()
+ {
$ionicSideMenuDelegate.toggleLeft();
};
-
-
-
//-------------------------------------------------------------------------
// Controller Main
//------------------------------------------------------------------------
- $scope.$on('$ionicView.enter', function () {
+ $scope.$on('$ionicView.enter', function()
+ {
console.log("**VIEW ** LowVersion Ctrl Entered");
$ionicSideMenuDelegate.canDragContent(true);
$scope.requiredVersion = zm.minAppVersion;
@@ -22,12 +22,14 @@ angular.module('zmApp.controllers').controller('zmApp.ImportantMessageCtrl', ['$
});
- $scope.openMenu = function () {
- $timeout(function () {
+ $scope.openMenu = function()
+ {
+ $timeout(function()
+ {
$rootScope.stateofSlide = $ionicSideMenuDelegate.isOpen();
}, 500);
$ionicSideMenuDelegate.toggleLeft();
};
-}]); \ No newline at end of file
+}]);
diff --git a/www/js/LogCtrl.js b/www/js/LogCtrl.js
index f204e8db..f8809661 100644
--- a/www/js/LogCtrl.js
+++ b/www/js/LogCtrl.js
@@ -2,8 +2,10 @@
/* jslint browser: true*/
/* global saveAs, cordova,StatusBar,angular,console,moment */
-angular.module('zmApp.controllers').controller('zmApp.LogCtrl', ['$scope', '$rootScope', 'zm', '$ionicModal', 'NVRDataModel', '$ionicSideMenuDelegate', '$fileLogger', '$cordovaEmailComposer', '$ionicPopup', '$timeout', '$ionicHistory', '$state', '$interval', '$ionicLoading', '$translate', function ($scope, $rootScope, zm, $ionicModal, NVRDataModel, $ionicSideMenuDelegate, $fileLogger, $cordovaEmailComposer, $ionicPopup, $timeout, $ionicHistory, $state, $interval, $ionicLoading, $translate) {
- $scope.openMenu = function () {
+angular.module('zmApp.controllers').controller('zmApp.LogCtrl', ['$scope', '$rootScope', 'zm', '$ionicModal', 'NVRDataModel', '$ionicSideMenuDelegate', '$fileLogger', '$cordovaEmailComposer', '$ionicPopup', '$timeout', '$ionicHistory', '$state', '$interval', '$ionicLoading', '$translate', function($scope, $rootScope, zm, $ionicModal, NVRDataModel, $ionicSideMenuDelegate, $fileLogger, $cordovaEmailComposer, $ionicPopup, $timeout, $ionicHistory, $state, $interval, $ionicLoading, $translate)
+{
+ $scope.openMenu = function()
+ {
$ionicSideMenuDelegate.toggleLeft();
};
@@ -16,34 +18,33 @@ angular.module('zmApp.controllers').controller('zmApp.LogCtrl', ['$scope', '$roo
document.addEventListener("pause", onPause, false);
document.addEventListener("resume", onResume, false);
- function onPause() {
+ function onPause()
+ {
NVRDataModel.debug("LogCtrl: pause called, killing log timer");
// $interval.cancel(intervalLogUpdateHandle);
}
-
- function onResume() {
+ function onResume()
+ {
NVRDataModel.debug("LogCtrl: resume called, starting log timer");
- /* intervalLogUpdateHandle = $interval(function ()
- {
- loadLogs();
-
- }.bind(this), 3000);*/
-
loadLogs();
}
+ $scope.deleteLogs = function()
+ {
- $scope.deleteLogs = function () {
-
- $rootScope.zmPopup = $ionicPopup.confirm({
+ $rootScope.zmPopup = $ionicPopup.confirm(
+ {
title: $translate.instant('kPleaseConfirm'),
template: $translate.instant('kDeleteLogsConfirm'),
});
- $rootScope.zmPopup.then(function (res) {
- if (res) {
- $fileLogger.deleteLogfile().then(function () {
+ $rootScope.zmPopup.then(function(res)
+ {
+ if (res)
+ {
+ $fileLogger.deleteLogfile().then(function()
+ {
//console.log('Logfile deleted');
$fileLogger.setStorageFilename(zm.logFile);
$scope.log.logString = "";
@@ -55,17 +56,22 @@ angular.module('zmApp.controllers').controller('zmApp.LogCtrl', ['$scope', '$roo
//----------------------------------------------------------------
// Alarm notification handling
//----------------------------------------------------------------
- $scope.handleAlarms = function () {
+ $scope.handleAlarms = function()
+ {
$rootScope.isAlarm = !$rootScope.isAlarm;
- if (!$rootScope.isAlarm) {
+ if (!$rootScope.isAlarm)
+ {
$rootScope.alarmCount = "0";
- $ionicHistory.nextViewOptions({
+ $ionicHistory.nextViewOptions(
+ {
disableBack: true
});
- $state.go("events", {
+ $state.go("events",
+ {
"id": 0,
- "playEvent":false
- }, {
+ "playEvent": false
+ },
+ {
reload: true
});
return;
@@ -76,15 +82,18 @@ angular.module('zmApp.controllers').controller('zmApp.LogCtrl', ['$scope', '$roo
// Make sure user knows information masking is best effort
//--------------------------------------------------------------------------
- $scope.sendEmail = function (logstring) {
- $ionicPopup.confirm({
+ $scope.sendEmail = function(logstring)
+ {
+ $ionicPopup.confirm(
+ {
title: $translate.instant('kSensitiveTitle'),
template: $rootScope.appName + ' ' + $translate.instant('kSensitiveBody')
})
- .then(function (res) {
- if (res)
+ .then(function(res)
+ {
+ if (res)
{
- logstring = "Logs for version:"+$scope.zmAppVersion+"\n"+logstring;
+ logstring = "Logs for version:" + $scope.zmAppVersion + "\n" + logstring;
sendEmailReally(logstring);
}
@@ -94,14 +103,14 @@ angular.module('zmApp.controllers').controller('zmApp.LogCtrl', ['$scope', '$roo
//--------------------------------------------------------------------------
// Convenience function to send logs via email
//--------------------------------------------------------------------------
- function sendEmailReally(logstring) {
- if (window.cordova) {
-
+ function sendEmailReally(logstring)
+ {
+ if (window.cordova)
+ {
// do my best to replace sensitive information
var loginData = NVRDataModel.getLogin();
-
// We don't need this anymore as log and debug now strip passwords
/*if (loginData.password !="")
{
@@ -110,35 +119,39 @@ angular.module('zmApp.controllers').controller('zmApp.LogCtrl', ['$scope', '$roo
}*/
// keep the protocol, helps to debug
var urlNoProtocol = loginData.url.replace(/.*?:\/\//, "");
- if (urlNoProtocol != "") {
+ if (urlNoProtocol != "")
+ {
var re2 = new RegExp(urlNoProtocol, "g");
// just replacing baseurl - that will take care of
// masking api but may not be cgi
logstring = logstring.replace(re2, "<server>");
}
urlNoProtocol = loginData.streamingurl.replace(/.*?:\/\//, "");
- if (urlNoProtocol != "") {
+ if (urlNoProtocol != "")
+ {
var re3 = new RegExp(urlNoProtocol, "g");
logstring = logstring.replace(re3, "<server>");
}
urlNoProtocol = loginData.eventServer.replace(/.*?:\/\//, "");
- if (urlNoProtocol != "") {
+ if (urlNoProtocol != "")
+ {
var re4 = new RegExp(urlNoProtocol, "g");
logstring = logstring.replace(re4, "<server>");
}
window.plugins.emailComposer.showEmailComposerWithCallback(callback, $rootScope.appName + ' logs', logstring, [zm.authoremail]);
-
- } else {
+ }
+ else
+ {
// console.log("Using default email client to send data");
var fname = $rootScope.appName + "-logs-" +
moment().format('MMM-DD-YY_HH-mm-ss') + ".txt";
-
- var blob = new Blob([logstring], {
+ var blob = new Blob([logstring],
+ {
type: "text/plain;charset=utf-8"
});
saveAs(blob, fname);
@@ -146,28 +159,32 @@ angular.module('zmApp.controllers').controller('zmApp.LogCtrl', ['$scope', '$roo
}
- function callback() {
+ function callback()
+ {
// console.log ("EMAIL SENT");
NVRDataModel.debug("Email sent callback called");
}
- function loadLogs() {
+ function loadLogs()
+ {
//console.log ("GETTING LOGS");
- $ionicLoading.show({
+ $ionicLoading.show(
+ {
template: $translate.instant('kLoading'),
noBackdrop: true,
duration: zm.loadingTimeout
});
- $fileLogger.getLogfile().then(function (l) {
-
+ $fileLogger.getLogfile().then(function(l)
+ {
$scope.log.logString = l.split('\n').reverse().join('\n');
-
+
$ionicLoading.hide();
},
- function (error) {
+ function(error)
+ {
$scope.log.logString = "Error getting log: " + JSON.stringify(error);
$ionicLoading.hide();
});
@@ -180,7 +197,8 @@ angular.module('zmApp.controllers').controller('zmApp.LogCtrl', ['$scope', '$roo
// reset power state on exit as if it is called after we enter another
// state, that effectively overwrites current view power management needs
//------------------------------------------------------------------------
- $scope.$on('$ionicView.enter', function () {
+ $scope.$on('$ionicView.enter', function()
+ {
//console.log("**VIEW ** Log Ctrl Entered");
NVRDataModel.setAwake(false);
@@ -190,7 +208,6 @@ angular.module('zmApp.controllers').controller('zmApp.LogCtrl', ['$scope', '$roo
$scope.zmAppVersion = NVRDataModel.getAppVersion();
-
/* intervalLogUpdateHandle = $interval(function ()
{
loadLogs();
@@ -199,13 +216,12 @@ angular.module('zmApp.controllers').controller('zmApp.LogCtrl', ['$scope', '$roo
loadLogs();
-
-
});
- $scope.$on('$ionicView.leave', function () {
+ $scope.$on('$ionicView.leave', function()
+ {
//console.log ("Deleting Log interval...");
// $interval.cancel(intervalLogUpdateHandle);
});
-}]); \ No newline at end of file
+}]);
diff --git a/www/js/LoginCtrl.js b/www/js/LoginCtrl.js
index db0440b4..2cf490e3 100644
--- a/www/js/LoginCtrl.js
+++ b/www/js/LoginCtrl.js
@@ -2,14 +2,15 @@
/* jslint browser: true*/
/* global cordova,StatusBar,angular,console,alert,URI, localforage */
-angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$rootScope', 'zm', '$ionicModal', 'NVRDataModel', '$ionicSideMenuDelegate', '$ionicPopup', '$http', '$q', '$ionicLoading', 'zmAutoLogin', '$cordovaPinDialog', 'EventServer', '$ionicHistory', '$state', '$ionicActionSheet', 'SecuredPopups', '$stateParams', '$translate', function ($scope, $rootScope, zm, $ionicModal, NVRDataModel, $ionicSideMenuDelegate, $ionicPopup, $http, $q, $ionicLoading, zmAutoLogin, $cordovaPinDialog, EventServer, $ionicHistory, $state, $ionicActionSheet, SecuredPopups, $stateParams, $translate) {
- $scope.openMenu = function () {
-
+angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$rootScope', 'zm', '$ionicModal', 'NVRDataModel', '$ionicSideMenuDelegate', '$ionicPopup', '$http', '$q', '$ionicLoading', 'zmAutoLogin', '$cordovaPinDialog', 'EventServer', '$ionicHistory', '$state', '$ionicActionSheet', 'SecuredPopups', '$stateParams', '$translate', function($scope, $rootScope, zm, $ionicModal, NVRDataModel, $ionicSideMenuDelegate, $ionicPopup, $http, $q, $ionicLoading, zmAutoLogin, $cordovaPinDialog, EventServer, $ionicHistory, $state, $ionicActionSheet, SecuredPopups, $stateParams, $translate)
+{
+ $scope.openMenu = function()
+ {
+
saveItems(false);
$ionicSideMenuDelegate.toggleLeft();
-
- };
+ };
var oldName;
var serverbuttons = [];
@@ -24,72 +25,85 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r
$scope.check.isUseAuth = ($scope.loginData.isUseAuth) ? true : false;
$scope.check.isUseEventServer = ($scope.loginData.isUseEventServer == true) ? true : false;
-
document.addEventListener("pause", onPause, false);
document.addEventListener("resume", onResume, false);
- function onResume() {
+ function onResume()
+ {
NVRDataModel.log("Login screen resumed");
}
- function onPause() {
+ function onPause()
+ {
NVRDataModel.log("Login screen going to background, saving data");
localforage.setItem("settings-temp-data", $scope.loginData);
}
-
//----------------------------------------------------------------
// Alarm notification handling
//----------------------------------------------------------------
- $scope.handleAlarms = function () {
+ $scope.handleAlarms = function()
+ {
$rootScope.isAlarm = !$rootScope.isAlarm;
- if (!$rootScope.isAlarm) {
+ if (!$rootScope.isAlarm)
+ {
$rootScope.alarmCount = "0";
- $ionicHistory.nextViewOptions({
+ $ionicHistory.nextViewOptions(
+ {
disableBack: true
});
- $state.go("events", {
+ $state.go("events",
+ {
"id": 0,
- "playEvent":false
- }, {
+ "playEvent": false
+ },
+ {
reload: true
});
return;
}
-
+
};
//----------------------------------------------------------------
// Specifies a linked profile to try if this profile fails
//----------------------------------------------------------------
- $scope.selectFallback = function () {
+ $scope.selectFallback = function()
+ {
var as = Object.keys(NVRDataModel.getServerGroups());
- if (as.length < 2) {
- $rootScope.zmPopup = SecuredPopups.show('alert', {
+ if (as.length < 2)
+ {
+ $rootScope.zmPopup = SecuredPopups.show('alert',
+ {
title: $translate.instant('kError'),
template: $translate.instant('kFallback2Configs')
});
return;
}
- var ab = [{
+ var ab = [
+ {
text: $translate.instant('kClear')
}];
var ld = NVRDataModel.getLogin();
- as.forEach(function (item) {
- if (item != ld.serverName) ab.push({
+ as.forEach(function(item)
+ {
+ if (item != ld.serverName) ab.push(
+ {
text: item
});
});
- var sheet = $ionicActionSheet.show({
+ var sheet = $ionicActionSheet.show(
+ {
buttons: ab,
titleText: $translate.instant('kSelectFallback'),
cancelText: $translate.instant('kButtonCancel'),
- cancel: function () {},
- buttonClicked: function (index) {
+ cancel: function() {},
+ buttonClicked: function(index)
+ {
//console.log ("YOU WANT " + ab[index].text + index);
if (index == 0)
$scope.loginData.fallbackConfiguration = "";
@@ -100,27 +114,30 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r
}
});
-
-
};
//----------------------------------------------------------------
// This is called when the user changes profiles
//----------------------------------------------------------------
- $scope.serverActionSheet = function () {
- var hideSheet = $ionicActionSheet.show({
+ $scope.serverActionSheet = function()
+ {
+ var hideSheet = $ionicActionSheet.show(
+ {
buttons: serverbuttons,
destructiveText: $translate.instant('kDelete'),
titleText: $translate.instant('kManageServerGroups'),
cancelText: $translate.instant('kButtonCancel'),
- cancel: function () {
+ cancel: function()
+ {
// add cancel code..
},
- buttonClicked: function (index) {
+ buttonClicked: function(index)
+ {
//console.log ("YOU WANT " + serverbuttons[index].text + " INDEX " + index);
- if (serverbuttons[index].text == $translate.instant('kServerAdd') + "...") {
+ if (serverbuttons[index].text == $translate.instant('kServerAdd') + "...")
+ {
$scope.loginData = angular.copy(NVRDataModel.getDefaultLoginObject());
return true;
@@ -131,7 +148,6 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r
//console.log ("NEW LOGIN OBJECT IS " + JSON.stringify($scope.loginData));
-
$scope.check.isUseAuth = ($scope.loginData.isUseAuth) ? true : false;
$scope.check.isUseEventServer = ($scope.loginData.isUseEventServer == true) ? true : false;
@@ -147,19 +163,20 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r
return true;
},
- destructiveButtonClicked: function () {
+ destructiveButtonClicked: function()
+ {
-
- if (!$scope.loginData.serverName) {
+ if (!$scope.loginData.serverName)
+ {
NVRDataModel.debug("cannot delete empty entry");
return true;
-
}
var zmServers = NVRDataModel.getServerGroups();
//console.log ("YOU WANT TO DELETE " + $scope.loginData.serverName);
//console.log ("LENGTH OF SERVERS IS " + Object.keys(zmServers).length);
- if (Object.keys(zmServers).length > 1) {
+ if (Object.keys(zmServers).length > 1)
+ {
NVRDataModel.log("Deleting " + $scope.loginData.serverName);
delete zmServers[$scope.loginData.serverName];
@@ -171,33 +188,37 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r
NVRDataModel.setLogin($scope.loginData);
availableServers = Object.keys(NVRDataModel.getServerGroups());
- serverbuttons = [{
+ serverbuttons = [
+ {
text: $translate.instant('kServerAdd') + "..."
}];
- for (var servIter = 0; servIter < availableServers.length; servIter++) {
- serverbuttons.push({
+ for (var servIter = 0; servIter < availableServers.length; servIter++)
+ {
+ serverbuttons.push(
+ {
text: availableServers[servIter]
});
//console.log("ADDING : " + availableServers[servIter]);
}
//console.log (">>>>>>>delete: server buttons " + JSON.stringify(serverbuttons));
- } else {
+ }
+ else
+ {
NVRDataModel.displayBanner('error', [$translate.instant('kBannerCannotDeleteNeedOne')]);
}
return true;
}
-
});
};
-
//----------------------------------------------------------------
// This is when you tap on event server settings
//----------------------------------------------------------------
- $scope.eventServerSettings = function () {
+ $scope.eventServerSettings = function()
+ {
NVRDataModel.debug("Saving settings before going to Event Server settings");
//console.log ( "My loginData saved " + JSON.stringify($scope.loginData));
NVRDataModel.setLogin($scope.loginData);
@@ -205,8 +226,6 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r
return;
};
-
-
//-------------------------------------------------------------------------
// Lets make sure we set screen dim properly as we enter
// The problem is we enter other states before we leave previous states
@@ -214,73 +233,81 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r
// reset power state on exit as if it is called after we enter another
// state, that effectively overwrites current view power management needs
//------------------------------------------------------------------------
- $scope.$on('$ionicView.enter', function () {
+ $scope.$on('$ionicView.enter', function()
+ {
//console.log("**VIEW ** LoginCtrl Entered");
NVRDataModel.setAwake(false);
var ld = NVRDataModel.getLogin();
oldName = ld.serverName;
availableServers = Object.keys(NVRDataModel.getServerGroups());
- serverbuttons = [{
+ serverbuttons = [
+ {
text: $translate.instant('kServerAdd') + "..."
}];
- for (var servIter = 0; servIter < availableServers.length; servIter++) {
- serverbuttons.push({
+ for (var servIter = 0; servIter < availableServers.length; servIter++)
+ {
+ serverbuttons.push(
+ {
text: availableServers[servIter]
});
-
//console.log (">>>>>>>ionicview enter: server buttons " + JSON.stringify(serverbuttons));
}
-
-
NVRDataModel.debug("Does login need to hear the wizard? " + $stateParams.wizard);
- if ($stateParams.wizard == "true") {
+ if ($stateParams.wizard == "true")
+ {
NVRDataModel.log("Creating new login entry for wizard");
$scope.loginData = angular.copy(NVRDataModel.getDefaultLoginObject());
$scope.loginData.serverName = $rootScope.wizard.serverName;
$scope.loginData.url = $rootScope.wizard.loginURL;
$scope.loginData.apiurl = $rootScope.wizard.apiURL;
$scope.loginData.streamingurl = $rootScope.wizard.streamingURL;
- if ($rootScope.wizard.useauth && $rootScope.wizard.usezmauth) {
+ if ($rootScope.wizard.useauth && $rootScope.wizard.usezmauth)
+ {
$scope.loginData.username = $rootScope.wizard.zmuser;
$scope.loginData.password = $rootScope.wizard.zmpassword;
- } else {
+ }
+ else
+ {
$scope.loginData.isUseAuth = false;
}
- if ((/^https:\/\//i.test($scope.loginData.url))) {
+ if ((/^https:\/\//i.test($scope.loginData.url)))
+ {
$scope.loginData.useSSL = true;
}
-
- } else {
+ }
+ else
+ {
var savedData;
- localforage.getItem("settings-temp-data").then(function (value) {
+ localforage.getItem("settings-temp-data").then(function(value)
+ {
savedData = value;
//= zmStorageService.getObject ("settings-temp-data");
- if (!NVRDataModel.isEmpty(savedData)) {
+ if (!NVRDataModel.isEmpty(savedData))
+ {
$scope.loginData = savedData;
NVRDataModel.log("retrieved pre-stored loginData on past pause: " + JSON.stringify($scope.loginData));
localforage.removeItem("settings-temp-data");
//zmStorageService.setObject("settings-temp-data", {});
- } else {
+ }
+ else
+ {
NVRDataModel.log("Not recovering login data as its empty");
}
});
}
-
});
-
- $scope.$on('$ionicView.beforeLeave', function () {
+ $scope.$on('$ionicView.beforeLeave', function()
+ {
//console.log("**VIEW ** LoginCtrl Entered");
-
-
});
//----------------------------------------------------------------
@@ -315,54 +342,65 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r
}
});*/
- $rootScope.$on('$stateChangeSuccess', function () {
+ $rootScope.$on('$stateChangeSuccess', function()
+ {
$scope.ignoreDirty = false;
});
// Make a noble attempt at deciphering
-
-
//--------------------------------------------------------------------------
// When PIN is enabled, this is called to specify a PIN
// FIXME: Get rid of cordovaPinDialog. It's really not needed
//--------------------------------------------------------------------------
- $scope.pinPrompt = function (evt) {
+ $scope.pinPrompt = function(evt)
+ {
NVRDataModel.log("Password prompt");
- if ($scope.loginData.usePin) {
+ if ($scope.loginData.usePin)
+ {
$scope.loginData.pinCode = "";
$cordovaPinDialog.prompt($translate.instant('kEnterPin'), $translate.instant('kPinProtect')).then(
- function (result1) {
+ function(result1)
+ {
// console.log (JSON.stringify(result1));
- if (result1.input1 && result1.buttonIndex == 1) {
+ if (result1.input1 && result1.buttonIndex == 1)
+ {
$cordovaPinDialog.prompt($translate.instant('kReconfirmPin'), $translate.instant('kPinProtect'))
- .then(function (result2) {
- if (result1.input1 == result2.input1) {
+ .then(function(result2)
+ {
+ if (result1.input1 == result2.input1)
+ {
NVRDataModel.log("Pin code match");
$scope.loginData.pinCode = result1.input1;
- } else {
+ }
+ else
+ {
NVRDataModel.log("Pin code mismatch");
$scope.loginData.usePin = false;
NVRDataModel.displayBanner('error', [$translate.instant('kBannerPinMismatch')]);
}
},
- function (error) {
+ function(error)
+ {
//console.log("Error inside");
$scope.loginData.usePin = false;
});
- } else {
+ }
+ else
+ {
$scope.loginData.usePin = false;
}
},
- function (error) {
+ function(error)
+ {
//console.log("Error outside");
$scope.loginData.usePin = false;
});
-
-
- } else {
+ }
+ else
+ {
NVRDataModel.debug("Password disabled");
}
};
@@ -371,47 +409,56 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r
// Makes input easier
//-------------------------------------------------------------------------------
- $scope.portalKeypress = function (evt) {
+ $scope.portalKeypress = function(evt)
+ {
- if (/^https:\/\//i.test($scope.loginData.url)) {
+ if (/^https:\/\//i.test($scope.loginData.url))
+ {
$scope.loginData.useSSL = true;
- } else {
+ }
+ else
+ {
$scope.loginData.useSSL = false;
}
- if ($scope.loginData.url.slice(-1) == '/') {
+ if ($scope.loginData.url.slice(-1) == '/')
+ {
$scope.loginData.apiurl = $scope.loginData.url + "api";
$scope.loginData.streamingurl = $scope.loginData.url + "cgi-bin";
- } else {
+ }
+ else
+ {
$scope.loginData.apiurl = $scope.loginData.url + "/api";
$scope.loginData.streamingurl = $scope.loginData.url + "/cgi-bin";
}
-
};
//-------------------------------------------------------------------------------
// Adds http to url if not present
// http://stackoverflow.com/questions/11300906/check-if-a-string-starts-with-http-using-javascript
//-------------------------------------------------------------------------------
- function addhttp(url) {
+ function addhttp(url)
+ {
- if ((!/^(f|ht)tps?:\/\//i.test(url)) && (url != "")) {
+ if ((!/^(f|ht)tps?:\/\//i.test(url)) && (url != ""))
+ {
url = "http://" + url;
}
return url;
}
+ function addWsOrWss(url)
+ {
- function addWsOrWss(url) {
-
- if ((!/^wss?:\/\//i.test(url)) && (url != "")) {
+ if ((!/^wss?:\/\//i.test(url)) && (url != ""))
+ {
url = "ws://" + url;
}
return url;
}
-
- function endsWith(str, suffix) {
+ function endsWith(str, suffix)
+ {
return str.indexOf(suffix, str.length - suffix.length) !== -1;
}
@@ -419,15 +466,14 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r
// Perform the login action when the user submits the login form
//-----------------------------------------------------------------------------
- function saveItems(showalert) {
-
+ function saveItems(showalert)
+ {
//console.log ("*********** SAVE ITEMS CALLED ");
//console.log('Saving login');
NVRDataModel.setFirstUse(false);
-
+
// used for menu display
-
// lets so some basic sanitization of the data
// I am already adding "/" so lets remove spurious ones
@@ -443,29 +489,29 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r
$scope.loginData.username = $scope.loginData.username.trim();
-
-
-
$scope.loginData.isUseAuth = ($scope.check.isUseAuth) ? true : false;
$scope.loginData.isUseEventServer = ($scope.check.isUseEventServer) ? true : false;
- if ($scope.loginData.url.slice(-1) == '/') {
+ if ($scope.loginData.url.slice(-1) == '/')
+ {
$scope.loginData.url = $scope.loginData.url.slice(0, -1);
}
- if ($scope.loginData.apiurl.slice(-1) == '/') {
+ if ($scope.loginData.apiurl.slice(-1) == '/')
+ {
$scope.loginData.apiurl = $scope.loginData.apiurl.slice(0, -1);
}
-
- if ($scope.loginData.streamingurl.slice(-1) == '/') {
+ if ($scope.loginData.streamingurl.slice(-1) == '/')
+ {
$scope.loginData.streamingurl = $scope.loginData.streamingurl.slice(0, -1);
}
- if ($scope.loginData.eventServer.slice(-1) == '/') {
+ if ($scope.loginData.eventServer.slice(-1) == '/')
+ {
$scope.loginData.eventServer = $scope.loginData.eventServer.slice(0, -1);
}
@@ -483,15 +529,17 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r
$scope.loginData.streamingurl = addhttp($scope.loginData.streamingurl);
$scope.loginData.eventServer = addWsOrWss($scope.loginData.eventServer);
- if ($scope.loginData.useSSL) {
+ if ($scope.loginData.useSSL)
+ {
// replace all http with https
$scope.loginData.url = $scope.loginData.url.replace("http:", "https:");
$scope.loginData.apiurl = $scope.loginData.apiurl.replace("http:", "https:");
$scope.loginData.streamingurl = $scope.loginData.streamingurl.replace("http:", "https:");
$scope.loginData.eventServer = $scope.loginData.eventServer.replace("ws:", "wss:");
-
- } else {
+ }
+ else
+ {
// replace all https with http
$scope.loginData.url = $scope.loginData.url.replace("https:", "http:");
$scope.loginData.apiurl = $scope.loginData.apiurl.replace("https:", "http:");
@@ -502,27 +550,29 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r
var apiurl = $scope.loginData.apiurl + '/host/getVersion.json';
var portalurl = $scope.loginData.url + '/index.php';
-
-
// Check if isUseAuth is set make sure u/p have a dummy value
- if ($scope.check.isUseAuth) {
+ if ($scope.check.isUseAuth)
+ {
if (!$scope.loginData.username) $scope.loginData.username = "x";
if (!$scope.loginData.password) $scope.loginData.password = "x";
//NVRDataModel.log("Authentication is disabled, setting dummy user & pass");
}
- if (parseInt($scope.loginData.maxMontage) <= 0) {
+ if (parseInt($scope.loginData.maxMontage) <= 0)
+ {
$scope.loginData.maxMontage = "100";
}
-
// do this before setLogin so message is sent
- if (!$scope.check.isUseEventServer) {
+ if (!$scope.check.isUseEventServer)
+ {
$rootScope.isAlarm = 0;
- if ($rootScope.apnsToken) {
+ if ($rootScope.apnsToken)
+ {
NVRDataModel.log("Making sure we don't get push notifications");
- EventServer.sendMessage('push', {
+ EventServer.sendMessage('push',
+ {
type: 'token',
platform: $rootScope.platformOS,
token: $rootScope.apnsToken,
@@ -532,23 +582,27 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r
}
NVRDataModel.setLogin($scope.loginData);
-
+
$rootScope.runMode = NVRDataModel.getBandwidth();
-
+
oldName = $scope.loginData.serverName;
- if ($scope.check.isUseEventServer) {
+ if ($scope.check.isUseEventServer)
+ {
EventServer.init();
- if ($rootScope.apnsToken && $scope.loginData.disablePush != true) {
+ if ($rootScope.apnsToken && $scope.loginData.disablePush != true)
+ {
NVRDataModel.log("Making sure we get push notifications");
- EventServer.sendMessage('push', {
+ EventServer.sendMessage('push',
+ {
type: 'token',
platform: $rootScope.platformOS,
token: $rootScope.apnsToken,
state: "enabled"
}, 1);
}
- EventServer.sendMessage("control", {
+ EventServer.sendMessage("control",
+ {
type: 'filter',
monlist: $scope.loginData.eventServerMonitors,
intlist: $scope.loginData.eventServerInterval
@@ -556,19 +610,21 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r
}
-
// lets logout
NVRDataModel.debug("Logging out of current session...");
$rootScope.authSession = "undefined";
- $http({
+ $http(
+ {
method: 'POST',
//withCredentials: true,
url: $scope.loginData.url + '/index.php',
- headers: {
+ headers:
+ {
'Content-Type': 'application/x-www-form-urlencoded',
'Accept': 'application/json',
},
- transformRequest: function (obj) {
+ transformRequest: function(obj)
+ {
var str = [];
for (var p in obj)
str.push(encodeURIComponent(p) + "=" +
@@ -577,12 +633,14 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r
return params;
},
- data: {
+ data:
+ {
action: "logout",
view: "login"
}
})
- .finally(function (ans) {
+ .finally(function(ans)
+ {
zmAutoLogin.doLogin("<button class='button button-clear' style='line-height: normal; min-height: 0; min-width: 0; color:#fff;' ng-click='$root.cancelAuth()'><i class='ion-close-circled'></i>&nbsp;" + $translate.instant('kAuthenticating') + "...</button>")
// Do the happy menu only if authentication works
@@ -590,13 +648,15 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r
// fail in app.js that will be called to show an error
// box
- .then(function (data) {
+ .then(function(data)
+ {
// Now let's validate if the API works
// note that due to reachability, it might have switched to another server
- if ($scope.loginData.serverName != NVRDataModel.getLogin().serverName) {
+ if ($scope.loginData.serverName != NVRDataModel.getLogin().serverName)
+ {
NVRDataModel.debug(">>> Server information has changed, likely a fallback took over!");
$scope.loginData = NVRDataModel.getLogin();
apiurl = $scope.loginData.apiurl + '/host/getVersion.json';
@@ -606,21 +666,19 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r
// possible image digits changed between servers
NVRDataModel.getKeyConfigParams(0);
-
NVRDataModel.log("Validating APIs at " + apiurl);
$http.get(apiurl)
- .success(function (data) {
+ .success(function(data)
+ {
-
NVRDataModel.getTimeZone(true);
var loginStatus = $translate.instant('kExploreEnjoy') + " " + $rootScope.appName + "!";
EventServer.refresh();
-
-
// now grab and report PATH_ZMS
NVRDataModel.getPathZms()
- .then(function (data) {
+ .then(function(data)
+ {
var ld = NVRDataModel.getLogin();
var zm_cgi = data.toLowerCase();
@@ -628,27 +686,33 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r
NVRDataModel.log("ZM relative cgi-path: " + zm_cgi + ", you entered: " + user_cgi);
$http.get(ld.streamingurl + "/zms")
- .success(function (data) {
+ .success(function(data)
+ {
NVRDataModel.debug("Urk! cgi-path returned success, but it should not have come here");
loginStatus = $translate.instant('kLoginStatusNoCgi');
NVRDataModel.debug("refreshing API version...");
NVRDataModel.getAPIversion()
- .then(function (data) {
+ .then(function(data)
+ {
var refresh = NVRDataModel.getMonitors(1);
$rootScope.apiVersion = data;
},
- function (error) {
+ function(error)
+ {
var refresh = NVRDataModel.getMonitors(1);
$rootScope.apiVersion = "0.0.0";
NVRDataModel.debug("Error, failed API version, setting to " + $rootScope.apiVersion);
});
- if (showalert) {
- $rootScope.zmPopup = SecuredPopups.show('alert', {
+ if (showalert)
+ {
+ $rootScope.zmPopup = SecuredPopups.show('alert',
+ {
title: $translate.instant('kLoginValidatedTitle'),
template: loginStatus
- }).then(function (res) {
+ }).then(function(res)
+ {
$ionicSideMenuDelegate.toggleLeft();
NVRDataModel.debug("Force reloading monitors...");
@@ -656,19 +720,24 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r
});
}
})
- .error(function (error, status) {
+ .error(function(error, status)
+ {
// If its 5xx, then the cgi-bin path is valid
// if its 4xx then the cgi-bin path is not valid
- if (status < 500) {
+ if (status < 500)
+ {
loginStatus = $translate.instant('kLoginStatusNoCgiAlt');
}
- if (showalert) {
- $rootScope.zmPopup = SecuredPopups.show('alert', {
+ if (showalert)
+ {
+ $rootScope.zmPopup = SecuredPopups.show('alert',
+ {
title: $translate.instant('kLoginValidatedTitle'),
template: loginStatus
- }).then(function (res) {
+ }).then(function(res)
+ {
$ionicSideMenuDelegate.toggleLeft();
NVRDataModel.debug("Force reloading monitors...");
@@ -677,11 +746,13 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r
}
NVRDataModel.debug("refreshing API version...");
NVRDataModel.getAPIversion()
- .then(function (data) {
+ .then(function(data)
+ {
var refresh = NVRDataModel.getMonitors(1);
$rootScope.apiVersion = data;
},
- function (error) {
+ function(error)
+ {
var refresh = NVRDataModel.getMonitors(1);
$rootScope.apiVersion = "0.0.0";
NVRDataModel.debug("Error, failed API version, setting to " + $rootScope.apiVersion);
@@ -690,22 +761,20 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r
});
});
-
-
})
- .error(function (error) {
+ .error(function(error)
+ {
NVRDataModel.displayBanner('error', [$translate.instant('kBannerAPICheckFailed'), $translate.instant('kBannerPleaseCheck')]);
NVRDataModel.log("API login error " + JSON.stringify(error));
- $rootScope.zmPopup = SecuredPopups.show('alert', {
+ $rootScope.zmPopup = SecuredPopups.show('alert',
+ {
title: $translate.instant('kLoginValidAPIFailedTitle'),
template: $translate.instant('kBannerPleaseCheck')
});
});
});
-
-
});
}
@@ -714,24 +783,33 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r
// calling saveItems also updates the defaultServer
//-----------------------------------------------
- $scope.saveItems = function () {
+ $scope.saveItems = function()
+ {
- if (!$scope.loginData.serverName) {
- $rootScope.zmPopup = $ionicPopup.alert({
+ if (!$scope.loginData.serverName)
+ {
+ $rootScope.zmPopup = $ionicPopup.alert(
+ {
title: $translate.instant('kError'),
template: $translate.instant('kServerEmptyError'),
})
- .then(function (res) {
+ .then(function(res)
+ {
return;
});
- } else {
+ }
+ else
+ {
saveItems(true);
availableServers = Object.keys(NVRDataModel.getServerGroups());
- serverbuttons = [{
+ serverbuttons = [
+ {
text: $translate.instant('kServerAdd') + "..."
}];
- for (var servIter = 0; servIter < availableServers.length; servIter++) {
- serverbuttons.push({
+ for (var servIter = 0; servIter < availableServers.length; servIter++)
+ {
+ serverbuttons.push(
+ {
text: availableServers[servIter]
});
}
@@ -739,8 +817,6 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r
}
-
};
-
-}]); \ No newline at end of file
+}]);
diff --git a/www/js/LowVersionCtrl.js b/www/js/LowVersionCtrl.js
index 3ceda222..a7fbb7ff 100644
--- a/www/js/LowVersionCtrl.js
+++ b/www/js/LowVersionCtrl.js
@@ -2,18 +2,18 @@
/* jslint browser: true*/
/* global cordova,StatusBar,angular,console */
-angular.module('zmApp.controllers').controller('zmApp.LowVersionCtrl', ['$scope','$ionicSideMenuDelegate', 'zm', '$stateParams', function ($scope,$ionicSideMenuDelegate,zm, $stateParams) {
-$scope.openMenu = function () {
- $ionicSideMenuDelegate.toggleLeft();
- };
-
-
-
+angular.module('zmApp.controllers').controller('zmApp.LowVersionCtrl', ['$scope', '$ionicSideMenuDelegate', 'zm', '$stateParams', function($scope, $ionicSideMenuDelegate, zm, $stateParams)
+{
+ $scope.openMenu = function()
+ {
+ $ionicSideMenuDelegate.toggleLeft();
+ };
//-------------------------------------------------------------------------
// Controller Main
//------------------------------------------------------------------------
- $scope.$on('$ionicView.enter', function () {
+ $scope.$on('$ionicView.enter', function()
+ {
//console.log("**VIEW ** LowVersion Ctrl Entered");
$ionicSideMenuDelegate.canDragContent(true);
$scope.requiredVersion = zm.minAppVersion;
diff --git a/www/js/MenuController.js b/www/js/MenuController.js
index 94e15b0a..071db4df 100644
--- a/www/js/MenuController.js
+++ b/www/js/MenuController.js
@@ -2,52 +2,54 @@
/* jslint browser: true*/
/* global cordova,StatusBar,angular,console */
-angular.module('zmApp.controllers').controller('MenuController', ['$scope','$ionicSideMenuDelegate', 'zm', '$stateParams', '$ionicHistory','$state', 'NVRDataModel', '$rootScope', '$ionicPopup', '$translate', function ($scope,$ionicSideMenuDelegate,zm, $stateParams, $ionicHistory, $state, NVRDataModel, $rootScope, $ionicPopup, $translate) {
-$scope.openMenu = function () {
- $ionicSideMenuDelegate.toggleLeft();
- };
-
-//----------------------------------------------------------------
-// This controller sits along with the main app to bring up
-// the language menu from the main menu
-//----------------------------------------------------------------
+angular.module('zmApp.controllers').controller('MenuController', ['$scope', '$ionicSideMenuDelegate', 'zm', '$stateParams', '$ionicHistory', '$state', 'NVRDataModel', '$rootScope', '$ionicPopup', '$translate', function($scope, $ionicSideMenuDelegate, zm, $stateParams, $ionicHistory, $state, NVRDataModel, $rootScope, $ionicPopup, $translate)
+{
+ $scope.openMenu = function()
+ {
+ $ionicSideMenuDelegate.toggleLeft();
+ };
+
+ //----------------------------------------------------------------
+ // This controller sits along with the main app to bring up
+ // the language menu from the main menu
+ //----------------------------------------------------------------
$scope.switchLang = function()
{
$scope.lang = NVRDataModel.getLanguages();
- $scope.myopt = {lang:""};
-
- $rootScope.zmPopup = $ionicPopup.show({
+ $scope.myopt = {
+ lang: ""
+ };
+
+ $rootScope.zmPopup = $ionicPopup.show(
+ {
scope: $scope,
template: '<ion-radio-fix ng-repeat="item in lang" ng-value="item.value" ng-model="myopt.lang"> {{item.text}} </ion-radio-fix>',
-
title: $translate.instant('kSelectLanguage'),
-
+
buttons: [
+ {
+ text: $translate.instant('kButtonCancel'),
+ onTap: function(e)
{
- text: $translate.instant('kButtonCancel'),
- onTap: function (e) {
- //return "CANCEL";
- }
+ //return "CANCEL";
+ }
- },
+ },
+ {
+ text: $translate.instant('kButtonOk'),
+ onTap: function(e)
{
- text: $translate.instant('kButtonOk'),
- onTap: function (e) {
- NVRDataModel.log("Language selected:"+$scope.myopt.lang);
- NVRDataModel.setDefaultLanguage($scope.myopt.lang, true);
- $rootScope.$emit('language-changed');
-
-
- //return "OK";
-
- }
- }
- ]
+ NVRDataModel.log("Language selected:" + $scope.myopt.lang);
+ NVRDataModel.setDefaultLanguage($scope.myopt.lang, true);
+ $rootScope.$emit('language-changed');
+
+ //return "OK";
+
+ }
+ }]
});
-
-
+
};
-
-
+
}]);
diff --git a/www/js/MonitorCtrl.js b/www/js/MonitorCtrl.js
index e9ec2f4b..6a91a52e 100644
--- a/www/js/MonitorCtrl.js
+++ b/www/js/MonitorCtrl.js
@@ -7,8 +7,8 @@
angular.module('zmApp.controllers')
.controller('zmApp.MonitorCtrl', ['$ionicPopup', 'zm', '$scope', 'NVRDataModel', 'message', '$ionicSideMenuDelegate', '$ionicLoading', '$ionicModal', '$state', '$http', '$rootScope', '$timeout', '$ionicHistory', '$ionicPlatform', '$translate', '$q',
- function ($ionicPopup, zm, $scope, NVRDataModel, message, $ionicSideMenuDelegate, $ionicLoading, $ionicModal, $state, $http, $rootScope, $timeout, $ionicHistory, $ionicPlatform, $translate, $q) {
-
+ function($ionicPopup, zm, $scope, NVRDataModel, message, $ionicSideMenuDelegate, $ionicLoading, $ionicModal, $state, $http, $rootScope, $timeout, $ionicHistory, $ionicPlatform, $translate, $q)
+ {
//-----------------------------------------------------------------------
// Controller Main
@@ -18,8 +18,6 @@ angular.module('zmApp.controllers')
// console.log("***EVENTS: Waiting for Monitors to load before I proceed");
-
-
var loginData;
// --------------------------------------------------------
@@ -27,19 +25,26 @@ angular.module('zmApp.controllers')
// close the modal
// --------------------------------------------------------
- $ionicPlatform.registerBackButtonAction(function (e) {
+ $ionicPlatform.registerBackButtonAction(function(e)
+ {
e.preventDefault();
- if ($scope.modal != undefined && $scope.modal.isShown()) {
+ if ($scope.modal != undefined && $scope.modal.isShown())
+ {
// switch off awake, as liveview is finished
NVRDataModel.debug("Modal is open, closing it");
NVRDataModel.setAwake(false);
$scope.modal.remove();
- } else {
+ }
+ else
+ {
NVRDataModel.debug("Modal is closed, so toggling or exiting");
- if (!$ionicSideMenuDelegate.isOpenLeft()) {
+ if (!$ionicSideMenuDelegate.isOpenLeft())
+ {
$ionicSideMenuDelegate.toggleLeft();
- } else {
+ }
+ else
+ {
navigator.app.exitApp();
}
@@ -47,28 +52,31 @@ angular.module('zmApp.controllers')
}, 1000);
-
- $scope.openMenu = function () {
+ $scope.openMenu = function()
+ {
$ionicSideMenuDelegate.toggleLeft();
};
-
//----------------------------------------------------------------
// Alarm notification handling
//----------------------------------------------------------------
- $scope.handleAlarms = function () {
+ $scope.handleAlarms = function()
+ {
$rootScope.isAlarm = !$rootScope.isAlarm;
- if (!$rootScope.isAlarm) {
+ if (!$rootScope.isAlarm)
+ {
$rootScope.alarmCount = "0";
- $ionicHistory.nextViewOptions({
+ $ionicHistory.nextViewOptions(
+ {
disableBack: true
});
-
- $state.go("events", {
+ $state.go("events",
+ {
"id": 0,
- "playEvent":false
- }, {
+ "playEvent": false
+ },
+ {
reload: true
});
return;
@@ -79,10 +87,12 @@ angular.module('zmApp.controllers')
// For now, I've only limited it to enable/disable and change monitor mode
// and changing monitor function
//-----------------------------------------------------------------------
- $scope.changeConfig = function (monitorName, monitorId, enabled, func) {
+ $scope.changeConfig = function(monitorName, monitorId, enabled, func)
+ {
var checked = false;
- if (monitorName == 'All') {
+ if (monitorName == 'All')
+ {
monitorName = $translate.instant('kAll');
}
@@ -91,40 +101,43 @@ angular.module('zmApp.controllers')
//if monitorId is not specified, all monitors will be changed
var monitorsIds = [];
- if (monitorId == '') {
- for (var i = 0; i < $scope.monitors.length; i++) {
+ if (monitorId == '')
+ {
+ for (var i = 0; i < $scope.monitors.length; i++)
+ {
monitorsIds[i] = $scope.monitors[i].Monitor.Id;
}
- } else {
+ }
+ else
+ {
monitorsIds[0] = monitorId;
}
$scope.monFunctions = [
- {
- text: $translate.instant('kMonModect'),
- value: "Modect"
- },
- {
- text: $translate.instant('kMonMocord'),
- value: "Mocord"
- },
- {
- text: $translate.instant('kMonRecord'),
- value: "Record"
- },
- {
- text: $translate.instant('kMonNodect'),
- value: "Nodect"
- },
- {
- text: $translate.instant('kMonMonitor'),
- value: "Monitor"
- },
- {
- text: $translate.instant('kMonNone'),
- value: "None"
- }
- ];
+ {
+ text: $translate.instant('kMonModect'),
+ value: "Modect"
+ },
+ {
+ text: $translate.instant('kMonMocord'),
+ value: "Mocord"
+ },
+ {
+ text: $translate.instant('kMonRecord'),
+ value: "Record"
+ },
+ {
+ text: $translate.instant('kMonNodect'),
+ value: "Nodect"
+ },
+ {
+ text: $translate.instant('kMonMonitor'),
+ value: "Monitor"
+ },
+ {
+ text: $translate.instant('kMonNone'),
+ value: "None"
+ }];
$scope.monfunc = {
mymonitorsIds: monitorsIds,
@@ -134,134 +147,140 @@ angular.module('zmApp.controllers')
mypromises: []
};
- $rootScope.zmPopup = $ionicPopup.show({
+ $rootScope.zmPopup = $ionicPopup.show(
+ {
scope: $scope,
template: '<ion-toggle ng-model="monfunc.myenabled" ng-checked="monfunc.myenabled" toggle-class="toggle-calm">Enabled</ion-toggle><ion-radio-fix ng-repeat="item in monFunctions" ng-value="item.value" ng-model="monfunc.myfunc"> {{item.text}} </ion-radio-fix>',
-
title: $translate.instant('kChangeSettingsFor') + ' ' + monitorName,
buttons: [
- {
- text: $translate.instant('kButtonCancel'),
+ {
+ text: $translate.instant('kButtonCancel'),
- },
+ },
+ {
+ text: $translate.instant('kButtonSave'),
+ onTap: function(e)
{
- text: $translate.instant('kButtonSave'),
- onTap: function (e) {
- $scope.monfunc.mymonitorsIds.forEach(function (item, index) {
- NVRDataModel.debug("MonitorCtrl:changeConfig selection:" + $scope.monfunc.myenabled +
- $scope.monfunc.myfunc);
- var loginData = NVRDataModel.getLogin();
- var apiRestart = loginData.apiurl + "/states/change/restart.json";
- var apiMon = loginData.apiurl + "/monitors/" + item + ".json";
+ $scope.monfunc.mymonitorsIds.forEach(function(item, index)
+ {
+ NVRDataModel.debug("MonitorCtrl:changeConfig selection:" + $scope.monfunc.myenabled +
+ $scope.monfunc.myfunc);
+ var loginData = NVRDataModel.getLogin();
+ var apiRestart = loginData.apiurl + "/states/change/restart.json";
+ var apiMon = loginData.apiurl + "/monitors/" + item + ".json";
+
+ NVRDataModel.debug("MonitorCtrl: URLs for changeConfig save:" + apiMon);
+
+ var isEnabled = "";
+ isEnabled = ($scope.monfunc.myenabled == true) ? '1' : '0';
+
+ $ionicLoading.show(
+ {
+ template: $translate.instant('kApplyingChanges') + "...",
+ noBackdrop: true,
+ duration: zm.largeHttpTimeout,
+ });
- NVRDataModel.debug("MonitorCtrl: URLs for changeConfig save:" + apiMon);
+ var httpPromise = $http(
+ {
+ url: apiMon,
+ method: 'post',
+ headers:
+ {
+ 'Content-Type': 'application/x-www-form-urlencoded',
+ 'Accept': '*/*',
+ },
+ transformRequest: function(obj)
+ {
+ var str = [];
+ for (var p in obj)
+ str.push(encodeURIComponent(p) + "=" +
+ encodeURIComponent(obj[p]));
+ var foo = str.join("&");
+ // console.log("****RETURNING " + foo);
+ NVRDataModel.debug("MonitorCtrl: parmeters constructed: " + foo);
+ return foo;
+ },
+ data:
+ {
+ 'Monitor[Function]': $scope.monfunc.myfunc,
+ 'Monitor[Enabled]': isEnabled,
+ }
+
+ })
+ .success(function()
+ {
+ NVRDataModel.debug("MonitorCtrl: Not restarting ZM - Make sure you have the patch installed in MonitorsController.php or this won't work");
+ })
+ .error(function(data, status, headers, config)
+ {
+ NVRDataModel.debug("MonitorCtrl: Error changing monitor " + JSON.stringify(data));
+ $scope.monfunc.myfailedIds.push(item);
+ });
- var isEnabled = "";
- isEnabled = ($scope.monfunc.myenabled == true) ? '1' : '0';
+ $scope.monfunc.mypromises.push(httpPromise);
+ });
+ $q.all($scope.monfunc.mypromises).then(function(e)
+ {
+ $ionicLoading.hide();
+ // if there's a failed ID, an error has occurred
+ if ($scope.monfunc.myfailedIds.length != 0)
+ {
+ $ionicLoading.show(
+ {
+ template: $translate.instant('kErrorChangingMonitors') + ". Monitor IDs : " + $scope.monfunc.myfailedIds.toString(),
+ noBackdrop: true,
+ duration: 3000,
+ });
+ }
+ else
+ {
+ // I am not restarting ZM after monitor change
+ /* NVRDataModel.debug ("MonitorCtrl: Restarting ZM");
$ionicLoading.show({
- template: $translate.instant('kApplyingChanges') + "...",
+ template: "Successfully changed Monitor. Please wait, restarting ZoneMinder...",
noBackdrop: true,
duration: zm.largeHttpTimeout,
});
+ $http.post(apiRestart)
+ .then(function (success) {
+ $ionicLoading.hide();
+ var refresh = NVRDataModel.getMonitors(1);
+ refresh.then(function (data) {
+ $scope.monitors = data;
+ $scope.$broadcast('scroll.refreshComplete');
+ });
+
+ },
+ function (error) {
+ $ionicLoading.hide();
+
+ });*/
+ doRefresh();
+ }
+ });
+ }
- var httpPromise = $http({
- url: apiMon,
- method: 'post',
- headers: {
- 'Content-Type': 'application/x-www-form-urlencoded',
- 'Accept': '*/*',
- },
- transformRequest: function (obj) {
- var str = [];
- for (var p in obj)
- str.push(encodeURIComponent(p) + "=" +
- encodeURIComponent(obj[p]));
- var foo = str.join("&");
- // console.log("****RETURNING " + foo);
- NVRDataModel.debug("MonitorCtrl: parmeters constructed: " + foo);
- return foo;
- },
- data: {
- 'Monitor[Function]': $scope.monfunc.myfunc,
- 'Monitor[Enabled]': isEnabled,
- }
-
- })
- .success(function () {
- NVRDataModel.debug("MonitorCtrl: Not restarting ZM - Make sure you have the patch installed in MonitorsController.php or this won't work");
- })
- .error(function (data, status, headers, config) {
- NVRDataModel.debug("MonitorCtrl: Error changing monitor " + JSON.stringify(data));
- $scope.monfunc.myfailedIds.push(item);
- });
-
- $scope.monfunc.mypromises.push(httpPromise);
- });
-
- $q.all($scope.monfunc.mypromises).then(function (e) {
- $ionicLoading.hide();
- // if there's a failed ID, an error has occurred
- if ($scope.monfunc.myfailedIds.length != 0) {
- $ionicLoading.show({
- template: $translate.instant('kErrorChangingMonitors') + ". Monitor IDs : " + $scope.monfunc.myfailedIds.toString(),
- noBackdrop: true,
- duration: 3000,
- });
- } else {
- // I am not restarting ZM after monitor change
- /* NVRDataModel.debug ("MonitorCtrl: Restarting ZM");
- $ionicLoading.show({
- template: "Successfully changed Monitor. Please wait, restarting ZoneMinder...",
- noBackdrop: true,
- duration: zm.largeHttpTimeout,
- });
- $http.post(apiRestart)
- .then(function (success) {
- $ionicLoading.hide();
- var refresh = NVRDataModel.getMonitors(1);
- refresh.then(function (data) {
- $scope.monitors = data;
- $scope.$broadcast('scroll.refreshComplete');
- });
-
- },
- function (error) {
- $ionicLoading.hide();
-
- });*/
- doRefresh();
- }
- });
- }
-
-
-
- },
- ]
+ }, ]
});
};
-
-
// same logic as EventCtrl.js
- $scope.finishedLoadingImage = function () {
+ $scope.finishedLoadingImage = function()
+ {
// console.log("***Monitor image FINISHED Loading***");
$ionicLoading.hide();
};
-
- $scope.$on('$ionicView.loaded', function () {
+ $scope.$on('$ionicView.loaded', function()
+ {
// console.log("**VIEW ** Monitor Ctrl Loaded");
});
-
-
-
-
//-------------------------------------------------------------------------
// Lets make sure we set screen dim properly as we enter
// The problem is we enter other states before we leave previous states
@@ -269,32 +288,35 @@ angular.module('zmApp.controllers')
// reset power state on exit as if it is called after we enter another
// state, that effectively overwrites current view power management needs
//------------------------------------------------------------------------
- $scope.$on('$ionicView.enter', function () {
+ $scope.$on('$ionicView.enter', function()
+ {
// console.log("**VIEW ** Monitor Ctrl Entered");
NVRDataModel.setAwake(false);
$ionicSideMenuDelegate.canDragContent(true);
$scope.areImagesLoading = true;
});
-
- $scope.$on('$ionicView.afterEnter', function () {
+ $scope.$on('$ionicView.afterEnter', function()
+ {
// console.log("**VIEW ** Monitor Ctrl Entered");
$scope.monitors = [];
$scope.monitors = message;
-
+
//console.log (">>>>>>>>>>>> MONITOR CTRL " + JSON.stringify($scope.monitors));
-
-
- if ($scope.monitors.length == 0) {
- $rootScope.zmPopup = $ionicPopup.alert({
+ if ($scope.monitors.length == 0)
+ {
+ $rootScope.zmPopup = $ionicPopup.alert(
+ {
title: $translate.instant('kNoMonitors'),
template: $translate.instant('kPleaseCheckCredentials')
});
- $ionicHistory.nextViewOptions({
+ $ionicHistory.nextViewOptions(
+ {
disableBack: true
});
- $state.go("login", {
+ $state.go("login",
+ {
"wizard": false
});
return;
@@ -307,14 +329,17 @@ angular.module('zmApp.controllers')
// Now lets see if we need to load live screen
// $rootScope.tappedMid = 1;
- if ($rootScope.tappedMid != 0) {
+ if ($rootScope.tappedMid != 0)
+ {
NVRDataModel.log("Notification tapped, we need to go to monitor " + $rootScope.tappedMid);
var tm = $rootScope.tappedMid;
$rootScope.tappedMid = 0;
var monitem;
- for (var m = 0; m < $scope.monitors.length; m++) {
- if ($scope.monitors[m].Monitor.Id == tm) {
+ for (var m = 0; m < $scope.monitors.length; m++)
+ {
+ if ($scope.monitors[m].Monitor.Id == tm)
+ {
monitem = $scope.monitors[m];
break;
}
@@ -324,31 +349,31 @@ angular.module('zmApp.controllers')
openModal(monitem.Monitor.Id, monitem.Monitor.Controllable, monitem.Monitor.ControlId, monitem.Monitor.connKey, monitem);
}
-
});
-
- $scope.$on('$ionicView.leave', function () {
+ $scope.$on('$ionicView.leave', function()
+ {
// console.log("**VIEW ** Monitor Ctrl Left, force removing modal");
if ($scope.modal) $scope.modal.remove();
});
- $scope.$on('$ionicView.unloaded', function () {
+ $scope.$on('$ionicView.unloaded', function()
+ {
// console.log("**VIEW ** Monitor Ctrl Unloaded");
});
-
- $scope.openModal = function (mid, controllable, controlid, connKey, monitor) {
+ $scope.openModal = function(mid, controllable, controlid, connKey, monitor)
+ {
openModal(mid, controllable, controlid, connKey, monitor);
};
- function openModal(mid, controllable, controlid, connKey, monitor) {
+ function openModal(mid, controllable, controlid, connKey, monitor)
+ {
NVRDataModel.debug("MonitorCtrl:Open Monitor Modal with monitor Id=" + mid +
" and Controllable:" + controllable + " with control ID:" + controlid);
-
$scope.monitor = monitor;
//console.log (">>>>>>>>>>>> MONITOR CRL " + $scope.monitor.
$scope.monitorId = mid;
@@ -359,8 +384,6 @@ angular.module('zmApp.controllers')
NVRDataModel.log("Monitor Orientation is: " + $scope.orientation);
$rootScope.rand = Math.floor(Math.random() * (999999 - 111111 + 1)) + 111111;
-
-
$scope.showPTZ = false;
$scope.monitorId = mid;
$scope.monitorName = NVRDataModel.getMonitorName(mid);
@@ -369,7 +392,6 @@ angular.module('zmApp.controllers')
$scope.LoginData = NVRDataModel.getLogin();
$rootScope.modalRand = Math.floor(Math.random() * (999999 - 111111 + 1)) + 111111;
-
$scope.ptzMoveCommand = "";
$scope.ptzStopCommand = "";
@@ -382,24 +404,24 @@ angular.module('zmApp.controllers')
$scope.connKey = (Math.floor((Math.random() * 999999) + 1)).toString();
$scope.isControllable = controllable;
-
- $rootScope.modalRand = Math.floor(Math.random() * (999999 - 111111 + 1)) + 111111;
+ $rootScope.modalRand = Math.floor(Math.random() * (999999 - 111111 + 1)) + 111111;
// This is a modal to show the monitor footage
// We need to switch to always awake if set so the feed doesn't get interrupted
NVRDataModel.setAwake(NVRDataModel.getKeepAwake());
-
-
- $ionicModal.fromTemplateUrl('templates/monitors-modal.html', {
+ $ionicModal.fromTemplateUrl('templates/monitors-modal.html',
+ {
scope: $scope,
animation: 'slide-in-up'
})
- .then(function (modal) {
+ .then(function(modal)
+ {
$scope.modal = modal;
- $ionicLoading.show({
+ $ionicLoading.show(
+ {
template: $translate.instant('kPleaseWait') + "...",
noBackdrop: true,
duration: zm.loadingTimeout
@@ -410,7 +432,8 @@ angular.module('zmApp.controllers')
}
- $scope.closeModal = function () {
+ $scope.closeModal = function()
+ {
// console.log("Close & Destroy Monitor Modal");
// stop networking -nph-zms keeps sucking data
@@ -418,73 +441,78 @@ angular.module('zmApp.controllers')
// switch off awake, as liveview is finished
NVRDataModel.setAwake(false);
$scope.modal.remove();
- $timeout(function () {
+ $timeout(function()
+ {
NVRDataModel.log("MonitorCtrl:Stopping network pull...");
if (NVRDataModel.isForceNetworkStop()) NVRDataModel.stopNetwork("MonitorCtrl-closeModal");
}, 300);
-
};
//Cleanup the modal when we're done with it!
- $scope.$on('$destroy', function () {
+ $scope.$on('$destroy', function()
+ {
//console.log("Destroy Monitor Modal");
if ($scope.modal) $scope.modal.remove();
});
-
-
-
//-----------------------------------------------------------------------
// Controller Main
//-----------------------------------------------------------------------
-
- function monitorStateCheck() {
+ function monitorStateCheck()
+ {
var apiMonCheck;
// The status is provided by zmdc.pl
// "not running", "pending", "running since", "Unable to connect"
var i;
- for (i = 0; i < $scope.monitors.length; i++) {
- (function (j) {
+ for (i = 0; i < $scope.monitors.length; i++)
+ {
+ (function(j)
+ {
$scope.monitors[j].Monitor.isRunningText = "...";
$scope.monitors[j].Monitor.isRunning = "...";
$scope.monitors[j].Monitor.color = zm.monitorCheckingColor;
$scope.monitors[j].Monitor.char = "ion-checkmark-circled";
apiMonCheck = loginData.apiurl + "/monitors/daemonStatus/id:" + $scope.monitors[j].Monitor.Id + "/daemon:zmc.json";
-
//apiMonCheck = apiMonCheck.replace(loginData.url, $scope.monitors[j].Monitor.baseURL);
-
// in multiserver replace apiurl with baseurl
-
NVRDataModel.debug("MonitorCtrl:monitorStateCheck: " + apiMonCheck);
//console.log("**** ZMC CHECK " + apiMonCheck);
$http.get(apiMonCheck)
- .success(function (data) {
+ .success(function(data)
+ {
NVRDataModel.debug("MonitorCtrl: monitor check state returned: " + JSON.stringify(data));
- if (data.statustext.indexOf("not running") > -1) {
+ if (data.statustext.indexOf("not running") > -1)
+ {
$scope.monitors[j].Monitor.isRunning = "false";
$scope.monitors[j].Monitor.color = zm.monitorNotRunningColor;
$scope.monitors[j].Monitor.char = "ion-close-circled";
- } else if (data.statustext.indexOf("pending") > -1) {
+ }
+ else if (data.statustext.indexOf("pending") > -1)
+ {
$scope.monitors[j].Monitor.isRunning = "pending";
$scope.monitors[j].Monitor.color = zm.monitorPendingColor;
- } else if (data.statustext.indexOf("running since") > -1) {
+ }
+ else if (data.statustext.indexOf("running since") > -1)
+ {
$scope.monitors[j].Monitor.isRunning = "true";
$scope.monitors[j].Monitor.color = zm.monitorRunningColor;
- } else if (data.statustext.indexOf("Unable to connect") > -1) {
+ }
+ else if (data.statustext.indexOf("Unable to connect") > -1)
+ {
$scope.monitors[j].Monitor.isRunning = "false";
$scope.monitors[j].Monitor.color = zm.monitorNotRunningColor;
$scope.monitors[j].Monitor.char = "ion-close-circled";
}
-
$scope.monitors[j].Monitor.isRunningText = data.statustext;
})
- .error(function (data) {
+ .error(function(data)
+ {
NVRDataModel.debug("MonitorCtrl: Error->monitor check state returned: " +
JSON.stringify(data));
NVRDataModel.displayBanner('error', [$translate.instant('kErrorRetrievingState'), $translate.instant('kPleaseTryAgain')]);
@@ -493,30 +521,30 @@ angular.module('zmApp.controllers')
$scope.monitors[j].Monitor.char = "ion-help-circled";
});
-
})(i);
}
}
-
- function doRefresh() {
+ function doRefresh()
+ {
$scope.monitors = [];
var refresh = NVRDataModel.getMonitors(1);
- refresh.then(function (data) {
+ refresh.then(function(data)
+ {
$scope.monitors = data;
monitorStateCheck();
$scope.$broadcast('scroll.refreshComplete');
});
}
- $scope.doRefresh = function () {
+ $scope.doRefresh = function()
+ {
//console.log("***Pull to Refresh");
doRefresh();
-
};
-
-}]); \ No newline at end of file
+ }
+ ]);
diff --git a/www/js/MonitorModalCtrl.js b/www/js/MonitorModalCtrl.js
index cff63da1..4b3a7288 100644
--- a/www/js/MonitorModalCtrl.js
+++ b/www/js/MonitorModalCtrl.js
@@ -3,13 +3,8 @@
/* jslint browser: true*/
/* global saveAs, cordova,StatusBar,angular,console,ionic, moment, imagesLoaded, chrome */
-
-
-angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$rootScope', 'zm', 'NVRDataModel', '$ionicSideMenuDelegate', '$timeout', '$interval', '$ionicModal', '$ionicLoading', '$http', '$state', '$stateParams', '$ionicHistory', '$ionicScrollDelegate', '$q', '$sce', 'carouselUtils', '$ionicPopup', 'SecuredPopups', '$translate', function ($scope, $rootScope, zm, NVRDataModel, $ionicSideMenuDelegate, $timeout, $interval, $ionicModal, $ionicLoading, $http, $state, $stateParams, $ionicHistory, $ionicScrollDelegate, $q, $sce, carouselUtils, $ionicPopup, SecuredPopups, $translate) {
-
-
-
-
+angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$rootScope', 'zm', 'NVRDataModel', '$ionicSideMenuDelegate', '$timeout', '$interval', '$ionicModal', '$ionicLoading', '$http', '$state', '$stateParams', '$ionicHistory', '$ionicScrollDelegate', '$q', '$sce', 'carouselUtils', '$ionicPopup', 'SecuredPopups', '$translate', function($scope, $rootScope, zm, NVRDataModel, $ionicSideMenuDelegate, $timeout, $interval, $ionicModal, $ionicLoading, $http, $state, $stateParams, $ionicHistory, $ionicScrollDelegate, $q, $sce, carouselUtils, $ionicPopup, SecuredPopups, $translate)
+{
$scope.animationInProgress = false;
$scope.imageFit = true;
@@ -21,7 +16,8 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
$rootScope.authSession = "undefined";
- $ionicLoading.show({
+ $ionicLoading.show(
+ {
template: $translate.instant('kNegotiatingStreamAuth') + '...',
animation: 'fade-in',
showBackdrop: true,
@@ -30,7 +26,6 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
showDelay: 0
});
-
$scope.currentStreamMode = 'single';
NVRDataModel.log("Using stream mode " + $scope.currentStreamMode);
@@ -38,13 +33,15 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
$rootScope.validMonitorId = $scope.monitors[0].Monitor.Id;
NVRDataModel.getAuthKey($rootScope.validMonitorId, $scope.monitors[0].Monitor.connKey)
- .then(function (success) {
+ .then(function(success)
+ {
$ionicLoading.hide();
$rootScope.authSession = success;
NVRDataModel.log("Modal: Stream authentication construction: " + $rootScope.authSession);
},
- function (error) {
+ function(error)
+ {
$ionicLoading.hide();
NVRDataModel.debug("ModalCtrl: Error details of stream auth:" + error);
@@ -52,19 +49,18 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
NVRDataModel.log("Modal: Error returned Stream authentication construction. Retaining old value of: " + $rootScope.authSession);
});
-
-
$interval.cancel(intervalModalHandle);
$interval.cancel(cycleHandle);
- intervalModalHandle = $interval(function () {
+ intervalModalHandle = $interval(function()
+ {
loadModalNotifications();
// console.log ("Refreshing Image...");
}.bind(this), 5000);
-
$timeout.cancel(nphTimer);
- nphTimer = $timeout(function () {
+ nphTimer = $timeout(function()
+ {
$scope.currentStreamMode = 'jpeg';
NVRDataModel.log("Switching playback via nphzms");
}, zm.nphSwitchTimer);
@@ -77,7 +73,8 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
background: '#2F4F4F',
isOpen: true,
toggleOnClick: false,
- button: {
+ button:
+ {
cssClass: "fa fa-arrows-alt",
},
items: [
@@ -85,7 +82,8 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
content: '',
cssClass: 'fa fa-chevron-circle-up',
empty: false,
- onclick: function () {
+ onclick: function()
+ {
controlPTZ($scope.monitorId, $scope.ptzMoveCommand + 'Down');
}
},
@@ -94,7 +92,8 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
content: '',
cssClass: 'fa fa-chevron-circle-up',
empty: false,
- onclick: function () {
+ onclick: function()
+ {
controlPTZ($scope.monitorId, $scope.ptzMoveCommand + 'DownLeft');
}
},
@@ -104,7 +103,8 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
cssClass: 'fa fa-chevron-circle-up',
empty: false,
- onclick: function () {
+ onclick: function()
+ {
controlPTZ($scope.monitorId, $scope.ptzMoveCommand + 'Left');
}
},
@@ -112,7 +112,8 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
content: 'D',
empty: true,
- onclick: function () {
+ onclick: function()
+ {
// console.log('About');
}
},
@@ -121,7 +122,8 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
content: '',
cssClass: 'fa fa-chevron-circle-up',
empty: false,
- onclick: function () {
+ onclick: function()
+ {
controlPTZ($scope.monitorId, $scope.ptzMoveCommand + 'UpLeft');
}
},
@@ -130,7 +132,8 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
content: '',
cssClass: 'fa fa-chevron-circle-up',
empty: false,
- onclick: function () {
+ onclick: function()
+ {
controlPTZ($scope.monitorId, $scope.ptzMoveCommand + 'Up');
}
},
@@ -139,7 +142,8 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
content: '',
cssClass: 'fa fa-chevron-circle-up',
empty: false,
- onclick: function () {
+ onclick: function()
+ {
controlPTZ($scope.monitorId, $scope.ptzMoveCommand + 'UpRight');
}
},
@@ -147,7 +151,8 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
{
content: 'H',
empty: true,
- onclick: function () {
+ onclick: function()
+ {
//console.log('About');
}
},
@@ -156,17 +161,18 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
content: '',
cssClass: 'fa fa-chevron-circle-up',
empty: false,
- onclick: function () {
+ onclick: function()
+ {
controlPTZ($scope.monitorId, $scope.ptzMoveCommand + 'Right');
}
},
-
{
content: '',
cssClass: 'fa fa-chevron-circle-up',
empty: false,
- onclick: function () {
+ onclick: function()
+ {
controlPTZ($scope.monitorId, $scope.ptzMoveCommand + 'DownRight');
}
},
@@ -174,36 +180,36 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
{
content: 'K',
empty: true,
- onclick: function () {
+ onclick: function()
+ {
//console.log('About');
}
},
- ]
+ ]
};
//-------------------------------------------------------------
// On re-auth, we need a new zms
//-------------------------------------------------------------
- $rootScope.$on("auth-success", function () {
+ $rootScope.$on("auth-success", function()
+ {
NVRDataModel.debug("MonitorModalCtrl: Re-login detected, resetting everything & re-generating connkey");
NVRDataModel.stopNetwork("MonitorModal-auth success");
$scope.connKey = (Math.floor((Math.random() * 999999) + 1)).toString();
-
});
-
- $scope.cast = function (mid, mon) {
-
+ $scope.cast = function(mid, mon) {
};
//----------------------------------
// toggles monitor cycling
//----------------------------------
- $scope.toggleCycle = function () {
+ $scope.toggleCycle = function()
+ {
//console.log ("HERE");
$scope.isCycle = !$scope.isCycle;
var ld = NVRDataModel.getLogin();
@@ -211,15 +217,19 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
NVRDataModel.setLogin(ld);
$scope.cycleText = $scope.isCycle ? $translate.instant('kOn') : $translate.instant('kOff');
- if ($scope.isCycle) {
+ if ($scope.isCycle)
+ {
NVRDataModel.log("re-starting cycle timer");
$interval.cancel(cycleHandle);
- cycleHandle = $interval(function () {
+ cycleHandle = $interval(function()
+ {
moveToMonitor($scope.monitorId, 1);
// console.log ("Refreshing Image...");
}.bind(this), ld.cycleMonitorsInterval * 1000);
- } else {
+ }
+ else
+ {
NVRDataModel.log("cancelling cycle timer");
$interval.cancel(cycleHandle);
}
@@ -230,19 +240,21 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
// PTZ enable/disable
//-------------------------------------------------------------
-
- $scope.togglePTZ = function () {
+ $scope.togglePTZ = function()
+ {
//console.log("PTZ");
- if ($scope.isControllable == '1') {
+ if ($scope.isControllable == '1')
+ {
//console.log ("iscontrollable is true");
$scope.showPTZ = !$scope.showPTZ;
-
-
- } else {
- $ionicLoading.show({
+ }
+ else
+ {
+ $ionicLoading.show(
+ {
template: $translate.instant('kPTZnotConfigured'),
noBackdrop: true,
duration: 3000,
@@ -251,13 +263,12 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
};
-
-
//-------------------------------------------------------------
// Pause and resume handlers
//-------------------------------------------------------------
- function onPause() {
+ function onPause()
+ {
NVRDataModel.debug("ModalCtrl: onpause called");
$interval.cancel(intervalModalHandle);
$interval.cancel(cycleHandle);
@@ -266,10 +277,11 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
// FIXME: Do I need to setAwake(false) here?
}
-
- function onResume() {
+ function onResume()
+ {
NVRDataModel.debug("ModalCtrl: Modal resume called");
- if ($scope.isModalActive) {
+ if ($scope.isModalActive)
+ {
NVRDataModel.log("ModalCtrl: Restarting Modal timer on resume");
$interval.cancel(intervalModalHandle);
@@ -277,16 +289,19 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
var ld = NVRDataModel.getLogin();
- intervalModalHandle = $interval(function () {
+ intervalModalHandle = $interval(function()
+ {
loadModalNotifications();
}.bind(this), 5000);
- if (ld.cycleMonitors) {
+ if (ld.cycleMonitors)
+ {
NVRDataModel.debug("Cycling enabled at " + ld.cycleMonitorsInterval);
$interval.cancel(cycleHandle);
- cycleHandle = $interval(function () {
+ cycleHandle = $interval(function()
+ {
moveToMonitor($scope.monitorId, 1);
// console.log ("Refreshing Image...");
}.bind(this), ld.cycleMonitorsInterval * 1000);
@@ -299,116 +314,117 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
}
-
//-------------------------------------------------------------
// Queries the 1.30 API for recording state of current monitor
//-------------------------------------------------------------
- function loadModalNotifications() {
+ function loadModalNotifications()
+ {
- if (NVRDataModel.versionCompare($rootScope.apiVersion, "1.30") == -1) {
+ if (NVRDataModel.versionCompare($rootScope.apiVersion, "1.30") == -1)
+ {
return;
}
-
+
if (NVRDataModel.getLogin().enableLowBandwidth)
return;
var status = [$translate.instant('kMonIdle'),
- $translate.instant('kMonPreAlarm'),
- $translate.instant('kMonAlarmed'),
- $translate.instant('kMonAlert'),
- $translate.instant('kMonRecord')
- ];
+ $translate.instant('kMonPreAlarm'),
+ $translate.instant('kMonAlarmed'),
+ $translate.instant('kMonAlert'),
+ $translate.instant('kMonRecord')
+ ];
//console.log ("Inside Modal timer...");
var apiurl = NVRDataModel.getLogin().apiurl;
var alarmurl = apiurl + "/monitors/alarm/id:" + $scope.monitorId + "/command:status.json";
NVRDataModel.log("Invoking " + alarmurl);
-
$http.get(alarmurl)
- .then(function (data) {
+ .then(function(data)
+ {
// NVRDataModel.debug ("Success in monitor alarmed status " + JSON.stringify(data));
$scope.monStatus = status[parseInt(data.data.status)];
},
- function (error) {
-
+ function(error)
+ {
$scope.monStatus = "";
NVRDataModel.debug("Error in monitor alarmed status ");
});
-
}
-
//-------------------------------------------------------------
// Enable/Disable preset list
//-------------------------------------------------------------
- $scope.togglePresets = function () {
+ $scope.togglePresets = function()
+ {
$scope.presetOn = !$scope.presetOn;
- if ($scope.presetOn) {
+ if ($scope.presetOn)
+ {
$scope.controlToggle = "hide buttons";
- } else {
+ }
+ else
+ {
$scope.controlToggle = "show buttons";
}
//console.log("Changing preset to " + $scope.presetOn);
var element = angular.element(document.getElementById("presetlist"));
// bring it in
- if ($scope.presetOn) {
+ if ($scope.presetOn)
+ {
element.removeClass("animated fadeOutUp");
-
- } else {
+ }
+ else
+ {
element.removeClass("animated fadeInDown");
element.addClass("animated fadeOutUp");
}
-
-
};
-
//-------------------------------------------------------------
// this is checked to make sure we are not pulling images
// when app is in background. This is a problem with Android,
// for example
//-------------------------------------------------------------
- $scope.isBackground = function () {
+ $scope.isBackground = function()
+ {
// console.log ("Is background called from ModalCtrl and returned " +
// NVRDataModel.isBackground());
return NVRDataModel.isBackground();
};
-
-
-
-
-
//-------------------------------------------------------------
// Send PTZ command to ZM
// Note: PTZ fails on desktop, don't bother about it
//-------------------------------------------------------------
-
- $scope.controlPTZ = function (monitorId, cmd) {
+ $scope.controlPTZ = function(monitorId, cmd)
+ {
controlPTZ(monitorId, cmd);
};
- function controlPTZ(monitorId, cmd) {
+ function controlPTZ(monitorId, cmd)
+ {
//presetGotoX
//presetHome
//curl -X POST "http://server.com/zm/index.php?view=request" -d
//"request=control&user=admin&passwd=xx&id=4&control=moveConLeft"
- if (!$scope.ptzMoveCommand) {
- $ionicLoading.show({
+ if (!$scope.ptzMoveCommand)
+ {
+ $ionicLoading.show(
+ {
template: $translate.instant('kPTZNotReady'),
noBackdrop: true,
duration: 2000,
@@ -417,7 +433,8 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
}
var ptzData = "";
- if (cmd.lastIndexOf("preset", 0) === 0) {
+ if (cmd.lastIndexOf("preset", 0) === 0)
+ {
NVRDataModel.debug("PTZ command is a preset, so skipping xge/lge");
ptzData = {
view: "request",
@@ -428,7 +445,9 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
// yge: "30", //wtf
};
- } else {
+ }
+ else
+ {
ptzData = {
view: "request",
@@ -443,7 +462,8 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
//console.log("Command value " + cmd + " with MID=" + monitorId);
//console.log("PTZDATA is " + JSON.stringify(ptzData));
$ionicLoading.hide();
- $ionicLoading.show({
+ $ionicLoading.show(
+ {
template: $translate.instant('kPleaseWait') + "...",
noBackdrop: true,
duration: zm.loadingTimeout,
@@ -451,22 +471,25 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
var loginData = NVRDataModel.getLogin();
$ionicLoading.hide();
- $ionicLoading.show({
+ $ionicLoading.show(
+ {
template: $translate.instant('kSendingPTZ') + "...",
noBackdrop: true,
duration: zm.loadingTimeout,
});
-
- var req = $http({
+ var req = $http(
+ {
method: 'POST',
/*timeout: 15000,*/
url: loginData.url + '/index.php',
- headers: {
+ headers:
+ {
'Content-Type': 'application/x-www-form-urlencoded',
'Accept': 'application/json',
},
- transformRequest: function (obj) {
+ transformRequest: function(obj)
+ {
var str = [];
for (var p in obj)
str.push(encodeURIComponent(p) + "=" +
@@ -480,49 +503,50 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
});
- req.success(function (resp) {
+ req.success(function(resp)
+ {
$ionicLoading.hide();
});
- req.error(function (resp) {
+ req.error(function(resp)
+ {
$ionicLoading.hide();
//console.log("ERROR: " + JSON.stringify(resp));
NVRDataModel.log("Error sending PTZ:" + JSON.stringify(resp), "error");
});
}
-
-
-
- $scope.getZoomLevel = function () {
+ $scope.getZoomLevel = function()
+ {
//console.log("ON RELEASE");
var zl = $ionicScrollDelegate.$getByHandle("imgscroll").getScrollPosition();
//console.log(JSON.stringify(zl));
};
- $scope.onTap = function (m, d) {
+ $scope.onTap = function(m, d)
+ {
moveToMonitor(m, d);
};
-
- $scope.onSwipe = function (m, d) {
+ $scope.onSwipe = function(m, d)
+ {
var ld = NVRDataModel.getLogin();
if (!ld.canSwipeMonitors) return;
- if ($ionicScrollDelegate.$getByHandle("imgscroll").getScrollPosition().zoom != 1) {
+ if ($ionicScrollDelegate.$getByHandle("imgscroll").getScrollPosition().zoom != 1)
+ {
//console.log("Image is zoomed in - not honoring swipe");
return;
}
$scope.monStatus = "";
moveToMonitor(m, d);
-
-
};
- function moveToMonitor(m, d) {
+ function moveToMonitor(m, d)
+ {
var curstate = $ionicHistory.currentStateName();
var found = 0;
var mid;
@@ -537,19 +561,22 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
m = mid;
//console.log("Next Monitor is " + m);
-
found = 0;
- for (var i = 0; i < $scope.monitors.length; i++) {
+ for (var i = 0; i < $scope.monitors.length; i++)
+ {
if ($scope.monitors[i].Monitor.Id == mid &&
// if you came from monitors, then ignore noshow
($scope.monitors[i].Monitor.listDisplay != 'noshow' || curstate == "monitors") &&
$scope.monitors[i].Monitor.Function != 'None' &&
- $scope.monitors[i].Monitor.Enabled != '0') {
+ $scope.monitors[i].Monitor.Enabled != '0')
+ {
found = 1;
//console.log(mid + "is part of the monitor list");
NVRDataModel.debug("ModalCtrl: swipe detected, moving to " + mid);
break;
- } else {
+ }
+ else
+ {
NVRDataModel.debug("skipping " + $scope.monitors[i].Monitor.Id +
" listDisplay=" + $scope.monitors[i].Monitor.listDisplay +
" Function=" + $scope.monitors[i].Monitor.Function +
@@ -557,18 +584,19 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
}
}
-
}
while (found != 1);
-
var slidein;
var slideout;
var dirn = d;
- if (dirn == 1) {
+ if (dirn == 1)
+ {
slideout = "animated slideOutLeft";
slidein = "animated slideInRight";
- } else {
+ }
+ else
+ {
slideout = "animated slideOutRight";
slidein = "animated slideInLeft";
}
@@ -577,16 +605,16 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
element.addClass(slideout)
.one('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend', outWithOld);
-
-
- function outWithOld() {
+ function outWithOld()
+ {
NVRDataModel.log("ModalCtrl:Stopping network pull...");
NVRDataModel.stopNetwork("MonitorModal-outwithOld");
$scope.rand = Math.floor((Math.random() * 100000) + 1);
$scope.animationInProgress = true;
- $timeout(function () {
+ $timeout(function()
+ {
element.removeClass(slideout);
element.addClass(slidein)
.one('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend', inWithNew);
@@ -597,7 +625,8 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
}, 200);
}
- function inWithNew() {
+ function inWithNew()
+ {
element.removeClass(slidein);
$scope.animationInProgress = false;
@@ -605,14 +634,16 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
NVRDataModel.log("New image loaded in");
var ld = NVRDataModel.getLogin();
carouselUtils.setStop(false);
- if (ld.useNphZms == true) {
+ if (ld.useNphZms == true)
+ {
$scope.currentStreamMode = 'single';
NVRDataModel.log("Setting timer to play nph-zms mode");
// first 5 seconds, load a snapshot, then switch to real FPS display
// this is to avoid initial image load delay
// FIXME: 5 seconds fair?
$timeout.cancel(nphTimer);
- nphTimer = $timeout(function () {
+ nphTimer = $timeout(function()
+ {
$scope.currentStreamMode = 'jpeg';
NVRDataModel.log("Switching playback via nphzms");
}, zm.nphSwitchTimer);
@@ -620,21 +651,19 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
}
-
$ionicLoading.hide();
-
}
-
-
//-----------------------------------------------------------------------
// Sucess/Error handlers for saving a snapshot of the
// monitor image to phone storage
//-----------------------------------------------------------------------
- function SaveSuccess() {
- $ionicLoading.show({
+ function SaveSuccess()
+ {
+ $ionicLoading.show(
+ {
template: $translate.instant('kDone'),
noBackdrop: true,
duration: 1000
@@ -642,8 +671,10 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
NVRDataModel.debug("ModalCtrl:Photo saved successfuly");
}
- function SaveError(e) {
- $ionicLoading.show({
+ function SaveError(e)
+ {
+ $ionicLoading.show(
+ {
template: $translate.instant('kErrorSave'),
noBackdrop: true,
duration: 2000
@@ -652,60 +683,69 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
//console.log("***ERROR");
}
-
//-------------------------------------------------------------
// Turns on or off an alarm forcibly (mode true = on, false = off)
//-------------------------------------------------------------
- $scope.enableAlarm = function (mid, mode) {
+ $scope.enableAlarm = function(mid, mode)
+ {
if (mode) // trigger alarm
{
- $rootScope.zmPopup = SecuredPopups.show('show', {
+ $rootScope.zmPopup = SecuredPopups.show('show',
+ {
title: 'Confirm',
template: $translate.instant('kForceAlarmConfirm') + $scope.monitorName + "?",
buttons: [
+ {
+ text: $translate.instant('kButtonYes'),
+ onTap: function(e)
{
- text: $translate.instant('kButtonYes'),
- onTap: function (e) {
- enableAlarm(mid, mode);
- }
- },
+ enableAlarm(mid, mode);
+ }
+ },
+ {
+ text: $translate.instant('kButtonNo'),
+ onTap: function(e)
{
- text: $translate.instant('kButtonNo'),
- onTap: function (e) {
- return;
- }
- }
- ]
+ return;
+ }
+ }]
});
- } else
+ }
+ else
enableAlarm(mid, mode);
- function enableAlarm(mid, mode) {
+ function enableAlarm(mid, mode)
+ {
var apiurl = NVRDataModel.getLogin().apiurl;
var c = mode ? "on" : "off";
var alarmurl = apiurl + "/monitors/alarm/id:" + mid + "/command:" + c + ".json";
NVRDataModel.log("Invoking " + alarmurl);
var status = mode ? $translate.instant('kForcingAlarm') : $translate.instant('kCancellingAlarm');
- $ionicLoading.show({
+ $ionicLoading.show(
+ {
template: status,
noBackdrop: true,
duration: zm.largeHttpTimeout,
});
$http.get(alarmurl)
- .then(function (data) {
- $ionicLoading.show({
+ .then(function(data)
+ {
+ $ionicLoading.show(
+ {
template: $translate.instant('kSuccess'),
noBackdrop: true,
duration: 2000,
});
},
- function (error) {
+ function(error)
+ {
- $ionicLoading.show({
+ $ionicLoading.show(
+ {
template: $translate.instant('kAlarmAPIError'),
noBackdrop: true,
duration: 3000,
@@ -714,25 +754,24 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
});
}
-
-
};
-
//-----------------------------------------------------------------------
// color for monitor state
//-----------------------------------------------------------------------
- $scope.stateColor = function () {
+ $scope.stateColor = function()
+ {
var status = [$translate.instant('kMonIdle'),
- $translate.instant('kMonPreAlarm'),
- $translate.instant('kMonAlarmed'),
- $translate.instant('kMonAlert'),
- $translate.instant('kMonRecord')
- ];
+ $translate.instant('kMonPreAlarm'),
+ $translate.instant('kMonAlarmed'),
+ $translate.instant('kMonAlert'),
+ $translate.instant('kMonRecord')
+ ];
//console.log ("***MONSTATUS**"+$scope.monStatus+"**");
var color = "";
- switch ($scope.monStatus) {
+ switch ($scope.monStatus)
+ {
case "":
color = "background-color:none";
break;
@@ -756,44 +795,46 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
return "padding-left:4px;padding-right:4px;" + color;
};
-
//-----------------------------------------------------------------------
// Saves a snapshot of the monitor image to phone storage
//-----------------------------------------------------------------------
- $scope.saveImageToPhoneWithPerms = function (mid)
+ $scope.saveImageToPhoneWithPerms = function(mid)
{
if ($rootScope.platformOS != 'android')
{
saveImageToPhone(mid);
return;
}
-
-
+
NVRDataModel.debug("ModalCtrl: Permission checking for write");
var permissions = cordova.plugins.permissions;
permissions.hasPermission(permissions.WRITE_EXTERNAL_STORAGE, checkPermissionCallback, null);
-
- function checkPermissionCallback(status) {
+
+ function checkPermissionCallback(status)
+ {
if (!status.hasPermission)
{
SaveError("No permission to write to external storage");
}
- permissions.requestPermission(permissions.WRITE_EXTERNAL_STORAGE, succ,err);
+ permissions.requestPermission(permissions.WRITE_EXTERNAL_STORAGE, succ, err);
}
-
+
function succ(s)
{
saveImageToPhone(mid);
}
+
function err(e)
{
- SaveError ("Error in requestPermission");
+ SaveError("Error in requestPermission");
}
};
-
- function saveImageToPhone(mid) {
- $ionicLoading.show({
+
+ function saveImageToPhone(mid)
+ {
+ $ionicLoading.show(
+ {
template: $translate.instant('kSavingSnapshot') + '...',
noBackdrop: true,
duration: zm.httpTimeout
@@ -808,7 +849,8 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
NVRDataModel.log("SavetoPhone:Trying to save image from " + url);
var img = new Image();
- img.onload = function () {
+ img.onload = function()
+ {
// console.log("********* ONLOAD");
canvas = document.createElement('canvas');
canvas.width = img.width;
@@ -819,8 +861,10 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
imageDataUrl = canvas.toDataURL('image/jpeg', 1.0);
imageData = imageDataUrl.replace(/data:image\/jpeg;base64,/, '');
- if ($rootScope.platformOS != "desktop") {
- try {
+ if ($rootScope.platformOS != "desktop")
+ {
+ try
+ {
cordova.exec(
SaveSuccess,
@@ -828,82 +872,87 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
'Canvas2ImagePlugin',
'saveImageDataToLibrary', [imageData]
);
- } catch (e) {
+ }
+ catch (e)
+ {
SaveError(e.message);
}
- } else {
-
+ }
+ else
+ {
var fname = $scope.monitorName + "-" +
moment().format('MMM-DD-YY_HH-mm-ss') + ".png";
- canvas.toBlob(function (blob) {
+ canvas.toBlob(function(blob)
+ {
saveAs(blob, fname);
SaveSuccess();
});
}
};
- try {
+ try
+ {
img.src = url;
// console.log ("SAVING IMAGE SOURCE");
- } catch (e) {
+ }
+ catch (e)
+ {
SaveError(e.message);
}
}
-
-
-
//-------------------------------------------------------------
//reloaads mon - do we need it?
//-------------------------------------------------------------
-
- $scope.reloadView = function () {
+ $scope.reloadView = function()
+ {
NVRDataModel.log("Reloading view for modal view, recomputing rand");
$rootScope.modalRand = Math.floor((Math.random() * 100000) + 1);
$scope.isModalActive = true;
};
- $scope.scaleImage = function () {
+ $scope.scaleImage = function()
+ {
$scope.imageFit = !$scope.imageFit;
// console.log("Switching image style to " + $scope.imageFit);
};
- $scope.$on('$ionicView.enter', function () {
-
+ $scope.$on('$ionicView.enter', function()
+ {
//https://server/zm/api/zones/forMonitor/X.json
});
- $scope.$on('$ionicView.leave', function () {
+ $scope.$on('$ionicView.leave', function()
+ {
// console.log("**MODAL: Stopping modal timer");
$scope.isModalActive = false;
$interval.cancel(intervalModalHandle);
$interval.cancel(cycleHandle);
});
-
- $scope.$on('$ionicView.beforeLeave', function () {
+ $scope.$on('$ionicView.beforeLeave', function()
+ {
NVRDataModel.log("Nullifying the streams...");
-
var element = document.getElementById("singlemonitor");
- if (element) {
+ if (element)
+ {
NVRDataModel.debug("Nullifying " + element.src);
element.src = "";
}
-
-
});
- $scope.$on('$ionicView.unloaded', function () {
+ $scope.$on('$ionicView.unloaded', function()
+ {
$scope.isModalActive = false;
$interval.cancel(intervalModalHandle);
@@ -911,7 +960,8 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
});
- $scope.$on('modal.removed', function () {
+ $scope.$on('modal.removed', function()
+ {
$scope.isModalActive = false;
//console.log("**MODAL REMOVED: Stopping modal timer");
$interval.cancel(intervalModalHandle);
@@ -920,8 +970,6 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
NVRDataModel.debug("Modal removed - killing connkey");
controlStream(17, "", $scope.connKey, -1);
-
-
// Execute action
});
@@ -931,13 +979,15 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
// anyway
//-------------------------------------------------------------
-
- function controlStream(cmd, disp, connkey, ndx) {
+ function controlStream(cmd, disp, connkey, ndx)
+ {
// console.log("Command value " + cmd);
- if (disp) {
+ if (disp)
+ {
$ionicLoading.hide();
- $ionicLoading.show({
+ $ionicLoading.show(
+ {
template: $translate.instant('kPleaseWait') + '...',
noBackdrop: true,
duration: zm.loadingTimeout,
@@ -967,15 +1017,18 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
var myauthtoken = $rootScope.authSession.replace("&auth=", "");
//&auth=
- var req = $http({
+ var req = $http(
+ {
method: 'POST',
/*timeout: 15000,*/
url: loginData.url + '/index.php',
- headers: {
+ headers:
+ {
'Content-Type': 'application/x-www-form-urlencoded',
//'Accept': '*/*',
},
- transformRequest: function (obj) {
+ transformRequest: function(obj)
+ {
var str = [];
for (var p in obj)
str.push(encodeURIComponent(p) + "=" +
@@ -985,7 +1038,8 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
return foo;
},
- data: {
+ data:
+ {
view: "request",
request: "stream",
connkey: connkey,
@@ -994,20 +1048,25 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
}
});
- req.success(function (resp) {
+ req.success(function(resp)
+ {
- if (resp.result == "Ok" && ndx != -1) {
+ if (resp.result == "Ok" && ndx != -1)
+ {
var ld = NVRDataModel.getLogin();
var apiurl = ld.apiurl + "/events/" + resp.status.event + ".json";
//console.log ("API " + apiurl);
$http.get(apiurl)
- .success(function (data) {
- if ($scope.MontageMonitors[ndx].eventUrlTime != data.event.Event.StartTime) {
+ .success(function(data)
+ {
+ if ($scope.MontageMonitors[ndx].eventUrlTime != data.event.Event.StartTime)
+ {
var element = angular.element(document.getElementById($scope.MontageMonitors[ndx].Monitor.Id + "-timeline"));
element.removeClass('animated slideInRight');
element.addClass('animated slideOutRight');
- $timeout(function () {
+ $timeout(function()
+ {
element.removeClass('animated slideOutRight');
element.addClass('animated slideInRight');
$scope.MontageMonitors[ndx].eventUrlTime = data.event.Event.StartTime;
@@ -1016,7 +1075,8 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
}
})
- .error(function (data) {
+ .error(function(data)
+ {
$scope.MontageMonitors[ndx].eventUrlTime = "-";
});
@@ -1024,31 +1084,31 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
});
- req.error(function (resp) {
+ req.error(function(resp)
+ {
//console.log("ERROR: " + JSON.stringify(resp));
NVRDataModel.log("Error sending event command " + JSON.stringify(resp), "error");
});
}
-
//-------------------------------------------------------------
// Zoom in and out via +- for desktops
//-------------------------------------------------------------
- $scope.zoomImage = function (val) {
+ $scope.zoomImage = function(val)
+ {
var zl = parseInt($ionicScrollDelegate.$getByHandle("imgscroll").getScrollPosition().zoom);
- if (zl == 1 && val == -1) {
+ if (zl == 1 && val == -1)
+ {
NVRDataModel.debug("Already zoomed out max");
return;
}
-
zl += val;
NVRDataModel.debug("Zoom level is " + zl);
$ionicScrollDelegate.$getByHandle("imgscroll").zoomTo(zl, true);
};
-
//-------------------------------------------------------------
// Retrieves PTZ state for each monitor
//-------------------------------------------------------------
@@ -1056,7 +1116,8 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
// $scope.isControllable
// $scope.controlid
//
- function configurePTZ(mid) {
+ function configurePTZ(mid)
+ {
$scope.presetAndControl = $translate.instant('kMore');
$scope.ptzWakeCommand = "";
$scope.ptzSleepCommand = "";
@@ -1077,7 +1138,8 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
var ld = NVRDataModel.getLogin();
var url = ld.apiurl + "/monitors/" + mid + ".json";
$http.get(url)
- .success(function (data) {
+ .success(function(data)
+ {
$scope.isControllable = data.monitor.Monitor.Controllable;
// *** Only for testing - comment out //
@@ -1085,15 +1147,16 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
// for testing only
// $scope.isControllable = 1;
$scope.controlid = data.monitor.Monitor.ControlId;
- if ($scope.isControllable == '1') {
-
+ if ($scope.isControllable == '1')
+ {
var apiurl = NVRDataModel.getLogin().apiurl;
var myurl = apiurl + "/controls/" + $scope.controlid + ".json";
NVRDataModel.debug("configurePTZ : getting controllable data " + myurl);
$http.get(myurl)
- .success(function (data) {
+ .success(function(data)
+ {
// *** Only for testing - comment out - start//
/*data.Control.Control.CanSleep = '1';
@@ -1104,30 +1167,34 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
data.control.Control.HasHomePreset = '1';*/
// *** Only for testing - comment out - end //
-
-
$scope.ptzMoveCommand = "move"; // start with as move;
$scope.ptzStopCommand = "";
- if (data.control.Control.CanZoom == '1') {
+ if (data.control.Control.CanZoom == '1')
+ {
$scope.canZoom = true;
- if (data.control.Control.CanZoomCon == '1') {
+ if (data.control.Control.CanZoomCon == '1')
+ {
$scope.zoomInCommand = "zoomConTele";
$scope.zoomOutCommand = "zoomConWide";
- } else if (data.control.Control.CanZoomRel == '1') {
+ }
+ else if (data.control.Control.CanZoomRel == '1')
+ {
$scope.zoomInCommand = "zoomRelTele";
$scope.zoomOutCommand = "zoomRelWide";
- } else if (data.control.Control.CanZoomAbs == '1') {
+ }
+ else if (data.control.Control.CanZoomAbs == '1')
+ {
$scope.zoomInCommand = "zoomRelAbs";
$scope.zoomOutCommand = "zoomRelAbs";
}
}
-
NVRDataModel.debug("configurePTZ: control data returned " + JSON.stringify(data));
- if (data.control.Control.CanMoveRel == '1') {
+ if (data.control.Control.CanMoveRel == '1')
+ {
$scope.ptzMoveCommand = "moveRel";
$scope.ptzStopCommand = "moveStop";
@@ -1136,28 +1203,29 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
// Prefer con over rel if both enabled
// I've tested con
- if (data.control.Control.CanMoveCon == '1') {
+ if (data.control.Control.CanMoveCon == '1')
+ {
$scope.ptzMoveCommand = "moveCon";
$scope.ptzStopCommand = "moveStop";
}
-
-
// presets
NVRDataModel.debug("ConfigurePTZ Preset value is " + data.control.Control.HasPresets);
$scope.ptzPresets = [];
- if (data.control.Control.HasPresets == '1') {
+ if (data.control.Control.HasPresets == '1')
+ {
//$scope.presetAndControl = $translate.instant('kPresets');
$scope.ptzPresetCount = parseInt(data.control.Control.NumPresets);
NVRDataModel.debug("ConfigurePTZ Number of presets is " + $scope.ptzPresetCount);
-
- for (var p = 0; p < $scope.ptzPresetCount; p++) {
- $scope.ptzPresets.push({
+ for (var p = 0; p < $scope.ptzPresetCount; p++)
+ {
+ $scope.ptzPresets.push(
+ {
name: (p + 1).toString(),
icon: '',
cmd: "presetGoto" + (p + 1).toString(),
@@ -1166,8 +1234,10 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
}
- if (data.control.Control.HasHomePreset == '1') {
- $scope.ptzPresets.unshift({
+ if (data.control.Control.HasHomePreset == '1')
+ {
+ $scope.ptzPresets.unshift(
+ {
name: '',
icon: "ion-ios-home",
cmd: 'presetHome',
@@ -1176,8 +1246,6 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
}
-
-
}
/*else
{
@@ -1188,13 +1256,16 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
// no need to darken these buttons if presets are not there
var buttonAccent = "button-dark";
- if ($scope.ptzPresets.length == 0) {
+ if ($scope.ptzPresets.length == 0)
+ {
buttonAccent = "";
}
- if (data.control.Control.CanWake == '1') {
+ if (data.control.Control.CanWake == '1')
+ {
- $scope.ptzPresets.push({
+ $scope.ptzPresets.push(
+ {
name: 'W',
icon: "ion-eye",
cmd: 'wake',
@@ -1203,8 +1274,10 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
}
- if (data.control.Control.CanSleep == '1') {
- $scope.ptzPresets.push({
+ if (data.control.Control.CanSleep == '1')
+ {
+ $scope.ptzPresets.push(
+ {
name: 'S',
icon: "ion-eye-disabled",
cmd: 'sleep',
@@ -1213,8 +1286,10 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
}
- if (data.control.Control.CanReset == '1') {
- $scope.ptzPresets.push({
+ if (data.control.Control.CanReset == '1')
+ {
+ $scope.ptzPresets.push(
+ {
name: 'R',
icon: "ion-ios-loop-strong",
cmd: 'reset',
@@ -1223,29 +1298,30 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
}
-
NVRDataModel.log("ConfigurePTZ Modal: ControlDB reports PTZ command to be " + $scope.ptzMoveCommand);
})
- .error(function (data) {
+ .error(function(data)
+ {
// console.log("** Error retrieving move PTZ command");
NVRDataModel.log("ConfigurePTZ : Error retrieving PTZ command " + JSON.stringify(data), "error");
});
- } else {
+ }
+ else
+ {
NVRDataModel.log("configurePTZ " + mid + " is not PTZ controllable");
}
})
- .error(function (data) {
+ .error(function(data)
+ {
// console.log("** Error retrieving move PTZ command");
NVRDataModel.log("configurePTZ : Error retrieving PTZ command " + JSON.stringify(data), "error");
});
-
-
}
-
- $scope.$on('modal.shown', function () {
+ $scope.$on('modal.shown', function()
+ {
$scope.monStatus = "";
document.addEventListener("pause", onPause, false);
@@ -1259,24 +1335,25 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
$scope.monStatus = "";
$scope.isCycle = ld.cycleMonitors;
$scope.cycleText = $scope.isCycle ? $translate.instant('kOn') : $translate.instant('kOff');
-
- $scope.quality = (NVRDataModel.getBandwidth()=="lowbw")? zm.monSingleImageQualityLowBW:ld.monSingleImageQuality;
+
+ $scope.quality = (NVRDataModel.getBandwidth() == "lowbw") ? zm.monSingleImageQualityLowBW : ld.monSingleImageQuality;
configurePTZ($scope.monitorId);
- if (ld.cycleMonitors) {
+ if (ld.cycleMonitors)
+ {
NVRDataModel.debug("Cycling enabled at " + ld.cycleMonitorsInterval);
$interval.cancel(cycleHandle);
- cycleHandle = $interval(function () {
+ cycleHandle = $interval(function()
+ {
moveToMonitor($scope.monitorId, 1);
// console.log ("Refreshing Image...");
}.bind(this), ld.cycleMonitorsInterval * 1000);
}
-
});
-}]); \ No newline at end of file
+}]);
diff --git a/www/js/MontageCtrl.js b/www/js/MontageCtrl.js
index 6e7571ce..376356b9 100644
--- a/www/js/MontageCtrl.js
+++ b/www/js/MontageCtrl.js
@@ -3,164 +3,173 @@
/* jslint browser: true*/
/* global cordova,StatusBar,angular,console,ionic,Packery, Draggabilly, imagesLoaded, ConnectSDK, moment */
-
angular.module('zmApp.controllers')
- .controller('zmApp.MontageCtrl', ['$scope', '$rootScope', 'NVRDataModel', 'message', '$ionicSideMenuDelegate', '$timeout', '$interval', '$ionicModal', '$ionicLoading', '$http', '$state', '$ionicPopup', '$stateParams', '$ionicHistory', '$ionicScrollDelegate', '$ionicPlatform', 'zm', '$ionicPopover', '$controller', 'imageLoadingDataShare', '$window', '$localstorage', '$translate', function ($scope, $rootScope, NVRDataModel, message, $ionicSideMenuDelegate, $timeout, $interval, $ionicModal, $ionicLoading, $http, $state, $ionicPopup, $stateParams, $ionicHistory, $ionicScrollDelegate, $ionicPlatform, zm, $ionicPopover, $controller, imageLoadingDataShare, $window, $localstorage, $translate) {
-
- //---------------------------------------------------------------------
- // Controller main
- //---------------------------------------------------------------------
-
- var intervalHandleMontage; // image re-load handler
- var intervalHandleAlarmStatus; // status of each alarm state
-
-
- var gridcontainer;
- var pckry, draggie;
- var draggies;
- var loginData;
- var timestamp;
- var sizeInProgress;
- var modalIntervalHandle;
- var ld;
- var refreshSec;
-
-
- //--------------------------------------------------------------------------------------
- // Handles bandwidth change, if required
- //
- //--------------------------------------------------------------------------------------
-
- $rootScope.$on("bandwidth-change", function (e,data) {
- // not called for offline, I'm only interested in BW switches
- NVRDataModel.debug("Got network change:" + data);
- var ds;
- if (data == 'lowbw') {
- ds = $translate.instant('kLowBWDisplay');
- } else {
- ds = $translate.instant('kHighBWDisplay');
- }
- NVRDataModel.displayBanner('net', [ds]);
- var ld = NVRDataModel.getLogin();
- refreshSec = (NVRDataModel.getBandwidth()=='lowbw') ? ld.refreshSecLowBW : ld.refreshSec;
- $interval.cancel(intervalHandleMontage);
- intervalHandleMontage = $interval(function () {
- loadNotifications();
- }.bind(this), refreshSec * 1000);
-
-
- if (NVRDataModel.getBandwidth() == 'lowbw')
- {
- NVRDataModel.debug("Enabling low bandwidth parameters");
- $scope.LoginData.montageQuality = zm.montageQualityLowBW;
- $scope.LoginData.singleImageQuality = zm.eventSingleImageQualityLowBW;
- $scope.LoginData.montageHistoryQuality = zm.montageQualityLowBW;
-
- }
- });
-
-
- // --------------------------------------------------------
- // Handling of back button in case modal is open should
- // close the modal
- // --------------------------------------------------------
+ .controller('zmApp.MontageCtrl', ['$scope', '$rootScope', 'NVRDataModel', 'message', '$ionicSideMenuDelegate', '$timeout', '$interval', '$ionicModal', '$ionicLoading', '$http', '$state', '$ionicPopup', '$stateParams', '$ionicHistory', '$ionicScrollDelegate', '$ionicPlatform', 'zm', '$ionicPopover', '$controller', 'imageLoadingDataShare', '$window', '$localstorage', '$translate', function($scope, $rootScope, NVRDataModel, message, $ionicSideMenuDelegate, $timeout, $interval, $ionicModal, $ionicLoading, $http, $state, $ionicPopup, $stateParams, $ionicHistory, $ionicScrollDelegate, $ionicPlatform, zm, $ionicPopover, $controller, imageLoadingDataShare, $window, $localstorage, $translate)
+ {
+ //---------------------------------------------------------------------
+ // Controller main
+ //---------------------------------------------------------------------
+
+ var intervalHandleMontage; // image re-load handler
+ var intervalHandleAlarmStatus; // status of each alarm state
+
+ var gridcontainer;
+ var pckry, draggie;
+ var draggies;
+ var loginData;
+ var timestamp;
+ var sizeInProgress;
+ var modalIntervalHandle;
+ var ld;
+ var refreshSec;
+
+ //--------------------------------------------------------------------------------------
+ // Handles bandwidth change, if required
+ //
+ //--------------------------------------------------------------------------------------
+
+ $rootScope.$on("bandwidth-change", function(e, data)
+ {
+ // not called for offline, I'm only interested in BW switches
+ NVRDataModel.debug("Got network change:" + data);
+ var ds;
+ if (data == 'lowbw')
+ {
+ ds = $translate.instant('kLowBWDisplay');
+ }
+ else
+ {
+ ds = $translate.instant('kHighBWDisplay');
+ }
+ NVRDataModel.displayBanner('net', [ds]);
+ var ld = NVRDataModel.getLogin();
+ refreshSec = (NVRDataModel.getBandwidth() == 'lowbw') ? ld.refreshSecLowBW : ld.refreshSec;
+ $interval.cancel(intervalHandleMontage);
+ intervalHandleMontage = $interval(function()
+ {
+ loadNotifications();
+ }.bind(this), refreshSec * 1000);
- $ionicPlatform.registerBackButtonAction(function (e) {
- e.preventDefault();
- if ($scope.modal != undefined && $scope.modal.isShown()) {
- // switch off awake, as liveview is finished
- NVRDataModel.debug("Modal is open, closing it");
- NVRDataModel.setAwake(false);
- $scope.isModalActive = false;
- cleanupOnClose();
- } else {
- NVRDataModel.debug("Modal is closed, so toggling or exiting");
- if (!$ionicSideMenuDelegate.isOpenLeft()) {
- $ionicSideMenuDelegate.toggleLeft();
+ if (NVRDataModel.getBandwidth() == 'lowbw')
+ {
+ NVRDataModel.debug("Enabling low bandwidth parameters");
+ $scope.LoginData.montageQuality = zm.montageQualityLowBW;
+ $scope.LoginData.singleImageQuality = zm.eventSingleImageQualityLowBW;
+ $scope.LoginData.montageHistoryQuality = zm.montageQualityLowBW;
- } else {
- navigator.app.exitApp();
}
+ });
- }
+ // --------------------------------------------------------
+ // Handling of back button in case modal is open should
+ // close the modal
+ // --------------------------------------------------------
- }, 1000);
+ $ionicPlatform.registerBackButtonAction(function(e)
+ {
+ e.preventDefault();
+ if ($scope.modal != undefined && $scope.modal.isShown())
+ {
+ // switch off awake, as liveview is finished
+ NVRDataModel.debug("Modal is open, closing it");
+ NVRDataModel.setAwake(false);
+ $scope.isModalActive = false;
+ cleanupOnClose();
+ }
+ else
+ {
+ NVRDataModel.debug("Modal is closed, so toggling or exiting");
+ if (!$ionicSideMenuDelegate.isOpenLeft())
+ {
+ $ionicSideMenuDelegate.toggleLeft();
- /*$scope.toggleHide = function(mon)
- {
-
-
- if (mon.Monitor.listDisplay == 'noshow')
- mon.Monitor.listDisplay = 'show';
- else
- mon.Monitor.listDisplay = 'noshow';
+ }
+ else
+ {
+ navigator.app.exitApp();
+ }
-
-
- };*/
+ }
+ }, 1000);
+ /*$scope.toggleHide = function(mon)
+ {
+
+ if (mon.Monitor.listDisplay == 'noshow')
+ mon.Monitor.listDisplay = 'show';
+ else
+ mon.Monitor.listDisplay = 'noshow';
- // called by afterEnter to load Packery
- function initPackery() {
+
+
+ };*/
+ // called by afterEnter to load Packery
+ function initPackery()
+ {
- $ionicLoading.show({
- template: $translate.instant('kArrangingImages'),
- noBackdrop: true,
- duration: zm.loadingTimeout
- });
+ $ionicLoading.show(
+ {
+ template: $translate.instant('kArrangingImages'),
+ noBackdrop: true,
+ duration: zm.loadingTimeout
+ });
- var progressCalled = false;
- draggies = [];
- var layouttype = true;
- var ld = NVRDataModel.getLogin();
+ var progressCalled = false;
+ draggies = [];
+ var layouttype = true;
+ var ld = NVRDataModel.getLogin();
+ var positionsStr = ld.packeryPositions;
+ var positions = {};
- var positionsStr = ld.packeryPositions;
- var positions = {};
+ if (positionsStr == '')
+ {
+ NVRDataModel.log("Did NOT find a packery layout");
+ layouttype = true;
+ }
+ else
+ {
- if (positionsStr == '') {
- NVRDataModel.log("Did NOT find a packery layout");
- layouttype = true;
- } else {
+ //console.log ("POSITION STR IS " + positionsStr);
+ positions = JSON.parse(positionsStr);
+ NVRDataModel.log("found a packery layout");
- //console.log ("POSITION STR IS " + positionsStr);
- positions = JSON.parse(positionsStr);
- NVRDataModel.log("found a packery layout");
-
- layouttype = false;
- }
+ layouttype = false;
+ }
+ var cnt = 0;
+ $scope.MontageMonitors.forEach(function(elem)
+ {
+ if ((elem.Monitor.Enabled != '0') && (elem.Monitor.Function != 'None'))
+ cnt++;
+ });
- var cnt = 0;
- $scope.MontageMonitors.forEach(function (elem) {
- if ((elem.Monitor.Enabled != '0') && (elem.Monitor.Function != 'None'))
- cnt++;
- });
+ NVRDataModel.log("Monitors that are active and not DOM hidden: " + cnt + " while grid has " + positions.length);
- NVRDataModel.log("Monitors that are active and not DOM hidden: " + cnt + " while grid has " + positions.length);
+ if (cnt > NVRDataModel.getLogin().maxMontage)
+ {
+ cnt = NVRDataModel.getLogin().maxMontage;
+ NVRDataModel.log("restricting monitor count to " + cnt + " due to max-montage setting");
+ }
- if (cnt > NVRDataModel.getLogin().maxMontage) {
- cnt = NVRDataModel.getLogin().maxMontage;
- NVRDataModel.log("restricting monitor count to " + cnt + " due to max-montage setting");
- }
+ if (cnt != positions.length)
+ {
- if (cnt != positions.length) {
+ NVRDataModel.log("Whoops!! Monitors have changed. I'm resetting layouts, sorry!");
+ layouttype = true;
+ positions = {};
+ }
- NVRDataModel.log("Whoops!! Monitors have changed. I'm resetting layouts, sorry!");
- layouttype = true;
- positions = {};
- }
+ var elem = angular.element(document.getElementById("mygrid"));
- var elem = angular.element(document.getElementById("mygrid"));
+ //console.log ("**** mygrid is " + JSON.stringify(elem));
- //console.log ("**** mygrid is " + JSON.stringify(elem));
-
-
- pckry = new Packery('.grid', {
+ pckry = new Packery('.grid',
+ {
itemSelector: '.grid-item',
percentPosition: true,
columnWidth: '.grid-sizer',
@@ -169,1163 +178,1206 @@ angular.module('zmApp.controllers')
});
- imagesLoaded(elem).on('progress', function (instance, img) {
+ imagesLoaded(elem).on('progress', function(instance, img)
+ {
- var result = img.isLoaded ? 'loaded' : 'broken';
- NVRDataModel.debug( '~~loaded image is ' + result + ' for ' + img.img.src );
- pckry.layout();
- progressCalled = true;
-
+ var result = img.isLoaded ? 'loaded' : 'broken';
+ NVRDataModel.debug('~~loaded image is ' + result + ' for ' + img.img.src);
+ pckry.layout();
+ progressCalled = true;
- // if (layouttype) $timeout (function(){layout(pckry);},100);
- });
+ // if (layouttype) $timeout (function(){layout(pckry);},100);
+ });
- imagesLoaded(elem).on('always', function () {
- //console.log ("******** ALL IMAGES LOADED");
- // $scope.$digest();
- NVRDataModel.debug("All images loaded");
-
- $scope.areImagesLoading = false;
-
+ imagesLoaded(elem).on('always', function()
+ {
+ //console.log ("******** ALL IMAGES LOADED");
+ // $scope.$digest();
+ NVRDataModel.debug("All images loaded");
- $ionicLoading.hide();
+ $scope.areImagesLoading = false;
- if (!progressCalled) {
- NVRDataModel.log("*** PROGRESS WAS NOT CALLED");
- pckry.reloadItems();
- }
-
-
- $timeout(function () {
-
- pckry.getItemElements().forEach(function (itemElem) {
-
- draggie = new Draggabilly(itemElem);
- pckry.bindDraggabillyEvents(draggie);
- draggies.push(draggie);
- draggie.disable();
- draggie.unbindHandles();
- });
+ $ionicLoading.hide();
- pckry.on('dragItemPositioned', itemDragged);
+ if (!progressCalled)
+ {
+ NVRDataModel.log("*** PROGRESS WAS NOT CALLED");
+ pckry.reloadItems();
+ }
+ $timeout(function()
+ {
+ pckry.getItemElements().forEach(function(itemElem)
+ {
- if (!isEmpty(positions)) {
- NVRDataModel.log("Arranging as per packery grid");
+ draggie = new Draggabilly(itemElem);
+ pckry.bindDraggabillyEvents(draggie);
+ draggies.push(draggie);
+ draggie.disable();
+ draggie.unbindHandles();
+ });
- for (var i = 0; i < $scope.MontageMonitors.length; i++) {
- for (var j = 0; j < positions.length; j++) {
- if ($scope.MontageMonitors[i].Monitor.Id == positions[j].attr) {
- $scope.MontageMonitors[i].Monitor.gridScale = positions[j].size;
- $scope.MontageMonitors[i].Monitor.listDisplay = positions[j].display;
- NVRDataModel.debug("Setting monitor ID: " + $scope.MontageMonitors[i].Monitor.Id + " to size: " + positions[j].size + " and display:" + positions[j].display);
+ pckry.on('dragItemPositioned', itemDragged);
+
+ if (!isEmpty(positions))
+ {
+ NVRDataModel.log("Arranging as per packery grid");
+
+ for (var i = 0; i < $scope.MontageMonitors.length; i++)
+ {
+ for (var j = 0; j < positions.length; j++)
+ {
+ if ($scope.MontageMonitors[i].Monitor.Id == positions[j].attr)
+ {
+ $scope.MontageMonitors[i].Monitor.gridScale = positions[j].size;
+ $scope.MontageMonitors[i].Monitor.listDisplay = positions[j].display;
+ NVRDataModel.debug("Setting monitor ID: " + $scope.MontageMonitors[i].Monitor.Id + " to size: " + positions[j].size + " and display:" + positions[j].display);
+ }
+ //console.log ("Index:"+positions[j].attr+ " with size: " + positions[j].size);
}
- //console.log ("Index:"+positions[j].attr+ " with size: " + positions[j].size);
}
- }
+ NVRDataModel.debug("All images loaded, doing image layout");
- NVRDataModel.debug("All images loaded, doing image layout");
-
-
- }
- $timeout(function () {
- NVRDataModel.log("Force calling resize");
- pckry.reloadItems();
- //pckry.initShiftLayout(positions,"data-item-id");
- // now do a jiggle
- $timeout (function() {pckry.layout(); } ,300);
-
- }, 20);
-
-
+ }
+ $timeout(function()
+ {
+ NVRDataModel.log("Force calling resize");
+ pckry.reloadItems();
+ //pckry.initShiftLayout(positions,"data-item-id");
+ // now do a jiggle
+ $timeout(function()
+ {
+ pckry.layout();
+ }, 300);
- //pckry.onresize();
+ }, 20);
- }, 20);
+ //pckry.onresize();
- });
+ }, 20);
+ });
+ function itemDragged(item)
+ {
+ NVRDataModel.debug("drag complete");
- function itemDragged(item) {
- NVRDataModel.debug("drag complete");
+ //pckry.getItemElements().forEach(function (itemElem) {
- //pckry.getItemElements().forEach(function (itemElem) {
+ //console.log (itemElem.attributes['data-item-id'].value+" size "+itemElem.attributes['data-item-size'].value );
+ // });
- //console.log (itemElem.attributes['data-item-id'].value+" size "+itemElem.attributes['data-item-size'].value );
- // });
+ var positions = pckry.getShiftPositions('data-item-id');
+ //console.log ("POSITIONS MAP " + JSON.stringify(positions));
+ var ld = NVRDataModel.getLogin();
+ ld.packeryPositions = JSON.stringify(positions);
+ //console.log ("Saving " + ld.packeryPositions);
+ NVRDataModel.setLogin(ld);
+ }
- var positions = pckry.getShiftPositions('data-item-id');
- //console.log ("POSITIONS MAP " + JSON.stringify(positions));
- var ld = NVRDataModel.getLogin();
- ld.packeryPositions = JSON.stringify(positions);
- //console.log ("Saving " + ld.packeryPositions);
- NVRDataModel.setLogin(ld);
}
-
- }
-
-
- function isEmpty(obj) {
- for (var prop in obj) {
- return false;
- }
- return true;
- }
-
- //-----------------------------------------------------------------------
- // color for monitor state in montage
- //-----------------------------------------------------------------------
-
- $scope.stateColor = function () {
- //console.log ("***MONSTATUS**"+$scope.monStatus+"**");
- var attr = "";
- switch ($scope.monStatus) {
- case "":
- attr = "color:rgba(0, 0, 0, 0)";
- break;
- case "idle":
- attr = "color:rgba(0, 0, 0, 0)";
- break;
- case "pre-alarm":
- attr = "color:#e67e22";
- break;
- case "alarmed":
- attr = "color:#D91E18";
- break;
- case "alert":
- attr = "color:#e67e22";
- break;
- case "record":
- attr = "color:#26A65B";
- break;
+ function isEmpty(obj)
+ {
+ for (var prop in obj)
+ {
+ return false;
+ }
+ return true;
}
- return attr;
- };
+ //-----------------------------------------------------------------------
+ // color for monitor state in montage
+ //-----------------------------------------------------------------------
- //-----------------------------------------------------------------------
- // cycle through all displayed monitors and check alarm status
- //-----------------------------------------------------------------------
+ $scope.stateColor = function()
+ {
+ //console.log ("***MONSTATUS**"+$scope.monStatus+"**");
+ var attr = "";
+ switch ($scope.monStatus)
+ {
+ case "":
+ attr = "color:rgba(0, 0, 0, 0)";
+ break;
+ case "idle":
+ attr = "color:rgba(0, 0, 0, 0)";
+ break;
+ case "pre-alarm":
+ attr = "color:#e67e22";
+ break;
+ case "alarmed":
+ attr = "color:#D91E18";
+ break;
+ case "alert":
+ attr = "color:#e67e22";
+ break;
+ case "record":
+ attr = "color:#26A65B";
+ break;
+ }
- function loadAlarmStatus() {
+ return attr;
+ };
+
+ //-----------------------------------------------------------------------
+ // cycle through all displayed monitors and check alarm status
+ //-----------------------------------------------------------------------
- if ((NVRDataModel.versionCompare($rootScope.apiVersion, "1.30") == -1) ||
- (NVRDataModel.getBandwidth() == 'lowbw') ||
- (NVRDataModel.getLogin().disableAlarmCheckMontage == true))
+ function loadAlarmStatus()
{
- return;
- }
+ if ((NVRDataModel.versionCompare($rootScope.apiVersion, "1.30") == -1) ||
+ (NVRDataModel.getBandwidth() == 'lowbw') ||
+ (NVRDataModel.getLogin().disableAlarmCheckMontage == true))
+ {
-
+ return;
+ }
+
+ for (var i = 0; i < $scope.MontageMonitors.length; i++)
+ {
+ if (($scope.MontageMonitors[i].Monitor.Function == 'None') ||
+ ($scope.MontageMonitors[i].Monitor.Enabled == '0') ||
+ ($scope.MontageMonitors[i].Monitor.listDisplay == 'noshow'))
+ {
+ continue;
+ }
+ getAlarmStatus($scope.MontageMonitors[i]);
- for (var i = 0; i < $scope.MontageMonitors.length; i++) {
- if (($scope.MontageMonitors[i].Monitor.Function == 'None') ||
- ($scope.MontageMonitors[i].Monitor.Enabled == '0') ||
- ($scope.MontageMonitors[i].Monitor.listDisplay == 'noshow')) {
- continue;
}
- getAlarmStatus($scope.MontageMonitors[i]);
}
- }
-
- //-----------------------------------------------------------------------
- // get alarm status over HTTP for a single monitor
- //-----------------------------------------------------------------------
- function getAlarmStatus(monitor) {
- var apiurl = NVRDataModel.getLogin().apiurl;
- //console.log ("ALARM CALLED WITH " +JSON.stringify(monitor));
-
- var alarmurl = apiurl + "/monitors/alarm/id:" + monitor.Monitor.Id + "/command:status.json";
- // console.log("Alarm Check: Invoking " + alarmurl);
-
-
- $http.get(alarmurl)
- .then(function (data) {
- // NVRDataModel.debug ("Success in monitor alarmed status " + JSON.stringify(data));
-
- var sid = parseInt(data.data.status);
- switch (sid) {
- case 0: // idle
- monitor.Monitor.alarmState = 'color:rgba(0,0,0,0);';
- break;
- case 1: // pre alarm
- monitor.Monitor.alarmState = 'color:#e67e22;';
- break;
- case 2: // alarm
- monitor.Monitor.alarmState = 'color:#D91E18;';
- break;
- case 3: // alert
- monitor.Monitor.alarmState = 'color:#e67e22;';
- break;
- case 4:
- monitor.Monitor.alarmState = 'color:#26A65B;';
- break;
+ //-----------------------------------------------------------------------
+ // get alarm status over HTTP for a single monitor
+ //-----------------------------------------------------------------------
+ function getAlarmStatus(monitor)
+ {
+ var apiurl = NVRDataModel.getLogin().apiurl;
+ //console.log ("ALARM CALLED WITH " +JSON.stringify(monitor));
+
+ var alarmurl = apiurl + "/monitors/alarm/id:" + monitor.Monitor.Id + "/command:status.json";
+ // console.log("Alarm Check: Invoking " + alarmurl);
+
+ $http.get(alarmurl)
+ .then(function(data)
+ {
+ // NVRDataModel.debug ("Success in monitor alarmed status " + JSON.stringify(data));
+
+ var sid = parseInt(data.data.status);
+ switch (sid)
+ {
+ case 0: // idle
+ monitor.Monitor.alarmState = 'color:rgba(0,0,0,0);';
+ break;
+ case 1: // pre alarm
+ monitor.Monitor.alarmState = 'color:#e67e22;';
+ break;
+ case 2: // alarm
+ monitor.Monitor.alarmState = 'color:#D91E18;';
+ break;
+ case 3: // alert
+ monitor.Monitor.alarmState = 'color:#e67e22;';
+ break;
+ case 4:
+ monitor.Monitor.alarmState = 'color:#26A65B;';
+ break;
- }
+ }
- },
- function (error) {
+ },
+ function(error)
+ {
+ monitor.Monitor.alarmState = 'color:rgba(0,0,0,0);';
+ NVRDataModel.debug("Error in monitor alarmed status ");
+ });
+ }
- monitor.Monitor.alarmState = 'color:rgba(0,0,0,0);';
- NVRDataModel.debug("Error in monitor alarmed status ");
- });
- }
+ //-----------------------------------------------------------------------
+ // re-compute rand so snapshot in montage reloads
+ //-----------------------------------------------------------------------
+
+ function loadNotifications()
+ {
+ if ($scope.areImagesLoading)
+ {
+ NVRDataModel.debug("skipping image refresh, packery is still loading");
+ return;
+ }
- //-----------------------------------------------------------------------
- // re-compute rand so snapshot in montage reloads
- //-----------------------------------------------------------------------
+ //if (pckry && !$scope.isDragabillyOn) pckry.shiftLayout();
+ $rootScope.rand = Math.floor((Math.random() * 100000) + 1);
- function loadNotifications() {
+ // if you see the time move, montage should move
+
+ if ($scope.iconTimeNow == 'local')
+ $scope.timeNow = moment().format(NVRDataModel.getTimeFormatSec());
+ else
+ $scope.timeNow = moment().tz(NVRDataModel.getTimeZoneNow()).format(NVRDataModel.getTimeFormatSec());
+ //$scope.timeNow = moment().format(NVRDataModel.getTimeFormatSec());
+
+ //console.log ("Inside Montage timer...");
- if ($scope.areImagesLoading) {
- NVRDataModel.debug("skipping image refresh, packery is still loading");
- return;
}
- //if (pckry && !$scope.isDragabillyOn) pckry.shiftLayout();
- $rootScope.rand = Math.floor((Math.random() * 100000) + 1);
-
- // if you see the time move, montage should move
-
- if ($scope.iconTimeNow == 'local')
- $scope.timeNow = moment().format(NVRDataModel.getTimeFormatSec());
- else
- $scope.timeNow = moment().tz(NVRDataModel.getTimeZoneNow()).format(NVRDataModel.getTimeFormatSec());
- //$scope.timeNow = moment().format(NVRDataModel.getTimeFormatSec());
+ $scope.cancelReorder = function()
+ {
+ $scope.modal.remove();
+ };
- //console.log ("Inside Montage timer...");
+ $scope.saveReorder = function()
+ {
+ NVRDataModel.debug("Saving monitor hide/unhide");
- }
+ // redo packery as monitor status has changed
+ // DOM may need reloading if you've hidden/unhidden stuff
+ $scope.MontageMonitors = $scope.copyMontage;
+ $scope.modal.remove();
- $scope.cancelReorder = function () {
- $scope.modal.remove();
- };
+ $timeout(function()
+ {
-
-
-
- $scope.saveReorder = function () {
- NVRDataModel.debug("Saving monitor hide/unhide");
+ draggies.forEach(function(drag)
+ {
+ drag.destroy();
+ });
+ pckry.reloadItems();
+ draggies = [];
+ pckry.once('layoutComplete', savePackeryOrder);
+ pckry.layout();
+ }, 400);
- // redo packery as monitor status has changed
- // DOM may need reloading if you've hidden/unhidden stuff
- $scope.MontageMonitors = $scope.copyMontage;
- $scope.modal.remove();
-
- $timeout(function () {
-
- draggies.forEach(function (drag) {
- drag.destroy();
- });
-
- pckry.reloadItems();
- draggies = [];
- pckry.once ('layoutComplete', savePackeryOrder);
- pckry.layout();
-
-
-
- }, 400);
-
- function savePackeryOrder ()
- {
- $timeout(function () {
+ function savePackeryOrder()
+ {
+ $timeout(function()
+ {
var positions = pckry.getShiftPositions('data-item-id');
NVRDataModel.debug("POSITIONS MAP " + JSON.stringify(positions));
var ld = NVRDataModel.getLogin();
ld.packeryPositions = JSON.stringify(positions);
//console.log ("Savtogging " + ld.packeryPositions);
NVRDataModel.setLogin(ld);
-
- pckry.getItemElements().forEach(function (itemElem) {
+
+ pckry.getItemElements().forEach(function(itemElem)
+ {
draggie = new Draggabilly(itemElem);
pckry.bindDraggabillyEvents(draggie);
draggies.push(draggie);
draggie.disable();
});
-
+
$ionicScrollDelegate.$getByHandle("montage-delegate").scrollTop();
-
- // Now also ask DataModel to update its monitor display status
- NVRDataModel.reloadMonitorDisplayStatus();
- pckry.layout();
- },20);
- }
-
- };
+ // Now also ask DataModel to update its monitor display status
+ NVRDataModel.reloadMonitorDisplayStatus();
+ pckry.layout();
+ }, 20);
+ }
+ };
- $scope.toggleHide = function (i) {
+ $scope.toggleHide = function(i)
+ {
- if ($scope.copyMontage[i].Monitor.listDisplay == 'show')
- $scope.copyMontage[i].Monitor.listDisplay = 'noshow';
- else
- $scope.copyMontage[i].Monitor.listDisplay = 'show';
+ if ($scope.copyMontage[i].Monitor.listDisplay == 'show')
+ $scope.copyMontage[i].Monitor.listDisplay = 'noshow';
+ else
+ $scope.copyMontage[i].Monitor.listDisplay = 'show';
- NVRDataModel.debug("index " + i + " is now " + $scope.copyMontage[i].Monitor.listDisplay);
- };
+ NVRDataModel.debug("index " + i + " is now " + $scope.copyMontage[i].Monitor.listDisplay);
+ };
- $scope.hideUnhide = function () {
- if ($scope.isDragabillyOn) {
- dragToggle();
- }
- // make a copy of the current list and work on that
- // this is to avoid packery screw ups while you are hiding/unhiding
- $scope.copyMontage = angular.copy($scope.MontageMonitors);
- $ionicModal.fromTemplateUrl('templates/reorder-modal.html', {
- scope: $scope,
- animation: 'slide-in-up'
- })
- .then(function (modal) {
- $scope.modal = modal;
- $scope.modal.show();
- });
- };
+ $scope.hideUnhide = function()
+ {
+ if ($scope.isDragabillyOn)
+ {
+ dragToggle();
+ }
+ // make a copy of the current list and work on that
+ // this is to avoid packery screw ups while you are hiding/unhiding
+ $scope.copyMontage = angular.copy($scope.MontageMonitors);
+ $ionicModal.fromTemplateUrl('templates/reorder-modal.html',
+ {
+ scope: $scope,
+ animation: 'slide-in-up'
+ })
+ .then(function(modal)
+ {
+ $scope.modal = modal;
+ $scope.modal.show();
+ });
+ };
+ /*
+ $scope.closeReorderModal = function () {
+
+ $scope.modal.remove();
+ };
+ */
- /*
- $scope.closeReorderModal = function () {
-
- $scope.modal.remove();
+ //----------------------------------------------------------------
+ // Alarm emit handling
+ //----------------------------------------------------------------
+ $rootScope.$on("alarm", function(event, args)
+ {
+ // FIXME: I should probably unregister this instead
+ if (typeof $scope.monitors === undefined)
+ return;
+ //console.log ("***EVENT TRAP***");
+ var alarmMonitors = args.message;
+ for (var i = 0; i < alarmMonitors.length; i++)
+ {
+ //console.log ("**** TRAPPED EVENT: "+alarmMonitors[i]);
- };
- */
-
- //----------------------------------------------------------------
- // Alarm emit handling
- //----------------------------------------------------------------
- $rootScope.$on("alarm", function (event, args) {
- // FIXME: I should probably unregister this instead
- if (typeof $scope.monitors === undefined)
- return;
- //console.log ("***EVENT TRAP***");
- var alarmMonitors = args.message;
- for (var i = 0; i < alarmMonitors.length; i++) {
- //console.log ("**** TRAPPED EVENT: "+alarmMonitors[i]);
-
- for (var j = 0; j < $scope.MontageMonitors.length; j++) {
- if ($scope.MontageMonitors[j].Monitor.Id == alarmMonitors[i]) {
- NVRDataModel.debug("Enabling alarm for Monitor:" + $scope.monitors[j].Monitor.Id);
- $scope.MontageMonitors[j].Monitor.isAlarmed = true;
- scheduleRemoveFlash(j);
+ for (var j = 0; j < $scope.MontageMonitors.length; j++)
+ {
+ if ($scope.MontageMonitors[j].Monitor.Id == alarmMonitors[i])
+ {
+ NVRDataModel.debug("Enabling alarm for Monitor:" + $scope.monitors[j].Monitor.Id);
+ $scope.MontageMonitors[j].Monitor.isAlarmed = true;
+ scheduleRemoveFlash(j);
+ }
}
+
}
+ });
+
+ function scheduleRemoveFlash(id)
+ {
+ NVRDataModel.debug("Scheduled a " + zm.alarmFlashTimer + "ms timer for dis-alarming monitor ID:" + $scope.MontageMonitors[id].Monitor.Id);
+ $timeout(function()
+ {
+ $scope.MontageMonitors[id].Monitor.isAlarmed = false;
+ NVRDataModel.debug("dis-alarming monitor ID:" + $scope.MontageMonitors[id].Monitor.Id);
+ }, zm.alarmFlashTimer);
}
+ //----------------------------------------------------------------
+ // Alarm notification handling
+ //----------------------------------------------------------------
+ $scope.handleAlarms = function()
+ {
+ $rootScope.isAlarm = !$rootScope.isAlarm;
+ if (!$rootScope.isAlarm)
+ {
+ $rootScope.alarmCount = "0";
+ $ionicHistory.nextViewOptions(
+ {
+ disableBack: true
+ });
+ $state.go("events",
+ {
+ "id": 0,
+ "playEvent": false
+ },
+ {
+ reload: true
+ });
+ return;
+ }
+ };
+
+ $scope.handleAlarmsWhileMinimized = function()
+ {
+ $rootScope.isAlarm = !$rootScope.isAlarm;
- });
-
- function scheduleRemoveFlash(id) {
- NVRDataModel.debug("Scheduled a " + zm.alarmFlashTimer + "ms timer for dis-alarming monitor ID:" + $scope.MontageMonitors[id].Monitor.Id);
- $timeout(function () {
- $scope.MontageMonitors[id].Monitor.isAlarmed = false;
- NVRDataModel.debug("dis-alarming monitor ID:" + $scope.MontageMonitors[id].Monitor.Id);
- }, zm.alarmFlashTimer);
- }
-
- //----------------------------------------------------------------
- // Alarm notification handling
- //----------------------------------------------------------------
- $scope.handleAlarms = function () {
- $rootScope.isAlarm = !$rootScope.isAlarm;
- if (!$rootScope.isAlarm) {
- $rootScope.alarmCount = "0";
- $ionicHistory.nextViewOptions({
- disableBack: true
- });
- $state.go("events", {
- "id": 0,
- "playEvent":false
- }, {
- reload: true
- });
- return;
- }
- };
+ $scope.minimal = !$scope.minimal;
+ NVRDataModel.debug("MontageCtrl: switch minimal is " + $scope.minimal);
+ ionic.Platform.fullScreen($scope.minimal, !$scope.minimal);
+ //console.log ("alarms:Cancelling timer");
+ $interval.cancel(intervalHandleMontage);
+ $interval.cancel(intervalHandleAlarmStatus);
- $scope.handleAlarmsWhileMinimized = function () {
- $rootScope.isAlarm = !$rootScope.isAlarm;
+ if (!$rootScope.isAlarm)
+ {
+ $rootScope.alarmCount = "0";
+ $ionicHistory.nextViewOptions(
+ {
+ disableBack: true
+ });
+ $state.go("events",
+ {
+ "id": 0,
+ "playEvent": false
+ },
+ {
+ reload: true
+ });
+ return;
+ }
+ };
- $scope.minimal = !$scope.minimal;
- NVRDataModel.debug("MontageCtrl: switch minimal is " + $scope.minimal);
- ionic.Platform.fullScreen($scope.minimal, !$scope.minimal);
- //console.log ("alarms:Cancelling timer");
- $interval.cancel(intervalHandleMontage);
- $interval.cancel(intervalHandleAlarmStatus);
+ //-------------------------------------------------------------
+ // this is checked to make sure we are not pulling images
+ // when app is in background. This is a problem with Android,
+ // for example
+ //-------------------------------------------------------------
- if (!$rootScope.isAlarm) {
- $rootScope.alarmCount = "0";
- $ionicHistory.nextViewOptions({
+ $scope.isBackground = function()
+ {
+ //console.log ("Is background called from Montage and returned " +
+ //NVRDataModel.isBackground());
+ return NVRDataModel.isBackground();
+ };
+
+ //---------------------------------------------------------------------
+ // Triggered when you enter/exit full screen
+ //---------------------------------------------------------------------
+ $scope.switchMinimal = function()
+ {
+ $scope.minimal = !$scope.minimal;
+ NVRDataModel.debug("MontageCtrl: switch minimal is " + $scope.minimal);
+ // console.log("Hide Statusbar");
+ ionic.Platform.fullScreen($scope.minimal, !$scope.minimal);
+ //console.log ("minimal switch:Cancelling timer");
+ $interval.cancel(intervalHandleMontage); //we will renew on reload
+ $interval.cancel(intervalHandleAlarmStatus);
+ // We are reloading this view, so we don't want entry animations
+ $ionicHistory.nextViewOptions(
+ {
+ disableAnimate: true,
disableBack: true
});
- $state.go("events", {
- "id": 0,
- "playEvent":false
- }, {
- reload: true
+ $state.go("montage",
+ {
+ minimal: $scope.minimal,
+ isRefresh: true
});
return;
- }
- };
-
-
- //-------------------------------------------------------------
- // this is checked to make sure we are not pulling images
- // when app is in background. This is a problem with Android,
- // for example
- //-------------------------------------------------------------
-
- $scope.isBackground = function () {
- //console.log ("Is background called from Montage and returned " +
- //NVRDataModel.isBackground());
- return NVRDataModel.isBackground();
- };
-
-
- //---------------------------------------------------------------------
- // Triggered when you enter/exit full screen
- //---------------------------------------------------------------------
- $scope.switchMinimal = function () {
- $scope.minimal = !$scope.minimal;
- NVRDataModel.debug("MontageCtrl: switch minimal is " + $scope.minimal);
- // console.log("Hide Statusbar");
- ionic.Platform.fullScreen($scope.minimal, !$scope.minimal);
- //console.log ("minimal switch:Cancelling timer");
- $interval.cancel(intervalHandleMontage); //we will renew on reload
- $interval.cancel(intervalHandleAlarmStatus);
- // We are reloading this view, so we don't want entry animations
- $ionicHistory.nextViewOptions({
- disableAnimate: true,
- disableBack: true
- });
- $state.go("montage", {
- minimal: $scope.minimal,
- isRefresh: true
- });
- return;
- };
-
- //---------------------------------------------------------------------
- // Show/Hide PTZ control in monitor view
- //---------------------------------------------------------------------
- $scope.togglePTZ = function () {
- $scope.showPTZ = !$scope.showPTZ;
- };
-
+ };
+ //---------------------------------------------------------------------
+ // Show/Hide PTZ control in monitor view
+ //---------------------------------------------------------------------
+ $scope.togglePTZ = function()
+ {
+ $scope.showPTZ = !$scope.showPTZ;
+ };
- $scope.toggleSelectItem = function (ndx) {
+ $scope.toggleSelectItem = function(ndx)
+ {
- if ($scope.MontageMonitors[ndx].Monitor.selectStyle !== "undefined" && $scope.MontageMonitors[ndx].Monitor.selectStyle == "dragborder-selected") {
- $scope.MontageMonitors[ndx].Monitor.selectStyle = "";
- } else {
- $scope.MontageMonitors[ndx].Monitor.selectStyle = "dragborder-selected";
- }
- //console.log ("Switched value to " + $scope.MontageMonitors[ndx].Monitor.selectStyle);
- };
+ if ($scope.MontageMonitors[ndx].Monitor.selectStyle !== "undefined" && $scope.MontageMonitors[ndx].Monitor.selectStyle == "dragborder-selected")
+ {
+ $scope.MontageMonitors[ndx].Monitor.selectStyle = "";
+ }
+ else
+ {
+ $scope.MontageMonitors[ndx].Monitor.selectStyle = "dragborder-selected";
+ }
+ //console.log ("Switched value to " + $scope.MontageMonitors[ndx].Monitor.selectStyle);
+ };
- //---------------------------------------------------------------------
- // Called when you enable/disable dragging
- //---------------------------------------------------------------------
+ //---------------------------------------------------------------------
+ // Called when you enable/disable dragging
+ //---------------------------------------------------------------------
- $scope.dragToggle = function () {
- dragToggle();
+ $scope.dragToggle = function()
+ {
+ dragToggle();
+ };
- };
+ function dragToggle()
+ {
+ var i;
+ $scope.isDragabillyOn = !$scope.isDragabillyOn;
- function dragToggle() {
- var i;
- $scope.isDragabillyOn = !$scope.isDragabillyOn;
+ $ionicSideMenuDelegate.canDragContent($scope.isDragabillyOn ? false : true);
- $ionicSideMenuDelegate.canDragContent($scope.isDragabillyOn ? false : true);
+ //$timeout(function(){pckry.reloadItems();},10);
+ NVRDataModel.debug("setting dragabilly to " + $scope.isDragabillyOn);
+ if ($scope.isDragabillyOn)
+ {
+ $scope.showSizeButtons = true;
- //$timeout(function(){pckry.reloadItems();},10);
- NVRDataModel.debug("setting dragabilly to " + $scope.isDragabillyOn);
- if ($scope.isDragabillyOn) {
- $scope.showSizeButtons = true;
+ $scope.dragBorder = "dragborder";
+ NVRDataModel.debug("Enabling drag for " + draggies.length + " items");
+ for (i = 0; i < draggies.length; i++)
+ {
+ draggies[i].enable();
+ draggies[i].bindHandles();
+ }
- $scope.dragBorder = "dragborder";
- NVRDataModel.debug("Enabling drag for " + draggies.length + " items");
- for (i = 0; i < draggies.length; i++) {
- draggies[i].enable();
- draggies[i].bindHandles();
+ // reflow and reload as some may be hidden
+ // $timeout(function(){pckry.reloadItems();$timeout(function(){pckry.layout();},300);},100);
}
+ else
+ {
+ $scope.dragBorder = "";
+ NVRDataModel.debug("Disabling drag for " + draggies.length + " items");
+ for (i = 0; i < draggies.length; i++)
+ {
+ draggies[i].disable();
+ draggies[i].unbindHandles();
+ }
+ for (i = 0; i < $scope.MontageMonitors.length; i++)
+ {
+ $scope.MontageMonitors[i].Monitor.selectStyle = "";
+ }
+ // reflow and reload as some may be hidden
+ $timeout(function()
+ {
+ $timeout(function()
+ {
+ var positions = pckry.getShiftPositions('data-item-id');
+ //console.log ("POSITIONS MAP " + JSON.stringify(positions));
+ var ld = NVRDataModel.getLogin();
+ ld.packeryPositions = JSON.stringify(positions);
+ //console.log ("Saving " + ld.packeryPositions);
+ NVRDataModel.setLogin(ld);
+ }, 300);
+ }, 100);
- // reflow and reload as some may be hidden
- // $timeout(function(){pckry.reloadItems();$timeout(function(){pckry.layout();},300);},100);
- } else {
- $scope.dragBorder = "";
- NVRDataModel.debug("Disabling drag for " + draggies.length + " items");
- for (i = 0; i < draggies.length; i++) {
- draggies[i].disable();
- draggies[i].unbindHandles();
- }
- for (i = 0; i < $scope.MontageMonitors.length; i++) {
- $scope.MontageMonitors[i].Monitor.selectStyle = "";
}
- // reflow and reload as some may be hidden
- $timeout(function () {
- $timeout(function () {
- var positions = pckry.getShiftPositions('data-item-id');
- //console.log ("POSITIONS MAP " + JSON.stringify(positions));
- var ld = NVRDataModel.getLogin();
- ld.packeryPositions = JSON.stringify(positions);
- //console.log ("Saving " + ld.packeryPositions);
- NVRDataModel.setLogin(ld);
- }, 300);
- }, 100);
-
}
- }
-
-
-
- //---------------------------------------------------------------------
- // main monitor modal open - if drag is not on, this is called on touch
- //---------------------------------------------------------------------
-
- $scope.openModal = function (mid, controllable, controlid, connKey, monitor) {
- openModal(mid, controllable, controlid, connKey, monitor);
- };
-
- function openModal(mid, controllable, controlid, connKey, monitor) {
- NVRDataModel.debug("MontageCtrl: Open Monitor Modal with monitor Id=" + mid + " and Controllable:" + controllable + " with control ID:" + controlid);
- // $scope.isModalActive = true;
- // Note: no need to setAwake(true) as its already awake
- // in montage view
-
- NVRDataModel.log("Cancelling montage timer, opening Modal");
- // NVRDataModel.log("Starting Modal timer");
- //console.log ("openModal:Cancelling timer");
- $interval.cancel(intervalHandleMontage);
- $interval.cancel(intervalHandleAlarmStatus);
-
- $scope.monitor = monitor;
- $scope.showPTZ = false;
- $scope.monitorId = mid;
- $scope.monitorName = NVRDataModel.getMonitorName(mid);
- $scope.controlid = controlid;
-
- //$scope.LoginData = NVRDataModel.getLogin();
- $rootScope.modalRand = Math.floor(Math.random() * (999999 - 111111 + 1)) + 111111;
-
-
- $scope.ptzMoveCommand = "";
- $scope.ptzStopCommand = "";
- $scope.zoomInCommand = "";
- $scope.zoomOutCommand = "";
- $scope.zoomStopCommand = "zoomStop";
- $scope.canZoom = false;
-
- $scope.presetOn = false;
-
- $scope.connKey = (Math.floor((Math.random() * 999999) + 1)).toString();
- $scope.isControllable = controllable;
- $scope.refMonitor = monitor;
+ //---------------------------------------------------------------------
+ // main monitor modal open - if drag is not on, this is called on touch
+ //---------------------------------------------------------------------
+ $scope.openModal = function(mid, controllable, controlid, connKey, monitor)
+ {
+ openModal(mid, controllable, controlid, connKey, monitor);
+ };
- // This is a modal to show the monitor footage
- // We need to switch to always awake if set so the feed doesn't get interrupted
- NVRDataModel.setAwake(NVRDataModel.getKeepAwake());
+ function openModal(mid, controllable, controlid, connKey, monitor)
+ {
+ NVRDataModel.debug("MontageCtrl: Open Monitor Modal with monitor Id=" + mid + " and Controllable:" + controllable + " with control ID:" + controlid);
+ // $scope.isModalActive = true;
+ // Note: no need to setAwake(true) as its already awake
+ // in montage view
+
+ NVRDataModel.log("Cancelling montage timer, opening Modal");
+ // NVRDataModel.log("Starting Modal timer");
+ //console.log ("openModal:Cancelling timer");
+ $interval.cancel(intervalHandleMontage);
+ $interval.cancel(intervalHandleAlarmStatus);
+
+ $scope.monitor = monitor;
+ $scope.showPTZ = false;
+ $scope.monitorId = mid;
+ $scope.monitorName = NVRDataModel.getMonitorName(mid);
+ $scope.controlid = controlid;
+
+ //$scope.LoginData = NVRDataModel.getLogin();
+ $rootScope.modalRand = Math.floor(Math.random() * (999999 - 111111 + 1)) + 111111;
+
+ $scope.ptzMoveCommand = "";
+ $scope.ptzStopCommand = "";
+
+ $scope.zoomInCommand = "";
+ $scope.zoomOutCommand = "";
+ $scope.zoomStopCommand = "zoomStop";
+ $scope.canZoom = false;
+
+ $scope.presetOn = false;
+
+ $scope.connKey = (Math.floor((Math.random() * 999999) + 1)).toString();
+ $scope.isControllable = controllable;
+ $scope.refMonitor = monitor;
+
+ // This is a modal to show the monitor footage
+ // We need to switch to always awake if set so the feed doesn't get interrupted
+ NVRDataModel.setAwake(NVRDataModel.getKeepAwake());
+
+ // This is a modal to show the monitor footage
+ $ionicModal.fromTemplateUrl('templates/monitors-modal.html',
+ {
+ scope: $scope,
+ animation: 'slide-in-up'
+ })
+ .then(function(modal)
+ {
+ $scope.modal = modal;
+ $ionicLoading.show(
+ {
+ template: $translate.instant('kPleaseWait'),
+ noBackdrop: true,
+ duration: zm.loadingTimeout
+ });
- // This is a modal to show the monitor footage
- $ionicModal.fromTemplateUrl('templates/monitors-modal.html', {
- scope: $scope,
- animation: 'slide-in-up'
+ // we don't really need this as we have stopped the timer
+ // $scope.isModalActive = true;
- })
- .then(function (modal) {
- $scope.modal = modal;
+ //$timeout (function() {pckry.shiftLayout();},zm.packeryTimer);
+ $scope.modal.show();
- $ionicLoading.show({
- template: $translate.instant('kPleaseWait'),
- noBackdrop: true,
- duration: zm.loadingTimeout
});
+ }
- // we don't really need this as we have stopped the timer
- // $scope.isModalActive = true;
-
- //$timeout (function() {pckry.shiftLayout();},zm.packeryTimer);
- $scope.modal.show();
-
- });
-
- }
-
- //---------------------------------------------------------------------
- //
- //---------------------------------------------------------------------
-
- function cleanupOnClose() {
- $scope.modal.remove();
- $timeout(function () {
- NVRDataModel.log("MontageCtrl:Stopping network pull...");
- if (NVRDataModel.isForceNetworkStop()) NVRDataModel.stopNetwork();
- }, 50);
-
- $rootScope.rand = Math.floor((Math.random() * 100000) + 1);
- $scope.isModalActive = false;
-
- NVRDataModel.log("Restarting montage timer, closing Modal...");
- var ld = NVRDataModel.getLogin();
- // console.log ("closeModal: Cancelling timer");
- $interval.cancel(intervalHandleMontage);
- $interval.cancel(intervalHandleAlarmStatus);
-
- intervalHandleMontage = $interval(function () {
- loadNotifications();
- // console.log ("Refreshing Image...");
- }.bind(this), refreshSec * 1000);
-
- intervalHandleAlarmStatus = $interval(function () {
- loadAlarmStatus();
- // console.log ("Refreshing Image...");
- }.bind(this), 5000);
-
- // $timeout (function() {pckry.shiftLayout();},zm.packeryTimer);
-
-
- }
-
- $scope.closeModal = function () {
- NVRDataModel.debug("MontageCtrl: Close & Destroy Monitor Modal");
- cleanupOnClose();
- // $scope.isModalActive = false;
- // Note: no need to setAwake(false) as needs to be awake
- // in montage view
-
-
-
- };
+ //---------------------------------------------------------------------
+ //
+ //---------------------------------------------------------------------
+ function cleanupOnClose()
+ {
+ $scope.modal.remove();
+ $timeout(function()
+ {
+ NVRDataModel.log("MontageCtrl:Stopping network pull...");
+ if (NVRDataModel.isForceNetworkStop()) NVRDataModel.stopNetwork();
+ }, 50);
+ $rootScope.rand = Math.floor((Math.random() * 100000) + 1);
+ $scope.isModalActive = false;
+ NVRDataModel.log("Restarting montage timer, closing Modal...");
+ var ld = NVRDataModel.getLogin();
+ // console.log ("closeModal: Cancelling timer");
+ $interval.cancel(intervalHandleMontage);
+ $interval.cancel(intervalHandleAlarmStatus);
- //---------------------------------------------------------------------
- // In Android, the app runs full steam while in background mode
- // while in iOS it gets suspended unless you ask for specific resources
- // So while this view, we DON'T want Android to keep sending 1 second
- // refreshes to the server for images we are not seeing
- //---------------------------------------------------------------------
+ intervalHandleMontage = $interval(function()
+ {
+ loadNotifications();
+ // console.log ("Refreshing Image...");
+ }.bind(this), refreshSec * 1000);
- function onPause() {
- NVRDataModel.debug("MontageCtrl: onpause called");
- $interval.cancel(intervalHandleMontage);
- $interval.cancel(intervalHandleAlarmStatus);
- // $interval.cancel(modalIntervalHandle);
+ intervalHandleAlarmStatus = $interval(function()
+ {
+ loadAlarmStatus();
+ // console.log ("Refreshing Image...");
+ }.bind(this), 5000);
- // FIXME: Do I need to setAwake(false) here?
- }
+ // $timeout (function() {pckry.shiftLayout();},zm.packeryTimer);
+ }
- function onResume() {
+ $scope.closeModal = function()
+ {
+ NVRDataModel.debug("MontageCtrl: Close & Destroy Monitor Modal");
+ cleanupOnClose();
+ // $scope.isModalActive = false;
+ // Note: no need to setAwake(false) as needs to be awake
+ // in montage view
+ };
- }
+ //---------------------------------------------------------------------
+ // In Android, the app runs full steam while in background mode
+ // while in iOS it gets suspended unless you ask for specific resources
+ // So while this view, we DON'T want Android to keep sending 1 second
+ // refreshes to the server for images we are not seeing
+ //---------------------------------------------------------------------
- $scope.openMenu = function () {
- $timeout(function () {
- $rootScope.stateofSlide = $ionicSideMenuDelegate.isOpen();
- }, 500);
+ function onPause()
+ {
+ NVRDataModel.debug("MontageCtrl: onpause called");
+ $interval.cancel(intervalHandleMontage);
+ $interval.cancel(intervalHandleAlarmStatus);
+ // $interval.cancel(modalIntervalHandle);
- $ionicSideMenuDelegate.toggleLeft();
- };
+ // FIXME: Do I need to setAwake(false) here?
+ }
- $scope.$on('$destroy', function () {
+ function onResume()
+ {
- });
+ }
+ $scope.openMenu = function()
+ {
+ $timeout(function()
+ {
+ $rootScope.stateofSlide = $ionicSideMenuDelegate.isOpen();
+ }, 500);
- $scope.$on('$ionicView.loaded', function () {
- // console.log("**VIEW ** Montage Ctrl Loaded");
- });
+ $ionicSideMenuDelegate.toggleLeft();
+ };
+ $scope.$on('$destroy', function() {
+ });
- $scope.$on('$ionicView.leave', function () {
- // console.log("**VIEW ** Montage Ctrl Left, force removing modal");
- if ($scope.modal) $scope.modal.remove();
- });
+ $scope.$on('$ionicView.loaded', function()
+ {
+ // console.log("**VIEW ** Montage Ctrl Loaded");
+ });
+ $scope.$on('$ionicView.leave', function()
+ {
+ // console.log("**VIEW ** Montage Ctrl Left, force removing modal");
+ if ($scope.modal) $scope.modal.remove();
+ });
+ function orientationChanged()
+ {
+ /* NVRDataModel.debug("Detected orientation change, redoing packery resize");
+ $timeout(function () {
+ if (pckry) pckry.onresize();
+ }, zm.packeryTimer);*/
+
+ /* var positions = pckry.getShiftPositions('data-item-id');
+ $timeout(function () {
+ NVRDataModel.log("init shift layout");
+ pckry.initShiftLayout(positions,"data-item-id");
+ $ionicScrollDelegate.$getByHandle("montage-delegate").scrollTop();
+ }, 20);*/
- function orientationChanged() {
- /* NVRDataModel.debug("Detected orientation change, redoing packery resize");
- $timeout(function () {
- if (pckry) pckry.onresize();
- }, zm.packeryTimer);*/
-
- /* var positions = pckry.getShiftPositions('data-item-id');
- $timeout(function () {
- NVRDataModel.log("init shift layout");
- pckry.initShiftLayout(positions,"data-item-id");
- $ionicScrollDelegate.$getByHandle("montage-delegate").scrollTop();
- }, 20);*/
-
//console.log ("POSITIONS MAP " + JSON.stringify(positions));
- // var ld = NVRDataModel.getLogin();
- // ld.packeryPositions = JSON.stringify(positions);
+ // var ld = NVRDataModel.getLogin();
+ // ld.packeryPositions = JSON.stringify(positions);
//console.log ("Saving " + ld.packeryPositions);
- // NVRDataModel.setLogin(ld);
- }
-
- $scope.toggleSizeButtons = function () {
-
- $scope.showSizeButtons = !$scope.showSizeButtons;
-
- NVRDataModel.debug("toggling size buttons:" + $scope.showSizeButtons);
- if ($scope.showSizeButtons) $ionicScrollDelegate.$getByHandle("montage-delegate").scrollTop();
- };
+ // NVRDataModel.setLogin(ld);
+ }
- // minimal has to be beforeEnter or header won't hide
- $scope.$on('$ionicView.beforeEnter', function () {
- $scope.minimal = $stateParams.minimal;
- //console.log ("**************** MINIMAL ENTER " + $scope.minimal);
- $scope.zmMarginTop = $scope.minimal ? 0 : 15;
+ $scope.toggleSizeButtons = function()
+ {
+ $scope.showSizeButtons = !$scope.showSizeButtons;
+ NVRDataModel.debug("toggling size buttons:" + $scope.showSizeButtons);
+ if ($scope.showSizeButtons) $ionicScrollDelegate.$getByHandle("montage-delegate").scrollTop();
+ };
+ // minimal has to be beforeEnter or header won't hide
+ $scope.$on('$ionicView.beforeEnter', function()
+ {
+ $scope.minimal = $stateParams.minimal;
+ //console.log ("**************** MINIMAL ENTER " + $scope.minimal);
+ $scope.zmMarginTop = $scope.minimal ? 0 : 15;
- });
+ });
- $scope.toggleTimeType = function()
- {
- if (NVRDataModel.isTzSupported())
+ $scope.toggleTimeType = function()
{
- if ($scope.iconTimeNow == 'server')
+ if (NVRDataModel.isTzSupported())
{
+ if ($scope.iconTimeNow == 'server')
+ {
$scope.iconTimeNow = 'local';
$scope.timeNow = $translate.instant('kPleaseWait');
- }
- else
- {
+ }
+ else
+ {
$scope.iconTimeNow = 'server';
$scope.timeNow = $translate.instant('kPleaseWait');
+ }
}
- }
- else
- NVRDataModel.debug ("timezone API not supported, can't display");
- };
-
-
- $scope.$on('$ionicView.afterEnter', function () {
- NVRDataModel.debug("Setting image mode to snapshot, will change to image when packery is all done");
- $scope.areImagesLoading = true;
- $scope.isDragabillyOn = false;
-
-
- if (NVRDataModel.isTzSupported())
- $scope.iconTimeNow = 'server';
- else
- $scope.iconTimeNow = 'local';
-
- if ($scope.iconTimeNow == 'local')
- $scope.timeNow = moment().format(NVRDataModel.getTimeFormatSec());
- else
- $scope.timeNow = moment().tz(NVRDataModel.getTimeZoneNow()).format(NVRDataModel.getTimeFormatSec());
-
-
- $scope.gridScale = "grid-item-50";
- $scope.LoginData = NVRDataModel.getLogin();
- //FIXME
-
- if (NVRDataModel.getBandwidth() == 'lowbw') {
- NVRDataModel.debug("Enabling low bandwidth parameters");
- $scope.LoginData.montageQuality = zm.montageQualityLowBW;
- $scope.LoginData.singleImageQuality = zm.eventSingleImageQualityLowBW;
- $scope.LoginData.montageHistoryQuality = zm.montageQualityLowBW;
-
+ else
+ NVRDataModel.debug("timezone API not supported, can't display");
+ };
- }
+ $scope.$on('$ionicView.afterEnter', function()
+ {
+ NVRDataModel.debug("Setting image mode to snapshot, will change to image when packery is all done");
+ $scope.areImagesLoading = true;
+ $scope.isDragabillyOn = false;
+ if (NVRDataModel.isTzSupported())
+ $scope.iconTimeNow = 'server';
+ else
+ $scope.iconTimeNow = 'local';
- $scope.monLimit = $scope.LoginData.maxMontage;
- $scope.showSizeButtons = false;
+ if ($scope.iconTimeNow == 'local')
+ $scope.timeNow = moment().format(NVRDataModel.getTimeFormatSec());
+ else
+ $scope.timeNow = moment().tz(NVRDataModel.getTimeZoneNow()).format(NVRDataModel.getTimeFormatSec());
+ $scope.gridScale = "grid-item-50";
+ $scope.LoginData = NVRDataModel.getLogin();
+ //FIXME
- $scope.monitors = message;
- $scope.MontageMonitors = angular.copy(message);
- $scope.sliderChanging = false;
- loginData = NVRDataModel.getLogin();
+ if (NVRDataModel.getBandwidth() == 'lowbw')
+ {
+ NVRDataModel.debug("Enabling low bandwidth parameters");
+ $scope.LoginData.montageQuality = zm.montageQualityLowBW;
+ $scope.LoginData.singleImageQuality = zm.eventSingleImageQualityLowBW;
+ $scope.LoginData.montageHistoryQuality = zm.montageQualityLowBW;
- $scope.isRefresh = $stateParams.isRefresh;
- sizeInProgress = false;
- $scope.imageStyle = true;
- intervalHandleMontage = "";
- $scope.isModalActive = false;
- $scope.isReorder = false;
+ }
- $ionicSideMenuDelegate.canDragContent($scope.minimal ? true : true);
+ $scope.monLimit = $scope.LoginData.maxMontage;
+ $scope.showSizeButtons = false;
+ $scope.monitors = message;
+ $scope.MontageMonitors = angular.copy(message);
+ $scope.sliderChanging = false;
+ loginData = NVRDataModel.getLogin();
- $scope.areImagesLoading = true;
- var ld = NVRDataModel.getLogin();
+ $scope.isRefresh = $stateParams.isRefresh;
+ sizeInProgress = false;
+ $scope.imageStyle = true;
+ intervalHandleMontage = "";
+ $scope.isModalActive = false;
+ $scope.isReorder = false;
- refreshSec = (NVRDataModel.getBandwidth()=='lowbw') ? ld.refreshSecLowBW : ld.refreshSec;
+ $ionicSideMenuDelegate.canDragContent($scope.minimal ? true : true);
- NVRDataModel.debug("bandwidth: " + NVRDataModel.getBandwidth() + " montage refresh set to: " + refreshSec);
+ $scope.areImagesLoading = true;
+ var ld = NVRDataModel.getLogin();
- //console.log("Setting Awake to " + NVRDataModel.getKeepAwake());
- NVRDataModel.setAwake(NVRDataModel.getKeepAwake());
+ refreshSec = (NVRDataModel.getBandwidth() == 'lowbw') ? ld.refreshSecLowBW : ld.refreshSec;
- $interval.cancel(intervalHandleMontage);
- $interval.cancel(intervalHandleAlarmStatus);
+ NVRDataModel.debug("bandwidth: " + NVRDataModel.getBandwidth() + " montage refresh set to: " + refreshSec);
- intervalHandleMontage = $interval(function () {
- loadNotifications();
- // console.log ("Refreshing Image...");
- }.bind(this), refreshSec * 1000);
+ //console.log("Setting Awake to " + NVRDataModel.getKeepAwake());
+ NVRDataModel.setAwake(NVRDataModel.getKeepAwake());
- intervalHandleAlarmStatus = $interval(function () {
- loadAlarmStatus();
- // console.log ("Refreshing Image...");
- }.bind(this), 5000);
+ $interval.cancel(intervalHandleMontage);
+ $interval.cancel(intervalHandleAlarmStatus);
+ intervalHandleMontage = $interval(function()
+ {
+ loadNotifications();
+ // console.log ("Refreshing Image...");
+ }.bind(this), refreshSec * 1000);
- loadNotifications();
+ intervalHandleAlarmStatus = $interval(function()
+ {
+ loadAlarmStatus();
+ // console.log ("Refreshing Image...");
+ }.bind(this), 5000);
- if ($scope.MontageMonitors.length == 0) {
- $rootScope.zmPopup = $ionicPopup.alert({
- title: $translate.instant('kNoMonitors'),
- template: $translate.instant('kCheckCredentials')
- });
- $ionicHistory.nextViewOptions({
- disableBack: true
- });
- $state.go("login", {
- "wizard": false
- });
- return;
- }
+ loadNotifications();
- ld = NVRDataModel.getLogin();
+ if ($scope.MontageMonitors.length == 0)
+ {
+ $rootScope.zmPopup = $ionicPopup.alert(
+ {
+ title: $translate.instant('kNoMonitors'),
+ template: $translate.instant('kCheckCredentials')
+ });
+ $ionicHistory.nextViewOptions(
+ {
+ disableBack: true
+ });
+ $state.go("login",
+ {
+ "wizard": false
+ });
+ return;
+ }
- $rootScope.authSession = "undefined";
- $ionicLoading.show({
- template: $translate.instant('kNegotiatingStreamAuth'),
- animation: 'fade-in',
- showBackdrop: true,
- duration: zm.loadingTimeout,
- maxWidth: 300,
- showDelay: 0
- });
+ ld = NVRDataModel.getLogin();
+ $rootScope.authSession = "undefined";
+ $ionicLoading.show(
+ {
+ template: $translate.instant('kNegotiatingStreamAuth'),
+ animation: 'fade-in',
+ showBackdrop: true,
+ duration: zm.loadingTimeout,
+ maxWidth: 300,
+ showDelay: 0
+ });
- NVRDataModel.log("Inside Montage Ctrl:We found " + $scope.monitors.length + " monitors");
+ NVRDataModel.log("Inside Montage Ctrl:We found " + $scope.monitors.length + " monitors");
- // set them all at 50% for packery
- for (var i = 0; i < $scope.MontageMonitors.length; i++) {
- $scope.MontageMonitors[i].Monitor.gridScale = "50";
- $scope.MontageMonitors[i].Monitor.selectStyle = "";
- $scope.MontageMonitors[i].Monitor.alarmState = 'color:rgba(0,0,0,0);';
+ // set them all at 50% for packery
+ for (var i = 0; i < $scope.MontageMonitors.length; i++)
+ {
+ $scope.MontageMonitors[i].Monitor.gridScale = "50";
+ $scope.MontageMonitors[i].Monitor.selectStyle = "";
+ $scope.MontageMonitors[i].Monitor.alarmState = 'color:rgba(0,0,0,0);';
- }
+ }
- $rootScope.validMonitorId = $scope.monitors[0].Monitor.Id;
- NVRDataModel.getAuthKey($rootScope.validMonitorId, (Math.floor((Math.random() * 999999) + 1)).toString())
- .then(function (success) {
- $ionicLoading.hide();
- //console.log(success);
- $rootScope.authSession = success;
- NVRDataModel.log("Stream authentication construction: " +
- $rootScope.authSession);
- $timeout(function () {
+ $rootScope.validMonitorId = $scope.monitors[0].Monitor.Id;
+ NVRDataModel.getAuthKey($rootScope.validMonitorId, (Math.floor((Math.random() * 999999) + 1)).toString())
+ .then(function(success)
+ {
+ $ionicLoading.hide();
+ //console.log(success);
+ $rootScope.authSession = success;
+ NVRDataModel.log("Stream authentication construction: " +
+ $rootScope.authSession);
+ $timeout(function()
+ {
initPackery();
}, zm.packeryTimer);
- },
- function (error) {
+ },
+ function(error)
+ {
- $ionicLoading.hide();
- NVRDataModel.debug("MontageCtrl: Error in authkey retrieval " + error);
- //$rootScope.authSession="";
- NVRDataModel.log("MontageCtrl: Error returned Stream authentication construction. Retaining old value of: " + $rootScope.authSession);
- $timeout(function () {
+ $ionicLoading.hide();
+ NVRDataModel.debug("MontageCtrl: Error in authkey retrieval " + error);
+ //$rootScope.authSession="";
+ NVRDataModel.log("MontageCtrl: Error returned Stream authentication construction. Retaining old value of: " + $rootScope.authSession);
+ $timeout(function()
+ {
initPackery();
}, zm.packeryTimer);
- });
-
- //console.log("**VIEW ** Montage Ctrl AFTER ENTER");
- window.addEventListener("resize", orientationChanged, false);
-
- document.addEventListener("pause", onPause, false);
- document.addEventListener("resume", onResume, false);
-
-
-
-
- });
-
- $scope.$on('$ionicView.beforeLeave', function () {
- // console.log("**VIEW ** Montage Ctrl Left, force removing modal");
-
- //console.log ("beforeLeave:Cancelling timer");
- $interval.cancel(intervalHandleMontage);
- $interval.cancel(intervalHandleAlarmStatus);
- pckry.destroy();
- window.removeEventListener("resize", orientationChanged, false);
+ });
+ //console.log("**VIEW ** Montage Ctrl AFTER ENTER");
+ window.addEventListener("resize", orientationChanged, false);
- // make sure this is applied in scope digest to stop network pull
- // thats why we are doing it beforeLeave
+ document.addEventListener("pause", onPause, false);
+ document.addEventListener("resume", onResume, false);
- if (NVRDataModel.isForceNetworkStop()) {
- NVRDataModel.log("MontageCtrl:Stopping network pull...");
- NVRDataModel.stopNetwork();
+ });
- }
+ $scope.$on('$ionicView.beforeLeave', function()
+ {
+ // console.log("**VIEW ** Montage Ctrl Left, force removing modal");
- });
+ //console.log ("beforeLeave:Cancelling timer");
+ $interval.cancel(intervalHandleMontage);
+ $interval.cancel(intervalHandleAlarmStatus);
+ pckry.destroy();
+ window.removeEventListener("resize", orientationChanged, false);
+ // make sure this is applied in scope digest to stop network pull
+ // thats why we are doing it beforeLeave
+ if (NVRDataModel.isForceNetworkStop())
+ {
+ NVRDataModel.log("MontageCtrl:Stopping network pull...");
+ NVRDataModel.stopNetwork();
+ }
- $scope.$on('$ionicView.unloaded', function () {
+ });
- });
+ $scope.$on('$ionicView.unloaded', function() {
+ });
- $scope.resetSizes = function () {
- var somethingReset = false;
- for (var i = 0; i < $scope.MontageMonitors.length; i++) {
- if ($scope.isDragabillyOn) {
- if ($scope.MontageMonitors[i].Monitor.selectStyle == "dragborder-selected") {
+ $scope.resetSizes = function()
+ {
+ var somethingReset = false;
+ for (var i = 0; i < $scope.MontageMonitors.length; i++)
+ {
+ if ($scope.isDragabillyOn)
+ {
+ if ($scope.MontageMonitors[i].Monitor.selectStyle == "dragborder-selected")
+ {
+ $scope.MontageMonitors[i].Monitor.gridScale = "50";
+ somethingReset = true;
+ }
+ }
+ else
+ {
$scope.MontageMonitors[i].Monitor.gridScale = "50";
- somethingReset = true;
+ // somethingReset = true;
}
- } else {
- $scope.MontageMonitors[i].Monitor.gridScale = "50";
- // somethingReset = true;
}
- }
- if (!somethingReset && $scope.isDragabillyOn) // nothing was selected
- {
- for (i = 0; i < $scope.MontageMonitors.length; i++) {
- $scope.MontageMonitors[i].Monitor.gridScale = "50";
+ if (!somethingReset && $scope.isDragabillyOn) // nothing was selected
+ {
+ for (i = 0; i < $scope.MontageMonitors.length; i++)
+ {
+ $scope.MontageMonitors[i].Monitor.gridScale = "50";
+ }
}
- }
- $timeout(function () {
- pckry.reloadItems();
+ $timeout(function()
+ {
+ pckry.reloadItems();
+
+ pckry.once('layoutComplete', function()
+ {
+ //console.log ("Layout complete");
+ var positions = pckry.getShiftPositions('data-item-id');
+ //console.log ("POSITIONS MAP " + JSON.stringify(positions));
+ var ld = NVRDataModel.getLogin();
+
+ ld.packeryPositions = JSON.stringify(positions);
+ //console.log ("Saving " + ld.packeryPositions);
+ NVRDataModel.setLogin(ld);
+ // $scope.slider.monsize = 2;
+ });
+ //layout(pckry);
- pckry.once('layoutComplete', function () {
- //console.log ("Layout complete");
- var positions = pckry.getShiftPositions('data-item-id');
- //console.log ("POSITIONS MAP " + JSON.stringify(positions));
- var ld = NVRDataModel.getLogin();
-
- ld.packeryPositions = JSON.stringify(positions);
- //console.log ("Saving " + ld.packeryPositions);
- NVRDataModel.setLogin(ld);
- // $scope.slider.monsize = 2;
- });
- //layout(pckry);
-
pckry.layout();
-
+ }, 20);
- }, 20);
+ };
- };
+ function layout(pckry)
+ {
+ pckry.shiftLayout();
+ }
+ //---------------------------------------------------------
+ // slider is tied to the view slider for montage
+ //Remember not to use a variable. I'm using an object
+ // so it's passed as a reference - otherwise it makes
+ // a copy and the value never changes
+ //---------------------------------------------------------
- function layout(pckry) {
- pckry.shiftLayout();
- }
+ $scope.sliderChanged = function(dirn)
+ {
- //---------------------------------------------------------
- // slider is tied to the view slider for montage
- //Remember not to use a variable. I'm using an object
- // so it's passed as a reference - otherwise it makes
- // a copy and the value never changes
- //---------------------------------------------------------
+ if ($scope.sliderChanging)
+ {
+ console.log("too fast my friend");
+ //$scope.slider.monsize = oldSliderVal;
+ return;
+ }
- $scope.sliderChanged = function (dirn) {
+ $scope.sliderChanging = true;
- if ($scope.sliderChanging) {
- console.log ("too fast my friend");
- //$scope.slider.monsize = oldSliderVal;
- return;
- }
+ $ionicLoading.show(
+ {
+ template: $translate.instant('kPleaseWait'),
+ noBackdrop: true,
+ duration: 5000
+ });
-
-
- $scope.sliderChanging = true;
-
- $ionicLoading.show({
- template: $translate.instant('kPleaseWait'),
- noBackdrop: true,
- duration: 5000
- });
+ var somethingReset = false;
- var somethingReset = false;
-
- var oldScales = {};
- pckry.getItemElements().forEach(function (elem) {
+ var oldScales = {};
+ pckry.getItemElements().forEach(function(elem)
+ {
var id = elem.getAttribute("data-item-id");
var sz = elem.getAttribute("data-item-size");
oldScales[id] = sz;
- console.log ("REMEMBERING "+id+":"+sz);
-
+ console.log("REMEMBERING " + id + ":" + sz);
+
});
-
- // this only changes items that are selected
- for (var i = 0; i < $scope.MontageMonitors.length; i++) {
+ // this only changes items that are selected
+ for (var i = 0; i < $scope.MontageMonitors.length; i++)
+ {
- var curVal = parseInt($scope.MontageMonitors[i].Monitor.gridScale);
- curVal = curVal + (10 * dirn);
- if (curVal < 10) curVal = 10;
- if (curVal > 100) curVal = 100;
- //console.log ("For Index: " + i + " From: " + $scope.MontageMonitors[i].Monitor.gridScale + " To: " + curVal);
+ var curVal = parseInt($scope.MontageMonitors[i].Monitor.gridScale);
+ curVal = curVal + (10 * dirn);
+ if (curVal < 10) curVal = 10;
+ if (curVal > 100) curVal = 100;
+ //console.log ("For Index: " + i + " From: " + $scope.MontageMonitors[i].Monitor.gridScale + " To: " + curVal);
- if ($scope.isDragabillyOn) {
- // only do this for selected monitors
- if ($scope.MontageMonitors[i].Monitor.selectStyle == "dragborder-selected") {
+ if ($scope.isDragabillyOn)
+ {
+ // only do this for selected monitors
+ if ($scope.MontageMonitors[i].Monitor.selectStyle == "dragborder-selected")
+ {
+ $scope.MontageMonitors[i].Monitor.gridScale = curVal;
+ somethingReset = true;
+ }
+ }
+ else
+ {
$scope.MontageMonitors[i].Monitor.gridScale = curVal;
- somethingReset = true;
+ //somethingReset = true;
+
}
- } else {
- $scope.MontageMonitors[i].Monitor.gridScale = curVal;
- //somethingReset = true;
}
- }
-
- // this changes all items if none were selected
- if (!somethingReset && $scope.isDragabillyOn) // nothing was selected
- {
- for (i = 0; i < $scope.MontageMonitors.length; i++) {
- var cv = parseInt($scope.MontageMonitors[i].Monitor.gridScale);
- cv = cv + (10 * dirn);
- if (cv < 10) cv = 10;
- if (cv > 100) cv = 100;
- $scope.MontageMonitors[i].Monitor.gridScale = cv;
- }
- }
-
- // reload sizes from DOM and trigger a layout
-
- $timeout (function() {
- console.log ("Calling re-layout");
- //pckry.reloadItems();
-
- if (dirn == 1) //expand
- {
- pckry.getItemElements().forEach(function (elem) {
- var id = elem.getAttribute("data-item-id");
- var sz = elem.getAttribute("data-item-size");
- console.log ("NOW IT IS-> "+id+":"+sz);
- if (oldScales[id] != sz)
+ // this changes all items if none were selected
+ if (!somethingReset && $scope.isDragabillyOn) // nothing was selected
+ {
+ for (i = 0; i < $scope.MontageMonitors.length; i++)
{
- console.log ("Calling FIT on " + id + " size:"+oldScales[id]+"->"+sz);
- pckry.once('fitComplete', resizeComplete);
- pckry.fit(elem);
-
+ var cv = parseInt($scope.MontageMonitors[i].Monitor.gridScale);
+ cv = cv + (10 * dirn);
+ if (cv < 10) cv = 10;
+ if (cv > 100) cv = 100;
+ $scope.MontageMonitors[i].Monitor.gridScale = cv;
}
- });
- }
- else //shrink
- {
- console.log ("Calling shift");
- pckry.once('layoutComplete', resizeComplete);
- pckry.shiftLayout();
-
-
- }
-
- },20);
-
-
-
+ }
+ // reload sizes from DOM and trigger a layout
- /* if (!somethingReset) {
- //console.log (">>>SOMETHING NOT RESET");
- $timeout(function () {
- pckry.layout();
- }, zm.packeryTimer);
- } else {
-
- //console.log (">>>SOMETHING RESET");
- $timeout(function () {
- layout(pckry);
- }, zm.packeryTimer);
- }*/
- function resizeComplete()
- {
- //console.log ("HERE");
- $timeout(function () {
- var positions = pckry.getShiftPositions('data-item-id');
- console.log ("SAVING");
- var ld = NVRDataModel.getLogin();
-
- ld.packeryPositions = JSON.stringify(positions);
- //console.log ("Saving " + ld.packeryPositions);
- NVRDataModel.setLogin(ld);
- $ionicLoading.hide();
- $scope.sliderChanging = false;
- }, 20);
-
- }
+ $timeout(function()
+ {
+ console.log("Calling re-layout");
+ //pckry.reloadItems();
+ if (dirn == 1) //expand
+ {
+ pckry.getItemElements().forEach(function(elem)
+ {
+ var id = elem.getAttribute("data-item-id");
+ var sz = elem.getAttribute("data-item-size");
+ console.log("NOW IT IS-> " + id + ":" + sz);
+ if (oldScales[id] != sz)
+ {
+ console.log("Calling FIT on " + id + " size:" + oldScales[id] + "->" + sz);
+ pckry.once('fitComplete', resizeComplete);
+ pckry.fit(elem);
+ }
+ });
+ }
+ else //shrink
+ {
+ console.log("Calling shift");
+ pckry.once('layoutComplete', resizeComplete);
+ pckry.shiftLayout();
- };
+ }
+ }, 20);
+ /* if (!somethingReset) {
+ //console.log (">>>SOMETHING NOT RESET");
+ $timeout(function () {
+ pckry.layout();
+ }, zm.packeryTimer);
+ } else {
+
+ //console.log (">>>SOMETHING RESET");
+ $timeout(function () {
+ layout(pckry);
+ }, zm.packeryTimer);
+ }*/
+ function resizeComplete()
+ {
+ //console.log ("HERE");
+ $timeout(function()
+ {
+ var positions = pckry.getShiftPositions('data-item-id');
+ console.log("SAVING");
+ var ld = NVRDataModel.getLogin();
- $scope.$on('$ionicView.afterEnter', function () {
- // This rand is really used to reload the monitor image in img-src so it is not cached
- // I am making sure the image in montage view is always fresh
- // I don't think I am using this anymore FIXME: check and delete if needed
- // $rootScope.rand = Math.floor((Math.random() * 100000) + 1);
- });
+ ld.packeryPositions = JSON.stringify(positions);
+ //console.log ("Saving " + ld.packeryPositions);
+ NVRDataModel.setLogin(ld);
+ $ionicLoading.hide();
+ $scope.sliderChanging = false;
+ }, 20);
- $scope.reloadView = function () {
- $rootScope.rand = Math.floor((Math.random() * 100000) + 1);
- NVRDataModel.log("User action: image reload " + $rootScope.rand);
- };
+ }
- $scope.doRefresh = function () {
+ };
+ $scope.$on('$ionicView.afterEnter', function()
+ {
+ // This rand is really used to reload the monitor image in img-src so it is not cached
+ // I am making sure the image in montage view is always fresh
+ // I don't think I am using this anymore FIXME: check and delete if needed
+ // $rootScope.rand = Math.floor((Math.random() * 100000) + 1);
+ });
- // console.log("***Pull to Refresh, recomputing Rand");
- NVRDataModel.log("Reloading view for montage view, recomputing rand");
- $rootScope.rand = Math.floor((Math.random() * 100000) + 1);
- $scope.monitors = [];
- imageLoadingDataShare.set(0);
+ $scope.reloadView = function()
+ {
+ $rootScope.rand = Math.floor((Math.random() * 100000) + 1);
+ NVRDataModel.log("User action: image reload " + $rootScope.rand);
+ };
+
+ $scope.doRefresh = function()
+ {
- var refresh = NVRDataModel.getMonitors(1);
+ // console.log("***Pull to Refresh, recomputing Rand");
+ NVRDataModel.log("Reloading view for montage view, recomputing rand");
+ $rootScope.rand = Math.floor((Math.random() * 100000) + 1);
+ $scope.monitors = [];
+ imageLoadingDataShare.set(0);
- refresh.then(function (data) {
- $scope.monitors = data;
- $scope.$broadcast('scroll.refreshComplete');
- });
- };
+ var refresh = NVRDataModel.getMonitors(1);
+ refresh.then(function(data)
+ {
+ $scope.monitors = data;
+ $scope.$broadcast('scroll.refreshComplete');
+ });
+ };
-}]);
+ }]);
diff --git a/www/js/MontageHistoryCtrl.js b/www/js/MontageHistoryCtrl.js
index 7b1ca2c1..ab902973 100644
--- a/www/js/MontageHistoryCtrl.js
+++ b/www/js/MontageHistoryCtrl.js
@@ -3,16 +3,18 @@
/* jslint browser: true*/
/* global cordova,StatusBar,angular,console,ionic,Masonry,moment,Packery, Draggabilly, imagesLoaded, Chart */
// FIXME: This is a copy of montageCtrl - needs a lot of code cleanup
-angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$scope', '$rootScope', 'NVRDataModel', 'message', '$ionicSideMenuDelegate', '$timeout', '$interval', '$ionicModal', '$ionicLoading', '$http', '$state', '$ionicPopup', '$stateParams', '$ionicHistory', '$ionicScrollDelegate', '$ionicPlatform', 'zm', '$ionicPopover', '$controller', 'imageLoadingDataShare', '$window', '$translate', 'qHttp', '$q', function ($scope, $rootScope, NVRDataModel, message, $ionicSideMenuDelegate, $timeout, $interval, $ionicModal, $ionicLoading, $http, $state, $ionicPopup, $stateParams, $ionicHistory, $ionicScrollDelegate, $ionicPlatform, zm, $ionicPopover, $controller, imageLoadingDataShare, $window, $translate, qHttp, $q) {
+angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$scope', '$rootScope', 'NVRDataModel', 'message', '$ionicSideMenuDelegate', '$timeout', '$interval', '$ionicModal', '$ionicLoading', '$http', '$state', '$ionicPopup', '$stateParams', '$ionicHistory', '$ionicScrollDelegate', '$ionicPlatform', 'zm', '$ionicPopover', '$controller', 'imageLoadingDataShare', '$window', '$translate', 'qHttp', '$q', function($scope, $rootScope, NVRDataModel, message, $ionicSideMenuDelegate, $timeout, $interval, $ionicModal, $ionicLoading, $http, $state, $ionicPopup, $stateParams, $ionicHistory, $ionicScrollDelegate, $ionicPlatform, zm, $ionicPopover, $controller, imageLoadingDataShare, $window, $translate, qHttp, $q)
+{
//--------------------------------------------------------------------------------------
// Handles bandwidth change, if required
//
//--------------------------------------------------------------------------------------
- $rootScope.$on("bandwidth-change", function (e, data) {
+ $rootScope.$on("bandwidth-change", function(e, data)
+ {
// nothing to do for now
// eventUrl will use lower BW in next query cycle
});
-
+
$scope.getLocalTZ = function()
{
return moment.tz.guess();
@@ -20,70 +22,83 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
//--------------------------------------
// formats events dates in a nice way
//---------------------------------------
- $scope.prettifyDateTimeFirst = function (str) {
- if (NVRDataModel.getLogin().useLocalTimeZone)
- return moment.tz(str, NVRDataModel.getTimeZoneNow()).tz(moment.tz.guess()).format(NVRDataModel.getTimeFormat() + '/MMM Do');
+ $scope.prettifyDateTimeFirst = function(str)
+ {
+ if (NVRDataModel.getLogin().useLocalTimeZone)
+ return moment.tz(str, NVRDataModel.getTimeZoneNow()).tz(moment.tz.guess()).format(NVRDataModel.getTimeFormat() + '/MMM Do');
else
return moment(str).format(NVRDataModel.getTimeFormat() + '/MMM Do');
};
- $scope.prettifyDate = function (str) {
+ $scope.prettifyDate = function(str)
+ {
return moment(str).format('MMM Do, YYYY ' + NVRDataModel.getTimeFormat());
};
- function prettifyDate(str) {
- if (NVRDataModel.getLogin().useLocalTimeZone)
+ function prettifyDate(str)
+ {
+ if (NVRDataModel.getLogin().useLocalTimeZone)
return moment.tz(str, NVRDataModel.getTimeZoneNow()).tz(moment.tz.guess()).format('MMM Do');
else
- return moment(str).format('MMM Do');
+ return moment(str).format('MMM Do');
}
- $scope.prettifyTime = function (str) {
+ $scope.prettifyTime = function(str)
+ {
if (NVRDataModel.getLogin().useLocalTimeZone)
return moment.tz(str, NVRDataModel.getTimeZoneNow()).tz(moment.tz.guess()).format('h:mm a');
else
return moment(str).format('h:mm a');
};
- $scope.prettify = function (str) {
+ $scope.prettify = function(str)
+ {
if (NVRDataModel.getLogin().useLocalTimeZone)
return moment.tz(str, NVRDataModel.getTimeZoneNow()).tz(moment.tz.guess()).format(NVRDataModel.getTimeFormat() + ' on MMMM Do YYYY');
else
return moment(str).format(NVRDataModel.getTimeFormat() + ' on MMMM Do YYYY');
};
- $scope.humanizeTime = function (str) {
- // if (NVRDataModel.getLogin().useLocalTimeZone)
- return moment.tz(str, NVRDataModel.getTimeZoneNow()).fromNow();
- // else
- // return moment(str).fromNow();
-
+ $scope.humanizeTime = function(str)
+ {
+ // if (NVRDataModel.getLogin().useLocalTimeZone)
+ return moment.tz(str, NVRDataModel.getTimeZoneNow()).fromNow();
+ // else
+ // return moment(str).fromNow();
+
};
// if you change date in footer, change hrs
- $scope.dateChanged = function () {
+ $scope.dateChanged = function()
+ {
$scope.datetimeValueFrom.hrs = Math.round(moment.duration(moment().diff(moment($scope.datetimeValueFrom.value))).asHours());
};
// if you change hrs in footer, change date
- $scope.hrsChanged = function () {
+ $scope.hrsChanged = function()
+ {
$scope.datetimeValueFrom.value = moment().subtract($scope.datetimeValueFrom.hrs, 'hours').toDate();
timefrom.toDate();
};
- function orientationChanged() {
- // NVRDataModel.debug("Detected orientation change, redoing packery resize");
- /* $timeout(function () {
- pckry.onresize();
- });*/
+ function orientationChanged()
+ {
+ // NVRDataModel.debug("Detected orientation change, redoing packery resize");
+ /* $timeout(function () {
+ pckry.onresize();
+ });*/
}
//--------------------------------------
// pause/unpause nph-zms
//---------------------------------------
- $scope.togglePause = function (mid) {
+ $scope.togglePause = function(mid)
+ {
//console.log ("TOGGLE PAUSE " + mid);
var m = -1;
- for (var i = 0; i < $scope.MontageMonitors.length; i++) {
- if ($scope.MontageMonitors[i].Monitor.Id == mid) {
+ for (var i = 0; i < $scope.MontageMonitors.length; i++)
+ {
+ if ($scope.MontageMonitors[i].Monitor.Id == mid)
+ {
m = i;
break;
}
}
- if (m != -1) {
+ if (m != -1)
+ {
$scope.MontageMonitors[m].Monitor.isPaused = !$scope.MontageMonitors[m].Monitor.isPaused;
var cmd = 1;
@@ -92,66 +107,79 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
}
};
- function sendCmd(mid, cmd, extra) {
-
-
+ function sendCmd(mid, cmd, extra)
+ {
var m = -1;
- for (var i = 0; i < $scope.MontageMonitors.length; i++) {
- if ($scope.MontageMonitors[i].Monitor.Id == mid) {
+ for (var i = 0; i < $scope.MontageMonitors.length; i++)
+ {
+ if ($scope.MontageMonitors[i].Monitor.Id == mid)
+ {
m = i;
break;
}
}
- if (m != -1) {
+ if (m != -1)
+ {
NVRDataModel.debug("Sending CMD:" + cmd + " for monitor " + $scope.MontageMonitors[m].Monitor.Name);
return controlEventStream(cmd, "", $scope.MontageMonitors[m].Monitor.connKey, -1, extra);
}
}
- $scope.seek = function (mid, p) {
+ $scope.seek = function(mid, p)
+ {
NVRDataModel.debug("Slider called with mid=" + mid + " progress=" + p);
var m = -1;
- for (var i = 0; i < $scope.MontageMonitors.length; i++) {
- if ($scope.MontageMonitors[i].Monitor.Id == mid) {
+ for (var i = 0; i < $scope.MontageMonitors.length; i++)
+ {
+ if ($scope.MontageMonitors[i].Monitor.Id == mid)
+ {
m = i;
break;
}
}
- if (m != -1) {
+ if (m != -1)
+ {
$scope.MontageMonitors[i].Monitor.seek = true;
}
-
sendCmd(mid, '14', "&offset=" + p)
- .then(function (success) {
+ .then(function(success)
+ {
//console.log ("Removing seek status from " + $scope.MontageMonitors[i].Monitor.Name);
$scope.MontageMonitors[i].Monitor.seek = false;
},
- function (err) {
+ function(err)
+ {
//console.log ("Removing seek status from " + $scope.MontageMonitors[i].Monitor.Name);
$scope.MontageMonitors[i].Monitor.seek = false;
});
};
- $scope.moveFaster = function (mid) {
+ $scope.moveFaster = function(mid)
+ {
sendCmd(mid, 4);
};
- $scope.moveSlower = function (mid) {
+ $scope.moveSlower = function(mid)
+ {
sendCmd(mid, 5);
};
- $scope.movePlay = function (mid) {
+ $scope.movePlay = function(mid)
+ {
var m = -1;
- for (var i = 0; i < $scope.MontageMonitors.length; i++) {
- if ($scope.MontageMonitors[i].Monitor.Id == mid) {
+ for (var i = 0; i < $scope.MontageMonitors.length; i++)
+ {
+ if ($scope.MontageMonitors[i].Monitor.Id == mid)
+ {
m = i;
break;
}
}
- if (m != -1) {
+ if (m != -1)
+ {
$scope.MontageMonitors[m].Monitor.isPaused = false;
var cmd = 2;
NVRDataModel.debug("Sending CMD:" + cmd + " for monitor " + $scope.MontageMonitors[m].Monitor.Name);
@@ -162,20 +190,24 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
// Called when ion-footer collapses
// note that on init it is also called
//---------------------------------------
- $scope.footerExpand = function () {
+ $scope.footerExpand = function()
+ {
// console.log ("**************** EXPAND CALLED ***************");
$ionicSideMenuDelegate.canDragContent(false);
};
- $scope.footerCollapse = function () {
+ $scope.footerCollapse = function()
+ {
footerCollapse();
};
/* Note this is also called when the view is first loaded */
- function footerCollapse() {
- if (readyToRun == false) {
+ function footerCollapse()
+ {
+ if (readyToRun == false)
+ {
NVRDataModel.debug("fake call to footerCollapse - ignoring");
return;
}
-
+
if ($scope.MontageMonitors == undefined)
{
NVRDataModel.debug("montage array is undefined and not ready");
@@ -183,7 +215,8 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
}
$interval.cancel($rootScope.eventQueryInterval);
- $ionicLoading.show({
+ $ionicLoading.show(
+ {
template: $translate.instant('kPleaseWait'),
noBackdrop: true,
duration: zm.httpTimeout
@@ -195,39 +228,37 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
NVRDataModel.stopNetwork("MontageHistory-footerCollapse");
var ld = NVRDataModel.getLogin();
$scope.sliderVal.realRate = $scope.sliderVal.rate * 100;
-
-
-
+
var TimeObjectFrom = moment($scope.datetimeValueFrom.value).format("YYYY-MM-DD HH:mm");
var TimeObjectTo = moment().format('YYYY-MM-DD HH:mm');
-
+
// At this point of time, we need to ensure From and To are changed to server time
//if (NVRDataModel.getLogin().useLocalTimeZone)
if (1)
{
var localtz = moment.tz.guess();
var servertz = NVRDataModel.getTimeZoneNow();
-
- NVRDataModel.log ("Local timezone conversion is on, converting from "+localtz+" to " +servertz);
- NVRDataModel.log ("Original From: " + TimeObjectFrom + " Original To: " + TimeObjectTo);
-
+
+ NVRDataModel.log("Local timezone conversion is on, converting from " + localtz + " to " + servertz);
+ NVRDataModel.log("Original From: " + TimeObjectFrom + " Original To: " + TimeObjectTo);
+
TimeObjectFrom = moment.tz(TimeObjectFrom, localtz).tz(servertz).format("YYYY-MM-DD HH:mm");
TimeObjectTo = moment.tz(TimeObjectTo, localtz).tz(servertz).format("YYYY-MM-DD HH:mm");
-
- NVRDataModel.log ("Converted From: " + TimeObjectFrom + " Converted To: " + TimeObjectTo);
-
+
+ NVRDataModel.log("Converted From: " + TimeObjectFrom + " Converted To: " + TimeObjectTo);
+
}
-
-
-
+
var apiurl;
// release all active streams
- for (var i = 0; i < $scope.MontageMonitors.length; i++) {
+ for (var i = 0; i < $scope.MontageMonitors.length; i++)
+ {
$scope.MontageMonitors[i].Monitor.selectStyle = "";
$scope.MontageMonitors[i].Monitor.eid = "-1";
// generate new connKeys if timeline changes
- if ($scope.MontageMonitors[i].Monitor.eventUrl != 'img/noevent.png') {
+ if ($scope.MontageMonitors[i].Monitor.eventUrl != 'img/noevent.png')
+ {
// this means this mid was showing a message, now we need to change it
// so kill prev. stream first
NVRDataModel.log("footerCollapse: Calling kill with " + $scope.MontageMonitors[i].Monitor.connKey + " for Monitor:" + $scope.MontageMonitors[i].Monitor.Name);
@@ -247,24 +278,30 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
// make sure there are no more than 5 active streams (noevent is ok)
$scope.currentLimit = $scope.monLimit;
//qHttp.get(apiurl)
- $http({
+ $http(
+ {
method: 'get',
url: apiurl
- }).then(function (succ) {
+ }).then(function(succ)
+ {
var data = succ.data;
var ld = NVRDataModel.getLogin();
NVRDataModel.debug("Got " + data.events.length + "new history events...");
var eid, mid, stime;
- for (i = 0; i < data.events.length; i++) {
+ for (i = 0; i < data.events.length; i++)
+ {
mid = data.events[i].Event.MonitorId;
eid = data.events[i].Event.Id;
stime = data.events[i].Event.StartTime;
// only take the first one for each monitor
- for (var j = 0; j < $scope.MontageMonitors.length; j++) {
+ for (var j = 0; j < $scope.MontageMonitors.length; j++)
+ {
$scope.MontageMonitors[j].Monitor.isPaused = false;
// that's the earliest match and play gapless from there
- if ($scope.MontageMonitors[j].Monitor.Id == mid) {
- if ($scope.MontageMonitors[j].Monitor.eventUrl == 'img/noevent.png') {
+ if ($scope.MontageMonitors[j].Monitor.Id == mid)
+ {
+ if ($scope.MontageMonitors[j].Monitor.eventUrl == 'img/noevent.png')
+ {
// console.log ("Old value of event url " + $scope.MontageMonitors[j].eventUrl);
//console.log ("ldurl is " + ld.streamingurl);
var bw = NVRDataModel.getBandwidth() == "lowbw" ? zm.eventMontageQualityLowBW : ld.montageHistoryQuality;
@@ -281,7 +318,6 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
// now lets get the API for that event for graphing
$scope.MontageMonitors[j].Monitor.noGraph = true;
-
}
}
}
@@ -290,9 +326,11 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
// in the above call, is possible some did not make the cut in the first page
NVRDataModel.log("Making sure all monitors have a fair chance...");
var promises = [];
- for (i = 0; i < $scope.MontageMonitors.length; i++) {
+ for (i = 0; i < $scope.MontageMonitors.length; i++)
+ {
//console.log("Fair chance check for " + $scope.MontageMonitors[i].Monitor.Name);
- if ($scope.MontageMonitors[i].Monitor.eventUrl == 'img/noevent.png') {
+ if ($scope.MontageMonitors[i].Monitor.eventUrl == 'img/noevent.png')
+ {
var indivGrab = ld.apiurl + "/events/index/MonitorId:" + $scope.MontageMonitors[i].Monitor.Id + "/StartTime >=:" + TimeObjectFrom + "/AlarmFrames >=:" + (ld.enableAlarmCount ? ld.minAlarmCount : 0) + ".json";
NVRDataModel.debug("Monitor " + $scope.MontageMonitors[i].Monitor.Id + ":" + $scope.MontageMonitors[i].Monitor.Name + " does not have events, trying " + indivGrab);
var p = getExpandedEvents(i, indivGrab);
@@ -305,13 +343,16 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
// At this stage, we have both a general events grab, and specific event grabs for MIDS that were empty
- function doPackery() {
+ function doPackery()
+ {
// $ionicLoading.hide();
//console.log("REDOING PACKERY & DRAG");
NVRDataModel.debug("Re-creating packery and draggy");
- if (pckry !== undefined) {
+ if (pckry !== undefined)
+ {
// remove current draggies
- draggies.forEach(function (drag) {
+ draggies.forEach(function(drag)
+ {
drag.destroy();
});
draggies = [];
@@ -319,27 +360,34 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
pckry.destroy();
initPackery();
- $rootScope.eventQueryInterval = $interval(function () {
+ $rootScope.eventQueryInterval = $interval(function()
+ {
checkAllEvents();
}.bind(this), zm.eventHistoryTimer);
}
}
- }, function (err) {
+ }, function(err)
+ {
NVRDataModel.debug("history ERROR:" + JSON.stringify(err));
});
- function getExpandedEvents(i, indivGrab) {
+ function getExpandedEvents(i, indivGrab)
+ {
var d = $q.defer();
var ld = NVRDataModel.getLogin();
// console.log ("Expanded API: " + indivGrab);
- $http({
+ $http(
+ {
method: 'get',
url: indivGrab
- }).then(function (succ) {
+ }).then(function(succ)
+ {
var data = succ.data;
// console.log ("EXPANDED DATA FOR MONITOR " + i + JSON.stringify(data));
- if (data.events.length > 0) {
- if (!NVRDataModel.isBackground()) {
+ if (data.events.length > 0)
+ {
+ if (!NVRDataModel.isBackground())
+ {
var bw = NVRDataModel.getBandwidth() == "lowbw" ? zm.eventMontageQualityLowBW : ld.montageHistoryQuality;
$scope.MontageMonitors[i].Monitor.eventUrl = ld.streamingurl + "/nph-zms?source=event&mode=jpeg&event=" + data.events[0].Event.Id + "&frame=1&replay=gapless&rate=" + $scope.sliderVal.realRate + "&connkey=" + $scope.MontageMonitors[i].Monitor.connKey + "&scale=" + bw + "&rand=" + $rootScope.rand;
//console.log ("SWITCHING TO " + $scope.MontageMonitors[i].eventUrl);
@@ -352,7 +400,9 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
$scope.MontageMonitors[i].Monitor.eventDuration = data.events[0].Event.Length;
//console.log(">>> Setting Event for " + $scope.MontageMonitors[i].Monitor.Name + " to " + data.events[0].Event.Id);
NVRDataModel.log("Found expanded event " + data.events[0].Event.Id + " for monitor " + $scope.MontageMonitors[i].Monitor.Id);
- } else {
+ }
+ else
+ {
// $scope.MontageMonitors[i].eventUrl="img/noevent.png";
// $scope.MontageMonitors[i].eventUrlTime = "";
// NVRDataModel.log ("Setting img src to null as data received in background");
@@ -361,7 +411,8 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
d.resolve(true);
return d.promise;
},
- function (err) {
+ function(err)
+ {
d.resolve(true);
return d.promise;
}
@@ -376,16 +427,19 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
// Its a 2 step process - get event Id then go a Event
// API call to get time stamp. Sucks
//---------------------------------------------------------
- function checkAllEvents() {
+ function checkAllEvents()
+ {
//console.log("Timer:Events are checked....");
- //if (pckry && !$scope.isDragabillyOn) pckry.shiftLayout();
+ //if (pckry && !$scope.isDragabillyOn) pckry.shiftLayout();
- for (var i = 0; i < $scope.MontageMonitors.length; i++) {
+ for (var i = 0; i < $scope.MontageMonitors.length; i++)
+ {
// don't check for monitors that are not shown
// because nph connkey won't exist and the response
// will fail
- if ($scope.MontageMonitors[i].Monitor.eventUrl != "" && $scope.MontageMonitors[i].Monitor.eventUrl != 'img/noevent.png' && $scope.MontageMonitors[i].Monitor.connKey != '' && $scope.MontageMonitors[i].Monitor.Function != 'None' && $scope.MontageMonitors[i].Monitor.listDisplay != 'noshow' && $scope.MontageMonitors[i].Monitor.Enabled != '0') {
+ if ($scope.MontageMonitors[i].Monitor.eventUrl != "" && $scope.MontageMonitors[i].Monitor.eventUrl != 'img/noevent.png' && $scope.MontageMonitors[i].Monitor.connKey != '' && $scope.MontageMonitors[i].Monitor.Function != 'None' && $scope.MontageMonitors[i].Monitor.listDisplay != 'noshow' && $scope.MontageMonitors[i].Monitor.Enabled != '0')
+ {
// NVRDataModel.debug("Checking event status for " + $scope.MontageMonitors[i].Monitor.Name + ":" + $scope.MontageMonitors[i].Monitor.eventUrl + ":" + $scope.MontageMonitors[i].Monitor.Function + ":" + $scope.MontageMonitors[i].Monitor.listDisplay);
// console.log ("Sending query 99 for " + $scope.MontageMonitors[i].Monitor.Name + " with ck="+$scope.MontageMonitors[i].Monitor.connKey);
controlEventStream('99', '', $scope.MontageMonitors[i].Monitor.connKey, i);
@@ -397,37 +451,45 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
// then it also calls an event API for the returned eid
// and stores its time in the montage monitors array
//--------------------------------------------------------------
- $scope.controlEventStream = function (cmd, disp, connkey, ndx) {
+ $scope.controlEventStream = function(cmd, disp, connkey, ndx)
+ {
controlEventStream(cmd, disp, connkey, ndx);
};
- function timedControlEventStream(mTime, cmd, disp, connkey, ndx) {
+ function timedControlEventStream(mTime, cmd, disp, connkey, ndx)
+ {
var mMtime = mTime || 2000;
NVRDataModel.debug("Deferring control " + cmd + " by " + mMtime);
- $timeout(function () {
+ $timeout(function()
+ {
subControlStream(cmd, connkey);
}, mMtime);
}
- function subControlStream(cmd, connkey) {
+ function subControlStream(cmd, connkey)
+ {
var loginData = NVRDataModel.getLogin();
var myauthtoken = $rootScope.authSession.replace("&auth=", "");
//&auth=
- var req = qHttp({
+ var req = qHttp(
+ {
method: 'POST',
/*timeout: 15000,*/
url: loginData.url + '/index.php',
- headers: {
+ headers:
+ {
'Content-Type': 'application/x-www-form-urlencoded', //'Accept': '*/*',
},
- transformRequest: function (obj) {
+ transformRequest: function(obj)
+ {
var str = [];
for (var p in obj) str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
var foo = str.join("&");
//console.log("****SUB RETURNING " + foo);
return foo;
},
- data: {
+ data:
+ {
view: "request",
request: "stream",
connkey: connkey,
@@ -436,20 +498,25 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
// pass: loginData.password
}
});
- req.then(function (succ) {
+ req.then(function(succ)
+ {
NVRDataModel.debug("subControl success:" + JSON.stringify(succ));
- }, function (err) {
+ }, function(err)
+ {
NVRDataModel.debug("subControl error:" + JSON.stringify(err));
});
}
- function controlEventStream(cmd, disp, connkey, ndx, extras) {
+ function controlEventStream(cmd, disp, connkey, ndx, extras)
+ {
// console.log("Command value " + cmd);
var d = $q.defer();
- if (disp) {
+ if (disp)
+ {
$ionicLoading.hide();
- $ionicLoading.show({
+ $ionicLoading.show(
+ {
template: $translate.instant('kPleaseWait') + "...",
noBackdrop: true,
duration: zm.loadingTimeout,
@@ -482,14 +549,17 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
//console.log ("AUTH IS " + $rootScope.authSession);
var myauthtoken = $rootScope.authSession.replace("&auth=", "");
//&auth=
- var req = qHttp({
+ var req = qHttp(
+ {
method: 'POST',
/*timeout: 15000,*/
url: loginData.url + '/index.php',
- headers: {
+ headers:
+ {
'Content-Type': 'application/x-www-form-urlencoded', //'Accept': '*/*',
},
- transformRequest: function (obj) {
+ transformRequest: function(obj)
+ {
var str = [];
for (var p in obj) str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
var foo = str.join("&");
@@ -497,7 +567,8 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
//console.log("****RETURNING " + foo);
return foo;
},
- data: {
+ data:
+ {
view: "request",
request: "stream",
connkey: connkey,
@@ -506,31 +577,39 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
// pass: loginData.password
}
});
- req.then(function (succ) {
+ req.then(function(succ)
+ {
var resp = succ.data;
//console.log ("zms response: " + JSON.stringify(resp));
// move progress bar if event id is the same
- if (resp.result == "Ok" && ndx != -1 && (resp.status.event == $scope.MontageMonitors[ndx].Monitor.eid)) {
- if (!$scope.MontageMonitors[ndx].Monitor.seek) {
+ if (resp.result == "Ok" && ndx != -1 && (resp.status.event == $scope.MontageMonitors[ndx].Monitor.eid))
+ {
+ if (!$scope.MontageMonitors[ndx].Monitor.seek)
+ {
$scope.MontageMonitors[ndx].Monitor.sliderProgress.progress = resp.status.progress;
- } else {
+ }
+ else
+ {
NVRDataModel.debug("Skipping progress as seek is active for " + $scope.MontageMonitors[ndx].Monitor.Name);
}
}
- if (resp.result == "Ok" && ndx != -1 && ((resp.status.event != $scope.MontageMonitors[ndx].Monitor.eid) || $scope.MontageMonitors[ndx].Monitor.noGraph == true)) {
+ if (resp.result == "Ok" && ndx != -1 && ((resp.status.event != $scope.MontageMonitors[ndx].Monitor.eid) || $scope.MontageMonitors[ndx].Monitor.noGraph == true))
+ {
$scope.MontageMonitors[ndx].Monitor.noGraph = false;
// $scope.MontageMonitors[ndx].Monitor.sliderProgress.progress = 0;
NVRDataModel.debug("Fetching details, as event changed for " + $scope.MontageMonitors[ndx].Monitor.Name + " from " + $scope.MontageMonitors[ndx].Monitor.eid + " to " + resp.status.event);
var ld = NVRDataModel.getLogin();
var apiurl = ld.apiurl + "/events/" + resp.status.event + ".json";
//console.log ("API " + apiurl);
- qHttp({
+ qHttp(
+ {
method: 'get',
url: apiurl
- }).then(function (succ) {
+ }).then(function(succ)
+ {
var data = succ.data;
var currentEventTime = moment(data.event.Event.StartTime);
var maxTime = moment();
@@ -539,31 +618,36 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
NVRDataModel.debug("creating graph for " + $scope.MontageMonitors[ndx].Monitor.Name);
var framearray = {
labels: [],
- datasets: [{
+ datasets: [
+ {
backgroundColor: 'rgba(242, 12, 12, 0.5)',
borderColor: 'rgba(242, 12, 12, 0.5)',
data: [],
- }]
+ }]
};
framearray.labels = [];
var ld = NVRDataModel.getLogin();
//console.log(">>>>> GRAPH");
- for (i = 0; i < data.event.Frame.length; i++) {
+ for (i = 0; i < data.event.Frame.length; i++)
+ {
var ts = moment(data.event.Frame[i].TimeStamp).format(timeFormat);
//console.log ("pushing s:" + event.Frame[i].Score+" t:"+ts);
- framearray.datasets[0].data.push({
+ framearray.datasets[0].data.push(
+ {
x: ts,
y: data.event.Frame[i].Score
});
framearray.labels.push("");
}
- $timeout(function () {
+ $timeout(function()
+ {
drawGraph(framearray, $scope.MontageMonitors[ndx].Monitor.Id);
}, 100);
var element = angular.element(document.getElementById($scope.MontageMonitors[ndx].Monitor.Id + "-timeline"));
element.removeClass('animated flipInX');
element.addClass('animated flipOutX');
- $timeout(function () {
+ $timeout(function()
+ {
element.removeClass('animated flipOutX');
element.addClass('animated flipInX');
$scope.MontageMonitors[ndx].Monitor.eventUrlTime = data.event.Event.StartTime;
@@ -577,59 +661,71 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
//console.log(">>> Setting Event for " + $scope.MontageMonitors[ndx].Monitor.Name + " to " + data.event.Event.Id);
}, 700);
-
- }, function (err) {
+ }, function(err)
+ {
NVRDataModel.debug("skipping graph as detailed API failed for " + $scope.MontageMonitors[ndx].Monitor.Name);
$scope.MontageMonitors[ndx].Monitor.eventUrlTime = "-";
});
}
d.resolve(true);
return d.promise;
- }, function (err) {
+ }, function(err)
+ {
d.reject(false);
NVRDataModel.log("Error sending event command " + JSON.stringify(err), "error");
return d.promise;
});
return d.promise;
}
- $scope.isBackground = function () {
+ $scope.isBackground = function()
+ {
return NVRDataModel.isBackground();
};
//----------------------------------------------------------------
// Alarm notification handling
//----------------------------------------------------------------
- $scope.handleAlarms = function () {
+ $scope.handleAlarms = function()
+ {
$rootScope.isAlarm = !$rootScope.isAlarm;
- if (!$rootScope.isAlarm) {
+ if (!$rootScope.isAlarm)
+ {
$rootScope.alarmCount = "0";
- $ionicHistory.nextViewOptions({
+ $ionicHistory.nextViewOptions(
+ {
disableBack: true
});
- $state.go("events", {
+ $state.go("events",
+ {
"id": 0,
"playEvent": false
- }, {
+ },
+ {
reload: true
});
return;
}
};
- $scope.handleAlarmsWhileMinimized = function () {
+ $scope.handleAlarmsWhileMinimized = function()
+ {
$rootScope.isAlarm = !$rootScope.isAlarm;
$scope.minimal = !$scope.minimal;
NVRDataModel.debug("MontageHistoryCtrl: switch minimal is " + $scope.minimal);
ionic.Platform.fullScreen($scope.minimal, !$scope.minimal);
$interval.cancel(intervalHandle);
$interval.cancel($rootScope.eventQueryInterval);
- if (!$rootScope.isAlarm) {
+ if (!$rootScope.isAlarm)
+ {
$rootScope.alarmCount = "0";
- $ionicHistory.nextViewOptions({
+ $ionicHistory.nextViewOptions(
+ {
disableBack: true
});
- $state.go("events", {
+ $state.go("events",
+ {
"id": 0,
"playEvent": false,
- }, {
+ },
+ {
reload: true
});
return;
@@ -640,18 +736,24 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
// when app is in background. This is a problem with Android,
// for example
//-------------------------------------------------------------
- $scope.isBackground = function () {
+ $scope.isBackground = function()
+ {
//console.log ("Is background called from Montage and returned " +
//NVRDataModel.isBackground());
return NVRDataModel.isBackground();
};
- $scope.toggleControls = function () {
+ $scope.toggleControls = function()
+ {
$scope.showControls = !$scope.showControls;
};
- $scope.toggleSelectItem = function (ndx) {
- if ($scope.MontageMonitors[ndx].Monitor.selectStyle !== "undefined" && $scope.MontageMonitors[ndx].Monitor.selectStyle == "dragborder-selected") {
+ $scope.toggleSelectItem = function(ndx)
+ {
+ if ($scope.MontageMonitors[ndx].Monitor.selectStyle !== "undefined" && $scope.MontageMonitors[ndx].Monitor.selectStyle == "dragborder-selected")
+ {
$scope.MontageMonitors[ndx].Monitor.selectStyle = "";
- } else {
+ }
+ else
+ {
$scope.MontageMonitors[ndx].Monitor.selectStyle = "dragborder-selected";
}
//console.log ("Switched value to " + $scope.MontageMonitors[ndx].Monitor.selectStyle);
@@ -659,39 +761,49 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
//---------------------------------------------------------------------
// Called when you enable/disable dragging
//---------------------------------------------------------------------
- $scope.dragToggle = function () {
+ $scope.dragToggle = function()
+ {
dragToggle();
};
- function dragToggle() {
+ function dragToggle()
+ {
var i;
$scope.isDragabillyOn = !$scope.isDragabillyOn;
$ionicSideMenuDelegate.canDragContent($scope.isDragabillyOn ? false : true);
//$timeout(function(){pckry.reloadItems();},10);
NVRDataModel.debug("setting dragabilly to " + $scope.isDragabillyOn);
- if ($scope.isDragabillyOn) {
+ if ($scope.isDragabillyOn)
+ {
$scope.showSizeButtons = true;
$scope.dragBorder = "dragborder";
NVRDataModel.debug("Enabling drag for " + draggies.length + " items");
- for (i = 0; i < draggies.length; i++) {
+ for (i = 0; i < draggies.length; i++)
+ {
draggies[i].enable();
draggies[i].bindHandles();
}
// reflow and reload as some may be hidden
// $timeout(function(){pckry.reloadItems();$timeout(function(){pckry.layout();},300);},100);
- } else {
+ }
+ else
+ {
$scope.dragBorder = "";
NVRDataModel.debug("Disabling drag for " + draggies.length + " items");
- for (i = 0; i < draggies.length; i++) {
+ for (i = 0; i < draggies.length; i++)
+ {
draggies[i].disable();
draggies[i].unbindHandles();
}
- for (i = 0; i < $scope.MontageMonitors.length; i++) {
+ for (i = 0; i < $scope.MontageMonitors.length; i++)
+ {
$scope.MontageMonitors[i].Monitor.selectStyle = "";
}
// reflow and reload as some may be hidden
- $timeout(function () {
- $timeout(function () {
+ $timeout(function()
+ {
+ $timeout(function()
+ {
pckry.shiftLayout();
/*var positions = pckry.getShiftPositions('data-item-id');
//console.log ("POSITIONS MAP " + JSON.stringify(positions));
@@ -705,13 +817,16 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
//---------------------------------------------------------------------
// Show/Hide PTZ control in monitor view
//---------------------------------------------------------------------
- $scope.togglePTZ = function () {
+ $scope.togglePTZ = function()
+ {
$scope.showPTZ = !$scope.showPTZ;
};
- $scope.callback = function () {
+ $scope.callback = function()
+ {
// console.log("dragging");
};
- $scope.onDropComplete = function (index, obj, event) {
+ $scope.onDropComplete = function(index, obj, event)
+ {
//console.log("dragged");
var otherObj = $scope.MontageMonitors[index];
var otherIndex = $scope.MontageMonitors.indexOf(obj);
@@ -721,7 +836,8 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
//---------------------------------------------------------------------
// changes order of montage display
//---------------------------------------------------------------------
- $scope.toggleMontageDisplayOrder = function () {
+ $scope.toggleMontageDisplayOrder = function()
+ {
$scope.packMontage = !$scope.packMontage;
loginData.packMontage = $scope.packMontage;
NVRDataModel.setLogin(loginData);
@@ -733,7 +849,8 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
// So while this view, we DON'T want Android to keep sending 1 second
// refreshes to the server for images we are not seeing
//---------------------------------------------------------------------
- function onPause() {
+ function onPause()
+ {
NVRDataModel.debug("MontageHistoryCtrl: onpause called");
$interval.cancel($rootScope.eventQueryInterval);
$interval.cancel(intervalHandle);
@@ -741,21 +858,27 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
// FIXME: Do I need to setAwake(false) here?
}
- function onResume() {}
- $scope.openMenu = function () {
- $timeout(function () {
+ function onResume()
+ {}
+ $scope.openMenu = function()
+ {
+ $timeout(function()
+ {
$rootScope.stateofSlide = $ionicSideMenuDelegate.isOpen();
}, 500);
$ionicSideMenuDelegate.toggleLeft();
};
- $scope.$on('$destroy', function () {
+ $scope.$on('$destroy', function()
+ {
NVRDataModel.debug("Cancelling eventQueryInterval");
$interval.cancel($rootScope.eventQueryInterval);
});
- $scope.$on('$ionicView.loaded', function () {
+ $scope.$on('$ionicView.loaded', function()
+ {
//console.log("**VIEW ** MontageHistoryCtrl Loaded");
});
- $scope.$on('$ionicView.enter', function () {
+ $scope.$on('$ionicView.enter', function()
+ {
NVRDataModel.debug("**VIEW ** MontageHistory Ctrl Entered");
var ld = NVRDataModel.getLogin();
//console.log("Setting Awake to " + NVRDataModel.getKeepAwake());
@@ -763,7 +886,8 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
NVRDataModel.debug("query timer started");
$interval.cancel($rootScope.eventQueryInterval);
//console.log ("****************** TIMER STARTED INSIDE ENTER");
- $rootScope.eventQueryInterval = $interval(function () {
+ $rootScope.eventQueryInterval = $interval(function()
+ {
checkAllEvents();
}.bind(this), zm.eventHistoryTimer);
});
@@ -771,14 +895,17 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
console.log ("******** HISTORY UNLOADED KILLING WINDOW ************");
window.stop();
});*/
- $scope.$on('$ionicView.beforeEnter', function () {
+ $scope.$on('$ionicView.beforeEnter', function()
+ {
// NVRDataModel.log ("Before Enter History: initing connkeys");
});
- $scope.$on('$ionicView.beforeLeave', function () {
+ $scope.$on('$ionicView.beforeLeave', function()
+ {
//console.log("**VIEW ** Event History Ctrl Left, force removing modal");
if ($scope.modal) $scope.modal.remove();
NVRDataModel.log("BeforeLeave: Nullifying the streams...");
- for (i = 0; i < $scope.MontageMonitors.length; i++) {
+ for (i = 0; i < $scope.MontageMonitors.length; i++)
+ {
var element = document.getElementById("img-" + i);
/*if (element)
{
@@ -795,8 +922,10 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
NVRDataModel.log("MontageHistory:Stopping network pull...");
// make sure this is applied in scope digest to stop network pull
// thats why we are doing it beforeLeave
- for (i = 0; i < $scope.MontageMonitors.length; i++) {
- if ($scope.MontageMonitors[i].Monitor.connKey != '' && $scope.MontageMonitors[i].Monitor.eventUrl != 'img/noevent.png' && $scope.MontageMonitors[i].Monitor.Function != 'None' && $scope.MontageMonitors[i].Monitor.lisDisplay != 'noshow' && $scope.MontageMonitors[i].Monitor.Enabled != '0') {
+ for (i = 0; i < $scope.MontageMonitors.length; i++)
+ {
+ if ($scope.MontageMonitors[i].Monitor.connKey != '' && $scope.MontageMonitors[i].Monitor.eventUrl != 'img/noevent.png' && $scope.MontageMonitors[i].Monitor.Function != 'None' && $scope.MontageMonitors[i].Monitor.lisDisplay != 'noshow' && $scope.MontageMonitors[i].Monitor.Enabled != '0')
+ {
NVRDataModel.log("Before leave: Calling kill with " + $scope.MontageMonitors[i].Monitor.connKey);
var tmpCK = angular.copy($scope.MontageMonitors[i].Monitor.connKey);
timedControlEventStream(2500, 17, "", tmpCK, -1);
@@ -807,10 +936,12 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
NVRDataModel.log("Forcing a window.stop() here");
NVRDataModel.stopNetwork("MontageHistory-beforeLeave");
});
- $scope.$on('$ionicView.unloaded', function () {});
- $scope.sliderChanged = function (dirn) {
+ $scope.$on('$ionicView.unloaded', function() {});
+ $scope.sliderChanged = function(dirn)
+ {
//console.log("SLIDER CHANGED");
- if ($scope.sliderChanging) {
+ if ($scope.sliderChanging)
+ {
// console.log ("too fast my friend");
//$scope.slider.monsize = oldSliderVal;
// return;
@@ -818,19 +949,24 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
$scope.sliderChanging = true;
var somethingReset = false;
// this only changes items that are selected
- for (var i = 0; i < $scope.MontageMonitors.length; i++) {
+ for (var i = 0; i < $scope.MontageMonitors.length; i++)
+ {
var curVal = parseInt($scope.MontageMonitors[i].Monitor.gridScale);
curVal = curVal + (10 * dirn);
if (curVal < 10) curVal = 10;
if (curVal > 100) curVal = 100;
//console.log ("For Index: " + i + " From: " + $scope.MontageMonitors[i].Monitor.gridScale + " To: " + curVal);
- if ($scope.isDragabillyOn) {
+ if ($scope.isDragabillyOn)
+ {
// only do this for selected monitors
- if ($scope.MontageMonitors[i].Monitor.selectStyle == "dragborder-selected") {
+ if ($scope.MontageMonitors[i].Monitor.selectStyle == "dragborder-selected")
+ {
$scope.MontageMonitors[i].Monitor.gridScale = curVal;
somethingReset = true;
}
- } else {
+ }
+ else
+ {
$scope.MontageMonitors[i].Monitor.gridScale = curVal;
//somethingReset = true;
}
@@ -838,7 +974,8 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
// this changes all items if none were selected
if (!somethingReset && $scope.isDragabillyOn) // nothing was selected
{
- for (i = 0; i < $scope.MontageMonitors.length; i++) {
+ for (i = 0; i < $scope.MontageMonitors.length; i++)
+ {
var cv = parseInt($scope.MontageMonitors[i].Monitor.gridScale);
cv = cv + (10 * dirn);
if (cv < 10) cv = 10;
@@ -847,7 +984,8 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
}
}
//pckry.reloadItems();
- pckry.once('layoutComplete', function () {
+ pckry.once('layoutComplete', function()
+ {
/* $timeout(function () {
var positions = pckry.EHgetShiftPositions('eh-data-item-id');
//console.log ("POSITIONS MAP " + JSON.stringify(positions));
@@ -858,58 +996,77 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
$scope.sliderChanging = false;
}, zm.packeryTimer);*/
});
- if (!somethingReset) {
+ if (!somethingReset)
+ {
//console.log (">>>SOMETHING NOT RESET");
- $timeout(function () {
+ $timeout(function()
+ {
pckry.layout();
}, zm.packeryTimer);
- } else {
+ }
+ else
+ {
//console.log (">>>SOMETHING RESET");
- $timeout(function () {
+ $timeout(function()
+ {
layout(pckry);
}, zm.packeryTimer);
}
};
- function layout(pckry) {
+ function layout(pckry)
+ {
pckry.shiftLayout();
}
- $scope.resetSizes = function () {
+ $scope.resetSizes = function()
+ {
var somethingReset = false;
- for (var i = 0; i < $scope.MontageMonitors.length; i++) {
- if ($scope.isDragabillyOn) {
- if ($scope.MontageMonitors[i].Monitor.selectStyle == "dragborder-selected") {
+ for (var i = 0; i < $scope.MontageMonitors.length; i++)
+ {
+ if ($scope.isDragabillyOn)
+ {
+ if ($scope.MontageMonitors[i].Monitor.selectStyle == "dragborder-selected")
+ {
$scope.MontageMonitors[i].Monitor.gridScale = "50";
somethingReset = true;
}
- } else {
+ }
+ else
+ {
$scope.MontageMonitors[i].Monitor.gridScale = "50";
// somethingReset = true;
}
}
if (!somethingReset && $scope.isDragabillyOn) // nothing was selected
{
- for (i = 0; i < $scope.MontageMonitors.length; i++) {
+ for (i = 0; i < $scope.MontageMonitors.length; i++)
+ {
$scope.MontageMonitors[i].Monitor.gridScale = "50";
}
}
- $timeout(function () {
+ $timeout(function()
+ {
pckry.reloadItems();
- $timeout(function () {
+ $timeout(function()
+ {
pckry.layout();
}, zm.packeryTimer); // force here - no shiftlayout
}, 100);
};
- function isEmpty(obj) {
- for (var prop in obj) {
+ function isEmpty(obj)
+ {
+ for (var prop in obj)
+ {
return false;
}
return true;
}
// called by afterEnter to load Packery
- function initPackery() {
- $ionicLoading.show({
+ function initPackery()
+ {
+ $ionicLoading.show(
+ {
template: $translate.instant('kArrangingImages'),
noBackdrop: true,
duration: zm.loadingTimeout
@@ -920,40 +1077,44 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
var ld = NVRDataModel.getLogin();
var elem = angular.element(document.getElementById("mygrid"));
- pckry = new Packery('.grid', {
- itemSelector: '.grid-item',
- percentPosition: true,
- columnWidth: '.grid-sizer',
- gutter: 0,
- initLayout: true
+ pckry = new Packery('.grid',
+ {
+ itemSelector: '.grid-item',
+ percentPosition: true,
+ columnWidth: '.grid-sizer',
+ gutter: 0,
+ initLayout: true
- });
+ });
//console.log ("**** mygrid is " + JSON.stringify(elem));
- imagesLoaded(elem).on('progress', function (instance, img) {
+ imagesLoaded(elem).on('progress', function(instance, img)
+ {
var result = img.isLoaded ? 'loaded' : 'broken';
- NVRDataModel.debug( '~~loaded image is ' + result + ' for ' + img.img.src );
+ NVRDataModel.debug('~~loaded image is ' + result + ' for ' + img.img.src);
pckry.layout();
progressCalled = true;
// if (layouttype) $timeout (function(){layout(pckry);},100);
});
- imagesLoaded(elem).once('always', function () {
+ imagesLoaded(elem).once('always', function()
+ {
//console.log("******** ALL IMAGES LOADED");
$scope.$digest();
NVRDataModel.debug("All images loaded");
$ionicLoading.hide();
$scope.areImagesLoading = false;
-
-
- if (!progressCalled) {
+
+ if (!progressCalled)
+ {
NVRDataModel.log("*** PROGRESS WAS NOT CALLED");
pckry.reloadItems();
}
+ $timeout(function()
+ {
- $timeout(function () {
-
- pckry.getItemElements().forEach(function (itemElem) {
+ pckry.getItemElements().forEach(function(itemElem)
+ {
draggie = new Draggabilly(itemElem);
pckry.bindDraggabillyEvents(draggie);
draggies.push(draggie);
@@ -963,8 +1124,6 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
pckry.on('dragItemPositioned', itemDragged);
-
-
/*if (!isEmpty(positions)) {
NVRDataModel.log("Arranging as per packery grid");
@@ -986,26 +1145,24 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
}, 0);
}*/
-
-
- $timeout(function () {
+ $timeout(function()
+ {
NVRDataModel.log("Force calling resize");
pckry.layout();
$scope.packeryDone = true;
}, zm.packeryTimer); // don't ask
-
-
}, zm.packeryTimer);
-
});
- function itemDragged(item) {
+ function itemDragged(item)
+ {
NVRDataModel.debug("drag complete");
}
}
- $scope.$on('$ionicView.beforeEnter', function () {
+ $scope.$on('$ionicView.beforeEnter', function()
+ {
// This rand is really used to reload the monitor image in img-src so it is not cached
// I am making sure the image in montage view is always fresh
// I don't think I am using this anymore FIXME: check and delete if needed
@@ -1014,69 +1171,79 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
$scope.packeryDone = false;
readyToRun = false;
$scope.MontageMonitors = message;
-
doInitCode();
-
-
-
});
- $scope.reloadView = function () {
+ $scope.reloadView = function()
+ {
$rootScope.rand = Math.floor((Math.random() * 100000) + 1);
NVRDataModel.log("User action: image reload " + $rootScope.rand);
};
- $scope.doRefresh = function () {
+ $scope.doRefresh = function()
+ {
//console.log("***Pull to Refresh, recomputing Rand");
NVRDataModel.log("Reloading view for montage view, recomputing rand");
$rootScope.rand = Math.floor((Math.random() * 100000) + 1);
$scope.MontageMonitors = [];
imageLoadingDataShare.set(0);
var refresh = NVRDataModel.getMonitors(1);
- refresh.then(function (data) {
+ refresh.then(function(data)
+ {
$scope.MontageMonitors = data.data;
$scope.$broadcast('scroll.refreshComplete');
});
};
- function drawGraph(f, mid) {
+ function drawGraph(f, mid)
+ {
//console.log("Graphing on " + "eventchart-" + mid);
var cv = document.getElementById("eventchart-" + mid);
var ctx = cv.getContext("2d");
frameoptions = {
responsive: true,
legend: false,
- title: {
+ title:
+ {
display: false,
text: ""
},
- scales: {
- yAxes: [{
+ scales:
+ {
+ yAxes: [
+ {
display: false,
- scaleLabel: {
+ scaleLabel:
+ {
display: false,
labelString: 'value',
}
- }],
- xAxes: [{
+ }],
+ xAxes: [
+ {
type: 'time',
display: false,
- time: {
+ time:
+ {
format: timeFormat,
tooltipFormat: 'll HH:mm',
min: f.datasets[0].data[0].x,
max: f.datasets[0].data[f.datasets[0].data.length - 1].x,
- displayFormats: {}
+ displayFormats:
+ {}
},
- scaleLabel: {
+ scaleLabel:
+ {
display: false,
labelString: ''
}
}]
}
};
- $timeout(function () {
- var myChart = new Chart(ctx, {
+ $timeout(function()
+ {
+ var myChart = new Chart(ctx,
+ {
type: 'line',
data: f,
options: frameoptions,
@@ -1166,27 +1333,32 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
$scope.datetimeValueFrom.hrs = Math.round(moment.duration(moment().diff(moment($scope.datetimeValueFrom.value))).asHours());
commonCss = {
- background: {
+ background:
+ {
"background-color": "silver"
},
- before: {
+ before:
+ {
"background-color": "purple"
},
- default: {
+ default:
+ {
"background-color": "white"
}, // default value: 1px
- after: {
+ after:
+ {
"background-color": "green"
}, // zone after default value
- pointer: {
+ pointer:
+ {
"background-color": "red"
}, // circle pointer
- range: {
+ range:
+ {
"background-color": "red"
} // use it if double value
};
-
$scope.monitorSize = []; // array with montage sizes per monitor
$scope.scaleDirection = []; // 1 = increase -1 = decrease
// The difference between old and original is this:
@@ -1200,24 +1372,28 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
var montageOrder = []; // This array will keep the ordering in montage view
var hiddenOrder = []; // 1 = hide, 0 = don't hide
var tempMonitors = message;
- if (tempMonitors.length == 0) {
- $rootScope.zmPopup = $ionicPopup.alert({
+ if (tempMonitors.length == 0)
+ {
+ $rootScope.zmPopup = $ionicPopup.alert(
+ {
title: $translate.instant('kNoMonitors'),
template: $translate.instant('kPleaseCheckCredentials')
});
- $ionicHistory.nextViewOptions({
+ $ionicHistory.nextViewOptions(
+ {
disableBack: true
});
$state.go("login");
return;
}
-
+
NVRDataModel.log("Inside MontageHistoryCtrl:We found " + $scope.MontageMonitors.length + " monitors");
// $scope.MontageMonitors = NVRDataModel.applyMontageMonitorPrefs(message, 1)[0];
var loginData = NVRDataModel.getLogin();
// init monitors
NVRDataModel.debug(">>Initializing connkeys and images...");
- for (i = 0; i < $scope.MontageMonitors.length; i++) {
+ for (i = 0; i < $scope.MontageMonitors.length; i++)
+ {
//$scope.MontageMonitors[i].Monitor.connKey='';
$scope.MontageMonitors[i].Monitor.eid = "-1";
$scope.MontageMonitors[i].Monitor.connKey = (Math.floor((Math.random() * 999999) + 1)).toString();
@@ -1237,19 +1413,26 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
// Handling of back button in case modal is open should
// close the modal
// --------------------------------------------------------
- $ionicPlatform.registerBackButtonAction(function (e) {
+ $ionicPlatform.registerBackButtonAction(function(e)
+ {
e.preventDefault();
- if ($scope.modal && $scope.modal.isShown()) {
+ if ($scope.modal && $scope.modal.isShown())
+ {
// switch off awake, as liveview is finished
NVRDataModel.debug("Modal is open, closing it");
NVRDataModel.setAwake(false);
$scope.modal.remove();
$scope.isModalActive = false;
- } else {
+ }
+ else
+ {
NVRDataModel.debug("Modal is closed, so toggling or exiting");
- if (!$ionicSideMenuDelegate.isOpenLeft()) {
+ if (!$ionicSideMenuDelegate.isOpenLeft())
+ {
$ionicSideMenuDelegate.toggleLeft();
- } else {
+ }
+ else
+ {
navigator.app.exitApp();
}
}
@@ -1260,13 +1443,15 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
$scope.LoginData = NVRDataModel.getLogin();
$scope.monLimit = $scope.LoginData.maxMontage;
$scope.currentLimit = $scope.LoginData.maxMontage;
- if ($rootScope.platformOS != 'ios') {
+ if ($rootScope.platformOS != 'ios')
+ {
NVRDataModel.log("Limiting montage to 5, thanks to Chrome's stupid connection limit");
$scope.currentLimit = 5;
$scope.monLimit = 5;
}
$rootScope.authSession = "undefined";
- $ionicLoading.show({
+ $ionicLoading.show(
+ {
template: $translate.instant('kNegotiatingStreamAuth'),
animation: 'fade-in',
showBackdrop: true,
@@ -1277,23 +1462,27 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
ld = NVRDataModel.getLogin();
//console.log ("MONITORS " + JSON.stringify($scope.monitors));
$rootScope.validMonitorId = $scope.MontageMonitors[0].Monitor.Id;
- NVRDataModel.getAuthKey($rootScope.validMonitorId).then(function (success) {
+ NVRDataModel.getAuthKey($rootScope.validMonitorId).then(function(success)
+ {
$ionicLoading.hide();
//console.log(success);
$rootScope.authSession = success;
NVRDataModel.log("Stream authentication construction: " + $rootScope.authSession);
- $timeout(function () {
+ $timeout(function()
+ {
initPackery();
readyToRun = true;
footerCollapse();
}, zm.packeryTimer);
- }, function (error) {
+ }, function(error)
+ {
$ionicLoading.hide();
NVRDataModel.debug("MontageHistoryCtrl: Error in authkey retrieval " + error);
//$rootScope.authSession="";
NVRDataModel.log("MontageHistoryCtrl: Error returned Stream authentication construction. Retaining old value of: " + $rootScope.authSession);
- $timeout(function () {
+ $timeout(function()
+ {
initPackery();
readyToRun = true;
footerCollapse();
@@ -1301,4 +1490,4 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
});
}
-}]); \ No newline at end of file
+}]);
diff --git a/www/js/NewsCtrl.js b/www/js/NewsCtrl.js
index 5328cf6b..752a97e2 100644
--- a/www/js/NewsCtrl.js
+++ b/www/js/NewsCtrl.js
@@ -2,33 +2,38 @@
/* jslint browser: true*/
/* global cordova,StatusBar,angular,console,moment*/
-angular.module('zmApp.controllers').controller('zmApp.NewsCtrl', ['$scope', '$rootScope', '$ionicModal', 'NVRDataModel', '$ionicSideMenuDelegate', '$ionicHistory', '$state', '$http', 'zm', function ($scope, $rootScope, $ionicModal, NVRDataModel, $ionicSideMenuDelegate, $ionicHistory, $state, $http, zm) {
- $scope.openMenu = function () {
+angular.module('zmApp.controllers').controller('zmApp.NewsCtrl', ['$scope', '$rootScope', '$ionicModal', 'NVRDataModel', '$ionicSideMenuDelegate', '$ionicHistory', '$state', '$http', 'zm', function($scope, $rootScope, $ionicModal, NVRDataModel, $ionicSideMenuDelegate, $ionicHistory, $state, $http, zm)
+{
+ $scope.openMenu = function()
+ {
$ionicSideMenuDelegate.toggleLeft();
};
-
//----------------------------------------------------------------
// Alarm notification handling
//----------------------------------------------------------------
- $scope.handleAlarms = function () {
+ $scope.handleAlarms = function()
+ {
$rootScope.isAlarm = !$rootScope.isAlarm;
- if (!$rootScope.isAlarm) {
+ if (!$rootScope.isAlarm)
+ {
$rootScope.alarmCount = "0";
- $ionicHistory.nextViewOptions({
+ $ionicHistory.nextViewOptions(
+ {
disableBack: true
});
- $state.go("events", {
+ $state.go("events",
+ {
"id": 0,
- "playEvent":false
- }, {
+ "playEvent": false
+ },
+ {
reload: true
});
return;
}
};
-
//-------------------------------------------------------------------------
// Lets make sure we set screen dim properly as we enter
// The problem is we enter other states before we leave previous states
@@ -36,14 +41,15 @@ angular.module('zmApp.controllers').controller('zmApp.NewsCtrl', ['$scope', '$ro
// reset power state on exit as if it is called after we enter another
// state, that effectively overwrites current view power management needs
//------------------------------------------------------------------------
- $scope.$on('$ionicView.enter', function () {
+ $scope.$on('$ionicView.enter', function()
+ {
// console.log("**VIEW ** News Ctrl Entered");
NVRDataModel.setAwake(false);
-
});
- $scope.isUnread = function (itemdate) {
+ $scope.isUnread = function(itemdate)
+ {
var lastDate = NVRDataModel.getLatestBlogPostChecked();
//get("latestBlogPostChecked");
if (!lastDate) return true;
@@ -53,30 +59,34 @@ angular.module('zmApp.controllers').controller('zmApp.NewsCtrl', ['$scope', '$ro
//console.log (unread);
return (mItemDate.diff(mLastDate) > 0) ? true : false;
-
};
- $scope.loadPost = function (item, itemdate) {
+ $scope.loadPost = function(item, itemdate)
+ {
var lastDate =
NVRDataModel.getLatestBlogPostChecked(); //zmStorageService.get("latestBlogPostChecked");
-
- if (!lastDate) {
+ if (!lastDate)
+ {
NVRDataModel.debug("First time checking blog posts, I see");
NVRDataModel.setLatestBlogPostChecked(itemdate);
//zmStorageService.set("latestBlogPostChecked", itemdate);
- } else {
+ }
+ else
+ {
NVRDataModel.debug("last post checked is " + lastDate);
NVRDataModel.debug("current post dated is " + itemdate);
var mLastDate = moment(lastDate);
var mItemDate = moment(itemdate);
- if (mItemDate.diff(mLastDate) > 0) {
+ if (mItemDate.diff(mLastDate) > 0)
+ {
NVRDataModel.debug("Updating lastDate to this post");
NVRDataModel.setLatestBlogPostChecked(itemdate); //zmStorageService.set("latestBlogPostChecked", itemdate);
- if (itemdate == $scope.newsItems[0].date) {
+ if (itemdate == $scope.newsItems[0].date)
+ {
// we are reading the latest post
$rootScope.newBlogPost = "";
}
@@ -90,11 +100,14 @@ angular.module('zmApp.controllers').controller('zmApp.NewsCtrl', ['$scope', '$ro
$scope.newsItems = [];
$http.get(zm.blogUrl)
- .success(function (data) {
+ .success(function(data)
+ {
//console.log ("Here2");
// console.log (JSON.stringify(data));
- for (var i = 0; i < data.length; i++) {
- $scope.newsItems.push({
+ for (var i = 0; i < data.length; i++)
+ {
+ $scope.newsItems.push(
+ {
title: data[i].title,
url: data[i].url,
date: data[i].date
@@ -103,4 +116,4 @@ angular.module('zmApp.controllers').controller('zmApp.NewsCtrl', ['$scope', '$ro
});
-}]); \ No newline at end of file
+}]);
diff --git a/www/js/PortalLoginCtrl.js b/www/js/PortalLoginCtrl.js
index f99932a2..ff2f61d0 100644
--- a/www/js/PortalLoginCtrl.js
+++ b/www/js/PortalLoginCtrl.js
@@ -3,90 +3,108 @@
/*This is for the loop closure I am using in line 143 */
/* jslint browser: true*/
/* global vis,cordova,StatusBar,angular,console,moment */
-angular.module('zmApp.controllers').controller('zmApp.PortalLoginCtrl', ['$ionicPlatform', '$scope', 'zm', 'NVRDataModel', '$ionicSideMenuDelegate', '$rootScope', '$http', '$q', '$state', '$ionicLoading', '$ionicPopover', '$ionicScrollDelegate', '$ionicModal', '$timeout', 'zmAutoLogin', '$ionicHistory', '$cordovaTouchID', 'EventServer', '$translate', function($ionicPlatform, $scope, zm, NVRDataModel, $ionicSideMenuDelegate, $rootScope, $http, $q, $state, $ionicLoading, $ionicPopover, $ionicScrollDelegate, $ionicModal, $timeout, zmAutoLogin, $ionicHistory, $cordovaTouchID, EventServer, $translate) {
-
+angular.module('zmApp.controllers').controller('zmApp.PortalLoginCtrl', ['$ionicPlatform', '$scope', 'zm', 'NVRDataModel', '$ionicSideMenuDelegate', '$rootScope', '$http', '$q', '$state', '$ionicLoading', '$ionicPopover', '$ionicScrollDelegate', '$ionicModal', '$timeout', 'zmAutoLogin', '$ionicHistory', '$cordovaTouchID', 'EventServer', '$translate', function($ionicPlatform, $scope, zm, NVRDataModel, $ionicSideMenuDelegate, $rootScope, $http, $q, $state, $ionicLoading, $ionicPopover, $ionicScrollDelegate, $ionicModal, $timeout, zmAutoLogin, $ionicHistory, $cordovaTouchID, EventServer, $translate)
+{
$scope.$on('$ionicView.enter',
- function() {
+ function()
+ {
NVRDataModel.debug("Inside Portal login Enter handler");
loginData = NVRDataModel.getLogin();
- $ionicHistory.nextViewOptions({
+ $ionicHistory.nextViewOptions(
+ {
disableBack: true
});
-
$scope.pindata = {};
- if ($ionicSideMenuDelegate.isOpen()) {
+ if ($ionicSideMenuDelegate.isOpen())
+ {
$ionicSideMenuDelegate.toggleLeft();
NVRDataModel.debug("Sliding menu close");
}
-
$scope.pinPrompt = false; // if true, then PIN is displayed else skip
- if (NVRDataModel.isLoggedIn()) {
+ if (NVRDataModel.isLoggedIn())
+ {
NVRDataModel.log("User credentials are provided");
-
-
// You can login either via touch ID or typing in your code
- if ($ionicPlatform.is('ios') && loginData.usePin) {
+ if ($ionicPlatform.is('ios') && loginData.usePin)
+ {
$cordovaTouchID.checkSupport()
- .then(function() {
+ .then(function()
+ {
// success, TouchID supported
$cordovaTouchID.authenticate("")
- .then(function() {
+ .then(function()
+ {
NVRDataModel.log("Touch Success");
// Don't assign pin as it may be alphanum
unlock(true);
},
- function() {
+ function()
+ {
NVRDataModel.log("Touch Failed");
});
- }, function(error) {
+ }, function(error)
+ {
NVRDataModel.log("TouchID not supported");
});
- } else // touch was not used
+ }
+ else // touch was not used
{
NVRDataModel.log("not checking for touchID");
}
- if (loginData.usePin) {
+ if (loginData.usePin)
+ {
// this shows the pin prompt on screen
$scope.pinPrompt = true;
// dont call unlock, let the user type in code
- } else // no PIN Code so go directly to auth
+ }
+ else // no PIN Code so go directly to auth
{
unlock(true);
}
- } else // login creds are not present
+ }
+ else // login creds are not present
{
NVRDataModel.debug("PortalLogin: Not logged in, so going to login");
- if (NVRDataModel.isFirstUse()) {
+ if (NVRDataModel.isFirstUse())
+ {
NVRDataModel.debug("First use, showing warm and fuzzy...");
- $ionicHistory.nextViewOptions({
+ $ionicHistory.nextViewOptions(
+ {
disableAnimate: true,
disableBack: true
});
$state.go('first-use');
return;
- } else {
- if (!$rootScope.userCancelledAuth) {
- $ionicHistory.nextViewOptions({
+ }
+ else
+ {
+ if (!$rootScope.userCancelledAuth)
+ {
+ $ionicHistory.nextViewOptions(
+ {
disableAnimate: true,
disableBack: true
});
- $state.go("login", {
+ $state.go("login",
+ {
"wizard": false
});
return;
- } else {
+ }
+ else
+ {
// do this only once - rest for next time
$rootScope.userCancelledAuth = false;
}
@@ -99,8 +117,10 @@ angular.module('zmApp.controllers').controller('zmApp.PortalLoginCtrl', ['$ionic
// remove status is pin is empty
//-------------------------------------------------------------------------------
- $scope.pinChange = function() {
- if ($scope.pindata.pin == null) {
+ $scope.pinChange = function()
+ {
+ if ($scope.pindata.pin == null)
+ {
$scope.pindata.status = "";
}
};
@@ -108,17 +128,18 @@ angular.module('zmApp.controllers').controller('zmApp.PortalLoginCtrl', ['$ionic
//-------------------------------------------------------------------------------
// unlock app if PIN is correct
//-------------------------------------------------------------------------------
- $scope.unlock = function() {
+ $scope.unlock = function()
+ {
// call with false meaning check for pin
unlock(false);
};
-
//------------------------------------------------------------------------
// Aaron Lager hack - can't figure out why he gets a 401 after
// successful login and then it works after resaving
//------------------------------------------------------------------------
- function tryLoggingSecondTimeHack() {
+ function tryLoggingSecondTimeHack()
+ {
var d = $q.defer();
zmAutoLogin.doLogin("<button class='button button-clear' style='line-height: normal; min-height: 0; min-width: 0;color:#fff;' ng-click='$root.cancelAuth()'><i class='ion-close-circled'></i>&nbsp;" + $translate.instant('kAuthenticating') + "...</button>")
@@ -126,32 +147,39 @@ angular.module('zmApp.controllers').controller('zmApp.PortalLoginCtrl', ['$ionic
{
NVRDataModel.debug("2nd auth login worked");
NVRDataModel.getAPIversion()
- .then(function(data) {
+ .then(function(data)
+ {
NVRDataModel.getKeyConfigParams(1);
NVRDataModel.log("2nd auth:Got API version: " + data);
$rootScope.apiVersion = data;
var ld = NVRDataModel.getLogin();
- if (NVRDataModel.versionCompare(data, zm.minAppVersion) == -1 && data != "0.0.0") {
+ if (NVRDataModel.versionCompare(data, zm.minAppVersion) == -1 && data != "0.0.0")
+ {
- $state.go('lowversion', {
+ $state.go('lowversion',
+ {
"ver": data
});
return;
}
- if (NVRDataModel.versionCompare(data, zm.recommendedAppVersion) == -1 && data != "0.0.0") {
+ if (NVRDataModel.versionCompare(data, zm.recommendedAppVersion) == -1 && data != "0.0.0")
+ {
- $state.go('importantmessage', {
+ $state.go('importantmessage',
+ {
"ver": data
});
return;
}
- if (data == "0.0.0") {
+ if (data == "0.0.0")
+ {
NVRDataModel.log("2nd Auth:API getVersion succeeded but returned 0.0.0 " + JSON.stringify(data));
NVRDataModel.displayBanner('error', ['ZoneMinder authentication failed']);
- $state.go("login", {
+ $state.go("login",
+ {
"wizard": false
});
return;
@@ -159,8 +187,6 @@ angular.module('zmApp.controllers').controller('zmApp.PortalLoginCtrl', ['$ionic
// coming here means continue
EventServer.refresh();
-
-
var statetoGo = $rootScope.lastState ? $rootScope.lastState : 'montage';
//NVRDataModel.debug ("logging state transition");
NVRDataModel.debug("2nd Auth: Transitioning state to: " +
@@ -169,16 +195,17 @@ angular.module('zmApp.controllers').controller('zmApp.PortalLoginCtrl', ['$ionic
return;
},
- function(error) {
+ function(error)
+ {
NVRDataModel.debug("2nd auth API failed, going to login");
d.reject("failed 2nd auth");
return (d.promise);
});
-
},
- function(error) {
+ function(error)
+ {
NVRDataModel.debug("2nd auth hack failed, going to login");
d.reject("failed 2nd auth");
return (d.promise);
@@ -187,14 +214,16 @@ angular.module('zmApp.controllers').controller('zmApp.PortalLoginCtrl', ['$ionic
return (d.promise);
}
- function unlock(idVerified) {
+ function unlock(idVerified)
+ {
/*
idVerified == true means no pin check needed
== false means check PIN
*/
NVRDataModel.debug("unlock called with check PIN=" + idVerified);
- if (idVerified || ($scope.pindata.pin == loginData.pinCode)) {
+ if (idVerified || ($scope.pindata.pin == loginData.pinCode))
+ {
NVRDataModel.debug("PIN code entered is correct, or there is no PIN set");
$rootScope.rand = Math.floor((Math.random() * 100000) + 1);
zmAutoLogin.stop(); //safety
@@ -211,33 +240,40 @@ angular.module('zmApp.controllers').controller('zmApp.PortalLoginCtrl', ['$ionic
// $state.go("login" ,{"wizard": false});
//login was ok, so get API details
NVRDataModel.getAPIversion()
- .then(function(data) {
+ .then(function(data)
+ {
NVRDataModel.log("Got API version: " + data);
$rootScope.apiVersion = data;
var ld = NVRDataModel.getLogin();
- if (NVRDataModel.versionCompare(data, zm.minAppVersion) == -1 && data != "0.0.0") {
+ if (NVRDataModel.versionCompare(data, zm.minAppVersion) == -1 && data != "0.0.0")
+ {
- $state.go('lowversion', {
+ $state.go('lowversion',
+ {
"ver": data
});
return;
}
- if (NVRDataModel.versionCompare(data, zm.recommendedAppVersion) == -1 && data != "0.0.0") {
+ if (NVRDataModel.versionCompare(data, zm.recommendedAppVersion) == -1 && data != "0.0.0")
+ {
// console.log (">>>>>>>>>>>>> HERE AND VERSION SAYS " +NVRDataModel.versionCompare(data, zm.recommendedAppVersion));
//console.log ("GOING TO IMPORTANT");
- $state.go('importantmessage', {
+ $state.go('importantmessage',
+ {
"ver": data
});
return;
}
- if (data == "0.0.0") {
+ if (data == "0.0.0")
+ {
NVRDataModel.log("API getVersion succeeded but returned 0.0.0 " + JSON.stringify(data));
NVRDataModel.displayBanner('error', ['ZoneMinder authentication failed']);
- $state.go("login", {
+ $state.go("login",
+ {
"wizard": false
});
return;
@@ -247,31 +283,33 @@ angular.module('zmApp.controllers').controller('zmApp.PortalLoginCtrl', ['$ionic
// console.log (">>>>>>>>>>>>>>>>>>>>>>>>>NEVER");
EventServer.refresh();
-
-
var statetoGo = $rootScope.lastState ? $rootScope.lastState : 'montage';
NVRDataModel.debug("logging state transition");
NVRDataModel.debug("Transitioning state to: " +
statetoGo + " with param " + JSON.stringify($rootScope.lastStateParam));
-
$state.go(statetoGo, $rootScope.lastStateParam);
return;
},
- function(error) { // API Error
+ function(error)
+ { // API Error
NVRDataModel.log("API Error handler: going to login getAPI returned error: " + JSON.stringify(error));
//NVRDataModel.displayBanner('error', ['ZoneMinder authentication failed']);
NVRDataModel.debug("Doing the Aaron Hack after 1 sec....");
- $timeout(function() {
+ $timeout(function()
+ {
tryLoggingSecondTimeHack()
- .then(function success(s) {
+ .then(function success(s)
+ {
NVRDataModel.log("2nd time login hack worked!, nothing to do");
NVRDataModel.getTimeZone();
},
- function error(e) {
- $state.go("login", {
+ function error(e)
+ {
+ $state.go("login",
+ {
"wizard": false
});
});
@@ -281,71 +319,89 @@ angular.module('zmApp.controllers').controller('zmApp.PortalLoginCtrl', ['$ionic
});
-
- if ($rootScope.tappedNotification) {
-
+ if ($rootScope.tappedNotification)
+ {
var ld = NVRDataModel.getLogin();
NVRDataModel.log("Came via push tap. onTapScreen=" + ld.onTapScreen);
//console.log ("***** NOTIFICATION TAPPED ");
$rootScope.tappedNotification = 0;
- $ionicHistory.nextViewOptions({
+ $ionicHistory.nextViewOptions(
+ {
disableBack: true
});
- if (ld.onTapScreen == $translate.instant('kTapMontage')) {
+ if (ld.onTapScreen == $translate.instant('kTapMontage'))
+ {
NVRDataModel.debug("Going to montage");
- $state.go("montage", {}, {
+ $state.go("montage",
+ {},
+ {
reload: true
});
return;
- } else if (ld.onTapScreen == $translate.instant('kTapEvents')) {
+ }
+ else if (ld.onTapScreen == $translate.instant('kTapEvents'))
+ {
NVRDataModel.debug("Going to events");
- $state.go("events", {
+ $state.go("events",
+ {
"id": 0,
"playEvent": false
- }, {
+ },
+ {
reload: true
});
return;
- } else // we go to live
+ }
+ else // we go to live
{
NVRDataModel.debug("Going to live view ");
- $state.go("monitors", {}, {
+ $state.go("monitors",
+ {},
+ {
reload: true
});
return;
}
}
-
},
// coming here means auth error
// so go back to login
- function(error) {
+ function(error)
+ {
NVRDataModel.debug("PortalLogin: error authenticating " +
JSON.stringify(error));
- if (!$rootScope.userCancelledAuth) {
+ if (!$rootScope.userCancelledAuth)
+ {
NVRDataModel.displayBanner('error', ['ZoneMinder authentication failed', 'Please check API settings']);
- $ionicHistory.nextViewOptions({
+ $ionicHistory.nextViewOptions(
+ {
disableAnimate: true,
disableBack: true
});
- $state.go("login", {
+ $state.go("login",
+ {
"wizard": false
});
return;
- } else {
+ }
+ else
+ {
// if user cancelled auth I guess we go to login
$rootScope.userCancelledAuth = false;
- $state.go("login", {
+ $state.go("login",
+ {
"wizard": false
});
return;
}
});
- } else {
+ }
+ else
+ {
$scope.pindata.status = "Invalid PIN";
// wobble the input box on error
@@ -353,7 +409,8 @@ angular.module('zmApp.controllers').controller('zmApp.PortalLoginCtrl', ['$ionic
element.addClass("animated shake")
.one('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend',
- function() {
+ function()
+ {
element.removeClass("animated shake");
});
}
@@ -367,6 +424,4 @@ angular.module('zmApp.controllers').controller('zmApp.PortalLoginCtrl', ['$ionic
var loginData;
$ionicSideMenuDelegate.canDragContent(true);
-
-
-}]); \ No newline at end of file
+}]);
diff --git a/www/js/StateCtrl.js b/www/js/StateCtrl.js
index 58f13c4b..54a2c4c9 100644
--- a/www/js/StateCtrl.js
+++ b/www/js/StateCtrl.js
@@ -4,8 +4,9 @@
// controller for State View
-angular.module('zmApp.controllers').controller('zmApp.StateCtrl', ['$ionicPopup', '$scope', 'zm', 'NVRDataModel', '$ionicSideMenuDelegate', '$ionicLoading', '$ionicModal', '$state', '$http', '$rootScope', '$timeout', '$ionicHistory', '$translate', function (
- $ionicPopup, $scope, zm, NVRDataModel, $ionicSideMenuDelegate, $ionicLoading, $ionicModal, $state, $http, $rootScope, $timeout, $ionicHistory, $translate) {
+angular.module('zmApp.controllers').controller('zmApp.StateCtrl', ['$ionicPopup', '$scope', 'zm', 'NVRDataModel', '$ionicSideMenuDelegate', '$ionicLoading', '$ionicModal', '$state', '$http', '$rootScope', '$timeout', '$ionicHistory', '$translate', function(
+ $ionicPopup, $scope, zm, NVRDataModel, $ionicSideMenuDelegate, $ionicLoading, $ionicModal, $state, $http, $rootScope, $timeout, $ionicHistory, $translate)
+{
//----------------------------------------------------------------------
// Controller main
@@ -22,8 +23,6 @@ angular.module('zmApp.controllers').controller('zmApp.StateCtrl', ['$ionicPopup'
$rootScope.zmPopup = "";
-
-
var loginData = NVRDataModel.getLogin();
var apiRun = loginData.apiurl + "/host/daemonCheck.json";
@@ -39,12 +38,14 @@ angular.module('zmApp.controllers').controller('zmApp.StateCtrl', ['$ionicPopup'
// Let's stagger this by 500ms each to see if Chrome lets these through
// This may also help if your Apache is not configured to let multiple connections through
- $timeout(function () {
+ $timeout(function()
+ {
NVRDataModel.debug("invoking LoadStatus...");
getLoadStatus();
}, 2000);
- $timeout(function () {
+ $timeout(function()
+ {
NVRDataModel.debug("invoking CurrentState...");
getCurrentState();
}, 4000);
@@ -62,7 +63,8 @@ angular.module('zmApp.controllers').controller('zmApp.StateCtrl', ['$ionicPopup'
// reset power state on exit as if it is called after we enter another
// state, that effectively overwrites current view power management needs
//------------------------------------------------------------------------
- $scope.$on('$ionicView.enter', function () {
+ $scope.$on('$ionicView.enter', function()
+ {
// console.log("**VIEW ** Montage Ctrl Entered");
NVRDataModel.setAwake(false);
});
@@ -71,19 +73,23 @@ angular.module('zmApp.controllers').controller('zmApp.StateCtrl', ['$ionicPopup'
// This gets the current run state custom name
// if applicable
//---------------------------------------------------------
- function getCurrentState() {
+ function getCurrentState()
+ {
NVRDataModel.debug("StateCtrl: getting state using " + apiCurrentState);
$http.get(apiCurrentState)
.then(
- function (success) {
+ function(success)
+ {
NVRDataModel.debug("State results: " + JSON.stringify(success));
var customStateArray = success.data.states;
var i = 0;
var found = false;
$scope.allStateNames = [];
- for (i = 0; i < customStateArray.length; i++) {
+ for (i = 0; i < customStateArray.length; i++)
+ {
$scope.allStateNames.push(customStateArray[i].State.Name);
- if (customStateArray[i].State.IsActive == '1') {
+ if (customStateArray[i].State.IsActive == '1')
+ {
$scope.customState = customStateArray[i].State.Name;
found = true;
}
@@ -91,7 +97,8 @@ angular.module('zmApp.controllers').controller('zmApp.StateCtrl', ['$ionicPopup'
if (!found) $scope.customState = "";
},
- function (error) {
+ function(error)
+ {
NVRDataModel.debug("StateCtrl: Error retrieving state list " + JSON.stringify(error));
$scope.customState = "";
@@ -100,21 +107,25 @@ angular.module('zmApp.controllers').controller('zmApp.StateCtrl', ['$ionicPopup'
}
-
//----------------------------------------------------------------
// Alarm notification handling
//----------------------------------------------------------------
- $scope.handleAlarms = function () {
+ $scope.handleAlarms = function()
+ {
$rootScope.isAlarm = !$rootScope.isAlarm;
- if (!$rootScope.isAlarm) {
+ if (!$rootScope.isAlarm)
+ {
$rootScope.alarmCount = "0";
- $ionicHistory.nextViewOptions({
+ $ionicHistory.nextViewOptions(
+ {
disableBack: true
});
- $state.go("events", {
+ $state.go("events",
+ {
"id": 0,
- "playEvent":false
- }, {
+ "playEvent": false
+ },
+ {
reload: true
});
}
@@ -123,69 +134,78 @@ angular.module('zmApp.controllers').controller('zmApp.StateCtrl', ['$ionicPopup'
//---------------------------------------------------------
// Allows the user to select a custom run state
//---------------------------------------------------------
- $scope.selectCustomState = function () {
+ $scope.selectCustomState = function()
+ {
$scope.myopt = {
selectedState: ""
};
//console.log(JSON.stringify($scope.allStateNames));
NVRDataModel.log("List of custom states: " + JSON.stringify($scope.allStateNames));
- $rootScope.zmPopup = $ionicPopup.show({
+ $rootScope.zmPopup = $ionicPopup.show(
+ {
scope: $scope,
template: '<ion-radio-fix ng-repeat="item in allStateNames" ng-value="item" ng-model="myopt.selectedState"> {{item}} </ion-radio-fix>',
-
title: $translate.instant('kSelectRunState'),
subTitle: $translate.instant('kCurrentState') + $scope.customState ? ($translate.instant('kCurrentState') + ": " + $scope.customState) : "",
buttons: [
+ {
+ text: $translate.instant('kButtonCancel'),
+ onTap: function(e)
{
- text: $translate.instant('kButtonCancel'),
- onTap: function (e) {
- return "CANCEL";
- }
+ return "CANCEL";
+ }
- },
+ },
+ {
+ text: $translate.instant('kButtonOk'),
+ onTap: function(e)
{
- text: $translate.instant('kButtonOk'),
- onTap: function (e) {
- return "OK";
+ return "OK";
- }
- }
- ]
+ }
+ }]
});
// It seems invoking a popup within a popup handler
// causes issues. Doing this outside due to that reason
- $rootScope.zmPopup.then(function (res) {
+ $rootScope.zmPopup.then(function(res)
+ {
// console.log("GOT : " + JSON.stringify(res));
- if (res == "OK") {
+ if (res == "OK")
+ {
if ($scope.myopt.selectedState != "")
controlZM($scope.myopt.selectedState);
}
});
};
-
//----------------------------------------------------------------------
// returns disk space in gigs taken up by events
//----------------------------------------------------------------------
- function getDiskStatus() {
+ function getDiskStatus()
+ {
NVRDataModel.debug("StateCtrl/getDiskStatus: " + apiDisk);
$http.get(apiDisk)
.then(
- function (success) {
+ function(success)
+ {
NVRDataModel.debug("StateCtrl/getDiskStatus: success");
NVRDataModel.debug("Disk results: " + JSON.stringify(success));
var obj = success.data.usage;
- if (obj.Total.space != undefined) {
+ if (obj.Total.space != undefined)
+ {
$scope.zmDisk = parseFloat(obj.Total.space).toFixed(1).toString() + "G";
- } else {
+ }
+ else
+ {
$scope.zmDisk = "unknown";
NVRDataModel.log("Error retrieving disk space, API returned null for obj.Total.space");
}
},
- function (error) {
+ function(error)
+ {
$scope.zmDisk = "unknown";
// console.log("ERROR:" + JSON.stringify(error));
NVRDataModel.log("Error retrieving DiskStatus: " + JSON.stringify(error), "error");
@@ -196,14 +216,17 @@ angular.module('zmApp.controllers').controller('zmApp.StateCtrl', ['$ionicPopup'
//----------------------------------------------------------------------
// returns ZM running status
//----------------------------------------------------------------------
- function getRunStatus() {
+ function getRunStatus()
+ {
NVRDataModel.debug("StateCtrl/getRunStatus: " + apiRun);
$http.get(apiRun)
.then(
- function (success) {
+ function(success)
+ {
NVRDataModel.debug("StateCtrl/getRunStatus: success");
NVRDataModel.debug("Run results: " + JSON.stringify(success));
- switch (success.data.result) {
+ switch (success.data.result)
+ {
case 1:
$scope.zmRun = $translate.instant('kZMRunning');
$scope.color = 'color:green;';
@@ -219,10 +242,10 @@ angular.module('zmApp.controllers').controller('zmApp.StateCtrl', ['$ionicPopup'
break;
}
-
// console.log("X"+success.data.result+"X");
},
- function (error) {
+ function(error)
+ {
//console.log("ERROR in getRun: " + JSON.stringify(error));
NVRDataModel.log("Error getting RunStatus " + JSON.stringify(error), "error");
$scope.color = 'color:red;';
@@ -232,25 +255,26 @@ angular.module('zmApp.controllers').controller('zmApp.StateCtrl', ['$ionicPopup'
}
-
//----------------------------------------------------------------------
// gets ZM load - max[0], avg[1], min[2]
//----------------------------------------------------------------------
- function getLoadStatus() {
+ function getLoadStatus()
+ {
NVRDataModel.debug("StateCtrl/getLoadStatus: " + apiLoad);
$http.get(apiLoad)
.then(
- function (success) {
+ function(success)
+ {
NVRDataModel.debug("Load results: " + JSON.stringify(success));
//console.log(JSON.stringify(success));
// load returns 3 params - one in the middle is avg.
NVRDataModel.debug("StateCtrl/getLoadStatus: success");
$scope.zmLoad = success.data.load[1];
-
// console.log("X"+success.data.result+"X");
},
- function (error) {
+ function(error)
+ {
//console.log("ERROR in getLoad: " + JSON.stringify(error));
NVRDataModel.log("Error retrieving loadStatus " + JSON.stringify(error), "error");
$scope.zmLoad = 'undetermined';
@@ -258,17 +282,15 @@ angular.module('zmApp.controllers').controller('zmApp.StateCtrl', ['$ionicPopup'
);
}
-
//----------------------------------------------------------------------
// start/stop/restart ZM
//----------------------------------------------------------------------
- function performZMoperation(str) {
-
+ function performZMoperation(str)
+ {
NVRDataModel.debug("inside performZMoperation with " + str);
-
$scope.zmRun = "...";
$scope.color = 'color:orange;';
$scope.customState = "";
@@ -276,10 +298,12 @@ angular.module('zmApp.controllers').controller('zmApp.StateCtrl', ['$ionicPopup'
inProgress = 1;
$http.post(apiExec + str + ".json")
.then(
- function (success) {
+ function(success)
+ {
NVRDataModel.debug("StateCtrl/controlZM: returned success");
inProgress = 0;
- switch (str) {
+ switch (str)
+ {
case "stop":
$scope.zmRun = $translate.instant('kZMStopped');
$scope.color = 'color:red;';
@@ -293,7 +317,8 @@ angular.module('zmApp.controllers').controller('zmApp.StateCtrl', ['$ionicPopup'
}
},
- function (error) {
+ function(error)
+ {
//if (error.status) // it seems to return error with status 0 if ok
// {
//console.log("ERROR in Change State:" + JSON.stringify(error));
@@ -306,11 +331,13 @@ angular.module('zmApp.controllers').controller('zmApp.StateCtrl', ['$ionicPopup'
});
}
-
- function controlZM(str) {
- if (inProgress) {
+ function controlZM(str)
+ {
+ if (inProgress)
+ {
NVRDataModel.debug("StateCtrl/controlZM: operation in progress");
- $ionicPopup.alert({
+ $ionicPopup.alert(
+ {
title: $translate.instant('kOperationInProgressTitle'),
template: $translate.instant('kOperationInProgressBody') + '...'
});
@@ -320,43 +347,45 @@ angular.module('zmApp.controllers').controller('zmApp.StateCtrl', ['$ionicPopup'
var statesearch = "startstoprestart";
var promptstring = $translate.instant('kStateAreYouSure') + str + ' Zoneminder?';
- if (statesearch.indexOf(str) == -1) {
+ if (statesearch.indexOf(str) == -1)
+ {
promptstring = "Are you sure you want to change state to " + str;
}
-
- $rootScope.zmPopup = $ionicPopup.show({
+ $rootScope.zmPopup = $ionicPopup.show(
+ {
title: 'Please Confirm',
template: promptstring,
buttons: [
+ {
+ text: 'Cancel',
+ type: 'button-positive'
+ },
+ {
+ text: 'Yes',
+ type: 'button-assertive',
+ onTap: function(e)
{
- text: 'Cancel',
- type: 'button-positive'
- },
- {
- text: 'Yes',
- type: 'button-assertive',
- onTap: function (e) {
- performZMoperation(str);
- }
+ performZMoperation(str);
}
- ]
+ }]
});
-
}
// Binder so template can call controlZM
- $scope.controlZM = function (str) {
+ $scope.controlZM = function(str)
+ {
controlZM(str);
};
-
- $scope.openMenu = function () {
+ $scope.openMenu = function()
+ {
$ionicSideMenuDelegate.toggleLeft();
};
- $scope.$on('$ionicView.leave', function () {
+ $scope.$on('$ionicView.leave', function()
+ {
console.log("**VIEW ** State Ctrl Left");
// FIXME not the best way...
// If the user exits a view before its complete,
@@ -364,8 +393,8 @@ angular.module('zmApp.controllers').controller('zmApp.StateCtrl', ['$ionicPopup'
inProgress = 0;
});
-
- $scope.doRefresh = function () {
+ $scope.doRefresh = function()
+ {
console.log("***Pull to Refresh");
NVRDataModel.debug("StateCtrl/refresh: calling getRun/Load/Disk/CurrentState");
getRunStatus();
@@ -376,4 +405,4 @@ angular.module('zmApp.controllers').controller('zmApp.StateCtrl', ['$ionicPopup'
};
-}]); \ No newline at end of file
+}]);
diff --git a/www/js/TimelineCtrl.js b/www/js/TimelineCtrl.js
index 0f67b085..101e7166 100644
--- a/www/js/TimelineCtrl.js
+++ b/www/js/TimelineCtrl.js
@@ -9,40 +9,48 @@
// I've disabled pan and zoom and used buttons instead
// also limits # of items to maxItems
-
// FIXME: too much redundant code between EventCtrl and Timeline
// Move to ModalCtrl and see if it works
-angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPlatform', '$scope', 'zm', 'NVRDataModel', '$ionicSideMenuDelegate', '$rootScope', '$http', '$q', 'message', '$state', '$ionicLoading', '$ionicPopover', '$ionicScrollDelegate', '$ionicModal', '$timeout', '$ionicContentBanner', '$ionicHistory', '$sce', '$stateParams', '$translate', '$ionicPopup', '$interval', function($ionicPlatform, $scope, zm, NVRDataModel, $ionicSideMenuDelegate, $rootScope, $http, $q, message, $state, $ionicLoading, $ionicPopover, $ionicScrollDelegate, $ionicModal, $timeout, $ionicContentBanner, $ionicHistory, $sce, $stateParams, $translate, $ionicPopup, $interval) {
+angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPlatform', '$scope', 'zm', 'NVRDataModel', '$ionicSideMenuDelegate', '$rootScope', '$http', '$q', 'message', '$state', '$ionicLoading', '$ionicPopover', '$ionicScrollDelegate', '$ionicModal', '$timeout', '$ionicContentBanner', '$ionicHistory', '$sce', '$stateParams', '$translate', '$ionicPopup', '$interval', function($ionicPlatform, $scope, zm, NVRDataModel, $ionicSideMenuDelegate, $rootScope, $http, $q, message, $state, $ionicLoading, $ionicPopover, $ionicScrollDelegate, $ionicModal, $timeout, $ionicContentBanner, $ionicHistory, $sce, $stateParams, $translate, $ionicPopup, $interval)
+{
//console.log("Inside Timeline controller");
- $scope.openMenu = function() {
+ $scope.openMenu = function()
+ {
$ionicSideMenuDelegate.toggleLeft();
};
//---------------------------------------f-------------------------
// Alarm notification handling
//----------------------------------------------------------------
- $scope.handleAlarms = function() {
+ $scope.handleAlarms = function()
+ {
$rootScope.isAlarm = !$rootScope.isAlarm;
- if (!$rootScope.isAlarm) {
+ if (!$rootScope.isAlarm)
+ {
$rootScope.alarmCount = "0";
- $ionicHistory.nextViewOptions({
+ $ionicHistory.nextViewOptions(
+ {
disableBack: true
});
- $state.go("events", {
+ $state.go("events",
+ {
"id": 0,
"playEvent": false
- }, {
+ },
+ {
reload: true
});
return;
}
};
- $scope.leftButtons = [{
+ $scope.leftButtons = [
+ {
type: 'button-icon icon ion-navicon',
- tap: function(e) {
+ tap: function(e)
+ {
$scope.toggleMenu();
}
}];
@@ -50,7 +58,8 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
//-----------------------------------------------------------
// Used to display date range for timeline
//-----------------------------------------------------------
- $scope.prettify = function(str) {
+ $scope.prettify = function(str)
+ {
if (NVRDataModel.getLogin().useLocalTimeZone)
return moment.tz(str, NVRDataModel.getTimeZoneNow()).tz(moment.tz.guess()).format('MMMM Do YYYY, ' + NVRDataModel.getTimeFormat());
else
@@ -60,7 +69,8 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
//-----------------------------------------------------------
// used for playback when you tap on a timeline event
//-----------------------------------------------------------
- $scope.calcMsTimer = function(frames, len) {
+ $scope.calcMsTimer = function(frames, len)
+ {
var myframes, mylen;
myframes = parseFloat(frames);
mylen = parseFloat(len);
@@ -69,8 +79,8 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
return (Math.round(1000 / (myframes / mylen)));
};
-
- $scope.toggleMinAlarmFrameCount = function() {
+ $scope.toggleMinAlarmFrameCount = function()
+ {
// console.log("Toggling");
var ld = NVRDataModel.getLogin();
@@ -78,7 +88,6 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
NVRDataModel.setLogin(ld);
-
drawGraph(curFromDate, curToDate, curCount);
};
@@ -86,11 +95,13 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
//-----------------------------------------------------------
// Move/Zoom are used to move the timeline around
//-----------------------------------------------------------
- function move(percentage) {
+ function move(percentage)
+ {
var range = timeline.getWindow();
var interval = range.end - range.start;
- timeline.setWindow({
+ timeline.setWindow(
+ {
start: range.start.valueOf() - interval * percentage,
end: range.end.valueOf() - interval * percentage
});
@@ -101,19 +112,19 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
$scope.gotoNow = function()
{
timeline.moveTo(timeline.getCurrentTime());
- };
+ };
- $scope.move = function(percentage) {
+ $scope.move = function(percentage)
+ {
move(percentage);
};
-
-
//-----------------------------------------
// Move by X days
//-----------------------------------------
- $scope.moveDays = function(d) {
+ $scope.moveDays = function(d)
+ {
var range = timeline.getWindow();
var ds = moment(range.start);
if (d > 0)
@@ -127,7 +138,6 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
fromDate = ds.format("YYYY-MM-DD HH:mm:ss");
toDate = es.format("YYYY-MM-DD HH:mm:ss");
-
$scope.fromDate = fromDate;
$scope.toDate = toDate;
$rootScope.customTimelineRange = false;
@@ -136,35 +146,34 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
};
-
- function eventDetails(ev) {
+ function eventDetails(ev)
+ {
$scope.event = ev;
- $ionicModal.fromTemplateUrl('templates/timeline-modal.html', {
+ $ionicModal.fromTemplateUrl('templates/timeline-modal.html',
+ {
scope: $scope, // give ModalCtrl access to this scope
animation: 'slide-in-up',
id: 'analyze',
})
- .then(function(modal) {
+ .then(function(modal)
+ {
$scope.modal = modal;
-
-
-
$scope.modal.show();
});
}
-
-
//--------------------------------------------------------
// To show a modal dialog with the event tapped on in timeline
// FIXME : code repeat from Events
//--------------------------------------------------------
- function openModal(event) {
+ function openModal(event)
+ {
- if ($scope.modalFromTimelineIsOpen == true) {
+ if ($scope.modalFromTimelineIsOpen == true)
+ {
// don't know why but some conflict from angular to timeline lib
// results in double modals at times
NVRDataModel.log(">>-- duplicate modal detected, preventing");
@@ -182,15 +191,18 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
//prepareModalEvent(event.Event.Id);
- $ionicModal.fromTemplateUrl('templates/events-modal.html', {
+ $ionicModal.fromTemplateUrl('templates/events-modal.html',
+ {
scope: $scope, // give ModalCtrl access to this scope
animation: 'slide-in-up',
id: 'footage'
})
- .then(function(modal) {
+ .then(function(modal)
+ {
$scope.modal = modal;
- $ionicLoading.show({
+ $ionicLoading.show(
+ {
template: $translate.instant('kPleaseWait') + "...",
noBackdrop: true,
duration: 10000,
@@ -201,8 +213,6 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
var ld = NVRDataModel.getLogin();
-
-
});
}
@@ -211,14 +221,16 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
//We need to destroy because we are instantiating
// it on open
//--------------------------------------------------------
- $scope.closeModal = function() {
+ $scope.closeModal = function()
+ {
$scope.modalFromTimelineIsOpen = false;
// $interval.cancel(eventsInterval);
//$interval.cancel(segmentHandle);
NVRDataModel.debug("TimelineCtrl:Close & Destroy Modal");
NVRDataModel.stopNetwork("TimelineCtrl: closeModal");
NVRDataModel.setAwake(false);
- if ($scope.modal !== undefined) {
+ if ($scope.modal !== undefined)
+ {
$scope.modal.remove();
}
@@ -232,11 +244,11 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
};*/
-
//-------------------------------------------------------------------------
// called when user switches to background
//-------------------------------------------------------------------------
- function onPause() {
+ function onPause()
+ {
NVRDataModel.debug("TimelineCtrl:onpause called");
$interval.cancel(updateInterval);
// console.log("*** Moving to Background ***"); // Handle the pause event
@@ -245,37 +257,39 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
}
-
//--------------------------------------------------------
// This function is called by the graph ontapped function
// which in turn calls openModal
//--------------------------------------------------------
- function showEvent(event) {
+ function showEvent(event)
+ {
// in context of angular
- $timeout(function() {
+ $timeout(function()
+ {
openModal(event);
});
}
- $rootScope.$on('tz-updated', function() {
+ $rootScope.$on('tz-updated', function()
+ {
$scope.tzAbbr = NVRDataModel.getTimeZoneNow();
NVRDataModel.debug("Timezone API updated timezone to " + NVRDataModel.getTimeZoneNow());
});
-
-
//-------------------------------------------------
// Make sure we delete the timeline
// This may be redundant as the root view gets
// destroyed but no harm
//-------------------------------------------------
- $scope.$on('$ionicView.leave', function() {
+ $scope.$on('$ionicView.leave', function()
+ {
- if (timeline) {
+ if (timeline)
+ {
$interval.cancel(updateInterval);
timeline.destroy();
console.log("**Destroying Timeline");
@@ -283,7 +297,6 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
}
});
-
/*$scope.$on('$ionicView.enter', function() {
@@ -291,7 +304,8 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
});*/
- $scope.$on('$ionicView.beforeEnter', function() {
+ $scope.$on('$ionicView.beforeEnter', function()
+ {
//$ionicHistory.clearCache();
//$ionicHistory.clearHistory();
@@ -310,16 +324,19 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
// graph range
//-------------------------------------------------
- $scope.$on('$ionicView.afterEnter', function() {
+ $scope.$on('$ionicView.afterEnter', function()
+ {
- $scope.monitors = message;
+ $scope.monitors = message;
//console.log("***AFTER ENTER");
- $scope.follow = { 'time': NVRDataModel.getLogin().followTimeLine };
+ $scope.follow = {
+ 'time': NVRDataModel.getLogin().followTimeLine
+ };
$interval.cancel(updateInterval);
- // Make sure sliding for menu is disabled so it
+ // Make sure sliding for menu is disabled so it
// does not interfere with graph panning
$ionicSideMenuDelegate.canDragContent(false);
var ld = NVRDataModel.getLogin();
@@ -338,11 +355,13 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
$scope.modalFromTimelineIsOpen = false;
//var tempMon = message;
-
// lets timeline.onget the abbreviated version of TZ to display
- if (NVRDataModel.getLogin().useLocalTimeZone) {
+ if (NVRDataModel.getLogin().useLocalTimeZone)
+ {
$scope.tzAbbr = moment().tz(moment.tz.guess()).zoneAbbr();
- } else {
+ }
+ else
+ {
$scope.tzAbbr = moment().tz(NVRDataModel.getTimeZoneNow()).zoneAbbr();
}
@@ -355,80 +374,91 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
$scope.monitors = iMon[0];
} else*/
-
-
-
//console.log ("MONITORS:"+JSON.stringify($scope.monitors));
- if ($rootScope.customTimelineRange) {
+ if ($rootScope.customTimelineRange)
+ {
$scope.currentMode = 'custom';
- //console.log("***** CUSTOM RANGE");
+ //console.log("***** CUSTOM RANGE");
if (moment($rootScope.fromString).isValid() &&
- moment($rootScope.toString).isValid()) {
+ moment($rootScope.toString).isValid())
+ {
// console.log("FROM & TO IS CUSTOM");
fromDate = $rootScope.fromString;
toDate = $rootScope.toString;
$scope.fromDate = fromDate;
$scope.toDate = toDate;
drawGraph(fromDate, toDate, maxItems);
- } else {
- console.log ("From:"+$rootScope.fromString + " To:"+$rootScope.toString);
+ }
+ else
+ {
+ console.log("From:" + $rootScope.fromString + " To:" + $rootScope.toString);
//console.log("FROM & TO IS CUSTOM INVALID");
if (NVRDataModel.getLogin().useLocalTimeZone)
{
fromDate = moment().startOf('day').format("YYYY-MM-DD HH:mm:ss");
- toDate = moment().endOf('day').format("YYYY-MM-DD HH:mm:ss");
+ toDate = moment().endOf('day').format("YYYY-MM-DD HH:mm:ss");
}
else
{
fromDate = moment().tz(NVRDataModel.getTimeZoneNow()).startOf('day').format("YYYY-MM-DD HH:mm:ss");
- toDate = moment().tz(NVRDataModel.getTimeZoneNow()).endOf('day').format("YYYY-MM-DD HH:mm:ss");
+ toDate = moment().tz(NVRDataModel.getTimeZoneNow()).endOf('day').format("YYYY-MM-DD HH:mm:ss");
}
-
+
drawGraph(fromDate, toDate, maxItems);
}
- } else {
+ }
+ else
+ {
$scope.currentMode = 'day';
if (NVRDataModel.getLogin().useLocalTimeZone)
- {
- fromDate = moment().startOf('day').format("YYYY-MM-DD HH:mm:ss");
- toDate = moment().endOf('day').format("YYYY-MM-DD HH:mm:ss");
- }
- else
- {
- fromDate = moment().tz(NVRDataModel.getTimeZoneNow()).startOf('day').format("YYYY-MM-DD HH:mm:ss");
- toDate = moment().tz(NVRDataModel.getTimeZoneNow()).endOf('day').format("YYYY-MM-DD HH:mm:ss");
- }
+ {
+ fromDate = moment().startOf('day').format("YYYY-MM-DD HH:mm:ss");
+ toDate = moment().endOf('day').format("YYYY-MM-DD HH:mm:ss");
+ }
+ else
+ {
+ fromDate = moment().tz(NVRDataModel.getTimeZoneNow()).startOf('day').format("YYYY-MM-DD HH:mm:ss");
+ toDate = moment().tz(NVRDataModel.getTimeZoneNow()).endOf('day').format("YYYY-MM-DD HH:mm:ss");
+ }
drawGraph(fromDate, toDate, maxItems);
}
- $ionicPopover.fromTemplateUrl('templates/timeline-popover.html', {
+ $ionicPopover.fromTemplateUrl('templates/timeline-popover.html',
+ {
scope: $scope,
- }).then(function(popover) {
+ }).then(function(popover)
+ {
$scope.popover = popover;
});
-
// --------------------------------------------------------
// Handling of back button in case modal is open should
// close the modal
// --------------------------------------------------------
- $ionicPlatform.registerBackButtonAction(function(e) {
+ $ionicPlatform.registerBackButtonAction(function(e)
+ {
e.preventDefault();
- if ($scope.modal != undefined && $scope.modal.isShown()) {
+ if ($scope.modal != undefined && $scope.modal.isShown())
+ {
// switch off awake, as liveview is finished
NVRDataModel.debug("Modal is open, closing it");
NVRDataModel.setAwake(false);
$scope.modal.remove();
- } else {
+ }
+ else
+ {
NVRDataModel.debug("Modal is closed, so toggling or exiting");
- if (!$ionicSideMenuDelegate.isOpenLeft()) {
+ if (!$ionicSideMenuDelegate.isOpenLeft())
+ {
$ionicSideMenuDelegate.toggleLeft();
- } else {
+ }
+ else
+ {
navigator.app.exitApp();
}
@@ -436,14 +466,12 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
}, 1000);
-
});
//-------------------------------------------------
// Controller main
//-------------------------------------------------
-
var graphIndex;
var updateInterval;
var lastTimeForEvent;
@@ -460,40 +488,28 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
var curFromDate, curToDate, curCount;
-
document.addEventListener("pause", onPause, false);
// FIXME: Timeline awake to avoid graph redrawing
NVRDataModel.setAwake(NVRDataModel.getKeepAwake());
-
-
-
-
-
// fromDate and toDate will be used to plot the range for the graph
// We start in day mode
//
var fromDate, toDate;
-
- fromDate = moment().tz(NVRDataModel.getLogin().useLocalTimeZone?NVRDataModel.getLocalTimeZoneNow():NVRDataModel.getTimeZoneNow()).startOf('day').format("YYYY-MM-DD HH:mm:ss");
- toDate = moment().tz(NVRDataModel.getLogin().useLocalTimeZone?NVRDataModel.getLocalTimeZoneNow():NVRDataModel.getTimeZoneNow()).endOf('day').format("YYYY-MM-DD HH:mm:ss");
-
-
+ fromDate = moment().tz(NVRDataModel.getLogin().useLocalTimeZone ? NVRDataModel.getLocalTimeZoneNow() : NVRDataModel.getTimeZoneNow()).startOf('day').format("YYYY-MM-DD HH:mm:ss");
+ toDate = moment().tz(NVRDataModel.getLogin().useLocalTimeZone ? NVRDataModel.getLocalTimeZoneNow() : NVRDataModel.getTimeZoneNow()).endOf('day').format("YYYY-MM-DD HH:mm:ss");
$scope.fromDate = fromDate;
$scope.toDate = toDate;
-
// maxItems will be ignored during timeline draw if its desktop
var maxItemsConf;
var ld = NVRDataModel.getLogin();
var maxItems;
-
-
//flat colors for graph - https://flatuicolors.com http://www.flatuicolorpicker.com
var colors = ['#3498db', '#E57373', '#EB974E', '#95A5A6', '#e74c3c', '#03C9A9', ];
@@ -501,8 +517,6 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
container = angular.element(document.getElementById('visualization'));
var timeline;
-
-
//console.log ("RETURNING MONITORS " + JSON.stringify($scope.monitors));
//$scope.monitors = message;
@@ -511,8 +525,6 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
$scope.navControls = false;
var navControls = false;
-
-
//drawGraph(fromDate, toDate, maxItems);
//dummyDrawGraph(fromDate, toDate,maxItems);
@@ -520,42 +532,53 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
// Rest graph to sane state after you went
// wild zooming and panning :-)
//-------------------------------------------------
- $scope.fit = function() {
+ $scope.fit = function()
+ {
timeline.fit();
};
- $scope.toggleNav = function() {
- if (navControls == true) {
+ $scope.toggleNav = function()
+ {
+ if (navControls == true)
+ {
navControls = !navControls;
// $scope.navControls = navControls;
// give out animation time
- $timeout(function() {
+ $timeout(function()
+ {
$scope.navControls = navControls;
}, 2000);
- } else {
+ }
+ else
+ {
navControls = !navControls;
$scope.navControls = navControls;
}
var element = angular.element(document.getElementById("timeline-ctrl"));
- if (navControls) {
+ if (navControls)
+ {
element.removeClass("animated bounceOutLeft");
element.addClass("animated bounceInRight");
- } else {
+ }
+ else
+ {
element.removeClass("animated bounceInRight");
element.addClass("animated bounceOutLeft");
}
};
- function shortenTime(str) {
+ function shortenTime(str)
+ {
if (NVRDataModel.getLogin().useLocalTimeZone)
return moment.tz(str, NVRDataModel.getTimeZoneNow()).tz(moment.tz.guess()).format(NVRDataModel.getTimeFormat());
else
return moment(str).format(NVRDataModel.getTimeFormat());
}
- $scope.toggleFollowTime = function() {
+ $scope.toggleFollowTime = function()
+ {
/*if ($scope.currentMode != 'day') {
$rootScope.zmPopup = $ionicPopup.alert({
title: $translate.instant('kError'),
@@ -573,8 +596,8 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
// so we can redraw the graph
//-------------------------------------------------
-
- $scope.buttonClicked = function(index) {
+ $scope.buttonClicked = function(index)
+ {
//console.log (index);
if (index == 0) //month
{
@@ -588,30 +611,33 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
$scope.fromDate = fromDate;
$scope.toDate = toDate;
drawGraph(fromDate, toDate, maxItems);
- } else if (index == 1) //week
+ }
+ else if (index == 1) //week
{
$scope.follow.time = NVRDataModel.getLogin().followTimeLine;
$scope.currentMode = "week";
$rootScope.customTimelineRange = false;
NVRDataModel.log("Week view");
- toDate = moment().tz(NVRDataModel.getLogin().useLocalTimeZone?NVRDataModel.getLocalTimeZoneNow():NVRDataModel.getTimeZoneNow()).format("YYYY-MM-DD HH:mm:ss");
- fromDate = moment().tz(NVRDataModel.getLogin().useLocalTimeZone?NVRDataModel.getLocalTimeZoneNow():NVRDataModel.getTimeZoneNow()).subtract(1, 'week').startOf('day').format("YYYY-MM-DD HH:mm:ss");
+ toDate = moment().tz(NVRDataModel.getLogin().useLocalTimeZone ? NVRDataModel.getLocalTimeZoneNow() : NVRDataModel.getTimeZoneNow()).format("YYYY-MM-DD HH:mm:ss");
+ fromDate = moment().tz(NVRDataModel.getLogin().useLocalTimeZone ? NVRDataModel.getLocalTimeZoneNow() : NVRDataModel.getTimeZoneNow()).subtract(1, 'week').startOf('day').format("YYYY-MM-DD HH:mm:ss");
$scope.fromDate = fromDate;
$scope.toDate = toDate;
drawGraph(fromDate, toDate, maxItems);
- } else if (index == 2) //day
+ }
+ else if (index == 2) //day
{
$scope.currentMode = "day";
$rootScope.customTimelineRange = false;
NVRDataModel.log("Day view");
//toDate = moment().format("YYYY-MM-DD HH:mm:ss");
- fromDate = moment().tz(NVRDataModel.getLogin().useLocalTimeZone?NVRDataModel.getLocalTimeZoneNow():NVRDataModel.getTimeZoneNow()).startOf('day').format("YYYY-MM-DD HH:mm:ss");
- toDate = moment().tz(NVRDataModel.getLogin().useLocalTimeZone?NVRDataModel.getLocalTimeZoneNow():NVRDataModel.getTimeZoneNow()).endOf('day').format("YYYY-MM-DD HH:mm:ss");
+ fromDate = moment().tz(NVRDataModel.getLogin().useLocalTimeZone ? NVRDataModel.getLocalTimeZoneNow() : NVRDataModel.getTimeZoneNow()).startOf('day').format("YYYY-MM-DD HH:mm:ss");
+ toDate = moment().tz(NVRDataModel.getLogin().useLocalTimeZone ? NVRDataModel.getLocalTimeZoneNow() : NVRDataModel.getTimeZoneNow()).endOf('day').format("YYYY-MM-DD HH:mm:ss");
$scope.fromDate = fromDate;
$scope.toDate = toDate;
drawGraph(fromDate, toDate, maxItems);
- } else // custom
+ }
+ else // custom
{
$scope.follow.time = NVRDataModel.getLogin().followTimeLine;
$scope.currentMode = "custom";
@@ -622,12 +648,12 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
};
-
/**
* [processNewEvents is called every X seconds when dynamic update is on. X = 10 for now]
* @return {[type]}
*/
- function processNewEvents() {
+ function processNewEvents()
+ {
//safeguard in the event http calls are still going on
if (!$scope.follow.time || isProcessNewEventsWaiting) return;
@@ -636,7 +662,6 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
// check for last 2 minutes to account for late DB updates and what not. 5 mins was likely enough
//
-
// make sure these are server time
var from = moment(lastTimeForEvent).tz(NVRDataModel.getTimeZoneNow());
@@ -645,7 +670,7 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
var to = moment(lastTimeForEvent).tz(NVRDataModel.getTimeZoneNow());
to = to.locale('en').format("YYYY-MM-DD HH:mm:ss");
- lastTimeForEvent = moment().tz(NVRDataModel.getLogin().useLocalTimeZone?NVRDataModel.getLocalTimeZoneNow():NVRDataModel.getTimeZoneNow());
+ lastTimeForEvent = moment().tz(NVRDataModel.getLogin().useLocalTimeZone ? NVRDataModel.getLocalTimeZoneNow() : NVRDataModel.getTimeZoneNow());
// FIXME: totally ignoring event pages - hoping it wont be more than 100 or 150 whatever
// the events per page limit is. Why? laziness.
@@ -660,15 +685,14 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
// as it turns out various events get stored withn null and never recover
// so, lets limiy to 15 m
//
-
+
var st = moment(lastTimeForEvent).tz(NVRDataModel.getTimeZoneNow());
- st = st.subtract (10,'minutes').locale('en').format("YYYY-MM-DD HH:mm:ss");
- var ongoingEvents = ld.apiurl + '/events/index/StartTime >=:'+st+'/EndTime =:.json';
+ st = st.subtract(10, 'minutes').locale('en').format("YYYY-MM-DD HH:mm:ss");
+ var ongoingEvents = ld.apiurl + '/events/index/StartTime >=:' + st + '/EndTime =:.json';
//NVRDataModel.debug("Getting incremental events using: " + completedEvents);
-
- NVRDataModel.debug ("Completed events API:"+completedEvents);
- NVRDataModel.debug ("Ongoing events API:+"+ongoingEvents);
+ NVRDataModel.debug("Completed events API:" + completedEvents);
+ NVRDataModel.debug("Ongoing events API:+" + ongoingEvents);
isProcessNewEventsWaiting = true;
@@ -676,32 +700,36 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
var $httpOngoing = $http.get(ongoingEvents);
$q.all([$httpApi, $httpOngoing])
- .then(function(dataarray) {
+ .then(function(dataarray)
+ {
var myevents = dataarray[0].data.events;
- if (dataarray.length > 1) {
+ if (dataarray.length > 1)
+ {
myevents = myevents.concat(dataarray[1].data.events);
-
+
}
$scope.newEvents = '';
var localNewEvents = '';
//console.log ("GOT "+JSON.stringify(data));
- for (var j = 0; j < myevents.length; j++) {
+ for (var j = 0; j < myevents.length; j++)
+ {
// these are all in server timezone but no TZ
-
+
myevents[j].Event.StartTime = moment.tz(myevents[j].Event.StartTime, NVRDataModel.getTimeZoneNow()).format('YYYY-MM-DD HH:mm:ss');
myevents[j].Event.EndTime = moment.tz(myevents[j].Event.EndTime, NVRDataModel.getTimeZoneNow()).format('YYYY-MM-DD HH:mm:ss');
-
+
var itm = graphData.get(myevents[j].Event.Id);
- if (itm) {
- // console.log(myevents[j].Event.Id + " already exists, updating params");
+ if (itm)
+ {
+ // console.log(myevents[j].Event.Id + " already exists, updating params");
- var content = "<span class='my-vis-font'>" + "("+myevents[j].Event.Id+")"+myevents[j].Event.Notes + " " + $translate.instant('kRecordingProgress') + "</span>";
+ var content = "<span class='my-vis-font'>" + "(" + myevents[j].Event.Id + ")" + myevents[j].Event.Notes + " " + $translate.instant('kRecordingProgress') + "</span>";
var style;
var recordingInProgress = false;
@@ -710,16 +738,17 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
{
//console.log ("EVENT "+myevents[j].Event.Id+" emded at "+myevents[j].Event.EndTime);
- content = "<span class='my-vis-font'>" + "( <i class='ion-android-notifications'></i>" + myevents[j].Event.AlarmFrames + ") " + " ("+myevents[j].Event.Id+") "+ myevents[j].Event.Notes + "</span>";
+ content = "<span class='my-vis-font'>" + "( <i class='ion-android-notifications'></i>" + myevents[j].Event.AlarmFrames + ") " + " (" + myevents[j].Event.Id + ") " + myevents[j].Event.Notes + "</span>";
style = "background-color:" + colors[parseInt(myevents[j].Event.MonitorId) % colors.length] +
";border-color:" + colors[parseInt(myevents[j].Event.MonitorId) % colors.length];
- } else // still recording
+ }
+ else // still recording
{
- var tze;
+ var tze;
tze = moment().tz(NVRDataModel.getTimeZoneNow());
-
+
myevents[j].Event.EndTime = tze.format('YYYY-MM-DD HH:mm:ss');
//console.log ("END TIME = "+ myevents[j].Event.EndTime);
@@ -729,42 +758,44 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
}
-
-
// right at this point we need to decide if we keep or remove this event
//
- if (ld.enableAlarmCount && ld.minAlarmCount > myevents[j].Event.AlarmFrames && !recordingInProgress) {
+ if (ld.enableAlarmCount && ld.minAlarmCount > myevents[j].Event.AlarmFrames && !recordingInProgress)
+ {
// remove
NVRDataModel.debug("Removing Event:" + myevents[j].Event.Id + "as it doesn't have " + myevents[j].Event.AlarmFrames + " alarm frames");
- // var old = timeline.getWindow();
+ // var old = timeline.getWindow();
graphData.remove(myevents[j].Event.Id);
- // timeline.setWindow (old.start, old.end);
- } else {
+ // timeline.setWindow (old.start, old.end);
+ }
+ else
+ {
var tzs1, tze1;
if (NVRDataModel.getLogin().useLocalTimeZone)
{
- tzs1 = moment.tz(myevents[j].Event.StartTime, NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow());
- tze1 = moment.tz(myevents[j].Event.EndTime, NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow());
+ tzs1 = moment.tz(myevents[j].Event.StartTime, NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow());
+ tze1 = moment.tz(myevents[j].Event.EndTime, NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow());
}
else
{
- tzs1 = moment.tz(myevents[j].Event.StartTime,NVRDataModel.getTimeZoneNow());
- tze1 = moment.tz(myevents[j].Event.EndTime,NVRDataModel.getTimeZoneNow());
+ tzs1 = moment.tz(myevents[j].Event.StartTime, NVRDataModel.getTimeZoneNow());
+ tze1 = moment.tz(myevents[j].Event.EndTime, NVRDataModel.getTimeZoneNow());
}
//tzs1 = tzs1.format("YYYY-MM-DD HH:mm:ss");
//tze1 = tze1.format("YYYY-MM-DD HH:mm:ss");
- NVRDataModel.debug("Updating Event:" + myevents[j].Event.Id + "StartTime:"+tzs1.format()+" EndTime:" + tze1.format());
- graphData.update({
+ NVRDataModel.debug("Updating Event:" + myevents[j].Event.Id + "StartTime:" + tzs1.format() + " EndTime:" + tze1.format());
+ graphData.update(
+ {
id: myevents[j].Event.Id,
content: content,
- start:tzs1,
- // start: myevents[j].Event.StartTime,
- // end: myevents[j].Event.EndTime,
- end:tze1,
+ start: tzs1,
+ // start: myevents[j].Event.StartTime,
+ // end: myevents[j].Event.EndTime,
+ end: tze1,
//group: myevents[j].Event.MonitorId,
//type: "range",
style: style,
@@ -783,33 +814,33 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
//console.log ("Focus EID="+myevents[j].Event.Id);
localNewEvents = localNewEvents + NVRDataModel.getMonitorName(myevents[j].Event.MonitorId) + '@' + shortenTime(myevents[j].Event.StartTime) + ' (' + myevents[j].Event.Id + '),';
-
}
-
-
- } else { // event is new
+ }
+ else
+ { // event is new
var isBeingRecorded = false;
var idfound = false;
- for (var ii = 0; ii < $scope.monitors.length; ii++) {
- if ($scope.monitors[ii].Monitor.Id == myevents[j].Event.MonitorId && NVRDataModel.isNotHidden(myevents[j].Event.MonitorId)) {
+ for (var ii = 0; ii < $scope.monitors.length; ii++)
+ {
+ if ($scope.monitors[ii].Monitor.Id == myevents[j].Event.MonitorId && NVRDataModel.isNotHidden(myevents[j].Event.MonitorId))
+ {
idfound = true;
break;
}
}
- if (idfound) {
-
-
+ if (idfound)
+ {
myevents[j].Event.MonitorName = NVRDataModel.getMonitorName(myevents[j].Event.MonitorId);
-
myevents[j].Event.streamingURL = NVRDataModel.getStreamingURL(myevents[j].Event.MonitorId);
myevents[j].Event.baseURL = NVRDataModel.getBaseURL(myevents[j].Event.MonitorId);
myevents[j].Event.imageMode = NVRDataModel.getImageMode(myevents[j].Event.MonitorId);
- if (NVRDataModel.getLogin().url != myevents[j].Event.baseURL) {
+ if (NVRDataModel.getLogin().url != myevents[j].Event.baseURL)
+ {
myevents[j].Event.baseURL = NVRDataModel.getLogin().url;
}
@@ -818,8 +849,6 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
// console.log (JSON.stringify(myevents[j]));
myevents[j].Event.DefaultVideo = "";
-
-
// now lets make sure we don't infinitely increase
if (graphIndex >= curCount)
@@ -827,7 +856,8 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
{
var mv = graphData.min('id');
//console.log("MIN="+JSON.stringify(mv));
- if (mv) {
+ if (mv)
+ {
graphData.remove(mv.id);
graphIndex--;
NVRDataModel.debug("Removed Event " + mv.id + " to make space");
@@ -836,26 +866,24 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
}
// since this is a new add its possible dates are not defined
- if (!moment(myevents[j].Event.StartTime).isValid()) {
+ if (!moment(myevents[j].Event.StartTime).isValid())
+ {
NVRDataModel.log("Event:" + myevents[j].Event.Id + "-Invalid Start time - this should really not happen ");
}
-
- if (!moment(myevents[j].Event.EndTime).isValid()) {
- var t1 = moment().tz(NVRDataModel.getTimeZoneNow());
-
-
+ if (!moment(myevents[j].Event.EndTime).isValid())
+ {
+ var t1 = moment().tz(NVRDataModel.getTimeZoneNow());
myevents[j].Event.EndTime = t1.format('YYYY-MM-DD HH:mm:ss');
- NVRDataModel.debug ("Event:" + myevents[j].Event.Id +"-End time is invalid, setting to current time");
-
+ NVRDataModel.debug("Event:" + myevents[j].Event.Id + "-End time is invalid, setting to current time");
+
isBeingRecorded = true;
}
-
// if range doesn't allow for current time, we need to fix that
/*if (moment(options.max).isBefore(moment())) {
// console.log("Adjusting Range to fit in new event");
@@ -865,41 +893,43 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
var eventText = "<span class='my-vis-font'>" + "( <i class='ion-android-notifications'></i>" + (myevents[j].Event.AlarmFrames || ' unknown ') + ") " + myevents[j].Event.Notes + "</span>";
- if (isBeingRecorded) {
- eventText = "<span class='my-vis-font'>" + "("+myevents[j].Event.Id+") "+ myevents[j].Event.Notes + " " + $translate.instant('kRecordingProgress') + "</span>";
+ if (isBeingRecorded)
+ {
+ eventText = "<span class='my-vis-font'>" + "(" + myevents[j].Event.Id + ") " + myevents[j].Event.Notes + " " + $translate.instant('kRecordingProgress') + "</span>";
}
// since we concated, its possible events may be repeated
- if (!graphData.get(myevents[j].Event.Id)) {
-
+ if (!graphData.get(myevents[j].Event.Id))
+ {
localNewEvents = localNewEvents + NVRDataModel.getMonitorName(myevents[j].Event.MonitorId) + '@' + shortenTime(myevents[j].Event.StartTime) + ' (' + myevents[j].Event.Id + '),';
var tzs2, tze2;
if (NVRDataModel.getLogin().useLocalTimeZone)
{
- tzs2 = moment.tz(myevents[j].Event.StartTime, NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow());
- tze2 = moment.tz(myevents[j].Event.EndTime, NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow());
+ tzs2 = moment.tz(myevents[j].Event.StartTime, NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow());
+ tze2 = moment.tz(myevents[j].Event.EndTime, NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow());
}
else
{
- tzs2 = moment.tz(myevents[j].Event.StartTime,NVRDataModel.getTimeZoneNow());
- tze2 = moment.tz(myevents[j].Event.EndTime,NVRDataModel.getTimeZoneNow());
+ tzs2 = moment.tz(myevents[j].Event.StartTime, NVRDataModel.getTimeZoneNow());
+ tze2 = moment.tz(myevents[j].Event.EndTime, NVRDataModel.getTimeZoneNow());
}
//tzs2 = tzs2.format("YYYY-MM-DD HH:mm:ss");
//tze2 = tze2.format("YYYY-MM-DD HH:mm:ss");
-
- NVRDataModel.debug(">>> "+myevents[j].Event.Id + " New event updating graph " + " from:" + tzs2.format()+" to:"+tze2.format() );
-
- graphData.add({
+
+ NVRDataModel.debug(">>> " + myevents[j].Event.Id + " New event updating graph " + " from:" + tzs2.format() + " to:" + tze2.format());
+
+ graphData.add(
+ {
id: myevents[j].Event.Id,
content: eventText,
- start:tzs2,
+ start: tzs2,
//start: myevents[j].Event.StartTime,
- // end: myevents[j].Event.EndTime,
- end:tze2,
+ // end: myevents[j].Event.EndTime,
+ end: tze2,
group: myevents[j].Event.MonitorId,
style: "background-color:orange",
//type: "range",
@@ -914,22 +944,20 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
});
graphIndex++;
//timeline.focus(myevents[j].Event.Id);
- timeline.moveTo(timeline.getCurrentTime());
+ timeline.moveTo(timeline.getCurrentTime());
}
//options.max = moment(fromDate).locale('en').format("YYYY-MM-DD HH:mm:ss");
-
-
} //idfound
-
} // new event
} // for j
// At this stage, see if we need to display new events
- if (localNewEvents.length > 0) {
+ if (localNewEvents.length > 0)
+ {
localNewEvents = $translate.instant('kLatestEvents') + ':' + localNewEvents;
localNewEvents = localNewEvents.slice(0, -1);
$scope.newEvents = localNewEvents;
@@ -937,28 +965,25 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
isProcessNewEventsWaiting = false;
},
- function(err) {
+ function(err)
+ {
NVRDataModel.debug("Error getting incremental timeline data");
isProcessNewEventsWaiting = false;
});
-
-
-
// check all events that started 10+10 seconds ago
-
}
-
//-------------------------------------------------
// This function draws the graph
//-------------------------------------------------
- function drawGraph(fromDate, toDate, count) {
+ function drawGraph(fromDate, toDate, count)
+ {
- console.log ("INSIDE DRAW");
+ console.log("INSIDE DRAW");
$scope.newEvents = "";
// we only need this for day mode
@@ -968,7 +993,6 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
curToDate = toDate;
curCount = count;
-
var isFirstItem = true;
var fromDateNoLang = moment(fromDate).locale('en').format("YYYY-MM-DD HH:mm:ss");
@@ -976,7 +1000,8 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
//latestDateDrawn =toDateNoLang;
- $ionicLoading.show({
+ $ionicLoading.show(
+ {
template: $translate.instant('kLoadingGraph') + "...",
animation: 'fade-in',
showBackdrop: true,
@@ -989,30 +1014,29 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
$scope.graphLoaded = false;
NVRDataModel.debug("TimelineCtrl/drawgraph: graphLoaded:" + $scope.graphLoaded);
- if (timeline) {
+ if (timeline)
+ {
NVRDataModel.debug("TimelineCtrl/drawgraph: destroying timeline as it exists");
timeline.destroy();
}
-
groups = new vis.DataSet();
graphData = new vis.DataSet();
//console.log ("AFTER VIS");
-
var tzs, tze;
// lets scope the time graph to either local or remote time zone
-
+
if (NVRDataModel.getLogin().useLocalTimeZone)
{
- tzs = moment.tz(fromDate, NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow());
- tze = moment.tz(toDate, NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow());
+ tzs = moment.tz(fromDate, NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow());
+ tze = moment.tz(toDate, NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow());
}
else
{
- tzs = moment.tz(fromDate,NVRDataModel.getTimeZoneNow());
- tze = moment.tz(toDate,NVRDataModel.getTimeZoneNow());
+ tzs = moment.tz(fromDate, NVRDataModel.getTimeZoneNow());
+ tze = moment.tz(toDate, NVRDataModel.getTimeZoneNow());
}
//tzs = tzs.format("YYYY-MM-DD HH:mm:ss");
@@ -1022,15 +1046,16 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
showCurrentTime: true,
editable: false,
- moment: function (date) {
+ moment: function(date)
+ {
//var t;
if (NVRDataModel.getLogin().useLocalTimeZone)
//if (0)
- return moment.tz(date,NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow());
+ return moment.tz(date, NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow());
else
- // typecast to server time zone - its in server time anyway
- return moment.tz(date,NVRDataModel.getTimeZoneNow());
+ // typecast to server time zone - its in server time anyway
+ return moment.tz(date, NVRDataModel.getTimeZoneNow());
},
//throttleRedraw: 100,
moveable: true,
@@ -1043,13 +1068,16 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
//max: tze,
zoomMin: 5 * 60 * 1000, // 1 min
stack: false,
- format: {
- minorLabels: {
+ format:
+ {
+ minorLabels:
+ {
minute: NVRDataModel.getTimeFormat(),
hour: NVRDataModel.getTimeFormat(),
second: 's',
},
- majorLabels: {
+ majorLabels:
+ {
second: "D MMM " + NVRDataModel.getTimeFormat(),
}
},
@@ -1058,11 +1086,11 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
graphIndex = 1; // will be used for graph ID
-
//console.log ("**NOLANG" + fromDateNoLang + " " + toDateNoLang);
NVRDataModel.getEventsPages(0, fromDateNoLang, toDateNoLang)
- .then(function(data) {
+ .then(function(data)
+ {
var pages = data.pageCount || 1;
var itemsPerPage = parseInt(data.limit);
var iterCount;
@@ -1076,7 +1104,8 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
// for dynamic binding which was easier, but due to performance reasons
// I am waiting for the full data to load before I draw
var promises = [];
- while ((pages > 0) && (iterCount > 0)) {
+ while ((pages > 0) && (iterCount > 0))
+ {
var promise = NVRDataModel.getEvents(0, pages, "none", fromDateNoLang, toDateNoLang);
promises.push(promise);
pages--;
@@ -1085,13 +1114,16 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
}
$q.all(promises)
- .then(function(data) {
+ .then(function(data)
+ {
NVRDataModel.debug("TimelineCtrl/drawgraph: all pages of graph data received");
graphIndex = 0;
NVRDataModel.log("Creating " + $scope.monitors.length + " groups for the graph");
// create groups
- for (var g = 0; g < $scope.monitors.length; g++) {
- groups.add({
+ for (var g = 0; g < $scope.monitors.length; g++)
+ {
+ groups.add(
+ {
id: $scope.monitors[g].Monitor.Id,
//mid: $scope.monitors[g].Monitor.Id,
content: NVRDataModel.getMonitorName($scope.monitors[g].Monitor.Id),
@@ -1101,28 +1133,32 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
NVRDataModel.getMonitorName($scope.monitors[g].Monitor.Id));
}
-
-
- for (var j = 0; j < data.length; j++) {
+ for (var j = 0; j < data.length; j++)
+ {
var myevents = data[j];
- if (graphIndex > count) {
+ if (graphIndex > count)
+ {
NVRDataModel.log("Exiting page count graph - reached limit of " + count);
break;
}
- for (var i = 0; i < myevents.length; i++) {
+ for (var i = 0; i < myevents.length; i++)
+ {
// make sure group id exists before adding
var idfound = true;
var ld = NVRDataModel.getLogin();
- if (ld.persistMontageOrder) {
+ if (ld.persistMontageOrder)
+ {
idfound = false;
- for (var ii = 0; ii < $scope.monitors.length; ii++) {
- if ($scope.monitors[ii].Monitor.Id == myevents[i].Event.MonitorId && NVRDataModel.isNotHidden(myevents[i].Event.MonitorId)) {
+ for (var ii = 0; ii < $scope.monitors.length; ii++)
+ {
+ if ($scope.monitors[ii].Monitor.Id == myevents[i].Event.MonitorId && NVRDataModel.isNotHidden(myevents[i].Event.MonitorId))
+ {
idfound = true;
//console.log ("****************** ID MATCH " + graphIndex);
@@ -1137,7 +1173,8 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
myevents[i].Event.streamingURL = NVRDataModel.getStreamingURL(myevents[i].Event.MonitorId);
myevents[i].Event.baseURL = NVRDataModel.getBaseURL(myevents[i].Event.MonitorId);
myevents[i].Event.imageMode = NVRDataModel.getImageMode(myevents[i].Event.MonitorId);
- if (NVRDataModel.getLogin().url != myevents[i].Event.baseURL) {
+ if (NVRDataModel.getLogin().url != myevents[i].Event.baseURL)
+ {
//NVRDataModel.debug ("Multi server, changing base");
myevents[i].Event.baseURL = NVRDataModel.getLogin().url;
@@ -1146,10 +1183,8 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
// console.log ("***** MULTISERVER BASE URL FOR EVENTS " + myevents[i].Event.baseURL);
-
-
-
- if (idfound) {
+ if (idfound)
+ {
if (typeof myevents[i].Event.DefaultVideo === 'undefined')
// console.log (JSON.stringify(myevents[i]));
@@ -1160,25 +1195,26 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
var tzs, tze;
if (NVRDataModel.getLogin().useLocalTimeZone)
{
- tzs = moment.tz(myevents[i].Event.StartTime,NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow());
- tze = moment.tz(myevents[i].Event.EndTime,NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow());
+ tzs = moment.tz(myevents[i].Event.StartTime, NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow());
+ tze = moment.tz(myevents[i].Event.EndTime, NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow());
}
else
{
- tzs = moment.tz(myevents[i].Event.StartTime,NVRDataModel.getTimeZoneNow());
- tze = moment.tz(myevents[i].Event.EndTime,NVRDataModel.getTimeZoneNow());
+ tzs = moment.tz(myevents[i].Event.StartTime, NVRDataModel.getTimeZoneNow());
+ tze = moment.tz(myevents[i].Event.EndTime, NVRDataModel.getTimeZoneNow());
}
//console.log ("ADDED "+tzs+" " +tze);
- graphData.add({
+ graphData.add(
+ {
//id: graphIndex,
id: myevents[i].Event.Id,
- content: "<span class='my-vis-font'>" + "( <i class='ion-android-notifications'></i>" + myevents[i].Event.AlarmFrames + ") "+ "("+myevents[j].Event.Id+") " + myevents[i].Event.Notes + "</span>",
+ content: "<span class='my-vis-font'>" + "( <i class='ion-android-notifications'></i>" + myevents[i].Event.AlarmFrames + ") " + "(" + myevents[j].Event.Id + ") " + myevents[i].Event.Notes + "</span>",
- start:tzs,
+ start: tzs,
//start: myevents[i].Event.StartTime,
//end: myevents[i].Event.EndTime,
- end:tze,
+ end: tze,
group: myevents[i].Event.MonitorId,
//type: "range",
style: "background-color:" + colors[parseInt(myevents[i].Event.MonitorId) % colors.length] +
@@ -1192,13 +1228,14 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
});
graphIndex++;
- } else {
+ }
+ else
+ {
//console.log ("SKIPPED GRAPH ID " + graphIndex);
}
-
-
- if (graphIndex > count) {
+ if (graphIndex > count)
+ {
NVRDataModel.log("Exiting event graph - reached limit of " + count);
break;
@@ -1207,7 +1244,7 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
}
}
- console.log(">>>>> CREATING NEW TIMELINE with "+JSON.stringify(options));
+ console.log(">>>>> CREATING NEW TIMELINE with " + JSON.stringify(options));
timeline = new vis.Timeline(container[0], null, options);
// console.log ("GRAPH DATA");
timeline.setItems(graphData);
@@ -1217,14 +1254,14 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
if (NVRDataModel.getLogin().timelineScale == -1)
{
- // console.log ("SCALE NOT FOUND");
-
- timeline.fit();
+ // console.log ("SCALE NOT FOUND");
+
+ timeline.fit();
}
else
{
- timeline.fit();
-
+ timeline.fit();
+
/*var d = NVRDataModel.getLogin().timelineScale;
console.log ("SCALE FOUND "+d+" SECONDS");
var w = timeline.getWindow();
@@ -1241,13 +1278,12 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
console.log ("Start="+s+" End="+e);
$timeout (function() {timeline.setWindow(s,e);},1000);*/
-
}
-
- lastTimeForEvent = moment().tz(NVRDataModel.getLogin().useLocalTimeZone?NVRDataModel.getLocalTimeZoneNow():NVRDataModel.getTimeZoneNow());
- updateInterval = $interval(function() {
+ lastTimeForEvent = moment().tz(NVRDataModel.getLogin().useLocalTimeZone ? NVRDataModel.getLocalTimeZoneNow() : NVRDataModel.getTimeZoneNow());
+ updateInterval = $interval(function()
+ {
processNewEvents();
}.bind(this), 10 * 1000);
@@ -1272,8 +1308,8 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
});*/
- timeline.on('rangechanged', function(s)
- {
+ timeline.on('rangechanged', function(s)
+ {
///console.log ("Range Changed:"+JSON.stringify(s));
if (s.byUser)
{
@@ -1282,24 +1318,25 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
//console.log ("start:"+w.start+" end:"+w.end);
var a = moment(w.start);
var b = moment(w.end);
- var d = b.diff(a,'seconds');
+ var d = b.diff(a, 'seconds');
var ld = NVRDataModel.getLogin();
ld.timelineScale = d;
NVRDataModel.setLogin(ld);
//console.log ("Stored user scale of "+d+" seconds");
}
-
-
- });
-
- timeline.on('click', function(prop) {
+ });
+ timeline.on('click', function(prop)
+ {
- $timeout(function() {
- if (dblclick) {
+ $timeout(function()
+ {
+ if (dblclick)
+ {
//console.log ("IGNORING CLICK AS DBL CLICK");
- $timeout(function() {
+ $timeout(function()
+ {
dblclick = false;
}, 400);
return;
@@ -1311,25 +1348,31 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
// console.log ( "I GOT " + properties);
var itm = prop.item;
//console.log ("ITEM CLICKED " + itm);
- if (itm && !isNaN(itm)) {
+ if (itm && !isNaN(itm))
+ {
NVRDataModel.debug("TimelineCtrl/drawGraph:You clicked on item " + itm);
var item = graphData.get(itm);
NVRDataModel.debug("TimelineCtrl/drawGraph: clicked item details:" + JSON.stringify(item));
showEvent(item.myevent);
-
- } else {
+ }
+ else
+ {
NVRDataModel.debug("exact match not found, guessing item with co-ordinates X=" + prop.x + " group=" + prop.group);
- if (prop.group) {
+ if (prop.group)
+ {
var visible = timeline.getVisibleItems();
NVRDataModel.debug("Visible items=" + JSON.stringify(visible));
var closestItem = null;
var minDist = 99999;
var _item;
- for (var x = 0; x < visible.length; x++) {
+ for (var x = 0; x < visible.length; x++)
+ {
_item = timeline.itemSet.items[x];
- if (_item.data.group == prop.group) {
- if (Math.abs(_item.left - prop.x) < minDist) {
+ if (_item.data.group == prop.group)
+ {
+ if (Math.abs(_item.left - prop.x) < minDist)
+ {
closestItem = _item;
minDist = Math.abs(_item.left - prop.x);
NVRDataModel.debug("Temporary closest " + _item.left);
@@ -1339,13 +1382,17 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
}
- if (closestItem != null) {
+ if (closestItem != null)
+ {
NVRDataModel.log("Closest item " + closestItem.left + " group: " + closestItem.data.group);
showEvent(closestItem.data.myevent);
- } else {
+ }
+ else
+ {
NVRDataModel.log("Did not find a visible item match");
}
- } else // no group row tapped, do nothing
+ }
+ else // no group row tapped, do nothing
{
/*$ionicLoading.show({
@@ -1363,31 +1410,38 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
});
- timeline.on('doubleClick', function(prop) {
+ timeline.on('doubleClick', function(prop)
+ {
//console.log ("DOUBLE");
dblclick = true;
var itm = prop.item;
//console.log ("ITEM CLICKED " + itm);
- if (itm && !isNaN(itm)) {
+ if (itm && !isNaN(itm))
+ {
NVRDataModel.debug("TimelineCtrl/drawGraph:You clicked on item " + itm);
var item = graphData.get(itm);
NVRDataModel.debug("TimelineCtrl/drawGraph: clicked item details:" + JSON.stringify(item));
eventDetails(item.myevent);
-
- } else {
+ }
+ else
+ {
NVRDataModel.debug("exact match not found, guessing item with co-ordinates X=" + prop.x + " group=" + prop.group);
- if (prop.group) {
+ if (prop.group)
+ {
var visible = timeline.getVisibleItems();
NVRDataModel.debug("Visible items=" + JSON.stringify(visible));
var closestItem = null;
var minDist = 99999;
var _item;
- for (var x = 0; x < visible.length; x++) {
+ for (var x = 0; x < visible.length; x++)
+ {
_item = timeline.itemSet.items[x];
- if (_item.data.group == prop.group) {
- if (Math.abs(_item.left - prop.x) < minDist) {
+ if (_item.data.group == prop.group)
+ {
+ if (Math.abs(_item.left - prop.x) < minDist)
+ {
closestItem = _item;
minDist = Math.abs(_item.left - prop.x);
NVRDataModel.debug("Temporary closest " + _item.left);
@@ -1397,10 +1451,13 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
}
NVRDataModel.log("Closest item " + closestItem.left + " group: " + closestItem.data.group);
- if (closestItem != null) {
+ if (closestItem != null)
+ {
NVRDataModel.log("Closest item " + closestItem.left + " group: " + closestItem.data.group);
showEvent(closestItem.data.myevent);
- } else {
+ }
+ else
+ {
NVRDataModel.log("Did not find a visible item match");
}
}
@@ -1410,7 +1467,8 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
});
},
- function(error) {
+ function(error)
+ {
NVRDataModel.displayBanner('error', 'Timeline error', 'Please try again');
}
@@ -1419,7 +1477,6 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
});
}
-
$scope.radialMenuOptions = {
content: '',
//size: 'small',
@@ -1427,19 +1484,23 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
background: '#982112',
isOpen: true,
toggleOnClick: false,
- button: {
+ button:
+ {
cssClass: 'fa fa-compress fa-2x',
size: 'small',
- onclick: function() {
+ onclick: function()
+ {
//console.log("fitting");
timeline.fit();
}
},
- items: [{
+ items: [
+ {
content: '',
cssClass: 'fa fa-minus-circle',
empty: false,
- onclick: function() {
+ onclick: function()
+ {
//zoom(0.2);
timeline.zoomOut(0.2);
}
@@ -1459,16 +1520,18 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
cssClass: 'fa fa-chevron-circle-up',
empty: false,
- onclick: function() {
-
+ onclick: function()
+ {
move(0.2);
}
- }, {
+ },
+ {
content: 'D',
empty: true,
- onclick: function() {
+ onclick: function()
+ {
// console.log('About');
}
},
@@ -1486,7 +1549,8 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
content: '',
cssClass: 'fa fa-plus-circle',
empty: false,
- onclick: function() {
+ onclick: function()
+ {
//zoom(-0.2);
timeline.zoomIn(0.2);
@@ -1505,7 +1569,8 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
{
content: 'H',
empty: true,
- onclick: function() {
+ onclick: function()
+ {
// console.log('About');
}
},
@@ -1514,12 +1579,12 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
content: '',
cssClass: 'fa fa-chevron-circle-up',
empty: false,
- onclick: function() {
+ onclick: function()
+ {
move(-0.2);
}
},
-
{
content: '',
cssClass: 'fa fa-chevron-circle-up',
@@ -1532,15 +1597,12 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
{
content: 'K',
empty: true,
- onclick: function() {
+ onclick: function()
+ {
//console.log('About');
}
},
]
};
-
-
-
-
}]);
diff --git a/www/js/TimelineModalCtrl.js b/www/js/TimelineModalCtrl.js
index 6531117e..6bf0822b 100644
--- a/www/js/TimelineModalCtrl.js
+++ b/www/js/TimelineModalCtrl.js
@@ -3,13 +3,8 @@
/* jslint browser: true*/
/* global saveAs, cordova,StatusBar,angular,console,ionic, moment, vis , Chart, DJS*/
-
-
-
-angular.module('zmApp.controllers').controller('TimelineModalCtrl', ['$scope', '$rootScope', 'zm', 'NVRDataModel', '$ionicSideMenuDelegate', '$timeout', '$interval', '$ionicModal', '$ionicLoading', '$http', '$state', '$stateParams', '$ionicHistory', '$ionicScrollDelegate', '$q', '$sce', 'carouselUtils', '$ionicPopup', '$translate', function ($scope, $rootScope, zm, NVRDataModel, $ionicSideMenuDelegate, $timeout, $interval, $ionicModal, $ionicLoading, $http, $state, $stateParams, $ionicHistory, $ionicScrollDelegate, $q, $sce, carouselUtils, $ionicPopup, $translate) {
-
-
-
+angular.module('zmApp.controllers').controller('TimelineModalCtrl', ['$scope', '$rootScope', 'zm', 'NVRDataModel', '$ionicSideMenuDelegate', '$timeout', '$interval', '$ionicModal', '$ionicLoading', '$http', '$state', '$stateParams', '$ionicHistory', '$ionicScrollDelegate', '$q', '$sce', 'carouselUtils', '$ionicPopup', '$translate', function($scope, $rootScope, zm, NVRDataModel, $ionicSideMenuDelegate, $timeout, $interval, $ionicModal, $ionicLoading, $http, $state, $stateParams, $ionicHistory, $ionicScrollDelegate, $q, $sce, carouselUtils, $ionicPopup, $translate)
+{
var Graph2d;
var tcGraph;
@@ -29,64 +24,68 @@ angular.module('zmApp.controllers').controller('TimelineModalCtrl', ['$scope', '
//$scope.graphType = "all";
$scope.errorDetails = "";
-
-
//----------------------------------------------------------------
// Alarm notification handling
//----------------------------------------------------------------
- $scope.handleAlarms = function () {
+ $scope.handleAlarms = function()
+ {
$rootScope.isAlarm = !$rootScope.isAlarm;
- if (!$rootScope.isAlarm) {
+ if (!$rootScope.isAlarm)
+ {
$rootScope.alarmCount = "0";
- $ionicHistory.nextViewOptions({
+ $ionicHistory.nextViewOptions(
+ {
disableBack: true
});
- $state.go("events", {
+ $state.go("events",
+ {
"id": 0,
- "playEvent":false
- }, {
+ "playEvent": false
+ },
+ {
reload: true
});
return;
}
};
-
-
//-------------------------------------------------------
// we use this to reload the connkey if authkey changed
//------------------------------------------------------
-
- $rootScope.$on("auth-success", function () {
+ $rootScope.$on("auth-success", function()
+ {
NVRDataModel.debug("EventModalCtrl: Re-login detected, resetting everything & re-generating connkey");
-
});
-
- $scope.scrollUp = function () {
+ $scope.scrollUp = function()
+ {
//console.log ("SWIPE UP");
$ionicScrollDelegate.$getByHandle("timeline-modal-delegate").scrollTop(true);
};
- $scope.scrollDown = function () {
+ $scope.scrollDown = function()
+ {
//console.log ("SWIPE DOWN");
$ionicScrollDelegate.$getByHandle("timeline-modal-delegate").scrollBottom(true);
};
+ $scope.switchType = function()
+ {
- $scope.switchType = function () {
-
- if ($scope.graphType == $translate.instant('kGraphAll')) {
+ if ($scope.graphType == $translate.instant('kGraphAll'))
+ {
current_data = onlyalarm_data;
$scope.graphType = $translate.instant('kGraphAlarmed');
NVRDataModel.debug("Alarm array has " + onlyalarm_data.labels.length + " frames");
btype = 'bar';
//console.log (JSON.stringify(onlyalarm_data));
- } else {
+ }
+ else
+ {
current_data = data;
// tcGraph.data =
$scope.graphType = $translate.instant('kGraphAll');
@@ -99,8 +98,8 @@ angular.module('zmApp.controllers').controller('TimelineModalCtrl', ['$scope', '
ld.timelineModalGraphType = $scope.graphType;
NVRDataModel.setLogin(ld);
-
- $timeout(function () {
+ $timeout(function()
+ {
/*
if ($scope.graphType == 'alarmed')
@@ -110,44 +109,42 @@ angular.module('zmApp.controllers').controller('TimelineModalCtrl', ['$scope', '
tcGraph.update();*/
tcGraph.destroy();
console.log("GRAPH TYPE IS " + btype);
- tcGraph = new Chart(ctx, {
+ tcGraph = new Chart(ctx,
+ {
type: btype,
data: current_data,
options: options
});
});
-
-
};
-
//-------------------------------------------------------
// Tapping on a frame shows this image
//------------------------------------------------------
- $scope.showImage = function (p, r, f, fid, e, imode, id) {
+ $scope.showImage = function(p, r, f, fid, e, imode, id)
+ {
var img;
console.log("Image Mode " + imode);
if (imode == 'path')
img = "<img width='100%' ng-src='" + p + "/index.php?view=image&path=" + r + f + "'>";
- else {
+ else
+ {
img = "<img width='100%' ng-src='" + p + "/index.php?view=image&fid=" + id + "'>";
// console.log ("IS MULTISERVER SO IMAGE IS " + img);
}
- $rootScope.zmPopup = $ionicPopup.alert({
+ $rootScope.zmPopup = $ionicPopup.alert(
+ {
title: 'frame:' + fid + '/Event:' + e,
template: img,
cssClass: 'popup95'
});
};
-
-
-
-
- $scope.$on('modal.removed', function (e, m) {
+ $scope.$on('modal.removed', function(e, m)
+ {
if (m.id != 'analyze')
return;
@@ -160,7 +157,8 @@ angular.module('zmApp.controllers').controller('TimelineModalCtrl', ['$scope', '
// init drawing here
//------------------------------------------------------
- $scope.$on('modal.shown', function (e, m) {
+ $scope.$on('modal.shown', function(e, m)
+ {
if (m.id != 'analyze')
return;
@@ -171,7 +169,8 @@ angular.module('zmApp.controllers').controller('TimelineModalCtrl', ['$scope', '
$scope.dataReady = false;
NVRDataModel.getKeyConfigParams(0)
- .then(function (data) {
+ .then(function(data)
+ {
//console.log ("***GETKEY: " + JSON.stringify(data));
eventImageDigits = parseInt(data);
NVRDataModel.log("Image padding digits reported as " + eventImageDigits);
@@ -184,41 +183,42 @@ angular.module('zmApp.controllers').controller('TimelineModalCtrl', ['$scope', '
//$scope.eventdetails = JSON.stringify($scope.event);
});
-
//-------------------------------------------------------
// okay, really init drawing here
//------------------------------------------------------
- function processEvent() {
+ function processEvent()
+ {
var eid = $scope.event.Event.Id;
//eid = 22302;
var ld = NVRDataModel.getLogin();
var apiurl = ld.apiurl + "/events/" + eid + ".json";
NVRDataModel.log("Getting " + apiurl);
$http.get(apiurl)
- .then(function (success) {
+ .then(function(success)
+ {
//$scope.eventdetails = JSON.stringify(success);
drawGraphTC(success.data);
},
- function (error) {
+ function(error)
+ {
$scope.errorDetails = $translate.instant('kGraphError');
NVRDataModel.log("Error in timeline frames " + JSON.stringify(error));
});
}
-
//-------------------------------------------------------
// I was kidding, this is where it really is drawn
// scout's promise
//------------------------------------------------------
- function drawGraphTC(event) {
+ function drawGraphTC(event)
+ {
$scope.eid = event.event.Event.Id;
$scope.alarm_images = [];
-
data = {
labels: [],
datasets: [
@@ -239,9 +239,9 @@ angular.module('zmApp.controllers').controller('TimelineModalCtrl', ['$scope', '
data: [],
frames: []
- },
+ },
- ]
+ ]
};
onlyalarm_data = {
@@ -255,24 +255,28 @@ angular.module('zmApp.controllers').controller('TimelineModalCtrl', ['$scope', '
hoverBorderColor: 'rgba(249, 105, 14,1.0)',
data: [],
frames: []
- },
+ },
- ]
+ ]
};
// Chart.js Options
options = {
legend: false,
- scales: {
- yAxes: [{
- ticks: {
+ scales:
+ {
+ yAxes: [
+ {
+ ticks:
+ {
// beginAtZero:true,
min: -1,
},
- }],
- xAxes: [{
+ }],
+ xAxes: [
+ {
display: false
- }]
+ }]
},
responsive: true,
@@ -281,10 +285,11 @@ angular.module('zmApp.controllers').controller('TimelineModalCtrl', ['$scope', '
scaleGridLineColor: "rgba(0,0,0,.05)",
scaleGridLineWidth: 1,
-
- hover: {
+ hover:
+ {
mode: 'single',
- onHover: function (obj) {
+ onHover: function(obj)
+ {
if (obj.length > 0)
tapOrHover(obj[0]._index);
}
@@ -300,13 +305,14 @@ angular.module('zmApp.controllers').controller('TimelineModalCtrl', ['$scope', '
// NVRDataModel.log ("Changing graph width to " + $scope.graphWidth);
- for (var i = 0; i < event.event.Frame.length; i++) {
-
+ for (var i = 0; i < event.event.Frame.length; i++)
+ {
data.labels.push(event.event.Frame[i].TimeStamp);
//data.labels.push(' ');
data.datasets[0].data.push(event.event.Frame[i].Score);
- data.datasets[0].frames.push({
+ data.datasets[0].frames.push(
+ {
x: event.event.Frame[i].TimeStamp,
y: event.event.Frame[i].Score,
eid: event.event.Event.Id,
@@ -319,12 +325,14 @@ angular.module('zmApp.controllers').controller('TimelineModalCtrl', ['$scope', '
});
- if (event.event.Frame[i].Type == "Alarm") {
+ if (event.event.Frame[i].Type == "Alarm")
+ {
onlyalarm_data.labels.push(event.event.Frame[i].TimeStamp);
//data.labels.push(' ');
onlyalarm_data.datasets[0].data.push(event.event.Frame[i].Score);
- onlyalarm_data.datasets[0].frames.push({
+ onlyalarm_data.datasets[0].frames.push(
+ {
x: event.event.Frame[i].TimeStamp,
y: event.event.Frame[i].Score,
eid: event.event.Event.Id,
@@ -345,39 +353,48 @@ angular.module('zmApp.controllers').controller('TimelineModalCtrl', ['$scope', '
cv = document.getElementById("tcchart");
ctx = cv.getContext("2d");
- if (NVRDataModel.getLogin().timelineModalGraphType == $translate.instant('kGraphAll')) {
+ if (NVRDataModel.getLogin().timelineModalGraphType == $translate.instant('kGraphAll'))
+ {
btype = 'line';
current_data = data;
- } else {
+ }
+ else
+ {
btype = 'bar';
current_data = onlyalarm_data;
}
- $timeout(function () {
- tcGraph = new Chart(ctx, {
+ $timeout(function()
+ {
+ tcGraph = new Chart(ctx,
+ {
type: btype,
data: current_data,
options: options
});
});
- cv.onclick = function (e) {
+ cv.onclick = function(e)
+ {
var b = tcGraph.getElementAtEvent(e);
- if (b.length > 0) {
+ if (b.length > 0)
+ {
tapOrHover(b[0]._index);
}
};
}
- function tapOrHover(ndx) {
-
- $timeout(function () {
+ function tapOrHover(ndx)
+ {
+ $timeout(function()
+ {
//console.log ("You tapped " + ndx);
$scope.alarm_images = [];
$scope.playbackURL = $scope.event.Event.baseURL;
var items = current_data.datasets[0].frames[ndx];
- $scope.alarm_images.push({
+ $scope.alarm_images.push(
+ {
relativePath: items.relativePath,
fid: items.fid,
id: items.id,
@@ -390,13 +407,12 @@ angular.module('zmApp.controllers').controller('TimelineModalCtrl', ['$scope', '
}
-
-
//--------------------------------------------------------
// utility function
//--------------------------------------------------------
- function computeRelativePath(event) {
+ function computeRelativePath(event)
+ {
var relativePath = "";
var loginData = NVRDataModel.getLogin();
var str = event.Event.StartTime;
@@ -421,7 +437,8 @@ angular.module('zmApp.controllers').controller('TimelineModalCtrl', ['$scope', '
// utility function
//--------------------------------------------------------
- function computeBasePath(event) {
+ function computeBasePath(event)
+ {
var basePath = "";
var loginData = NVRDataModel.getLogin();
var str = event.Event.StartTime;
@@ -443,32 +460,31 @@ angular.module('zmApp.controllers').controller('TimelineModalCtrl', ['$scope', '
return basePath;
}
-
function humanizeTime(str)
{
return moment.tz(str, NVRDataModel.getTimeZoneNow()).fromNow();
-
-
+
}
- function padToN(number, digits) {
+ function padToN(number, digits)
+ {
var i;
var stringMax = "";
var stringLeading = "";
- for (i = 1; i <= digits; i++) {
+ for (i = 1; i <= digits; i++)
+ {
stringMax = stringMax + "9";
if (i != digits) stringLeading = stringLeading + "0";
}
var numMax = parseInt(stringMax);
- if (number <= numMax) {
+ if (number <= numMax)
+ {
number = (stringLeading + number).slice(-digits);
}
//console.log ("PADTON: returning " + number);
return number;
}
-
-
-}]); \ No newline at end of file
+}]);
diff --git a/www/js/WizardCtrl.js b/www/js/WizardCtrl.js
index 610dfcc5..537a6839 100644
--- a/www/js/WizardCtrl.js
+++ b/www/js/WizardCtrl.js
@@ -2,28 +2,33 @@
/* jslint browser: true*/
/* global cordova,StatusBar,angular,console, Masonry, URI */
-angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$rootScope', '$ionicModal', 'NVRDataModel', '$ionicSideMenuDelegate', '$ionicHistory', '$state', '$ionicPopup', 'SecuredPopups', '$http', '$q', 'zm', '$ionicLoading', 'WizardHandler', '$translate', function ($scope, $rootScope, $ionicModal, NVRDataModel, $ionicSideMenuDelegate, $ionicHistory, $state, $ionicPopup, SecuredPopups, $http, $q, zm, $ionicLoading, WizardHandler, $translate) {
- $scope.openMenu = function () {
+angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$rootScope', '$ionicModal', 'NVRDataModel', '$ionicSideMenuDelegate', '$ionicHistory', '$state', '$ionicPopup', 'SecuredPopups', '$http', '$q', 'zm', '$ionicLoading', 'WizardHandler', '$translate', function($scope, $rootScope, $ionicModal, NVRDataModel, $ionicSideMenuDelegate, $ionicHistory, $state, $ionicPopup, SecuredPopups, $http, $q, zm, $ionicLoading, WizardHandler, $translate)
+{
+ $scope.openMenu = function()
+ {
$ionicSideMenuDelegate.toggleLeft();
};
-
//--------------------------------------------------------------------------
// logs into ZM
//--------------------------------------------------------------------------
- function login(u, zmu, zmp) {
+ function login(u, zmu, zmp)
+ {
var d = $q.defer();
- $http({
+ $http(
+ {
method: 'POST',
//withCredentials: true,
url: u,
- headers: {
+ headers:
+ {
'Content-Type': 'application/x-www-form-urlencoded',
'Accept': 'application/json',
},
- transformRequest: function (obj) {
+ transformRequest: function(obj)
+ {
var str = [];
for (var p in obj)
str.push(encodeURIComponent(p) + "=" +
@@ -32,24 +37,29 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
return params;
},
- data: {
+ data:
+ {
username: zmu,
password: zmp,
action: "login",
view: "console"
}
})
- .success(function (data, status, headers) {
+ .success(function(data, status, headers)
+ {
//console.log("LOOKING FOR " + zm.loginScreenString);
//console.log("DATA RECEIVED " + JSON.stringify(data));
- if (data.indexOf(zm.loginScreenString) == -1) {
+ if (data.indexOf(zm.loginScreenString) == -1)
+ {
$scope.wizard.loginURL = $scope.wizard.fqportal;
$scope.wizard.portalValidText = $translate.instant('kPortal') + ": " + $scope.wizard.loginURL;
$scope.wizard.portalColor = "#16a085";
d.resolve(true);
return d.promise;
- } else {
+ }
+ else
+ {
//console.log("************ERROR");
$scope.wizard.portalValidText = $translate.instant('kPortalDetectionFailed');
$scope.wizard.portalColor = "#e74c3c";
@@ -57,7 +67,8 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
return d.promise;
}
})
- .error(function (error) {
+ .error(function(error)
+ {
//console.log("************ERROR");
$scope.wizard.portalValidText = $translate.instant('kPortalDetectionFailed');
$scope.wizard.portalColor = "#e74c3c";
@@ -75,38 +86,47 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
// monitors configured, cgi-bin won't work
//--------------------------------------------------------------------------
- function getFirstMonitor() {
+ function getFirstMonitor()
+ {
var d = $q.defer();
$http.get($scope.wizard.apiURL + "/monitors.json")
- .then(function (success) {
+ .then(function(success)
+ {
// console.log("getfirst monitor success: " + JSON.stringify(success));
- if (success.data.monitors.length > 0) {
+ if (success.data.monitors.length > 0)
+ {
var foundMid = -1;
- for (var i = 0; i < success.data.monitors.length; i++) {
+ for (var i = 0; i < success.data.monitors.length; i++)
+ {
if (success.data.monitors[i].Monitor.Function != 'None' &&
- success.data.monitors[i].Monitor.Enabled == '1') {
+ success.data.monitors[i].Monitor.Enabled == '1')
+ {
foundMid = success.data.monitors[i].Monitor.Id;
break;
}
}
- if (foundMid != -1) {
+ if (foundMid != -1)
+ {
NVRDataModel.debug("zmWizard - getFirstMonitor returned " + foundMid);
d.resolve(foundMid);
return d.promise;
- } else {
+ }
+ else
+ {
d.reject(false);
return d.promise;
}
-
-
- } else {
+ }
+ else
+ {
d.reject(false);
return d.promise;
}
},
- function (error) {
+ function(error)
+ {
//console.log("getfirst monitor error: " + JSON.stringify(error));
d.reject(false);
return d.promise;
@@ -120,22 +140,28 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
// through multiple options - not the same as fallback
//--------------------------------------------------------------------------
- function findFirstReachableUrl(urls, tail) {
+ function findFirstReachableUrl(urls, tail)
+ {
var d = $q.defer();
- if (urls.length > 0) {
+ if (urls.length > 0)
+ {
var t = "";
if (tail) t = tail;
//$ionicLoading.show({template: 'trying ' + urls[0].server});
NVRDataModel.log("zmWizard test.." + urls[0] + t);
- return $http.get(urls[0] + t).then(function () {
+ return $http.get(urls[0] + t).then(function()
+ {
NVRDataModel.log("Success: on " + urls[0] + t);
//$ionicLoading.hide();
return urls[0];
- }, function (err) {
+ }, function(err)
+ {
NVRDataModel.log("zmWizard:Failed on " + urls[0] + t + " with error " + JSON.stringify(err));
return findFirstReachableUrl(urls.slice(1), tail);
});
- } else {
+ }
+ else
+ {
// $ionicLoading.hide();
NVRDataModel.log("zmWizard: findFirst returned no success");
d.reject("No reachable URL");
@@ -151,7 +177,8 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
// removes proto scheme from string
//--------------------------------------------------------------------------
- function stripProto(u) {
+ function stripProto(u)
+ {
if (u.indexOf('://') != -1)
return u.substr(u.indexOf('://') + 3);
else
@@ -162,7 +189,8 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
// tries to detect cgi-bin
//--------------------------------------------------------------------------
- function detectcgi() {
+ function detectcgi()
+ {
var d = $q.defer();
var c = URI.parse($scope.wizard.loginURL);
var p1, p2;
@@ -184,12 +212,11 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
var a2 = baseUri + "/cgi-bin-zm"; //fedora/centos/rhel
var a1 = baseUri + "/cgi-bin"; // doofus
-
- var urls = [a1, a2, a3, a4,a5];
-
+ var urls = [a1, a2, a3, a4, a5];
NVRDataModel.getPathZms() // what does ZM have stored in PATH_ZMS?
- .then(function (data) {
+ .then(function(data)
+ {
// remove zms or nph-zms
var path = data.trim();
path = path.replace("/nph-zms", "");
@@ -198,58 +225,71 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
NVRDataModel.log("zmWizard: getPathZMS succeeded, adding " + baseUri + path + " to things to try");
continueCgi(urls);
},
- function (error) {
+ function(error)
+ {
NVRDataModel.log("zmWizard: getPathZMS failed, but continuing...");
continueCgi(urls);
});
// Well, PATH_ZMS or not, lets call this function and brute force it
- function continueCgi(urls) {
- $ionicLoading.show({
+ function continueCgi(urls)
+ {
+ $ionicLoading.show(
+ {
template: $translate.instant('kDiscovering') + "...",
noBackdrop: true,
duration: zm.httpTimeout
});
getFirstMonitor()
- .then(function (success) {
+ .then(function(success)
+ {
$ionicLoading.hide();
var tail = "/nph-zms?mode=single&monitor=" + success;
- if ($scope.wizard.useauth && $scope.wizard.usezmauth) {
+ if ($scope.wizard.useauth && $scope.wizard.usezmauth)
+ {
var ck = Math.floor(Math.random() * (50000 - 10000 + 1)) + 10000;
NVRDataModel.getAuthKey(success, ck)
- .then(function (success) {
- if (success == "") {
+ .then(function(success)
+ {
+ if (success == "")
+ {
NVRDataModel.log("getAuthKey returned null, so going user=&pwd= way");
tail += "&user=" + $scope.wizard.zmuser + "&pass=" + $scope.wizard.zmpassword;
- } else {
+ }
+ else
+ {
tail += success;
}
NVRDataModel.log("auth computed is : " + tail);
proceedwithCgiAfterAuth(urls, tail);
},
- function (error) {
+ function(error)
+ {
NVRDataModel.log("Should never come here, getAuthKey doesn't return error");
});
-
//console.log ("****CDING " + tail);
- } else // no auth case
+ }
+ else // no auth case
{
proceedwithCgiAfterAuth(urls, tail);
}
- function proceedwithCgiAfterAuth(urls, tail) {
+ function proceedwithCgiAfterAuth(urls, tail)
+ {
- $ionicLoading.show({
+ $ionicLoading.show(
+ {
template: $translate.instant('kDiscovering') + "...",
noBackdrop: true,
duration: zm.httpTimeout
});
findFirstReachableUrl(urls, tail)
- .then(function (success) {
+ .then(function(success)
+ {
$ionicLoading.hide();
NVRDataModel.log("Valid cgi-bin found with: " + success);
$scope.wizard.streamingURL = success;
@@ -259,7 +299,8 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
return d.promise;
},
- function (error) {
+ function(error)
+ {
$ionicLoading.hide();
//console.log("No cgi-bin found: " + error);
$scope.wizard.streamingValidText = $translate.instant('kPortalCgiBinFailed');
@@ -269,7 +310,8 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
});
}
},
- function (error) {
+ function(error)
+ {
$ionicLoading.hide();
$scope.wizard.streamingValidText = $translate.instant('kPortalCgiBinFailed') + " -" + $translate.instant('kPortalNoMonitorFound');
$scope.wizard.streamingColor = "#e74c3c";
@@ -285,12 +327,12 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
}
-
//--------------------------------------------------------------------------
// Finds an appropriate API to use
//--------------------------------------------------------------------------
- function detectapi() {
+ function detectapi()
+ {
var u = $scope.wizard.loginURL;
var d = $q.defer();
var api1 = u + "/api";
@@ -304,24 +346,22 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
if (c.port) api2 += ":" + c.port;
api2 += "/api";
-
-
// lets try both /zm/api and /api. What else is there?
var apilist = [api1, api2, api3];
findFirstReachableUrl(apilist, '/host/getVersion.json')
- .then(function (success) {
+ .then(function(success)
+ {
NVRDataModel.log("Valid API response found with:" + success);
$scope.wizard.apiURL = success;
-
-
$scope.wizard.apiValidText = "API: " + $scope.wizard.apiURL;
$scope.wizard.apiColor = "#16a085";
d.resolve(true);
return d.promise;
},
- function (error) {
+ function(error)
+ {
//console.log("No APIs found: " + error);
$scope.wizard.apiValidText = $translate.instant('kPortalAPIFailed');
$scope.wizard.apiColor = "#e74c3c";
@@ -336,18 +376,21 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
// logs out of ZM
//--------------------------------------------------------------------------
-
- function logout(u) {
+ function logout(u)
+ {
var d = $q.defer();
- $http({
+ $http(
+ {
method: 'POST',
url: u,
- headers: {
+ headers:
+ {
'Content-Type': 'application/x-www-form-urlencoded',
'Accept': 'application/json',
},
- transformRequest: function (obj) {
+ transformRequest: function(obj)
+ {
var str = [];
for (var p in obj)
str.push(encodeURIComponent(p) + "=" +
@@ -356,23 +399,25 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
return params;
},
- data: {
+ data:
+ {
action: "logout",
view: "login"
}
})
- .then(function (success) {
+ .then(function(success)
+ {
$rootScope.zmCookie = "";
//console.log("ZMlogout success, cookie removed");
d.resolve(true);
return d.promise;
- }, function (error) {
+ }, function(error)
+ {
//console.log("ZMlogout success");
d.resolve(true);
return d.promise;
});
-
return d.promise;
}
@@ -382,7 +427,8 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
// get back to it
//--------------------------------------------------------------------------
- $scope.enterResults = function () {
+ $scope.enterResults = function()
+ {
$scope.portalValidText = "";
$scope.apiValidateText = "";
$scope.streamingValidateText = "";
@@ -393,7 +439,8 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
// tries to log into the portal and then discover api and cgi-bin
//--------------------------------------------------------------------------
- function validateData() {
+ function validateData()
+ {
$rootScope.authSession = 'undefined';
$rootScope.zmCookie = '';
@@ -415,7 +462,8 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
$scope.wizard.serverName += "-" + c.port;
var b = "";
- if ($scope.wizard.useauth && $scope.wizard.usebasicauth) {
+ if ($scope.wizard.useauth && $scope.wizard.usebasicauth)
+ {
b = $scope.wizard.basicuser + ":" + $scope.wizard.basicpassword + "@";
//console.log("B=" + b);
}
@@ -423,8 +471,8 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
if (c.port) u += ":" + c.port;
if (c.path) u += c.path;
-
- if (u.slice(-1) == '/') {
+ if (u.slice(-1) == '/')
+ {
u = u.slice(0, -1);
}
@@ -438,7 +486,8 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
var zmu = "x";
var zmp = "x";
- if ($scope.wizard.usezmauth) {
+ if ($scope.wizard.usezmauth)
+ {
zmu = $scope.wizard.zmuser;
zmp = $scope.wizard.zmpassword;
}
@@ -446,59 +495,69 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
// logout first for the adventurers amongst us who must
// use it even after logging in
NVRDataModel.log("zmWizard: logging out");
- $ionicLoading.show({
+ $ionicLoading.show(
+ {
template: $translate.instant('kCleaningUp') + "...",
noBackdrop: true,
duration: zm.httpTimeout
});
logout(u)
- .then(function (ans) {
+ .then(function(ans)
+ {
// login now
$ionicLoading.hide();
NVRDataModel.log("zmWizard: logging in with " + u + " " + zmu);
// The logic will be:
// Login then do an api detect and cgi-detect together
- $ionicLoading.show({
+ $ionicLoading.show(
+ {
template: $translate.instant('kDiscoveringPortal') + "...",
noBackdrop: true,
duration: zm.httpTimeout
});
login(u, zmu, zmp)
- .then(function (success) {
+ .then(function(success)
+ {
$ionicLoading.hide();
NVRDataModel.log("zmWizard: login succeeded");
// API Detection
- $ionicLoading.show({
+ $ionicLoading.show(
+ {
template: $translate.instant('kDiscoveringAPI') + "...",
noBackdrop: true,
duration: zm.httpTimeout
});
detectapi()
- .then(function (success) {
+ .then(function(success)
+ {
$ionicLoading.hide();
NVRDataModel.log("zmWizard: API succeeded");
- $ionicLoading.show({
+ $ionicLoading.show(
+ {
template: $translate.instant('kDiscoveringCGI') + "...",
noBackdrop: true,
duration: zm.httpTimeout
});
// CGI detection
detectcgi()
- .then(function (success) {
+ .then(function(success)
+ {
$ionicLoading.hide();
// return true here because we want to progress
return d.resolve(true);
},
- function (error) {
+ function(error)
+ {
$ionicLoading.hide();
// return true here because we want to progress
return d.resolve(true);
});
},
- function (error) {
+ function(error)
+ {
$ionicLoading.hide();
NVRDataModel.log("zmWizard: api failed");
@@ -506,11 +565,11 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
return d.resolve(true);
});
-
},
// if login failed, don't progress in the wizard
- function (error) {
+ function(error)
+ {
$ionicLoading.hide();
NVRDataModel.log("zmWizard: login failed");
$scope.wizard.portalValidText = $translate.instant('kPortalLoginUnsuccessful');
@@ -519,49 +578,57 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
});
-
}); //finally
return d.promise;
}
-
//--------------------------------------------------------------------------
// checks for a protocol
//--------------------------------------------------------------------------
- function checkscheme(url) {
+ function checkscheme(url)
+ {
- if ((!/^(f|ht)tps?:\/\//i.test(url)) && (url != "")) {
+ if ((!/^(f|ht)tps?:\/\//i.test(url)) && (url != ""))
+ {
return false;
- } else
+ }
+ else
return true;
}
-
-
//--------------------------------------------------------------------------
// exit validator for auth wizard
//--------------------------------------------------------------------------
- $scope.exitAuth = function () {
+ $scope.exitAuth = function()
+ {
NVRDataModel.log("Wizard: validating auth syntax");
- if ($scope.wizard.useauth) {
- if (!$scope.wizard.usezmauth && !$scope.wizard.usebasicauth) {
- $rootScope.zmPopup = SecuredPopups.show('show', {
+ if ($scope.wizard.useauth)
+ {
+ if (!$scope.wizard.usezmauth && !$scope.wizard.usebasicauth)
+ {
+ $rootScope.zmPopup = SecuredPopups.show('show',
+ {
title: $translate.instant('kError'),
template: $translate.instant('kOneAuth'),
- buttons: [{
+ buttons: [
+ {
text: $translate.instant('kButtonOk')
}]
});
return false;
}
- if ($scope.wizard.usezmauth) {
- if ((!$scope.wizard.zmuser) || (!$scope.wizard.zmpassword)) {
- $rootScope.zmPopup = SecuredPopups.show('show', {
+ if ($scope.wizard.usezmauth)
+ {
+ if ((!$scope.wizard.zmuser) || (!$scope.wizard.zmpassword))
+ {
+ $rootScope.zmPopup = SecuredPopups.show('show',
+ {
title: $translate.instant('kError'),
template: $translate.instant('kValidNameZMAuth'),
- buttons: [{
+ buttons: [
+ {
text: $translate.instant('kButtonOk')
}]
@@ -570,12 +637,16 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
}
}
- if ($scope.wizard.usebasicauth) {
- if ((!$scope.wizard.basicuser) || (!$scope.wizard.basicpassword)) {
- $rootScope.zmPopup = SecuredPopups.show('show', {
+ if ($scope.wizard.usebasicauth)
+ {
+ if ((!$scope.wizard.basicuser) || (!$scope.wizard.basicpassword))
+ {
+ $rootScope.zmPopup = SecuredPopups.show('show',
+ {
title: $translate.instant('kError'),
template: $translate.instant('kValidNameBasicAuth'),
- buttons: [{
+ buttons: [
+ {
text: $translate.instant('kButtonOk')
}]
@@ -596,14 +667,18 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
// validator for portal url wizard
//--------------------------------------------------------------------------
- $scope.exitPortal = function () {
+ $scope.exitPortal = function()
+ {
NVRDataModel.log("Wizard: validating portal url syntax");
- if (!$scope.wizard.portalurl) {
- $rootScope.zmPopup = SecuredPopups.show('show', {
+ if (!$scope.wizard.portalurl)
+ {
+ $rootScope.zmPopup = SecuredPopups.show('show',
+ {
title: $translate.instant('kError'),
template: $translate.instant('kPortalEmpty'),
- buttons: [{
+ buttons: [
+ {
text: $translate.instant('kButtonOk')
}]
@@ -611,12 +686,15 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
return false;
}
- if (!checkscheme($scope.wizard.portalurl)) {
+ if (!checkscheme($scope.wizard.portalurl))
+ {
- $scope.portalproto = [{
+ $scope.portalproto = [
+ {
text: "http",
value: "http://"
- }, {
+ },
+ {
text: "https",
value: "https://"
}];
@@ -624,15 +702,16 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
proto: ""
};
-
-
- $rootScope.zmPopup = $ionicPopup.show({
+ $rootScope.zmPopup = $ionicPopup.show(
+ {
title: $translate.instant('kPortalNoProto'),
scope: $scope,
template: $translate.instant('kPortalPleaseSelect') + ': <ion-radio-fix ng-repeat="item in portalproto" ng-value="item.value" ng-model="myproto.proto">{{item.text}}</ion-radio-fix>',
- buttons: [{
+ buttons: [
+ {
text: $translate.instant('kButtonOk'),
- onTap: function (e) {
+ onTap: function(e)
+ {
NVRDataModel.debug("Protocol selected:" + $scope.myproto.proto);
$scope.wizard.portalurl = $scope.myproto.proto + stripProto($scope.wizard.portalurl);
}
@@ -649,11 +728,14 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
var c = URI.parse($scope.wizard.portalurl);
- if (!c.scheme) {
- $rootScope.zmPopup = SecuredPopups.show('show', {
+ if (!c.scheme)
+ {
+ $rootScope.zmPopup = SecuredPopups.show('show',
+ {
title: $translate.instant('kError'),
template: $translate.instant('kPortalInvalidUrl'),
- buttons: [{
+ buttons: [
+ {
text: $translate.instant('kButtonOk')
}]
@@ -661,7 +743,6 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
return false;
}
-
if (c.userinfo) // basic auth stuff in here, take it out and put it into the next screen
{
$scope.wizard.useauth = true;
@@ -682,19 +763,21 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
//--------------------------------------------------------------------------
// part of auth wizard - toggles display of auth components
//--------------------------------------------------------------------------
- $scope.toggleAuth = function () {
+ $scope.toggleAuth = function()
+ {
- if (!$scope.wizard.useauth) {
+ if (!$scope.wizard.useauth)
+ {
$scope.wizard.usebasicauth = false;
$scope.wizard.usezmauth = false;
}
};
-
//--------------------------------------------------------------------------
// global tip toggler for all wizard steps
//--------------------------------------------------------------------------
- $scope.toggleTip = function () {
+ $scope.toggleTip = function()
+ {
$scope.wizard.tipshow = !$scope.wizard.tipshow;
if ($scope.wizard.tipshow)
$scope.wizard.tiptext = $translate.instant('kHideTip');
@@ -702,12 +785,15 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
$scope.wizard.tiptext = $translate.instant('kShowTip');
};
- $scope.gotoLoginState = function () {
+ $scope.gotoLoginState = function()
+ {
$rootScope.wizard = angular.copy($scope.wizard);
- $ionicHistory.nextViewOptions({
+ $ionicHistory.nextViewOptions(
+ {
disableBack: true
});
- $state.go("login", {
+ $state.go("login",
+ {
"wizard": true
});
return;
@@ -716,7 +802,8 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
//--------------------------------------------------------------------------
// initial
//--------------------------------------------------------------------------
- $scope.$on('$ionicView.beforeEnter', function () {
+ $scope.$on('$ionicView.beforeEnter', function()
+ {
//console.log("**VIEW ** Help Ctrl Entered");
var monId = -1;
@@ -744,9 +831,8 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
streamingColor: "",
serverName: "",
-
};
});
-}]); \ No newline at end of file
+}]);
diff --git a/www/js/app.js b/www/js/app.js
index 36b67869..c3ef262d 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',
@@ -96,23 +92,26 @@ angular.module('zmApp', [
eventSingleImageQualityLowBW: 70,
monSingleImageQualityLowBW: 70,
montageQualityLowBW: 50,
- eventMontageQualityLowBW: 50
-
+ eventMontageQualityLowBW: 50,
+ maxGifCount:70,
})
-
// 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 +123,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 +147,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 +176,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 +195,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 +228,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 +249,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 +282,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 +327,8 @@ angular.module('zmApp', [
.factory('SecuredPopups', [
'$ionicPopup',
'$q',
- function ($ionicPopup, $q) {
+ function($ionicPopup, $q)
+ {
var firstDeferred = $q.defer();
firstDeferred.resolve();
@@ -319,26 +339,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 +378,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 +385,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 +439,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 +476,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 +502,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 +534,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 +564,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 +578,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 +621,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 +675,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 +696,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 +717,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 +751,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 +780,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 +795,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 +841,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 +874,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 +935,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 +958,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 +982,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 +1000,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 +1011,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 +1028,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 +1037,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 +1048,8 @@ angular.module('zmApp', [
return (d.promise);
})
- .error(function (error, status) {
+ .error(function(error, status)
+ {
$ionicLoading.hide();
//console.log("**** ZM Login FAILED");
@@ -989,13 +1071,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 +1088,8 @@ angular.module('zmApp', [
}
- function stop() {
+ function stop()
+ {
var ld = NVRDataModel.getLogin();
$interval.cancel(zmAutoLoginHandle);
@@ -1020,16 +1105,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 +1137,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 +1193,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 +1225,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 +1273,8 @@ angular.module('zmApp', [
window.stop();
//console.log ("inside cancelAuth , calling wizard");
- $state.go("login", {
+ $state.go("login",
+ {
"wizard": false
});
return;
@@ -1189,26 +1284,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 +1322,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 +1352,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 +1401,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 +1414,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 +1435,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 +1462,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 +1502,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 +1515,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 +1546,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 +1561,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 +1651,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 +1731,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 +1759,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);
@@ -1649,13 +1768,16 @@ angular.module('zmApp', [
// This is an exception interceptor so it can show up in app logs
// if they occur. I suspect digest and other errors will be useful
// for me to see
+ //$compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|cdvphotolibrary):/);
- $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 +1797,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 +1827,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 +1843,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 +1869,10 @@ angular.module('zmApp', [
})
- .state('news', {
- data: {
+ .state('news',
+ {
+ data:
+ {
requireLogin: false
},
url: "/news",
@@ -1756,14 +1882,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 +1901,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 +1922,12 @@ angular.module('zmApp', [
templateUrl: "templates/events.html",
controller: 'zmApp.EventCtrl',
-
})
- .state('lowversion', {
- data: {
+ .state('lowversion',
+ {
+ data:
+ {
requireLogin: false
},
@@ -1804,11 +1936,12 @@ angular.module('zmApp', [
templateUrl: "templates/lowversion.html",
controller: 'zmApp.LowVersionCtrl',
-
})
- .state('importantmessage', {
- data: {
+ .state('importantmessage',
+ {
+ data:
+ {
requireLogin: false
},
@@ -1817,13 +1950,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 +1965,10 @@ angular.module('zmApp', [
})
-
- .state('events-date-time-filter', {
- data: {
+ .state('events-date-time-filter',
+ {
+ data:
+ {
requireLogin: true
},
cache: false,
@@ -1845,8 +1978,10 @@ angular.module('zmApp', [
})
- .state('state', {
- data: {
+ .state('state',
+ {
+ data:
+ {
requireLogin: true
},
cache: false,
@@ -1856,8 +1991,10 @@ angular.module('zmApp', [
})
- .state('devoptions', {
- data: {
+ .state('devoptions',
+ {
+ data:
+ {
requireLogin: true
},
url: "/devoptions",
@@ -1866,29 +2003,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 +2044,10 @@ angular.module('zmApp', [
})
- .state('log', {
- data: {
+ .state('log',
+ {
+ data:
+ {
requireLogin: false
},
url: "/log",
@@ -1910,8 +2057,10 @@ angular.module('zmApp', [
})
- .state('wizard', {
- data: {
+ .state('wizard',
+ {
+ data:
+ {
requireLogin: false
},
url: "/wizard",
@@ -1921,8 +2070,10 @@ angular.module('zmApp', [
})
- .state('zm-portal-login', {
- data: {
+ .state('zm-portal-login',
+ {
+ data:
+ {
requireLogin: false
},
url: "/zm-portal-login",
@@ -1933,8 +2084,10 @@ angular.module('zmApp', [
})
- .state('first-use', {
- data: {
+ .state('first-use',
+ {
+ data:
+ {
requireLogin: false
},
url: "/first-use",
@@ -1944,12 +2097,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 +2116,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 +2143,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] || '{}');
+ }
+ };
+}]);
diff --git a/www/lang/locale-en.json b/www/lang/locale-en.json
index 6e999e49..fe6e82e2 100644
--- a/www/lang/locale-en.json
+++ b/www/lang/locale-en.json
@@ -67,6 +67,7 @@
"kDiscoveringCGI" :"discovering cgi",
"kDiscoveringPortal" :"discovering portal",
"kDone" :"done",
+ "kDownload" :"download",
"kEnable24hr" :"enable 24hr time format",
"kEnableDebug" :"Enable debug logs",
"kEnableLogs" :"Enable logs",
diff --git a/www/lang/locale-pl.json b/www/lang/locale-pl.json
index c0155792..05918e80 100644
--- a/www/lang/locale-pl.json
+++ b/www/lang/locale-pl.json
@@ -45,7 +45,7 @@
"kCurrentState" :"obecny stan",
"kCustomRange" :"Zakres niestandardowy",
"kCycleMonitors" :"cykl monitorów",
- "kCycleMonitorsInterval" :"interwał cyklu monitora",
+ "kCycleMonitorsInterval" :"Interwał cyklu monitora",
"kDay" :"Dzień",
"kDecreaseSize" :"zmniejsz rozmiar",
"kDelete" :"Usuń",
@@ -67,7 +67,7 @@
"kDiscoveringCGI" :"wykrywam CGI",
"kDiscoveringPortal" :"wykrywam portal",
"kDone" :"gotowe",
- "kEnable24hr" :"włącz format czasu 24 godz.",
+ "kEnable24hr" :"Włącz format czasu 24 godz.",
"kEnableDebug" :"Włącz dzienniki debugowania",
"kEnableLogs" :"Włącz dziennik",
"kEnableNewsUpdates" :"Włącz informację o aktualizacji",
@@ -153,14 +153,14 @@
"kLoading" :"ładuję",
"kLoadingGraph" :"ładuję grafikę",
"kLoadingMonitors" :"ładuję monitory",
- "kLocalTimeZone" :"użyj lokalnej strefy czasowej",
+ "kLocalTimeZone" :"Użyj lokalnej strefy czasowej",
"kLoginStatusNoCgi" :"Login potwierdzony, ale nie mogłem potwierdzić ścieżki cgi. Jeśli podgląd na żywo nie działa, sprawdź ścieżkę cgi-bin lub użyj funkcji wykrywania.",
"kLoginStatusNoCgiAlt" :"Ścieżka cgi-bin którą wprowadziłeś może być niewłaściwa. Nie jestem pewien, ale jeśli Twój podgląd na żywo nie działa, sprawdź ścieżkę cgi lub spróbuj użyć funkcji wykrywania.",
"kLoginValidAPIFailedTitle" :"Login potwierdzony ale API zawiodło",
"kLoginValidatedTitle" :"Login Potwierdzony",
"kLogs" :"Logi",
"kLowBWDisplay" :"niska przepustowość",
- "kLowBandwidth" :"tryb niskiej przepustowości",
+ "kLowBandwidth" :"Tryb niskiej przepustowości",
"kManageServerGroups" :"Zarządzaj Serwerem Grup",
"kMaxFPS" :"Maksimum FPS",
"kMaxItemsForTimeline" :"Maks.szt. na Osi Czasu",
@@ -222,7 +222,7 @@
"kPTZNotReady" :"Nie gotowy na PTZ",
"kPTZnotConfigured" :"PTZ nie skonfigurowany dla tego Monitora",
"kPassword" :"hasło",
- "kPathToCgi" :"ścieżka do cgi-bin",
+ "kPathToCgi" :"Ścieżka do cgi-bin",
"kPause" :"pauza",
"kPaused" :"wstrzymane",
"kPersistHidden" :"Utrzymuj ukryte Monitory",
@@ -273,7 +273,7 @@
"kSave" :"Zapisz",
"kSavingSnapshot" :"zapisuję obraz",
"kScore" :"punkty",
- "kScrub" :"Scrub",
+ "kScrub" :"Podgląd",
"kSearch" :"szukaj",
"kSearchCancelled" :"szukaj anulowane",
"kSec" :"sek",
@@ -281,7 +281,7 @@
"kSelectLanguage" :"Wybierz język",
"kSelectRunState" :"Wybierz działający stan",
"kSendingPTZ" :"Wysyła PTZ",
- "kSensitiveBody" :"Tworząc finalny log zmodyfikuję dane, aby usunąć wrażliwe dane jak linki czy hasła. Jednak upewnienie się, że dane zostały usunięte, to Twoja odpowiedzialność. Upewnij się, że przeglądnąłeś i edytowałeś log przed jego wysłaniem",
+ "kSensitiveBody" :"tworząc finalny log zmodyfikuje jego zawartość, aby usunąć wrażliwe dane takie jak linki czy hasła. Jednak na Tobie spoczywa odpowiedzialność upewnienia się, że wszystkie dane wrażliwe zostały usunięte. Upewnij się, że przeglądnąłeś i edytowałeś log przed jego wysłaniem",
"kSensitiveTitle" :"Dane Wrażliwe",
"kServerAdd" :"Dodaj",
"kServerEmptyError" :"Nazwa serwera nie może być pusta",
@@ -333,7 +333,7 @@
"kUseEventServer" :"Użyj serwera Zdarzeń",
"kUseSSL" :"Użyj SSL",
"kUseVideoControls" :"Użyj przełączników wideo odtwarzacza dla Zdarzeń H264. ZoneMinder jeszcze nie wspiera przełączników zms",
- "kUseZmAuth" :"użyj uwierzytelniania ZM",
+ "kUseZmAuth" :"Użyj uwierzytelniania ZM",
"kUserName" :"nazwa użytkownika",
"kValidNameBasicAuth" :"Wprowadź włąściwego użytkownika i hasło dla prostego uwierzytelniania",
"kValidNameZMAuth" :"Wprowadź włąściwego użytkownika i hasło dla uwierzytelniania ZM",
diff --git a/www/templates/devoptions.html b/www/templates/devoptions.html
index 0ce3d11c..1f70d412 100644
--- a/www/templates/devoptions.html
+++ b/www/templates/devoptions.html
@@ -21,7 +21,8 @@
<ion-toggle ng-model="loginData.use24hr" ng-checked="{{loginData.use24hr}}" toggle-class="toggle-calm"><span class="item-text-wrap">{{'kEnable24hr' | translate}}</span></ion-toggle>
</label>
<label>
- <ion-toggle ng-model="loginData.useLocalTimeZone" ng-checked="{{loginData.useLocalTimeZone}}" ng-disabled="!isTzSupported()" toggle-class="toggle-calm"><span class="item-text-wrap">{{'kLocalTimeZone' | translate}}<span ng-if="!isTzSupported()"><p>{{'kTimeZoneNotSupported' | translate}}</p></span><span ng-if="isTzSupported()"><p>{{'kServerTimeZone' | translate}}:{{getTimeZoneNow()}}</p></span></span></ion-toggle>
+ <ion-toggle ng-model="loginData.useLocalTimeZone" ng-checked="{{loginData.useLocalTimeZone}}" ng-disabled="!isTzSupported()" toggle-class="toggle-calm"><span class="item-text-wrap">{{'kLocalTimeZone' | translate}}<span ng-if="!isTzSupported()"><p>{{'kTimeZoneNotSupported' | translate}}</p></span><span ng-if="isTzSupported()"><p>{{'kServerTimeZone' | translate}}:{{getTimeZoneNow()}}</p></span></span>
+ </ion-toggle>
</label>
<div ng-if="$root.platformOS=='android'">
<label>
@@ -41,9 +42,6 @@
toggle-class="toggle-calm">use ZMS for events footage</ion-toggle>
</label>
-->
-
-
-
<div class="item item-text-wrap item-input-inset">
{{'kMaxMonitorsMontage' | translate }}&nbsp;
<label class="item-input-wrapper">
diff --git a/www/templates/events-graphs.html b/www/templates/events-graphs.html
index 2f7b965d..0e14016f 100644
--- a/www/templates/events-graphs.html
+++ b/www/templates/events-graphs.html
@@ -1,88 +1,60 @@
-
<!----- NOT USED -------->
-
<ion-view view-title="Monitor Event Summary" cache-view="false">
-
<ion-nav-buttons side="left">
<button class="button button-icon button-clear ion-navicon" ng-click="openMenu()"></button>
-
- <button data-badge="{{$root.alarmCount}}" class="animated infinite tada button button-icon button-clear ion-ios-bell notification-badge" ng-click="handleAlarms();" ng-if="$root.isAlarm"></button>
-
+ <button data-badge="{{$root.alarmCount}}" class="animated infinite tada button button-icon button-clear ion-ios-bell notification-badge" ng-click="handleAlarms();" ng-if="$root.isAlarm"></button>
</ion-nav-buttons>
-
<!-- I'm calling the same controller function but with different parameters when
you switch between tabs -->
-
<!-- Oddly, unless I add a "div ng-controller" before each canvas
onClick handler does not work
-->
-
<!-- All Events view -->
- <div id="visualization"></div>
+ <div id="visualization"></div>
<ion-tabs class="tabs-icon-top tabs-stable">
<ion-tab title="All" icon="ion-stats-bars" on-select="generateTCChart(0,'All Events',0)">
<ion-nav-view>
<ion-content class="has-header">
-
<div ng-controller="zmApp.EventsGraphsCtrl">
-
-
-
- <canvas tc-chartjs-bar chart-data="chart.data"
- chart-options="chart.options"
- ng-click="handleChartClick($event)" chart="chartwithbars">
- </canvas>
+ <canvas tc-chartjs-bar chart-data="chart.data" chart-options="chart.options" ng-click="handleChartClick($event)" chart="chartwithbars">
+ </canvas>
</div>
</ion-content>
</ion-nav-view>
</ion-tab>
-
<!-- All Events in the last hour -->
- <ion-tab title="Last Hour" icon="ion-stats-bars"
- on-select="generateTCChart(1,'Events in the last hour',1)">
+ <ion-tab title="Last Hour" icon="ion-stats-bars" on-select="generateTCChart(1,'Events in the last hour',1)">
<ion-nav-view>
<ion-content>
<div ng-controller="zmApp.EventsGraphsCtrl">
- <div style="overflow:scroll;">
- <canvas tc-chartjs-bar chart-data="chart.data"
- chart-options="chart.options"
- ng-click="handleChartClick($event)"
- chart="chartwithbars">
- </canvas>
+ <div style="overflow:scroll;">
+ <canvas tc-chartjs-bar chart-data="chart.data" chart-options="chart.options" ng-click="handleChartClick($event)" chart="chartwithbars">
+ </canvas>
</div>
</div>
</ion-content>
</ion-nav-view>
</ion-tab>
-
<!-- All Events in last 24 hrs-->
- <ion-tab title="Day" icon="ion-stats-bars"
- on-select="generateTCChart(2,'Events in the last day',24)">
+ <ion-tab title="Day" icon="ion-stats-bars" on-select="generateTCChart(2,'Events in the last day',24)">
<ion-nav-view>
<ion-content>
<div ng-controller="zmApp.EventsGraphsCtrl">
- <div style="overflow:scroll;">
- <canvas tc-chartjs-bar chart-data="chart.data"
- chart-options="chart.options" chart="chartwithbars"
- ng-click="handleChartClick($event)">
- </canvas>
- </div>
+ <div style="overflow:scroll;">
+ <canvas tc-chartjs-bar chart-data="chart.data" chart-options="chart.options" chart="chartwithbars" ng-click="handleChartClick($event)">
+ </canvas>
+ </div>
</div>
</ion-content>
</ion-nav-view>
</ion-tab>
-
<!-- All Events in last week -->
- <ion-tab title="Week" icon="ion-stats-bars"
- on-select="generateTCChart(3,'Events in the last week',168)">
+ <ion-tab title="Week" icon="ion-stats-bars" on-select="generateTCChart(3,'Events in the last week',168)">
<ion-nav-view>
<ion-content>
<div ng-controller="zmApp.EventsGraphsCtrl">
<div style="overflow:scroll;">
- <canvas tc-chartjs-bar chart-data="chart.data"
- chart-options="chart.options"
- chart="chartwithbars"
- ng-click="handleChartClick($event)">
+ <canvas tc-chartjs-bar chart-data="chart.data" chart-options="chart.options" chart="chartwithbars" ng-click="handleChartClick($event)">
</canvas>
</div>
</div>
diff --git a/www/templates/events-modal.html b/www/templates/events-modal.html
index f9dd446d..ddb954c3 100644
--- a/www/templates/events-modal.html
+++ b/www/templates/events-modal.html
@@ -2,10 +2,9 @@
<!-- style="width: 90%; height: 90%; top: 5%; left: 5%; right: 5%; bottom: 5%;"-->
<ion-modal-view cache-view="false">
<ion-content style="background-color:#444444" ng-cloak>
- <ion-scroll has-bouncing=false min-zoom=1 zooming="true" direction="xy" delegate-handle="imgscroll" on-swipe-left="onSwipeEvent(nextId,1)" on-swipe-right="onSwipeEvent(prevId,-1)" overflow-scroll="false">
+ <ion-scroll has-bouncing=false min-zoom=1 zooming="true" direction="xy" delegate-handle="imgscroll" on-swipe-left="onSwipeEvent(nextId,1)" on-swipe-right="onSwipeEvent(prevId,-1)" overflow-scroll="false">
<div id="full-screen-event" style="height: 100vh;">
- <!--<div>-->
-
+ <!--<div>-->
<!-- route via ZMS -->
<div ng-if="( (defaultVideo=='') || (loginData.enableh264==false)) && (loginData.useNphZmsForEvents==true)">
<!--<div style="color:white">connkey:{{connKey}}</div>-->
@@ -18,26 +17,26 @@
</div>
<!-- no default video -->
<div ng-if="defaultVideo!==undefined && defaultVideo!='' && loginData.enableh264 == true">
- <div ng-if="videoIsReady" >
+ <div ng-if="videoIsReady">
<div style="height:{{$root.devHeight}}px; width:{{$root.devWidth}}px;">
- <videogular vg-error="onVideoError($event)" vg-can-play = "onCanPlay()" vg-player-ready="onPlayerReady($API)" vg-plays-inline="videoObject.config.playsInline" vg-theme="videoObject.config.theme" vg-complete="playbackFinished()" on-double-tap="closeModal();" vg-autoplay="videoObject.config.autoPlay" vg-responsive="videoObject.config.responsive" vg-update-time="videoTime(event.Event.StartTime,$currentTime)" >
- <vg-media vg-src="videoObject.config.sources" vg-native-controls="videoObject.config.nativeControls">
- </vg-media>
-
- <vg-controls>
- <vg-play-pause-button></vg-play-pause-button>
- <vg-time-display>{{ videoTime(event.Event.StartTime, currentTime ); }}</vg-time-display>
- <vg-scrub-bar>
- <vg-scrub-bar-current-time></vg-scrub-bar-current-time>
- </vg-scrub-bar>
- <vg-time-display>{{ timeLeft | date:'mm:ss':'+0000' }}</vg-time-display>
- <vg-fullscreen-button></vg-fullscreen-button>
- <vg-volume>
- <vg-mute-button></vg-mute-button>
- </vg-volume>
- </vg-controls>
- <!--<vg-buffering></vg-buffering>-->
- </videogular>
+ <videogular vg-error="onVideoError($event)" vg-can-play="onCanPlay()" vg-player-ready="onPlayerReady($API)" vg-plays-inline="videoObject.config.playsInline" vg-theme="videoObject.config.theme" vg-complete="playbackFinished()" on-double-tap="closeModal();" vg-autoplay="videoObject.config.autoPlay" vg-responsive="videoObject.config.responsive" vg-update-time="videoTime(event.Event.StartTime,$currentTime)">
+ <vg-media vg-src="videoObject.config.sources" vg-native-controls="videoObject.config.nativeControls">
+ </vg-media>
+ <vg-controls>
+ <vg-playback-button></vg-playback-button>
+ <vg-play-pause-button></vg-play-pause-button>
+ <vg-time-display>{{ videoTime(event.Event.StartTime, currentTime ); }}</vg-time-display>
+ <vg-scrub-bar>
+ <vg-scrub-bar-current-time></vg-scrub-bar-current-time>
+ </vg-scrub-bar>
+ <vg-time-display>{{ timeLeft | date:'mm:ss':'+0000' }}</vg-time-display>
+ <vg-fullscreen-button></vg-fullscreen-button>
+ <vg-volume>
+ <vg-mute-button></vg-mute-button>
+ </vg-volume>
+ </vg-controls>
+ <!--<vg-buffering></vg-buffering>-->
+ </videogular>
</div>
</div>
<!--<div id="event_canvas_video">
@@ -69,7 +68,7 @@
<a mfb-button icon="ion-arrow-resize" label="{{imageFit?'fill screen':'fit screen'}}" ng-click="scaleImage();"></a>
<a mfb-button icon="ion-close" label="{{'kExitEventView' | translate}}" ng-click="closeModal()"> </a>
</nav>
- <nav ng-if="loginData.useNphZmsForEvents" mfb-menu position="br" effect="zoomin" label="collapse" active-icon="ion-chevron-down" resting-icon="ion-chevron-up" toggling-method="click">
+ <nav ng-if="loginData.useNphZmsForEvents && defaultVideo==''" mfb-menu position="br" effect="zoomin" label="collapse" active-icon="ion-chevron-down" resting-icon="ion-chevron-up" toggling-method="click">
<a mfb-button icon="ion-skip-backward" label="{{'kFastRewind'|translate}}" ng-click="adjustSpeed('fr');"></a>
<a mfb-button icon="ion-skip-forward" label="{{'kFastForward'|translate}}" ng-click="adjustSpeed('ff');"></a>
<a mfb-button icon="ion-play" label="{{'kNormalPlay'|translate}}" ng-click="adjustSpeed('np');"></a>
diff --git a/www/templates/events-modalgraph.html b/www/templates/events-modalgraph.html
index 8b718a5e..25b38543 100644
--- a/www/templates/events-modalgraph.html
+++ b/www/templates/events-modalgraph.html
@@ -1,10 +1,9 @@
<div ng-controller="EventsModalGraphCtrl">
-
-<ion-modal-view cache-view="false" style="width:80%;height:80%; top: 10%; left: 10%; right: 10%; bottom: 10%;" >
+ <ion-modal-view cache-view="false" style="width:80%;height:80%; top: 10%; left: 10%; right: 10%; bottom: 10%;">
<ion-content ng-cloak on-double-tap="closeModal()" delegate-handle="eventgraph-modal-delegate">
- <div data-tap-disabled="true">
- <canvas id="eventchart" width="auto" height="70%"></canvas>
- </div>
+ <div data-tap-disabled="true">
+ <canvas id="eventchart" width="auto" height="70%"></canvas>
+ </div>
</ion-content>
</ion-modal-view>
</div>
diff --git a/www/templates/events-popover.html b/www/templates/events-popover.html
index e48b290e..38dd1d2e 100644
--- a/www/templates/events-popover.html
+++ b/www/templates/events-popover.html
@@ -1,18 +1,15 @@
<ion-popover-view class="fit">
- <ion-content>
- <div class="list" ng-click="popover.hide()">
+ <ion-content>
+ <div class="list" ng-click="popover.hide()">
<a class="item" ng-href="" ng-click="popover.hide();$state.go('events-date-time-filter');">{{'kFilterByDateTime' | translate}}</a>
-
<!-- <a class="item" ng-href="" ng-click=" popover.hide();$state.go('events-graphs');" >
Event Graphs
</a>-->
<a class="item" ng-href="" ng-click="popover.hide();doRefresh();">
{{'kRefresh' | translate}}
</a>
-
<a class="item" ng-href="" ng-click="popover.hide();toggleMinAlarmFrameCount();" ng-if="loginData.enableAlarmCount">{{'kShowAllEvents' | translate}}</a>
- <a class="item" ng-href="" ng-click="popover.hide();toggleMinAlarmFrameCount();" ng-if="!loginData.enableAlarmCount"> {{'kShowAlarmedEvents' | translate}}</a>
- </div>
- </ion-content>
- </ion-popover-view>
-
+ <a class="item" ng-href="" ng-click="popover.hide();toggleMinAlarmFrameCount();" ng-if="!loginData.enableAlarmCount"> {{'kShowAlarmedEvents' | translate}}</a>
+ </div>
+ </ion-content>
+</ion-popover-view>
diff --git a/www/templates/events.html b/www/templates/events.html
index af2a7f89..cfb6fa0d 100644
--- a/www/templates/events.html
+++ b/www/templates/events.html
@@ -1,82 +1,49 @@
-
<ion-view cache-view="false">
-
<ion-nav-title>{{scrollPosition();}}</ion-nav-title>
<ion-nav-buttons side="left">
<button class="button button-icon button-clear ion-navicon" ng-click="openMenu()">
</button>
-
<button class="button button-icon icon ion-ios-minus-outline" ng-click="eventList.showDelete = !eventList.showDelete;"></button>
-
<button data-badge="{{$root.alarmCount}}" class="animated infinite tada button button-icon button-clear ion-ios-bell notification-badge" ng-click="handleAlarms();" ng-if="$root.isAlarm"></button>
-
</ion-nav-buttons>
-
<ion-nav-buttons side="right">
<a style="" class="button button-icon icon ion-android-more-vertical" ng-click="popover.show($event)" ;>&nbsp;&nbsp;&nbsp;</a>
<a style="" class="button button-icon icon ion-search" ng-href="" ng-click="searchClicked();"> </a>
</ion-nav-buttons>
-
<div ng-if="showSearch">
<ion-header-bar class="bar bar-subheader item-input-inset">
-
<label class="item-input-wrapper">
<i class="icon ion-ios7-search placeholder-icon"></i>
<input type="search" placeholder="{{'kSearch'|translate}}" ng-model="search.text" autocorrect="off" autocomplete="off">
</label>
</ion-header-bar>
</div>
-
-
-
<!-- collection repeat forces js scrolling, thing to remember -->
-
- <ion-content scroll-sista ng-cloak on-tap="tapped();" delegate-handle="mainScroll" mouse-wheel-scroll>
+ <ion-content scroll-sista ng-cloak on-tap="tapped();" delegate-handle="mainScroll" mouse-wheel-scroll>
<!-- needed for header-shrink so first item doesn't go below header-->
- <!-- <div style="height: 64px;"></div>-->
+ <!-- <div style="height: 64px;"></div>-->
<!-- lets make sure the events list is not empty as collection repeat needs height -->
-
<div ng-if="!eventsBeingLoaded">
-
<ion-list show-delete="eventList.showDelete">
- <ion-item collection-repeat="event in events| filter:search.text" item-height="event.Event.height" id="item-{{$index}}" >
-
-
+ <ion-item collection-repeat="event in events| filter:search.text" item-height="event.Event.height" id="item-{{$index}}">
<span style="float:left;margin-top:-18px;background-color:#96281B;color:#fff;font-size:11px;opacity:0.7;border-radius: 0px 0px 5px 5px;">&nbsp;&nbsp;&nbsp;<i class="ion-calendar"></i>&nbsp;&nbsp;{{prettifyTime(event.Event.StartTime)}}&nbsp;{{tzAbbr}}&nbsp;</span>&nbsp;&nbsp;
-
-
<span style="float:left;margin-top:-18px;background-color:#fff;color:#888;font-size:11px;opacity:1;">&nbsp;&nbsp;<i class="ion-arrow-right-b"></i>&nbsp;{{event.Event.humanizeTime}} <span ng-if="!event.Event.EndTime">(<span translate="kRecordingProgress"></span>)</span>
</span>
-
-
-
-
<span style="float:right;margin-top:-18px;background-color:#444444;color:#fff;font-size:11px;opacity:0.7;border-radius: 0px 0px 5px 5px;">&nbsp;&nbsp;&nbsp;<i class="ion-clock"></i>&nbsp;&nbsp;{{prettifyDate(event.Event.StartTime)}}
&nbsp;{{tzAbbr}}&nbsp;</span>
-
-
-
-
-
<div class="row">
<div class="col col-left">
<!-- this ngswitch displays different icons
depending on the cause of the event -->
-
<div ng-switch on="event.Event.Cause">
<div ng-switch-when="Motion">
-
<i class="ion-android-walk" style="float:left; font-size:200%;"></i>
-
- <i ng-class="(event.Event.DefaultVideo !== undefined && event.Event.DefaultVideo!='')? 'ion-ios-videocam':'ion-images'" style="float:left; padding-left:5px; font-size:100%;"></i>
-
+ <i ng-class="(event.Event.DefaultVideo !== undefined && event.Event.DefaultVideo!='')? 'ion-ios-videocam':'ion-images'" style="float:left; padding-left:5px; font-size:100%;"></i>
<br/>
</div>
<div ng-switch-when="Signal">
<i class="ion-wifi" style="float:left; font-size:200%;"></i>
-
<i ng-class="(event.Event.DefaultVideo !== undefined && event.Event.DefaultVideo!='')? 'ion-ios-videocam':'ion-images'" style="float:left; padding-left:5px; font-size:100%;"></i>
-
<br/>
</div>
<div ng-switch-default>
@@ -87,7 +54,6 @@
</div>
<!-- ng switch -->
<!-- {{event.Event.Cause}} -->
-
<br/>
<span style="font-size:80%; color:rgb(110,110,110)">
{{event.Event.Length}}s
@@ -97,16 +63,17 @@
<div class="col col-80">
<div class="item-text-wrap">
<i class="ion-ios-videocam-outline"></i>
- <b>{{event.Event.MonitorName}}</b> ({{event.Event.Name}})
- </div>
+ <b>{{event.Event.MonitorName}}</b> ({{event.Event.Id}}) &nbsp; &nbsp;
+ <button ng-if="gifshotSupported" class="button button-small button-outline icon ion-android-download" ng-click=" permissionsDownload(event)">
+ </button>
+ </div>
<i class="ion-images"></i> {{event.Event.Frames}} &nbsp;
<i class="ion-ios-bell-outline"></i> {{event.Event.AlarmFrames}} &nbsp;
<i class="ion-arrow-graph-up-right"></i> {{event.Event.TotScore}}
</div>
</div>
<!--row-->
-
<div class="row" style="font-size:80%; color:rgb(110,110,110)">
<div class="item-text-wrap"><i class="ion-calendar"></i>&nbsp; {{prettify(event.Event.StartTime)}}&nbsp;{{tzAbbr}}&nbsp;
<br/>
@@ -114,178 +81,120 @@
<!-- <br/> Default video:{{event.Event.relativePath}}{{event.Event.DefaultVideo}}-->
</div>
</div>
-
<span style="float:right">
- <div ng-if="event.Event.EndTime || 1">
-
- <button class="button button-small button-outline icon icon-left ion-stats-bars"
- ng-click="closeIfOpen(event);analyzeEvent(event)" > <span translate="kAnalyze"></span>
- </button>
-
- <button class="button button-outline button-small icon icon-left ion-ios-eye"
- ng-click="toggleGroupScrub(event,$index,event.Event.Frames)" > <span translate="kScrub"></span>
- </button>
-
- <button ng-if="event.Event.AlarmFrames > 0" class="button button-outline button-small icon icon-left ion-ios-bell"
- ng-click="toggleGroupAlarms(event,$index,event.Event.Frames)" > <span translate="kAlarms"></span>
- </button>
-
+ <div ng-if="event.Event.EndTime || 1">
+ <button class="button button-small button-outline icon icon-left ion-stats-bars"
+ ng-click="closeIfOpen(event);analyzeEvent(event)" >
+ <span translate="kAnalyze"></span>
+ </button>
+ <button class="button button-outline button-small icon icon-left ion-ios-eye" ng-click="toggleGroupScrub(event,$index,event.Event.Frames)"> <span translate="kScrub"></span>
+ </button>
+ <button ng-if="event.Event.AlarmFrames > 0" class="button button-outline button-small icon icon-left ion-ios-bell" ng-click="toggleGroupAlarms(event,$index,event.Event.Frames)"> <span translate="kAlarms"></span>
+ </button>
+ <button class="button button-outline button-small icon icon-left ion-ios-eye" ng-click="closeIfOpen(event);openModal(event)"> <span translate="kFootage"></span>
+ </button>
- <button class="button button-outline button-small icon icon-left ion-ios-eye"
- ng-click="closeIfOpen(event);openModal(event)" > <span translate="kFootage"></span>
- </button>
- </div>
-
-
- </span>
+
- <!-- this is the event scrub/alarm frames area -->
- <div ng-if="isGroupShown(event)">
-
-
-
- <div ng-if="groupType=='alarms'">
- <br/><br/>
-
- <div style="height:190px;">
- <p>
- <!--scroll <i class="icon ion-arrow-left-c"></i>
+ </div>
+ </span>
+ <!-- this is the event scrub/alarm frames area -->
+ <div ng-if="isGroupShown(event)">
+ <div ng-if="groupType=='alarms'">
+ <br/>
+ <br/>
+ <div style="height:190px;">
+ <p>
+ <!--scroll <i class="icon ion-arrow-left-c"></i>
<i class="icon ion-arrow-right-c"></i>-->
-
- <button ng-click="toggleTypeOfAlarms()" class="button button-small button-assertive button-outline">
- <span translate="kType"></span>:{{typeOfFrames}}
- </button>
- </p>
-
-
- <ion-scroll direction="x" overflow-scroll="false">
-
- <span ng-repeat="alarm in alarm_images | selectFrames: typeOfFrames">
+ <button ng-click="toggleTypeOfAlarms()" class="button button-small button-assertive button-outline">
+ <span translate="kType"></span>:{{typeOfFrames}}
+ </button>
+ </p>
+ <ion-scroll direction="x" overflow-scroll="false">
+ <span ng-repeat="alarm in alarm_images | selectFrames: typeOfFrames">
<figure class = "animated slideInLeft" style="display:inline-block">
<!--{{event.Event.baseURL}} p:{{event.Event.imageMode}}-->
- <figcaption class="smallnote"><span translate="kFrame"></span>:{{alarm.frameid}},<span translate="kScore"></span>:{{alarm.score}}, <span translate="kTime"></span>: {{prettifyTimeSec(alarm.time)}}</figcaption>
- <img ng-if="event.Event.imageMode=='path'" image-spinner-src="{{event.Event.baseURL}}/index.php?view=image&path={{event.Event.relativePath}}{{alarm.fname}}&height=380" style="width: auto; height: auto;max-width: 100%;max-height: 170px" on-tap="showImage(event.Event.baseURL,event.Event.relativePath,alarm.fname, alarm.frameid, event.Event.Id, event.Event.imageMode, alarm.id, alarm_images, $index)" />
-
- <img ng-if="event.Event.imageMode=='fid'" image-spinner-src="{{event.Event.baseURL}}/index.php?view=image&fid={{alarm.id}}" style="width: auto; height: auto;max-width: 100%;max-height: 170px" on-tap="showImage(event.Event.baseURL,event.Event.relativePath,alarm.fname, alarm.frameid, event.Event.Id, event.Event.imageMode, alarm.id, alarm_images, $index)" />
-
-
-
-
- </figure>
-
- </span>
-
- </ion-scroll>
- </div>
- </div>
- <div ng-if="groupType=='scrub'">
- <div ng-if="event.Event.DefaultVideo=='' || loginData.enableh264==false">
-
-
- <br/>
- <br/>
- <br/>
- <div style="width:90%">
- <input ng-model="ionRange.index" type="text" id="mySlider1" slider options="slider_options" />
- </div>
-
- <br/>
-
-
-
- <p>{{mycarousel.index+1}}/{{event.Event.Frames}} <span translate="kType"></span>: {{FrameArray[mycarousel.index].Type}}</p>
-
- <div style="height:190px">
-
-
- <ul rn-carousel rn-carousel-buffered rn-carousel-transition="none" rn-swipe-disabled="true" rn-carousel-index="mycarousel.index" rn-carousel-auto-slide="{{event.Event.Length/event.Event.Frames}}" rn-carousel-pause-on-hover rn-platform="{{$root.platformOS}}">
- <li ng-repeat="slide in slides">
-
-
- <img ng-if="event.Event.imageMode=='path'" imageonload="finishedLoadingImage($index)" image-spinner-src="{{event.Event.baseURL}}/index.php?view=image&path={{event.Event.relativePath}}{{slide.img}}&height=380" image-spinner-loader="lines" height="190px" ;/>
-
- <img ng-if="event.Event.imageMode=='fid'" imageonload="finishedLoadingImage($index)" image-spinner-src="{{event.Event.baseURL}}/index.php?view=image&fid={{slide.id}}" image-spinner-loader="lines" height="190px" ;/>
-
-
-
- <br/>
-
-
- </li>
- </ul>
- </div>
- </div>
- <!-- no DefaultVideo -->
-
-
- <div ng-if="event.Event.DefaultVideo!='' && loginData.enableh264 == true">
-
- <br/>
- <br/>
+ <figcaption class="smallnote"><span translate="kFrame"></span>:{{alarm.frameid}},<span translate="kScore"></span>:{{alarm.score}}, <span translate="kTime"></span>: {{prettifyTimeSec(alarm.time)}}</figcaption>
+ <img ng-if="event.Event.imageMode=='path'" image-spinner-src="{{event.Event.baseURL}}/index.php?view=image&path={{event.Event.relativePath}}{{alarm.fname}}&height=380" style="width: auto; height: auto;max-width: 100%;max-height: 170px" on-tap="showImage(event.Event.baseURL,event.Event.relativePath,alarm.fname, alarm.frameid, event.Event.Id, event.Event.imageMode, alarm.id, alarm_images, $index)" />
+ <img ng-if="event.Event.imageMode=='fid'" image-spinner-src="{{event.Event.baseURL}}/index.php?view=image&fid={{alarm.id}}" style="width: auto; height: auto;max-width: 100%;max-height: 170px" on-tap="showImage(event.Event.baseURL,event.Event.relativePath,alarm.fname, alarm.frameid, event.Event.Id, event.Event.imageMode, alarm.id, alarm_images, $index)" />
+ </figure>
+ </span>
+ </ion-scroll>
+ </div>
+ </div>
+ <div ng-if="groupType=='scrub'">
+ <div ng-if="event.Event.DefaultVideo=='' || loginData.enableh264==false">
+ <br/>
+ <br/>
+ <br/>
+ <div style="width:90%">
+ <input ng-model="ionRange.index" type="text" id="mySlider1" slider options="slider_options" />
+ </div>
+ <br/>
+ <p>{{mycarousel.index+1}}/{{event.Event.Frames}} <span translate="kType"></span>: {{FrameArray[mycarousel.index].Type}}</p>
+ <div style="height:190px">
+ <ul rn-carousel rn-carousel-buffered rn-carousel-transition="none" rn-swipe-disabled="true" rn-carousel-index="mycarousel.index" rn-carousel-auto-slide="{{event.Event.Length/event.Event.Frames}}" rn-carousel-pause-on-hover rn-platform="{{$root.platformOS}}">
+ <li ng-repeat="slide in slides">
+ <img ng-if="event.Event.imageMode=='path'" imageonload="finishedLoadingImage($index)" image-spinner-src="{{event.Event.baseURL}}/index.php?view=image&path={{event.Event.relativePath}}{{slide.img}}&height=380" image-spinner-loader="lines" height="190px" ;/>
+ <img ng-if="event.Event.imageMode=='fid'" imageonload="finishedLoadingImage($index)" image-spinner-src="{{event.Event.baseURL}}/index.php?view=image&fid={{slide.id}}" image-spinner-loader="lines" height="190px" ;/>
<br/>
-
-
- <div class="videogular-container">
- <videogular vg-theme="event.Event.video.config.theme"
- vg-plays-inline="'true'" vg-auto-play="'true'" vg-responsive="true">
- <vg-overlay-play></vg-overlay-play>
- <vg-controls>
- <vg-play-pause-button></vg-play-pause-button>
- <vg-scrub-bar>
- <vg-scrub-bar-current-time></vg-scrub-bar-current-time>
- </vg-scrub-bar>
- <vg-time-display>{{ timeLeft | date:'mm:ss':'+0000' }}</vg-time-display>
- <vg-fullscreen-button></vg-fullscreen-button>
- <vg-volume>
- <vg-mute-button></vg-mute-button>
- </vg-volume>
- </vg-controls>
-
- <vg-media vg-src="event.Event.video.config.sources" vg-native-controls="false">
- </vg-media>
-
-
- </videogular>
- </div>
-
- </div>
- <!-- DefaultVideo -->
- </div> <!-- type = scrub -->
+ </li>
+ </ul>
</div>
- <!-- isGroupShown -->
-
- <ion-delete-button class="ion-minus-circled" ng-click="deleteEvent(event.Event.Id, $index)">
- </ion-delete-button>
-
-
-
- </ion-item>
- </ion-list>
+ </div>
+ <!-- no DefaultVideo -->
+ <div ng-if="event.Event.DefaultVideo!='' && loginData.enableh264 == true">
+ <br/>
+ <br/>
+ <br/>
+ <div class="videogular-container">
+ <videogular vg-theme="event.Event.video.config.theme" vg-plays-inline="'true'" vg-auto-play="'true'" vg-responsive="true">
+ <vg-overlay-play></vg-overlay-play>
+ <vg-controls>
+ <vg-play-pause-button></vg-play-pause-button>
+ <vg-scrub-bar>
+ <vg-scrub-bar-current-time></vg-scrub-bar-current-time>
+ </vg-scrub-bar>
+ <vg-time-display>{{ timeLeft | date:'mm:ss':'+0000' }}</vg-time-display>
+ <vg-fullscreen-button></vg-fullscreen-button>
+ <vg-volume>
+ <vg-mute-button></vg-mute-button>
+ </vg-volume>
+ </vg-controls>
+ <vg-media vg-src="event.Event.video.config.sources" vg-native-controls="false">
+ </vg-media>
+ </videogular>
+ </div>
+ </div>
+ <!-- DefaultVideo -->
+ </div>
+ <!-- type = scrub -->
</div>
+ <!-- isGroupShown -->
+ <ion-delete-button class="ion-minus-circled" ng-click="deleteEvent(event.Event.Id, $index)">
+ </ion-delete-button>
+ </ion-item>
+ </ion-list>
+ </div>
+ <!-- !eventsBeingLoaded-->
- <ion-item ng-show="!events.length">
- <span translate="kNoEvents"></span>
- </ion-item>
- <div ng-if="!eventsBeingLoaded">
- <ion-infinite-scroll ng-if="moreDataCanBeLoaded()" icon="ion-loading-c" on-infinite="loadMore()" distance="2%">
- </ion-infinite-scroll>
- </div>
+ <ion-item ng-show="!events.length">
+ <span translate="kNoEvents"></span>
+ </ion-item>
+ <div ng-if="!eventsBeingLoaded">
+ <ion-infinite-scroll ng-if="moreDataCanBeLoaded()" icon="ion-loading-c" on-infinite="loadMore()" distance="2%">
+ </ion-infinite-scroll>
+ </div>
</ion-content>
-
-
-
<div class="events-float-filter" ng-if="isEventFilterOn" on-tap="filterTapped();"><span translate="kFilterOn"></span></div>
-
- <div class="bwmode" ng-if="$root.runMode=='lowbw'">
- <span translate="kLowBWDisplay"></span>
- </div>
-
-
+ <div class="bwmode" ng-if="$root.runMode=='lowbw'">
+ <span translate="kLowBWDisplay"></span>
+ </div>
<ion-pull-up-footer class="zmPullup" on-expand="footerExpand()" on-collapse="footerCollapse()" initial-state="minimized" default-behavior="expand">
-
<ion-pull-up-handle width="100" height="25" toggle="ion-chevron-up ion-chevron-down" style="border-radius: 25px 25px 0 0">
<i class="icon ion-chevron-up"></i>
</ion-pull-up-handle>
@@ -293,74 +202,57 @@
<h1 class="title" ion-pull-up-trigger><span translate="kLatestEvents"></span></h1>
</ion-pull-up-bar>
<ion-pull-up-content scroll="true">
-
<div class="list list-inset">
<div class="item item-divider"><span translate="k1HourSummary"></span></div>
<div ng-repeat="hour in hours|filter:{ monitor: '!'+'(Unknown)'}" id="hour-{{$index}}">
-
<span style="color:black">
<a class="item item-icon-right" href=""
ng-click="showEvents('1', 'hour',hour.mid);">
<b>{{hour.monitor}}</b> {{hour.events}} <span translate="kEvents"></span>
- <i class="icon ion-android-arrow-dropright"></i>
+ <i class="icon ion-android-arrow-dropright"></i>
</a>
</span>
-
</div>
</div>
-
<div class="list list-inset">
<div class="item item-divider"><span translate="k1DaySummary"></span></div>
<div ng-repeat="day in days|filter:{ monitor: '!'+'(Unknown)'}" id="day-{{$index}}">
-
<span style="color:black">
<a class="item item-icon-right" href=""
ng-click="showEvents('1', 'day',day.mid);">
<b>{{day.monitor}}</b> {{day.events}} <span translate="kEvents"></span>
- <i class="icon ion-android-arrow-dropright"></i>
+ <i class="icon ion-android-arrow-dropright"></i>
</a>
</span>
-
</div>
</div>
-
-
<div class="list list-inset">
<div class="item item-divider"><span translate="k1WeekSummary"></span></div>
<div ng-repeat="week in weeks|filter:{ monitor: '!'+'(Unknown)'}" id="week-{{$index}}">
-
<span style="color:black">
<a class="item item-icon-right" href=""
ng-click="showEvents('1', 'week',week.mid);">
<b>{{week.monitor}}</b> {{week.events}} <span translate="kEvents"></span>
- <i class="icon ion-android-arrow-dropright"></i>
+ <i class="icon ion-android-arrow-dropright"></i>
</a>
</span>
-
</div>
</div>
-
<div class="list list-inset">
<div class="item item-divider"><span translate="k1MonthSummary"></span></div>
<div ng-repeat="month in months|filter:{ monitor: '!'+'(Unknown)'}" id="month-{{$index}}">
-
<span style="color:black">
<a class="item item-icon-right" href=""
ng-click="showEvents('1', 'months',month.mid);">
<b>{{month.monitor}}</b> {{month.events}} <span translate="kEvents"></span>
- <i class="icon ion-android-arrow-dropright"></i>
+ <i class="icon ion-android-arrow-dropright"></i>
</a>
</span>
-
</div>
- </div>
+ </div>
<br/>
<br/>
-
-
</ion-pull-up-content>
</ion-pull-up-footer>
-
-
</ion-view>
diff --git a/www/templates/eventserversettings.html b/www/templates/eventserversettings.html
index 7612a584..393eb61b 100644
--- a/www/templates/eventserversettings.html
+++ b/www/templates/eventserversettings.html
@@ -1,62 +1,41 @@
<ion-view cache-view="false">
-
<ion-nav-title>{{'kEventServer' | translate}}/{{getTitle();}} </ion-nav-title>
-
<ion-nav-buttons side="left">
<button class="button button-icon button-clear ion-navicon" ng-click="openMenu()"></button>
<button data-badge="{{$root.alarmCount}}" class="animated infinite tada button button-icon button-clear ion-ios-bell notification-badge" ng-click="handleAlarms();" ng-if="$root.isAlarm"></button>
</ion-nav-buttons>
-
-
<ion-nav-buttons side="right">
<button class="button button-clear" ng-click="saveItems()">{{'kSave'|translate}}</button>
</ion-nav-buttons>
-
- <ion-content scroll-sista delegate-handle="none" overflow-scroll="false" mouse-wheel-scroll >
-
- <div class="list list-inset">
- {{'kEventServerConfig1' | translate }}
+ <ion-content scroll-sista delegate-handle="none" overflow-scroll="false" mouse-wheel-scroll>
+ <div class="list list-inset">
+ {{'kEventServerConfig1' | translate }}
</div>
<ion-checkbox ng-model="loginData.isUseEventServer" ng-checked="loginData.isUseEventServer">{{'kUseEventServer' | translate}}</ion-checkbox>
-
-
- <ion-item ng-href="" ng-click="selectScreen()">
+ <ion-item ng-href="" ng-click="selectScreen()">
{{'kOnTapNavigate' | translate}}: {{defScreen}}
</ion-item>
-
<label class="item item-input item-floating-label" ng-if="loginData.isUseEventServer">
<span class="input-label">{{'kEventServer' | translate}}</span>
<input autocapitalize="none" autocomplete="off" autocorrect="off" type="text" placeholder="Event notification url" ng-model="loginData.eventServer">
-
</label>
-
- <ion-toggle ng-if="loginData.isUseEventServer" ng-model="loginData.disablePush" ng-checked="loginData.disablePush" toggle-class="toggle-calm" class="item-text-wrap">{{'kOnlyUseWebSocket'| translate }}<br/><p>{{'kDisablePush' | translate }}</p></ion-toggle>
-
-
- <!-- vibrate app setting is not av. on iOS-->
- <ion-toggle ng-if="loginData.isUseEventServer && $root.platformOS !='ios'" ng-model="loginData.vibrateOnPush" ng-checked="loginData.vibrateOnPush" toggle-class="toggle-calm" >{{'kVibrateOnPush'| translate }}</ion-toggle>
-
-
- <ion-toggle ng-if="loginData.isUseEventServer" ng-model="loginData.soundOnPush" ng-checked="loginData.soundOnPush" toggle-class="toggle-calm" class="item-text-wrap" >{{'kSoundOnPush'| translate }}</ion-toggle>
-
+ <ion-toggle ng-if="loginData.isUseEventServer" ng-model="loginData.disablePush" ng-checked="loginData.disablePush" toggle-class="toggle-calm" class="item-text-wrap">{{'kOnlyUseWebSocket'| translate }}
+ <br/>
+ <p>{{'kDisablePush' | translate }}</p>
+ </ion-toggle>
+ <!-- vibrate app setting is not av. on iOS-->
+ <ion-toggle ng-if="loginData.isUseEventServer && $root.platformOS !='ios'" ng-model="loginData.vibrateOnPush" ng-checked="loginData.vibrateOnPush" toggle-class="toggle-calm">{{'kVibrateOnPush'| translate }}</ion-toggle>
+ <ion-toggle ng-if="loginData.isUseEventServer" ng-model="loginData.soundOnPush" ng-checked="loginData.soundOnPush" toggle-class="toggle-calm" class="item-text-wrap">{{'kSoundOnPush'| translate }}</ion-toggle>
<!--
<ion-toggle ng-model="loginData.defaultPushSound" toggle-class="toggle-calm" class="item-text-wrap" ng-checked="{{loginData.defaultPushSound}}">use system sound<p>please save and restart app</p></ion-toggle>
-->
<ion-list>
<div ng-repeat="monitor in monitors">
-
- <ion-item class="custom-list"
- ng-click="toggleGroup(monitor)"
- ng-class="{active: isGroupShown(monitor)}">
- <i class="icon" ng-class="isGroupShown(monitor) ? 'ion-minus' : 'ion-plus'"></i>
- &nbsp;
-
- {{monitor.Monitor.Name}}
- </ion-item>
-
- <ion-item class="item-accordion"
- ng-show="isGroupShown(monitor)">
- <span class="item-checkbox">
+ <ion-item class="custom-list" ng-click="toggleGroup(monitor)" ng-class="{active: isGroupShown(monitor)}">
+ <i class="icon" ng-class="isGroupShown(monitor) ? 'ion-minus' : 'ion-plus'"></i> &nbsp; {{monitor.Monitor.Name}}
+ </ion-item>
+ <ion-item class="item-accordion" ng-show="isGroupShown(monitor)">
+ <span class="item-checkbox">
{{'kReportEvents' | translate }}
<label class="checkbox">
@@ -64,30 +43,15 @@
</label>
</span>
</ion-item>
-
- <ion-item class="item-accordion"
- ng-show="isGroupShown(monitor)">
- <div class="item-input-inset" >
- <label class="item-input-wrapper" >
- <input type="tel" placeholder="sec." ng-model="monitor.Monitor.reportingInterval">
- </label>
- &nbsp;{{'kMinimumIntervals' | translate}}
-
-
- </div>
+ <ion-item class="item-accordion" ng-show="isGroupShown(monitor)">
+ <div class="item-input-inset">
+ <label class="item-input-wrapper">
+ <input type="tel" placeholder="sec." ng-model="monitor.Monitor.reportingInterval">
+ </label>
+ &nbsp;{{'kMinimumIntervals' | translate}}
+ </div>
</ion-item>
-
-
</div>
-
</ion-list>
-
-
-
-
-
</ion-content>
</ion-view>
-
-
-
diff --git a/www/templates/first-use.html b/www/templates/first-use.html
index 5599f982..884fb0c9 100644
--- a/www/templates/first-use.html
+++ b/www/templates/first-use.html
@@ -7,8 +7,6 @@
<div id="responsive-image">
<img src="img/authlogo.png">
</div>
-
-
<br/>
<span style="color:white">
<h2 style="color:white" >Hi There!</h2>
@@ -21,15 +19,11 @@
</span>
<br/>
<div id="firstuse">
-
-
- <button class="button icon icon-left ion-wand button-stable animated bounceInUp" ng-click="goToWizard()">
+ <button class="button icon icon-left ion-wand button-stable animated bounceInUp" ng-click="goToWizard()">
{{'kWizard' | translate}}
</button>
-
- <button class="button icon icon-left ion-university button-stable animated bounceInUp" ng-click="goToLogin()">
+ <button class="button icon icon-left ion-university button-stable animated bounceInUp" ng-click="goToLogin()">
{{'kExpert' | translate }}
-
</button>
<br/>
<center>
@@ -37,12 +31,8 @@
{{'kLanguage' | translate}}
</button>
</center>
-
</div>
</center>
-
-
</div>
-
</ion-content>
-</ion-view> \ No newline at end of file
+</ion-view>
diff --git a/www/templates/help.html b/www/templates/help.html
index fffdf2d1..d14085be 100644
--- a/www/templates/help.html
+++ b/www/templates/help.html
@@ -1,21 +1,12 @@
<ion-view cache-view="false" view-title="Help">
-
<ion-nav-buttons side="left">
<button class="button button-icon button-clear ion-navicon" ng-click="openMenu()"></button>
-
<button data-badge="{{$root.alarmCount}}" class="animated infinite tada button button-icon button-clear ion-ios-bell notification-badge" ng-click="handleAlarms();" ng-if="$root.isAlarm"></button>
-
</ion-nav-buttons>
-
-
- <ion-content class="padding" scroll-sista delegate-handle="none" overflow-scroll="false" mouse-wheel-scroll>
-
+ <ion-content class="padding" scroll-sista delegate-handle="none" overflow-scroll="false" mouse-wheel-scroll>
<p><small>{{$root.appName}} v{{zmAppVersion}}</small></p>
<div class="list">
-
- <div id="insertHelp"></div>
+ <div id="insertHelp"></div>
</div>
-
</ion-content>
-
-</ion-view> \ No newline at end of file
+</ion-view>
diff --git a/www/templates/important_message.html b/www/templates/important_message.html
index bd3274f5..f0fd245e 100644
--- a/www/templates/important_message.html
+++ b/www/templates/important_message.html
@@ -1,7 +1,6 @@
<ion-view view-title="{{$root.appName}}" hide-nav-bar="false" hide-back-button="false" cache-view="false">
<ion-nav-buttons side="left">
<button class="button button-icon button-clear ion-navicon" ng-click="openMenu()"></button>
-
</ion-nav-buttons>
<ion-content class="pin-background">
<div style="margin-left:20px; margin-right:20px">
@@ -11,8 +10,6 @@
<div id="responsive-image">
<img src="img/authlogo.png">
</div>
-
-
<br/>
<span style="color:white">
<h2 style="color:white" class="animated bounce">{{'kImpMsg1' | translate}}</h2>
@@ -32,10 +29,6 @@
</span>
</center>
<br/>
-
-
-
</div>
-
</ion-content>
-</ion-view> \ No newline at end of file
+</ion-view>
diff --git a/www/templates/log.html b/www/templates/log.html
index e53f00aa..5efed72f 100644
--- a/www/templates/log.html
+++ b/www/templates/log.html
@@ -1,29 +1,20 @@
<ion-view view-title="{{'kLogs' | translate}}">
-
<ion-nav-buttons side="left">
<button class="button button-icon button-clear ion-navicon" ng-click="openMenu()"></button>
-
<button data-badge="{{$root.alarmCount}}" class="animated infinite tada button button-icon button-clear ion-ios-bell notification-badge" ng-click="handleAlarms();" ng-if="$root.isAlarm"></button>
-
-
-
</ion-nav-buttons>
-
<ion-nav-buttons side="right">
<a class="button button-icon icon ion-trash-a" ng-href="" ng-click="deleteLogs()"></a>
-
<div ng-if="$root.platformOS!='desktop'">
- <a style="" class="button button-icon icon ion-email"
- ng-href="" ng-click="sendEmail(log.logString)" > </a>
+ <a style="" class="button button-icon icon ion-email" ng-href="" ng-click="sendEmail(log.logString)"> </a>
</div>
<div ng-if="$root.platformOS=='desktop'">
- <a style="" class="button button-icon icon ion-android-download"
- ng-href="" ng-click="sendEmail(log.logString)" > </a>
+ <a style="" class="button button-icon icon ion-android-download" ng-href="" ng-click="sendEmail(log.logString)"> </a>
</div>
</ion-nav-buttons>
-
- <ion-content scroll-sista delegate-handle="none" overflow-scroll="false" mouse-wheel-scroll>
- <b>{{$root.appName}} {{'kVersion'|translate}}: {{zmAppVersion}}</b><br/>
+ <ion-content scroll-sista delegate-handle="none" overflow-scroll="false" mouse-wheel-scroll>
+ <b>{{$root.appName}} {{'kVersion'|translate}}: {{zmAppVersion}}</b>
+ <br/>
<!-- don't indent here -- its a pre-->
<pre>{{log.logString}}</pre>
</ion-content>
diff --git a/www/templates/login.html b/www/templates/login.html
index f05781f9..28e340e8 100644
--- a/www/templates/login.html
+++ b/www/templates/login.html
@@ -1,40 +1,27 @@
<ion-view view-title="{{'kSettings' | translate}}" cache-view="false">
-
<ion-nav-buttons side="left">
<button class="button button-icon button-clear ion-navicon" ng-click="openMenu()"></button>
<button class="button button-icon button-clear ion-arrow-down-b" ng-click="serverActionSheet()"></button>
-
-
-
<button data-badge="{{$root.alarmCount}}" class="animated infinite tada button button-icon button-clear ion-ios-bell notification-badge" ng-click="handleAlarms();" ng-if="$root.isAlarm"></button>
</ion-nav-buttons>
-
<ion-nav-buttons side="right">
<button class="button button-clear" ng-click="saveItems()">Save</button>
</ion-nav-buttons>
-
- <ion-content scroll-sista delegate-handle="none" overflow-scroll="false" mouse-wheel-scroll >
-
+ <ion-content scroll-sista delegate-handle="none" overflow-scroll="false" mouse-wheel-scroll>
<div class="item item-text-wrap item-input-inset">
{{'kServerName' | translate }}:&nbsp;
<label class="item-input-wrapper">
<input autocorrect="off" type="text" placeholder="{{'kExampleServer' | translate}}" ng-model="loginData.serverName">
-
</label>
-
</div>
-
<label>
- <ion-toggle ng-mode nl="loginData.enableLowBandwidth" toggle-class="toggle-calm"><span class="item-text-wrap">{{'kLowBandwidth'|translate}}</span>
+ <ion-toggle ng-model="loginData.enableLowBandwidth" toggle-class="toggle-calm"><span class="item-text-wrap">{{'kLowBandwidth'|translate}}</span>
</ion-toggle>
</label>
<label ng-if="loginData.enableLowBandwidth">
<ion-toggle ng-model="loginData.autoSwitchBandwidth" toggle-class="toggle-calm"><span class="item-text-wrap">{{'kAutoSwitchBW'|translate}}</span>
</ion-toggle>
</label>
-
-
-
<div class="list list-inset">
<span style="color:rgb(100,100,100)">
<i class="ion-android-home" style="font-size:150%"></i>
@@ -43,81 +30,56 @@
<p ng-if="$root.platformOS=='android'" style="font-size:0.8em; color:gray">{{'kDisableSamsung' | translate}}</p>
<div class="item item-text-wrap">
<ion-checkbox ng-model="check.isUseAuth">{{'kUseZmAuth' | translate }}</ion-checkbox>
-
<div ng-if="check.isUseAuth">
-
<label class="item item-input item-floating-label">
<span class="input-label">{{'kUserName'|translate}}</span>
<input autocapitalize="none" autocomplete="off" autocorrect="off" type="text" placeholder="username" ng-model="loginData.username">
</label>
-
<label class="item item-input item-floating-label">
<span class="input-label">{{'kPassword' | translate}}</span>
<input type="password" placeholder="password" ng-model="loginData.password">
</label>
</div>
-
</div>
<label class="item item-input item-floating-label">
<span class="input-label">{{'kPortalUrl' | translate}}</span>
<input autocapitalize="none" autocomplete="off" autocorrect="off" type="text" placeholder="ZM portal url " ng-model="loginData.url" ng-keyup="portalKeypress($event)">
</label>
-
<!--<button class="button button-small button-clear icon-left ion-wand" ng-click="detectCgi()">tap here to discover cgi-bin
</button>-->
-
<label class="item item-input item-floating-label">
-
-
<!--<span style="float:right;margin-top:-7px;background-color:#6d0909;color:#fff;font-size:14px;opacity:0.7;width:90px;border-radius: 0px 0px 5px 5px;" on-tap="detectCgi();">&nbsp;&nbsp;&nbsp;<i class="ion-wand"></i>discover</span>-->
-
-
<span class="input-label">{{'kPathToCgi' | translate}}</span>
-
<input autocapitalize="none" autocomplete="off" autocorrect="off" type="text" placeholder="eg. server.com/zm/cgi-bin" ng-model="loginData.streamingurl">
-
</label>
-
-
-
<label class="item item-input item-floating-label">
<span class="input-label">{{'kApiUrl' | translate}}</span>
<input autocapitalize="none" autocomplete="off" autocorrect="off" type="text" placeholder="ZM api url" ng-model="loginData.apiurl">
</label>
-
<a class="item item-icon-right" href="" ng-click="selectFallback()">
<i class="icon ion-ios-arrow-right">
</i> {{'kFallback' | translate}}
<p>{{loginData.fallbackConfiguration}}</p>
</a>
-
<a class="item item-icon-right" href="" ng-click="eventServerSettings()">
<i class="icon ion-ios-arrow-right">
</i> {{'kEventServer' | translate}}
</a>
-
-
<div ng-if="$root.platformOS != 'desktop'">
<label>
-
<ion-toggle ng-model="loginData.usePin" ng-change="pinPrompt();" ng-checked="{{loginData.usePin}}" toggle-class="toggle-calm"><span class="item-text-wrap">{{'kPassword' | translate}} {{'kProtect'|translate}}</span></ion-toggle>
</label>
</div>
-
<label>
<ion-toggle ng-model="loginData.useSSL" ng-checked="{{loginData.useSSL}}" toggle-class="toggle-calm"><span class="item-text-wrap">{{'kUseSSL' | translate}}</span></ion-toggle>
</label>
-
<div ng-if="$root.platformOS != 'desktop'">
<label>
-
<ion-toggle ng-model="loginData.keepAwake" ng-checked="{{loginData.keepAwake}}" toggle-class="toggle-calm"><span class="item-text-wrap">{{'kAwake1'|translate}}
<p>{{'kAwake2'| translate}}</p></span>
</ion-toggle>
</label>
</div>
</div>
-
-
</ion-content>
-</ion-view> \ No newline at end of file
+</ion-view>
diff --git a/www/templates/lowversion.html b/www/templates/lowversion.html
index d9a50986..d6b9cb7e 100644
--- a/www/templates/lowversion.html
+++ b/www/templates/lowversion.html
@@ -1,5 +1,4 @@
<ion-view view-title="{{$root.appName}}" hide-nav-bar="true" hide-back-button="true" cache-view="false">
-
<ion-content class="pin-background">
<div style="margin-left:20px; margin-right:20px">
<center>
@@ -8,8 +7,6 @@
<div id="responsive-image">
<img src="img/authlogo.png">
</div>
-
-
<br/>
<span style="color:white">
<h2 style="color:white" class="animated bounce">{{'kZMUpgradeNeeded' | translate}}</h2>
@@ -22,10 +19,7 @@
</span>
<br/>
-
-
</center>
</div>
-
</ion-content>
-</ion-view> \ No newline at end of file
+</ion-view>
diff --git a/www/templates/monitors-modal.html b/www/templates/monitors-modal.html
index 1cfbfac9..931d9c33 100644
--- a/www/templates/monitors-modal.html
+++ b/www/templates/monitors-modal.html
@@ -1,77 +1,46 @@
<div ng-controller="MonitorModalCtrl" ng-cloak>
-
- <ion-modal-view cache-view="false" style="background-color:#444444" >
- <ion-content on-double-tap="closeModal();" >
-
- <ion-scroll delegate-handle="imgscroll" has-bouncing=false min-zoom=1 zooming="true" direction="xy" style="width: 100%;" overflow-scroll="false" >
+ <ion-modal-view cache-view="false" style="background-color:#444444">
+ <ion-content on-double-tap="closeModal();">
+ <ion-scroll delegate-handle="imgscroll" has-bouncing=false min-zoom=1 zooming="true" direction="xy" style="width: 100%;" overflow-scroll="false">
<!-- android needs this 100vh - otherwise max- does not work -->
<!-- -->
<div id="monitorimage" style="height: 100vh;" class="main">
-
-
-
<div ng-if="$root.authSession!='undefined'">
-
-
<div ng-if="!animationInProgress && !isBackground() && connKey">
<!--<span style="color:white">{{currentStreamMode}}</span>-->
-
- <img id="singlemonitor" style="width:100vw; height:100vh;" image-spinner-loader="lines" image-spinner-src="{{monitor.Monitor.streamingURL}}/nph-zms?mode={{currentStreamMode}}&monitor={{monitorId}}&scale={{quality}}{{$root.authSession}}&rand={{$root.modalRand}}&connkey={{connKey}}" ng-class="{'object-fit_cover':imageFit==false, 'object-fit_contain':imageFit==true}" on-swipe-left="onSwipe(monitorId,1)" on-swipe-right="onSwipe(monitorId,-1)" on-double-tap="closeModal();" />
-
-
-
-
-
+ <img id="singlemonitor" style="width:100vw; height:100vh;" image-spinner-loader="lines" image-spinner-src="{{monitor.Monitor.streamingURL}}/nph-zms?mode={{currentStreamMode}}&monitor={{monitorId}}&scale={{quality}}{{$root.authSession}}&rand={{$root.modalRand}}&connkey={{connKey}}" ng-class="{'object-fit_cover':imageFit==false, 'object-fit_contain':imageFit==true}" on-swipe-left="onSwipe(monitorId,1)" on-swipe-right="onSwipe(monitorId,-1)" on-double-tap="closeModal();" />
</div>
<div ng-if="animationInProgress || isBackground()">
<img style="width:100vw; height:100vh" ng-src="img/pausevideo.png" class="object-fit_contain" />
</div>
-
</div>
<div ng-if="$root.authSession=='undefined'">
<img id="singlemonitor" ng-src="img/pausevideo.png" style="width:100vw; height:100vh; display:block;" class="object-fit_contain" width="{{((devWidth)/(7-monitorSize[$index]))}}px;" />
</div>
</div>
</ion-scroll>
-
</ion-content>
-
-
<div ng-show="isControllable=='1' && showPTZ">
-
-
-
<div class="ptzcentered">
<circular options="ptzRadialMenuOptions">
</circular>
</div>
-
<div ng-if="presetOn" class="ptzpresetbuttons animated fadeInDown" id="presetlist">
<div ng-repeat="preset in ptzPresets track by $index">
<button class="button {{preset.icon}} button-small {{preset.style}}" style="float:left;margin-right:10px;margin-bottom:10px;" ng-click="controlPTZ(monitorId, preset.cmd);">{{preset.name}}</button>
</div>
</div>
-
-
<div class="ptzcenteredbotbutton">
<div ng-if="canZoom">
<a class="button button-small icon ion-search button-positive" href="" ng-click="controlPTZ(monitorId, zoomInCommand);">+</a>
<a class="button button-small icon ion-search button-positive" href="" ng-click="controlPTZ(monitorId, zoomOutCommand);">-</a>
<a class="button button-small icon ion-search button-positive" href="" ng-click="controlPTZ(monitorId, zoomStopCommand);">x</a>
-
</div>
<br/>
<a class="button button-small icon ion-stop button-assertive" href="" ng-click="controlPTZ(monitorId, ptzStopCommand);"></a>
-
-
<a class="button button-small button-royal" href="" ng-click="togglePresets();">{{controlToggle}}</a>
</div>
-
</div>
-
-
-
-
</ion-modal-view>
<nav mfb-menu position="br" effect="zoomin" label="{{'kCollapse' | translate}}" active-icon="ion-chevron-down" resting-icon="ion-chevron-up" toggling-method="click">
<button mfb-button icon="ion-arrow-resize" label="{{imageFit? ('kFitScreen' | translate):('kFillScreen' | translate)}}" ng-click="scaleImage();">
@@ -80,9 +49,7 @@
</button>
<button mfb-button icon="ion-arrow-expand" label="{{'kControl'| translate}}" ng-click="togglePTZ();">
</button>
-
</nav>
-
<nav mfb-menu position="tr" effect="zoomin" label="{{'kCollapse' | translate}}" active-icon="ion-chevron-up" resting-icon="ion-chevron-down" toggling-method="click">
<button mfb-button icon="ion-android-arrow-back" label="{{'kPrevMonitor' | translate}} " ng-click="onTap(monitorId,-1);">
</button>
@@ -90,58 +57,35 @@
</button>
<button mfb-button icon="ion-close" label="{{'kExitLiveView' | translate}}" ng-click="closeModal();">
</button>
-
</nav>
-
-
-
-
- <div id="flyoutmenu" style="position:absolute;bottom:80px;left:10px">
- <ul>
-
- <li>
- <a href="" ng-click="saveImageToPhoneWithPerms(monitorId)"> <i class="icon ion-ios-camera"></i></a>
- </li>
-
- <li ng-if="$root.platformOS == 'desktop'">
- <a href="" ng-click="zoomImage(1)"><i class="ion-plus-round"></i></a>
- </li>
- <li ng-if="$root.platformOS == 'desktop'">
- <a href="" ng-click="zoomImage(-1)"><i class="ion-minus-round"></i></a>
- </li>
-
- <li>
- <a href="" ng-click="enableAlarm(monitorId,true)"> <i class="icon ion-flash"></i></a>
- </li>
- <li>
- <a href="" ng-click="enableAlarm(monitorId,false)"> <i class="icon ion-flash-off"></i></a>
-
-
- </li>
- <li>
- <a href="" ng-click="toggleCycle()"> <i class="icon ion-android-bicycle"></i>-{{cycleText}}</a>
-
-
- </li>
-
-
- <!--<li>
+ <div id="flyoutmenu" style="position:absolute;bottom:80px;left:10px">
+ <ul>
+ <li>
+ <a href="" ng-click="saveImageToPhoneWithPerms(monitorId)"> <i class="icon ion-ios-camera"></i></a>
+ </li>
+ <li ng-if="$root.platformOS == 'desktop'">
+ <a href="" ng-click="zoomImage(1)"><i class="ion-plus-round"></i></a>
+ </li>
+ <li ng-if="$root.platformOS == 'desktop'">
+ <a href="" ng-click="zoomImage(-1)"><i class="ion-minus-round"></i></a>
+ </li>
+ <li>
+ <a href="" ng-click="enableAlarm(monitorId,true)"> <i class="icon ion-flash"></i></a>
+ </li>
+ <li>
+ <a href="" ng-click="enableAlarm(monitorId,false)"> <i class="icon ion-flash-off"></i></a>
+ </li>
+ <li>
+ <a href="" ng-click="toggleCycle()"> <i class="icon ion-android-bicycle"></i>-{{cycleText}}</a>
+ </li>
+ <!--<li>
<a href="" ng-click="cast(monitorId, monitor)"> <i class="icon ion-android-funnel"></i></a>
</li>-->
-
-
-
-
-
- <li ng-if="$root.isAlarm">
- <a data-badge="{{$root.alarmCount}}" class="notification-badge animated infinite tada" href="" ng-click="handleAlarms()"><i class="ion-ios-bell"></i></a>
- </li>
-
-
- </ul>
-</div>
-
+ <li ng-if="$root.isAlarm">
+ <a data-badge="{{$root.alarmCount}}" class="notification-badge animated infinite tada" href="" ng-click="handleAlarms()"><i class="ion-ios-bell"></i></a>
+ </li>
+ </ul>
+ </div>
<div class="monitor-modal-text">{{monitorName}} &nbsp;<span style="{{stateColor()}}">{{monStatus}}&nbsp;</span></div>
-
</div>
diff --git a/www/templates/monitors.html b/www/templates/monitors.html
index d38e8f65..cd9e8e8e 100644
--- a/www/templates/monitors.html
+++ b/www/templates/monitors.html
@@ -1,82 +1,62 @@
<ion-view view-title="{{'kMonitors' | translate}}" cache-view="false">
-
<ion-nav-buttons side="left">
<button class="button button-icon button-clear ion-navicon" ng-click="openMenu()">
</button>
-
<button data-badge="{{$root.alarmCount}}" class="animated infinite tada button button-icon button-clear ion-ios-bell notification-badge" ng-click="handleAlarms();" ng-if="$root.isAlarm"></button>
-
</ion-nav-buttons>
-
-
- <ion-content scroll-sista delegate-handle="none" overflow-scroll="false" mouse-wheel-scroll >
- <ion-refresher pulling-text="Pull to reload Monitors..." spinner="bubbles" on-refresh="doRefresh()">
+ <ion-content scroll-sista delegate-handle="none" overflow-scroll="false" mouse-wheel-scroll>
+ <ion-refresher pulling-text="Pull to reload Monitors..." spinner="bubbles" on-refresh="doRefresh()">
</ion-refresher>
- <div style="float:right;margin-top:3px;margin-right:8px;">
- <a class="button button-small icon icon-left icon ion-ios-world-outline"
- href="" ng-click="changeConfig('All', '','1','Monitor');">{{'kGlobalConfiguration' | translate}}</a>
- </div><br/>
- <div class="list card" ng-repeat="monitor in monitors">
- <div class="item" ng-style="{'background-color': monitor.Monitor.Enabled=='1'?'white':'white'}">
- <div ng-if="monitor.Monitor.Enabled == '1'">
- <div class='item'>
-
- <span class="item-icon-left">
+ <div style="float:right;margin-top:3px;margin-right:8px;">
+ <a class="button button-small icon icon-left icon ion-ios-world-outline" href="" ng-click="changeConfig('All', '','1','Monitor');">{{'kGlobalConfiguration' | translate}}</a>
+ </div>
+ <br/>
+ <div class="list card" ng-repeat="monitor in monitors">
+ <div class="item" ng-style="{'background-color': monitor.Monitor.Enabled=='1'?'white':'white'}">
+ <div ng-if="monitor.Monitor.Enabled == '1'">
+ <div class='item'>
+ <span class="item-icon-left">
<div class="icon">
- <span class="ion-ios-videocam-outline"></span>
- &nbsp;
-
- <span ng-class="{'ion-eye':monitor.Monitor.listDisplay=='show','ion-eye-disabled':monitor.Monitor.listDisplay!='show'}"> </span>
- </div>
-
- &nbsp;
- <b>{{monitor.Monitor.Name}}</b>
- </span>
-
-
- <span class="item-icon-right">
+ <span class="ion-ios-videocam-outline"></span> &nbsp;
+ <span ng-class="{'ion-eye':monitor.Monitor.listDisplay=='show','ion-eye-disabled':monitor.Monitor.listDisplay!='show'}"> </span>
+ </div>
+ &nbsp;
+ <b>{{monitor.Monitor.Name}}</b>
+ </span>
+ <span class="item-icon-right">
<i class="icon {{monitor.Monitor.char}}" style="color:{{monitor.Monitor.color}};"></i>
</span>
-
- <!-- <i ng-class="{'icon ion-eye':monitor.Monitor.listDisplay=='show','icon ion-eye-disabled':monitor.Monitor.listDisplay!='show'}"> </i>-->
-
-
- </div>
- </div>
-
- <div ng-if="monitor.Monitor.Enabled != '1'">
- <span class='item item-icon-left item-icon-right'>
+ <!-- <i ng-class="{'icon ion-eye':monitor.Monitor.listDisplay=='show','icon ion-eye-disabled':monitor.Monitor.listDisplay!='show'}"> </i>-->
+ </div>
+ </div>
+ <div ng-if="monitor.Monitor.Enabled != '1'">
+ <span class='item item-icon-left item-icon-right'>
<i class="icon ion-ios-videocam-outline"></i>
<b>{{monitor.Monitor.Name}}</b>
<i class="icon {{monitor.Monitor.char}}" style="color:grey;"></i>
</span>
- </div>
-
-
- <p>{{'kMode' | translate}} :{{monitor.Monitor.Function}}<br/>
- {{'kResolution' | translate}}: {{monitor.Monitor.Width}}*{{monitor.Monitor.Height}}<br/>
- {{'kMaxFPS' | translate}}: {{monitor.Monitor.MaxFPS}}
- <br/> {{'kAlarmMaxFPS' | translate}}:{{monitor.Monitor.AlarmMaxFPS}}
- <br/> {{'kAlarmFrameCount' |translate}}: {{monitor.Monitor.AlarmFrameCount}}
- <br/> {{'kStatus' | translate}}: {{monitor.Monitor.isRunningText}}
- <br/> {{'kId' | translate}}: {{monitor.Monitor.Id}}
- <br/> {{'kEventRecording' | translate}}: {{(monitor.Monitor.VideoWriter>0?'kVideo':'kImages') | translate}}
- <br/>
- <br/>
- </p>
-
- <div style="float:right;">
- <a class="button button-small icon icon-left icon ion-gear-a"
- href="" ng-click="changeConfig(monitor.Monitor.Name, monitor.Monitor.Id,monitor.Monitor.Enabled,monitor.Monitor.Function);">{{'kConfiguration' | translate}}</a>
- <a class="button button-small icon icon-left ion-calendar" href="#/events/{{monitor.Monitor.Id}}/false">{{'kEventsCap'|translate}}</a>
- <a class="button button-small icon icon-left ion-ios-eye" ng-click="openModal(monitor.Monitor.Id, monitor.Monitor.Controllable, monitor.Monitor.ControlId, monitor.Monitor.connKey, monitor)">{{'kLiveView' | translate}}</a>
- </div>
- </div>
</div>
-
+ <p>{{'kMode' | translate}} :{{monitor.Monitor.Function}}
+ <br/> {{'kResolution' | translate}}: {{monitor.Monitor.Width}}*{{monitor.Monitor.Height}}
+ <br/> {{'kMaxFPS' | translate}}: {{monitor.Monitor.MaxFPS}}
+ <br/> {{'kAlarmMaxFPS' | translate}}:{{monitor.Monitor.AlarmMaxFPS}}
+ <br/> {{'kAlarmFrameCount' |translate}}: {{monitor.Monitor.AlarmFrameCount}}
+ <br/> {{'kStatus' | translate}}: {{monitor.Monitor.isRunningText}}
+ <br/> {{'kId' | translate}}: {{monitor.Monitor.Id}}
+ <br/> {{'kEventRecording' | translate}}: {{(monitor.Monitor.VideoWriter>0?'kVideo':'kImages') | translate}}
+ <br/>
+ <br/>
+ </p>
+ <div style="float:right;">
+ <a class="button button-small icon icon-left icon ion-gear-a" href="" ng-click="changeConfig(monitor.Monitor.Name, monitor.Monitor.Id,monitor.Monitor.Enabled,monitor.Monitor.Function);">{{'kConfiguration' | translate}}</a>
+ <a class="button button-small icon icon-left ion-calendar" href="#/events/{{monitor.Monitor.Id}}/false">{{'kEventsCap'|translate}}</a>
+ <a class="button button-small icon icon-left ion-ios-eye" ng-click="openModal(monitor.Monitor.Id, monitor.Monitor.Controllable, monitor.Monitor.ControlId, monitor.Monitor.connKey, monitor)">{{'kLiveView' | translate}}</a>
+ </div>
+ </div>
+ </div>
<ion-item ng-show="!monitors.length">
- {{'kNoMonitors' | translate}}
+ {{'kNoMonitors' | translate}}
</ion-item>
</ion-content>
</ion-view>
diff --git a/www/templates/montage-history.html b/www/templates/montage-history.html
index 94659e93..da7b5974 100644
--- a/www/templates/montage-history.html
+++ b/www/templates/montage-history.html
@@ -1,24 +1,23 @@
<ion-view view-title="{{'kEventMontage' | translate}}" cache-view="false" hide-nav-bar="{{minimal}}">
- <ion-nav-buttons side="left">
- <button class="button button-icon button-clear ion-navicon" ng-click="openMenu()"></button>
- <button class="button button-icon button-clear ion-arrow-move" ng-click="dragToggle();">&nbsp; </button>
- <button data-badge="{{$root.alarmCount}}" class="animated infinite tada button button-icon button-clear ion-ios-bell notification-badge" ng-click="handleAlarms();" ng-if="$root.isAlarm"></button>
- </ion-nav-buttons>
- <ion-nav-buttons side="right">
- <button class="button button-icon button-clear ion-loop" ng-click="resetSizes();">&nbsp; </button>
- <button class="button button-icon button-clear ion-plus-round" ng-click="sliderChanged(1);">&nbsp; </button>
- <button class="button button-icon button-clear ion-minus-round" ng-click="sliderChanged(-1);">&nbsp; </button>
- <button data-badge="{{$root.alarmCount}}" class="animated infinite tada button button-icon button-clear ion-ios-bell notification-badge" ng-click="handleAlarms();" ng-if="$root.isAlarm"></button>
- </ion-nav-buttons>
- <ion-content scroll-sista has-bouncing="false" style="background-color:#444444" delegate-handle="none" overflow-scroll="false" mouse-wheel-scroll>
- <div class="timeline_text"> {{'kFrom' | translate}}:{{prettifyDateTimeFirst(datetimeValueFrom.value)}} ({{humanizeTime(datetimeValueFrom.value)}})
-
- <div ng-if="$root.platformOS != 'ios'">({{'kChromeMax' | translate}})</div>
- </div>
- <div class="grid" id="mygrid">
- <div class="grid-sizer grid-item-10"></div>
- <!-- <span ng-repeat="monitor in MontageMonitors|limitTo: monLimit" ng- -->
- <span ng-repeat="monitor in MontageMonitors | onlyEnabledAndEventHas |limitTo: currentLimit">
+ <ion-nav-buttons side="left">
+ <button class="button button-icon button-clear ion-navicon" ng-click="openMenu()"></button>
+ <button class="button button-icon button-clear ion-arrow-move" ng-click="dragToggle();">&nbsp; </button>
+ <button data-badge="{{$root.alarmCount}}" class="animated infinite tada button button-icon button-clear ion-ios-bell notification-badge" ng-click="handleAlarms();" ng-if="$root.isAlarm"></button>
+ </ion-nav-buttons>
+ <ion-nav-buttons side="right">
+ <button class="button button-icon button-clear ion-loop" ng-click="resetSizes();">&nbsp; </button>
+ <button class="button button-icon button-clear ion-plus-round" ng-click="sliderChanged(1);">&nbsp; </button>
+ <button class="button button-icon button-clear ion-minus-round" ng-click="sliderChanged(-1);">&nbsp; </button>
+ <button data-badge="{{$root.alarmCount}}" class="animated infinite tada button button-icon button-clear ion-ios-bell notification-badge" ng-click="handleAlarms();" ng-if="$root.isAlarm"></button>
+ </ion-nav-buttons>
+ <ion-content scroll-sista has-bouncing="false" style="background-color:#444444" delegate-handle="none" overflow-scroll="false" mouse-wheel-scroll>
+ <div class="timeline_text"> {{'kFrom' | translate}}:{{prettifyDateTimeFirst(datetimeValueFrom.value)}} ({{humanizeTime(datetimeValueFrom.value)}})
+ <div ng-if="$root.platformOS != 'ios'">({{'kChromeMax' | translate}})</div>
+ </div>
+ <div class="grid" id="mygrid">
+ <div class="grid-sizer grid-item-10"></div>
+ <!-- <span ng-repeat="monitor in MontageMonitors|limitTo: monLimit" ng- -->
+ <span ng-repeat="monitor in MontageMonitors | onlyEnabledAndEventHas |limitTo: currentLimit">
<div ng-if="$root.authSession!='undefined'">
<div ng-if = "monitor.Monitor.eventUrl == 'img/noevent.png' ">
<!-- make sure we don't use id here
@@ -53,94 +52,88 @@
<i class="ion-pause"></i>&nbsp;
</span> {{monitor.Monitor.Name}}&nbsp;
-
-
- <div ng-if="sliderVal.showTimeline && $root.runMode!='lowbw'" style="white-space:nowrap;text-overflow:ellipsis;overflow:hidden;font-size:9px" class="header-event-id" id="{{monitor.Monitor.Id}}-timeline">[{{monitor.Monitor.eid}}]
-
- <i class="ion-clock"></i> {{prettifyDateTimeFirst(monitor.Monitor.eventUrlTime)}} ({{humanizeTime(monitor.Monitor.eventUrlTime)}})&nbsp;
-
- </div>
- </figcaption>
- </figure>
- <!-- wait for packery otherwise we get large ranges -->
- <div ng-show="packeryDone">
- <div class="range" style="position:absolute;top:5%;width:95%;z-index:999">
- <input on-release="seek(monitor.Monitor.Id,monitor.Monitor.sliderProgress.progress )" type="range" min="0" max="{{monitor.Monitor.eventDuration}}" ng-model="monitor.Monitor.sliderProgress.progress">
- </div>
- <div id="history_canvas_video">
- <canvas style="padding-left:23px;
+ <div ng-if="sliderVal.showTimeline && $root.runMode!='lowbw'" style="white-space:nowrap;text-overflow:ellipsis;overflow:hidden;font-size:9px" class="header-event-id" id="{{monitor.Monitor.Id}}-timeline">[{{monitor.Monitor.eid}}]
+ <i class="ion-clock"></i> {{prettifyDateTimeFirst(monitor.Monitor.eventUrlTime)}} ({{humanizeTime(monitor.Monitor.eventUrlTime)}})&nbsp;
+ </div>
+ </figcaption>
+ </figure>
+ <!-- wait for packery otherwise we get large ranges -->
+ <div ng-show="packeryDone">
+ <div class="range" style="position:absolute;top:5%;width:95%;z-index:999">
+ <input on-release="seek(monitor.Monitor.Id,monitor.Monitor.sliderProgress.progress )" type="range" min="0" max="{{monitor.Monitor.eventDuration}}" ng-model="monitor.Monitor.sliderProgress.progress">
+ </div>
+ <div id="history_canvas_video">
+ <canvas style="padding-left:23px;
padding-right:23px;z-index:998" id="eventchart-{{monitor.Monitor.Id}}" width="auto" height="20"></canvas>
- </div>
- </div>
- <div ng-if=
-"monitor.Monitor.seek" style="position:absolute;top:0px; left: 0px; width:100%;height:100%; background-color:rgba(0,0,0,0.3); z-index:99999"><div style="position:relative;top:50%;text-align:center;color:white;background-color:rgba(0,0,0,0.5);">{{'kPleaseWait' | translate}}</div></div>
- </div>
- </div>
- </div>
- <!-- valid auth session &!background -->
- <!--<div ng-if="!$root.authSession=='undefined' || isBackground()">
+ </div>
+ </div>
+ <div ng-if="monitor.Monitor.seek" style="position:absolute;top:0px; left: 0px; width:100%;height:100%; background-color:rgba(0,0,0,0.3); z-index:99999">
+ <div style="position:relative;top:50%;text-align:center;color:white;background-color:rgba(0,0,0,0.5);">{{'kPleaseWait' | translate}}</div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <!-- valid auth session &!background -->
+ <!--<div ng-if="!$root.authSession=='undefined' || isBackground()">
<img image-spinner-src="img/pausevideo.png" />
</div>-->
- </span>
- </div>
- <ion-item ng-show="!MontageMonitors.length"> {{'kNoMonitors' | translate }} </ion-item>
- </ion-content>
- <div class="bwmode" ng-if="$root.runMode=='lowbw'"> {{ 'kLowBWDisplay' | translate }} </div>
- <div ng-show="minimal">
- <nav mfb-menu position="br" effect="zoomin" label="collapse" active-icon="ion-chevron-down" resting-icon="ion-chevron-up" toggling-method="click">
- <button mfb-button icon="ion-arrow-expand" label="increase size" ng-click="changeSize(-1)"></button>
- <button mfb-button icon="ion-arrow-shrink" label="decrease size" ng-click="changeSize(1)"></button>
- <button mfb-button icon="ion-refresh" label="refresh" ng-click="reloadView();"></button>
- <button mfb-button icon="ion-close" label="exit full screen" ng-click="switchMinimal()"></button>
- </nav>
- <span class="modal-alarm-badge">
+ </span>
+ </div>
+ <ion-item ng-show="!MontageMonitors.length"> {{'kNoMonitors' | translate }} </ion-item>
+ </ion-content>
+ <div class="bwmode" ng-if="$root.runMode=='lowbw'"> {{ 'kLowBWDisplay' | translate }} </div>
+ <div ng-show="minimal">
+ <nav mfb-menu position="br" effect="zoomin" label="collapse" active-icon="ion-chevron-down" resting-icon="ion-chevron-up" toggling-method="click">
+ <button mfb-button icon="ion-arrow-expand" label="increase size" ng-click="changeSize(-1)"></button>
+ <button mfb-button icon="ion-arrow-shrink" label="decrease size" ng-click="changeSize(1)"></button>
+ <button mfb-button icon="ion-refresh" label="refresh" ng-click="reloadView();"></button>
+ <button mfb-button icon="ion-close" label="exit full screen" ng-click="switchMinimal()"></button>
+ </nav>
+ <span class="modal-alarm-badge">
<a data-badge="{{$root.alarmCount}}" class="animated infinite tada button icon ion-ios-bell notification-badge button-assertive"
ng-click="handleAlarmsWhileMinimized();" ng-if="$root.isAlarm"></a>
</span>
- </div>
- <ion-pull-up-footer class="zmPullup" on-expand="footerExpand()" on-minimize="footerCollapse()" on-collapse="footerCollapse()" initial-state="minimized" default-behavior="expand">
- <ion-pull-up-handle width="100" height="25" toggle="ion-chevron-up ion-chevron-down" style="border-radius: 25px 25px 0 0">
- <i class="icon ion-chevron-up"></i>
- </ion-pull-up-handle>
- <ion-pull-up-bar>
- <h1 class="title" ion-pull-up-trigger>{{'kEventMontage' | translate}}</h1>
- </ion-pull-up-bar>
- <ion-pull-up-content scroll="true">
- <div class="list list-inset">
- <div class="item item-divider">{{'kTimeline' | translate}} ({{getLocalTZ()}})</div>
- <div class="item item-input-inset"> {{'kFrom'|translate}}:&nbsp;
-
- <div class="row">
- <div class="col col-50">
- <label class="item-input-wrapper">
- <input ng-change="hrsChanged()" type="tel" placeholder="hours" ng-model="datetimeValueFrom.hrs">
- </label>
- </div>
- <div class="col col-50">
+ </div>
+ <ion-pull-up-footer class="zmPullup" on-expand="footerExpand()" on-minimize="footerCollapse()" on-collapse="footerCollapse()" initial-state="minimized" default-behavior="expand">
+ <ion-pull-up-handle width="100" height="25" toggle="ion-chevron-up ion-chevron-down" style="border-radius: 25px 25px 0 0">
+ <i class="icon ion-chevron-up"></i>
+ </ion-pull-up-handle>
+ <ion-pull-up-bar>
+ <h1 class="title" ion-pull-up-trigger>{{'kEventMontage' | translate}}</h1>
+ </ion-pull-up-bar>
+ <ion-pull-up-content scroll="true">
+ <div class="list list-inset">
+ <div class="item item-divider">{{'kTimeline' | translate}} ({{getLocalTZ()}})</div>
+ <div class="item item-input-inset"> {{'kFrom'|translate}}:&nbsp;
+ <div class="row">
+ <div class="col col-50">
+ <label class="item-input-wrapper">
+ <input ng-change="hrsChanged()" type="tel" placeholder="hours" ng-model="datetimeValueFrom.hrs">
+ </label>
+ </div>
+ <div class="col col-50">
&nbsp;{{'kEventHistHrs' | translate}}
</div>
- </div>
- </div>
- <ion-item>
- <div ion-datetime-picker title="From" am-pm={{!loginData.use24hr}} ng-model="datetimeValueFrom.value" ng-change="dateChanged()">
- <b>{{'kFrom' | translate }}: </b>{{datetimeValueFrom.value | date: timeFormat}}
-
- </div> ({{humanizeTime(datetimeValueFrom.value)}})
-
- </ion-item>
- <div class="row">
- <div class="col col-75">
- <br/>
- <div style="width:90%;color:black;">
- <input ng-model="sliderVal.rate" type="text" id="mySlider6" slider options="slider_modal_options_rate" />
- </div>
- <br/>
- </div>
- <div class="col col-25" style="background-color:#AEA8D3;text-align:center"> {{'kSpeed' | translate }} </div>
- </div>
- <!--<ion-item><div ion-datetime-picker am-pm={{!loginData.use24hr}} ng-model="datetimeValueTo.value"><b>{{'kTo' | translate}}: </b>{{datetimeValueTo.value | date: timeFormat}}
+ </div>
+ </div>
+ <ion-item>
+ <div ion-datetime-picker title="From" am-pm={{!loginData.use24hr}} ng-model="datetimeValueFrom.value" ng-change="dateChanged()">
+ <b>{{'kFrom' | translate }}: </b>{{datetimeValueFrom.value | date: timeFormat}}
+ </div> ({{humanizeTime(datetimeValueFrom.value)}})
+ </ion-item>
+ <div class="row">
+ <div class="col col-75">
+ <br/>
+ <div style="width:90%;color:black;">
+ <input ng-model="sliderVal.rate" type="text" id="mySlider6" slider options="slider_modal_options_rate" />
+ </div>
+ <br/>
+ </div>
+ <div class="col col-25" style="background-color:#AEA8D3;text-align:center"> {{'kSpeed' | translate }} </div>
+ </div>
+ <!--<ion-item><div ion-datetime-picker am-pm={{!loginData.use24hr}} ng-model="datetimeValueTo.value"><b>{{'kTo' | translate}}: </b>{{datetimeValueTo.value | date: timeFormat}}
</div></ion-item>-->
- </div>
- </ion-pull-up-content>
- </ion-pull-up-footer>
- </ion-view> \ No newline at end of file
+ </div>
+ </ion-pull-up-content>
+ </ion-pull-up-footer>
+</ion-view>
diff --git a/www/templates/montage.html b/www/templates/montage.html
index 9d075faf..ceab34ae 100644
--- a/www/templates/montage.html
+++ b/www/templates/montage.html
@@ -1,69 +1,42 @@
<ion-view view-title="{{'kMontage' | translate}}" cache-view="false" hide-nav-bar="{{minimal}}">
-
<ion-nav-buttons side="left">
<button class="button button-icon button-clear ion-navicon" ng-click="openMenu()"></button>
- <button class="button button-icon button-clear ion-eye" ng-click="hideUnhide();">&nbsp;
+ <button class="button button-icon button-clear ion-eye" ng-click="hideUnhide();">&nbsp;
</button>
-
-
<button class="button button-icon button-clear ion-arrow-resize" ng-click="toggleSizeButtons();">&nbsp;
</button>
-
<button data-badge="{{$root.alarmCount}}" class="animated infinite tada button button-icon button-clear ion-ios-bell notification-badge" ng-click="handleAlarms();" ng-if="$root.isAlarm"></button>
-
</ion-nav-buttons>
-
-
-
<ion-nav-buttons side="right">
<span ng-click="toggleTimeType()" class="icon montage-time">
<i ng-class="(iconTimeNow=='server')?'icon-server':'ion-ios-location'"></i>
{{timeNow}}&nbsp;</span>
-
<button class="button button-icon button-clear ion-arrow-move" ng-click="dragToggle();">&nbsp;
</button>
-
<!--
<button class="button button-icon button-clear ion-monitor" ng-click="cast();">&nbsp;
</button>
-->
-
<button class="button button-icon button-clear ion-loop" ng-click="resetSizes();">&nbsp;
</button>
-
<button class="button button-icon button-clear ion-android-contract" ng-click="switchMinimal()">
</button>
-
-
-
</ion-nav-buttons>
-
- <ion-content scroll-sista ng-cloak has-bouncing="false" style="background-color:#444444" delegate-handle="montage-delegate" overflow-scroll="false" >
-
-
-
- <span ng-if="!minimal && showSizeButtons">
+ <ion-content scroll-sista ng-cloak has-bouncing="false" style="background-color:#444444" delegate-handle="montage-delegate" overflow-scroll="false">
+ <span ng-if="!minimal && showSizeButtons">
<!-- this is header -->
<span ng-click="sliderChanged(1)" style="float:right;margin-top:0px;padding-top:8px;background-color:#5c6767;color:#fff;font-size:25px;opacity:1;width:40px;height:36px;border-radius: 0px 0px 0px 5px;">&nbsp;<i class="ion-plus-circled">&nbsp;</i></span>
-
- <span ng-click="sliderChanged(-1)" style="float:left;margin-top:0px;padding-top:8px;background-color:#5c6767;color:#fff;font-size:22px;opacity:1;width:40px;height:36px;border-radius: 0px 0px 5px 0px;">&nbsp;<i class="ion-minus-circled">&nbsp;</i></span>
- <br/><br/>
+ <span ng-click="sliderChanged(-1)" style="float:left;margin-top:0px;padding-top:8px;background-color:#5c6767;color:#fff;font-size:22px;opacity:1;width:40px;height:36px;border-radius: 0px 0px 5px 0px;">&nbsp;<i class="ion-minus-circled">&nbsp;</i></span>
+ <br/>
+ <br/>
</span>
-
-
-
-
<!-- now lets draw the montage windows -->
<div class="grid" id="mygrid">
<div class="grid-sizer grid-item-10"></div>
-
-
-
- <!-- <span ng-repeat="monitor in MontageMonitors|limitTo: monLimit"
+ <!-- <span ng-repeat="monitor in MontageMonitors|limitTo: monLimit"
ng-if="monitor.Monitor.Function!='None' && monitor.Monitor.Enabled !='0' ">-->
-
- <span ng-repeat="monitor in MontageMonitors | onlyEnabled |limitTo: monLimit" >
+ <span ng-repeat="monitor in MontageMonitors | onlyEnabled |limitTo: monLimit">
@@ -117,30 +90,18 @@
</figure>
</div>
- </span> <!-- ngrepeat -->
+ </span>
+ <!-- ngrepeat -->
</div>
-
-
-
-
-
-
<ion-item style="background-color:#444444; color:#fff;border:none;" ng-show="!MontageMonitors.length">
{{'kNoMonitors' | translate}}
</ion-item>
-
-
-
</ion-content>
-
<div class="bwmode" ng-if="$root.runMode=='lowbw'">
- {{ 'kLowBWDisplay' | translate }}
- </div>
-
-
+ {{ 'kLowBWDisplay' | translate }}
+ </div>
<div ng-show="minimal">
<nav mfb-menu position="br" effect="zoomin" label="{{'kCollapse' | translate}}" active-icon="ion-chevron-down" resting-icon="ion-chevron-up" toggling-method="click">
-
<button mfb-button icon="ion-arrow-expand" label="{{'kIncreaseSize' | translate}}" ng-click="sliderChanged(1)">
</button>
<button mfb-button icon="ion-arrow-shrink" label="{{'kDecreaseSize' | translate}}" ng-click="sliderChanged(-1)">
@@ -150,14 +111,10 @@
<button mfb-button icon="ion-close" label="{{'kExitFullScreen'| translate}}" ng-click="switchMinimal()">
</button>
</nav>
-
-
<span class="modal-alarm-badge">
<a data-badge="{{$root.alarmCount}}" class="animated infinite tada button icon ion-ios-bell notification-badge button-assertive"
ng-click="handleAlarmsWhileMinimized();" ng-if="$root.isAlarm"></a>
</span>
-
</div>
<br/>
-
-</ion-view> \ No newline at end of file
+</ion-view>
diff --git a/www/templates/news.html b/www/templates/news.html
index f4a87e4f..f715a65c 100644
--- a/www/templates/news.html
+++ b/www/templates/news.html
@@ -1,17 +1,11 @@
<ion-view view-title="{{'kNews' | translate}}">
-
<ion-nav-buttons side="left">
<button class="button button-icon button-clear ion-navicon" ng-click="openMenu()"></button>
-
<button data-badge="{{$root.alarmCount}}" class="animated infinite tada button button-icon button-clear ion-ios-bell notification-badge" ng-click="handleAlarms();" ng-if="$root.isAlarm"></button>
-
</ion-nav-buttons>
-
-
- <ion-content scroll-sista delegate-handle="none" overflow-scroll="false" mouse-wheel-scroll >
+ <ion-content scroll-sista delegate-handle="none" overflow-scroll="false" mouse-wheel-scroll>
<div class="list">
-
- <span ng-repeat = "post in newsItems">
+ <span ng-repeat="post in newsItems">
<a class="item item-text-wrap item-icon-left" ng-click="loadPost(post.url, post.date)" href="">
<i ng-class="isUnread(post.date) ? 'icon ion-email-unread': 'icon ion-ios-email-outline'"></i>
{{post.title}}
@@ -20,14 +14,9 @@
</a>
</span>
-
<div ng-if="!newsItems.length">
<ion-item>{{'kLoading' | translate}}...</ion-item>
</div>
-
-
</div>
-
</ion-content>
-
</ion-view>
diff --git a/www/templates/reorder-modal.html b/www/templates/reorder-modal.html
index f58d567c..397d4be7 100644
--- a/www/templates/reorder-modal.html
+++ b/www/templates/reorder-modal.html
@@ -1,39 +1,20 @@
-
- <ion-modal-view cache-view="false" style="width: 90%; height: 90%; top: 5%; left: 5%; right: 5%; bottom: 5%;" >
-
+<ion-modal-view cache-view="false" style="width: 90%; height: 90%; top: 5%; left: 5%; right: 5%; bottom: 5%;">
<ion-header-bar class="bar-stable">
-
-
- <h1 class="title"></h1>
- <div class="buttons">
-
-
- <button class="button button-icon icon ion-checkmark" ng-click="saveReorder()"></button>
-
- <button class="button button-icon icon ion-close" ng-click="cancelReorder()"></button>
-
- </div>
+ <h1 class="title"></h1>
+ <div class="buttons">
+ <button class="button button-icon icon ion-checkmark" ng-click="saveReorder()"></button>
+ <button class="button button-icon icon ion-close" ng-click="cancelReorder()"></button>
+ </div>
</ion-header-bar>
-
-
- <ion-content >
- <div class="list">
- <span ng-repeat="item in copyMontage">
+ <ion-content>
+ <div class="list">
+ <span ng-repeat="item in copyMontage">
<a class="item item-icon-left" ng-click="toggleHide($index)" href="">
<i ng-class="{'icon ion-eye':item.Monitor.listDisplay=='show','icon ion-eye-disabled':item.Monitor.listDisplay!='show'}"> </i>
{{item.Monitor.Name}}
</a>
</span>
- </div>
-
-
- </ion-content>
-
- </ion-modal-view>
-
-
-
-
-
-
+ </div>
+ </ion-content>
+</ion-modal-view>
diff --git a/www/templates/state.html b/www/templates/state.html
index bf0cda4a..33df994e 100644
--- a/www/templates/state.html
+++ b/www/templates/state.html
@@ -1,12 +1,10 @@
<ion-view view-title="{{'kSystemStatus' | translate}}" cache-view="false">
-
<ion-nav-buttons side="left">
<button class="button button-icon button-clear ion-navicon" ng-click="openMenu()"></button>
<button data-badge="{{$root.alarmCount}}" class="animated infinite tada button button-icon button-clear ion-ios-bell notification-badge" ng-click="handleAlarms();" ng-if="$root.isAlarm"></button>
</ion-nav-buttons>
- <ion-content scroll-sista delegate-handle="none" overflow-scroll="false" mouse-wheel-scroll>
- <ion-refresher pulling-text="{{'kPullToReload' | translate}}..."
- spinner="bubbles" on-refresh="doRefresh()"></ion-refresher>
+ <ion-content scroll-sista delegate-handle="none" overflow-scroll="false" mouse-wheel-scroll>
+ <ion-refresher pulling-text="{{'kPullToReload' | translate}}..." spinner="bubbles" on-refresh="doRefresh()"></ion-refresher>
<ion-list>
<ion-item>
<div class="row">
@@ -28,7 +26,6 @@
<i class="ion-arrow-graph-up-right" style="font-size:150%;"></i>
</div>
<div class="col">
-
ZoneMinder {{'kLoad' | translate}}:
</div>
<div class="col" style="text-align:right;">
@@ -54,20 +51,15 @@
</ion-item>
-->
<ion-item>
- <button class="button button-full {{dangerButtonColor[showDanger?1:0]}}"
- ng-click="showDanger=!showDanger">
+ <button class="button button-full {{dangerButtonColor[showDanger?1:0]}}" ng-click="showDanger=!showDanger">
<i class="ion-alert-circled" "style:font-size:300%;"></i> {{dangerText[showDanger?1:0]}}
</button>
-
- <div ng-show="showDanger" >
+ <div ng-show="showDanger">
<div class="row">
<div class="col text-center">
- <a class="button button-small button-outline button-dark "
- ng-click="selectCustomState();" href="">{{'kChangeState'|translate}}</a>
- <a class="button button-small button-outline button-dark "
- ng-click="controlZM('restart');" href="">{{'kRestart' | translate}}</a>
- <a class="button button-small button-outline button-dark"
- href="" ng-click="controlZM('stop');">{{'kStop' | translate}}</a>
+ <a class="button button-small button-outline button-dark " ng-click="selectCustomState();" href="">{{'kChangeState'|translate}}</a>
+ <a class="button button-small button-outline button-dark " ng-click="controlZM('restart');" href="">{{'kRestart' | translate}}</a>
+ <a class="button button-small button-outline button-dark" href="" ng-click="controlZM('stop');">{{'kStop' | translate}}</a>
<a class="button button-small button-outline button-dark" ng-click="controlZM('start');" href="">{{'kStart' | translate}}</a>
</div>
</div>
diff --git a/www/templates/timeline-modal.html b/www/templates/timeline-modal.html
index b27c749b..afed79f5 100644
--- a/www/templates/timeline-modal.html
+++ b/www/templates/timeline-modal.html
@@ -1,36 +1,26 @@
-
-
- <!-- style="width: 90%; height: 90%; top: 5%; left: 5%; right: 5%; bottom: 5%;"-->
- <ion-modal-view cache-view="false" >
-
- <ion-content ng-cloak on-double-tap="closeModal()" delegate-handle="timeline-modal-delegate">
-<div ng-controller="TimelineModalCtrl" >
+<!-- style="width: 90%; height: 90%; top: 5%; left: 5%; right: 5%; bottom: 5%;"-->
+<ion-modal-view cache-view="false">
+ <ion-content ng-cloak on-double-tap="closeModal()" delegate-handle="timeline-modal-delegate">
+ <div ng-controller="TimelineModalCtrl">
<br/>
<div class="item item-divider">{{mName}}&nbsp;<i class="ion-arrow-right-b"></i>&nbsp;{{'kEvent' | translate}}:{{eid}} ({{humanizeTime}})
- <button class="button icon-left button-small button-positive" style="float:right; opacity:0.7" ng-click="switchType()">
- <i class="ion-shuffle"></i>
+ <button class="button icon-left button-small button-positive" style="float:right; opacity:0.7" ng-click="switchType()">
+ <i class="ion-shuffle"></i>
</button>
-
</div>
-
- <center> <h5>{{'kEvent' | translate}} {{graphType}} {{'kFrames' | translate}} </h5>
+ <center>
+ <h5>{{'kEvent' | translate}} {{graphType}} {{'kFrames' | translate}} </h5>
<p>{{'kTimelineMessage' | translate}}</p>
-
-
- {{errorDetails}}
+ {{errorDetails}}
<!--<p>scroll left/right if needed</p>-->
- </center>
-
- <div data-tap-disabled="true">
- <canvas id="tcchart" width="auto" height="70%"></canvas>
- </div>
-
-
- <ion-spinner icon="spiral" style="position:absolute; top:50%;left:50%" ng-if="!dataReady"></ion-spinner>
-
+ </center>
+ <div data-tap-disabled="true">
+ <canvas id="tcchart" width="auto" height="70%"></canvas>
+ </div>
+ <ion-spinner icon="spiral" style="position:absolute; top:50%;left:50%" ng-if="!dataReady"></ion-spinner>
<div style="height:190px;">
<!-- <ion-scroll direction="x" class="wide-as-needed">-->
- <span ng-repeat="alarm in alarm_images">
+ <span ng-repeat="alarm in alarm_images">
<figure style="display:inline-block">
@@ -44,14 +34,8 @@
</figure>
</span>
-
<!--</ion-scroll>-->
</div>
- </div>
- </ion-content>
-
- </ion-modal-view>
-
-
-
-
+ </div>
+ </ion-content>
+</ion-modal-view>
diff --git a/www/templates/timeline-popover.html b/www/templates/timeline-popover.html
index b5460f57..beeb482d 100644
--- a/www/templates/timeline-popover.html
+++ b/www/templates/timeline-popover.html
@@ -1,26 +1,18 @@
<ion-popover-view class="fit">
- <ion-content>
- <div class="list" ng-click="popover.hide()">
-
+ <ion-content>
+ <div class="list" ng-click="popover.hide()">
<a class="item" ng-href="" ng-click="popover.hide();toggleMinAlarmFrameCount();" ng-if="loginData.enableAlarmCount">{{'kShowAllEvents' | translate}}</a>
- <a class="item" ng-href="" ng-click="popover.hide();toggleMinAlarmFrameCount();" ng-if="!loginData.enableAlarmCount"> {{'kShowAlarmedEvents' | translate}}</a>
-
-
+ <a class="item" ng-href="" ng-click="popover.hide();toggleMinAlarmFrameCount();" ng-if="!loginData.enableAlarmCount"> {{'kShowAlarmedEvents' | translate}}</a>
<a class="item" ng-href="" ng-click="popover.hide();buttonClicked(0);">{{'kMonth' | translate}}</a>
-
- <a class="item" ng-href="" ng-click=" popover.hide();buttonClicked(1);" >
+ <a class="item" ng-href="" ng-click=" popover.hide();buttonClicked(1);">
{{'kWeek' | translate}}
</a>
<a class="item" ng-href="" ng-click="popover.hide();buttonClicked(2);">
{{'kDay' | translate}}
</a>
-
- <a class="item" ng-href="" ng-click="popover.hide();buttonClicked(3);">
+ <a class="item" ng-href="" ng-click="popover.hide();buttonClicked(3);">
{{'kCustomRange' | translate}}
</a>
-
-
- </div>
- </ion-content>
- </ion-popover-view>
-
+ </div>
+ </ion-content>
+</ion-popover-view>
diff --git a/www/templates/wizard.html b/www/templates/wizard.html
index fe69f595..600f4a7f 100644
--- a/www/templates/wizard.html
+++ b/www/templates/wizard.html
@@ -1,116 +1,85 @@
-<ion-view view-title="{{'kWizard' | translate}}" ng-cloak cache-view="false" >
-
+<ion-view view-title="{{'kWizard' | translate}}" ng-cloak cache-view="false">
<ion-nav-buttons side="left">
<button class="button button-icon button-clear ion-navicon" ng-click="openMenu()"></button>
</ion-nav-buttons>
-
-
<ion-content class="padding" overflow-scroll="false">
-
- <wizard on-finish="finishedWizard()">
-
- <!-- portal url -->
- <wz-step wz-title="1" canexit="exitPortal">
-
- <h4><i id="transition-delay" class="animated swing ion-wand" style="font-size:2em"></i> {{'kWelcomeWizard' | translate}}</h4>
- <img src="img/wizard.svg" width="100px" style="float:left"/>
- <p>{{'kWizConfigPain' | translate}}</p>
-
- <h4>{{'kWizPortalUrl' | translate}}</h4>
- <label class="item item-input">
- <input autocorrect="off" autocapitalize="none" autocomplete="off" type="text" placeholder="e.g. http://server/zm" ng-model="wizard.portalurl">
- </label>
- <p ng-if="$root.platformOS=='android'" style="font-size:0.8em; color:gray">{{'kDisableSamsung' | translate}}</p>
-
- <a class="button icon-left ion-information-circled button-clear button-dark" ng-click="toggleTip()">{{wizard.tiptext}}</a>
-
-
- <div class="wizardtip" ng-show="wizard.tipshow">
- <b>{{'kWizTip' | translate}}: </b>{{'kWizPortalTip' | translate}}<br/>
-
- <img src="img/portalurl.png" width="30%">
- </div>
-
- <br/>
- <button class="button button-small icon icon-right ion-chevron-right" wz-next>{{'kNext' | translate}}</button>
-
-
- </wz-step>
-
-
- <!-- auth mode -->
- <wz-step wz-title="2" >
- <h4>{{'kWizPortalAuth' | translate}}</h4>
- <!--<img src="img/wizard.svg" width="100px" style="float:left"/>-->
- <p>{{'kWizPortalText' | translate}}</p>
- <ion-toggle ng-change="toggleAuth()" ng-model="wizard.useauth" ng-checked="wizard.useauth" toggle-class="toggle-calm">{{'kWizUseAuth' | translate}}</ion-toggle>
-
- <ion-toggle ng-show="wizard.useauth" ng-model="wizard.usezmauth" ng-checked="wizard.usezmauth" toggle-class="toggle-calm">{{'kWizZMAuth' | translate}}</ion-toggle>
-
- <div ng-if="wizard.usezmauth">
- <label class="item item-input item-floating-label" >
+ <wizard on-finish="finishedWizard()">
+ <!-- portal url -->
+ <wz-step wz-title="1" canexit="exitPortal">
+ <h4><i id="transition-delay" class="animated swing ion-wand" style="font-size:2em"></i> {{'kWelcomeWizard' | translate}}</h4>
+ <img src="img/wizard.svg" width="100px" style="float:left" />
+ <p>{{'kWizConfigPain' | translate}}</p>
+ <h4>{{'kWizPortalUrl' | translate}}</h4>
+ <label class="item item-input">
+ <input autocorrect="off" autocapitalize="none" autocomplete="off" type="text" placeholder="e.g. http://server/zm" ng-model="wizard.portalurl">
+ </label>
+ <p ng-if="$root.platformOS=='android'" style="font-size:0.8em; color:gray">{{'kDisableSamsung' | translate}}</p>
+ <a class="button icon-left ion-information-circled button-clear button-dark" ng-click="toggleTip()">{{wizard.tiptext}}</a>
+ <div class="wizardtip" ng-show="wizard.tipshow">
+ <b>{{'kWizTip' | translate}}: </b>{{'kWizPortalTip' | translate}}
+ <br/>
+ <img src="img/portalurl.png" width="30%">
+ </div>
+ <br/>
+ <button class="button button-small icon icon-right ion-chevron-right" wz-next>{{'kNext' | translate}}</button>
+ </wz-step>
+ <!-- auth mode -->
+ <wz-step wz-title="2">
+ <h4>{{'kWizPortalAuth' | translate}}</h4>
+ <!--<img src="img/wizard.svg" width="100px" style="float:left"/>-->
+ <p>{{'kWizPortalText' | translate}}</p>
+ <ion-toggle ng-change="toggleAuth()" ng-model="wizard.useauth" ng-checked="wizard.useauth" toggle-class="toggle-calm">{{'kWizUseAuth' | translate}}</ion-toggle>
+ <ion-toggle ng-show="wizard.useauth" ng-model="wizard.usezmauth" ng-checked="wizard.usezmauth" toggle-class="toggle-calm">{{'kWizZMAuth' | translate}}</ion-toggle>
+ <div ng-if="wizard.usezmauth">
+ <label class="item item-input item-floating-label">
+ <span class="input-label">{{'kUserName' | translate}}</span>
+ <input autocorrect="off" autocapitalize="none" autocomplete="off" type="text" ng-model="wizard.zmuser" placeholder="{{'kPlaceHolderZMAuthUser'|translate}}">
+ </label>
+ <label class="item item-text-wrap item-input item-floating-label">
+ <span class="input-label">{{'kPassword' | translate}}</span>
+ <input type="password" ng-model="wizard.zmpassword" placeholder="{{'kPlaceHolderZMAuthPass'|translate}}">
+ <!--<p >{{'kWizPasswdNote' | translate}}</p>-->
+ </label>
+ </div>
+ <ion-toggle ng-show="wizard.useauth" ng-model="wizard.usebasicauth" ng-checked="wizard.usebasicauth" toggle-class="toggle-calm">{{'kWizBasicAuth' | translate}}</ion-toggle>
+ <label class="item item-input item-floating-label" ng-show="wizard.usebasicauth">
<span class="input-label">{{'kUserName' | translate}}</span>
- <input autocorrect="off" autocapitalize="none" autocomplete="off" type="text" ng-model="wizard.zmuser" placeholder="{{'kPlaceHolderZMAuthUser'|translate}}" >
+ <input autocorrect="off" autocapitalize="none" autocomplete="off" type="text" ng-model="wizard.basicuser" placeholder="{{'kPlaceHolderBasicAuthUser'|translate}}">
</label>
- <label class="item item-text-wrap item-input item-floating-label" >
+ <label class="item item-input item-text-wrap item-floating-label" ng-show="wizard.usebasicauth">
<span class="input-label">{{'kPassword' | translate}}</span>
- <input type="password" ng-model="wizard.zmpassword" placeholder="{{'kPlaceHolderZMAuthPass'|translate}}" >
- <!--<p >{{'kWizPasswdNote' | translate}}</p>-->
+ <input type="password" ng-model="wizard.basicpassword" placeholder="{{'kPlaceHolderBasicAuthPass'|translate}}">
+ <p>{{'kWizPasswdNote' | translate}}</p>
</label>
- </div>
-
- <ion-toggle ng-show="wizard.useauth" ng-model="wizard.usebasicauth" ng-checked="wizard.usebasicauth" toggle-class="toggle-calm">{{'kWizBasicAuth' | translate}}</ion-toggle>
- <label class="item item-input item-floating-label" ng-show="wizard.usebasicauth">
- <span class="input-label">{{'kUserName' | translate}}</span>
- <input autocorrect="off" autocapitalize="none" autocomplete="off" type="text" ng-model="wizard.basicuser" placeholder="{{'kPlaceHolderBasicAuthUser'|translate}}" >
- </label>
- <label class="item item-input item-text-wrap item-floating-label" ng-show="wizard.usebasicauth">
- <span class="input-label">{{'kPassword' | translate}}</span>
- <input type="password" ng-model="wizard.basicpassword" placeholder="{{'kPlaceHolderBasicAuthPass'|translate}}" >
- <p>{{'kWizPasswdNote' | translate}}</p>
- </label>
-
-
- <a class="button icon-left ion-information-circled button-clear button-dark" ng-click="toggleTip()">{{wizard.tiptext}}</a>
-
-
- <div class="wizardtip" ng-show="wizard.tipshow">
- <b>{{'kWizTip'| translate}} </b> {{'kWizAuthText1' | translate}}<br/>
- {{'kWizAuthText2' | translate}}
- </div>
-
- <br/>
- <button class="button button-small icon icon-left ion-chevron-left" wz-previous>{{'kPrev' | translate}}</button>
- <button class="button button-small icon icon-right ion-chevron-right" ng-click="exitAuth()">{{'kNext' | translate}}</button>
-
- </wz-step>
-
-
- <wz-step wz-title="3" >
- <br/><br/>
- <h4>{{'kWizResults' | translate}}</h4>
-
- <span ng-if="wizard.portalValidText" style="color:{{wizard.portalColor}};"><i ng-class="wizard.portalColor=='#16a085' ? 'ion-checkmark-circled':'ion-close-circled'"></i>&nbsp;{{wizard.portalValidText}}<br/></span>
-
- <span ng-if="wizard.apiValidText" style="color:{{wizard.apiColor}};"><i ng-class=" wizard.apiColor=='#16a085' ? 'ion-checkmark-circled':'ion-close-circled'"></i>&nbsp;{{wizard.apiValidText}}<br/></span>
-
- <span ng-if="wizard.streamingValidText" style="color:{{wizard.streamingColor}};"><i ng-class="wizard.streamingColor=='#16a085' ? 'ion-checkmark-circled':'ion-close-circled'"></i>&nbsp;{{wizard.streamingValidText}}<br/></span>
-
- <br/>
- <div class="wizardtip">
- {{'kWizNextStep1' | translate}}:
- <ul class="wiz-list">
- <li>{{'kWizNextStep2' | translate}}</li>
- <li>{{'kWizNextStep3' | translate}}</li>
- </ul>
- </div>
- <br/><br/>
- <button class="button button-small icon icon-left ion-chevron-left" wz-previous>{{'kPrev' | translate}}</button>
- <button class="button button-small icon icon-right ion-chevron-right" ng-click="gotoLoginState()">{{'kWizGotoLogin' | translate}}</button>
- </wz-step>
-
-
-</wizard>
+ <a class="button icon-left ion-information-circled button-clear button-dark" ng-click="toggleTip()">{{wizard.tiptext}}</a>
+ <div class="wizardtip" ng-show="wizard.tipshow">
+ <b>{{'kWizTip'| translate}} </b> {{'kWizAuthText1' | translate}}
+ <br/> {{'kWizAuthText2' | translate}}
+ </div>
+ <br/>
+ <button class="button button-small icon icon-left ion-chevron-left" wz-previous>{{'kPrev' | translate}}</button>
+ <button class="button button-small icon icon-right ion-chevron-right" ng-click="exitAuth()">{{'kNext' | translate}}</button>
+ </wz-step>
+ <wz-step wz-title="3">
+ <br/>
+ <br/>
+ <h4>{{'kWizResults' | translate}}</h4>
+ <span ng-if="wizard.portalValidText" style="color:{{wizard.portalColor}};"><i ng-class="wizard.portalColor=='#16a085' ? 'ion-checkmark-circled':'ion-close-circled'"></i>&nbsp;{{wizard.portalValidText}}<br/></span>
+ <span ng-if="wizard.apiValidText" style="color:{{wizard.apiColor}};"><i ng-class=" wizard.apiColor=='#16a085' ? 'ion-checkmark-circled':'ion-close-circled'"></i>&nbsp;{{wizard.apiValidText}}<br/></span>
+ <span ng-if="wizard.streamingValidText" style="color:{{wizard.streamingColor}};"><i ng-class="wizard.streamingColor=='#16a085' ? 'ion-checkmark-circled':'ion-close-circled'"></i>&nbsp;{{wizard.streamingValidText}}<br/></span>
+ <br/>
+ <div class="wizardtip">
+ {{'kWizNextStep1' | translate}}:
+ <ul class="wiz-list">
+ <li>{{'kWizNextStep2' | translate}}</li>
+ <li>{{'kWizNextStep3' | translate}}</li>
+ </ul>
+ </div>
+ <br/>
+ <br/>
+ <button class="button button-small icon icon-left ion-chevron-left" wz-previous>{{'kPrev' | translate}}</button>
+ <button class="button button-small icon icon-right ion-chevron-right" ng-click="gotoLoginState()">{{'kWizGotoLogin' | translate}}</button>
+ </wz-step>
+ </wizard>
</ion-content>
-
-</ion-view> \ No newline at end of file
+</ion-view>
diff --git a/www/templates/zm-portal-login.html b/www/templates/zm-portal-login.html
index 9d2db867..877dbb97 100644
--- a/www/templates/zm-portal-login.html
+++ b/www/templates/zm-portal-login.html
@@ -1,8 +1,5 @@
-
<ion-view view-title="{{$root.appName}}" hide-nav-bar="true" hide-back-button="true" cache-view="false">
-
<ion-content class="pin-background" scroll="false">
-
<div style="margin-left:20px; margin-right:20px">
<center>
<br/>
@@ -10,23 +7,20 @@
<div id="responsive-image">
<img src="img/authlogo.png">
</div>
-
<div ng-if="pinPrompt">
<span style="color:white">{{'kEnterPin' | translate}}</span>
-
<div class="pinCode">
<input id="pin-box" type="number" pattern="[0-9]*" ng-model="pindata.pin" ng-keyup="pinChange()" />
</div>
-
<br/> <span style="color:white">{{pindata.status}}</span>
<br/>
<button class="button button-dark icon ion-unlocked" ng-click="unlock()"> Unlock
</button>
</div>
- <div id = "really-your-fault" class="animated fadeIn" style="color:white">{{'kPortalNotice' | translate}}<br/><br/>{{'kPortalNoticeSub' | translate}}</div>
-
+ <div id="really-your-fault" class="animated fadeIn" style="color:white">{{'kPortalNotice' | translate}}
+ <br/>
+ <br/>{{'kPortalNoticeSub' | translate}}</div>
</center>
</div>
-
</ion-content>
-</ion-view> \ No newline at end of file
+</ion-view>