| Server IP : 202.61.199.114 / Your IP : 216.73.217.139 Web Server : nginx/1.22.1 System : Linux de.arni-solutions.de 6.1.0-49-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.174-1 (2026-05-26) x86_64 User : web20 ( 1018) PHP Version : 8.4.23 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : ON Directory : /var/www/clients/client2/web20/web/wp-content/themes/drogentest-online/inc/ |
Upload File : |
<?php
/**
* Promille-Rechner als Shortcode.
*
* Der Shortcode wird erst NACH wpautop expandiert – so kann WordPress die
* Button-Struktur nicht mit <br/>-/<p>-Tags zerschießen.
*
* Usage: [dgt_promille_rechner]
*
* @package drogentest-online
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
function dgt_promille_rechner_shortcode() {
ob_start();
?>
<div class="dgt-promille" id="dgt-promille">
<div class="dgt-promille-grid">
<div class="dgt-promille-field">
<span class="dgt-promille-label">Geschlecht</span>
<div class="dgt-promille-radios">
<label><input type="radio" name="dgt-prom-sex" value="m" checked> Mann</label>
<label><input type="radio" name="dgt-prom-sex" value="w"> Frau</label>
</div>
</div>
<div class="dgt-promille-field">
<label class="dgt-promille-label" for="dgt-prom-weight">Körpergewicht (kg)</label>
<input type="number" id="dgt-prom-weight" min="30" max="200" step="1" value="75" inputmode="numeric">
</div>
<div class="dgt-promille-field">
<label class="dgt-promille-label" for="dgt-prom-hours">Stunden seit Trinkbeginn</label>
<input type="number" id="dgt-prom-hours" min="0" max="24" step="0.5" value="0" inputmode="decimal">
</div>
</div>
<div class="dgt-promille-drinks">
<span class="dgt-promille-label">Getränke (Klick = +1, kleines Minus zum Reduzieren)</span>
<div class="dgt-promille-drinklist"><?php
$drinks = array(
array( 'Bier', '0,33 l · 5 %', 330, 5 ),
array( 'Großbier', '0,5 l · 4,8 %', 500, 4.8 ),
array( 'Wein', '0,2 l · 12 %', 200, 12 ),
array( 'Sekt', '0,1 l · 11 %', 100, 11 ),
array( 'Schnaps', '4 cl · 40 %', 40, 40 ),
array( 'Cocktail', '0,2 l · ~15 %', 200, 15 ),
);
foreach ( $drinks as $d ) {
printf(
'<button type="button" class="dgt-promille-drink" data-vol="%d" data-abv="%s"><span class="dgt-promille-drink-name">%s</span><span class="dgt-promille-drink-meta">%s</span><span class="dgt-promille-drink-count" data-count="0">0</span><span class="dgt-promille-drink-minus" aria-label="weniger">−</span></button>',
(int) $d[2],
esc_attr( $d[3] ),
esc_html( $d[0] ),
esc_html( $d[1] )
);
}
?></div>
</div>
<div class="dgt-promille-result" aria-live="polite">
<div class="dgt-promille-result-main">
<span class="dgt-promille-result-label">Aktueller Wert</span>
<span class="dgt-promille-result-value" id="dgt-prom-bak">0,00 ‰</span>
</div>
<div class="dgt-promille-result-meta">
<div><span>Alkoholmenge</span> <strong id="dgt-prom-grams">0 g</strong></div>
<div><span>Wieder nüchtern in</span> <strong id="dgt-prom-sober">–</strong></div>
</div>
<p class="dgt-promille-disclaimer">Die Berechnung berücksichtigt das Resorptionsdefizit (15 %) und einen mittleren Alkoholabbau von 0,15 ‰ pro Stunde. Es handelt sich um einen Schätzwert – keine medizinische oder gerichtsfeste Messung.</p>
<button type="button" class="dgt-promille-reset" id="dgt-prom-reset">Zurücksetzen</button>
</div>
</div>
<script>
(function(){
var root=document.getElementById('dgt-promille');
if(!root) return;
var counts={}, drinks=root.querySelectorAll('.dgt-promille-drink');
drinks.forEach(function(btn,i){
counts[i]=0;
btn.addEventListener('click',function(e){
if(e.target.classList.contains('dgt-promille-drink-minus')){
counts[i]=Math.max(0,counts[i]-1);
} else {
counts[i]=Math.min(20,counts[i]+1);
}
btn.querySelector('.dgt-promille-drink-count').textContent=counts[i];
btn.classList.toggle('has-count',counts[i]>0);
recalc();
});
});
['change','input'].forEach(function(ev){
root.querySelectorAll('input').forEach(function(inp){ inp.addEventListener(ev,recalc); });
});
document.getElementById('dgt-prom-reset').addEventListener('click',function(){
drinks.forEach(function(b,i){ counts[i]=0; b.querySelector('.dgt-promille-drink-count').textContent='0'; b.classList.remove('has-count'); });
document.getElementById('dgt-prom-weight').value=75;
document.getElementById('dgt-prom-hours').value=0;
root.querySelector('input[name="dgt-prom-sex"][value="m"]').checked=true;
recalc();
});
function recalc(){
var sex=root.querySelector('input[name="dgt-prom-sex"]:checked').value;
var r=(sex==='w')?0.6:0.7;
var weight=parseFloat(document.getElementById('dgt-prom-weight').value)||0;
var hours=parseFloat(document.getElementById('dgt-prom-hours').value)||0;
var grams=0;
drinks.forEach(function(btn,i){
var vol=parseFloat(btn.getAttribute('data-vol'));
var abv=parseFloat(btn.getAttribute('data-abv'));
grams += counts[i] * vol * (abv/100) * 0.8;
});
var bak=0;
if(weight>0 && grams>0){
bak = (grams*0.85) / (weight*r);
bak = Math.max(0, bak - hours*0.15);
}
document.getElementById('dgt-prom-bak').textContent=bak.toFixed(2).replace('.',',')+' ‰';
document.getElementById('dgt-prom-grams').textContent=Math.round(grams)+' g';
var soberH = bak>0 ? bak/0.15 : 0;
document.getElementById('dgt-prom-sober').textContent = soberH>0 ? (soberH<1 ? Math.round(soberH*60)+' min' : soberH.toFixed(1).replace('.',',')+' h') : '–';
root.classList.toggle('over-legal', bak>=0.5);
root.classList.toggle('over-zero', bak>0 && bak<0.5);
}
recalc();
})();
</script>
<?php
return ob_get_clean();
}
add_shortcode( 'dgt_promille_rechner', 'dgt_promille_rechner_shortcode' );