﻿// source --> https://mfrash.com/wp-content/plugins/wc-top-nav-location-picker/assets/js/location-picker-1.0.86.js?ver=1.0.86 
(function () {
  "use strict";

  var config = window.WCTNLP_CONFIG || {};
  var strings = config.strings || {};
  var state = {
    map: null,
    geocoder: null,
    reverseTimer: null,
    reverseRequestId: 0,
    locationRunId: 0,
    ignoreNextIdle: false,
    gpsLocked: false,
    gpsMarker: null,
    gpsPulseOverlay: null,
    locationRetryTimer: null,
    stopLocationDetection: null,
    improveWatchId: null,
    improveTimer: null,
    lastBrowserLocation: null,
    addressText: null,
    statusElement: null,
    mapsPromise: null,
    modalTriggerBound: false,
    approximateDetected: false,
    checkoutAutofillBound: false,
    checkoutMode: false,
    pendingCheckoutAddress: null,
    confirmDefaultText: "",
    selected: config.savedLocation || config.defaultLocation || {
      city: "\u0627\u0644\u0631\u064a\u0627\u0636",
      address: "\u0627\u0644\u0631\u064a\u0627\u0636",
      lat: 24.7136,
      lng: 46.6753
    }
  };
  state.selected.city = normalizeCityName(state.selected.city) || state.selected.city;

  function normalizeCityName(value) {
    if (!value) { return ""; }
    var city = String(value)
      .split(/\s+-\s+|،|,/)[0]
      .replace(/\s+/g, " ")
      .replace(/\b(Province|Region|Governorate|Governate|Municipality|Emirate|District|Area)\b/gi, "")
      .replace(/^(\u0645\u0646\u0637\u0642\u0629|\u0645\u062d\u0627\u0641\u0638\u0629|\u0625\u0645\u0627\u0631\u0629|\u0627\u0645\u0627\u0631\u0629|\u0628\u0644\u062f\u064a\u0629|\u0645\u062f\u064a\u0646\u0629)\s+/i, "")
      .replace(/\s+(\u0645\u0646\u0637\u0642\u0629|\u0645\u062d\u0627\u0641\u0638\u0629|\u0625\u0645\u0627\u0631\u0629|\u0627\u0645\u0627\u0631\u0629|\u0628\u0644\u062f\u064a\u0629|\u0645\u062f\u064a\u0646\u0629)$/i, "")
      .replace(/\s+/g, " ")
      .trim();

    var aliases = {
      "riyadh": "\u0627\u0644\u0631\u064a\u0627\u0636", "riyadh province": "\u0627\u0644\u0631\u064a\u0627\u0636", "riyadh region": "\u0627\u0644\u0631\u064a\u0627\u0636",
      "\u0627\u0644\u0631\u064a\u0627\u0636": "\u0627\u0644\u0631\u064a\u0627\u0636",
      "jeddah": "\u062c\u062f\u0629", "jedda": "\u062c\u062f\u0629", "\u062c\u062f\u0629": "\u062c\u062f\u0629",
      "makkah": "\u0645\u0643\u0629", "mecca": "\u0645\u0643\u0629", "makkah al mukarramah": "\u0645\u0643\u0629",
      "makkah al-mukarramah": "\u0645\u0643\u0629", "\u0645\u0643\u0629": "\u0645\u0643\u0629", "\u0645\u0643\u0629 \u0627\u0644\u0645\u0643\u0631\u0645\u0629": "\u0645\u0643\u0629",
      "cairo": "\u0627\u0644\u0642\u0627\u0647\u0631\u0629", "cairo governorate": "\u0627\u0644\u0642\u0627\u0647\u0631\u0629", "\u0627\u0644\u0642\u0627\u0647\u0631\u0629": "\u0627\u0644\u0642\u0627\u0647\u0631\u0629",
      "giza": "\u0627\u0644\u062c\u064a\u0632\u0629", "giza governorate": "\u0627\u0644\u062c\u064a\u0632\u0629", "\u0627\u0644\u062c\u064a\u0632\u0629": "\u0627\u0644\u062c\u064a\u0632\u0629",
      "madinaty": "\u0627\u0644\u0642\u0627\u0647\u0631\u0629", "\u0645\u062f\u064a\u0646\u062a\u064a": "\u0627\u0644\u0642\u0627\u0647\u0631\u0629",
      "new cairo": "\u0627\u0644\u0642\u0627\u0647\u0631\u0629", "new cairo city": "\u0627\u0644\u0642\u0627\u0647\u0631\u0629", "\u0627\u0644\u0642\u0627\u0647\u0631\u0629 \u0627\u0644\u062c\u062f\u064a\u062f\u0629": "\u0627\u0644\u0642\u0627\u0647\u0631\u0629",
      "rehab": "\u0627\u0644\u0642\u0627\u0647\u0631\u0629", "al rehab": "\u0627\u0644\u0642\u0627\u0647\u0631\u0629", "\u0627\u0644\u0631\u062d\u0627\u0628": "\u0627\u0644\u0642\u0627\u0647\u0631\u0629",
      "nasr city": "\u0627\u0644\u0642\u0627\u0647\u0631\u0629", "\u0645\u062f\u064a\u0646\u0629 \u0646\u0635\u0631": "\u0627\u0644\u0642\u0627\u0647\u0631\u0629",
      "maadi": "\u0627\u0644\u0642\u0627\u0647\u0631\u0629", "\u0627\u0644\u0645\u0639\u0627\u062f\u064a": "\u0627\u0644\u0642\u0627\u0647\u0631\u0629",
      "6th of october": "\u0627\u0644\u062c\u064a\u0632\u0629", "sixth of october": "\u0627\u0644\u062c\u064a\u0632\u0629",
      "october city": "\u0627\u0644\u062c\u064a\u0632\u0629", "\u0645\u062f\u064a\u0646\u0629 6 \u0623\u0643\u062a\u0648\u0628\u0631": "\u0627\u0644\u062c\u064a\u0632\u0629",
      "\u0645\u062f\u064a\u0646\u0629 \u0627\u0644\u0633\u0627\u062f\u0633 \u0645\u0646 \u0623\u0643\u062a\u0648\u0628\u0631": "\u0627\u0644\u062c\u064a\u0632\u0629",
      "sheikh zayed": "\u0627\u0644\u062c\u064a\u0632\u0629", "\u0627\u0644\u0634\u064a\u062e \u0632\u0627\u064a\u062f": "\u0627\u0644\u062c\u064a\u0632\u0629"
    };
    return aliases[city.toLowerCase()] || city;
  }

  function cityFromGoogleComponents(components, fallback) {
    if (!components || !components.length) { return normalizeCityName(fallback) || fallback; }
    var countryCode = "";
    for (var countryIndex = 0; countryIndex < components.length; countryIndex++) {
      if (components[countryIndex].types && components[countryIndex].types.indexOf("country") >= 0) {
        countryCode = String(components[countryIndex].short_name || "").toLowerCase();
        break;
      }
    }
    var priority = countryCode === "eg"
      ? ["administrative_area_level_1", "administrative_area_level_2", "locality", "sublocality_level_1"]
      : ["locality", "administrative_area_level_2", "sublocality_level_1", "administrative_area_level_1"];
    for (var p = 0; p < priority.length; p++) {
      for (var i = 0; i < components.length; i++) {
        if (components[i].types && components[i].types.indexOf(priority[p]) >= 0) {
          var name = normalizeCityName(components[i].long_name);
          if (name) { return name; }
        }
      }
    }
    return normalizeCityName(fallback) || fallback;
  }

  function reverseGeocode(lat, lng) {
    if (!state.geocoder) {
      return Promise.reject(new Error("Geocoder not ready"));
    }
    return new Promise(function (resolve, reject) {
      state.geocoder.geocode(
        { location: { lat: Number(lat), lng: Number(lng) } },
        function (results, status) {
          if (status === "OK" && results && results[0]) {
            resolve({
              city: cityFromGoogleComponents(results[0].address_components, state.selected.city),
              address: results[0].formatted_address || state.selected.city,
              lat: Number(lat),
              lng: Number(lng)
            });
          } else {
            reject(new Error("Geocode failed: " + status));
          }
        }
      );
    });
  }

  function searchPlaces(query) {
    if (!state.geocoder) {
      return Promise.resolve([]);
    }
    return new Promise(function (resolve) {
      var request = { address: query };
      var codes = (config.countryCode || "").split(",").map(function (c) { return c.trim(); }).filter(Boolean);
      if (codes.length === 1) { request.componentRestrictions = { country: codes[0] }; }
      state.geocoder.geocode(request, function (results, status) {
        if (status === "OK" && results) {
          resolve(results.slice(0, 6).map(function (place) {
            return {
              city: cityFromGoogleComponents(place.address_components, state.selected.city),
              address: place.formatted_address || "",
              lat: place.geometry.location.lat(),
              lng: place.geometry.location.lng()
            };
          }));
        } else {
          resolve([]);
        }
      });
    });
  }

  function positionToLocation(position) {
    return {
      city: state.selected.city,
      address: strings.gpsLocationSelected || "\u062a\u0645 \u062a\u062d\u062f\u064a\u062f \u0645\u0648\u0642\u0639\u0643 \u0627\u0644\u062d\u0627\u0644\u064a \u0628\u062f\u0642\u0629. \u0627\u0636\u063a\u0637 \u062a\u0623\u0643\u064a\u062f \u0627\u0644\u0645\u0648\u0642\u0639.",
      lat: Number(position.coords.latitude),
      lng: Number(position.coords.longitude),
      accuracy: Number(position.coords.accuracy || 0),
      detectedAt: Date.now()
    };
  }

  function distanceMeters(first, second) {
    if (!first || !second) { return Infinity; }
    var radius = 6371000;
    var firstLat = first.lat * Math.PI / 180;
    var secondLat = second.lat * Math.PI / 180;
    var deltaLat = (second.lat - first.lat) * Math.PI / 180;
    var deltaLng = (second.lng - first.lng) * Math.PI / 180;
    var a = Math.sin(deltaLat / 2) * Math.sin(deltaLat / 2) +
      Math.cos(firstLat) * Math.cos(secondLat) *
      Math.sin(deltaLng / 2) * Math.sin(deltaLng / 2);
    return radius * 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
  }

  function isBetterLocation(next, best) {
    if (!next) { return false; }
    if (!best) { return true; }
    if (!next.accuracy) { return false; }
    if (!best.accuracy) { return true; }
    if (next.accuracy + 5 < best.accuracy) { return true; }
    if (next.accuracy <= best.accuracy + 5 &&
      distanceMeters(next, best) <= Math.max(25, best.accuracy)) { return true; }
    return false;
  }

  function reusableBrowserLocation() {
    var loc = state.lastBrowserLocation;
    if (!loc || !loc.detectedAt) { return null; }
    if (Date.now() - loc.detectedAt > 120000) { return null; }
    if (loc.accuracy && loc.accuracy > 0 && loc.accuracy <= 100) { return loc; }
    return null;
  }

  function detectBrowserLocation() {
    if (!navigator.geolocation) {
      var err = new Error("Geolocation is not available");
      err.code = "unsupported";
      return Promise.reject(err);
    }
    var cached = reusableBrowserLocation();
    if (cached) { return Promise.resolve(cached); }

    return new Promise(function (resolve, reject) {
      var firstError = null;
      var finished = false;
      var watchId = null;
      var retryId = null;

      function cleanup() {
        clearTimeout(retryId);
        if (watchId !== null) { navigator.geolocation.clearWatch(watchId); }
        watchId = null;
        if (state.stopLocationDetection === stopDetection) {
          state.stopLocationDetection = null;
        }
      }

      function stopDetection() {
        if (finished) { return; }
        finished = true;
        cleanup();
      }

      state.stopLocationDetection = stopDetection;

      function finish(location) {
        if (finished) { return; }
        finished = true;
        cleanup();
        if (!location) { reject(firstError || new Error("Location timeout")); return; }
        state.lastBrowserLocation = location;
        resolve(location);
      }

      function handlePosition(position) {
        var next = positionToLocation(position);
        if (!isFinite(next.lat) || !isFinite(next.lng)) { return; }
        finish(next);
      }

      watchId = navigator.geolocation.watchPosition(
        handlePosition,
        function (error) { firstError = firstError || error; },
        { enableHighAccuracy: true, timeout: 4000, maximumAge: 60000 }
      );

      function requestPositionAgain() {
        if (finished) { return; }
        navigator.geolocation.getCurrentPosition(
          handlePosition,
          function (error) {
            firstError = firstError || error;
            retryId = setTimeout(requestPositionAgain, 1200);
          },
          { enableHighAccuracy: true, timeout: 4000, maximumAge: 0 }
        );
      }

      requestPositionAgain();
    });
  }

  function clearCurrentLocationRetry() {
    clearTimeout(state.locationRetryTimer);
    state.locationRetryTimer = null;
    stopLocationImprovement();
    if (typeof state.stopLocationDetection === "function") {
      state.stopLocationDetection();
      state.stopLocationDetection = null;
    }
  }

  function stopLocationImprovement() {
    clearTimeout(state.improveTimer);
    state.improveTimer = null;
    if (state.improveWatchId !== null && navigator.geolocation) {
      navigator.geolocation.clearWatch(state.improveWatchId);
    }
    state.improveWatchId = null;
  }

  function shouldUseImprovedLocation(next, best) {
    if (!next || !isFinite(next.lat) || !isFinite(next.lng)) { return false; }
    if (next.accuracy && next.accuracy > 1000) { return false; }
    if (!best || !best.accuracy) { return !!next.accuracy; }
    if (!next.accuracy) { return false; }
    if (next.accuracy <= 45 && distanceMeters(next, best) >= 3) { return true; }
    return next.accuracy + 15 < best.accuracy;
  }

  function startLocationImprovement(runId, initialLocation, addressText) {
    if (!navigator.geolocation) { return; }
    stopLocationImprovement();

    var bestLocation = initialLocation;
    var lastUpdateAt = 0;

    state.improveWatchId = navigator.geolocation.watchPosition(
      function (position) {
        if (runId !== state.locationRunId || !state.gpsLocked) {
          stopLocationImprovement();
          return;
        }

        var next = positionToLocation(position);
        if (!shouldUseImprovedLocation(next, bestLocation)) { return; }

        bestLocation = next;
        state.lastBrowserLocation = next;

        if (Date.now() - lastUpdateAt < 1200 && !(next.accuracy && next.accuracy <= 45)) { return; }
        lastUpdateAt = Date.now();
        moveMapToCurrentLocation(next, addressText);

        if (next.accuracy && next.accuracy <= 35) {
          stopLocationImprovement();
        }
      },
      function () {},
      { enableHighAccuracy: true, timeout: 8000, maximumAge: 0 }
    );

    state.improveTimer = setTimeout(stopLocationImprovement, 9000);
  }

  function isFinalLocationError(error) {
    return error && (
      error.code === "unsupported" ||
      error.code === "googleMapsMissing" ||
      error.code === "googleMapsLoadFailed"
    );
  }

  function detectBrowserLocationUntilFound(runId) {
    return detectBrowserLocation().catch(function (error) {
      if (runId !== state.locationRunId || isFinalLocationError(error)) {
        throw error;
      }

      return new Promise(function (resolve, reject) {
        clearCurrentLocationRetry();
        state.locationRetryTimer = setTimeout(function () {
          if (runId !== state.locationRunId) {
            reject(error);
            return;
          }

          detectBrowserLocationUntilFound(runId).then(resolve).catch(reject);
        }, 1200);
      });
    });
  }

  function detectApproximateLocation() {
    if (!config.approxLocationEnabled || !config.approxLocationUrl) {
      return Promise.reject(new Error("Approximate location is disabled"));
    }

    return fetch(config.approxLocationUrl, { credentials: "omit" })
      .then(function (response) {
        if (!response.ok) {
          throw new Error("Approximate lookup failed");
        }
        return response.json();
      })
      .then(function (data) {
        var countryCode = String(data.country_code || data.countryCode || "").toLowerCase();
        var region = data.region || data.region_name || data.regionName || "";
        var city = normalizeCityName(countryCode === "eg" ? (region || data.city) : (data.city || region || state.selected.city));
        var lat = Number(data.latitude || data.lat || state.selected.lat);
        var lng = Number(data.longitude || data.lon || data.lng || state.selected.lng);

        return {
          city: city,
          address: city,
          lat: lat,
          lng: lng,
          approximate: true
        };
      });
  }

  function saveLocation(location) {
    var form = new FormData();
    form.append("action", "wctnlp_save_location");
    form.append("nonce", config.nonce || "");
    form.append("city", location.city || "");
    form.append("address", location.address || "");
    form.append("lat", location.lat || "");
    form.append("lng", location.lng || "");
    return fetch(config.ajaxUrl, { method: "POST", credentials: "same-origin", body: form })
      .then(function (r) { if (!r.ok) { throw new Error("Save failed"); } return r.json(); });
  }

  function loadGoogleMaps() {
    if (window.google && window.google.maps && window.google.maps.Geocoder) {
      return Promise.resolve();
    }
    if (state.mapsPromise) { return state.mapsPromise; }
    if (!config.googleMapsApiKey) {
      var missing = new Error("Google Maps API key is missing");
      missing.code = "googleMapsMissing";
      return Promise.reject(missing);
    }

    state.mapsPromise = new Promise(function (resolve, reject) {
      var cbName = "__wctnlp_gmaps_cb";
      window[cbName] = function () { resolve(); delete window[cbName]; };
      var lang = (config.locale || "ar").replace("_", "-").split("-")[0];
      var script = document.createElement("script");
      script.src = "https://maps.googleapis.com/maps/api/js" +
        "?key=" + encodeURIComponent(config.googleMapsApiKey || "") +
        "&language=" + lang +
        "&callback=" + cbName +
        "&loading=async";
      script.async = true;
      script.defer = true;
      script.onerror = function () {
        var failed = new Error("Google Maps failed to load");
        failed.code = "googleMapsLoadFailed";
        reject(failed);
      };
      document.head.appendChild(script);
    });
    return state.mapsPromise;
  }

  function init() {
    initDeliveryEta();
    initCheckoutAutofill();
    bindModalEvents();
  }

  function getOverlay() {
    return document.querySelector("[data-wctnlp-overlay]");
  }

  function syncModalElements(overlay) {
    if (!overlay) { return null; }
    var elements = {
      closeButton: overlay.querySelector("[data-wctnlp-close]"),
      currentButton: overlay.querySelector("[data-wctnlp-current]"),
      confirmButton: overlay.querySelector("[data-wctnlp-confirm]"),
      searchInput: overlay.querySelector("[data-wctnlp-search]"),
      results: overlay.querySelector("[data-wctnlp-results]"),
      addressText: overlay.querySelector("[data-wctnlp-address]"),
      statusElement: overlay.querySelector("[data-wctnlp-status]")
    };
    state.addressText = elements.addressText;
    state.statusElement = elements.statusElement;
    if (elements.confirmButton && !state.confirmDefaultText) {
      state.confirmDefaultText = elements.confirmButton.textContent;
    }
    updateLabels(elements.addressText);
    return elements;
  }

  function bindModalEvents() {
    var overlay = getOverlay();
    var elements = syncModalElements(overlay);

    if (!state.modalTriggerBound) {
      state.modalTriggerBound = true;
      document.addEventListener("click", function (event) {
        var trigger = closestElement(event.target, "[data-wctnlp-trigger], [data-wctnlp-trigger-wrap]");
        if (!trigger) { return; }

        var currentOverlay = getOverlay();
        var currentElements = syncModalElements(currentOverlay);
        if (!currentOverlay || !currentElements) { return; }
        if (currentOverlay.dataset.wctnlpBound !== "1") {
          bindModalEvents();
          currentElements = syncModalElements(currentOverlay);
        }

        event.preventDefault();
        openModal(currentOverlay, currentElements.closeButton, currentElements.addressText, trigger);
      });

      document.addEventListener("keydown", function (event) {
        var currentOverlay = getOverlay();
        if (event.key === "Escape" && currentOverlay && currentOverlay.classList.contains("is-open")) {
          closeModal(currentOverlay);
        }
      });
    }

    if (!overlay || !elements || overlay.dataset.wctnlpBound === "1") { return; }
    overlay.dataset.wctnlpBound = "1";

    if (elements.closeButton) {
      elements.closeButton.addEventListener("click", function () { closeModal(overlay); });
    }

    overlay.addEventListener("click", function (event) {
      if (event.target === overlay) { closeModal(overlay); }
    });

    if (elements.currentButton) {
      elements.currentButton.addEventListener("click", function () {
        var runId = ++state.locationRunId;
        var addressText = state.addressText || elements.addressText;
        clearCurrentLocationRetry();
        clearStatus();
        if (addressText) {
          addressText.textContent = strings.resolvingAddress || "\u062c\u0627\u0631\u064a \u062a\u062d\u062f\u064a\u062f \u0627\u0644\u0639\u0646\u0648\u0627\u0646...";
        }
        elements.currentButton.classList.add("wctnlp-loading");
        var mapsReady = loadGoogleMaps();
        detectBrowserLocationUntilFound(runId)
          .then(function (location) {
            if (runId !== state.locationRunId) { return null; }
            return mapsReady.then(function () {
              if (runId !== state.locationRunId) { return null; }
              initMap();
              moveMapToCurrentLocation(location, addressText);
              startLocationImprovement(runId, location, addressText);
              return location;
            });
          })
          .catch(function (error) {
            if (runId !== state.locationRunId) { return; }
            if (isFinalLocationError(error)) { showStatus(locationErrorMessage(error)); }
          })
          .finally(function () { elements.currentButton.classList.remove("wctnlp-loading"); });
      });
    }

    if (elements.confirmButton) {
      elements.confirmButton.addEventListener("click", function () {
        var shouldClose = false;
        var addressText = state.addressText || elements.addressText;
        elements.confirmButton.classList.add("wctnlp-loading");
        clearTimeout(state.reverseTimer);
        (state.gpsLocked ? Promise.resolve(state.selected) : locationFromMapCenter(addressText))
          .catch(function () { return state.selected; })
          .then(function (location) {
            applyLocation(location, false, addressText);
            return saveLocation(location);
          })
          .then(function () {
            updateCheckoutFillButtons(state.selected);
            if (state.checkoutMode && !fillCheckoutFields(state.selected, state.statusElement)) {
              throw new Error("checkout-fields-not-filled");
            }
            shouldClose = true;
          })
          .catch(function () {
            if (state.checkoutMode) {
              showStatus("\u0644\u0645 \u064a\u062a\u0645 \u0627\u0633\u062a\u062e\u0631\u0627\u062c \u0627\u0644\u062d\u064a \u0648\u0627\u0644\u0634\u0627\u0631\u0639 \u0645\u0646 \u0627\u0644\u0639\u0646\u0648\u0627\u0646\u060c \u062d\u0631\u0643 \u0627\u0644\u062e\u0631\u064a\u0637\u0629 \u0642\u0644\u064a\u0644\u0627 \u062b\u0645 \u062c\u0631\u0628 \u0645\u0631\u0629 \u0623\u062e\u0631\u0649");
            }
          })
          .finally(function () {
            elements.confirmButton.classList.remove("wctnlp-loading");
            if (shouldClose) {
              document.dispatchEvent(new CustomEvent("wctnlp:confirmed", { detail: state.selected }));
              closeModal(overlay);
            }
          });
      });
    }

    if (elements.searchInput && elements.results) {
      var searchTimer = null;
      elements.searchInput.addEventListener("input", function () {
        clearTimeout(searchTimer);
        var query = elements.searchInput.value.trim();
        if (query.length < 3) { elements.results.innerHTML = ""; return; }
        searchTimer = setTimeout(function () {
          searchPlaces(query)
            .then(function (items) { renderResults(items, elements.results, elements.searchInput, state.addressText || elements.addressText); })
            .catch(function () { elements.results.innerHTML = ""; });
        }, 350);
      });
    }

    if (!state.approximateDetected && !config.savedLocation) {
      state.approximateDetected = true;
      detectApproximateLocation()
        .then(function (location) {
          applyLocation(location, true, state.addressText || elements.addressText);
          return saveLocation(location);
        })
        .catch(function () {});
    }
  }

  function openModal(overlay, closeButton, addressText, trigger) {
    var confirmButton = overlay.querySelector("[data-wctnlp-confirm]");
    state.checkoutMode = !!closestElement(trigger, "[data-wctnlp-checkout-map]");
    if (confirmButton) {
      confirmButton.textContent = state.checkoutMode ? "\u0645\u0644\u0621 \u062e\u0627\u0646\u0627\u062a \u0627\u0644\u0639\u0646\u0648\u0627\u0646" : (state.confirmDefaultText || confirmButton.textContent);
    }
    overlay.classList.add("is-open");
    document.body.classList.add("wctnlp-modal-open");
    clearStatus();
    updateLabels(addressText);
    setMapLoading(true);
    loadGoogleMaps().then(function () {
      initMap();
      setTimeout(function () {
        if (state.map) {
          google.maps.event.trigger(state.map, "resize");
          state.map.setCenter({ lat: state.selected.lat, lng: state.selected.lng });
        }
        setMapLoading(false);
      }, 120);
    }).catch(function (error) {
      setMapLoading(false);
      showStatus(locationErrorMessage(error));
    });
    if (closeButton) {
      setTimeout(function () { closeButton.focus(); }, 120);
    }
  }

  function closeModal(overlay) {
    var confirmButton = overlay.querySelector("[data-wctnlp-confirm]");
    if (confirmButton && state.confirmDefaultText) {
      confirmButton.textContent = state.confirmDefaultText;
    }
    state.checkoutMode = false;
    state.locationRunId += 1;
    clearCurrentLocationRetry();
    overlay.classList.remove("is-open");
    document.body.classList.remove("wctnlp-modal-open");
    var currentButton = overlay.querySelector("[data-wctnlp-current]");
    if (currentButton) { currentButton.classList.remove("wctnlp-loading"); }
  }

  function initMap() {
    var mapElement = document.querySelector("[data-wctnlp-map]");
    if (!mapElement || state.map) { return; }

    state.map = new google.maps.Map(mapElement, {
      center: { lat: state.selected.lat, lng: state.selected.lng },
      zoom: 15,
      zoomControl: true,
      streetViewControl: false,
      mapTypeControl: false,
      fullscreenControl: false,
      gestureHandling: "greedy",
      clickableIcons: false
    });

    state.geocoder = new google.maps.Geocoder();

    state.map.addListener("click", function (event) {
      state.locationRunId += 1;
      state.gpsLocked = false;
      var lat = event.latLng.lat();
      var lng = event.latLng.lng();
      moveMap(lat, lng, true);
    });

    state.map.addListener("dragstart", function () {
      state.locationRunId += 1;
      state.gpsLocked = false;
    });

    state.map.addListener("idle", function () {
      if (state.ignoreNextIdle) { state.ignoreNextIdle = false; return; }
      if (state.gpsLocked) { return; }
      scheduleCenterLookup();
    });
  }

  function setMapLoading(isLoading) {
    var loading = document.querySelector("[data-wctnlp-map-loading]");
    if (loading) {
      loading.classList.toggle("is-visible", Boolean(isLoading && !state.map));
      loading.textContent = strings.loadingMap || "\u062c\u0627\u0631\u064a \u062a\u062d\u0645\u064a\u0644 \u0627\u0644\u062e\u0631\u064a\u0637\u0629...";
    }
  }

  function showStatus(message) {
    if (!state.statusElement || !message) { return; }
    state.statusElement.textContent = message;
    state.statusElement.classList.add("is-visible");
  }

  function clearStatus() {
    if (!state.statusElement) { return; }
    state.statusElement.textContent = "";
    state.statusElement.classList.remove("is-visible");
  }

  function locationErrorMessage(error) {
    if (!error) { return strings.locationUnavailable || "\u062a\u0639\u0630\u0631 \u0642\u0631\u0627\u0621\u0629 \u0645\u0648\u0642\u0639\u0643 \u0627\u0644\u062d\u0627\u0644\u064a."; }
    if (error.code === "unsupported") { return strings.locationUnsupported || "\u0627\u0644\u0645\u062a\u0635\u0641\u062d \u0644\u0627 \u064a\u062f\u0639\u0645 \u062a\u062d\u062f\u064a\u062f \u0627\u0644\u0645\u0648\u0642\u0639."; }
    if (error.code === "googleMapsMissing") { return strings.googleMapsKeyMissing || "Google Maps API key is missing."; }
    if (error.code === "googleMapsLoadFailed") { return strings.googleMapsLoadFailed || "Google Maps failed to load."; }
    if (error.code === 1) { return strings.locationPermissionDenied || "\u0644\u0645 \u064a\u062a\u0645 \u0627\u0644\u0633\u0645\u0627\u062d \u0628\u062a\u062d\u062f\u064a\u062f \u0627\u0644\u0645\u0648\u0642\u0639."; }
    if (error.code === 3) { return strings.locationTimeout || "\u0627\u0633\u062a\u063a\u0631\u0642 \u062a\u062d\u062f\u064a\u062f \u0627\u0644\u0645\u0648\u0642\u0639 \u0648\u0642\u062a\u0627 \u0637\u0648\u064a\u0644\u0627."; }
    return strings.locationUnavailable || "\u062a\u0639\u0630\u0631 \u0642\u0631\u0627\u0621\u0629 \u0645\u0648\u0642\u0639\u0643 \u0627\u0644\u062d\u0627\u0644\u064a.";
  }

  function moveMap(lat, lng, shouldLookup) {
    if (!state.map) { return; }
    state.ignoreNextIdle = !shouldLookup;
    state.map.setCenter({ lat: lat, lng: lng });
    state.map.setZoom(15);
    if (shouldLookup) {
      state.gpsLocked = false;
      scheduleCenterLookup();
    }
  }

  function moveMapToCurrentLocation(location, addressText) {
    var requestId = ++state.reverseRequestId;

    if (!state.map) {
      state.gpsLocked = true;
      applyLocation(location, false, addressText);
      showGpsAddress(location, addressText, requestId);
      return Promise.resolve(location);
    }

    clearTimeout(state.reverseTimer);
    state.gpsLocked = true;
    state.ignoreNextIdle = true;
    state.map.setCenter({ lat: location.lat, lng: location.lng });
    state.map.setZoom(17);
    updateGpsMarker(location);
    applyLocation(location, false, addressText);
    showGpsAddress(location, addressText, requestId);
    return Promise.resolve(location);
  }

  function updateGpsMarker(location) {
    if (!state.map || !window.google || !location || !location.lat || !location.lng) { return; }

    if (state.gpsMarker) {
      state.gpsMarker.setMap(null);
      state.gpsMarker = null;
    }

    updateGpsPulse(location);
  }

  function updateGpsPulse(location) {
    var latLng = new google.maps.LatLng(location.lat, location.lng);

    if (!state.gpsPulseOverlay) {
      state.gpsPulseOverlay = createGpsPulseOverlay(latLng);
      state.gpsPulseOverlay.setMap(state.map);
      return;
    }

    state.gpsPulseOverlay.setPosition(latLng);
  }

  function createGpsPulseOverlay(position) {
    var element = null;
    var overlay = new google.maps.OverlayView();

    overlay.position = position;

    overlay.onAdd = function () {
      element = document.createElement("div");
      element.className = "wctnlp-gps-pulse";
      element.innerHTML = '<span class="wctnlp-gps-pulse-ring"></span><span class="wctnlp-gps-pulse-ring wctnlp-gps-pulse-ring-delay"></span><span class="wctnlp-gps-pulse-dot"></span>';
      this.getPanes().overlayMouseTarget.appendChild(element);
    };

    overlay.draw = function () {
      if (!element) { return; }
      var projection = this.getProjection();
      var point = projection && projection.fromLatLngToDivPixel(overlay.position);
      if (!point) { return; }
      element.style.left = point.x + "px";
      element.style.top = point.y + "px";
    };

    overlay.onRemove = function () {
      if (element && element.parentNode) {
        element.parentNode.removeChild(element);
      }
      element = null;
    };

    overlay.setPosition = function (nextPosition) {
      overlay.position = nextPosition;
      overlay.draw();
    };

    return overlay;
  }

  function showGpsAddress(location, addressText, requestId) {
    if (addressText) {
      addressText.textContent = strings.resolvingAddress || "\u062c\u0627\u0631\u064a \u062a\u062d\u062f\u064a\u062f \u0627\u0644\u0639\u0646\u0648\u0627\u0646...";
    }
    return reverseGeocode(location.lat, location.lng)
      .then(function (addressLocation) {
        if (requestId !== state.reverseRequestId || !state.gpsLocked) { return state.selected; }
        var displayLocation = {
          city: addressLocation.city || location.city,
          address: addressLocation.address || location.address,
          lat: location.lat,
          lng: location.lng,
          accuracy: location.accuracy
        };
        state.gpsLocked = true;
        applyLocation(displayLocation, false, addressText);
        return displayLocation;
      })
      .catch(function () {
        if (requestId !== state.reverseRequestId || !state.gpsLocked) { return state.selected; }
        state.gpsLocked = true;
        applyLocation(location, false, addressText);
        return location;
      });
  }

  function scheduleCenterLookup() {
    clearTimeout(state.reverseTimer);
    state.reverseTimer = setTimeout(function () {
      locationFromMapCenter(state.addressText);
    }, 450);
  }

  function locationFromMapCenter(addressText) {
    if (!state.map) { return Promise.resolve(state.selected); }
    var center = state.map.getCenter();
    var lat = center.lat();
    var lng = center.lng();
    var requestId = ++state.reverseRequestId;
    if (addressText) {
      addressText.textContent = strings.resolvingAddress || "\u062c\u0627\u0631\u064a \u062a\u062d\u062f\u064a\u062f \u0627\u0644\u0639\u0646\u0648\u0627\u0646...";
    }
    return reverseGeocode(lat, lng).then(function (location) {
      if (requestId === state.reverseRequestId && !state.gpsLocked) {
        applyLocation(location, false, addressText);
      }
      return location;
    });
  }

  function renderResults(items, results, searchInput, addressText) {
    results.innerHTML = items.map(function (item, index) {
      return '<button class="wctnlp-result" type="button" data-index="' + index + '">' + escapeHtml(item.address) + "</button>";
    }).join("");

    results.querySelectorAll(".wctnlp-result").forEach(function (button) {
      button.addEventListener("click", function () {
        var item = items[Number(button.dataset.index)];
        results.innerHTML = "";
        searchInput.value = "";
        state.locationRunId += 1;
        state.gpsLocked = false;
        applyLocation(item, false, addressText);
        moveMap(item.lat, item.lng, false);
      });
    });
  }

  function applyLocation(location, updateButtonOnly, addressText) {
    state.selected = {
      city: location.city || state.selected.city,
      address: location.address || location.city || state.selected.city,
      lat: Number(location.lat || state.selected.lat),
      lng: Number(location.lng || state.selected.lng)
    };
    updateLabels(addressText);
    if (!updateButtonOnly) {
      document.dispatchEvent(new CustomEvent("wctnlp:changed", { detail: state.selected }));
    }
  }

  function updateLabels(addressText) {
    document.querySelectorAll("[data-wctnlp-city]").forEach(function (el) {
      el.textContent = state.selected.city;
    });
    if (addressText) {
      addressText.textContent = state.selected.address || state.selected.city;
    }
  }

  function initDeliveryEta() {
    updateCheckoutDeliveryEta();

    document.addEventListener("change", function (event) {
      if (event.target && event.target.matches("#shipping_state, [name='shipping_state']")) {
        updateCheckoutDeliveryEta();
      }
    }, true);

    if (window.jQuery) {
      window.jQuery(document.body)
        .on("select2:select change", "#shipping_state, [name='shipping_state']", updateCheckoutDeliveryEta)
        .on("updated_checkout", function () {
          window.setTimeout(updateCheckoutDeliveryEta, 60);
        });
    }

    window.setTimeout(updateCheckoutDeliveryEta, 250);
    window.setTimeout(updateCheckoutDeliveryEta, 1000);
  }

  function updateCheckoutDeliveryEta() {
    var eta = document.querySelector("[data-wctnlp-delivery-eta]");
    if (!eta) { return; }

    var city = readCheckoutShippingCity();
    if (!city) {
      eta.classList.remove("is-visible");
      return;
    }

    var message = buildDeliveryEtaMessage(city);
    var title = eta.querySelector("[data-wctnlp-delivery-title]");
    var subtitle = eta.querySelector("[data-wctnlp-delivery-subtitle]");

    if (title) { title.textContent = message.title; }
    if (subtitle) { subtitle.textContent = message.subtitle; }
    eta.classList.add("is-visible");
  }

  function readCheckoutShippingCity() {
    var field = document.querySelector("#shipping_state, [name='shipping_state']");
    var value = field ? field.value : "";
    var label = "";

    if (field && field.options && field.selectedIndex >= 0 && field.options[field.selectedIndex]) {
      label = field.options[field.selectedIndex].text || "";
    }

    var select2Label = document.querySelector("#select2-shipping_state-container");
    if (select2Label && select2Label.textContent) {
      label = select2Label.textContent;
    }

    return normalizeCheckoutCity(value, label);
  }

  function normalizeCheckoutCity(value, label) {
    var raw = String(label || value || "")
      .replace(/\*/g, "")
      .replace(/\s+/g, " ")
      .trim();
    var code = String(value || "").toUpperCase();
    var key = raw.toLowerCase();

    var map = {
      "SA-RIY": "الرياض",
      "SA-JED": "جدة",
      "SA-MAD": "المدينة",
      "SA-MAK": "مكة",
      "SA-DAM": "الدمام",
      "SA-KHO": "الخبر",
      "SA-HOF": "الهفوف",
      "SA-BUR": "بريدة",
      "riyadh": "الرياض",
      "jeddah": "جدة",
      "jeddah ": "جدة",
      "madinah": "المدينة",
      "medina": "المدينة",
      "makkah": "مكة",
      "mecca": "مكة",
      "dammam": "الدمام",
      "al khobar": "الخبر",
      "khobar": "الخبر",
      "al hofuf": "الهفوف",
      "hofuf": "الهفوف",
      "buraydah": "بريدة",
      "buraidah": "بريدة",
      "الرياض": "الرياض",
      "جدة": "جدة",
      "جده": "جدة",
      "المدينة": "المدينة",
      "المدينة المنورة": "المدينة",
      "مكة": "مكة",
      "مكه": "مكة",
      "الدمام": "الدمام",
      "الخبر": "الخبر",
      "الهفوف": "الهفوف",
      "الاحساء": "الأحساء",
      "الأحساء": "الأحساء",
      "بريدة": "بريدة",
      "بريده": "بريدة"
    };

    return map[code] || map[key] || normalizeCityName(raw);
  }

  function buildDeliveryEtaMessage(city) {
    var normalized = normalizeCheckoutCity(city, city);
    var now = getRiyadhNow();

    if (normalized === "الرياض") {
      var riyadhDate = now.hour < 20 ? now.date : addCalendarDays(now.date, 1);
      return {
        title: now.hour < 20 ? "اطلب الآن واستلم طلبك اليوم داخل الرياض" : "اطلب الآن واستلم طلبك غدًا داخل الرياض",
        subtitle: "التوصيل المتوقع: " + formatArabicDate(riyadhDate)
      };
    }

    var fastCities = ["جدة", "المدينة", "مكة", "الدمام", "الخبر", "الهفوف", "الأحساء", "بريدة"];
    var daysTo = fastCities.indexOf(normalized) >= 0 ? 4 : 5;
    var base = now.hour >= 13 ? addCalendarDays(now.date, 1) : now.date;
    var from = addBusinessDays(base, 2);
    var to = addBusinessDays(base, daysTo);

    return {
      title: "التوصيل المتوقع إلى " + normalized,
      subtitle: "من " + formatArabicDate(from) + " إلى " + formatArabicDate(to)
    };
  }

  function getRiyadhNow() {
    var parts = {};
    new Intl.DateTimeFormat("en-CA", {
      timeZone: "Asia/Riyadh",
      year: "numeric",
      month: "2-digit",
      day: "2-digit",
      hour: "2-digit",
      hourCycle: "h23"
    }).formatToParts(new Date()).forEach(function (part) {
      if (part.type !== "literal") { parts[part.type] = part.value; }
    });

    return {
      hour: Number(parts.hour || 0),
      date: new Date(Date.UTC(Number(parts.year), Number(parts.month) - 1, Number(parts.day)))
    };
  }

  function addCalendarDays(date, days) {
    var copy = new Date(date.getTime());
    copy.setUTCDate(copy.getUTCDate() + days);
    return copy;
  }

  function addBusinessDays(date, days) {
    var result = new Date(date.getTime());
    var count = 0;
    while (count < days) {
      result = addCalendarDays(result, 1);
      if (result.getUTCDay() !== 5) {
        count += 1;
      }
    }
    return result;
  }

  function formatArabicDate(date) {
    return new Intl.DateTimeFormat("ar-EG-u-ca-gregory", {
      timeZone: "UTC",
      weekday: "long",
      day: "numeric",
      month: "long"
    }).format(date).replace("،", "");
  }

  function initCheckoutAutofill() {
    if (state.checkoutAutofillBound) { return; }
    state.checkoutAutofillBound = true;

    if (window.jQuery) {
      window.jQuery(document.body).on("updated_checkout", function () {
        reapplyPendingCheckoutAddress();
      });
    }

    document.addEventListener("click", function (event) {
      var button = closestElement(event.target, "[data-wctnlp-checkout-fill]");
      if (!button) { return; }

      event.preventDefault();
      event.stopPropagation();
      var location = readButtonLocation(button) || readSavedLocation() || state.selected || {};
      var parsed = parseSaudiAddress(location.address || "");
      var wrap = closestElement(button, "[data-wctnlp-checkout-autofill]");
      var status = wrap ? wrap.querySelector("[data-wctnlp-checkout-status]") : null;

      if (!parsed.shortCode && !parsed.district && !parsed.streetLine) {
        setCheckoutStatus(status, "لم يتم العثور على عنوان محفوظ مناسب");
        return;
      }

      commitCheckoutAddressFields(parsed);
      setCheckoutStatus(status, "تم تعبئة العنوان");
    });
  }

  function closestElement(target, selector) {
    var node = target && target.nodeType === 1 ? target : target && target.parentElement;
    while (node) {
      if (node.matches && node.matches(selector)) { return node; }
      node = node.parentElement;
    }
    return null;
  }

  function readButtonLocation(button) {
    try {
      return JSON.parse(button.getAttribute("data-location") || "{}");
    } catch (error) {
      return null;
    }
  }

  function fillCheckoutFields(location, status) {
    var parsed = parseSaudiAddress(location && location.address ? location.address : "");

    if (!parsed.shortCode && !parsed.district && !parsed.streetLine) {
      setCheckoutStatus(status, "\u0644\u0645 \u064a\u062a\u0645 \u0627\u0644\u0639\u062b\u0648\u0631 \u0639\u0644\u0649 \u0639\u0646\u0648\u0627\u0646 \u0645\u062d\u0641\u0648\u0638 \u0645\u0646\u0627\u0633\u0628");
      return false;
    }

    state.pendingCheckoutAddress = {
      parsed: parsed,
      expiresAt: Date.now() + 3000
    };

    commitCheckoutAddressFields(parsed);
    [120, 450, 1100].forEach(function (delay) {
      window.setTimeout(reapplyPendingCheckoutAddress, delay);
    });
    setCheckoutStatus(status, "\u062a\u0645 \u062a\u0623\u0643\u064a\u062f \u0627\u0644\u0639\u0646\u0648\u0627\u0646");

    return true;
  }

  function reapplyPendingCheckoutAddress() {
    if (!state.pendingCheckoutAddress || Date.now() > state.pendingCheckoutAddress.expiresAt) {
      state.pendingCheckoutAddress = null;
      return;
    }

    commitCheckoutAddressFields(state.pendingCheckoutAddress.parsed);
  }

  function commitCheckoutAddressFields(parsed) {
    var fields = [
      setFieldValueSilently(["#shipping_shortAddressCode", "[name='shipping_shortAddressCode']"], parsed.shortCode),
      setFieldValueSilently(["#shipping_address_1", "[name='shipping_address_1']"], parsed.district),
      setFieldValueSilently(["#shipping_address_2", "[name='shipping_address_2']"], parsed.streetLine)
    ].filter(Boolean);

    fields.forEach(triggerCheckoutFieldEvents);
  }

  function updateCheckoutFillButtons(location) {
    if (!location) { return; }
    var encoded = JSON.stringify(location);
    document.querySelectorAll("[data-wctnlp-checkout-fill]").forEach(function (button) {
      button.setAttribute("data-location", encoded);
    });
    document.querySelectorAll("[data-wctnlp-checkout-status]").forEach(function (status) {
      setCheckoutStatus(status, "\u062a\u0645 \u062a\u0623\u0643\u064a\u062f \u0627\u0644\u0639\u0646\u0648\u0627\u0646");
    });
  }

  function readSavedLocation() {
    var match = document.cookie.match(/(?:^|;\s*)wctnlp_location=([^;]+)/);
    if (!match) { return null; }
    try {
      return JSON.parse(decodeURIComponent(match[1]));
    } catch (error) {
      return null;
    }
  }

  function parseSaudiAddress(address) {
    var parts = String(address || "")
      .split(/[،,]/)
      .map(function (part) { return part.replace(/\s+/g, " ").trim(); })
      .filter(Boolean);

    var fullAddress = parts.join(" ");
    var codeMatch = fullAddress.match(/\b[A-Z]{4}\d{4}\b/i);
    var shortCode = codeMatch ? codeMatch[0].toUpperCase() : "";
    var district = "";
    var street = "";
    var extraNumber = "";

    for (var i = 0; i < parts.length; i++) {
      if (!district && /^حي\s+/u.test(parts[i])) {
        district = parts[i];
        continue;
      }

      if (!street && (!shortCode || parts[i].toUpperCase().indexOf(shortCode) < 0)) {
        var cleanedStreet = parts[i].replace(/^\d+\s+/, "").trim();
        if (cleanedStreet && !/^\d+$/.test(cleanedStreet) && !/^السعودية$/u.test(cleanedStreet)) {
          street = cleanedStreet;
          continue;
        }
      }

      if (street && !extraNumber && /^\d+$/.test(parts[i])) {
        extraNumber = parts[i];
      }
    }

    return {
      shortCode: shortCode,
      district: district,
      streetLine: [street, extraNumber].filter(Boolean).join("، ")
    };
  }

  parseSaudiAddress = function (address) {
    var parts = String(address || "")
      .split(/[\u060C,]/)
      .map(function (part) { return part.replace(/\s+/g, " ").trim(); })
      .filter(Boolean);

    var fullAddress = parts.join(" ");
    var codeMatch = fullAddress.match(/\b[A-Z]{4}\d{4}\b/i);
    var shortCode = codeMatch ? codeMatch[0].toUpperCase() : "";
    var district = "";
    var street = "";
    var extraNumber = "";

    for (var i = 0; i < parts.length; i++) {
      if (!district && /^\u062d\u064a\s+/u.test(parts[i])) {
        district = parts[i];
        continue;
      }

      if (!street && (!shortCode || parts[i].toUpperCase().indexOf(shortCode) < 0)) {
        var cleanedStreet = parts[i].replace(/^\d+\s+/, "").trim();
        if (cleanedStreet && !/^\d+$/.test(cleanedStreet) && !/^\u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629$/u.test(cleanedStreet)) {
          street = cleanedStreet;
          continue;
        }
      }

      if (street && !extraNumber && /^\d+$/.test(parts[i])) {
        extraNumber = parts[i];
      }
    }

    return {
      shortCode: shortCode,
      district: district,
      streetLine: [street, extraNumber].filter(Boolean).join("\u060C ")
    };
  };

  function setFieldValue(selectors, value) {
    var field = setFieldValueSilently(selectors, value);
    if (field) {
      triggerCheckoutFieldEvents(field);
    }
  }

  function setFieldValueSilently(selectors, value) {
    for (var i = 0; i < selectors.length; i++) {
      var field = document.querySelector(selectors[i]);
      if (!field) { continue; }
      if (window.jQuery) {
        window.jQuery(field).val(value || "");
      } else {
        field.value = value || "";
      }
      return field;
    }
    return null;
  }

  function triggerCheckoutFieldEvents(field) {
    if (!field) { return; }
    field.dispatchEvent(new Event("input", { bubbles: true }));
    field.dispatchEvent(new Event("change", { bubbles: true }));
    if (window.jQuery) {
      window.jQuery(field).trigger("input").trigger("change");
    }
  }

  function setCheckoutStatus(status, message) {
    if (!status) { return; }
    status.textContent = message;
  }

  function escapeHtml(value) {
    return String(value)
      .replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;")
      .replace(/"/g, "&quot;").replace(/'/g, "&#039;");
  }

  if (document.readyState === "loading") {
    document.addEventListener("DOMContentLoaded", init);
  } else {
    init();
  }
})();
// source --> https://mfrash.com/wp-content/plugins/woo-ajax-cart/assets/woo-ajax-cart.js?ver=1780441446 
/* global wacData */
(function () {
    'use strict';

    // ─── أيقونات SVG داخلية ───
    var ICONS = {
        check:    '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round"><path d="M20 6L9 17l-5-5"/></svg>',
        checkCircle: '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><path d="M9 12l2 2 4-4"/></svg>',
        error:    '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"><path d="M12 3.2L2.8 19a2 2 0 0 0 1.7 3h15a2 2 0 0 0 1.7-3L12 3.2z"/><path d="M12 9v5"/><path d="M12 17.5h.01"/></svg>',
        cart:     '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="9" cy="21" r="1.5"/><circle cx="18" cy="21" r="1.5"/><path d="M2.5 3h2.4l2.5 12.5a2 2 0 0 0 2 1.6h8.4a2 2 0 0 0 2-1.5L21 8H6"/></svg>',
        truck:    '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M2 7h11v9H2z"/><path d="M13 10h5l3 3v3h-8z"/><circle cx="6" cy="18.5" r="1.7"/><circle cx="17" cy="18.5" r="1.7"/></svg>',
        truckFast:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 8h10v8H3z"/><path d="M13 11h5l3 3v2h-8z"/><circle cx="7" cy="18" r="1.6"/><circle cx="17" cy="18" r="1.6"/><path d="M1 11h3M1 14h2"/></svg>',
        arrow:    '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M19 12H5"/><path d="M12 5l-7 7 7 7"/></svg>',
        chevron:  '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M9 18l6-6-6-6"/></svg>',
        close:    '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"><path d="M18 6L6 18M6 6l12 12"/></svg>',
        ticket:   '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M2 9.5V7a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v2.5a2.5 2.5 0 0 0 0 5V17a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2v-2.5a2.5 2.5 0 0 0 0-5z"/><path d="M9 5v14"/></svg>',
        copy:     '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="11" height="11" rx="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg>',
        check2:   '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M20 6L9 17l-5-5"/></svg>',
        shield:   '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 2l8 3v6c0 5-3.5 9-8 11-4.5-2-8-6-8-11V5l8-3z"/><path d="M9 12l2 2 4-4"/></svg>',
        medal:    '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="14" r="6"/><path d="M9 11.5L7 3h10l-2 8.5"/><path d="M12 11v6"/><path d="M9.5 14h5"/></svg>',
        flame:    '<svg viewBox="0 0 24 24" fill="#fff" stroke="#fff" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"><path d="M12 2c1 3 4 5 4 9a4 4 0 1 1-8 0c0-1.5.5-2.5 1.5-3.5C10 9 11 6.5 12 2z"/></svg>',
        headset:  '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 14v-2a9 9 0 0 1 18 0v2"/><path d="M3 14a2 2 0 0 1 2-2h2v6H5a2 2 0 0 1-2-2v-2z"/><path d="M21 14a2 2 0 0 0-2-2h-2v6h2a2 2 0 0 0 2-2v-2z"/><path d="M17 18v1a3 3 0 0 1-3 3h-2"/></svg>',
        lock:     '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="4" y="11" width="16" height="10" rx="2"/><path d="M8 11V7a4 4 0 0 1 8 0v4"/></svg>',
        savings:  '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M20 12V7a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v10a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-1"/><path d="M16 12h5v4h-5a2 2 0 0 1 0-4z"/></svg>',
        users:    '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2"/><circle cx="9" cy="7" r="4"/><path d="M22 21v-2a4 4 0 0 0-3-3.87"/><path d="M16 3.13a4 4 0 0 1 0 7.75"/></svg>'
    };

    // عداد عملاء عشوائي ثابت لكل زيارة (8 → 29)
    var SOCIAL_COUNT = (function () {
        try {
            var k = 'wac_social_count';
            var v = sessionStorage.getItem(k);
            if (v) return parseInt(v, 10);
            v = 8 + Math.floor(Math.random() * 22);
            sessionStorage.setItem(k, v);
            return v;
        } catch (e) {
            return 12 + Math.floor(Math.random() * 15);
        }
    })();

    // عدد القطع المتبقية في المخزون (3 → 7)
    var STOCK_LEFT = (function () {
        try {
            var k = 'wac_stock_left';
            var v = sessionStorage.getItem(k);
            if (v) return parseInt(v, 10);
            v = 3 + Math.floor(Math.random() * 5);
            sessionStorage.setItem(k, v);
            return v;
        } catch (e) {
            return 3 + Math.floor(Math.random() * 5);
        }
    })();

    // ─── مساعدات DOM ───
    function el(tag, attrs, html) {
        var n = document.createElement(tag);
        if (attrs) for (var k in attrs) {
            if (k === 'class') n.className = attrs[k];
            else if (k === 'style') n.style.cssText = attrs[k];
            else n.setAttribute(k, attrs[k]);
        }
        if (html != null) n.innerHTML = html;
        return n;
    }
    function on(node, ev, fn) { node.addEventListener(ev, fn); }
    function $find(root, sel) { return (root || document).querySelector(sel); }
    function $all(root, sel) { return (root || document).querySelectorAll(sel); }
    function hasClass(n, c) { return n && n.classList && n.classList.contains(c); }
    function escAttr(s) { return String(s == null ? '' : s).replace(/"/g, '&quot;'); }
    function escHtml(s) {
        return String(s == null ? '' : s).replace(/[&<>"']/g, function (c) {
            return ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#039;' })[c];
        });
    }
    function decodeHtml(s) {
        var textarea = document.createElement('textarea');
        textarea.innerHTML = String(s == null ? '' : s);
        return textarea.value;
    }
    function cleanErrorMessage(s) {
        var msg = decodeHtml(s).replace(/\s+/g, ' ').trim();
        var lower = msg.toLowerCase();

        if (
            lower.indexOf('cannot add that amount') !== -1 ||
            (lower.indexOf('we have') !== -1 && lower.indexOf('in stock') !== -1) ||
            msg.indexOf('لا يمكنك إضافة هذه الكمية') !== -1 ||
            (msg.indexOf('في المخزون') !== -1 && msg.indexOf('سلتك') !== -1)
        ) {
            return 'الكمية المطلوبة غير متوفرة حالياً. لديك بالفعل الكمية المتاحة في السلة.';
        }

        return msg;
    }
    function cssEscape(s) {
        if (window.CSS && typeof window.CSS.escape === 'function') {
            return window.CSS.escape(s);
        }
        return String(s == null ? '' : s).replace(/["\\]/g, '\\$&');
    }

    var WAC = {
        toast: null,
        overlay: null,
        timer: null,
        variationOverlay: null,
        variationSheet: null,
        variationSheetIntent: null,
        _ownAdd: false,
        _lastSubtotal: null,
        _noncePromise: null,

        displayMode: function () {
            var mode = (wacData.notificationMode || 'modal').toString();
            return (/^(modal|bottom_toast|top_bar|side_cart)$/).test(mode) ? mode : 'modal';
        },

        refreshNonce: function () {
            // يُعيد Promise محفوظ — ينتهي بمجرد الحصول على nonce جديد أو الفشل الصامت.
            // يضمن أن طلبات الإضافة لا تُرسَل بـ nonce قديم من الكاش.
            if (WAC._noncePromise) return WAC._noncePromise;
            WAC._noncePromise = new Promise(function (resolve) {
                var body = new FormData();
                body.append('action', 'wac_get_nonce');
                fetch(wacData.ajaxUrl + '?_=' + Date.now(), { method: 'POST', body: body, credentials: 'same-origin' })
                    .then(function (r) { return r.json(); })
                    .then(function (res) {
                        if (res && res.success && res.data && res.data.nonce) {
                            wacData.nonce = res.data.nonce;
                        }
                        resolve();
                    })
                    .catch(function () { resolve(); });
            });
            return WAC._noncePromise;
        },

        init: function () {
            WAC.overlay = el('div', { class: 'wac-overlay' });
            WAC.toast   = el('div', { class: 'wac-toast', role: 'alert', 'aria-live': 'polite' });
            WAC.variationOverlay = el('div', { class: 'wac-var-overlay', 'aria-hidden': 'true' });
            WAC.variationSheet = el('div', { class: 'wac-var-sheet', role: 'dialog', 'aria-modal': 'true', 'aria-hidden': 'true' });
            document.body.appendChild(WAC.overlay);
            document.body.appendChild(WAC.toast);
            document.body.appendChild(WAC.variationOverlay);
            document.body.appendChild(WAC.variationSheet);

            WAC.refreshNonce();   // تحديث الـ nonce فوراً لتجاوز الكاش

            on(WAC.overlay, 'click', WAC.hide);
            on(WAC.variationOverlay, 'click', WAC.closeVariationSheet);

            if (document.body.classList.contains('single-product')) {
                document.addEventListener('submit', function (e) {
                    var f = e.target;
                    if (f && f.tagName === 'FORM' && hasClass(f, 'cart')) WAC.onSubmit(e, f);
                }, true);

                document.addEventListener('click', function (e) {
                    var btn = e.target.closest ? e.target.closest('[data-wac-buy-now="1"]') : null;
                    if (!btn) return;

                    var form = btn.closest('form.cart');
                    if (!form) return;

                    WAC.onSubmit(e, form, true, btn);
                }, true);

                document.addEventListener('click', function (e) {
                    var btn = e.target.closest ? e.target.closest('[data-wac-sticky-add="1"]') : null;
                    if (!btn) return;

                    var form = document.querySelector('form.cart');
                    if (!form) return;

                    WAC.onSubmit(e, form, false, btn);
                }, true);

                WAC.initStickyBar();
            }

            if (window.jQuery) {
                window.jQuery(document.body).on('added_to_cart', function (e, fragments, cart_hash, $btn) {
                    WAC.onNativeAdded($btn && $btn.length ? $btn[0] : null);
                });
            }
        },

        initStickyBar: function () {
            var bar = document.querySelector('[data-wac-sticky-bar="1"]');
            if (!bar) return;

            var offset = parseInt(wacData.stickyBarOffset, 10);
            if (isNaN(offset) || offset < 80) offset = 350;

            var sync = function () {
                var y = window.pageYOffset || document.documentElement.scrollTop || 0;
                bar.classList.toggle('wac-sticky-bar--show', y >= offset);
                bar.setAttribute('aria-hidden', y >= offset ? 'false' : 'true');
            };

            sync();
            window.addEventListener('scroll', sync, { passive: true });
            window.addEventListener('resize', sync);
        },

        isStickyButton: function (btn) {
            return !!(btn && btn.getAttribute && btn.getAttribute('data-wac-sticky-add') === '1');
        },

        isVariationSheetButton: function (btn) {
            return !!(btn && btn.getAttribute && btn.getAttribute('data-wac-var-add') === '1');
        },

        setButtonLoading: function (btn, buyNow) {
            if (!btn) return;
            btn.disabled = true;
            btn.classList.add('wac-btn-loading');

            if (WAC.isStickyButton(btn) || WAC.isVariationSheetButton(btn)) {
                btn.classList.remove('wac-sticky-bar-button--done', 'wac-var-add--done');
                btn.innerHTML = '<span class="wac-sticky-bar-spinner" aria-hidden="true"></span><span>' + escHtml(wacData.addingText || 'جاري الإضافة...') + '</span>';
                return;
            }

            btn.textContent = buyNow ? (wacData.buyNowLoadingText || wacData.addingText) : wacData.addingText;
        },

        restoreButton: function (btn, originalHtml) {
            if (!btn) return;
            btn.disabled = false;
            btn.classList.remove('wac-btn-loading', 'wac-sticky-bar-button--done', 'wac-var-add--done');
            btn.innerHTML = originalHtml;
        },

        markButtonSuccess: function (btn, originalHtml, done) {
            done = typeof done === 'function' ? done : function () {};
            var isVariationSheet = WAC.isVariationSheetButton(btn);

            if (isVariationSheet) {
                WAC.closeVariationSheet();
                WAC.restoreButton(btn, originalHtml);
                setTimeout(done, 180);
                return;
            }

            WAC.restoreButton(btn, originalHtml);
            done();
        },

        triggerChange: function (node) {
            if (!node) return;
            node.dispatchEvent(new Event('change', { bubbles: true }));
            if (window.jQuery) {
                window.jQuery(node).trigger('change');
            }
        },

        compactPriceHtml: function (current, regular) {
            var c = parseFloat(current) || 0;
            var r = parseFloat(regular) || 0;
            if (c > 0 && r > c) {
                return '<span class="wac-var-price-current">' + WAC.formatAmount(c) + '</span>' +
                    '<del class="wac-var-price-regular">' + WAC.formatAmount(r) + '</del>';
            }
            return c > 0 ? '<span class="wac-var-price-current">' + WAC.formatAmount(c) + '</span>' : '';
        },

        getVariationData: function (form) {
            if (!form) return [];

            if (window.jQuery) {
                var jqData = window.jQuery(form).data('product_variations');
                if (Array.isArray(jqData)) return jqData;
            }

            var raw = form.getAttribute('data-product_variations') || '';
            if (!raw || raw === 'false') return [];

            try {
                raw = raw.replace(/&quot;/g, '"');
                var parsed = JSON.parse(raw);
                return Array.isArray(parsed) ? parsed : [];
            } catch (e) {
                return [];
            }
        },

        getOptionVariationImage: function (variations, attrName, attrValue) {
            for (var i = 0; i < variations.length; i++) {
                var variation = variations[i] || {};
                var attrs = variation.attributes || {};
                var value = attrs[attrName];
                if (value !== attrValue) continue;

                var image = variation.image || {};
                var src = image.thumb_src || image.gallery_thumbnail_src || image.src || '';
                if (src) return src;
            }

            return '';
        },

        isVariationPurchasable: function (variation) {
            if (!variation) return false;
            if (variation.is_in_stock === false) return false;
            if (variation.is_purchasable === false) return false;
            if (variation.variation_is_active === false) return false;
            if (variation.variation_is_visible === false) return false;
            return true;
        },

        isOptionAvailable: function (form, variations, attrName, attrValue, optionNode) {
            if (optionNode && optionNode.disabled) return false;

            var field = WAC.getViswFieldForAttribute(form, attrName);
            if (field) {
                var swatches = Array.prototype.slice.call(field.querySelectorAll('.visw-option'));
                for (var s = 0; s < swatches.length; s++) {
                    if (String(swatches[s].getAttribute('data-value') || '') !== String(attrValue || '')) continue;
                    if (
                        swatches[s].classList.contains('is-disabled') ||
                        swatches[s].getAttribute('aria-disabled') === 'true' ||
                        swatches[s].disabled
                    ) {
                        return false;
                    }
                    break;
                }
            }

            if (!variations || !variations.length) return true;

            var selected = WAC.getSelectedAttributes(form);
            selected[attrName] = attrValue;

            for (var i = 0; i < variations.length; i++) {
                var variation = variations[i] || {};
                var attrs = variation.attributes || {};
                var matches = true;

                Object.keys(selected).forEach(function (name) {
                    if (!matches || !selected[name]) return;
                    var variationValue = attrs[name] || '';
                    if (variationValue && String(variationValue) !== String(selected[name])) {
                        matches = false;
                    }
                });

                if (!matches) continue;
                if (WAC.isVariationPurchasable(variation)) return true;
            }

            return false;
        },

        getSelectedAttributes: function (form) {
            var selected = {};
            var selects = Array.prototype.slice.call(form.querySelectorAll('select[name^="attribute_"]'));

            for (var i = 0; i < selects.length; i++) {
                var name = selects[i].getAttribute('name') || selects[i].getAttribute('data-attribute_name') || '';
                if (name) selected[name] = selects[i].value || '';
            }

            Array.prototype.slice.call(form.querySelectorAll('.visw-hidden-attribute')).forEach(function (input) {
                var name = input.getAttribute('data-attribute_name') || input.getAttribute('name') || '';
                if (name && input.value) selected[name] = input.value;
            });

            return selected;
        },

        getViswFieldForAttribute: function (form, attrName) {
            var fields = Array.prototype.slice.call(form.querySelectorAll('.visw-field'));

            for (var i = 0; i < fields.length; i++) {
                var node = fields[i].previousElementSibling;
                while (node) {
                    if (node.classList && node.classList.contains('visw-hidden-attribute') &&
                        node.getAttribute('data-attribute_name') === attrName) {
                        return fields[i];
                    }

                    if (node.classList && node.classList.contains('visw-native-select')) break;
                    node = node.previousElementSibling;
                }
            }

            return null;
        },

        syncVartionSwatch: function (form, attrName, value) {
            var field = WAC.getViswFieldForAttribute(form, attrName);
            if (!field) return;

            var node = field.previousElementSibling;
            while (node) {
                if (node.classList && node.classList.contains('visw-hidden-attribute') &&
                    node.getAttribute('data-attribute_name') === attrName) {
                    node.value = value;
                    break;
                }
                node = node.previousElementSibling;
            }

            Array.prototype.slice.call(field.querySelectorAll('.visw-option')).forEach(function (option) {
                var selected = String(option.getAttribute('data-value') || '') === String(value || '');
                option.classList.toggle('is-selected', selected);
                option.setAttribute('aria-checked', selected ? 'true' : 'false');
            });
        },

        syncAllVartionSwatches: function (form) {
            if (!form) return;
            Array.prototype.slice.call(form.querySelectorAll('select[name^="attribute_"]')).forEach(function (select) {
                WAC.syncVartionSwatch(form, select.getAttribute('name') || '', select.value || '');
            });
        },

        getVartionOptionImage: function (form, attrName, attrValue) {
            var field = WAC.getViswFieldForAttribute(form, attrName);
            if (!field) return '';

            var options = Array.prototype.slice.call(field.querySelectorAll('.visw-option'));
            for (var i = 0; i < options.length; i++) {
                if (String(options[i].getAttribute('data-value') || '') !== String(attrValue || '')) continue;

                var img = options[i].querySelector('img');
                return options[i].getAttribute('data-main_image') || (img ? img.getAttribute('src') : '') || '';
            }

            return '';
        },

        getVartionSelectedVariationId: function (form) {
            var selected = Array.prototype.slice.call(form.querySelectorAll('.visw-option.is-selected[data-variation_id]'));
            if (!selected.length) return 0;

            var values = [];
            for (var i = 0; i < selected.length; i++) {
                var id = parseInt(selected[i].getAttribute('data-variation_id') || 0, 10);
                if (id > 0 && values.indexOf(id) === -1) values.push(id);
            }

            return values.length === 1 ? values[0] : 0;
        },

        getVariationById: function (form, variationId) {
            var variations = WAC.getVariationData(form);
            var id = parseInt(variationId || 0, 10);
            if (!id) return null;

            for (var i = 0; i < variations.length; i++) {
                if (parseInt((variations[i] || {}).variation_id || 0, 10) === id) return variations[i];
            }

            return null;
        },

        getVartionSelectedImageVariation: function (form) {
            var option = form ? form.querySelector('.visw-option.is-selected') : null;
            if (!option) return null;

            var img = option.querySelector('img');
            var src = option.getAttribute('data-main_image') || (img ? img.getAttribute('src') : '') || '';
            if (!src) return null;

            return {
                variation_id: parseInt(option.getAttribute('data-variation_id') || 0, 10) || 0,
                image: {
                    src: src,
                    full_src: src,
                    thumb_src: img ? (img.getAttribute('src') || src) : src,
                    srcset: option.getAttribute('data-main_srcset') || '',
                    sizes: option.getAttribute('data-main_sizes') || '',
                    alt: option.getAttribute('data-main_alt') || option.getAttribute('title') || '',
                    title: option.getAttribute('data-main_title') || option.getAttribute('title') || ''
                }
            };
        },

        getSelectedVariationForImage: function (form) {
            var variation = WAC.findSelectedVariation(form);
            if (variation) return variation;

            var variationId = WAC.ensureVariationId(form);
            variation = WAC.getVariationById(form, variationId);
            if (variation) return variation;

            return WAC.getVartionSelectedImageVariation(form);
        },

        updateMainProductImage: function (form, variation) {
            if (!form || !variation || !variation.image) return;

            var image = variation.image || {};
            var src = image.full_src || image.src || image.thumb_src || '';
            if (!src) return;

            if (window.jQuery) {
                var $form = window.jQuery(form);
                if (typeof $form.wc_variations_image_update === 'function') {
                    try {
                        $form.wc_variations_image_update(variation);
                    } catch (err) {}
                }
            }

            var scope = form.closest('.product') || document;
            var mainImage = scope.querySelector('.woocommerce-product-gallery__image img, .woocommerce-product-gallery img.wp-post-image, .woocommerce-product-gallery img, img.wp-post-image');
            if (mainImage) {
                mainImage.setAttribute('src', src);
                mainImage.setAttribute('data-src', src);
                mainImage.setAttribute('data-large_image', image.full_src || src);
                if (image.srcset) mainImage.setAttribute('srcset', image.srcset);
                else mainImage.removeAttribute('srcset');
                if (image.sizes) mainImage.setAttribute('sizes', image.sizes);
                else mainImage.removeAttribute('sizes');
                if (image.alt) mainImage.setAttribute('alt', image.alt);
                if (image.title) mainImage.setAttribute('title', image.title);

                var link = mainImage.closest('a');
                if (link) link.setAttribute('href', image.full_src || src);
            }

            var sheetImg = WAC.variationSheet ? $find(WAC.variationSheet, '.wac-var-image') : null;
            if (sheetImg) sheetImg.setAttribute('src', image.thumb_src || src);
        },

        updateSelectedVariationImage: function (form) {
            WAC.updateMainProductImage(form, WAC.getSelectedVariationForImage(form));
        },

        findSelectedVariation: function (form) {
            var variations = WAC.getVariationData(form);
            if (!variations.length) return null;

            var selected = WAC.getSelectedAttributes(form);
            for (var selectedKey in selected) {
                if (Object.prototype.hasOwnProperty.call(selected, selectedKey) && !selected[selectedKey]) return null;
            }

            for (var v = 0; v < variations.length; v++) {
                var variation = variations[v] || {};
                var attrs = variation.attributes || {};
                var matched = true;

                for (var key in selected) {
                    if (!Object.prototype.hasOwnProperty.call(selected, key)) continue;
                    if (attrs[key] && attrs[key] !== selected[key]) {
                        matched = false;
                        break;
                    }
                }

                if (matched && variation.variation_id) return variation;
            }

            return null;
        },

        ensureVariationId: function (form) {
            if (!form) return 0;

            var variationInput = form.querySelector('[name="variation_id"]');
            var selectedVariation = WAC.findSelectedVariation(form);
            var variationId = parseInt((selectedVariation || {}).variation_id || 0, 10);
            if (!variationId) {
                variationId = WAC.getVartionSelectedVariationId(form);
            }
            if (variationId > 0) {
                if (!variationInput) {
                    variationInput = document.createElement('input');
                    variationInput.type = 'hidden';
                    variationInput.name = 'variation_id';
                    form.appendChild(variationInput);
                }
                variationInput.value = variationId;
                return variationId;
            }

            return parseInt((variationInput || {}).value || 0, 10);
        },

        isColorAttribute: function (name, label) {
            var text = ((name || '') + ' ' + (label || '')).toLowerCase();
            return text.indexOf('color') !== -1 || text.indexOf('colour') !== -1 || text.indexOf('لون') !== -1;
        },

        openVariationSheet: function (form, buyNow, clickedBtn) {
            if (!form || !WAC.variationSheet || !WAC.variationOverlay) return false;

            var selects = Array.prototype.slice.call(form.querySelectorAll('select[name^="attribute_"]'));
            if (!selects.length) return false;
            var variations = WAC.getVariationData(form);

            WAC.variationSheetIntent = { form: form, buyNow: !!buyNow, clickedBtn: clickedBtn || null };

            var title = '';
            var image = '';
            var price = '';
            var productTitle = document.querySelector('.product_title, h1.product_title, h1.entry-title');
            if (productTitle) title = productTitle.textContent.trim();

            var stickyTitle = document.querySelector('.wac-sticky-bar-title');
            if (!title && stickyTitle) title = stickyTitle.textContent.trim();

            var stickyImg = document.querySelector('.wac-sticky-bar-img');
            if (stickyImg) image = stickyImg.getAttribute('src') || '';
            if (!image) {
                var mainImg = document.querySelector('.woocommerce-product-gallery img, .product img.wp-post-image');
                if (mainImg) image = mainImg.getAttribute('src') || '';
            }

            var stickyPrice = document.querySelector('.wac-sticky-bar-price');
            if (stickyPrice) price = stickyPrice.innerHTML;

            var groups = '';
            selects.forEach(function (select) {
                var name = select.getAttribute('name') || '';
                var row = select.closest('tr, .value, .form-row, .variations');
                var labelNode = row ? row.querySelector('label') : null;
                var label = labelNode ? labelNode.textContent.replace(':', '').trim() : name.replace(/^attribute_pa?_?/i, '').replace(/_/g, ' ');
                var selected = select.value || '';
                var options = '';
                var isColor = WAC.isColorAttribute(name, label);

                Array.prototype.slice.call(select.options || []).forEach(function (opt) {
                    if (!opt.value) return;
                    if (!WAC.isOptionAvailable(form, variations, name, opt.value, opt)) return;
                    var active = opt.value === selected ? ' wac-var-option--active' : '';
                    var optionImage = WAC.getVartionOptionImage(form, name, opt.value) || WAC.getOptionVariationImage(variations, name, opt.value);
                    var imageClass = optionImage ? ' wac-var-option--image' : '';
                    var optionContent = optionImage
                        ? '<img src="' + escAttr(optionImage) + '" class="wac-var-option-img" alt="' + escAttr(opt.text || opt.value) + '"><span class="wac-var-option-name">' + escHtml(opt.text || opt.value) + '</span>'
                        : escHtml(opt.text || opt.value);
                    options += '<button type="button" class="wac-var-option' + imageClass + active + '" data-wac-attr="' + escAttr(name) + '" data-wac-value="' + escAttr(opt.value) + '" title="' + escAttr(opt.text || opt.value) + '">' + optionContent + '</button>';
                });

                if (!options) return;

                groups += '<div class="wac-var-group' + (isColor ? ' wac-var-group--color' : '') + '" data-wac-var-group="' + escAttr(name) + '">' +
                    (isColor ? '' : '<div class="wac-var-label">' + escHtml(label) + '</div>') +
                    '<div class="wac-var-options">' + options + '</div>' +
                '</div>';
            });

            var qtyInput = form.querySelector('[name="quantity"]');
            var qty = qtyInput ? parseFloat(qtyInput.value) : 1;
            if (!qty || qty < 1) qty = 1;
            if (qtyInput && !qtyInput.value) qtyInput.value = qty;
            var addLabel = buyNow ? 'شراء الآن' : 'أضف للسلة';

            WAC.variationSheet.innerHTML =
                '<button type="button" class="wac-var-close" data-wac-var-close="1" aria-label="إغلاق">' + ICONS.close + '</button>' +
                '<div class="wac-var-head">' +
                    (image ? '<div class="wac-var-image-wrap"><img src="' + escAttr(image) + '" class="wac-var-image" alt=""></div>' : '') +
                    '<div class="wac-var-head-info">' +
                        (title ? '<div class="wac-var-title">' + escHtml(title) + '</div>' : '') +
                        '<div class="wac-var-price">' + price + '</div>' +
                    '</div>' +
                '</div>' +
                '<div class="wac-var-body">' + groups + '<button type="button" class="wac-var-clear" data-wac-var-clear="1">مسح الاختيار</button></div>' +
                '<div class="wac-var-footer">' +
                    '<div class="wac-var-qty"><button type="button" data-wac-var-qty="-1">-</button><input type="number" min="1" step="1" value="' + escAttr(qty) + '" data-wac-var-qty-input="1"><button type="button" data-wac-var-qty="1">+</button></div>' +
                    '<button type="button" class="wac-var-add" data-wac-var-add="1"><span class="wac-var-add-icon">' + ICONS.cart + '</span><span>' + addLabel + '</span></button>' +
                '</div>';

            WAC.bindVariationSheet();
            WAC.syncVariationSheetFromForm(form);
            WAC.variationOverlay.classList.add('wac-var-overlay--show');
            WAC.variationOverlay.setAttribute('aria-hidden', 'false');
            WAC.variationSheet.classList.add('wac-var-sheet--show');
            WAC.variationSheet.setAttribute('aria-hidden', 'false');
            document.documentElement.classList.add('wac-var-open');
            return true;
        },

        waitForVariationId: function (form, done, fail, attempts) {
            attempts = attempts == null ? 20 : attempts;

            var variationId = WAC.ensureVariationId(form);
            if (variationId > 0) {
                done();
                return;
            }

            if (window.jQuery && form) {
                window.jQuery(form).trigger('check_variations');
            }

            if (attempts <= 0) {
                if (typeof fail === 'function') fail();
                return;
            }

            setTimeout(function () {
                WAC.waitForVariationId(form, done, fail, attempts - 1);
            }, 100);
        },

        bindVariationSheet: function () {
            var sheet = WAC.variationSheet;
            var intent = WAC.variationSheetIntent || {};
            var form = intent.form;
            if (!sheet || !form) return;

            $all(sheet, '[data-wac-var-close="1"]').forEach(function (btn) {
                on(btn, 'click', WAC.closeVariationSheet);
            });

            $all(sheet, '[data-wac-attr]').forEach(function (btn) {
                on(btn, 'click', function () {
                    var name = btn.getAttribute('data-wac-attr');
                    var value = btn.getAttribute('data-wac-value') || '';
                    var select = form.querySelector('select[name="' + cssEscape(name) + '"]');
                    if (!select) return;

                    select.value = value;
                    WAC.syncVartionSwatch(form, name, value);
                    WAC.triggerChange(select);
                    if (window.jQuery) {
                        window.jQuery(form).trigger('woocommerce_variation_select_change').trigger('check_variations');
                    }
                    WAC.updateSelectedVariationImage(form);
                    WAC.syncVariationSheetFromForm(form);
                });
            });

            var qtyInput = $find(sheet, '[data-wac-var-qty-input="1"]');
            $all(sheet, '[data-wac-var-qty]').forEach(function (btn) {
                on(btn, 'click', function () {
                    var delta = parseInt(btn.getAttribute('data-wac-var-qty'), 10) || 0;
                    var current = parseFloat(qtyInput.value || 1) || 1;
                    qtyInput.value = Math.max(1, current + delta);
                    var originalQty = form.querySelector('[name="quantity"]');
                    if (originalQty) originalQty.value = qtyInput.value;
                });
            });
            if (qtyInput) {
                on(qtyInput, 'input', function () {
                    var originalQty = form.querySelector('[name="quantity"]');
                    var value = Math.max(1, parseFloat(qtyInput.value || 1) || 1);
                    qtyInput.value = value;
                    if (originalQty) originalQty.value = value;
                });
            }

            var clear = $find(sheet, '[data-wac-var-clear="1"]');
            if (clear) {
                on(clear, 'click', function () {
                    form.querySelectorAll('select[name^="attribute_"]').forEach(function (select) {
                        select.value = '';
                        WAC.syncVartionSwatch(form, select.getAttribute('name') || '', '');
                        WAC.triggerChange(select);
                    });
                    WAC.syncVariationSheetFromForm(form);
                });
            }

            var add = $find(sheet, '[data-wac-var-add="1"]');
            if (add) {
                on(add, 'click', function (e) {
                    var missing = Array.prototype.some.call(form.querySelectorAll('select[name^="attribute_"]'), function (select) {
                        return !select.value;
                    });
                    if (missing) {
                        sheet.classList.add('wac-var-sheet--shake');
                        setTimeout(function () { sheet.classList.remove('wac-var-sheet--shake'); }, 360);
                        return;
                    }

                    if (add.disabled) return;
                    add.disabled = true;

                    if (window.jQuery) {
                        window.jQuery(form).trigger('check_variations');
                    }

                    WAC.waitForVariationId(form, function () {
                        WAC.onSubmit(e, form, intent.buyNow, add);
                    }, function () {
                        add.disabled = false;
                        sheet.classList.add('wac-var-sheet--shake');
                        setTimeout(function () { sheet.classList.remove('wac-var-sheet--shake'); }, 360);
                    });
                });
            }

            if (window.jQuery) {
                window.jQuery(form).off('.wacVarSheet').on('found_variation.wacVarSheet show_variation.wacVarSheet', function (event, variation) {
                    if (!variation) return;
                    var price = variation.display_price ? WAC.compactPriceHtml(variation.display_price, variation.display_regular_price) : '';
                    var priceBox = $find(sheet, '.wac-var-price');
                    if (price && priceBox) priceBox.innerHTML = price;
                    var img = variation.image && (variation.image.thumb_src || variation.image.src);
                    var imgNode = $find(sheet, '.wac-var-image');
                    if (img && imgNode) imgNode.setAttribute('src', img);
                    WAC.updateMainProductImage(form, variation);
                });
            }
        },

        syncVariationSheetFromForm: function (form) {
            if (!WAC.variationSheet || !form) return;
            form.querySelectorAll('select[name^="attribute_"]').forEach(function (select) {
                var name = select.getAttribute('name');
                WAC.variationSheet.querySelectorAll('[data-wac-attr="' + cssEscape(name) + '"]').forEach(function (btn) {
                    btn.classList.toggle('wac-var-option--active', btn.getAttribute('data-wac-value') === select.value);
                });
            });
        },

        closeVariationSheet: function () {
            if (!WAC.variationSheet || !WAC.variationOverlay) return;
            WAC.variationOverlay.classList.remove('wac-var-overlay--show');
            WAC.variationOverlay.setAttribute('aria-hidden', 'true');
            WAC.variationSheet.classList.remove('wac-var-sheet--show');
            WAC.variationSheet.setAttribute('aria-hidden', 'true');
            document.documentElement.classList.remove('wac-var-open');
        },

        onSubmit: function (e, form, buyNow, clickedBtn) {
            if (!form.querySelector('[name="add-to-cart"]') &&
                !form.querySelector('[name="product_id"]')) return;

            e.preventDefault();
            e.stopImmediatePropagation();

            var btn        = clickedBtn || form.querySelector('[type="submit"]:not([name="update_cart"])');
            var productId  = parseInt((form.querySelector('[name="product_id"]') || form.querySelector('[name="add-to-cart"]') || {}).value || 0, 10);
            var variation  = form.querySelector('[name="variation_id"]');
            var variationId = WAC.ensureVariationId(form) || parseInt((variation || {}).value || 0, 10);
            var qty = parseFloat((form.querySelector('[name="quantity"]') || {}).value || 1);

            if (form.classList.contains('variations_form')) {
                if (!variationId || variationId < 1) {
                    if (!WAC.openVariationSheet(form, buyNow, clickedBtn)) {
                        WAC.show(WAC.errorHtml(wacData.selectVar), 'error');
                    }
                    return;
                }
            }

            var attrs = {};
            $all(form, '[name^="attribute_"]').forEach(function (n) { attrs[n.name] = n.value; });

            var originalHtml = btn ? btn.innerHTML : '';
            if (btn) {
                WAC.setButtonLoading(btn, buyNow);
            }

            var data = {
                action: 'woo_ajax_add_to_cart',
                nonce: wacData.nonce,
                product_id: productId,
                variation_id: variationId,
                quantity: qty,
                _wacBuyNow: buyNow ? 1 : 0
            };
            for (var k in attrs) data[k] = attrs[k];

            // ننتظر تحديث الـ nonce قبل الإرسال لتجنب nonce قديم من الكاش
            WAC.refreshNonce().then(function () {
                data.nonce = wacData.nonce;
                WAC.request(data, btn, originalHtml, 0);
            });
        },

        request: function (data, btn, originalHtml, attempt) {
            var body = new URLSearchParams();
            for (var k in data) body.append(k, data[k]);

            fetch(wacData.ajaxUrl + '?_=' + Date.now(), {
                method: 'POST',
                credentials: 'same-origin',
                headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' },
                body: body.toString()
            })
            .then(function (r) {
                if (!r.ok) throw new Error('http_' + r.status);
                return r.json();
            })
            .then(function (res) {
                if (!res.success && res.data && res.data.code === 'nonce_expired' && res.data.new_nonce && attempt === 0) {
                    wacData.nonce = res.data.new_nonce;
                    data.nonce = res.data.new_nonce;
                    WAC.request(data, btn, originalHtml, 1);
                    return;
                }
                if (res.success) {
                    WAC._ownAdd = true;
                    if (window.jQuery && typeof window.wc_cart_fragments_params !== 'undefined') {
                        window.jQuery(document.body).trigger('wc_fragment_refresh');
                        window.jQuery(document.body).trigger('added_to_cart', [{}, {}, btn ? window.jQuery(btn) : window.jQuery()]);
                    }
                    WAC._ownAdd = false;

                    if (res.data && typeof res.data.cart_subtotal !== 'undefined') {
                        WAC._lastSubtotal = parseFloat(res.data.cart_subtotal);
                    }
                    if (parseInt(data._wacBuyNow, 10)) {
                        window.location.href = wacData.checkoutUrl;
                        return;
                    }
                    if (btn) {
                        WAC.markButtonSuccess(btn, originalHtml, function () {
                            WAC.show(WAC.successHtml(res.data || {}), 'success');
                        });
                    } else {
                        WAC.show(WAC.successHtml(res.data || {}), 'success');
                    }
                } else {
                    if (btn) {
                        WAC.restoreButton(btn, originalHtml);
                    }
                    var msg = (res.data && res.data.message) ? res.data.message : wacData.errorText;
                    WAC.show(WAC.errorHtml(msg), 'error');
                }
            })
            .catch(function () {
                if (btn) {
                    WAC.restoreButton(btn, originalHtml);
                }
                WAC.show(WAC.errorHtml(wacData.errorText), 'error');
            });
        },

        onNativeAdded: function (btn) {
            if (WAC._ownAdd) return;
            if (document.body.classList.contains('single-product')) return;

            var name = '', img = '';
            if (btn) {
                var product = btn.closest('li.product, .product');
                if (product) {
                    var t = product.querySelector('.woocommerce-loop-product__title, h2, h3');
                    if (t) name = t.textContent.trim();
                    var i = product.querySelector('img.wp-post-image, img');
                    if (i) img = i.getAttribute('src') || '';
                }
            }
            var baseData = { product_name: name, product_image: img };

            var body = new URLSearchParams();
            body.append('action', 'wac_get_cart_totals');
            fetch(wacData.ajaxUrl + '?_=' + Date.now(), {
                method: 'POST',
                credentials: 'same-origin',
                headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' },
                body: body.toString()
            })
            .then(function (r) { return r.json(); })
            .then(function (res) {
                if (res && res.success && res.data) {
                    WAC._lastSubtotal = parseFloat(res.data.cart_subtotal);
                    WAC.show(WAC.successHtml(Object.assign({}, baseData, res.data)), 'success');
                } else {
                    WAC.show(WAC.successHtml(baseData), 'success');
                }
            })
            .catch(function(){
                WAC.show(WAC.successHtml(baseData), 'success');
            });
        },

        formatAmount: function (amount) {
            var n = parseFloat(amount) || 0;
            var f = (Math.round(n * 100) / 100).toLocaleString('ar', {
                minimumFractionDigits: 0, maximumFractionDigits: 2
            });
            return f + ' ' + (wacData.currencySymbol || '');
        },

        // ─── شريط الشحن المجاني ───
        shipBarHtml: function (subtotal) {
            if (!parseInt(wacData.enableShipBar)) return '';
            var threshold = parseFloat(wacData.freeShipThreshold) || 0;
            if (threshold <= 0) return '';
            var sub = parseFloat(subtotal);
            if (isNaN(sub) || sub < 0) sub = 0;
            var pct = Math.min(100, Math.round((sub / threshold) * 100));
            var unlocked = sub >= threshold;
            var msg, savings;
            if (unlocked) {
                msg = wacData.freeShipUnlockedText;
                // التوفير = قيمة الشحن المُوفّرة (مثلاً 20)
                var savedAmt = parseFloat(wacData.shippingCost) || 20;
                savings = '<span class="wac-ship-savings">' +
                              '<span>' + ICONS.savings + '</span>' +
                              '<span>وفّرتي ' + WAC.formatAmount(savedAmt) + '</span>' +
                          '</span>';
            } else {
                var remaining = Math.max(0, threshold - sub);
                var tpl = wacData.freeShipRemainingTpl || 'أضف %s للحصول على الشحن المجاني';
                msg = tpl.replace('%s', '<strong>' + WAC.formatAmount(remaining) + '</strong>');
                savings = '';
            }
            return '<div class="wac-ship-bar">' +
                       '<div class="wac-ship-bar-row">' +
                           '<span class="wac-ship-icon">' + ICONS.truckFast + '</span>' +
                           '<span class="wac-ship-bar-msg"><span class="wac-ship-bar-text">' + msg + '</span></span>' +
                           savings +
                       '</div>' +
                       '<div class="wac-ship-bar-track">' +
                           '<div class="wac-ship-bar-fill" style="width:' + pct + '%"></div>' +
                       '</div>' +
                   '</div>';
        },

        updateShipBar: function (subtotal) {
            if (!WAC.toast || !WAC.toast.classList.contains('wac-toast--show')) return;
            var bar = $find(WAC.toast, '.wac-ship-bar');
            var html = WAC.shipBarHtml(subtotal);
            if (!html) return;
            if (!bar) {
                var top = $find(WAC.toast, '.wac-toast-top');
                if (top) top.insertAdjacentHTML('afterend', html);
                return;
            }
            bar.outerHTML = html;
            var fill = $find(WAC.toast, '.wac-ship-bar-fill');
            if (fill) {
                var w = fill.style.width;
                fill.style.width = '0%';
                setTimeout(function () { fill.style.width = w; }, 30);
            }
        },

        // ─── الكوبون (مع دائرة النسبة) ───
        couponHtml: function (subtotal) {
            if (!parseInt(wacData.enableCoupon)) return '';
            var code = (wacData.couponCode || '').trim();
            if (!code) return '';
            var min = parseFloat(wacData.couponMin) || 0;
            var sub = parseFloat(subtotal);
            if (min > 0 && (isNaN(sub) || sub < min)) return '';

            var label    = wacData.couponLabel || 'كوبون خصم حصري لك';
            var desc     = wacData.couponDesc  || '';
            var copyTxt  = wacData.couponCopyText || 'نسخ الكود';
            var note     = wacData.couponNote || 'استخدمي الكود في صفحة الدفع';
            var pct      = parseInt(wacData.couponPercent || 0, 10);

            var circle = pct > 0 ? '<div class="wac-coupon-circle">' +
                                       '<span class="wac-coupon-circle-pct">' + pct + '%</span>' +
                                       '<span class="wac-coupon-circle-label">وفري أكثر</span>' +
                                   '</div>' : '';

            return '<div class="wac-coupon">' +
                       '<div class="wac-coupon-head">' +
                           '<span class="wac-coupon-icon-tag">' + ICONS.ticket + '</span>' +
                           '<span class="wac-coupon-label">' + label + '</span>' +
                       '</div>' +
                       '<div class="wac-coupon-row">' +
                           '<button type="button" class="wac-coupon-copy" data-wac-coupon-copy="1">' +
                               '<span class="wac-coupon-copy-icon">' + ICONS.copy + '</span>' +
                               '<span class="wac-coupon-copy-text">' + copyTxt + '</span>' +
                           '</button>' +
                           '<div class="wac-coupon-main">' +
                               '<div class="wac-coupon-code" data-wac-coupon-code="' + escAttr(code) + '">' +
                                   '<span class="wac-coupon-code-text">' + code + '</span>' +
                                   (desc ? '<span class="wac-coupon-code-desc">' + desc + '</span>' : '') +
                               '</div>' +
                           '</div>' +
                           circle +
                       '</div>' +
                       (note ? '<div class="wac-coupon-note">' + note + '</div>' : '') +
                   '</div>';
        },

        // ─── شارات الثقة (4 عناصر) ───
        bogoPromptHtml: function (prompt) {
            if (!prompt || !prompt.message) return '';

            return '<div class="wac-bogo-prompt">' +
                       '<span class="wac-bogo-prompt-icon">' + ICONS.ticket + '</span>' +
                       '<span class="wac-bogo-prompt-text">' + escHtml(prompt.message) + '</span>' +
                   '</div>';
        },

        trustBadgesHtml: function () {
            if (!parseInt(wacData.enableTrustBadges)) return '';
            var b1 = (wacData.trustBadge1 || '').trim() || 'توصيل سريع لجميع المناطق';
            var b2 = (wacData.trustBadge2 || '').trim() || 'منتجات أصلية 100%';
            var b3 = (wacData.trustBadge3 || '').trim() || 'دفع آمن 100%';
            var b4 = (wacData.trustBadge4 || '').trim() || 'خدمة عملاء 24/7';

            var item = function (icon, text) {
                return '<div class="wac-trust-item">' +
                           '<span class="wac-trust-icon">' + icon + '</span>' +
                           '<span class="wac-trust-text">' + text + '</span>' +
                       '</div>';
            };
            return '<div class="wac-trust-badges">' +
                       item(ICONS.truckFast, b1) +
                       item(ICONS.medal, b2) +
                       item(ICONS.shield, b3) +
                       item(ICONS.headset, b4) +
                   '</div>';
        },

        // ─── إثبات اجتماعي + المخزون المتبقي ───
        socialAndStockHtml: function () {
            var avatarColors = ['#fb7185', '#60a5fa', '#fbbf24', '#34d399'];
            var avatars = '';
            for (var i = 0; i < 3; i++) {
                avatars += '<span style="background:' + avatarColors[i] + '"></span>';
            }
            return '<div class="wac-social-row">' +
                       '<div class="wac-social-proof">' +
                           '<span class="wac-social-avatars">' + avatars + '</span>' +
                           '<span class="wac-social-text"><strong>' + SOCIAL_COUNT + '</strong> عميل اشتروا هذا المنتج اليوم</span>' +
                       '</div>' +
                       '<span class="wac-low-stock">' +
                           '<span class="wac-low-stock-icon">' + ICONS.flame + '</span>' +
                           '<span>يتبقى ' + STOCK_LEFT + ' قطع فقط في المخزون</span>' +
                       '</span>' +
                   '</div>';
        },

        // ─── المنتجات المقترحة ───
        crossSellsHtml: function (items) {
            if (!items || !items.length) return '';
            var title = wacData.crossSellsTitle || 'عملاؤنا أحبوا هذه المنتجات';
            var subtitle = wacData.crossSellsSubtitle || 'اختاري ما يناسب ذوقك وكملي تجربة راحتك';
            var addText = wacData.crossSellsAddText || 'أضف للسلة';
            var selText = wacData.crossSellsSelectText || 'اختر الخيارات';
            var bestseller = wacData.crossSellsBestseller || 'الأكثر مبيعاً';

            var rows = '';
            for (var i = 0; i < items.length; i++) {
                var it = items[i];
                var btn;
                if (it.is_simple) {
                    btn = '<button type="button" class="wac-cs-btn wac-cs-btn--add" data-wac-cs-add="' + it.id + '">' +
                              '<span class="wac-toast-icon">' + ICONS.cart + '</span> ' + addText +
                          '</button>';
                } else {
                    btn = '<a href="' + it.permalink + '" class="wac-cs-btn wac-cs-btn--select">' +
                              '<span class="wac-toast-icon">' + ICONS.arrow + '</span> ' + selText +
                          '</a>';
                }
                var badge = (i === 0) ? '<span class="wac-cs-bestseller">' + bestseller + '</span>' : '';
                rows +=
                    '<div class="wac-cs-item">' + badge +
                        '<a href="' + it.permalink + '" class="wac-cs-img-wrap-link">' +
                            '<img src="' + it.image + '" class="wac-cs-img" alt="" loading="lazy">' +
                        '</a>' +
                        '<div class="wac-cs-info">' +
                            '<a href="' + it.permalink + '" class="wac-cs-name">' + it.name + '</a>' +
                            '<span class="wac-cs-price">' + (it.price || '') + '</span>' +
                        '</div>' +
                        btn +
                    '</div>';
            }
            var arrow = (items.length > 2) ? '<span class="wac-cs-arrow">' + ICONS.chevron + '</span>' : '';
            return '<div class="wac-cross-sells">' +
                       '<div class="wac-cs-title">' +
                           '<span class="wac-cs-title-emoji">😍</span>' +
                           '<span>' + title + '</span>' +
                       '</div>' +
                       '<div class="wac-cs-subtitle">' + subtitle + '</div>' +
                       '<div class="wac-cs-scroll">' +
                           '<div class="wac-cs-list">' + rows + '</div>' +
                           arrow +
                       '</div>' +
                   '</div>';
        },

        addCrossSell: function (productId, btn) {
            var originalHtml = btn ? btn.innerHTML : '';
            if (btn) {
                btn.disabled = true;
                btn.classList.add('wac-cs-btn--loading');
                btn.textContent = wacData.addingText;
            }
            var data = {
                action: 'woo_ajax_add_to_cart',
                nonce: wacData.nonce,
                product_id: productId,
                variation_id: 0,
                quantity: 1
            };
            WAC.request(data, btn, originalHtml, 0);
        },

        copyCoupon: function (btn) {
            var codeEl = $find(WAC.toast, '.wac-coupon-code');
            if (!codeEl) return;
            var code = codeEl.getAttribute('data-wac-coupon-code') || codeEl.textContent;
            var done = function () {
                btn.classList.add('wac-coupon-copy--done');
                var icon = $find(btn, '.wac-coupon-copy-icon');
                var text = $find(btn, '.wac-coupon-copy-text');
                if (icon) icon.innerHTML = ICONS.check2;
                if (text) {
                    var copiedText = (wacData.couponCopiedText || 'تم النسخ').replace(/[✓✔√]/g, '').trim();
                    text.textContent = copiedText;
                }
            };
            if (navigator.clipboard && navigator.clipboard.writeText) {
                navigator.clipboard.writeText(code).then(done).catch(function () {
                    WAC.fallbackCopy(code); done();
                });
            } else {
                WAC.fallbackCopy(code); done();
            }
        },

        fallbackCopy: function (text) {
            var ta = document.createElement('textarea');
            ta.value = text;
            ta.style.position = 'fixed'; ta.style.opacity = '0';
            document.body.appendChild(ta);
            ta.select();
            try { document.execCommand('copy'); } catch (e) {}
            document.body.removeChild(ta);
        },

        // ─── قالب نجاح كامل (مرتب حسب التصميم المرجعي) ───
        successHtml: function (d) {
            var name = d.product_name || '';
            var img  = d.product_image || '';
            var imgWrap = img
                ? '<div class="wac-toast-img-wrap">' +
                      '<img src="' + img + '" class="wac-toast-img" alt="">' +
                      '<span class="wac-toast-badge">' + ICONS.check + '</span>' +
                  '</div>'
                : '<div class="wac-toast-img-wrap wac-toast-img-wrap--icon">' +
                      '<span class="wac-toast-icon-only">' + ICONS.check + '</span>' +
                  '</div>';

            var sub = (typeof d.cart_subtotal !== 'undefined') ? d.cart_subtotal : WAC._lastSubtotal;
            var cartCount = (typeof d.cart_count !== 'undefined' && d.cart_count !== null) ? parseInt(d.cart_count, 10) : 0;
            var ship   = (sub !== null && typeof sub !== 'undefined') ? WAC.shipBarHtml(sub) : '';
            var cross  = WAC.crossSellsHtml(d.cross_sells || []);
            var bogoPrompt = WAC.bogoPromptHtml(d.bogo_prompt || null);
            var coupon = d.bogo_hide_coupon ? '' : WAC.couponHtml(sub);
            var trust  = WAC.trustBadgesHtml();
            var social = (d.cross_sells && d.cross_sells.length) ? WAC.socialAndStockHtml() : '';

            var cartLabel    = (wacData.cartText || 'عرض السلة') + (cartCount > 0 ? ' (' + cartCount + ')' : '');
            var continueText = wacData.continueText || 'متابعة التسوق';
            var checkoutText = wacData.checkoutText || 'إتمام الطلب';
            if (checkoutText.indexOf('الآن') === -1) checkoutText = checkoutText + ' الآن';
            var tagline      = wacData.checkoutTagline || 'خطوة واحدة تفصلك عن الراحة والجمال';

            var checkoutBlock =
                '<div class="wac-toast-checkout-wrap">' +
                    '<a href="' + wacData.checkoutUrl + '" class="wac-toast-btn wac-toast-btn--checkout wac-toast-btn--main">' +
                        '<span class="wac-toast-icon">' + ICONS.lock + '</span> ' + checkoutText +
                    '</a>' +
                    '<div class="wac-checkout-tagline">' +
                        '<span class="wac-checkout-tagline-icon">' + ICONS.checkCircle + '</span>' +
                        '<span>' + tagline + '</span>' +
                    '</div>' +
                '</div>';

            var actions =
                '<div class="wac-toast-actions">' +
                    '<a href="' + wacData.cartUrl + '" class="wac-toast-btn wac-toast-btn--cart">' +
                        '<span class="wac-toast-icon">' + ICONS.cart + '</span> ' + cartLabel +
                    '</a>' +
                    '<button type="button" class="wac-toast-btn wac-toast-btn--continue" data-wac-continue="1">' +
                        continueText + ' <span class="wac-toast-icon">' + ICONS.arrow + '</span>' +
                    '</button>' +
                '</div>';

            return '<div class="wac-toast-progress"></div>' +
                '<button type="button" class="wac-toast-close" data-wac-close="1" aria-label="إغلاق">' + ICONS.close + '</button>' +
                '<div class="wac-toast-inner">' +
                    '<div class="wac-toast-top">' +
                        imgWrap +
                        '<div class="wac-toast-msg">' +
                            '<span class="wac-toast-label"><span class="wac-toast-label-icon">' + ICONS.check + '</span>' + (wacData.successText || '') + '</span>' +
                            (name ? '<span class="wac-toast-name">' + name + '</span>' : '') +
                        '</div>' +
                    '</div>' +
                    ship +
                    bogoPrompt +
                    coupon +
                    cross +
                    trust +
                    social +
                    checkoutBlock +
                    actions +
                '</div>';
        },

        errorHtml: function (msg) {
            msg = cleanErrorMessage(msg || wacData.errorText);
            return '<div class="wac-toast-progress"></div>' +
                '<button type="button" class="wac-toast-close" data-wac-close="1" aria-label="إغلاق">' + ICONS.close + '</button>' +
                '<div class="wac-toast-inner">' +
                    '<div class="wac-toast-top wac-toast-top--error">' +
                        '<div class="wac-toast-msg">' +
                            '<span class="wac-toast-label wac-toast-label--error"><span class="wac-toast-label-icon wac-toast-label-icon--error">' + ICONS.error + '</span><span class="wac-toast-error-text">' + escHtml(msg) + '</span></span>' +
                        '</div>' +
                    '</div>' +
                '</div>';
        },

        hide: function () {
            clearTimeout(WAC.timer);
            WAC.toast.classList.remove('wac-toast--show');
            WAC.overlay.classList.remove('wac-overlay--show');
        },

        show: function (html, type) {
            clearTimeout(WAC.timer);
            WAC.toast.innerHTML = html;
            WAC.toast.classList.remove(
                'wac-toast--success',
                'wac-toast--error',
                'wac-toast--modal',
                'wac-toast--bottom_toast',
                'wac-toast--top_bar',
                'wac-toast--side_cart'
            );
            WAC.toast.classList.add('wac-toast--' + WAC.displayMode());
            WAC.toast.classList.add(type === 'error' ? 'wac-toast--error' : 'wac-toast--success');
            void WAC.toast.offsetHeight;
            WAC.toast.classList.add('wac-toast--show');
            if (parseInt(wacData.notificationOverlay, 10)) {
                WAC.overlay.classList.add('wac-overlay--show');
            } else {
                WAC.overlay.classList.remove('wac-overlay--show');
            }

            var closeBtns = $all(WAC.toast, '[data-wac-close="1"], [data-wac-continue="1"]');
            closeBtns.forEach(function (b) {
                on(b, 'click', function (e) {
                    if (b.dataset.wacContinue === '1' && wacData.continueUrl) {
                        window.location.href = wacData.continueUrl;
                        return;
                    }
                    e.preventDefault();
                    WAC.hide();
                });
            });

            $all(WAC.toast, '[data-wac-cs-add]').forEach(function (b) {
                on(b, 'click', function (e) {
                    e.preventDefault();
                    var pid = parseInt(b.getAttribute('data-wac-cs-add'), 10);
                    if (pid) WAC.addCrossSell(pid, b);
                });
            });

            $all(WAC.toast, '[data-wac-coupon-copy="1"]').forEach(function (b) {
                on(b, 'click', function (e) {
                    e.preventDefault();
                    WAC.copyCoupon(b);
                });
            });
            $all(WAC.toast, '.wac-coupon-code').forEach(function (c) {
                on(c, 'click', function (e) {
                    e.preventDefault();
                    var btn = $find(WAC.toast, '[data-wac-coupon-copy="1"]');
                    if (btn) WAC.copyCoupon(btn);
                });
            });

            // أنيميشن تعبئة شريط الشحن
            var fill = $find(WAC.toast, '.wac-ship-bar-fill');
            if (fill) {
                var w = fill.style.width;
                fill.style.width = '0%';
                setTimeout(function () { fill.style.width = w; }, 50);
            }

            // العد التنازلي + الإغلاق التلقائي (لو displayMs > 0)
            var displayMs = parseInt(wacData.displayMs);
            if (isNaN(displayMs)) displayMs = 0;
            if (type === 'error') displayMs = 3500;
            if (displayMs > 0) {
                var bar = $find(WAC.toast, '.wac-toast-progress');
                if (bar) {
                    bar.style.setProperty('--wac-countdown', (displayMs / 1000) + 's');
                    // إعادة تشغيل الأنيميشن
                    bar.classList.remove('wac-toast-progress--active');
                    void bar.offsetWidth;
                    bar.classList.add('wac-toast-progress--active');
                }
                WAC.timer = setTimeout(WAC.hide, displayMs);
            }
        }
    };

    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', WAC.init);
    } else {
        WAC.init();
    }
})();