// TODO: Remote-Reload per Socket
// TODO: Client-Server-Version abgleichen
// TODO: Modal bei Chrome, dass Audio erst bei interaktion aktiv
$(document).ready(function() {
set_clock();
});
$(window).on("resize", function() {
resize_text();
});
/* ############################ */
/* ####### TEXT-RESIZE ######## */
/* ############################ */
// Textgröße dynamisch anpassen, Hintergrundfarbe ggf. anpassen
function resize_text() {
// Uhr-Text nur Anpassen wenn sichtbar
if ($('#waipclock').is(':visible')) {
textFit(document.getElementsByClassName('tf_clock'), {
minFontSize: 5,
maxFontSize: 500
});
$("body").css("background-color", "#000");
};
// Tableau-Text nur Anpassen wenn sichtbar
if ($('#waiptableau').is(':visible')) {
textFit(document.getElementsByClassName('tf_singleline'), {
minFontSize: 5,
maxFontSize: 500
});
textFit(document.getElementsByClassName('tf_multiline'), {
detectMultiLine: false
});
textFit(document.getElementsByClassName('tf_test'), {
widthOnly: true,
alignHoriz: false,
alignVert: false,
alignVertWithFlexbox: false
});
map.invalidateSize();
$("body").css("background-color", "#222");
};
};
/* ############################ */
/* ####### INAKTIVITAET ####### */
/* ############################ */
var timeoutID;
// Inactivitaet auswerten
function setup_inactivcheck() {
this.addEventListener("mousemove", resetActivTimer, false);
this.addEventListener("mousedown", resetActivTimer, false);
this.addEventListener("keypress", resetActivTimer, false);
this.addEventListener("DOMMouseScroll", resetActivTimer, false);
this.addEventListener("mousewheel", resetActivTimer, {passive: true}, false);
this.addEventListener("touchmove", resetActivTimer, false);
this.addEventListener("MSPointerMove", resetActivTimer, false);
start_inactivtimer();
};
setup_inactivcheck();
// warte xxxx Millisekunden um dann do_on_Inactive zu starten
function start_inactivtimer() {
timeoutID = window.setTimeout(do_on_Inactive, 2500);
};
// bei Inaktivitaet Header/Footer ausblenden
function do_on_Inactive() {
// do something
$(".navbar").fadeOut("slow");
$(".footer").fadeOut("slow");
$(".fullheight").css({
height: 'calc(100vh - 2rem)'
});
$("body").css({
paddingTop: "1rem",
margin: 0
});
resize_text();
};
// bei Activitaet Header/Footer einblenden
function do_on_Active() {
start_inactivtimer();
// do something
$(".navbar").fadeIn('slow');
$(".footer").fadeIn('slow');
$("body").css({
marginBottom: '60px',
paddingTop: '5rem',
paddingBottom: '0'
});
$(".fullheight").css({
height: 'calc(100vh - 60px - 5rem)'
});
resize_text();
};
// bei Event (Aktiviaet) alles zuruecksetzen
function resetActivTimer(e) {
do_on_Active();
};
/* ########################### */
/* ######### LEAFLET ######### */
/* ########################### */
// Karte definieren
var map = L.map('map', {
zoomControl: false
}).setView([51.733005, 14.338048], 13);
// Layer der Karte
mapLink = L.tileLayer(
'http://a.tile.openstreetmap.org/{z}/{x}/{y}.png', {
maxZoom: 18,
attribution: '© OpenStreetMap'
}).addTo(map);
// Icon der Karte zuordnen
var redIcon = new L.Icon({
iconUrl: '/media/marker-icon-2x-red.png',
shadowUrl: '/media/marker-shadow.png',
iconSize: [25, 41],
iconAnchor: [12, 41],
popupAnchor: [1, -34],
shadowSize: [41, 41]
});
// Icon setzen
var marker = L.marker(new L.LatLng(0, 0), {
icon: redIcon
}).addTo(map);
/* ########################### */
/* ######## SOCKET.IO ######## */
/* ########################### */
// Websocket
var socket = io.connect();
// Wachen-ID bei Connect an Server senden
socket.on('connect', function() {
socket.emit('wachen_id', wachen_id);
$('#waipModal').modal('hide');
});
socket.on('connect_error', function(err) {
$('#waipModalTitle').html('FEHLER');
$('#waipModalBody').html(`Verbindung zum Server getrennt!`);
$('#waipModal').modal('show');
});
// ID von Server und Client vergleichen, falls ungleich -> Seite neu laden
socket.on('io.version', function(server_id) {
var client_id = $('#app_id').html();
//console.log('server_id: ' + server_id);
//console.log('client_id: ' + client_id);
if (client_id != server_id) {
$('#waipModalTitle').html('ACHTUNG');
$('#waipModalBody').html(`Neue Server-Version. Seite wird in 10 Sekunden neu geladen!`);
$('#waipModal').modal('toggle');
setTimeout(function() {
location.reload();
}, 10000);
};
});
// ggf. Fehler ausgeben
socket.on('io.error', function(data) {
console.log('Error:', data);
});
// Sounds abspielen
socket.on('io.playtts', function(data) {
var audio = document.getElementById('audio');
audio.src = (data);
audio.play();
});
// Daten löschen, Uhr anzeigen
socket.on('io.standby', function(data) {
// TODO: Wenn vorhanden, hier #hilfsfrist zurücksetzen
$('#einsatz_art').removeClass(function(index, className) {
return (className.match(/(^|\s)bg-\S+/g) || []).join(' ');
});
$('#einsatz_stichwort').removeClass();
$('#einsatz_stichwort').html('');
$('#sondersignal').removeClass();
$('#ortsdaten').html('');
$('#besonderheiten').html('');
$('#em_alarmiert').empty();
$('#em_weitere').html('');
map.setView(new L.LatLng(0, 0), 14);
// Tableau ausblenden
$("#waiptableau").addClass("d-none");
$("#waipclock").removeClass("d-none");
// Text anpassen
resize_text();
});
// Einsatzdaten laden, Wachalarm anzeigen
socket.on('io.neuerEinsatz', function(data) {
// DEBUG
console.log(data);
// Hintergrund der Einsatzart zunächst entfernen
$('#einsatz_art').removeClass(function(index, className) {
return (className.match(/(^|\s)bg-\S+/g) || []).join(' ');
});
// Icon der Einsatzart enfernen
$('#einsatz_stichwort').removeClass();
// Art und Stichwort festlegen hinterlegen
switch (data.einsatzart) {
case 'Brandeinsatz':
$('#einsatz_art').addClass("bg-danger");
$('#einsatz_stichwort').addClass("ion-md-flame");
break;
case 'Hilfeleistungseinsatz':
$('#einsatz_art').addClass("bg-info");
$('#einsatz_stichwort').addClass("ion-md-construct");
break;
case 'Rettungseinsatz':
$('#einsatz_art').addClass("bg-warning");
$('#einsatz_stichwort').addClass("ion-md-medkit");
break;
case 'Krankentransport':
$('#einsatz_art').addClass("bg-success");
$('#einsatz_stichwort').addClass("ion-md-medical");
break;
default:
$('#einsatz_art').addClass("bg-secondary");
$('#einsatz_stichwort').addClass("ion-md-information-circle");
};
$('#einsatz_stichwort').html(' ' + data.stichwort);
// Sondersignal setzen
$('#sondersignal').removeClass();
switch (data.sondersignal) {
case 1:
$('#sondersignal').addClass('ion-md-notifications');
break;
default:
$('#sondersignal').addClass('ion-md-notifications-off');
};
// Ortsdaten zusammenstellen und setzen
var small_ortsdaten;
small_ortsdaten = '';
if (data.objekt) {
small_ortsdaten = small_ortsdaten + data.objekt + '
';
};
if (data.ort) {
small_ortsdaten = small_ortsdaten + data.ort + '
';
};
if (data.ortsteil) {
small_ortsdaten = small_ortsdaten + data.ortsteil + '
';
};
if (data.strasse) {
small_ortsdaten = small_ortsdaten + data.strasse + '
';
};
if (small_ortsdaten.substr(small_ortsdaten.length - 4) == '
') {
small_ortsdaten = small_ortsdaten.slice(0, -4);
};
$('#ortsdaten').html(small_ortsdaten);
// Besonderheiten setzen
$('#besonderheiten').html(data.besonderheiten);
// alarmierte Einsatzmittel setzen
$('#em_alarmiert').empty();
var data_em_alarmiert = JSON.parse(data.em_alarmiert);
for (var i in data_em_alarmiert) {
$('#em_alarmiert').append('