/* LIFE General Services – custom storefront layout (Salla custom JS) */
(function () {
var PHONE = '966540999883';
var EMAIL = 'asdfgh0909h@gmail.com';
var CATEGORY_ORDER = ['خدمات مدرسية', 'خدمات حكومية', 'خدمات قانونية', 'مواعيد ومعاريض', 'متجر إلكتروني', 'عقارات', 'إعلانات'];
var PHONE_PRETTY = '+' + PHONE.slice(0, 3) + ' ' + PHONE.slice(3, 5) + ' ' + PHONE.slice(5, 8) + ' ' + PHONE.slice(8);
var WA = 'https://wa.me/' + PHONE;
var LOGO = " ";
function esc(s) {
return String(s == null ? '' : s).replace(/&/g, '&').replace(/"/g, '"').replace(//g, '>');
}
// DOMParser documents are inert: descriptions are read as text without running handlers.
function parse(html) {
return new DOMParser().parseFromString(html || '', 'text/html').body;
}
function plain(html) {
return (parse(html).textContent || '').replace(/\s+/g, ' ').trim();
}
// Cards show only the lead line; the full description lives on the product page.
function firstLine(html) {
var d = parse(html);
var first = d.querySelector('p, div, h1, h2, h3');
var text = first ? first.textContent : d.textContent;
// The listing API may flatten paragraphs; the lead always ends before the first section marker.
return (text || '').split('\n')[0].split('✨')[0].replace(/\s+/g, ' ').trim();
}
function home() {
return (window.salla && salla.config && salla.config.get('page.slug')) === 'index';
}
function storeUrl() {
return (window.salla && salla.config && salla.config.get('store.url')) || '/';
}
function headerHTML() {
return '' +
'
' +
'
' +
'
' +
'✅ موثوق في منصة أعمال ' +
'🏛️ موثق في إحكام ' +
'🏠 رخصة فال: معتمد ' +
'
' +
'
' +
'';
}
function footerHTML() {
var cats = [
['🎒 مطويات ابتدائية - جامعية', 'خدمات مدرسية'],
['🏛️ الضمان وحساب المواطن وشمل والعمل الحر', 'خدمات حكومية'],
['⚖️ رفع قضايا + استشارات', 'خدمات قانونية'],
['📅 مواعيد + معاريض ملكية', 'مواعيد ومعاريض'],
['🛒 متجر سلة وتصميم', 'متجر إلكتروني'],
['🏠 عقارات برخصة فال', 'عقارات'],
['🚀 إعلانات تيك توك وسناب ويوتيوب', 'إعلانات']
];
return '' +
'' +
'' +
'
' +
'💬 ';
}
function homeHTML() {
return '' +
'' +
'
' +
'
متجر موثوق - منصة أعمال + منصة إحكام + رخصة فال' +
'
خدماتك المدرسية والقانونية والعقارية في مكان واحد ' +
'
من الصف الابتدائي حتى الجامعة، رفع قضايا، مواعيد حكومية، معاريض الديوان الملكي، متاجر سلة، إدارة عقارات برخصة فال وإعلانات تيك توك وسناب ويوتيوب. تصميم مريح للعين وخدمة موثوقة.
' +
'
' +
'✅ موثوق في أعمال ' +
'🏛️ إحكام موثوق ' +
'🏠 فال معتمد ' +
'
' +
'
' +
'
💳 مدى، فيزا، أبل باي • قسّمها مع تابي وتمارا
' +
'
' +
'' +
'
' +
'
' +
'📦 جارٍ تحميل الخدمات...
' +
'
' +
' ' +
'
' +
'طرق الدفع الآمنة ادفع بأمان مع خيارات متعددة وقسّم فاتورتك بدون فوائد
✨ قسّمها مع تابي وتمارا ' +
'' +
'
' +
'
' +
'
' +
'
' +
'
' +
'
' +
'
' +
'% قسّم فاتورتك على 4 دفعات بدون فوائد مع تابي وتمارا متوافق مع أحكام الشريعة - موافقة فورية
' +
'
tabby tamara
' +
' ' +
'
' +
'⚡ خدمة سريعة تسليم خلال 24 ساعة للخدمات المدرسية
' +
'💬 دعم واتساب مباشر رقم جديد ' + PHONE + ' - رد فوري
' +
'🛡️ موثوق ومرخص منصة أعمال + إحكام + رخصة فال العقارية
' +
' ' +
'
';
}
/* ---------- Services catalogue ---------- */
function Services(root) {
this.grid = root.querySelector('[data-lf-grid]');
this.filters = root.querySelector('[data-lf-filters]');
this.count = root.querySelector('[data-lf-count]');
this.search = root.querySelector('[data-lf-search]');
this.products = [];
this.cat = '';
this.q = '';
}
Services.prototype.load = function () {
var all = [];
var seen = {};
var self = this;
// The storefront API pages with an opaque cursor taken from cursor.next.
function page(cursor, n) {
var params = { source: 'latest' };
if (cursor) params.cursor = cursor;
return salla.api.product.fetch(params).then(function (res) {
var items = (res && res.data) || [];
var fresh = items.filter(function (p) { return !seen[p.id] && (seen[p.id] = true); });
all = all.concat(fresh);
var next = res && res.cursor && res.cursor.next;
if (next && fresh.length && n < 20) {
return page(new URL(next, location.origin).searchParams.get('cursor'), n + 1);
}
}).catch(function () {});
}
return page(null, 1).then(function () {
// "latest" is newest first; keep the order in which services were added.
all.reverse();
var rank = function (n) { var i = CATEGORY_ORDER.indexOf(n); return i === -1 ? 99 : i; };
self.products = all.map(function (p, i) { return { p: p, i: i }; })
.sort(function (a, b) {
return rank(a.p.category && a.p.category.name) - rank(b.p.category && b.p.category.name) || a.i - b.i;
})
.map(function (x) { return x.p; });
});
};
Services.prototype.init = function () {
var self = this;
return this.load().then(function () {
self.renderFilters();
self.render();
self.bind();
});
};
Services.prototype.renderFilters = function () {
var names = [];
this.products.forEach(function (p) {
var n = p.category && p.category.name;
if (n && names.indexOf(n) === -1) names.push(n);
});
names.sort(function (a, b) {
var ra = CATEGORY_ORDER.indexOf(a), rb = CATEGORY_ORDER.indexOf(b);
return (ra === -1 ? 99 : ra) - (rb === -1 ? 99 : rb);
});
this.filters.innerHTML = 'الكل • ' + this.products.length + ' ' +
names.map(function (n) { return '' + esc(n) + ' '; }).join('');
};
Services.prototype.setCat = function (cat) {
var self = this;
this.cat = cat || '';
this.filters.querySelectorAll('.lf-chip').forEach(function (c) { c.classList.toggle('is-active', c.dataset.cat === self.cat); });
this.render();
};
Services.prototype.bind = function () {
var self = this;
this.filters.addEventListener('click', function (e) {
var chip = e.target.closest('.lf-chip');
if (chip) self.setCat(chip.dataset.cat);
});
var input = this.search.querySelector('input');
input.addEventListener('input', function () { self.q = input.value.trim(); self.render(); });
this.search.addEventListener('submit', function (e) {
e.preventDefault();
self.q = input.value.trim();
self.render();
document.getElementById('lf-services').scrollIntoView({ behavior: 'smooth' });
});
document.querySelectorAll('[data-lf-cat]').forEach(function (a) {
a.addEventListener('click', function () { self.setCat(a.dataset.lfCat); });
});
};
Services.prototype.render = function () {
var self = this;
var q = this.q.toLowerCase();
var items = this.products.filter(function (p) {
if (self.cat && (!p.category || p.category.name !== self.cat)) return false;
return !q || (p.name + ' ' + plain(p.description) + ' ' + (p.category ? p.category.name : '')).toLowerCase().indexOf(q) !== -1;
});
this.count.textContent = '📦 عرض ' + items.length + ' من ' + this.products.length + ' خدمة';
this.grid.innerHTML = items.length ? items.map(function (p) { return self.card(p); }).join('') : 'لا توجد خدمات مطابقة لبحثك.
';
};
Services.prototype.price = function (p) {
var full = plain(p.description);
if (!Number(p.price)) {
var pct = full.match(/\d+(\.\d+)?%/);
return pct ? 'عمولة ' + pct[0] : 'حسب الطلب';
}
var amount = salla.money(p.is_on_sale ? p.sale_price : p.price);
return /السعر شهري/.test(full) ? amount + ' / شهري' : amount;
};
Services.prototype.card = function (p) {
var desc = p.subtitle || firstLine(p.description);
var img = p.image && p.image.url;
return '' +
'' +
'
' + (img ? ' ' : '') + ' ' +
'
' +
(p.promotion_title ? '' + esc(p.promotion_title) + ' ' : '') +
(p.category && p.category.name ? '' + esc(p.category.name) + ' ' : '') +
'
' +
'
' +
'' +
'' + esc(desc) + '
' +
'' +
' ';
};
/* ---------- Mount ---------- */
function mount() {
if (document.body.classList.contains('lf-active')) return;
document.body.classList.add('lf-active');
var head = document.createElement('div');
head.className = 'lf-chrome-header';
head.innerHTML = headerHTML();
var raedHeader = document.querySelector('.store-header');
(raedHeader ? raedHeader.parentNode : document.body).insertBefore(head, raedHeader || document.body.firstChild);
var foot = document.createElement('footer');
foot.className = 'store-footer lf-footer';
foot.innerHTML = footerHTML();
var raedFooter = document.querySelector('.store-footer');
if (raedFooter) raedFooter.parentNode.insertBefore(foot, raedFooter.nextSibling);
else document.body.appendChild(foot);
if (home()) {
var main = document.getElementById('main-content');
if (main) {
document.body.classList.add('lf-home');
var root = document.createElement('div');
root.className = 'lf-home-root';
root.innerHTML = homeHTML();
main.insertBefore(root, main.firstChild);
new Services(root).init();
}
}
}
function whenReady(fn) {
var tries = 0;
(function wait() {
if (window.salla && salla.config && salla.config.get('page.slug') && salla.api) return fn();
if (++tries < 100) setTimeout(wait, 100);
})();
}
if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', function () { whenReady(mount); });
else whenReady(mount);
})();