summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--config.xml2
-rw-r--r--package.json3
-rw-r--r--plugins/fetch.json28
-rw-r--r--www/css/style.css1187
-rw-r--r--www/index.html2
-rw-r--r--www/js/DataModel.js78
-rw-r--r--www/js/EventCtrl.js24
-rw-r--r--www/js/EventModalCtrl.js61
-rw-r--r--www/js/EventsModalGraphCtrl.js24
-rw-r--r--www/js/LoginCtrl.js4
-rw-r--r--www/js/MonitorModalCtrl.js2
-rw-r--r--www/js/MontageCtrl.js82
-rw-r--r--www/js/MontageHistoryCtrl.js24
-rw-r--r--www/js/TimelineModalCtrl.js24
-rw-r--r--www/js/app.js72
-rw-r--r--www/lang/locale-en.json4
-rw-r--r--www/templates/devoptions.html4
-rw-r--r--www/templates/events-modal.html2
-rw-r--r--www/templates/events.html10
-rw-r--r--www/templates/login.html163
-rw-r--r--www/templates/monitors-modal.html2
-rw-r--r--www/templates/montage-history.html6
-rw-r--r--www/templates/montage.html11
23 files changed, 914 insertions, 905 deletions
diff --git a/config.xml b/config.xml
index c7a5e5f7..917d2e63 100644
--- a/config.xml
+++ b/config.xml
@@ -1,5 +1,5 @@
<?xml version='1.0' encoding='utf-8'?>
-<widget android-packageName="com.pliablepixels.zmninja_pro" id="com.pliablepixels.zmninjapro" ios-CFBundleIdentifier="com.pliablepixels.zmninja-pro" version="1.2.19" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
+<widget android-packageName="com.pliablepixels.zmninja_pro" id="com.pliablepixels.zmninjapro" ios-CFBundleIdentifier="com.pliablepixels.zmninja-pro" version="1.2.22" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
<name>zmNinja</name>
<description>
High performance ZoneMinder client
diff --git a/package.json b/package.json
index acb0583a..f0562c23 100644
--- a/package.json
+++ b/package.json
@@ -82,7 +82,8 @@
"locator": "https://github.com/hypery2k/cordova-certificate-plugin",
"id": "cordova-plugin-certificates"
},
- "cordova-plugin-android-permissions"
+ "cordova-plugin-android-permissions",
+ "cordova-plugin-network-information"
],
"cordovaPlatforms": [
{},
diff --git a/plugins/fetch.json b/plugins/fetch.json
index 44bf03fa..cc57eaac 100644
--- a/plugins/fetch.json
+++ b/plugins/fetch.json
@@ -99,14 +99,6 @@
"is_top_level": true,
"variables": {}
},
- "cordova-plugin-statusbar": {
- "source": {
- "type": "registry",
- "id": "cordova-plugin-statusbar"
- },
- "is_top_level": true,
- "variables": {}
- },
"com.telerik.plugins.nativepagetransitions": {
"source": {
"type": "git",
@@ -186,6 +178,22 @@
"is_top_level": true,
"variables": {}
},
+ "cordova-plugin-android-permissions": {
+ "source": {
+ "type": "registry",
+ "id": "cordova-plugin-android-permissions"
+ },
+ "is_top_level": true,
+ "variables": {}
+ },
+ "cordova-plugin-network-information": {
+ "source": {
+ "type": "registry",
+ "id": "cordova-plugin-network-information"
+ },
+ "is_top_level": true,
+ "variables": {}
+ },
"cordova-plugin-certificates": {
"source": {
"type": "git",
@@ -195,10 +203,10 @@
"is_top_level": true,
"variables": {}
},
- "cordova-plugin-android-permissions": {
+ "cordova-plugin-statusbar": {
"source": {
"type": "registry",
- "id": "cordova-plugin-android-permissions"
+ "id": "cordova-plugin-statusbar"
},
"is_top_level": true,
"variables": {}
diff --git a/www/css/style.css b/www/css/style.css
index c1c78f1e..9fb19658 100644
--- a/www/css/style.css
+++ b/www/css/style.css
@@ -1,200 +1,153 @@
@font-face {
font-family: 'fontawesome';
- src:url('../lib/font-awesome/fonts/fontawesome-webfont.eot');
- src:url('../lib/font-awesome/fonts/fontawesome-webfont.eot') format('embedded-opentype'),
- url('../lib/font-awesome/fonts/fontawesome-webfont.woff') format('woff'),
- url('../lib/font-awesome/fonts/fontawesome-webfont.ttf') format('truetype'),
- url('../lib/font-awesome/fonts/fontawesome-webfont.svg') format('svg');
+ src: url('../lib/font-awesome/fonts/fontawesome-webfont.eot');
+ src: url('../lib/font-awesome/fonts/fontawesome-webfont.eot') format('embedded-opentype'), url('../lib/font-awesome/fonts/fontawesome-webfont.woff') format('woff'), url('../lib/font-awesome/fonts/fontawesome-webfont.ttf') format('truetype'), url('../lib/font-awesome/fonts/fontawesome-webfont.svg') format('svg');
font-weight: normal;
font-style: normal;
}
-
.icon-super-speed:before {
font-family: "fontawesome";
content: "\f135";
}
-
-
.icon-normal-speed:before {
font-family: "fontawesome";
content: "\f1b9";
}
-
.icon-faster:before {
font-family: "fontawesome";
content: "\f101";
}
-
-
-
.icon-slower:before {
font-family: "fontawesome";
content: "\f100";
}
-
-
-.image-loader-container
-{
- position:relative;
- width:100%;
- height:100%;
+.image-loader-container {
+ position: relative;
+ width: 100%;
+ height: 100%;
}
-
-image-loader
-{
- position:absolute;
- top:50%;
- left:50%;
- z-index:999;
+image-loader {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ z-index: 999;
}
-
-
.vis-time-axis .grid.vis-odd {
background: #f5f5f5;
- }
-
-.my-vis-font
-{
- font-size:10px;
}
-
+.my-vis-font {
+ font-size: 10px;
+}
.my-vis-buttons {
- position: absolute;
- top: 0;
- right: 0;
- margin: 10px;
- z-index: 9999;
- }
-
+ position: absolute;
+ top: 0;
+ right: 0;
+ margin: 10px;
+ z-index: 9999;
+}
ion-popover-view.fit {
- height: auto;
+ height: auto;
}
-
ion-popover-view.fit ion-content {
- position: relative;
+ position: relative;
}
-
.platform-android ion-popover-view.fit {
- margin-top: 10px;
+ margin-top: 10px;
}
-
.platform-ios ion-popover-view.fit {
- padding-top: 10px;
- padding-bottom: 10px;
+ padding-top: 10px;
+ padding-bottom: 10px;
}
/* Using this for full screen modals for event and monitor mode */
-.modal{
- top: 0 ;
- bottom: 0 ;
- left: 0 ;
- right: 0 ;
- width: 100%
-}
-
-
-
+.modal {
+ top: 0;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ width: 100%
+}
/* I am using flexboxes to dynamicall adapt content
in montage view.
Credit: https://css-tricks.com/snippets/css/a-guide-to-flexbox/
*/
+
.wrapper {
display: -webkit-box;
display: -moz-box;
display: -ms-flexbox;
display: -webkit-flex;
display: flex;
-
-webkit-flex-flow: row wrap;
flex-flow: row wrap;
-
font-weight: normal;
text-align: left;
- flex-wrap:wrap;
-
+ flex-wrap: wrap;
}
-
.wrapper > * {
/*padding: 5px;*/
/*flex: 1 100%; -- I commented this out - the wrapper was taking up full width in Chrome*/
}
-
.header {
background: #333333;
- color:#cccccc;
+ color: #cccccc;
border-color: #444444;
- border-style: solid;
- border-width:1px;
- opacity:80%;
+ border-style: solid;
+ border-width: 1px;
+ opacity: 80%;
}
-
.header-event-id {
background: #9b59b6;
- color:#cccccc;
+ color: #cccccc;
border-color: #9b59b6;
- border-style: solid;
- border-width:1px;
- opacity:80%;
+ border-style: solid;
+ border-width: 1px;
+ opacity: 80%;
}
-
-
.header-paused {
background: #ba3e3e;
- color:#cccccc;
+ color: #cccccc;
border-color: #ba3e3e;
- border-style: solid;
- border-width:1px;
- opacity:80%;
+ border-style: solid;
+ border-width: 1px;
+ opacity: 80%;
transform: translate(-50%, -50%);
-
}
-
-
-
-
.alarmed-header {
background: #ba3e3e;
- color:#ffffff;
+ color: #ffffff;
border-color: #ba3e3e;
- border-style: solid;
- border-width:1px;
- opacity:80%;
-
+ border-style: solid;
+ border-width: 1px;
+ opacity: 80%;
}
-
.minimized-alarmed-header {
background: #ba3e3e;
- color:#ffffff;
+ color: #ffffff;
border-color: #ba3e3e;
- border-style: solid;
- border-width:5px;
- opacity:80%;
- position:absolute;
- top:0px;
- left:0px;
- width:100%;
-
+ border-style: solid;
+ border-width: 5px;
+ opacity: 80%;
+ position: absolute;
+ top: 0px;
+ left: 0px;
+ width: 100%;
}
-
-#slowpulse
-{
+#slowpulse {
-webkit-animation-duration: 1500ms;
}
.alarmed-body {
border-left: thick solid #ba3e3e;
-
}
-
.alarmed-footer {
background: #ba3e3e;
- border-color:#ba3e3e;
- color:#ffffff;
- border-width:1px;
+ border-color: #ba3e3e;
+ color: #ffffff;
+ border-width: 1px;
/*padding:2px;*/
}
-
.main {
text-align: center;
/*background: #5a5a5a;*/
@@ -203,21 +156,15 @@ Credit: https://css-tricks.com/snippets/css/a-guide-to-flexbox/
padding: 0px;
/*padding:2px;*/
}
-
.aside-1 {
background: gold;
}
-
.aside-2 {
background: hotpink;
}
-
-
figure {
- position: relative;
-
+ position: relative;
}
-
figure img {
display: block;
width: 100%;
@@ -226,58 +173,49 @@ figure img {
figcaption {
overflow: hidden;
text-overflow: ellipsis;
- white-space:nowrap;
-
+ white-space: nowrap;
}
-
.normal-figcaption {
- background: rgba(0,0,0,0.2);
+ background: rgba(0, 0, 0, 0.2);
color: #FFF;
position: absolute;
bottom: 0;
left: 0;
right: 0;
- opacity:1;
-
+ opacity: 1;
}
-
.alarmed-figcaption {
-
background: #ba3e3e;
- color:#ffffff;
- position:absolute;
+ color: #ffffff;
+ position: absolute;
bottom: 0;
left: 0;
right: 0;
- opacity:0.7;
-
-
+ opacity: 0.7;
}
-
-
-
/* modified from:
http://www.cssportal.com/tryit/index.php?file=blog/css-notification-badge */
.notification-badge {
- position:relative;
- }
- .notification-badge[data-badge]:after {
- content:attr(data-badge);
- position:absolute;
- top:-3px;
- left:18px;
- font-size:9px;
- background:crimson;
- color:white;
- width:22px;height:17px;
- text-align:center;
- line-height:17px;
- border-radius:40%;
- font-weight:bold;
-
- }
+ position: relative;
+}
+.notification-badge[data-badge]:after {
+ content: attr(data-badge);
+ position: absolute;
+ top: -3px;
+ left: 18px;
+ font-size: 9px;
+ background: crimson;
+ color: white;
+ width: 22px;
+ height: 17px;
+ text-align: center;
+ line-height: 17px;
+ border-radius: 40%;
+ font-weight: bold;
+}
+
/*
.notification-badge{
@@ -290,26 +228,23 @@ http://www.cssportal.com/tryit/index.php?file=blog/css-notification-badge */
font-size: 8px;
}*/
-
.missingnetwork {
- position: fixed; /* or absolute */
- bottom: 95%;
- right: 95%;
- transform: translate(-50%, -50%);
+ position: fixed;
+ /* or absolute */
+ bottom: 95%;
+ right: 95%;
+ transform: translate(-50%, -50%);
}
-
.ptzcentered {
- position: fixed; /* or absolute */
- top: 50%;
- left: 50%;
+ position: fixed;
+ /* or absolute */
+ top: 50%;
+ left: 50%;
transform: translate(-50%, -50%);
}
-
.timeline_text {
- text-align:center;
- color:white;
-
-
+ text-align: center;
+ color: white;
}
/* // not using for now, may come in handy later
@@ -321,286 +256,250 @@ http://www.cssportal.com/tryit/index.php?file=blog/css-notification-badge */
transform: translate(-50%, -50%);
}*/
-.ptzcenteredbotbutton
-{
+.ptzcenteredbotbutton {
position: absolute;
- top: 80%;
- left:50%;
+ top: 80%;
+ left: 50%;
transform: translate(-50%, -50%);
}
-
-.ptzpresetbuttons
-{
+.ptzpresetbuttons {
position: absolute;
top: 5%;
left: 10%;
width: 80%;
-
-
}
-
-
.timelinebuttons {
- position: fixed; /* or absolute */
- bottom:130px;
- left: 50%;
- transform: translate(-50%, -50%);
- z-index:99999;
+ position: fixed;
+ /* or absolute */
+ bottom: 130px;
+ left: 50%;
+ transform: translate(-50%, -50%);
+ z-index: 99999;
}
-
-.eventprogress
-{
- position:absolute;
+.eventprogress {
+ position: absolute;
-webkit-transform: rotate(-90deg) translateY(-1000%);
-webkit-transform-origin: 100% 0%;
-moz-transform: rotate(-90deg);
top: 50%;
- margin-top:-50px;
- left:100%;
- margin-left:-15px;
- z-index:10;
- width:100px;
-
+ margin-top: -50px;
+ left: 100%;
+ margin-left: -15px;
+ z-index: 10;
+ width: 100px;
}
-
-.camera-icon
-{
- position:absolute;
- bottom:20px;
- left:10px;
- z-index:10;
- opacity:0.7;
+.camera-icon {
+ position: absolute;
+ bottom: 20px;
+ left: 10px;
+ z-index: 10;
+ opacity: 0.7;
}
-
-.desktop-zoom-icon
-{
- position:absolute;
- bottom:20px;
- left:70px;
- z-index:10;
- opacity:0.7;
+.desktop-zoom-icon {
+ position: absolute;
+ bottom: 20px;
+ left: 70px;
+ z-index: 10;
+ opacity: 0.7;
}
-
-.modal-alarm-badge
-{
- position:absolute;
- bottom:20px;
+.modal-alarm-badge {
+ position: absolute;
+ bottom: 20px;
left: 100px;
-
- z-index:10;
- opacity:0.7;
+ z-index: 10;
+ opacity: 0.7;
}
-
-
-.event-modal-alarm-badge
-{
- position:absolute;
-
+.event-modal-alarm-badge {
+ position: absolute;
left: 10px;
- bottom:10px;
- z-index:10;
- opacity:1;
+ bottom: 10px;
+ z-index: 10;
+ opacity: 1;
}
-
-
-.events-modal-gapless-icon
-{
- position:absolute;
- bottom:120px;
- left:20px;
- z-index:10;
- opacity:0.5;
+.events-modal-gapless-icon {
+ position: absolute;
+ bottom: 120px;
+ left: 20px;
+ z-index: 10;
+ opacity: 0.5;
}
-
-.popup80 .popup
-{
- width:80% !important;
+.popup80 .popup {
+ width: 80% !important;
}
-
-.popup90 .popup
-{
- width:90% !important;
+.popup90 .popup {
+ width: 90% !important;
}
-
-.popup95 .popup
-{
- width:95% !important;
+.popup95 .popup {
+ width: 95% !important;
}
-
-.events-modal-camera-icon
-{
- position:absolute;
- bottom:120px;
- left:110px;
- z-index:10;
- opacity:0.5;
+.events-modal-camera-icon {
+ position: absolute;
+ bottom: 120px;
+ left: 110px;
+ z-index: 10;
+ opacity: 0.5;
}
-
-.events-modal-onlyalarms-icon
-{
- position:absolute;
- bottom:120px;
- left:140px;
- z-index:10;
- opacity:0.5;
+.events-modal-onlyalarms-icon {
+ position: absolute;
+ bottom: 120px;
+ left: 140px;
+ z-index: 10;
+ opacity: 0.5;
}
-.events-range
-{
- position:absolute;
- bottom:20px;
- left:30px;
- z-index:10;
- opacity:0.7;
- width:70%;
+.events-range {
+ position: absolute;
+ bottom: 20px;
+ left: 30px;
+ z-index: 10;
+ opacity: 0.7;
+ width: 70%;
}
-
-
-.events-range-modal
-{
- position:absolute;
- bottom:30px;
- left:30px;
- z-index:99;
- opacity:1;
- width:70%;
+.events-range-modal {
+ position: absolute;
+ bottom: 30px;
+ left: 30px;
+ z-index: 99;
+ opacity: 1;
+ width: 70%;
}
-
-.events-range-modal-text
-{
-
- position:absolute;
- top:20px;
- font-size:80%;
- line-height:100%;
-
+.events-range-modal-text {
+ position: absolute;
+ top: 20px;
+ font-size: 80%;
+ line-height: 100%;
left: 50%;
transform: translate(-50%, 0%);
- z-index:10;
- opacity:0.7;
- color:white;
+ z-index: 10;
+ opacity: 0.7;
+ color: white;
background-color: black;
border-radius: 5px 5px 5px 5px;
- padding-left:3px;
- padding-right:3px;
-
+ padding-left: 3px;
+ padding-right: 3px;
}
-
-
-.monitor-modal-text
-{
- position:absolute;
- bottom:30px;
-
+.monitor-modal-text {
+ position: absolute;
+ bottom: 30px;
left: 50%;
transform: translate(-50%, 0%);
- z-index:10;
- opacity:0.7;
- color:white;
+ z-index: 10;
+ opacity: 0.7;
+ color: white;
background-color: black;
border-radius: 5px 5px 5px 5px;
- padding-left:3px;
- padding-right:3px;
-
+ padding-left: 3px;
+ padding-right: 3px;
}
-
-.events-alarm-line
-{
-
+.events-alarm-line {
position: relative;
bottom: 1px;
left: 0px;
width: 100%;
border-top: 1px solid black;
-
}
-
-.events-float-filter
-{
+.bwmode {
position: absolute;
- top: 50%;
- right:-12px;
-
- color:#fff;
- background-color:#b47226;
+ top: 30%;
+ right: -28px;
+ opacity: 0.7;
+ background-color: #f1c40f;
+ color: #000;
+ font-size: 11px;
border-radius: 0px 0px 5px 5px;
- font-size:11px;
-
- padding-left:3px;
- padding-right:3px;
- opacity:0.7;
-
-
- z-index:99999;
-
- -webkit-transform: rotate(90deg);
+ z-index: 99999;
+ padding-left: 3px;
+ padding-right: 3px;
+ -webkit-transform: rotate(90deg);
-moz-transform: rotate(90deg);
-o-transform: rotate(90deg);
-ms-transform: rotate(90deg);
transform: rotate(90deg);
}
-.events-filter-on
-{
- position: absolute;
- left: 50%;
-
- transform: translate(-50%, 0);
- opacity:0.7;
- border-radius: 0px 0px 5px 5px;
- margin-top:-18px;
- background-color:#b47226;
- padding-left:6px;
- padding-right:6px;
- color:#fff;
- font-size:11px;
+.events-float-filter {
+ position: absolute;
+ top: 50%;
+ right: -12px;
+ color: #fff;
+ background-color: #b47226;
+ border-radius: 0px 0px 5px 5px;
+ font-size: 11px;
+ padding-left: 3px;
+ padding-right: 3px;
+ opacity: 0.7;
+ z-index: 99999;
+ -webkit-transform: rotate(90deg);
+ -moz-transform: rotate(90deg);
+ -o-transform: rotate(90deg);
+ -ms-transform: rotate(90deg);
+ transform: rotate(90deg);
+}
+.events-filter-on {
+ position: absolute;
+ left: 50%;
+ transform: translate(-50%, 0);
+ opacity: 0.7;
+ border-radius: 0px 0px 5px 5px;
+ margin-top: -18px;
+ background-color: #b47226;
+ padding-left: 6px;
+ padding-right: 6px;
+ color: #fff;
+ font-size: 11px;
}
/* Styling of progress bar
http://www.useragentman.com/blog/2012/01/03/cross-browser-html5-progress-bars-in-depth/
*/
-
-progress, /* All HTML5 progress enabled browsers */
-progress[role] /* polyfill */
+progress,
+/* All HTML5 progress enabled browsers */
+progress[role]/* polyfill */
{
-
- /* Turns off styling - not usually needed, but good to know. */
- appearance: none;
- -moz-appearance: none;
- -webkit-appearance: none;
-
- /* gets rid of default border in Firefox and Opera. */
- border: none;
-
- /* Needs to be in here for Safari polyfill so background images work as expected. */
- background-size: auto;
- height:10px;
-
+ /* Turns off styling - not usually needed, but good to know. */
+
+ appearance: none;
+ -moz-appearance: none;
+ -webkit-appearance: none;
+ /* gets rid of default border in Firefox and Opera. */
+
+ border: none;
+ /* Needs to be in here for Safari polyfill so background images work as expected. */
+
+ background-size: auto;
+ height: 10px;
}
/* Polyfill */
progress[role]:after {
- background-image: none; /* removes default background from polyfill */
+ background-image: none;
+ /* removes default background from polyfill */
}
/* Ensure fallback text doesn't appear in polyfill */
progress[role] strong {
- display: none;
+ display: none;
}
/* ----------------- progress background start ------------------*/
-progress, /* Firefox */
-progress[role][aria-valuenow] { /* Polyfill */
- background: #aaaaaa !important; /* !important is needed by the polyfill */
+progress,
+/* Firefox */
+progress[role][aria-valuenow] {
+ /* Polyfill */
+
+ background: #aaaaaa !important;
+ /* !important is needed by the polyfill */
}
/* Chrome */
progress::-webkit-progress-bar {
background: #aaaaaa;
}
+
/* ----------------- progress background start ------------------*/
/* ----------------- progress bar color start ------------------*/
+
/* IE10 */
progress {
color: #f1a165;
@@ -617,484 +516,396 @@ progress::-webkit-progress-value {
}
/* Polyfill */
-progress[aria-valuenow]:before {
+progress[aria-valuenow]:before {
background: #f1a165;
}
-/* ----------------- progress bar color end ------------------*/
-
-.rotate-button
-{
+/* ----------------- progress bar color end ------------------*/
+.rotate-button {
-webkit-transform: rotate(90deg);
-moz-transform: rotate(90deg);
-o-transform: rotate(90deg);
-ms-transform: rotate(90deg);
transform: rotate(90deg);
}
-
-
-.zm-image-fit
-{
+.zm-image-fit {
max-width: 100%;
max-height: 100%;
}
-
-.zm-image-crop
-{
- width:100%;
+.zm-image-crop {
+ width: 100%;
}
-
/*
.object-fit_cover { object-fit: cover; width:100%; height:auto;}
.object-fit_contain { object-fit: contain; max-width:100%; height:auto; }
*/
-
-
-.object-fit_cover { object-fit: cover; width:100%; height:auto;}
-.object-fit_contain { object-fit: contain; max-width:100%; max-height:100%; }
-
+.object-fit_cover {
+ object-fit: cover;
+ width: 100%;
+ height: auto;
+}
+.object-fit_contain {
+ object-fit: contain;
+ max-width: 100%;
+ max-height: 100%;
+}
.list .item.item-accordion {
- line-height: 200px;
- padding-top: 0;
- padding-bottom: 0;
- transition: 3s all linear;
+ line-height: 200px;
+ padding-top: 0;
+ padding-bottom: 0;
+ transition: 3s all linear;
}
.list .item.item-accordion.ng-hide {
- line-height: 0px;
+ line-height: 0px;
}
.list .item.item-accordion.ng-hide-add,
.list .item.item-accordion.ng-hide-remove {
- display: block !important;
+ display: block !important;
}
-
ul[rn-carousel] > li {
- position: relative;
- margin-left: -100%;
+ position: relative;
+ margin-left: -100%;
}
-
ul[rn-carousel] > li:first-child {
- margin-left: 0;
+ margin-left: 0;
}
-
ul[rn-carousel] img {
- max-width: 100%;
-}
-
-
-.content-banner .content-banner-close
-{
- margin-top:-5px;
+ max-width: 100%;
}
-
-.mySliderClass.jslider.sliderCSS div.jslider-pointer{
-left:50%;
-width:30px;
-height:30px;
-opacity:0.5;
-background-color:#615959;
-border-radius:50%;
-margin-left:-3px;
-margin-top:-8px;
+.content-banner .content-banner-close {
+ margin-top: -5px;
}
-
-.mySliderClass div.jslider-scale ins
-{
- color:red;
+.mySliderClass.jslider.sliderCSS div.jslider-pointer {
+ left: 50%;
+ width: 30px;
+ height: 30px;
+ opacity: 0.5;
+ background-color: #615959;
+ border-radius: 50%;
+ margin-left: -3px;
+ margin-top: -8px;
+}
+.mySliderClass div.jslider-scale ins {
+ color: red;
/*background-color:red;
border-radius:5%;
line-height:5px;*/
}
-
-.mySliderClass div.jslider-value
-{
- position:absolute;
- top:-29px;
- left:0;padding:1px 2px 0;
- background:#fff;font-size:9px;
- line-height:12px;
- white-space:nowrap;
- -moz-border-radius:2px;
- -webkit-border-radius:2px;
- -o-border-radius:2px;
- border-radius:2px
+.mySliderClass div.jslider-value {
+ position: absolute;
+ top: -29px;
+ left: 0;
+ padding: 1px 2px 0;
+ background: #fff;
+ font-size: 9px;
+ line-height: 12px;
+ white-space: nowrap;
+ -moz-border-radius: 2px;
+ -webkit-border-radius: 2px;
+ -o-border-radius: 2px;
+ border-radius: 2px
}
-
-
input[type=range]::-webkit-slider-thumb {
-
-
- background: #2980b9;
-
+ background: #2980b9;
}
/* this is for input = password and dialog = text */
.pinCode input[type=number] {
-webkit-text-security: disc;
}
-
-
-.pinCode input[type=number]{
+.pinCode input[type=number] {
height: 50px;
- width:200px;
+ width: 200px;
text-align: center;
font-size: 2em;
border: 1px solid #ddd;
-webkit-appearance: none;
-}
-
-
-.pin-background.scroll-content
- {
+}
+.pin-background.scroll-content {
/*background: url('../img/background.png') no-repeat center center fixed;*/
+
background-size: cover;
- background-color:#555555;
+ background-color: #555555;
/*background-color:#16a085;*/
-
}
-
-#responsive-image{
- width: 65%;
- margin: 0 auto;
+#responsive-image {
+ width: 65%;
+ margin: 0 auto;
}
-#responsive-image img{
- width: 100%
-
+#responsive-image img {
+ width: 100%
}
/* to avoid padding on delete in event list */
.item-content {
padding-right: 16px !important;
}
-
-.eventDeleteSpeed
-{
+.eventDeleteSpeed {
-webkit-animation-duration: 300ms;
}
-
-
-.content-banner.alarm
-{
+.content-banner.alarm {
background-color: forestgreen;
- color:white;
-
+ color: white;
+}
+.content-banner.net {
+ background-color: #9b59b6;
+ color: white;
}
/* This accordion list is used for event server monitor filter
* http://docs.angularjs.org/api/ng/directive/ngShow#usage_animations
*/
.list .item.item-accordion {
- line-height: 45px;
- padding-top: 0;
- padding-bottom: 0;
- transition: 0.09s all linear;
+ line-height: 45px;
+ padding-top: 0;
+ padding-bottom: 0;
+ transition: 0.09s all linear;
}
.list .item.item-accordion.ng-hide {
- line-height: 0px;
+ line-height: 0px;
}
.list .item.item-accordion.ng-hide-add,
.list .item.item-accordion.ng-hide-remove {
- display: block !important;
+ display: block !important;
}
-
.custom-list i {
- float: right;
+ float: right;
}
-
-
/* This is for quick scrub for H264 */
.videogular-container {
- height: 260px;
-
- margin: auto;
- overflow: hidden;
- float:left;
+ height: 260px;
+ margin: auto;
+ overflow: hidden;
+ float: left;
}
-
-
.videogular-full-container {
- height:80%;
-
- z-index:100;
- float:center;
-
- margin: auto;
- overflow: hidden;
-
+ height: 80%;
+ z-index: 100;
+ float: center;
+ margin: auto;
+ overflow: hidden;
}
-
-
-
-
#full-screen-event {
- -webkit-animation-duration: 200ms;
-
+ -webkit-animation-duration: 200ms;
}
-
-#monitorimage
-{
- -webkit-animation-duration: 200ms;
+#monitorimage {
+ -webkit-animation-duration: 200ms;
}
-
-#firstuse
-{
+#firstuse {
-webkit-animation-delay: 1s;
}
-
-#transition-delay
-{
+#transition-delay {
-webkit-animation-delay: 1s;
}
/* packery stuff */
-
-
-
-* { box-sizing: border-box; }
-
-body { font-family: sans-serif; }
+* {
+ box-sizing: border-box;
+}
+body {
+ font-family: sans-serif;
+}
/* ---- grid ---- */
-
-
-.dragborder
-{
- border:2px dotted #3498db;
+.dragborder {
+ border: 2px dotted #3498db;
}
-
-.dragborder-selected
-{
- border:4px solid #e74c3c;
+.dragborder-selected {
+ border: 4px solid #e74c3c;
+}
+.grid-sizer {
+ width: 10%;
+}
+.grid-item {
+ width: 20%;
+}
+.grid-item-10 {
+ width: 10%;
+}
+.grid-item-20 {
+ width: 20%;
+}
+.grid-item-30 {
+ width: 30%;
+}
+.grid-item-40 {
+ width: 40%;
+}
+.grid-item-50 {
+ width: 50%;
+}
+.grid-item-60 {
+ width: 60%;
+}
+.grid-item-70 {
+ width: 70%;
+}
+.grid-item-80 {
+ width: 80%;
+}
+.grid-item-90 {
+ width: 90%;
+}
+.grid-item-100 {
+ width: 100%;
}
-
-
-.grid-sizer {width:10%; }
-.grid-item { width: 20%; }
-.grid-item-10 {width: 10%; }
-.grid-item-20 { width: 20%; }
-.grid-item-30 { width: 30%; }
-.grid-item-40 { width: 40%; }
-.grid-item-50 { width: 50%; }
-.grid-item-60 {width: 60%; }
-.grid-item-70 { width: 70%; }
-.grid-item-80 { width: 80%; }
-.grid-item-90 {width: 90%; }
-.grid-item-100 {width:100%; }
-
-
-
-
/* clear fix */
.grid:after {
- content: '';
- display: block;
- clear: both;
+ content: '';
+ display: block;
+ clear: both;
}
-
-
.grid-item img {
- display: block;
- width: 100%;
- height:auto;
-
+ display: block;
+ width: 100%;
+ height: auto;
}
-/* ---- .grid-item ---- */
-
-
+/* ---- .grid-item ---- */
.grid-item.is-dragging,
.grid-item.is-positioning-post-drag {
- background: #34495e;
- z-index: 2;
+ background: #34495e;
+ z-index: 2;
}
-
.packery-drop-placeholder {
- outline: 3px dashed hsla(0, 0%, 0%, 0.5);
- outline-offset: -6px;
- -webkit-transition: -webkit-transform 0.2s;
- transition: transform 0.2s;
+ outline: 3px dashed hsla(0, 0%, 0%, 0.5);
+ outline-offset: -6px;
+ -webkit-transition: -webkit-transform 0.2s;
+ transition: transform 0.2s;
}
-
-
.wide-as-needed {
- overflow: scroll;
- white-space: nowrap;
+ overflow: scroll;
+ white-space: nowrap;
}
-
-
.visred {
- fill:#FF0000;
+ fill: #FF0000;
}
-
-.wizardtip
-{
- margin-left:5px;
- margin-right:5px;
- margin-top:10px;
- margin-bottom:5px;
+.wizardtip {
+ margin-left: 5px;
+ margin-right: 5px;
+ margin-top: 10px;
+ margin-bottom: 5px;
padding: 5px 5px 5px 5px;
background-color: #cccccc;
- color:#333232;
+ color: #333232;
border-radius: 8px;
border-width: 1px;
- border-color:#8b8888;
+ border-color: #8b8888;
border-style: solid;
}
-
.wiz-list {
- list-style-type: disc;
- list-style-position: inside;
+ list-style-type: disc;
+ list-style-position: inside;
}
-
-
-.zmPullup
-{
- background-color:#E3BE1C;
+.zmPullup {
+ background-color: #E3BE1C;
}
-
#flyoutmenu {
- z-index:99;
-
+ z-index: 99;
}
-
#flyoutmenu ul {
- list-style: none;
- margin: 0;
- padding: 0;
- color:white;
- z-index:99;
-
+ list-style: none;
+ margin: 0;
+ padding: 0;
+ color: white;
+ z-index: 99;
font-size: 0.7em;
font-family: sans-serif;
text-transform: uppercase;
}
-
-
#flyoutmenu ul li a i {
-
font-size: 2.5em;
font-family: sans-serif;
text-transform: uppercase;
}
-
#flyoutmenu li {
- display: inline-block;
- margin-bottom: .2em;
- padding:0.7em;
- margin-right: 4px;
-
+ display: inline-block;
+ margin-bottom: .2em;
+ padding: 0.7em;
+ margin-right: 4px;
line-height: 100%;
}
-
-#flyoutmenu li:first-child
-{
+#flyoutmenu li:first-child {
/*background: rgba(192, 57, 43, 0.7);*/
- background:rgba(108, 122, 137, 0.7);
- -webkit-border-radius: 5px 0 0 5px ;
-
+
+ background: rgba(108, 122, 137, 0.7);
+ -webkit-border-radius: 5px 0 0 5px;
}
-
-#flyoutmenu li:only-child
-{
+#flyoutmenu li:only-child {
/*background: rgba(192, 57, 43, 0.7);*/
- background:rgba(108, 122, 137, 0.7);
- -webkit-border-radius: 5px 5px 5px 5px ;
-
+
+ background: rgba(108, 122, 137, 0.7);
+ -webkit-border-radius: 5px 5px 5px 5px;
}
-
-#flyoutmenu li:last-child
-{
- -webkit-border-radius: 0 5px 5px 0;
+#flyoutmenu li:last-child {
+ -webkit-border-radius: 0 5px 5px 0;
}
/* make sure this is after last-child */
-#flyoutmenu li:only-child
-{
+#flyoutmenu li:only-child {
/*background: rgba(192, 57, 43, 0.7);*/
- background:rgba(108, 122, 137, 0.7);
- -webkit-border-radius: 5px 5px 5px 5px ;
-
+
+ background: rgba(108, 122, 137, 0.7);
+ -webkit-border-radius: 5px 5px 5px 5px;
}
-
- #flyoutmenu li:nth-child(n+2) {
- background:rgba(108, 122, 137, 0.7);
- z-index:-1;
-
- }
-
-#flyoutmenu a
-{
- text-decoration:none;
- color:white;
+#flyoutmenu li:nth-child(n+2) {
+ background: rgba(108, 122, 137, 0.7);
+ z-index: -1;
+}
+#flyoutmenu a {
+ text-decoration: none;
+ color: white;
}
/* Overlay graph in event footage */
#event_canvas {
- position:absolute;
- width: 80%;
- height: 20px;
- bottom:80px;
- left:20px;
- opacity:1;
- z-index:99;
-
+ position: absolute;
+ width: 80%;
+ height: 20px;
+ bottom: 80px;
+ left: 20px;
+ opacity: 1;
+ z-index: 99;
}
-
-
#event_canvas_video {
- position:absolute;
- width: 100%;
- height: 20px;
- bottom:140px;
- left:0px;
- opacity:1;
- z-index:99;
-
+ position: absolute;
+ width: 100%;
+ height: 20px;
+ bottom: 140px;
+ left: 0px;
+ opacity: 1;
+ z-index: 99;
}
-
-
-
#event_slider {
- position:absolute;
- width: 80%;
- height: 20px;
- bottom:60px;
- left:20px;
- opacity:1;
- z-index:9999;
-
-
+ position: absolute;
+ width: 80%;
+ height: 20px;
+ bottom: 60px;
+ left: 20px;
+ opacity: 1;
+ z-index: 9999;
}
-
#event_rate_text {
- position:absolute;
- width: 80%;
- bottom:20px;
- left:43px;
- opacity:1;
- color:#fff;
- z-index:9998;
-
-}
-
-.smallnote
-{
- font-size:9px;
- text-align:center;
- background-color: rgba(0,0,0,0.3);
- color:rgb(0,0,0);
- border-top-left-radius:5px;
- border-top-right-radius:5px;
-
-}
-
-.white-button-text
-{
- color:#fff !important;
-}
-
-
-
+ position: absolute;
+ width: 80%;
+ bottom: 20px;
+ left: 43px;
+ opacity: 1;
+ color: #fff;
+ z-index: 9998;
+}
+.smallnote {
+ font-size: 9px;
+ text-align: center;
+ background-color: rgba(0, 0, 0, 0.3);
+ color: rgb(0, 0, 0);
+ border-top-left-radius: 5px;
+ border-top-right-radius: 5px;
+}
+.white-button-text {
+ color: #fff !important;
+} \ No newline at end of file
diff --git a/www/index.html b/www/index.html
index c6bea392..66f2c178 100644
--- a/www/index.html
+++ b/www/index.html
@@ -195,7 +195,7 @@
<ion-item href="#/montage" menu-close>
- <span ng-if="$root.runMode=='low'" 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 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>
diff --git a/www/js/DataModel.js b/www/js/DataModel.js
index 11451916..dcd6b768 100644
--- a/www/js/DataModel.js
+++ b/www/js/DataModel.js
@@ -2,7 +2,7 @@
/* jslint browser: true*/
-/* global cordova,StatusBar,angular,console, URI, moment, localforage, CryptoJS */
+/* global cordova,StatusBar,angular,console, URI, moment, localforage, CryptoJS, Connection */
// This is my central data respository and common functions
// that many other controllers use
@@ -39,7 +39,15 @@ angular.module('zmApp.controllers')
{
text: 'Portugese',
value: 'pt'
- }
+ },
+ /*{
+ text: 'Arabic',
+ value: 'ar'
+ },
+ {
+ text: 'Hindi',
+ value: 'hi'
+ }*/
];
var serverGroupList = {};
@@ -109,6 +117,8 @@ angular.module('zmApp.controllers')
'cycleMonitors': false,
'cycleMonitorsInterval':10, // 10sec
'enableLowBandwidth':false,
+ 'autoSwitchBandwidth':false,
+ 'disableAlarmCheckMontage': false,
@@ -144,6 +154,37 @@ angular.module('zmApp.controllers')
return true;
}
+ function getBandwidth()
+ {
+ // if mode is not on always return high
+ if (loginData.enableLowBandwidth == false)
+ {
+ return "highbw";
+ }
+ // if mode is force on, return low
+ if (loginData.enableLowBandwidth == true && loginData.autoSwitchBandwidth != true)
+ {
+ return "lowbw";
+ }
+ 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)
+ {
+
+ case Connection.WIFI: strState="highbw"; break;
+ case Connection.ETHERNET: strState="highbw"; break;
+ default: strState = "lowbw"; break;
+
+ }
+ return strState;
+ }
+
//--------------------------------------------------------------------------
// uses fileLogger to write logs to file for later investigation
//--------------------------------------------------------------------------
@@ -691,12 +732,31 @@ angular.module('zmApp.controllers')
}
+
if (typeof loginData.enableLowBandwidth == 'undefined') {
+
loginData.enableLowBandwidth = false;
}
- $rootScope.runMode = loginData.enableLowBandwith? "low": "normal";
+ // wtf is wrong with this ternary?
+ //$rootScope.runMode = (loginData.enableLowBandwith==true)? "low": "normal";
+
+
+
+
+ if (typeof loginData.autoSwitchBandwidth == 'undefined') {
+
+
+ loginData.autoSwitchBandwidth = false;
+
+ }
+
+ $rootScope.runMode = getBandwidth();
+ log("Setting DataModel init bandwidth to: " +$rootScope.runMode);
+
+
+
if (typeof loginData.refreshSecLowBW == 'undefined') {
@@ -704,6 +764,12 @@ angular.module('zmApp.controllers')
}
+ if (typeof loginData.disableAlarmCheckMontage == 'undefined') {
+
+ loginData.disableAlarmCheckMontage = false;
+
+ }
+
@@ -1079,6 +1145,12 @@ angular.module('zmApp.controllers')
},
+ //--------------------------------------------------------------------------
+ // returns high or low BW mode
+ //--------------------------------------------------------------------------
+ getBandwidth: function () {
+ return getBandwidth();
+ },
//--------------------------------------------------------------------------
// This is really a hack for now & is very ugly. I need to clean this up a lot
diff --git a/www/js/EventCtrl.js b/www/js/EventCtrl.js
index d7ebdfa9..b802ff0e 100644
--- a/www/js/EventCtrl.js
+++ b/www/js/EventCtrl.js
@@ -1372,12 +1372,12 @@ angular.module('zmApp.controllers')
var relativePath = "";
var loginData = NVRDataModel.getLogin();
var str = event.Event.StartTime;
- var yy = moment(str).format('YY');
- var mm = moment(str).format('MM');
- var dd = moment(str).format('DD');
- var hh = moment(str).format('HH');
- var min = moment(str).format('mm');
- var sec = moment(str).format('ss');
+ var yy = moment(str).locale('en').format('YY');
+ var mm = moment(str).locale('en').format('MM');
+ var dd = moment(str).locale('en').format('DD');
+ var hh = moment(str).locale('en').format('HH');
+ var min = moment(str).locale('en').format('mm');
+ var sec = moment(str).locale('en').format('ss');
relativePath = event.Event.MonitorId + "/" +
yy + "/" +
mm + "/" +
@@ -1397,12 +1397,12 @@ angular.module('zmApp.controllers')
var basePath = "";
var loginData = NVRDataModel.getLogin();
var str = event.Event.StartTime;
- var yy = moment(str).format('YY');
- var mm = moment(str).format('MM');
- var dd = moment(str).format('DD');
- var hh = moment(str).format('HH');
- var min = moment(str).format('mm');
- var sec = moment(str).format('ss');
+ var yy = moment(str).locale('en').format('YY');
+ var mm = moment(str).locale('en').format('MM');
+ var dd = moment(str).locale('en').format('DD');
+ var hh = moment(str).locale('en').format('HH');
+ var min = moment(str).locale('en').format('mm');
+ var sec = moment(str).locale('en').format('ss');
basePath = event.Event.baseURL + "/events/" +
event.Event.MonitorId + "/" +
diff --git a/www/js/EventModalCtrl.js b/www/js/EventModalCtrl.js
index 8a2c3c4c..373d415b 100644
--- a/www/js/EventModalCtrl.js
+++ b/www/js/EventModalCtrl.js
@@ -101,6 +101,30 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
//$rootScope.authSession="";
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) {
+ // not called for offline, I'm only interested in BW switches
+ NVRDataModel.debug("Got network change:" + data);
+ var ds;
+ if (data == 'lowbw') {
+ ds = "low bandwidth mode";
+ } else {
+ ds = "high bandwidth mode";
+ }
+ NVRDataModel.displayBanner('net', [ds]);
+
+ var ld = NVRDataModel.getLogin();
+
+ $scope.singleImageQuality = (NVRDataModel.getBandwidth()=="lowbw" )? zm.eventSingleImageQualityLowBW: ld.singleImageQuality;
+ });
+
@@ -148,6 +172,14 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
//------------------------------------------------------
function checkEvent() {
+
+ if ($scope.modalFromTimelineIsOpen == false)
+ {
+ NVRDataModel.log ("Modal was closed in timeline, cancelling timer");
+ $interval.cancel(eventQueryHandle);
+ return;
+ }
+
//console.log ("Event timer");
//console.log ("Event timer");
$scope.checkEventOn = true;
@@ -740,7 +772,7 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
var ld = NVRDataModel.getLogin();
$scope.loginData = NVRDataModel.getLogin();
- $scope.singleImageQuality = ld.enableLowBandwidth? 70: ld.singleImageQuality;
+ $scope.singleImageQuality = (NVRDataModel.getBandwidth()=="lowbw" )? zm.eventSingleImageQualityLowBW: ld.singleImageQuality;
$scope.blockSlider = false;
$scope.checkEventOn = false;
//$scope.singleImageQuality = 100;
@@ -776,7 +808,7 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
eventQueryHandle = $interval(function () {
checkEvent();
// console.log ("Refreshing Image...");
- }.bind(this), ld.enableLowBandwidth? zm.eventPlaybackQueryLowBW: zm.eventPlaybackQuery);
+ }.bind(this), (NVRDataModel.getBandwidth()=="lowbw")? zm.eventPlaybackQueryLowBW: zm.eventPlaybackQuery);
} else {
NVRDataModel.log(">>>Modal was exited, not starting checkAllEvents");
}
@@ -854,6 +886,7 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
$scope.$on('modal.removed', function (e, m) {
+ console.log ("************* REMOVE CALLED");
$interval.cancel(eventQueryHandle);
if (m.id != 'footage')
return;
@@ -1235,12 +1268,12 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
var relativePath = "";
var loginData = NVRDataModel.getLogin();
var str = event.Event.StartTime;
- var yy = moment(str).format('YY');
- var mm = moment(str).format('MM');
- var dd = moment(str).format('DD');
- var hh = moment(str).format('HH');
- var min = moment(str).format('mm');
- var sec = moment(str).format('ss');
+ var yy = moment(str).locale('en').format('YY');
+ var mm = moment(str).locale('en').format('MM');
+ var dd = moment(str).locale('en').format('DD');
+ var hh = moment(str).locale('en').format('HH');
+ var min = moment(str).locale('en').format('mm');
+ var sec = moment(str).locale('en').format('ss');
relativePath = event.Event.MonitorId + "/" +
yy + "/" +
mm + "/" +
@@ -1260,12 +1293,12 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
var basePath = "";
var loginData = NVRDataModel.getLogin();
var str = event.Event.StartTime;
- var yy = moment(str).format('YY');
- var mm = moment(str).format('MM');
- var dd = moment(str).format('DD');
- var hh = moment(str).format('HH');
- var min = moment(str).format('mm');
- var sec = moment(str).format('ss');
+ var yy = moment(str).locale('en').format('YY');
+ var mm = moment(str).locale('en').format('MM');
+ var dd = moment(str).locale('en').format('DD');
+ var hh = moment(str).locale('en').format('HH');
+ var min = moment(str).locale('en').format('mm');
+ var sec = moment(str).locale('en').format('ss');
basePath = loginData.url + "/events/" +
event.Event.MonitorId + "/" +
diff --git a/www/js/EventsModalGraphCtrl.js b/www/js/EventsModalGraphCtrl.js
index fb349df0..0874e4f7 100644
--- a/www/js/EventsModalGraphCtrl.js
+++ b/www/js/EventsModalGraphCtrl.js
@@ -334,12 +334,12 @@ angular.module('zmApp.controllers').controller('EventsModalGraphCtrl', ['$scope'
var relativePath = "";
var loginData = NVRDataModel.getLogin();
var str = event.Event.StartTime;
- var yy = moment(str).format('YY');
- var mm = moment(str).format('MM');
- var dd = moment(str).format('DD');
- var hh = moment(str).format('HH');
- var min = moment(str).format('mm');
- var sec = moment(str).format('ss');
+ var yy = moment(str).locale('en').format('YY');
+ var mm = moment(str).locale('en').format('MM');
+ var dd = moment(str).locale('en').format('DD');
+ var hh = moment(str).locale('en').format('HH');
+ var min = moment(str).locale('en').format('mm');
+ var sec = moment(str).locale('en').format('ss');
relativePath = event.Event.MonitorId + "/" +
yy + "/" +
mm + "/" +
@@ -359,12 +359,12 @@ angular.module('zmApp.controllers').controller('EventsModalGraphCtrl', ['$scope'
var basePath = "";
var loginData = NVRDataModel.getLogin();
var str = event.Event.StartTime;
- var yy = moment(str).format('YY');
- var mm = moment(str).format('MM');
- var dd = moment(str).format('DD');
- var hh = moment(str).format('HH');
- var min = moment(str).format('mm');
- var sec = moment(str).format('ss');
+ var yy = moment(str).locale('en').format('YY');
+ var mm = moment(str).locale('en').format('MM');
+ var dd = moment(str).locale('en').format('DD');
+ var hh = moment(str).locale('en').format('HH');
+ var min = moment(str).locale('en').format('mm');
+ var sec = moment(str).locale('en').format('ss');
basePath = loginData.url + "/events/" +
event.Event.MonitorId + "/" +
diff --git a/www/js/LoginCtrl.js b/www/js/LoginCtrl.js
index 457ebe79..28f16670 100644
--- a/www/js/LoginCtrl.js
+++ b/www/js/LoginCtrl.js
@@ -424,7 +424,7 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r
NVRDataModel.setFirstUse(false);
// used for menu display
- $rootScope.runMode = $scope.loginData.enableLowBandwidth ? "low":"normal";
+
// lets so some basic sanitization of the data
// I am already adding "/" so lets remove spurious ones
@@ -529,6 +529,8 @@ 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) {
diff --git a/www/js/MonitorModalCtrl.js b/www/js/MonitorModalCtrl.js
index 84553d6e..5268b19d 100644
--- a/www/js/MonitorModalCtrl.js
+++ b/www/js/MonitorModalCtrl.js
@@ -1259,7 +1259,7 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$
$scope.isCycle = ld.cycleMonitors;
$scope.cycleText = $scope.isCycle ? $translate.instant('kOn') : $translate.instant('kOff');
- $scope.quality = ld.enableLowBandwidth? 70:ld.monSingleImageQuality;
+ $scope.quality = (NVRDataModel.getBandwidth()=="lowbw")? zm.monSingleImageQualityLowBW:ld.monSingleImageQuality;
configurePTZ($scope.monitorId);
diff --git a/www/js/MontageCtrl.js b/www/js/MontageCtrl.js
index 5cc06739..bff471d3 100644
--- a/www/js/MontageCtrl.js
+++ b/www/js/MontageCtrl.js
@@ -4,7 +4,8 @@
/* global cordova,StatusBar,angular,console,ionic,Packery, Draggabilly, imagesLoaded, ConnectSDK */
-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) {
+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
@@ -24,6 +25,41 @@ angular.module('zmApp.controllers').controller('zmApp.MontageCtrl', ['$scope', '
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 = "low bandwidth mode";
+ } else {
+ ds = "high bandwidth mode";
+ }
+ 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
@@ -257,15 +293,15 @@ angular.module('zmApp.controllers').controller('zmApp.MontageCtrl', ['$scope', '
function loadAlarmStatus() {
- if (NVRDataModel.versionCompare($rootScope.apiVersion, "1.30") == -1) {
+ if ((NVRDataModel.versionCompare($rootScope.apiVersion, "1.30") == -1) ||
+ (NVRDataModel.getBandwidth() == 'lowbw') ||
+ (NVRDataModel.getLogin().disableAlarmCheckMontage == true))
+ {
return;
}
+
- if (NVRDataModel.getLogin().enableLowBandwidth)
- {
- return;
- }
for (var i = 0; i < $scope.MontageMonitors.length; i++) {
if (($scope.MontageMonitors[i].Monitor.Function == 'None') ||
@@ -794,7 +830,7 @@ angular.module('zmApp.controllers').controller('zmApp.MontageCtrl', ['$scope', '
$scope.toggleSizeButtons = function () {
$scope.showSizeButtons = !$scope.showSizeButtons;
-
+
NVRDataModel.debug("toggling size buttons:" + $scope.showSizeButtons);
if ($scope.showSizeButtons) $ionicScrollDelegate.$getByHandle("montage-delegate").scrollTop();
};
@@ -818,18 +854,18 @@ angular.module('zmApp.controllers').controller('zmApp.MontageCtrl', ['$scope', '
$scope.allImagesLoaded = false;
$scope.gridScale = "grid-item-50";
$scope.LoginData = NVRDataModel.getLogin();
+ //FIXME
- if ($scope.LoginData.enableLowBandwidth)
- {
- NVRDataModel.debug ("Enabling low bandwidth parameters");
- $scope.LoginData.montageQuality = 50;
- $scope.LoginData.singleImageQuality = 70;
- $scope.LoginData.montageHistoryQuality = 50;
-
-
+ 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.monLimit = $scope.LoginData.maxMontage;
$scope.showSizeButtons = false;
@@ -851,11 +887,11 @@ angular.module('zmApp.controllers').controller('zmApp.MontageCtrl', ['$scope', '
//$scope.areImagesLoading = true;
var ld = NVRDataModel.getLogin();
-
- refreshSec = ld.enableLowBandwidth ? ld.refreshSecLowBW: ld.refreshSec;
-
- NVRDataModel.debug ("Enable Low bandwidth: " + ld.enableLowBandwidth+ " montage refresh set to: " + refreshSec);
-
+
+ refreshSec = (NVRDataModel.getBandwidth()=='lowbw') ? ld.refreshSecLowBW : ld.refreshSec;
+
+ NVRDataModel.debug("bandwidth: " + NVRDataModel.getBandwidth() + " montage refresh set to: " + refreshSec);
+
//console.log("Setting Awake to " + NVRDataModel.getKeepAwake());
NVRDataModel.setAwake(NVRDataModel.getKeepAwake());
@@ -1141,4 +1177,4 @@ angular.module('zmApp.controllers').controller('zmApp.MontageCtrl', ['$scope', '
};
-}]); \ No newline at end of file
+}]);
diff --git a/www/js/MontageHistoryCtrl.js b/www/js/MontageHistoryCtrl.js
index 8b049143..1fb1f09c 100644
--- a/www/js/MontageHistoryCtrl.js
+++ b/www/js/MontageHistoryCtrl.js
@@ -8,6 +8,19 @@
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', function ($scope, $rootScope, NVRDataModel, message, $ionicSideMenuDelegate, $timeout, $interval, $ionicModal, $ionicLoading, $http, $state, $ionicPopup, $stateParams, $ionicHistory, $ionicScrollDelegate, $ionicPlatform, zm, $ionicPopover, $controller, imageLoadingDataShare, $window, $translate) {
+
+
+ //--------------------------------------------------------------------------------------
+ // Handles bandwidth change, if required
+ //
+ //--------------------------------------------------------------------------------------
+
+ $rootScope.$on("bandwidth-change", function (e,data) {
+ // nothing to do for now
+ // eventUrl will use lower BW in next query cycle
+ });
+
+
//--------------------------------------
// formats events dates in a nice way
@@ -146,7 +159,9 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
// console.log ("Old value of event url " + $scope.MontageMonitors[j].eventUrl);
//console.log ("ldurl is " + ld.streamingurl);
- $scope.MontageMonitors[j].Monitor.eventUrl = ld.streamingurl + "/nph-zms?source=event&mode=jpeg&event=" + eid + "&frame=1&replay=gapless&rate=" + $scope.sliderVal.realRate + "&connkey=" + $scope.MontageMonitors[j].Monitor.connKey + "&scale=" + ld.montageHistoryQuality + "&rand=" + $rootScope.rand;
+
+ var bw = NVRDataModel.getBandwidth()=="lowbw"? zm.eventMontageQualityLowBW: ld.montageHistoryQuality ;
+ $scope.MontageMonitors[j].Monitor.eventUrl = ld.streamingurl + "/nph-zms?source=event&mode=jpeg&event=" + eid + "&frame=1&replay=gapless&rate=" + $scope.sliderVal.realRate + "&connkey=" + $scope.MontageMonitors[j].Monitor.connKey + "&scale=" + bw+ "&rand=" + $rootScope.rand;
//console.log ("Setting event URL to " +$scope.MontageMonitors[j].Monitor.eventUrl);
// console.log ("SWITCHING TO " + $scope.MontageMonitors[j].eventUrl);
@@ -195,7 +210,9 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
if (!NVRDataModel.isBackground()) {
- $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=" + ld.montageHistoryQuality + "&rand=" + $rootScope.rand;
+ 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;
@@ -409,7 +426,8 @@ angular.module('zmApp.controllers').controller('zmApp.MontageHistoryCtrl', ['$sc
element.addClass('animated flipInX');
$scope.MontageMonitors[ndx].Monitor.eventUrlTime = data.event.Event.StartTime;
- $scope.MontageMonitors[ndx].Monitor.eventUrl = ld.streamingurl + "/nph-zms?source=event&mode=jpeg&event=" + data.event.Event.Id + "&frame=1&replay=gapless&rate=" + $scope.sliderVal.realRate + "&connkey=" + $scope.MontageMonitors[ndx].Monitor.connKey + "&scale=" + ld.montageHistoryQuality + "&rand=" + $rootScope.rand;
+ var bw = NVRDataModel.getBandwidth()=="lowbw"? zm.eventMontageQualityLowBW: ld.montageHistoryQuality ;
+ $scope.MontageMonitors[ndx].Monitor.eventUrl = ld.streamingurl + "/nph-zms?source=event&mode=jpeg&event=" + data.event.Event.Id + "&frame=1&replay=gapless&rate=" + $scope.sliderVal.realRate + "&connkey=" + $scope.MontageMonitors[ndx].Monitor.connKey + "&scale=" + bw + "&rand=" + $rootScope.rand;
}, 700);
} else if (currentEventTime.diff(maxTime) > 0) {
diff --git a/www/js/TimelineModalCtrl.js b/www/js/TimelineModalCtrl.js
index 87f26126..10aa2ce3 100644
--- a/www/js/TimelineModalCtrl.js
+++ b/www/js/TimelineModalCtrl.js
@@ -398,12 +398,12 @@ angular.module('zmApp.controllers').controller('TimelineModalCtrl', ['$scope', '
var relativePath = "";
var loginData = NVRDataModel.getLogin();
var str = event.Event.StartTime;
- var yy = moment(str).format('YY');
- var mm = moment(str).format('MM');
- var dd = moment(str).format('DD');
- var hh = moment(str).format('HH');
- var min = moment(str).format('mm');
- var sec = moment(str).format('ss');
+ var yy = moment(str).locale('en').format('YY');
+ var mm = moment(str).locale('en').format('MM');
+ var dd = moment(str).locale('en').format('DD');
+ var hh = moment(str).locale('en').format('HH');
+ var min = moment(str).locale('en').format('mm');
+ var sec = moment(str).locale('en').format('ss');
relativePath = event.Event.MonitorId + "/" +
yy + "/" +
mm + "/" +
@@ -423,12 +423,12 @@ angular.module('zmApp.controllers').controller('TimelineModalCtrl', ['$scope', '
var basePath = "";
var loginData = NVRDataModel.getLogin();
var str = event.Event.StartTime;
- var yy = moment(str).format('YY');
- var mm = moment(str).format('MM');
- var dd = moment(str).format('DD');
- var hh = moment(str).format('HH');
- var min = moment(str).format('mm');
- var sec = moment(str).format('ss');
+ var yy = moment(str).locale('en').format('YY');
+ var mm = moment(str).locale('en').format('MM');
+ var dd = moment(str).locale('en').format('DD');
+ var hh = moment(str).locale('en').format('HH');
+ var min = moment(str).locale('en').format('mm');
+ var sec = moment(str).locale('en').format('ss');
basePath = loginData.url + "/events/" +
event.Event.MonitorId + "/" +
diff --git a/www/js/app.js b/www/js/app.js
index 367fc0af..eb254aa8 100644
--- a/www/js/app.js
+++ b/www/js/app.js
@@ -1,7 +1,13 @@
/* jshint -W041 */
/* jslint browser: true*/
-/* global cordova,StatusBar,angular,console,alert,PushNotification, moment ,ionic, URI,Packery, ConnectSDK, CryptoJS, localforage,$*/
+/* global cordova,StatusBar,angular,console,alert,PushNotification, moment ,ionic, URI,Packery, ConnectSDK, CryptoJS, ContactFindOptions, localforage,$, Connection*/
+// For desktop versions, this is replaced
+// with actual app version from config.xml by the
+// ./make_desktop.sh script
+
+// For mobile versions, I use cordova app version plugin
+// to get it at run time
var appVersion = "0.0.0";
@@ -46,7 +52,7 @@ angular.module('zmApp', [
authoremail: 'pliablepixels+zmNinja@gmail.com',
logFileMaxSize: 20000, // after this limit log gets reset
loginInterval: 300000, //5m*60s*1000 - ZM auto login after 5 mins
- loginIntervalLowBW: 600000, //10m login
+
//loginInterval: 30000,
updateCheckInterval: 86400000, // 24 hrs
loadingTimeout: 15000,
@@ -78,11 +84,18 @@ angular.module('zmApp', [
nphSwitchTimer: 3000,
eventHistoryTimer: 10000,
eventPlaybackQuery: 3000,
- eventPlaybackQueryLowBW: 6000,
+
packeryTimer: 500,
dbName: 'zmninja',
cipherKey: 'sdf#@#%FSXSA_AR',
minCycleTime: 5,
+
+ eventPlaybackQueryLowBW: 6000,
+ loginIntervalLowBW: 600000, //10m login
+ eventSingleImageQualityLowBW:70,
+ monSingleImageQualityLowBW:70,
+ montageQualityLowBW:50,
+ eventMontageQualityLowBW:50
})
@@ -109,18 +122,6 @@ angular.module('zmApp', [
})
-// https://forum.ionicframework.com/t/ng-src-not-updated-in-video-tag/7540/6
-.directive('dynamicUrl', function () {
- return {
- restrict: 'A',
- link: function postLink(scope, element, attr) {
- element.attr('src', attr.dynamicUrlSrc);
- }
- };
-})
-
-
-
// credit https://gist.github.com/Zren/beaafd64f395e23f4604
@@ -577,8 +578,8 @@ angular.module('zmApp', [
$rootScope.newBlogPost = "(new post)";
return;
+
}
-
var mLastDate = moment(lastDate);
var mItemDate = moment(data[0].date);
@@ -968,11 +969,35 @@ angular.module('zmApp', [
$rootScope.$apply(function () {
$rootScope.online = false;
NVRDataModel.log("Your network went offline");
+
+ //$rootScope.$emit('network-change', "offline");
+
});
}, false);
+
$window.addEventListener("online", function () {
$rootScope.$apply(function () {
$rootScope.online = true;
+
+ $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.debug ("Setting app state to: "+ strState);
+ $rootScope.$emit('bandwidth-change', strState);
+ }
+ else
+ {
+ NVRDataModel.debug ("Not changing bandwidth state, as auto change is not on");
+ }
+
+ },1000); // need a time gap, seems network type registers late
+
NVRDataModel.log("Your network is online, re-authenticating");
zmAutoLogin.doLogin($translate.instant('kReAuthenticating'));
@@ -1077,11 +1102,8 @@ angular.module('zmApp', [
-
-
-
$rootScope.db = null;
- $rootScope.runMode = "normal";
+ $rootScope.runMode = NVRDataModel.getBandwidth();
$rootScope.platformOS = "desktop";
NVRDataModel.log("Device is ready");
@@ -1424,12 +1446,6 @@ angular.module('zmApp', [
}
-
-
-
-
-
-
}); //platformReady
}) //run
@@ -1485,7 +1501,7 @@ angular.module('zmApp', [
//$translateProvider.useLocalStorage();
- $translateProvider.registerAvailableLanguageKeys(['en', 'de', 'es', 'fr', 'it', 'ja', 'ko', 'zh', 'zh_CN', 'zh_TW', 'pt'], {
+ $translateProvider.registerAvailableLanguageKeys(['en', 'de', 'es', 'fr', 'it', 'ja', 'ko', 'zh', 'zh_CN', 'zh_TW', 'pt', 'ar','hi'], {
'en_*': 'en',
'de_*': 'de',
'es_*': 'es',
@@ -1494,6 +1510,8 @@ angular.module('zmApp', [
'ja_*': 'ja',
'ko_*': 'ko',
'pt_*': 'pt',
+ 'ar_*': 'ar',
+ 'hi_*': 'hi',
'*': 'en' // must be last
});
diff --git a/www/lang/locale-en.json b/www/lang/locale-en.json
index 7af0db3b..ca8469c8 100644
--- a/www/lang/locale-en.json
+++ b/www/lang/locale-en.json
@@ -16,6 +16,7 @@
"kAt" :"at",
"kAuthSuccess" :"authentication success",
"kAuthenticating" :"authenticating",
+ "kAutoSwitchBW" :"auto switch bandwidth",
"kAwake1" :"Keep display on",
"kAwake2" :"(when viewing footage)",
"kBannerAPICheckFailed" :"API check failed",
@@ -56,6 +57,8 @@
"kDeletingEvent" :"deleting event",
"kDevOptions" :"Dev. Settings",
"kDeveloperOptionsFor" :"Developer Options for",
+ "kDisableAlarmMontage" : "Disable alarm API in montage",
+ "kDisableAlarmMontageSub" : "may help if server gets overloaded",
"kDisableNative" :"Disable Native transitions",
"kDisableNativeSub" :"Enable if the menu is freezing",
"kDisablePush" :"disable APNS/GCM",
@@ -148,6 +151,7 @@
"kLoginValidatedTitle" :"Login Validated",
"kLogs" :"Logs",
"kLowBandwidth" :"low bandwidth mode",
+ "kLowBWDisplay" : "low bandwidth",
"kManageServerGroups" :"Manage Server Groups",
"kMaxFPS" :"Max FPS",
"kMaxItemsForTimeline" :"Max. items for Timeline",
diff --git a/www/templates/devoptions.html b/www/templates/devoptions.html
index a2bf0e8c..98a9dcef 100644
--- a/www/templates/devoptions.html
+++ b/www/templates/devoptions.html
@@ -131,6 +131,10 @@
</div>
<label>
+ <ion-toggle ng-model="loginData.disableAlarmCheckMontage" ng-checked="loginData.disableAlarmCheckMontage" toggle-class="toggle-calm">{{'kDisableAlarmMontage' | translate}}<p>{{'kDisableAlarmMontageSub' | translate}}</p></ion-toggle>
+ </label>
+
+ <label>
<ion-toggle ng-model="loginData.enableLogs" ng-checked="{{loginData.enableLogs}}" toggle-class="toggle-calm">{{'kEnableLogs' | translate}}</ion-toggle>
</label>
diff --git a/www/templates/events-modal.html b/www/templates/events-modal.html
index 355ff4f2..2f8bc08d 100644
--- a/www/templates/events-modal.html
+++ b/www/templates/events-modal.html
@@ -120,7 +120,7 @@
- <div class="events-range-modal-text">{{mName}}&nbsp;<i class="ion-arrow-right-b"></i>&nbsp;{{humanizeTime}} ({{'kEvent' | translate}}:{{d_eventId}}) </div>
+ <div class="events-range-modal-text">{{mName}}&nbsp;<i class="ion-arrow-right-b"></i>&nbsp;{{humanizeTime}} ({{d_eventId}}) </div>
<div id="flyoutmenu" style="position:absolute;bottom:100px;left:10px">
<ul>
diff --git a/www/templates/events.html b/www/templates/events.html
index 9b0cd7ba..ac0e1a4f 100644
--- a/www/templates/events.html
+++ b/www/templates/events.html
@@ -34,7 +34,7 @@
</ion-header-bar>
</div>
-
+
<ion-content ng-cloak on-tap="tapped();" delegate-handle="mainScroll" has-subheader="true" overflow-scroll="false" mouse-wheel-scroll>
@@ -278,7 +278,15 @@
</ion-infinite-scroll>
</div>
</ion-content>
+
+
+
<div class="events-float-filter" ng-if="isEventFilterOn" on-tap="filterTapped();">{{'kFilterOn'|translate}}</div>
+
+ <div class="bwmode" ng-if="$root.runMode=='lowbw'">
+ {{ 'kLowBWDisplay' | translate }}
+ </div>
+
<ion-pull-up-footer class="zmPullup" on-expand="footerExpand()" on-collapse="footerCollapse()" initial-state="minimized" default-behavior="expand">
diff --git a/www/templates/login.html b/www/templates/login.html
index e2a65168..054aaf49 100644
--- a/www/templates/login.html
+++ b/www/templates/login.html
@@ -3,135 +3,118 @@
<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>
+
+
+
+ <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 padding="true" >
-
- <div class="item item-input-inset">
- {{'kServerName' | translate }}:&nbsp;
- <label class="item-input-wrapper">
- <input autocorrect="off" type="text" placeholder="{{'kExampleServer' | translate}}" ng-model="loginData.serverName">
- </label>
+ <ion-content padding="true">
+
+ <div class="item 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-model="loginData.enableLowBandwidth"
-
- toggle-class="toggle-calm">{{'kLowBandwidth'|translate}}
+ <ion-toggle ng-model="loginData.enableLowBandwidth" toggle-class="toggle-calm">{{'kLowBandwidth'|translate}}
</ion-toggle>
- </label>
-
+ </label>
+ <label ng-if="loginData.enableLowBandwidth">
+ <ion-toggle ng-model="loginData.autoSwitchBandwidth" toggle-class="toggle-calm">{{'kAutoSwitchBW'|translate}}
+ </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>
{{'kZMSettingsFor' | translate}} {{loginData.serverName || ('kUnknown' | translate)}}
</span>
-
+
<div class="item">
- <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>
+ <ion-checkbox ng-model="check.isUseAuth">{{'kUseZmAuth' | translate }}</ion-checkbox>
- <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 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>
- <label class="item item-input item-floating-label" >
+
+ </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)">
+ <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 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>-->
-
+
+ <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">
-
+
+ <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" >
+
+
+
+ <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">
+ <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>
-
+ </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}}
+ </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">{{'kPassword' | translate}} {{'kProtect'|translate}}</ion-toggle>
+ <ion-toggle ng-model="loginData.usePin" ng-change="pinPrompt();" ng-checked="{{loginData.usePin}}" toggle-class="toggle-calm">{{'kPassword' | translate}} {{'kProtect'|translate}}</ion-toggle>
</label>
</div>
-
+
<label>
- <ion-toggle ng-model="loginData.useSSL"
- ng-checked="{{loginData.useSSL}}"
- toggle-class="toggle-calm">{{'kUseSSL' | translate}}</ion-toggle>
+ <ion-toggle ng-model="loginData.useSSL" ng-checked="{{loginData.useSSL}}" toggle-class="toggle-calm">{{'kUseSSL' | translate}}</ion-toggle>
</label>
<div ng-if="$root.platformOS != 'desktop'">
- <label>
-
- <ion-toggle ng-model="loginData.keepAwake"
- ng-checked="{{loginData.keepAwake}}"
- toggle-class="toggle-calm">{{'kAwake1'|translate}}<p>{{'kAwake2'| translate}}</p>
- </ion-toggle>
- </label>
+ <label>
+
+ <ion-toggle ng-model="loginData.keepAwake" ng-checked="{{loginData.keepAwake}}" toggle-class="toggle-calm">{{'kAwake1'|translate}}
+ <p>{{'kAwake2'| translate}}</p>
+ </ion-toggle>
+ </label>
</div>
</div>
-
+
</ion-content>
-</ion-view>
+</ion-view> \ No newline at end of file
diff --git a/www/templates/monitors-modal.html b/www/templates/monitors-modal.html
index 33ddc865..1cfbfac9 100644
--- a/www/templates/monitors-modal.html
+++ b/www/templates/monitors-modal.html
@@ -142,6 +142,6 @@
</ul>
</div>
- <div class="monitor-modal-text">{{monitorName}}&nbsp;<span style="{{stateColor()}}">{{monStatus}}&nbsp;</span></div>
+ <div class="monitor-modal-text">{{monitorName}} &nbsp;<span style="{{stateColor()}}">{{monStatus}}&nbsp;</span></div>
</div>
diff --git a/www/templates/montage-history.html b/www/templates/montage-history.html
index d495b482..f0e4a4a5 100644
--- a/www/templates/montage-history.html
+++ b/www/templates/montage-history.html
@@ -80,7 +80,7 @@
{{monitor.Monitor.Name}}&nbsp;
</div>
- <div ng-if="sliderVal.showTimeline" style=" position:absolute; bottom:15px; right:0%;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;"
+ <div ng-if="sliderVal.showTimeline && $root.runMode!='lowbw'" style=" position:absolute; bottom:15px; right:0%;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;"
class="header-event-id" id="{{monitor.Monitor.Id}}-timeline">
&nbsp;<i class="ion-clock"></i>
{{prettifyDate(monitor.Monitor.eventUrlTime)}}&nbsp;
@@ -115,6 +115,10 @@
</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">
diff --git a/www/templates/montage.html b/www/templates/montage.html
index 4ce29ab3..f79db1ef 100644
--- a/www/templates/montage.html
+++ b/www/templates/montage.html
@@ -1,4 +1,5 @@
<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;
@@ -34,7 +35,8 @@
<ion-content ng-cloak has-bouncing="false" style="background-color:#444444" delegate-handle="montage-delegate" >
-
+
+
<span ng-if="!minimal && showSizeButtons">
<!-- this is header -->
@@ -91,7 +93,7 @@
<figcaption id="slowpulse" ng-class="monitor.Monitor.isAlarmed==true?'alarmed-figcaption animated infinite flash':'normal-figcaption'" >
&nbsp;<i class="ion-ios-videocam"></i>
- {{monitor.Monitor.Name}}&nbsp;<i style="{{monitor.Monitor.alarmState}}" class="ion-record"></i>&nbsp;
+ {{monitor.Monitor.Name}}&nbsp;<i ng-if="$root.runMode!='lowbw'" style="{{monitor.Monitor.alarmState}}" class="ion-record"></i>&nbsp;
</figcaption>
@@ -120,6 +122,11 @@
</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="{{'kCollapse' | translate}}" active-icon="ion-chevron-down" resting-icon="ion-chevron-up" toggling-method="click">