/*
* ======================================================
* Purple-SA Custom JS (No Auto Sorting)
* - Removed: Default Sort via URL Enforcement
* - Improved: Use events + MutationObserver instead of tight intervals
* ======================================================
*/
(function () {
"use strict";
/* ------------------------------------------------------
* Helpers
* ------------------------------------------------------ */
const onReady = (fn) => {
if (document.readyState === "loading") {
document.addEventListener("DOMContentLoaded", fn, { once: true });
} else {
fn();
}
};
// Runs fn on DOM ready + on Salla content updates (SPA-ish behavior)
const bindSallaContentUpdated = (fn) => {
try {
// Some Salla themes use this event bus
if (window.salla?.event?.document?.on) {
window.salla.event.document.on("content.updated", fn);
}
} catch (e) {
// silent
}
};
// MutationObserver fallback to catch late-rendered components
const observeDom = (fn) => {
const obs = new MutationObserver(() => fn());
obs.observe(document.documentElement, { childList: true, subtree: true });
return obs;
};
/* ------------------------------------------------------
* 1) Yalla Ludo Filters Takeover Strategy
* ------------------------------------------------------ */
const takeoverYallaLudoPage = () => {
// Ensure we are on the intended category page
// Keep your original check (Salla category id)
if (!window.location.pathname.includes("/c922250271")) return;
const productsListElement = document.querySelector("salla-products-list");
if (!productsListElement) return;
// Prevent re-run
if (document.querySelector(".zentos-ludo-wrapper")) return;
const masterWrapper = document.createElement("div");
masterWrapper.className = "zentos-ludo-wrapper";
const filtersHTML = `
`;
// Insert wrapper before products list
productsListElement.parentNode.insertBefore(masterWrapper, productsListElement);
// Add filters then move products list into wrapper
masterWrapper.insertAdjacentHTML("beforeend", filtersHTML);
masterWrapper.appendChild(productsListElement);
};
/*
* ===============================
* Footer Takeover (Dynamic Year)
* ===============================
*/
const takeoverFooter = () => {
const originalFooter = document.querySelector("footer");
if (!originalFooter) return;
// prevent re-run
if (originalFooter.querySelector(".zentos-takeover-content")) return;
const year = new Date().getFullYear();
const takeoverHTML = `
`;
originalFooter.innerHTML = takeoverHTML;
};
/* ------------------------------------------------------
* 3) Image to Video on Hover Effect
* ------------------------------------------------------ */
function initializeHoverVideoEffect() {
const videoMap = {
"https://purple-sa.com/ar/redirect/categories/922250271":
"https://res.cloudinary.com/dbvl7eq8m/video/upload/v1754481604/yallaludo_purple_jmjlqt.mp4",
"https://purple-sa.com/ar/redirect/categories/2023830094":
"https://res.cloudinary.com/dbvl7eq8m/video/upload/v1754481607/hawachat_ouwijv.mp4",
"https://purple-sa.com/ar/redirect/categories/1897617688":
"https://res.cloudinary.com/dbvl7eq8m/video/upload/v1754925542/yoho_vsrbvl.mp4",
"https://purple-sa.com/ar/redirect/categories/1937919874":
"https://res.cloudinary.com/dbvl7eq8m/video/upload/v1754481605/binmo_jrsntn.mp4",
"https://purple-sa.com/ar/redirect/categories/32519871":
"https://res.cloudinary.com/dbvl7eq8m/video/upload/v1754481613/pubg_k1fvcv.mp4",
"https://purple-sa.com/ar/redirect/categories/410232070":
"https://res.cloudinary.com/dbvl7eq8m/video/upload/v1754481608/silachat_t6mlgn.mp4",
"https://www.purple-cards.com/ar/category/63/brand/303":
"https://res.cloudinary.com/dbvl7eq8m/video/upload/v1754481606/yallalive_re1nje.mp4",
"https://purple-sa.com/ar/redirect/categories/1594243893":
"https://res.cloudinary.com/dbvl7eq8m/video/upload/v1754481605/soulfree_obe34m.mp4",
"https://purple-sa.com/ar/redirect/categories/1224257357":
"https://res.cloudinary.com/dbvl7eq8m/video/upload/v1754481607/sadalive_flwd8k.mp4",
};
const categoryLinks = document.querySelectorAll(
".main-links-style-2-slider-single-content-image a"
);
categoryLinks.forEach((link) => {
const linkHref = link.getAttribute("href");
const videoSrc = videoMap[linkHref];
if (!videoSrc) return;
const container = link.parentElement;
if (!container) return;
// Prevent duplicate init
if (container.dataset.videoEffect === "true") return;
const video = document.createElement("video");
video.src = videoSrc;
video.className = "hover-video";
video.muted = true;
video.loop = true;
video.playsInline = true;
video.preload = "metadata";
container.appendChild(video);
container.addEventListener("mouseenter", () => {
// play() can reject on some browsers; ignore safely
const p = video.play();
if (p && typeof p.catch === "function") p.catch(() => {});
});
container.addEventListener("mouseleave", () => {
video.pause();
video.currentTime = 0;
});
container.dataset.videoEffect = "true";
});
}
/* ------------------------------------------------------
* Boot
* ------------------------------------------------------ */
const runAll = () => {
takeoverYallaLudoPage();
takeoverFooter();
initializeHoverVideoEffect();
};
onReady(runAll);
bindSallaContentUpdated(runAll);
// Observer to catch delayed components (safe, no 100ms polling)
observeDom(runAll);
})();