إدارة المبيعات المركزية
التواصل والمشاركة
الدعم الفني المحلي
الذكاء الاصطناعي في جميع أنحاء ريتيرا
الصيانة المؤتمتة
تسجيل الدخول والوصول الذكي
واجهة مستخدم عربية وامتثال للمملكة العربية السعودية
document.addEventListener('DOMContentLoaded', function(){
// --- أدوات مساعدة ---
function norm(s){
return (s==null?'':String(s))
.normalize('NFKC')
.toLowerCase()
.replace(/[\u200B-\u200D\uFEFF]/g,'') // أحرف صفر عرض
.replace(/[\u0617-\u061A\u064B-\u0652]/g,'') // تشكيل عربي
.replace(/[٠-٩]/g, d => '٠١٢٣٤٥٦٧٨٩'.indexOf(d))// أرقام هندية -> لاتينية
.trim()
.replace(/\s+/g,' ');
}
function slugifyFromText(txt){
return norm(txt)
.replace(/&/g,' and ')
.replace(/[^a-z0-9\u0621-\u064a\- ]+/g,'')
.replace(/\s+/g,'-')
.replace(/\-+/g,'-')
.replace(/^\-|\-$/g,'');
}
// --- الخرائط الواردة من WP ---
var mapWrap = (window._termDescMap || {})['benefits'] || {};
var bySlug = mapWrap.by_slug || {};
var byId = mapWrap.by_id || {};
// خرائط مطبّعة للمفاتيح
var bySlugN = {};
Object.keys(bySlug).forEach(function(k){ bySlugN[norm(k)] = bySlug[k]; });
var byIdN = {};
Object.keys(byId).forEach(function(k){ byIdN[norm(k)] = byId[k]; });
// آخر وصف متاح (لاستخدامه كحل نهائي لآخر عنصر)
var lastDescFromSlug = (function(){
var keys = Object.keys(bySlugN);
return keys.length ? bySlugN[keys[keys.length-1]] : '';
})();
var lastDescFromId = (function(){
var keys = Object.keys(byIdN);
return keys.length ? byIdN[keys[keys.length-1]] : '';
})();
// --- معالجة الودجتس ---
var widgets = document.querySelectorAll('.has-term-desc.tax-benefits');
widgets.forEach(function(widget){
// نفس محددك الأصلي
var items = widget.querySelectorAll('.e-filter .e-filter-item, .e-filter button, .e-filter a, .e-filter li');
// حنحتاج الطول لمعرفة "آخر عنصر"
var total = items.length;
items.forEach(function(it, idx){
// أضف رقم متسلسل
if (!it.querySelector('.e-term-index')) {
var n = document.createElement('span');
n.className = 'e-term-index';
n.textContent = (idx + 1);
it.insertBefore(n, it.firstChild);
}
// لا تعيد الحقن
if (it.dataset.descInjected === '1') return;
// جرّب إيجاد الوصف بعدة طرق
var rawSlug = it.getAttribute('data-term') || it.getAttribute('data-filter') || '';
var rawId = it.getAttribute('data-term-id') || it.getAttribute('data-id') || '';
var text = (it.textContent || '').trim();
var slug = norm(rawSlug);
var termId = norm(rawId);
var textSlug= slugifyFromText(text);
var desc =
(slug && bySlugN[slug]) ||
(termId && byIdN[termId]) ||
(textSlug && bySlugN[textSlug]) ||
(function(){
// fallback: tail بعد سلاش/نقطتين/سهم
var tail = slug.split(/[\/:>]/).pop();
return tail ? bySlugN[norm(tail)] || '' : '';
})() ||
'';
// لو هذا آخر عنصر ولسه ما لقينا وصف: استخدم "آخر وصف" من الخرائط
if (!desc && idx === total - 1) {
desc = lastDescFromSlug || lastDescFromId || '';
}
if (!desc) return; // ما في شي نحقنه
var wrap = document.createElement('div');
wrap.className = 'e-term-description';
wrap.innerHTML = desc;
it.appendChild(wrap);
it.dataset.descInjected = '1';
});
});
});
(function(){
var S={scrollContainer:'.posts-scroll',card:'.case-card',timelineCol:'.tl-col',marker:'.tl-marker'};
var state={sc:null, mo:null, ro:null, onScroll:null, onResize:null};
function q(a){return document.querySelector(a)}
function qa(a){return Array.prototype.slice.call(document.querySelectorAll(a))}
function getContainer(){
var el=q(S.scrollContainer);
if(el) return el;
var first=q(S.card);
for(var p=first&&first.parentElement;p;p=p.parentElement){
var st=getComputedStyle(p);
if((st.overflowY==='auto'||st.overflowY==='scroll')&&p.scrollHeight>p.clientHeight) return p;
}
return null;
}
function extractDateText(card){
if(card.id&&card.id.indexOf('case-')===0) return card.id.replace('case-','');
var t=card.querySelector('time'); return t?(t.getAttribute('datetime')||t.textContent).trim():'';
}
function buildMarkers(){
var col=q(S.timelineCol); if(!col) return;
qa(S.marker).forEach(function(m){m.remove()});
var cards=qa(S.card).filter(function(c){return c.offsetParent!==null}); if(!cards.length) return;
var h=col.clientHeight||400;
cards.forEach(function(card,i){
if(!card.id) card.id='case-auto-'+(i+1);
var m=document.createElement('button');
m.className='tl-marker';
m.setAttribute('data-target','#'+card.id);
m.setAttribute('data-date',extractDateText(card));
var t=(i+1)/(cards.length+1);
m.style.top=Math.round(t*h)+'px';
m.addEventListener('click',function(e){
e.preventDefault();
var c=state.sc, trg=document.getElementById(card.id); if(!trg) return;
var cr=c?c.getBoundingClientRect():{top:0,height:window.innerHeight}, tr=trg.getBoundingClientRect();
var delta=(tr.top-(cr.top||0))-((c?c.clientHeight:window.innerHeight)/2-tr.height/2);
if(c){ c.scrollTo({top:c.scrollTop+delta,behavior:'smooth'}) } else { window.scrollTo({top:window.scrollY+delta,behavior:'smooth'}) }
});
col.appendChild(m);
});
}
function relTopToContainer(el, sc){
if(sc){
var er=el.getBoundingClientRect(), sr=sc.getBoundingClientRect();
return er.top - sr.top;
}else{
return el.getBoundingClientRect().top;
}
}
function placeMarkers(){
var col=q(S.timelineCol); if(!col) return;
var sc=state.sc, colH=col.clientHeight||400;
var vTop=sc?0:0, vH=sc?(sc.clientHeight):(window.innerHeight);
var cards=qa(S.card).filter(function(c){return c.offsetParent!==null});
var markers=qa(S.timelineCol+' '+S.marker);
cards.forEach(function(card,i){
var tpx=relTopToContainer(card,sc);
var center=tpx + card.clientHeight/2;
var t=center/vH; t=Math.max(0.08,Math.min(0.92,t));
if(markers[i]) markers[i].style.top=(t*colH)+'px';
});
}
function updateActive(){
var col=q(S.timelineCol); if(!col) return;
var sc=state.sc;
var cards=qa(S.card).filter(function(c){return c.offsetParent!==null}); if(!cards.length) return;
var best=null,bestPos=1e9,fb=null,fbPos=-1e9;
cards.forEach(function(card){
var t=relTopToContainer(card,sc);
if(t>=0&&t<bestPos){best=card;bestPos=t}
if(tfbPos){fb=card;fbPos=t}
});
var target=best||fb||cards[0]; if(!target||!target.id) return;
var m=col.querySelector('.tl-marker[data-target="#'+target.id+'"]'); if(!m) return;
qa(S.timelineCol+' '+S.marker).forEach(function(x){x.classList.remove('is-active')});
m.classList.add('is-active');
}
function teardown(){
if(state.sc&&state.onScroll){state.sc.removeEventListener('scroll',state.onScroll)}
window.removeEventListener('scroll',state.onScroll||function(){});
window.removeEventListener('resize',state.onResize||function(){});
if(state.mo){try{state.mo.disconnect()}catch(e){} state.mo=null}
if(state.ro){try{state.ro.disconnect()}catch(e){} state.ro=null}
state.sc=null; state.onScroll=null; state.onResize=null;
}
function init(){
teardown();
state.sc=getContainer();
buildMarkers();
placeMarkers();
updateActive();
var ticking=false;
state.onScroll=function(){
if(ticking) return;
ticking=true;
requestAnimationFrame(function(){ placeMarkers(); updateActive(); ticking=false; });
};
(state.sc||window).addEventListener('scroll',state.onScroll,{passive:true});
state.onResize=function(){ placeMarkers(); updateActive(); };
window.addEventListener('resize',state.onResize);
var col=q(S.timelineCol);
if(window.ResizeObserver&&col){
state.ro=new ResizeObserver(function(){ placeMarkers(); updateActive(); });
state.ro.observe(col);
if(state.sc) state.ro.observe(state.sc);
}
var root=state.sc||document;
if(window.MutationObserver){
state.mo=new MutationObserver(function(muts){
var need=muts.some(function(m){return Array.prototype.some.call(m.addedNodes||[],function(n){return n.nodeType===1&&((n.matches&&n.matches(S.card))||(n.querySelector&&n.querySelector(S.card)));})});
if(need){ setTimeout(init,40); }
});
state.mo.observe(root,{childList:true,subtree:true});
}
}
function bindReinit(){
if(window.jQuery){ jQuery(window).on('elementor-pro/posts/ajax_request_success',function(){ setTimeout(init,60); }); }
document.addEventListener('jet-smart-filters/success',function(){ setTimeout(init,60); });
document.addEventListener('click',function(e){
var t=e.target.closest('.e-filter-item,.e-filter a,.e-filter button');
if(t) setTimeout(init,80);
});
}
window.addEventListener('load',function(){ bindReinit(); init(); });
})();