Merge branch 'master' into multi-server

pull/1088/head
Isaac Connor 2015-08-16 10:52:51 -04:00
commit c0517b11ae
60 changed files with 2471 additions and 243 deletions

View File

@ -24,7 +24,7 @@ before_install:
- sudo apt-get update -qq
- sudo apt-get install -y -qq libpolkit-gobject-1-dev zlib1g-dev apache2 mysql-server php5 php5-mysql build-essential libmysqlclient-dev libssl-dev libbz2-dev libpcre3-dev libdbi-perl libarchive-zip-perl libdate-manip-perl libdevice-serialport-perl libmime-perl libwww-perl libdbd-mysql-perl libsys-mmap-perl yasm automake autoconf cmake libjpeg-turbo8-dev apache2-mpm-prefork libapache2-mod-php5 php5-cli libtheora-dev libvorbis-dev libvpx-dev libx264-dev libvlccore-dev libvlc-dev libvlccore5 libvlc5 2>&1 > /dev/null
install:
- git clone -b n2.4.2 --depth=1 git://source.ffmpeg.org/ffmpeg.git
- git clone -b n2.7.2 --depth=1 git://source.ffmpeg.org/ffmpeg.git
- cd ffmpeg
- ./configure --enable-shared --enable-swscale --enable-gpl --enable-libx264 --enable-libvpx --enable-libvorbis --enable-libtheora
- make -j `grep processor /proc/cpuinfo|wc -l`

View File

@ -9,6 +9,10 @@ All documentation for ZoneMinder is now online at http://www.zoneminder.com/wiki
ZoneMinder is an integrated set of applications which provide a complete surveillance solution allowing capture, analysis, recording and monitoring of any CCTV or security cameras attached to a Linux based machine. It is designed to run on distributions which support the Video For Linux (V4L) interface and has been tested with video cameras attached to BTTV cards, various USB cameras and also supports most IP network cameras.
## Contacting the Developement Team
Before creating an issue in our github forum, please read our posting rules:
https://github.com/ZoneMinder/ZoneMinder/wiki/Github-Posting-Rules
## Installation Methods
### Building from Source is Discouraged
@ -40,7 +44,7 @@ Lastly, if you desire to build a development snapshot from the master branch, it
What follows are instructions for various distros to build ZoneMinder into a package.
### Package Maintainters
### Package Maintainers
Many of the ZoneMinder configration variable default values are not configurable at build time through autotools or cmake. A new tool called *zmeditconfigdata.sh* has been added to allow package maintainers to manipulate any variable stored in ConfigData.pm without patching the source.
For example, let's say I have created a new ZoneMinder package that contains the cambolzola javascript file. However, by default cambozola support is turned off. To fix that, add this to the pacakging script:

View File

@ -496,7 +496,7 @@ fi
AC_SUBST(PERL_MM_PARMS)
AC_SUBST(EXTRA_PERL_LIB)
AC_CONFIG_FILES([Makefile zm.conf zmconfgen.pl db/Makefile db/zm_create.sql misc/Makefile misc/apache.conf misc/logrotate.conf misc/syslog.conf misc/com.zoneminder.systemctl.policy misc/com.zoneminder.systemctl.rules onvif/Makefile onvif/scripts/Makefile scripts/Makefile scripts/zm scripts/zmaudit.pl scripts/zmcontrol.pl scripts/zmdc.pl scripts/zmfilter.pl scripts/zmpkg.pl scripts/zmtrack.pl scripts/zmcamtool.pl scripts/zmsystemctl.pl scripts/zmtrigger.pl scripts/zmupdate.pl scripts/zmvideo.pl scripts/zmwatch.pl scripts/zmx10.pl scripts/zmdbbackup scripts/zmdbrestore scripts/zmeventdump scripts/zmlogrotate.conf scripts/ZoneMinder/lib/ZoneMinder/Base.pm scripts/ZoneMinder/lib/ZoneMinder/Config.pm scripts/ZoneMinder/lib/ZoneMinder/Memory.pm scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm src/Makefile src/zm_config.h web/Makefile web/ajax/Makefile web/css/Makefile web/graphics/Makefile web/includes/Makefile web/includes/config.php web/js/Makefile web/lang/Makefile web/skins/Makefile web/skins/classic/Makefile web/skins/classic/ajax/Makefile web/skins/classic/css/Makefile web/skins/classic/css/classic/Makefile web/skins/classic/css/classic/views/Makefile web/skins/classic/css/flat/Makefile web/skins/classic/css/flat/views/Makefile web/skins/classic/graphics/Makefile web/skins/classic/includes/Makefile web/skins/classic/js/Makefile web/skins/classic/lang/Makefile web/skins/classic/views/Makefile web/skins/classic/views/js/Makefile web/skins/mobile/Makefile web/skins/mobile/ajax/Makefile web/skins/mobile/css/Makefile web/skins/mobile/graphics/Makefile web/skins/mobile/includes/Makefile web/skins/mobile/lang/Makefile web/skins/mobile/views/Makefile web/skins/mobile/views/css/Makefile web/tools/Makefile web/tools/mootools/Makefile web/views/Makefile web/skins/xml/Makefile web/skins/xml/views/Makefile web/skins/xml/includes/Makefile])
AC_CONFIG_FILES([Makefile zm.conf zmconfgen.pl db/Makefile db/zm_create.sql misc/Makefile misc/apache.conf misc/logrotate.conf misc/syslog.conf misc/com.zoneminder.systemctl.policy misc/com.zoneminder.systemctl.rules onvif/Makefile onvif/scripts/Makefile scripts/Makefile scripts/zm scripts/zmaudit.pl scripts/zmcontrol.pl scripts/zmdc.pl scripts/zmfilter.pl scripts/zmpkg.pl scripts/zmtrack.pl scripts/zmcamtool.pl scripts/zmsystemctl.pl scripts/zmtrigger.pl scripts/zmupdate.pl scripts/zmvideo.pl scripts/zmwatch.pl scripts/zmx10.pl scripts/zmdbbackup scripts/zmdbrestore scripts/zmeventdump scripts/zmlogrotate.conf scripts/ZoneMinder/lib/ZoneMinder/Base.pm scripts/ZoneMinder/lib/ZoneMinder/Config.pm scripts/ZoneMinder/lib/ZoneMinder/Memory.pm scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm src/Makefile src/zm_config.h web/Makefile web/ajax/Makefile web/css/Makefile web/graphics/Makefile web/includes/Makefile web/includes/config.php web/js/Makefile web/lang/Makefile web/skins/Makefile web/skins/classic/Makefile web/skins/classic/ajax/Makefile web/skins/classic/css/Makefile web/skins/classic/css/classic/Makefile web/skins/classic/css/classic/views/Makefile web/skins/classic/css/dark/Makefile web/skins/classic/css/dark/views/Makefile web/skins/classic/css/flat/Makefile web/skins/classic/css/flat/views/Makefile web/skins/classic/graphics/Makefile web/skins/classic/includes/Makefile web/skins/classic/js/Makefile web/skins/classic/lang/Makefile web/skins/classic/views/Makefile web/skins/classic/views/js/Makefile web/skins/mobile/Makefile web/skins/mobile/ajax/Makefile web/skins/mobile/css/Makefile web/skins/mobile/graphics/Makefile web/skins/mobile/includes/Makefile web/skins/mobile/lang/Makefile web/skins/mobile/views/Makefile web/skins/mobile/views/css/Makefile web/tools/Makefile web/tools/mootools/Makefile web/views/Makefile web/skins/xml/Makefile web/skins/xml/views/Makefile web/skins/xml/includes/Makefile])
# Create the definitions for compilation and defaults for the database
AC_CONFIG_COMMANDS([src/zm_config_defines.h],[perl ./zmconfgen.pl])

View File

