zoneminder/web/skins/classic/includes/functions.php

625 lines
22 KiB
PHP
Raw Normal View History

<?php
//
// ZoneMinder web function library
// Copyright (C) 2001-2008 Philip Coombes
//
// 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
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
//
function xhtmlHeaders($file, $title) {
global $css;
global $skin;
global $view;
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.
$baseCssPhpFile = getSkinFile('css/base/skin.css.php');
2017-12-22 10:46:21 +08:00
$skinCssPhpFile = getSkinFile('css/'.$css.'/skin.css.php');
$skinJsPhpFile = getSkinFile('js/skin.js.php');
$cssJsFile = getSkinFile('js/'.$css.'.js');
$basename = basename($file, '.php');
2017-12-22 10:46:21 +08:00
$baseViewCssPhpFile = getSkinFile('/css/base/views/'.$basename.'.css.php');
$viewCssPhpFile = getSkinFile('/css/'.$css.'/views/'.$basename.'.css.php');
$viewJsFile = getSkinFile('views/js/'.$basename.'.js');
$viewJsPhpFile = getSkinFile('views/js/'.$basename.'.js.php');
extract($GLOBALS, EXTR_OVERWRITE);
function output_link_if_exists($files) {
global $skin;
2017-12-22 10:46:21 +08:00
$html = array();
foreach ( $files as $file ) {
if ( getSkinFile($file) ) {
$html[] = '<link rel="stylesheet" href="'.cache_bust('skins/'.$skin.'/'.$file).'" type="text/css"/>';
2017-12-22 10:46:21 +08:00
}
}
$html[] = ''; // So we ge a trailing \n
return implode("\n", $html);
}
function output_cache_busted_stylesheet_links($files) {
$html = array();
foreach ( $files as $file ) {
$html[] = '<link rel="stylesheet" href="'.cache_bust($file).'" type="text/css"/>';
}
2017-12-22 10:46:21 +08:00
return implode("\n", $html);
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title><?php echo validHtmlStr(ZM_WEB_TITLE_PREFIX); ?> - <?php echo validHtmlStr($title) ?></title>
<?php
if ( file_exists("skins/$skin/css/$css/graphics/favicon.ico") ) {
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\"/>
";
} 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"/>
';
}
echo output_cache_busted_stylesheet_links(array(
'css/reset.css',
'css/overlay.css',
'css/bootstrap.min.css',
));
2017-12-22 10:46:21 +08:00
echo output_link_if_exists( array(
'css/base/skin.css',
'css/base/views/'.$basename.'.css',
'js/dateTimePicker/jquery-ui-timepicker-addon.css',
'js/jquery-ui-1.12.1/jquery-ui.structure.min.css',
2017-12-22 10:46:21 +08:00
)
);
if ( $css != 'base' )
echo output_link_if_exists( array(
'css/'.$css.'/skin.css',
'css/'.$css.'/views/'.$basename.'.css',
'css/'.$css.'/jquery-ui-theme.css',
)
);
?>
<link rel="stylesheet" href="skins/classic/js/jquery-ui-1.12.1/jquery-ui.theme.min.css" type="text/css"/>
<!--Chosen can't be cache-busted because it loads sprites by relative path-->
2018-02-03 02:26:44 +08:00
<link rel="stylesheet" href="skins/classic/js/chosen/chosen.min.css" type="text/css"/>
<?php
2019-02-13 05:41:08 +08:00
if ( $basename == 'watch' ) {
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
}
?>
<style type="text/css">
<?php
if ( $baseViewCssPhpFile ) {
require_once($baseViewCssPhpFile);
}
if ( $viewCssPhpFile ) {
2019-02-13 05:41:08 +08:00
require_once($viewCssPhpFile);
}
?>
</style>
<?php
?>
2017-12-22 10:46:21 +08:00
<?php if ( $basename != 'login' ) { ?>
2018-04-06 23:43:19 +08:00
<script src="tools/mootools/mootools-core.js"></script>
<script src="tools/mootools/mootools-more.js"></script>
<script src="js/mootools.ext.js"></script>
<?php } ?>
2018-04-06 23:43:19 +08:00
<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/chosen/chosen.jquery.min.js"></script>
<script src="skins/<?php echo $skin; ?>/js/dateTimePicker/jquery-ui-timepicker-addon.js"></script>
2017-12-16 11:57:42 +08:00
2018-07-10 02:10:06 +08:00
<script src="<?php echo cache_bust('js/Server.js'); ?>"></script>
<script nonce="<?php echo $cspNonce; ?>">
jQuery(document).ready(function() {
jQuery("#flip").click(function() {
2018-09-12 05:39:40 +08:00
jQuery("#panel").slideToggle("slow");
2019-12-03 01:33:13 +08:00
var flip = jQuery("#flip");
if ( flip.html() == 'keyboard_arrow_up' ) {
flip.html('keyboard_arrow_down');
Cookie.write('zmHeaderFlip', 'down', {duration: 10*365} );
} else {
flip.html('keyboard_arrow_up');
Cookie.write('zmHeaderFlip', 'up', {duration: 10*365} );
}
2018-09-12 05:39:40 +08:00
});
jQuery("#fbflip").click(function() {
jQuery("#fbpanel").slideToggle("slow");
var fbflip = jQuery("#fbflip");
if ( fbflip.html() == 'keyboard_arrow_up' ) {
fbflip.html('keyboard_arrow_down');
Cookie.write('zmFilterBarFlip', 'down', {duration: 10*365} );
} else {
fbflip.html('keyboard_arrow_up');
Cookie.write('zmFilterBarFlip', 'up', {duration: 10*365} );
jQuery('.chosen').chosen("destroy");
jQuery('.chosen').chosen();
}
});
2018-09-12 05:39:40 +08:00
});
2017-06-16 00:13:40 +08:00
var $j = jQuery.noConflict();
// $j is now an alias to the jQuery function; creating the new alias is optional.
</script>
2019-01-31 03:36:46 +08:00
<script src="<?php echo cache_bust('skins/'.$skin.'/views/js/state.js') ?>"></script>
2017-06-16 00:13:40 +08:00
<?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
2018-04-11 04:06:01 +08:00
}
?>
<script src="skins/<?php echo $skin ?>/js/moment.min.js"></script>
<?php
2017-05-31 23:16:55 +08:00
if ( $skinJsPhpFile ) {
?>
<script nonce="<?php echo $cspNonce; ?>">
<?php
require_once( $skinJsPhpFile );
?>
</script>
<?php
2017-05-31 23:16:55 +08:00
}
if ( $viewJsPhpFile ) {
?>
<script nonce="<?php echo $cspNonce; ?>">
<?php
2017-05-31 23:16:55 +08:00
require_once( $viewJsPhpFile );
?>
</script>
<?php
2017-05-31 23:16:55 +08:00
}
if ( $cssJsFile ) {
?>
2018-04-06 23:43:19 +08:00
<script src="<?php echo cache_bust($cssJsFile) ?>"></script>
<?php
} else {
?>
2019-03-26 04:24:46 +08:00
<script src="<?php echo cache_bust('skins/classic/js/base.js') ?>"></script>
<?php }
$skinJsFile = getSkinFile('js/skin.js');
?>
<script src="<?php echo cache_bust($skinJsFile) ?>"></script>
2019-04-26 22:25:32 +08:00
<script src="<?php echo cache_bust('js/logger.js')?>"></script>
2018-09-23 22:51:46 +08:00
<?php
if ($basename == 'watch' or $basename == 'log' ) {
2018-09-23 22:51:46 +08:00
// This is used in the log popup for the export function. Not sure if it's used anywhere else
?>
2019-04-26 22:25:32 +08:00
<script src="<?php echo cache_bust('js/overlay.js') ?>"></script>
2018-09-23 22:51:46 +08:00
<?php } ?>
<?php
2017-05-31 23:16:55 +08:00
if ( $viewJsFile ) {
?>
2019-03-06 03:33:03 +08:00
<script src="<?php echo cache_bust($viewJsFile) ?>"></script>
<?php
2017-05-31 23:16:55 +08:00
}
?>
</head>
<?php
2017-06-16 00:13:40 +08:00
} // end function xhtmlHeaders( $file, $title )
// 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;">
'. validHtmlStr(ZM_WEB_TITLE) .' requires Javascript. Please enable Javascript in your browser for this site.
</div>
</noscript>
';
global $error_message;
if ( $error_message ) {
echo '<div class="error">'.$error_message.'</div>';
}
} // end function getBodyTopHTML
function getNavBarHTML($reload = null) {
# Provide a facility to turn off the headers if you put navbar=0 into the url
if ( isset($_REQUEST['navbar']) and $_REQUEST['navbar'] == '0' )
return '';
global $running;
global $user;
global $bandwidth_options;
2017-10-02 23:25:51 +08:00
global $view;
2017-12-02 23:09:19 +08:00
global $filterQuery;
2017-12-14 11:24:55 +08:00
global $sortQuery;
global $limitQuery;
2017-12-14 11:24:55 +08:00
if (!$sortQuery) {
2017-12-14 11:24:55 +08:00
parseSort();
}
2019-03-21 02:27:23 +08:00
if ( (!$filterQuery) and isset($_REQUEST['filter']) ) {
parseFilter($_REQUEST['filter']);
2017-12-02 23:09:19 +08:00
$filterQuery = $_REQUEST['filter']['query'];
}
2019-03-21 02:27:23 +08:00
if ( $reload === null ) {
ob_start();
2020-07-31 05:14:41 +08:00
$status = runtimeStatus($running);
2020-07-24 01:52:21 +08:00
?>
2020-07-26 02:18:09 +08:00
<div class="fixed-top container-fluid p-0 p-0">
<nav class="navbar navbar-expand-md navbar-dark bg-dark justify-content-center flex-row">
<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 -->
<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-27 23:22:23 +08:00
echo '<ul class="navbar-nav 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);
echo getFilterHTML($view,$filterQuery,$sortQuery,$limitQuery);
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>';
echo '<ul class="nav navbar-nav justify-content-end align-self-start flex-grow-1">';
2020-07-24 01:52:21 +08:00
echo getAcctCircleHTML($user);
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;"' : '' ?>>
<?php
} // end reload null. Runs on full page load
2020-07-24 01:52:21 +08:00
if ( (!ZM_OPT_USE_AUTH) or $user ) {
if ($reload == 'reload') ob_start();
2020-07-24 01:52:21 +08:00
// *** Build the statistics shown on the navigation bar ***
?>
<div id="reload" class="container-fluid">
<ul id="Bandwidth" class="navbar-nav justify-content-start">
<?php echo getBandwidthHTML($bandwidth_options, $user) ?>
</ul>
<ul class="navbar-nav justify-content-center">
<?php
echo getSysLoadHTML();
echo getDbConHTML();
echo getStorageHTML();
echo getShmHTML();
?>
</ul>
<ul id="Version" class="nav navbar-nav justify-content-end">
<?php
$versionClass = (ZM_DYN_DB_VERSION&&(ZM_DYN_DB_VERSION!=ZM_VERSION))?'errorText':'';
echo getZMVersionHTML($versionClass);
?>
</ul>
</div>
<?php echo getConsoleBannerHTML() ?>
<?php
} // end if (!ZM_OPT_USE_AUTH) or $user )
2020-07-31 00:55:54 +08:00
?>
2020-07-31 00:55:54 +08:00
</div><!-- End Collapsible Panel -->
2020-07-26 02:18:09 +08:00
</nav><!-- End Second Navbar -->
</div>
2020-07-23 02:12:59 +08:00
<?php
2020-07-24 01:52:21 +08:00
2020-07-31 00:55:54 +08:00
if ( $reload === null ) return ob_get_clean();
2020-07-23 02:12:59 +08:00
} // end function getNavBarHTML()
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() {
echo '<li class="Load nav-item mx-2">'.PHP_EOL;
echo '<i class="material-icons md-18">trending_up</i>'.PHP_EOL;
echo '&nbsp;'.translate('Load').': '.getLoad().PHP_EOL;
echo '</li>'.PHP_EOL;
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() {
$connections = dbFetchOne('SHOW status WHERE variable_name=\'threads_connected\'', 'Value');
$max_connections = dbFetchOne('SHOW variables WHERE variable_name=\'max_connections\'', 'Value');
$percent_used = $max_connections ? 100 * $connections / $max_connections : 100;
2020-07-30 04:26:07 +08:00
$class = ( $percent_used > 90 ) ? 'text-warning' : '';
2020-07-23 02:12:59 +08:00
2020-07-30 04:26:07 +08:00
echo '<li class="nav-item mx-2 ' .$class. '">'.PHP_EOL;
echo '<i class="material-icons md-18 mr-1">storage</i>'.PHP_EOL;
2020-07-30 04:26:07 +08:00
echo translate('DB'). ': ' .$connections. '/' .$max_connections.PHP_EOL;
echo '</li>'.PHP_EOL;
2020-07-23 02:12:59 +08:00
}
2020-07-23 23:52:12 +08:00
// Returns the html representing up to 4 storage areas and their current capacity
2020-07-23 02:12:59 +08:00
function getStorageHTML() {
$func = function($S) {
$class = '';
if ( $S->disk_usage_percent() > 98 ) {
2020-07-26 23:41:05 +08:00
$class = 'text-danger';
} else if ( $S->disk_usage_percent() > 90 ) {
2020-07-26 23:41:05 +08:00
$class = 'text-warning';
}
$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-07-30 04:09:47 +08:00
return '<span class="ml-1 '.$class.'" title="'.$title.'">'.$S->Name() . ': ' . $S->disk_usage_percent().'%' . '</span>';
2020-07-23 02:12:59 +08:00
};
2020-07-23 02:12:59 +08:00
$storage_areas = ZM\Storage::find(array('Enabled'=>true));
$num_storage_areas = count($storage_areas);
$storage_paths = null;
$storage_areas_with_no_server_id = array();
foreach ( $storage_areas as $area ) {
$storage_paths[$area->Path()] = $area;
if ( ! $area->ServerId() ) {
$storage_areas_with_no_server_id[] = $area;
}
}
2020-07-26 02:18:09 +08:00
echo '<li class="nav-item mx-2">'.translate('Storage').':';
2020-07-23 02:12:59 +08:00
if ( $num_storage_areas > 4 ) {
$storage_areas = $storage_areas_with_no_server_id;
2020-07-23 02:12:59 +08:00
} else {
echo implode(', ', array_map($func, $storage_areas));
2020-07-23 02:12:59 +08:00
}
echo '</li>'.PHP_EOL;
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() {
$shm_percent = getDiskPercent(ZM_PATH_MAP);
$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);
$class = '';
if ( $shm_percent > 98 ) {
2020-07-26 23:41:05 +08:00
$class = 'text-danger';
} else if ( $shm_percent > 90 ) {
2020-07-26 23:41:05 +08:00
$class = 'text-warning';
}
2020-07-30 04:20:44 +08:00
echo ' <li class="nav-item ' .$class. '" title="' .human_filesize($shm_used). ' of ' .human_filesize($shm_total_space). '">' .ZM_PATH_MAP. ': '.$shm_percent.'%</li>'.PHP_EOL;
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() {
if ( defined('ZM_WEB_CONSOLE_BANNER') and ZM_WEB_CONSOLE_BANNER != '' ) {
echo '<h3 id="development">'.validHtmlStr(ZM_WEB_CONSOLE_BANNER).'</h3>';
}
}
2020-07-23 23:52:12 +08:00
// Returns the html representing the current high,medium,low bandwidth setting
2020-07-23 02:12:59 +08:00
function getBandwidthHTML($bandwidth_options,$user) {
echo '<li class="nav-item">'.makePopupLink( '?view=bandwidth', 'zmBandwidth', 'bandwidth', "<i class='material-icons md-18'>network_check</i>&nbsp;".$bandwidth_options[$_COOKIE['zmBandwidth']] . ' ', ($user && $user['MaxBandwidth'] != 'low' )).'</li>'.PHP_EOL;
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-23 02:12:59 +08:00
function getZMVersionHTML($versionClass) {
echo '<li class="nav-item">'.makePopupLink( '?view=version', 'zmVersion', 'version', '<span class="version '.$versionClass.'">v'.ZM_VERSION.'</span>', canEdit('System') ).'</li>'.PHP_EOL;
2020-07-23 02:12:59 +08:00
}
2020-07-24 01:52:21 +08:00
// Returns the html representing the ZoneMinder logo
function getNavBrandHTML() {
echo '<a href="' .validHtmlStr(ZM_HOME_URL). '" target="' .validHtmlStr(ZM_WEB_TITLE). '">' .ZM_HOME_CONTENT. '</a>'.PHP_EOL;
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() {
if ( canView('Monitors') ) {
echo '<li class="nav-item"><a class="nav-link" href="?view=console">'.translate('Console').'</a></li>'.PHP_EOL;
2020-07-23 23:52:12 +08:00
}
}
// Returns the html representing the Options menu item
function getOptionsHTML() {
if ( canView('System') ) {
echo '<li class="nav-item"><a class="nav-link" href="?view=options">'.translate('Options').'</a></li>'.PHP_EOL;
2020-07-23 23:52:12 +08:00
}
}
// Returns the html representing the Log menu item
function getLogHTML() {
if ( canView('System') ) {
if ( ZM\logToDatabase() > ZM\Logger::NOLOG ) {
if ( ! ZM_RUN_AUDIT ) {
# zmaudit can clean the logs, but if we aren't running it, then we should clean them regularly
if ( preg_match('/^\d+$/', ZM_LOG_DATABASE_LIMIT) ) {
# Number of lines, instead of an interval
$rows = dbFetchOne('SELECT Count(*) AS `Rows` FROM `Logs`', 'Rows');
if ( $rows > ZM_LOG_DATABASE_LIMIT ) {
dbQuery('DELETE low_priority FROM `Logs` ORDER BY `TimeKey` ASC LIMIT ?', array($rows - ZM_LOG_DATABASE_LIMIT));
}
} else if ( preg_match('/^\d\s*(hour|minute|day|week|month|year)$/', ZM_LOG_DATABASE_LIMIT, $matches) ) {
dbQuery('DELETE FROM `Logs` WHERE `TimeKey` < unix_timestamp( NOW() - interval '.ZM_LOG_DATABASE_LIMIT.') LIMIT 100');
} else {
ZM\Error('Potentially invalid value for ZM_LOG_DATABASE_LIMIT: ' . ZM_LOG_DATABASE_LIMIT);
}
}
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' : '')));
echo '<li class="nav-item">'.makePopupLink('?view=log', 'zmLog', 'log', '<span class="nav-link '.$class.'">'.translate('Log').'</span></li>').PHP_EOL;
2020-07-23 23:52:12 +08:00
}
}
}
// Returns the html representing the X10 Devices menu item
function getDevicesHTML() {
if ( ZM_OPT_X10 && canView('Devices') ) {
echo '<li class="nav-item"><a class="nav-link" href="?view=devices">Devices</a></li>'.PHP_EOL;
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-07-23 23:52:12 +08:00
$class = $view == 'groups' ? 'selected' : '';
echo '<li class="nav-item"><a class="nav-link" href="?view=groups" class="' .$class. '">'. translate('Groups') .'</a></li>'.PHP_EOL;
2020-07-23 23:52:12 +08:00
}
// Returns the html representing the Filter menu item
2020-07-31 05:14:41 +08:00
function getFilterHTML($view,$filterQuery,$sortQuery,$limitQuery) {
2020-07-23 23:52:12 +08:00
$class = $view == 'filter' ? 'selected' : '';
echo '<li class="nav-item"><a class="nav-link" href="?view=filter'.$filterQuery.$sortQuery.$limitQuery.'" class="'.$class.'">'.translate('Filters').'</a></li>'.PHP_EOL;
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-07-23 23:52:12 +08:00
if ( canView('Stream') ) {
$class = $view == 'cycle' ? 'selected' : '';
echo '<li class="nav-item"><a class="nav-link" href="?view=cycle" class="' .$class. '">' .translate('Cycle'). '</a></li>'.PHP_EOL;
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-07-23 23:52:12 +08:00
if ( canView('Stream') ) {
$class = $view == 'cycle' ? 'selected' : '';
echo '<li class="nav-item"><a class="nav-link" href="?view=montage" class="' .$class. '">' .translate('Montage'). '</a></li>'.PHP_EOL;
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-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' : '';
$class = $view == 'montagereview' ? 'selected' : '';
echo '<li class="nav-item"><a class="nav-link" href="?view=montagereview' .$live. '" class="' .$class. '">' .translate('MontageReview'). '</a></li>'.PHP_EOL;
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-07-23 23:52:12 +08:00
if ( canView('Events') ) {
$class = $view == 'report_event_audit' ? 'selected' : '';
echo '<li class="nav-item"><a class="nav-link" href="?view=report_event_audit" class="' .$class. '">' .translate('ReportEventAudit'). '</a></li>'.PHP_EOL;
2020-07-23 23:52:12 +08:00
}
}
// Returns the html representing the header collapse toggle menu item
function getHeaderFlipHTML() {
$header = ( isset($_COOKIE['zmHeaderFlip']) and $_COOKIE['zmHeaderFlip'] == 'down') ? 'down' : 'up';
echo '<li class="nav-item"><a class="nav-link" href="#"><i id="flip" class="material-icons md-18">keyboard_arrow_' .$header. '</i></a></li>'.PHP_EOL;
2020-07-23 23:52:12 +08:00
}
// Returns the html representing the logged in user name and avatar
function getAcctCircleHTML($user=null) {
if ( ZM_OPT_USE_AUTH and $user ) {
echo '<p class="navbar-text mx-3">'.PHP_EOL;
2020-07-23 23:52:12 +08:00
echo '<i class="material-icons">account_circle</i>';
echo makePopupLink('?view=logout', 'zmLogout', 'logout', $user['Username'], (ZM_AUTH_TYPE == 'builtin') ).PHP_EOL;
echo '</p>'.PHP_EOL;
2020-07-23 23:52:12 +08:00
}
}
// Returns the html representing the runtime status button
function getStatusBtnHTML($status) {
if ( canEdit('System') ) {
echo '<li class="nav-item">'.PHP_EOL;
echo '<form class="form-inline">'.PHP_EOL;
echo '<button type="button" class="mx-3 btn btn-default navbar-btn" data-toggle="modal" data-target="#modalState">' .$status. '</button>'.PHP_EOL;
echo '</form>'.PHP_EOL;
echo '</li>'.PHP_EOL;
2020-07-23 23:52:12 +08:00
if ( ZM_SYSTEM_SHUTDOWN ) {
echo '<p class="navbar-text">'.PHP_EOL;
echo makePopupLink('?view=shutdown', 'zmShutdown', 'shutdown', '<i class="material-icons md-18">power_settings_new</i>' ).PHP_EOL;
echo '</p>'.PHP_EOL;
2020-07-23 23:52:12 +08:00
}
} else if ( canView('System') ) {
echo '<p class="navbar-text">'.PHP_EOL;
echo $status.PHP_EOL;
echo '</p>'.PHP_EOL;
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');
}
function xhtmlFooter() {
global $cspNonce;
global $view;
global $skin;
2018-06-06 23:40:38 +08:00
if ( canEdit('System') ) {
include("skins/$skin/views/state.php");
}
?>
<script nonce="<?php echo $cspNonce; ?>">$j('.chosen').chosen();</script>
2018-06-06 23:40:38 +08:00
</body>
</html>
<?php
} // end xhtmlFooter
?>