Ihr Makler vor Ort
Immobilienmakler in Halle, Leipzig und der Region
Als geprüfter Immobilienfachwirt und Sachverständiger betreue ich Eigentümer in über 70 Städten und Ortsteilen zwischen Halle und Leipzig — persönlich, vertraulich und ohne Druck.
Einzugsgebiet
Unsere Regionen
Direktkontakt
Ihr Ort nicht dabei? Ich bin trotzdem für Sie da.
Ich betreue Eigentümer in der gesamten Region zwischen Halle und Leipzig — auch wenn Ihr Ort nicht gelistet ist. Sprechen Sie mich einfach an.
Immobilienmakler in Weißenfels
Weißenfels an der Saale — Schuhstadt, Schloss Neu-Augustusburg. Größte Stadt im Burgenlandkreis.
Lage-Profil
Über diesen Ort
Wichtige Adressen
Behörden & Ämter vor Ort
Häufige Fragen
Das sollten Sie wissen
Ihr Termin ist nur zwei Klicks entfernt
Buchen Sie Ihre kostenlose Erstberatung direkt online — oder rufen Sie mich an.
Büro Bahnhofstraße 35A, Kabelsketal
Weitere Orte
Nachbarschaft & verwandte Standorte
// GLOBAL STATE
let pageData = {};
let ortesData = {};
let behoerdenData = {};
let preismatrixData = {};
let makroData = {};
// GET URL PARAMETER
function getUrlParam(name) {
const params = new URLSearchParams(window.location.search);
return params.get(name);
}
// FORMAT PRICE
function formatPrice(val) {
return val.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ".");
}
// LOAD ALL DATA
async function loadAllData() {
const [ortes, behoerden, preismatrix, makro] = await Promise.allSettled([
fetch('/data/orte.json').then(r => r.ok ? r.json() : Promise.reject('orte ' + r.status)),
fetch('/data/behoerden.json').then(r => r.ok ? r.json() : Promise.reject('behoerden ' + r.status)),
fetch('/data/preismatrix.json').then(r => r.ok ? r.json() : Promise.reject('preismatrix ' + r.status)),
fetch('/data/makro.json').then(r => r.ok ? r.json() : Promise.reject('makro ' + r.status))
]);
if (ortes.status === 'fulfilled') ortesData = ortes.value;
else console.error('Fehler orte.json:', ortes.reason);
if (behoerden.status === 'fulfilled') behoerdenData = behoerden.value;
else console.error('Fehler behoerden.json:', behoerden.reason);
if (preismatrix.status === 'fulfilled') preismatrixData = preismatrix.value;
else console.error('Fehler preismatrix.json:', preismatrix.reason);
if (makro.status === 'fulfilled') makroData = makro.value;
else console.error('Fehler makro.json:', makro.reason);
}
// RENDER PAGE
function renderPage(slug) {
if (!ortesData[slug]) {
showError();
return;
}
pageData = ortesData[slug];
const region = pageData.region_slug || 'halle-saale';
const behoerdenKey = regionMapping[slug] || regionMapping[region] || 'halle';
// SEO
updateSEO(slug);
// BREADCRUMB
renderBreadcrumb();
// HERO
document.getElementById('page-h1').textContent = pageData.h1;
document.getElementById('page-desc').textContent = pageData.desc;
renderStats();
// PROFIL
renderProfil();
// MARKT
renderMarket();
// BEHÖRDEN
renderAuthorities(behoerdenKey);
// FAQ
renderFAQ();
// NEARBY
renderNearby();
// KARTE
renderMap();
// SHOW CONTENT
document.getElementById('page-content').style.display = '';
document.getElementById('error-container').style.display = 'none';
}
function updateSEO(slug) {
const baseUrl = '/orte/';
const title = `${pageData.h1} | Wohntraum Immobilien`;
const desc = (pageData.desc || '').substring(0, 160);
const lat = pageData.map_center ? pageData.map_center.split(',')[0] : '51.4414';
const lng = pageData.map_center ? pageData.map_center.split(',')[1] : '12.0458';
document.getElementById('page-title').textContent = title;
document.getElementById('page-description').setAttribute('content', desc);
document.getElementById('canonical-link').setAttribute('href', baseUrl + slug);
document.getElementById('og-title').setAttribute('content', title);
document.getElementById('og-description').setAttribute('content', desc);
document.getElementById('og-url').setAttribute('content', baseUrl + slug);
document.getElementById('geo-region').setAttribute('content', 'DE-ST');
document.getElementById('geo-placename').setAttribute('content', pageData.stadt || 'Halle');
document.getElementById('geo-position').setAttribute('content', `${lat};${lng}`);
document.getElementById('icbm').setAttribute('content', `${lat}, ${lng}`);
// UPDATE SCHEMA AGENT
const schemaAgent = JSON.parse(document.getElementById('schema-agent').textContent);
schemaAgent.areaServed = [{'@type': 'City', 'name': pageData.stadt || pageData.name}];
document.getElementById('schema-agent').textContent = JSON.stringify(schemaAgent);
}
function renderBreadcrumb() {
const bc = document.getElementById('breadcrumb');
bc.innerHTML = `
Start
→
Region
Blog
→
${pageData.stadt || pageData.region_slug}
→
${pageData.name}
`;
}
function renderStats() {
const profil = pageData.profil || {};
const statsHtml = `
${profil.einwohner || '–'} Einwohner
${profil.plz || '–'} PLZ
${profil.typ || '–'} Typ
`;
document.getElementById('page-stats').innerHTML = statsHtml;
}
function renderProfil() {
const profil = pageData.profil || {};
const highlights = pageData.highlights || {};
const highlightsList = Object.keys(highlights).map(h => `${h} `).join('');
const makroText = makroData[pageData.region_slug] || makroData[pageData.slug] || profil.makro || '';
const html = `
${profil.mikro || profil.makro || ''}
${highlightsList ? `${highlightsList}
` : ''}
${makroText}
`;
document.getElementById('profil-content').innerHTML = html;
}
function renderMarket() {
const priceKey = pageData.slug;
const price = preismatrixData[priceKey] || preismatrixData['default'] || 1450;
const marketText = pageData.markt || '';
document.getElementById('market-price').textContent = formatPrice(price);
document.getElementById('market-text').innerHTML = `${marketText}
`;
}
function renderAuthorities(behoerdenKey) {
const beh = behoerdenData[behoerdenKey];
if (!beh) {
document.getElementById('authorities-content').innerHTML = 'Behördendaten nicht verfügbar.
';
return;
}
let html = '';
['grundbuchamt', 'nachlassgericht', 'bauamt', 'rathaus'].forEach(key => {
const item = beh[key];
if (!item) return;
html += `
${item.name}
${item.str}
${item.plz}
${item.web ? `
` : ''}
`;
});
document.getElementById('authorities-content').innerHTML = html || 'Keine Einträge.
';
}
function renderFAQ() {
const faqs = pageData.faqs || {};
const entries = Object.entries(faqs).filter(([k, v]) => v && v.trim() !== '');
if (entries.length === 0) {
document.getElementById('faq-content').innerHTML = 'Keine FAQs verfügbar.
';
return;
}
// Pair entries positionally: index 0=Q, 1=A, 2=Q, 3=A ...
let html = '';
for (let i = 0; i < entries.length - 1; i += 2) {
const q = entries[i][1];
const a = entries[i + 1][1];
if (q && a) {
html += `
`;
}
}
if (html) {
document.getElementById('faq-content').innerHTML = html;
setupFAQAccordion();
updateFAQSchema();
}
}
function renderNearby() {
const nearby = pageData.nearby || {};
const nearbyKeys = Object.keys(nearby).filter(k => !k.includes(']'));
if (nearbyKeys.length === 0) {
document.getElementById('nearby-section').style.display = 'none';
return;
}
let html = '';
nearbyKeys.forEach(slug => {
const nearbyOrt = ortesData[slug];
if (nearbyOrt) {
const price = preismatrixData[slug] || preismatrixData['default'] || 1450;
html += `
${nearbyOrt.name}
${formatPrice(price)}€/m²
Mehr erfahren →
`;
}
});
if (html) {
document.getElementById('nearby-content').innerHTML = html;
document.getElementById('nearby-section').style.display = '';
}
}
function setupFAQAccordion() {
document.querySelectorAll('.wfq-q').forEach(q => {
q.addEventListener('click', function() {
const parent = this.parentElement;
document.querySelectorAll('.wfq').forEach(f => {
if (f !== parent) f.classList.remove('open');
});
parent.classList.toggle('open');
});
});
}
function updateFAQSchema() {
const faqItems = [];
document.querySelectorAll('.wfq').forEach(faq => {
const q = faq.querySelector('.wfq-q').textContent;
const a = faq.querySelector('.wfq-a').textContent;
faqItems.push({
'@type': 'Question',
'name': q,
'acceptedAnswer': {
'@type': 'Answer',
'text': a
}
});
});
const schemaFAQ = JSON.parse(document.getElementById('schema-faq').textContent);
schemaFAQ.mainEntity = faqItems;
document.getElementById('schema-faq').textContent = JSON.stringify(schemaFAQ);
}
function renderMap() {
const mapSection = document.getElementById('map-section');
const mapCenter = pageData.map_center;
if (!mapCenter) { mapSection.style.display = 'none'; return; }
const [lat, lng] = mapCenter.split(',').map(Number);
if (isNaN(lat) || isNaN(lng)) { mapSection.style.display = 'none'; return; }
mapSection.style.display = '';
// Wohntraum Büro Kabelsketal
const bueroLat = 51.4414, bueroLng = 12.0458;
const map = L.map('wmap', {
center: [lat, lng],
zoom: 14,
scrollWheelZoom: false,
zoomControl: true
});
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
attribution: '© OpenStreetMap ',
maxZoom: 18
}).addTo(map);
// Standort-Marker (Teal)
const tealIcon = L.divIcon({
className: '',
html: '
',
iconSize: [22, 22],
iconAnchor: [11, 11]
});
L.marker([lat, lng], {icon: tealIcon})
.addTo(map)
.bindPopup('' + (pageData.name || 'Standort') + ' ' + (pageData.stadt || ''));
// Einzugsgebiet (sanfter Teal-Kreis)
L.circle([lat, lng], {
radius: 1500,
color: '#0d9488',
fillColor: '#0d9488',
fillOpacity: 0.08,
weight: 1.5,
opacity: 0.3
}).addTo(map);
// Büro-Marker (Amber)
const bueroIcon = L.divIcon({
className: '',
html: '
',
iconSize: [18, 18],
iconAnchor: [9, 9]
});
L.marker([bueroLat, bueroLng], {icon: bueroIcon})
.addTo(map)
.bindPopup('Wohntraum Immobilien Bahnhofstraße 35A 06184 KabelsketalTermin buchen → ');
// Fit bounds wenn Büro weit weg
const dist = Math.sqrt(Math.pow(lat - bueroLat, 2) + Math.pow(lng - bueroLng, 2));
if (dist > 0.02) {
map.fitBounds([[lat, lng], [bueroLat, bueroLng]], { padding: [50, 50], maxZoom: 13 });
}
// Fix für Leaflet-Rendering in hidden containers
setTimeout(() => { map.invalidateSize(); }, 200);
}
// HAUPTSTANDORTE für die Übersichtsseite
const mainLocations = [
{ slug: 'halle', name: 'Halle (Saale)', desc: 'Kreisfreie Großstadt · 240.000 Einwohner · Universitätsstadt' },
{ slug: 'leipzig', name: 'Leipzig', desc: 'Kreisfreie Großstadt · 620.000 Einwohner · Wirtschaftszentrum' },
{ slug: 'merseburg', name: 'Merseburg', desc: 'Saalekreis · Domstadt · historische Altstadt' },
{ slug: 'kabelsketal', name: 'Kabelsketal', desc: 'Saalekreis · Bürostandort Wohntraum Immobilien' },
{ slug: 'landsberg', name: 'Landsberg', desc: 'Saalekreis · Wachstumsgemeinde bei Halle' },
{ slug: 'schkopau', name: 'Schkopau', desc: 'Saalekreis · Chemieindustrie · günstige Lagen' },
];
// REGIONEN MAPPING für die Gruppen
const regionGroups = [
{ label: 'Halle (Saale) & Stadtteile', prefix: 'halle' },
{ label: 'Leipzig & Stadtteile', prefix: 'leipzig' },
{ label: 'Saalekreis', keys: ['kabelsketal','landsberg','merseburg','leuna','salzatal','petersberg','teutschenthal','schkopau','braunsbedra','muecheln','querfurt','wettin-lobejun','bad-lauchstaedt','bad-duerrenberg','luetzen','saalekreis'] },
{ label: 'Burgenlandkreis', keys: ['naumburg','weissenfels','zeitz','hohenmolsen','teuchern','burgenlandkreis'] },
{ label: 'Landkreis Leipzig', keys: ['borna','grimma','wurzen','markkleeberg','markranstaedt','zwenkau','grosspoessel','brandis','naunhof','colditz','geithain','frohburg','kohren-sahlis','landkreis-leipzig'] },
{ label: 'Nordsachsen', keys: ['torgau','eilenburg','delitzsch','schkeuditz','bad-dueben','nordsachsen'] },
{ label: 'Anhalt-Bitterfeld & Dessau', keys: ['bitterfeld-wolfen','köthen','dessau-rosslau','zerbst','anhalt-bitterfeld'] },
];
function showOverview() {
document.getElementById('region-overview').style.display = '';
document.getElementById('page-content').style.display = 'none';
document.getElementById('error-container').style.display = 'none';
if (!ortesData || Object.keys(ortesData).length === 0) return;
// ÜBERSICHTSKARTE
const mainSlugs = new Set(['halle','leipzig','merseburg','kabelsketal','landsberg','schkopau','borna','torgau','naumburg','weissenfels','bitterfeld-wolfen']);
const mapEl = document.getElementById('overview-map');
if (mapEl && typeof L !== 'undefined') {
const ovMap = L.map('overview-map', {
center: [51.48, 11.98],
zoom: 9,
scrollWheelZoom: false,
zoomControl: true,
attributionControl: false
});
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
maxZoom: 18
}).addTo(ovMap);
Object.entries(ortesData).forEach(([slug, data]) => {
if (!data.map_center) return;
const parts = data.map_center.split(',').map(Number);
if (parts.length !== 2 || isNaN(parts[0])) return;
const [lat, lng] = parts;
const isMain = mainSlugs.has(slug);
const color = isMain ? '#0d9488' : '#0f1724';
const size = isMain ? 14 : 9;
const border = isMain ? '#22b8a6' : 'rgba(34,184,166,.4)';
const icon = L.divIcon({
className: '',
html: `
`,
iconSize: [size, size],
iconAnchor: [size/2, size/2]
});
L.marker([lat, lng], {icon})
.addTo(ovMap)
.bindPopup(`${data.name || slug} `);
});
setTimeout(() => ovMap.invalidateSize(), 150);
}
// Hauptstandorte
const mainGrid = document.getElementById('overview-main-grid');
mainGrid.innerHTML = mainLocations
.filter(loc => ortesData[loc.slug])
.map(loc => `
${loc.name}
${loc.desc}
Mehr erfahren →
`).join('');
// Alle Orte nach Region gruppiert
const allGroupsEl = document.getElementById('overview-all-groups');
let html = '';
regionGroups.forEach(group => {
let entries = [];
if (group.prefix) {
entries = Object.entries(ortesData)
.filter(([slug]) => slug === group.prefix || slug.startsWith(group.prefix + '-'))
.sort((a, b) => a[1].name.localeCompare(b[1].name, 'de'));
} else if (group.keys) {
entries = group.keys
.filter(slug => ortesData[slug])
.map(slug => [slug, ortesData[slug]]);
}
if (entries.length === 0) return;
html += ``;
});
allGroupsEl.innerHTML = html;
}
function showError() {
const errorContainer = document.getElementById('error-container');
errorContainer.innerHTML = `
Ort nicht gefunden
Die angeforderte Seite existiert leider nicht. Bitte überprüfen Sie die URL oder wählen Sie einen anderen Ort.
Zurück zu den Regionen →
`;
errorContainer.style.display = '';
document.getElementById('page-content').style.display = 'none';
}
// INIT
document.addEventListener('DOMContentLoaded', async function() {
await loadAllData();
const ort = window.ORT_SLUG || getUrlParam('ort');
if (ort) {
renderPage(ort);
} else {
showOverview();
}
// MOBILE MENU
document.getElementById('wmo').addEventListener('click', function() {
document.getElementById('wmm').classList.add('open');
});
document.getElementById('wmx').addEventListener('click', function() {
document.getElementById('wmm').classList.remove('open');
});
document.querySelectorAll('.wmob a').forEach(function(a) {
a.addEventListener('click', function() {
document.getElementById('wmm').classList.remove('open');
});
});
// WHATSAPP DROPDOWN
const wwaBtn = document.getElementById('wwa-btn');
const wwaDd = document.getElementById('wwa-dd');
if (wwaBtn && wwaDd) {
wwaBtn.addEventListener('click', function(e) {
e.stopPropagation();
wwaDd.classList.toggle('open');
});
document.addEventListener('click', function() {
wwaDd.classList.remove('open');
});
wwaDd.addEventListener('click', function(e) {
e.stopPropagation();
});
}
});