@ -23,7 +23,7 @@ apache_remove() {
if [ "$1" = "remove" ] || [ "$1" = "purge" ]; then
# Deconfigure the web server
db_get zoneminder/webserver
db_get zoneminder/webserver || true
for webserver in $RET; do
webserver=${webserver%,}
# Currently we only support apache2

View File

@ -1 +0,0 @@
../redhat/redalert.wav

1
distros/fedora/redalert.wav Symbolic link
View File

@ -0,0 +1 @@
../redhat/redalert.wav

View File

@ -32,7 +32,7 @@ Alias /zm "/usr/share/zoneminder/www"
ScriptAlias /cgi-bin/zm "/usr/libexec/zoneminder/cgi-bin"
<Directory "/usr/libexec/zoneminder/cgi-bin">
AllowOverride All
Options ExecCGI
Options +ExecCGI +FollowSymLinks
<IfModule mod_authz_core.c>
# Apache 2.4
Require all granted

View File

@ -1 +0,0 @@
../redhat/redalert.wav

View File

@ -0,0 +1 @@
../redhat/redalert.wav

View File

@ -22,7 +22,7 @@ Alias /zm "@ZM_WEBDIR@"
ScriptAlias /cgi-bin/zm "@ZM_WEBDIR@"
<Directory "@ZM_WEBDIR@">
AllowOverride All
Options ExecCGI
Options ExecCGI FollowSymLinks
Order allow,deny
Allow from all
</Directory>

View File

@ -29,7 +29,7 @@ Alias /zm "@ZM_WEBDIR@"
ScriptAlias /cgi-bin-zm "@ZM_CGIDIR@"
<Directory "@ZM_CGIDIR@">
AllowOverride All
Options ExecCGI
Options +ExecCGI +FollowSymLinks
<IfModule mod_authz_core.c>
# Apache 2.4
Require all granted

View File

@ -23,7 +23,7 @@ apache_remove() {
if [ "$1" = "remove" ] || [ "$1" = "purge" ]; then
# Deconfigure the web server
db_get zoneminder/webserver
db_get zoneminder/webserver || true
for webserver in $RET; do
webserver=${webserver%,}
# Currently we only support apache2

View File

@ -98,3 +98,11 @@ You use "less than" to indicate that you want to match events before the specifi
You should always test your filters before enabling any actions based on them to make sure they consistently return the results you want. You can use the submit button to see what events are returned by your query.
Caveat with Relative items
--------------------------
One thing to remember if you specify relative dates like "now" or "1 minute ago", etc, they are converted to a specific date and time by Zoneminder's filtering process (zmfilter.pl) when the filters are loaded. They are _NOT_ recomputed each time the filter runs. Filters are re-loaded depending on the value specified by FILTER_RELOAD_DELAY variable in the Zoneminder Web Console->Options->System
This may cause confusion in the following cases, for example:
Let's say a user specifies that he wants to be notified of events via email the moment the event "DateTime" is "less than" "now" as a filter criteria. When the filter first gets loaded by zmfilter.pl, this will translate to "Match events where Start Time < " + localtime() where local time is the time that is resolved when this filter gets loaded. Now till the time the filter gets reloaded after FILTER_RELOAD_DELAY seconds (which is usually set to 300 seconds, or 5 minutes), that time does not get recomputed, so the filter will not process any new events that occur after that computed date till another 5 minutes, which is probably not what you want.

View File

@ -567,13 +567,15 @@ void Event::AddFrame( Image *image, struct timeval timestamp, int score, Image *
struct DeltaTimeval delta_time;
DELTA_TIMEVAL( delta_time, timestamp, start_time, DT_PREC_2 );
bool db_frame = (score>=0) || ((frames%config.bulk_frame_interval)==0) || !frames;
const char *frame_type = score>0?"Alarm":(score<0?"Bulk":"Normal");
if ( score < 0 )
score = 0;
bool db_frame = (strcmp(frame_type,"Bulk") != 0) || ((frames%config.bulk_frame_interval)==0) || !frames;
if ( db_frame )
{
const char *frame_type = score>0?"Alarm":(score<0?"Bulk":"Normal");
Debug( 1, "Adding frame %d to DB", frames );
Debug( 1, "Adding frame %d of type \"%s\" to DB", frames, frame_type );
static char sql[ZM_SQL_MED_BUFSIZ];
snprintf( sql, sizeof(sql), "insert into Frames ( EventId, FrameId, Type, TimeStamp, Delta, Score ) values ( %d, %d, '%s', from_unixtime( %ld ), %s%ld.%02ld, %d )", id, frames, frame_type, timestamp.tv_sec, delta_time.positive?"":"-", delta_time.sec, delta_time.fsec, score );
if ( mysql_query( &dbconn, sql ) )
@ -583,8 +585,8 @@ void Event::AddFrame( Image *image, struct timeval timestamp, int score, Image *
}
last_db_frame = frames;
// We are writing a bulk frame
if ( score < 0 )
// We are writing a Bulk frame
if ( !strcmp( frame_type,"Bulk") )
{
snprintf( sql, sizeof(sql), "update Events set Length = %s%ld.%02ld, Frames = %d, AlarmFrames = %d, TotScore = %d, AvgScore = %d, MaxScore = %d where Id = %d", delta_time.positive?"":"-", delta_time.sec, delta_time.fsec, frames, alarm_frames, tot_score, (int)(alarm_frames?(tot_score/alarm_frames):0), max_score, id );
if ( mysql_query( &dbconn, sql ) )
@ -597,7 +599,8 @@ void Event::AddFrame( Image *image, struct timeval timestamp, int score, Image *
end_time = timestamp;
if ( score > 0 )
// We are writing an Alarm frame
if ( !strcmp( frame_type,"Alarm") )
{
alarm_frames++;

View File

@ -2596,10 +2596,10 @@ void Image::Scale( unsigned int factor )
return;
}
unsigned int new_width = (width*factor)/ZM_SCALE_BASE+1;
unsigned int new_height = (height*factor)/ZM_SCALE_BASE+1;
unsigned int new_width = (width*factor)/ZM_SCALE_BASE;
unsigned int new_height = (height*factor)/ZM_SCALE_BASE;
size_t scale_buffer_size = new_width * new_height * colours;
size_t scale_buffer_size = (new_width+1) * (new_height+1) * colours;
uint8_t* scale_buffer = AllocBuffer(scale_buffer_size);

View File

@ -235,7 +235,7 @@ void Logger::initialise( const std::string &id, const Options &options )
void Logger::terminate()
{
Info( "Terminating Logger" );
Debug(1, "Terminating Logger" );
if ( mFileLevel > NOLOG )
closeFile();

View File

@ -427,10 +427,6 @@ Monitor::Monitor(
Error( "Shared data not initialised by capture daemon for monitor %s", name );
exit( -1 );
}
else
{
Warning( "Shared data not initialised by capture daemon, some query functions may not be available or produce invalid results for monitor %s", name );
}
}
// Will this not happen every time a monitor is instantiated? Seems like all the calls to the Monitor constructor pass a zero for n_zones, then load zones after..
@ -2863,7 +2859,7 @@ int Monitor::Capture()
}
if ( true ) {
if ( capture_image->Size() != camera->ImageSize() )
if ( capture_image->Size() > camera->ImageSize() )
{
Error( "Captured image %d does not match expected size %d check width, height and colour depth",capture_image->Size(),camera->ImageSize() );
return( -1 );

View File

@ -238,7 +238,7 @@ User *zmLoadAuthUser( const char *auth, bool use_remote_addr )
{
// We have a match
User *user = new User( dbrow );
Info( "Authenticated user '%s'", user->getUsername() );
Debug(1, "Authenticated user '%s'", user->getUsername() );
return( user );
}
}

View File

@ -34,6 +34,7 @@ class AppController extends Controller {
use CrudControllerTrait;
public $components = [
'Session', // PP - We are going to use SessionHelper to check PHP session vars
'RequestHandler',
'Crud.Crud' => [
'actions' => [
@ -47,4 +48,25 @@ class AppController extends Controller {
'listeners' => ['Api', 'ApiTransformation']
]
];
//PP - Global beforeFilter function
//Zoneminder sets the username session variable
// to the logged in user. If this variable is set
// then you are logged in
// its pretty simple to extend this to also check
// for role and deny API access in future
// Also checking to do this only if ZM_OPT_USE_AUTH is on
public function beforeFilter() {
$this->loadModel('Config');
$options = array('conditions' => array('Config.' . $this->Config->primaryKey => 'ZM_OPT_USE_AUTH'));
$config = $this->Config->find('first', $options);
$zmOptAuth = $config['Config']['Value'];
if (!$this->Session->Read('user.Username') && ($zmOptAuth=='1'))
{
throw new NotFoundException(__('Not Authenticated'));
return;
}
}
}

View File

@ -14,6 +14,23 @@ class ConfigsController extends AppController {
*/
public $components = array('RequestHandler');
/**
* PP - resolves the issue of not returning all config parameters
* refer https://github.com/ZoneMinder/ZoneMinder/issues/953
* index method
*
* @return void
*/
public function index() {
$this->Config->recursive = 0;
$configs = $this->Config->find('all');
$this->set(array(
'configs' => $configs,
'_serialize' => array('configs')
));
}
/**
* view method
*

View File

@ -37,7 +37,16 @@ class EventsController extends AppController {
'fields' => array('Name', 'Value')
));
$this->Paginator->settings = array(
'limit' => $limit['ZM_WEB_EVENTS_PER_PAGE'],
// https://github.com/ZoneMinder/ZoneMinder/issues/995
// 'limit' => $limit['ZM_WEB_EVENTS_PER_PAGE'],
// PP - 25 events per page which is what the above
// default is, is way too low for an API
// changing this to 100 so we don't kill ZM
// with many event APIs. In future, we can
// make a nice ZM_API_ITEMS_PER_PAGE for all pagination
// API
'limit' => '100',
'order' => array('StartTime', 'MaxScore'),
'paramType' => 'querystring',
'conditions' => $conditions

View File

@ -78,7 +78,7 @@ $SLANG = array(
'8BitGrey' => '8-Bit-Grau',
'Action' => 'Aktion',
'Actual' => 'Original',
'AddNewControl' => 'Neues Kontrollelement hinzufügen',
'AddNewControl' => 'Neues Kontrollelement hinzufügen',
'AddNewMonitor' => 'Neuer Monitor',
'AddNewUser' => 'Neuer Benutzer',
'AddNewZone' => 'Neue Zone',
@ -89,7 +89,7 @@ $SLANG = array(
'AlarmLimits' => 'Alarm-Limits',
'AlarmMaximumFPS' => 'Alarm-Maximum-FPS',
'AlarmPx' => 'Alarm-Pixel',
'AlarmRGBUnset' => 'Sie müssen eine RGB-Alarmfarbe setzen',
'AlarmRGBUnset' => 'Sie müssen eine RGB-Alarmfarbe setzen',
'AlarmRefImageBlendPct'=> 'Alarm Reference Image Blend %ge', // Added - 2015-04-18
'Alert' => 'Alarm',
'All' => 'Alle',
@ -107,7 +107,7 @@ $SLANG = array(
'AttrCause' => 'Grund',
'AttrDate' => 'Datum',
'AttrDateTime' => 'Datum/Zeit',
'AttrDiskBlocks' => 'Disk-Blöcke',
'AttrDiskBlocks' => 'Disk-Blöcke',
'AttrDiskPercent' => 'Disk-Prozent',
'AttrDuration' => 'Dauer',
'AttrFrames' => 'Bilder',
@ -122,61 +122,61 @@ $SLANG = array(
'AttrTotalScore' => 'Totale Punktzahl',
'AttrWeekday' => 'Wochentag',
'Auto' => 'Auto',
'AutoStopTimeout' => 'Auto-Stopp-Zeitüberschreitung',
'Available' => 'Verfügbar', // Added - 2009-03-31
'AutoStopTimeout' => 'Auto-Stopp-Zeitüberschreitung',
'Available' => 'Verfügbar', // Added - 2009-03-31
'AvgBrScore' => 'Mittlere<br/>Punktzahl',
'Background' => 'Hintergrund',
'BackgroundFilter' => 'Filter im Hintergrund laufen lassen',
'BadAlarmFrameCount' => 'Die Bildanzahl muss ganzzahlig 1 oder größer sein',
'BadAlarmFrameCount' => 'Die Bildanzahl muss ganzzahlig 1 oder größer sein',
'BadAlarmMaxFPS' => 'Alarm-Maximum-FPS muss eine positive Ganzzahl oder eine Gleitkommazahl sein',
'BadChannel' => 'Der Kanal muss ganzzahlig 0 oder größer sein',
'BadColours' => 'Zielfarbe muss auf einen gültigen Wert gesetzt werden', // Added - 2011-06-15
'BadDevice' => 'Das Gerät muss eine gültige Systemresource sein',
'BadFPSReportInterval' => 'Der FPS-Intervall-Puffer-Zähler muss ganzzahlig 0 oder größer sein',
'BadFormat' => 'Das Format muss ganzzahlig 0 oder größer sein',
'BadFrameSkip' => 'Der Auslasszähler für Frames muss ganzzahlig 0 oder größer sein',
'BadHeight' => 'Die Höhe muss auf einen gültigen Wert eingestellt sein',
'BadHost' => 'Der Host muss auf eine gültige IP-Adresse oder einen Hostnamen (ohne http://) eingestellt sein',
'BadImageBufferCount' => 'Die Größe des Bildpuffers muss ganzzahlig 10 oder größer sein',
'BadLabelX' => 'Die x-Koordinate der Bezeichnung muss ganzzahlig 0 oder größer sein',
'BadLabelY' => 'Die y-Koordinate der Bezeichnung muss ganzzahlig 0 oder größer sein',
'BadChannel' => 'Der Kanal muss ganzzahlig 0 oder größer sein',
'BadColours' => 'Zielfarbe muss auf einen gültigen Wert gesetzt werden', // Added - 2011-06-15
'BadDevice' => 'Das Gerät muss eine gültige Systemresource sein',
'BadFPSReportInterval' => 'Der FPS-Intervall-Puffer-Zähler muss ganzzahlig 0 oder größer sein',
'BadFormat' => 'Das Format muss ganzzahlig 0 oder größer sein',
'BadFrameSkip' => 'Der Auslasszähler für Frames muss ganzzahlig 0 oder größer sein',
'BadHeight' => 'Die Höhe muss auf einen gültigen Wert eingestellt sein',
'BadHost' => 'Der Host muss auf eine gültige IP-Adresse oder einen Hostnamen (ohne http://) eingestellt sein',
'BadImageBufferCount' => 'Die Größe des Bildpuffers muss ganzzahlig 10 oder größer sein',
'BadLabelX' => 'Die x-Koordinate der Bezeichnung muss ganzzahlig 0 oder größer sein',
'BadLabelY' => 'Die y-Koordinate der Bezeichnung muss ganzzahlig 0 oder größer sein',
'BadMaxFPS' => 'Maximum-FPS muss eine positive Ganzzahl oder eine Gleitkommazahl sein',
'BadMotionFrameSkip' => 'Bewegungsrahmen Skip-Zählung muß eine ganze Zahl von null oder mehr betragen,',
'BadNameChars' => 'Namen dürfen nur aus Buchstaben, Zahlen und Trenn- oder Unterstrichen bestehen',
'BadPalette' => 'Palette muss auf einen gültigen Wert gesetzt sein', // Added - 2009-03-31
'BadPath' => 'Der Pfad muss auf einen gültigen Wert eingestellt sein',
'BadPort' => 'Der Port muss auf eine gültige Zahl eingestellt sein',
'BadPostEventCount' => 'Der Zähler für die Ereignisfolgebilder muss ganzzahlig 0 oder größer sein',
'BadPreEventCount' => 'Der Zähler für die Ereignisvorlaufbilder muss mindestens ganzzahlig 0 und kleiner als die Bildpuffergröße sein',
'BadRefBlendPerc' => 'Der Referenz-Blenden-Prozentwert muss ganzzahlig 0 oder größer sein',
'BadSectionLength' => 'Die Bereichslänge muss ganzzahlig 0 oder größer sein',
'BadSignalCheckColour' => 'Die Signalprüffarbe muss auf einen gültigen Farbwert eingestellt sein',
'BadMotionFrameSkip' => 'Bewegungsrahmen Skip-Zählung muß eine ganze Zahl von null oder mehr betragen,',
'BadNameChars' => 'Namen dürfen nur aus Buchstaben, Zahlen und Trenn- oder Unterstrichen bestehen',
'BadPalette' => 'Palette muss auf einen gültigen Wert gesetzt sein', // Added - 2009-03-31
'BadPath' => 'Der Pfad muss auf einen gültigen Wert eingestellt sein',
'BadPort' => 'Der Port muss auf eine gültige Zahl eingestellt sein',
'BadPostEventCount' => 'Der Zähler für die Ereignisfolgebilder muss ganzzahlig 0 oder größer sein',
'BadPreEventCount' => 'Der Zähler für die Ereignisvorlaufbilder muss mindestens ganzzahlig 0 und kleiner als die Bildpuffergröße sein',
'BadRefBlendPerc' => 'Der Referenz-Blenden-Prozentwert muss ganzzahlig 0 oder größer sein',
'BadSectionLength' => 'Die Bereichslänge muss ganzzahlig 0 oder größer sein',
'BadSignalCheckColour' => 'Die Signalprüffarbe muss auf einen gültigen Farbwert eingestellt sein',
'BadStreamReplayBuffer'=> 'Der Wiedergabestrompuffer muss eine ganze Zahl von null oder mehr betragen',
'BadWarmupCount' => 'Die Anzahl der Vorwärmbilder muss ganzzahlig 0 oder größer sein',
'BadWebColour' => 'Die Webfarbe muss auf einen gültigen Farbwert eingestellt sein',
'BadWidth' => 'Die Breite muss auf einen gültigen Wert eingestellt sein',
'BadWarmupCount' => 'Die Anzahl der Vorwärmbilder muss ganzzahlig 0 oder größer sein',
'BadWebColour' => 'Die Webfarbe muss auf einen gültigen Farbwert eingestellt sein',
'BadWidth' => 'Die Breite muss auf einen gültigen Wert eingestellt sein',
'Bandwidth' => 'Bandbreite',
'BandwidthHead' => 'Bandbreite', // This is the end of the bandwidth status on the top of the console, different in many language due to phrasing
'BlobPx' => 'Blob-Pixel',
'BlobSizes' => 'Blobgröße',
'BlobSizes' => 'Blobgröße',
'Blobs' => 'Blobs',
'Brightness' => 'Helligkeit',
'Buffer' => 'Buffer', // Added - 2015-04-18
'Buffers' => 'Buffer',
'CSSDescription' => 'Ändere das standard CSS für diesen Computer.', // Added - 2015-04-18
'CSSDescription' => 'Ändere das standard CSS für diesen Computer.', // Added - 2015-04-18
'CanAutoFocus' => 'Kann Autofokus',
'CanAutoGain' => 'Kann Auto-Verstärkung',
'CanAutoGain' => 'Kann Auto-Verstärkung',
'CanAutoIris' => 'Kann Auto-Blende',
'CanAutoWhite' => 'Kann Auto-Weiß-Abgleich',
'CanAutoWhite' => 'Kann Auto-Weiß-Abgleich',
'CanAutoZoom' => 'Kann Auto-Zoom',
'CanFocus' => 'Kann Fokus',
'CanFocusAbs' => 'Kann absoluten Fokus',
'CanFocusCon' => 'Kann kontinuierlichen Fokus',
'CanFocusRel' => 'Kann relativen Fokus',
'CanGain' => 'Kann Verstärkung',
'CanGainAbs' => 'Kann absolute Verstärkung',
'CanGainCon' => 'Kann kontinuierliche Verstärkung',
'CanGainRel' => 'Kann relative Verstärkung',
'CanGain' => 'Kann Verstärkung',
'CanGainAbs' => 'Kann absolute Verstärkung',
'CanGainCon' => 'Kann kontinuierliche Verstärkung',
'CanGainRel' => 'Kann relative Verstärkung',
'CanIris' => 'Kann Blende',
'CanIrisAbs' => 'Kann absolute Blende',
'CanIrisCon' => 'Kann kontinuierliche Blende',
@ -193,49 +193,49 @@ $SLANG = array(
'CanSleep' => 'Kann Sleep',
'CanTilt' => 'Kann Neigung',
'CanWake' => 'Kann Wake',
'CanWhite' => 'Kann Weiß-Abgleich',
'CanWhiteAbs' => 'Kann absoluten Weiß-Abgleich',
'CanWhiteBal' => 'Kann Weiß-Abgleich-Balance',
'CanWhiteCon' => 'Kann kontinuierlichen Weiß-Abgleich',
'CanWhiteRel' => 'Kann relativen Weiß-Abgleich',
'CanWhite' => 'Kann Weiß-Abgleich',
'CanWhiteAbs' => 'Kann absoluten Weiß-Abgleich',
'CanWhiteBal' => 'Kann Weiß-Abgleich-Balance',
'CanWhiteCon' => 'Kann kontinuierlichen Weiß-Abgleich',
'CanWhiteRel' => 'Kann relativen Weiß-Abgleich',
'CanZoom' => 'Kann Zoom',
'CanZoomAbs' => 'Kann absoluten Zoom',
'CanZoomCon' => 'Kann kontinuierlichen Zoom',
'CanZoomRel' => 'Kann relativen Zoom',
'Cancel' => 'Abbruch',
'CancelForcedAlarm' => 'Abbruch des unbedingten Alarms',
'CaptureHeight' => 'Erfassungshöhe',
'CaptureHeight' => 'Erfassungshöhe',
'CaptureMethod' => 'Erfassungsmethode', // Added - 2009-02-08
'CapturePalette' => 'Erfassungsfarbpalette',
'CaptureResolution' => 'Aufnahmeauflösung', // Added - 2015-04-18
'CaptureResolution' => 'Aufnahmeauflösung', // Added - 2015-04-18
'CaptureWidth' => 'Erfassungsbreite',
'Cause' => 'Grund',
'CheckMethod' => 'Alarm-Prüfmethode',
'ChooseDetectedCamera' => 'Erkannte Kamera wählen', // Added - 2009-03-31
'CheckMethod' => 'Alarm-Prüfmethode',
'ChooseDetectedCamera' => 'Erkannte Kamera wählen', // Added - 2009-03-31
'ChooseFilter' => 'Filterauswahl',
'ChooseLogFormat' => 'Log-Format wählen', // Added - 2011-06-17
'ChooseLogFormat' => 'Log-Format wählen', // Added - 2011-06-17
'ChooseLogSelection' => 'Log-Auswahl', // Added - 2011-06-17
'ChoosePreset' => 'Voreinstellung auswählen',
'ChoosePreset' => 'Voreinstellung auswählen',
'Clear' => 'Leeren', // Added - 2011-06-16
'Close' => 'Schließen',
'Close' => 'Schließen',
'Colour' => 'Farbe',
'Command' => 'Kommando',
'Component' => 'Komponente', // Added - 2011-06-16
'Config' => 'Konfig.',
'ConfiguredFor' => 'Konfiguriert für',
'ConfirmDeleteEvents' => 'Sind Sie sicher, dass Sie die ausgewählten Ereignisse löschen wollen?',
'ConfirmPassword' => 'Passwortbestätigung',
'ConfiguredFor' => 'Konfiguriert für',
'ConfirmDeleteEvents' => 'Sind Sie sicher, dass Sie die ausgewählten Ereignisse löschen wollen?',
'ConfirmPassword' => 'Passwortbestätigung',
'ConjAnd' => 'und',
'ConjOr' => 'oder',
'Console' => 'Konsole',
'ContactAdmin' => 'Bitte kontaktieren Sie den Administrator für weitere Details',
'ContactAdmin' => 'Bitte kontaktieren Sie den Administrator für weitere Details',
'Continue' => 'Weiter',
'Contrast' => 'Kontrast',
'Control' => 'Kontrolle',
'ControlAddress' => 'Kontrolladresse',
'ControlCap' => 'Kontrollmöglichkeit',
'ControlCaps' => 'Kontrollmöglichkeiten',
'ControlDevice' => 'Kontrollgerät',
'ControlCap' => 'Kontrollmöglichkeit',
'ControlCaps' => 'Kontrollmöglichkeiten',
'ControlDevice' => 'Kontrollgerät',
'ControlType' => 'Kontrolltyp',
'Controllable' => 'Kontrollierbar',
'Current' => 'Aktuell', // Added - 2015-04-18
@ -248,20 +248,20 @@ $SLANG = array(
'DefaultScale' => 'Standardskalierung',
'DefaultView' => 'Standardansicht',
'Deinterlacing' => 'Deinterlacing', // Added - 2015-04-18
'Delay' => 'Verzögerung', // Added - 2015-04-18
'Delete' => 'Löschen',
'DeleteAndNext' => 'Löschen & Nächstes',
'DeleteAndPrev' => 'Löschen & Vorheriges',
'DeleteSavedFilter' => 'Lösche gespeichertes Filter',
'Delay' => 'Verzögerung', // Added - 2015-04-18
'Delete' => 'Löschen',
'DeleteAndNext' => 'Löschen & Nächstes',
'DeleteAndPrev' => 'Löschen & Vorheriges',
'DeleteSavedFilter' => 'Lösche gespeichertes Filter',
'Description' => 'Beschreibung',
'DetectedCameras' => 'Erkannte Kameras', // Added - 2009-03-31
'DetectedProfiles' => 'Erkannte Profile', // Added - 2015-04-18
'Device' => 'Gerät', // Added - 2009-02-08
'DeviceChannel' => 'Gerätekanal',
'DeviceFormat' => 'Geräteformat',
'DeviceNumber' => 'Gerätenummer',
'DevicePath' => 'Gerätepfad',
'Devices' => 'Geräte',
'Device' => 'Gerät', // Added - 2009-02-08
'DeviceChannel' => 'Gerätekanal',
'DeviceFormat' => 'Geräteformat',
'DeviceNumber' => 'Gerätenummer',
'DevicePath' => 'Gerätepfad',
'Devices' => 'Geräte',
'Dimensions' => 'Abmessungen',
'DisableAlarms' => 'Alarme abschalten',
'Disk' => 'Disk',
@ -270,13 +270,13 @@ $SLANG = array(
'DoNativeMotionDetection'=> 'Do Native Motion Detection',
'Donate' => 'Bitte spenden Sie.',
'DonateAlready' => 'Nein, ich habe schon gespendet',
'DonateEnticement' => 'Sie benutzen ZoneMinder nun schon eine Weile und es ist hoffentlich eine nützliche Applikation zur Verbesserung Ihrer Heim- oder Arbeitssicherheit. Obwohl ZoneMinder eine freie Open-Source-Software ist und bleiben wird, entstehen Kosten bei der Entwicklung und dem Support.<br><br>Falls Sie ZoneMinder für Weiterentwicklung in der Zukunft unterstützen möchten, denken Sie bitte über eine Spende für das Projekt unter der Webadresse http://www.zoneminder.com/donate.html oder über nachfolgend stehende Option nach. Spenden sind, wie der Name schon sagt, immer freiwillig. Dem Projekt helfen kleine genauso wie größere Spenden sehr weiter und ein herzlicher Dank ist jedem Spender sicher.<br><br>Vielen Dank dafür, dass sie ZoneMinder benutzen. Vergessen Sie nicht die Foren unter ZoneMinder.com, um Support zu erhalten und Ihre Erfahrung mit ZoneMinder zu verbessern!',
'DonateEnticement' => 'Sie benutzen ZoneMinder nun schon eine Weile und es ist hoffentlich eine nützliche Applikation zur Verbesserung Ihrer Heim- oder Arbeitssicherheit. Obwohl ZoneMinder eine freie Open-Source-Software ist und bleiben wird, entstehen Kosten bei der Entwicklung und dem Support.<br><br>Falls Sie ZoneMinder für Weiterentwicklung in der Zukunft unterstützen möchten, denken Sie bitte über eine Spende für das Projekt unter der Webadresse http://www.zoneminder.com/donate.html oder über nachfolgend stehende Option nach. Spenden sind, wie der Name schon sagt, immer freiwillig. Dem Projekt helfen kleine genauso wie größere Spenden sehr weiter und ein herzlicher Dank ist jedem Spender sicher.<br><br>Vielen Dank dafür, dass sie ZoneMinder benutzen. Vergessen Sie nicht die Foren unter ZoneMinder.com, um Support zu erhalten und Ihre Erfahrung mit ZoneMinder zu verbessern!',
'DonateRemindDay' => 'Noch nicht, erinnere mich in einem Tag noch mal.',
'DonateRemindHour' => 'Noch nicht, erinnere mich in einer Stunde noch mal.',
'DonateRemindMonth' => 'Noch nicht, erinnere mich in einem Monat noch mal.',
'DonateRemindNever' => 'Nein, ich möchte nicht spenden, niemals erinnern.',
'DonateRemindNever' => 'Nein, ich möchte nicht spenden, niemals erinnern.',
'DonateRemindWeek' => 'Noch nicht, erinnere mich in einer Woche noch mal.',
'DonateYes' => 'Ja, ich möchte jetzt spenden.',
'DonateYes' => 'Ja, ich möchte jetzt spenden.',
'Download' => 'Download',
'DuplicateMonitorName' => 'Monitornamen Duplizieren', // Added - 2009-03-31
'Duration' => 'Dauer',
@ -287,16 +287,16 @@ $SLANG = array(
'EnterNewFilterName' => 'Neuen Filternamen eingeben',
'Error' => 'Fehler',
'ErrorBrackets' => 'Fehler. Bitte nur gleiche Anzahl offener und geschlossener Klammern.',
'ErrorValidValue' => 'Fehler. Bitte alle Werte auf richtige Eingabe prüfen',
'ErrorValidValue' => 'Fehler. Bitte alle Werte auf richtige Eingabe prüfen',
'Etc' => 'etc.',
'Event' => 'Ereignis',
'EventFilter' => 'Ereignisfilter',
'EventId' => 'Ereignis-ID',
'EventName' => 'Ereignisname',
'EventPrefix' => 'Ereignis-Präfix',
'EventPrefix' => 'Ereignis-Präfix',
'Events' => 'Ereignisse',
'Exclude' => 'Ausschluss;',
'Execute' => 'Ausführen',
'Execute' => 'Ausführen',
'Export' => 'Exportieren',
'ExportDetails' => 'Exportiere Ereignis-Details',
'ExportFailed' => 'Exportieren fehlgeschlagen',
@ -315,21 +315,21 @@ $SLANG = array(
'FPSReportInterval' => 'FPS-Meldeintervall',
'FTP' => 'FTP',
'Far' => 'Weit',
'FastForward' => 'Schnell vorwärts',
'FastForward' => 'Schnell vorwärts',
'Feed' => 'Eingabe',
'Ffmpeg' => 'Ffmpeg', // Added - 2009-02-08
'File' => 'Datei',
'Filter' => 'Filter', // Added - 2015-04-18
'FilterArchiveEvents' => 'Archivierung aller Treffer',
'FilterDeleteEvents' => 'Löschen aller Treffer',
'FilterDeleteEvents' => 'Löschen aller Treffer',
'FilterEmailEvents' => 'Detaillierte E-Mail zu allen Treffern',
'FilterExecuteEvents' => 'Ausführen bei allen Treffern',
'FilterExecuteEvents' => 'Ausführen bei allen Treffern',
'FilterLog' => 'Log filtern', // Added - 2015-04-18
'FilterMessageEvents' => 'Detaillierte Nachricht zu allen Treffern',
'FilterPx' => 'Filter-Pixel',
'FilterUnset' => 'Sie müssen eine Breite und Höhe für das Filter angeben',
'FilterUnset' => 'Sie müssen eine Breite und Höhe für das Filter angeben',
'FilterUploadEvents' => 'Hochladen aller Treffer',
'FilterVideoEvents' => 'Video für alle Treffer erstellen',
'FilterVideoEvents' => 'Video für alle Treffer erstellen',
'Filters' => 'Filter',
'First' => 'Erstes',
'FlippedHori' => 'Horizontal gespiegelt',
@ -350,7 +350,7 @@ $SLANG = array(
'Frames' => 'Bilder',
'Func' => 'Fkt.',
'Function' => 'Funktion',
'Gain' => 'Verstärkung',
'Gain' => 'Verstärkung',
'General' => 'Allgemeines',
'GenerateVideo' => 'Erzeuge Video',
'GeneratingVideo' => 'Erzeuge Video...',
@ -359,7 +359,7 @@ $SLANG = array(
'Group' => 'Gruppe',
'Groups' => 'Gruppen',
'HasFocusSpeed' => 'Hat Fokus-Geschwindigkeit',
'HasGainSpeed' => 'Hat Verstärkungs-Geschwindigkeit',
'HasGainSpeed' => 'Hat Verstärkungs-Geschwindigkeit',
'HasHomePreset' => 'Hat Standardvoreinstellungen',
'HasIrisSpeed' => 'Hat Blendengeschwindigkeit',
'HasPanSpeed' => 'Hat Pan-Geschwindigkeit',
@ -367,7 +367,7 @@ $SLANG = array(
'HasTiltSpeed' => 'Hat Neigungsgeschwindigkeit',
'HasTurboPan' => 'Hat Turbo-Pan',
'HasTurboTilt' => 'Hat Turbo-Neigung',
'HasWhiteSpeed' => 'Hat Weiß-Abgleichgeschwindigkeit',
'HasWhiteSpeed' => 'Hat Weiß-Abgleichgeschwindigkeit',
'HasZoomSpeed' => 'Hat Zoom-Geschwindigkeit',
'High' => 'hohe',
'HighBW' => 'Hohe B/W',
@ -378,13 +378,13 @@ $SLANG = array(
'Idle' => 'Leerlauf',
'Ignore' => 'Ignoriere',
'Image' => 'Bild',
'ImageBufferSize' => 'Bildpuffergröße',
'ImageBufferSize' => 'Bildpuffergröße',
'Images' => 'Bilder',
'In' => 'In',
'Include' => 'Einschluss',
'Inverted' => 'Invertiert',
'Iris' => 'Blende',
'KeyString' => 'Schlüsselwort',
'KeyString' => 'Schlüsselwort',
'Label' => 'Bezeichnung',
'Language' => 'Sprache',
'Last' => 'Letztes',
@ -417,9 +417,9 @@ $SLANG = array(
'MaxFocusRange' => 'Maximaler Fokusbereich',
'MaxFocusSpeed' => 'Maximale Fokusgeschwindigkeit',
'MaxFocusStep' => 'Maximale Fokusstufe',
'MaxGainRange' => 'Maximaler Verstärkungsbereich',
'MaxGainSpeed' => 'Maximale Verstärkungsgeschwindigkeit',
'MaxGainStep' => 'Maximale Verstärkungsstufe',
'MaxGainRange' => 'Maximaler Verstärkungsbereich',
'MaxGainSpeed' => 'Maximale Verstärkungsgeschwindigkeit',
'MaxGainStep' => 'Maximale Verstärkungsstufe',
'MaxIrisRange' => 'Maximaler Blendenbereich',
'MaxIrisSpeed' => 'Maximale Blendengeschwindigkeit',
'MaxIrisStep' => 'Maximale Blendenstufe',
@ -429,9 +429,9 @@ $SLANG = array(
'MaxTiltRange' => 'Maximaler Neig.-Bereich',
'MaxTiltSpeed' => 'Maximale Neig.-Geschw.',
'MaxTiltStep' => 'Maximale Neig.-Stufe',
'MaxWhiteRange' => 'Maximaler Weiß-Abgl.bereich',
'MaxWhiteSpeed' => 'Maximale Weiß-Abgl.geschw.',
'MaxWhiteStep' => 'Maximale Weiß-Abgl.stufe',
'MaxWhiteRange' => 'Maximaler Weiß-Abgl.bereich',
'MaxWhiteSpeed' => 'Maximale Weiß-Abgl.geschw.',
'MaxWhiteStep' => 'Maximale Weiß-Abgl.stufe',
'MaxZoomRange' => 'Maximaler Zoom-Bereich',
'MaxZoomSpeed' => 'Maximale Zoom-Geschw.',
'MaxZoomStep' => 'Maximale Zoom-Stufe',
@ -440,21 +440,21 @@ $SLANG = array(
'MediumBW' => 'Mittlere B/W',
'Message' => 'Nachricht', // Added - 2011-06-16
'MinAlarmAreaLtMax' => 'Der minimale Alarmbereich sollte kleiner sein als der maximale',
'MinAlarmAreaUnset' => 'Sie müssen einen Minimumwert an Alarmflächenpixeln angeben',
'MinBlobAreaLtMax' => 'Die minimale Blob-Fläche muss kleiner sein als die maximale',
'MinBlobAreaUnset' => 'Sie müssen einen Minimumwert an Blobflächenpixeln angeben',
'MinBlobLtMinFilter' => 'Die minimale Blob-Fläche sollte kleiner oder gleich der minimalen Filterfläche sein',
'MinBlobsLtMax' => 'Die minimalen Blobs müssen kleiner sein als die maximalen',
'MinBlobsUnset' => 'Sie müssen einen Minimumwert an Blobs angeben',
'MinFilterAreaLtMax' => 'Die minimale Filterfläche sollte kleiner sein als die maximale',
'MinFilterAreaUnset' => 'Sie müssen einen Minimumwert an Filterpixeln angeben',
'MinFilterLtMinAlarm' => 'Die minimale Filterfläche sollte kleiner oder gleich der minimalen Alarmfläche sein',
'MinAlarmAreaUnset' => 'Sie müssen einen Minimumwert an Alarmflächenpixeln angeben',
'MinBlobAreaLtMax' => 'Die minimale Blob-Fläche muss kleiner sein als die maximale',
'MinBlobAreaUnset' => 'Sie müssen einen Minimumwert an Blobflächenpixeln angeben',
'MinBlobLtMinFilter' => 'Die minimale Blob-Fläche sollte kleiner oder gleich der minimalen Filterfläche sein',
'MinBlobsLtMax' => 'Die minimalen Blobs müssen kleiner sein als die maximalen',
'MinBlobsUnset' => 'Sie müssen einen Minimumwert an Blobs angeben',
'MinFilterAreaLtMax' => 'Die minimale Filterfläche sollte kleiner sein als die maximale',
'MinFilterAreaUnset' => 'Sie müssen einen Minimumwert an Filterpixeln angeben',
'MinFilterLtMinAlarm' => 'Die minimale Filterfläche sollte kleiner oder gleich der minimalen Alarmfläche sein',
'MinFocusRange' => 'Min. Fokusbereich',
'MinFocusSpeed' => 'Min. Fokusgeschw.',
'MinFocusStep' => 'Min. Fokusstufe',
'MinGainRange' => 'Min. Verstärkungsbereich',
'MinGainSpeed' => 'Min. Verstärkungsgeschwindigkeit',
'MinGainStep' => 'Min. Verstärkungsstufe',
'MinGainRange' => 'Min. Verstärkungsbereich',
'MinGainSpeed' => 'Min. Verstärkungsgeschwindigkeit',
'MinGainStep' => 'Min. Verstärkungsstufe',
'MinIrisRange' => 'Min. Blendenbereich',
'MinIrisSpeed' => 'Min. Blendengeschwindigkeit',
'MinIrisStep' => 'Min. Blendenstufe',
@ -462,13 +462,13 @@ $SLANG = array(
'MinPanSpeed' => 'Min. Pan-Geschwindigkeit',
'MinPanStep' => 'Min. Pan-Stufe',
'MinPixelThresLtMax' => 'Der minimale Pixelschwellwert muss kleiner sein als der maximale',
'MinPixelThresUnset' => 'Sie müssen einen minimalen Pixel-Schwellenwert angeben',
'MinPixelThresUnset' => 'Sie müssen einen minimalen Pixel-Schwellenwert angeben',
'MinTiltRange' => 'Min. Neigungsbereich',
'MinTiltSpeed' => 'Min. Neigungsgeschwindigkeit',
'MinTiltStep' => 'Min. Neigungsstufe',
'MinWhiteRange' => 'Min. Weiß-Abgleichbereich',
'MinWhiteSpeed' => 'Min. Weiß-Abgleichgeschwindigkeit',
'MinWhiteStep' => 'Min. Weiß-Abgleichstufe',
'MinWhiteRange' => 'Min. Weiß-Abgleichbereich',
'MinWhiteSpeed' => 'Min. Weiß-Abgleichgeschwindigkeit',
'MinWhiteStep' => 'Min. Weiß-Abgleichstufe',
'MinZoomRange' => 'Min. Zoom-Bereich',
'MinZoomSpeed' => 'Min. Zoom-Geschwindigkeit',
'MinZoomStep' => 'Min. Zoom-Stufe',
@ -477,9 +477,9 @@ $SLANG = array(
'Monitor' => 'Monitor',
'MonitorIds' => 'Monitor-ID',
'MonitorPreset' => 'Monitor-Voreinstellung',
'MonitorPresetIntro' => 'Wählen Sie eine geeignete Voreinstellung aus der folgenden Liste.<br><br>Bitte beachten Sie, dass dies mögliche Einstellungen von Ihnen am Monitor überschreiben kann.<br><br>',
'MonitorPresetIntro' => 'Wählen Sie eine geeignete Voreinstellung aus der folgenden Liste.<br><br>Bitte beachten Sie, dass dies mögliche Einstellungen von Ihnen am Monitor überschreiben kann.<br><br>',
'MonitorProbe' => 'Kamera suche', // Added - 2009-03-31
'MonitorProbeIntro' => 'Die nachfolgende Liste zeigt erkannte Analog- und Netzwerkkameras, ob sie bereits genutzt werden und ob sie zur Auswahl verfügbar sind.<br/><br/>Wähle den gewünschten Eintrag aus der folgenden Liste.<br/><br/>Bitte Beachten: Nicht alle Kameras können erkannt werden. Die Auswahl einer Kamera kann bereits eingetragene Werte im aktuellen Monitor überschreiben.<br/><br/>', // Added - 2009-03-31
'MonitorProbeIntro' => 'Die nachfolgende Liste zeigt erkannte Analog- und Netzwerkkameras, ob sie bereits genutzt werden und ob sie zur Auswahl verfügbar sind.<br/><br/>Wähle den gewünschten Eintrag aus der folgenden Liste.<br/><br/>Bitte Beachten: Nicht alle Kameras können erkannt werden. Die Auswahl einer Kamera kann bereits eingetragene Werte im aktuellen Monitor überschreiben.<br/><br/>', // Added - 2009-03-31
'Monitors' => 'Monitore',
'Montage' => 'Montage',
'Month' => 'Monat',
@ -491,11 +491,11 @@ $SLANG = array(
'Mtg3widgrx' => '3 Spalten, skaliert, vergr. bei Alarm', // Added 2013.08.15.
'Mtg4widgrd' => '4 Spalten', // Added 2013.08.15.
'MtgDefault' => 'Standard', // Added 2013.08.15.
'MustBeGe' => 'muss größer oder gleich sein wie',
'MustBeGe' => 'muss größer oder gleich sein wie',
'MustBeLe' => 'muss kleiner oder gleich sein wie',
'MustConfirmPassword' => 'Sie müssen das Passwort bestätigen.',
'MustSupplyPassword' => 'Sie müssen ein Passwort vergeben.',
'MustSupplyUsername' => 'Sie müssen einen Usernamen vergeben.',
'MustConfirmPassword' => 'Sie müssen das Passwort bestätigen.',
'MustSupplyPassword' => 'Sie müssen ein Passwort vergeben.',
'MustSupplyUsername' => 'Sie müssen einen Usernamen vergeben.',
'Name' => 'Name',
'Near' => 'Nah',
'Network' => 'Netzwerk',
@ -505,23 +505,23 @@ $SLANG = array(
'NewPassword' => 'Neues Passwort',
'NewState' => 'Neuer Status',
'NewUser' => 'Neuer Benutzer',
'Next' => 'Nächstes',
'Next' => 'Nächstes',
'No' => 'Nein',
'NoDetectedCameras' => 'Keine Kameras erkannt', // Added - 2009-03-31
'NoFramesRecorded' => 'Es gibt keine Aufnahmen von diesem Ereignis.',
'NoGroup' => 'Keine Gruppe',
'NoSavedFilters' => 'Keine gespeicherten Filter',
'NoStatisticsRecorded' => 'Keine Statistik für dieses Ereignis/diese Bilder',
'NoStatisticsRecorded' => 'Keine Statistik für dieses Ereignis/diese Bilder',
'None' => 'ohne',
'NoneAvailable' => 'Nichts verfügbar',
'NoneAvailable' => 'Nichts verfügbar',
'Normal' => 'Normal',
'Notes' => 'Bemerkungen',
'NumPresets' => 'Nummerierte Voreinstellungen',
'Off' => 'Aus',
'On' => 'An',
'OnvifCredentialsIntro'=> 'Bitte den Benutzernamen und das Passwort für die gewählte Kamera eintragen.<br/>Der hier eingetragene Benutzer wird erstellt mitsamt des Passworts, falls kein Benutzer für diese Kamera erstellt wurde.<br/><br/>', // Added - 2015-04-18
'OnvifCredentialsIntro'=> 'Bitte den Benutzernamen und das Passwort für die gewählte Kamera eintragen.<br/>Der hier eingetragene Benutzer wird erstellt mitsamt des Passworts, falls kein Benutzer für diese Kamera erstellt wurde.<br/><br/>', // Added - 2015-04-18
'OnvifProbe' => 'ONVIF', // Added - 2015-04-18
'OnvifProbeIntro' => 'Die folgende Liste zeigt erkannte ONVIF Kameras, ob sie bereits genutzt werden und ob sie zur Auswahl verfügbar sind.<br/><br/>Wähle den gewünschten Eintrag aus der folgenden Liste.<br/><br/>Bitte Beachten: Nicht alle Kameras können erkannt werden. Die Auswahl einer Kamera kann bereits eingetragene Werte im aktuellen Monitor überschreiben.<br/><br/>', // Added - 2015-04-18
'OnvifProbeIntro' => 'Die folgende Liste zeigt erkannte ONVIF Kameras, ob sie bereits genutzt werden und ob sie zur Auswahl verfügbar sind.<br/><br/>Wähle den gewünschten Eintrag aus der folgenden Liste.<br/><br/>Bitte Beachten: Nicht alle Kameras können erkannt werden. Die Auswahl einer Kamera kann bereits eingetragene Werte im aktuellen Monitor überschreiben.<br/><br/>', // Added - 2015-04-18
'OpEq' => 'gleich zu',
'OpGt' => 'groesser als',
'OpGtEq' => 'groesser oder gleich wie',
@ -532,15 +532,15 @@ $SLANG = array(
'OpNe' => 'nicht gleich',
'OpNotIn' => 'nicht im Satz',
'OpNotMatches' => 'nicht zutreffend',
'Open' => 'öffnen',
'Open' => 'öffnen',
'OptionHelp' => 'Hilfe',
'OptionRestartWarning' => 'Veränderungen werden erst nach einem Neustart des Programms aktiv.\nFür eine sofortige änderung starten Sie das Programm bitte neu.',
'OptionRestartWarning' => 'Veränderungen werden erst nach einem Neustart des Programms aktiv.\nFür eine sofortige änderung starten Sie das Programm bitte neu.',
'Options' => 'Optionen',
'OrEnterNewName' => 'oder neuen Namen eingeben',
'Order' => 'Reihenfolge',
'Orientation' => 'Ausrichtung',
'Out' => 'Aus',
'OverwriteExisting' => 'überschreibe bestehende',
'OverwriteExisting' => 'überschreibe bestehende',
'Paged' => 'Seitennummeriert',
'Pan' => 'Pan',
'PanLeft' => 'Pan-Links',
@ -548,7 +548,7 @@ $SLANG = array(
'PanTilt' => 'Pan/Neigung',
'Parameter' => 'Parameter',
'Password' => 'Passwort',
'PasswordsDifferent' => 'Die Passwörter sind unterschiedlich',
'PasswordsDifferent' => 'Die Passwörter sind unterschiedlich',
'Paths' => 'Pfade',
'Pause' => 'Pause',
'Phone' => 'Telefon',
@ -563,13 +563,13 @@ $SLANG = array(
'Point' => 'Punkt',
'PostEventImageBuffer' => 'Nachereignispuffer',
'PreEventImageBuffer' => 'Vorereignispuffer',
'PreserveAspect' => 'Seitenverhältnis beibehalten',
'PreserveAspect' => 'Seitenverhältnis beibehalten',
'Preset' => 'Voreinstellung',
'Presets' => 'Voreinstellungen',
'Prev' => 'Vorheriges',
'Probe' => 'Suchen', // Added - 2009-03-31
'ProfileProbe' => 'Streamsonde', // Added - 2015-04-18
'ProfileProbeIntro' => 'Die folgende Liste zeigt die verfügbaren Streamingprofile der ausgewählten Kamera.<br/><br/>Wähle den gewünschten Eintrag aus der folgenden Liste.<br/><br/>Bitte Beachten: Zoneminder kann keine zusätzlichen Profile konfigurieren. Die Auswahl einer Kamera kann bereits eingetragene Werte im aktuellen Monitor überschreiben.<br/><br/>', // Added - 2015-04-18
'ProfileProbeIntro' => 'Die folgende Liste zeigt die verfügbaren Streamingprofile der ausgewählten Kamera.<br/><br/>Wähle den gewünschten Eintrag aus der folgenden Liste.<br/><br/>Bitte Beachten: Zoneminder kann keine zusätzlichen Profile konfigurieren. Die Auswahl einer Kamera kann bereits eingetragene Werte im aktuellen Monitor überschreiben.<br/><br/>', // Added - 2015-04-18
'Progress' => 'Fortschritt', // Added - 2015-04-18
'Protocol' => 'Protokoll',
'Rate' => 'Abspielgeschwindigkeit',
@ -588,20 +588,20 @@ $SLANG = array(
'Rename' => 'Umbenennen',
'Replay' => 'Wiederholung',
'ReplayAll' => 'Alle Ereignisse',
'ReplayGapless' => 'Lückenlose Ereignisse',
'ReplayGapless' => 'Lückenlose Ereignisse',
'ReplaySingle' => 'Einzelereignis',
'Reset' => 'Zurücksetzen',
'ResetEventCounts' => 'Lösche Ereignispunktzahl',
'Reset' => 'Zurücksetzen',
'ResetEventCounts' => 'Lösche Ereignispunktzahl',
'Restart' => 'Neustart',
'Restarting' => 'Neustarten',
'RestrictedCameraIds' => 'Verbotene Kamera-ID',
'RestrictedMonitors' => 'Eingeschränkte Monitore',
'ReturnDelay' => 'Rückkehr-Verzögerung',
'ReturnLocation' => 'Rückkehrpunkt',
'Rewind' => 'Zurückspulen',
'RestrictedMonitors' => 'Eingeschränkte Monitore',
'ReturnDelay' => 'Rückkehr-Verzögerung',
'ReturnLocation' => 'Rückkehrpunkt',
'Rewind' => 'Zurückspulen',
'RotateLeft' => 'Drehung links',
'RotateRight' => 'Drehung rechts',
'RunLocalUpdate' => 'Für Update "zmupdate.pl" ausführen', // Added - 2011-05-25
'RunLocalUpdate' => 'Für Update "zmupdate.pl" ausführen', // Added - 2011-05-25
'RunMode' => 'Betriebsmodus',
'RunState' => 'Laufender Status',
'Running' => 'In Betrieb',
@ -611,12 +611,12 @@ $SLANG = array(
'Scale' => 'Skalierung',
'Score' => 'Punktzahl',
'Secs' => 'Sekunden',
'Sectionlength' => 'Sektionslänge',
'Sectionlength' => 'Sektionslänge',
'Select' => 'Auswahl',
'SelectFormat' => 'Format auswählen', // Added - 2011-06-17
'SelectLog' => 'Log auswählen', // Added - 2011-06-17
'SelectMonitors' => 'Wähle Monitore',
'SelfIntersecting' => 'Die Polygonränder dürfen sich nicht überschneiden.',
'SelectFormat' => 'Format auswählen', // Added - 2011-06-17
'SelectLog' => 'Log auswählen', // Added - 2011-06-17
'SelectMonitors' => 'Wähle Monitore',
'SelfIntersecting' => 'Die Polygonränder dürfen sich nicht überschneiden.',
'Set' => 'Setze',
'SetNewBandwidth' => 'Setze neue Bandbreite',
'SetPreset' => 'Setze Voreinstellung',
@ -624,8 +624,8 @@ $SLANG = array(
'ShowFilterWindow' => 'Zeige Filterfenster',
'ShowTimeline' => 'Zeige Zeitlinie',
'SignalCheckColour' => 'Farbe des Signalchecks',
'Size' => 'Größe',
'SkinDescription' => 'Wähle den standard Skin für diesen Computer.', // Added - 2011-01-30
'Size' => 'Größe',
'SkinDescription' => 'Wähle den standard Skin für diesen Computer.', // Added - 2011-01-30
'Sleep' => 'Schlaf',
'SortAsc' => 'aufsteigend',
'SortBy' => 'Sortieren nach',
@ -644,9 +644,9 @@ $SLANG = array(
'Stats' => 'Statistik',
'Status' => 'Status',
'Step' => 'Stufe',
'StepBack' => 'Einen Schritt rückwärts',
'StepForward' => 'Einen Schritt vorwärts',
'StepLarge' => 'Großer Schritt',
'StepBack' => 'Einen Schritt rückwärts',
'StepForward' => 'Einen Schritt vorwärts',
'StepLarge' => 'Großer Schritt',
'StepMedium' => 'Mittlere Schhritt',
'StepNone' => 'Keine Schritt',
'StepSmall' => 'Kleiner Schritt',
@ -666,10 +666,10 @@ $SLANG = array(
'TimeDelta' => 'Zeitdifferenz',
'TimeStamp' => 'Zeitstempel',
'Timeline' => 'Zeitlinie',
'TimelineTip1' => 'Fahren Sie mit der Maus über die Grafik, um eine Momentaufnahme der Bild- und Ereignisdetails zusehen.', // Added 2013.08.15.
'TimelineTip1' => 'Fahren Sie mit der Maus über die Grafik, um eine Momentaufnahme der Bild- und Ereignisdetails zusehen.', // Added 2013.08.15.
'TimelineTip2' => 'Klicken Sie auf den farbig markierten Bereichen der Grafik oder das Bild, um das Ereignis zu sehen.', // Added 2013.08.15.
'TimelineTip3' => 'Klicken Sie auf den Hintergrund, um in einen kleineren Zeitraum zu vergrößern.', // Added 2013.08.15.
'TimelineTip4' => 'Verwenden Sie die Steuerelemente unten, um zu Zoomen oder navigieren Sie vorwärts und rückwärts durch die Zeit.', // Added 2013.08.15.
'TimelineTip3' => 'Klicken Sie auf den Hintergrund, um in einen kleineren Zeitraum zu vergrößern.', // Added 2013.08.15.
'TimelineTip4' => 'Verwenden Sie die Steuerelemente unten, um zu Zoomen oder navigieren Sie vorwärts und rückwärts durch die Zeit.', // Added 2013.08.15.
'Timestamp' => 'Zeitstempel',
'TimestampLabelFormat' => 'Format des Zeitstempels',
'TimestampLabelX' => 'Zeitstempel-X',
@ -678,9 +678,9 @@ $SLANG = array(
'Tools' => 'Werkzeuge',
'Total' => 'Total', // Added - 2011-06-16
'TotalBrScore' => 'Totale<br/>Punktzahl',
'TrackDelay' => 'Nachführungsverzögerung',
'TrackMotion' => 'Bewegungs-Nachführung',
'Triggers' => 'Auslöser',
'TrackDelay' => 'Nachführungsverzögerung',
'TrackMotion' => 'Bewegungs-Nachführung',
'Triggers' => 'Auslöser',
'TurboPanSpeed' => 'Turbo-Pan-Geschwindigkeit',
'TurboTiltSpeed' => 'Turbo-Neigungsgeschwindigkeit',
'Type' => 'Typ',
@ -689,12 +689,12 @@ $SLANG = array(
'Units' => 'Einheiten',
'Unknown' => 'Unbekannt',
'Update' => 'Aktualisieren',
'UpdateAvailable' => 'Eine Aktualisierung für ZoneMinder ist verfügbar.',
'UpdateNotNecessary' => 'Es ist keine Aktualisierung verfügbar.',
'UpdateAvailable' => 'Eine Aktualisierung für ZoneMinder ist verfügbar.',
'UpdateNotNecessary' => 'Es ist keine Aktualisierung verfügbar.',
'Updated' => 'Aktualisiert', // Added - 2011-06-16
'Upload' => 'Hochladen', // Added - 2011-08-23
'UseFilter' => 'Benutze Filter',
'UseFilterExprsPost' => ' Filter Ausdrücke', // This is used at the end of the phrase 'use N filter expressions'
'UseFilterExprsPost' => ' Filter Ausdrücke', // This is used at the end of the phrase 'use N filter expressions'
'UseFilterExprsPre' => 'Benutze ', // This is used at the beginning of the phrase 'use N filter expressions'
'UsedPlugins' => 'Used Plugins',
'User' => 'Benutzer',
@ -708,7 +708,7 @@ $SLANG = array(
'VersionIgnore' => 'Ignoriere diese Version',
'VersionRemindDay' => 'Erinnere mich wieder in 1 Tag.',
'VersionRemindHour' => 'Erinnere mich wieder in 1 Stunde.',
'VersionRemindNever' => 'Informiere mich nicht mehr über neue Versionen.',
'VersionRemindNever' => 'Informiere mich nicht mehr über neue Versionen.',
'VersionRemindWeek' => 'Erinnere mich wieder in 1 Woche.',
'Video' => 'Video',
'VideoFormat' => 'Videoformat',
@ -717,19 +717,19 @@ $SLANG = array(
'VideoGenNoFiles' => 'Keine Videodateien gefunden.',
'VideoGenParms' => 'Parameter der Videoerzeugung',
'VideoGenSucceeded' => 'Videoerzeugung erfolgreich!',
'VideoSize' => 'Videogröße',
'VideoSize' => 'Videogröße',
'View' => 'Ansicht',
'ViewAll' => 'Alles ansehen',
'ViewEvent' => 'Zeige Ereignis',
'ViewPaged' => 'Seitenansicht',
'Wake' => 'Aufwachen',
'WarmupFrames' => 'Aufwärmbilder',
'WarmupFrames' => 'Aufwärmbilder',
'Watch' => 'Beobachte',
'Web' => 'Web',
'WebColour' => 'Webfarbe',
'Week' => 'Woche',
'White' => 'Weiß',
'WhiteBalance' => 'Weiß-Abgleich',
'White' => 'Weiß',
'WhiteBalance' => 'Weiß-Abgleich',
'Wide' => 'Weit',
'X' => 'X',
'X10' => 'X10',
@ -740,17 +740,17 @@ $SLANG = array(
'Yes' => 'Ja',
'YouNoPerms' => 'Keine Erlaubnis zum Zugang dieser Resource.',
'Zone' => 'Zone',
'ZoneAlarmColour' => 'Alarmfarbe (Rot/Grün/Blau)',
'ZoneAlarmColour' => 'Alarmfarbe (Rot/Grün/Blau)',
'ZoneArea' => 'Zone Area',
'ZoneExtendAlarmFrames' => 'Alarmstatus nach Ende für Frames aufrechterhalten',
'ZoneFilterSize' => 'Filter-Breite/-Höhe (Pixel)',
'ZoneMinMaxAlarmArea' => 'Min./max. Alarmfläche',
'ZoneMinMaxBlobArea' => 'Min./max. Blobfläche',
'ZoneExtendAlarmFrames' => 'Alarmstatus nach Ende für Frames aufrechterhalten',
'ZoneFilterSize' => 'Filter-Breite/-Höhe (Pixel)',
'ZoneMinMaxAlarmArea' => 'Min./max. Alarmfläche',
'ZoneMinMaxBlobArea' => 'Min./max. Blobfläche',
'ZoneMinMaxBlobs' => 'Min./max. Blobs',
'ZoneMinMaxFiltArea' => 'Min./max. Filterfläche',
'ZoneMinMaxFiltArea' => 'Min./max. Filterfläche',
'ZoneMinMaxPixelThres' => 'Min./max. Pixelschwellwert',
'ZoneMinderLog' => 'ZoneMinder Log', // Added - 2011-06-17
'ZoneOverloadFrames' => 'Bildauslassrate bei Systemüberlastung',
'ZoneOverloadFrames' => 'Bildauslassrate bei Systemüberlastung',
'Zones' => 'Zonen',
'Zoom' => 'Zoom',
'ZoomIn' => 'Hineinzoomen',
@ -903,4 +903,4 @@ $OLANG = array(
// ),
);
?>
?>

View File

@ -2,5 +2,6 @@ AUTOMAKE_OPTIONS = gnu
webdir = @WEB_PREFIX@/skins/classic/css
SUBDIRS = flat \
SUBDIRS = dark \
flat \
classic

View File

@ -242,6 +242,11 @@ ul.tabList li.active a {
font-size: 120%;
}
#content table > tbody > tr:hover
{
background-color: #EEE;
}
.overlay {
font-size: 11px;
}

View File

@ -0,0 +1,10 @@
AUTOMAKE_OPTIONS = gnu
webdir = @WEB_PREFIX@/skins/classic/css/dark
SUBDIRS = views
dist_web_DATA = \
skin.css \
control.css \
export.css

View File

@ -0,0 +1,147 @@
.ptzControls {
vertical-align: top;
margin: 10px auto 0;
width: 300px;
}
.ptzControls input.ptzTextBtn {
margin-top: 2px;
width: 40px;
}
.ptzControls .controlsPanel {
margin: 0 auto;
}
.ptzControls input[type=image] {
border: 0px;
}
.ptzControls .controlsPanel .arrowControl {
width: 40px;
height: 180px;
margin: 0 4px;
}
.ptzControls .controlsPanel .arrowControl input {
display: block;
}
.ptzControls .controlsPanel .longArrowBtn {
width: 32px;
height: 48px;
margin: 0 auto;
cursor: pointer;
}
/*
* This is a bit of a hack as these lines should be in the above
* section but that messes up layout on IE6
*/
/*
.ptzControls .controlsPanel > div > div.longArrowBtn {
left: 50%;
margin-left: -16px;
}
*/
.ptzControls .controlsPanel .upBtn {
background: url("../../graphics/arrow-l-u.gif") no-repeat 0 0;
}
.ptzControls .controlsPanel .downBtn {
background: url("../../graphics/arrow-l-d.gif") no-repeat 0 0;
}
.ptzControls .controlsPanel .focusControls {
float: left;
}
.ptzControls .controlsPanel .zoomControls {
float: left;
}
.ptzControls .controlsPanel .irisControls {
float: right;
}
.ptzControls .controlsPanel .whiteControls {
float: right;
}
.ptzControls .controlsPanel .pantiltPanel {
margin: 0 auto;
height: 180px;
}
.ptzControls .controlsPanel .pantiltPanel .pantiltControls .pantiltButtons {
margin: 5px auto;
border: 1px solid #006699;
text-align: center;
padding: 1px;
width: 96px;
height: 96px;
}
.ptzControls .controlsPanel .pantiltPanel .pantiltControls .arrowBtn {
width: 32px;
height: 32px;
cursor: pointer;
float: left;
}
.ptzControls .controlsPanel .pantiltPanel .pantiltControls .upLeftBtn {
background: url("../../graphics/arrow-ul.gif") no-repeat 0 0;
}
.ptzControls .controlsPanel .pantiltPanel .pantiltControls .upBtn {
background: url("../../graphics/arrow-u.gif") no-repeat 0 0;
}
.ptzControls .controlsPanel .pantiltPanel .pantiltControls .upRightBtn {
background: url("../../graphics/arrow-ur.gif") no-repeat 0 0;
}
.ptzControls .controlsPanel .pantiltPanel .pantiltControls .leftBtn {
background: url("../../graphics/arrow-l.gif") no-repeat 0 0;
}
.ptzControls .controlsPanel .pantiltPanel .pantiltControls .centerBtn {
background: url("../../graphics/center.gif") no-repeat 0 0;
}
.ptzControls .controlsPanel .pantiltPanel .pantiltControls .rightBtn {
background: url("../../graphics/arrow-r.gif") no-repeat 0 0;
}
.ptzControls .controlsPanel .pantiltPanel .pantiltControls .downLeftBtn {
background: url("../../graphics/arrow-dl.gif") no-repeat 0 0;
}
.ptzControls .controlsPanel .pantiltPanel .pantiltControls .downBtn {
background: url("../../graphics/arrow-d.gif") no-repeat 0 0;
}
.ptzControls .controlsPanel .pantiltPanel .pantiltControls .downRightBtn {
background: url("../../graphics/arrow-dr.gif") no-repeat 0 0;
}
.ptzControls .controlsPanel .pantiltPanel .powerControls {
margin: 0 auto;
}
.ptzControls .presetControls {
margin: 0 auto;
}
.ptzControls .presetControls input {
margin: 1px;
}
.ptzControls .presetControls input.ptzNumBtn {
padding: 1px 2px;
width: 24px;
color: #ffffff;
text-align: center;
background-color: #016A9D;
}

View File

@ -0,0 +1,54 @@
body {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size:10px;
font-weight: normal
color: #333333;
}
table {
border-collapse: collapse;
}
th, td {
border: 1px solid #7f7fb2;
text-align: center;
padding: 2px 4px;
}
a:link {
color: #7f7fb2;
text-decoration: none
}
a:visited {
color: #7f7fb2;
text-decoration: none
}
a:hover {
color: #666699;
text-decoration: underline
}
img.thumb {
width: 40px;
}
td.monoRow {
line-height: 200%;
text-align: center;
vertical-align: middle;
}
#eventFrames tr.alarm {
background-color: #fa8072;
}
#eventFrames tr.bulk {
background-color: #cccccc;
}
#eventFrames tr.normal {
background-color: #ffffff;
}

View File

@ -0,0 +1,453 @@
/*
* ZoneMinder Base Stylesheet, $Date$, $Revision$
* 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) input[type=password], 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/*
* Primary look and feel styles
*/
body {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 10px;
color: #dddddd;
background-color: #222222;
font-weight: normal;
text-align: center;
}
h1 {
font-family: inherit;
font-size: 120%;
color: #10a4e8;
font-weight: bold;
text-align: center;
}
h2 {
font-family: inherit;
font-size: 110%;
color: #10a4e8;
font-weight: bold;
}
h3 {
font-family: inherit;
font-size: 100%;
color: #117AAd;
font-weight: bold;
}
h4 {
font-family: inherit;
font-size: 100%;
color: #117AAd;
}
p {
font-family: inherit;
font-size: 100%;
color: #dddddd;
font-weight: normal;
}
th {
font-weight: bold;
color: #117AAd;
}
a:link {
color: #8f8fc2;
text-decoration: none;
}
a:visited {
color: #8f8fc2;
text-decoration: none;
}
a:hover {
color: #7777aa;
text-decoration: underline;
}
label {
margin-right: 4px;
}
input,textarea,select,button {
border: 1px #8f8fc2 solid;
font-family: inherit;
font-size: 100%;
color: #eeeeee;
background-color: #444444;
}
input[type=text], input[type=password], textarea {
padding: 1px;
}
input.noborder {
border: 0;
}
input[disabled] {
color: #777777;
}
img.normal {
border: #cccccc solid 1px;
}
img.alarm {
border: red solid 1px;
}
hr {
height: 1px;
width: 100%;
border: 0;
color: #8f8fc2;
background-color: #8f8fc2;
}
/*
* Tabbed headings
*/
ul.tabList {
float: left;
list-style: none;
padding: 0;
margin: 0 0 -4px 0;
white-space: nowrap;
text-align: left;
}
ul.tabList li {
float: left;
border: 1px solid;
color: #8f8fc2;
border: #8f8fc2 solid 1px;
border-bottom-width: 0;
margin: 0 2px 0 0;
background: #444444;
text-align: center;
padding: 3px 4px;
}
ul.tabList li a {
text-decoration: none;
}
ul.tabList li:hover {
background-color: #dddddd;
}
ul.tabList li.active {
background-color: #222222;
border-bottom: #8f8fc2 dotted 1px;
}
ul.tabList li.active a {
font-weight: bold;
}
/*
* Major league table for multiple inputs or presentation
*/
#content table.major {
margin: 4px auto;
width: 100%;
border-collapse: collapse;
}
#content table.major tr.highlight {
color: #eeeeee;
background-color: #000000;
}
#content table.major thead tr th {
padding-top: 6px;
padding-bottom: 6px;
vertical-align: middle;
}
#content table.major tfoot td {
padding-top: 6px;
padding-bottom: 6px;
vertical-align: middle;
}
#content table.major th, #content table.major td {
border: 1px solid #8f8fc2;
padding: 3px;
text-align: left;
}
#content table.major th {
vertical-align: bottom;
}
#content table.major td {
vertical-align: middle;
}
#content table.major th[scope=row] {
padding: 4px 3px 3px;
vertical-align: top;
}
#content table.major .colMark, #content table.major .colSelect {
text-align: center;
}
/*
* Lesser table for very simple forms
*/
#content table.minor {
width: 280px;
margin: 0 auto;
}
#content table.minor td {
padding: 4px;
}
#content table.minor .colLeft {
width: 50%;
text-align: right;
}
#content table.minor .colRight {
width: 50%;
text-align: left;
}
#content table.minor input[type=submit]
{
margin-top: 8px;
padding: 0 2px;
font-size: 120%;
}
#content table > tbody > tr:hover
{
background-color: #333333;
}
.overlay {
font-size: 11px;
background-color: #222222;
}
.overlay .overlayHeader {
color: #eeeeee;
background-color: #070707;
}
.overlay fieldset {
background-color: #222222;
}
.validation-advice {
padding: 4px;
color: #dc143c;
}
fieldset {
border: 1px solid #dddddd;
padding: 4px;
margin-bottom: 8px;
border-radius: 2px;
-moz-border-radius: 2px;
-webkit-border-radius: 2px;
}
fieldset > legend {
padding: 0 2px;
}
/*
* Behavior classes
*/
.alarm, .errorText {
color: #dc143c;
}
.alert, .warnText {
color: #ff8c00;
}
.ok, .infoText {
color: #77a328;
}
.fakelink {
color: #8f8fc2;
cursor: pointer;
}
.fakelink:hover {
color: #336699;
text-decoration: none;
}
/*
* Generic useful classes, especially with mootools
*/
.hidden {
display: none;
}
.invisible {
visibility: hidden;
}
.nowrap {
white-space: nowrap;
}
div.clear {
clear: both;
}
/*
.table-th-sort {
font-style:italic;
}
td.table-td-sort {
font-style:italic;
}
*/
th.table-th-sort {
margin-right: 12px;
}
th.table-th-sort span.table-th-sort-span {
float: right;
width: 12px;
height: 12px;
background: url("../graphics/arrow-s-u.gif") no-repeat 0 0;
}
th.table-th-sort-rev span.table-th-sort-span {
float: right;
width: 12px;
height: 12px;
background: url("../graphics/arrow-s-d.gif") no-repeat 0 0;
}
.table-tr-odd {
background-color: #070707;
}
/*
* Primary layout styles
*/
#page {
width: 100%;
}
#header {
width: 96%;
line-height: 24px;
margin: 8px auto;
text-align: left;
}
#header h2 {
left: 0;
}
#header h2.floating {
float: left;
}
#headerControl {
width: 50%;
text-align: center;
margin: 0 auto;
}
#headerButtons {
float: right;
}
#headerButtons a {
margin-left: 8px;
}
#headerButtons input {
margin-left: 4px;
}
#content {
width: 96%;
margin: 8px auto;
line-height: 130%;
text-align: center;
}
#content p {
margin-top: 4px;
}
#content p.textblock {
text-align: justify;
padding: 4px;
}
#content p.textblock br {
margin-bottom: 8px;
}
/*
#contentDiv {
margin: 0 auto 8px;
line-height: 140%;
text-align: center;
}
*/
#content > input[type=submit], #content > input[type=button], #content > button {
margin-top: 8px;
}
#content table input[type=submit], #content table input[type=button], #content table button {
margin-top: 0;
}
#contentButtons {
margin-top: 8px;
float: right;
}
#contentButtons input {
margin-left: 8px;
margin-bottom: 4px;
}
#footer {
width: 96%;
margin: 8px auto;
}

