// general shortcutting // let dqs = (q) => document.querySelector(q); let dqsa = (q) => document.querySelectorAll(q); let dsid = (q) => document.getElementById(q); let dscn = (q) => document.getElementsByClassName(q); let dstn = (q) => document.getElementsByTagName(q);
let arr = (a) => Array.from(a);
Geben Sie zunächst als Basisdaten die Wohnungsgrößenkategorie
und die Baualtersklasse an. Das Ergebnis ist die Basismiete in €/qm.
let fläche_fixed; let baujahr_fixed;
const is_valid = () => !arr(dqsa('#fläche_input, #baujahr_input')).find((x) => x.value <= 0); const rd = ((num=undefined) => typeof num != 'undefined' && num !== null ? Math.round(num*100) / 100 : undefined); const pnum = ((a) => `${rd(a)}`.replace(/([0-9]+)\.([0-9]+)/gm,'$1,$2').replace(/,([0-9]{1})$/,',$1'+0));
const commitLogic = function(){
const createObjectFromNodeMap = (m) => Object.fromEntries(Object.values(m).map((x)=>[x.name, x.textContent]));
dqsa(`#CALCULATOR .form-check-input, #CALCULATOR option`).forEach( function(x){ x.disabled = null; }) dqsa(`#CALCULATOR .form-check-label`).forEach( function(x){ x.style.color = 'rgba(0,0,0,1)'; });
let set_enabled = ( item, on = true ) => { if(typeof item==='undefined'||item===null) return; if(on===false) { item.setAttribute('disabled',''); try{ item.checked = null; } catch(e){} item.parentNode.style.opacity = 0.25; return; } item.removeAttribute('disabled'); item.parentNode.style.opacity = null; }
dqsa('[jahr_max_allowed]').forEach( x => set_enabled(x) );
if( dqs('[jahr_max]:checked') && dqs('[jahr_min]:checked') ) { let jahr_max = dqs('[jahr_max]:checked').getAttribute('jahr_max'); let jahr_min = dqs('[jahr_min]:checked').getAttribute('jahr_min'); dqsa('[jahr_max_allowed]').forEach( x => { set_enabled( x, jahr_max < x.getAttribute('jahr_max_allowed') || jahr_min < x.getAttribute('jahr_max_allowed') ) }); } else if( dqs('[jahr_min]:checked') ) { let jahr_max = dqs('[jahr_min]:checked').getAttribute('jahr_min'); dqsa('[jahr_max_allowed]').forEach( x => { set_enabled( x, jahr_max > x.getAttribute('jahr_max_allowed') ) }); }
let deactivate_constraints = function(x){ if ( x && x.constraints) { x.constraints.split(/,/g).filter(id => !id.match(/^\s*$/)).map( function(id){ try{ constraints.add(id); let el = dqs(`[_id="${id}"]`); if(el) el.style.color = 'rgba(0,0,0,0.5)';
let cb = dqs(`[id="${id}"]`); cb.disabled = 'disabled'; cb.checked = null; } catch(e) { console.warn(e); } }); } }
let deactivate_requirements = (x) => { x.requires.split(/,/g).filter(id => !id.match(/^\s*$/)).forEach((id) => { try{ if( !dqs(`[id="${id}"]`).checked ){ let el = dqs(`[_id="${x.id}"]`); if(el) el.style.color = 'rgba(0,0,0,0.5)';
let cb = dqs(`[id="${x.id}"]`); cb.disabled = 'disabled'; cb.checked = null; } } catch(e) {} }); } dqsa('#CALCULATOR .form-check-input[requires], #CALCULATOR option[requires]').forEach( x => deactivate_requirements(createObjectFromNodeMap(x.attributes)) );
let constraints = new Set(), summation = 0, selected_settings = [];
let basis_selektion = dqs('[id="baujahr und fläche"] :checked'); if (!basis_selektion) return;
basis_selektion = {
...createObjectFromNodeMap(basis_selektion.attributes),
value: !(isNaN(fläche_fixed) || isNaN(baujahr_fixed)) ? `Baujahr ${baujahr_fixed}, ${fläche_fixed} qm` : basis_selektion.value,
};
basis_selektion = {
...basis_selektion,
text_second: ' mit einer Fläche ' + (
!isNaN(fläche_fixed)
? 'von ' + fläche_fixed + ' qm'
: typeof basis_selektion.size_min != "undefined" && typeof basis_selektion.size_max != "undefined"
? 'zwischen ' + basis_selektion.size_min + ' qm und ' + basis_selektion.size_max + ' qm'
: typeof basis_selektion.size_max != "undefined"
? 'bis ' + basis_selektion.size_max+' qm'
: typeof basis_selektion.size_min != "undefined"
? 'ab ' + basis_selektion.size_min + ' qm' + ' aufwärts'
: ''
) + ' und einem Baujahr ' + (
!isNaN(baujahr_fixed)
? baujahr_fixed
: typeof basis_selektion.jahr_min != "undefined" && typeof basis_selektion.jahr_max != "undefined"
? 'zwischen ' + basis_selektion.jahr_min + ' und ' + basis_selektion.jahr_max
: typeof basis_selektion.jahr_max != "undefined"
? 'bis ' + basis_selektion.jahr_max
: typeof basis_selektion.jahr_min != "undefined"
? 'ab ' + basis_selektion.jahr_min + ' aufwärts'
: ''
) + `
liegt die ortsübliche Vergleichsmiete `// in ${basis_selektion.wohngebiet} `
}
selected_settings.push({ text: basis_selektion.value, price: basis_selektion.price, currency: basis_selektion.currency });
let basis_preis = parseFloat(basis_selektion.price); deactivate_constraints(basis_selektion);
let basis_preis_untergrenze = parseFloat(basis_selektion.min) ?? false; let basis_preis_obergrenze = parseFloat(basis_selektion.max) ?? false;
let summation_untergrenze = 0, summation_obergrenze = 0;
const woPrice = (s="") => s.replace(/\s*[(][0-9]+[.,]*[0-9]*\s*€[)\s*]/g,'');
dqsa('#CALCULATOR :not(.no_charge) .form-check-input:checked, #CALCULATOR select:not(.no_charge) option:checked').forEach( function(x){
if(x.tagName.match(/option/i) && x.parentNode.id == 'baujahr und fläche') return; if(x.parentNode.classList)
constraints.has(x.id)
const x_attributes = createObjectFromNodeMap(x.attributes) deactivate_constraints(x_attributes);
selected_settings.push( { text: dqs(`[_id="${x.id}"]`) ? dqs(`[_id="${x.id}"] span nobr`).textContent : (x.label || x.value), price: x_attributes.price, currency: x_attributes.currency } ); //.getAttribute('desc') ); });
dqsa('#CALCULATOR :not(.no_charge) .form-check-input:checked, #CALCULATOR select:not(.no_charge) option:checked').forEach((node) => { if(node.tagName.match(/option/i) && node.parentNode.id == 'baujahr und fläche') return;
const x = createObjectFromNodeMap(node.attributes)
summation += parseFloat(x.price);
if(basis_preis_untergrenze !== false) summation_untergrenze += parseFloat(x?.price); if(basis_preis_obergrenze !== false) summation_obergrenze += parseFloat(x?.price); }); summation += basis_preis;
let summations = [ { text: "Durchschnittliche ortsübliche Vergleichsmiete", price: Math.round( summation * 100 ) / 100 } ]
if( basis_preis_untergrenze !== false ){ summations.push( { ignore_sum: true, text: "Untere Spanne", price: Math.round( ( basis_preis_untergrenze + summation_untergrenze ) * 100 ) / 100 } ); } if( basis_preis_obergrenze !== false ){ summations.push( { ignore_sum: true, text: "Obere Spanne", price: Math.round( ( basis_preis_obergrenze + summation_obergrenze ) * 100 ) / 100 } ); }
dqs('#selected_options').innerHTML = '
` ], [] ).join('') + '
';
const prc = (a=0, b=0, c=1) => pnum(Math.round( ( a + b ) * c * 100 )/100);
if(summation){ dqs('#selected_options').innerHTML += `
`
} let _e0ee59ee_951e_46fd_9647_f93e336f8f36 = function() { let size_min = dqs('[size_min]:checked') ? dqs('[size_min]:checked').getAttribute('size_min') : undefined; let size_max = dqs('[size_max]:checked') ? dqs('[size_max]:checked').getAttribute('size_max') : undefined; let selected_size = dqs('[id="mo_size"]') ? dqs('[id="mo_size"]').value : undefined;
size_min = parseFloat(size_min) || undefined; size_max = parseFloat(size_max) || undefined; selected_size = parseFloat(selected_size) || 0;
if( ( size_min && selected_size < size_min ) || ( size_max && selected_size > size_max ) ) return false;
let flaeche = parseFloat(dsid('mo_size').value);
dsid('mo_size_total').innerHTML = 'Für das Mietobjekt'
dqsa('[id="fläche_input"]').forEach(_ => dqsa('#mo_size, [id="baujahr und fläche"]').forEach(_ => _.style.display='none'));
dsid('mo_size_total').innerHTML += basis_selektion.text_second
let P = fläche_fixed; P = Number.isNaN(P) ? undefined : P; if (P) { dsid('mo_size_total').innerHTML += `bei ${pnum(P * summation)} €`; }
let v = is_valid() ? 'unset' : 'hidden'; dqsa('[id="evaluation"], [id="priceinfo"]').forEach((x) => x.style.visibility = v);
};
if( dqs('[size_max]:checked') && parseFloat( dqs('[id="mo_size"]').value ) > parseFloat( dqs('[size_max]:checked').getAttribute('size_max') ) ) dqs('[id="mo_size"]').value = dqs('[size_max]:checked').getAttribute('size_max'); else if( dqs('[size_min]:checked') && parseFloat( dqs('[id="mo_size"]').value ) < parseFloat( dqs('[size_min]:checked').getAttribute('size_min') ) ) dqs('[id="mo_size"]').value = dqs('[size_min]:checked').getAttribute('size_min'); if(dqs('[size_min]:checked')) dqs('[id="mo_size"]').setAttribute( 'min', dqs('[size_min]:checked').getAttribute('size_min') ) if(dqs('[size_max]:checked')) dqs('[id="mo_size"]').setAttribute( 'max', dqs('[size_max]:checked').getAttribute('size_max') ) if( dqs('[size_max]:checked') && dqs('[id="mo_size"]').value > dqs('[size_max]:checked').getAttribute('size_max') ) dqs('[id="mo_size"]').value = dqs('[size_max]:checked').getAttribute('size_max'); else if( dqs('[size_min]:checked') && dqs('[id="mo_size"]').value < dqs('[size_min]:checked').getAttribute('size_min') ) dqs('[id="mo_size"]').value = dqs('[size_min]:checked').getAttribute('size_min'); if( dqs('[size_max]:checked') && !dqs('[size_min]:checked') ) dqs('[id="mo_size"]').setAttribute('min', null ); if( dqs('[size_min]:checked') && !dqs('[size_max]:checked') ) dqs('[id="mo_size"]').setAttribute('max', null ); dqs('[id="mo_size"]').oninput = _e0ee59ee_951e_46fd_9647_f93e336f8f36; dqs('[id="mo_size"]').oninput(); }; dqsa('#CALCULATOR input[type="checkbox"], #CALCULATOR select').forEach( function(x){ x.oninput = (()=>{ commitLogic(); }) } );
commitLogic(); dsid('baujahr und fläche')?.parentNode?.parentNode?.classList.add('active'); dqs('#CALCULATOR .collapsible > li:last-of-type')?.classList.add('active');
document.addEventListener('DOMContentLoaded', function(){
const inputFieldsFn = (()=>{ const inputs = dqsa('[id="fläche_input"],[id="baujahr_input"],[id="wohngebiet_input"]'); if( inputs.length < 2 ) return false; fläche_fixed = parseFloat( dqs('[id="fläche_input"]').value.replace(/^[^0-9]+$/gi,x=>'') ); baujahr_fixed = parseFloat( dqs('[id="baujahr_input"]').value.replace(/^[^0-9]+$/gi,x=>'') );
let wohngebiet = dqs('[id="wohngebiet_input"]') ? dqs('[id="wohngebiet_input"]').value : undefined;
let selectors = Array.from(dqsa('[id="baujahr und fläche"] option')); let selector = selectors.find(x => { return ( ( (isNaN(fläche_fixed)) || ( parseFloat(x.getAttribute('size_min')||-Infinity) <= fläche_fixed && fläche_fixed <= parseFloat(x.getAttribute('size_max')||Infinity) ) ) && ( (isNaN(baujahr_fixed)) || ( parseFloat(x.getAttribute('jahr_min')||-Infinity) <= baujahr_fixed && baujahr_fixed <= parseFloat(x.getAttribute('jahr_max')||Infinity) ) ) && ( wohngebiet == x.getAttribute('wohngebiet') ) ) }); if (!selector) return; selector.parentNode.selectedIndex = selector.index; commitLogic(); }); dqsa('[id="baujahr und fläche"]').forEach(x => { if(dqs('[id="baujahr und fläche bound"]')) return; let el = document.createElement('DIV'); el.id = 'baujahr und fläche bound' dqsa('[id="fläche_input"], [id="baujahr_input"], [id="wohngebiet_input"]').forEach((x) => { x.oninput = inputFieldsFn; }); }); inputFieldsFn();
});