2008-07-14 21:54:50 +08:00
|
|
|
<?php
|
|
|
|
//
|
2020-04-21 20:30:42 +08:00
|
|
|
// ZoneMinder web function library
|
2008-07-25 17:48:16 +08:00
|
|
|
// Copyright (C) 2001-2008 Philip Coombes
|
2008-07-14 21:54:50 +08:00
|
|
|
//
|
|
|
|
// This program is free software; you can redistribute it and/or
|
|
|
|
// modify it under the terms of the GNU General Public License
|
|
|
|
// as published by the Free Software Foundation; either version 2
|
|
|
|
// of the License, or (at your option) any later version.
|
|
|
|
//
|
|
|
|
// This program is distributed in the hope that it will be useful,
|
|
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
// GNU General Public License for more details.
|
|
|
|
//
|
|
|
|
// You should have received a copy of the GNU General Public License
|
|
|
|
// along with this program; if not, write to the Free Software
|
2016-12-26 23:23:16 +08:00
|
|
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
2008-07-14 21:54:50 +08:00
|
|
|
//
|
|
|
|
|
2019-05-29 20:40:48 +08:00
|
|
|
function xhtmlHeaders($file, $title) {
|
2020-08-04 22:47:37 +08:00
|
|
|
ob_start();
|
|
|
|
|
2017-06-05 09:42:56 +08:00
|
|
|
global $css;
|
|
|
|
global $skin;
|
2018-02-09 01:29:42 +08:00
|
|
|
global $view;
|
2020-08-04 22:47:37 +08:00
|
|
|
global $cspNonce;
|
2020-09-03 02:38:38 +08:00
|
|
|
global $basename;
|
2017-12-22 10:46:21 +08:00
|
|
|
|
|
|
|
# This idea is that we always include the classic css files,
|
|
|
|
# and then any different skin only needs to contain things that are different.
|
2019-05-29 20:40:48 +08:00
|
|
|
$baseCssPhpFile = getSkinFile('css/base/skin.css.php');
|
2017-12-22 10:46:21 +08:00
|
|
|
|
2019-05-29 20:40:48 +08:00
|
|
|
$skinCssPhpFile = getSkinFile('css/'.$css.'/skin.css.php');
|
2014-11-27 00:18:03 +08:00
|
|
|
|
2008-07-14 21:54:50 +08:00
|
|
|
|
2019-05-29 20:40:48 +08:00
|
|
|
$basename = basename($file, '.php');
|
2017-12-22 10:46:21 +08:00
|
|
|
|
2019-09-29 02:23:23 +08:00
|
|
|
$baseViewCssPhpFile = getSkinFile('/css/base/views/'.$basename.'.css.php');
|
2019-05-29 20:40:48 +08:00
|
|
|
$viewCssPhpFile = getSkinFile('/css/'.$css.'/views/'.$basename.'.css.php');
|
2008-07-14 21:54:50 +08:00
|
|
|
|
2019-05-29 20:40:48 +08:00
|
|
|
function output_link_if_exists($files) {
|
2018-02-09 01:29:42 +08:00
|
|
|
global $skin;
|
2017-12-22 10:46:21 +08:00
|
|
|
$html = array();
|
|
|
|
foreach ( $files as $file ) {
|
2019-05-29 20:40:48 +08:00
|
|
|
if ( getSkinFile($file) ) {
|
|
|
|
$html[] = '<link rel="stylesheet" href="'.cache_bust('skins/'.$skin.'/'.$file).'" type="text/css"/>';
|
2017-12-22 10:46:21 +08:00
|
|
|
}
|
|
|
|
}
|
2020-07-26 03:05:12 +08:00
|
|
|
$html[] = ''; // So we ge a trailing \n
|
2020-08-04 00:50:36 +08:00
|
|
|
return implode(PHP_EOL, $html);
|
2020-07-26 03:05:12 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
function output_cache_busted_stylesheet_links($files) {
|
|
|
|
$html = array();
|
|
|
|
foreach ( $files as $file ) {
|
|
|
|
$html[] = '<link rel="stylesheet" href="'.cache_bust($file).'" type="text/css"/>';
|
|
|
|
}
|
2020-08-03 23:49:45 +08:00
|
|
|
$html[] = ''; // So we ge a trailing \n
|
2020-08-04 00:50:36 +08:00
|
|
|
return implode(PHP_EOL, $html);
|
2017-12-22 10:46:21 +08:00
|
|
|
}
|
2008-07-14 21:54:50 +08:00
|
|
|
?>
|
2016-03-16 12:17:05 +08:00
|
|
|
<!DOCTYPE html>
|
|
|
|
<html lang="en">
|
2008-07-14 21:54:50 +08:00
|
|
|
<head>
|
2016-03-16 12:17:05 +08:00
|
|
|
<meta charset="utf-8">
|
|
|
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
2020-07-26 03:05:12 +08:00
|
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
2020-08-03 23:49:45 +08:00
|
|
|
<title><?php echo validHtmlStr(ZM_WEB_TITLE_PREFIX) . ' - ' . validHtmlStr($title) ?></title>
|
2017-10-02 23:55:36 +08:00
|
|
|
<?php
|
2020-07-26 03:05:12 +08:00
|
|
|
if ( file_exists("skins/$skin/css/$css/graphics/favicon.ico") ) {
|
2017-11-03 21:24:13 +08:00
|
|
|
echo "
|
|
|
|
<link rel=\"icon\" type=\"image/ico\" href=\"skins/$skin/css/$css/graphics/favicon.ico\"/>
|
|
|
|
<link rel=\"shortcut icon\" href=\"skins/$skin/css/$css/graphics/favicon.ico\"/>
|
|
|
|
";
|
2017-10-02 23:55:36 +08:00
|
|
|
} else {
|
2017-10-18 01:10:20 +08:00
|
|
|
echo '
|
|
|
|
<link rel="icon" type="image/ico" href="graphics/favicon.ico"/>
|
|
|
|
<link rel="shortcut icon" href="graphics/favicon.ico"/>
|
|
|
|
';
|
2017-10-02 23:55:36 +08:00
|
|
|
}
|
2020-07-26 03:05:12 +08:00
|
|
|
echo output_cache_busted_stylesheet_links(array(
|
|
|
|
'css/reset.css',
|
|
|
|
'css/overlay.css',
|
2020-08-16 04:44:54 +08:00
|
|
|
'css/font-awesome.min.css',
|
2020-07-26 03:05:12 +08:00
|
|
|
'css/bootstrap.min.css',
|
2020-08-16 04:27:58 +08:00
|
|
|
'css/bootstrap-table.min.css',
|
2020-08-27 20:46:52 +08:00
|
|
|
'css/bootstrap-table-page-jump-to.min.css',
|
2020-07-26 03:05:12 +08:00
|
|
|
));
|
|
|
|
|
2020-08-03 23:49:45 +08:00
|
|
|
echo output_link_if_exists(array(
|
2018-01-11 23:57:07 +08:00
|
|
|
'css/base/skin.css',
|
|
|
|
'css/base/views/'.$basename.'.css',
|
2018-12-05 22:05:10 +08:00
|
|
|
'js/dateTimePicker/jquery-ui-timepicker-addon.css',
|
|
|
|
'js/jquery-ui-1.12.1/jquery-ui.structure.min.css',
|
2020-08-03 23:49:45 +08:00
|
|
|
));
|
2019-06-23 02:10:55 +08:00
|
|
|
if ( $css != 'base' )
|
2020-08-03 23:49:45 +08:00
|
|
|
echo output_link_if_exists(array(
|
2019-06-23 02:10:55 +08:00
|
|
|
'css/'.$css.'/skin.css',
|
|
|
|
'css/'.$css.'/views/'.$basename.'.css',
|
|
|
|
'css/'.$css.'/jquery-ui-theme.css',
|
2020-08-03 23:49:45 +08:00
|
|
|
));
|
2018-01-13 03:25:15 +08:00
|
|
|
?>
|
2020-08-03 23:49:45 +08:00
|
|
|
<link rel="stylesheet" href="skins/classic/js/jquery-ui-1.12.1/jquery-ui.theme.min.css" type="text/css"/>
|
|
|
|
<?php #Chosen can't be cache-busted because it loads sprites by relative path ?>
|
|
|
|
<link rel="stylesheet" href="skins/classic/js/chosen/chosen.min.css" type="text/css"/>
|
2018-01-13 03:25:15 +08:00
|
|
|
<?php
|
2019-02-13 05:41:08 +08:00
|
|
|
if ( $basename == 'watch' ) {
|
2020-02-25 02:13:54 +08:00
|
|
|
echo output_link_if_exists(array('/css/base/views/control.css'));
|
|
|
|
if ( $css != 'base' )
|
|
|
|
echo output_link_if_exists(array('/css/'.$css.'/views/control.css'));
|
2017-05-31 23:16:55 +08:00
|
|
|
}
|
2008-07-14 21:54:50 +08:00
|
|
|
?>
|
2020-09-03 05:27:31 +08:00
|
|
|
<style>
|
2008-07-14 21:54:50 +08:00
|
|
|
<?php
|
2019-09-29 02:23:23 +08:00
|
|
|
if ( $baseViewCssPhpFile ) {
|
|
|
|
require_once($baseViewCssPhpFile);
|
|
|
|
}
|
|
|
|
if ( $viewCssPhpFile ) {
|
2019-02-13 05:41:08 +08:00
|
|
|
require_once($viewCssPhpFile);
|
2019-09-29 02:23:23 +08:00
|
|
|
}
|
2008-07-14 21:54:50 +08:00
|
|
|
?>
|
|
|
|
</style>
|
2017-12-22 10:46:21 +08:00
|
|
|
|
2008-07-14 21:54:50 +08:00
|
|
|
</head>
|
|
|
|
<?php
|
2020-08-04 22:47:37 +08:00
|
|
|
echo ob_get_clean();
|
2017-06-16 00:13:40 +08:00
|
|
|
} // end function xhtmlHeaders( $file, $title )
|
2016-05-07 02:30:32 +08:00
|
|
|
|
2018-11-08 01:33:54 +08:00
|
|
|
// Outputs an opening body tag, and any additional content that should go at the very top, like warnings and error messages.
|
|
|
|
function getBodyTopHTML() {
|
|
|
|
echo '
|
|
|
|
<body>
|
|
|
|
<noscript>
|
|
|
|
<div style="background-color:red;color:white;font-size:x-large;">
|
2019-02-10 10:06:21 +08:00
|
|
|
'. validHtmlStr(ZM_WEB_TITLE) .' requires Javascript. Please enable Javascript in your browser for this site.
|
2018-11-08 01:33:54 +08:00
|
|
|
|
|
|
|
</div>
|
|
|
|
</noscript>
|
|
|
|
';
|
|
|
|
global $error_message;
|
|
|
|
if ( $error_message ) {
|
|
|
|
echo '<div class="error">'.$error_message.'</div>';
|
|
|
|
}
|
|
|
|
} // end function getBodyTopHTML
|
|
|
|
|
2020-08-03 02:01:20 +08:00
|
|
|
function getNavBarHTML() {
|
2019-02-12 06:14:33 +08:00
|
|
|
# Provide a facility to turn off the headers if you put navbar=0 into the url
|
2020-07-28 00:15:37 +08:00
|
|
|
if ( isset($_REQUEST['navbar']) and $_REQUEST['navbar'] == '0' )
|
2018-10-11 02:02:46 +08:00
|
|
|
return '';
|
2017-10-05 09:51:30 +08:00
|
|
|
|
2016-10-21 01:38:12 +08:00
|
|
|
global $running;
|
2016-05-07 03:16:48 +08:00
|
|
|
global $user;
|
2017-10-10 22:38:13 +08:00
|
|
|
global $bandwidth_options;
|
2017-10-02 23:25:51 +08:00
|
|
|
global $view;
|
2020-08-27 05:28:11 +08:00
|
|
|
global $skin;
|
|
|
|
|
2020-08-03 02:01:20 +08:00
|
|
|
ob_start();
|
2020-08-02 05:16:23 +08:00
|
|
|
|
2020-08-01 05:03:37 +08:00
|
|
|
if ( ZM_WEB_NAVBAR_TYPE == "normal" ) {
|
2020-08-27 06:06:01 +08:00
|
|
|
echo getNormalNavBarHTML($running, $user, $bandwidth_options, $view, $skin);
|
2020-07-31 05:44:58 +08:00
|
|
|
} else {
|
2020-08-27 06:06:01 +08:00
|
|
|
echo getCollapsedNavBarHTML($running, $user, $bandwidth_options, $view, $skin);
|
2020-07-31 05:44:58 +08:00
|
|
|
}
|
|
|
|
|
2020-08-02 05:16:23 +08:00
|
|
|
return ob_get_clean();
|
2020-07-31 05:44:58 +08:00
|
|
|
}
|
|
|
|
|
2020-08-01 05:03:37 +08:00
|
|
|
//
|
2020-07-31 05:44:58 +08:00
|
|
|
// The legacy navigation bar that collapses into a pulldown menu on small screens.
|
2020-08-01 05:03:37 +08:00
|
|
|
//
|
2020-08-27 06:06:01 +08:00
|
|
|
function getNormalNavBarHTML($running, $user, $bandwidth_options, $view, $skin) {
|
2020-07-31 05:44:58 +08:00
|
|
|
|
2020-08-03 02:01:20 +08:00
|
|
|
$status = runtimeStatus($running);
|
2020-07-24 01:52:21 +08:00
|
|
|
|
2016-05-07 02:30:32 +08:00
|
|
|
?>
|
2020-08-03 02:48:15 +08:00
|
|
|
<div class="fixed-top container-fluid p-0">
|
2020-07-26 02:18:09 +08:00
|
|
|
<nav class="navbar navbar-expand-md navbar-dark bg-dark justify-content-center flex-row">
|
|
|
|
|
2020-07-29 01:20:18 +08:00
|
|
|
<div class="navbar-brand justify-content-start align-self-start">
|
2020-07-26 02:18:09 +08:00
|
|
|
<?php echo getNavBrandHTML() ?>
|
2020-07-23 02:12:59 +08:00
|
|
|
</div>
|
2020-07-26 02:18:09 +08:00
|
|
|
|
|
|
|
<!-- the Navigation Bar Hamburger Button -->
|
2020-07-27 23:13:02 +08:00
|
|
|
<div class="nav justify-content-end flex-grow-1">
|
|
|
|
<button type="button" class="navbar-toggler" data-toggle="collapse" data-target="#main-header-nav" aria-expanded="false">
|
|
|
|
<span class="sr-only">Toggle navigation</span>
|
|
|
|
<span class="navbar-toggler-icon"></span>
|
|
|
|
</button>
|
|
|
|
</div>
|
2020-07-26 02:18:09 +08:00
|
|
|
|
2020-07-23 02:12:59 +08:00
|
|
|
<div class="collapse navbar-collapse" id="main-header-nav">
|
2019-12-03 01:33:13 +08:00
|
|
|
<?php
|
2020-07-24 01:52:21 +08:00
|
|
|
|
|
|
|
// *** Build the navigation bar menu items ***
|
|
|
|
if ( $user and $user['Username'] ) {
|
2020-07-31 05:56:38 +08:00
|
|
|
echo '<ul class="navbar-nav align-self-start justify-content-center">';
|
2020-07-26 02:18:09 +08:00
|
|
|
echo getConsoleHTML();
|
|
|
|
echo getOptionsHTML();
|
|
|
|
echo getLogHTML();
|
|
|
|
echo getDevicesHTML();
|
2020-07-31 05:14:41 +08:00
|
|
|
echo getGroupsHTML($view);
|
2020-08-27 06:06:01 +08:00
|
|
|
echo getFilterHTML($view);
|
2020-07-31 05:14:41 +08:00
|
|
|
echo getCycleHTML($view);
|
|
|
|
echo getMontageHTML($view);
|
|
|
|
echo getMontageReviewHTML($view);
|
|
|
|
echo getRprtEvntAuditHTML($view);
|
2020-07-26 02:18:09 +08:00
|
|
|
echo getHeaderFlipHTML();
|
2020-07-24 01:52:21 +08:00
|
|
|
echo '</ul>';
|
|
|
|
|
2020-07-29 01:20:18 +08:00
|
|
|
echo '<ul class="nav navbar-nav justify-content-end align-self-start flex-grow-1">';
|
2020-08-27 05:28:11 +08:00
|
|
|
echo getAcctCircleHTML($skin, $user);
|
2020-07-24 01:52:21 +08:00
|
|
|
echo getStatusBtnHTML($status);
|
|
|
|
echo '</ul>';
|
2020-07-26 02:18:09 +08:00
|
|
|
}
|
2020-07-24 01:52:21 +08:00
|
|
|
?>
|
2020-07-26 02:18:09 +08:00
|
|
|
</div>
|
|
|
|
</nav><!-- End First Navbar -->
|
|
|
|
|
|
|
|
<nav class="navbar navbar-expand-md bg-dark justify-content-center p-0">
|
|
|
|
<div class="container-fluid" id="panel"<?php echo ( isset($_COOKIE['zmHeaderFlip']) and $_COOKIE['zmHeaderFlip'] == 'down' ) ? 'style="display:none;"' : '' ?>>
|
2017-12-02 11:15:29 +08:00
|
|
|
<?php
|
2020-07-24 01:52:21 +08:00
|
|
|
|
2020-07-28 00:15:37 +08:00
|
|
|
if ( (!ZM_OPT_USE_AUTH) or $user ) {
|
2020-07-24 01:52:21 +08:00
|
|
|
|
|
|
|
// *** Build the statistics shown on the navigation bar ***
|
2017-12-02 11:15:29 +08:00
|
|
|
?>
|
2020-07-28 00:15:37 +08:00
|
|
|
<div id="reload" class="container-fluid">
|
|
|
|
<ul id="Bandwidth" class="navbar-nav justify-content-start">
|
|
|
|
<?php echo getBandwidthHTML($bandwidth_options, $user) ?>
|
|
|
|
</ul>
|
|
|
|
|
2020-08-01 05:03:37 +08:00
|
|
|
<ul class="navbar-nav list-inline justify-content-center">
|
2020-07-28 00:15:37 +08:00
|
|
|
<?php
|
|
|
|
echo getSysLoadHTML();
|
|
|
|
echo getDbConHTML();
|
|
|
|
echo getStorageHTML();
|
|
|
|
echo getShmHTML();
|
2020-08-03 03:49:19 +08:00
|
|
|
echo getLogIconHTML();
|
2020-07-28 00:15:37 +08:00
|
|
|
?>
|
|
|
|
</ul>
|
|
|
|
|
|
|
|
<ul id="Version" class="nav navbar-nav justify-content-end">
|
2020-07-31 20:31:40 +08:00
|
|
|
<?php echo getZMVersionHTML() ?>
|
2020-07-28 00:15:37 +08:00
|
|
|
</ul>
|
|
|
|
</div>
|
|
|
|
<?php
|
|
|
|
} // end if (!ZM_OPT_USE_AUTH) or $user )
|
|
|
|
?>
|
2020-07-31 00:55:54 +08:00
|
|
|
</div><!-- End Collapsible Panel -->
|
2020-07-26 02:18:09 +08:00
|
|
|
</nav><!-- End Second Navbar -->
|
2020-08-03 02:48:15 +08:00
|
|
|
|
|
|
|
<nav class="navbar navbar-expand-md bg-dark justify-content-center p-0">
|
|
|
|
<?php echo getConsoleBannerHTML() ?>
|
|
|
|
</nav><!-- End Third Navbar -->
|
2020-07-26 02:18:09 +08:00
|
|
|
</div>
|
2020-07-23 02:12:59 +08:00
|
|
|
<?php
|
2020-07-31 05:44:58 +08:00
|
|
|
} // end function getNormalNavBarHTML()
|
2020-07-24 01:52:21 +08:00
|
|
|
|
2020-07-31 05:44:58 +08:00
|
|
|
//
|
2020-08-01 05:03:37 +08:00
|
|
|
// A new, slimmer navigation bar, permanently collapsed into a dropdown
|
2020-07-31 05:44:58 +08:00
|
|
|
//
|
2020-08-27 06:06:01 +08:00
|
|
|
function getCollapsedNavBarHTML($running, $user, $bandwidth_options, $view, $skin) {
|
2020-08-01 22:07:21 +08:00
|
|
|
|
2020-08-03 02:01:20 +08:00
|
|
|
$status = runtimeStatus($running);
|
2020-08-01 22:07:21 +08:00
|
|
|
|
2020-08-01 05:03:37 +08:00
|
|
|
?>
|
2020-08-03 02:48:15 +08:00
|
|
|
<div class="fixed-top container-fluid p-0">
|
|
|
|
<nav class="navbar navbar-dark bg-dark px-1 flex-nowrap">
|
2020-08-01 05:03:37 +08:00
|
|
|
|
|
|
|
<div class="navbar-brand align-self-start px-0">
|
|
|
|
<?php echo getNavBrandHTML() ?>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<nav class="navbar navbar-expand-md align-self-start px-0">
|
|
|
|
<ul class="nav navbar-nav list-group px-0">
|
|
|
|
<?php
|
|
|
|
|
2020-08-01 22:07:21 +08:00
|
|
|
// *** Build the statistics shown on the navigation bar ***
|
|
|
|
if ( (!ZM_OPT_USE_AUTH) or $user ) {
|
2020-08-01 05:03:37 +08:00
|
|
|
?>
|
2020-08-01 22:07:21 +08:00
|
|
|
<div id="reload" class="collapse navbar-collapse px-0">
|
2020-08-01 05:03:37 +08:00
|
|
|
|
|
|
|
<ul id="Version" class="pr-2">
|
|
|
|
<?php echo getZMVersionHTML() ?>
|
|
|
|
</ul>
|
|
|
|
|
|
|
|
<ul id="Bandwidth" class="px-2">
|
|
|
|
<?php echo getBandwidthHTML($bandwidth_options, $user) ?>
|
|
|
|
</ul>
|
|
|
|
|
|
|
|
<?php
|
|
|
|
echo getSysLoadHTML();
|
|
|
|
echo getDbConHTML();
|
|
|
|
echo getStorageHTML();
|
|
|
|
echo getShmHTML();
|
2020-08-03 03:49:19 +08:00
|
|
|
echo getLogIconHTML();
|
2020-08-01 05:03:37 +08:00
|
|
|
?>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
2020-08-01 22:07:21 +08:00
|
|
|
<?php
|
|
|
|
} // end if (!ZM_OPT_USE_AUTH) or $user )
|
|
|
|
?>
|
2020-08-01 05:03:37 +08:00
|
|
|
</nav>
|
|
|
|
|
|
|
|
<ul class="list-group list-group-horizontal ml-auto">
|
|
|
|
<?php
|
2020-08-27 05:28:11 +08:00
|
|
|
echo getAcctCircleHTML($skin, $user);
|
2020-08-01 05:03:37 +08:00
|
|
|
echo getStatusBtnHTML($status);
|
|
|
|
?>
|
|
|
|
</ul>
|
|
|
|
</ul>
|
|
|
|
|
|
|
|
<!-- the Navigation Bar Hamburger Button -->
|
2020-08-01 22:07:21 +08:00
|
|
|
<?php if ( (!ZM_OPT_USE_AUTH) or $user ) { ?>
|
2020-08-02 05:16:23 +08:00
|
|
|
<button type="button" class="navbar-toggler" data-toggle="collapse" data-target="#main-header-nav" aria-haspopup="true" aria-expanded="false">
|
2020-08-01 05:03:37 +08:00
|
|
|
<span class="sr-only">Toggle navigation</span>
|
|
|
|
<span class="navbar-toggler-icon"></span>
|
|
|
|
</button>
|
2020-08-01 22:07:21 +08:00
|
|
|
<?php } ?>
|
2020-08-01 05:03:37 +08:00
|
|
|
|
|
|
|
<div style="background-color:#485460" class="dropdown-menu dropdown-menu-right px-3" id="main-header-nav">
|
|
|
|
<?php
|
|
|
|
if ( $user and $user['Username'] ) {
|
|
|
|
echo '<ul class="navbar-nav">';
|
|
|
|
echo getConsoleHTML();
|
|
|
|
echo getOptionsHTML();
|
|
|
|
echo getLogHTML();
|
|
|
|
echo getDevicesHTML();
|
|
|
|
echo getGroupsHTML($view);
|
2020-08-27 06:06:01 +08:00
|
|
|
echo getFilterHTML($view);
|
2020-08-01 05:03:37 +08:00
|
|
|
echo getCycleHTML($view);
|
|
|
|
echo getMontageHTML($view);
|
|
|
|
echo getMontageReviewHTML($view);
|
|
|
|
echo getRprtEvntAuditHTML($view);
|
|
|
|
echo '</ul>';
|
|
|
|
}
|
|
|
|
?>
|
|
|
|
</div>
|
|
|
|
|
2020-08-03 02:48:15 +08:00
|
|
|
</nav><!-- End First Navbar -->
|
2020-08-01 05:03:37 +08:00
|
|
|
|
2020-08-03 02:48:15 +08:00
|
|
|
<nav class="navbar navbar-expand-md bg-dark justify-content-center p-0">
|
|
|
|
<?php echo getConsoleBannerHTML() ?>
|
|
|
|
</nav><!-- End Second Navbar -->
|
|
|
|
</div>
|
|
|
|
|
2020-08-01 05:03:37 +08:00
|
|
|
<?php
|
2020-07-31 05:44:58 +08:00
|
|
|
} // End function getCollapsedNavBarHTML
|
2020-07-23 02:12:59 +08:00
|
|
|
|
2020-07-23 23:52:12 +08:00
|
|
|
// Returns the html representing the current unix style system load
|
2020-07-23 02:12:59 +08:00
|
|
|
function getSysLoadHTML() {
|
2020-08-03 23:49:45 +08:00
|
|
|
$result = '';
|
2020-07-23 02:12:59 +08:00
|
|
|
|
2020-08-03 00:31:36 +08:00
|
|
|
$result .= '<li id="getSysLoadHTML" class="Load nav-item mx-2">'.PHP_EOL;
|
|
|
|
$result .= '<i class="material-icons md-18">trending_up</i>'.PHP_EOL;
|
|
|
|
$result .= ' '.translate('Load').': '.getLoad().PHP_EOL;
|
|
|
|
$result .= '</li>'.PHP_EOL;
|
|
|
|
|
|
|
|
return $result;
|
2020-07-23 02:12:59 +08:00
|
|
|
}
|
|
|
|
|
2020-07-23 23:52:12 +08:00
|
|
|
// Returns the html representing the current number of connections made to the database
|
2020-07-23 02:12:59 +08:00
|
|
|
function getDbConHTML() {
|
2020-08-03 23:49:45 +08:00
|
|
|
$result = '';
|
2020-08-03 00:31:36 +08:00
|
|
|
|
2019-12-14 06:47:51 +08:00
|
|
|
$connections = dbFetchOne('SHOW status WHERE variable_name=\'threads_connected\'', 'Value');
|
|
|
|
$max_connections = dbFetchOne('SHOW variables WHERE variable_name=\'max_connections\'', 'Value');
|
2018-10-29 21:59:26 +08:00
|
|
|
$percent_used = $max_connections ? 100 * $connections / $max_connections : 100;
|
2020-08-03 23:49:45 +08:00
|
|
|
$class = ( $percent_used > 90 ) ? ' text-warning' : '';
|
2020-07-23 02:12:59 +08:00
|
|
|
|
2020-08-03 23:49:45 +08:00
|
|
|
$result .= '<li id="getDbConHTML" class="nav-item dropdown mx-2' .$class. '">'.PHP_EOL;
|
2020-08-03 00:31:36 +08:00
|
|
|
$result .= '<i class="material-icons md-18 mr-1">storage</i>'.PHP_EOL;
|
|
|
|
$result .= translate('DB'). ': ' .$connections. '/' .$max_connections.PHP_EOL;
|
|
|
|
$result .= '</li>'.PHP_EOL;
|
|
|
|
|
|
|
|
return $result;
|
2020-07-23 02:12:59 +08:00
|
|
|
}
|
|
|
|
|
2020-08-03 23:49:45 +08:00
|
|
|
// Returns an html dropdown showing capacity of all storage areas
|
2020-07-23 02:12:59 +08:00
|
|
|
function getStorageHTML() {
|
2020-09-08 01:28:55 +08:00
|
|
|
$result = '';
|
2020-07-23 02:12:59 +08:00
|
|
|
|
|
|
|
$func = function($S) {
|
2018-04-18 05:14:40 +08:00
|
|
|
$class = '';
|
|
|
|
if ( $S->disk_usage_percent() > 98 ) {
|
2020-07-26 23:41:05 +08:00
|
|
|
$class = 'text-danger';
|
2018-04-18 05:14:40 +08:00
|
|
|
} else if ( $S->disk_usage_percent() > 90 ) {
|
2020-07-26 23:41:05 +08:00
|
|
|
$class = 'text-warning';
|
2018-04-18 05:14:40 +08:00
|
|
|
}
|
|
|
|
$title = human_filesize($S->disk_used_space()) . ' of ' . human_filesize($S->disk_total_space()).
|
|
|
|
( ( $S->disk_used_space() != $S->event_disk_space() ) ? ' ' .human_filesize($S->event_disk_space()) . ' used by events' : '' );
|
2020-08-05 05:05:33 +08:00
|
|
|
return '<a class="dropdown-item '.$class.'" title="'.$title.'" href="?view=options&tab=storage">'.$S->Name() . ': ' . $S->disk_usage_percent().'%' . '</a>';
|
2020-07-23 02:12:59 +08:00
|
|
|
};
|
2018-04-18 05:14:40 +08:00
|
|
|
|
2020-07-23 02:12:59 +08:00
|
|
|
$storage_areas = ZM\Storage::find(array('Enabled'=>true));
|
2020-08-03 23:43:24 +08:00
|
|
|
$num_storage_areas = count($storage_areas);
|
|
|
|
|
|
|
|
$full_warning = 0;
|
|
|
|
$full_error = 0;
|
|
|
|
foreach ( $storage_areas as $area ) {
|
|
|
|
if ( $area->disk_usage_percent() > 98 ) { $full_error++; continue; }
|
|
|
|
if ( $area->disk_usage_percent() > 90 ) $full_warning++;
|
|
|
|
}
|
|
|
|
|
2020-08-05 05:53:39 +08:00
|
|
|
$class = '';
|
2020-08-03 23:43:24 +08:00
|
|
|
if ( $full_error ) {
|
|
|
|
$class = 'text-danger';
|
|
|
|
} else if ( $full_warning ) {
|
|
|
|
$class = 'text-warning';
|
2020-07-23 02:12:59 +08:00
|
|
|
}
|
2020-08-03 23:43:24 +08:00
|
|
|
|
2020-08-05 05:53:39 +08:00
|
|
|
$result .= '<li id="getStorageHTML" class="nav-item dropdown mx-2">'.PHP_EOL;
|
|
|
|
$result .= '<a class="dropdown-toggle mr-2 '.$class.'" href="#" id="dropdown_storage" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><i class="material-icons md-18 mr-1">folder_shared</i>Storage</a>'.PHP_EOL;
|
2020-08-14 00:39:51 +08:00
|
|
|
$result .= '<div class="dropdown-menu" aria-labelledby="dropdown_storage">'.PHP_EOL;
|
2020-08-03 23:43:24 +08:00
|
|
|
|
|
|
|
foreach ( $storage_areas as $area ) {
|
|
|
|
$result .= $func($area).PHP_EOL;
|
|
|
|
}
|
|
|
|
$result .= '</div>'.PHP_EOL;
|
2020-08-03 00:31:36 +08:00
|
|
|
$result .= '</li>'.PHP_EOL;
|
|
|
|
|
|
|
|
return $result;
|
2020-07-23 02:12:59 +08:00
|
|
|
}
|
|
|
|
|
2020-07-23 23:52:12 +08:00
|
|
|
// Returns the html representing the current capacity of mapped memory filesystem (usually /dev/shm)
|
2020-07-23 02:12:59 +08:00
|
|
|
function getShmHTML() {
|
2020-08-03 23:49:45 +08:00
|
|
|
$result = '';
|
2020-08-03 00:31:36 +08:00
|
|
|
|
2020-02-11 03:20:46 +08:00
|
|
|
$shm_percent = getDiskPercent(ZM_PATH_MAP);
|
2020-05-22 01:32:33 +08:00
|
|
|
$shm_total_space = disk_total_space(ZM_PATH_MAP);
|
2020-05-22 01:34:09 +08:00
|
|
|
$shm_used = $shm_total_space - disk_free_space(ZM_PATH_MAP);
|
2020-05-22 01:32:33 +08:00
|
|
|
|
2020-02-11 03:20:46 +08:00
|
|
|
$class = '';
|
|
|
|
if ( $shm_percent > 98 ) {
|
2020-07-26 23:41:05 +08:00
|
|
|
$class = 'text-danger';
|
2020-02-11 03:20:46 +08:00
|
|
|
} else if ( $shm_percent > 90 ) {
|
2020-07-26 23:41:05 +08:00
|
|
|
$class = 'text-warning';
|
2020-02-11 03:20:46 +08:00
|
|
|
}
|
2020-08-05 06:06:49 +08:00
|
|
|
$result .= ' <li id="getShmHTML" class="nav-item dropdown mx-2' .$class. '" title="' .human_filesize($shm_used). ' of ' .human_filesize($shm_total_space). '">' .ZM_PATH_MAP. ': '.$shm_percent.'%</li>'.PHP_EOL;
|
2020-08-03 00:31:36 +08:00
|
|
|
|
|
|
|
return $result;
|
2020-07-23 02:12:59 +08:00
|
|
|
}
|
|
|
|
|
2020-07-23 23:52:12 +08:00
|
|
|
// Returns the html representing the optional web console banner text
|
2020-07-23 02:12:59 +08:00
|
|
|
function getConsoleBannerHTML() {
|
2020-08-03 23:49:45 +08:00
|
|
|
$result = '';
|
2020-07-23 02:12:59 +08:00
|
|
|
|
|
|
|
if ( defined('ZM_WEB_CONSOLE_BANNER') and ZM_WEB_CONSOLE_BANNER != '' ) {
|
2020-08-03 02:48:15 +08:00
|
|
|
$result .= '<h2 id="getConsoleBannerHTML">'.validHtmlStr(ZM_WEB_CONSOLE_BANNER).'</h2>';
|
2020-07-23 02:12:59 +08:00
|
|
|
}
|
2020-08-03 00:31:36 +08:00
|
|
|
return $result;
|
2020-07-23 02:12:59 +08:00
|
|
|
}
|
|
|
|
|
2020-07-23 23:52:12 +08:00
|
|
|
// Returns the html representing the current high,medium,low bandwidth setting
|
2020-08-03 23:49:45 +08:00
|
|
|
function getBandwidthHTML($bandwidth_options, $user) {
|
2020-08-08 23:07:26 +08:00
|
|
|
|
|
|
|
# Limit available options to what are available in user
|
|
|
|
if ( $user && !empty($user['MaxBandwidth']) ) {
|
|
|
|
if ( $user['MaxBandwidth'] == 'low' ) {
|
|
|
|
unset($bandwidth_options['high']);
|
|
|
|
unset($bandwidth_options['medium']);
|
|
|
|
} else if ( $user['MaxBandwidth'] == 'medium' ) {
|
|
|
|
unset($bandwidth_options['high']);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-08-14 00:39:51 +08:00
|
|
|
$result = '<li id="getBandwidthHTML" class="nav-item dropdown mx-2">'.PHP_EOL;
|
|
|
|
$result .= '<a class="dropdown-toggle mr-2" href="#" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" id="dropdown_bandwidth"><i class="material-icons md-18 mr-1">network_check</i>'.translate($bandwidth_options[$_COOKIE['zmBandwidth']]).'</a>'.PHP_EOL;
|
2020-08-08 23:07:26 +08:00
|
|
|
|
2020-08-14 00:39:51 +08:00
|
|
|
$result .= '<div class="dropdown-menu" aria-labelledby="dropdown_bandwidth">'.PHP_EOL;
|
|
|
|
if ( count($bandwidth_options) > 1 ) {
|
|
|
|
if ( isset($bandwidth_options['high']) )
|
|
|
|
$result .= '<a data-pdsa-dropdown-val="high" class="dropdown-item" href="#">' .translate('High'). '</a>'.PHP_EOL;
|
|
|
|
if ( isset($bandwidth_options['medium']) )
|
|
|
|
$result .= '<a data-pdsa-dropdown-val="medium" class="dropdown-item" href="#">' .translate('Medium'). '</a>'.PHP_EOL;
|
|
|
|
# low is theoretically always available
|
2020-08-08 23:07:26 +08:00
|
|
|
$result .= '<a data-pdsa-dropdown-val="low" class="dropdown-item" href="#">' .translate('Low'). '</a>'.PHP_EOL;
|
2020-08-14 00:39:51 +08:00
|
|
|
}
|
2020-08-08 23:07:26 +08:00
|
|
|
$result .= '</div>'.PHP_EOL;
|
|
|
|
|
|
|
|
$result .= '</li>'.PHP_EOL;
|
|
|
|
|
2020-08-03 00:31:36 +08:00
|
|
|
return $result;
|
2020-07-23 02:12:59 +08:00
|
|
|
}
|
|
|
|
|
2020-07-23 23:52:12 +08:00
|
|
|
// Returns the html representing the version of ZoneMinder
|
2020-07-31 20:31:40 +08:00
|
|
|
function getZMVersionHTML() {
|
2020-08-03 23:49:45 +08:00
|
|
|
$result = '';
|
2020-08-10 03:18:44 +08:00
|
|
|
$content = '';
|
2020-08-03 00:31:36 +08:00
|
|
|
|
2020-08-10 01:20:11 +08:00
|
|
|
if ( ZM_DYN_DB_VERSION && (ZM_DYN_DB_VERSION != ZM_VERSION) ) { // Must upgrade before proceeding
|
|
|
|
$class = 'text-danger';
|
|
|
|
$tt_text = translate('RunLocalUpdate');
|
2020-08-10 03:18:44 +08:00
|
|
|
$content = 'v'.ZM_VERSION.PHP_EOL;
|
2020-08-10 03:25:11 +08:00
|
|
|
} else if ( verNum( ZM_DYN_LAST_VERSION ) <= verNum( ZM_VERSION ) ) { // No update needed
|
2020-08-10 01:20:11 +08:00
|
|
|
$class = ''; // Don't change the text color under normal conditions
|
|
|
|
$tt_text = translate('UpdateNotNecessary');
|
2020-08-10 03:18:44 +08:00
|
|
|
$content = 'v'.ZM_VERSION.PHP_EOL;
|
|
|
|
} else if ( canEdit('System') ) { // An update is available and the user is an administrator
|
2020-08-10 01:20:11 +08:00
|
|
|
$class = 'text-warning';
|
|
|
|
$tt_text = translate('UpdateAvailable');
|
2020-08-14 00:39:51 +08:00
|
|
|
$content = '<a class="dropdown ' .$class. '" data-toggle="dropdown" href="#" id="dropdown_reminder">v' .ZM_VERSION. '</a>'.PHP_EOL;
|
|
|
|
$content .= '<div class="dropdown-menu" aria-labelledby="dropdown_reminder">'.PHP_EOL;
|
2020-08-10 03:18:44 +08:00
|
|
|
$content .= '<h6 class="dropdown-header">' .translate('UpdateAvailable'). '</h6>'.PHP_EOL;
|
|
|
|
$content .= '<a class="dropdown-item" data-pdsa-dropdown-val="ignore" href="#">' .translate('VersionIgnore'). '</a>'.PHP_EOL;
|
|
|
|
$content .= '<a class="dropdown-item" data-pdsa-dropdown-val="hour" href="#">' .translate('VersionRemindHour'). '</a>'.PHP_EOL;
|
|
|
|
$content .= '<a class="dropdown-item" data-pdsa-dropdown-val="day" href="#">' .translate('VersionRemindDay'). '</a>'.PHP_EOL;
|
|
|
|
$content .= '<a class="dropdown-item" data-pdsa-dropdown-val="week" href="#">' .translate('VersionRemindWeek'). '</a>'.PHP_EOL;
|
|
|
|
$content .= '<a class="dropdown-item" data-pdsa-dropdown-val="month" href="#">' .translate('VersionRemindMonth'). '</a>'.PHP_EOL;
|
|
|
|
$content .= '<a class="dropdown-item" data-pdsa-dropdown-val="never" href="#">' .translate('VersionRemindNever'). '</a>'.PHP_EOL;
|
|
|
|
$content .= '</div>'.PHP_EOL;
|
|
|
|
} else { // An update is available and the user is NOT an administrator
|
|
|
|
$class = 'text-warning';
|
|
|
|
$tt_text = translate('UpdateAvailable');
|
|
|
|
$content = 'v'.ZM_VERSION.PHP_EOL;
|
2020-08-10 01:20:11 +08:00
|
|
|
}
|
|
|
|
|
2020-08-14 00:39:51 +08:00
|
|
|
$result .= '<li id="getZMVersionHTML" class="nav-item dropdown ' .$class. '" data-placement="bottom" title="' .$tt_text. '">'.PHP_EOL;
|
2020-08-10 03:18:44 +08:00
|
|
|
$result .= $content;
|
2020-08-10 01:20:11 +08:00
|
|
|
$result .= '</li>'.PHP_EOL;
|
2020-08-03 00:31:36 +08:00
|
|
|
|
|
|
|
return $result;
|
2020-07-23 02:12:59 +08:00
|
|
|
}
|
2017-07-13 22:07:23 +08:00
|
|
|
|
2020-08-04 04:22:46 +08:00
|
|
|
// Returns the html representing the ZoneMinder logo and about menu
|
2020-07-24 01:52:21 +08:00
|
|
|
function getNavBrandHTML() {
|
2020-08-03 23:49:45 +08:00
|
|
|
$result = '';
|
2020-08-04 04:22:46 +08:00
|
|
|
|
2020-08-04 04:45:27 +08:00
|
|
|
if ( ZM_HOME_ABOUT ) {
|
2020-08-04 04:22:46 +08:00
|
|
|
$result .= '<a id="getNavBrandHTML" class="dropdown" data-toggle="dropdown" href="#">ZoneMinder</a>'.PHP_EOL;
|
|
|
|
$result .= '<ul style="background-color:#485460" class="dropdown-menu">'.PHP_EOL;
|
2020-08-04 04:45:27 +08:00
|
|
|
$result .= '<li><a class="dropdown-item" href="https://zoneminder.com/" target="_blank">ZoneMinder</a></li>'.PHP_EOL;
|
|
|
|
$result .= '<li><a class="dropdown-item" href="https://zoneminder.readthedocs.io/en/stable/" target="_blank">Documentation</a></li>'.PHP_EOL;
|
|
|
|
$result .= '<li><a class="dropdown-item" href="https://forums.zoneminder.com/" target="_blank">Support</a></li>'.PHP_EOL;
|
2020-08-04 04:22:46 +08:00
|
|
|
$result .= '</ul>'.PHP_EOL;
|
|
|
|
} else {
|
2020-08-03 00:31:36 +08:00
|
|
|
$result .= '<a id="getNavBrandHTML" href="' .validHtmlStr(ZM_HOME_URL). '" target="' .validHtmlStr(ZM_WEB_TITLE). '">' .ZM_HOME_CONTENT. '</a>'.PHP_EOL;
|
2020-08-04 04:22:46 +08:00
|
|
|
}
|
2020-08-03 00:31:36 +08:00
|
|
|
|
|
|
|
return $result;
|
2020-07-24 01:52:21 +08:00
|
|
|
}
|
|
|
|
|
2020-07-23 23:52:12 +08:00
|
|
|
// Returns the html representing the Console menu item
|
|
|
|
function getConsoleHTML() {
|
2020-08-03 23:49:45 +08:00
|
|
|
$result = '';
|
2020-08-03 00:31:36 +08:00
|
|
|
|
2020-07-23 23:52:12 +08:00
|
|
|
if ( canView('Monitors') ) {
|
2020-08-03 00:31:36 +08:00
|
|
|
$result .= '<li id="getConsoleHTML" class="nav-item dropdown"><a class="nav-link" href="?view=console">'.translate('Console').'</a></li>'.PHP_EOL;
|
2020-07-23 23:52:12 +08:00
|
|
|
}
|
2020-08-03 00:31:36 +08:00
|
|
|
|
|
|
|
return $result;
|
2020-07-23 23:52:12 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
// Returns the html representing the Options menu item
|
|
|
|
function getOptionsHTML() {
|
2020-08-03 23:49:45 +08:00
|
|
|
$result = '';
|
2020-08-03 00:31:36 +08:00
|
|
|
|
2020-07-23 23:52:12 +08:00
|
|
|
if ( canView('System') ) {
|
2020-08-03 00:31:36 +08:00
|
|
|
$result .= '<li id="getOptionsHTML" class="nav-item dropdown"><a class="nav-link" href="?view=options">'.translate('Options').'</a></li>'.PHP_EOL;
|
2020-07-23 23:52:12 +08:00
|
|
|
}
|
2020-08-03 00:31:36 +08:00
|
|
|
|
|
|
|
return $result;
|
2020-07-23 23:52:12 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
// Returns the html representing the Log menu item
|
|
|
|
function getLogHTML() {
|
2020-08-03 23:49:45 +08:00
|
|
|
$result = '';
|
2020-08-03 00:31:36 +08:00
|
|
|
|
2020-07-23 23:52:12 +08:00
|
|
|
if ( canView('System') ) {
|
|
|
|
if ( ZM\logToDatabase() > ZM\Logger::NOLOG ) {
|
2020-07-26 23:41:05 +08:00
|
|
|
$logstate = logState();
|
2020-07-30 03:42:06 +08:00
|
|
|
$class = ($logstate == 'ok') ? 'text-success' : ($logstate == 'alert' ? 'text-warning' : (($logstate == 'alarm' ? 'text-danger' : '')));
|
2020-08-05 06:06:49 +08:00
|
|
|
$result .= '<li id="getLogHTML" class="nav-item dropdown mx-2">'.makePopupLink('?view=log', 'zmLog', 'log', '<span class="nav-link '.$class.'">'.translate('Log').'</span>').'</li>'.PHP_EOL;
|
2020-07-23 23:52:12 +08:00
|
|
|
}
|
|
|
|
}
|
2020-08-03 00:31:36 +08:00
|
|
|
|
|
|
|
return $result;
|
2020-07-23 23:52:12 +08:00
|
|
|
}
|
|
|
|
|
2020-08-03 03:49:19 +08:00
|
|
|
// Returns the html representing the log icon
|
|
|
|
function getLogIconHTML() {
|
2020-08-03 23:49:45 +08:00
|
|
|
$result = '';
|
2020-08-03 03:49:19 +08:00
|
|
|
|
|
|
|
if ( canView('System') ) {
|
|
|
|
if ( ZM\logToDatabase() > ZM\Logger::NOLOG ) {
|
|
|
|
$logstate = logState();
|
2020-08-03 23:43:24 +08:00
|
|
|
$class = ( $logstate == 'alert' ) ? 'text-warning' : (( $logstate == 'alarm' ) ? 'text-danger' : '');
|
2020-08-03 23:49:45 +08:00
|
|
|
$result .= '<li id="getLogIconHTML" class="nav-item dropdown">'.
|
|
|
|
makePopupLink('?view=log', 'zmLog', 'log', '<span class="mx-1 ' .$class. '"><i class="material-icons md-18">report</i>'.translate('Log').'</span>').
|
|
|
|
'</li>'.PHP_EOL;
|
2020-08-03 03:49:19 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return $result;
|
|
|
|
}
|
|
|
|
|
2020-07-23 23:52:12 +08:00
|
|
|
// Returns the html representing the X10 Devices menu item
|
|
|
|
function getDevicesHTML() {
|
2020-08-03 23:49:45 +08:00
|
|
|
$result = '';
|
2020-08-03 00:31:36 +08:00
|
|
|
|
2020-07-23 23:52:12 +08:00
|
|
|
if ( ZM_OPT_X10 && canView('Devices') ) {
|
2020-08-03 00:31:36 +08:00
|
|
|
$result .= '<li id="getDevicesHTML" class="nav-item dropdown"><a class="nav-link" href="?view=devices">Devices</a></li>'.PHP_EOL;
|
2020-07-23 23:52:12 +08:00
|
|
|
}
|
2020-08-03 00:31:36 +08:00
|
|
|
|
|
|
|
return $result;
|
2020-07-23 23:52:12 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
// Returns the html representing the Groups menu item
|
2020-07-31 05:14:41 +08:00
|
|
|
function getGroupsHTML($view) {
|
2020-08-03 23:49:45 +08:00
|
|
|
$result = '';
|
2020-08-03 00:31:36 +08:00
|
|
|
|
2020-08-03 00:05:52 +08:00
|
|
|
$class = $view == 'groups' ? ' selected' : '';
|
2020-08-03 02:01:20 +08:00
|
|
|
$result .= '<li id="getGroupsHTML" class="nav-item dropdown"><a class="nav-link'.$class.'" href="?view=groups">'. translate('Groups') .'</a></li>'.PHP_EOL;
|
2020-08-03 00:31:36 +08:00
|
|
|
|
|
|
|
return $result;
|
2020-07-23 23:52:12 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
// Returns the html representing the Filter menu item
|
2020-08-27 06:06:01 +08:00
|
|
|
function getFilterHTML($view) {
|
2020-08-03 23:49:45 +08:00
|
|
|
$result = '';
|
2020-08-03 00:31:36 +08:00
|
|
|
|
2020-08-03 00:05:52 +08:00
|
|
|
$class = $view == 'filter' ? ' selected' : '';
|
2020-08-27 06:06:01 +08:00
|
|
|
$result .= '<li id="getFilterHTML" class="nav-item dropdown"><a class="nav-link'.$class.'" href="?view=filter">'.translate('Filters').'</a></li>'.PHP_EOL;
|
2020-08-03 00:31:36 +08:00
|
|
|
|
|
|
|
return $result;
|
2020-07-23 23:52:12 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
// Returns the html representing the Cycle menu item
|
2020-07-31 05:14:41 +08:00
|
|
|
function getCycleHTML($view) {
|
2020-08-03 23:49:45 +08:00
|
|
|
$result = '';
|
2020-08-03 00:31:36 +08:00
|
|
|
|
2020-07-23 23:52:12 +08:00
|
|
|
if ( canView('Stream') ) {
|
2020-08-03 00:05:52 +08:00
|
|
|
$class = $view == 'cycle' ? ' selected' : '';
|
2020-08-03 02:01:20 +08:00
|
|
|
$result .= '<li id="getCycleHTML" class="nav-item dropdown"><a class="nav-link'.$class.'" href="?view=cycle">' .translate('Cycle'). '</a></li>'.PHP_EOL;
|
2020-07-23 23:52:12 +08:00
|
|
|
}
|
2020-08-03 00:31:36 +08:00
|
|
|
|
|
|
|
return $result;
|
2020-07-23 23:52:12 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
// Returns the html representing the Montage menu item
|
2020-07-31 05:14:41 +08:00
|
|
|
function getMontageHTML($view) {
|
2020-08-03 23:49:45 +08:00
|
|
|
$result = '';
|
2020-08-03 00:31:36 +08:00
|
|
|
|
2020-07-23 23:52:12 +08:00
|
|
|
if ( canView('Stream') ) {
|
2020-08-03 00:05:52 +08:00
|
|
|
$class = $view == 'cycle' ? ' selected' : '';
|
2020-08-03 02:01:20 +08:00
|
|
|
$result .= '<li id="getMontageHTML" class="nav-item dropdown"><a class="nav-link'.$class.'" href="?view=montage">' .translate('Montage'). '</a></li>'.PHP_EOL;
|
2020-07-23 23:52:12 +08:00
|
|
|
}
|
2020-08-03 00:31:36 +08:00
|
|
|
|
|
|
|
return $result;
|
2020-07-23 23:52:12 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
// Returns the html representing the MontageReview menu item
|
2020-07-31 05:14:41 +08:00
|
|
|
function getMontageReviewHTML($view) {
|
2020-08-03 23:49:45 +08:00
|
|
|
$result = '';
|
2020-08-03 00:31:36 +08:00
|
|
|
|
2020-07-23 23:52:12 +08:00
|
|
|
if ( canView('Events') ) {
|
|
|
|
if ( isset($_REQUEST['filter']['Query']['terms']['attr']) ) {
|
|
|
|
$terms = $_REQUEST['filter']['Query']['terms'];
|
|
|
|
$count = 0;
|
|
|
|
foreach ($terms as $term) {
|
|
|
|
if ( $term['attr'] == 'StartDateTime' ) {
|
|
|
|
$count += 1;
|
|
|
|
if ($term['op'] == '>=') $minTime = $term['val'];
|
|
|
|
if ($term['op'] == '<=') $maxTime = $term['val'];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( $count == 2 ) {
|
|
|
|
$montageReviewQuery = '&minTime='.$minTime.'&maxTime='.$maxTime;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
$live = isset($montageReviewQuery) ? '&fit=1'.$montageReviewQuery.'&live=0' : '';
|
2020-08-03 00:05:52 +08:00
|
|
|
$class = $view == 'montagereview' ? ' selected' : '';
|
2020-08-03 02:01:20 +08:00
|
|
|
$result .= '<li id="getMontageReviewHTML" class="nav-item dropdown"><a class="nav-link'.$class.'" href="?view=montagereview' .$live. '">'.translate('MontageReview').'</a></li>'.PHP_EOL;
|
2020-07-23 23:52:12 +08:00
|
|
|
}
|
2020-08-03 00:31:36 +08:00
|
|
|
|
|
|
|
return $result;
|
2020-07-23 23:52:12 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
// Returns the html representing the Audit Events Report menu item
|
2020-07-31 05:14:41 +08:00
|
|
|
function getRprtEvntAuditHTML($view) {
|
2020-08-03 23:49:45 +08:00
|
|
|
$result = '';
|
2020-08-03 00:31:36 +08:00
|
|
|
|
2020-07-23 23:52:12 +08:00
|
|
|
if ( canView('Events') ) {
|
2020-08-03 00:05:52 +08:00
|
|
|
$class = $view == 'report_event_audit' ? ' selected' : '';
|
2020-08-03 02:01:20 +08:00
|
|
|
$result .= '<li id="getRprtEvntAuditHTML" class="nav-item dropdown"><a class="nav-link'.$class.'" href="?view=report_event_audit">'.translate('ReportEventAudit').'</a></li>'.PHP_EOL;
|
2020-07-23 23:52:12 +08:00
|
|
|
}
|
2020-08-03 00:31:36 +08:00
|
|
|
|
|
|
|
return $result;
|
2020-07-23 23:52:12 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
// Returns the html representing the header collapse toggle menu item
|
|
|
|
function getHeaderFlipHTML() {
|
2020-08-03 23:49:45 +08:00
|
|
|
$result = '';
|
2020-08-03 00:31:36 +08:00
|
|
|
|
2020-07-23 23:52:12 +08:00
|
|
|
$header = ( isset($_COOKIE['zmHeaderFlip']) and $_COOKIE['zmHeaderFlip'] == 'down') ? 'down' : 'up';
|
2020-08-03 00:31:36 +08:00
|
|
|
$result .= '<li id="getHeaderFlipHTML" class="nav-item dropdown"><a class="nav-link" href="#"><i id="flip" class="material-icons md-18">keyboard_arrow_' .$header. '</i></a></li>'.PHP_EOL;
|
|
|
|
|
|
|
|
return $result;
|
2020-07-23 23:52:12 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
// Returns the html representing the logged in user name and avatar
|
2020-08-27 05:28:11 +08:00
|
|
|
function getAcctCircleHTML($skin, $user=null) {
|
|
|
|
// Include Logout modal
|
|
|
|
include("skins/$skin/views/logout.php");
|
2020-08-03 23:49:45 +08:00
|
|
|
$result = '';
|
2020-08-03 00:31:36 +08:00
|
|
|
|
2020-07-23 23:52:12 +08:00
|
|
|
if ( ZM_OPT_USE_AUTH and $user ) {
|
2020-08-03 00:31:36 +08:00
|
|
|
$result .= '<p id="getAcctCircleHTML" class="navbar-text mr-2">'.PHP_EOL;
|
2020-08-27 05:28:11 +08:00
|
|
|
$result .= makeLink('#', '<i class="material-icons">account_circle</i> '. $user['Username'],
|
|
|
|
(ZM_AUTH_TYPE == 'builtin'), 'data-toggle="modal" data-target="#modalLogout" data-backdrop="false"' ).PHP_EOL;
|
2020-08-03 00:31:36 +08:00
|
|
|
$result .= '</p>'.PHP_EOL;
|
2020-07-23 23:52:12 +08:00
|
|
|
}
|
2020-08-03 00:31:36 +08:00
|
|
|
|
|
|
|
return $result;
|
2020-07-23 23:52:12 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
// Returns the html representing the runtime status button
|
|
|
|
function getStatusBtnHTML($status) {
|
2020-08-03 23:49:45 +08:00
|
|
|
$result = '';
|
2020-08-03 00:31:36 +08:00
|
|
|
|
2020-07-23 23:52:12 +08:00
|
|
|
if ( canEdit('System') ) {
|
2020-08-03 00:31:36 +08:00
|
|
|
//$result .= '<li class="nav-item dropdown">'.PHP_EOL;
|
|
|
|
$result .= '<form id="getStatusBtnHTML" class="form-inline">'.PHP_EOL;
|
|
|
|
$result .= '<button type="button" class="btn btn-default navbar-btn" data-toggle="modal" data-target="#modalState">' .$status. '</button>'.PHP_EOL;
|
|
|
|
$result .= '</form>'.PHP_EOL;
|
|
|
|
//$result .= '</li>'.PHP_EOL;
|
2020-07-23 23:52:12 +08:00
|
|
|
|
|
|
|
if ( ZM_SYSTEM_SHUTDOWN ) {
|
2020-08-03 00:31:36 +08:00
|
|
|
$result .= '<p class="navbar-text">'.PHP_EOL;
|
|
|
|
$result .= makePopupLink('?view=shutdown', 'zmShutdown', 'shutdown', '<i class="material-icons md-18">power_settings_new</i>' ).PHP_EOL;
|
|
|
|
$result .= '</p>'.PHP_EOL;
|
2020-07-23 23:52:12 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
} else if ( canView('System') ) {
|
2020-08-03 00:31:36 +08:00
|
|
|
$result .= '<p id="getStatusBtnHTML" class="navbar-text">'.PHP_EOL;
|
|
|
|
$result .= $status.PHP_EOL;
|
|
|
|
$result .= '</p>'.PHP_EOL;
|
2020-07-23 23:52:12 +08:00
|
|
|
}
|
2020-08-03 00:31:36 +08:00
|
|
|
|
|
|
|
return $result;
|
2020-07-23 23:52:12 +08:00
|
|
|
}
|
|
|
|
|
2020-07-31 05:14:41 +08:00
|
|
|
function runtimeStatus($running=null) {
|
|
|
|
if ( $running == null )
|
|
|
|
$running = daemonCheck();
|
|
|
|
if ( $running ) {
|
|
|
|
$state = dbFetchOne('SELECT Name FROM States WHERE isActive=1', 'Name');
|
|
|
|
if ( $state == 'default' )
|
|
|
|
$state = '';
|
|
|
|
}
|
|
|
|
|
|
|
|
return $running ? ($state ? $state : translate('Running')) : translate('Stopped');
|
|
|
|
}
|
|
|
|
|
2020-09-11 05:56:58 +08:00
|
|
|
// Returns the modal html representing the selected Option Help item
|
2020-09-11 20:50:03 +08:00
|
|
|
function getOptionHelpHTML($optionHelpIndex, $OLANG) {
|
2020-09-11 05:56:58 +08:00
|
|
|
$result = '';
|
|
|
|
$ZMoptionHelpIndex = 'ZM_'.$optionHelpIndex;
|
|
|
|
|
|
|
|
if ( !empty($OLANG[$optionHelpIndex]) ) {
|
|
|
|
$optionHelpText = $OLANG[$optionHelpIndex]['Help'];
|
|
|
|
} else {
|
2020-09-12 02:23:14 +08:00
|
|
|
$optionHelpText = dbFetchOne('SELECT Help FROM Config WHERE Name=?', 'Help', array($optionHelpIndex));
|
2020-09-11 05:56:58 +08:00
|
|
|
}
|
|
|
|
$optionHelpText = validHtmlStr($optionHelpText);
|
|
|
|
$optionHelpText = preg_replace('/~~/', '<br/>', $optionHelpText );
|
|
|
|
$optionHelpText = preg_replace('/\[(.+)\]\((.+)\)/', '<a href="$2" target="_blank">$1</a>', $optionHelpText);
|
|
|
|
|
|
|
|
$result .= '<div id="optionhelp" class="modal" tabindex="-1" role="dialog">'.PHP_EOL;
|
|
|
|
$result .= '<div class="modal-dialog" role="document">'.PHP_EOL;
|
|
|
|
$result .= '<div class="modal-content">'.PHP_EOL;
|
|
|
|
$result .= '<div class="modal-header">'.PHP_EOL;
|
|
|
|
$result .= '<h5 class="modal-title">' .translate('OptionHelp'). '</h5>'.PHP_EOL;
|
|
|
|
$result .= '<button type="button" class="close" data-dismiss="modal" aria-label="Close">'.PHP_EOL;
|
|
|
|
$result .= '<span aria-hidden="true">×</span>'.PHP_EOL;
|
|
|
|
$result .= '</button>'.PHP_EOL;
|
|
|
|
$result .= '</div>'.PHP_EOL;
|
|
|
|
$result .= '<div class="modal-body">'.PHP_EOL;
|
|
|
|
$result .= '<h3>' .validHtmlStr($optionHelpIndex). '</h3>'.PHP_EOL;
|
|
|
|
$result .= '<p class="textblock">' .$optionHelpText. '</p>'.PHP_EOL;
|
|
|
|
$result .= '</div>'.PHP_EOL;
|
|
|
|
$result .= '<div class="modal-footer">'.PHP_EOL;
|
|
|
|
$result .= '<button type="button" id="ohCloseBtn" class="btn btn-secondary" data-dismiss="modal">Close</button>'.PHP_EOL;
|
|
|
|
$result .= '</div>'.PHP_EOL;
|
|
|
|
$result .= '</div>'.PHP_EOL;
|
|
|
|
$result .= '</div>'.PHP_EOL;
|
|
|
|
$result .= '</div>'.PHP_EOL;
|
|
|
|
return $result;
|
|
|
|
}
|
|
|
|
|
2017-07-13 00:49:01 +08:00
|
|
|
function xhtmlFooter() {
|
2020-09-03 02:38:38 +08:00
|
|
|
global $css;
|
2019-01-16 22:59:58 +08:00
|
|
|
global $cspNonce;
|
2017-07-13 22:07:23 +08:00
|
|
|
global $view;
|
2017-07-13 00:49:01 +08:00
|
|
|
global $skin;
|
2020-09-03 02:38:38 +08:00
|
|
|
global $basename;
|
2018-06-06 23:40:38 +08:00
|
|
|
if ( canEdit('System') ) {
|
|
|
|
include("skins/$skin/views/state.php");
|
|
|
|
}
|
2020-09-03 02:38:38 +08:00
|
|
|
$skinJsPhpFile = getSkinFile('js/skin.js.php');
|
|
|
|
$cssJsFile = getSkinFile('js/'.$css.'.js');
|
|
|
|
$viewJsFile = getSkinFile('views/js/'.$basename.'.js');
|
|
|
|
$viewJsPhpFile = getSkinFile('views/js/'.$basename.'.js.php');
|
|
|
|
?>
|
|
|
|
<?php if ( $basename != 'login' and $basename != 'postlogin' ) { ?>
|
|
|
|
<script src="tools/mootools/mootools-core.js"></script>
|
|
|
|
<script src="tools/mootools/mootools-more.js"></script>
|
|
|
|
<script src="js/mootools.ext.js"></script>
|
|
|
|
<?php } ?>
|
|
|
|
<script src="skins/<?php echo $skin; ?>/js/jquery.js"></script>
|
|
|
|
<script src="skins/<?php echo $skin; ?>/js/jquery-ui-1.12.1/jquery-ui.js"></script>
|
|
|
|
<script src="skins/<?php echo $skin; ?>/js/bootstrap.min.js"></script>
|
|
|
|
<script src="skins/<?php echo $skin; ?>/js/bootstrap-table.min.js"></script>
|
|
|
|
<script src="skins/<?php echo $skin; ?>/js/tableExport.min.js"></script>
|
|
|
|
<script src="skins/<?php echo $skin; ?>/js/bootstrap-table-export.min.js"></script>
|
|
|
|
<script src="skins/<?php echo $skin; ?>/js/bootstrap-table-page-jump-to.min.js"></script>
|
|
|
|
<script src="skins/<?php echo $skin; ?>/js/bootstrap-table-cookie.min.js"></script>
|
|
|
|
<script src="skins/<?php echo $skin; ?>/js/chosen/chosen.jquery.min.js"></script>
|
|
|
|
<script src="skins/<?php echo $skin; ?>/js/dateTimePicker/jquery-ui-timepicker-addon.js"></script>
|
|
|
|
|
|
|
|
<script src="<?php echo cache_bust('js/Server.js'); ?>"></script>
|
|
|
|
<script nonce="<?php echo $cspNonce; ?>">var $j = jQuery.noConflict();</script>
|
|
|
|
<script src="<?php echo cache_bust('skins/'.$skin.'/views/js/state.js') ?>"></script>
|
|
|
|
<?php
|
|
|
|
if ( $view == 'event' ) {
|
|
|
|
?>
|
|
|
|
<link href="skins/<?php echo $skin ?>/js/video-js.css" rel="stylesheet">
|
|
|
|
<link href="skins/<?php echo $skin ?>/js/video-js-skin.css" rel="stylesheet">
|
|
|
|
<script src="skins/<?php echo $skin ?>/js/video.js"></script>
|
|
|
|
<script src="./js/videojs.zoomrotate.js"></script>
|
|
|
|
<?php
|
|
|
|
}
|
|
|
|
?>
|
|
|
|
<script src="skins/<?php echo $skin ?>/js/moment.min.js"></script>
|
|
|
|
<?php
|
|
|
|
?>
|
|
|
|
<script nonce="<?php echo $cspNonce; ?>">
|
|
|
|
<?php
|
|
|
|
if ( $skinJsPhpFile ) {
|
|
|
|
require_once( $skinJsPhpFile );
|
|
|
|
}
|
|
|
|
if ( $viewJsPhpFile ) {
|
|
|
|
require_once( $viewJsPhpFile );
|
|
|
|
}
|
|
|
|
?>
|
|
|
|
</script>
|
|
|
|
<?php
|
|
|
|
if ( $cssJsFile ) {
|
|
|
|
?>
|
|
|
|
<script src="<?php echo cache_bust($cssJsFile) ?>"></script>
|
|
|
|
<?php
|
|
|
|
} else {
|
|
|
|
?>
|
|
|
|
<script src="<?php echo cache_bust('skins/classic/js/base.js') ?>"></script>
|
|
|
|
<?php
|
|
|
|
}
|
|
|
|
if ( $viewJsFile ) {
|
2017-07-13 00:49:01 +08:00
|
|
|
?>
|
2020-09-03 02:38:38 +08:00
|
|
|
<script src="<?php echo cache_bust($viewJsFile) ?>"></script>
|
|
|
|
<?php
|
|
|
|
}
|
|
|
|
$skinJsFile = getSkinFile('js/skin.js');
|
|
|
|
?>
|
|
|
|
<script src="<?php echo cache_bust($skinJsFile) ?>"></script>
|
|
|
|
<script src="<?php echo cache_bust('js/logger.js')?>"></script>
|
|
|
|
<?php
|
|
|
|
if ($basename == 'watch' or $basename == 'log' ) {
|
|
|
|
// This is used in the log popup for the export function. Not sure if it's used anywhere else
|
|
|
|
?>
|
|
|
|
<script src="<?php echo cache_bust('js/overlay.js') ?>"></script>
|
|
|
|
<?php } ?>
|
2019-01-16 22:59:58 +08:00
|
|
|
<script nonce="<?php echo $cspNonce; ?>">$j('.chosen').chosen();</script>
|
2018-06-06 23:40:38 +08:00
|
|
|
</body>
|
2017-12-14 05:15:03 +08:00
|
|
|
</html>
|
2017-07-13 00:49:01 +08:00
|
|
|
<?php
|
|
|
|
} // end xhtmlFooter
|
2008-07-14 21:54:50 +08:00
|
|
|
?>
|