View File

@ -0,0 +1,31 @@
AUTOMAKE_OPTIONS = gnu
webdir = @WEB_PREFIX@/skins/classic/css/dark/views
dist_web_DATA = \
console.css \
controlcaps.css \
control.css \
devices.css \
event.css \
events.css \
export.css \
filter.css \
frame.css \
frames.css \
groups.css \
log.css \
monitor.css \
montage_2wide.css \
montage_3wide50enlarge.css \
montage_3wide.css \
montage_4wide.css \
montage.css \
montage_freeform.css \
options.css \
stats.css \
timeline.css \
timeline.css.php \
video.css \
watch.css \
zone.css

View File

@ -0,0 +1,97 @@
#systemTime {
float: left;
}
#title {
margin: 0 auto;
text-align: center;
width: 50%;
}
#systemStats {
float: right;
}
#monitorSummary {
float: left;
text-align: left;
width: 20%;
}
#devices {
float: left;
}
#loginBandwidth {
margin: 0 auto;
text-align: center;
width: 40%;
}
#cycleMontage {
float: right;
}
#options {
float: right;
text-align: right;
width: 20%;
}
#consoleTable {
width: 100%;
}
#consoleTable tr.highlight {
background-color: #111111;
}
#consoleTable thead th {
padding-bottom: 4px;
vertical-align: middle;
}
#consoleTable tfoot td {
padding-top: 4px;
vertical-align: middle;
}
#consoleTable th,td {
height: 16px;
text-align: left;
}
#consoleTable .colOrder {
text-align: center;
}
#consoleTable .colMark {
width: 32px;
text-align: center;
}
#consoleTable .colEvents {
text-align: right;
}
#consoleTable .colZones {
text-align: right;
}
#consoleTable .colLeftButtons {
text-align: left;
}
#consoleTable .colLeftButtons input {
margin-right: 24px;
}
#consoleTable .colRightButtons {
text-align: right;
padding-right: 8px;
}
#consoleTable .colRightButtons input {
margin: 0 8px;
}

