/* Tudors / Ticimax: boş liste menü bağlantısını gizleme pilotu.
Tema CSS alanına değil, tüm sayfalarda çalışan özel JavaScript alanına ekleyin.
targets listesine yalnızca ürün liste sayfası adresleri ekleyin.
Stok veya aktiflik alanına değil, sayfada listelenen ürün sayısına bakar.
Son ürün stok nedeniyle kalkarsa veya pasife alınırsa bağlantı gizlenir. */
(function () {
"use strict";
if (window.tudorsEmptyMenu) return;
var targets = ["/gecelik"];
var menuSelector = ".newHeaderNavigation a[href], .newHeaderNavUl a[href]";
var refreshMs = 5 * 60 * 1000;
var hiddenClass = "tudors-empty-menu-hidden";
var states = new Map();
var busy = false;
function keyFor(value) {
try {
var url = new URL(value, location.origin);
if (url.origin !== location.origin || !/^https?:$/.test(url.protocol)) return null;
url.hash = "";
url.pathname = url.pathname.replace(/\/+$/, "") || "/";
url.searchParams.sort();
return url.pathname + url.search;
} catch (_) { return null; }
}
function readCount(html) {
// Ayrıştırılan sayfanın scriptleri çalıştırılmaz.
var doc = new DOMParser().parseFromString(html, "text/html");
var scripts = Array.from(doc.querySelectorAll("script:not([src])"))
.filter(function (script) {
return !script.type || /^(text|application)\/javascript$/i.test(script.type);
}).map(function (script) { return script.textContent; });
var isListing = scripts.some(function (text) {
return /\bvar\s+productsModel\s*=\s*\{/.test(text);
});
if (!isListing) return null;
var counts = scripts.map(function (text) {
var match = /\bvar\s+netTotalItems\s*=\s*(\d+)\s*;/.exec(text);
return match ? Number(match[1]) : null;
}).filter(function (count) { return count !== null; });
if (counts.length !== 1 || !Number.isSafeInteger(counts[0])) return null;
return counts[0];
}
function apply() {
document.querySelectorAll(menuSelector).forEach(function (link) {
var key = keyFor(link.getAttribute("href"));
var li = link.closest("li");
// Birden fazla link içeren sütunun tamamını gizlemeyin.
var node = li && li.querySelectorAll("a[href]").length === 1 ? li : link;
node.classList.toggle(hiddenClass, states.get(key) === 0);
});
}
async function check(key) {
var controller = new AbortController();
var timeout = setTimeout(function () { controller.abort(); }, 12000);
try {
var response = await fetch(key, {
credentials: "same-origin",
cache: "no-store",
redirect: "error",
signal: controller.signal
});
if (!response.ok || !/text\/html/i.test(response.headers.get("content-type") || "")) {
throw new Error("Liste sayfası okunamadı");
}
// Ticimax'in liste sayacı pasif ürünleri de liste dışı bıraktığında
// bu ürünler menüyü açık tutmaz. Ürün detay stoğu sorgulanmaz.
var count = readCount(await response.text());
if (count === null) throw new Error("Ürün sayısı doğrulanamadı");
states.set(key, count);
} catch (_) {
// Ağ hatası, 404 veya tema değişikliği sıfır ürün anlamına gelmez.
states.delete(key);
} finally {
clearTimeout(timeout);
apply();
}
}
async function refresh() {
if (busy || document.hidden) return;
busy = true;
try {
var links = Array.from(document.querySelectorAll(menuSelector));
var keys = Array.from(new Set(targets.map(keyFor).filter(function (key) {
return key && links.some(function (link) {
return keyFor(link.getAttribute("href")) === key;
});
})));
// Çok sayıda hedef eklenirse istekleri aynı anda göndermeyin.
for (var key of keys) await check(key);
} finally { busy = false; }
}
function start() {
var style = document.createElement("style");
style.textContent = "." + hiddenClass + "{display:none!important}";
document.head.appendChild(style);
var queued = false;
new MutationObserver(function () {
if (queued) return;
queued = true;
requestAnimationFrame(function () { queued = false; apply(); });
}).observe(document.body, { childList: true, subtree: true });
refresh();
setInterval(refresh, refreshMs);
document.addEventListener("visibilitychange", function () {
if (!document.hidden) refresh();
});
}
window.tudorsEmptyMenu = { refresh: refresh };
if (document.readyState === "loading") {
document.addEventListener("DOMContentLoaded", start, { once: true });
} else { start(); }
})();