{"id":211,"date":"2026-06-03T11:32:08","date_gmt":"2026-06-03T11:32:08","guid":{"rendered":"https:\/\/mandmdeweloper.pl\/?page_id=211"},"modified":"2026-08-06T15:51:52","modified_gmt":"2026-08-06T15:51:52","slug":"ceny-mieszkan","status":"publish","type":"page","link":"https:\/\/mandmdeweloper.pl\/index.php\/ceny-mieszkan\/","title":{"rendered":"Ceny mieszka\u0144"},"content":{"rendered":"\n<meta charset=\"UTF-8\">\n<title>Mieszkania<\/title>\n\n<style>\nbody{\n  font-family:Arial;\n  background:#f5f7fa;\n  margin:20px;\n}\n\n.controls{\n  display:flex;\n  gap:10px;\n  flex-wrap:wrap;\n  margin-bottom:10px;\n}\n\n.controls input,.controls select{\n  padding:6px 10px;\n  border:1px solid #ddd;\n  border-radius:8px;\n}\n\n.stats{\n  font-size:13px;\n  margin-bottom:10px;\n  color:#444;\n}\n\n.table-wrap{\n  overflow-x:auto;\n  border-radius:12px;\n  box-shadow:0 8px 24px rgba(0,0,0,0.06);\n  position:relative;\n}\n\ntable{\n  width:100%;\n  border-collapse:collapse;\n  background:#fff;\n}\n\nth,td{\n  padding:12px;\n  text-align:center;\n  border-bottom:1px solid #eee;\n}\n\nth{background:#fafafa;cursor:pointer;}\n\n\/* \u274c usuni\u0119ty hover ca\u0142ego wiersza *\/\n\n\/* \ud83d\udd25 tylko aktywny wiersz (tooltip active) *\/\ntr.active-row{\n  background:#eef6ff;\n}\n\ntbody tr{\n  position:relative;\n}\n\n.status{\n  padding:4px 8px;\n  border-radius:20px;\n  font-size:12px;\n  font-weight:600;\n}\n\n.available{background:#e8f5e9;color:#2e7d32;}\n.sold{background:#fdecea;color:#c62828;}\n.reserved{background:#e3f2fd;color:#1565c0;}\n\n.cheapest{\n  outline:2px solid #ffb300;\n  background:#fff8e1 !important;\n}\n\n\/* ================= TOOLTIP ================= *\/\n\n.plan{\n  position:relative;\n}\n\n.plan-link{\n  color:#0073aa;\n  font-weight:600;\n  text-decoration:none;\n}\n\n\/* \ud83d\udd25 tooltip PO LEWEJ STRONIE TABELI *\/\n.tooltip{\n  display:none;\n  position:absolute;\n\n  top:0;\n  right:100%; \/* \ud83d\udc48 LEWA STRONA *\/\n\n  margin-right:250px;\n\n  background:#fff;\n  padding:8px;\n  border-radius:10px;\n  box-shadow:0 12px 30px rgba(0,0,0,0.25);\n  z-index:9999;\n\n  width:auto;\n  max-width:320px;\n}\n\n\/* pokaz tylko aktywny tooltip *\/\ntr.active-row .tooltip{\n  display:block;\n}\n\n.tooltip img{\n  display:block;\n  width:auto;\n  max-width:320px;\n  max-height:220px;\n  border-radius:8px;\n}\n@media (max-width: 768px){\n\n  body{\n    margin:0;\n    padding:10px;\n  }\n\n  \/* \ud83d\udd25 KLUCZ: przesuni\u0119cie ca\u0142ej tabeli w prawo *\/\n  .table-wrap{\n    margin-left:12x;   \/* \ud83d\udc48 TO JEST TWOJE DOMY\u015aLNE PRZESUNI\u0118CIE *\/\n    margin-right:0;\n  }\n\n  \/* opcjonalnie lekkie \u201eair spacing\u201d *\/\n  table{\n    width:100%;\n  }\n\n  html, body{\n    overflow-x:hidden;\n  }\n}\n<\/style>\n\n\n\n\n<div class=\"controls\">\n<input id=\"search\" placeholder=\"Szukaj...\" oninput=\"filterTable()\">\n\n<select id=\"floor\" onchange=\"filterTable()\">\n<option value=\"\">Wszystkie pi\u0119tra<\/option>\n<option>Parter<\/option>\n<option>Pi\u0119tro I<\/option>\n<\/select>\n\n<label>\n<input type=\"checkbox\" id=\"onlyAvailable\" onchange=\"filterTable()\">\nTylko dost\u0119pne\n<\/label>\n<\/div>\n\n<div class=\"stats\" id=\"stats\"><\/div>\n\n<div class=\"table-wrap\">\n<table>\n<thead>\n<tr>\n<th onclick=\"sortTable(0)\">Budynek<\/th>\n<th onclick=\"sortTable(1)\">Pi\u0119tro<\/th>\n<th onclick=\"sortTable(2)\">Nr<\/th>\n<th onclick=\"sortTable(3)\">m\u00b2<\/th>\n<th onclick=\"sortTable(4)\">Liczba pom.<\/th>\n<th onclick=\"sortTable(5)\">Cena<\/th>\n<th onclick=\"sortTable(6)\">z\u0142\/m\u00b2<\/th>\n<th>Status<\/th>\n<th>Rzut<\/th>\n<th>Historia zmian<\/th>\n<\/tr>\n<\/thead>\n\n<tbody id=\"tableBody\"><\/tbody>\n<\/table>\n<\/div>\n\n<script>\nconst XML_URL = \"\/wp-dane\/CenyMieszkan.xml\";\n\nasync function loadXML(){\n  const res = await fetch(XML_URL);\n  const text = await res.text();\n  const xml = new DOMParser().parseFromString(text, \"text\/xml\");\n\n  const lokale = xml.querySelectorAll(\"Lokal\");\n  const tbody = document.getElementById(\"tableBody\");\n  tbody.innerHTML = \"\";\n\n  lokale.forEach(l => {\n\n    let budynek = l.querySelector(\"NumerBudynku\")?.textContent;\n    let nr = l.querySelector(\"NumerLokalu\")?.textContent;\n    let pietro = l.querySelector(\"Pietro\")?.textContent;\n    let metraz = l.querySelector(\"PowierzchniaUzytkowa\")?.textContent;\n    let pokoje = l.querySelector(\"LiczbaPokoi\")?.textContent;\n let pokojeAdjusted =  Number(pokoje);\n\n    if(nr.includes(\"A\")) pokojeAdjusted += 1;\n    if(nr.includes(\"B\")) pokojeAdjusted += 2;\n\n    let statusRaw = (l.querySelector(\"Status\")?.textContent || \"\").toLowerCase();\n    let cena = l.querySelector(\"CenaCalkowita\")?.textContent;\n\n    let pietroTxt = pietro == 0 ? \"Parter\" : \"Pi\u0119tro I\";\nlet historia = l.querySelector(\"Historia_zmian\")?.textContent;\n\n    let status=\"available\", statusTxt=\"Dost\u0119pne\";\n    if(statusRaw.includes(\"zarezerw\")){status=\"reserved\";statusTxt=\"Rezerwacja\";}\n    if(statusRaw.includes(\"sprzed\")){status=\"sold\";statusTxt=\"Sprzedane\";}\n\n    let row = `\n      <tr data-status=\"${status}\">\n        <td>${budynek}<\/td>\n        <td>${pietroTxt}<\/td>\n        <td>${nr}<\/td>\n        <td>${metraz}<\/td>\n        <td>${pokojeAdjusted}<\/td>\n        <td class=\"price\" data-price=\"${cena}\">${cena}<\/td>\n        <td class=\"ppm\"><\/td>\n        <td><span class=\"status ${status}\">${statusTxt}<\/span><\/td>\n        <td class=\"plan\"><\/td>\n        <td class=\"plan\">${historia}<\/td>\n      <\/tr>\n    `;\n\n    tbody.innerHTML += row;\n  });\n\n  calc();\n  generatePlans();\n  filterTable();\n}\n\nfunction calc(){\n  document.querySelectorAll(\"tbody tr\").forEach(r=>{\n    let price=+r.querySelector(\".price\").dataset.price;\n    let area=parseFloat(r.cells[3].innerText);\n    let ppm=Math.round(price\/area);\n    r.querySelector(\".ppm\").innerText=ppm;\n    r.querySelector(\".ppm\").dataset.ppm=ppm;\n  });\n}\n\nfunction generatePlans(){\n  document.querySelectorAll(\"tbody tr\").forEach(r=>{\n    let nr = r.cells[2].innerText.trim();\n\n    let pdf = `\/wp-content\/uploads\/rzuty\/${nr}.pdf`;\n    let img = `\/wp-content\/uploads\/rzuty\/miniaturki\/${nr}.PNG`;\n\n    r.querySelector(\".plan\").innerHTML = `\n      <a href=\"${pdf}\" target=\"_blank\" class=\"plan-link\">PDF<\/a>\n\n      <span class=\"tooltip\">\n        <a href=\"${pdf}\" target=\"_blank\">\n          <img decoding=\"async\" src=\"${img}\"\n            onerror=\"this.src='https:\/\/via.placeholder.com\/300x200?text=Brak+rzutu'\">\n        <\/a>\n      <\/span>\n    `;\n  });\n}\n\/* ================= ACTIVE TOOLTIP CONTROL ================= *\/\n\nfunction setActiveRow(row){\n  document.querySelectorAll(\"tr.active-row\").forEach(r=>{\n    r.classList.remove(\"active-row\");\n  });\n  if(row) row.classList.add(\"active-row\");\n}\n\n\/* hover na wierszach *\/\ndocument.addEventListener(\"mouseover\", function(e){\n  let row = e.target.closest(\"tbody tr\");\n  if(row){\n    setActiveRow(row);\n  }\n});\n\n\/* ================= TABLE LOGIC ================= *\/\n\nfunction getVal(c){\n  if(c.classList.contains(\"price\")) return +c.dataset.price;\n  if(c.classList.contains(\"ppm\")) return +c.dataset.ppm;\n  let v=parseFloat(c.innerText);\n  return isNaN(v)?c.innerText:v;\n}\n\nlet sortState={col:null,dir:\"asc\"};\n\nfunction sortTable(n){\n  let rows=[...document.querySelectorAll(\"tbody tr\")];\n  let asc=sortState.col===n?sortState.dir!==\"asc\":true;\n  sortState={col:n,dir:asc?\"asc\":\"desc\"};\n\n  rows.sort((a,b)=>{\n    let x=getVal(a.cells[n]);\n    let y=getVal(b.cells[n]);\n    return typeof x===\"number\"?(asc?x-y:y-x):(asc?x.localeCompare(y):y.localeCompare(x));\n  });\n\n  rows.forEach(r=>r.parentNode.appendChild(r));\n}\n\nfunction filterTable(){\n  let s=document.getElementById(\"search\").value.toLowerCase();\n  let f=document.getElementById(\"floor\").value;\n  let only=document.getElementById(\"onlyAvailable\").checked;\n\n  document.querySelectorAll(\"tbody tr\").forEach(r=>{\n    let ok1=r.innerText.toLowerCase().includes(s);\n    let ok2=!f || r.cells[1].innerText===f;\n    let ok3=!only || r.dataset.status===\"available\";\n    r.style.display=(ok1&&ok2&&ok3)?\"\":\"none\";\n  });\n\n  updateStats();\n  highlight();\n}\n\nfunction updateStats(){\n  let all=[...document.querySelectorAll(\"tbody tr\")];\n  let vis=all.filter(r=>r.style.display!==\"none\");\n  let av=vis.filter(r=>r.dataset.status===\"available\").length;\n  document.getElementById(\"stats\").innerText=\n    `Widoczne: ${vis.length} | Dost\u0119pne: ${av}`;\n}\n\nfunction highlight(){\n  document.querySelectorAll(\".cheapest\").forEach(x=>x.classList.remove(\"cheapest\"));\n\n  let rows=[...document.querySelectorAll(\"tbody tr\")].filter(r=>r.style.display!==\"none\");\n\n  let best=null,min=Infinity;\n\n  rows.forEach(r=>{\n    let p=+r.querySelector(\".price\").dataset.price;\n    let a=+r.cells[3].innerText;\n    let ppm=p\/a;\n    if(ppm<min){min=ppm;best=r;}\n  });\n\n  if(best) best.classList.add(\"cheapest\");\n}\n\ndocument.addEventListener(\"DOMContentLoaded\",loadXML);\n<\/script>\n","protected":false},"excerpt":{"rendered":"<p>Mieszkania Wszystkie pi\u0119traParterPi\u0119tro I Tylko dost\u0119pne Budynek Pi\u0119tro Nr m\u00b2 Liczba pom. Cena z\u0142\/m\u00b2 Status Rzut Historia zmian<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-211","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/mandmdeweloper.pl\/index.php\/wp-json\/wp\/v2\/pages\/211","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mandmdeweloper.pl\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/mandmdeweloper.pl\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/mandmdeweloper.pl\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mandmdeweloper.pl\/index.php\/wp-json\/wp\/v2\/comments?post=211"}],"version-history":[{"count":7,"href":"https:\/\/mandmdeweloper.pl\/index.php\/wp-json\/wp\/v2\/pages\/211\/revisions"}],"predecessor-version":[{"id":229,"href":"https:\/\/mandmdeweloper.pl\/index.php\/wp-json\/wp\/v2\/pages\/211\/revisions\/229"}],"wp:attachment":[{"href":"https:\/\/mandmdeweloper.pl\/index.php\/wp-json\/wp\/v2\/media?parent=211"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}