View File

@ -0,0 +1 @@
@import url(../control.css);

View File

@ -0,0 +1,3 @@
#content table.major .colCanMove, #content table.major .colCanZoom, #content table.major .colCanFocus, #content table.major .colCanIris, #content table.major .colCanWhiteBal, #content table.major .colHasPresets {
text-align: center;
}

View File

@ -0,0 +1,4 @@
input.set {
border: 1px #7F7FB2 dashed;
}

View File

@ -0,0 +1,232 @@
#dataBar {
width: 100%;
margin: 2px auto;
text-align: center;
}
#dataBar #dataTable {
width: 100%;
}
#dataBar #dataTable td {
text-align: center;
padding: 2px;
}
#menuBar1 {
width: 100%;
height: 1.5em;
padding: 3px 0;
text-align: center;
clear: both;
}
#menuBar1 #nameControl {
float: left;
}
#menuBar1 #nameControl #eventName {
margin-right: 4px;
}
#menuBar1 #replayControl {
float: right;
margin-left: 8px;
}
#menuBar1 #scaleControl {
float: right;
margin-left: 8px;
}
#menuBar2 {
width: 100%;
height: 1.2em;
padding: 3px 0;
margin-bottom: 4px;
}
#menuBar2 div {
text-align: left;
float: left;
padding: 0 12px;
}
#menuBar2 #closeWindow {
float: right;
text-align: right;
}
#imageFeed {
text-align: center;
}
#monitorStatus {
width: 100%;
margin-top: 3px;
margin-bottom: 2px;
text-align: center;
}
#monitorStatus #enableAlarms {
position: absolute;
left: 4px;
}
#monitorStatus #forceAlarm {
position: absolute;
right: 4px;
}
#monitorStatus #monitorState {
}
#dvrControls {
margin-top: 3px;
margin-bottom: 2px;
text-align: center;
}
#dvrControls input {
height: 20px;
width: 28px;
padding-bottom: 3px;
margin: 0 3px;
}
#dvrControls input[disabled=disabled] {
color: #aaaaaa;
}
#dvrControls input.active {
border: 1px solid blue;
}
#dvrControls input.inactive {
border: 1px solid green;
}
#dvrControls input.unavail {
border: 1px solid red;
}
#replayStatus {
margin: 3px 0 2px;
text-align: center;
clear: both;
}
#replayStatus > span {
padding: 0 4px;
}
#progressBar {
position: relative;
border: 1px solid #666666;
height: 15px;
margin: 0 auto;
}
#progressBar .progressBox {
position: absolute;
top: 0px;
left: 0px;
height: 15px;
background: #eeeeee;
border-left: 1px solid #999999;
}
#progressBar .complete {
background: #aaaaaa;
}
#eventStills {
width: 100%;
position: relative;
}
#eventThumbsPanel {
position: relative;
width: 100%;
margin: 4px auto;
z-index: 1;
}
#eventThumbs {
margin: 0 auto;
width: 100%;
overflow: hidden;
height: 300px;
}
#eventThumbs img {
height: 25px; /* HACK - Although this is pixels it will be interpreted as a scale %ge, so 25px = 25% scaling for thumbnails */
margin: 2px;
background-color: #dddddd;
}
#eventThumbs img.placeholder {
/* width: 100px; */
}
#eventThumbs img.selected {
}
#eventImagePanel {
position: absolute;
z-index: 10;
}
#eventImageFrame {
border: 2px solid gray;
background-color: white;
padding: 4px;
}
#eventImage {
}
#eventImageBar {
margin-top: 2px;
}
#eventImageStats {
float: left;
}
#eventImageData {
margin: 0 auto;
padding-top: 2px;
}
#eventImageClose {
float: right;
}
#eventImageNav {
position: relative;
}
#eventImageNav input {
width: 32px;
font-size: 16px;
}
#thumbsSliderPanel {
width: 400px;
margin: 4px auto 0;
background: #888888;
padding: 1px;
}
#thumbsSlider {
width: 400px;
height: 10px;
background: #dddddd;
}
#thumbsKnob {
width: 8px;
height: 10px;
background-color: #444444;
}

