stat2025 commited on
Commit
ede9e01
·
verified ·
1 Parent(s): e80d8a0

Upload script.js

Browse files
Files changed (1) hide show
  1. script.js +147 -0
script.js ADDED
@@ -0,0 +1,147 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // بيانات الروابط (تم توليدها من ملف Excel)
2
+ const DATA = [{"name": "أحمد حمود محمد الحربي", "url": "https://stat2025-map.static.hf.space/BCS/59.html"}, {"name": "أروى سعيد بن عبدالله القحطاني", "url": "https://stat2025-map.static.hf.space/BCS/29.html"}, {"name": "أماني مصطفى بن عبدالله الطيب", "url": "https://stat2025-map.static.hf.space/BCS/42.html"}, {"name": "أمل احمد محمد مجرشي", "url": "https://stat2025-map.static.hf.space/BCS/01.html"}, {"name": "أمل بنت علي بن علي السماعيل", "url": "https://stat2025-map.static.hf.space/BCS/50.html"}, {"name": "أمل جعفر بن علي آل حماد", "url": "https://stat2025-map.static.hf.space/BCS/40.html"}, {"name": "أمل صالح بن احمد آل مزعل", "url": "https://stat2025-map.static.hf.space/BCS/06.html"}, {"name": "احلام صالح معيوض العصيمي", "url": "https://stat2025-map.static.hf.space/BCS/43.html"}, {"name": "احمد متعب بن عوض الحربي", "url": "https://stat2025-map.static.hf.space/BCS/56.html"}, {"name": "اسراء محمد بن علي الاصيل", "url": "https://stat2025-map.static.hf.space/BCS/39.html"}, {"name": "اسعد بن ماجد بن احمد الهاشم", "url": "https://stat2025-map.static.hf.space/BCS/37.html"}, {"name": "اسماء بنت محمد بن حسين العدساني", "url": "https://stat2025-map.static.hf.space/BCS/52.html"}, {"name": "الجازي معيض هادي ال دعلان", "url": "https://stat2025-map.static.hf.space/BCS/36.html"}, {"name": "ايمان عبدالعزيز بن صالح الصالح", "url": "https://stat2025-map.static.hf.space/BCS/09.html"}, {"name": "ايمان عبدالعزيز بن صالح الصالح", "url": "https://stat2025-map.static.hf.space/BCS/23.html"}, {"name": "باسمه احمد بن محمد القرني", "url": "https://stat2025-map.static.hf.space/BCS/31.html"}, {"name": "باقر عبدالله بن هاشم الهاشم", "url": "https://stat2025-map.static.hf.space/BCS/47.html"}, {"name": "بخيته عادل احمد الدوسري", "url": "https://stat2025-map.static.hf.space/BCS/12.html"}, {"name": "حسن عادل بن حسين الوصيبعي", "url": "https://stat2025-map.static.hf.space/BCS/48.html"}, {"name": "حسين علي بن صالح الربيعه", "url": "https://stat2025-map.static.hf.space/BCS/19.html"}, {"name": "حنين محمد مبارك آل مبارك", "url": "https://stat2025-map.static.hf.space/BCS/28.html"}, {"name": "روان سعود بن مرشد الرحيلي", "url": "https://stat2025-map.static.hf.space/BCS/45.html"}, {"name": "ريم بنت محمد بن عبدالعزيز الملحم", "url": "https://stat2025-map.static.hf.space/BCS/04.html"}, {"name": "زهراء بنت عايش بن علي الصاهود", "url": "https://stat2025-map.static.hf.space/BCS/13.html"}, {"name": "ساره حسين بن عبدالهادي بوخمسين", "url": "https://stat2025-map.static.hf.space/BCS/18.html"}, {"name": "ساره خالد سليمان المحيسن", "url": "https://stat2025-map.static.hf.space/BCS/20.html"}, {"name": "سراب حميد عبدالمجيد السليمان", "url": "https://stat2025-map.static.hf.space/BCS/25.html"}, {"name": "سلافه عباس محمد العلوي", "url": "https://stat2025-map.static.hf.space/BCS/30.html"}, {"name": "سميه سامى بن احمد النعيم", "url": "https://stat2025-map.static.hf.space/BCS/51.html"}, {"name": "شريفه ابراهيم بن عبدالله العقيل", "url": "https://stat2025-map.static.hf.space/BCS/33.html"}, {"name": "شيماء عبدالرحمن بن دحباش سودي", "url": "https://stat2025-map.static.hf.space/BCS/26.html"}, {"name": "صالح دلي بن عقلاء الشمري", "url": "https://stat2025-map.static.hf.space/BCS/46.html"}, {"name": "طيبه فالح بن عبدالله الرويشد", "url": "https://stat2025-map.static.hf.space/BCS/11.html"}, {"name": "عائشه سليمان بن نايف الحربي", "url": "https://stat2025-map.static.hf.space/BCS/44.html"}, {"name": "عبدالمجيد مشعل محمد الحربي", "url": "https://stat2025-map.static.hf.space/BCS/58.html"}, {"name": "عبدالهادي عون بن سعييد القحطاني", "url": "https://stat2025-map.static.hf.space/BCS/05.html"}, {"name": "عقيله محمدحسين بن علي الجباره", "url": "https://stat2025-map.static.hf.space/BCS/53.html"}, {"name": "غاده سعد بن عبدالرحمن القحطاني", "url": "https://stat2025-map.static.hf.space/BCS/08.html"}, {"name": "غشمه محمد بن سعد الشهراني", "url": "https://stat2025-map.static.hf.space/BCS/14.html"}, {"name": "فايزه محمد مسعود الحازمي", "url": "https://stat2025-map.static.hf.space/BCS/22.html"}, {"name": "فوز عائد نومان المطيري", "url": "https://stat2025-map.static.hf.space/BCS/61.html"}, {"name": "فيصل تركي فيصل القحطاني", "url": "https://stat2025-map.static.hf.space/BCS/34.html"}, {"name": "قنوت محمد بن عبدالله آل حماد", "url": "https://stat2025-map.static.hf.space/BCS/03.html"}, {"name": "لطيفه صالح بن عبدالرحمن العبد القادر", "url": "https://stat2025-map.static.hf.space/BCS/32.html"}, {"name": "لطيفه علي بن حسين النعيم", "url": "https://stat2025-map.static.hf.space/BCS/16.html"}, {"name": "لولوه بدر بن حمد الصياح", "url": "https://stat2025-map.static.hf.space/BCS/21.html"}, {"name": "لين أحمد بن عبدالعزيز القصير", "url": "https://stat2025-map.static.hf.space/BCS/35.html"}, {"name": "محمد فهد محمد الحربي", "url": "https://stat2025-map.static.hf.space/BCS/60.html"}, {"name": "مرتضى عبدالجليل بن عيسى الحكيم", "url": "https://stat2025-map.static.hf.space/BCS/38.html"}, {"name": "مصطفى احمد بن جمعه الرمضان", "url": "https://stat2025-map.static.hf.space/BCS/49.html"}, {"name": "منيره سعد بن احمد الجديدي", "url": "https://stat2025-map.static.hf.space/BCS/54.html"}, {"name": "ناصر عبدالله بن ناصر القحطاني", "url": "https://stat2025-map.static.hf.space/BCS/57.html"}, {"name": "نبأ عادل بن عبدالكريم آل رضوان", "url": "https://stat2025-map.static.hf.space/BCS/15.html"}, {"name": "نجود عبدالعزيز بن عقيل العمري", "url": "https://stat2025-map.static.hf.space/BCS/24.html"}, {"name": "ندى ابراهيم بن علي المنصور", "url": "https://stat2025-map.static.hf.space/BCS/17.html"}, {"name": "نوره عبدالله بن زهير الرزقي", "url": "https://stat2025-map.static.hf.space/BCS/10.html"}, {"name": "نوف سعود بن سالم الخثعمي", "url": "https://stat2025-map.static.hf.space/BCS/02.html"}, {"name": "نوف صالح بن محمد السميح", "url": "https://stat2025-map.static.hf.space/BCS/55.html"}, {"name": "نيللي حسين عبدالله الجعص", "url": "https://stat2025-map.static.hf.space/BCS/27.html"}, {"name": "وضحاء نائف سعد الشريف", "url": "https://stat2025-map.static.hf.space/BCS/07.html"}, {"name": "يحي علي بن يحي المسين", "url": "https://stat2025-map.static.hf.space/BCS/41.html"}];
3
+
4
+ // --------- أدوات مساعدة للتطبيع (لتحسين البحث بالعربية) ----------
5
+ function normalizeArabic(s) {
6
+ if (!s) return "";
7
+ return String(s)
8
+ .trim()
9
+ .toLowerCase()
10
+ // إزالة التشكيل
11
+ .replace(/[\u064B-\u065F\u0670\u06D6-\u06ED]/g, "")
12
+ // إزالة التطويل
13
+ .replace(/\u0640/g, "")
14
+ // توحيد الهمزات
15
+ .replace(/[إأآٱ]/g, "ا")
16
+ // توحيد الياء والألف المقصورة
17
+ .replace(/ى/g, "ي")
18
+ // توحيد الهاء/التاء المربوطة (اختياري - يساعد في نتائج أكثر)
19
+ .replace(/ة/g, "ه")
20
+ // توحيد المسافات
21
+ .replace(/\s+/g, " ");
22
+ }
23
+
24
+ function highlightMatch(name, query) {
25
+ // تظليل بسيط بناءً على النص الأصلي (بدون تطبيع كامل لتفادي تعقيد الفهارس)
26
+ if (!query) return escapeHtml(name);
27
+ const q = query.trim();
28
+ if (!q) return escapeHtml(name);
29
+
30
+ // نبحث عن أول ظهور لنفس سلسلة المستخدم في الاسم الأصلي (حرفيًا)
31
+ const idx = name.indexOf(q);
32
+ if (idx === -1) return escapeHtml(name);
33
+ const before = escapeHtml(name.slice(0, idx));
34
+ const mid = escapeHtml(name.slice(idx, idx + q.length));
35
+ const after = escapeHtml(name.slice(idx + q.length));
36
+ return `${before}<mark>${mid}</mark>${after}`;
37
+ }
38
+
39
+ function escapeHtml(str) {
40
+ return String(str)
41
+ .replaceAll("&", "&amp;")
42
+ .replaceAll("<", "&lt;")
43
+ .replaceAll(">", "&gt;")
44
+ .replaceAll('"', "&quot;")
45
+ .replaceAll("'", "&#039;");
46
+ }
47
+
48
+ // --------- منطق البحث ----------
49
+ const elQ = document.getElementById("q");
50
+ const elResults = document.getElementById("results");
51
+ const elBadge = document.getElementById("countBadge");
52
+ const btnSearch = document.getElementById("btnSearch");
53
+ const btnClear = document.getElementById("btnClear");
54
+
55
+ function renderResults(list, rawQuery) {
56
+ elResults.innerHTML = "";
57
+
58
+ if (!list.length) {
59
+ elBadge.textContent = "النتائج: 0";
60
+ elResults.innerHTML = `<div class="empty">لا توجد نتائج مطابقة. جرّب كتابة جزء آخر من الاسم.</div>`;
61
+ return;
62
+ }
63
+
64
+ elBadge.textContent = `النتائج: ${list.length}`;
65
+
66
+ const frag = document.createDocumentFragment();
67
+
68
+ list.forEach(item => {
69
+ const div = document.createElement("div");
70
+ div.className = "item";
71
+
72
+ const left = document.createElement("div");
73
+ const nm = document.createElement("div");
74
+ nm.className = "name";
75
+ nm.innerHTML = highlightMatch(item.name, rawQuery);
76
+ const hint = document.createElement("div");
77
+ hint.className = "hint";
78
+ hint.textContent = "اضغط فتح الخريطة لزيارة الصفحة";
79
+ left.appendChild(nm);
80
+ left.appendChild(hint);
81
+
82
+ const a = document.createElement("a");
83
+ a.className = "open";
84
+ a.href = item.url;
85
+ a.target = "_blank";
86
+ a.rel = "noopener";
87
+ a.textContent = "فتح الخريطة";
88
+
89
+ div.appendChild(left);
90
+ div.appendChild(a);
91
+ frag.appendChild(div);
92
+ });
93
+
94
+ elResults.appendChild(frag);
95
+ }
96
+
97
+ function doSearch() {
98
+ const raw = elQ.value || "";
99
+ const q = normalizeArabic(raw);
100
+
101
+ if (!q) {
102
+ renderResults([], raw);
103
+ return;
104
+ }
105
+
106
+ // يدعم البحث بكلمة أو أكثر (كل الكلمات يجب أن تظهر)
107
+ const tokens = q.split(" ").filter(Boolean);
108
+
109
+ const matched = DATA.filter(d => {
110
+ const nameNorm = normalizeArabic(d.name);
111
+ return tokens.every(t => nameNorm.includes(t));
112
+ });
113
+
114
+ // ترتيب بسيط: الأقرب (أقصر اسم) ثم أبجدي
115
+ matched.sort((a, b) => {
116
+ const al = (a.name || "").length;
117
+ const bl = (b.name || "").length;
118
+ if (al !== bl) return al - bl;
119
+ return (a.name || "").localeCompare(b.name || "","ar");
120
+ });
121
+
122
+ renderResults(matched, raw.trim());
123
+ }
124
+
125
+ btnSearch.addEventListener("click", doSearch);
126
+
127
+ btnClear.addEventListener("click", () => {
128
+ elQ.value = "";
129
+ elQ.focus();
130
+ elResults.innerHTML = "";
131
+ elBadge.textContent = "النتائج: 0";
132
+ });
133
+
134
+ // بحث تلقائي أثناء الكتابة (مع تأخير بسيط)
135
+ let t = null;
136
+ elQ.addEventListener("input", () => {
137
+ clearTimeout(t);
138
+ t = setTimeout(doSearch, 150);
139
+ });
140
+
141
+ // Enter للبحث
142
+ elQ.addEventListener("keydown", (e) => {
143
+ if (e.key === "Enter") doSearch();
144
+ });
145
+
146
+ // تحميل أولي: إظهار حالة فارغة
147
+ elBadge.textContent = "النتائج: 0";