<script>
(function() {
// Price mapping for all form fields
var PRICE_MAP = {
// Package prices
'abschiedspakete': {
'still': 1345.00,
'privat': 1655.00,
'classic': 1915.00
},
// Fee prices
'arzt_und_urkunden': {
'€ 250,00 (ca.)': 250.00
},
'beisetzungsgebuhr': {
'€ 222,00 (ca.)': 222.00
},
'nutzungsgebuhr_feierhalle_fur_trauerfeier': {
'€ 320,00': 320.00
},
'trauerrednerin': {
'€ 350,00': 350.00
},
'digitale_trauer-_und_danksagunskarte': {
'€ 120,00': 120.00
},
'diashow_aus_dem_leben': {
'€ 260,00': 260.00
}
};</p>
<p>
</p>
<p> function parseEuroToNumber(inputText) {
if (!inputText) return 0;
var text = String(inputText).replace(/[^0-9.,]/g, '');
if (!text) return 0;
text = text.replace(/.(?=d{3}(D|$))/g, '').replace(/,(d{2})$/, '.$1');
var num = parseFloat(text);
return isNaN(num) ? 0 : num;
}</p>
<p>
</p>
<p> function isElementVisible(el) {
if (!el) return false;
var style = window.getComputedStyle(el);
if (style.display === 'none' || style.visibility === 'hidden' || parseFloat(style.opacity) === 0) return false;
if (!el.getClientRects().length && style.position !== 'fixed') return false;
return true;
}</p>
<p>
</p>
<p> function getSelectedPackagePrice() {
// First try to get from image select inputs
var packageInputs = document.querySelectorAll('input[name="abschiedspakete[]"]:checked, input[name="abschiedspakete"]:checked');
if (packageInputs.length > 0) {
var selectedPackage = packageInputs[0].value;
return PRICE_MAP.abschiedspakete[selectedPackage] || 0;
}</p>
<p>
</p>
<p> // If no direct input found, look for visible price text in the current step
var allElements = document.querySelectorAll('*');
for (var i = 0; i < allElements.length; i++) { var element = allElements[i]; if (isElementVisible(element)) { var text = element.textContent || element.innerText; if (text.includes('€') && (text.includes('1.345') || text.includes('1.655') || text.includes('1.915'))) { var price = parseEuroToNumber(text); if (price > 0) return price;
}
}
}
return 0;
}</p>
<p>
</p>
<p> function getSelectedFeesPrice() {
var totalFees = 0;</p>
<p>
</p>
<p> // Check each fee field
Object.keys(PRICE_MAP).forEach(function(fieldName) {
if (fieldName === 'abschiedspakete') return; // Skip package field</p>
<p>
</p>
<p> var feeInputs = document.querySelectorAll('input[name="' + fieldName + '[]"]:checked, input[name="' + fieldName + '"]:checked');
feeInputs.forEach(function(input) {
var feeValue = input.value;
var feePrice = PRICE_MAP[fieldName][feeValue];
if (feePrice) {
totalFees += feePrice;
}
});
});</p>
<p>
</p>
<p> return totalFees;
}</p>
<p>
</p>
<p> function getRangeSliderValue() {
// Try multiple possible selectors for the range slider
var rangeSlider = document.querySelector('input[type="range"][name="individuelle_absicherungssumme"]') ||
document.querySelector('input[type="range"][name*="absicherung"]') ||
document.querySelector('input[type="range"]');</p>
<p>
</p>
<p> if (rangeSlider && isElementVisible(rangeSlider)) {
var sliderValue = parseFloat(rangeSlider.value) || 0;
var minValue = parseFloat(rangeSlider.min) || 1000;</p>
<p>
</p>
<p> // If slider is visible and has a value, return the full value (starting from min)
console.log('Range slider active:', rangeSlider.name, 'Value:', sliderValue, 'Min:', minValue);
return sliderValue;
}</p>
<p>
</p>
<p> console.log('Range slider not active or not found');
return 0;
}</p>
<p>
</p>
<p> function calculateTotal() {
var packagePrice = getSelectedPackagePrice();
var feesPrice = getSelectedFeesPrice();
var rangeSliderValue = getRangeSliderValue();
var total = packagePrice + feesPrice + rangeSliderValue;</p>
<p>
</p>
<p> console.log('Package price:', packagePrice);
console.log('Fees price:', feesPrice);
console.log('Range slider value:', rangeSliderValue);
console.log('Total:', total);</p>
<p>
</p>
<p> return total;
}</p>
<p>
</p>
<p> function formatCurrency(amount) {
return '€ ' + amount.toFixed(2).replace('.', ',').replace(/B(?=(d{3})+(?!d))/g, '.') + ' (inkl. MwSt.)';
}</p>
<p>
</p>
<p> function setTextIfChanged(element, newText) {
if (element && element.textContent !== newText) {
element.textContent = newText;
}
}</p>
<p>
</p>
<p> function updatePriceDisplay() {
var total = calculateTotal();
var formattedTotal = formatCurrency(total);</p>
<p>
</p>
<p> // Update all price display elements
setTextIfChanged(document.getElementById('gesamtpreis'), formattedTotal);
setTextIfChanged(document.getElementById('gesamtpreis-final'), formattedTotal);</p>
<p>
</p>
<p> // Update price overview content
var inhaltEl = document.getElementById('preisuebersicht-inhalt');
if (inhaltEl) {
var details = [];</p>
<p>
</p>
<p> var packagePrice = getSelectedPackagePrice();
if (packagePrice > 0) {
details.push('Abschiedspaket - ' + formatCurrency(packagePrice));
}</p>
<p>
</p>
<p> var feesPrice = getSelectedFeesPrice();
if (feesPrice > 0) {
details.push('Zusätzliche Gebühren - ' + formatCurrency(feesPrice));
}</p>
<p>
</p>
<p> var rangeSliderValue = getRangeSliderValue();
if (rangeSliderValue > 0) {
details.push('Individuelle Absicherungssumme - ' + formatCurrency(rangeSliderValue));
}</p>
<p>
</p>
<p> if (details.length > 0) {
inhaltEl.innerHTML = details.join('<br />');
} else {
inhaltEl.innerHTML = 'Wählen Sie Ihre Optionen aus, um die Gesamtsumme zu sehen.';
}
}
}</p>
<p>
</p>
<p> // Add event listeners for all form inputs
function addEventListeners() {
var allInputs = document.querySelectorAll('input[type="radio"], input[type="checkbox"], input[type="range"], input[type="image"]');
allInputs.forEach(function(input) {
input.addEventListener('change', updatePriceDisplay);
input.addEventListener('input', updatePriceDisplay); // For range slider real-time updates
input.addEventListener('click', updatePriceDisplay);
});</p>
<p>
</p>
<p> // Also listen for image select changes
var imageSelects = document.querySelectorAll('.fusion-form-image-select');
imageSelects.forEach(function(select) {
select.addEventListener('click', updatePriceDisplay);
});</p>
<p>
</p>
<p> // Special handling for range slider
var rangeSliders = document.querySelectorAll('input[type="range"]');
rangeSliders.forEach(function(slider) {
slider.addEventListener('input', function() {
console.log('Range slider changed:', slider.name, 'Value:', slider.value);
updatePriceDisplay();
});
slider.addEventListener('change', updatePriceDisplay);
});
}</p>
<p>
</p>
<p> // Initialize when DOM is ready
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', function() {
addEventListeners();
updatePriceDisplay();
});
} else {
addEventListeners();
updatePriceDisplay();
}</p>
<p>
</p>
<p> // Hilfsfunktionen zur dynamischen Preis-Erkennung (Avada-Labels)
function findEuroTextNear(node) {
if (!node) return '';
var labelFor = node.id ? document.querySelector('label[for="' + node.id + '"]') : null;
if (labelFor && labelFor.textContent && labelFor.textContent.indexOf('€') !== -1) return labelFor.textContent;
var current = node;
for (var depth = 0; depth < 6 && current; depth++) {
var text = current.textContent || '';
if (text.indexOf('€') !== -1) return text;
current = current.parentElement;
}
var siblings = (node.parentElement && node.parentElement.children) ? Array.from(node.parentElement.children) : [];
for (var i = 0; i < siblings.length; i++) {
if (siblings[i] !== node) {
var st = siblings[i].textContent || '';
if (st.indexOf('€') !== -1) return st;
}
}
return '';
}
function extractFirstEuro(text) {
if (!text) return 0;
var match = text.match(/€\s*[0-9]{1,3}(?:\.[0-9]{3})*(?:,[0-9]{2})?/);
return match ? parseEuroToNumber(match[0]) : 0;
}
// Override: Paketpreise dynamisch auslesen
var __origGetSelectedPackagePrice = getSelectedPackagePrice;
getSelectedPackagePrice = function() {
var packageInputs = document.querySelectorAll('input[name="abschiedspakete[]"]:checked, input[name="abschiedspakete"]:checked');
if (packageInputs.length > 0) {
var input = packageInputs[0];
var text = findEuroTextNear(input);
var value = extractFirstEuro(text);
if (value > 0) return value;
}
try { return __origGetSelectedPackagePrice(); } catch (e) { return 0; }
};
// Override: Gebühren dynamisch auslesen (ohne Doppelzählung)
getSelectedFeesPrice = function() {
var totalFees = 0;
var inputs = document.querySelectorAll('input[type="radio"]:checked, input[type="checkbox"]:checked');
inputs.forEach(function(input) {
if (input.name && input.name.indexOf('abschiedspakete') !== -1) return;
var text = findEuroTextNear(input);
var value = extractFirstEuro(text);
if (value > 0) totalFees += value;
});
var nodes = document.querySelectorAll('*');
for (var j = 0; j < nodes.length; j++) {
var el = nodes[j];
var style = window.getComputedStyle(el);
if (style.display === 'none' || style.visibility === 'hidden' || parseFloat(style.opacity) === 0) continue;
var tt = el.textContent || '';
if (/Arzt\s+und\s+Urkunden/i.test(tt) && tt.indexOf('€') !== -1) {
var extra = extractFirstEuro(tt);
if (extra > 0) { totalFees += extra; break; }
}
}
return totalFees;
};
// Expose functions for debugging
window.__sumRecalc = updatePriceDisplay;
window.__sumScan = function() {
var packagePrice = getSelectedPackagePrice();
var feesPrice = getSelectedFeesPrice();
var rangeSliderValue = getRangeSliderValue();
var total = calculateTotal();</p>
<p>
</p>
<p> console.log('Selected package price:', packagePrice);
console.log('Selected fees price:', feesPrice);
console.log('Range slider value:', rangeSliderValue);
console.log('Total:', total);</p>
<p>
</p>
<p> return { packagePrice: packagePrice, feesPrice: feesPrice, rangeSliderValue: rangeSliderValue, total: total };
};
})();
</script>