View File

@ -0,0 +1,42 @@
#controls {
height: 16px;
width: 100%;
text-align: center;
margin: 0 auto;
position: relative;
}
#controls a {
width: 32%;
}
#controls #refreshLink {
position: absolute;
left: 0%;
text-align: left;
}
#controls #filterLink {
position: absolute;
left: 34%;
text-align: center;
}
#controls #timelineLink {
position: absolute;
left: 68%;
text-align: right;
}
#contentTable.major .colTime {
white-space: nowrap;
}
#contentTable.major .colId, #contentTable.major .colDuration, #contentTable.major .colFrames, #contentTable.major .colAlarmFrames, #contentTable.major .colTotScore, #contentTable.major .colMaxScore, #contentTable.major .colAvgScore {
text-align: center;
}
#contentTable.major td.colDuration {
text-align: right;
padding-right: 8px;
}

View File

@ -0,0 +1,15 @@
#contentTable + input {
margin-top: 6px;
}
#contentTable th, #contentTable td {
white-space: nowrap;
}
#exportProgress {
margin: 8px auto 4px;
}
#downloadLink {
margin-top: 8px;
}

View File

@ -0,0 +1,25 @@
#filterSelector {
}
table.filterTable {
width: 100%;
}
#fieldsTable td {
height: 16px;
}
#fieldsTable input[type=button] {
width: 1.6em;
margin-left: 2px;
text-align: center;
}
#sortTable input[type=text] {
margin-right: 4px;
}
#actionsTable input[type=text] {
margin-left: 4px;
}

