const input = document.getElementById("searchInput"); const clearBtn = document.getElementById("clearBtn"); const results = document.getElementById("results"); const counter = document.getElementById("counter"); const resultsHeader = document.querySelector(".resultsHeader"); const COLUMNS = [ { key: "إسم المنشأة", label: "إسم المنشأة" }, { key: "السجل التجاري", label: "السجل التجاري" }, { key: "حالة العينة", label: "حالة العينة" }, { key: "اسم المسح", label: "اسم المسح" }, ]; function normalize(value){ return String(value ?? "") .toLowerCase() .trim() .replace(/[إأآا]/g,"ا") .replace(/ى/g,"ي") .replace(/ة/g,"ه") .replace(/[^\u0600-\u06FFa-zA-Z0-9 ]/g,"") .replace(/\s+/g," "); } function esc(value){ return String(value ?? "") .replace(/&/g,"&") .replace(//g,">") .replace(/"/g,""") .replace(/'/g,"'"); } function getStatusClass(status){ const s = normalize(status); if(s.includes("اعطت كامل البيانات")){ return "status success"; } if(s.includes("اعطت بعض البيانات") || s.includes("استيفاء ذاتي")){ return "status warning"; } if( s.includes("رفض") || s.includes("مغلق") || s.includes("لم يعثر") || s.includes("انتقلت") || s.includes("تحولت") || s.includes("خارج نطاق") || s.includes("لم تمارس") || s.includes("غير متاح") || s.includes("يطالب") || s.includes("اخري") ){ return "status danger"; } return "status"; } function getScore(row, q){ const name = normalize(row["إسم المنشأة"]); const cr = normalize(row["السجل التجاري"]); if(name === q || cr === q) return 1; if(name.startsWith(q) || cr.startsWith(q)) return 2; if(name.includes(q) || cr.includes(q)) return 3; return 99; } function showResultsArea(){ results.classList.add("active"); if(resultsHeader) resultsHeader.classList.add("active"); } function hideResultsArea(){ results.classList.remove("active"); if(resultsHeader) resultsHeader.classList.remove("active"); } function render(rows){ showResultsArea(); counter.textContent = rows.length ? `عدد النتائج: ${rows.length}` : ""; if(!rows.length){ results.innerHTML = `
لم يتم العثور على نتيجة مطابقة.
`; return; } const head = ` ${COLUMNS.map(col => `${col.label}`).join("")} `; const body = ` ${rows.map(row => ` ${esc(row["إسم المنشأة"] || "—")} ${esc(row["السجل التجاري"] || "—")} ${esc(row["حالة العينة"] || "—")} ${esc(row["اسم المسح"] || "—")} `).join("")} `; const cards = `
${rows.map(row => `

${esc(row["إسم المنشأة"] || "—")}

${esc(row["حالة العينة"] || "—")}
السجل التجاري ${esc(row["السجل التجاري"] || "—")}
اسم المسح ${esc(row["اسم المسح"] || "—")}
`).join("")}
`; results.innerHTML = `
${head}${body}
${cards} `; } function search(){ const q = normalize(input.value); if(!q){ counter.textContent = ""; hideResultsArea(); return; } if(q.length < 2){ counter.textContent = ""; showResultsArea(); results.innerHTML = `
اكتب حرفين على الأقل.
`; return; } const filtered = DATA .filter(row => { const name = normalize(row["إسم المنشأة"]); const cr = normalize(row["السجل التجاري"]); const status = normalize(row["حالة العينة"]); if(status.includes("جديد")) return false; return name.includes(q) || cr.includes(q); }) .sort((a,b) => getScore(a,q) - getScore(b,q)); render(filtered); } function clearSearch(){ input.value = ""; counter.textContent = ""; results.innerHTML = ""; hideResultsArea(); input.focus(); } let debounceTimer; input.addEventListener("input", () => { clearTimeout(debounceTimer); debounceTimer = setTimeout(search, 250); }); clearBtn.addEventListener("click", clearSearch); if(!Array.isArray(DATA)){ showResultsArea(); counter.textContent = ""; results.innerHTML = `
ملف البيانات غير صحيح.
`; }