Alter Version

ideenmelder
Walter Hupfeld 3 months ago
parent 6e85cec1da
commit 0df6729f8b

@ -1,7 +1,21 @@
Copyright (c) <year> <owner>. All rights reserved.
MIT License
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
Copyright (c) 2021 Walter Hupfeld
1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

@ -1,3 +1,115 @@
# melder
# Ideenmelder
Die Anwendung ermöglicht die Markierung von Standorten in einem begrenzten Bezirk (Stadt Hamm). Die Eingaben können beschrieben und bewertet werden. Das Hochladen von Bildern und das Kommentieren von Beiträgen ist möglich.
Die Idee zu dieser Anwendung kam durch einen Artikel in der ADFC-Zeitschrift Radwelt zu Ibbenbüren, wo Vorschläge zur Verkehrsinfrastruktur über eine Webanwendung erfasst wurden. Ich habe diese Idee übernommen und neu programmiert. Eine Demoanwendung findet man unter https://karte.hpadm.de (Login: admin Passwort: testtest)
Es sind aus meiner Sicht aber auch viele andere Anwendungsmöglichkeiten denkbar, z.B. Erfassung/Meldung von Eichenprozessionsspinnern, Markierung/Erfassung von Stromtankstellen etc..
## Installation
### Installation der Andwendung
Die Anwendung verfügt über ein Setup, das die Datenbank und fehlende Verzeichnisse anlegt, einen Nutzeraccount anlegt und die Anpassung der Texte ermöglicht.
### Konfiguration
Nach Installation können über die Konfiguration jederzeit die Parameter angepasst werden.
Folgende Funktionalitäten können an- bzw. abgeschaltet werden:
* Userinformationen (Altersklassen und überwiegend benutztes Verkehrsmittel)
* Rating (Positive und negative Bewertung)
* Hochladen von Bildern (erlaubt jpg/gif/png)
* Kommentare
### Reverse Georeferenzierung
Aus den übermittelten Geodaten wird die Adresse ermittelt. Dazu wird der Dienst https://locationiq.com verwendet. Die Adressen werden nur im Backend angezeigt, um die Auswertung der Daten zu erleichtern.
Für locationiq.com muss ein Api-Key beantragt werden. Dieser ist in der Datei /lib/geocoding.php einzutragen. Für die Georeferenzierung kann auch
---
## Versionen
### Version 2.2
* Behandlung der Eingaben mit Zeilenumbruch, Anführungszeichen und Hochkommas
* Die Konfiguration wird jetzt in der Datenbank gespeichert.
* Bei der Eingabe werden die Adressen georeferenziert (reverse), d.h. zum Standort wird eine Adresse ermittelt. Das ist nur im Backend sichtbar und dient zur Auswertung der Daten.
* Im Backend können jetzt Einträge bearbeitet werden (Änderung der Beschreibung, Änderung der Mängelkategorie und Hochladen von Bildern).
---
## Verwendete Bibliotheken
Die verwendeten Bibliotheken:
Die Speicherung erfolgt in einer SQlite-Datenbank im Verzeichnis /db. Sie wird während des Setups automtisch angelelgt. Zum Backup kann man die Datei locations.db einfach speichern.
### JQuery
Javacript-Framework
* https://jquery.com/
* Lizenz: MIT
### Bootstrap 4
CSS-Framework
* https://getbootstrap.com/
* Lizenz: MIT
### Leaflet
JS-Framwork für GIS-Anwendungen (Openstreetmap)
* https://leafletjs.com
* 2-clause BSD License
#### Leaflet-Ajax
Bibliothek, um Geojson-Datein per Ajax zu laden. Kann eigentlich durch JQuery-Ajax ersetzt werden.
* https://github.com/calvinmetcalf/leaflet-ajax
* Lizenz: MIT
#### Leaflet-Awesome-Markers
Ermöglicht, die Marker mit Fontawesom-Symbolen zu gestalten. die Bibliothek ist veraltet und bietet nur Zugriff auf die Fontawesome 4.x und nicht auf die neue Version 5.x.. Daher sollte sie eigentlich mal angepasst werden.
* https://github.com/lvoogdt/Leaflet.awesome-markers
* https://fontawesome.com/
* Lizenz: MIT
#### Leaflet-Snogylop
Erweiterung vom Leaflet um ein Polygon zu invertieren.
* https://github.com/ebrelsford/Leaflet.snogylop
* Lizenz: MIT
### Lightbox
Zur Darstellung von Bildern
* https://lokeshdhakar.com/projects/lightbox2/
* Lizenz: MIT
### Datatable
Darstellung der Tabelle
* https://datatables.net
* Lizenz: MIT
### Shapefile
Export von Shape-Files
* https://gasparesganga.com/labs/php-shapefile/
* Lizenz: MIT
## Improvements
* Rating durch Cookie absichern, so dass nicht zwei mal während einer Sitzung ein Maker betätigit werden kann.
* Alert nach Rating überarbeiten (z.B. mit Bootstrap)
Applikation zur georeferenzierten Meldung von Hindernissen, etc.

@ -0,0 +1,24 @@
<?php
session_start();
$strLoginName=(isset($_SESSION['user'])) ? $_SESSION['user'] : "" ;
$boolLogin = (!empty($strLoginName));
if (!$boolLogin) {
header("Location: login.php");
}
date_default_timezone_set('UTC');
const DB_FILENAME = "../db/locations.db";
$db = new SQLite3(DB_FILENAME);
$strSQL="ALTER TABLE location ADD COLUMN defect INTEGER";
$db->exec($strSQL);
$db->exec("CREATE TABLE IF NOT EXISTS user(
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT,
passwordhash TEXT,
lastlogin TEXT DEFAULT CURRENT_TIMESTAMP,
created_at TEXT DEFAULT CURRENT_TIMESTAMP
)");
header("Location: configuration.php");

@ -0,0 +1,174 @@
<?php
session_start();
$strLoginName=(isset($_SESSION['user'])) ? $_SESSION['user'] : "" ;
$boolLogin = (!empty($strLoginName));
if (!$boolLogin) {
header("Location: login.php");
}
$dbFilename = "../db/locations.db";
require_once("../config.php");
$boolError=false;
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="../css/bootstrap.min.css" />
<link href="../css/font-awesome.min.css" rel="stylesheet">
<script src="../js/jquery.min.js"></script>
<title>Konfigruation</title>
<style>
.leftlabel { width: 10em;}
input[type="text"] { width: 18em;}
input.wide {width: 24em;}
</style>
</head>
<body>
<!-- Navbar -->
<nav class="navbar navbar-expand-md navbar-dark bg-dark fixed-top">
<a class="navbar-brand" href="#">Administration <?= $strTitle ?></a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbars" aria-controls="navbars" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbars">
<ul class="navbar-nav mr-auto">
<li class="nav-item">
<a class="nav-link" href="index.php">Liste <span class="sr-only">(current)</span></a>
</li>
<li class="nav-item">
<a class="nav-link active" href="configuration.php">Konfiguration </a>
</li>
<li class="nav-item">
<a class="nav-link" href="geocoding.php">Addressen ermitteln </a>
</li>
<li class="nav-item">
<a class="nav-link" href="export.php">Export </a>
</li>
<li class="nav-item">
<a class="nav-link" href="password.php">Passwort ändern </a>
</li>
</ul>
<div>
<ul class="navbar-nav mr-auto right">
<li class="nav-item">
<a class="nav-link" href="logout.php">Logout (<?=$strLoginName?>)</a>
</li>
</ul>
</div>
</nav>
<!-- Ende Navbar -->
<div class="container" style="margin-top:5em;">
<h1>Konfiguration</h1>
<form method="post" id="myform" action="configuration_chk.php">
<div class="row">
<div class="col-md-7 col-lg-7">
<div class="card">
<div class="card-header">
<h3>Dateneingabe aktivieren</h3>
</div>
<div class="card-body">
<input type="checkbox" id="active" name="active" <?= ($boolActive) ? "checked=\"checked\"" :"" ?> >
<label for="active">Dateneingabe aktivieren</label><br>
</div>
</div>
<br>
<div class="card">
<div class="card-header">
<h3>Konfiguration</h3>
</div>
<div class="card-body">
<input type="checkbox" id="fileupload" name="fileupload" <?= ($boolUpload) ? "checked=\"checked\"" :"" ?> >
<label for="fileupload">Bilder hochladen erlauben</label><br>
<input type="checkbox" id="rating" name="rating" <?= ($boolRating) ? "checked=\"checked\"" :"" ?>>
<label for="rating"> Bewertungungen erlauben</label><br>
<input type="checkbox" id="comment" name="comment" <?= ($boolComment) ? "checked=\"checked\"" :"" ?> >
<label for="comment">Kommentare erlauben</label><br>
<input type="checkbox" id="defect" name="defect" <?= ($boolDefect) ? "checked=\"checked\"" :"" ?> >
<label for="defect">Mängelkategrien einblenden</label><br>
<input type="checkbox" id="userinfo" name="userinfo" <?= ($boolUserinfo) ? "checked=\"checked\"" :"" ?> >
<label for="userinfo">Nutzerinformation (Alter/Verkehrsmittel)</label>
<br>
<label class="leftlabel">Uplaod-Pfad:</label>
<input type="text" class="wide" name="uploaddir" id="uploaddir" value="<?=$uploaddir?>">
</div>
</div>
<br>
<div class="card">
<div class="card-header">
<h3>Karteninfo</h3>
</div>
<div class="card-body">
<h4>Stadt oder Kreis</h4>
<label class="leftlabel">Stadt/Kreis: </label>
<input type="text" name="district" id="district" value="<?=$strStadt?>" >
<h4>Kartenzentrum</h4>
<div class="small">Hier liegt das Zentrum der Karte und es erscheint der Info-Marker.</div>
<label class="leftlabel">Latitude:</label><input type="text" name="lat" id="lat" value="<?=$numInfoLat?>"><br>
<label class="leftlabel">Longitude:</label><input type="text" name="lng" id="lng" value="<?=$numInfoLng?>"><br>
<div class="small">Zoom-Faktor beim Start der Karte.</div>
<label class="leftlabel">Startzoom:</label><input type="text" name="zoom" id="zoom" value="<?=$numZoom?>">
<h4>GeoJson</h4>
<p>Die Datei kann man von folgender Adresse laden und ins Vezeichnis /geojson kopieren:
<a href="https://public.opendatasoft.com/explore/dataset/landkreise-in-germany/export/">public.opendatasoft.com</a>
</p>
<label class="leftlabel">GeoJson-Datei: </label><input type="text" name="geojson" id="geojson" value="<?=$fileGeojson?>">
</div>
</div>
<br>
<div class="card">
<div class="card-header">
<h3>Anbieterinformation</h3>
</div>
<div class="card-body">
<label class="leftlabel">Titel:</label><input type="text" name="title" id="title" value="<?=$strTitle?>"><br>
<label class="leftlabel">Kontakt-Email:</label><input type="text" name="contactEmail" id="contactEmail" value="<?=$contactEmail?>"><br>
<label class="leftlabel">Logo:</label><input type="text" name="logo" id="logo" value="<?=$strLogo?>"><br>
<label class="leftlabel">Url:</label><input type="text" class="wide" name="url" id="url" value="<?=$strUrl?>"><br>
<label class="leftlabel">Url-Text:</label><input type="text" class="wide" name="urlBez" id="urlBez" value="<?=$strUrlBez?>"><br>
<label>Impressum: (HTML erlaubt)</label>
<textarea id="impressum" name="impressum" rows="8" style="width:35em;"><?= stripslashes($strImpressum) ?></textarea>
</div>
</div>
<br>
<div class="card">
<div class="card-header">
<h3>Einführungstext im Tooltipp</h3>
</div>
<div class="card-body">
<label>Tooltipp-Text: (HTML erlaubt)</label>
<textarea name="introtext" id="input" class="form-control" style="width:35em;" rows="10" required="required">
<?=stripslashes($strIntroText) ?>
</textarea>
</div>
</div>
<br>
<input type="hidden" name="csrf" value="<?=$_SESSION['csrf_token']?>">
<input type="submit" class="btn btn-primary" value="Konfiguration ändern">
</form>
<br><br><br>
</div>
</div> <!-- row -->
</div>
</body>
</html>

@ -0,0 +1,62 @@
<?php
session_start();
$strLoginName=(isset($_SESSION['user'])) ? $_SESSION['user'] : "" ;
$boolLogin = (!empty($strLoginName));
if (!$boolLogin) {
header("Location: login.php");
}
$dbFilename="../db/locations.db";
require("../config.php");
if($_POST['csrf'] !== $_SESSION['csrf_token']) {
die("Ungültiger Token");
}
$boolActive = (isset($_POST['active'])) ? "1" : "0";
$boolRating = (isset($_POST['rating'])) ? "1" : "0";
$boolComment = (isset($_POST['comment'])) ? "1" : "0";
$boolUpload = (isset($_POST['fileupload'])) ? "1" : "0";
$boolUserinfo = (isset($_POST['userinfo'])) ? "1" : "0";
$boolDefect = (isset($_POST['defect'])) ? "1" : "0";
$strUploaddir = $_POST['uploaddir'];
$strStadt = $_POST['district'];
$strTitle = $_POST['title'];
$fileGeojson =$_POST['geojson'];
$numInfoLat = $_POST['lat'];
$numInfoLng = $_POST['lng'];
$numZoom = $_POST['zoom'];
$strLogo = $_POST['logo'];
$contactEmail= $_POST['contactEmail'];
$strImpressum= $_POST['impressum'];
$strUrl = $_POST['url'];
$strUrlBez = $_POST['urlBez'];
$strIntroText= $_POST['introtext'];
$strImpressum=addslashes($strImpressum);
$strIntroText=addslashes($strIntroText);
$db->query("UPDATE config SET value= '$strUploaddir' WHERE key='uploaddir'");
$db->query("UPDATE config SET value= '$fileGeojson' WHERE key='fileGeojson'");
$db->query("UPDATE config SET value= '$strStadt' WHERE key='stadt'");
$db->query("UPDATE config SET value= '$strTitle' WHERE key='title'");
$db->query("UPDATE config SET value= '$numInfoLat' WHERE key='InfoLat'");
$db->query("UPDATE config SET value= '$numInfoLng' WHERE key='InfoLng'");
$db->query("UPDATE config SET value= '$numZoom' WHERE key='zoom'");
$db->query("UPDATE config SET value= '$strLogo' WHERE key='logo'");
$db->query("UPDATE config SET value= '$contactEmail' WHERE key='contactEmail'");
$db->query("UPDATE config SET value= '$strImpressum' WHERE key='impressum'");
$db->query("UPDATE config SET value= '$strUrl' WHERE key='url'");
$db->query("UPDATE config SET value= '$strUrlBez' WHERE key='UrlBez'");
$db->query("UPDATE config SET value= '$strIntroText' WHERE key='IntroText'");
$db->query("UPDATE config SET value= '$boolActive' WHERE key='boolActive'");
$db->query("UPDATE config SET value= '$boolRating' WHERE key='boolRating'");
$db->query("UPDATE config SET value= '$boolComment' WHERE key='boolComment'");
$db->query("UPDATE config SET value= '$boolUserinfo' WHERE key='boolUserinfo'");
$db->query("UPDATE config SET value= '$boolDefect' WHERE key='boolDefect'");
$db->query("UPDATE config SET value= '$boolUpload' WHERE key='boolUpload'");
header("Location: configuration.php");