View File

@ -0,0 +1,30 @@
#controls {
width: 80%;
text-align: center;
margin: 0 auto;
}
#controls a {
width: 40px;
margin-left: -20px;
}
#firstLink {
position: absolute;
left: 13%;
}
#prevLink {
position: absolute;
left: 37%;
}
#nextLink {
position: absolute;
left: 63%;
}
#lastLink {
position: absolute;
left: 87%;
}

View File

@ -0,0 +1,15 @@
#contentTable.major .colId, #contentTable.major .colType, #contentTable.major .colTimeStamp, #contentTable.major .colTimeDelta, #contentTable.major .colScore {
text-align: center;
}
tr.alarm {
background-color: #fa8072;
}
tr.bulk {
background-color: #cccccc;
}
tr.normal {
background-color: #ffffff;
}

View File

@ -0,0 +1,6 @@
#contentTable .colSelect {
text-align: center;
}
#contentTable .colSelect input {
}

View File

@ -0,0 +1,56 @@
#logSummary {
margin: 4px auto 0;
border-collapse: collapse;
}
#logSummary tr {
margin: 0;
padding: 0;
}
#logSummary td {
border: 1px solid #8f8fc2;
padding: 0 6px;
text-align: center;
font-size: 10px;
line-height: 15px;
}
tr.log-fat td {
color: #222222;
background-color:#ffcccc;
font-weight: bold;
}
tr.log-err td {
color: #222222;
background-color:#ffcccc;
}
tr.log-war td {
color: #222222;
background-color: #ffe4b5;
}
tr.log-dbg td {
color: #666666;
font-style: italic;
}
#exportLog label {
vertical-align: middle;
}
#exportLog input[type=radio] {
margin-right: 4px;
vertical-align: middle;
}
#exportError {
display: none;
color: #dc143c;
margin-bottom: 8px;
}
#exportErrorText {
}

