// source --> https://www.emslander-co.de/wp-content/themes/mediaMEANS/templates/modules/m31_objects/single_m31_objects.js 
const single_m31_function = {
	$sections: null,

	init() {
		this.$sections = jQuery('section.m31_single_entry');
		
		let conditions =	jQuery('section.m31_single_entry').length > 0 && 
							jQuery('section.m26_flexible_content').length > 0 && 
							jQuery('section.m26_flexible_content').find('section.m13_contact_person').length > 0;
		
		// initiale Position und Breite der Kontaktbox pro Section speichern
		this.$sections.each(function() {
			const $section    = jQuery(this);
			const $cpWrapper  = $section.find('.m13_kontaktperson_main ');
			
			if (!$cpWrapper.length) return;

			const offset = $cpWrapper.offset();

		});

		if(conditions) {
			// direkt einmal ausführen
			this.scrollContactPerson();
		}

		// Scroll + Resize
		const self = this;
		jQuery(window).on('scroll resize', function() {
			if(conditions) {
				self.scrollContactPerson();
			}
		});
		
		self.setMarkerOnMap();
		self.fillFormWithWohnungen();
		self.setShareButton();
	},
	
	setShareButton() {
		const shareBtn = document.querySelector('.m31_share');
		if(!shareBtn) return;
		
		const shareData = {
			title: document.title,
			text: "Schau dir die Immobilie an!",
			url: window.location.href,
		};
		
		shareBtn.addEventListener("click", async () => {
			try {
				await navigator.share(shareData);
				console.log('native share success');
			} catch (err) {
				console.log(`Error: ${err}`);
				
				// create element to show after copy to clipboard
				const copiedEl = document.createElement("div");
				copiedEl.classList.add("m31_share_copied");
				const copiedText = "Seiten-URL wurde in die Zwischenablage kopiert";
				const copiedTextEl = document.createElement("p");
				copiedTextEl.innerText = copiedText;
				copiedEl.append(copiedTextEl);
				
				// create element with content to copy
				var dummy = document.createElement('input'),
					text = window.location.href;
				document.body.appendChild(dummy);
				dummy.value = text;
				dummy.select();
				
				// copy 
				document.execCommand('copy');
				document.body.removeChild(dummy);
				
				// show notification
				const shareWrapper = document.querySelector('.m31_share_container');
				if(!shareWrapper.querySelector('.m31_share_copied')) {
					shareWrapper.append(copiedEl);
					setTimeout(() => {
						shareWrapper.querySelector('.m31_share_copied').remove();
					}, 2000);
				}
			}
		});
	},
	
	fillFormWithWohnungen() {
		const contactCTA = jQuery('section.m27_contact_cta');
		const contactForm = contactCTA.find('.m27_form');
		if(contactCTA.length > 0) {
			
			const objekt_title = jQuery('.m31_wohnungen_form').attr('data-objekt-title');
			const objekt_url = jQuery('.m31_wohnungen_form').attr('data-objekt-url');
			if(objekt_title) {
				const plainTitle = objekt_title.replace(/<[^>]*>/g, '').trim();
				contactForm.find('#cf7_source-title').val(plainTitle);
			}
			if(objekt_url) contactForm.find('#cf7_source-url').val(objekt_url);
			
			// E-Mail aus Ansprechpartner-Block auslesen
			const $mailContainer = jQuery('.m13_email_container .m13_contact_text').first();
			const fallbackMail = 'info@emslander-co.de';
			let ansprechpartnerMail = fallbackMail;
			
			if($mailContainer.length) {
				const mailText = $mailContainer.text().trim();
				// Validierung: echte E-Mail-Adresse?
				
				if(/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(mailText)) {
					ansprechpartnerMail = mailText;
				}
			}
			
			contactForm.find('#cf7_ansprechpartner_mail').val(ansprechpartnerMail);
		}
	},

	scrollContactPerson() {
		const self = this;
		const scrollTop = jQuery(window).scrollTop();
		const triggerY = scrollTop 
			+ jQuery('header').outerHeight(true) 
			+ jQuery('.mM_above_header').outerHeight(true);
		
		const $entry = jQuery('section.m31_single_entry');
		let entryHeight = $entry.outerHeight(true);
		
		const $stopSection = jQuery('section.m26_flexible_content');
		const stopTop = $stopSection.length ? $stopSection.offset().top : Infinity;
		
		const $m26section = jQuery('section.m26_flexible_content');
		const $cpWrapperInM26 = $m26section.find('section.m13_contact_person');
		// console.log($m26section.prev());
		$cpWrapperInM26.css('margin-top', 0 - parseInt($m26section.prev().css('padding-bottom')) - $cpWrapperInM26.height());
		
		const $section   = $entry;
		const $cpWrapper = $section.find('.m13_kontaktperson_main ');
		
		if (!$cpWrapper.length || !$cpWrapperInM26.length) return;
		
		const sectionTop    = $section.offset().top;
		const sectionBottom = sectionTop + $section.outerHeight();
		
		let positionBottomMin = 50;
		let calculatedBottom = jQuery(window).height()
			- entryHeight
			- jQuery('header').outerHeight(true)
			- jQuery('.mM_above_header').outerHeight(true)
			+ parseInt($entry.css('padding-bottom')) 
			+ 77 /* margin top from m3 above */;
	
		let positionBottom = (calculatedBottom > positionBottomMin) 
			? calculatedBottom 
			: positionBottomMin;
	
		function setStyles() {
			$cpWrapper
				.addClass('is-visible is-fixed')
				.css({
					position: 'fixed',
					bottom: positionBottom
				});
			
			jQuery('section.m26_flexible_content section.m13_contact_person')
				.css({ top: '' });
		}
		
		function resetStyles() {
			$cpWrapper
				.removeClass('is-visible is-fixed')
				.css({
					position: '',
					bottom: ''
				});
				
			jQuery('section.m26_flexible_content section.m13_contact_person')
				.css({
					top: jQuery('header').outerHeight() + 50
				});
		}
		
		const isDesktop = window.matchMedia('(min-width: 1200px)').matches;
	
		if (!isDesktop) {
			resetStyles();
			return;
		}
		
		// LOWER EDGE OF THE FLOATING BOX
		const cpBottom = triggerY + $cpWrapper.outerHeight();
		
		// CONDITIONS:
		let buffer = 10;
		const inSection = (
			triggerY >= sectionTop &&
			triggerY < sectionBottom - parseInt($entry.css('padding-bottom')) + parseInt($entry.css('padding-top')) - buffer
		);
		
		const hitsStopSection = cpBottom >= stopTop;
		
		if (inSection && !hitsStopSection) {
			setStyles();
		} else {
			resetStyles();
		}
	},
	
	setMarkerOnMap() {
		if(!jQuery('section.m28_location').length) return;
		
		/* Map ID / backend allgemeine informationen - empty map */
		let customMap = jQuery('.m31_custom_map');
		let customMaptitle = customMap.attr('data-title');
		let customMapAddress = customMap.attr('data-address');
		let customMapId = customMap.attr('data-map-id');
		let customMapLat = customMap.attr('data-lat');
		let customMapLng = customMap.attr('data-lng');
		let customMapDescription = customMap.attr('data-description');
		let customMapIconUrl = customMap.attr('data-icon-url');
		
		if(!customMapLat || !customMapLng) {
			jQuery('section.m28_location').css('display', 'none');
			return false;
		}
		/* An array with objects, each object represents a marker */
		const customMarkerData = [
			{
				title : customMaptitle,
				address: customMapAddress,
				map_id: customMapId,
				lat: customMapLat,
				lng: customMapLng,
				description: customMapDescription,
				icon: customMapIconUrl
			}
		];
	
		jQuery(document.body).on('markersplaced.wpgmza', () => {
			const map = WPGMZA.getMapByID(customMapId);
			if(map){
				for(let i in customMarkerData){
					const data = customMarkerData[i];
					const instance = WPGMZA.Marker.createInstance(data);
					map.addMarker(instance);
				}
				
				let latLng = new WPGMZA.LatLng({
					lat: customMapLat,
					lng: customMapLng
				});
				
				// Karte auf Marker zentrieren
				map.setCenter(latLng);
				map.setZoom(12);
			}
		});
	}
};

