You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

487 lines
18 KiB

<?php
/* ******************************
* Ideenmelder
* Autor: Walter Hupfeld, Hamm
* E-Mail: info@hupfeld-software.de
* Version: 3.0
* Datum: 16.03.2024
******************************** */
// Starte die Session
session_start();
if (isset($_GET['d'])) {
$strDistrict=$_GET['d'];
$_SESSION['district'] = $_GET['d'];
} else if (isset($_SESSION['district'])) {
$strDistrict=$_SESSION['district'];
}
else {
header("Location: start.php");
}
require("config.php");
if ($strDistrict=="unkown") { header("Location: start.php");}
require_once("lib/functions.php");
$ref=(isset($_GET['ref']) && ($_GET['ref']==1));
$strIntro ="<h4>".$strTitle."</h4>";
$strIntro .= nl2br2($strIntroText);
$result= $db->prepare("SELECT loc.*,f.filename
FROM location loc LEFT JOIN files f ON loc.id=f.loc_id
WHERE loc.district=:district");
$result->bindParam(":district",$strDistrict);
$result->execute();
/* 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;
*/
$arrMarker = array();
$arrDescription = array();
$id=0;
while ($row = $result->fetch(PDO::FETCH_ASSOC)) {
$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">
<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/jquery.fancybox.min.css" />
<script src="js/jquery.slim.min.js"></script>
<script src="js/popper.min.js"></script>
<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/jquery.fancybox.min.js"></script>
<script src="js/bootstrap.min.js"></script>
<title><?=$strTitle?></title>
</head>
<body>
<!-- Navbar -->
<nav class="navbar navbar-expand-md navbar-dark bg-dark fixed-top">
<?php if (!$boolSidebar): ?>
<a href="start.php"><img class="logo_navbar" src="<?=$strLogo?>" alt="Logo"></a>
<?php endif; ?>
<a class="navbar-brand" href="#"><?= $strTitle ?> &raquo; <?=$strDistrictTitle?></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>
<?php if ($boolDistrictSelection): ?>
<!-- District -->
<form method="GET" action="index.php">
<select name="d" style="float:left;margin-top:0.5em;margin-right:0.5em;" onchange="this.form.submit()">
<?php foreach ($arrDistrict as $key => $strTitle):
$strActive = ($strDistrict==$key) ? "selected=\"selected\"" : ""; ?>
<option value="<?=$key?>" <?=$strActive?>><?=$strTitle?></option>
<?php endforeach; ?>
</select>
</form>
<?php endif; ?>
</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="login.php">Login</a>
</li>
</ul>
</div>
</div>
</nav>
<!-- Ende Navbar -->
<div class="container-fluid" style="margin-top: 4em;">
<?php if ($boolSidebar): ?>
<div class="row">
<nav class="col-md-2 d-none d-md-block bg-light sidebar">
<div class="sidebar-sticky">
<a href="start.php"><img class="logo" src="<?=$strLogo?>" alt="Logo" ></a>
<ul class="nav flex-column">
<?php foreach ($arrTopic as $key=>$topic): ?>
<li class='nav-item'>
<label>
<a class='nav-link'><?=$arrIcon[$key]?>
<input type='checkbox' name='check_".$key."' id='check_".$key."' class='check' checked='checked'>
<?=$topic?></a></label>
</li>
<?php endforeach; ?>
</ul>
</div>
</nav>
<?php endif; ?>
<main role="main" class="<?= ($boolSidebar)?"col-md-9 col-lg-10":"col-md-12 col-lg-12"?> ml-sm-auto px-1">
<div id="mapid"></div>
</main>
<?php if ($boolSidebar) echo "</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=<?=$mapbox_key?>', {
maxZoom: 18,
minZoom:<?=$numZoom ?>,
attribution: 'Map data &copy; '+ mapLink +' contributors, ' +
'<a href="https://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, ' +
'Imagery © ' + ocmLink,
//id: 'mapbox/streets-v11',
id: 'mapbox/outdoors-v11',
tileSize: 512,
zoomOffset: -1
}).addTo(mymap);
// markerIcons ------------------------------------------------------------------------------
var infoMarker = L.AwesomeMarkers.icon({icon: 'info', prefix: 'fa', markerColor: 'orange'});
var bicycleMarker = L.AwesomeMarkers.icon({icon: 'bicycle', prefix: 'fa', markerColor: 'green'});
var carMarker = L.AwesomeMarkers.icon({icon: 'car', prefix: 'fa', markerColor: 'red'});
var truckMarker = L.AwesomeMarkers.icon({icon: 'truck', prefix: 'fa', markerColor: 'beige'});
var trainMarker = L.AwesomeMarkers.icon({icon: 'bus', prefix: 'fa', markerColor: 'blue'});
var pedestrianMarker = L.AwesomeMarkers.icon({icon: 'male', prefix: 'fa', markerColor: 'darkblue'});
function getMarker(topic) {
var arrMarker = [];
<?php
foreach ($arrMarkerType as $key => $value) {
echo "arrMarker[".$key."]=".$value.";\n";
}
?>
return arrMarker[topic];
}
//Hamm-Layer - todo invers area -----------------------------
var myStyle = {
"color": "grey",
"fillColor": "lightblue",
"weight": 4,
"opacity": 0.6
};
// Sonderfall Unna mit Gemeindegrenzen
var gemeindeStyle = {
"color": "grey",
"fillColor": "white",
"weight": 2,
"opacity": 0.6
};
var unnaLayer = new L.GeoJSON.AJAX(["geojson/KommunenKU.geojson"],{style:gemeindeStyle});
unnaLayer.addTo(mymap);
var hammLayer = new L.GeoJSON.AJAX(["<?= $fileGeojson ?>"], {
style: myStyle,
invert: true
});
hammLayer.addTo(mymap);
// Marker from database -------------------------------------------------------
var up="up";
var down="down";
var marker = [];
var arrDescription = [];
<?php
foreach ($arrMarker as $idx=>$strMarker) {
echo $strMarker."\n";
}
if ($boolComment) {
foreach ($arrDescription as $index => $value) {
echo "arrDescription[".$index."]=\"$value\"\n";
}
}
echo "var marker_max=".$markerid."\n";
?>
// Info-Marker für Start --------------------------------------------------------
var marker2 = L.marker([<?=$numInfoLat?>, <?=$numInfoLng?>], { icon: infoMarker }).addTo(mymap);
<?php
if ($ref) {
echo "marker2.bindPopup('".$strIntro."');";
} else {
echo "marker2.bindPopup('".$strIntro."').openPopup();";
}
?>
// Editor ----------------------------------------------------------------------
var edit = <?= ($boolActive) ? "true" : "false" ?>;
var myMarker;
var lat;
var lng;
function onMapClick(e) {
if (!edit) return false;
edit = false;
lat=e.latlng.lat;
lng=e.latlng.lng;
myMarker = L.marker([e.latlng.lat, e.latlng.lng], {
title: "Mein Punkt",
alt: "Informationspunkt",
draggable: true,
})
.addTo(mymap)
.on('dragend', function() {
var coord = String(myMarker.getLatLng()).split(',');
var lata = coord[0].split('(');
var lnga = coord[1].split(')');
lat = lata[1]; lng = lnga[0];
myMarker.bindPopup("Bewegt zu: " + lata[1] + ", " + lnga[0] + ".");
//console.log(lat+" "+lng);
});
$("#dialog").show();
};
hammLayer.on('click',function(e){ e.preventDefault(); })
mymap.on('click', onMapClick);
// Close Dialog
$("#close").click(function(e) {
$("#dialog").hide();
$("#description").val("").empty();
$("#defect").val(0);
$("#topic").val(2);
$("#photo").val("");
edit = true;
mymap.removeLayer(myMarker);
})
// Ajax-Based submit
$("#newobjectform").submit(function(event){
$("#lat").val(lat);
$("#lng").val(lng);
$("#district").val("<?=$strDistrict?>");
//topic=$('input[name=topic]:checked').val();
topic=2; // Keine Eingabe als Auswahlfeld in ADFC-Hindernis-Melder
newMarker = getMarker(topic);
event.preventDefault();
//grab all form data
var formData = new FormData($(this)[0]);
$.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;
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 (file["size"]>1000000) { alert("Bilder sollten maximal 1 MB groß sein");}
if (image_ok) {
img = new Image();
var objectUrl = _URL.createObjectURL(file);
img.onload = function () {
image_ok = (this.width<4000 && this.height<4000 && this.width>100 && this.height>100);
//console.log("Breite:" + this.width + " Höhe: " + this.height);
if (!image_ok) {
alert("Bilder sollten maximal 4000 x 4000 Pixel groß sein.\n"
+"Breite:" + this.width + " Höhe: " + this.height)
}
};
img.src = objectUrl;
}
}
});
</script>
</body>
</html>