View File

@ -0,0 +1,5 @@
.swatch {
border: 1px solid black;
margin-left: 3px;
padding: 0px;
}

View File

@ -0,0 +1,41 @@
#header {
width: 99%;
}
#layout {
margin-right: 10px;
}
#content {
width: 99%;
}
#monitors .alarm {
color: #ff0000;
}
#monitors .alert {
color: #ffa500;
}
#monitors .imageFeed {
text-align: center;
vertical-align: middle;
}
#monitors .imageFeed img.idle {
border: 2px solid #999999;
}
#monitors .imageFeed img.alarm {
border: 2px solid #ff0000;
}
#monitors .imageFeed img.alert {
border: 2px solid #ffa500;
}
#monitors .monitorState {
margin: 2px auto;
text-align: center;
}

View File

@ -0,0 +1,30 @@
#monitors {
width: 100%;
margin: 0 auto;
text-align: center;
}
#monitors .monitorFrame {
padding: 1px;
float: left;
}
#monitors .monitor {
}
#monitorFrame0, #monitorFrame2, #monitorFrame4, #monitorFrame6, #monitorFrame8, #monitorFrame10, #monitorFrame12, #monitorFrame14 {
width: 49%;
clear: both;
}
#monitor0, #monitor2, #monitor4, #monitor6, #monitor8, #monitor10, #monitor12, #monitor14 {
float: right;
}
#monitorFrame1, #monitorFrame3, #monitorFrame5, #monitorFrame7, #monitorFrame9, #monitorFrame11, #monitorFrame13, #monitorFrame15 {
width: 49%;
}
#monitor1, #monitor3, #monitor5, #monitor7, #monitor9, #monitor11, #monitor13, #monitor15 {
float: left;
}

View File

@ -0,0 +1,37 @@
#monitors {
width: 100%;
margin: 0 auto;
text-align: center;
}
#monitors .monitorFrame {
padding: 1px;
float: left;
width: 33%;
}
#monitors .monitor {
text-align: center;
}
#monitorFrame0, #monitorFrame3, #monitorFrame6, #monitorFrame9, #monitorFrame12, #monitorFrame15 {
clear: both;
}
#monitor0, #monitor3, #monitor6, #monitor9, #monitor12, #monitor15 {
float: right;
}
#monitorFrame1, #monitorFrame4, #monitorFrame7, #monitorFrame10, #monitorFrame13, #monitorFrame16 {
text-align: center;
}
#monitor1, #monitor4, #monitor7, #monitor10, #monitor13, #monitor16 {
}
#monitorFrame2, #monitorFrame5, #monitorFrame8, #monitorFrame11, #monitorFrame14, #monitorFrame17 {
}
#monitor2, #monitor5, #monitor8, #monitor11, #monitor14, #monitor17 {
float: left;
}

View File

@ -0,0 +1,74 @@
#monitors {
width: 100%;
margin: 0 auto;
text-align: center;
}
#monitors .monitorFrame {
float: left;
padding: 1px;
}
#monitors .monitor {
text-align: center;
}
#monitorFrame0, #monitorFrame3, #monitorFrame6, #monitorFrame9, #monitorFrame12, #monitorFrame15 {
width: 32%;
text-align: right;
clear: both;
}
#monitor0, #monitor3, #monitor6, #monitor9, #monitor12, #monitor15 {
margin-left: auto;
margin-right: 0;
}
#monitorFrame1, #monitorFrame4, #monitorFrame7, #monitorFrame10, #monitorFrame13, #monitorFrame16 {
width: 32%;
text-align: center;
}
#monitor1, #monitor4, #monitor7, #monitor10, #monitor13, #monitor16 {
margin-left: auto;
margin-right: auto;
}
#monitorFrame2, #monitorFrame5, #monitorFrame8, #monitorFrame11, #monitorFrame14, #monitorFrame17 {
width: 32%;
text-align: left;
}
#monitor2, #monitor5, #monitor8, #monitor11, #monitor14, #monitor17 {
margin-left: 0;
margin-right: auto;
}
#monitors .imageFeed img {
width: 100%;
height: 100%;
}
#monitors .monitorFrame > div.alarm, #monitors .monitorFrame > div.alert {
position: absolute;
width: 96%;
left: 2%;
top: 72px;
}
#monitors .monitorFrame > div.alert {
z-index: 100;
}
#monitors .monitorFrame > div.alarm {
z-index: 200;
}
#monitors .monitorFrame div.alarm, #monitors .monitorFrame div.alert {
font-size: 140%;
line-height: 160%;
}
#monitors .monitorFrame div.monitorState {
text-align: center;
}

View File

@ -0,0 +1,44 @@
#monitors {
width: 100%;
margin: 0 auto;
text-align: center;
}
#monitors .monitorFrame {
padding: 1px;
float: left;
width: 24.5%;
}
#monitors .monitor {
text-align: center;
}
#monitorFrame0, #monitorFrame4, #monitorFrame8, #monitorFrame12, #monitorFrame16, #monitorFrame20 {
clear: both;
}
#monitor0, #monitor4, #monitor8, #monitor12, #monitor16, #monitor20 {
float: right;
}
#monitorFrame1, #monitorFrame5, #monitorFrame9, #monitorFrame13, #monitorFrame17, #monitorFrame21 {
text-align: center;
}
#monitor1, #monitor5, #monitor9, #monitor13, #monitor17, #monitor21 {
}
#monitorFrame2, #monitorFrame6, #monitorFrame10, #monitorFrame14, #monitorFrame18, #monitorFrame22 {
text-align: center;
}
#monitor2, #monitor6, #monitor10, #monitor14, #monitor18, #monitor22 {
}
#monitorFrame3, #monitorFrame7, #monitorFrame11, #monitorFrame15, #monitorFrame19, #monitorFrame23 {
}
#monitor3, #monitor7, #monitor11, #monitor15, #monitor19, #monitor23 {
float: left;
}

View File

@ -0,0 +1,9 @@
#monitors {
margin: 0 auto;
text-align: center;
}
#monitors .monitorFrame {
float: left;
padding: 1px;
}

View File

@ -0,0 +1,24 @@
input.small {
width: 6em;
}
input.medium {
width: 9em;
}
input.large {
width: 20em;
}
#contentTable.optionTable th, #contentTable.optionTable td {
vertical-align: top;
}
#contentTable.userTable th, #contentTable.userTable td {
text-align: center;
}
#contentTable.userTable .colMonitor, #contentTable.userTable .colUsername {
text-align: left;
}

View File

@ -0,0 +1,20 @@
#settingsPanel {
float: left;
margin: 0 2px;
}
#pluginSettings {
border-collapse: collapse;
}
#pluginSettings th, #pluginSettings td {
border: 1px solid #7f7fb2;
padding: 3px;
text-align: left;
}
#pluginSettings th[scope=row] {
padding: 4px 3px 3px;
vertical-align: top;
white-space: nowrap;
}

View File

@ -0,0 +1,9 @@
#contentTable.major .colZone, #contentTable.major .colPixelDiff, #contentTable.major .colAlarmPx, #contentTable.major .colFilterPx, #contentTable.major .colBlobPx, #contentTable.major .colBlobs, #contentTable.major .colBlobSizes, #contentTable.major .colAlarmLimits, #contentTable.major .colScore {
text-align: center;
}
#contentTable.major .rowNoStats {
text-align: center;
padding: 20px;
}

View File

@ -0,0 +1,222 @@
#content {
position: relative;
text-align: center;
border: 1px solid #666666;
margin: 0 auto;
}
#title {
position: relative;
margin: 0 auto;
color: #016A9D;
height: 30px;
font-size: 13px;
font-weight: bold;
line-height: 20px;
}
#listLink {
position: absolute;
top: 5px;
left: 20px;
height: 15px;
}
#closeLink {
position: absolute;
top: 5px;
right: 20px;
height: 15px;
}
#topPanel {
position: relative;
height: 220px;
margin: 4px auto 6px;
}
#topPanel #imagePanel
{
width: 50%;
float: left;
text-align: right;
}
#topPanel #image {
float: right;
margin: 0 auto;
width: 90%;
text-align: right;
margin-right: 2px;
background-color: #222222;
border: 1px solid #cccccc;
}
#topPanel #image img {
float: left;
top: 0px;
background-color: #222222;
width: 100%;
}
#topPanel #dataPanel {
width: 45%;
float: left;
text-align: left;
margin-left: 2px;
}
#topPanel #textPanel {
text-align: left;
width: 100%;
height: 140px;
margin: 0 auto;
color: #dddddd;
font-size: 11px;
font-weight: bold;
line-height: 14px;
background-color: #222222;
border: 1px solid #cccccc;
padding: 2px;
}
#topPanel #navPanel {
width: 100%;
height: 70px;
margin: 4px auto;
}
#topPanel #navPanel input {
background-color: #111111;
border: 1px solid #cccccc;
padding: 5px;
}
#chartPanel {
position: relative;
margin: 0 auto;
}
#chartPanel #chart {
position: relative;
border: 1px solid black;
margin: 0 auto;
z-index: 0;
}
#chartPanel #activity {
position: absolute;
text-align: center;
left: 0px;
border-bottom: 1px solid #cccccc;
}
#chartPanel #activity div.activity {
position: absolute;
bottom: 0px;
z-index: 3;
width: 1px;
}
#chartPanel .events {
position: absolute;
text-align: center;
left: 0px;
background-color: #fcfcfc;
border-bottom: 1px solid black;
}
#chartPanel .event {
position: absolute;
bottom: 0px;
z-index: 3;
}
#chartLabels {
margin: 25px auto 0;
text-align: center;
}
#range {
width: 30%;
margin: 0 auto;
color: #016A9D;
font-size: 11px;
font-weight: bold;
line-height: 20px;
}
#key {
float: right;
margin-top: -4px;
text-align: right;
}
span.keyEntry {
}
img.keyBox {
position: relative;
border: 1px solid black;
width: 16px;
height: 16px;
top: 4px;
margin-left: 4px;
}
div.majGridX {
position: absolute;
z-index: 1;
top: 0px;
width: 1px;
border-left: dotted 1px #cccccc;
}
div.majTickX {
position: absolute;
bottom: -7px;
width: 1px;
height: 7px;
border-left: solid 1px black;
}
div.majLabelX {
position: absolute;
text-align: center;
bottom: -20px;
width: 50px;
font-size: 9px;
font-weight: normal;
}
div.majGridY {
position: absolute;
z-index: 1;
left: 0px;
height: 1px;
border-top: dotted 1px #cccccc;
}
div.majTickY {
position: absolute;
left: -7px;
height: 1px;
width: 7px;
border-top: solid 1px black;
}
div.majLabelY {
position: absolute;
text-align: right;
left: -30px;
width: 20px;
font-size: 9px;
font-weight: normal;
}
div.zoom {
position: absolute;
z-index: 2;
bottom: 0px;
}

View File

@ -0,0 +1,77 @@
.chartSize {
width: <?php echo $chart['width'] ?>px;
height: <?php echo $chart['height'] ?>px;
}
.graphSize {
width: <?php echo $chart['graph']['width'] ?>px;
height: <?php echo $chart['graph']['height'] ?>px;
}
.graphHeight {
height: <?php echo $chart['graph']['height'] ?>px;
}
.graphWidth {
width: <?php echo $chart['graph']['width'] ?>px;
}
.imageSize {
width: <?php echo $chart['image']['width'] ?>px;
height: <?php echo $chart['image']['height'] ?>px;
}
.imageHeight {
height: <?php echo $chart['image']['height'] ?>px;
}
.activitySize {
width: <?php echo $chart['graph']['width'] ?>px;
height: <?php echo $chart['graph']['activityHeight'] ?>px;
}
.eventsSize {
width: <?php echo $chart['graph']['width'] ?>px;
height: <?php echo $chart['graph']['eventBarHeight'] ?>px;
}
.eventsHeight {
height: <?php echo $chart['graph']['eventBarHeight'] ?>px;
}
<?php
if ( $mode == "overlay" )
{
foreach ( array_keys($monitorIds) as $monitorId )
{
?>
#chartPanel .eventsPos<?php echo $monitorId ?> {
top: <?php echo $chart['eventBars'][$monitorId]['top'] ?>px;
}
<?php
}
}
elseif ( $mode == "split" )
{
foreach ( array_keys($monitorIds) as $monitorId )
{
?>
#chartPanel .activityPos<?php echo $monitorId ?> {
top: <?php echo $char['activityBars'][$monitorId]['top'] ?>px;
}
#chartPanel .eventsPos<?php echo $monitorId ?> {
top: <?php echo $char['eventBars'][$monitorId]['top'] ?>px;
}
<?php
}
}
foreach( array_keys($monEventSlots) as $monitorId )
{
?>
.monitorColour<?php echo $monitorId ?> {
background-color: <?php echo $monitors[$monitorId]['WebColour'] ?>;
}
<?php
}
?>