jQuery(document).ready(function(){
	single_m31_function.init();
	
	mm_lightbox.init('.m13_call');
});
// source --> https://www.emslander-co.de/wp-content/themes/mediaMEANS/templates/modules/m31_objects/m31_objects.js 
(function() {
  'use strict';
  // Datum als Timestamp (ms oder Unix) normalisieren
  function normalizeDate(rawDate) {
	if (rawDate === undefined || rawDate === null) return 0;
	var str = String(rawDate).trim();
	if (!str) return 0;
	// Wenn nur Ziffern → Unix-Timestamp als Zahl
	if (/^\d+$/.test(str)) {
	  return parseInt(str, 10);
	}
	// DD.MM.YYYY → YYYY-MM-DD
	var normalized = str.replace(
	  /^(\d{1,2})\.(\d{1,2})\.(\d{4})$/,
	  '$3-$2-$1'
	);
	var ts = Date.parse(normalized);
	return isNaN(ts) ? 0 : ts;
  }
  // Einfaches Number-Parsing für Inputs & data-Attribute
  function toNumber(raw) {
	if (raw === undefined || raw === null) return null;
	var str = String(raw).trim();
	if (!str) return null;
	// deutsches Komma zulassen
	str = str.replace(',', '.');
	var num = parseFloat(str);
	return isNaN(num) ? null : num;
  }
  function initSliderM31Section(jQuerysection) {
	  if(jQuerysection.attr('data-slider') == 'active_slider') {
		var jQuerycontent = jQuerysection.find('.m31_main_content');
		if (!jQuerycontent.length) return;
		if (jQuerycontent.hasClass('slick-initialized')) return;
		jQuerycontent.slick({
			infinite: false,
			slidesToShow: 2,
			slidesToScroll: 1,
			arrows: true,
			dots: false,
			responsive: [
				{
				breakpoint: 1200,
				settings: {
					slidesToShow: 1
				}
				}
			]
		});
	}
  }
  function setSliderOffsetM31(jQuerysection) {
	jQuery('section.m31_objects').each(function() {
	  var jQueryelem = jQuerysection;
	  if(jQuery(jQueryelem).attr('data-slider') == 'active_slider') {
		var jQueryfooterContainer = jQuery('footer .mM_footer_middle_container');
		if (!jQueryfooterContainer.length) return;
		var valOffset = jQueryfooterContainer.offset().left;
		var valOffsetPadding = valOffset;
		if(window.matchMedia('(min-width: 1200px)').matches) {
			valOffsetPadding = valOffsetPadding - 66;
		} else if(window.matchMedia('(min-width: 576px)').matches) {
			valOffsetPadding = valOffsetPadding - 30;
		}
		let containerBreit = jQuery('.calculation_container .container_breit');
		let containerBreitWidth = containerBreit.width() || 0;
		let offsetFromWindowToContainerBreit = (jQuery(window).width() - containerBreitWidth) / 2;
		jQueryelem.find('.mM_container').css({
			margin: 0,
			'max-width': '100vw'
		});
		jQueryelem.find('.m31_content_head').css({
			'padding-right': valOffset + 'px',
			'padding-left': valOffset + 'px'
		});
		jQueryelem.find('.slick-arrow.slick-prev').css({
			'left': offsetFromWindowToContainerBreit + 'px'
		});
		jQueryelem.find('.slick-arrow.slick-next').css({
			'right': offsetFromWindowToContainerBreit + 'px'
		});
		jQueryelem.find('.slick-list').css({
			'padding-right': valOffsetPadding + 'px',
			'padding-left': valOffset + 'px'
		});
	  }
	});
  }
  /**
   * Filter & Sort anwenden
   */
  function applyFilterM31(jQuerysection, slug, sortDir, scroll = false) {
	  var jQuerycontent = jQuerysection.find('.m31_main_content');
	  var jQuerypromContent = jQuerysection.find('.m31_prom_referencen');
	  var jQuerypromSection = jQuerypromContent.closest('.m31_middle');
	  var kurzeAusgabe = jQuerysection.attr('data-kurze-ausgabe') == 'true';
	  if (!jQuerycontent.length) return;
	  var hasSliderConfig = jQuerysection.attr('data-slider') === 'active_slider';
	  sortDir = sortDir || 'desc';
	  // 1. Alle Daten (Normal + Prominent) zusammenführen, um die global neuesten zu finden
	  var allItems = (jQuerysection.data('m31ItemsData') || []).concat(jQuerysection.data('m31PromItemsData') || []);
	  // 2. Filter-Werte abgreifen
	  var priceMin = toNumber(jQuerysection.find('.m31_input_price_min').val());
	  var priceMax = toNumber(jQuerysection.find('.m31_input_price_max').val());
	  var qmMin    = toNumber(jQuerysection.find('.m31_input_qm_min').val());
	  var qmMax    = toNumber(jQuerysection.find('.m31_input_qm_max').val());
	  var roomsMin = toNumber(jQuerysection.find('.m31_input_rooms_min').val());
	  var roomsMax = toNumber(jQuerysection.find('.m31_input_rooms_max').val());
	  var buyRentVal = (jQuerysection.find('.m31_filter_buy_rent select').val() || '').toString().toLowerCase();
	  var immoTypeVal = (jQuerysection.find('.m31_filter_type select').val() || '').toString().toLowerCase();
	  // 3. Filtern
	  var filteredTotal = allItems.filter(function(item) {
		  var hasCategoryPreselection = jQuerysection.attr('data-has-category-preselection') === 'true';
		  if (!hasCategoryPreselection && !slug && item.isReference) return false;
		  if (slug && (!item.cats || item.cats.indexOf(slug) === -1)) return false;
		  if (buyRentVal && item.buyRent !== buyRentVal) return false;
		  if (immoTypeVal && item.immobilienType !== immoTypeVal) return false;
		  // NEU – Preis-Filterlogik komplett ersetzen:
		  if (priceMin !== null || priceMax !== null) {
			  var relevantPrice;
			  if (buyRentVal === 'mieten') {
				  relevantPrice = item.mieteValue;
			  } else if (buyRentVal === 'kaufen') {
				  relevantPrice = item.priceValue;
			  } else {
				  relevantPrice = (item.priceValue > 0) ? item.priceValue : item.mieteValue;
			  }
		  
			  // Objekt hat keinen relevanten Preis → ausblenden
			  if (relevantPrice <= 0) return false;
		  
			  if (priceMin !== null && relevantPrice < priceMin) return false;
			  if (priceMax !== null && relevantPrice > priceMax) return false;
		  }
		  if (qmMin !== null && item.qmValue < qmMin) return false;
		  if (qmMax !== null && item.qmValue > qmMax) return false;
		  if (roomsMin !== null && item.roomsValue < roomsMin) return false;
		  if (roomsMax !== null && item.roomsValue > roomsMax) return false;
		  return true;
	  });
	  // 4. Nach Datum sortieren (damit die neuesten oben sind)
	  filteredTotal.sort(function(a, b) {
		  return b.dateValue - a.dateValue;
	  });
	  // Die ersten 2 sind immer prominent (falls vorhanden)
	  var itemsForProminent = filteredTotal.slice(0, 2);
	  // Der Rest geht in die normale Liste
	  var itemsForList;
	  if (!kurzeAusgabe) {
		  itemsForList = filteredTotal.slice(2);
	  } else {
		  itemsForList = filteredTotal;
	  }
	  // Wenn die Liste nach ASC sortiert werden soll, sortieren wir nur den Listenteil um
	  if (sortDir === 'asc') {
		  itemsForList.sort(function(a, b) { return a.dateValue - b.dateValue; });
	  }

	  // ============================================================
	  // NEU: Request-Token vergeben. Jeder Aufruf von applyFilterM31
	  // erhöht den Counter. Im Animations-Callback wird geprüft, ob
	  // der Callback noch zum aktuellen Token gehört. Falls inzwischen
	  // ein neuer Aufruf gestartet wurde, bricht der alte Callback
	  // sofort ab → kein flackerndes Zwischen-Rebuild mehr.
	  // ============================================================
	  var requestId = (jQuerysection.data('m31RequestId') || 0) + 1;
	  jQuerysection.data('m31RequestId', requestId);

	  // 5. Animation & DOM Update
	  // GEÄNDERT: .stop(true, false) statt .stop(true, true).
	  // Damit wird eine evtl. laufende Animation NICHT bis zum Ende
	  // gespult und der Complete-Callback NICHT nochmal ausgeführt.
	  // Genau dieses "JumpToEnd" hat bisher das doppelte Rebuild
	  // (= Flackern) bei schnellem Kategoriewechsel verursacht.
	  jQuerycontent.add(jQuerypromContent).stop(true, false).animate({ opacity: 0 }, 200, function() {
		  // Veralteten Callback verwerfen
		  if (jQuerysection.data('m31RequestId') !== requestId) return;

		  if (hasSliderConfig && jQuerycontent.hasClass('slick-initialized')) {
			  jQuerycontent.slick('unslick');
		  }
		  // Prominente befüllen
		  jQuerypromContent.empty();
		  if (itemsForProminent.length > 0) {
			  itemsForProminent.forEach(function(item) {
				  var $html = item.html.clone(true, true);
				  $html.addClass('m31_referenc_item_prom');
				  jQuerypromContent.append($html);
			  });
			  jQuerypromSection.fadeIn(200);
		  } else {
			  jQuerypromSection.fadeOut(200);
		  }
		  // Normale Liste befüllen (mit Pagination / Kurze Ausgabe)
		  var perPage = parseInt(jQuerysection.attr('data-per-page') || 0, 10);
		  var showFilter = jQuerysection.attr('data-show-filter') == 'true';
		  var finalDisplayList = itemsForList;
		  if (kurzeAusgabe) {
			  finalDisplayList = finalDisplayList.sort(function() { return 0.5 - Math.random(); });
			  if(showFilter || jQuery('body').hasClass('single-objekte') || jQuery('body').hasClass('parent-pageid-691')) {
				  finalDisplayList = finalDisplayList.slice(0, 4)
			  }
		  } else if (perPage > 0) {
			  var totalPages = Math.max(1, Math.ceil(itemsForList.length / perPage));
			  var currentPage = parseInt(jQuerysection.data('currentPage') || 1, 10);
			  if (currentPage > totalPages) currentPage = totalPages;
			  var start = (currentPage - 1) * perPage;
			  finalDisplayList = itemsForList.slice(start, start + perPage);
			  if (window.m31_buildPagination) window.m31_buildPagination(jQuerysection, totalPages);
		  }
		  jQuerycontent.empty();
		  finalDisplayList.forEach(function(item) {
			  jQuerycontent.append(item.html.clone(true, true));
		  });
		  // Counter aktualisieren (Gesamtzahl Treffer)
		  var jQuerycountSpan = jQuerysection.find('.m31_counted_objects');
		  if (jQuerycountSpan.length) jQuerycountSpan.text(filteredTotal.length);
		  if (hasSliderConfig && finalDisplayList.length > 0) {
			  initSliderM31Section(jQuerysection);
			  setSliderOffsetM31(jQuerysection);
		  }
		  jQuerycontent.add(jQuerypromContent).animate({ opacity: 1 }, 200);
		  // "Nichts gefunden" Handling
		  if (filteredTotal.length < 1) {
			  jQuerysection.find('.m31_no_found').fadeIn(400);
		  } else {
			  jQuerysection.find('.m31_no_found').fadeOut(400);
		  }
	  });
  }
  // Globale Pagination-Renderer
  window.m31_buildPagination = function(jQuerysection, totalPages) {
	  var $pagination = jQuerysection.find('.m31_pagination');
	  if (!$pagination.length) return;
	  var perPage = parseInt(jQuerysection.attr('data-per-page') || 0, 10);
	  if (!perPage || totalPages <= 1) {
		  $pagination.hide();
		  return;
	  }
	  $pagination.show();
	  jQuerysection.data('totalPages', totalPages);
	  var currentPage = parseInt(jQuerysection.data('currentPage') || 1, 10);
	  if (currentPage > totalPages) currentPage = totalPages;
	  if (currentPage < 1) currentPage = 1;
	  jQuerysection.data('currentPage', currentPage);
	  var $numbers = $pagination.find('.m31_page_numbers');
	  $numbers.empty();
	  function addBtn(page, label, isActive, isDots) {
		  var $btn = jQuery('<button type="button" class="m31_page_btn mM_button primary"></button>');
		  if (isActive) $btn.addClass('is-active');
		  if (isDots) {
			  $btn.addClass('is-dots').prop('disabled', true).text('…');
		  } else {
			  $btn.text(label || page).data('page', page);
		  }
		  $numbers.append($btn);
	  }
	  // ---------- Mobile vs. Desktop Detection ----------
	  var isMobile = window.matchMedia('(max-width: 767px)').matches;
	  if (isMobile) {
		  // ---- MOBILE: 1 … curr … N (max 4 sichtbare Elemente) ----
		  if (totalPages <= 4) {
			  for (var p = 1; p <= totalPages; p++) {
				  addBtn(p, String(p), p === currentPage, false);
			  }
		  } else if (currentPage === 1) {
			  addBtn(1, '1', true, false);
			  addBtn(2, '2', false, false);
			  addBtn(null, '…', false, true);
			  addBtn(totalPages, String(totalPages), false, false);
		  } else if (currentPage === 2) {
			  addBtn(1, '1', false, false);
			  addBtn(2, '2', true, false);
			  addBtn(null, '…', false, true);
			  addBtn(totalPages, String(totalPages), false, false);
		  } else if (currentPage >= totalPages - 1) {
			  addBtn(1, '1', false, false);
			  addBtn(null, '…', false, true);
			  addBtn(totalPages - 1, String(totalPages - 1), currentPage === totalPages - 1, false);
			  addBtn(totalPages, String(totalPages), currentPage === totalPages, false);
		  } else {
			  addBtn(1, '1', false, false);
			  addBtn(currentPage, String(currentPage), true, false);
			  addBtn(null, '…', false, true);
			  addBtn(totalPages, String(totalPages), false, false);
		  }
	  } else {
		  // ---- DESKTOP ----
		  var windowSize = 3;
		  if (totalPages <= windowSize + 2) {
			  for (var p = 1; p <= totalPages; p++) {
				  addBtn(p, String(p), p === currentPage, false);
			  }
		  } else {
			  if (currentPage === 1 || currentPage === 2) {
				  addBtn(1, '1', currentPage === 1, false);
				  addBtn(2, '2', currentPage === 2, false);
				  addBtn(3, '3', currentPage === 3, false);
				  addBtn(null, '…', false, true);
				  addBtn(totalPages, String(totalPages), currentPage === totalPages, false);
			  } else if (currentPage === 3) {
				  addBtn(1, '1', false, false);
				  addBtn(2, '2', false, false);
				  addBtn(3, '3', true, false);
				  addBtn(4, '4', false, false);
				  addBtn(null, '…', false, true);
				  addBtn(totalPages, String(totalPages), currentPage === totalPages, false);
			  } else if (currentPage >= totalPages - 2) {
				  addBtn(1, '1', currentPage === 1, false);
				  addBtn(null, '…', false, true);
				  var start = Math.max(totalPages - 3, 2);
				  for (var p = start; p <= totalPages; p++) {
					  addBtn(p, String(p), p === currentPage, false);
				  }
			  } else {
				  addBtn(1, '1', false, false);
				  addBtn(currentPage - 1, String(currentPage - 1), false, false);
				  addBtn(currentPage, String(currentPage), true, false);
				  addBtn(currentPage + 1, String(currentPage + 1), false, false);
				  addBtn(null, '…', false, true);
				  addBtn(totalPages, String(totalPages), currentPage === totalPages, false);
			  }
		  }
	  }
	  // Prev / Next Buttons aktiv/deaktiv
	  $pagination.find('.m31_page_prev').prop('disabled', currentPage <= 1);
	  $pagination.find('.m31_page_next').prop('disabled', currentPage >= totalPages);
  };
  /**
   * Initialisierung
   */
  function initM31CategoryFilter() {
	jQuery('section.m31_objects').each(function() {
	  var jQuerysection       = jQuery(this);
	  // ============================================================
	  // Suppress-Flag, um während Reset-Phasen (z.B. Kategorie-
	  // wechsel) ALLE Trigger zu unterdrücken. Dadurch läuft applyFilterM31
	  // nur EINMAL pro Kategoriewechsel und das Flackern verschwindet.
	  // ============================================================
	  var suppressFilterTrigger = false;
	  var kurzeAusgabe = jQuerysection.attr('data-kurze-ausgabe') == 'true';
	  var perPage = parseInt(jQuerysection.attr('data-per-page') || 0, 10);
	  if (perPage > 0 && !jQuerysection.data('currentPage')) {
		jQuerysection.data('currentPage', 1);
	  }
	  var $pagination = jQuerysection.find('.m31_pagination');
	  if ($pagination.length && perPage > 0) {
		// Seitenzahl-Klick
		$pagination.on('click', '.m31_page_btn', function() {
		  var page = jQuery(this).data('page');
		  if (!page) return;
		  jQuerysection.data('currentPage', page);
		  triggerFilter(true, false);
		});
		// Prev
		$pagination.on('click', '.m31_page_prev', function() {
		  var current = parseInt(jQuerysection.data('currentPage') || 1, 10);
		  if (current > 1) {
			jQuerysection.data('currentPage', current - 1);
			triggerFilter(true, false);
		  }
		});
		// Next
		$pagination.on('click', '.m31_page_next', function() {
		  var current = parseInt(jQuerysection.data('currentPage') || 1, 10);
		  var total   = parseInt(jQuerysection.data('totalPages') || 1, 10);
		  if (current < total) {
			jQuerysection.data('currentPage', current + 1);
			triggerFilter(true, false);
		  }
		});
	  }
	  var jQuerycontent       = jQuerysection.find('.m31_main_content');
	  var jQueryfilterButtons = jQuerysection.find('.m31_category_filter .m31_filter_item');
	  var jQuerysortWrapper   = jQuerysection.find('.m31_sort');
	  var jQuerysortSelect    = jQuerysortWrapper.find('select');
	  var jQuerysortItems     = jQuerysortWrapper.find('.mM_select_item');
	  var jQuerypriceMin      = jQuerysection.find('.m31_input_price_min');
	  var jQuerypriceMax      = jQuerysection.find('.m31_input_price_max');
	  var jQueryqmMin         = jQuerysection.find('.m31_input_qm_min');
	  var jQueryqmMax         = jQuerysection.find('.m31_input_qm_max');
	  var jQueryroomsMin      = jQuerysection.find('.m31_input_rooms_min');
	  var jQueryroomsMax      = jQuerysection.find('.m31_input_rooms_max');
	  // Kaufen/Mieten-Wrapper
	  var jQuerybuyRentWrapper = jQuerysection.find('.m31_filter_buy_rent');
	  var jQuerybuyRentSelect  = jQuerybuyRentWrapper.find('select');
	  var jQuerybuyRentItems   = jQuerybuyRentWrapper.find('.mM_select_item');
	  // Immobilienart-Wrapper
	  var jQueryTypeWrapper = jQuerysection.find('.m31_filter_type');
	  var jQueryTypeSelect  = jQueryTypeWrapper.find('select');
	  var jQueryTypeItems   = jQueryTypeWrapper.find('.mM_select_item');
	  // Filter-Reset-Wrapper
	  var jQueryresetWrapper = jQuerysection.find('.m31_reset_filter');
	  var jQueryresetItems   = jQueryresetWrapper.find('.m31_reset');
	  var hasSliderConfig = jQuerysection.attr('data-slider') === 'active_slider';
	  var hasFilterUI     = jQueryfilterButtons.length > 0;
	  var hasSortUI       = jQuerysortSelect.length > 0 || jQuerysortItems.length > 0;
	  var isCustomSelect  = jQuerysortWrapper.hasClass('mM_custom_select');
	  var hasBuyRentUI    = jQuerybuyRentSelect.length > 0 || jQuerybuyRentItems.length > 0;
	  var hasTypeUI    = jQueryTypeSelect.length > 0 || jQueryTypeItems.length > 0;
	  var isBuyRentCustom = jQuerybuyRentWrapper.find('.mM_custom_select').length > 0;
	  var isTypeCustom = jQueryTypeWrapper.find('.mM_custom_select').length > 0;
		function checkIfFiltersActive(jQuerysection) {
			const priceMin  = (jQuerysection.find('.m31_input_price_min').val() || '').toString().trim();
			const priceMax  = (jQuerysection.find('.m31_input_price_max').val() || '').toString().trim();
			const qmMin  = (jQuerysection.find('.m31_input_qm_min').val()  || '').toString().trim();
			const qmMax  = (jQuerysection.find('.m31_input_qm_max').val()  || '').toString().trim();
			const roomsMin = (jQuerysection.find('.m31_input_rooms_min').val() || '').toString().trim();
			const roomsMax = (jQuerysection.find('.m31_input_rooms_max').val() || '').toString().trim();
			const buyRent   = (jQuerysection.find('.m31_filter_buy_rent select').val() || '').toString().trim();
			const immoType  = (jQuerysection.find('.m31_filter_type select').val() || '').toString().trim();
			if (
				priceMin || priceMax ||
				qmMin || qmMax ||
				roomsMin || roomsMax ||
				buyRent || immoType
			) {
				return true;
			}
			return false;
		}
		function updateResetButton(jQuerysection) {
			const resetWrapper = jQuerysection.find('.m31_reset_filter');
			if (checkIfFiltersActive(jQuerysection)) {
				resetWrapper.fadeIn(400);
			} else {
				resetWrapper.fadeOut(400);
			}
		}
	  // Ursprüngliche Items + Metadaten EINMAL einsammeln
	 if (jQuerycontent.length && !jQuerysection.data('m31ItemsData')) {
		 var itemsData = [];
		 var promItemsData = [];
		 // Hilfsfunktion zur Extraktion
		 var extractItem = function($item) {
			 var cats = ($item.attr('data-category') || '').toString().split(' ').filter(Boolean);
			 var isRef = cats.some(c => c.includes('referenzen'));
			 var kaufpreis = toNumber($item.attr('data-price')) || 0;
			 var miete     = toNumber($item.attr('data-miete')) || 0;
			 return {
				 html: $item.clone(true, true).removeClass('m31_initially_hidden'),
				 cats: cats,
				 dateValue: normalizeDate($item.attr('data-date')),
				 priceValue: kaufpreis,
				 mieteValue: miete,
				 qmValue: toNumber($item.attr('data-qm')) || 0,
				 roomsValue: toNumber($item.attr('data-rooms')) || 0,
				 immobilienType: ($item.attr('data-immobilienart') || '').toString().toLowerCase(),
				 buyRent: ($item.attr('data-mietobjekt') || '').toString().toLowerCase(),
				 isReference: isRef
			 };
		 };
		 // 1. Prominente Posts
		 jQuerysection.find('.m31_referenc_item_prom').each(function() {
			 promItemsData.push(extractItem(jQuery(this)));
		 });
		 // 2. Alle anderen
		 jQuerycontent.find('.m31_referenc_item').not('.m31_referenc_item_prom').each(function() {
			 itemsData.push(extractItem(jQuery(this)));
		 });
		 jQuerysection.data('m31ItemsData', itemsData);
		 jQuerysection.data('m31PromItemsData', promItemsData);
	 }
	  // Wenn weder Filter noch Sort existieren → nur Slider (falls aktiv)
	  if (!kurzeAusgabe && !hasFilterUI && !hasSortUI && !hasBuyRentUI && !hasTypeUI) {
		  if (hasSliderConfig) {
			initSliderM31Section(jQuerysection);
			setSliderOffsetM31(jQuerysection);
		  }
		  return;
	  }
	  // Erste aktive Kategorie bestimmen
	  var jQueryactive = jQueryfilterButtons.filter('.is-active').first();
	  if (!jQueryactive.length && jQueryfilterButtons.length) {
		jQueryactive = jQueryfilterButtons.first().addClass('is-active');
	  }
	  // Wenn initial ein Parent aktiv ist, Children direkt öffnen
	  if (jQueryactive.length) {
		  var $activeParent = jQueryactive.closest('.m31_filter_parent');
		  if ($activeParent.length && $activeParent.hasClass('m31_parent_has_children')) {
			  var $children = $activeParent.find('.m31_filter_children').first();
			  $activeParent.addClass('activeParent');
			  $children.stop(true, true).slideDown(0).attr('data-hide', 'shown');
		  }
	  }
	  var initialSlug    = jQueryactive.length ? jQueryactive.data('filter') : null;
	  var initialSortDir = 'desc';
	  if (hasSortUI && jQuerysortSelect.length) {
		var selVal = jQuerysortSelect.val();
		initialSortDir = selVal ? selVal : 'desc';
	  }
	  const immoTypeMap = {
		wohnen: {
		  1: 'Haus',
		  2: 'Wohnung',
		  3: 'Grundstück'
		},
		gewerbe: {
		  1: 'Büro / Praxis',
		  2: 'Laden / Einzelhandel',
		  3: 'Halle / Lager / Produktion',
		  4: 'Grundstück',
		  5: 'Gastgewerbe',
		  6: 'Anlageobjekt'
		}
	  };
	  function getMainTypeGroupFromSlug(slug) {
		if (slug === 'wohnen' || slug === 'wohnen-referenzen') return 'wohnen';
		if (slug === 'gewerbe' || slug === 'gewerbe-referenzen') return 'gewerbe';
		return '';
	  }
	  function rebuildImmoTypeSelect(jQuerysection, slug) {
		var group = getMainTypeGroupFromSlug(slug);
		var $wrapper = jQuerysection.find('.m31_filter_type');
		var $custom = $wrapper.find('.mM_custom_select').first();
		var $select = $custom.find('select.m31_select').first();
		if (!$custom.length || !$select.length) return;
		var currentVal = ($select.val() || '').toString();
		var optionsHtml = '<option value="">Immobilienart</option>';
		if (group && immoTypeMap[group]) {
		  Object.keys(immoTypeMap[group]).forEach(function(key) {
			optionsHtml += '<option value="' + key + '">' + immoTypeMap[group][key] + '</option>';
		  });
		}
		$select.html(optionsHtml);
		// Immer reset auf ersten Eintrag
		$select.val('');
		// Sichtbaren Custom-Teil löschen
		$custom.find('.mM_select_selected, .mM_select_items').remove();
		// Falls keine Kategorie aktiv ist -> gesamten Filter ausblenden
		if (!group) {
		  $wrapper.hide();
		  return;
		} else {
		  $wrapper.show();
		}
		// Custom-Select aus dem aktualisierten <select> neu aufbauen
		buildCustomSelectFromNative($custom, $select);
	  }
	  function buildCustomSelectFromNative($custom, $select) {
		if (!$custom.length || !$select.length) return;
		var selectedText = $select.find('option:selected').text() || 'Immobilienart';
		var $selected = jQuery(
		  '<div class="mM_select_selected" tabindex="0" role="button">' +
			'<span>' + selectedText + '</span>' +
			'<div class="mM_select_arrows"><div class="mM_select_arrow_down"></div></div>' +
		  '</div>'
		);
		var $items = jQuery('<div class="mM_select_items mM_select_hide" tabindex="-1" style="height: 0px;"></div>');
		$select.find('option').each(function(index) {
		  var text = jQuery(this).text();
		  var value = jQuery(this).attr('value') || '';
		  var $item = jQuery('<div class="mM_select_item" tabindex="0"></div>');
		  $item.text(text);
		  $item.attr('data-value', value);
		  $item.on('click', function() {
			$select.val(value).trigger('change');
			$selected.find('span').text(text);
			$items.addClass('mM_select_hide').css('height', '0px');
			$selected.removeClass('mM_select_arrow_active');
		  });
		  $item.on('keydown', function(e) {
			if (e.key === 'Enter' || e.key === 13) {
			  e.preventDefault();
			  $item.trigger('click');
			}
		  });
		  $items.append($item);
		});
		$selected.on('click', function(e) {
		  e.stopPropagation();
		  var isHidden = $items.hasClass('mM_select_hide');
		  jQuery('.mM_select_items').addClass('mM_select_hide').css('height', '0px');
		  jQuery('.mM_select_selected').removeClass('mM_select_arrow_active');
		  if (isHidden) {
			$items.removeClass('mM_select_hide');
			$items.css('height', 'auto');
			var height = $items.outerHeight();
			$items.css('height', '0px').animate({ height: height }, 400);
			$selected.addClass('mM_select_arrow_active');
		  } else {
			$items.addClass('mM_select_hide').animate({ height: 0 }, 400);
			$selected.removeClass('mM_select_arrow_active');
		  }
		});
		$selected.on('keydown', function(e) {
		  if (e.key === 'Enter' || e.key === 13) {
			e.preventDefault();
			$selected.trigger('click');
		  }
		});
		$custom.append($selected).append($items);
	  }
	  function triggerFilter(scroll = false, resetPage = true) {
		  // ============================================================
		  // Während eines Reset-Vorgangs (z.B. Kategoriewechsel)
		  // werden ALLE Trigger ignoriert. Erst am Ende wird einmalig
		  // bewusst getriggert.
		  // ============================================================
		  if (suppressFilterTrigger) return;
		  // Bei Filter-/Sort-/Kategoriewechsel immer auf Seite 1 springen
		  if (resetPage) {
			  jQuerysection.data('currentPage', 1);
		  }
		  var sortDir = 'desc';
		  if (hasSortUI && jQuerysortSelect.length) {
			var currentVal = jQuerysortSelect.val();
			sortDir = currentVal ? currentVal : 'desc';
		  }
		  var jQueryactiveBtn = jQueryfilterButtons.filter('.is-active').first();
		  var slug = jQueryactiveBtn.length ? jQueryactiveBtn.data('filter') : null;
		  const params = new URLSearchParams(window.location.search);
		  params.set('filter', slug);
		  const newUrl = window.location.pathname + '?' + params.toString();
		  window.history.replaceState({}, '', newUrl);
		  applyFilterM31(jQuerysection, slug, sortDir, scroll);
	  }
	  // Initial anwenden
	  rebuildImmoTypeSelect(jQuerysection, initialSlug);
	  if(kurzeAusgabe) {
		  applyFilterM31(jQuerysection, initialSlug, initialSortDir);
	  } else {
		  const urlParams = new URLSearchParams(window.location.search);
		  const hasFilterParam = urlParams.has('filter') && urlParams.get('filter') !== '';
		  let scroll = hasFilterParam;
		  applyFilterM31(jQuerysection, initialSlug, initialSortDir, scroll);
	  }
	  // ============================================================
	  // Klick-Events für Filter-Buttons (Kategoriewechsel)
	  //
	  // Während des kompletten Reset-Vorgangs werden alle
	  // Zwischen-Trigger durch das suppressFilterTrigger-Flag blockiert.
	  // Erst am Ende wird genau einmal triggerFilter() aufgerufen.
	  // Zusätzlich verhindert der Request-Token in applyFilterM31, dass
	  // ein noch laufender Animations-Callback eines vorherigen Aufrufs
	  // ein zwischenzeitliches Rebuild auslöst.
	  // ============================================================
	  jQueryfilterButtons.on('click', function(e) {
		e.preventDefault();
		var jQuerybtn = jQuery(this);
		var jQuerybtnParent = jQuerybtn.parent();
		if (jQuerybtn.hasClass('is-active')) {
		  return;
		}
		// >>> START: Trigger blockieren
		suppressFilterTrigger = true;
		try {
			jQueryfilterButtons.removeClass('is-active');
			jQuerybtn.addClass('is-active');
			// Kaufen/Mieten zurücksetzen
			var $buyRentWrapper = jQuerysection.find('.m31_filter_buy_rent');
			var $buyRentSelect = $buyRentWrapper.find('select');
			$buyRentSelect.val('');
			var defaultText = $buyRentSelect.find('option:first').text() || 'Kaufen / Mieten';
			$buyRentWrapper.find('.mM_select_selected span').text(defaultText);
			// Inputs (Preis/QM/Zimmer) zurücksetzen
			jQuerysection.find('.m31_input_price_min, .m31_input_price_max, .m31_input_qm_min, .m31_input_qm_max, .m31_input_rooms_min, .m31_input_rooms_max').val('');
			// Parent/Children-Logik (rein visuell)
			if(jQuerybtnParent.hasClass('m31_filter_parent')) {
				jQuerysection.find('.activeParent').not(jQuerybtnParent).each(function(){
					jQuery(this)
						.removeClass('activeParent')
						.find('.m31_filter_children')
						.attr('data-hide','hidden')
						.stop().slideUp(400);
				});
				if (jQuerybtnParent.find('.m31_filter_children').attr('data-hide') == "hidden") {
					jQuerybtnParent.find('.m31_filter_children').slideDown(400)
						.attr('data-hide', 'shown');
					jQuerybtnParent.addClass('activeParent');
				}
			} else {
				jQuerybtnParent.find('.m31_filter_children')
					.slideUp(400)
					.attr('data-hide', 'hidden');
			}
			var clickedSlug = jQuerybtn.data('filter') || '';
			rebuildImmoTypeSelect(jQuerysection, clickedSlug);
			updateResetButton(jQuerysection);
		} finally {
			// >>> ENDE: Trigger wieder freigeben
			suppressFilterTrigger = false;
		}
		// Genau EIN finaler Trigger – damit gibt es nur ein einziges
		// fadeOut/rebuild/fadeIn statt mehrerer aufeinanderfolgender.
		triggerFilter();
	  });
	  // Sortierung – normaler Select
	  if (hasSortUI && jQuerysortSelect.length && !isCustomSelect) {
		jQuerysortSelect.on('change', function() {
				triggerFilter();
		});
	  }
	  // Sortierung – Custom Select (.mM_custom_select)
	  if (hasSortUI && isCustomSelect && jQuerysortItems.length) {
		jQuerysortItems.on('click', function() {
		  setTimeout(function() {
				  triggerFilter();
		  }, 0);
		});
		jQuerysortItems.on('keydown', function(e) {
			if(e.key == 13 || e.key == 'Enter') {
				setTimeout(function() {
					  triggerFilter();
				}, 0);
			}
		});
	  }
	  // Kaufen/Mieten – normaler Select
	  if (hasBuyRentUI && jQuerybuyRentSelect.length && !isBuyRentCustom) {
		jQuerybuyRentSelect.on('change', function() {
			updateResetButton(jQuerysection);
				triggerFilter();
		});
	  }
	  // Kaufen/Mieten – Custom Select
	  if (hasBuyRentUI && isBuyRentCustom && jQuerybuyRentItems.length) {
		jQuerybuyRentItems.on('click', function() {
		  setTimeout(function() {
			updateResetButton(jQuerysection);
				  triggerFilter();
		  }, 0);
		});
		jQuerybuyRentItems.on('keydown', function(e) {
		  if(e.key == 13 || e.key == 'Enter') {
			  setTimeout(function() {
					updateResetButton(jQuerysection);
						triggerFilter();
			  }, 0);
		  }
		});
	  }
	  // Immobilienart – immer delegiert binden, weil der Select dynamisch neu aufgebaut wird
	  jQueryTypeWrapper.off('change', 'select.m31_select');
	  jQueryTypeWrapper.on('change', 'select.m31_select', function() {
		  // Preis-Inputs zurücksetzen
		  jQuerysection.find('.m31_input_price_min, .m31_input_price_max').val('');
		  // Preis-Opener-Label zurücksetzen
		  jQuerysection.find('.m31_filter_price .m31_filter_item_opener span').text('Preis');
		  // Preis-Dropdown schließen, falls geöffnet
		  jQuerysection.find('.m31_filter_price .m31_filter_item_content[data-hide="shown"]')
			  .stop().slideUp(400).attr('data-hide', 'hidden');
	  
		  updateResetButton(jQuerysection);
		  triggerFilter();
	  });
	  jQueryTypeWrapper.on('click', '.mM_select_item', function() {
		  setTimeout(function() {
			  // Preis-Inputs zurücksetzen
			  jQuerysection.find('.m31_input_price_min, .m31_input_price_max').val('');
			  // Preis-Opener-Label zurücksetzen
			  jQuerysection.find('.m31_filter_price .m31_filter_item_opener span').text('Preis');
			  // Preis-Dropdown schließen, falls geöffnet
			  jQuerysection.find('.m31_filter_price .m31_filter_item_content[data-hide="shown"]')
				  .stop().slideUp(400).attr('data-hide', 'hidden');
	  
			  updateResetButton(jQuerysection);
			  triggerFilter();
		  }, 0);
	  });
	  jQueryTypeWrapper.on('keydown', '.mM_select_item', function(e) {
		if (e.key === 'Enter' || e.key === 13) {
		  setTimeout(function() {
			updateResetButton(jQuerysection);
				  triggerFilter();
		  }, 0);
		}
	  });
	  // Inputs für Preis / m² / Zimmer
	  var inputEvents = 'input change';
	  jQuerypriceMin.on(inputEvents, function() {
		  updateResetButton(jQuerysection);
				triggerFilter();
	  });
	  jQuerypriceMax.on(inputEvents, function() {
		  updateResetButton(jQuerysection);
				triggerFilter();
	  });
	  jQueryqmMin.on(inputEvents, function() {
		  updateResetButton(jQuerysection);
				triggerFilter();
	  });
	  jQueryqmMax.on(inputEvents, function() {
		  updateResetButton(jQuerysection);
				triggerFilter();
	  });
	  jQueryroomsMin.on(inputEvents, function() {
		  updateResetButton(jQuerysection);
				triggerFilter();
	  });
	  jQueryroomsMax.on(inputEvents, function() {
		  updateResetButton(jQuerysection);
			  triggerFilter();
	  });
	});

	// ============================================================
	// GEÄNDERT: Anchor-Links mit ?filter=... werden EINMALIG global
	// (außerhalb der each-Schleife) gebunden. Vorher wurde dieser
	// Handler einmal pro Section angehängt – bei mehreren Sections
	// auf einer Seite hat ein Klick auf einen solchen Link den
	// Kategorie-Button mehrfach „geklickt", was ebenfalls zum
	// flackernden Mehrfach-Reset führen konnte.
	// ============================================================
	jQuery(document).off('click.m31FilterLink', 'a[href*="?filter"]');
	jQuery(document).on('click.m31FilterLink', 'a[href*="?filter"]', function(e) {
		var href = jQuery(this).attr('href') || '';
		var hashArr = href.split('#');
		var queryPart = hashArr[0].split('?')[1] || '';
		var filter = (queryPart.split('=')[1]) || '';
		jQuery('section.m31_objects').each(function() {
			var $btn = jQuery(this).find('.m31_category_filter .m31_filter_item[data-filter="' + filter + '"]').first();
			if ($btn.length && !$btn.hasClass('is-active')) {
				$btn.trigger('click');
			}
		});
	});
  }
  function handleOpenFilters() {
	const $filterSections = jQuery('section.m31_objects');
	$filterSections.on('click', '.m31_filter_item_opener', function (e) {
	  e.stopPropagation();
	  const $wrapper = jQuery(this).closest('.m31_filter_item_wrapper');
	  const $content = $wrapper.find('.m31_filter_item_content');
	  $filterSections.find('.m31_filter_item_content[data-hide="shown"]').not($content)
		.stop().slideUp(400)
		.attr('data-hide', 'hidden');
	  if ($content.attr('data-hide') === 'hidden') {
		$content.stop().slideDown(400).attr('data-hide', 'shown');
	  } else {
		$content.stop().slideUp(400).attr('data-hide', 'hidden');
	  }
	});
	jQuery(document).on('click', function (e) {
	  const $target = jQuery(e.target);
	  const clickedInsideFilter =
			  $target.closest('.m31_filter_item_wrapper').length > 0
			|| $target.hasClass('m31_filter_item_opener')
			|| $target.closest('.m31_filter_item_opener').length > 0;
	  if (!clickedInsideFilter) {
		$filterSections.find('.m31_filter_item_content[data-hide="shown"]')
		  .stop().slideUp(400)
		  .attr('data-hide', 'hidden');
	  }
	});
  }
  function resetFilter() {
	  const section = jQuery('section.m31_objects');
	  const resetWrapper = section.find('.m31_reset_filter');
	  const resetBtn = section.find('.m31_reset');
	  const filterToReset = section.find('.m31_filter_right');
	  const filterPriceFromTo = section.find('.m31_filter_price');
	  resetBtn.on('click', function() {
		  filterToReset.find('.m31_filter_field input').val('');
		  filterPriceFromTo.find('.m31_filter_item_opener span').text('Preis');
		  const selects = filterToReset.find('.mM_custom_select');
		  selects.each(function() {
			  jQuery(this).find('.mM_select_item').first().trigger('click');
		  });
		  resetWrapper.fadeOut(400);
	  });
  }
  function mobileFilter() {
	  const section = jQuery('section.m31_objects');
	  const opener = section.find('.m31_filter_item_mobile_opener');
	  const itemWithChildren = section.find('.m31_filter_parent>.m31_filter_item');
	  const children = section.find('.m31_filter_parent .m31_filter_children .m31_filter_item');
	  function closeFilter(filter) {
		  filter.removeClass('filterOpened');
		  filter.stop().animate({
			'height': 0
		}, 400);
	  }
	  function openFilter(filter, container, items) {
		filter.addClass('filterOpened');
		filter.css('height', 'auto');
		let filterHeight = filter.outerHeight();
		let isMobile = window.matchMedia('(max-width: 991px)').matches;
		filter.css('height', '');
		filter.stop().animate({
			'height': filterHeight
		}, 400, function() {
			if(isMobile) {
				calculateAndSetItemsHeight(container, items);
			}
		});
	  }
	  opener.off('click.m31MobilFilter');
	  opener.on('click.m31MobilFilter', function() {
		 const parent = jQuery(this).parent();
		 const container = parent.find('.m31_filters_content');
		 const filters = container.find('.m31_filter_parent');
		 if(container.hasClass('filterOpened')) {
			closeFilter(container);
		 } else {
			openFilter(container, container, filters);
		 }
	  });
	  itemWithChildren.off('click.m31MobilFilter');
	  itemWithChildren.on('click.m31MobilFilter', function(e) {
		const parent = jQuery(this).parent();
		const container = jQuery(this).closest('.m31_filters_content');
		const filters = container.find('.m31_filter_parent');
		const children = parent.find('.m31_filter_children');
		let isMobile = window.matchMedia('(max-width: 991px)').matches;
		if (!children.length) return;
		container.find('.m31_filter_children.filterOpened').not(children).each(function() {
		  closeFilter(jQuery(this));
		});
		if (!children.hasClass('filterOpened')) {
		  openFilter(children, container, filters);
		} else {
			if(isMobile) {
				setTimeout(calculateAndSetItemsHeight(container, filters), 400);
			}
		}
	  });
	  children.on('click', function() {
		  // (no-op)
	  })
	  function calculateAndSetItemsHeight(container, items) {
		  let totalHeight = 0;
		  items.each(function(){
			  totalHeight += jQuery(this).outerHeight(true);
		  });
		  container.animate({
			  'height': totalHeight
		  }, 400);
	  }
	  if(!window.matchMedia('(max-width: 991px)').matches) {
		opener.parent().find('.m31_filters_content').removeClass('filterOpened').css('height', '');
	  }
  }
  jQuery(document).ready(function() {
	if (jQuery('section.m31_objects').length) {
	  initM31CategoryFilter();
	  handleOpenFilters();
	  resetFilter();
	  if(window.matchMedia('(max-width: 991px)').matches) {
		  mobileFilter();
	  }
	}
  });
  jQuery(window).resize(function() {
	if (jQuery('section.m31_objects[data-slider="active_slider"]').length) {
		jQuery('section.m31_objects[data-slider="active_slider"]').each(function() {
			setSliderOffsetM31(jQuery(this));
		});
	}
	mobileFilter();
  });
})();
// source --> https://www.emslander-co.de/wp-content/themes/mediaMEANS/templates/modules/m26_flexible_content/m26_flexible_content.js 

