/* ========================================================= ROOFI ABAYA — MASTER CUSTOM JAVASCRIPT FOR SALLA Version: Unified / Organized Store: https://roofiabaya.com/ يحتوي على: 1) زر عروض اليوم الوطني 96 2) إصلاحات الجوال للتصنيفات والبنر 3) إصلاح عنوان أقسام المنتجات عند ظهور 000 IMPORTANT: - ضع الكود كما هو داخل خانة JavaScript المخصص في سلة. - لا تضف . ========================================================= */ (function () { "use strict"; var CONFIG = { nationalDay: { enabled: false, offerUrl: "https://roofiabaya.com/%D8%B9%D8%B1%D9%88%D8%B6-%D8%A7%D9%84%D9%8A%D9%88%D9%85-%D8%A7%D9%84%D9%88%D8%B7%D9%86%D9%8A-96/c473392056", number: "96", title: "عروض اليوم الوطني", subtitle: "اكتشفي العروض الآن" }, mobileCategories: { enabled: false, titleBannerLink: "/latest-products", maxMobileLinks: 7 }, productTitles: { enabled: true, cachePrefix: "roofi_section_title_" } }; function cleanText(value) { return String(value || "").replace(/\s+/g, " ").trim(); } function normalizeArabic(value) { return cleanText(value) .replace(/[أإآ]/g, "ا") .replace(/ى/g, "ي") .replace(/ة/g, "ه") .replace(/[\u064B-\u065F\u0670]/g, "") .toLowerCase(); } function onDomReady(callback) { if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", callback, { once: true }); } else { callback(); } } /* ===================================================== 01. زر عروض اليوم الوطني ===================================================== */ function createNationalDayOffer() { if (!CONFIG.nationalDay.enabled) return; if (document.getElementById("roofi-national-day-offer")) return; var offer = document.createElement("a"); offer.id = "roofi-national-day-offer"; offer.href = CONFIG.nationalDay.offerUrl; offer.setAttribute("aria-label", "استعرض عروض اليوم الوطني"); var icon = document.createElement("span"); icon.className = "roofi-national-icon"; var number = document.createElement("span"); number.className = "roofi-national-number"; number.textContent = CONFIG.nationalDay.number; icon.appendChild(number); var copy = document.createElement("span"); copy.className = "roofi-national-copy"; var title = document.createElement("span"); title.className = "roofi-national-title"; title.textContent = CONFIG.nationalDay.title; var subtitle = document.createElement("span"); subtitle.className = "roofi-national-subtitle"; subtitle.textContent = CONFIG.nationalDay.subtitle; copy.appendChild(title); copy.appendChild(subtitle); var arrow = document.createElement("span"); arrow.className = "roofi-national-arrow"; arrow.innerHTML = "‹"; offer.appendChild(icon); offer.appendChild(copy); offer.appendChild(arrow); document.body.appendChild(offer); } /* ===================================================== 02. إصلاحات التصنيفات والبنر على الجوال ===================================================== */ function markCategoryTitleBanner() { if (!CONFIG.mobileCategories.enabled) return null; var link = document.querySelector( 'section.s-block--fixed-banner a.banner--fixed[href*="' + CONFIG.mobileCategories.titleBannerLink + '"]' ); if (!link) { link = document.querySelector( '[data-testid="store-home-fixed-banner"] a[href*="' + CONFIG.mobileCategories.titleBannerLink + '"]' ); } if (!link) return null; var section = link.closest("section"); if (!section) return null; section.classList.add("roofi-category-title-banner"); return section; } function markCategoryCards(titleSection) { if (!CONFIG.mobileCategories.enabled || !titleSection) return; var candidates = document.querySelectorAll( '[data-testid="store-home-square-banners"], section.s-block--banners' ); for (var i = 0; i < candidates.length; i++) { var candidate = candidates[i]; var position = titleSection.compareDocumentPosition(candidate); if (position & Node.DOCUMENT_POSITION_FOLLOWING) { candidate.classList.add("roofi-category-cards-fix"); break; } } } function getMenuLinks() { var header = document.querySelector('[data-testid="store-header"]'); if (!header) return []; var menu = header.querySelector("custom-main-menu"); var anchors = []; if (menu) { var lightLinks = menu.querySelectorAll("a[href]"); anchors = anchors.concat(Array.prototype.slice.call(lightLinks)); } if (menu && menu.shadowRoot) { var shadowLinks = menu.shadowRoot.querySelectorAll("a[href]"); anchors = anchors.concat(Array.prototype.slice.call(shadowLinks)); } if (!anchors.length) { anchors = Array.prototype.slice.call(header.querySelectorAll("a[href]")); } return anchors; } function isUsefulMenuLink(anchor) { if (!anchor) return false; var text = cleanText(anchor.textContent); var href = anchor.getAttribute("href") || ""; if (!text || !href) return false; if (href === "#" || href.indexOf("javascript:") === 0) return false; var blockedTexts = [ "تسجيل الدخول", "حسابي", "السلة", "بحث", "تواصل", "سياسة", "الخصوصية", "الاسترجاع", "الشحن", "واتساب" ]; var normalized = normalizeArabic(text); for (var i = 0; i < blockedTexts.length; i++) { if (normalized.indexOf(normalizeArabic(blockedTexts[i])) !== -1) { return false; } } return true; } function getPreferredLinks() { var anchors = getMenuLinks(); var useful = []; var addedHrefs = {}; for (var i = 0; i < anchors.length; i++) { var anchor = anchors[i]; if (!isUsefulMenuLink(anchor)) continue; var href = anchor.href; if (addedHrefs[href]) continue; addedHrefs[href] = true; useful.push({ text: cleanText(anchor.textContent), href: href }); } var preferredNames = [ "الرئيسية", "جميع العبايات", "عبايات عملية", "عبايات رسمية", "عبايات صيفية", "وصل حديثا", "الاكثر مبيعا" ]; var preferred = []; preferredNames.forEach(function (wanted) { var normalizedWanted = normalizeArabic(wanted); for (var i = 0; i < useful.length; i++) { if ( normalizeArabic(useful[i].text).indexOf(normalizedWanted) !== -1 ) { if (preferred.indexOf(useful[i]) === -1) { preferred.push(useful[i]); } break; } } }); if (preferred.length >= 2) { return preferred.slice(0, CONFIG.mobileCategories.maxMobileLinks); } return useful.slice(0, CONFIG.mobileCategories.maxMobileLinks); } function createMobileCategoriesBar() { if (!CONFIG.mobileCategories.enabled) return; if (document.querySelector(".roofi-mobile-categories")) return; var mainNav = document.querySelector( '[data-testid="store-header"] #mainnav' ); if (!mainNav) return; var links = getPreferredLinks(); if (!links.length) return; var nav = document.createElement("nav"); nav.className = "roofi-mobile-categories"; nav.setAttribute("aria-label", "تصنيفات المتجر"); for (var i = 0; i < links.length; i++) { var item = document.createElement("a"); item.href = links[i].href; item.textContent = links[i].text; nav.appendChild(item); } mainNav.insertAdjacentElement("afterend", nav); } function runMobileCategoryFixes() { if (!CONFIG.mobileCategories.enabled) return; var categoryTitle = markCategoryTitleBanner(); markCategoryCards(categoryTitle); createMobileCategoriesBar(); } /* ===================================================== 03. إصلاح عناوين أقسام المنتجات عند ظهور 000 النسخة الأحدث المعتمدة ===================================================== */ var titleRepairRunning = false; var titleRepairTimer = null; var titleObserverStarted = false; function isBrokenProductTitle(value) { var text = cleanText(value).replace(/\s/g, ""); return (!text || /^0+$/.test(text) || text === "٠٠٠"); } function isGenericProductTitle(value) { var text = cleanText(value); if (!text) return true; var blocked = [ "عرض الكل", "عرض الجميع", "المزيد", "تسوق الآن", "تسوقي الآن", "000", "٠٠٠" ]; return blocked.indexOf(text) !== -1; } function getProductHeading(slider) { if (!slider) return null; var selectors = [ ".s-slider-block__title-right h2", ".s-slider-block__title h2", ".s-slider-block__title-nav h2" ]; for (var i = 0; i < selectors.length; i++) { var heading = slider.querySelector(selectors[i]); if (heading) return heading; } if (slider.shadowRoot) { for (var x = 0; x < selectors.length; x++) { var shadowHeading = slider.shadowRoot.querySelector(selectors[x]); if (shadowHeading) return shadowHeading; } } return null; } function getSliderURL(slider) { if (!slider) return ""; var possibleLinks = slider.querySelectorAll( ".s-slider-block__title-left a[href], " + ".s-slider-block__title a[href], " + "a[href*='/category/'], " + "a[href*='/tag-']" ); for (var i = 0; i < possibleLinks.length; i++) { var href = possibleLinks[i].getAttribute("href"); if (href) return href; } var attributes = slider.attributes; for (var x = 0; x < attributes.length; x++) { var value = attributes[x].value || ""; if ( value.indexOf("/category/") !== -1 || value.indexOf("/tag-") !== -1 ) { return value; } } var candidates = [ "source", "display-all-url", "url", "href", "link" ]; for (var y = 0; y < candidates.length; y++) { var attributeValue = slider.getAttribute(candidates[y]); if (attributeValue) return attributeValue; } return ""; } function normalizeStoreURL(url) { if (!url) return ""; try { var parsed = new URL(url, window.location.origin); return ( window.location.origin + parsed.pathname + parsed.search ); } catch (error) { return ""; } } function findTitleFromExistingLinks(url) { if (!url) return ""; var target; try { target = new URL(url, location.origin).pathname; } catch (error) { return ""; } var links = document.querySelectorAll("a[href]"); for (var i = 0; i < links.length; i++) { var link = links[i]; var href = link.getAttribute("href"); if (!href) continue; var path; try { path = new URL(href, location.origin).pathname; } catch (error) { continue; } if (path !== target) continue; var text = cleanText(link.textContent); if ( text && !isGenericProductTitle(text) && !isBrokenProductTitle(text) ) { return text; } } return ""; } function cleanPageTitle(text) { text = cleanText(text); if (!text) return ""; if (text.indexOf("|") !== -1) { text = text.split("|")[0].trim(); } text = text.replace(/\s*-\s*عبايات روفي.*$/i, ""); return cleanText(text); } async function fetchCategoryTitle(url) { url = normalizeStoreURL(url); if (!url) return ""; var cacheKey = CONFIG.productTitles.cachePrefix + encodeURIComponent(url); try { var cached = sessionStorage.getItem(cacheKey); if (cached && !isBrokenProductTitle(cached)) { return cached; } } catch (error) {} try { var response = await fetch(url, { method: "GET", credentials: "same-origin" }); if (!response.ok) return ""; var html = await response.text(); var parser = new DOMParser(); var page = parser.parseFromString(html, "text/html"); var title = ""; var h1 = page.querySelector("h1"); if (h1) { title = cleanText(h1.textContent); } if (!title || isBrokenProductTitle(title)) { var og = page.querySelector('meta[property="og:title"]'); if (og) { title = cleanPageTitle(og.getAttribute("content")); } } if (!title || isBrokenProductTitle(title)) { title = cleanPageTitle(page.title); } if ( title && !isGenericProductTitle(title) && !isBrokenProductTitle(title) ) { try { sessionStorage.setItem(cacheKey, title); } catch (error) {} return title; } } catch (error) { console.warn("Roofi title fetch failed:", error); } return ""; } function applyProductTitle(slider, heading, title) { title = cleanText(title); if ( !title || isBrokenProductTitle(title) || isGenericProductTitle(title) ) { return false; } heading.textContent = title; slider.setAttribute("block-title", title); try { if ("blockTitle" in slider) { slider.blockTitle = title; } } catch (error) {} slider.dataset.roofiCorrectTitle = title; return true; } async function repairProductSliderTitle(slider) { if (!slider) return; var heading = getProductHeading(slider); if (!heading) return; if (!isBrokenProductTitle(heading.textContent)) { slider.dataset.roofiCorrectTitle = cleanText(heading.textContent); return; } var saved = slider.dataset.roofiCorrectTitle; if (saved && !isBrokenProductTitle(saved)) { applyProductTitle(slider, heading, saved); return; } var attributeTitle = slider.getAttribute("block-title"); if ( attributeTitle && !isBrokenProductTitle(attributeTitle) ) { applyProductTitle(slider, heading, attributeTitle); return; } var url = getSliderURL(slider); if (!url) { console.warn("Roofi: category URL not found", slider); return; } var localTitle = findTitleFromExistingLinks(url); if (localTitle) { applyProductTitle(slider, heading, localTitle); return; } var fetchedTitle = await fetchCategoryTitle(url); if (fetchedTitle) { applyProductTitle(slider, heading, fetchedTitle); } } async function repairAllProductTitles() { if ( !CONFIG.productTitles.enabled || titleRepairRunning ) { return; } titleRepairRunning = true; try { var sliders = document.querySelectorAll( "salla-products-slider" ); for (var i = 0; i < sliders.length; i++) { await repairProductSliderTitle(sliders[i]); } } finally { titleRepairRunning = false; } } function scheduleProductTitleRepair() { clearTimeout(titleRepairTimer); titleRepairTimer = setTimeout( repairAllProductTitles, 120 ); } function startProductTitleObserver() { if ( !CONFIG.productTitles.enabled || titleObserverStarted || !document.body ) { return; } titleObserverStarted = true; var observer = new MutationObserver(function (mutations) { for (var i = 0; i < mutations.length; i++) { var target = mutations[i].target; var element = target.nodeType === 1 ? target : target.parentElement; if ( element && ( ( element.closest && element.closest("salla-products-slider") ) || ( element.matches && element.matches("salla-products-slider") ) ) ) { scheduleProductTitleRepair(); return; } } }); observer.observe(document.body, { childList: true, subtree: true, characterData: true }); } /* ===================================================== 04. التشغيل الموحد ===================================================== */ function runRoofiCustomizations() { createNationalDayOffer(); runMobileCategoryFixes(); repairAllProductTitles(); startProductTitleObserver(); } onDomReady(function () { runRoofiCustomizations(); setTimeout(runMobileCategoryFixes, 500); setTimeout(runMobileCategoryFixes, 1300); setTimeout(scheduleProductTitleRepair, 500); setTimeout(scheduleProductTitleRepair, 1200); setTimeout(scheduleProductTitleRepair, 2500); }); if ( window.Salla && typeof Salla.onReady === "function" ) { Salla.onReady(function () { runRoofiCustomizations(); }); } })(); /* ===================================================== ROOFI - NATIONAL DAY MOVING TOP BAR ===================================================== */ (function () { "use strict"; function createRoofiTopTicker() { /* منع التكرار */ if ( document.getElementById( "roofi-top-ticker" ) ) { return; } var header = document.querySelector( '[data-testid="store-header"]' ); if (!header) { return; } /* الحاوية */ var ticker = document.createElement("div"); ticker.id = "roofi-top-ticker"; ticker.setAttribute( "aria-label", "عروض وخدمات روفي" ); /* المسار */ var track = document.createElement("div"); track.className = "roofi-ticker-track"; /* إنشاء مجموعة */ function createGroup(hidden) { var group = document.createElement("div"); group.className = "roofi-ticker-group"; if (hidden) { group.setAttribute( "aria-hidden", "true" ); } /* ============================== رسالة 1 ============================== */ var item1 = document.createElement("div"); item1.className = "roofi-ticker-item"; item1.innerHTML = 'انتهز أفضل العروض والأسعار'; /* الفاصل */ var separator1 = document.createElement("span"); separator1.className = "roofi-ticker-separator"; /* ============================== رسالة 2 ============================== */ var item2 = document.createElement("div"); item2.className = "roofi-ticker-item"; item2.innerHTML = 'مع خدمات تفصيل حسب الطلب'; /* الفاصل */ var separator2 = document.createElement("span"); separator2.className = "roofi-ticker-separator"; /* ============================== رسالة 3 ============================== */ var item3 = document.createElement("div"); item3.className = "roofi-ticker-item"; item3.textContent = "عبايات روفي"; /* الفاصل الأخير */ var separator3 = document.createElement("span"); separator3.className = "roofi-ticker-separator"; group.appendChild(item1); group.appendChild(separator1); group.appendChild(item2); group.appendChild(separator2); group.appendChild(item3); group.appendChild(separator3); return group; } /* * مجموعتان متطابقتان * للحصول على Loop بدون أي قطع أو قفزة */ track.appendChild( createGroup(false) ); track.appendChild( createGroup(true) ); ticker.appendChild(track); /* * وضع الشريط فوق الهيدر مباشرة */ header.parentNode.insertBefore( ticker, header ); } /* تشغيل عادي */ if ( document.readyState === "loading" ) { document.addEventListener( "DOMContentLoaded", createRoofiTopTicker, { once: true } ); } else { createRoofiTopTicker(); } /* دعم Salla */ if ( window.Salla && typeof Salla.onReady === "function" ) { Salla.onReady(function () { createRoofiTopTicker(); }); } })(); /* ========================================================= ROOFI — PRODUCT GALLERY ANTI-FLASH ONLY إصلاح معزول لمعرض صور صفحة المنتج فقط ========================================================= */ (function () { "use strict"; var GALLERY_SELECTOR = 'salla-slider[data-testid="store-product-image-slider"]'; var pageObserver = null; var stopObserverTimer = null; function getMainImage(slider) { if (!slider) { return null; } return ( slider.querySelector('div[slot="items"] img') || slider.querySelector("img") || null ); } function waitForImage(image) { return new Promise(function (resolve) { if (!image) { resolve(); return; } if ( image.complete && image.naturalWidth > 0 ) { if ( typeof image.decode === "function" ) { image.decode() .catch(function () {}) .then(resolve); } else { resolve(); } return; } var finished = false; function finish() { if (finished) { return; } finished = true; resolve(); } image.addEventListener( "load", finish, { once: true } ); image.addEventListener( "error", finish, { once: true } ); setTimeout( finish, 1400 ); }); } function bindGallery(slider) { if (!slider) { return; } if ( slider.dataset .roofiAntiFlashBound === "1" ) { return; } slider.dataset .roofiAntiFlashBound = "1"; var revealed = false; var revealTimer = null; var galleryObserver = null; var shadowObserver = null; function revealGallery() { if (revealed) { return; } var image = getMainImage(slider); waitForImage(image) .then(function () { if (revealed) { return; } requestAnimationFrame( function () { requestAnimationFrame( function () { if (revealed) { return; } revealed = true; slider.classList.add( "roofi-gallery-ready" ); if ( galleryObserver ) { galleryObserver .disconnect(); } if ( shadowObserver ) { shadowObserver .disconnect(); } } ); } ); }); } function scheduleReveal(delay) { if (revealed) { return; } clearTimeout( revealTimer ); revealTimer = setTimeout( revealGallery, typeof delay === "number" ? delay : 220 ); } slider.addEventListener( "afterInit", function () { scheduleReveal(220); }, { once: true } ); galleryObserver = new MutationObserver( function () { scheduleReveal(220); } ); try { galleryObserver.observe( slider, { childList: true, subtree: true } ); } catch (error) {} if (slider.shadowRoot) { shadowObserver = new MutationObserver( function () { scheduleReveal(220); } ); try { shadowObserver.observe( slider.shadowRoot, { childList: true, subtree: true } ); } catch (error) {} } scheduleReveal(500); setTimeout( revealGallery, 1800 ); } function findAndBindGallery() { var slider = document.querySelector( GALLERY_SELECTOR ); if (!slider) { return false; } bindGallery(slider); return true; } function startAntiFlash() { if ( findAndBindGallery() ) { return; } if ( !document.body || pageObserver ) { return; } pageObserver = new MutationObserver( function (mutations) { for ( var i = 0; i < mutations.length; i++ ) { var addedNodes = mutations[i] .addedNodes; for ( var j = 0; j < addedNodes.length; j++ ) { var node = addedNodes[j]; if ( !node || node.nodeType !== 1 ) { continue; } var slider = null; if ( node.matches && node.matches( GALLERY_SELECTOR ) ) { slider = node; } else if ( node.querySelector ) { slider = node.querySelector( GALLERY_SELECTOR ); } if (slider) { bindGallery( slider ); if ( pageObserver ) { pageObserver .disconnect(); pageObserver = null; } clearTimeout( stopObserverTimer ); return; } } } } ); pageObserver.observe( document.body, { childList: true, subtree: true } ); stopObserverTimer = setTimeout( function () { if ( pageObserver ) { pageObserver .disconnect(); pageObserver = null; } }, 5000 ); } if ( document.readyState === "loading" ) { document.addEventListener( "DOMContentLoaded", startAntiFlash, { once: true } ); } else { startAntiFlash(); } if ( window.Salla && typeof Salla.onReady === "function" ) { Salla.onReady( function () { findAndBindGallery(); } ); } })(); /* ========================================================= ROOFI - CONTACT PAYMENT METHODS V2 - يأخذ وسائل الدفع تلقائيًا من Salla - يعرض اللوجوهات في صف أفقي - لا يعدل salla-payments الأصلي - لا يؤثر على أي جزء آخر في الموقع ========================================================= */ (function () { "use strict"; const BLOCK_ID = "roofi-contact-payments"; const OLD_BLOCK_ID = "roofi-footer-payments"; /* ===================================================== Helpers ===================================================== */ function cleanText(text) { return (text || "") .replace(/\s+/g, " ") .trim(); } function getFooter() { return ( document.querySelector("footer") || document.querySelector("[data-testid='store-footer']") || document.querySelector(".store-footer") ); } /* ===================================================== حذف نسخ الدفع القديمة الخاصة بنا فقط ===================================================== */ function cleanupOldBlocks() { const oldBlock = document.getElementById(OLD_BLOCK_ID); if (oldBlock) { oldBlock.remove(); } /* * لا نحذف النسخة الجديدة لو كانت موجودة. */ } /* ===================================================== العثور على "تواصل معنا" ===================================================== */ function findContactTitle(footer) { const elements = footer.querySelectorAll( "h2,h3,h4,h5,h6,p,span,strong,div" ); for (const element of elements) { const text = cleanText(element.textContent); if ( text === "تواصل معنا" || text === "تواصل معنا:" ) { return element; } } return null; } /* ===================================================== تحديد عمود تواصل معنا ===================================================== */ function findContactColumn( footer, contactTitle ) { let node = contactTitle.parentElement; while ( node && node !== footer ) { const text = cleanText(node.textContent); const contactLinks = node.querySelectorAll( 'a[href^="tel:"],' + 'a[href^="mailto:"],' + 'a[href*="whatsapp"],' + 'a[href*="wa.me"]' ); if ( text.includes("تواصل معنا") && ( contactLinks.length > 0 || text.includes("+966") || /05\d{7,}/.test(text) ) ) { return node; } node = node.parentElement; } return null; } /* ===================================================== استخراج صور وسائل الدفع سواء كانت داخل Shadow DOM أو DOM عادي ===================================================== */ function getPaymentImages(source) { const result = []; const roots = [ source ]; if (source.shadowRoot) { roots.push( source.shadowRoot ); } roots.forEach(function (root) { const images = root.querySelectorAll( "img" ); images.forEach(function (img) { const src = img.currentSrc || img.src || img.getAttribute("src"); if (!src) { return; } /* * منع تكرار نفس اللوجو */ const exists = result.some(function (item) { return item.src === src; }); if (!exists) { result.push({ src: src, alt: img.alt || img.getAttribute("aria-label") || "وسيلة دفع" }); } }); }); return result; } /* ===================================================== رسم اللوجوهات في صفنا الخاص ===================================================== */ function renderLogos( wrapper, images ) { const logosContainer = wrapper.querySelector( ".roofi-payments-logos" ); const loading = wrapper.querySelector( ".roofi-payments-loading" ); if ( !logosContainer || images.length === 0 ) { return false; } logosContainer.innerHTML = ""; images.forEach(function (payment) { const logoBox = document.createElement("div"); logoBox.className = "roofi-payment-logo"; const image = document.createElement("img"); image.src = payment.src; image.alt = payment.alt; image.loading = "lazy"; image.decoding = "async"; logoBox.appendChild( image ); logosContainer.appendChild( logoBox ); }); if (loading) { loading.remove(); } return true; } /* ===================================================== جلب وسائل الدفع من Salla ===================================================== */ function loadSallaPayments( wrapper ) { const source = wrapper.querySelector( ".roofi-salla-payment-source" ); if (!source) { return; } let tries = 0; const timer = setInterval(function () { tries++; const images = getPaymentImages( source ); if ( images.length > 0 ) { renderLogos( wrapper, images ); clearInterval( timer ); /* * بعد أخذ الصور * لا نحتاج المكون المخفي */ setTimeout(function () { if ( source && source.parentNode ) { source.remove(); } }, 500); return; } /* * توقف بعد حوالي 6 ثوانٍ */ if ( tries >= 30 ) { clearInterval( timer ); } }, 200); } /* ===================================================== إنشاء البلوك ===================================================== */ function createPaymentBlock() { cleanupOldBlocks(); if ( document.getElementById( BLOCK_ID ) ) { return true; } const footer = getFooter(); if (!footer) { return false; } const contactTitle = findContactTitle( footer ); if (!contactTitle) { return false; } const contactColumn = findContactColumn( footer, contactTitle ); /* * لو مش متأكدين من العمود * لا نضيف حاجة في أي مكان عشوائي */ if (!contactColumn) { return false; } const wrapper = document.createElement( "div" ); wrapper.id = BLOCK_ID; wrapper.setAttribute( "aria-label", "وسائل الدفع" ); wrapper.innerHTML = `
وسائل الدفع
جاري تحميل وسائل الدفع...
`; contactColumn.appendChild( wrapper ); loadSallaPayments( wrapper ); return true; } /* ===================================================== تشغيل ===================================================== */ function boot() { cleanupOldBlocks(); if ( createPaymentBlock() ) { return; } /* * بعض عناصر Salla تظهر بعد تحميل الصفحة */ let attempts = 0; const timer = setInterval(function () { attempts++; if ( createPaymentBlock() || attempts >= 20 ) { clearInterval( timer ); } }, 300); } if ( document.readyState === "loading" ) { document.addEventListener( "DOMContentLoaded", boot, { once: true } ); } else { boot(); } })(); /* ROOFI FIGMA REFRESH — native store components and accessible FAQ */ (function(){'use strict'; function refresh(){ var header=document.querySelector('.store-header'),search=header&&header.querySelector('.header-search'),row=header&&header.querySelector('#mainnav .inner>.container>.flex'); if(search&&row){var marker=document.getElementById('roofi-search-origin');if(!marker){marker=document.createElement('span');marker.id='roofi-search-origin';search.before(marker)}function arrangeSearch(){if(matchMedia('(min-width:1024px)').matches){search.classList.add('roofi-desktop-search');row.insertBefore(search,row.lastElementChild)}else{search.classList.remove('roofi-desktop-search');marker.after(search)}}arrangeSearch();matchMedia('(min-width:1024px)').addEventListener('change',arrangeSearch)} var footer=document.querySelector('.store-footer__inner'),logo=document.querySelector('.navbar-brand img');if(footer&&logo&&!footer.querySelector('.roofi-footer-logo')){var fl=logo.cloneNode(true);fl.className='roofi-footer-logo';fl.removeAttribute('fetchpriority');fl.loading='lazy';footer.querySelector('.container>div').prepend(fl)} var main=document.querySelector('main'),home=main&&main.querySelector('[component-id="119397425"]'); if(home&&!document.getElementById('roofi-faq')){var faq=document.createElement('section');faq.id='roofi-faq';faq.className='roofi-faq';faq.setAttribute('aria-labelledby','roofi-faq-title');faq.innerHTML='

الأسئلة الشائعة

كم يستغرق تنفيذ الطلب؟

تجهيز الطلب من 3 إلى 5 أيام، وقد يصل إلى 10 أيام بحسب ضغط الطلبات. يستغرق الشحن داخل المملكة من يومين إلى 3 أيام بعد تسليم الطلب لشركة الشحن. تتحمل العميلة رسوم الشحن وفق أسعار شركات الشحن المعتمدة. تفاصيل الشحن والتوصيل

كيف أعرف المقاس المناسب؟

راجعي جدول المقاسات وقارني القياسات قبل اختيار العباية. ويسعد فريق خدمة العملاء بمساعدتك إذا احتجتِ إلى توضيح.

كيف أتواصل معكم لو عندي استفسار؟

يسعدنا مساعدتك عبر واتساب خدمة العملاء أو بالاتصال على +966 53 585 9974.

';main.appendChild(faq)} var bannerNames={'119397425':'فخامة تتحدث بهدوء — عبايات روفي العملية','1467012750':'عبايات لكل الأوقات — اكتشفي تشكيلة روفي','909029349':'قسّطيها على أربع دفعات مع تابي أو تمارا','1813328312':'حضور يلفت الأنظار من اللحظة الأولى'};Object.keys(bannerNames).forEach(function(id){var section=document.querySelector('section[component-id="'+id+'"]');if(section){var im=section.querySelector('img'),a=section.querySelector('a');if(im)im.alt=bannerNames[id];if(a)a.setAttribute('aria-label',bannerNames[id])}}); var wa=document.querySelector('a[aria-label="Chat via WhatsApp"]');if(wa&&wa.href.indexOf('wa.me/535859974')!==-1)wa.href='https://wa.me/966535859974'; } if(document.readyState==='loading')document.addEventListener('DOMContentLoaded',refresh,{once:true});else refresh(); })(); (function(){function finish(){var logo=document.querySelector('.navbar-brand');if(logo&&!document.querySelector('.roofi-desktop-links')){var nav=document.createElement('nav');nav.className='roofi-desktop-links';nav.setAttribute('aria-label','تصنيفات العبايات');nav.innerHTML='عبايات عمليةعبايات رسميةعبايات صيفية';logo.parentElement.appendChild(nav)}var top=document.querySelector('.top-navbar .container');if(top&&!top.querySelector('.roofi-header-contact')){var a=document.createElement('a');a.href='tel:+966535859974';a.className='roofi-header-contact';a.textContent='+966 53 585 9974';top.appendChild(a)}var checks=0;var timer=setInterval(function(){var wa=document.querySelector('a[aria-label="Chat via WhatsApp"]');if(wa&&wa.href.indexOf('wa.me/535859974')!==-1){wa.href='https://wa.me/966535859974';clearInterval(timer)}if(++checks>=20)clearInterval(timer)},500)}if(document.readyState==='loading')document.addEventListener('DOMContentLoaded',finish,{once:true});else finish()})(); /* ROOFI visitor-audit improvements — 2026-09-29 */ (function(){'use strict'; var summaries={'437421581':'كريب ملكي كوري • قَصّة نصف كلوش','1498748820':'قَصّة نصف كلوش • تفاصيل دانتيل','1592376788':'قماش تيك توك • طرحة بنفس اللون','1430477265':'قماش خفيف • كسرة خلفية مميزة','331535208':'خامة كورية • تفاصيل منقطة','449816620':'خامة كورية • تداخلات متموجة','319423384':'قَصّة نصف كلوش • دانتيل جانبي','1451929780':'خامة كورية باردة • تداخلات رمادية','623473291':'ياقة بليزر • أكمام مقلمة','1605965355':'قماش زوم بارد • ألوان هادئة','90348312':'قماش تيك توك • طرحة متناسقة','715625488':'عباية رأس • خيارات تفصيل','545492281':'قماش ملكي فيتنامي • تطريز زهري','1872183518':'كريب ملكي فيتنامي • دانتيل','1240923370':'كريب ملكي • كُلفة دانتيل عريضة','184705437':'قماش ملكي فيتنامي • زرّان أماميان','95194681':'قماش ملكي فيتنامي • قيطان رمادي'}; function fixName(s){return s.replace(/عبايه/g,'عباية').replace(/عباية اصايل/g,'عباية أصايل').replace(/عباية اثير/g,'عباية أثير');} function el(tag,cls,text){var n=document.createElement(tag);if(cls)n.className=cls;if(text)n.textContent=text;return n;} function help(text){var n=el('div','roofi-help-note');n.append(document.createTextNode(text+' '));var a=el('a','','تواصلي معنا');a.href='https://wa.me/966535859974';a.target='_blank';a.rel='noopener';n.append(a);return n;} function bindReviewSlider(grid){ if(grid.dataset.sliderBound)return;grid.dataset.sliderBound='1';grid.dir='rtl';grid.tabIndex=0;grid.setAttribute('role','region');grid.setAttribute('aria-label','آراء العميلات — تتحرك تلقائيًا ويمكن سحبها'); var dragging=false,startX=0,startScroll=0,position=Math.abs(grid.scrollLeft),direction=1,last=0,pauseUntil=0,visible=true,hover=false; function pause(){pauseUntil=performance.now()+2200;position=Math.abs(grid.scrollLeft);} grid.addEventListener('pointerdown',function(e){pause();if(e.pointerType!=='mouse'||e.button!==0)return;dragging=true;startX=e.clientX;startScroll=grid.scrollLeft;grid.setPointerCapture(e.pointerId);grid.classList.add('roofi-review-dragging');}); grid.addEventListener('pointermove',function(e){if(dragging){e.preventDefault();grid.scrollLeft=startScroll-(e.clientX-startX);pause();}}); function finish(){dragging=false;grid.classList.remove('roofi-review-dragging');pause();}grid.addEventListener('pointerup',finish);grid.addEventListener('pointercancel',finish);grid.addEventListener('dragstart',function(e){e.preventDefault();}); grid.addEventListener('touchstart',pause,{passive:true});grid.addEventListener('touchmove',pause,{passive:true});grid.addEventListener('touchend',pause,{passive:true});grid.addEventListener('wheel',pause,{passive:true}); grid.addEventListener('mouseenter',function(){hover=true;});grid.addEventListener('mouseleave',function(){hover=false;pause();}); grid.addEventListener('keydown',function(e){if(e.key==='ArrowLeft'||e.key==='ArrowRight'){e.preventDefault();grid.scrollLeft+=(e.key==='ArrowLeft'?-1:1)*250;pause();}}); if('IntersectionObserver' in window)new IntersectionObserver(function(entries){visible=entries[0].isIntersecting;last=0;},{threshold:.1}).observe(grid); function frame(now){var dt=last?Math.min((now-last)/1000,.05):0;last=now;var max=grid.scrollWidth-grid.clientWidth; if(visible&&!document.hidden&&!dragging&&!hover&&now>pauseUntil&&max>2){position=Math.min(max,Math.max(0,position));var edge=direction>0?max-position:position;var speed=8+16*Math.min(1,edge/90);position+=direction*speed*dt;if(position>=max){position=max;direction=-1;}else if(position<=0){position=0;direction=1;}grid.scrollLeft=-position;}else position=Math.abs(grid.scrollLeft); if(grid.isConnected)requestAnimationFrame(frame);} requestAnimationFrame(frame); } function improve(){ document.querySelectorAll('.s-product-card-content-title a,[data-testid="store-product-title"]').forEach(function(n){var t=fixName(n.textContent);if(n.textContent!==t)n.textContent=t;}); document.querySelectorAll('.s-product-card-entry').forEach(function(card){var a=card.querySelector('.s-product-card-content-title a');if(!a)return;var m=a.href.match(/p(\d+)/);if(!m)return;var id=m[1],p=card.querySelector('.s-product-card-content-subtitle');if(!p)p=card.querySelector('.s-product-card-content-main p');if(summaries[id]&&p&&p.textContent!==summaries[id])p.textContent=summaries[id];if(id==='2035111488'&&!card.querySelector('.roofi-booking-label')){a.textContent='حجز تفصيل عباية';card.querySelector('.s-product-card-content-sub').append(el('span','roofi-booking-label','100 ريال حجز تُخصم من السعر النهائي'));}}); var nav=document.querySelector('.roofi-desktop-links');if(nav&&!nav.querySelector('[data-roofi-tailoring]')){var a=el('a','','تفصيل حسب الطلب');a.href='https://roofiabaya.com/تفصيل-عباية-حسب-الطلب/p2035111488';a.dataset.roofiTailoring='1';nav.append(a);} var hero=document.querySelector('[component-id="119397425"]');if(hero&&!hero.querySelector('.roofi-banner-caption')){var cap=el('div','roofi-banner-caption');cap.append(el('p','','فخامة تتحدث بهدوء؛ عبايات عملية بتفاصيل تناسب يومكِ.'));var link=el('a','roofi-shop-link','تسوّقي العبايات العملية');link.href=hero.querySelector('a').href;cap.append(link);hero.append(cap);} [['1467012750','عبايات لكل الأوقات؛ اختاري الإطلالة الأقرب لكِ.','اكتشفي التشكيلة'],['1813328312','حضور يلفت الأنظار من اللحظة الأولى.','تسوّقي عبايات روفي']].forEach(function(data){var sec=document.querySelector('[component-id="'+data[0]+'"]');if(sec&&!sec.querySelector('.roofi-banner-caption')){var cap=el('div','roofi-banner-caption');cap.append(el('p','',''+data[1]));var a=el('a','roofi-shop-link',data[2]);a.href=sec.querySelector('a').href;cap.append(a);sec.append(cap);}}); document.querySelectorAll('.s-reviews-container').forEach(function(section){var slides=section.querySelectorAll('.s-reviews-testimonial'),valid=[],seen=new Set();slides.forEach(function(c){var p=c.querySelector('.s-reviews-testimonial__text p');if(!p||!p.textContent.trim())return;var name=c.querySelector('h2')?.textContent.trim()||'',key=name+'|'+p.textContent.trim();if(!seen.has(key)){seen.add(key);valid.push(c);}});if(!valid.length)return;var sig=[...seen].join('~'),grid=section.querySelector('.roofi-approved-reviews');if(grid&&grid.dataset.signature===sig)return;if(!grid){grid=el('div','roofi-approved-reviews');section.append(grid);}grid.replaceChildren();valid.forEach(function(c){grid.append(c.cloneNode(true));});grid.dataset.signature=sig;bindReviewSlider(grid);section.classList.add('roofi-reviews-clean');var title=section.querySelector('h1.s-reviews-header');if(title){var h=el('h2',title.className,title.textContent);title.replaceWith(h);}}); if(document.body.classList.contains('product-single')){ var form=document.querySelector('form.product-form'),desc=document.querySelector('.product__description'),title=document.querySelector('[data-testid="store-product-title"]'),price=document.querySelector('[data-testid="store-product-price"]'); if(form&&desc&&!desc.closest('.roofi-description-details')){var details=el('details','roofi-description-details');details.append(el('summary','','تفاصيل العباية ومواصفاتها'));form.after(details);details.append(desc);} var id=(location.pathname.match(/p(\d+)/)||[])[1],subtitle=document.querySelector('.product-entry__sub-title');if(subtitle&&summaries[id]&&subtitle.textContent!==summaries[id])subtitle.textContent=summaries[id]; if(price&&!document.querySelector('.roofi-delivery-note')){var note=help('تجهيز الطلب: 3–5 أيام، وقد يصل إلى 10 أيام بحسب ضغط الطلبات. الشحن داخل المملكة: 2–3 أيام بعد التجهيز، وتتحمل العميلة رسومه حسب شركة الشحن. للاستفسار،');note.classList.add('roofi-delivery-note');price.after(note);} if(id==='2035111488'&&price&&!document.querySelector('.roofi-reservation-note')){var n=el('div','roofi-help-note roofi-reservation-note','100 ريال مبلغ حجز يُخصم من القيمة النهائية بعد اعتماد التصميم والسعر. يُعاد المبلغ في حال عدم الاتفاق، أو عند إلغاء الطلب خلال 24 ساعة من إتمامه. يمكن طلب التعديل أو الإلغاء خلال المدة نفسها بالتواصل مع خدمة العملاء.');price.after(n);} var options=document.querySelector('salla-product-options');if(options&&!document.querySelector('.roofi-size-advice')){var note=help('دليل المقاسات الحالي يغطي 50–60. للمقاسين 48 و62 أو المقاسات الخاصة، أكّدي القياسات مع فريقنا قبل الطلب.');note.classList.add('roofi-size-advice');options.after(note);} var bar=document.querySelector('.sticky-product-bar'),qty=bar?.querySelector('.sticky-product-bar__quantity');if(bar&&qty){var q=el('section','roofi-quantity-panel');q.append(qty);bar.before(q);} var add=document.querySelector('.sticky-product-bar salla-add-product-button');if(bar&&add){var sp=bar.querySelector('.roofi-sticky-price');if(!sp){sp=el('div','roofi-sticky-price');bar.prepend(sp);}var live=form.querySelector('.total-price'),amount=live?live.textContent.trim():add.getAttribute('amount');if(amount&&sp.textContent!=='السعر: '+amount+' ر.س')sp.textContent='السعر: '+amount+' ر.س';} } if(document.body.classList.contains('page-single')){var content=document.querySelector('.content-entry');if(content){content.querySelectorAll('h1').forEach(function(n){var h=el('h2',n.className,n.textContent);h.style.cssText=n.style.cssText;n.replaceWith(h);});content.querySelectorAll('[style]').forEach(function(n){['color','backgroundColor','borderColor'].forEach(function(prop){var v=n.style[prop];if(v&&/rgb\(\s*(7, 63, 49|11, 64, 49|12, 65, 50)\)/.test(v))n.style[prop]='#4f1428';});});}if(location.pathname.includes('page-1207010914')&&!document.querySelector('.roofi-size-advice')){var note=help('المقاسان 48 و62 والمقاسات الخاصة غير موضحة في الجدول الحالي. أكّدي قياساتها مع فريقنا قبل اعتماد الطلب.');note.classList.add('roofi-size-advice');document.querySelector('.roofi-size-intro')?.after(note);}} var feature=document.querySelector('[component-id="1406705653"]');if(feature){feature.querySelectorAll('h2').forEach(function(h){if(h.textContent.trim()==='شحن سريع'){h.textContent='توصيل داخل المملكة';var p=h.nextElementSibling;if(p)p.textContent='تابعي طلبك وتواصلي معنا لمعرفة موعد وصوله';}if(h.textContent.trim()==='خدمة العملاء'){var p=h.nextElementSibling;if(p)p.textContent='نساعدك في اختيار المقاس وتفاصيل الطلب';}});} var category=document.body.classList.contains('product-index')||document.body.classList.contains('category');if(!document.body.classList.contains('product-single')&&/\/c\d+|\/category\//.test(location.pathname)){var heading=document.querySelector('main h1'),crumbs=document.querySelectorAll('.s-breadcrumb-item'),name=crumbs[crumbs.length-1]?.textContent.trim();if(heading&&name&&!document.querySelector('.roofi-category-title')){var h=el('h1','roofi-category-title',name),count=el('div',heading.className,heading.textContent);count.id=heading.id;heading.replaceWith(count);count.before(h);count.after(el('p','roofi-category-intro','اختاري التصميم المناسب لإطلالتك، وراجعي المقاس والتفاصيل داخل كل منتج.'));}} } var timer;function schedule(){clearTimeout(timer);timer=setTimeout(improve,180);}function start(){improve();new MutationObserver(function(ms){if(ms.some(function(m){return m.type==='characterData'||m.type==='childList'&&m.addedNodes.length||m.type==='attributes'&&m.attributeName==='amount';}))schedule();}).observe(document.body,{childList:true,characterData:true,subtree:true,attributes:true,attributeFilter:['amount']});}if(document.readyState==='loading')document.addEventListener('DOMContentLoaded',start,{once:true});else start(); })(); /* Confirmed booking and cancellation terms */ (function(){function add(){var grid=document.querySelector("#roofi-faq .roofi-faq-grid");if(grid&&!grid.querySelector(".roofi-booking-faq")){var d=document.createElement("details");d.className="roofi-booking-faq";d.innerHTML="كيف يعمل حجز التفصيل والتعديل أو الإلغاء؟

مبلغ الحجز 100 ريال يُخصم من القيمة النهائية للطلب. يُعاد المبلغ في حال عدم الاتفاق، أو عند إلغاء الطلب خلال 24 ساعة من إتمامه. يمكن طلب التعديل أو الإلغاء خلال 24 ساعة من إتمام الطلب عبر خدمة العملاء.

";grid.append(d);}}if(document.readyState==="loading")document.addEventListener("DOMContentLoaded",add,{once:true});else add();})();