@ -0,0 +1,90 @@
<?php
date_default_timezone_set('UTC');
$db = new SQLite3($dbFilename);
$db->exec("CREATE TABLE IF NOT EXISTS location(
id INTEGER PRIMARY KEY AUTOINCREMENT,
username text NOT NULL DEFAULT '',
age text NOT NULL DEFAULT '',
transport text NOT NULL DEFAULT '',
description text NOT NULL DEFAULT '',
defect number,
topic number,
lng number,
lat number,
thumb_ups INTEGER DEFAULT 0,
thumb_downs INTEGER DEFAULT 0,
created_at TEXT DEFAULT CURRENT_TIMESTAMP
)");
$db->exec("CREATE TABLE IF NOT EXISTS files(
id INTEGER PRIMARY KEY AUTOINCREMENT,
loc_id INTEGER,
filename TEXT,
filetype TEXT,
filesize INTEGER
)");
$db->exec("CREATE TABLE IF NOT EXISTS comment(
id INTEGER PRIMARY KEY AUTOINCREMENT,
loc_id INTEGER,
username TEXT,
comment TEXT,
created_at TEXT DEFAULT CURRENT_TIMESTAMP
)");
$db->exec("CREATE TABLE IF NOT EXISTS user(
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT,
passwordhash TEXT,
lastlogin TEXT DEFAULT CURRENT_TIMESTAMP,
created_at TEXT DEFAULT CURRENT_TIMESTAMP
)");
$db->exec("CREATE TABLE IF NOT EXISTS address(
id INTEGER PRIMARY KEY AUTOINCREMENT,
loc_id INTEGER,
parking TEXT,
road TEXT,
house_number TEXT,
industrial TEXT,
neighbourhood TEXT,
hamlet TEXT,
suburb TEXT,
postcode TEXT,
city TEXT,
county TEXT,
country TEXT
)");
$db->exec("CREATE TABLE IF NOT EXISTS 'config' ('key' TEXT PRIMARY KEY NOT NULL DEFAULT NULL, 'value' TEXT DEFAULT NULL);
INSERT INTO 'config' ('key','value') VALUES ('boolActive','1');
INSERT INTO 'config' ('key','value') VALUES ('boolRating','1');
INSERT INTO 'config' ('key','value') VALUES ('boolComment','1');
INSERT INTO 'config' ('key','value') VALUES ('boolUpload','1');
INSERT INTO 'config' ('key','value') VALUES ('boolUserinfo','0');
INSERT INTO 'config' ('key','value') VALUES ('boolDefect','1');
INSERT INTO 'config' ('key','value') VALUES ('uploaddir','/var/www/html/images/');
INSERT INTO 'config' ('key','value') VALUES ('title','Testversion Hamm');
INSERT INTO 'config' ('key','value') VALUES ('fileGeojson','geojson/hamm.geojson');
INSERT INTO 'config' ('key','value') VALUES ('InfoLat','51.66');
INSERT INTO 'config' ('key','value') VALUES ('InfoLng','7.825');
INSERT INTO 'config' ('key','value') VALUES ('zoom','12');
INSERT INTO 'config' ('key','value') VALUES ('logo','css/logo.png');
INSERT INTO 'config' ('key','value') VALUES ('contactEmail','info@radwege-hamm.de');
INSERT INTO 'config' ('key','value') VALUES ('impressum','Walter Hupfeld
Bankerheide 2
59065 Hamm');
INSERT INTO 'config' ('key','value') VALUES ('url','https://www.radwege-hamm.de');
INSERT INTO 'config' ('key','value') VALUES ('UrlBez','Homepage Radwege Hamm');
INSERT INTO 'config' ('key','value') VALUES ('IntroText','Hier können Sie uns Hinweise auf Verbesserungen der Verkehrsinfrastruktur in der Stadt Mülheim an der Ruhr vorschlagen.
Klicken Sie dazu auf entsprechenden Ort auf der Karte und geben Sie im Dialog ihre Anmerkungen ein.
Den Marker können sie solange auf die richtige Stelle verschieben, bis die Eingabe abgeschlossen ist.
Vielen Dank für Ihre Unterstützung.');
INSERT INTO 'config' ('key','value') VALUES ('stadt','Hamm');
");

@ -0,0 +1,61 @@
<?php
/** *****************************
* Ideenmelder
* Autor: Walter Hupfeld, Hamm
* E-Mail: info@hupfeld-software.de
* Version: 1.0
* Datum: 18.05.2021
******************************** */
session_start();
$strLoginName=(isset($_SESSION['user'])) ? $_SESSION['user'] : "" ;
$boolLogin = (!empty($strLoginName));
if (!$boolLogin) {
header("Location: login.php");
}
$dbFilename="../db/locations.db";
require ("../config.php");
// Set headers to make the browser download the results as a csv file
header("Content-type: text/csv");
header("Content-Disposition: attachment; filename=dump.csv");
header("Pragma: no-cache");
header("Expires: 0");
// Query
$strSQL="SELECT l.id as lid,l.*,adr.*
FROM location l LEFT JOIN address adr ON l.id=adr.loc_id ORDER BY created_at ASC";
$query = $db->query($strSQL);
// Fetch the first row
$row = $query->fetchArray(SQLITE3_ASSOC);
// If no results are found, echo a message and stop
if ($row == false){
echo "No results";
exit;
}
// Print the titles using the first line
print_titles($row);
// Iterate over the results and print each one in a line
while ($row != false) {
// Print the line
$line = implode( ";",array_values($row));
$line = html_entity_decode($line);
$line = str_replace(array("\r\n", "\r", "\n"), "<br />", $line);
echo $line . "\n";
// Fetch the next line
$row = $query->fetchArray(SQLITE3_ASSOC);
}
// Prints the column names
function print_titles($row){
echo implode(";",array_keys($row)) . "\n";
}
?>

@ -0,0 +1,105 @@
<?php
/** *****************************
* Ideenmelder
* Autor: Walter Hupfeld, Hamm
* E-Mail: info@hupfeld-software.de
* Version: 1.0
* Datum: 18.05.2021
******************************** */
session_start();
$strLoginName=(isset($_SESSION['user'])) ? $_SESSION['user'] : "" ;
$boolLogin = (!empty($strLoginName));
if (!$boolLogin) {
header("Location: login.php");
}
$dbFilename="../db/locations.db";
require ("../config.php");
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="../css/bootstrap.min.css" />
<link href="../css/font-awesome.min.css" rel="stylesheet">
<script src="../js/jquery.min.js"></script>
<title>Konfigruation</title>
<style>
.leftlabel { width: 10em;}
input[type="text"] { width: 18em;}
input.wide {width: 24em;}
</style>
</head>
<body>
<!-- Navbar -->
<nav class="navbar navbar-expand-md navbar-dark bg-dark fixed-top">
<a class="navbar-brand" href="#">Administration <?= $strTitle ?></a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbars" aria-controls="navbars" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbars">
<ul class="navbar-nav mr-auto">
<li class="nav-item">
<a class="nav-link" href="index.php">Liste <span class="sr-only">(current)</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="configuration.php">Konfiguration </a>
</li>
<li class="nav-item">
<a class="nav-link" href="geocoding.php">Addressen ermitteln </a>
</li>
<li class="nav-item active">
<a class="nav-link" href="export.php">Export </a>
</li>
<li class="nav-item">
<a class="nav-link" href="password.php">Passwort ändern </a>
</li>
</ul>
<div>
<ul class="navbar-nav mr-auto right">
<li class="nav-item">
<a class="nav-link" href="logout.php">Logout (<?=$strLoginName?>)</a>
</li>
</ul>
</div>
</nav>
<!-- Ende Navbar -->
<div class="container" style="margin-top:5em;">
<h1>Export</h1>
<div class="row">
<div class="col-md-7 col-lg-7">
<br>
<div class="card">
<div class="card-header">
<h3>CSV Exportieren</h3>
</div>
<div class="card-body">
<ul>
<li> <a href="print_html.php">HTML-Druckansicht</a></li>
<li> <a href="dump.php">CSV-Datei</a></li>
<li> <a href="shapefile.php">Shape-File (ZIP)</a></li>
</ul>
</div>
</div>
<br>
</div>
</div>
</div>
</body>
</html>

@ -0,0 +1,94 @@
<?php
session_start();
$strLoginName=(isset($_SESSION['user'])) ? $_SESSION['user'] : "" ;
$boolLogin = (!empty($strLoginName));
if (!$boolLogin) {
header("Location: login.php");
}
$dbFilename="../db/locations.db";
require ("../config.php");
require ("../lib/geocoding.php");
$boolRefresh = (isset($_GET['refresh']) & $_GET['refresh']==1);
$strTable="";
if ($boolRefresh) {
cleanAddresses($db);
$strTable=fillAddressTable($db,20);
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="../css/bootstrap.min.css" />
<link href="../css/font-awesome.min.css" rel="stylesheet">
<script src="../js/jquery.min.js"></script>
<title>Konfigruation</title>
<style>
.leftlabel { width: 10em;}
input[type="text"] { width: 18em;}
input.wide {width: 24em;}
</style>
</head>
<body>
<!-- Navbar -->
<nav class="navbar navbar-expand-md navbar-dark bg-dark fixed-top">
<a class="navbar-brand" href="#">Administration <?= $strTitle ?></a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbars" aria-controls="navbars" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbars">
<ul class="navbar-nav mr-auto">
<li class="nav-item">
<a class="nav-link" href="index.php">Liste <span class="sr-only">(current)</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="configuration.php">Konfiguration </a>
</li>
<li class="nav-item active">
<a class="nav-link" href="geocoding.php">Addressen ermitteln </a>
</li>
<li class="nav-item">
<a class="nav-link" href="export.php">Export </a>
</li>
<li class="nav-item">
<a class="nav-link" href="password.php">Passwort ändern </a>
</li>
</ul>
<div>
<ul class="navbar-nav mr-auto right">
<li class="nav-item">
<a class="nav-link" href="logout.php">Logout (<?=$strLoginName?>)</a>
</li>
</ul>
</div>
</nav>
<!-- Ende Navbar -->
<div class="container" style="margin-top:5em;">
<h1>Adressen ermitteln</h1>
<p>Bei der Eingabe der Daten werden auch die zugehörigen Adressen ermittelt. Sollte das nicht funktionieren,
können mit dieser Funktion die Adressdaten nachträglich erfasst werden. Die Erfassung der Adressen erleichtert
die Auswertung der Daten, sie werden nur im Backend angezeigt.</p>
<p><strong>Achtung:</strong> Es werden aufgrund der Beschränkungen des Dienstes
jeweils nur 20 Datensätze ermittelt. Ggf. muss die Seite mehrmals aufgerufen werden.</p>
<p>Geduld - der Aufruf der Funktion beansprucht etwas Zeit.</p>
<div class="row">
<div class="col-5-md">
<ul class="list-group">
<li class="list-group-item">
<a href="<?=$_SERVER['PHP_SELF']?>?refresh=1">Adressen jetzt ermitteln</a></li>
</ul>
<br>
</div>
</div>
<?= $strTable ?>
</div>
</body>
</html>

@ -0,0 +1,332 @@
<?php
/** *****************************
* Ideenmelder
* Autor: Walter Hupfeld, Hamm
* E-Mail: info@hupfeld-software.de
* Version: 1.0
* Datum: 18.05.2021
******************************** */
session_start();
$strLoginName=(isset($_SESSION['user'])) ? $_SESSION['user'] : "" ;
$boolLogin = (!empty($strLoginName));
if (!$boolLogin) {
header("Location: login.php");
}
$dbFilename = "../db/locations.db";
include("../config.php");
$boolShowmap=false;
if (isset($_GET['delid'])) {
if($_GET['csrf'] !== $_SESSION['csrf_token']) {
die("Ungültiger Token");
}
$numDelete = (int)$_GET['delid'];
$stmt = $db->prepare("DELETE FROM location WHERE id = :id");
$stmt->bindValue(":id",$numDelete);
$stmt->execute();
$stmt = $db->prepare("DELETE FROM comment WHERE loc_id= :loc_id");
$stmt->bindValue(":loc_id",$numDelete);
$stmt->execute();
$stmt = $db->prepare("SELECT * FROM files where loc_id = :loc_id");
$stmt->bindValue(":loc_id", $numDelete, SQLITE3_TEXT);
$result = $stmt->execute();
if ($row = $result->fetchArray()) {
$strFilename = $row['filename'];
$strFilename = $uploaddir . $strFilename;
unset($strFilename);
}
$stmt = $db->prepare("DELETE FROM files WHERE loc_id= :loc_id");
$stmt->bindValue(":loc_id",$numDelete);
$stmt->execute();
}
if (isset($_GET['delcid'])) {
if($_GET['csrf'] !== $_SESSION['csrf_token']) {
die("Ungültiger Token");
}
$numDelete=(int)$_GET['delcid'];
$stmt = $db->prepare("DELETE FROM comment WHERE id= :id");
$stmt->bindValue(":id",$numDelete);
$stmt->execute();
}
if (isset($_GET['delfid'])) {
if($_GET['csrf'] !== $_SESSION['csrf_token']) {
die("Ungültiger Token");
}
$numDelete=(int)$_GET['delfid'];
$stmt = $db->prepare("SELECT * FROM files where id = :id");
$stmt->bindValue(":id", $numDelete, SQLITE3_TEXT);
$result = $stmt->execute();
if ($row=$result->fetchArray()) {
$strFilename = $row['filename'];
$strFilename = $uploaddir . $strFilename;
unset($strFilename);
}
$stmt = $db->prepare("DELETE FROM files WHERE id= :id");
$stmt->bindValue(":id",$numDelete);
$stmt->execute();
}
if (isset($_GET['showmap'])) {
$numShowmap=(int)$_GET['showmap'];
$boolShowmap=$numShowmap==1;
}
$arrTopic = array (
1 => "Fußverkehr",
2 => "Radverkehr",
3 => "Bus und Bahn",
4 => "Pkw-Verkehr",
5 => "Lkw-Verkehr"
);
$arrIcon = array (
1 => "<i class='fa fa-male'></i>",
2 => "<i class='fa fa-bicycle'></i>",
3 => "<i class='fa fa-train'></i>",
4 => "<i class='fa fa-car'></i>",
5 => "<i class='fa fa-truck'></i>"
);
?>
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="../css/bootstrap.min.css" />
<link rel="stylesheet" href="../css/font-awesome.min.css">
<link rel="stylesheet" href="../css/lightbox.css" />
<link rel="stylesheet" href="../css/leaflet.css" />
<link rel="stylesheet" href="../css/leaflet.awesome-markers.css" />
<script src="../js/jquery.min.js"></script>
<script src="../js/leaflet.js"></script>
<script src="../js/leaflet.awesome-markers.js"></script>
<script src="../js/lightbox.min.js"></script>
<title>Eintragsliste</title>
<style>
.tdmap { height:350px; width:300px;}
</style>
</head>
<body>
<!-- Navbar -->
<nav class="navbar navbar-expand-md navbar-dark bg-dark fixed-top">
<a class="navbar-brand" href="#">Administration <?= $strTitle ?></a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbars" aria-controls="navbars" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbars">
<ul class="navbar-nav mr-auto">
<li class="nav-item active">
<a class="nav-link" href="index.php">Liste <span class="sr-only">(current)</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="configuration.php">Konfiguration </a>
</li>
<li class="nav-item">
<a class="nav-link" href="geocoding.php">Addressen ermitteln </a>
</li>
<li class="nav-item">
<a class="nav-link" href="export.php">Export </a>
</li>
<li class="nav-item">
<a class="nav-link" href="password.php">Passwort ändern </a>
</li>
</ul>
<div>
<ul class="navbar-nav mr-auto right">
<li class="nav-item">
<a class="nav-link" href="logout.php">Logout (<?=$strLoginName?>)</a>
</li>
</ul>
</div>
</nav>
<!-- Ende Navbar -->
<div class="container-fluid" style="margin-top:5em;">
<table class="table table-bordered table-striped">
<thead>
<tr><th>id</th><th>Username</th>
<?= ($boolUserinfo) ? "<th>Alter</th><th>Transport</th>" : "" ?>
<th>Topic</th>
<th>Beschreibung</th>
<th><i class="fa fa-thumbs-up"></i></th><th><i class="fa fa-thumbs-down"></i></th>
<th>Kommentare</th>
<th>Adresse</th>
<th>Mangel</th>
<th>Bild</th>
<th>lat/lng</th>
<th>Datum</th>
<th>Aktion</th></tr>
</thead>
<tbody>
<?php
$strScript="";
//$strSQL="SELECT * FROM location ORDER BY created_at DESC";
$strSQL="SELECT l.id as lid,l.*,adr.* FROM location l LEFT JOIN address adr ON l.id=adr.loc_id ORDER BY created_at ASC";
$result = $db->query($strSQL);
while ($row = $result->fetchArray()) {
$id = $row['lid'];
echo "<tr>";
echo "<td>".$id."</td>";
echo "<td>". stripslashes($row['username']) ."</td>";
echo ($boolUserinfo) ? "<td>".$row['age']."</td><td>".$row['transport']."</td>" : "";
echo "<td>".$arrIcon[$row['topic']]." ".$arrTopic[$row['topic']]."</td>";
echo "<td id='desc_".$id."'>" . nl2br(stripslashes($row['description'])) . "</td>";
echo "<td>".$row['thumb_ups']."</td>";
echo "<td>".$row['thumb_downs']."</td>";
echo "<td>";
$strSQL = "SELECT id,username,comment,created_at FROM comment WHERE loc_id=".$id;
$comments = $db->query($strSQL);
while ($comment = $comments->fetchArray()) {
echo "<div class='comment'>";
echo "<em>".$comment['username']." schrieb am ";
$numDatum = strtotime($comment['created_at']);
$strDatum = date("d.m.Y",$numDatum);
echo $strDatum."</em><br>";
echo nl2br(stripslashes($comment['comment']));
echo "<a class='left' href='".$_SERVER['PHP_SELF']."?delcid=".$comment['id']."&csrf=".$_SESSION['csrf_token']."'><i class='fa fa-trash'></i></a>";
echo "</div>";
}
echo "</td>";
echo "<td>".$row['road']." ".$row['house_number']."<br>"
.$row['neighbourhood']." "
.$row['hamlet']." "
.$row['suburb']."</td>";
$strDefect = (isset($row['defect']) && $row['defect']>0) ? $arrDefect[$row['defect']] : "";
echo "<td id='defect_".$id."' value='".$row['defect']."'>".$strDefect."</td>\n";
echo "<td id='img_".$id."'>";
$strSQL = "SELECT id,filename FROM files WHERE loc_id=".$id;
$files=$db->query($strSQL);
if ($file=$files->fetchArray()) {
echo "<a href='../images/".$file['filename']."' data-lightbox='radweg".$id."'>";
echo "<img src='../images/".$file['filename']."' style='width:150px'></a>";
echo "<a href='".$_SERVER['PHP_SELF']."?delfid=".$file['id']."&csrf=".$_SESSION['csrf_token']."'><i class='fa fa-trash'></i></a>";
}
echo "</td>\n";
// Karte einblenden
if ($boolShowmap) {
echo "<td><div class='tdmap' id='map_".$id."'></div></td>\n";
}
else {
echo "<td>".round($row['lat'],5)." ".round($row['lng'],5)."</td>";
}
echo "<td>".$row['created_at']."</td>";
echo "<td><a class='del' href='".$_SERVER['PHP_SELF']."?delid=".$id."&csrf=".$_SESSION['csrf_token']."'><i class='fa fa-trash'></i></a>&nbsp;";
echo "<a class='edit_defect' href='#' id='edit_".$id."' value='".$id."'><i class='fa fa-pencil'></i></a>";
echo "</td>";
echo "</tr>\n";
if ($boolShowmap) {
$strScript.="var mymap_".$id." = L.map(map_".$id.").setView([".$row['lat'].", ".$row['lng']."], 16);\n";
$strScript.="L.tileLayer(url, {maxZoom: 18,minZoom:12,attribution: attribution,id: 'mapbox/streets-v11',tileSize: 512,zoomOffset: -1}).addTo(mymap_".$id.")\n";
$strScript.="L.marker([".$row['lat'].", ".$row['lng']."], { icon: infoMarker } ).addTo(mymap_".$id.")\n\n";
}
}
?>
</tbody>
</table>
<a class="btn btn-primary" href="../index.php?ref=1">zurück</a>
</div>
<?php include("../lib/dialog_edit_location.php"); ?>
<script>
$( document ).ready(function() {
var url = 'https://api.mapbox.com/styles/v1/{id}/tiles/{z}/{x}/{y}?access_token=pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpejY4NXVycTA2emYycXBndHRqcmZ3N3gifQ.rJcFIG214AriISLbB6B5aw';
var attribution = 'Map data &copy; <a href="https://www.openstreetmap.org/">OpenStreetMap</a> contributors, ' +
'<a href="https://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, ' +
'Imagery © <a href="https://www.mapbox.com/">Mapbox</a>';
var infoMarker = L.AwesomeMarkers.icon({icon: 'info', prefix: 'fa', markerColor: 'orange'});
$(".edit_defect").on("click", function(e){
e.preventDefault();
$('#dialog_defect').hide();
$('#dialog_defect').css({'top':e.pageY-90,'left':e.pageX-520});
id = $(this).attr("value");
descr = $("#desc_"+id).html();
descr = descr.replace(/(<|&lt;)br\s*\/*(>|&gt;)/g,' ');
$("#description").html(descr);
defect_id=$("#defect_"+id).attr("value");
$("#defect select").val(defect_id);
$("#loc_id").val(id);
$('#dialog_defect').show();
return false;
})
$(".del").click(function () {
result=confirm("Wirklich löschen?");
return result===true;
})
$("#editobjectform").submit(function(event){
event.preventDefault();
//grab all form data
var formData = new FormData($(this)[0]);
$.ajax({
type: "POST",
url: "../ajax/ajax_update.php",
enctype: 'multipart/form-data',
data: formData, //$("#newobjectform").serialize(), // serializes the form's elements.
processData: false,
contentType: false,
cache: false,
success: function(data)
{
$("#dialog_defect").hide();
console.log(data);
newdata=JSON.parse(data);
console.log(newdata);
id=newdata.id;
$("#desc_"+id).html(newdata.description);
$("#defect_"+id).html(newdata.defect);
if (newdata.filename>"") {
img="<img src='../images/"+newdata.filename+"' style='width:150px;'>";
$("#img_"+id).html(img);
}
//$("#btnSubmit").prop("disabled", false);
event.preventDefault();
},
error: function(data)
{
alert('Fehler: Konnte keine Daten senden!');
}
});
return false;
});
$('#close').click(function(e){
$('#dialog_defect').hide();
});
<?= $strScript ?>
});
</script>
</body>
</html>

@ -0,0 +1,108 @@
<?php
/** *****************************
* Ideenmelder
* Autor: Walter Hupfeld, Hamm
* E-Mail: info@hupfeld-software.de
* Version: 1.0
* Datum: 18.05.2021
******************************** */
$dbFilename = "../db/locations.db";
require_once("../config.php");
$boolLogin=true;
if (isset($_POST['login']) && isset($_POST['password'])) {
$strUser = trim($_POST['login']);
$strPassword = trim($_POST['password']);
$strSQL = "SELECT username,passwordhash FROM user WHERE username='$strUser'";
$result = $db->query($strSQL);
if ($row=$result->fetchArray()) {
if (password_verify($strPassword,$row['passwordhash'])) {
session_start();
$_SESSION['user']=$strUser;
$_SESSION['csrf_token'] = uniqid('', true);
header ("Location: index.php");
} else {
$boolLogin=false;
}
}
else {
$boolLogin=false;
}
}
?>
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Login</title>
<link rel="stylesheet" href="../css/bootstrap.min.css" />
<link rel="stylesheet" href="../css/style.css" />
</head>
<body>
<!-- Navbar -->
<nav class="navbar navbar-expand-md navbar-dark bg-dark fixed-top">
<a class="navbar-brand" href="#"><?= $strTitle ?></a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbars" aria-controls="navbars" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbars">
<ul class="navbar-nav mr-auto">
<li class="nav-item">
<a class="nav-link" href="../index.php?ref=1">Karte</a>
</li>
</ul>
</div>
</nav>
<!-- Ende Navbar -->
<div class="container main" style="margin-top:8em;">
<div class="row">
<div class="col-md-5">
<?php if (!$boolLogin): ?>
<div class="alert alert-danger">
<strong>Fehler!</strong> Login nicht erfolgreich!
</div> <br>
<?php endif; ?>
<div class="card">
<div class="card-header">
<h2>Login</h2>
</div>
<div class="card-body">
<form id="login" action="<?=$_SERVER['PHP_SELF']?>" method="post">
<div class="form-group">
<label for="username">Login</label>
<input type="text" name="login" class="form-control" id="username" placeholder="Nutzername" required>
</div>
<div class="form-group">
<label for="password">Password</label>
<input type="password" name="password" class="form-control" id="password" placeholder="Passwort" required>
</div>
<button type="submit" class="btn btn-primary">Absenden</button>
</form>
</div>
</div>
</div>
</div>
<div style="margin-top:5em;">
<a class="btn btn-primary text-white" href="../index.php?ref=1">zurück</a>
</div>
</div>
</body>
</html>

@ -0,0 +1,5 @@
<?php
session_start();
session_destroy();
header ("Location: ../index.php");

@ -0,0 +1,156 @@
<?php
/** *****************************
* Ideenmelder
* Autor: Walter Hupfeld, Hamm
* E-Mail: info@hupfeld-software.de
* Version: 1.0
* Datum: 18.05.2021
******************************** */
session_start();
$dbFilename="../db/locations.db";
require ("../config.php");
$strLoginName=(isset($_SESSION['user'])) ? $_SESSION['user'] : "" ;
$boolLogin = (!empty($strLoginName));
if (!$boolLogin) {
header("Location: login.php");
}
$boolError=false;
if (isset($_POST['password1']) && isset($_POST['password2']) && isset($_POST['username']) ) {
if($_POST['csrf'] !== $_SESSION['csrf_token']) {
die("Ungültiger Token");
}
$strPassword=trim($_POST['password1']);
$strPassword2=trim($_POST['password2']);
if ($strPassword==$strPassword2) {
$strUsername=$_POST['username'];
$strPasswordHash = password_hash($strPassword,PASSWORD_BCRYPT);
$strSQL="UPDATE user SET passwordhash = :passwordhash WHERE username=:username";
$stmt = $db->prepare($strSQL);
$stmt->bindValue(':username', $strUsername);
$stmt->bindValue(':passwordhash', $strPasswordHash);
$stmt->execute();
if ($stmt) {
header("Location: index.php");
} else {
$boolError=true;
}
} else $boolError=true;
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="../css/bootstrap.min.css" />
<link href="../css/font-awesome.min.css" rel="stylesheet">
<script src="../js/jquery.min.js"></script>
<title>Passwort ändern</title>
<style>
.leftlabel { width: 13em;}
input[type="text"] { width: 16em;}
input.wide {width: 24em;}
</style>
</head>
<body>
<!-- Navbar -->
<nav class="navbar navbar-expand-md navbar-dark bg-dark fixed-top">
<a class="navbar-brand" href="#">Administration <?= $strTitle ?></a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbars" aria-controls="navbars" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbars">
<ul class="navbar-nav mr-auto">
<li class="nav-item">
<a class="nav-link" href="index.php">Liste <span class="sr-only">(current)</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="configuration.php">Konfiguration </a>
</li>
<li class="nav-item">
<a class="nav-link" href="export.php">Export </a>
</li>
<li class="nav-item active">
<a class="nav-link" href="password.php">Passwort ändern </a>
</li>
</ul>
<div>
<ul class="navbar-nav mr-auto right">
<li class="nav-item">
<a class="nav-link" href="logout.php">Logout (<?=$strLoginName?>)</a>
</li>
</ul>
</div>
</nav>
<!-- Ende Navbar -->
<div class="container" style="margin-top:5em;">
<h2>Passwort ändern</h2>
<div class="row">
<div class="col-md-7 col-lg-7">
<br>
<?php if ($boolError): ?>
<div class="alert alert-danger">
<strong>Fehler!</strong> Password konnte nicht geändert werden!
</div> <br>
<div class="card">
<?php endif; ?>
<div class="card-header">
<h3>Dateneingabe</h3>
</div>
<form id="login" action="<?=$_SERVER['PHP_SELF']?>" method="post">
<div class="card-body">
<label class="leftlabel">Nutzername: </label>
<input type="text" name="username" id="username" value="<?=$strLoginName?>" readonly ><br>
<label class="leftlabel">Passwort (mind. 8 Zeichen): </label>
<input type="password" name="password1" id="password1" value="" minlength="8" required><br>
<label class="leftlabel">Passwort (Wdh.): </label>
<input type="password" name="password2" id="password2" value="" minlength="8" required><br><br>
<label class="leftlabel">&nbsp;</label>
<input type="hidden" name="csrf" value="<?=$_SESSION['csrf_token']?>">
<button type="submit" class="btn btn-primary">Passwort ändern</button>
</div>
</form>
</div>
<br>
</div>
</div>
</div>
<script>
$('#myform').submit(function(e){
password1 = $("#password1").val();
password2 = $("#password2").val();
if (password1.length==0 && password2.legthn==0) {
return true;
}
if (password1==password2) {
return true;
} else {
alert("Passwörter nicht gleich");
return false;
e.preventDefault();
}
});
</script>
</body>
</html>

@ -0,0 +1,141 @@
<?php
session_start();
$strLoginName=(isset($_SESSION['user'])) ? $_SESSION['user'] : "" ;
$boolLogin = (!empty($strLoginName));
if (!$boolLogin) {
header("Location: login.php");
}
$dbFilename = "../db/locations.db";
include("../config.php");
$arrTopic = array (
1 => "Fußverkehr",
2 => "Radverkehr",
3 => "Bus und Bahn",
4 => "Pkw-Verkehr",
5 => "Lkw-Verkehr"
);
$arrIcon = array (
1 => "<i class='fa fa-male'></i>",
2 => "<i class='fa fa-bicycle'></i>",
3 => "<i class='fa fa-train'></i>",
4 => "<i class='fa fa-car'></i>",
5 => "<i class='fa fa-truck'></i>"
);
?>
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="../css/bootstrap.min.css" />
<link rel="stylesheet" href="../css/font-awesome.min.css">
<link rel="stylesheet" href="../css/leaflet.css" />
<link rel="stylesheet" href="../css/leaflet.awesome-markers.css" />
<script src="../js/jquery.min.js"></script>
<script src="../js/leaflet.js"></script>
<script src="../js/leaflet.awesome-markers.js"></script>
<title>Eintragsliste</title>
<style>
.tdmap { height:350px; width:300px;}
</style>
</head>
<body>
<div class="container-fluid">
<table class="table table-bordered table-striped">
<thead>
<tr><th>id</th><th>Username</th>
<?= ($boolUserinfo) ? "<th>Alter</th><th>Transport</th>" : ""; ?>
<th>Topic</th>
<th>Beschreibung</th>
<?= ($boolRating) ? "<th><i class=\"fa fa-thumbs-up\"></i></th><th><i class=\"fa fa-thumbs-down\"></i></th>" : "" ?>
<th>Kommentare</th>
<th>Mangel</th>
<th>Bild</th>
<th>Adresse</th>
<th>Karte</th>
</thead>
<tbody>
<?php
$strScript="";
$strSQL="SELECT l.id as lid,l.*,adr.* FROM location l LEFT JOIN address adr ON l.id=adr.loc_id ORDER BY city,postcode,suburb,hamlet,road ASC";
$result = $db->query($strSQL);
while ($row = $result->fetchArray()) {
$id = $row['lid'];
$numDatum= strtotime($row['created_at']);
$strDatum= date("d.m.Y",$numDatum);
echo "<tr>";
echo "<td>".$id."</td>";
echo "<td>". stripslashes($row['username']) ."<br><br>". $strDatum . "</td>";
echo ($boolUserinfo) ? "<td>".$row['age']."</td><td>".$row['transport']."</td>" : "";
echo "<td>".$arrIcon[$row['topic']]." ".$arrTopic[$row['topic']]."</td>";
echo "<td>" . stripslashes(nl2br($row['description'])) . "</td>";
echo ($boolRating) ? "<td>".$row['thumb_ups']."</td><td>".$row['thumb_downs']."</td>" : "";
echo "<td>";
$strSQL = "SELECT id,username,comment,created_at FROM comment WHERE loc_id=".$id;
$comments = $db->query($strSQL);
while ($comment = $comments->fetchArray()) {
echo "<div class='comment'>";
echo "<em>".$comment['username']." schrieb am ";
$numDatum = strtotime($comment['created_at']);
$strDatum = date("d.m.Y",$numDatum);
echo $strDatum."</em><br>";
echo nl2br($comment['comment']);
echo "</div>";
}
echo "</td>";
$strDefect = (isset($row['defect']) && $row['defect']>0) ? $arrDefect[$row['defect']] : "";
echo "<td>".$strDefect."</td>\n";
echo "<td>";
$strSQL = "SELECT id,filename FROM files WHERE loc_id=".$id;
$files=$db->query($strSQL);
if ($file=$files->fetchArray()) {
echo "<img src='../images/".$file['filename']."' style='width:200px'>";
}
echo "</td>";
echo "<td>".$row['road']." ".$row['house_number']."<br>".$row['neighbourhood']."<br>"
.$row['hamlet']."<br>".$row['suburb']."<br>".$row['postcode']." ".$row['city']."</td>";
//echo "<td>".round($row['lat'],5)." ".round($row['lng'],5)."</td>";
echo "<td><div class='tdmap' id='map_".$id."'></div></td>\n";
echo "</tr>\n";
$strScript.="var mymap_".$id." = L.map(map_".$id.").setView([".$row['lat'].", ".$row['lng']."], 16);\n";
$strScript.="L.tileLayer(url, {maxZoom: 18,minZoom:12,attribution: attribution,id: 'mapbox/streets-v11',tileSize: 512,zoomOffset: -1}).addTo(mymap_".$id.")\n";
$strScript.="L.marker([".$row['lat'].", ".$row['lng']."], { icon: infoMarker } ).addTo(mymap_".$id.")\n\n";
}
?>
</tbody>
</table>
<a class="btn btn-primary" href="../index.php?ref=1">zurück</a>
</div>
</body>
<script>
$( document ).ready(function() {
var url = 'https://api.mapbox.com/styles/v1/{id}/tiles/{z}/{x}/{y}?access_token=pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpejY4NXVycTA2emYycXBndHRqcmZ3N3gifQ.rJcFIG214AriISLbB6B5aw';
var attribution = 'Map data &copy; <a href="https://www.openstreetmap.org/">OpenStreetMap</a> contributors, ' +
'<a href="https://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, ' +
'Imagery © <a href="https://www.mapbox.com/">Mapbox</a>';
var infoMarker = L.AwesomeMarkers.icon({icon: 'info', prefix: 'fa', markerColor: 'orange'});
<?= $strScript ?>
});
</script>
</html>

Binary file not shown.

Binary file not shown.

Binary file not shown.

@ -0,0 +1,123 @@
<?php
// Query
$dbFilename="../db/locations.db";
require ("../config.php");
$result = $db->query("SELECT * FROM location ORDER BY created_at ASC");
$coords_array = array ();
while ($row = $result->fetchArray(SQLITE3_ASSOC)) {
$coords_array[]=$row;
}
// If no results are found, echo a message and stop
//if ($coords_array == false) { echo "No results"; exit; }
unlink ("shape/ideenmelder.shp");
unlink ("shape/ideenmelder.dbf");
unlink ("shape/ideenmelder.shx");
//unlink ("shape/ideenmelder.dbt");
require_once('../vendor/Shapefile/ShapefileAutoloader.php');
Shapefile\ShapefileAutoloader::register();
// Import classes
use Shapefile\Shapefile;
use Shapefile\ShapefileException;
use Shapefile\ShapefileWriter;
use Shapefile\Geometry\Point;
try {
// Open Shapefile
$Shapefile = new ShapefileWriter('shape/ideenmelder.shp');
// Set shape type
$Shapefile->setShapeType(Shapefile::SHAPE_TYPE_POINT);
// Create field structure
$Shapefile->addNumericField('ID', 10);
$Shapefile->addCharField('DESC');
$Shapefile->addCharField('TOPIC',20);
$Shapefile->addCharField('DEFECT',60);
foreach ($coords_array as $coords) {
//echo "Coords ".$coords['id'].":";print_r($coords);echo "<hr>";
// Create a Point Geometry
$lat=$coords['lat'];
$lon=$coords['lng'];
$Point = new Point($lon,$lat);
// Set its data
$Point->setData('ID', $coords['id']);
$Point->setData('TOPIC', $arrTopic[$coords['topic']]);
$Point->setData('DESC', "Point number ".$coords['id'].":".$coords['description']);
if (!empty($coords['defect'])) {
$Point->setData('DEFECT', $arrDefect[$coords['defect']]);
} else {
$Point->setData('DEFECT',"Keine Angabe");
}
// Write the record to the Shapefile
$Shapefile->writeRecord($Point);
}
// Finalize and close files to use them
$Shapefile = null;
} catch (ShapefileException $e) {
// Print detailed error information
echo "Error Type: " . $e->getErrorType()
. "\nMessage: " . $e->getMessage()
. "\nDetails: " . $e->getDetails();
}
// Get real path for our folder
$rootPath = realpath('shape');
// Initialize archive object
$zip = new ZipArchive();
$filename="shapefile.zip";
$zip->open($filename, ZipArchive::CREATE | ZipArchive::OVERWRITE);
// Create recursive directory iterator
/** @var SplFileInfo[] $files */
$files = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($rootPath),
RecursiveIteratorIterator::LEAVES_ONLY
);
foreach ($files as $name => $file)
{
// Skip directories (they would be added automatically)
if (!$file->isDir())
{
// Get real and relative path for current file
$filePath = $file->getRealPath();
$relativePath = substr($filePath, strlen($rootPath) + 1);
// Add current file to archive
$zip->addFile($filePath, $relativePath);
}
}
// Zip archive will be created only after closing object
$zip->close();
$path=realPath("./");
// http headers for zip downloads
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"".$filename."\"");
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($path."/".$filename));
ob_end_flush();
@readfile($path."/".$filename);

@ -0,0 +1,21 @@
<?php
$dbFilename="../db/locations.db";
require ("../config.php");
if ($boolComment){
$strUsername = htmlentities(trim($_POST['comment_username']));
$strUsername = addslashes($strUsername);
$strComment = htmlentities(trim($_POST['comment']));
$strComment = addslashes($strComment);
$id=(int)$_POST['loc_id'];
$stmt = $db->prepare("INSERT INTO comment (loc_id,username,comment)
VALUES (:loc_id,:username,:comment)");
$stmt->bindValue(':username', $strUsername);
$stmt->bindValue(':comment', $strComment);
$stmt->bindValue(':loc_id', $id);
$stmt->execute();
echo "ok";
}
?>

@ -0,0 +1,90 @@
<?php
$dbFilename="../db/locations.db";
require_once("../config.php");
require_once("../lib/functions.php");
require_once("../lib/geocoding.php");
$strUsername = htmlentities(trim($_POST['username']));
$strUsername = addslashes($strUsername);
$strAge = (isset($_POST['ext_age'])) ? $_POST['ext_age'] : "";
$strTransport = (isset($_POST['ext_transport'])) ? $_POST['ext_transport'] : "";
$strDescription = htmlentities(trim($_POST['description']));
$strDescription = addslashes($strDescription);
$numTopic = (isset($_POST['topic'])) ? $_POST['topic'] : 1;
$numDefect = (isset($_POST['defect'])) ? $_POST['defect'] : 0;
$numLng = $_POST['lng'];
$numLat = $_POST['lat'];
$boolUploadOk=false;
if ($boolUpload && !empty($_FILES['uploadfile']['name'])) {
$uploadfile = $uploaddir . basename($_FILES['uploadfile']['name']);
$fileinfo = @getimagesize($_FILES["uploadfile"]["tmp_name"]);
if (!empty($fileinfo)) {
//$info=read_gps_location($_FILES["uploadfile"]["tmp_name"]);
$i=1;
while (file_exists($uploadfile)) {
$uploadfile=$uploaddir.$i."_".basename($_FILES['uploadfile']['name']);
$i++;
}
if (move_uploaded_file($_FILES['uploadfile']['tmp_name'], $uploadfile)) {
$filename=$_FILES['uploadfile']['name'];
$filesize=$_FILES['uploadfile']['size'];
$filetype=$_FILES['uploadfile']['type'];
//echo "Filetype: ".$filetype;
$boolUploadOk = true;
} else {
die("Upload failed with error code " . $_FILES['file']['error']);
}
}
}
$stmt = $db->prepare("INSERT INTO location (username,age,transport,description,defect,topic,lng,lat)
VALUES (:username,:age,:transport,:description,:defect,:topic,:lng,:lat)");
$stmt->bindValue(':username', $strUsername);
$stmt->bindValue(':age', $strAge);
$stmt->bindValue(':transport', $strTransport);
$stmt->bindValue(':description', $strDescription);
$stmt->bindValue(':topic', $numTopic);
$stmt->bindValue(':lng', $numLng);
$stmt->bindValue(':lat', $numLat);
$stmt->bindValue(':defect', $numDefect);
$stmt->execute();
// fetch last_id - sqlite
$strSQL="SELECT id FROM location ORDER BY id DESC limit 1";
$result = $db->query($strSQL);
if ($row = $result->fetchArray()) {
$id = $row['id'];
}
// Write address data to table address
$data=getAddress($numLat,$numLng);
if ($data) {
writeAddress($db,$id,$data);
}
// Store File Upload
if ($boolUploadOk) {
$strSQL="INSERT INTO files (loc_id,filename,filesize,filetype) VALUES (:loc_id,:filename,:filesize,:filetype)";
$stmt = $db->prepare($strSQL);
$stmt->bindValue(':loc_id',$id);
$stmt->bindValue(':filename',$filename);
$stmt->bindValue(':filesize',$filesize);
$stmt->bindValue(':filetype',$filetype);
$stmt->execute();
}
// Retrun Markertext of entry
$strSQL="SELECT loc.*,f.filename FROM location loc LEFT JOIN files f ON loc.id=f.loc_id ORDER BY loc.id DESC limit 1";
$result = $db->query($strSQL);
if ($row = $result->fetchArray()) {
$markerText=generate_tooltip_description($row);
$markerText=stripcslashes($markerText);
}
echo ($markerText);

@ -0,0 +1,20 @@
<?php
$dbFilename="../db/locations.db";
require_once("../config.php");
$mode = trim($_POST['mode']);
$id = (int)$_POST['id'];
$value = (int)$_POST['value'];
if ($mode=="up") {
$db->exec("UPDATE location SET thumb_ups=thumb_ups+1 WHERE id=".$id);
echo "success";
} elseif ($mode=="down") {
$db->exec("UPDATE location SET thumb_downs=thumb_ups+1 WHERE id=".$id);
echo "success";
} else {
echo "error";
};

@ -0,0 +1,64 @@
<?php
$dbFilename="../db/locations.db";
require_once("../config.php");
require_once("../lib/functions.php");
$strDescription = htmlentities(trim($_POST['description']));
$strDescription = addslashes($strDescription);
$numDefect = (isset($_POST['defect'])) ? $_POST['defect'] : 0;
$id = (int) $_POST['loc_id'];
$filename ="";
$boolUploadOk=false;
if ($boolUpload && isset($_FILES['uploadfile'])) {
$uploadfile = $uploaddir . basename($_FILES['uploadfile']['name']);
$fileinfo = @getimagesize($_FILES["uploadfile"]["tmp_name"]);
if (!empty($fileinfo)) {
//$info=read_gps_location($_FILES["uploadfile"]["tmp_name"]);
$i=1;
while (file_exists($uploadfile)) {
$uploadfile=$uploaddir.$i."_".basename($_FILES['uploadfile']['name']);
$i++;
}
if (move_uploaded_file($_FILES['uploadfile']['tmp_name'], $uploadfile)) {
$filename=$_FILES['uploadfile']['name'];
$filesize=$_FILES['uploadfile']['size'];
$filetype=$_FILES['uploadfile']['type'];
//echo "Filetype: ".$filetype;
$boolUploadOk = true;
} else {
die("Upload failed with error code " . $_FILES['file']['error']);
}
}
}
$stmt = $db->prepare("UPDATE location SET description= :description, defect = :defect WHERE id= :id");
$stmt->bindValue(':description', $strDescription);
$stmt->bindValue(':defect', $numDefect);
$stmt->bindValue(':id', $id);
$r=$stmt->execute();
// Store File Upload
if ($boolUploadOk) {
$strSQL="INSERT INTO files (loc_id,filename,filesize,filetype) VALUES (:loc_id,:filename,:filesize,:filetype)";
$stmt = $db->prepare($strSQL);
$stmt->bindValue(':loc_id',$id);
$stmt->bindValue(':filename',$filename);
$stmt->bindValue(':filesize',$filesize);
$stmt->bindValue(':filetype',$filetype);
$stmt->execute();
}
$result = array(
"id" => $id,
"description" => stripshlashes(nl2br($strDescription)),
"defect" => $arrDefect[$numDefect],
"filename" => $filename,
);
echo json_encode($result);

@ -0,0 +1,161 @@
<?php
/** *****************************
* Ideenmelder
* Autor: Walter Hupfeld, Hamm
* E-Mail: info@hupfeld-software.de
* Version: 1.0
* Datum: 18.05.2021
******************************** */
date_default_timezone_set('UTC');
if (!isset($dbFilename)) {
$dbFilename = "db/locations.db";
}
$db = new SQLite3($dbFilename);
$strSQL="select * from config";
$result = $db->query($strSQL);
while ($row = $result->fetchArray(SQLITE3_ASSOC)) {
switch ($row['key']) {
case "uploaddir" :
$uploaddir=$row['value'];
break;
case "stadt" :
$strStadt=$row['value'];
break;
case "title" :
$strTitle=$row['value'];
break;
case "fileGeojson":
$fileGeojson=$row['value'];
break;
case "InfoLat":
$numInfoLat=$row['value'];
break;
case "InfoLng":
$numInfoLng=$row['value'];
break;
case "zoom":
$numZoom=$row['value'];
break;
case "logo":
$strLogo=$row['value'];
break;
case "contactEmail":
$contactEmail =$row['value'];
break;
case "impressum":
$strImpressum =$row['value'];
break;
case "url":
$strUrl =$row['value'];
break;
case "UrlBez":
$strUrlBez =$row['value'];
break;
case "IntroText":
$strIntroText=$row['value'];
break;
case "boolActive":
$boolActive = ($row['value']=="1");
break;
case "boolRating":
$boolRating = ($row['value']=="1");
break;
case "boolComment":
$boolComment = ($row['value']=="1");
break;
case "boolUpload":
$boolUpload = ($row['value']=="1");
break;
case "boolDefect":
$boolDefect = ($row['value']=="1");
break;
case "boolUserinfo":
$boolUserinfo = ($row['value']=="1");
break;
default:
echo "Fehler bei ".$row['key'];
// Ende Lokalisierung
break;
}
}
$arrTopic = array (
2 => "Radverkehr",
1 => "Fußverkehr",
3 => "Bus und Bahn",
// 4 => "Pkw-Verkehr",
// 5 => "Lkw-Verkehr"
);
$arrMarkerType = array (
1=>"pedestrianMarker",
2=>"bicycleMarker",
3=>"trainMarker",
4=>"carMarker",
5=>"truckMarker",
);
$arrAge = array (
1 => "keine Angabe",
2 => "bis 14 Jahre",
3 => "15-17 Jahre",
4 => "18-25 Jahre",
5 => "25-39 Jahre",
6 => "40-64 Jahre",
7 => "65 Jahre und älter",
);
$arrDefect = array (
0 => "Keine Angabe",
1 => "Abrupt endender Radweg",
2 => "Buckelpiste",
3 => "Gefährliche Gleise/Schienen",
4 => "Gehweg/Fahrräder frei",
5 => "Falschparker",
6 => "Fehlende Abstellmöglichkeiten",
7 => "Fehlende Radwege",
8 => "Fehlender Abstellbereich",
9 => "Fehlender taktiler Sicherheitstrennstreifen",
10 => "Fehlende Fahrbahnüberleitung",
11 => "Hindernisse auf Radwegen",
12 => "Mangelhafte Radwegmarkierung/kennzeichnung",
13 => "Mögliche grüne Pfeile für Radfahrende",
14 => "Probleme beim Abbiegen",
15 => "Ungenügende Ampelschaltung",
16 => "Ungenügende Bordsteinabsenkung",
17 => "Ungenügender Sicherheitsabstand",
18 => "Ungenügende Wegbreite/Engstellen",
19 => "Unsichere/fehlende Querungsmöglichkeit",
20 => "Unklare Radwegsituation",
21 => "Station für Leihräder",
22 => "Ampelspiegel installieren"
);
$arrTransport = array (
0 => "keine Angabe",
1 => "kein Auto",
2 => "Auto",
3 => "Motorroller/Motorrad",
4 => "Bus/Bahn",
5 => "Fahrrad",
6 => "Zu Fuß"
);
$arrIcon = array (
1 => "<i class='wa bg-info fa fa-male'></i>",
2 => "<i class='wa bg-success fa fa-bicycle'></i>",
3 => "<i class='wa bg-primary fa fa-bus'></i>",
4 => "<i class='wa bg-danger fa fa-car'></i>",
5 => "<i class='wa bg-warning fa fa-truck'></i>"
);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -0,0 +1,110 @@
.feather {
width: 16px;
height: 16px;
vertical-align: text-bottom;
}
/*
* Sidebar
*/
.sidebar {
position: fixed;
top: 0;
bottom: 0;
left: 0;
z-index: 100;
/* Behind the navbar */
padding: 48px 0 0;
/* Height of navbar */
box-shadow: inset -1px 0 0 rgba(0, 0, 0, .1);
}
.sidebar-sticky {
position: relative;
top: 0;
height: calc(100vh - 48px);
padding-top: .5rem;
overflow-x: hidden;
overflow-y: auto;
/* Scrollable contents if viewport is shorter than content. */
}
@supports ((position: -webkit-sticky) or (position: sticky)) {
.sidebar-sticky {
position: -webkit-sticky;
position: sticky;
}
}
.sidebar .nav-link {
font-weight: 500;
color: #333;
}
.sidebar .nav-link .feather {
margin-right: 4px;
color: #999;
}
.sidebar .nav-link.active {
color: #007bff;
}
.sidebar .nav-link:hover .feather,
.sidebar .nav-link.active .feather {
color: inherit;
}
.sidebar-heading {
font-size: .75rem;
text-transform: uppercase;
}
/*
* Content
*/
[role="main"] {
padding-top: 133px;
/* Space for fixed navbar */
}
@media (min-width: 768px) {
[role="main"] {
padding-top: 48px;
/* Space for fixed navbar */
}
}
/*
* Navbar
*/
.navbar-brand {
padding-top: .75rem;
padding-bottom: .75rem;
font-size: 1rem;
background-color: rgba(0, 0, 0, .25);
box-shadow: inset -1px 0 0 rgba(0, 0, 0, .25);
}
.navbar .form-control {
padding: .75rem 1rem;
border-width: 0;
border-radius: 0;
}
.form-control-dark {
color: #fff;
background-color: rgba(255, 255, 255, .1);
border-color: rgba(255, 255, 255, .1);
}
.form-control-dark:focus {
border-color: transparent;
box-shadow: 0 0 0 3px rgba(255, 255, 255, .25);
}

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 280 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 696 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 618 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 535 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 162 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

@ -0,0 +1,137 @@
/*
Author: L. Voogdt
License: MIT
Version: 1.0
*/
/* Marker setup */
.awesome-marker {
background: url('images/markers-soft.png') no-repeat 0 0;
width: 35px;
height: 46px;
position: absolute;
left: 0;
top: 0;
display: block;
text-align: center;
}
.awesome-marker-shadow {
background: url('images/markers-shadow.png') no-repeat 0 0;
width: 36px;
height: 16px;
}
/* Retina displays */
@media (min--moz-device-pixel-ratio: 1.5),
(-o-min-device-pixel-ratio: 3/2),
(-webkit-min-device-pixel-ratio: 1.5),
(min-device-pixel-ratio: 1.5),
(min-resolution: 1.5dppx) {
.awesome-marker {
background-image: url('images/markers-soft@2x.png');
background-size: 720px 92px;
}
.awesome-marker-shadow {
background-image: url('images/markers-shadow@2x.png');
background-size: 35px 16px;
}
}
.awesome-marker i {
color: #333;
margin-top: 10px;
display: inline-block;
font-size: 14px;
}
.awesome-marker .icon-white {
color: #fff;
}
/* Colors */
.awesome-marker-icon-red {
background-position: 0 0;
}
.awesome-marker-icon-darkred {
background-position: -180px 0;
}
.awesome-marker-icon-lightred {
background-position: -360px 0;
}
.awesome-marker-icon-orange {
background-position: -36px 0;
}
.awesome-marker-icon-beige {
background-position: -396px 0;
}
.awesome-marker-icon-green {
background-position: -72px 0;
}
.awesome-marker-icon-darkgreen {
background-position: -252px 0;
}
.awesome-marker-icon-lightgreen {
background-position: -432px 0;
}
.awesome-marker-icon-blue {
background-position: -108px 0;
}
.awesome-marker-icon-darkblue {
background-position: -216px 0;
}
.awesome-marker-icon-lightblue {
background-position: -468px 0;
}
.awesome-marker-icon-purple {
background-position: -144px 0;
}
.awesome-marker-icon-darkpurple {
background-position: -288px 0;
}
.awesome-marker-icon-pink {
background-position: -504px 0;
}
.awesome-marker-icon-cadetblue {
background-position: -324px 0;
}
.awesome-marker-icon-white {
background-position: -574px 0;
}
.awesome-marker-icon-gray {
background-position: -648px 0;
}
.awesome-marker-icon-lightgray {
background-position: -612px 0;
}
.awesome-marker-icon-black {
background-position: -682px 0;
}
.awesome-marker-square {
background-position-y: -46px;
}

@ -0,0 +1,640 @@
/* required styles */
.leaflet-pane,
.leaflet-tile,
.leaflet-marker-icon,
.leaflet-marker-shadow,
.leaflet-tile-container,
.leaflet-pane > svg,
.leaflet-pane > canvas,
.leaflet-zoom-box,
.leaflet-image-layer,
.leaflet-layer {
position: absolute;
left: 0;
top: 0;
}
.leaflet-container {
overflow: hidden;
}
.leaflet-tile,
.leaflet-marker-icon,
.leaflet-marker-shadow {
-webkit-user-select: none;
-moz-user-select: none;
user-select: none;
-webkit-user-drag: none;
}
/* Prevents IE11 from highlighting tiles in blue */
.leaflet-tile::selection {
background: transparent;
}
/* Safari renders non-retina tile on retina better with this, but Chrome is worse */
.leaflet-safari .leaflet-tile {
image-rendering: -webkit-optimize-contrast;
}
/* hack that prevents hw layers "stretching" when loading new tiles */
.leaflet-safari .leaflet-tile-container {
width: 1600px;
height: 1600px;
-webkit-transform-origin: 0 0;
}
.leaflet-marker-icon,
.leaflet-marker-shadow {
display: block;
}
/* .leaflet-container svg: reset svg max-width decleration shipped in Joomla! (joomla.org) 3.x */
/* .leaflet-container img: map is broken in FF if you have max-width: 100% on tiles */
.leaflet-container .leaflet-overlay-pane svg,
.leaflet-container .leaflet-marker-pane img,
.leaflet-container .leaflet-shadow-pane img,
.leaflet-container .leaflet-tile-pane img,
.leaflet-container img.leaflet-image-layer,
.leaflet-container .leaflet-tile {
max-width: none !important;
max-height: none !important;
}
.leaflet-container.leaflet-touch-zoom {
-ms-touch-action: pan-x pan-y;
touch-action: pan-x pan-y;
}
.leaflet-container.leaflet-touch-drag {
-ms-touch-action: pinch-zoom;
/* Fallback for FF which doesn't support pinch-zoom */
touch-action: none;
touch-action: pinch-zoom;
}
.leaflet-container.leaflet-touch-drag.leaflet-touch-zoom {
-ms-touch-action: none;
touch-action: none;
}
.leaflet-container {
-webkit-tap-highlight-color: transparent;
}
.leaflet-container a {
-webkit-tap-highlight-color: rgba(51, 181, 229, 0.4);
}
.leaflet-tile {
filter: inherit;
visibility: hidden;
}
.leaflet-tile-loaded {
visibility: inherit;
}
.leaflet-zoom-box {
width: 0;
height: 0;
-moz-box-sizing: border-box;
box-sizing: border-box;
z-index: 800;
}
/* workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=888319 */
.leaflet-overlay-pane svg {
-moz-user-select: none;
}
.leaflet-pane { z-index: 400; }
.leaflet-tile-pane { z-index: 200; }
.leaflet-overlay-pane { z-index: 400; }
.leaflet-shadow-pane { z-index: 500; }
.leaflet-marker-pane { z-index: 600; }
.leaflet-tooltip-pane { z-index: 650; }
.leaflet-popup-pane { z-index: 700; }
.leaflet-map-pane canvas { z-index: 100; }
.leaflet-map-pane svg { z-index: 200; }
.leaflet-vml-shape {
width: 1px;
height: 1px;
}
.lvml {
behavior: url(#default#VML);
display: inline-block;
position: absolute;
}
/* control positioning */
.leaflet-control {
position: relative;
z-index: 800;
pointer-events: visiblePainted; /* IE 9-10 doesn't have auto */
pointer-events: auto;
}
.leaflet-top,
.leaflet-bottom {
position: absolute;
z-index: 1000;
pointer-events: none;
}
.leaflet-top {
top: 0;
}
.leaflet-right {
right: 0;
}
.leaflet-bottom {
bottom: 0;
}
.leaflet-left {
left: 0;
}
.leaflet-control {
float: left;
clear: both;
}
.leaflet-right .leaflet-control {
float: right;
}
.leaflet-top .leaflet-control {
margin-top: 10px;
}
.leaflet-bottom .leaflet-control {
margin-bottom: 10px;
}
.leaflet-left .leaflet-control {
margin-left: 10px;
}
.leaflet-right .leaflet-control {
margin-right: 10px;
}
/* zoom and fade animations */
.leaflet-fade-anim .leaflet-tile {
will-change: opacity;
}
.leaflet-fade-anim .leaflet-popup {
opacity: 0;
-webkit-transition: opacity 0.2s linear;
-moz-transition: opacity 0.2s linear;
transition: opacity 0.2s linear;
}
.leaflet-fade-anim .leaflet-map-pane .leaflet-popup {
opacity: 1;
}
.leaflet-zoom-animated {
-webkit-transform-origin: 0 0;
-ms-transform-origin: 0 0;
transform-origin: 0 0;
}
.leaflet-zoom-anim .leaflet-zoom-animated {
will-change: transform;
}
.leaflet-zoom-anim .leaflet-zoom-animated {
-webkit-transition: -webkit-transform 0.25s cubic-bezier(0,0,0.25,1);
-moz-transition: -moz-transform 0.25s cubic-bezier(0,0,0.25,1);
transition: transform 0.25s cubic-bezier(0,0,0.25,1);
}
.leaflet-zoom-anim .leaflet-tile,
.leaflet-pan-anim .leaflet-tile {
-webkit-transition: none;
-moz-transition: none;
transition: none;
}
.leaflet-zoom-anim .leaflet-zoom-hide {
visibility: hidden;
}
/* cursors */
.leaflet-interactive {
cursor: pointer;
}
.leaflet-grab {
cursor: -webkit-grab;
cursor: -moz-grab;
cursor: grab;
}
.leaflet-crosshair,
.leaflet-crosshair .leaflet-interactive {
cursor: crosshair;
}
.leaflet-popup-pane,
.leaflet-control {
cursor: auto;
}
.leaflet-dragging .leaflet-grab,
.leaflet-dragging .leaflet-grab .leaflet-interactive,
.leaflet-dragging .leaflet-marker-draggable {
cursor: move;
cursor: -webkit-grabbing;
cursor: -moz-grabbing;
cursor: grabbing;
}
/* marker & overlays interactivity */
.leaflet-marker-icon,
.leaflet-marker-shadow,
.leaflet-image-layer,
.leaflet-pane > svg path,
.leaflet-tile-container {
pointer-events: none;
}
.leaflet-marker-icon.leaflet-interactive,
.leaflet-image-layer.leaflet-interactive,
.leaflet-pane > svg path.leaflet-interactive,
svg.leaflet-image-layer.leaflet-interactive path {
pointer-events: visiblePainted; /* IE 9-10 doesn't have auto */
pointer-events: auto;
}
/* visual tweaks */
.leaflet-container {
background: #ddd;
outline: 0;
}
.leaflet-container a {
color: #0078A8;
}
.leaflet-container a.leaflet-active {
outline: 2px solid orange;
}
.leaflet-zoom-box {
border: 2px dotted #38f;
background: rgba(255,255,255,0.5);
}
/* general typography */
.leaflet-container {
font: 12px/1.5 "Helvetica Neue", Arial, Helvetica, sans-serif;
}
/* general toolbar styles */
.leaflet-bar {
box-shadow: 0 1px 5px rgba(0,0,0,0.65);
border-radius: 4px;
}
.leaflet-bar a,
.leaflet-bar a:hover {
background-color: #fff;
border-bottom: 1px solid #ccc;
width: 26px;
height: 26px;
line-height: 26px;
display: block;
text-align: center;
text-decoration: none;
color: black;
}
.leaflet-bar a,
.leaflet-control-layers-toggle {
background-position: 50% 50%;
background-repeat: no-repeat;
display: block;
}
.leaflet-bar a:hover {
background-color: #f4f4f4;
}
.leaflet-bar a:first-child {
border-top-left-radius: 4px;
border-top-right-radius: 4px;
}
.leaflet-bar a:last-child {
border-bottom-left-radius: 4px;
border-bottom-right-radius: 4px;
border-bottom: none;
}
.leaflet-bar a.leaflet-disabled {
cursor: default;
background-color: #f4f4f4;
color: #bbb;
}
.leaflet-touch .leaflet-bar a {
width: 30px;
height: 30px;
line-height: 30px;
}
.leaflet-touch .leaflet-bar a:first-child {
border-top-left-radius: 2px;
border-top-right-radius: 2px;
}
.leaflet-touch .leaflet-bar a:last-child {
border-bottom-left-radius: 2px;
border-bottom-right-radius: 2px;
}
/* zoom control */
.leaflet-control-zoom-in,
.leaflet-control-zoom-out {
font: bold 18px 'Lucida Console', Monaco, monospace;
text-indent: 1px;
}
.leaflet-touch .leaflet-control-zoom-in, .leaflet-touch .leaflet-control-zoom-out {
font-size: 22px;
}
/* layers control */
.leaflet-control-layers {
box-shadow: 0 1px 5px rgba(0,0,0,0.4);
background: #fff;
border-radius: 5px;
}
.leaflet-control-layers-toggle {
background-image: url(images/layers.png);
width: 36px;
height: 36px;
}
.leaflet-retina .leaflet-control-layers-toggle {
background-image: url(images/layers-2x.png);
background-size: 26px 26px;
}
.leaflet-touch .leaflet-control-layers-toggle {
width: 44px;
height: 44px;
}
.leaflet-control-layers .leaflet-control-layers-list,
.leaflet-control-layers-expanded .leaflet-control-layers-toggle {
display: none;
}
.leaflet-control-layers-expanded .leaflet-control-layers-list {
display: block;
position: relative;
}
.leaflet-control-layers-expanded {
padding: 6px 10px 6px 6px;
color: #333;
background: #fff;
}
.leaflet-control-layers-scrollbar {
overflow-y: scroll;
overflow-x: hidden;
padding-right: 5px;
}
.leaflet-control-layers-selector {
margin-top: 2px;
position: relative;
top: 1px;
}
.leaflet-control-layers label {
display: block;
}
.leaflet-control-layers-separator {
height: 0;
border-top: 1px solid #ddd;
margin: 5px -10px 5px -6px;
}
/* Default icon URLs */
.leaflet-default-icon-path {
background-image: url(images/marker-icon.png);
}
/* attribution and scale controls */
.leaflet-container .leaflet-control-attribution {
background: #fff;
background: rgba(255, 255, 255, 0.7);
margin: 0;
}
.leaflet-control-attribution,
.leaflet-control-scale-line {
padding: 0 5px;
color: #333;
}
.leaflet-control-attribution a {
text-decoration: none;
}
.leaflet-control-attribution a:hover {
text-decoration: underline;
}
.leaflet-container .leaflet-control-attribution,
.leaflet-container .leaflet-control-scale {
font-size: 11px;
}
.leaflet-left .leaflet-control-scale {
margin-left: 5px;
}
.leaflet-bottom .leaflet-control-scale {
margin-bottom: 5px;
}
.leaflet-control-scale-line {
border: 2px solid #777;
border-top: none;
line-height: 1.1;
padding: 2px 5px 1px;
font-size: 11px;
white-space: nowrap;
overflow: hidden;
-moz-box-sizing: border-box;
box-sizing: border-box;
background: #fff;
background: rgba(255, 255, 255, 0.5);
}
.leaflet-control-scale-line:not(:first-child) {
border-top: 2px solid #777;
border-bottom: none;
margin-top: -2px;
}
.leaflet-control-scale-line:not(:first-child):not(:last-child) {
border-bottom: 2px solid #777;
}
.leaflet-touch .leaflet-control-attribution,
.leaflet-touch .leaflet-control-layers,
.leaflet-touch .leaflet-bar {
box-shadow: none;
}
.leaflet-touch .leaflet-control-layers,
.leaflet-touch .leaflet-bar {
border: 2px solid rgba(0,0,0,0.2);
background-clip: padding-box;
}
/* popup */
.leaflet-popup {
position: absolute;
text-align: center;
margin-bottom: 20px;
}
.leaflet-popup-content-wrapper {
padding: 1px;
text-align: left;
border-radius: 12px;
}
.leaflet-popup-content {
margin: 13px 19px;
line-height: 1.4;
}
.leaflet-popup-content p {
margin: 18px 0;
}
.leaflet-popup-tip-container {
width: 40px;
height: 20px;
position: absolute;
left: 50%;
margin-left: -20px;
overflow: hidden;
pointer-events: none;
}
.leaflet-popup-tip {
width: 17px;
height: 17px;
padding: 1px;
margin: -10px auto 0;
-webkit-transform: rotate(45deg);
-moz-transform: rotate(45deg);
-ms-transform: rotate(45deg);
transform: rotate(45deg);
}
.leaflet-popup-content-wrapper,
.leaflet-popup-tip {
background: white;
color: #333;
box-shadow: 0 3px 14px rgba(0,0,0,0.4);
}
.leaflet-container a.leaflet-popup-close-button {
position: absolute;
top: 0;
right: 0;
padding: 4px 4px 0 0;
border: none;
text-align: center;
width: 18px;
height: 14px;
font: 16px/14px Tahoma, Verdana, sans-serif;
color: #c3c3c3;
text-decoration: none;
font-weight: bold;
background: transparent;
}
.leaflet-container a.leaflet-popup-close-button:hover {
color: #999;
}
.leaflet-popup-scrolled {
overflow: auto;
border-bottom: 1px solid #ddd;
border-top: 1px solid #ddd;
}
.leaflet-oldie .leaflet-popup-content-wrapper {
zoom: 1;
}
.leaflet-oldie .leaflet-popup-tip {
width: 24px;
margin: 0 auto;
-ms-filter: "progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)";
filter: progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678);
}
.leaflet-oldie .leaflet-popup-tip-container {
margin-top: -1px;
}
.leaflet-oldie .leaflet-control-zoom,
.leaflet-oldie .leaflet-control-layers,
.leaflet-oldie .leaflet-popup-content-wrapper,
.leaflet-oldie .leaflet-popup-tip {
border: 1px solid #999;
}
/* div icon */
.leaflet-div-icon {
background: #fff;
border: 1px solid #666;
}
/* Tooltip */
/* Base styles for the element that has a tooltip */
.leaflet-tooltip {
position: absolute;
padding: 6px;
background-color: #fff;
border: 1px solid #fff;
border-radius: 3px;
color: #222;
white-space: nowrap;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
pointer-events: none;
box-shadow: 0 1px 3px rgba(0,0,0,0.4);
}
.leaflet-tooltip.leaflet-clickable {
cursor: pointer;
pointer-events: auto;
}
.leaflet-tooltip-top:before,
.leaflet-tooltip-bottom:before,
.leaflet-tooltip-left:before,
.leaflet-tooltip-right:before {
position: absolute;
pointer-events: none;
border: 6px solid transparent;
background: transparent;
content: "";
}
/* Directions */
.leaflet-tooltip-bottom {
margin-top: 6px;
}
.leaflet-tooltip-top {
margin-top: -6px;
}
.leaflet-tooltip-bottom:before,
.leaflet-tooltip-top:before {
left: 50%;
margin-left: -6px;
}
.leaflet-tooltip-top:before {
bottom: 0;
margin-bottom: -12px;
border-top-color: #fff;
}
.leaflet-tooltip-bottom:before {
top: 0;
margin-top: -12px;
margin-left: -6px;
border-bottom-color: #fff;
}
.leaflet-tooltip-left {
margin-left: -6px;
}
.leaflet-tooltip-right {
margin-left: 6px;
}
.leaflet-tooltip-left:before,
.leaflet-tooltip-right:before {
top: 50%;
margin-top: -6px;
}
.leaflet-tooltip-left:before {
right: 0;
margin-right: -12px;
border-left-color: #fff;
}
.leaflet-tooltip-right:before {
left: 0;
margin-left: -12px;
border-right-color: #fff;
}

@ -0,0 +1,204 @@
body.lb-disable-scrolling {
overflow: hidden;
}
.lightboxOverlay {
position: absolute;
top: 0;
left: 0;
z-index: 9999;
background-color: black;
filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=80);
opacity: 0.8;
display: none;
}
.lightbox {
position: absolute;
left: 0;
width: 100%;
z-index: 10000;
text-align: center;
line-height: 0;
font-weight: normal;
outline: none;
}
.lightbox .lb-image {
display: block;
height: auto;
max-width: inherit;
max-height: none;
border-radius: 3px;
/* Image border */
border: 4px solid white;
}
.lightbox a img {
border: none;
}
.lb-outerContainer {
position: relative;
*zoom: 1;
width: 250px;
height: 250px;
margin: 0 auto;
border-radius: 4px;
/* Background color behind image.
This is visible during transitions. */
background-color: white;
}
.lb-outerContainer:after {
content: "";
display: table;
clear: both;
}
.lb-loader {
position: absolute;
top: 43%;
left: 0;
height: 25%;
width: 100%;
text-align: center;
line-height: 0;
}
.lb-cancel {
display: block;
width: 32px;
height: 32px;
margin: 0 auto;
background: url(images/loading.gif) no-repeat;
}
.lb-nav {
position: absolute;
top: 0;
left: 0;
height: 100%;
width: 100%;
z-index: 10;
}
.lb-container > .nav {
left: 0;
}
.lb-nav a {
outline: none;
background-image: url('data:image/gif;base64,R0lGODlhAQABAPAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==');
}
.lb-prev, .lb-next {
height: 100%;
cursor: pointer;
display: block;
}
.lb-nav a.lb-prev {
width: 34%;
left: 0;
float: left;
background: url(images/prev.png) left 48% no-repeat;
filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);
opacity: 0;
-webkit-transition: opacity 0.6s;
-moz-transition: opacity 0.6s;
-o-transition: opacity 0.6s;
transition: opacity 0.6s;
}
.lb-nav a.lb-prev:hover {
filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);
opacity: 1;
}
.lb-nav a.lb-next {
width: 64%;
right: 0;
float: right;
background: url(images/next.png) right 48% no-repeat;
filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);
opacity: 0;
-webkit-transition: opacity 0.6s;
-moz-transition: opacity 0.6s;
-o-transition: opacity 0.6s;
transition: opacity 0.6s;
}
.lb-nav a.lb-next:hover {
filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);
opacity: 1;
}
.lb-dataContainer {
margin: 0 auto;
padding-top: 5px;
*zoom: 1;
width: 100%;
border-bottom-left-radius: 4px;
border-bottom-right-radius: 4px;
}
.lb-dataContainer:after {
content: "";
display: table;
clear: both;
}
.lb-data {
padding: 0 4px;
color: #ccc;
}
.lb-data .lb-details {
width: 85%;
float: left;
text-align: left;
line-height: 1.1em;
}
.lb-data .lb-caption {
font-size: 13px;
font-weight: bold;
line-height: 1em;
}
.lb-data .lb-caption a {
color: #4ae;
}
.lb-data .lb-number {
display: block;
clear: left;
padding-bottom: 1em;
font-size: 12px;
color: #999999;
}
.lb-data .lb-close {
display: block;
float: right;
width: 30px;
height: 30px;
background: url(images/close.png) top right no-repeat;
text-align: right;
outline: none;
filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=70);
opacity: 0.7;
-webkit-transition: opacity 0.2s;
-moz-transition: opacity 0.2s;
-o-transition: opacity 0.2s;
transition: opacity 0.2s;
}
.lb-data .lb-close:hover {
cursor: pointer;
filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);
opacity: 1;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

@ -0,0 +1,95 @@
body {
font-family: arial, helvetica, sans-serif;
}
.main {
margin-top: 4em;
}
.logo {
width: 180px;
background-color: white;
margin: 1em 0 2em 2em;
text-align: center;
}
.small {
size: smaller;
}
#mapid {
margin-top: 5px;
max-height: 1600px;
min-height: 100vH;
}
#dialog {
display: none;
position: absolute;
top: 30px;
left: 40px;
width: 500px;
z-index: 1200;
background-color: #fff;
}
#dialog_comment {
display: none;
position: absolute;
top: 300px;
left: 400px;
width: 500px;
z-index: 1200;
background-color: #fff;
}
#comment {
width:28em;
height:10em;
}
#description {
width: 28em;
height: 10em;
}
.comment {
border-top: 1px solid darkgrey;
padding: 3px 0 3px 0;
}
#hint {
color: red;
font-weight: bold;
text-align: right;
}
label {
margin-left: 0.4em;
margin-top:0.2em;
}
.dialog-list {
list-style-type: none;
padding-left: 0px;
}
i.wa {
display: inline-block;
border-radius: 60px;
box-shadow: 0px 0px 2px #888;
padding: 0.5em 0.6em;
color: white;
width: 2.1em;
text-align: center;
}
#loader {
position: fixed; /* or absolute */
top: 50%;
left: 50%;
z-index: 1000;
display:none;
}