const m26_function = {
	moduleName : 'm26_flexible_content',
	
	handle_click(element) {
		curEl = element;
		curEl.next().stop().slideToggle( '1000', function(){} );
		
		if(jQuery(curEl).parent().hasClass('active')) {
			jQuery(curEl).parent().removeClass('active');
		} else {
			jQuery(curEl).parent().addClass('active');
		}
	},
	
	init() {
		$this = this;
		jQuery(`section.${this.moduleName} .m26_akkordeon_item_head`).click(function(){
			$this.handle_click(jQuery(this));
		});
		
		jQuery(`section.${this.moduleName} .m26_akkordeon_item_head`).keydown(function(key){
			if(key.key == 13 || key.key == 'Enter') {
				$this.handle_click(jQuery(this));
			}
		});
	}
}

jQuery(document).ready(function(){
	if( jQuery(`section.${m26_function.moduleName}` ).length ) {
		m26_function.init();
	}
});
// source --> https://www.emslander-co.de/wp-content/themes/mediaMEANS/templates/modules/m13_contact_person/m13_contact_person.js 
const m13_function = {
	sectionName: 'm13_contact_person',

	init() {
		this.showM13();
	},
	
	showM13() {
		document.querySelectorAll(`section.${this.sectionName}`).forEach((m13) => {
			jQuery(m13).animate({
				'opacity': 1
			}, 400);
		});
	}
};

jQuery(document).ready(function(){
	m13_function.init();
});