Alter Version
22
LICENSE
@ -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.
|
||||
|
116
README.md
@ -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.
|
24
admin/alter_table.php
Normal file
@ -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");
|
174
admin/configuration.php
Normal file
@ -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>
|
||||
|
62
admin/configuration_chk.php
Normal file
@ -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");
|
||||
|
||||
|
90
admin/create_database.php
Normal file
@ -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');
|
||||
");
|
||||
|
61
admin/dump.php
Normal file
@ -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";
|
||||
}
|
||||
|
||||
|
||||
?>
|
105
admin/export.php
Normal file
@ -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>
|
94
admin/geocoding.php
Normal file
@ -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>
|
332
admin/index.php
Normal file
@ -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> ";
|
||||
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 © <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(/(<|<)br\s*\/*(>|>)/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>
|
108
admin/login.php
Normal file
@ -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>
|
5
admin/logout.php
Normal file
@ -0,0 +1,5 @@
|
||||
<?php
|
||||
|
||||
session_start();
|
||||
session_destroy();
|
||||
header ("Location: ../index.php");
|
156
admin/password.php
Normal file
@ -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"> </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>
|
141
admin/print_html.php
Normal file
@ -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 © <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>
|
BIN
admin/shape/ideenmelder.dbf
Normal file
BIN
admin/shape/ideenmelder.shp
Normal file
BIN
admin/shape/ideenmelder.shx
Normal file
123
admin/shapefile.php
Normal file
@ -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);
|
21
ajax/ajax_comment_push.php
Normal file
@ -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";
|
||||
}
|
||||
?>
|
90
ajax/ajax_location_push.php
Normal file
@ -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);
|
||||
|
20
ajax/ajax_rating.php
Normal file
@ -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";
|
||||
};
|
||||
|
64
ajax/ajax_update.php
Normal file
@ -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);
|
||||
|
161
config.php
Normal file
@ -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>"
|
||||
);
|
7
css/bootstrap.min.css
vendored
Normal file
1
css/bootstrap.min.css.map
Normal file
110
css/dashboard.css
Normal file
@ -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);
|
||||
}
|
4
css/font-awesome.min.css
vendored
Normal file
BIN
css/images/ajax-loader.gif
Normal file
After Width: | Height: | Size: 3.1 KiB |
BIN
css/images/close.png
Normal file
After Width: | Height: | Size: 280 B |
BIN
css/images/layers-2x.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
css/images/layers.png
Normal file
After Width: | Height: | Size: 696 B |
BIN
css/images/loading.gif
Normal file
After Width: | Height: | Size: 8.3 KiB |
BIN
css/images/marker-icon-2x.png
Normal file
After Width: | Height: | Size: 2.4 KiB |
BIN
css/images/marker-icon.png
Normal file
After Width: | Height: | Size: 1.4 KiB |
BIN
css/images/marker-shadow.png
Normal file
After Width: | Height: | Size: 618 B |
BIN
css/images/markers-matte.png
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
css/images/markers-matte@2x.png
Normal file
After Width: | Height: | Size: 30 KiB |
BIN
css/images/markers-plain.png
Normal file
After Width: | Height: | Size: 7.8 KiB |
BIN
css/images/markers-shadow.png
Normal file
After Width: | Height: | Size: 535 B |
BIN
css/images/markers-shadow@2x.png
Normal file
After Width: | Height: | Size: 1.4 KiB |
BIN
css/images/markers-soft.png
Normal file
After Width: | Height: | Size: 56 KiB |
BIN
css/images/markers-soft@2x.png
Normal file
After Width: | Height: | Size: 162 KiB |
BIN
css/images/next.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
css/images/prev.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
137
css/leaflet.awesome-markers.css
Normal file
@ -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;
|
||||
}
|
640
css/leaflet.css
Normal file
@ -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;
|
||||
}
|
204
css/lightbox.css
Normal file
@ -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;
|
||||
}
|
BIN
css/logo.png
Normal file
After Width: | Height: | Size: 32 KiB |
95
css/style.css
Normal file
@ -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;
|
||||
}
|
125
datenschutz.php
Normal file
@ -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> </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>
|
BIN
fonts/FontAwesome.otf
Normal file
BIN
fonts/fontawesome-webfont.eot
Normal file
2671
fonts/fontawesome-webfont.svg
Normal file
After Width: | Height: | Size: 434 KiB |
BIN
fonts/fontawesome-webfont.ttf
Normal file
BIN
fonts/fontawesome-webfont.woff
Normal file
BIN
fonts/fontawesome-webfont.woff2
Normal file
17
geojson/KommunenKU.geojson
Normal file
731
geojson/hamm.geojson
Normal file
@ -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 }
|
||||
}]
|
||||
}
|
1
geojson/muelheim.geojson
Normal file
1
geojson/unna-gemeinden.geojson
Normal file
1
geojson/unna.geojson
Normal file
77
impressum.php
Normal file
@ -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> </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> </p>
|
||||
<div><img style="width:220px" src="<?=$strLogo?>" alt="Logo"></div>
|
||||
<p> </p>
|
||||
<p>
|
||||
<?= stripslashes(nl2br($strImpressum)) ?>
|
||||
</p>
|
||||
<p><a href="<?=$strUrl?>"><?=$strUrlBez?></a></p>
|
||||
|
||||
<p> </p>
|
||||
Anfragen zum Ideenmelder an <a href="mailto:<?=$contactEmail?>"><?=$contactEmail?></a>
|
||||
<p> </p>
|
||||
<p> </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>
|
469
index.php
Normal file
@ -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 © '+ 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>
|
7
js/bootstrap.min.js
vendored
Normal file
2
js/jquery.min.js
vendored
Normal file
575
js/leaflet.ajax.js
Normal file
@ -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]);
|
1
js/leaflet.ajax.min.js
vendored
Normal file
125
js/leaflet.awesome-markers.js
Normal file
@ -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));
|
5
js/leaflet.js
Normal file
142
js/leaflet.snogylop.js
Normal file
@ -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
Normal file
25
lib/dialog_comment.php
Normal file
@ -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>
|
66
lib/dialog_edit_location.php
Normal file
@ -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 -->
|
||||
|
116
lib/dialog_karte.php
Normal file
@ -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 -->
|
||||
|
119
lib/functions.php
Normal file
@ -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 .= " <span class=\'text-muted\' id=\'ups_".$id."\'>".$numUps."</span> ";
|
||||
$strDescription .= "<a href=\'#\' onclick=\'thumb_up_down(".$id.",".$numDowns.",down)\'>";
|
||||
$strDescription .= "<i class=\'text-muted fa fa-thumbs-down\'></i></a>";
|
||||
$strDescription .= " <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;
|
||||
}
|
126
lib/geocoding.php
Normal file
@ -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);
|
227
liste.php
Normal file
@ -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> </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 © <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>
|
255
setup.php
Normal file
@ -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>
|
||||
|
75
setup_chk.php
Normal file
@ -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");
|
190
vendor/DataTables/DataTables-1.10.21/css/dataTables.bootstrap.css
vendored
Normal file
@ -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;
|
||||
}
|
1
vendor/DataTables/DataTables-1.10.21/css/dataTables.bootstrap.min.css
vendored
Normal file
@ -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}
|
212
vendor/DataTables/DataTables-1.10.21/css/dataTables.bootstrap4.css
vendored
Normal file
@ -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;
|
||||
}
|
1
vendor/DataTables/DataTables-1.10.21/css/dataTables.bootstrap4.min.css
vendored
Normal file
118
vendor/DataTables/DataTables-1.10.21/css/dataTables.foundation.css
vendored
Normal file
@ -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;
|
||||
}
|
1
vendor/DataTables/DataTables-1.10.21/css/dataTables.foundation.min.css
vendored
Normal file
@ -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}
|
481
vendor/DataTables/DataTables-1.10.21/css/dataTables.jqueryui.css
vendored
Normal file
@ -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;
|
||||
}
|
1
vendor/DataTables/DataTables-1.10.21/css/dataTables.jqueryui.min.css
vendored
Normal file
102
vendor/DataTables/DataTables-1.10.21/css/dataTables.semanticui.css
vendored
Normal file
@ -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;
|
||||
}
|
1
vendor/DataTables/DataTables-1.10.21/css/dataTables.semanticui.min.css
vendored
Normal file
@ -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}
|
448
vendor/DataTables/DataTables-1.10.21/css/jquery.dataTables.css
vendored
Normal file
@ -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;
|
||||
}
|
||||
}
|
1
vendor/DataTables/DataTables-1.10.21/css/jquery.dataTables.min.css
vendored
Normal file
BIN
vendor/DataTables/DataTables-1.10.21/images/sort_asc.png
vendored
Normal file
After Width: | Height: | Size: 160 B |
BIN
vendor/DataTables/DataTables-1.10.21/images/sort_asc_disabled.png
vendored
Normal file
After Width: | Height: | Size: 148 B |
BIN
vendor/DataTables/DataTables-1.10.21/images/sort_both.png
vendored
Normal file
After Width: | Height: | Size: 201 B |
BIN
vendor/DataTables/DataTables-1.10.21/images/sort_desc.png
vendored
Normal file
After Width: | Height: | Size: 158 B |
BIN
vendor/DataTables/DataTables-1.10.21/images/sort_desc_disabled.png
vendored
Normal file
After Width: | Height: | Size: 146 B |
182
vendor/DataTables/DataTables-1.10.21/js/dataTables.bootstrap.js
vendored
Normal file
@ -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 = '…';
|
||||
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;
|
||||
}));
|
11
vendor/DataTables/DataTables-1.10.21/js/dataTables.bootstrap.min.js
vendored
Normal file
@ -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="…";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});
|
184
vendor/DataTables/DataTables-1.10.21/js/dataTables.bootstrap4.js
vendored
Normal file
@ -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 = '…';
|
||||
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;
|
||||
}));
|