View File

@ -0,0 +1,19 @@
#contentTable + input {
margin-top: 6px;
}
#videoProgress {
margin: 8px auto 4px;
}
#videoFilesHeader {
margin: 8px auto 4px;
}
#videoNoFiles {
margin: 4px auto;
}
#videoFile {
margin-bottom: 6px;
}

View File

@ -0,0 +1,134 @@
@import url(../control.css);
#menuBar {
margin: 6px auto 4px;
text-align: center;
}
#menuBar #monitorName {
float: left;
}
#menuBar #closeControl {
float: right;
}
#menuBar #menuControls {
margin: 0 auto;
width: 60%;
}
#menuBar #menuControls #controlControl {
float: left;
}
#menuBar #menuControls #eventsControl {
float: left;
}
#menuBar #menuControls #settingsControl {
float: right;
}
#menuBar #menuControls #scaleControl {
margin: 0 auto;
}
#imageFeed{
text-align: center;
}
#monitorStatus {
margin: 4px auto;
text-align: center;
}
#monitorStatus #enableDisableAlarms {
float: left;
}
#monitorStatus #forceCancelAlarm {
float: right;
}
#monitorStatus #monitorState {
}
#dvrControls {
margin-top: 3px;
margin-bottom: 2px;
text-align: center;
}
#dvrControls input {
height: 20px;
width: 28px;
padding-bottom: 3px;
margin: 0 3px;
}
#dvrControls input[disabled] {
color: #aaaaaa;
}
#dvrControls input.active {
border: 1px solid blue;
}
#dvrControls input.inactive {
border: 1px solid green;
}
#dvrControls input.unavail {
border: 1px solid red;
}
#replayStatus {
margin: 3px 0 2px;
text-align: center;
clear: both;
}
#replayStatus > span {
padding: 0 4px;
}
#events {
margin: 0 auto;
}
#eventList {
width: 100%;
}
#eventList thead td {
font-weight: bold;
}
#eventList th, #eventList td {
text-align: center;
}
li {
display: inline;
list-style-type: none;
}
span.alarm {
color: #DC143C;
font-weight: bold;
}
span.alert {
color: #FF8C00;
font-weight: bold;
}
#eventList tr.recent {
background-color: #B0E0E6;
}
#eventList tr.highlight {
background-color: #DCDCDC;
}

View File

@ -0,0 +1,95 @@
#settingsPanel {
float: left;
margin: 0 2px;
}
#zoneSettings {
border-collapse: collapse;
}
#zoneSettings th, #zoneSettings td {
border: 1px solid #7f7fb2;
padding: 3px;
text-align: left;
}
#zoneSettings th[scope=row] {
padding: 4px 3px 3px;
vertical-align: top;
white-space: nowrap;
}
#definitionPanel {
float: left;
margin: 0 2px;
text-align: center;
}
#definitionPanel input[type=submit], #definitionPanel input[type=submit] {
margin: 0 4px;
}
#imagePanel {
position: relative;
}
/* NB: The size of the imageFrame determines the area within which the markers
* may be moved. When adjusting the padding and margins of the imageFrame and
* the DIVs within it, test that the markers behave sensibly when dragged to
* the extreme edges of the imageFrame. */
#imageFrame {
position: relative;
padding: 0 3px 3px 0; /* Compensate for negative margins in the markers just below. */
}
#imageFrame div {
position: absolute;
width: 7px;
height: 7px;
margin-left: -3px;
margin-top: -3px;
z-index: 5;
}
#imageFrame div {
background-image: url(../../../graphics/point-g.gif);
}
#imageFrame div.highlight {
background-image: url(../../../graphics/point-o.gif);
}
#imageFrame div.active {
background-image: url(../../../graphics/point-r.gif);
}
#zonePoints {
margin: 8px 0;
border-collapse: collapse;
}
#zonePoints td {
vertical-align: top;
}
#zonePoints table {
border-collapse: collapse;
}
#zonePoints table tr.highlight {
background-color: #f0e68c;
}
#zonePoints table tr.active {
background-color: #ffa07a;
}
#zonePoints table th, #zonePoints table td {
border: 1px solid #7f7fb2;
padding: 3px;
text-align: center;
}
#zonePoints table a {
margin: 0 2px;
}

View File

@ -5,5 +5,6 @@ webdir = @WEB_PREFIX@/skins/classic/js
dist_web_DATA = \
skin.js \
classic.js \
dark.js \
flat.js \
skin.js.php

View File

@ -0,0 +1,71 @@
//
// ZoneMinder base static javascript file, $Date$, $Revision$
// 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
//
//
// This file should only contain static JavaScript and no php.
// Use skin.js.php for JavaScript that need pre-processing
//
// Javascript window sizes
var popupSizes = {
'bandwidth': { 'width': 300, 'height': 120 },
'console': { 'width': 750, 'height': 312 },
'control': { 'width': 380, 'height': 480 },
'controlcaps': { 'width': 780, 'height': 320 },
'controlcap': { 'width': 400, 'height': 400 },
'cycle': { 'addWidth': 32, 'minWidth': 384, 'addHeight': 62 },
'device': { 'width': 260, 'height': 150 },
'devices': { 'width': 400, 'height': 240 },
'donate': { 'width': 500, 'height': 280 },
'event': { 'addWidth': 108, 'minWidth': 496, 'addHeight': 230, minHeight: 540 },
'eventdetail': { 'width': 600, 'height': 220 },
'events': { 'width': 960, 'height': 780 },
'export': { 'width': 400, 'height': 340 },
'filter': { 'width': 720, 'height': 360 },
'filtersave': { 'width': 610, 'height': 120 },
'frame': { 'addWidth': 32, 'minWidth': 384, 'addHeight': 100 },
'frames': { 'width': 500, 'height': 600 },
'function': { 'width': 300, 'height': 92 },
'group': { 'width': 360, 'height': 180 },
'groups': { 'width': 440, 'height': 220 },
'image': { 'addWidth': 48, 'addHeight': 80 },
'log': { 'width': 1080, 'height': 720 },
'login': { 'width': 720, 'height': 480 },
'logout': { 'width': 260, 'height': 100 },
'monitor': { 'width': 450, 'height': 440 },
'monitorpreset':{ 'width': 440, 'height': 200 },
'monitorprobe': { 'width': 500, 'height': 240 },
'monitorselect':{ 'width': 160, 'height': 200 },
'montage': { 'width': -1, 'height': -1 },
'onvifprobe': { 'width': 500, 'height': 300 },
'optionhelp': { 'width': 400, 'height': 320 },
'options': { 'width': 1000, 'height': 660 },
'preset': { 'width': 300, 'height': 120 },
'settings': { 'width': 220, 'height': 225 },
'state': { 'width': 370, 'height': 134 },
'stats': { 'width': 840, 'height': 200 },
'timeline': { 'width': 760, 'height': 540 },
'user': { 'width': 360, 'height': 420 },
'version': { 'width': 360, 'height': 140 },
'video': { 'width': 420, 'height': 360 },
'videoview': { 'addWidth': 48, 'addHeight': 80 },
'watch': { 'addWidth': 96, 'minWidth': 420, 'addHeight': 384 },
'zone': { 'addWidth': 450, 'addHeight': 200, 'minHeight': 450 },
'zones': { 'addWidth': 72, 'addHeight': 232 }
};

View File

@ -70,8 +70,7 @@ $eventCounts = array(
$running = daemonCheck();
$status = $running?translate('Running'):translate('Stopped');
$run_state_array = dbFetchOne('select Name from States where IsActive = 1');
$run_state = implode($run_state_array);
$run_state = dbFetchOne('select Name from States where IsActive = 1', 'Name' );
$group = NULL;
if ( ! empty($_COOKIE['zmGroup']) ) {
@ -311,9 +310,7 @@ foreach( $displayMonitors as $monitor )
<td class="colSource"><?php echo makePopupLink( '?view=monitor&amp;mid='.$monitor['Id'], 'zmMonitor'.$monitor['Id'], 'monitor', '<span class="'.$dclass.'">'.preg_replace( '/^.*@/', '', $monitor['Host'] ).'</span>', canEdit( 'Monitors' ) ) ?></td>
<?php } elseif ( $monitor['Type'] == "File" ) { ?>
<td class="colSource"><?php echo makePopupLink( '?view=monitor&amp;mid='.$monitor['Id'], 'zmMonitor'.$monitor['Id'], 'monitor', '<span class="'.$dclass.'">'.preg_replace( '/^.*\//', '', $monitor['Path'] ).'</span>', canEdit( 'Monitors' ) ) ?></td>
<?php } elseif ( $monitor['Type'] == "Ffmpeg" ) { ?>
<td class="colSource"><?php echo makePopupLink( '?view=monitor&amp;mid='.$monitor['Id'], 'zmMonitor'.$monitor['Id'], 'monitor', '<span class="'.$dclass.'">'.preg_replace( '/^.*\//', '', $monitor['Path'] ).'</span>', canEdit( 'Monitors' ) ) ?></td>
<?php } elseif ( $monitor['Type'] == "Libvlc" ) {
<?php } elseif ( $monitor['Type'] == "Ffmpeg" || $monitor['Type'] == "Libvlc" ) {
$domain = parse_url( $monitor['Path'], PHP_URL_HOST );
$shortpath = $domain ? $domain : preg_replace( '/^.*\//', '', $monitor['Path'] );
if ( $shortpath == '' ) {

View File

@ -81,7 +81,10 @@ function logResponse( respObj )
row.tr.addClass( 'log-dbg' );
if ( !firstLoad )
{
new Fx.Tween( row.tr, { duration: 10000, transition: Fx.Transitions.Sine } ).start( 'color', '#6495ED', '#000000' );
var color = document.defaultView.getComputedStyle(row.tr,null).getPropertyValue('color');
var colorParts = color.match(/^rgb.*\((\d+),\s*(\d+),\s*(\d+)/);
rowOrigColor = '#' + parseInt(colorParts[1]).toString(16) + parseInt(colorParts[2]).toString(16) + parseInt(colorParts[3]).toString(16);
new Fx.Tween( row.tr, { duration: 10000, transition: Fx.Transitions.Sine } ).start( 'color', '#6495ED', rowOrigColor );
}
}
);

View File

@ -40,10 +40,11 @@ if ( isset($_REQUEST['tab']) )
else
$tab = "general";
if ( defined( ZM_SERVER_ID ) ) {
if ( defined( 'ZM_SERVER_ID' ) ) {
$Server = dbFetchOne( 'SELECT * FROM Servers WHERE Id=?', NULL, array( ZM_SERVER_ID ) );
} else {
$Server = array();
}
if ( ! $Server ) {
$Server = array( 'Id' => '' );
}
if ( ! empty($_REQUEST['mid']) ) {

View File

@ -18,6 +18,20 @@
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
//
// Calling sequence: ... /zm/index.php?view=image&path=/monid/path/image.jpg&scale=nnn&width=wwww&height=hhhhh
//
// Path is physical path to the image starting at the monitor id
//
// Scale is optional and between 1 and 400 (percent),
// Omitted or 100 = no scaling done, image passed through directly
// Scaling will increase response time slightly
//
// width and height are each optional, ideally supply both, but if only one is supplied the other is calculated
// These are in pixels
//
// If both scale and either width or height are specified, scale is ignored
//
if ( !canView( 'Events' ) )
{
$view = "error";
@ -51,52 +65,67 @@ else
}
}
if ( true )
{
// Simple version
if ( $errorText )
Error( $errorText );
else
readfile( ZM_DIR_EVENTS.'/'.$path );
}
$scale=0;
if( !empty($_REQUEST['scale']) )
if (is_numeric($_REQUEST['scale']))
{
$x = $_REQUEST['scale'];
if($x >= 1 and $x <= 400)
$scale=$x;
}
$width=0;
if( !empty($_REQUEST['width']) )
if (is_numeric($_REQUEST['width']))
{
$x = $_REQUEST['width'];
if($x >= 10 and $x <= 8000)
$width=$x;
}
$height=0;
if( !empty($_REQUEST['height']) )
if (is_numeric($_REQUEST['height']))
{
$x = $_REQUEST['height'];
if($x >= 10 and $x <= 8000)
$height=$x;
}
if ( $errorText )
Error( $errorText );
else
{
// Not so simple version
if ( !function_exists( "imagecreatefromjpeg" ) )
Warning( "The imagecreatefromjpeg function is not present, php-gd not installed?" );
if ( !$errorText )
if( ($scale==0 || $scale==100) && $width==0 && $height==0 )
readfile( ZM_DIR_EVENTS.'/'.$path );
else
{
if ( !($image = imagecreatefromjpeg( ZM_DIR_EVENTS.'/'.$path )) )
$i = imagecreatefromjpeg ( ZM_DIR_EVENTS.'/'.$path );
$oldWidth=imagesx($i);
$oldHeight=imagesy($i);
if($width==0 && $height==0) // scale has to be set to get here with both zero
{
$errorText = "Can't load image";
$error = error_get_last();
Error( $error['message'] );
$width = $oldWidth * $scale / 100.0;
$height= $oldHeight * $scale / 100.0;
}
elseif ($width==0 && $height!=0)
{
$width = ($height * $oldWidth) / $oldHeight;
}
elseif ($width!=0 && $height==0)
{
$height = ($width * $oldHeight) / $oldWidth;
}
if($width==$oldWidth && $height==$oldHeight) // See if we really need to scale
{
imagejpg($i);
imagedestroy($i);
}
else // we do need to scale
{
$iScale = imagescale($i, $width, $height);
imagejpeg($iScale);
imagedestroy($i);
imagedestroy($iScale);
}
}
if ( $errorText )
{
if ( !($image = imagecreatetruecolor( 160, 120 )) )
{
$error = error_get_last();
Error( $error['message'] );
}
if ( !($textColor = imagecolorallocate( $image, 255, 0, 0 )) )
{
$error = error_get_last();
Error( $error['message'] );
}
if ( !imagestring( $image, 1, 20, 60, $errorText, $textColor ) )
{
$error = error_get_last();
Error( $error['message'] );
}
Fatal( $errorText." - ".$path );
}
imagejpeg( $image );
imagedestroy( $image );
}
?>