@ -0,0 +1,125 @@
<!DOCTYPE html>
<?php require_once("config.php") ?>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="author" content="Walter Hupfeld, info@hupfeld-software.de">
<meta name="description" content="Georeferenzieter Ideenmelder">
<title>Datenschutzerklärung</title>
<link rel="stylesheet" href="css/bootstrap.min.css" />
<link rel="stylesheet" href="css/style.css" />
</head>
<body>
<!-- Navbar -->
<nav class="navbar navbar-expand-md navbar-dark bg-dark fixed-top">
<a class="navbar-brand" href="#"><?= $strTitle ?></a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbars" aria-controls="navbars" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbars">
<ul class="navbar-nav mr-auto">
<li class="nav-item">
<a class="nav-link" href="index.php?ref=1">Karte </a>
</li>
<li class="nav-item">
<a class="nav-link" href="liste.php">Liste</a>
</li>
</ul>
<div>
<ul class="navbar-nav mr-auto right">
<li class="nav-item">
<a class="nav-link" href="impressum.php">Impressum</a>
</li>
<li class="nav-item active">
<a class="nav-link" href="datenschutz.php">Datenschutzerklärung <span class="sr-only">(current)</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="admin/login.php">Login</a>
</li>
</ul>
</div>
</nav>
<!-- Ende Navbar -->
<div class="container main">
<p>&nbsp;</p>
<div class="card">
<div class="card-header"><h2>Datenschutzerklärung</h2></div>
<div class="card-body">
<h3>Datenschutz</h3>
<p>Die Betreiber dieser Seiten nehmenden Schutz Ihrer persönlichen Daten sehr ernst.
Wir behandeln Ihre personenbezogenen Daten vertraulich und entsprechend der gesetzlichen
Datenschutzvorschriften sowie dieser Datenschutzerklärung.</p>
<p>Die Nutzung unserer Website ist in der Regel ohne Angabe personenbezogener Daten möglich.
Soweit auf unseren Seiten den Namen als personenbezogenes Datum
erhoben, erfolgt dies auf freiwilliger Basis. Diese Daten werden
ohne Ihre ausdrückliche Zustimmung nicht an Dritte weitergegeben.</p>
<p>Wir weisen darauf hin, dass die Datenübertragung im Internet (z.B. bei der Kommunikation
per E-Mail) Sicherheitslücken aufweisen kann. Ein lückenloser Schutz der Daten vor dem Zugriff
durch Dritte ist nicht möglich.
<h3>Cookies</h3>
<p>Die Internetseiten verwenden teilweise so genannte Cookies. Cookies richten auf Ihrem Rechner
keinen Schaden an und enthalten keine Viren. Cookies dienen dazu, unser Angebot nutzerfreundlicher,
effektiver und sicherer zu machen. Cookies sind kleine Textdateien, die auf Ihrem Rechner abgelegt
werden und die Ihr Browser speichert.</p>
<p>Die meisten der von uns verwendeten Cookies sind so genannte „Session-Cookies“. Sie werden nach
Ende Ihres Besuchs automatisch gelöscht. Andere Cookies bleiben auf Ihrem Endgerät gespeichert,
bis Sie diese löschen. Diese Cookies ermöglichen es uns, Ihren Browser beim nächsten Besuch wiederzuerkennen.</p>
<p>Sie können Ihren Browser so einstellen, dass Sie über das Setzen von Cookies informiert werden
und Cookies nur im Einzelfall erlauben, die Annahme von Cookies für bestimmte Fälle oder generell
ausschließen sowie das automatische Löschen der Cookies beim Schließen des Browser aktivieren.
Bei der Deaktivierung von Cookies kann die Funktionalität dieser Website eingeschränkt sein.</p>
<h3>Server-Log-Files</h3>
Der Provider der Seiten erhebt und speichert automatisch Informationen in so genannten Server-Log Files, die Ihr
Browser automatisch an uns übermittelt. Dies sind:
<ul>
<li>Browsertyp und Browserversion</li>
<li>verwendetes Betriebssystem</li>
<li>Referrer URL</li>
<li>Hostname des zugreifenden Rechners</li>
<li>Uhrzeit der Serveranfrage</li>
</ul>
<p>Diese Daten sind nicht bestimmten Personen zuordenbar. Eine Zusammenführung dieser Daten mit anderen
Datenquellen wird nicht vorgenommen. Wir behalten uns vor, diese Daten nachträglich zu prüfen,
wenn uns konkrete Anhaltspunkte für eine rechtswidrige Nutzung bekannt werden.
<H3>SSL-Verschlüsselung</H3>
<p>Diese Seite nutzt aus Gründen der Sicherheit und zum Schutz der Übertragung vertraulicher Inhalte, wie zum
Beispiel der Anfragen, die Sie an uns als Seitenbetreiber senden, eine SSL-Verschlüsselung. Eine verschlüsselte
Verbindung erkennen Sie daran, dass die Adresszeile des Browsers von „http:“ auf „https:“ wechselt und an dem
Schloss-Symbol in Ihrer Browserzeile.</p>
<p>Wenn die SSL Verschlüsselung aktiviert ist, können die Daten, die Sie an uns übermitteln,
nicht von Dritten mitgelesen werden.</p>
<h3>Recht auf Auskunft, Löschung, Sperrung</h3>
<p>Sie haben jederzeit das Recht auf unentgeltliche Auskunft über Ihre gespeicherten personenbezogenen Daten,
deren Herkunft und Empfänger und den Zweck der Datenverarbeitung sowie ein Recht auf Berichtigung,
Sperrung oder Löschung dieser Daten. Hierzu sowie zu weiteren Fragen zum Thema personenbezogene
Daten können Sie sich jederzeit unter der im Impressum angegebenen Adresse an uns wenden.</p>
<a class="btn btn-primary text-white" href="index.php?ref=1">zurück</a>
</div>
</div>
</div>
</body>
</html>

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 434 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because one or more lines are too long

@ -0,0 +1,731 @@
{
"type": "FeatureCollection",
"features": [{
"type": "Feature",
"geometry": {
"type": "Polygon",
"coordinates": [
[
[7.9975290298462465, 51.674205780029396],
[7.996311664581297, 51.67317199707041],
[7.995364189148061, 51.672756195068345],
[7.992414951324517, 51.67242431640636],
[7.989381313323974, 51.672828674316335],
[7.986564636230466, 51.671131134033246],
[7.984800338745115, 51.67162322998057],
[7.975085258483942, 51.673999786376996],
[7.970993995666559, 51.67494964599608],
[7.966412544250599, 51.67531967163091],
[7.963996410369927, 51.67503356933598],
[7.9625444412232, 51.675098419189496],
[7.961318969726674, 51.675010681152386],
[7.959151268005425, 51.67415237426762],
[7.9571781158448385, 51.673713684082074],
[7.953532695770204, 51.67235946655272],
[7.955656528473012, 51.6690559387208],
[7.953952789306696, 51.66814804077141],
[7.952788829803521, 51.66752624511717],
[7.952577590942495, 51.66637802124034],
[7.952968120574949, 51.66508102417002],
[7.953210830688419, 51.66358566284178],
[7.953660964965876, 51.662521362304616],
[7.954288959503285, 51.66086196899424],
[7.952936649322451, 51.65707778930674],
[7.95256185531616, 51.65523529052744],
[7.950601577758786, 51.65535354614268],
[7.949685096740778, 51.6533203125001],
[7.948393821716307, 51.65340423583984],
[7.946791648864857, 51.64945602416985],
[7.9460177421570375, 51.646991729736314],
[7.949483394622857, 51.64622497558598],
[7.949200153350828, 51.6455345153809],
[7.95039129257202, 51.645278930664105],
[7.9493794441223695, 51.64275360107421],
[7.94864130020147, 51.64146804809569],
[7.947004318237246, 51.640983581542955],
[7.945225238800047, 51.63994598388677],
[7.944381237030083, 51.6381607055664],
[7.94346666336065, 51.63798141479502],
[7.942593574523867, 51.63798904418955],
[7.941351890563962, 51.63801956176751],
[7.940279006958005, 51.638309478759815],
[7.939796447753848, 51.63872909545909],
[7.939628601074217, 51.63926696777342],
[7.93937826156616, 51.639633178710866],
[7.938533306121882, 51.63996124267588],
[7.93798112869274, 51.63997650146495],
[7.936740398406924, 51.639900207519574],
[7.93617343902599, 51.639450073242116],
[7.935684680938832, 51.63915634155266],
[7.935143470764214, 51.63896942138676],
[7.934977531433103, 51.638946533203175],
[7.934688091278075, 51.638904571533246],
[7.934337139129694, 51.6386108398438],
[7.934408664703424, 51.63815689086924],
[7.934702873230092, 51.63781738281255],
[7.935097217559926, 51.63734054565434],
[7.9353079795837385, 51.63685989379893],
[7.9352893829345685, 51.63637542724619],
[7.935229778289793, 51.63579940795903],
[7.935160160064808, 51.63539886474619],
[7.934815883636473, 51.63499069213866],
[7.93470382690441, 51.6345329284669],
[7.934748649597167, 51.63437652587895],
[7.934817790985219, 51.63413238525389],
[7.935148715972898, 51.633968353271584],
[7.935169219970701, 51.63359832763671],
[7.934818267822265, 51.63330459594725],
[7.934040069580076, 51.633258819580064],
[7.933450222015322, 51.63313293457041],
[7.932969570159967, 51.63269424438476],
[7.9325809478760885, 51.63225555419921],
[7.9321560859681295, 51.631645202636705],
[7.9315471649169345, 51.63026809692387],
[7.931262016296498, 51.629570007324205],
[7.930768966674917, 51.62936019897466],
[7.930098533630368, 51.62902832031254],
[7.9293413162232, 51.628612518310646],
[7.928489208221433, 51.6282501220703],
[7.927587985992487, 51.62794494628916],
[7.927009105682427, 51.62762069702153],
[7.927033424377554, 51.62718963623057],
[7.926823139190786, 51.62684249877935],
[7.926057815551814, 51.6265678405761],
[7.925194740295409, 51.626407623291],
[7.924530982971303, 51.6259651184083],
[7.924113750457876, 51.62521362304692],
[7.92415428161621, 51.62450027465819],
[7.923966407775991, 51.623752593994126],
[7.923268318176325, 51.623107910156236],
[7.922383308410586, 51.622516632080185],
[7.921188831329458, 51.62184143066416],
[7.919884204864443, 51.62123489379876],
[7.91935968399042, 51.62076568603515],
[7.919065952300967, 51.62027359008782],
[7.918489456176699, 51.619915008544915],
[7.91790914535528, 51.619617462158246],
[7.9178414344787, 51.61918640136729],
[7.91822147369396, 51.61896896362304],
[7.918237686157282, 51.61868286132811],
[7.917241573333795, 51.617984771728445],
[7.916008949279783, 51.61753463745122],
[7.915020942688043, 51.61710739135747],
[7.913847923278751, 51.6158561706544],
[7.91341543197626, 51.614048004150376],
[7.911323070526122, 51.61371231079106],
[7.912088394165093, 51.609130859374986],
[7.913626670837514, 51.6064720153809],
[7.915843009948672, 51.602039337158246],
[7.91444969177246, 51.59906387329112],
[7.915040969848744, 51.59755706787114],
[7.913531303405875, 51.59741592407225],
[7.914357662200983, 51.595829010009865],
[7.909603118896483, 51.595565795898544],
[7.910431861877553, 51.593944549560646],
[7.908526897430417, 51.5941543579102],
[7.907586574554499, 51.5946807861328],
[7.906756877899282, 51.5955467224121],
[7.905723571777342, 51.59592819213866],
[7.903030872345025, 51.595752716064496],
[7.899656295776478, 51.59536361694341],
[7.892645835876577, 51.595119476318345],
[7.890416145324762, 51.59493255615239],
[7.887404918670766, 51.59375],
[7.88621664047241, 51.595329284668075],
[7.8740735054016096, 51.593601226806626],
[7.871694564819334, 51.59400558471678],
[7.860555648803823, 51.591426849365334],
[7.861145019531305, 51.58946609497075],
[7.853303909301756, 51.58761596679686],
[7.846284866333063, 51.584793090820355],
[7.83922529220581, 51.582286834716896],
[7.835818767547719, 51.58169555664061],
[7.835779190063474, 51.58000946044927],
[7.830851078033388, 51.57936096191399],
[7.827151298522891, 51.57862854003905],
[7.826279640197809, 51.57846450805674],
[7.824367523193357, 51.578052520752],
[7.823795318603514, 51.58018112182628],
[7.822587013244626, 51.58206176757811],
[7.82147789001476, 51.585952758789105],
[7.8191499710084145, 51.58598327636729],
[7.818530559539793, 51.58861923217767],
[7.816407680511472, 51.588829040527386],
[7.814634323120058, 51.58933258056639],
[7.814291954040525, 51.59204101562504],
[7.81574153900152, 51.59235763549809],
[7.815053939819334, 51.59391403198252],
[7.815715789795036, 51.595932006836044],
[7.814142704010007, 51.59615325927727],
[7.813157081604116, 51.59730148315434],
[7.813611030578725, 51.59817123413085],
[7.813298702240045, 51.59974670410166],
[7.812370777130125, 51.60131454467778],
[7.810875892639272, 51.602844238281236],
[7.812729835510309, 51.60352706909178],
[7.81473731994623, 51.6032257080078],
[7.814686775207574, 51.604080200195355],
[7.813730239868276, 51.6052055358886],
[7.816383838653563, 51.60530853271477],
[7.816656589507998, 51.6063346862794],
[7.816598892212026, 51.60826873779301],
[7.815680503845213, 51.6106224060059],
[7.813037872314565, 51.61419296264647],
[7.814072132110595, 51.61455917358391],
[7.811807632446344, 51.617935180664055],
[7.811125755310113, 51.62099075317393],
[7.805747032165525, 51.619983673095746],
[7.788854598999136, 51.61682510375987],
[7.787304878234975, 51.61662673950205],
[7.786388397216795, 51.618183135986264],
[7.785294055938718, 51.61956024169932],
[7.783709049224965, 51.62092971801762],
[7.781286239624022, 51.621295928955064],
[7.778187751769961, 51.62063217163096],
[7.774516582489069, 51.62034606933604],
[7.765670776367129, 51.619781494140724],
[7.763934135437067, 51.621490478515724],
[7.7595767974854635, 51.620597839355455],
[7.759319782257134, 51.62271499633799],
[7.759439468383788, 51.62434005737303],
[7.755668640136773, 51.62426757812504],
[7.75279474258434, 51.62467956542974],
[7.751945018768365, 51.62413787841807],
[7.747653007507322, 51.62407302856455],
[7.745312690734919, 51.62499237060546],
[7.744369029998891, 51.62528228759776],
[7.742647171020506, 51.62554168701171],
[7.734643936157226, 51.62489318847667],
[7.73122024536144, 51.62434768676757],
[7.730489730835074, 51.62422943115234],
[7.730222225189149, 51.62482833862315],
[7.729704856872615, 51.6259651184083],
[7.728449344635008, 51.62687301635747],
[7.725679874420222, 51.62555694580077],
[7.7272391319274885, 51.62392807006835],
[7.72675943374645, 51.623016357421974],
[7.724902153015249, 51.62263870239262],
[7.724590778350886, 51.62443161010753],
[7.722766876220758, 51.6242179870606],
[7.723049163818358, 51.62314605712895],
[7.721555709838809, 51.622489929199205],
[7.7217268943786035, 51.61847686767577],
[7.7194247245789125, 51.61662292480468],
[7.719328403473012, 51.61487579345702],
[7.715578556060845, 51.61304855346678],
[7.713567733764647, 51.613777160644574],
[7.710833549499509, 51.61284637451177],
[7.706900596618594, 51.61188888549798],
[7.7051682472229555, 51.61302947998052],
[7.699739933013971, 51.61241149902342],
[7.697711944580076, 51.61436462402348],
[7.695767402649037, 51.61470413208018],
[7.692852973938043, 51.61318588256846],
[7.68804693222057, 51.61373901367187],
[7.687922000885065, 51.61483383178715],
[7.687095642089842, 51.61721801757817],
[7.685916423797548, 51.62152099609368],
[7.684963226318415, 51.62506866455083],
[7.683542728424126, 51.629493713379006],
[7.682721614837588, 51.63313293457041],
[7.682819843292291, 51.638996124267564],
[7.682575702667235, 51.64370727539061],
[7.681531906127929, 51.65001678466802],
[7.680011272430361, 51.65143966674809],
[7.678864479065053, 51.65243911743168],
[7.678676605224664, 51.654541015624986],
[7.679184436798037, 51.655460357666065],
[7.679001331329344, 51.6563110351563],
[7.678488731384276, 51.657119750976605],
[7.677172660827692, 51.65826797485351],
[7.675552368164118, 51.659191131591726],
[7.675673484802244, 51.6605110168458],
[7.67553615570074, 51.66246032714848],
[7.675994873046987, 51.662494659423814],
[7.6767258644104555, 51.6625480651856],
[7.677594184875544, 51.661880493164105],
[7.678328990936334, 51.65994262695317],
[7.678947925567738, 51.659992218017564],
[7.679373264312742, 51.6601371765136],
[7.679635047912709, 51.66035079956053],
[7.679748058319089, 51.66063308715825],
[7.679721832275503, 51.66105651855467],
[7.679427146911563, 51.661617279052834],
[7.679331302642877, 51.661991119384865],
[7.679381370544546, 51.662353515624986],
[7.679568290710447, 51.662609100341896],
[7.679956912994496, 51.662879943847756],
[7.680322647094724, 51.663051605224595],
[7.680976390838679, 51.663246154785256],
[7.6825199127198385, 51.66357040405266],
[7.685201168060244, 51.66399383544932],
[7.686608314514215, 51.66418075561522],
[7.687278747558534, 51.66410827636717],
[7.687724113464298, 51.6639289855958],
[7.688077449798525, 51.663597106933636],
[7.688302993774412, 51.663223266601605],
[7.688405036926268, 51.66273880004887],
[7.688427448272647, 51.66238021850596],
[7.688488006591909, 51.66210174560557],
[7.688688278198298, 51.661899566650376],
[7.689102649688663, 51.66175842285149],
[7.689521789550894, 51.66176605224603],
[7.690210342407225, 51.66187286376958],
[7.690888404846302, 51.662139892578054],
[7.6916470527650045, 51.66251754760747],
[7.692076683044432, 51.66282653808598],
[7.692260742187498, 51.663127899169965],
[7.692270755767877, 51.66344451904307],
[7.69230461120611, 51.664066314697315],
[7.69223213195812, 51.664775848388665],
[7.6923108100891096, 51.66514587402354],
[7.692598819732665, 51.665405273437486],
[7.692963123321531, 51.6656036376953],
[7.693365097045897, 51.665657043457074],
[7.693816184997614, 51.66562271118174],
[7.694419384002627, 51.6654663085938],
[7.69504928588867, 51.665103912353445],
[7.695746421814019, 51.66459655761729],
[7.696246147155818, 51.66424179077153],
[7.6966323852539045, 51.664077758789055],
[7.697009563446044, 51.66407012939452],
[7.697351455688532, 51.664157867431626],
[7.69756841659557, 51.66439819335948],
[7.697790145874079, 51.66479110717778],
[7.698013305664061, 51.66540908813481],
[7.698216915130614, 51.665863037109425],
[7.698046207428034, 51.6662826538087],
[7.697670936584528, 51.666740417480455],
[7.697639942169302, 51.66724395751963],
[7.697776794433592, 51.66760635375976],
[7.6981282234191895, 51.66801071166991],
[7.698758602142276, 51.66859436035167],
[7.699005603790225, 51.6688156127929],
[7.699419498443715, 51.66891479492192],
[7.6999621391296955, 51.668804168701215],
[7.700485229492186, 51.66853713989251],
[7.70063734054571, 51.6681785583496],
[7.70077896118164, 51.667991638183636],
[7.701100826263425, 51.667938232421925],
[7.70157289505016, 51.66802978515635],
[7.702360630035513, 51.66840744018553],
[7.704057693481557, 51.66882705688481],
[7.705723285675105, 51.669532775879006],
[7.706957340240534, 51.67066192626958],
[7.707235813140866, 51.67083740234379],
[7.707636356353701, 51.67092132568353],
[7.7087349891663735, 51.67094421386717],
[7.710807323455752, 51.671157836914055],
[7.711212635040225, 51.671157836914055],
[7.711537361145074, 51.671054840087876],
[7.712102413177431, 51.67057418823253],
[7.712400436401309, 51.67019653320311],
[7.712607383727969, 51.669895172119126],
[7.712673664093017, 51.66975021362309],
[7.712739467620962, 51.66962814331065],
[7.712901115417422, 51.66934967041026],
[7.713076591491811, 51.66908645629893],
[7.713185310363768, 51.66896057128917],
[7.713294029235895, 51.66883850097655],
[7.713430881500357, 51.66873168945317],
[7.713581562042349, 51.66863632202153],
[7.713760375976675, 51.668552398681626],
[7.713952541351317, 51.66848373413096],
[7.714173793792723, 51.66841888427744],
[7.7143940925598695, 51.668369293212876],
[7.714833259582631, 51.6682891845703],
[7.715051651001032, 51.668266296386705],
[7.715284347534179, 51.668254852294965],
[7.715516090393009, 51.668251037597585],
[7.715746879577749, 51.668266296386705],
[7.715962409973256, 51.6682891845703],
[7.716176509857175, 51.6683387756347],
[7.716516971588189, 51.66845703124999],
[7.716795921325796, 51.66863250732415],
[7.716901302337645, 51.66880798339854],
[7.716876029968374, 51.668975830078224],
[7.716690063476561, 51.66917800903325],
[7.716492176055964, 51.66933822631835],
[7.716207981109673, 51.66949081420892],
[7.715926170349119, 51.66960144042967],
[7.71548271179199, 51.66974639892589],
[7.715110778808534, 51.66991806030272],
[7.714736461639458, 51.67011642456053],
[7.714536666870116, 51.67054367065435],
[7.715056896209716, 51.670799255371136],
[7.715554714202936, 51.67094421386717],
[7.715958595275877, 51.670970916748146],
[7.716220855712888, 51.67094039916997],
[7.716681003570669, 51.67075347900389],
[7.717204570770204, 51.67047882080089],
[7.71748876571655, 51.67033386230479],
[7.717823982238825, 51.67029571533214],
[7.718184947967583, 51.670314788818345],
[7.718584060669057, 51.67041397094737],
[7.71922397613531, 51.67060852050786],
[7.719639301300105, 51.670680999755845],
[7.72020196914684, 51.67071151733403],
[7.720443248748835, 51.670787811279396],
[7.720622062683161, 51.670948028564496],
[7.720790863037108, 51.67126464843761],
[7.720867633819578, 51.67167282104497],
[7.72086906433111, 51.67212295532237],
[7.721010684967039, 51.67241287231444],
[7.721248149871825, 51.67255401611333],
[7.721616744995115, 51.672679901123146],
[7.722061157226618, 51.672752380371136],
[7.723071575164907, 51.67280578613291],
[7.724154949188288, 51.67284774780278],
[7.7248430252075195, 51.67296218872069],
[7.725697517395131, 51.673198699951215],
[7.726346015930174, 51.673484802246136],
[7.727441787719724, 51.674285888671925],
[7.728017807006949, 51.675289154052784],
[7.728035926818903, 51.676422119140724],
[7.727263927459715, 51.67769241333001],
[7.726348400116022, 51.678218841552834],
[7.72307682037359, 51.68010711669921],
[7.7194437980651855, 51.68150711059564],
[7.718014240264891, 51.68193435668944],
[7.718380928039606, 51.682712554931626],
[7.716546535492055, 51.68338394165049],
[7.71716737747198, 51.684513092041115],
[7.714796066284235, 51.684944152832074],
[7.714953899383543, 51.69007110595708],
[7.710783004760797, 51.689819335937486],
[7.710549831390378, 51.688182830810476],
[7.707613468170279, 51.68811416625981],
[7.700974464416615, 51.69506072998052],
[7.70642137527477, 51.699085235595696],
[7.706458568572995, 51.70001220703129],
[7.70416164398199, 51.69995498657237],
[7.703916072845457, 51.700485229492116],
[7.701347827911376, 51.701019287109474],
[7.701170921325625, 51.70297241210936],
[7.699110031127928, 51.7073249816895],
[7.701907634735219, 51.709388732910256],
[7.705381870269831, 51.7113800048828],
[7.703302860260008, 51.71227264404307],
[7.701889514923094, 51.71237945556645],
[7.701543331146296, 51.71320343017588],
[7.70346975326538, 51.71405029296874],
[7.704213142395018, 51.71318054199223],
[7.706887722015379, 51.71405410766606],
[7.706036567688099, 51.71517944335937],
[7.707530021667592, 51.71558380126952],
[7.709343433380125, 51.716224670410206],
[7.715357303619441, 51.71755981445317],
[7.714851856231631, 51.719806671142685],
[7.718297004699649, 51.71840286254887],
[7.719205856323297, 51.71859359741215],
[7.717878341674917, 51.72225189208983],
[7.7190561294556215, 51.722564697265724],
[7.722545146942081, 51.72270202636723],
[7.720620155334585, 51.724086761474595],
[7.724346637725829, 51.72486114501964],
[7.723616600036675, 51.72778701782231],
[7.725831985473744, 51.72843933105473],
[7.726744651794433, 51.72942733764647],
[7.729164600372312, 51.73015594482427],
[7.730987071991079, 51.730171203613324],
[7.732348442077577, 51.730487823486435],
[7.735802650451658, 51.73045349121092],
[7.735787868499812, 51.737369537353615],
[7.739229202270506, 51.73705291748057],
[7.74188375473028, 51.73727035522465],
[7.752189636230467, 51.73852539062505],
[7.753252983093318, 51.73572158813475],
[7.755168914794977, 51.73335647583018],
[7.757878303527887, 51.73338317871099],
[7.759838581085259, 51.72970962524424],
[7.764667034149282, 51.730381011962876],
[7.76597452163696, 51.727954864501996],
[7.766448974609372, 51.726764678955064],
[7.768582344055231, 51.7272491455078],
[7.769526958465575, 51.72377777099609],
[7.771834850311391, 51.7244300842285],
[7.772304534912107, 51.72658538818369],
[7.774120807647704, 51.72698974609368],
[7.776523113250675, 51.72730636596679],
[7.778545856475885, 51.72741317749034],
[7.77970504760742, 51.727664947509695],
[7.781940937042235, 51.7288246154785],
[7.785932064056395, 51.73069763183598],
[7.78699588775646, 51.72865295410166],
[7.787546157836969, 51.727684020996136],
[7.789582252502441, 51.72782135009765],
[7.788661479950006, 51.732093811035256],
[7.791205406188905, 51.73197937011717],
[7.796003341674803, 51.73076629638682],
[7.796743869781549, 51.7322158813477],
[7.800019741058405, 51.731975555419965],
[7.804032802581842, 51.73174285888682],
[7.802138328552244, 51.734401702880845],
[7.804106235504149, 51.734706878662216],
[7.808352470398003, 51.73572158813475],
[7.807839870452937, 51.73678970336924],
[7.810729026794489, 51.7376098632813],
[7.812571525573786, 51.73759460449223],
[7.81295585632324, 51.73978042602543],
[7.816594123840387, 51.73936080932616],
[7.820566654205264, 51.73931121826177],
[7.823380947113149, 51.74274826049803],
[7.823610782623232, 51.74402618408202],
[7.825771331787164, 51.744766235351555],
[7.828217029571587, 51.7446060180664],
[7.830166816711481, 51.744487762451165],
[7.831305503845213, 51.74436187744139],
[7.8321523666382955, 51.74361038208012],
[7.833374977111928, 51.74220275878916],
[7.833585262298696, 51.74115753173827],
[7.832931041717528, 51.73813247680674],
[7.832630634307803, 51.736221313476605],
[7.832775592804067, 51.734348297119126],
[7.834314823150632, 51.733554840088],
[7.835322856903075, 51.73110961914067],
[7.8364453315734295, 51.730018615722756],
[7.840784549713076, 51.728767395019524],
[7.843948364257868, 51.727954864501996],
[7.84623432159435, 51.72752761840819],
[7.847814559936465, 51.7272758483886],
[7.850077152252308, 51.727493286132855],
[7.852887630462645, 51.72703170776377],
[7.8586368560791, 51.72671508789067],
[7.858371257781981, 51.72573852539067],
[7.859511375427244, 51.72428894042979],
[7.859952926635796, 51.72305679321299],
[7.863731384277342, 51.72377014160155],
[7.865400314331052, 51.72434997558592],
[7.873940944671573, 51.729484558105455],
[7.875699043273924, 51.72836685180674],
[7.877977371215875, 51.726516723632855],
[7.879951953887995, 51.72258758544932],
[7.880010604858511, 51.72092819213877],
[7.8828163146973775, 51.721035003662095],
[7.88306474685663, 51.72027206420897],
[7.8846259117127016, 51.720333099365284],
[7.884807109832876, 51.719421386718736],
[7.885107994079588, 51.718345642089886],
[7.887157917022817, 51.718704223632855],
[7.888313293456972, 51.71781539916997],
[7.889416694641112, 51.71399307250975],
[7.888606071472165, 51.713687896728615],
[7.888412952423037, 51.71060943603515],
[7.890025615692137, 51.710536956787095],
[7.890007495880125, 51.710094451904396],
[7.889872550964467, 51.70738220214843],
[7.889568805694636, 51.70483779907225],
[7.890157699584902, 51.704166412353615],
[7.889955520629937, 51.703647613525376],
[7.889425277709959, 51.70329284667979],
[7.889864921569936, 51.70270156860351],
[7.890414237976129, 51.70297241210936],
[7.890763282775991, 51.703205108642685],
[7.890985012054441, 51.70338439941405],
[7.891200065612904, 51.70367431640635],
[7.891358852386472, 51.70394134521483],
[7.891622066497802, 51.70414352417002],
[7.8920783996582, 51.704269409179794],
[7.892770290374868, 51.704341888427834],
[7.8932881355286195, 51.70440673828129],
[7.893861770629995, 51.704509735107465],
[7.894305706024224, 51.704597473144574],
[7.894758701324518, 51.704780578613324],
[7.895128250122125, 51.70490646362315],
[7.895583152770993, 51.705059051513715],
[7.8959450721740705, 51.70506668090825],
[7.896308422088678, 51.705047607421974],
[7.896547794342096, 51.7049102783203],
[7.896747112274168, 51.704715728759865],
[7.897127151489198, 51.70441055297851],
[7.897508144378717, 51.704326629638715],
[7.89806127548212, 51.70428466796885],
[7.898840904235838, 51.70433044433592],
[7.899466514587457, 51.70454025268565],
[7.901239395141657, 51.7049598693847],
[7.901744365692194, 51.70499801635741],
[7.902336120605523, 51.70503616333013],
[7.902842521667592, 51.705047607421974],
[7.903079032897947, 51.704963684082074],
[7.903371810913083, 51.70465469360356],
[7.90358066558832, 51.70428848266606],
[7.904047489166372, 51.70322036743174],
[7.9043936729431135, 51.702995300292955],
[7.904724597930963, 51.70277404785149],
[7.905171871185302, 51.70280456542967],
[7.905496120452936, 51.70296478271477],
[7.905671596527098, 51.70319366455077],
[7.905872344970757, 51.703483581543075],
[7.906136035919302, 51.70368957519542],
[7.906310558319034, 51.703926086425774],
[7.906730175018308, 51.70393753051763],
[7.906965255737302, 51.703876495361314],
[7.907055854797417, 51.70458221435552],
[7.911670207977349, 51.70446014404307],
[7.911878585815542, 51.706146240234474],
[7.913650512695424, 51.70581436157231],
[7.916101932525746, 51.70576095581053],
[7.918290615081842, 51.70574569702148],
[7.919985294342039, 51.70600891113274],
[7.922215938568169, 51.70602035522465],
[7.922764778137148, 51.706050872802834],
[7.923204898834227, 51.70466613769541],
[7.923696994781492, 51.70467758178715],
[7.924165248870848, 51.704597473144574],
[7.924682617187613, 51.70441055297851],
[7.925243854522761, 51.70422363281254],
[7.925520420074576, 51.70420074462895],
[7.9259867668151855, 51.70441055297851],
[7.926507949829044, 51.70467376708977],
[7.926769733429009, 51.704914093017685],
[7.927139282226618, 51.70503997802744],
[7.927645683288686, 51.70505142211918],
[7.927975654602049, 51.70484924316416],
[7.928120136261041, 51.70460128784178],
[7.928240299224909, 51.704261779785256],
[7.928259849548395, 51.703918457031186],
[7.928409576416128, 51.703571319580185],
[7.928740501403806, 51.70335388183592],
[7.929300308227594, 51.70319366455077],
[7.929809570312556, 51.70315170288091],
[7.930589675903376, 51.703197479248146],
[7.931192874908388, 51.70328903198241],
[7.931582927703798, 51.703559875488274],
[7.931886672973632, 51.70382690429692],
[7.932158946991023, 51.70413970947264],
[7.932525634765738, 51.70431900024418],
[7.933009624481255, 51.70447158813481],
[7.9336028099061195, 51.70448684692388],
[7.93400144577032, 51.704349517822365],
[7.934088230133169, 51.704101562499936],
[7.93410444259649, 51.703811645507855],
[7.93412208557123, 51.70349884033213],
[7.934256076812799, 51.703178405761705],
[7.934554100036677, 51.703022003173935],
[7.93513774871826, 51.70295333862309],
[7.935613632202147, 51.70299148559575],
[7.936110496521109, 51.70317077636717],
[7.937559127807671, 51.70368957519542],
[7.938148021698111, 51.70378494262706],
[7.938755512237604, 51.7037963867188],
[7.939207077026365, 51.70375061035155],
[7.939642906188963, 51.70347213745116],
[7.939657211303766, 51.70322036743174],
[7.939482212066591, 51.702983856201215],
[7.939033031463678, 51.70272064208995],
[7.938532352447565, 51.7026138305664],
[7.937952518463191, 51.702358245849595],
[7.937560558319204, 51.702114105224595],
[7.937242031097523, 51.701854705810646],
[7.937254905700796, 51.70162200927727],
[7.937457084655761, 51.701374053955064],
[7.937745094299314, 51.70114517211907],
[7.938261508941706, 51.70098495483397],
[7.938686847686766, 51.70088958740233],
[7.939135551452634, 51.70089721679686],
[7.939641952514704, 51.70090866088877],
[7.940289974212645, 51.70097732543944],
[7.94079351425165, 51.701042175293075],
[7.941381454467829, 51.70114517211907],
[7.943176746368406, 51.7009048461914],
[7.943951606750487, 51.700775146484425],
[7.944527626037652, 51.700580596923764],
[7.945225238800047, 51.70028305053715],
[7.945790767669677, 51.69975280761718],
[7.946183204650877, 51.69921493530284],
[7.946950912475698, 51.69860458374028],
[7.947063446044978, 51.698238372802834],
[7.9493365287780176, 51.697887420654396],
[7.951204299926813, 51.69738388061522],
[7.952902793884388, 51.6966209411621],
[7.953818321228082, 51.69669723510747],
[7.954646587371937, 51.69668579101562],
[7.955718994140679, 51.69642257690428],
[7.956610679626463, 51.69609832763665],
[7.957787990570123, 51.69561004638677],
[7.9589629173279945, 51.69514846801763],
[7.960542201995791, 51.69403839111327],
[7.961347103119008, 51.69363021850591],
[7.962140560150258, 51.693416595459034],
[7.963114738464466, 51.69326782226561],
[7.963944435119684, 51.693225860595746],
[7.96460199356079, 51.692985534668075],
[7.9651308059692365, 51.6925659179688],
[7.965746879577692, 51.692237854004006],
[7.966353416442869, 51.69207763671885],
[7.967273712158257, 51.692070007324325],
[7.969334602355954, 51.692226409912095],
[7.970208644867054, 51.692218780517564],
[7.97090864181524, 51.69203186035166],
[7.971158981323297, 51.69166564941416],
[7.971491336822508, 51.69147491455088],
[7.972181797027643, 51.69145965576182],
[7.972913742065542, 51.691532135009815],
[7.973238468170221, 51.69148254394541],
[7.973585128784178, 51.69103240966801],
[7.9735965728760885, 51.69098663330077],
[7.973703861236684, 51.69054794311528],
[7.9742312431336, 51.69015884399418],
[7.9749279022217365, 51.69003295898436],
[7.975572586059569, 51.690017700195305],
[7.975891590118463, 51.689960479736314],
[7.976130008697565, 51.689914703369126],
[7.976329326629694, 51.68963241577153],
[7.976235866546629, 51.68941497802728],
[7.976207256317251, 51.689346313476605],
[7.975757598876895, 51.689163208007855],
[7.975677013397273, 51.68896102905273],
[7.976015567779482, 51.68865585327153],
[7.976763248443545, 51.68844223022465],
[7.977464675903319, 51.68822860717772],
[7.977711677551268, 51.68791961669921],
[7.977548599243219, 51.68754577636717],
[7.977480411529653, 51.687114715576215],
[7.977684497833194, 51.686748504638715],
[7.978466510772759, 51.686737060546974],
[7.979098796844482, 51.68695068359374],
[7.979596138000429, 51.68695831298827],
[7.979695796966494, 51.68696212768559],
[7.979933261871335, 51.686824798584084],
[7.979956626892145, 51.68639755249028],
[7.979986667633054, 51.68585205078124],
[7.9800119400024965, 51.68539810180668],
[7.980043411254994, 51.68482589721684],
[7.980431079864557, 51.68446350097649],
[7.981078624725283, 51.68439102172851],
[7.981721878051814, 51.684406280517564],
[7.982594490051381, 51.684421539306626],
[7.9833779335022514, 51.68438339233397],
[7.984217166900576, 51.684173583984425],
[7.98501396179199, 51.68390274047856],
[7.985998630523794, 51.68355178833018],
[7.9868011474609935, 51.683170318603615],
[7.987188816070555, 51.682804107666115],
[7.9875354766845135, 51.682357788085866],
[7.987433433532827, 51.681922912597756],
[7.987239360809437, 51.68150329589848],
[7.987091064453237, 51.68104171752935],
[7.987115383148192, 51.68060302734386],
[7.987398147583005, 51.679931640624986],
[7.987677574157712, 51.67932891845702],
[7.987942695617787, 51.67898178100596],
[7.988362312316836, 51.67873001098638],
[7.988944053650014, 51.678680419921974],
[7.989563465118406, 51.6787376403809],
[7.990125179290827, 51.67879486083984],
[7.990679740905759, 51.67871475219731],
[7.991122722625731, 51.67855453491215],
[7.991988182067982, 51.67808532714849],
[7.992927074432371, 51.67760086059575],
[7.9941592216491095, 51.677043914794965],
[7.995242595672719, 51.67656326293944],
[7.996388435363711, 51.67600250244145],
[7.997076034545954, 51.6756019592285],
[7.997447013855092, 51.674907684326215],
[7.9975290298462465, 51.674205780029396]
]
]
},
"properties": { "name_2": "Hamm", "name_0": "Germany", "name_1": "Nordrhein-Westfalen", "type_2": "Kreisfreie Stadt", "engtype_2": "District", "geo_point_2d": [51.6651743978, 7.82358619294], "hasc_2": "DE.NW.HM", "id_2": 261, "cca_2": "05915", "id_0": 86, "id_1": 10, "iso": "DEU", "ccn_2": 0 }
}]
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -0,0 +1,77 @@
<!DOCTYPE html>
<html lang="de">
<?php require_once("config.php") ?>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="author" content="Walter Hupfeld, info@hupfeld-software.de">
<meta name="description" content="Georeferenzieter Ideenmelder">
<title>Impressum</title>
<link rel="stylesheet" href="css/bootstrap.min.css" />
<link rel="stylesheet" href="css/style.css" />
</head>
<body>
<!-- Navbar -->
<nav class="navbar navbar-expand-md navbar-dark bg-dark fixed-top">
<a class="navbar-brand" href="#"><?= $strTitle ?></a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbars" aria-controls="navbars" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbars">
<ul class="navbar-nav mr-auto">
<li class="nav-item">
<a class="nav-link" href="index.php?ref=1">Karte</a>
</li>
<li class="nav-item">
<a class="nav-link" href="liste.php">Liste</a>
</li>
</ul>
<div>
<ul class="navbar-nav mr-auto right">
<li class="nav-item active">
<a class="nav-link" href="impressum.php">Impressum <span class="sr-only">(current)</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="datenschutz.php">Datenschutzerklärung</a>
</li>
<li class="nav-item">
<a class="nav-link" href="admin/login.php">Login</a>
</li>
</ul>
</div>
</nav>
<!-- Ende Navbar -->
<div class="container main">
<p>&nbsp;</p>
<div class="card">
<div class="card-header"><h2>Impressum</h2></div>
<div class="card-body">
<p> Der Ideenmelder wird zur Verfügung gestellt vom:</p>
<p>&nbsp;</p>
<div><img style="width:220px" src="<?=$strLogo?>" alt="Logo"></div>
<p>&nbsp;</p>
<p>
<?= stripslashes(nl2br($strImpressum)) ?>
</p>
<p><a href="<?=$strUrl?>"><?=$strUrlBez?></a></p>
<p>&nbsp;</p>
Anfragen zum Ideenmelder an <a href="mailto:<?=$contactEmail?>"><?=$contactEmail?></a>
<p>&nbsp;</p>
<p>&nbsp;</p>
<!-- Bitte nicht entfernen -->
<p class="small">Entwicklung: W. Hupfeld, Hamm<br>walter@hupfeld-hamm.de</p>
<a class="btn btn-primary text-white" href="index.php?ref=1">zurück</a>
</div>
</div>
</div>
</body>
</html>

@ -0,0 +1,469 @@
<?php
/** *****************************
* Ideenmelder
* Autor: Walter Hupfeld, Hamm
* E-Mail: info@hupfeld-software.de
* Version: 1.0
* Datum: 18.05.2021
******************************** */
if (!file_exists("db/locations.db")) {
header("Location: setup.php");
}
require("config.php");
require_once("lib/functions.php");
$ref=(isset($_GET['ref']) && ($_GET['ref']==1));
$strIntro ="<h4>".$strTitle."</h4>";
$strIntro .= nl2br2($strIntroText);
$strSQL="SELECT loc.*,f.filename FROM location loc LEFT JOIN files f ON loc.id=f.loc_id";
/* Für die Auswertung nur bestimmte Kategorien anzeigen
$numDefect="(6,8,21)";
$strSQL="SELECT loc.*,f.filename FROM location loc LEFT JOIN files f ON loc.id=f.loc_id WHERE defect in ".$numDefect;
*/
$result = $db->query($strSQL);
$arrMarker = array();
$arrDescription = array();
while ($row = $result->fetchArray()) {
$id=$row['id'];
$topic = $row['topic'];
$numLng = $row['lng'];
$numLat = $row['lat'];
$strDescription=generate_tooltip_description($row);
if ($boolActive) {
$arrDescription[$id] = $strDescription;
}
$arrMarker[]="marker[".$id."] = [L.marker([".$numLat."," .$numLng."],"
." { icon: ".$arrMarkerType[$topic]." }),'check_".$topic."'];\n"
."marker[".$id."][0].addTo(mymap);\n "
."marker[".$id."][0].bindPopup('".$strDescription."');";
}
$markerid=$id+1;
/*
marker[val.id] = [L.marker([val.lat, val.lng], { "icon": L.MakiMarkers.icon({ "color": color, "size": "m", "icon": "circle" }) }).bindPopup(html), val.membertype];
marker[val.id][0].addTo(map);
*/
?>
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="author" content="Walter Hupfeld, info@hupfeld-software.de">
<meta name="description" content="Georeferenzieter Ideenmelder">
<script src="js/jquery.min.js"></script>
<script src="js/leaflet.js"></script>
<script src="js/leaflet.ajax.js"></script>
<script src="js/leaflet.awesome-markers.js"></script>
<script src="js/leaflet.snogylop.js"></script>
<script src="js/lightbox.min.js"></script>
<link rel="stylesheet" href="css/font-awesome.min.css">
<link rel="stylesheet" href="css/bootstrap.min.css" />
<link rel="stylesheet" href="css/leaflet.css" />
<link rel="stylesheet" href="css/leaflet.awesome-markers.css" />
<link rel="stylesheet" href="css/style.css" />
<link rel="stylesheet" href="css/lightbox.css" />
<title>Ideenmelder</title>
</head>
<body>
<!-- Navbar -->
<nav class="navbar navbar-expand-md navbar-dark bg-dark fixed-top">
<a class="navbar-brand" href="#"><?= $strTitle ?></a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbars" aria-controls="navbars" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbars">
<ul class="navbar-nav mr-auto">
<li class="nav-item active">
<a class="nav-link" href="index.php?ref=1">Karte <span class="sr-only">(current)</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="liste.php">Liste</a>
</li>
</ul>
<div>
<ul class="navbar-nav mr-auto right">
<li class="nav-item">
<a class="nav-link" href="impressum.php">Impressum</a>
</li>
<li class="nav-item">
<a class="nav-link" href="datenschutz.php">Datenschutzerklärung</a>
</li>
<li class="nav-item">
<a class="nav-link" href="admin/login.php">Login</a>
</li>
</ul>
</div>
</div>
</nav>
<!-- Ende Navbar -->
<div class="container-fluid" style="margin-top: 4em;">
<div class="row">
<nav class="col-md-2 d-none d-md-block bg-light sidebar">
<div class="sidebar-sticky">
<img class="logo" src="<?=$strLogo?>" alt="Logo" >
<ul class="nav flex-column">
<?php
foreach ($arrTopic as $key=>$topic) {
echo "<li class='nav-item'>";
echo "<label>";
echo "<a class='nav-link'>".$arrIcon[$key]." ";
echo "<input type='checkbox' name='check_".$key."' id='check_".$key."' class='check' checked='checked' > ";
echo $topic."</a></label>";
echo "</li>";
}
?>
</ul>
</div>
</nav>
<main role="main" class="col-md-9 ml-sm-auto col-lg-10 px-1">
<div id="mapid"></div>
</main>
</div>
<!-- row -->
</div>
<!-- container-fluid -->
<?php
if ($boolActive) {
require("lib/dialog_karte.php");
require("lib/dialog_comment.php");
}
?>
<div id="loader"><img src="css/images/ajax-loader.gif"></div>
<script>
// Map ----------------------------------------------------------------------
var mymap = L.map('mapid').setView([<?=$numInfoLat ?>, <?=$numInfoLng ?>], <?=$numZoom ?>);
var mapLink = '<a href="http://openstreetmap.org">OpenStreetMap</a>';
// ocmlink = '<a href="http://thunderforest.com/">Thunderforest</a>';
var ocmLink = '<a href="https://www.mapbox.com/">Mapbox</a>';
L.tileLayer('https://api.mapbox.com/styles/v1/{id}/tiles/{z}/{x}/{y}?access_token=pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpejY4NXVycTA2emYycXBndHRqcmZ3N3gifQ.rJcFIG214AriISLbB6B5aw', {
maxZoom: 18,
minZoom:<?=$numZoom ?>,
attribution: 'Map data &copy; '+ mapLink +' contributors, ' +
'<a href="https://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, ' +
'Imagery © ' + ocmLink,
//id: 'mapbox/streets-v11',
id: 'mapbox/outdoors-v11',
tileSize: 512,
zoomOffset: -1
}).addTo(mymap);
// markerIcons ------------------------------------------------------------------------------
var infoMarker = L.AwesomeMarkers.icon({icon: 'info', prefix: 'fa', markerColor: 'orange'});
var bicycleMarker = L.AwesomeMarkers.icon({icon: 'bicycle', prefix: 'fa', markerColor: 'green'});
var carMarker = L.AwesomeMarkers.icon({icon: 'car', prefix: 'fa', markerColor: 'red'});
var truckMarker = L.AwesomeMarkers.icon({icon: 'truck', prefix: 'fa', markerColor: 'beige'});
var trainMarker = L.AwesomeMarkers.icon({icon: 'bus', prefix: 'fa', markerColor: 'blue'});
var pedestrianMarker = L.AwesomeMarkers.icon({icon: 'male', prefix: 'fa', markerColor: 'darkblue'});
function getMarker(topic) {
var arrMarker = [];
<?php
foreach ($arrMarkerType as $key => $value) {
echo "arrMarker[".$key."]=".$value.";\n";
}
?>
return arrMarker[topic];
}
//Hamm-Layer - todo invers area -----------------------------
var myStyle = {
"color": "grey",
"fillColor": "lightblue",
"weight": 4,
"opacity": 0.6
};
// Sonderfall Unna mit Gemeindegrenzen
var gemeindeStyle = {
"color": "grey",
"fillColor": "white",
"weight": 2,
"opacity": 0.6
};
var unnaLayer = new L.GeoJSON.AJAX(["geojson/KommunenKU.geojson"],{style:gemeindeStyle});
unnaLayer.addTo(mymap);
var hammLayer = new L.GeoJSON.AJAX(["<?= $fileGeojson ?>"], {
style: myStyle,
invert: true
});
hammLayer.addTo(mymap);
// Marker from database -------------------------------------------------------
var up="up";
var down="down";
var marker = [];
var arrDescription = [];
<?php
foreach ($arrMarker as $idx=>$strMarker) {
echo $strMarker."\n";
}
if ($boolComment) {
foreach ($arrDescription as $index => $value) {
echo "arrDescription[".$index."]=\"$value\"\n";
}
}
echo "var marker_max=".$markerid."\n";
?>
// Info-Marker für Start --------------------------------------------------------
var marker2 = L.marker([<?=$numInfoLat?>, <?=$numInfoLng?>], { icon: infoMarker }).addTo(mymap);
<?php
if ($ref) {
echo "marker2.bindPopup('".$strIntro."');";
} else {
echo "marker2.bindPopup('".$strIntro."').openPopup();";
}
?>
// Editor ----------------------------------------------------------------------
var edit = <?= ($boolActive) ? "true" : "false" ?>;
var myMarker;
var lat;
var lng;
function onMapClick(e) {
if (!edit) return false;
edit = false;
lat=e.latlng.lat;
lng=e.latlng.lng;
myMarker = L.marker([e.latlng.lat, e.latlng.lng], {
title: "Mein Punkt",
alt: "Informationspunkt",
draggable: true,
})
.addTo(mymap)
.on('dragend', function() {
var coord = String(myMarker.getLatLng()).split(',');
var lata = coord[0].split('(');
var lnga = coord[1].split(')');
lat = lata[1]; lng = lnga[0];
myMarker.bindPopup("Bewegt zu: " + lata[1] + ", " + lnga[0] + ".");
//console.log(lat+" "+lng);
});
$("#dialog").show();
};
hammLayer.on('click',function(e){ e.preventDefault(); })
mymap.on('click', onMapClick);
// Close Dialog
$("#close").click(function(e) {
$("#dialog").hide();
$("#description").val("").empty();
$("#defect").val(0);
$("#topic").val(2);
$("#photo").val("");
edit = true;
mymap.removeLayer(myMarker);
})
// Ajax-Based submit
$("#newobjectform").submit(function(event){
$("#lat").val(lat);
$("#lng").val(lng);
topic=$('input[name=topic]:checked').val();
newMarker = getMarker(topic);
event.preventDefault();
//grab all form data
var formData = new FormData($(this)[0]);
console.log(formData);
$.ajax({
type: "POST",
url: "ajax/ajax_location_push.php",
enctype: 'multipart/form-data',
data: formData, //$("#newobjectform").serialize(), // serializes the form's elements.
processData: false,
contentType: false,
cache: false,
beforeSend : function () {
$("#loader").show();
},
success: function(data)
{
$("#dialog").hide();
$("#description").val("").empty();
$("#defect").val(0);
$("#topic").val(2);
$("#photo").val("");
popuptext=data;
console.log(data);
marker[marker_max] = L.marker([lat,lng], { icon: newMarker }).addTo(mymap);
marker[marker_max].bindPopup(popuptext);
marker_max++;
edit=true;
mymap.removeLayer(myMarker);
$("#btnSubmit").prop("disabled", false);
event.preventDefault();
// description = arrDescription[id]+"<div class='comment'><em>"+username+" schrieb am "+today+"</em><br>"+comment+"</div>";
// marker[id][0].bindPopup(description);
},
complete: function() {
$("#loader").hide();
},
error: function(data)
{
alert('Fehler: Konnte keine Daten senden!'); // show response from post.
}
});
edit=true;
mymap.removeLayer(myMarker);
return false;
});
// Hide and show marker form checkbox ----------------------------------------
$('.check').click(function() {
bereich = this.name;
if (jQuery(this).prop("checked")) {
jQuery.each(marker, function(key, value) {
if (value) {
if (value[1] == bereich) { value[0].addTo(mymap); }
}
});
} else {
jQuery.each(marker, function(key, value) {
if (value) {
if (value[1] == bereich) { value[0].remove(); }
}
});
}
})
// Rating ----------------------------------------------------------------
function thumb_up_down(id,num,mode) {
$.ajax({
type: 'POST',
url: 'ajax/ajax_rating.php',
data: 'mode='+mode+'&id='+id+'&value='+num+'',
success: function(data){
if (data=="error") alert("Fehler");
},
dataType: 'html'
});
alert("Vielen Dank für Ihre Bewertung!");
id="#"+mode+"s_"+id;
num=num+1;
$(id).html(num);
}
// Comment -------------------------------------------------------------------
function open_comment(id) {
$("#dialog_comment").show();
$("#loc_id").val(id);
$('#comment').val("");
}
$("#close_comment").click(function(e) {
$("#dialog_comment").hide();
})
$("#commentform").submit(function(event){
//$(".ajax-wait-panel").addClass("ajax-waiting");
//console.log($("#commentform").serialize());
$.ajax({
type: "POST",
url: "ajax/ajax_comment_push.php",
data: $("#commentform").serialize(), // serializes the form's elements.
success: function(data)
{
$("#dialog_comment").hide();
var id = $("#loc_id").val();
var username = $("#comment_username").val();
var comment = $("#comment").val();
var today = new Date();
var dd = String(today.getDate()).padStart(2, '0');
var mm = String(today.getMonth() + 1).padStart(2, '0'); //January is 0!
var yyyy = today.getFullYear();
today = dd + '.' + mm + '.' + yyyy;
description = arrDescription[id]+"<div class='comment'><em>"+username+" schrieb am "+today+"</em><br>"+comment+"</div>";
marker[id][0].bindPopup(description);
},
error: function(data)
{
alert('Fehler: Konnte keine Daten senden!'); // show response from post.
}
//$(".ajax-wait-panel").removeClass("ajax-waiting");
});
return false; // avoid to execute the actual submit of the form.
event.preventDefault();
});
// Check image upload ------------------------------------------------------
$("#photo").on('change', function (e) {
var image_ok = true;
var file, img;
var _URL = window.URL || window.webkitURL;
if ((file = this.files[0])) {
var file = this.files[0];
var fileType = file["type"];
var validImageTypes = ["image/gif", "image/jpeg", "image/png"];
if ($.inArray(fileType, validImageTypes) < 0) {
image_ok=false;
alert("Keine Bilddatei, nur gif,jpeg,png erlaubt.")
$("#photo").val("");
}
if (image_ok) {
img = new Image();
var objectUrl = _URL.createObjectURL(file);
img.onload = function () {
image_ok = (this.width<2000 && this.height<2000 && this.width>100 && this.height>100);
console.log("Breite:" + this.width + " Höhe: " + this.height);
if (!image_ok) {
alert("Bilder dürfen maximal 2000 x 2000 Pixel groß sein.\n"
+"Breite:" + this.width + " Höhe: " + this.height)
}
};
img.src = objectUrl;
}
}
});
</script>
</body>
</html>

@ -0,0 +1 @@
// app.js

File diff suppressed because one or more lines are too long

2
js/jquery.min.js vendored

File diff suppressed because one or more lines are too long

@ -0,0 +1,575 @@
(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
'use strict';
var immediate = require('immediate');
/* istanbul ignore next */
function INTERNAL() {}
var handlers = {};
var REJECTED = ['REJECTED'];
var FULFILLED = ['FULFILLED'];
var PENDING = ['PENDING'];
module.exports = exports = Promise;
function Promise(resolver) {
if (typeof resolver !== 'function') {
throw new TypeError('resolver must be a function');
}
this.state = PENDING;
this.queue = [];
this.outcome = void 0;
if (resolver !== INTERNAL) {
safelyResolveThenable(this, resolver);
}
}
Promise.prototype["catch"] = function (onRejected) {
return this.then(null, onRejected);
};
Promise.prototype.then = function (onFulfilled, onRejected) {
if (typeof onFulfilled !== 'function' && this.state === FULFILLED ||
typeof onRejected !== 'function' && this.state === REJECTED) {
return this;
}
var promise = new this.constructor(INTERNAL);
if (this.state !== PENDING) {
var resolver = this.state === FULFILLED ? onFulfilled : onRejected;
unwrap(promise, resolver, this.outcome);
} else {
this.queue.push(new QueueItem(promise, onFulfilled, onRejected));
}
return promise;
};
function QueueItem(promise, onFulfilled, onRejected) {
this.promise = promise;
if (typeof onFulfilled === 'function') {
this.onFulfilled = onFulfilled;
this.callFulfilled = this.otherCallFulfilled;
}
if (typeof onRejected === 'function') {
this.onRejected = onRejected;
this.callRejected = this.otherCallRejected;
}
}
QueueItem.prototype.callFulfilled = function (value) {
handlers.resolve(this.promise, value);
};
QueueItem.prototype.otherCallFulfilled = function (value) {
unwrap(this.promise, this.onFulfilled, value);
};
QueueItem.prototype.callRejected = function (value) {
handlers.reject(this.promise, value);
};
QueueItem.prototype.otherCallRejected = function (value) {
unwrap(this.promise, this.onRejected, value);
};
function unwrap(promise, func, value) {
immediate(function () {
var returnValue;
try {
returnValue = func(value);
} catch (e) {
return handlers.reject(promise, e);
}
if (returnValue === promise) {
handlers.reject(promise, new TypeError('Cannot resolve promise with itself'));
} else {
handlers.resolve(promise, returnValue);
}
});
}
handlers.resolve = function (self, value) {
var result = tryCatch(getThen, value);
if (result.status === 'error') {
return handlers.reject(self, result.value);
}
var thenable = result.value;
if (thenable) {
safelyResolveThenable(self, thenable);
} else {
self.state = FULFILLED;
self.outcome = value;
var i = -1;
var len = self.queue.length;
while (++i < len) {
self.queue[i].callFulfilled(value);
}
}
return self;
};
handlers.reject = function (self, error) {
self.state = REJECTED;
self.outcome = error;
var i = -1;
var len = self.queue.length;
while (++i < len) {
self.queue[i].callRejected(error);
}
return self;
};
function getThen(obj) {
// Make sure we only access the accessor once as required by the spec
var then = obj && obj.then;
if (obj && typeof obj === 'object' && typeof then === 'function') {
return function appyThen() {
then.apply(obj, arguments);
};
}
}
function safelyResolveThenable(self, thenable) {
// Either fulfill, reject or reject with error
var called = false;
function onError(value) {
if (called) {
return;
}
called = true;
handlers.reject(self, value);
}
function onSuccess(value) {
if (called) {
return;
}
called = true;
handlers.resolve(self, value);
}
function tryToUnwrap() {
thenable(onSuccess, onError);
}
var result = tryCatch(tryToUnwrap);
if (result.status === 'error') {
onError(result.value);
}
}
function tryCatch(func, value) {
var out = {};
try {
out.value = func(value);
out.status = 'success';
} catch (e) {
out.status = 'error';
out.value = e;
}
return out;
}
exports.resolve = resolve;
function resolve(value) {
if (value instanceof this) {
return value;
}
return handlers.resolve(new this(INTERNAL), value);
}
exports.reject = reject;
function reject(reason) {
var promise = new this(INTERNAL);
return handlers.reject(promise, reason);
}
exports.all = all;
function all(iterable) {
var self = this;
if (Object.prototype.toString.call(iterable) !== '[object Array]') {
return this.reject(new TypeError('must be an array'));
}
var len = iterable.length;
var called = false;
if (!len) {
return this.resolve([]);
}
var values = new Array(len);
var resolved = 0;
var i = -1;
var promise = new this(INTERNAL);
while (++i < len) {
allResolver(iterable[i], i);
}
return promise;
function allResolver(value, i) {
self.resolve(value).then(resolveFromAll, function (error) {
if (!called) {
called = true;
handlers.reject(promise, error);
}
});
function resolveFromAll(outValue) {
values[i] = outValue;
if (++resolved === len && !called) {
called = true;
handlers.resolve(promise, values);
}
}
}
}
exports.race = race;
function race(iterable) {
var self = this;
if (Object.prototype.toString.call(iterable) !== '[object Array]') {
return this.reject(new TypeError('must be an array'));
}
var len = iterable.length;
var called = false;
if (!len) {
return this.resolve([]);
}
var i = -1;
var promise = new this(INTERNAL);
while (++i < len) {
resolver(iterable[i]);
}
return promise;
function resolver(value) {
self.resolve(value).then(function (response) {
if (!called) {
called = true;
handlers.resolve(promise, response);
}
}, function (error) {
if (!called) {
called = true;
handlers.reject(promise, error);
}
});
}
}
},{"immediate":2}],2:[function(require,module,exports){
(function (global){
'use strict';
var Mutation = global.MutationObserver || global.WebKitMutationObserver;
var scheduleDrain;
{
if (Mutation) {
var called = 0;
var observer = new Mutation(nextTick);
var element = global.document.createTextNode('');
observer.observe(element, {
characterData: true
});
scheduleDrain = function () {
element.data = (called = ++called % 2);
};
} else if (!global.setImmediate && typeof global.MessageChannel !== 'undefined') {
var channel = new global.MessageChannel();
channel.port1.onmessage = nextTick;
scheduleDrain = function () {
channel.port2.postMessage(0);
};
} else if ('document' in global && 'onreadystatechange' in global.document.createElement('script')) {
scheduleDrain = function () {
// Create a <script> element; its readystatechange event will be fired asynchronously once it is inserted
// into the document. Do so, thus queuing up the task. Remember to clean up once it's been called.
var scriptEl = global.document.createElement('script');
scriptEl.onreadystatechange = function () {
nextTick();
scriptEl.onreadystatechange = null;
scriptEl.parentNode.removeChild(scriptEl);
scriptEl = null;
};
global.document.documentElement.appendChild(scriptEl);
};
} else {
scheduleDrain = function () {
setTimeout(nextTick, 0);
};
}
}
var draining;
var queue = [];
//named nextTick for less confusing stack traces
function nextTick() {
draining = true;
var i, oldQueue;
var len = queue.length;
while (len) {
oldQueue = queue;
queue = [];
i = -1;
while (++i < len) {
oldQueue[i]();
}
len = queue.length;
}
draining = false;
}
module.exports = immediate;
function immediate(task) {
if (queue.push(task) === 1 && !draining) {
scheduleDrain();
}
}
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
},{}],3:[function(require,module,exports){
(function (global){
'use strict';
var jsonp = require('./jsonp');
var Promise = require('lie');
module.exports = function (url, options) {
options = options || {};
if (options.jsonp) {
return jsonp(url, options);
}
var request;
var cancel;
var out = new Promise(function (resolve, reject) {
cancel = reject;
if (global.XMLHttpRequest === undefined) {
reject('XMLHttpRequest is not supported');
}
var response;
request = new global.XMLHttpRequest();
request.open('GET', url);
if (options.headers) {
Object.keys(options.headers).forEach(function (key) {
request.setRequestHeader(key, options.headers[key]);
});
}
request.onreadystatechange = function () {
if (request.readyState === 4) {
if ((request.status < 400 && options.local) || request.status === 200) {
if (global.JSON) {
response = JSON.parse(request.responseText);
} else {
reject(new Error('JSON is not supported'));
}
resolve(response);
} else {
if (!request.status) {
reject('Attempted cross origin request without CORS enabled');
} else {
reject(request.statusText);
}
}
}
};
request.send();
});
out.catch(function (reason) {
request.abort();
return reason;
});
out.abort = cancel;
return out;
};
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
},{"./jsonp":5,"lie":1}],4:[function(require,module,exports){
(function (global){
'use strict';
var L = global.L || require('leaflet');
var Promise = require('lie');
var ajax = require('./ajax');
L.GeoJSON.AJAX = L.GeoJSON.extend({
defaultAJAXparams: {
dataType: 'json',
callbackParam: 'callback',
local: false,
middleware: function (f) {
return f;
}
},
initialize: function (url, options) {
this.urls = [];
if (url) {
if (typeof url === 'string') {
this.urls.push(url);
} else if (typeof url.pop === 'function') {
this.urls = this.urls.concat(url);
} else {
options = url;
url = undefined;
}
}
var ajaxParams = L.Util.extend({}, this.defaultAJAXparams);
for (var i in options) {
if (this.defaultAJAXparams.hasOwnProperty(i)) {
ajaxParams[i] = options[i];
}
}
this.ajaxParams = ajaxParams;
this._layers = {};
L.Util.setOptions(this, options);
this.on('data:loaded', function () {
if (this.filter) {
this.refilter(this.filter);
}
}, this);
var self = this;
if (this.urls.length > 0) {
new Promise(function (resolve) {
resolve();
}).then(function () {
self.addUrl();
});
}
},
clearLayers: function () {
this.urls = [];
L.GeoJSON.prototype.clearLayers.call(this);
return this;
},
addUrl: function (url) {
var self = this;
if (url) {
if (typeof url === 'string') {
self.urls.push(url);
} else if (typeof url.pop === 'function') {
self.urls = self.urls.concat(url);
}
}
var loading = self.urls.length;
var done = 0;
self.fire('data:loading');
self.urls.forEach(function (url) {
if (self.ajaxParams.dataType.toLowerCase() === 'json') {
ajax(url, self.ajaxParams).then(function (d) {
var data = self.ajaxParams.middleware(d);
self.addData(data);
self.fire('data:progress', data);
}, function (err) {
self.fire('data:progress', {
error: err
});
});
} else if (self.ajaxParams.dataType.toLowerCase() === 'jsonp') {
L.Util.jsonp(url, self.ajaxParams).then(function (d) {
var data = self.ajaxParams.middleware(d);
self.addData(data);
self.fire('data:progress', data);
}, function (err) {
self.fire('data:progress', {
error: err
});
});
}
});
self.on('data:progress', function () {
if (++done === loading) {
self.fire('data:loaded');
}
});
},
refresh: function (url) {
url = url || this.urls;
this.clearLayers();
this.addUrl(url);
},
refilter: function (func) {
if (typeof func !== 'function') {
this.filter = false;
this.eachLayer(function (a) {
a.setStyle({
stroke: true,
clickable: true
});
});
} else {
this.filter = func;
this.eachLayer(function (a) {
if (func(a.feature)) {
a.setStyle({
stroke: true,
clickable: true
});
} else {
a.setStyle({
stroke: false,
clickable: false
});
}
});
}
}
});
L.Util.Promise = Promise;
L.Util.ajax = ajax;
L.Util.jsonp = require('./jsonp');
L.geoJson.ajax = function (geojson, options) {
return new L.GeoJSON.AJAX(geojson, options);
};
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
},{"./ajax":3,"./jsonp":5,"leaflet":undefined,"lie":1}],5:[function(require,module,exports){
(function (global){
'use strict';
var L = global.L || require('leaflet');
var Promise = require('lie');
module.exports = function (url, options) {
options = options || {};
var head = document.getElementsByTagName('head')[0];
var scriptNode = L.DomUtil.create('script', '', head);
var cbName, ourl, cbSuffix, cancel;
var out = new Promise(function (resolve, reject) {
cancel = reject;
var cbParam = options.cbParam || 'callback';
if (options.callbackName) {
cbName = options.callbackName;
} else {
cbSuffix = '_' + ('' + Math.random()).slice(2);
cbName = '_leafletJSONPcallbacks.' + cbSuffix;
}
scriptNode.type = 'text/javascript';
if (cbSuffix) {
if (!global._leafletJSONPcallbacks) {
global._leafletJSONPcallbacks = {
length: 0
};
}
global._leafletJSONPcallbacks.length++;
global._leafletJSONPcallbacks[cbSuffix] = function (data) {
head.removeChild(scriptNode);
delete global._leafletJSONPcallbacks[cbSuffix];
global._leafletJSONPcallbacks.length--;
if (!global._leafletJSONPcallbacks.length) {
delete global._leafletJSONPcallbacks;
}
resolve(data);
};
}
if (url.indexOf('?') === -1) {
ourl = url + '?' + cbParam + '=' + cbName;
} else {
ourl = url + '&' + cbParam + '=' + cbName;
}
scriptNode.src = ourl;
}).then(null, function (reason) {
head.removeChild(scriptNode);
delete L.Util.ajax.cb[cbSuffix];
return reason;
});
out.abort = cancel;
return out;
};
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
},{"leaflet":undefined,"lie":1}]},{},[4]);

File diff suppressed because one or more lines are too long

@ -0,0 +1,125 @@
/*
Leaflet.AwesomeMarkers, a plugin that adds colorful iconic markers for Leaflet, based on the Font Awesome icons
(c) 2012-2013, Lennard Voogdt
http://leafletjs.com
https://github.com/lvoogdt
*/
/*global L*/
(function(window, document, undefined) {
"use strict";
/*
* Leaflet.AwesomeMarkers assumes that you have already included the Leaflet library.
*/
L.AwesomeMarkers = {};
L.AwesomeMarkers.version = '2.0.1';
L.AwesomeMarkers.Icon = L.Icon.extend({
options: {
iconSize: [35, 45],
iconAnchor: [17, 42],
popupAnchor: [1, -32],
shadowAnchor: [10, 12],
shadowSize: [36, 16],
className: 'awesome-marker',
prefix: 'glyphicon',
spinClass: 'fa-spin',
extraClasses: '',
icon: 'home',
markerColor: 'blue',
iconColor: 'white'
},
initialize: function(options) {
options = L.Util.setOptions(this, options);
},
createIcon: function() {
var div = document.createElement('div'),
options = this.options;
if (options.icon) {
div.innerHTML = this._createInner();
}
if (options.bgPos) {
div.style.backgroundPosition =
(-options.bgPos.x) + 'px ' + (-options.bgPos.y) + 'px';
}
this._setIconStyles(div, 'icon-' + options.markerColor);
return div;
},
_createInner: function() {
var iconClass, iconSpinClass = "",
iconColorClass = "",
iconColorStyle = "",
options = this.options;
if (options.icon.slice(0, options.prefix.length + 1) === options.prefix + "-") {
iconClass = options.icon;
} else {
iconClass = options.prefix + "-" + options.icon;
}
if (options.spin && typeof options.spinClass === "string") {
iconSpinClass = options.spinClass;
}
if (options.iconColor) {
if (options.iconColor === 'white' || options.iconColor === 'black') {
iconColorClass = "icon-" + options.iconColor;
} else {
iconColorStyle = "style='color: " + options.iconColor + "' ";
}
}
return "<i " + iconColorStyle + "class='" + options.extraClasses + " " + options.prefix + " " + iconClass + " " + iconSpinClass + " " + iconColorClass + "'></i>";
},
_setIconStyles: function(img, name) {
var options = this.options,
size = L.point(options[name === 'shadow' ? 'shadowSize' : 'iconSize']),
anchor;
if (name === 'shadow') {
anchor = L.point(options.shadowAnchor || options.iconAnchor);
} else {
anchor = L.point(options.iconAnchor);
}
if (!anchor && size) {
anchor = size.divideBy(2, true);
}
img.className = 'awesome-marker-' + name + ' ' + options.className;
if (anchor) {
img.style.marginLeft = (-anchor.x) + 'px';
img.style.marginTop = (-anchor.y) + 'px';
}
if (size) {
img.style.width = size.x + 'px';
img.style.height = size.y + 'px';
}
},
createShadow: function() {
var div = document.createElement('div');
this._setIconStyles(div, 'shadow');
return div;
}
});
L.AwesomeMarkers.icon = function(options) {
return new L.AwesomeMarkers.Icon(options);
};
}(this, document));

File diff suppressed because one or more lines are too long

@ -0,0 +1,142 @@
(function () {
// Use public isFlat if available, else fall back to private _flat
var isFlat = L.LineUtil.isFlat ? L.LineUtil.isFlat : L.LineUtil._flat;
function defineSnogylop(L) {
var worldLatlngs = [
L.latLng([90, 180]),
L.latLng([90, -180]),
L.latLng([-90, -180]),
L.latLng([-90, 180])
];
if (L.version < '1.0.0') {
L.extend(L.Polygon.prototype, {
initialize: function (latlngs, options) {
worldLatlngs = (options.worldLatLngs ? options.worldLatLngs : worldLatlngs);
if (options && options.invert && !options.invertMultiPolygon) {
// Create a new set of latlngs, adding our world-sized ring
// first
var newLatlngs = [];
newLatlngs.push(worldLatlngs);
newLatlngs.push(latlngs[0]);
latlngs = newLatlngs;
}
L.Polyline.prototype.initialize.call(this, latlngs, options);
this._initWithHoles(latlngs);
},
getBounds: function () {
if (this.options.invert) {
// Don't return the world-sized ring's bounds, that's not
// helpful!
return new L.LatLngBounds(this._holes);
}
return new L.LatLngBounds(this.getLatLngs());
}
});
L.extend(L.MultiPolygon.prototype, {
initialize: function (latlngs, options) {
worldLatlngs = (options.worldLatLngs ? options.worldLatLngs : worldLatlngs);
this._layers = {};
this._options = options;
if (options.invert) {
// Let Polygon know we're part of a MultiPolygon
options.invertMultiPolygon = true;
// Create a new set of latlngs, adding our world-sized ring
// first
var newLatlngs = [];
newLatlngs.push(worldLatlngs);
for (var l in latlngs) {
newLatlngs.push(latlngs[l][0]);
}
latlngs = [newLatlngs];
}
this.setLatLngs(latlngs);
}
});
}
else {
var OriginalPolygon = {
toGeoJSON: L.Polygon.prototype.toGeoJSON
};
L.extend(L.Polygon.prototype, {
_setLatLngs: function(latlngs) {
this._originalLatLngs = latlngs;
if (isFlat(this._originalLatLngs)) {
this._originalLatLngs = [this._originalLatLngs];
}
if (this.options.invert) {
worldLatlngs = (this.options.worldLatLngs ?
this.options.worldLatLngs :
worldLatlngs);
// Create a new set of latlngs, adding our world-sized ring
// first
var newLatlngs = [];
newLatlngs.push(worldLatlngs);
for (var l in latlngs) {
newLatlngs.push(latlngs[l]);
}
latlngs = [newLatlngs];
}
L.Polyline.prototype._setLatLngs.call(this, latlngs);
},
getBounds: function () {
if (this._originalLatLngs) {
// Don't return the world-sized ring's bounds, that's not
// helpful!
return new L.LatLngBounds(this._originalLatLngs);
}
return new L.LatLngBounds(this.getLatLngs());
},
getLatLngs: function() {
return this._originalLatLngs;
},
toGeoJSON: function (precision) {
if (!this.options.invert) return OriginalPolygon.toGeoJSON.call(this, precision);
var holes = !isFlat(this._originalLatLngs),
multi = holes && !isFlat(this._originalLatLngs[0]);
var coords = L.GeoJSON.latLngsToCoords(this._originalLatLngs, multi ? 2 : holes ? 1 : 0, true, precision);
if (!holes) {
coords = [coords];
}
return L.GeoJSON.getFeature(this, {
type: (multi ? 'Multi' : '') + 'Polygon',
coordinates: coords
});
}
});
}
}
if (typeof define === 'function' && define.amd) {
// Try to add snogylop to Leaflet using AMD
define(['leaflet'], function (L) {
defineSnogylop(L);
});
}
else {
// Else use the global L
defineSnogylop(L);
}
})();

15
js/lightbox.min.js vendored

File diff suppressed because one or more lines are too long

@ -0,0 +1,25 @@
<div id="dialog_comment" class="card" title="Kommentar">
<div class="card-header">Ihr Kommentar
<span id="close_comment" type="button" class="close right text-danger">
<i class="fa fa-window-close"></i>
</span>
</div>
<div class="card-body">
<form id="commentform" action="#" method="post" >
<fieldset style="border: none;">
<p>
<label for=comment_username"><strong>Ihr Name oder Pseudonym:</strong></label><br>
<input type="text" name="comment_username" maxlength="16" id="comment_username" placeholder="Name" class="text" required="required">
<input type="hidden" name="loc_id" id="loc_id" value="999">
</p>
<label for="description"><strong>Kommentar:</strong></label><br>
<textarea name="comment" id="comment" maxlength="1001" placeholder="Ihr Kommentar" required="required"></textarea>
<br>
<input type="submit" value ="Absenden" class="btn btn-primary" tabindex="-1">
</fieldset>
</form>
</div>
</div>

@ -0,0 +1,66 @@
<style>
#dialog_defect {
display: none;
position: absolute;
top: 30px;
left: 40px;
width: 500px;
z-index: 1200;
background-color: #efefef;
}
#description {
width: 28em;
height: 10em;
}
</style>
<div id="dialog_defect" class="card" title="Eintrag editieren">
<div class="card-header">Eintrag editieren
<span id="hint"></span>
<span id="close" type="button" class="close right text-danger">
<i class="fa fa-window-close"></i>
</span>
</div>
<div class="card-body">
<form id="editobjectform" enctype="multipart/form-data" action="#" method="post" >
<!-- Beschreibung ---------------------------------- -->
<label for="description"><strong>Beschreibung:</strong></label><br>
<textarea name="description" id="description" maxlength="1001" required="required"></textarea>
<!-- Mängelkategorie -------------------------------- -->
<?php if ($boolDefect): ?>
<p id="defect">
<label for="defect"><strong>Mängelkategorie:</strong></label>
<select name="defect">
<?php
foreach ($arrDefect as $defectKey => $defectVal) {
echo " <option value='$defectKey'>$defectVal</option>";
}
?>
</select>
</p>
<?php endif; ?>
<!-- Dateiupload ---------------------------------- -->
<?php if ($boolUpload): ?>
<label><strong>Bildupload:</strong></label>
<input type="file" id="photo" name="uploadfile" size="60" maxlength="255" />
<?php endif; ?>
<!-- Einverständnis ---------------------------------- -->
<input type="hidden" id="loc_id" name="loc_id" value="">
<input type="submit" id="submit" class="btn btn-primary" tabindex="-1">
</form>
</div> <!-- card-body -->
</div> <!-- card -->

@ -0,0 +1,116 @@
<div id="dialog" class="card" title="Neuer Eintrag in die Karte">
<div class="card-header">Ihr Wunsch oder Anregung
<span id="hint"></span>
<span id="close" type="button" class="close right text-danger">
<i class="fa fa-window-close"></i>
</span>
</div>
<div class="card-body">
<form id="newobjectform" enctype="multipart/form-data" action="#" method="post" >
<!-- Username ---------------------------------- -->
<label for="username"><strong>Ihr Name oder Pseudonym:</strong></label>
<input type="text" name="username" maxlength="16" id="username" placeholder="Name" class="text" required="required">
<br>
<!-- Userinfo ---------------------------------- -->
<?php if ($boolUserinfo): ?>
<label><strong>Die Fragen nach Alter und Verkehrsmittel können Sie freiwillig beantworten:</strong></label>
<br>
<label for="ext_age">Ihr Alter:</label>
<select name="ext_age" id="ext_age">
<?php
foreach ($arrAge as $age) {
echo " <option value='$age'>$age</option>";
}
?>
</select>
<br>
<label for="ext_transport">Ihr hauptsächlich genutztes Verkehrsmittel:</label>
<select name="ext_transport" id="ext_transport">
<?php
foreach ($arrTransport as $transport) {
echo " <option value='$transport'>$transport</option>";
}
?>
</select>
<br>
<?php endif; ?>
<!-- Beschreibung ---------------------------------- -->
<label for="description"><strong>Beschreibung:</strong></label><br>
<textarea name="description" id="description" maxlength="1001" placeholder="Beschreiben Sie Ihren Eintrag" required="required"></textarea>
<!-- Themenfelder ---------------------------------- -->
<strong>Wählen Sie ein Themenfeld aus:</strong></br>
<div class="row">
<?php
$first=true;
foreach ($arrTopic as $keyTopic => $valTopic):
$checked = ($first) ? "checked=\"checked\"" : "";
$first=false;
?>
<div class="col-6-md col-6">
<input type="radio" id="topic<?=$keyTopic?>" name="topic" value="<?=$keyTopic?>" <?=$checked?>/>
<label for="topic<?=$keyTopic?>"><?=$valTopic?></label>
</div>
<?php endforeach; ?>
</div> <!-- row -->
<!-- Mängelkategorie -------------------------------- -->
<?php if ($boolDefect): ?>
<p>
<label for="defect"><strong>Mängelkategorie:</strong></label>
<select name="defect" id="defect">
<?php
foreach ($arrDefect as $defectKey => $defectVal) {
echo " <option value='$defectKey'>$defectVal</option>";
}
?>
</select>
</p>
<?php endif; ?>
<!-- Lokalisierung ---------------------------------- -->
<input type="hidden" id="lng" name="lng" value="0" />
<input type="hidden" id="lat" name="lat" value="0" />
<!-- Dateiupload ---------------------------------- -->
<?php if ($boolUpload): ?>
<label>Bildupload:</label>
<input type="file" id="photo" name="uploadfile" size="60" maxlength="255" />
<?php endif; ?>
<!-- Einverständnis ---------------------------------- -->
<strong>Einverständnis:</strong><br>
<label for="consent">
<input type="checkbox" id="consent" name="consent" value="1" required="required" />
Ich bin einverstanden, dass die von mir eingegebenen Daten in der
Karte veröffentlicht
<?= $boolUserinfo ? " (außer Alter und Verkehrsmittel) " : ""?>und im Rahmen der
<a href="datenschutz.php" target="_blank">Datenschutzerklärung</a>
verarbeitet werden dürfen.<br>
<?php if ($boolUpload): ?>
Wenn Sie ein <strong>Bild</strong> hochladen, achten Sie bitte auf
<strong>Urheber- und Persönlichkeitsrechte</strong>.
<?php endif; ?>
</label>
<input type="submit" id="submit" class="btn btn-primary" tabindex="-1">
</form>
</div> <!-- card-body -->
</div> <!-- card -->

@ -0,0 +1,119 @@
<?php
/** *****************************
* Ideenmelder
* Autor: Walter Hupfeld, Hamm
* E-Mail: info@hupfeld-software.de
* Version: 1.0
* Datum: 18.05.2021
******************************** */
function generate_tooltip_description($row) {
global $boolRating;
global $boolComment;
global $boolUpload;
global $boolDefect;
global $uploaddir;
global $arrTopic;
global $arrDefect;
global $db;
$description = $row['description'];
$numUps = $row['thumb_ups'];
$numDowns = $row['thumb_downs'];
$id = $row['id'];
$topic = $row['topic'];
$numDatum= strtotime($row['created_at']);
$datum= date("d.m.Y",$numDatum);
$strDescription = "<strong>Anmerkung zu ".$arrTopic[$topic]."</strong><br>";
if ($boolUpload && isset($row['filename'])) {
$strDescription .= "<a href=\'images/".$row['filename']."\' data-lightbox=\'radweg".$id."\'>";
$strDescription .= "<img src=\'images/".$row['filename']."\' style=\'width:200px;\' /></a><br>";
}
$strDescription .= nl2br2($description);
$strDescription .= "<br> - ".$row['username']." (".$datum.")";
if ($boolDefect) {
if ($row['defect']>0) {
$strDescription .= "<br><em>" . $arrDefect[$row['defect']] ."</em>";
}
}
if ($boolRating) {
$strDescription .=" <hr><div style=\'text-align:center\'>";
$strDescription .= "<a href=\'#\' onclick=\'thumb_up_down(".$id.",".$numUps.",up)\'>";
$strDescription .= "<i class=\'text-muted fa fa-thumbs-up\'></i></a> ";
$strDescription .= "&nbsp;<span class=\'text-muted\' id=\'ups_".$id."\'>".$numUps."</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
$strDescription .= "<a href=\'#\' onclick=\'thumb_up_down(".$id.",".$numDowns.",down)\'>";
$strDescription .= "<i class=\'text-muted fa fa-thumbs-down\'></i></a>";
$strDescription .= "&nbsp;<span class=\'text-muted\' id=\'downs_".$id."\'>".$numDowns."</span></div>";
}
if ($boolComment) {
$strDescription .= "<hr><div style=\'text-align:center\'>";
$strDescription .= "<a href=\'#\' onclick=\'open_comment(".$id.")\'>Kommentar hinzufügen</a>";
$strDescription .= "</div>";
$strSQL = "SELECT username,comment,created_at FROM comment WHERE loc_id=".$id;
$result = $db->query($strSQL);
while ($comment = $result->fetchArray()) {
$strDescription .= "<div class=\'comment\'>";
$strDescription .= "<em>".$comment['username']." schrieb am ";
$numDatum = strtotime($comment['created_at']);
$strDatum = date("d.m.Y",$numDatum);
$strDescription .= $strDatum."</em><br>";
$strDescription .= nl2br2($comment['comment']);
$strDescription .= "</div>";
}
}
return $strDescription;
}
/**
* reads gps location form picture data
*/
function read_gps_location($file){
if (is_file($file)) {
$info = exif_read_data($file);
if (isset($info['GPSLatitude']) && isset($info['GPSLongitude']) &&
isset($info['GPSLatitudeRef']) && isset($info['GPSLongitudeRef']) &&
in_array($info['GPSLatitudeRef'], array('E','W','N','S')) && in_array($info['GPSLongitudeRef'], array('E','W','N','S'))) {
$GPSLatitudeRef = strtolower(trim($info['GPSLatitudeRef']));
$GPSLongitudeRef = strtolower(trim($info['GPSLongitudeRef']));
$lat_degrees_a = explode('/',$info['GPSLatitude'][0]);
$lat_minutes_a = explode('/',$info['GPSLatitude'][1]);
$lat_seconds_a = explode('/',$info['GPSLatitude'][2]);
$lng_degrees_a = explode('/',$info['GPSLongitude'][0]);
$lng_minutes_a = explode('/',$info['GPSLongitude'][1]);
$lng_seconds_a = explode('/',$info['GPSLongitude'][2]);
$lat_degrees = $lat_degrees_a[0] / $lat_degrees_a[1];
$lat_minutes = $lat_minutes_a[0] / $lat_minutes_a[1];
$lat_seconds = $lat_seconds_a[0] / $lat_seconds_a[1];
$lng_degrees = $lng_degrees_a[0] / $lng_degrees_a[1];
$lng_minutes = $lng_minutes_a[0] / $lng_minutes_a[1];
$lng_seconds = $lng_seconds_a[0] / $lng_seconds_a[1];
$lat = (float) $lat_degrees+((($lat_minutes*60)+($lat_seconds))/3600);
$lng = (float) $lng_degrees+((($lng_minutes*60)+($lng_seconds))/3600);
//If the latitude is South, make it negative.
//If the longitude is west, make it negative
$GPSLatitudeRef == 's' ? $lat *= -1 : '';
$GPSLongitudeRef == 'w' ? $lng *= -1 : '';
return array(
'lat' => $lat,
'lng' => $lng
);
}
}
return false;
}
function nl2br2($string) {
$string = str_replace(array("\r\n", "\r", "\n"), "<br />", $string);
return $string;
}

@ -0,0 +1,126 @@
<?php
/** -----------------------------------------------------
* function getAdress($lat,$lng)
* Reverse geocoding of address by using locationiq.com
* Input: lat and lng of location
* Returns: data-array
* ----------------------------------------------------- */
//$dbFilename = "../db/locations.db";
//$db = new SQLite3($dbFilename);
function getAddress($lat,$lng) {
$key="your-key-here";
$url="https://us1.locationiq.com/v1/reverse.php?key=".$key."&lat=".$lat."&lon=".$lng."&format=json";
$curl = curl_init($url);
curl_setopt_array($curl, array(
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_CUSTOMREQUEST => 'GET',
));
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
$arrData = array();
if ($err) {
return false; //"cURL Error #:" . $err;
} else {
$data = json_decode($response);
foreach ($data as $key=>$value) {
if ($key=="address") {
foreach ($value as $k=>$v) {
//echo $k." ".$v."<br>";
$arrData[$k]=$v;
}
}
};
return $arrData;
}
}
/** ----------------------------------------------
* function writeAddress
* Write data to database
* $db - database handel
* $id - id of location
* $data - address data of location
* location - address schould be an 1:1-relation
* ----------------------------------------------- */
function writeAddress($db,$id,$data) {
$arrKeys = array ('parking','road','house_number','industrial','neighbourhood','hamlet','suburb','postcode','city','county','country');
$strSQL="insert into address (loc_id,parking,road,house_number,industrial,";
$strSQL.="neighbourhood,hamlet,suburb,postcode,city,county,country) values ($id";
foreach ($arrKeys as $key) {
$strSQL .= (isset($data[$key])) ? ",'".$data[$key]."'" : ",''";
}
$strSQL.=")";
$db->exec($strSQL);
}
/**
* function fillAddressTable($db,$limit)
* $db - database handel
* $limit - only look for these count of entries because of api restriction
*/
function fillAddressTable($db,$limit=20) {
$arrIds = array();
// Get all ids from address table and write to array
$strSQL="select loc_id from address";
$result=$db->query($strSQL);
while ($row=$result->fetchArray()) {
$arrIds[]=$row['loc_id'];
}
$counter=0;
$strSQL="SELECT id,lat,lng FROM location";
$arrKeys = array ('parking','road','house_number','industrial','neighbourhood','hamlet','suburb','postcode','city','county','country');
$result=$db->query($strSQL);
$strTable = "<table class='table table-bordered table-striped'>";
$strTable .= "<tr><th>id</th><th>lat</th><th>lng</th>";
foreach ($arrKeys as $key) {
$strTable .= "<th>".$key."</th>";
}
$strTable .= "</tr>";
while ($row=$result->fetchArray()) {
$id=$row['id'];
if (!in_array($id,$arrIds) && $counter<$limit) {
$counter++;
$lat=$row['lat'];
$lng=$row['lng'];
$data=getAddress($lat,$lng);
$strTable .= "<tr><td>$id</td><td>$lat</td><td>$lng</td>";
foreach ($arrKeys as $key) {
$strTable .= (isset($data[$key])) ? "<td>".$data[$key]."</td>" : "<td></td>";
}
$strTable .= "</tr>";
sleep(0.5); //api restriction
writeAddress($db,$id,$data);
}
}
$strTable .= "<table>";
return ($counter>0) ? $strTable : "Keine neuen Adressdaten.";
}
function cleanAddresses($db){
$strSQL="DELETE FROM address WHERE parking='' and road='' and house_number=''
and industrial='' and neighbourhood='' and hamlet=''
and suburb='' and postcode='' and city='' and county=''";
$db->query($strSQL);
}
// echo fillAddressTable($db,10);

@ -0,0 +1,227 @@
<?php
/** *****************************
* Ideenmelder
* Autor: Walter Hupfeld, Hamm
* E-Mail: info@hupfeld-software.de
* Version: 1.0
* Datum: 18.05.2021
******************************** */
if (!file_exists("config.php")) {
header("Location: setup.php");
}
require("config.php");
?>
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="author" content="Walter Hupfeld, info@hupfeld-software.de">
<meta name="description" content="Georeferenzieter Ideenmelder">
<link rel="stylesheet" href="css/bootstrap.min.css" />
<link rel="stylesheet" href="css/style.css" />
<link rel="stylesheet" href="css/leaflet.css" />
<link rel="stylesheet" href="css/leaflet.awesome-markers.css" />
<link rel="stylesheet" href="css/lightbox.css" />
<link rel="stylesheet" href="css/font-awesome.min.css">
<link rel="stylesheet" href="vendor/DataTables/datatable.min.css">
<link rel="stylesheet" href="vendor/DataTables/DataTables-1.10.21/css/dataTables.bootstrap4.min.css">
<title>Eintragsliste</title>
<script src="js/jquery.min.js"></script>
<script src="js/leaflet.js"></script>
<script src="js/leaflet.ajax.js"></script>
<script src="js/leaflet.awesome-markers.js"></script>
<script src="js/lightbox.min.js"></script>
<script src="vendor/DataTables/datatables.js"></script>
<script src="vendor/DataTables/DataTables-1.10.21/js/dataTables.bootstrap4.min.js"></script>
<style>
#whmap { display:none; position:absolute; top:150px; left:400px; }
#detailmap { height:450px; width:400px;}
.comment { border-top: 1px solid darkgrey; padding: 3px 0 3px 0; }
</style>
</head>
<body>
<!-- Navbar -->
<nav class="navbar navbar-expand-md navbar-dark bg-dark fixed-top">
<a class="navbar-brand" href="#"><?= $strTitle ?></a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbars" aria-controls="navbars" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbars">
<ul class="navbar-nav mr-auto">
<li class="nav-item">
<a class="nav-link" href="index.php?ref=1">Karte</a>
</li>
<li class="nav-item active">
<a class="nav-link" href="liste.php">Liste <span class="sr-only">(current)</span></a>
</li>
</ul>
<div>
<ul class="navbar-nav mr-auto right">
<li class="nav-item">
<a class="nav-link" href="impressum.php">Impressum</a>
</li>
<li class="nav-item">
<a class="nav-link" href="datenschutz.php">Datenschutzerklärung</a>
</li>
<li class="nav-item">
<a class="nav-link" href="admin/login.php">Login</a>
</li>
</ul>
</div>
</nav>
<!-- Ende Navbar -->
<div class="container-fluid main" style="max-width:1360px;">
<p>&nbsp;</p>
<h2>Liste der Einträge</h2>
<table id="list" class="table table-bordered table-striped">
<thead>
<tr><th>Nr.</th><th>Name</th>
<?= ($boolUserinfo) ? "<th>Alter</th><th>Verkehrsmittel</th>" : ""; ?>
<th>Topic</th>
<th>Beschreibung</th>
<?= ($boolComment) ? "<th>Kommentare</th>" : "" ?>
<?= ($boolDefect) ? "<th>Mängelkategorie</th>" : ""; ?>
<?= ($boolRating) ? "<th><i class=\"fa fa-thumbs-up\"></i></th><th><i class=\"fa fa-thumbs-down\"></i></th>" : "" ?>
<th>Datum</th>
<?= ($boolUpload) ? "<th>Bild</th>": "" ?>
<th>Ort</th></tr>
</thead>
<tbody>
<?php
require_once("config.php");
$strSQL="SELECT loc.*,f.filename FROM location loc LEFT JOIN files f ON loc.id=f.loc_id ORDER BY created_at DESC";
$result = $db->query($strSQL);
$numCounter=1;
while ($row = $result->fetchArray()) {
$numDatum= strtotime($row['created_at']);
$id=$row['id'];
$datum= date("d.m.Y",$numDatum);
$arrPoint[]= array ('id'=>$id,'lat'=>$row['lat'],'lng'=>$row['lng'],$row['description']);
echo "<tr>";
//echo "<td>".$numCounter." <a href='mailto:".$contactEmail."?subject=Ideenmelder Eintrag ".$id."'><i class='fa fa-envelope-o'></i>"."</td>";
echo "<td>".$id."</td>";
echo "<td>". stripslashes($row['username']) ."</td>";
if ($boolUserinfo) {
echo "<td>".$row['age']."</td>";
echo "<td>".$row['transport']."</td>";
}
echo "<td>".$arrIcon[$row['topic']]." ".$arrTopic[$row['topic']]."</td>";
echo "<td>" . nl2br(stripslashes($row['description']))."</td>";
if ($boolComment) {
echo "<td>";
$strSQL = "SELECT username,comment,created_at FROM comment WHERE loc_id=".$id;
$comments = $db->query($strSQL);
while ($comment = $comments->fetchArray()) {
echo "<div class='comment'>";
echo "<em>".$comment['username']." schrieb am ";
$numDatum = strtotime($comment['created_at']);
$strDatum = date("d.m.Y",$numDatum);
echo $strDatum."</em><br>";
echo nl2br(stripslashes($comment['comment']));
echo "</div>";
}
echo "</td>";
}
if ($boolDefect) {
$strDefect = (isset($row['defect']) && $row['defect']>0) ? $arrDefect[$row['defect']] : "";
echo "<td>".$strDefect."</td>";
}
if ($boolRating) {
echo "<td>".$row['thumb_ups']."</td>";
echo "<td>".$row['thumb_downs']."</td>";
}
echo "<td>".$datum."</td>";
if ($boolUpload) {
echo "<td>";
if (isset($row['filename'])) {
echo "<a href='images/".$row['filename']."' data-lightbox='radweg".$id."'>";
echo "<img style='width:120px' src='images/".$row['filename']."'></a>";
}
echo "</td>";
}
echo "<td><a class='maplink' name='".$id."' href='#'>Karte</a><!--".round($row['lat'],4)." / ".round($row['lng'],4)."--></td>";
echo "</tr>\n";
$numCounter++;
}
?>
</tbody>
</table>
<a class="btn btn-primary" href="index.php?ref=1">zurück</a>
</div>
<div id="whmap">
<div id="whmap-header"> <span id="close" type="button" class="close right text-danger">
<i class="fa fa-window-close"></i>
</span>
</div>
<div id="detailmap"></div>
</div>
</body>
<script>
jQuery(document).ready(function(){
dataTable = $('#list').DataTable( {
language: {
url: 'vendor/DataTables/de_DE.json'
}
});
<?php
echo " var points = [];\n";
foreach ($arrPoint as $point) {
echo " points[".$point['id']."]= {lat: ".$point['lat'].",lng: ".$point['lng']." }\n";
}
?>
var mymap = L.map('detailmap').setView([51.66, 7.82], 17);
L.tileLayer('https://api.mapbox.com/styles/v1/{id}/tiles/{z}/{x}/{y}?access_token=pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpejY4NXVycTA2emYycXBndHRqcmZ3N3gifQ.rJcFIG214AriISLbB6B5aw', {
maxZoom: 18,
minZoom:12,
attribution: 'Map data &copy; <a href="https://www.openstreetmap.org/">OpenStreetMap</a> contributors, ' +
'<a href="https://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, ' +
'Imagery © <a href="https://www.mapbox.com/">Mapbox</a>',
id: 'mapbox/streets-v11',
tileSize: 512,
zoomOffset: -1
}).addTo(mymap);
$('.maplink').click(function(e){
$('#whmap').hide();
$('#whmap').css({'top':e.pageY-90,'left':e.pageX-420});
$('#whmap').show();
id = $(this)[0].name;
console.log(points[id].lat+" "+points[id].lng)
mymap.setView([points[id].lat,points[id].lng],16);
L.marker([points[id].lat, points[id].lng], ).addTo(mymap);
mymap.invalidateSize();
e.preventDefault();
});
$('#close').click(function(e){
$('#whmap').hide();
});
});
</script>
</html>

@ -0,0 +1,255 @@
<?php
/** *****************************
* Ideenmelder
* Autor: Walter Hupfeld, Hamm
* E-Mail: info@hupfeld-software.de
* Version: 1.0
* Datum: 18.05.2021
******************************** */
$dbFilename = "db/locations.db";
$boolError=false;
if (file_exists("db/locations.php")) {
die ("Datenbank existiert bereits.");
}
?>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="css/bootstrap.min.css" />
<link href="https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet">
<title>Setup</title>
<style>
.leftlabel { width: 10em;}
input[type="text"] { width: 18em;}
input.wide {width: 24em;}
</style>
</head>
<body>
<div class="container">
<h1>Setup</h1>
<form method="post" id="myform" action="setup_chk.php">
<div class="row">
<div class="col-md-7 col-lg-7">
<h3>Datenbank und Bildverzeichnis einrichten</h3>
<ul class="list-group">
<li class="list-group-item">
<?php
/** **************************************************
*
* Image-Folder anlegen
*
************************************************** */
echo "Bildverzeichnis ";
if (file_exists("images/")) {
echo "existiert bereits";
if (is_writable("images/")) {
echo " und ist beschreibbar. ok";
} else {
echo ", ist aber nicht beschreibar. Korrigieren Sie die rechte auf dem Server.";
}
} else {
// Verzeichnis anlegen
if (mkdir("images",0755)) {
$strImagePath=getcwd();
$strImagePath.="/images/";
echo $strImagePath." wurde erfolgreich angelegt";
} else {
echo "<span class='warning'>Fehler beim Anlegen des Bildverzeichnisses.</span>";
}
}
?>
</li>
<li class="list-group-item">
<?php
/** **************************************************
*
* Datenbank anlegen
*
************************************************** */
echo "Datenbankverzeichnis anlegen: ";
if (file_exists("db/locations.db")) {
echo "Datenbank existiert bereits.";
$boolError=true;
die ("Abbruch");
} else {
if (file_exists("db") && is_writable("db")) {
echo "Datenbankverzeichnis existiert bereits";
} else {
if (mkdir("db",0755)) {
echo "Datenbankverzeichnis angelegt. ";
} else {
echo "<span class='error'>Datenbankverzeichnis konnte nicht angelegt werden.</span>";
$boolError=true;
}
}
}
?>
</li>
<li class="list-group-item">
<?php
/** **************************************************
*
* Datenbank anlegen
*
************************************************** */
echo "Datenbank anlegen: ";
if (!$boolError && !file_exists("db/locations.db")) {
require("admin/create_database.php");
echo "Datenbank angelegt";
} else {
echo "Datenbankverzeichnis nicht angelegt oder Datenbank existiert bereits.";
}
require("config.php");
?>
</li>
</ul>
<br>
<div class="card">
<div class="card-header">
<h3>Nutzerdaten</h3>
</div>
<div class="card-body">
<label class="leftlabel">Login: </label>
<input type="text" name="login" id="login" value="admin" required ><br>
<label class="leftlabel">Passwort: </label>
<input type="password" name="password" id="password" value="" minlength="8" required><br>
<label class="leftlabel">Passwort (Wdh.): </label>
<input type="password" name="password2" id="password2" value="" minlength="8" required>
</div>
</div>
<br>
<div class="card">
<div class="card-header">
<h3>Dateneingabe aktivieren</h3>
</div>
<div class="card-body">
<input type="checkbox" id="active" name="active" <?= ($boolActive) ? "checked=\"checked\"" :"" ?> >
<label for="active">Dateneingabe aktivieren</label><br>
</div>
</div>
<br>
<div class="card">
<div class="card-header">
<h3>Konfiguration</h3>
</div>
<div class="card-body">
<input type="checkbox" id="fileupload" name="fileupload" <?= ($boolUpload) ? "checked=\"checked\"" :"" ?> >
<label for="fileupload">Bilder hochladen erlauben</label><br>
<input type="checkbox" id="rating" name="rating" <?= ($boolRating) ? "checked=\"checked\"" :"" ?>>
<label for="rating"> Bewertungungen erlauben</label><br>
<input type="checkbox" id="comment" name="comment" <?= ($boolComment) ? "checked=\"checked\"" :"" ?> >
<label for="comment">Kommentare erlauben</label><br>
<input type="checkbox" id="defect" name="defect" <?= ($boolDefect) ? "checked=\"checked\"" :"" ?> >
<label for="defect">Mängelkategorien einblenden</label><br>
<input type="checkbox" id="userinfo" name="userinfo" <?= ($boolUserinfo) ? "checked=\"checked\"" :"" ?> >
<label for="userinfo">Nutzerinformation (Alter/Verkehrsmittel)</label>
<br>
<label class="leftlabel">Uplaod-Pfad:</label>
<input type="text" class="wide" name="uploaddir" id="uploaddir" value="<?=$strImagePath?>">
</div>
</div>
<br>
<div class="card">
<div class="card-header">
<h3>Karteninfo</h3>
</div>
<div class="card-body">
<h4>Stadt oder Kreis</h4>
<label class="leftlabel">Stadt/Kreis: </label>
<input type="text" name="district" id="district" value="<?=$strStadt?>" required >
<h4>Kartenzentrum</h4>
<div class="small">Hier liegt das Zentrum der Karte und es erscheint der Info-Marker.</div>
<label class="leftlabel">Latitude:</label><input type="text" name="lat" id="lat" value="<?=$numInfoLat?>" required><br>
<label class="leftlabel">Longitude:</label><input type="text" name="lng" id="lng" value="<?=$numInfoLng?>" required><br>
<div class="small">Zoom-Faktor beim Start der Karte.</div>
<label class="leftlabel">Startzoom:</label><input type="text" name="zoom" id="zoom" value="<?=$numZoom?>" required>
<h4>GeoJson</h4>
<p>Die Datei kann man von folgender Adresse laden und ins Vezeichnis /geojson kopieren:
<a href="https://public.opendatasoft.com/explore/dataset/landkreise-in-germany/export/">public.opendatasoft.com</a>
</p>
<label class="leftlabel">GeoJson-Datei: </label><input type="text" name="geojson" id="geojson" value="<?=$fileGeojson?>" required>
</div>
</div>
<br>
<div class="card">
<div class="card-header">
<h3>Anbieterinformation</h3>
</div>
<div class="card-body">
<label class="leftlabel">Titel:</label><input type="text" name="title" id="title" value="<?=$strTitle?>" required><br>
<label class="leftlabel">Kontakt-Email:</label><input type="text" name="contactEmail" id="contactEmail" value="<?=$contactEmail?>" required><br>
<label class="leftlabel">Logo:</label><input type="text" name="logo" id="logo" value="<?=$strLogo?>"><br>
<label class="leftlabel">Url:</label><input type="text" class="wide" name="url" id="url" value="<?=$strUrl?>"><br>
<label class="leftlabel">Url-Text:</label><input type="text" class="wide" name="urlBez" id="urlBez" value="<?=$strUrlBez?>"><br>
<label>Impressum: (HTML erlaubt)</label>
<textarea id="impressum" name="impressum" rows="8" style="width:35em;" required><?= stripslashes($strImpressum) ?></textarea>
</div>
</div>
<br>
<div class="card">
<div class="card-header">
<h3>Einführungstext im Tooltipp</h3>
</div>
<div class="card-body">
<label>Tooltipp-Text: (HTML erlaubt)</label>
<textarea name="introtext" id="input" class="form-control" style="width:35em;" rows="10" required="required">
<?= stripslashes($strIntroText) ?></textarea>
</div>
</div>
<br>
<input type="submit" class="btn btn-primary" value="Konfiguration erzeugen">
</form>
<br><br><br>
</div>
</div> <!-- row -->
</div>
<script>
$('#myform').submit(function(e){
password1 = $("#password").val();
password2 = $("#password2").val();
if (password1==password2) {
if (password1.length < 8) {
alert("Passwort muss mindestens 8 Zeichen haben.");
return false;
} else {
return true;
}
} else {
alert("Passwörter nicht gleich");
return false;
e.preventDefault();
}
});
</script>
</body>
</html>

@ -0,0 +1,75 @@
<?php
/** *****************************
* Ideenmelder
* Autor: Walter Hupfeld, Hamm
* E-Mail: info@hupfeld-software.de
* Version: 1.0
* Datum: 18.05.2021
******************************** */
$dbFilename = "db/locations.db";
$db = new SQLite3($dbFilename);
$boolActive = (isset($_POST['active'])) ? "1" : "0";
$boolRating = (isset($_POST['rating'])) ? "1" : "0";
$boolComment = (isset($_POST['comment'])) ? "1" : "0";
$boolUpload = (isset($_POST['fileupload'])) ? "1" : "0";
$boolUserinfo = (isset($_POST['userinfo'])) ? "1" : "0";
$boolDefect = (isset($_POST['defect'])) ? "1" : "0";
$boolActive = 1;
$strUploaddir = $_POST['uploaddir'];
$strStadt = $_POST['district'];
$strTitle = $_POST['title'];
$fileGeojson =$_POST['geojson'];
$numInfoLat = $_POST['lat'];;
$numInfoLng = $_POST['lng'];;
$numZoom = $_POST['zoom'];;
$strLogo = $_POST['logo'];;
$contactEmail= $_POST['contactEmail'];;
$strImpressum= $_POST['impressum'];
$strUrl = $_POST['url'];
$strUrlBez = $_POST['urlBez'];
$strIntroText= $_POST['introtext'];
$strUsername = $_POST['login'];
$strPassword = $_POST['password'];
$strImpressum=addslashes($strImpressum);
$strIntroText=addslashes($strIntroText);
$strPasswordHash = password_hash($strPassword,PASSWORD_BCRYPT);
// Username und Passwort in der Datenbank
$strSQL = "INSERT INTO user (username,passwordhash) values (:username, :passwordhash)";
$stmt = $db->prepare($strSQL);
$stmt->bindValue(':username', $strUsername);
$stmt->bindValue(':passwordhash', $strPasswordHash);
$stmt->execute();
$db->query("UPDATE config SET value= '$strUploaddir' WHERE key='uploaddir'");
$db->query("UPDATE config SET value= '$fileGeojson' WHERE key='fileGeojson'");
$db->query("UPDATE config SET value= '$strStadt' WHERE key='stadt'");
$db->query("UPDATE config SET value= '$strTitle' WHERE key='title'");
$db->query("UPDATE config SET value= '$numInfoLat' WHERE key='InfoLat'");
$db->query("UPDATE config SET value= '$numInfoLng' WHERE key='InfoLng'");
$db->query("UPDATE config SET value= '$numZoom' WHERE key='zoom'");
$db->query("UPDATE config SET value= '$strLogo' WHERE key='logo'");
$db->query("UPDATE config SET value= '$contactEmail' WHERE key='contactEmail'");
$db->query("UPDATE config SET value= '$strImpressum' WHERE key='impressum'");
$db->query("UPDATE config SET value= '$strUrl' WHERE key='url'");
$db->query("UPDATE config SET value= '$strUrlBez' WHERE key='UrlBez'");
$db->query("UPDATE config SET value= '$strIntroText' WHERE key='IntroText'");
$db->query("UPDATE config SET value= '$boolActive' WHERE key='boolActive'");
$db->query("UPDATE config SET value= '$boolRating' WHERE key='boolRating'");
$db->query("UPDATE config SET value= '$boolComment' WHERE key='boolComment'");
$db->query("UPDATE config SET value= '$boolUserinfo' WHERE key='boolUserinfo'");
$db->query("UPDATE config SET value= '$boolDefect' WHERE key='boolDefect'");
$db->query("UPDATE config SET value= '$boolUpload' WHERE key='boolUpload'");
header("Location: index.php");

@ -0,0 +1,190 @@
table.dataTable {
clear: both;
margin-top: 6px !important;
margin-bottom: 6px !important;
max-width: none !important;
border-collapse: separate !important;
}
table.dataTable td,
table.dataTable th {
-webkit-box-sizing: content-box;
box-sizing: content-box;
}
table.dataTable td.dataTables_empty,
table.dataTable th.dataTables_empty {
text-align: center;
}
table.dataTable.nowrap th,
table.dataTable.nowrap td {
white-space: nowrap;
}
div.dataTables_wrapper div.dataTables_length label {
font-weight: normal;
text-align: left;
white-space: nowrap;
}
div.dataTables_wrapper div.dataTables_length select {
width: 75px;
display: inline-block;
}
div.dataTables_wrapper div.dataTables_filter {
text-align: right;
}
div.dataTables_wrapper div.dataTables_filter label {
font-weight: normal;
white-space: nowrap;
text-align: left;
}
div.dataTables_wrapper div.dataTables_filter input {
margin-left: 0.5em;
display: inline-block;
width: auto;
}
div.dataTables_wrapper div.dataTables_info {
padding-top: 8px;
white-space: nowrap;
}
div.dataTables_wrapper div.dataTables_paginate {
margin: 0;
white-space: nowrap;
text-align: right;
}
div.dataTables_wrapper div.dataTables_paginate ul.pagination {
margin: 2px 0;
white-space: nowrap;
}
div.dataTables_wrapper div.dataTables_processing {
position: absolute;
top: 50%;
left: 50%;
width: 200px;
margin-left: -100px;
margin-top: -26px;
text-align: center;
padding: 1em 0;
}
table.dataTable thead > tr > th.sorting_asc, table.dataTable thead > tr > th.sorting_desc, table.dataTable thead > tr > th.sorting,
table.dataTable thead > tr > td.sorting_asc,
table.dataTable thead > tr > td.sorting_desc,
table.dataTable thead > tr > td.sorting {
padding-right: 30px;
}
table.dataTable thead > tr > th:active,
table.dataTable thead > tr > td:active {
outline: none;
}
table.dataTable thead .sorting,
table.dataTable thead .sorting_asc,
table.dataTable thead .sorting_desc,
table.dataTable thead .sorting_asc_disabled,
table.dataTable thead .sorting_desc_disabled {
cursor: pointer;
position: relative;
}
table.dataTable thead .sorting:after,
table.dataTable thead .sorting_asc:after,
table.dataTable thead .sorting_desc:after,
table.dataTable thead .sorting_asc_disabled:after,
table.dataTable thead .sorting_desc_disabled:after {
position: absolute;
bottom: 8px;
right: 8px;
display: block;
font-family: 'Glyphicons Halflings';
opacity: 0.5;
}
table.dataTable thead .sorting:after {
opacity: 0.2;
content: "\e150";
/* sort */
}
table.dataTable thead .sorting_asc:after {
content: "\e155";
/* sort-by-attributes */
}
table.dataTable thead .sorting_desc:after {
content: "\e156";
/* sort-by-attributes-alt */
}
table.dataTable thead .sorting_asc_disabled:after,
table.dataTable thead .sorting_desc_disabled:after {
color: #eee;
}
div.dataTables_scrollHead table.dataTable {
margin-bottom: 0 !important;
}
div.dataTables_scrollBody > table {
border-top: none;
margin-top: 0 !important;
margin-bottom: 0 !important;
}
div.dataTables_scrollBody > table > thead .sorting:after,
div.dataTables_scrollBody > table > thead .sorting_asc:after,
div.dataTables_scrollBody > table > thead .sorting_desc:after {
display: none;
}
div.dataTables_scrollBody > table > tbody > tr:first-child > th,
div.dataTables_scrollBody > table > tbody > tr:first-child > td {
border-top: none;
}
div.dataTables_scrollFoot > .dataTables_scrollFootInner {
box-sizing: content-box;
}
div.dataTables_scrollFoot > .dataTables_scrollFootInner > table {
margin-top: 0 !important;
border-top: none;
}
@media screen and (max-width: 767px) {
div.dataTables_wrapper div.dataTables_length,
div.dataTables_wrapper div.dataTables_filter,
div.dataTables_wrapper div.dataTables_info,
div.dataTables_wrapper div.dataTables_paginate {
text-align: center;
}
}
table.dataTable.table-condensed > thead > tr > th {
padding-right: 20px;
}
table.dataTable.table-condensed .sorting:after,
table.dataTable.table-condensed .sorting_asc:after,
table.dataTable.table-condensed .sorting_desc:after {
top: 6px;
right: 6px;
}
table.table-bordered.dataTable {
border-right-width: 0;
}
table.table-bordered.dataTable th,
table.table-bordered.dataTable td {
border-left-width: 0;
}
table.table-bordered.dataTable th:last-child, table.table-bordered.dataTable th:last-child,
table.table-bordered.dataTable td:last-child,
table.table-bordered.dataTable td:last-child {
border-right-width: 1px;
}
table.table-bordered.dataTable tbody th,
table.table-bordered.dataTable tbody td {
border-bottom-width: 0;
}
div.dataTables_scrollHead table.table-bordered {
border-bottom-width: 0;
}
div.table-responsive > div.dataTables_wrapper > div.row {
margin: 0;
}
div.table-responsive > div.dataTables_wrapper > div.row > div[class^="col-"]:first-child {
padding-left: 0;
}
div.table-responsive > div.dataTables_wrapper > div.row > div[class^="col-"]:last-child {
padding-right: 0;
}

@ -0,0 +1 @@
table.dataTable{clear:both;margin-top:6px !important;margin-bottom:6px !important;max-width:none !important;border-collapse:separate !important}table.dataTable td,table.dataTable th{-webkit-box-sizing:content-box;box-sizing:content-box}table.dataTable td.dataTables_empty,table.dataTable th.dataTables_empty{text-align:center}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}div.dataTables_wrapper div.dataTables_length label{font-weight:normal;text-align:left;white-space:nowrap}div.dataTables_wrapper div.dataTables_length select{width:75px;display:inline-block}div.dataTables_wrapper div.dataTables_filter{text-align:right}div.dataTables_wrapper div.dataTables_filter label{font-weight:normal;white-space:nowrap;text-align:left}div.dataTables_wrapper div.dataTables_filter input{margin-left:0.5em;display:inline-block;width:auto}div.dataTables_wrapper div.dataTables_info{padding-top:8px;white-space:nowrap}div.dataTables_wrapper div.dataTables_paginate{margin:0;white-space:nowrap;text-align:right}div.dataTables_wrapper div.dataTables_paginate ul.pagination{margin:2px 0;white-space:nowrap}div.dataTables_wrapper div.dataTables_processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;margin-top:-26px;text-align:center;padding:1em 0}table.dataTable thead>tr>th.sorting_asc,table.dataTable thead>tr>th.sorting_desc,table.dataTable thead>tr>th.sorting,table.dataTable thead>tr>td.sorting_asc,table.dataTable thead>tr>td.sorting_desc,table.dataTable thead>tr>td.sorting{padding-right:30px}table.dataTable thead>tr>th:active,table.dataTable thead>tr>td:active{outline:none}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{cursor:pointer;position:relative}table.dataTable thead .sorting:after,table.dataTable thead .sorting_asc:after,table.dataTable thead .sorting_desc:after,table.dataTable thead .sorting_asc_disabled:after,table.dataTable thead .sorting_desc_disabled:after{position:absolute;bottom:8px;right:8px;display:block;font-family:'Glyphicons Halflings';opacity:0.5}table.dataTable thead .sorting:after{opacity:0.2;content:"\e150"}table.dataTable thead .sorting_asc:after{content:"\e155"}table.dataTable thead .sorting_desc:after{content:"\e156"}table.dataTable thead .sorting_asc_disabled:after,table.dataTable thead .sorting_desc_disabled:after{color:#eee}div.dataTables_scrollHead table.dataTable{margin-bottom:0 !important}div.dataTables_scrollBody>table{border-top:none;margin-top:0 !important;margin-bottom:0 !important}div.dataTables_scrollBody>table>thead .sorting:after,div.dataTables_scrollBody>table>thead .sorting_asc:after,div.dataTables_scrollBody>table>thead .sorting_desc:after{display:none}div.dataTables_scrollBody>table>tbody>tr:first-child>th,div.dataTables_scrollBody>table>tbody>tr:first-child>td{border-top:none}div.dataTables_scrollFoot>.dataTables_scrollFootInner{box-sizing:content-box}div.dataTables_scrollFoot>.dataTables_scrollFootInner>table{margin-top:0 !important;border-top:none}@media screen and (max-width: 767px){div.dataTables_wrapper div.dataTables_length,div.dataTables_wrapper div.dataTables_filter,div.dataTables_wrapper div.dataTables_info,div.dataTables_wrapper div.dataTables_paginate{text-align:center}}table.dataTable.table-condensed>thead>tr>th{padding-right:20px}table.dataTable.table-condensed .sorting:after,table.dataTable.table-condensed .sorting_asc:after,table.dataTable.table-condensed .sorting_desc:after{top:6px;right:6px}table.table-bordered.dataTable{border-right-width:0}table.table-bordered.dataTable th,table.table-bordered.dataTable td{border-left-width:0}table.table-bordered.dataTable th:last-child,table.table-bordered.dataTable th:last-child,table.table-bordered.dataTable td:last-child,table.table-bordered.dataTable td:last-child{border-right-width:1px}table.table-bordered.dataTable tbody th,table.table-bordered.dataTable tbody td{border-bottom-width:0}div.dataTables_scrollHead table.table-bordered{border-bottom-width:0}div.table-responsive>div.dataTables_wrapper>div.row{margin:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^="col-"]:first-child{padding-left:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^="col-"]:last-child{padding-right:0}

@ -0,0 +1,212 @@
table.dataTable {
clear: both;
margin-top: 6px !important;
margin-bottom: 6px !important;
max-width: none !important;
border-collapse: separate !important;
border-spacing: 0;
}
table.dataTable td,
table.dataTable th {
-webkit-box-sizing: content-box;
box-sizing: content-box;
}
table.dataTable td.dataTables_empty,
table.dataTable th.dataTables_empty {
text-align: center;
}
table.dataTable.nowrap th,
table.dataTable.nowrap td {
white-space: nowrap;
}
div.dataTables_wrapper div.dataTables_length label {
font-weight: normal;
text-align: left;
white-space: nowrap;
}
div.dataTables_wrapper div.dataTables_length select {
width: auto;
display: inline-block;
}
div.dataTables_wrapper div.dataTables_filter {
text-align: right;
}
div.dataTables_wrapper div.dataTables_filter label {
font-weight: normal;
white-space: nowrap;
text-align: left;
}
div.dataTables_wrapper div.dataTables_filter input {
margin-left: 0.5em;
display: inline-block;
width: auto;
}
div.dataTables_wrapper div.dataTables_info {
padding-top: 0.85em;
white-space: nowrap;
}
div.dataTables_wrapper div.dataTables_paginate {
margin: 0;
white-space: nowrap;
text-align: right;
}
div.dataTables_wrapper div.dataTables_paginate ul.pagination {
margin: 2px 0;
white-space: nowrap;
justify-content: flex-end;
}
div.dataTables_wrapper div.dataTables_processing {
position: absolute;
top: 50%;
left: 50%;
width: 200px;
margin-left: -100px;
margin-top: -26px;
text-align: center;
padding: 1em 0;
}
table.dataTable thead > tr > th.sorting_asc, table.dataTable thead > tr > th.sorting_desc, table.dataTable thead > tr > th.sorting,
table.dataTable thead > tr > td.sorting_asc,
table.dataTable thead > tr > td.sorting_desc,
table.dataTable thead > tr > td.sorting {
padding-right: 30px;
}
table.dataTable thead > tr > th:active,
table.dataTable thead > tr > td:active {
outline: none;
}
table.dataTable thead .sorting,
table.dataTable thead .sorting_asc,
table.dataTable thead .sorting_desc,
table.dataTable thead .sorting_asc_disabled,
table.dataTable thead .sorting_desc_disabled {
cursor: pointer;
position: relative;
}
table.dataTable thead .sorting:before, table.dataTable thead .sorting:after,
table.dataTable thead .sorting_asc:before,
table.dataTable thead .sorting_asc:after,
table.dataTable thead .sorting_desc:before,
table.dataTable thead .sorting_desc:after,
table.dataTable thead .sorting_asc_disabled:before,
table.dataTable thead .sorting_asc_disabled:after,
table.dataTable thead .sorting_desc_disabled:before,
table.dataTable thead .sorting_desc_disabled:after {
position: absolute;
bottom: 0.9em;
display: block;
opacity: 0.3;
}
table.dataTable thead .sorting:before,
table.dataTable thead .sorting_asc:before,
table.dataTable thead .sorting_desc:before,
table.dataTable thead .sorting_asc_disabled:before,
table.dataTable thead .sorting_desc_disabled:before {
right: 1em;
content: "\2191";
}
table.dataTable thead .sorting:after,
table.dataTable thead .sorting_asc:after,
table.dataTable thead .sorting_desc:after,
table.dataTable thead .sorting_asc_disabled:after,
table.dataTable thead .sorting_desc_disabled:after {
right: 0.5em;
content: "\2193";
}
table.dataTable thead .sorting_asc:before,
table.dataTable thead .sorting_desc:after {
opacity: 1;
}
table.dataTable thead .sorting_asc_disabled:before,
table.dataTable thead .sorting_desc_disabled:after {
opacity: 0;
}
div.dataTables_scrollHead table.dataTable {
margin-bottom: 0 !important;
}
div.dataTables_scrollBody table {
border-top: none;
margin-top: 0 !important;
margin-bottom: 0 !important;
}
div.dataTables_scrollBody table thead .sorting:before,
div.dataTables_scrollBody table thead .sorting_asc:before,
div.dataTables_scrollBody table thead .sorting_desc:before,
div.dataTables_scrollBody table thead .sorting:after,
div.dataTables_scrollBody table thead .sorting_asc:after,
div.dataTables_scrollBody table thead .sorting_desc:after {
display: none;
}
div.dataTables_scrollBody table tbody tr:first-child th,
div.dataTables_scrollBody table tbody tr:first-child td {
border-top: none;
}
div.dataTables_scrollFoot > .dataTables_scrollFootInner {
box-sizing: content-box;
}
div.dataTables_scrollFoot > .dataTables_scrollFootInner > table {
margin-top: 0 !important;
border-top: none;
}
@media screen and (max-width: 767px) {
div.dataTables_wrapper div.dataTables_length,
div.dataTables_wrapper div.dataTables_filter,
div.dataTables_wrapper div.dataTables_info,
div.dataTables_wrapper div.dataTables_paginate {
text-align: center;
}
div.dataTables_wrapper div.dataTables_paginate ul.pagination {
justify-content: center !important;
}
}
table.dataTable.table-sm > thead > tr > th :not(.sorting_disabled) {
padding-right: 20px;
}
table.dataTable.table-sm .sorting:before,
table.dataTable.table-sm .sorting_asc:before,
table.dataTable.table-sm .sorting_desc:before {
top: 5px;
right: 0.85em;
}
table.dataTable.table-sm .sorting:after,
table.dataTable.table-sm .sorting_asc:after,
table.dataTable.table-sm .sorting_desc:after {
top: 5px;
}
table.table-bordered.dataTable {
border-right-width: 0;
}
table.table-bordered.dataTable th,
table.table-bordered.dataTable td {
border-left-width: 0;
}
table.table-bordered.dataTable th:last-child, table.table-bordered.dataTable th:last-child,
table.table-bordered.dataTable td:last-child,
table.table-bordered.dataTable td:last-child {
border-right-width: 1px;
}
table.table-bordered.dataTable tbody th,
table.table-bordered.dataTable tbody td {
border-bottom-width: 0;
}
div.dataTables_scrollHead table.table-bordered {
border-bottom-width: 0;
}
div.table-responsive > div.dataTables_wrapper > div.row {
margin: 0;
}
div.table-responsive > div.dataTables_wrapper > div.row > div[class^="col-"]:first-child {
padding-left: 0;
}
div.table-responsive > div.dataTables_wrapper > div.row > div[class^="col-"]:last-child {
padding-right: 0;
}

File diff suppressed because one or more lines are too long

@ -0,0 +1,118 @@
table.dataTable {
clear: both;
margin: 0.5em 0 !important;
max-width: none !important;
width: 100%;
}
table.dataTable td,
table.dataTable th {
-webkit-box-sizing: content-box;
box-sizing: content-box;
}
table.dataTable td.dataTables_empty,
table.dataTable th.dataTables_empty {
text-align: center;
}
table.dataTable.nowrap th, table.dataTable.nowrap td {
white-space: nowrap;
}
div.dataTables_wrapper {
position: relative;
}
div.dataTables_wrapper div.dataTables_length label {
float: left;
text-align: left;
margin-bottom: 0;
}
div.dataTables_wrapper div.dataTables_length select {
width: 75px;
margin-bottom: 0;
}
div.dataTables_wrapper div.dataTables_filter label {
float: right;
margin-bottom: 0;
}
div.dataTables_wrapper div.dataTables_filter input {
display: inline-block !important;
width: auto !important;
margin-bottom: 0;
margin-left: 0.5em;
}
div.dataTables_wrapper div.dataTables_info {
padding-top: 2px;
}
div.dataTables_wrapper div.dataTables_paginate {
float: right;
margin: 0;
}
div.dataTables_wrapper div.dataTables_processing {
position: absolute;
top: 50%;
left: 50%;
width: 200px;
margin-left: -100px;
margin-top: -26px;
text-align: center;
padding: 1rem 0;
}
table.dataTable thead > tr > th.sorting_asc, table.dataTable thead > tr > th.sorting_desc, table.dataTable thead > tr > th.sorting,
table.dataTable thead > tr > td.sorting_asc,
table.dataTable thead > tr > td.sorting_desc,
table.dataTable thead > tr > td.sorting {
padding-right: 1.5rem;
}
table.dataTable thead > tr > th:active,
table.dataTable thead > tr > td:active {
outline: none;
}
table.dataTable thead .sorting,
table.dataTable thead .sorting_asc,
table.dataTable thead .sorting_desc,
table.dataTable thead .sorting_asc_disabled,
table.dataTable thead .sorting_desc_disabled {
cursor: pointer;
}
table.dataTable thead .sorting,
table.dataTable thead .sorting_asc,
table.dataTable thead .sorting_desc,
table.dataTable thead .sorting_asc_disabled,
table.dataTable thead .sorting_desc_disabled {
background-repeat: no-repeat;
background-position: center right;
}
table.dataTable thead .sorting {
background-image: url("../images/sort_both.png");
}
table.dataTable thead .sorting_asc {
background-image: url("../images/sort_asc.png");
}
table.dataTable thead .sorting_desc {
background-image: url("../images/sort_desc.png");
}
table.dataTable thead .sorting_asc_disabled {
background-image: url("../images/sort_asc_disabled.png");
}
table.dataTable thead .sorting_desc_disabled {
background-image: url("../images/sort_desc_disabled.png");
}
div.dataTables_scrollHead table {
margin-bottom: 0 !important;
}
div.dataTables_scrollBody table {
border-top: none;
margin-top: 0 !important;
margin-bottom: 0 !important;
}
div.dataTables_scrollBody table tbody tr:first-child th,
div.dataTables_scrollBody table tbody tr:first-child td {
border-top: none;
}
div.dataTables_scrollFoot table {
margin-top: 0 !important;
border-top: none;
}

@ -0,0 +1 @@
table.dataTable{clear:both;margin:0.5em 0 !important;max-width:none !important;width:100%}table.dataTable td,table.dataTable th{-webkit-box-sizing:content-box;box-sizing:content-box}table.dataTable td.dataTables_empty,table.dataTable th.dataTables_empty{text-align:center}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}div.dataTables_wrapper{position:relative}div.dataTables_wrapper div.dataTables_length label{float:left;text-align:left;margin-bottom:0}div.dataTables_wrapper div.dataTables_length select{width:75px;margin-bottom:0}div.dataTables_wrapper div.dataTables_filter label{float:right;margin-bottom:0}div.dataTables_wrapper div.dataTables_filter input{display:inline-block !important;width:auto !important;margin-bottom:0;margin-left:0.5em}div.dataTables_wrapper div.dataTables_info{padding-top:2px}div.dataTables_wrapper div.dataTables_paginate{float:right;margin:0}div.dataTables_wrapper div.dataTables_processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;margin-top:-26px;text-align:center;padding:1rem 0}table.dataTable thead>tr>th.sorting_asc,table.dataTable thead>tr>th.sorting_desc,table.dataTable thead>tr>th.sorting,table.dataTable thead>tr>td.sorting_asc,table.dataTable thead>tr>td.sorting_desc,table.dataTable thead>tr>td.sorting{padding-right:1.5rem}table.dataTable thead>tr>th:active,table.dataTable thead>tr>td:active{outline:none}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{cursor:pointer}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{background-repeat:no-repeat;background-position:center right}table.dataTable thead .sorting{background-image:url("../images/sort_both.png")}table.dataTable thead .sorting_asc{background-image:url("../images/sort_asc.png")}table.dataTable thead .sorting_desc{background-image:url("../images/sort_desc.png")}table.dataTable thead .sorting_asc_disabled{background-image:url("../images/sort_asc_disabled.png")}table.dataTable thead .sorting_desc_disabled{background-image:url("../images/sort_desc_disabled.png")}div.dataTables_scrollHead table{margin-bottom:0 !important}div.dataTables_scrollBody table{border-top:none;margin-top:0 !important;margin-bottom:0 !important}div.dataTables_scrollBody table tbody tr:first-child th,div.dataTables_scrollBody table tbody tr:first-child td{border-top:none}div.dataTables_scrollFoot table{margin-top:0 !important;border-top:none}

@ -0,0 +1,481 @@
/*
* Table styles
*/
table.dataTable {
width: 100%;
margin: 0 auto;
clear: both;
border-collapse: separate;
border-spacing: 0;
/*
* Header and footer styles
*/
/*
* Body styles
*/
}
table.dataTable thead th,
table.dataTable tfoot th {
font-weight: bold;
}
table.dataTable thead th,
table.dataTable thead td {
padding: 10px 18px;
}
table.dataTable thead th:active,
table.dataTable thead td:active {
outline: none;
}
table.dataTable tfoot th,
table.dataTable tfoot td {
padding: 10px 18px 6px 18px;
}
table.dataTable tbody tr {
background-color: #ffffff;
}
table.dataTable tbody tr.selected {
background-color: #B0BED9;
}
table.dataTable tbody th,
table.dataTable tbody td {
padding: 8px 10px;
}
table.dataTable.row-border tbody th, table.dataTable.row-border tbody td, table.dataTable.display tbody th, table.dataTable.display tbody td {
border-top: 1px solid #ddd;
}
table.dataTable.row-border tbody tr:first-child th,
table.dataTable.row-border tbody tr:first-child td, table.dataTable.display tbody tr:first-child th,
table.dataTable.display tbody tr:first-child td {
border-top: none;
}
table.dataTable.cell-border tbody th, table.dataTable.cell-border tbody td {
border-top: 1px solid #ddd;
border-right: 1px solid #ddd;
}
table.dataTable.cell-border tbody tr th:first-child,
table.dataTable.cell-border tbody tr td:first-child {
border-left: 1px solid #ddd;
}
table.dataTable.cell-border tbody tr:first-child th,
table.dataTable.cell-border tbody tr:first-child td {
border-top: none;
}
table.dataTable.stripe tbody tr.odd, table.dataTable.display tbody tr.odd {
background-color: #f9f9f9;
}
table.dataTable.stripe tbody tr.odd.selected, table.dataTable.display tbody tr.odd.selected {
background-color: #acbad4;
}
table.dataTable.hover tbody tr:hover, table.dataTable.display tbody tr:hover {
background-color: #f6f6f6;
}
table.dataTable.hover tbody tr:hover.selected, table.dataTable.display tbody tr:hover.selected {
background-color: #aab7d1;
}
table.dataTable.order-column tbody tr > .sorting_1,
table.dataTable.order-column tbody tr > .sorting_2,
table.dataTable.order-column tbody tr > .sorting_3, table.dataTable.display tbody tr > .sorting_1,
table.dataTable.display tbody tr > .sorting_2,
table.dataTable.display tbody tr > .sorting_3 {
background-color: #fafafa;
}
table.dataTable.order-column tbody tr.selected > .sorting_1,
table.dataTable.order-column tbody tr.selected > .sorting_2,
table.dataTable.order-column tbody tr.selected > .sorting_3, table.dataTable.display tbody tr.selected > .sorting_1,
table.dataTable.display tbody tr.selected > .sorting_2,
table.dataTable.display tbody tr.selected > .sorting_3 {
background-color: #acbad5;
}
table.dataTable.display tbody tr.odd > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd > .sorting_1 {
background-color: #f1f1f1;
}
table.dataTable.display tbody tr.odd > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd > .sorting_2 {
background-color: #f3f3f3;
}
table.dataTable.display tbody tr.odd > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd > .sorting_3 {
background-color: whitesmoke;
}
table.dataTable.display tbody tr.odd.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_1 {
background-color: #a6b4cd;
}
table.dataTable.display tbody tr.odd.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_2 {
background-color: #a8b5cf;
}
table.dataTable.display tbody tr.odd.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_3 {
background-color: #a9b7d1;
}
table.dataTable.display tbody tr.even > .sorting_1, table.dataTable.order-column.stripe tbody tr.even > .sorting_1 {
background-color: #fafafa;
}
table.dataTable.display tbody tr.even > .sorting_2, table.dataTable.order-column.stripe tbody tr.even > .sorting_2 {
background-color: #fcfcfc;
}
table.dataTable.display tbody tr.even > .sorting_3, table.dataTable.order-column.stripe tbody tr.even > .sorting_3 {
background-color: #fefefe;
}
table.dataTable.display tbody tr.even.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_1 {
background-color: #acbad5;
}
table.dataTable.display tbody tr.even.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_2 {
background-color: #aebcd6;
}
table.dataTable.display tbody tr.even.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_3 {
background-color: #afbdd8;
}
table.dataTable.display tbody tr:hover > .sorting_1, table.dataTable.order-column.hover tbody tr:hover > .sorting_1 {
background-color: #eaeaea;
}
table.dataTable.display tbody tr:hover > .sorting_2, table.dataTable.order-column.hover tbody tr:hover > .sorting_2 {
background-color: #ececec;
}
table.dataTable.display tbody tr:hover > .sorting_3, table.dataTable.order-column.hover tbody tr:hover > .sorting_3 {
background-color: #efefef;
}
table.dataTable.display tbody tr:hover.selected > .sorting_1, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_1 {
background-color: #a2aec7;
}
table.dataTable.display tbody tr:hover.selected > .sorting_2, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_2 {
background-color: #a3b0c9;
}
table.dataTable.display tbody tr:hover.selected > .sorting_3, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_3 {
background-color: #a5b2cb;
}
table.dataTable.no-footer {
border-bottom: 1px solid #111;
}
table.dataTable.nowrap th, table.dataTable.nowrap td {
white-space: nowrap;
}
table.dataTable.compact thead th,
table.dataTable.compact thead td {
padding: 4px 17px;
}
table.dataTable.compact tfoot th,
table.dataTable.compact tfoot td {
padding: 4px;
}
table.dataTable.compact tbody th,
table.dataTable.compact tbody td {
padding: 4px;
}
table.dataTable th.dt-left,
table.dataTable td.dt-left {
text-align: left;
}
table.dataTable th.dt-center,
table.dataTable td.dt-center,
table.dataTable td.dataTables_empty {
text-align: center;
}
table.dataTable th.dt-right,
table.dataTable td.dt-right {
text-align: right;
}
table.dataTable th.dt-justify,
table.dataTable td.dt-justify {
text-align: justify;
}
table.dataTable th.dt-nowrap,
table.dataTable td.dt-nowrap {
white-space: nowrap;
}
table.dataTable thead th.dt-head-left,
table.dataTable thead td.dt-head-left,
table.dataTable tfoot th.dt-head-left,
table.dataTable tfoot td.dt-head-left {
text-align: left;
}
table.dataTable thead th.dt-head-center,
table.dataTable thead td.dt-head-center,
table.dataTable tfoot th.dt-head-center,
table.dataTable tfoot td.dt-head-center {
text-align: center;
}
table.dataTable thead th.dt-head-right,
table.dataTable thead td.dt-head-right,
table.dataTable tfoot th.dt-head-right,
table.dataTable tfoot td.dt-head-right {
text-align: right;
}
table.dataTable thead th.dt-head-justify,
table.dataTable thead td.dt-head-justify,
table.dataTable tfoot th.dt-head-justify,
table.dataTable tfoot td.dt-head-justify {
text-align: justify;
}
table.dataTable thead th.dt-head-nowrap,
table.dataTable thead td.dt-head-nowrap,
table.dataTable tfoot th.dt-head-nowrap,
table.dataTable tfoot td.dt-head-nowrap {
white-space: nowrap;
}
table.dataTable tbody th.dt-body-left,
table.dataTable tbody td.dt-body-left {
text-align: left;
}
table.dataTable tbody th.dt-body-center,
table.dataTable tbody td.dt-body-center {
text-align: center;
}
table.dataTable tbody th.dt-body-right,
table.dataTable tbody td.dt-body-right {
text-align: right;
}
table.dataTable tbody th.dt-body-justify,
table.dataTable tbody td.dt-body-justify {
text-align: justify;
}
table.dataTable tbody th.dt-body-nowrap,
table.dataTable tbody td.dt-body-nowrap {
white-space: nowrap;
}
table.dataTable,
table.dataTable th,
table.dataTable td {
box-sizing: content-box;
}
/*
* Control feature layout
*/
.dataTables_wrapper {
position: relative;
clear: both;
*zoom: 1;
zoom: 1;
}
.dataTables_wrapper .dataTables_length {
float: left;
}
.dataTables_wrapper .dataTables_filter {
float: right;
text-align: right;
}
.dataTables_wrapper .dataTables_filter input {
margin-left: 0.5em;
}
.dataTables_wrapper .dataTables_info {
clear: both;
float: left;
padding-top: 0.755em;
}
.dataTables_wrapper .dataTables_paginate {
float: right;
text-align: right;
padding-top: 0.25em;
}
.dataTables_wrapper .dataTables_paginate .paginate_button {
box-sizing: border-box;
display: inline-block;
min-width: 1.5em;
padding: 0.5em 1em;
margin-left: 2px;
text-align: center;
text-decoration: none !important;
cursor: pointer;
*cursor: hand;
color: #333 !important;
border: 1px solid transparent;
border-radius: 2px;
}
.dataTables_wrapper .dataTables_paginate .paginate_button.current, .dataTables_wrapper .dataTables_paginate .paginate_button.current:hover {
color: #333 !important;
border: 1px solid #979797;
background-color: white;
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, white), color-stop(100%, #dcdcdc));
/* Chrome,Safari4+ */
background: -webkit-linear-gradient(top, white 0%, #dcdcdc 100%);
/* Chrome10+,Safari5.1+ */
background: -moz-linear-gradient(top, white 0%, #dcdcdc 100%);
/* FF3.6+ */
background: -ms-linear-gradient(top, white 0%, #dcdcdc 100%);
/* IE10+ */
background: -o-linear-gradient(top, white 0%, #dcdcdc 100%);
/* Opera 11.10+ */
background: linear-gradient(to bottom, white 0%, #dcdcdc 100%);
/* W3C */
}
.dataTables_wrapper .dataTables_paginate .paginate_button.disabled, .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover, .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active {
cursor: default;
color: #666 !important;
border: 1px solid transparent;
background: transparent;
box-shadow: none;
}
.dataTables_wrapper .dataTables_paginate .paginate_button:hover {
color: white !important;
border: 1px solid #111;
background-color: #585858;
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111));
/* Chrome,Safari4+ */
background: -webkit-linear-gradient(top, #585858 0%, #111 100%);
/* Chrome10+,Safari5.1+ */
background: -moz-linear-gradient(top, #585858 0%, #111 100%);
/* FF3.6+ */
background: -ms-linear-gradient(top, #585858 0%, #111 100%);
/* IE10+ */
background: -o-linear-gradient(top, #585858 0%, #111 100%);
/* Opera 11.10+ */
background: linear-gradient(to bottom, #585858 0%, #111 100%);
/* W3C */
}
.dataTables_wrapper .dataTables_paginate .paginate_button:active {
outline: none;
background-color: #2b2b2b;
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c));
/* Chrome,Safari4+ */
background: -webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
/* Chrome10+,Safari5.1+ */
background: -moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
/* FF3.6+ */
background: -ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
/* IE10+ */
background: -o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
/* Opera 11.10+ */
background: linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%);
/* W3C */
box-shadow: inset 0 0 3px #111;
}
.dataTables_wrapper .dataTables_paginate .ellipsis {
padding: 0 1em;
}
.dataTables_wrapper .dataTables_processing {
position: absolute;
top: 50%;
left: 50%;
width: 100%;
height: 40px;
margin-left: -50%;
margin-top: -25px;
padding-top: 20px;
text-align: center;
font-size: 1.2em;
background-color: white;
background: -webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255, 255, 255, 0)), color-stop(25%, rgba(255, 255, 255, 0.9)), color-stop(75%, rgba(255, 255, 255, 0.9)), color-stop(100%, rgba(255, 255, 255, 0)));
background: -webkit-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
background: -moz-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
background: -ms-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
background: -o-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
background: linear-gradient(to right, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
}
.dataTables_wrapper .dataTables_length,
.dataTables_wrapper .dataTables_filter,
.dataTables_wrapper .dataTables_info,
.dataTables_wrapper .dataTables_processing,
.dataTables_wrapper .dataTables_paginate {
color: #333;
}
.dataTables_wrapper .dataTables_scroll {
clear: both;
}
.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody {
*margin-top: -1px;
-webkit-overflow-scrolling: touch;
}
.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > thead > tr > th, .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > thead > tr > td, .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > tbody > tr > th, .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > tbody > tr > td {
vertical-align: middle;
}
.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > thead > tr > th > div.dataTables_sizing,
.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > thead > tr > td > div.dataTables_sizing, .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > tbody > tr > th > div.dataTables_sizing,
.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > tbody > tr > td > div.dataTables_sizing {
height: 0;
overflow: hidden;
margin: 0 !important;
padding: 0 !important;
}
.dataTables_wrapper.no-footer .dataTables_scrollBody {
border-bottom: 1px solid #111;
}
.dataTables_wrapper.no-footer div.dataTables_scrollHead table.dataTable,
.dataTables_wrapper.no-footer div.dataTables_scrollBody > table {
border-bottom: none;
}
.dataTables_wrapper:after {
visibility: hidden;
display: block;
content: "";
clear: both;
height: 0;
}
@media screen and (max-width: 767px) {
.dataTables_wrapper .dataTables_info,
.dataTables_wrapper .dataTables_paginate {
float: none;
text-align: center;
}
.dataTables_wrapper .dataTables_paginate {
margin-top: 0.5em;
}
}
@media screen and (max-width: 640px) {
.dataTables_wrapper .dataTables_length,
.dataTables_wrapper .dataTables_filter {
float: none;
text-align: center;
}
.dataTables_wrapper .dataTables_filter {
margin-top: 0.5em;
}
}
table.dataTable thead th div.DataTables_sort_wrapper {
position: relative;
}
table.dataTable thead th div.DataTables_sort_wrapper span {
position: absolute;
top: 50%;
margin-top: -8px;
right: -18px;
}
table.dataTable thead th.ui-state-default,
table.dataTable tfoot th.ui-state-default {
border-left-width: 0;
}
table.dataTable thead th.ui-state-default:first-child,
table.dataTable tfoot th.ui-state-default:first-child {
border-left-width: 1px;
}
/*
* Control feature layout
*/
.dataTables_wrapper .dataTables_paginate .fg-button {
box-sizing: border-box;
display: inline-block;
min-width: 1.5em;
padding: 0.5em;
margin-left: 2px;
text-align: center;
text-decoration: none !important;
cursor: pointer;
*cursor: hand;
border: 1px solid transparent;
}
.dataTables_wrapper .dataTables_paginate .fg-button:active {
outline: none;
}
.dataTables_wrapper .dataTables_paginate .fg-button:first-child {
border-top-left-radius: 3px;
border-bottom-left-radius: 3px;
}
.dataTables_wrapper .dataTables_paginate .fg-button:last-child {
border-top-right-radius: 3px;
border-bottom-right-radius: 3px;
}
.dataTables_wrapper .ui-widget-header {
font-weight: normal;
}
.dataTables_wrapper .ui-toolbar {
padding: 8px;
}
.dataTables_wrapper.no-footer .dataTables_scrollBody {
border-bottom: none;
}
.dataTables_wrapper .dataTables_length,
.dataTables_wrapper .dataTables_filter,
.dataTables_wrapper .dataTables_info,
.dataTables_wrapper .dataTables_processing,
.dataTables_wrapper .dataTables_paginate {
color: inherit;
}

File diff suppressed because one or more lines are too long

@ -0,0 +1,102 @@
/*
* Styling for DataTables with Semantic UI
*/
table.dataTable.table {
margin: 0;
}
table.dataTable.table thead th,
table.dataTable.table thead td {
position: relative;
}
table.dataTable.table thead th.sorting, table.dataTable.table thead th.sorting_asc, table.dataTable.table thead th.sorting_desc,
table.dataTable.table thead td.sorting,
table.dataTable.table thead td.sorting_asc,
table.dataTable.table thead td.sorting_desc {
padding-right: 20px;
}
table.dataTable.table thead th.sorting:after, table.dataTable.table thead th.sorting_asc:after, table.dataTable.table thead th.sorting_desc:after,
table.dataTable.table thead td.sorting:after,
table.dataTable.table thead td.sorting_asc:after,
table.dataTable.table thead td.sorting_desc:after {
position: absolute;
top: 12px;
right: 8px;
display: block;
font-family: Icons;
}
table.dataTable.table thead th.sorting:after,
table.dataTable.table thead td.sorting:after {
content: "\f0dc";
color: #ddd;
font-size: 0.8em;
}
table.dataTable.table thead th.sorting_asc:after,
table.dataTable.table thead td.sorting_asc:after {
content: "\f0de";
}
table.dataTable.table thead th.sorting_desc:after,
table.dataTable.table thead td.sorting_desc:after {
content: "\f0dd";
}
table.dataTable.table td,
table.dataTable.table th {
-webkit-box-sizing: content-box;
box-sizing: content-box;
}
table.dataTable.table td.dataTables_empty,
table.dataTable.table th.dataTables_empty {
text-align: center;
}
table.dataTable.table.nowrap th,
table.dataTable.table.nowrap td {
white-space: nowrap;
}
div.dataTables_wrapper div.dataTables_length select {
vertical-align: middle;
min-height: 2.7142em;
}
div.dataTables_wrapper div.dataTables_length .ui.selection.dropdown {
min-width: 0;
}
div.dataTables_wrapper div.dataTables_filter span.input {
margin-left: 0.5em;
}
div.dataTables_wrapper div.dataTables_info {
padding-top: 13px;
white-space: nowrap;
}
div.dataTables_wrapper div.dataTables_processing {
position: absolute;
top: 50%;
left: 50%;
width: 200px;
margin-left: -100px;
text-align: center;
}
div.dataTables_wrapper div.row.dt-table {
padding: 0;
}
div.dataTables_wrapper div.dataTables_scrollHead table.dataTable {
border-bottom-right-radius: 0;
border-bottom-left-radius: 0;
border-bottom: none;
}
div.dataTables_wrapper div.dataTables_scrollBody thead .sorting:after,
div.dataTables_wrapper div.dataTables_scrollBody thead .sorting_asc:after,
div.dataTables_wrapper div.dataTables_scrollBody thead .sorting_desc:after {
display: none;
}
div.dataTables_wrapper div.dataTables_scrollBody table.dataTable {
border-radius: 0;
border-top: none;
border-bottom-width: 0;
}
div.dataTables_wrapper div.dataTables_scrollBody table.dataTable.no-footer {
border-bottom-width: 1px;
}
div.dataTables_wrapper div.dataTables_scrollFoot table.dataTable {
border-top-right-radius: 0;
border-top-left-radius: 0;
border-top: none;
}

@ -0,0 +1 @@
table.dataTable.table{margin:0}table.dataTable.table thead th,table.dataTable.table thead td{position:relative}table.dataTable.table thead th.sorting,table.dataTable.table thead th.sorting_asc,table.dataTable.table thead th.sorting_desc,table.dataTable.table thead td.sorting,table.dataTable.table thead td.sorting_asc,table.dataTable.table thead td.sorting_desc{padding-right:20px}table.dataTable.table thead th.sorting:after,table.dataTable.table thead th.sorting_asc:after,table.dataTable.table thead th.sorting_desc:after,table.dataTable.table thead td.sorting:after,table.dataTable.table thead td.sorting_asc:after,table.dataTable.table thead td.sorting_desc:after{position:absolute;top:12px;right:8px;display:block;font-family:Icons}table.dataTable.table thead th.sorting:after,table.dataTable.table thead td.sorting:after{content:"\f0dc";color:#ddd;font-size:0.8em}table.dataTable.table thead th.sorting_asc:after,table.dataTable.table thead td.sorting_asc:after{content:"\f0de"}table.dataTable.table thead th.sorting_desc:after,table.dataTable.table thead td.sorting_desc:after{content:"\f0dd"}table.dataTable.table td,table.dataTable.table th{-webkit-box-sizing:content-box;box-sizing:content-box}table.dataTable.table td.dataTables_empty,table.dataTable.table th.dataTables_empty{text-align:center}table.dataTable.table.nowrap th,table.dataTable.table.nowrap td{white-space:nowrap}div.dataTables_wrapper div.dataTables_length select{vertical-align:middle;min-height:2.7142em}div.dataTables_wrapper div.dataTables_length .ui.selection.dropdown{min-width:0}div.dataTables_wrapper div.dataTables_filter span.input{margin-left:0.5em}div.dataTables_wrapper div.dataTables_info{padding-top:13px;white-space:nowrap}div.dataTables_wrapper div.dataTables_processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;text-align:center}div.dataTables_wrapper div.row.dt-table{padding:0}div.dataTables_wrapper div.dataTables_scrollHead table.dataTable{border-bottom-right-radius:0;border-bottom-left-radius:0;border-bottom:none}div.dataTables_wrapper div.dataTables_scrollBody thead .sorting:after,div.dataTables_wrapper div.dataTables_scrollBody thead .sorting_asc:after,div.dataTables_wrapper div.dataTables_scrollBody thead .sorting_desc:after{display:none}div.dataTables_wrapper div.dataTables_scrollBody table.dataTable{border-radius:0;border-top:none;border-bottom-width:0}div.dataTables_wrapper div.dataTables_scrollBody table.dataTable.no-footer{border-bottom-width:1px}div.dataTables_wrapper div.dataTables_scrollFoot table.dataTable{border-top-right-radius:0;border-top-left-radius:0;border-top:none}

@ -0,0 +1,448 @@
/*
* Table styles
*/
table.dataTable {
width: 100%;
margin: 0 auto;
clear: both;
border-collapse: separate;
border-spacing: 0;
/*
* Header and footer styles
*/
/*
* Body styles
*/
}
table.dataTable thead th,
table.dataTable tfoot th {
font-weight: bold;
}
table.dataTable thead th,
table.dataTable thead td {
padding: 10px 18px;
border-bottom: 1px solid #111;
}
table.dataTable thead th:active,
table.dataTable thead td:active {
outline: none;
}
table.dataTable tfoot th,
table.dataTable tfoot td {
padding: 10px 18px 6px 18px;
border-top: 1px solid #111;
}
table.dataTable thead .sorting,
table.dataTable thead .sorting_asc,
table.dataTable thead .sorting_desc,
table.dataTable thead .sorting_asc_disabled,
table.dataTable thead .sorting_desc_disabled {
cursor: pointer;
*cursor: hand;
background-repeat: no-repeat;
background-position: center right;
}
table.dataTable thead .sorting {
background-image: url("../images/sort_both.png");
}
table.dataTable thead .sorting_asc {
background-image: url("../images/sort_asc.png");
}
table.dataTable thead .sorting_desc {
background-image: url("../images/sort_desc.png");
}
table.dataTable thead .sorting_asc_disabled {
background-image: url("../images/sort_asc_disabled.png");
}
table.dataTable thead .sorting_desc_disabled {
background-image: url("../images/sort_desc_disabled.png");
}
table.dataTable tbody tr {
background-color: #ffffff;
}
table.dataTable tbody tr.selected {
background-color: #B0BED9;
}
table.dataTable tbody th,
table.dataTable tbody td {
padding: 8px 10px;
}
table.dataTable.row-border tbody th, table.dataTable.row-border tbody td, table.dataTable.display tbody th, table.dataTable.display tbody td {
border-top: 1px solid #ddd;
}
table.dataTable.row-border tbody tr:first-child th,
table.dataTable.row-border tbody tr:first-child td, table.dataTable.display tbody tr:first-child th,
table.dataTable.display tbody tr:first-child td {
border-top: none;
}
table.dataTable.cell-border tbody th, table.dataTable.cell-border tbody td {
border-top: 1px solid #ddd;
border-right: 1px solid #ddd;
}
table.dataTable.cell-border tbody tr th:first-child,
table.dataTable.cell-border tbody tr td:first-child {
border-left: 1px solid #ddd;
}
table.dataTable.cell-border tbody tr:first-child th,
table.dataTable.cell-border tbody tr:first-child td {
border-top: none;
}
table.dataTable.stripe tbody tr.odd, table.dataTable.display tbody tr.odd {
background-color: #f9f9f9;
}
table.dataTable.stripe tbody tr.odd.selected, table.dataTable.display tbody tr.odd.selected {
background-color: #acbad4;
}
table.dataTable.hover tbody tr:hover, table.dataTable.display tbody tr:hover {
background-color: #f6f6f6;
}
table.dataTable.hover tbody tr:hover.selected, table.dataTable.display tbody tr:hover.selected {
background-color: #aab7d1;
}
table.dataTable.order-column tbody tr > .sorting_1,
table.dataTable.order-column tbody tr > .sorting_2,
table.dataTable.order-column tbody tr > .sorting_3, table.dataTable.display tbody tr > .sorting_1,
table.dataTable.display tbody tr > .sorting_2,
table.dataTable.display tbody tr > .sorting_3 {
background-color: #fafafa;
}
table.dataTable.order-column tbody tr.selected > .sorting_1,
table.dataTable.order-column tbody tr.selected > .sorting_2,
table.dataTable.order-column tbody tr.selected > .sorting_3, table.dataTable.display tbody tr.selected > .sorting_1,
table.dataTable.display tbody tr.selected > .sorting_2,
table.dataTable.display tbody tr.selected > .sorting_3 {
background-color: #acbad5;
}
table.dataTable.display tbody tr.odd > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd > .sorting_1 {
background-color: #f1f1f1;
}
table.dataTable.display tbody tr.odd > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd > .sorting_2 {
background-color: #f3f3f3;
}
table.dataTable.display tbody tr.odd > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd > .sorting_3 {
background-color: whitesmoke;
}
table.dataTable.display tbody tr.odd.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_1 {
background-color: #a6b4cd;
}
table.dataTable.display tbody tr.odd.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_2 {
background-color: #a8b5cf;
}
table.dataTable.display tbody tr.odd.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_3 {
background-color: #a9b7d1;
}
table.dataTable.display tbody tr.even > .sorting_1, table.dataTable.order-column.stripe tbody tr.even > .sorting_1 {
background-color: #fafafa;
}
table.dataTable.display tbody tr.even > .sorting_2, table.dataTable.order-column.stripe tbody tr.even > .sorting_2 {
background-color: #fcfcfc;
}
table.dataTable.display tbody tr.even > .sorting_3, table.dataTable.order-column.stripe tbody tr.even > .sorting_3 {
background-color: #fefefe;
}
table.dataTable.display tbody tr.even.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_1 {
background-color: #acbad5;
}
table.dataTable.display tbody tr.even.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_2 {
background-color: #aebcd6;
}
table.dataTable.display tbody tr.even.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_3 {
background-color: #afbdd8;
}
table.dataTable.display tbody tr:hover > .sorting_1, table.dataTable.order-column.hover tbody tr:hover > .sorting_1 {
background-color: #eaeaea;
}
table.dataTable.display tbody tr:hover > .sorting_2, table.dataTable.order-column.hover tbody tr:hover > .sorting_2 {
background-color: #ececec;
}
table.dataTable.display tbody tr:hover > .sorting_3, table.dataTable.order-column.hover tbody tr:hover > .sorting_3 {
background-color: #efefef;
}
table.dataTable.display tbody tr:hover.selected > .sorting_1, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_1 {
background-color: #a2aec7;
}
table.dataTable.display tbody tr:hover.selected > .sorting_2, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_2 {
background-color: #a3b0c9;
}
table.dataTable.display tbody tr:hover.selected > .sorting_3, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_3 {
background-color: #a5b2cb;
}
table.dataTable.no-footer {
border-bottom: 1px solid #111;
}
table.dataTable.nowrap th, table.dataTable.nowrap td {
white-space: nowrap;
}
table.dataTable.compact thead th,
table.dataTable.compact thead td {
padding: 4px 17px;
}
table.dataTable.compact tfoot th,
table.dataTable.compact tfoot td {
padding: 4px;
}
table.dataTable.compact tbody th,
table.dataTable.compact tbody td {
padding: 4px;
}
table.dataTable th.dt-left,
table.dataTable td.dt-left {
text-align: left;
}
table.dataTable th.dt-center,
table.dataTable td.dt-center,
table.dataTable td.dataTables_empty {
text-align: center;
}
table.dataTable th.dt-right,
table.dataTable td.dt-right {
text-align: right;
}
table.dataTable th.dt-justify,
table.dataTable td.dt-justify {
text-align: justify;
}
table.dataTable th.dt-nowrap,
table.dataTable td.dt-nowrap {
white-space: nowrap;
}
table.dataTable thead th.dt-head-left,
table.dataTable thead td.dt-head-left,
table.dataTable tfoot th.dt-head-left,
table.dataTable tfoot td.dt-head-left {
text-align: left;
}
table.dataTable thead th.dt-head-center,
table.dataTable thead td.dt-head-center,
table.dataTable tfoot th.dt-head-center,
table.dataTable tfoot td.dt-head-center {
text-align: center;
}
table.dataTable thead th.dt-head-right,
table.dataTable thead td.dt-head-right,
table.dataTable tfoot th.dt-head-right,
table.dataTable tfoot td.dt-head-right {
text-align: right;
}
table.dataTable thead th.dt-head-justify,
table.dataTable thead td.dt-head-justify,
table.dataTable tfoot th.dt-head-justify,
table.dataTable tfoot td.dt-head-justify {
text-align: justify;
}
table.dataTable thead th.dt-head-nowrap,
table.dataTable thead td.dt-head-nowrap,
table.dataTable tfoot th.dt-head-nowrap,
table.dataTable tfoot td.dt-head-nowrap {
white-space: nowrap;
}
table.dataTable tbody th.dt-body-left,
table.dataTable tbody td.dt-body-left {
text-align: left;
}
table.dataTable tbody th.dt-body-center,
table.dataTable tbody td.dt-body-center {
text-align: center;
}
table.dataTable tbody th.dt-body-right,
table.dataTable tbody td.dt-body-right {
text-align: right;
}
table.dataTable tbody th.dt-body-justify,
table.dataTable tbody td.dt-body-justify {
text-align: justify;
}
table.dataTable tbody th.dt-body-nowrap,
table.dataTable tbody td.dt-body-nowrap {
white-space: nowrap;
}
table.dataTable,
table.dataTable th,
table.dataTable td {
box-sizing: content-box;
}
/*
* Control feature layout
*/
.dataTables_wrapper {
position: relative;
clear: both;
*zoom: 1;
zoom: 1;
}
.dataTables_wrapper .dataTables_length {
float: left;
}
.dataTables_wrapper .dataTables_filter {
float: right;
text-align: right;
}
.dataTables_wrapper .dataTables_filter input {
margin-left: 0.5em;
}
.dataTables_wrapper .dataTables_info {
clear: both;
float: left;
padding-top: 0.755em;
}
.dataTables_wrapper .dataTables_paginate {
float: right;
text-align: right;
padding-top: 0.25em;
}
.dataTables_wrapper .dataTables_paginate .paginate_button {
box-sizing: border-box;
display: inline-block;
min-width: 1.5em;
padding: 0.5em 1em;
margin-left: 2px;
text-align: center;
text-decoration: none !important;
cursor: pointer;
*cursor: hand;
color: #333 !important;
border: 1px solid transparent;
border-radius: 2px;
}
.dataTables_wrapper .dataTables_paginate .paginate_button.current, .dataTables_wrapper .dataTables_paginate .paginate_button.current:hover {
color: #333 !important;
border: 1px solid #979797;
background-color: white;
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, white), color-stop(100%, #dcdcdc));
/* Chrome,Safari4+ */
background: -webkit-linear-gradient(top, white 0%, #dcdcdc 100%);
/* Chrome10+,Safari5.1+ */
background: -moz-linear-gradient(top, white 0%, #dcdcdc 100%);
/* FF3.6+ */
background: -ms-linear-gradient(top, white 0%, #dcdcdc 100%);
/* IE10+ */
background: -o-linear-gradient(top, white 0%, #dcdcdc 100%);
/* Opera 11.10+ */
background: linear-gradient(to bottom, white 0%, #dcdcdc 100%);
/* W3C */
}
.dataTables_wrapper .dataTables_paginate .paginate_button.disabled, .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover, .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active {
cursor: default;
color: #666 !important;
border: 1px solid transparent;
background: transparent;
box-shadow: none;
}
.dataTables_wrapper .dataTables_paginate .paginate_button:hover {
color: white !important;
border: 1px solid #111;
background-color: #585858;
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111));
/* Chrome,Safari4+ */
background: -webkit-linear-gradient(top, #585858 0%, #111 100%);
/* Chrome10+,Safari5.1+ */
background: -moz-linear-gradient(top, #585858 0%, #111 100%);
/* FF3.6+ */
background: -ms-linear-gradient(top, #585858 0%, #111 100%);
/* IE10+ */
background: -o-linear-gradient(top, #585858 0%, #111 100%);
/* Opera 11.10+ */
background: linear-gradient(to bottom, #585858 0%, #111 100%);
/* W3C */
}
.dataTables_wrapper .dataTables_paginate .paginate_button:active {
outline: none;
background-color: #2b2b2b;
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c));
/* Chrome,Safari4+ */
background: -webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
/* Chrome10+,Safari5.1+ */
background: -moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
/* FF3.6+ */
background: -ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
/* IE10+ */
background: -o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
/* Opera 11.10+ */
background: linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%);
/* W3C */
box-shadow: inset 0 0 3px #111;
}
.dataTables_wrapper .dataTables_paginate .ellipsis {
padding: 0 1em;
}
.dataTables_wrapper .dataTables_processing {
position: absolute;
top: 50%;
left: 50%;
width: 100%;
height: 40px;
margin-left: -50%;
margin-top: -25px;
padding-top: 20px;
text-align: center;
font-size: 1.2em;
background-color: white;
background: -webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255, 255, 255, 0)), color-stop(25%, rgba(255, 255, 255, 0.9)), color-stop(75%, rgba(255, 255, 255, 0.9)), color-stop(100%, rgba(255, 255, 255, 0)));
background: -webkit-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
background: -moz-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
background: -ms-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
background: -o-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
background: linear-gradient(to right, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
}
.dataTables_wrapper .dataTables_length,
.dataTables_wrapper .dataTables_filter,
.dataTables_wrapper .dataTables_info,
.dataTables_wrapper .dataTables_processing,
.dataTables_wrapper .dataTables_paginate {
color: #333;
}
.dataTables_wrapper .dataTables_scroll {
clear: both;
}
.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody {
*margin-top: -1px;
-webkit-overflow-scrolling: touch;
}
.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > thead > tr > th, .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > thead > tr > td, .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > tbody > tr > th, .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > tbody > tr > td {
vertical-align: middle;
}
.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > thead > tr > th > div.dataTables_sizing,
.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > thead > tr > td > div.dataTables_sizing, .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > tbody > tr > th > div.dataTables_sizing,
.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > tbody > tr > td > div.dataTables_sizing {
height: 0;
overflow: hidden;
margin: 0 !important;
padding: 0 !important;
}
.dataTables_wrapper.no-footer .dataTables_scrollBody {
border-bottom: 1px solid #111;
}
.dataTables_wrapper.no-footer div.dataTables_scrollHead table.dataTable,
.dataTables_wrapper.no-footer div.dataTables_scrollBody > table {
border-bottom: none;
}
.dataTables_wrapper:after {
visibility: hidden;
display: block;
content: "";
clear: both;
height: 0;
}
@media screen and (max-width: 767px) {
.dataTables_wrapper .dataTables_info,
.dataTables_wrapper .dataTables_paginate {
float: none;
text-align: center;
}
.dataTables_wrapper .dataTables_paginate {
margin-top: 0.5em;
}
}
@media screen and (max-width: 640px) {
.dataTables_wrapper .dataTables_length,
.dataTables_wrapper .dataTables_filter {
float: none;
text-align: center;
}
.dataTables_wrapper .dataTables_filter {
margin-top: 0.5em;
}
}

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 160 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 201 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 158 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 146 B

@ -0,0 +1,182 @@
/*! DataTables Bootstrap 3 integration
* ©2011-2015 SpryMedia Ltd - datatables.net/license
*/
/**
* DataTables integration for Bootstrap 3. This requires Bootstrap 3 and
* DataTables 1.10 or newer.
*
* This file sets the defaults and adds options to DataTables to style its
* controls using Bootstrap. See http://datatables.net/manual/styling/bootstrap
* for further information.
*/
(function( factory ){
if ( typeof define === 'function' && define.amd ) {
// AMD
define( ['jquery', 'datatables.net'], function ( $ ) {
return factory( $, window, document );
} );
}
else if ( typeof exports === 'object' ) {
// CommonJS
module.exports = function (root, $) {
if ( ! root ) {
root = window;
}
if ( ! $ || ! $.fn.dataTable ) {
// Require DataTables, which attaches to jQuery, including
// jQuery if needed and have a $ property so we can access the
// jQuery object that is used
$ = require('datatables.net')(root, $).$;
}
return factory( $, root, root.document );
};
}
else {
// Browser
factory( jQuery, window, document );
}
}(function( $, window, document, undefined ) {
'use strict';
var DataTable = $.fn.dataTable;
/* Set the defaults for DataTables initialisation */
$.extend( true, DataTable.defaults, {
dom:
"<'row'<'col-sm-6'l><'col-sm-6'f>>" +
"<'row'<'col-sm-12'tr>>" +
"<'row'<'col-sm-5'i><'col-sm-7'p>>",
renderer: 'bootstrap'
} );
/* Default class modification */
$.extend( DataTable.ext.classes, {
sWrapper: "dataTables_wrapper form-inline dt-bootstrap",
sFilterInput: "form-control input-sm",
sLengthSelect: "form-control input-sm",
sProcessing: "dataTables_processing panel panel-default"
} );
/* Bootstrap paging button renderer */
DataTable.ext.renderer.pageButton.bootstrap = function ( settings, host, idx, buttons, page, pages ) {
var api = new DataTable.Api( settings );
var classes = settings.oClasses;
var lang = settings.oLanguage.oPaginate;
var aria = settings.oLanguage.oAria.paginate || {};
var btnDisplay, btnClass, counter=0;
var attach = function( container, buttons ) {
var i, ien, node, button;
var clickHandler = function ( e ) {
e.preventDefault();
if ( !$(e.currentTarget).hasClass('disabled') && api.page() != e.data.action ) {
api.page( e.data.action ).draw( 'page' );
}
};
for ( i=0, ien=buttons.length ; i<ien ; i++ ) {
button = buttons[i];
if ( $.isArray( button ) ) {
attach( container, button );
}
else {
btnDisplay = '';
btnClass = '';
switch ( button ) {
case 'ellipsis':
btnDisplay = '&#x2026;';
btnClass = 'disabled';
break;
case 'first':
btnDisplay = lang.sFirst;
btnClass = button + (page > 0 ?
'' : ' disabled');
break;
case 'previous':
btnDisplay = lang.sPrevious;
btnClass = button + (page > 0 ?
'' : ' disabled');
break;
case 'next':
btnDisplay = lang.sNext;
btnClass = button + (page < pages-1 ?
'' : ' disabled');
break;
case 'last':
btnDisplay = lang.sLast;
btnClass = button + (page < pages-1 ?
'' : ' disabled');
break;
default:
btnDisplay = button + 1;
btnClass = page === button ?
'active' : '';
break;
}
if ( btnDisplay ) {
node = $('<li>', {
'class': classes.sPageButton+' '+btnClass,
'id': idx === 0 && typeof button === 'string' ?
settings.sTableId +'_'+ button :
null
} )
.append( $('<a>', {
'href': '#',
'aria-controls': settings.sTableId,
'aria-label': aria[ button ],
'data-dt-idx': counter,
'tabindex': settings.iTabIndex
} )
.html( btnDisplay )
)
.appendTo( container );
settings.oApi._fnBindAction(
node, {action: button}, clickHandler
);
counter++;
}
}
}
};
// IE9 throws an 'unknown error' if document.activeElement is used
// inside an iframe or frame.
var activeEl;
try {
// Because this approach is destroying and recreating the paging
// elements, focus is lost on the select button which is bad for
// accessibility. So we want to restore focus once the draw has
// completed
activeEl = $(host).find(document.activeElement).data('dt-idx');
}
catch (e) {}
attach(
$(host).empty().html('<ul class="pagination"/>').children('ul'),
buttons
);
if ( activeEl !== undefined ) {
$(host).find( '[data-dt-idx='+activeEl+']' ).trigger('focus');
}
};
return DataTable;
}));

@ -0,0 +1,11 @@
/*!
DataTables Bootstrap 3 integration
©2011-2015 SpryMedia Ltd - datatables.net/license
*/
var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.findInternal=function(a,b,c){a instanceof String&&(a=String(a));for(var e=a.length,d=0;d<e;d++){var k=a[d];if(b.call(c,k,d,a))return{i:d,v:k}}return{i:-1,v:void 0}};$jscomp.ASSUME_ES5=!1;$jscomp.ASSUME_NO_NATIVE_MAP=!1;$jscomp.ASSUME_NO_NATIVE_SET=!1;$jscomp.SIMPLE_FROUND_POLYFILL=!1;
$jscomp.defineProperty=$jscomp.ASSUME_ES5||"function"==typeof Object.defineProperties?Object.defineProperty:function(a,b,c){a!=Array.prototype&&a!=Object.prototype&&(a[b]=c.value)};$jscomp.getGlobal=function(a){a=["object"==typeof window&&window,"object"==typeof self&&self,"object"==typeof global&&global,a];for(var b=0;b<a.length;++b){var c=a[b];if(c&&c.Math==Math)return c}throw Error("Cannot find global object");};$jscomp.global=$jscomp.getGlobal(this);
$jscomp.polyfill=function(a,b,c,e){if(b){c=$jscomp.global;a=a.split(".");for(e=0;e<a.length-1;e++){var d=a[e];d in c||(c[d]={});c=c[d]}a=a[a.length-1];e=c[a];b=b(e);b!=e&&null!=b&&$jscomp.defineProperty(c,a,{configurable:!0,writable:!0,value:b})}};$jscomp.polyfill("Array.prototype.find",function(a){return a?a:function(a,c){return $jscomp.findInternal(this,a,c).v}},"es6","es3");
(function(a){"function"===typeof define&&define.amd?define(["jquery","datatables.net"],function(b){return a(b,window,document)}):"object"===typeof exports?module.exports=function(b,c){b||(b=window);c&&c.fn.dataTable||(c=require("datatables.net")(b,c).$);return a(c,b,b.document)}:a(jQuery,window,document)})(function(a,b,c,e){var d=a.fn.dataTable;a.extend(!0,d.defaults,{dom:"<'row'<'col-sm-6'l><'col-sm-6'f>><'row'<'col-sm-12'tr>><'row'<'col-sm-5'i><'col-sm-7'p>>",renderer:"bootstrap"});a.extend(d.ext.classes,
{sWrapper:"dataTables_wrapper form-inline dt-bootstrap",sFilterInput:"form-control input-sm",sLengthSelect:"form-control input-sm",sProcessing:"dataTables_processing panel panel-default"});d.ext.renderer.pageButton.bootstrap=function(b,l,v,w,m,r){var k=new d.Api(b),x=b.oClasses,n=b.oLanguage.oPaginate,y=b.oLanguage.oAria.paginate||{},g,h,t=0,u=function(c,d){var e,l=function(b){b.preventDefault();a(b.currentTarget).hasClass("disabled")||k.page()==b.data.action||k.page(b.data.action).draw("page")};
var q=0;for(e=d.length;q<e;q++){var f=d[q];if(a.isArray(f))u(c,f);else{h=g="";switch(f){case "ellipsis":g="&#x2026;";h="disabled";break;case "first":g=n.sFirst;h=f+(0<m?"":" disabled");break;case "previous":g=n.sPrevious;h=f+(0<m?"":" disabled");break;case "next":g=n.sNext;h=f+(m<r-1?"":" disabled");break;case "last":g=n.sLast;h=f+(m<r-1?"":" disabled");break;default:g=f+1,h=m===f?"active":""}if(g){var p=a("<li>",{"class":x.sPageButton+" "+h,id:0===v&&"string"===typeof f?b.sTableId+"_"+f:null}).append(a("<a>",
{href:"#","aria-controls":b.sTableId,"aria-label":y[f],"data-dt-idx":t,tabindex:b.iTabIndex}).html(g)).appendTo(c);b.oApi._fnBindAction(p,{action:f},l);t++}}}};try{var p=a(l).find(c.activeElement).data("dt-idx")}catch(z){}u(a(l).empty().html('<ul class="pagination"/>').children("ul"),w);p!==e&&a(l).find("[data-dt-idx="+p+"]").trigger("focus")};return d});

@ -0,0 +1,184 @@
/*! DataTables Bootstrap 4 integration
* ©2011-2017 SpryMedia Ltd - datatables.net/license
*/
/**
* DataTables integration for Bootstrap 4. This requires Bootstrap 4 and
* DataTables 1.10 or newer.
*
* This file sets the defaults and adds options to DataTables to style its
* controls using Bootstrap. See http://datatables.net/manual/styling/bootstrap
* for further information.
*/
(function( factory ){
if ( typeof define === 'function' && define.amd ) {
// AMD
define( ['jquery', 'datatables.net'], function ( $ ) {
return factory( $, window, document );
} );
}
else if ( typeof exports === 'object' ) {
// CommonJS
module.exports = function (root, $) {
if ( ! root ) {
root = window;
}
if ( ! $ || ! $.fn.dataTable ) {
// Require DataTables, which attaches to jQuery, including
// jQuery if needed and have a $ property so we can access the
// jQuery object that is used
$ = require('datatables.net')(root, $).$;
}
return factory( $, root, root.document );
};
}
else {
// Browser
factory( jQuery, window, document );
}
}(function( $, window, document, undefined ) {
'use strict';
var DataTable = $.fn.dataTable;
/* Set the defaults for DataTables initialisation */
$.extend( true, DataTable.defaults, {
dom:
"<'row'<'col-sm-12 col-md-6'l><'col-sm-12 col-md-6'f>>" +
"<'row'<'col-sm-12'tr>>" +
"<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
renderer: 'bootstrap'
} );
/* Default class modification */
$.extend( DataTable.ext.classes, {
sWrapper: "dataTables_wrapper dt-bootstrap4",
sFilterInput: "form-control form-control-sm",
sLengthSelect: "custom-select custom-select-sm form-control form-control-sm",
sProcessing: "dataTables_processing card",
sPageButton: "paginate_button page-item"
} );
/* Bootstrap paging button renderer */
DataTable.ext.renderer.pageButton.bootstrap = function ( settings, host, idx, buttons, page, pages ) {
var api = new DataTable.Api( settings );
var classes = settings.oClasses;
var lang = settings.oLanguage.oPaginate;
var aria = settings.oLanguage.oAria.paginate || {};
var btnDisplay, btnClass, counter=0;
var attach = function( container, buttons ) {
var i, ien, node, button;
var clickHandler = function ( e ) {
e.preventDefault();
if ( !$(e.currentTarget).hasClass('disabled') && api.page() != e.data.action ) {
api.page( e.data.action ).draw( 'page' );
}
};
for ( i=0, ien=buttons.length ; i<ien ; i++ ) {
button = buttons[i];
if ( $.isArray( button ) ) {
attach( container, button );
}
else {
btnDisplay = '';
btnClass = '';
switch ( button ) {
case 'ellipsis':
btnDisplay = '&#x2026;';
btnClass = 'disabled';
break;
case 'first':
btnDisplay = lang.sFirst;
btnClass = button + (page > 0 ?
'' : ' disabled');
break;
case 'previous':
btnDisplay = lang.sPrevious;
btnClass = button + (page > 0 ?
'' : ' disabled');
break;
case 'next':
btnDisplay = lang.sNext;
btnClass = button + (page < pages-1 ?
'' : ' disabled');
break;
case 'last':
btnDisplay = lang.sLast;
btnClass = button + (page < pages-1 ?
'' : ' disabled');
break;
default:
btnDisplay = button + 1;
btnClass = page === button ?
'active' : '';
break;
}
if ( btnDisplay ) {
node = $('<li>', {
'class': classes.sPageButton+' '+btnClass,
'id': idx === 0 && typeof button === 'string' ?
settings.sTableId +'_'+ button :
null
} )
.append( $('<a>', {
'href': '#',
'aria-controls': settings.sTableId,
'aria-label': aria[ button ],
'data-dt-idx': counter,
'tabindex': settings.iTabIndex,
'class': 'page-link'
} )
.html( btnDisplay )
)
.appendTo( container );
settings.oApi._fnBindAction(
node, {action: button}, clickHandler
);
counter++;
}
}
}
};
// IE9 throws an 'unknown error' if document.activeElement is used
// inside an iframe or frame.
var activeEl;
try {
// Because this approach is destroying and recreating the paging
// elements, focus is lost on the select button which is bad for
// accessibility. So we want to restore focus once the draw has
// completed
activeEl = $(host).find(document.activeElement).data('dt-idx');
}
catch (e) {}
attach(
$(host).empty().html('<ul class="pagination"/>').children('ul'),
buttons
);
if ( activeEl !== undefined ) {
$(host).find( '[data-dt-idx='+activeEl+']' ).trigger('focus');
}
};
return DataTable;
}));

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save