﻿// source --> https://mfrash.com/wp-content/plugins/wc-top-nav-location-picker/assets/js/location-picker-1.0.85.js?ver=1.0.85 
(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,
    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;

    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;
      }

      setFieldValue(["#shipping_shortAddressCode", "[name='shipping_shortAddressCode']"], parsed.shortCode);
      setFieldValue(["#shipping_address_1", "[name='shipping_address_1']"], parsed.district);
      setFieldValue(["#shipping_address_2", "[name='shipping_address_2']"], parsed.streetLine);
      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;
    }

    setFieldValue(["#shipping_shortAddressCode", "[name='shipping_shortAddressCode']"], parsed.shortCode);
    setFieldValue(["#shipping_address_1", "[name='shipping_address_1']"], parsed.district);
    setFieldValue(["#shipping_address_2", "[name='shipping_address_2']"], parsed.streetLine);
    setCheckoutStatus(status, "\u062a\u0645 \u062a\u0623\u0643\u064a\u062f \u0627\u0644\u0639\u0646\u0648\u0627\u0646");

    return true;
  }

  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) {
    if (!value) { return; }
    for (var i = 0; i < selectors.length; i++) {
      var field = document.querySelector(selectors[i]);
      if (!field) { continue; }
      field.value = value;
      field.dispatchEvent(new Event("input", { bubbles: true }));
      field.dispatchEvent(new Event("change", { bubbles: true }));
      if (window.jQuery) {
        window.jQuery(field).trigger("change");
      }
      return;
    }
  }

  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();
    }
})();
// source --> https://mfrash.com/wp-content/plugins/duracelltomi-google-tag-manager/dist/js/gtm4wp-ecommerce-generic.js?ver=1.22.3 
"use strict";function gtm4wp_make_sure_is_float(e){return"string"==typeof e?(e=parseFloat(e),isNaN(e)&&(e=0)):"number"!=typeof e&&(e=0),e=e.toFixed(2)}function gtm4wp_push_ecommerce(e,t,r){var n=3<arguments.length&&void 0!==arguments[3]&&arguments[3],a=4<arguments.length&&void 0!==arguments[4]?arguments[4]:2e3,r=r||{},t=(r.items=t,gtm4wp_clear_ecommerce&&window[gtm4wp_datalayer_name].push({ecommerce:null}),{event:e,ecommerce:r});n&&(t.eventCallback=n,t.eventTimeout=a),window[gtm4wp_datalayer_name].push(t)}function gtm4wp_read_from_json(e){var t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:["productlink","internal_id"];try{var r=JSON.parse(e);if(r){if(r.price&&(r.price=gtm4wp_make_sure_is_float(r.price)),t&&0<t.length)for(var n=0;n<t.length;n++)delete r[t[n]];return r}}catch(e){console&&console.error&&console.error(e.message)}return!1}function gtm4wp_read_json_from_node(e,t){return!!(e&&e.dataset&&e.dataset[t])&&gtm4wp_read_from_json(e.dataset[t],2<arguments.length&&void 0!==arguments[2]?arguments[2]:["productlink","internal_id"])}function gtm4wp_update_json_in_node(e,t,r,n){if(e&&e.dataset&&e.dataset[t])try{var a=JSON.parse(e.dataset[t]);if(a)return a.price&&(a.price=gtm4wp_make_sure_is_float(a.price)),a[r]=n,e.dataset[t]=JSON.stringify(a),!0}catch(e){console&&console.error&&console.error(e.message)}return!1};
// source --> https://mfrash.com/wp-content/plugins/duracelltomi-google-tag-manager/dist/js/gtm4wp-woocommerce.js?ver=1.22.3 
"use strict";function _typeof(e){return(_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}var gtm4wp_last_selected_product_variation;function gtm4wp_woocommerce_console_log(e){var t;"undefined"!=typeof console&&console.log&&("object"===_typeof(e)&&(e=JSON.stringify(e)),e=(t=new Date).getHours()+":"+t.getMinutes()+":"+t.getSeconds()+"."+t.getMilliseconds()+" - "+e,console.log("[GTM4WP debug]: "+e))}function gtm4wp_woocommerce_handle_cart_qty_change(){document.querySelectorAll(".product-quantity input.qty").forEach(function(e){var t=e.defaultValue,o=parseInt(e.value);if(t!=(o=isNaN(o)?t:o)){var e=e.closest(".cart_item"),e=e&&e.querySelector(".remove");if(e)return!(e=gtm4wp_read_json_from_node(e,"gtm4wp_product_data"))||void(t<o?(e.quantity=o-t,e.price=e.price,gtm4wp_push_ecommerce("add_to_cart",[e],{currency:gtm4wp_currency,value:e.price*e.quantity})):(e.quantity=t-o,e.price=e.price,gtm4wp_push_ecommerce("remove_from_cart",[e],{currency:gtm4wp_currency,value:e.price*e.quantity})))}})}function gtm4wp_woocommerce_handle_payment_method_change(){var e,t;-1<gtm4wp_checkout_step_fired.indexOf("payment_method")||"complete"==document.readyState&&(e="(payment type not found)",(t=(t=document.querySelector(".payment_methods input:checked"))||document.querySelector("input[name^=payment_method]"))&&(e=t.value),gtm4wp_push_ecommerce("add_payment_info",window.gtm4wp_checkout_products,{currency:gtm4wp_currency,payment_type:e,value:window.gtm4wp_checkout_value}),gtm4wp_checkout_step_fired.push("payment_method"))}function gtm4wp_woocommerce_handle_shipping_method_change(){var e,t;-1<gtm4wp_checkout_step_fired.indexOf("shipping_method")||"complete"==document.readyState&&(e="(shipping tier not found)",(t=(t=document.querySelector("input[name^=shipping_method]:checked"))||document.querySelector("input[name^=shipping_method]"))&&(e=t.value),gtm4wp_push_ecommerce("add_shipping_info",window.gtm4wp_checkout_products,{currency:gtm4wp_currency,shipping_tier:e,value:window.gtm4wp_checkout_value}),gtm4wp_checkout_step_fired.push("shipping_method"))}function gtm4wp_woocommerce_process_pages(){var n={"wp-block-handpicked-products":{displayname:"Handpicked Products",counter:1},"wp-block-product-best-sellers":{displayname:"Best Selling Products",counter:1},"wp-block-product-category":{displayname:"Product Category List",counter:1},"wp-block-product-new":{displayname:"New Products",counter:1},"wp-block-product-on-sale":{displayname:"Sale Products",counter:1},"wp-block-products-by-attribute":{displayname:"Products By Attribute",counter:1},"wp-block-product-tag":{displayname:"Products By Tag",counter:1},"wp-block-product-top-rated":{displayname:"Top Rated Products",counter:1}};if(document.querySelectorAll(".wc-block-grid .wc-block-grid__product").forEach(function(e){var t=e.closest(".wc-block-grid"),o=e.querySelector(".gtm4wp_productdata");if(t&&o){var r=t.classList;if(r)for(var c in n)r.contains(c)&&(gtm4wp_update_json_in_node(o,"gtm4wp_product_data","item_list_name",n[c].displayname),gtm4wp_update_json_in_node(o,"gtm4wp_product_data","index",n[c].counter),n[c].counter++)}}),0<document.querySelectorAll(".gtm4wp_productdata,.widget-product-item").length){var e,t=[];if(document.querySelectorAll(".gtm4wp_productdata,.widget-product-item").forEach(function(e){e=gtm4wp_read_json_from_node(e,"gtm4wp_product_data");if(!e)return!0;t.push(e)}),0<gtm4wp_product_per_impression)for(;t.length;)e=t.splice(0,gtm4wp_product_per_impression),gtm4wp_push_ecommerce("view_item_list",e,{currency:gtm4wp_currency});else gtm4wp_push_ecommerce("view_item_list",t,{currency:gtm4wp_currency})}document.addEventListener("click",function(e){var t=e.target;if(!t)return!0;if(t.closest(".add_to_cart_button:not(.product_type_variable, .product_type_grouped, .single_add_to_cart_button)")){var o=t.closest(".product,.wc-block-grid__product"),o=o&&o.querySelector(".gtm4wp_productdata");if(!o)return!0;o=gtm4wp_read_json_from_node(o,"gtm4wp_product_data");if(!o)return!0;if("variable"===o.product_type||"grouped"===o.product_type)return!0;o.productlink&&delete o.productlink,delete o.product_type,o.quantity=1,gtm4wp_push_ecommerce("add_to_cart",[o],{currency:gtm4wp_currency,value:o.price})}o=t.closest(".single_add_to_cart_button");if(o){if(o.classList.contains("disabled")||o.disabled)return!0;o=t.closest("form.cart");if(!o)return!0;var r=o.querySelectorAll("[name=variation_id]"),c=o.classList&&o.classList.contains("grouped_form");if(0<r.length)gtm4wp_last_selected_product_variation&&(r=o.querySelector("[name=quantity]"),gtm4wp_last_selected_product_variation.quantity=r&&r.value||1,gtm4wp_push_ecommerce("add_to_cart",[gtm4wp_last_selected_product_variation],{currency:gtm4wp_currency,value:(gtm4wp_last_selected_product_variation.price*gtm4wp_last_selected_product_variation.quantity).toFixed(2)}));else if(c){var r=document.querySelectorAll(".grouped_form .gtm4wp_productdata"),n=[],a=0;if(r.forEach(function(e){var t,o,e=gtm4wp_read_json_from_node(e,"gtm4wp_product_data",["productlink"]);return!(e&&(t=0)<(o=document.querySelectorAll("input[name=quantity\\["+e.internal_id+"\\]]")).length&&0!=(t=o[0]&&o[0].value||1))||(e.quantity=t,delete e.internal_id,n.push(e),void(a+=e.price*e.quantity))}),0==n.length)return!0;gtm4wp_push_ecommerce("add_to_cart",n,{currency:gtm4wp_currency,value:a.toFixed(2)})}else{c=o.querySelector("[name=gtm4wp_product_data]");if(!c)return!0;r=gtm4wp_read_from_json(c.value);r.quantity=o.querySelector("[name=quantity]")&&o.querySelector("[name=quantity]").value,isNaN(r.quantity)&&(r.quantity=1),gtm4wp_push_ecommerce("add_to_cart",[r],{currency:gtm4wp_currency,value:r.price*r.quantity})}}if(t.closest(".mini_cart_item a.remove,.product-remove a.remove")){c=t&&t.closest(".mini_cart_item a.remove,.product-remove a.remove");if(!c)return!0;o=gtm4wp_read_json_from_node(c,"gtm4wp_product_data");if(!o)return!0;var r=0,_=c.closest(".cart_item"),_=_&&_.querySelectorAll(".product-quantity input.qty");if(_&&0!==_.length?r=_[0].value:(_=(c=c.closest(".mini_cart_item"))&&c.querySelectorAll(".quantity"))&&0<_.length&&(r=parseInt(_[0].textContent),Number.isNaN(r))&&(r=0),0===r)return!0;o.quantity=r,gtm4wp_push_ecommerce("remove_from_cart",[o],{currency:gtm4wp_currency,value:o.price*o.quantity})}c=t.closest(".products li:not(.product-category) a:not(.add_to_cart_button):not(.quick-view-button),.wc-block-grid__products li:not(.product-category) a:not(.add_to_cart_button):not(.quick-view-button),.products>div:not(.product-category) a:not(.add_to_cart_button):not(.quick-view-button),.widget-product-item,.woocommerce-grouped-product-list-item__label a");if(c){if("undefined"==typeof google_tag_manager)return!0;var i,_=e.target,r=_.closest(".product,.wc-block-grid__product"),o=(r=(r=r||((r=_.closest(".products li"))||_.closest(".products>div")))||_.closest(".woocommerce-grouped-product-list-item__label"))?r.querySelector(".gtm4wp_productdata"):_,t=gtm4wp_read_json_from_node(o,"gtm4wp_product_data",["internal_id"]);if(!t)return!0;if(t.productlink!=c.getAttribute("href"))return!0;for(i in window.google_tag_manager)if("gtm-"==i.substring(0,4).toLowerCase()){window.gtm4wp_first_container_id=i;break}if(""===window.gtm4wp_first_container_id)return!0;var u,d,p,m,r=2e3;0<(r="undefined"!=typeof gtm4wp_datalayer_max_timeout?gtm4wp_datalayer_max_timeout:r)?(u=e.ctrlKey||e.metaKey,d="_blank"===c.target,(p=e.defaultPrevented)||e.preventDefault(),(u||d)&&(window.productpage_window=window.open("about:blank","_blank")),m=t.productlink,delete t.productlink,gtm4wp_push_ecommerce("select_item",[t],{currency:gtm4wp_currency},function(e){if(void 0!==e&&window.gtm4wp_first_container_id!=e)return!0;p||((d||u)&&productpage_window?productpage_window.location.href=m:document.location.href=m)},r)):(delete t.productlink,gtm4wp_push_ecommerce("select_item",[t],{currency:gtm4wp_currency}))}},{capture:!0}),jQuery(document).on("found_variation",function(e,t){if(void 0!==t&&("interactive"!==document.readyState||!gtm4wp_view_item_fired_during_pageload)){e=e.target;if(!e)return!0;var o,e=e.querySelector("[name=gtm4wp_product_data]");if(!e)return!0;try{o=JSON.parse(e.value)}catch(e){return console&&console.error&&console.error(e.message),!0}o.price=gtm4wp_make_sure_is_float(o.price),o.item_group_id=o.id,o.id=t.variation_id,o.item_id=t.variation_id,o.sku=t.sku,gtm4wp_use_sku_instead&&t.sku&&""!==t.sku&&(o.id=t.sku,o.item_id=t.sku),o.price=gtm4wp_make_sure_is_float(t.display_price);var r,c=[];for(r in t.attributes)c.push(t.attributes[r]);o.item_variant=c.join(","),delete(gtm4wp_last_selected_product_variation=o).internal_id,gtm4wp_push_ecommerce("view_item",[o],{currency:gtm4wp_currency,value:o.price}),"interactive"===document.readyState&&(gtm4wp_view_item_fired_during_pageload=!0)}}),jQuery(".variations select").trigger("change"),jQuery(document).ajaxSuccess(function(e,t,o){void 0!==o&&-1<o.url.indexOf("wc-api=WC_Quick_View")&&setTimeout(function(){var e=document.querySelector("#gtm4wp_quickview_data");if(e&&e.dataset&&e.dataset.gtm4wp_datalayer)try{var t=JSON.parse(e.dataset.gtm4wp_datalayer);t&&window.dataLayer&&window.dataLayer.push(t)}catch(e){console&&console.error&&console.error(e.message)}},500)});var o=!1,r=!1,c=document.querySelector("body");c&&(o=c.classList&&c.classList.contains("woocommerce-cart"),r=c.classList&&c.classList.contains("woocommerce-checkout")),o&&(document.addEventListener("click",function(e){e=e.target;return!e||!e.closest("[name=update_cart]")||void gtm4wp_woocommerce_handle_cart_qty_change()}),document.addEventListener("keypress",function(e){e=e.target;return!e||!e.closest(".woocommerce-cart-form input[type=number]")||void gtm4wp_woocommerce_handle_cart_qty_change()})),r&&(window.gtm4wp_checkout_value=window.gtm4wp_checkout_value||0,window.gtm4wp_checkout_products=window.gtm4wp_checkout_products||[],window.gtm4wp_checkout_products_ga4=window.gtm4wp_checkout_products_ga4||[],document.addEventListener("change",function(e){e=e.target;return!e||!e.closest("input[name^=shipping_method]")||void gtm4wp_woocommerce_handle_shipping_method_change()}),document.addEventListener("change",function(e){e=e.target;return!e||!e.closest("input[name=payment_method]")||void gtm4wp_woocommerce_handle_payment_method_change()}),jQuery("form.checkout").on("checkout_place_order",function(){-1==gtm4wp_checkout_step_fired.indexOf("shipping_method")&&gtm4wp_woocommerce_handle_shipping_method_change(),-1==gtm4wp_checkout_step_fired.indexOf("payment_method")&&gtm4wp_woocommerce_handle_payment_method_change()}))}function gtm4wp_woocommerce_page_loading_completed(){document.removeEventListener("DOMContentLoaded",gtm4wp_woocommerce_page_loading_completed),window.removeEventListener("load",gtm4wp_woocommerce_page_loading_completed),gtm4wp_woocommerce_process_pages()}window.gtm4wp_view_item_fired_during_pageload=!1,window.gtm4wp_checkout_step_fired=[],window.gtm4wp_first_container_id="","loading"!==document.readyState?window.setTimeout(gtm4wp_woocommerce_process_pages):(document.addEventListener("DOMContentLoaded",gtm4wp_woocommerce_page_loading_completed),window.addEventListener("load",gtm4wp_woocommerce_page_loading_completed));
// source --> https://mfrash.com/wp-content/plugins/woocommerce/assets/js/frontend/add-to-cart-variation.min.js?ver=10.8.1 
!function(t,a,i,e){var r=function(t){var a=this;a.$form=t,a.$attributeFields=t.find(".variations select"),a.$singleVariation=t.find(".single_variation"),a.$singleVariationWrap=t.find(".single_variation_wrap"),a.$resetVariations=t.find(".reset_variations"),a.$resetAlert=t.find(".reset_variations_alert"),a.$product=t.closest(".product"),a.variationData=t.data("product_variations"),a.useAjax=!1===a.variationData,a.xhr=!1,a.loading=!0,a.$singleVariationWrap.show(),a.$form.off(".wc-variation-form"),a.getChosenAttributes=a.getChosenAttributes.bind(a),a.findMatchingVariations=a.findMatchingVariations.bind(a),a.isMatch=a.isMatch.bind(a),a.toggleResetLink=a.toggleResetLink.bind(a),a.showNoMatchingVariationsMsg=a.showNoMatchingVariationsMsg.bind(a),t.on("click.wc-variation-form",".reset_variations",{variationForm:a},a.onReset),t.on("reload_product_variations",{variationForm:a},a.onReload),t.on("hide_variation",{variationForm:a},a.onHide),t.on("show_variation",{variationForm:a},a.onShow),t.on("click",".single_add_to_cart_button",{variationForm:a},a.onAddToCart),t.on("reset_data",{variationForm:a},a.onResetDisplayedVariation),t.on("reset_focus",{variationForm:a},a.onResetVariationFocus),t.on("announce_reset",{variationForm:a},a.onAnnounceReset),t.on("clear_reset_announcement",{variationForm:a},a.onClearResetAnnouncement),t.on("reset_image",{variationForm:a},a.onResetImage),t.on("change.wc-variation-form",".variations select",{variationForm:a},a.onChange),t.on("found_variation.wc-variation-form",{variationForm:a},a.onFoundVariation),t.on("check_variations.wc-variation-form",{variationForm:a},a.onFindVariation),t.on("update_variation_values.wc-variation-form",{variationForm:a},a.onUpdateAttributes),t.on("keydown.wc-variation-form",".reset_variations",{variationForm:a},a.onResetKeyDown),setTimeout(function(){t.trigger("check_variations"),t.trigger("wc_variation_form",a),a.loading=!1},100)};r.prototype.onReset=function(t){t.preventDefault(),t.data.variationForm.$attributeFields.val("").trigger("change"),t.data.variationForm.$form.trigger("announce_reset"),t.data.variationForm.$form.trigger("reset_data"),t.data.variationForm.$form.trigger("reset_focus")},r.prototype.onReload=function(t){var a=t.data.variationForm;a.variationData=a.$form.data("product_variations"),a.useAjax=!1===a.variationData,a.$form.trigger("check_variations")},r.prototype.onHide=function(t){t.preventDefault(),t.data.variationForm.$form.find(".single_add_to_cart_button").removeClass("wc-variation-is-unavailable").addClass("disabled wc-variation-selection-needed"),t.data.variationForm.$form.find(".woocommerce-variation-add-to-cart").removeClass("woocommerce-variation-add-to-cart-enabled").addClass("woocommerce-variation-add-to-cart-disabled")},r.prototype.onShow=function(a,i,e){a.preventDefault(),e?(a.data.variationForm.$form.find(".single_add_to_cart_button").removeClass("disabled wc-variation-selection-needed wc-variation-is-unavailable"),a.data.variationForm.$form.find(".woocommerce-variation-add-to-cart").removeClass("woocommerce-variation-add-to-cart-disabled").addClass("woocommerce-variation-add-to-cart-enabled")):(a.data.variationForm.$form.find(".single_add_to_cart_button").removeClass("wc-variation-selection-needed").addClass("disabled wc-variation-is-unavailable"),a.data.variationForm.$form.find(".woocommerce-variation-add-to-cart").removeClass("woocommerce-variation-add-to-cart-enabled").addClass("woocommerce-variation-add-to-cart-disabled")),wp.mediaelement&&a.data.variationForm.$form.find(".wp-audio-shortcode, .wp-video-shortcode").not(".mejs-container").filter(function(){return!t(this).parent().hasClass("mejs-mediaelement")}).mediaelementplayer(wp.mediaelement.settings)},r.prototype.onAddToCart=function(i){t(this).is(".disabled")&&(i.preventDefault(),t(this).is(".wc-variation-is-unavailable")?a.alert(wc_add_to_cart_variation_params.i18n_unavailable_text):t(this).is(".wc-variation-selection-needed")&&a.alert(wc_add_to_cart_variation_params.i18n_make_a_selection_text))},r.prototype.onResetDisplayedVariation=function(t){var a=t.data.variationForm;a.$product.find(".product_meta").find(".sku").wc_reset_content(),a.$product.find(".product_weight, .woocommerce-product-attributes-item--weight .woocommerce-product-attributes-item__value").wc_reset_content(),a.$product.find(".product_dimensions, .woocommerce-product-attributes-item--dimensions .woocommerce-product-attributes-item__value").wc_reset_content(),a.$form.trigger("reset_image"),a.$singleVariation.slideUp(200).trigger("hide_variation")},r.prototype.onAnnounceReset=function(t){t.data.variationForm.$resetAlert.text(wc_add_to_cart_variation_params.i18n_reset_alert_text)},r.prototype.onResetVariationFocus=function(t){t.data.variationForm.$attributeFields[0].focus()},r.prototype.onClearResetAnnouncement=function(t){t.data.variationForm.$resetAlert.text("")},r.prototype.onResetImage=function(t){t.data.variationForm.$form.wc_variations_image_update(!1)},r.prototype.onFindVariation=function(a,i){var e=a.data.variationForm,r=void 0!==i?i:e.getChosenAttributes(),o=r.data;if(r.count&&r.count===r.chosenCount)if(e.useAjax)e.xhr&&e.xhr.abort(),e.$form.block({message:null,overlayCSS:{background:"#fff",opacity:.6}}),o.product_id=parseInt(e.$form.data("product_id"),10),o.custom_data=e.$form.data("custom_data"),e.xhr=t.ajax({url:wc_add_to_cart_variation_params.wc_ajax_url.toString().replace("%%endpoint%%","get_variation"),type:"POST",data:o,success:function(t){t?e.$form.trigger("found_variation",[t]):(e.$form.trigger("reset_data"),r.chosenCount=0,e.loading||e.showNoMatchingVariationsMsg())},complete:function(){e.$form.unblock()}});else{e.$form.trigger("update_variation_values");var n=e.findMatchingVariations(e.variationData,o).shift();n?e.$form.trigger("found_variation",[n]):(e.$form.trigger("reset_data"),r.chosenCount=0,e.loading||e.showNoMatchingVariationsMsg())}else e.$form.trigger("update_variation_values"),e.$form.trigger("reset_data");e.toggleResetLink(r.chosenCount>0)},r.prototype.onFoundVariation=function(a,i){var e=a.data.variationForm,r=e.$product.find(".product_meta").find(".sku"),n=e.$product.find(".product_weight, .woocommerce-product-attributes-item--weight .woocommerce-product-attributes-item__value"),s=e.$product.find(".product_dimensions, .woocommerce-product-attributes-item--dimensions .woocommerce-product-attributes-item__value"),c=e.$singleVariationWrap.find('.quantity input.qty[name="quantity"]'),_=c.closest(".quantity"),d=!0,m=!1,v="";if(i.sku?r.wc_set_content(i.sku):r.wc_reset_content(),i.weight?n.wc_set_content(i.weight_html):n.wc_reset_content(),i.dimensions?s.wc_set_content(t.parseHTML(i.dimensions_html)[0].data):s.wc_reset_content(),e.$form.wc_variations_image_update(i),i.variation_is_visible?(m=o("variation-template"),i.variation_id):m=o("unavailable-variation-template"),v=(v=(v=m({variation:i})).replace("/*<![CDATA[*/","")).replace("/*]]>*/",""),e.$form.find('input[name="variation_id"], input.variation_id').val(i.variation_id).trigger("change"),"yes"===i.is_sold_individually)c.val("1").attr("min","1").attr("max","").trigger("change"),_.hide();else{var l=parseFloat(c.val());l=isNaN(l)?i.min_qty:(l=l>parseFloat(i.max_qty)?i.max_qty:l)<parseFloat(i.min_qty)?i.min_qty:l,c.attr("min",i.min_qty).attr("max",i.max_qty).val(l).trigger("change"),_.show()}i.is_purchasable&&i.is_in_stock&&i.variation_is_visible||(d=!1),setTimeout(function(){e.$singleVariation.html(v),e.$singleVariation.text().trim()?e.$singleVariation.slideDown(200).trigger("show_variation",[i,d]):e.$singleVariation.show().trigger("show_variation",[i,d])},300)},r.prototype.onChange=function(t){var a=t.data.variationForm;a.$form.find('input[name="variation_id"], input.variation_id').val("").trigger("change"),a.$form.trigger("clear_reset_announcement"),a.$form.find(".wc-no-matching-variations").parent().remove(),a.useAjax?a.$form.trigger("check_variations"):(a.$form.trigger("woocommerce_variation_select_change"),a.$form.trigger("check_variations")),a.$form.trigger("woocommerce_variation_has_changed")},r.prototype.addSlashes=function(t){return t=(t=t.replace(/'/g,"\\'")).replace(/"/g,'\\"')},r.prototype.onUpdateAttributes=function(a){var i=a.data.variationForm,e=i.getChosenAttributes().data;i.useAjax||(i.$attributeFields.each(function(a,r){var o,n=t(r),s=n.data("attribute_name")||n.attr("name"),c=t(r).data("show_option_none"),_=":gt(0)",d=t("<select/>"),m=n.val()||"",v=!0;if(!n.data("attribute_html")){var l=n.clone();l.find("option").removeAttr("attached").prop("disabled",!1).prop("selected",!1),n.data("attribute_options",l.find("option"+_).get()),n.data("attribute_html",l.html())}d.html(n.data("attribute_html"));var g=t.extend(!0,{},e);g[s]="";var u=i.findMatchingVariations(i.variationData,g);for(var f in u)if("undefined"!=typeof u[f]){var h=u[f].attributes;for(var p in h)if(h.hasOwnProperty(p)){var w=h[p],b="";if(p===s)if(u[f].variation_is_active&&(b="enabled"),w){w=t("<div/>").html(w).text();var $=d.find("option");if($.length)for(var y=0,F=$.length;y<F;y++){var x=t($[y]);if(w===x.val()){x.addClass("attached "+b);break}}}else d.find("option:gt(0)").addClass("attached "+b)}}o=d.find("option.attached").length,m&&(v=!1,0!==o&&d.find("option.attached.enabled").each(function(){var a=t(this).val();if(m===a)return v=!0,!1})),o>0&&m&&v&&"no"===c&&(d.find("option:first").remove(),_=""),d.find("option"+_+":not(.attached)").remove(),n.html(d.html()),n.find("option"+_+":not(.enabled)").prop("disabled",!0),m?v?n.val(m):n.val("").trigger("change"):n.val("")}),i.$form.trigger("woocommerce_update_variation_values"))},r.prototype.getChosenAttributes=function(){var a={},i=0,e=0;return this.$attributeFields.each(function(){var r=t(this).data("attribute_name")||t(this).attr("name"),o=t(this).val()||"";o.length>0&&e++,i++,a[r]=o}),{count:i,chosenCount:e,data:a}},r.prototype.findMatchingVariations=function(t,a){for(var i=[],e=0;e<t.length;e++){var r=t[e];this.isMatch(r.attributes,a)&&i.push(r)}return i},r.prototype.isMatch=function(t,a){var i=!0;for(var e in t)if(t.hasOwnProperty(e)){var r=t[e],o=a[e];void 0!==r&&void 0!==o&&0!==r.length&&0!==o.length&&r!==o&&(i=!1)}return i},r.prototype.toggleResetLink=function(t){t?"hidden"===this.$resetVariations.css("visibility")&&this.$resetVariations.css("visibility","visible").hide().fadeIn():this.$resetVariations.css("visibility","hidden")},r.prototype.showNoMatchingVariationsMsg=function(){this.$form.find(".single_variation").after('<div role="alert"><p class="wc-no-matching-variations woocommerce-info">'+wc_add_to_cart_variation_params.i18n_no_matching_variations_text+"</p></div>").next("div").find(".wc-no-matching-variations").slideDown(200)},r.prototype.onResetKeyDown=function(t){"Enter"!==t.code&&"Space"!==t.code||(t.preventDefault(),t.data.variationForm.onReset(t))},t.fn.wc_variation_form=function(){return new r(this),this},t.fn.wc_set_content=function(t){void 0===this.attr("data-o_content")&&this.attr("data-o_content",this.text()),this.text(t)},t.fn.wc_reset_content=function(){void 0!==this.attr("data-o_content")&&this.text(this.attr("data-o_content"))},t.fn.wc_set_variation_attr=function(t,a){void 0===this.attr("data-o_"+t)&&this.attr("data-o_"+t,this.attr(t)?this.attr(t):""),!1===a?this.removeAttr(t):this.attr(t,a)},t.fn.wc_reset_variation_attr=function(t){void 0!==this.attr("data-o_"+t)&&this.attr(t,this.attr("data-o_"+t))},t.fn.wc_maybe_trigger_slide_position_reset=function(a){var i=t(this),e=i.closest(".product").find(".images"),r=!1,o=a&&a.image_id?a.image_id:"";i.attr("current-image")!==o&&(r=!0),i.attr("current-image",o),r&&e.trigger("woocommerce_gallery_reset_slide_position")},t.fn.wc_variations_image_update=function(i){var e=this,r=e.closest(".product"),o=r.find(".images"),n=r.find(".flex-control-nav"),s=n.find("li:eq(0) img"),c=o.find(".woocommerce-product-gallery__image, .woocommerce-product-gallery__image--placeholder").eq(0),_=c.find(".wp-post-image"),d=c.find("a").eq(0);if(i&&i.image&&i.image.src&&i.image.src.length>1){n.find('li img[data-o_src="'+i.image.gallery_thumbnail_src+'"]').length>0&&e.wc_variations_image_reset();var m=n.find('li img[src="'+i.image.gallery_thumbnail_src+'"]');if(m.length>0)return m.trigger("flexslider-click"),e.attr("current-image",i.image_id),void a.setTimeout(function(){t(a).trigger("resize"),o.trigger("woocommerce_gallery_init_zoom")},20);_.wc_set_variation_attr("src",i.image.src),_.wc_set_variation_attr("height",i.image.src_h),_.wc_set_variation_attr("width",i.image.src_w),_.wc_set_variation_attr("srcset",i.image.srcset),_.wc_set_variation_attr("sizes",i.image.sizes),_.wc_set_variation_attr("title",i.image.title),_.wc_set_variation_attr("data-caption",i.image.caption),_.wc_set_variation_attr("alt",i.image.alt),_.wc_set_variation_attr("data-src",i.image.full_src),_.wc_set_variation_attr("data-large_image",i.image.full_src),_.wc_set_variation_attr("data-large_image_width",i.image.full_src_w),_.wc_set_variation_attr("data-large_image_height",i.image.full_src_h),c.wc_set_variation_attr("data-thumb",i.image.src),s.wc_set_variation_attr("src",i.image.gallery_thumbnail_src),d.wc_set_variation_attr("href",i.image.full_src)}else e.wc_variations_image_reset();a.setTimeout(function(){t(a).trigger("resize"),e.wc_maybe_trigger_slide_position_reset(i),o.trigger("woocommerce_gallery_init_zoom")},20)},t.fn.wc_variations_image_reset=function(){var t=this.closest(".product"),a=t.find(".images"),i=t.find(".flex-control-nav").find("li:eq(0) img"),e=a.find(".woocommerce-product-gallery__image, .woocommerce-product-gallery__image--placeholder").eq(0),r=e.find(".wp-post-image"),o=e.find("a").eq(0);r.wc_reset_variation_attr("src"),r.wc_reset_variation_attr("width"),r.wc_reset_variation_attr("height"),r.wc_reset_variation_attr("srcset"),r.wc_reset_variation_attr("sizes"),r.wc_reset_variation_attr("title"),r.wc_reset_variation_attr("data-caption"),r.wc_reset_variation_attr("alt"),r.wc_reset_variation_attr("data-src"),r.wc_reset_variation_attr("data-large_image"),r.wc_reset_variation_attr("data-large_image_width"),r.wc_reset_variation_attr("data-large_image_height"),e.wc_reset_variation_attr("data-thumb"),i.wc_reset_variation_attr("src"),o.wc_reset_variation_attr("href")},t(function(){"undefined"!=typeof wc_add_to_cart_variation_params&&t(".variations_form").each(function(){t(this).wc_variation_form()})});var o=function(t){var e=i.getElementById("tmpl-"+t).textContent,r=!1;return(r=(r=(r=r||/<#\s?data\./.test(e))||/{{{?\s?data\.(?!variation\.).+}}}?/.test(e))||/{{{?\s?data\.variation\.[\w-]*[^\s}]/.test(e))?wp.template(t):function(t){var i=t.variation||{};return e.replace(/({{{?)\s?data\.variation\.([\w-]*)\s?(}}}?)/g,function(t,e,r,o){if(e.length!==o.length)return"";var n=i[r]||"";return 2===e.length?a.escape(n):n})}}}(jQuery,window,document);
// source --> https://mfrash.com/wp-content/plugins/vartion-bundle-products/assets/frontend.js?ver=2.0.55 
( function( $ ) {
	'use strict';

	var priceRequestId = 0;
	var priceRequestTimer = null;
	var activePriceRequest = null;
	var priceHtmlCache = {};
	var lastRenderedPriceKey = '';
	var pendingPriceKey = '';

	function getVariationData( $variationForm ) {
		var data = $variationForm.data( 'product_variations' );

		if ( typeof data === 'string' ) {
			try {
				data = JSON.parse( data );
			} catch ( error ) {
				data = [];
			}
		}

		return $.isArray( data ) ? data : [];
	}

	function collectAttributes( $variationForm ) {
		var attributes = {};

		$variationForm.find( 'select[name^="attribute_"]' ).each( function() {
			var $select = $( this );
			var name = $select.data( 'attribute_name' ) || $select.attr( 'name' );

			if ( name ) {
				attributes[ name ] = $select.val() || '';
			}
		} );

		$variationForm.find( '.visw-hidden-attribute' ).each( function() {
			var $input = $( this );
			var name = $input.data( 'attribute_name' );

			if ( name && $input.val() ) {
				attributes[ name ] = $input.val();
			}
		} );

		return attributes;
	}

	function variationMatches( variation, chosen ) {
		var attributes = variation.attributes || {};

		for ( var name in attributes ) {
			if ( ! Object.prototype.hasOwnProperty.call( attributes, name ) ) {
				continue;
			}

			if ( ! chosen[ name ] ) {
				return false;
			}

			if ( attributes[ name ] && String( attributes[ name ] ) !== String( chosen[ name ] || '' ) ) {
				return false;
			}
		}

		return true;
	}

	function hasCompleteAttributes( $variationForm, chosen ) {
		var complete = true;

		$variationForm.find( '.vibp-selected-attribute' ).each( function() {
			var name = $( this ).data( 'attribute_name' );

			if ( name && ! chosen[ name ] ) {
				complete = false;
				return false;
			}

			return true;
		} );

		return complete;
	}

	function findMatchingVariationId( $variationForm, chosen ) {
		var variation = findMatchingVariation( $variationForm, chosen );

		return variation ? variation.variation_id || 0 : 0;
	}

	function findMatchingVariation( $variationForm, chosen ) {
		var variations = getVariationData( $variationForm );

		for ( var i = 0; i < variations.length; i++ ) {
			if ( variationMatches( variations[ i ], chosen ) ) {
				return variations[ i ];
			}
		}

		return null;
	}

	function getItemPreviewOwner( $item ) {
		var $form = $item.closest( '.vibp-bundle-cart' );
		var formProductId = $form.find( 'input[name="add-to-cart"]' ).first().val() || $form.data( 'product_id' ) || 'bundle';
		var itemIndex = $item.data( 'bundle-index' );

		return String( formProductId ) + ':' + String( itemIndex );
	}

	function getMainProductImage() {
		var $gallery = $( '.woocommerce-product-gallery' ).first();
		var $image = $gallery.find( '.woocommerce-product-gallery__image:first img' ).first();

		if ( ! $image.length ) {
			$image = $gallery.find( 'img.wp-post-image' ).first();
		}

		if ( ! $image.length ) {
			$image = $( '.single-product img.wp-post-image' ).first();
		}

		return $image;
	}

	function cacheMainProductImage( $image ) {
		var attrs = {};
		var $link;
		var $wrapper;

		if ( ! $image.length || $image.data( 'vibpOriginalImage' ) ) {
			return;
		}

		$.each( [ 'src', 'srcset', 'sizes', 'alt', 'title', 'data-src', 'data-large_image', 'data-large_image_width', 'data-large_image_height' ], function( index, attr ) {
			attrs[ attr ] = $image.attr( attr );
		} );

		$image.data( 'vibpOriginalImage', attrs );
		$wrapper = $image.closest( '.woocommerce-product-gallery__image' );
		if ( $wrapper.length ) {
			$wrapper.data( 'vibpOriginalThumb', $wrapper.attr( 'data-thumb' ) );
		}

		$link = $image.closest( 'a' );

		if ( $link.length ) {
			$link.data( 'vibpOriginalHref', $link.attr( 'href' ) );
		}
	}

	function getImageSource( image ) {
		image = image || {};

		return image.src || image.full_src || image.thumb_src || image.gallery_thumbnail_src || '';
	}

	function updateMainProductImage( image, owner ) {
		var src = getImageSource( image );
		var fullSrc;
		var $image;
		var $link;
		var $wrapper;

		if ( ! src ) {
			return false;
		}

		$image = getMainProductImage();

		if ( ! $image.length ) {
			return false;
		}

		cacheMainProductImage( $image );
		fullSrc = image.full_src || image.src || src;
		$image.attr( 'src', src );
		$image.attr( 'data-src', src );
		$image.attr( 'data-large_image', fullSrc );

		if ( image.srcset ) {
			$image.attr( 'srcset', image.srcset );
			$image.attr( 'data-srcset', image.srcset );
		} else {
			$image.removeAttr( 'srcset' );
			$image.removeAttr( 'data-srcset' );
		}

		if ( image.sizes ) {
			$image.attr( 'sizes', image.sizes );
		} else {
			$image.removeAttr( 'sizes' );
		}

		if ( image.alt !== undefined ) {
			$image.attr( 'alt', image.alt || '' );
		}

		if ( image.title !== undefined ) {
			$image.attr( 'title', image.title || '' );
		}

		if ( image.full_src_w ) {
			$image.attr( 'data-large_image_width', image.full_src_w );
		}

		if ( image.full_src_h ) {
			$image.attr( 'data-large_image_height', image.full_src_h );
		}

		$wrapper = $image.closest( '.woocommerce-product-gallery__image' );
		if ( $wrapper.length ) {
			$wrapper.attr( 'data-thumb', image.thumb_src || image.gallery_thumbnail_src || src );
		}

		$link = $image.closest( 'a' );
		if ( $link.length ) {
			$link.attr( 'href', fullSrc );
		}

		if ( owner ) {
			$image.data( 'vibpPreviewOwner', owner );
		}

		$( '.woocommerce-product-gallery' ).first().trigger( 'woocommerce_gallery_reset_slide_position' );
		return true;
	}

	function restoreMainProductImage( owner ) {
		var $image = getMainProductImage();
		var attrs;
		var $link;
		var $wrapper;
		var originalThumb;

		if ( ! $image.length ) {
			return;
		}

		if ( owner && $image.data( 'vibpPreviewOwner' ) && owner !== $image.data( 'vibpPreviewOwner' ) ) {
			return;
		}

		attrs = $image.data( 'vibpOriginalImage' );
		if ( ! attrs ) {
			return;
		}

		$.each( attrs, function( attr, value ) {
			if ( value === undefined || value === null || value === '' ) {
				$image.removeAttr( attr );
			} else {
				$image.attr( attr, value );
			}
		} );

		$link = $image.closest( 'a' );
		if ( $link.length && $link.data( 'vibpOriginalHref' ) !== undefined ) {
			$link.attr( 'href', $link.data( 'vibpOriginalHref' ) );
		}

		$wrapper = $image.closest( '.woocommerce-product-gallery__image' );
		if ( $wrapper.length ) {
			originalThumb = $wrapper.data( 'vibpOriginalThumb' );
			if ( originalThumb === undefined || originalThumb === null || originalThumb === '' ) {
				$wrapper.removeAttr( 'data-thumb' );
			} else {
				$wrapper.attr( 'data-thumb', originalThumb );
			}
		}

		$image.removeData( 'vibpPreviewOwner' );
		$( '.woocommerce-product-gallery' ).first().trigger( 'woocommerce_gallery_reset_slide_position' );
	}

	function getMultiVariationOptionImage( $option ) {
		var $input = $option.find( '.vibp-multi-variation-input' ).first();
		var $image = $option.find( '.vibp-multi-variation-media img' ).first();

		return {
			src: $input.attr( 'data-image_src' ) || $input.attr( 'data-image_full_src' ) || $image.attr( 'src' ) || '',
			full_src: $input.attr( 'data-image_full_src' ) || $input.attr( 'data-image_src' ) || $image.attr( 'src' ) || '',
			thumb_src: $input.attr( 'data-image_thumb_src' ) || $image.attr( 'src' ) || '',
			gallery_thumbnail_src: $input.attr( 'data-image_gallery_thumb_src' ) || $image.attr( 'src' ) || '',
			srcset: $input.attr( 'data-image_srcset' ) || $image.attr( 'srcset' ) || '',
			sizes: $input.attr( 'data-image_sizes' ) || $image.attr( 'sizes' ) || '',
			alt: $input.attr( 'data-image_alt' ) || $image.attr( 'alt' ) || '',
			title: $input.attr( 'data-image_title' ) || $image.attr( 'title' ) || ''
		};
	}

	function syncBundleItem( $variationForm, options ) {
		var chosen = collectAttributes( $variationForm );
		var variationId = parseInt( $variationForm.find( 'input.variation_id' ).val() || '0', 10 );
		var completeAttributes = hasCompleteAttributes( $variationForm, chosen );
		var variation = completeAttributes ? findMatchingVariation( $variationForm, chosen ) : null;
		var $item = $variationForm.closest( '.vibp-bundle-item' );
		var previewOwner = getItemPreviewOwner( $item );

		if ( ! completeAttributes ) {
			variationId = 0;
			$variationForm.find( 'input.variation_id' ).val( 0 );
		}

		if ( variation && variation.variation_id && parseInt( variation.variation_id, 10 ) !== variationId ) {
			variationId = variation.variation_id || 0;
			$variationForm.find( 'input.variation_id' ).val( variationId );
		}

		if ( ! variationId ) {
			variationId = variation ? variation.variation_id || 0 : 0;
			if ( variationId ) {
				$variationForm.find( 'input.variation_id' ).val( variationId );
			}
		}

		if ( variation && variation.display_price !== undefined ) {
			var qty = parseInt( $item.find( 'input[name$="[quantity]"]' ).val() || '1', 10 ) || 1;

			if ( '1' !== $item.attr( 'data-custom_price' ) ) {
				$item.attr( 'data-item_price', ( parseFloat( variation.display_price ) || 0 ) * qty );
			}

			if ( variation.display_regular_price !== undefined ) {
				$item.attr( 'data-item_regular_price', ( parseFloat( variation.display_regular_price ) || parseFloat( variation.display_price ) || 0 ) * qty );
			}
		}

		$variationForm.find( '.vibp-selected-variation' ).val( variationId || 0 );
		$variationForm.find( '.vibp-selected-attribute' ).each( function() {
			var $input = $( this );
			var name = $input.data( 'attribute_name' );
			$input.val( name && chosen[ name ] ? chosen[ name ] : '' );
		} );

		if ( ! variationId ) {
			$variationForm.find( '.vibp-attributes-confirmed' ).val( '' );
			restoreMainProductImage( previewOwner );
		} else if ( variation && variation.image ) {
			updateMainProductImage( variation.image, previewOwner );
		}

		if ( ! options || false !== options.updatePrice ) {
			notifyBundlePriceChanged( $variationForm.closest( '.vibp-bundle-cart' ), options || {} );
		}
	}

	function markAttributesConfirmed( $variationForm ) {
		$variationForm.find( '.vibp-attributes-confirmed' ).val( '1' );
	}

	function syncMultiVariationItem( $multi, options ) {
		var $item = $multi.closest( '.vibp-bundle-item' );
		var qty = parseInt( $multi.attr( 'data-quantity' ) || $item.find( 'input[name$="[quantity]"]' ).val() || '1', 10 ) || 1;
		var maxChoices = parseInt( $multi.attr( 'data-max_choices' ) || qty || '1', 10 ) || 1;
		var isCustom = '1' === String( $multi.attr( 'data-custom_price' ) || $item.attr( 'data-custom_price' ) || '' );
		var basePrice = parseFloat( $multi.attr( 'data-base_price' ) || $item.attr( 'data-base_item_price' ) || '0' ) || 0;
		var baseRegularPrice = parseFloat( $multi.attr( 'data-base_regular_price' ) || $item.attr( 'data-base_item_regular_price' ) || basePrice || '0' ) || 0;
		var basePricePerChoice = maxChoices > 0 ? basePrice / maxChoices : basePrice;
		var baseRegularPricePerChoice = maxChoices > 0 ? baseRegularPrice / maxChoices : baseRegularPrice;
		var selected = [];
		var selectedUnits = 0;
		var price = 0;
		var regularPrice = 0;
		var previewOption = null;
		var preferredPreviewVariationId = options && options.previewVariationId ? String( options.previewVariationId ) : String( $multi.data( 'vibpPreviewVariationId' ) || '' );
		var previewOwner = getItemPreviewOwner( $item );
		var atLimit;
		var isIncluded;

		$multi.find( '.vibp-multi-variation-input' ).each( function() {
			var $input = $( this );
			var $option = $input.closest( '.vibp-multi-variation-option' );
			var $qtyInput = $option.find( '.vibp-multi-variation-qty-input' ).first();
			var selectedQty = parseInt( $qtyInput.val() || '0', 10 ) || 0;
			var inputPrice;
			var inputRegularPrice;

			if ( $input.is( ':checked' ) && selectedQty < 1 ) {
				selectedQty = 1;
			}

			selectedQty = Math.max( 0, Math.min( selectedQty, maxChoices ) );

			if ( selectedUnits + selectedQty > maxChoices ) {
				selectedQty = Math.max( 0, maxChoices - selectedUnits );
			}

			$qtyInput.val( selectedQty );
			$input.prop( 'checked', selectedQty > 0 );
			$option.toggleClass( 'is-selected', selectedQty > 0 );

			if ( selectedQty < 1 ) {
				return;
			}

			selected.push( $input.val() );
			selectedUnits += selectedQty;
			if ( ! previewOption || ( preferredPreviewVariationId && String( $input.val() ) === preferredPreviewVariationId ) ) {
				previewOption = $option;
			}

			if ( isCustom ) {
				price += basePricePerChoice * selectedQty;
				regularPrice += baseRegularPricePerChoice * selectedQty;
				return;
			}

			inputPrice = parseFloat( $input.attr( 'data-price' ) || '0' ) || 0;
			inputRegularPrice = parseFloat( $input.attr( 'data-regular_price' ) || inputPrice || '0' ) || inputPrice;
			price += inputPrice * selectedQty;
			regularPrice += inputRegularPrice * selectedQty;
		} );

		if ( ! selectedUnits ) {
			price = basePrice;
			regularPrice = baseRegularPrice;
		}

		atLimit = selectedUnits >= maxChoices;
		isIncluded = isOptionalItemIncluded( $multi );
		$multi.find( '.vibp-multi-variation-input' ).each( function() {
			var $input = $( this );
			var $option = $input.closest( '.vibp-multi-variation-option' );
			var $qtyInput = $option.find( '.vibp-multi-variation-qty-input' ).first();
			var selectedQty = parseInt( $qtyInput.val() || '0', 10 ) || 0;
			var disabled = ! isIncluded || ( atLimit && selectedQty < 1 );

			$input.prop( 'disabled', disabled );
			$qtyInput.prop( 'disabled', disabled );
			$option.find( '.vibp-multi-variation-qty-button[data-vibp-delta="-1"]' ).prop( 'disabled', ! isIncluded || selectedQty < 1 );
			$option.find( '.vibp-multi-variation-qty-button[data-vibp-delta="1"]' ).prop( 'disabled', ! isIncluded || atLimit );
			$option.toggleClass( 'is-disabled', disabled );
		} );

		$item.attr( 'data-item_price', price );
		$item.attr( 'data-item_regular_price', regularPrice );
		$multi.find( '.vibp-selected-variation' ).val( selected.length ? selected[0] : 0 );
		$multi.find( '.vibp-attributes-confirmed' ).val( selectedUnits === maxChoices ? '1' : '' );
		$multi.find( '.vibp-multi-variation-limit' )
			.text( selectedUnits ? 'تم اختيار ' + selectedUnits + ' من ' + maxChoices : 'اختر ' + maxChoices + ' من الصور' )
			.toggleClass( 'is-complete', selectedUnits === maxChoices );
		$multi.toggleClass( 'has-selection', selectedUnits > 0 );
		$multi.toggleClass( 'is-at-limit', atLimit );
		if ( previewOption && selectedUnits > 0 ) {
			$multi.data( 'vibpPreviewVariationId', previewOption.find( '.vibp-multi-variation-input' ).first().val() || '' );
			updateMainProductImage( getMultiVariationOptionImage( previewOption ), previewOwner );
		} else {
			$multi.removeData( 'vibpPreviewVariationId' );
			restoreMainProductImage( previewOwner );
		}

		if ( ! options || false !== options.updatePrice ) {
			notifyBundlePriceChanged( $multi.closest( '.vibp-bundle-cart' ), options || {} );
		}
	}

	function getMultiVariationSelectedQty( $multi ) {
		var total = 0;

		$multi.find( '.vibp-multi-variation-qty-input' ).each( function() {
			total += Math.max( 0, parseInt( $( this ).val() || '0', 10 ) || 0 );
		} );

		return total;
	}

	function collectBundlePriceData( $form ) {
		var price = 0;
		var regularPrice = 0;
		var choiceGroups = {};

		$form.find( '.vibp-bundle-item' ).each( function() {
			var $item = $( this );
			var itemPrice = parseFloat( $item.attr( 'data-item_price' ) || '0' ) || 0;
			var itemRegularPrice = parseFloat( $item.attr( 'data-item_regular_price' ) || '0' ) || 0;
			var choiceName;

			if ( $item.hasClass( 'vibp-bundle-item--choice' ) ) {
				choiceName = $item.find( '.vibp-choice-toggle input[type="radio"]' ).attr( 'name' ) || 'default';

				if ( ! choiceGroups[ choiceName ] ) {
					choiceGroups[ choiceName ] = {
						max: null,
						selected: null
					};
				}

				if ( null === choiceGroups[ choiceName ].max || itemPrice > choiceGroups[ choiceName ].max.price ) {
					choiceGroups[ choiceName ].max = {
						price: itemPrice,
						regular_price: itemRegularPrice
					};
				}

				if ( $item.hasClass( 'is-included' ) ) {
					choiceGroups[ choiceName ].selected = {
						price: itemPrice,
						regular_price: itemRegularPrice
					};
				}

				return;
			}

			if ( $item.hasClass( 'vibp-bundle-item--optional' ) && ! $item.hasClass( 'is-included' ) ) {
				return;
			}

			price += itemPrice;
			regularPrice += itemRegularPrice;
		} );

		$.each( choiceGroups, function( name, group ) {
			var chosen = group.selected || group.max;

			if ( chosen ) {
				price += chosen.price;
				regularPrice += chosen.regular_price;
			}
		} );

		return {
			price: price,
			regular_price: regularPrice,
			sale_price: regularPrice > price ? price : '',
			has_discount: regularPrice > price
		};
	}

	function notifyBundlePriceChanged( $form, options ) {
		if ( ! $form.length ) {
			return;
		}

		options = options || {};

		var data = collectBundlePriceData( $form );

		$form
			.attr( 'data-vibp-price', data.price )
			.attr( 'data-vibp-regular-price', data.regular_price )
			.attr( 'data-vibp-sale-price', data.sale_price );

		$form.find( '.vibp-calculated-price' ).val( data.price );
		$form.find( '.vibp-calculated-regular-price' ).val( data.regular_price );
		$form.find( '.vibp-calculated-sale-price' ).val( data.sale_price );

		$form.trigger( 'vibp_bundle_price_changed', [ data ] );
		$( document.body ).trigger( 'vibp_bundle_price_changed', [ $form, data ] );

		if ( $form[0] && window.CustomEvent ) {
			$form[0].dispatchEvent( new CustomEvent( 'vibp:bundle-price-changed', {
				bubbles: true,
				detail: data
			} ) );
		}

		if ( false !== options.renderPrice ) {
			updateMfrashPriceBox( data, options );
		}
	}

	function normalizePriceValue( value ) {
		var number = parseFloat( value || 0 );

		if ( ! isFinite( number ) ) {
			number = 0;
		}

		return number.toFixed( 2 );
	}

	function updateMfrashPriceBox( data, options ) {
		var settings = window.vibpBundle || {};
		var $box = $( '#mfrash-price-wrap' );
		var regularPrice;
		var salePrice;
		var cacheKey;
		var requestId;
		var delay;

		if ( ! $box.length || ! settings.mfrashPrice || ! settings.ajaxUrl ) {
			return;
		}

		options = options || {};
		regularPrice = data.regular_price || data.price || 0;
		salePrice = data.has_discount ? data.price : 0;
		cacheKey = normalizePriceValue( regularPrice ) + '|' + normalizePriceValue( salePrice );

		if ( cacheKey === lastRenderedPriceKey || cacheKey === pendingPriceKey ) {
			return;
		}

		if ( priceHtmlCache[ cacheKey ] ) {
			clearTimeout( priceRequestTimer );
			pendingPriceKey = '';
			if ( activePriceRequest && activePriceRequest.readyState !== 4 ) {
				activePriceRequest.abort();
			}
			$box.html( priceHtmlCache[ cacheKey ] );
			lastRenderedPriceKey = cacheKey;
			return;
		}

		clearTimeout( priceRequestTimer );
		pendingPriceKey = cacheKey;
		delay = options.immediate ? 0 : parseInt( settings.priceDebounceMs || 120, 10 );

		priceRequestTimer = window.setTimeout( function() {
			requestId = ++priceRequestId;

			if ( activePriceRequest && activePriceRequest.readyState !== 4 ) {
				activePriceRequest.abort();
			}

			activePriceRequest = $.post( settings.ajaxUrl, {
				action: 'vibp_render_mfrash_price',
				nonce: settings.priceNonce || '',
				regular_price: regularPrice,
				sale_price: salePrice
			} ).done( function( response ) {
				if ( requestId !== priceRequestId || pendingPriceKey !== cacheKey ) {
					return;
				}

				if ( response && response.success && response.data && response.data.html ) {
					priceHtmlCache[ cacheKey ] = response.data.html;
					$box.html( response.data.html );
					lastRenderedPriceKey = cacheKey;
				}
			} ).always( function() {
				if ( pendingPriceKey === cacheKey ) {
					pendingPriceKey = '';
				}
				if ( activePriceRequest && activePriceRequest.readyState === 4 ) {
					activePriceRequest = null;
				}
			} );
		}, Math.max( delay, 0 ) );
	}

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

	function getNoticesWrapper( $form ) {
		var $wrapper = $( '.woocommerce-notices-wrapper' ).first();

		if ( ! $wrapper.length ) {
			$wrapper = $( '<div class="woocommerce-notices-wrapper"></div>' );
			$form.before( $wrapper );
		}

		return $wrapper;
	}

	function showBundleNotice( $form, notices, message, type ) {
		var $wrapper = getNoticesWrapper( $form );
		var html = notices && $.trim( notices ) ? notices : '';
		var settings = window.vibpBundle || {};
		var detail = '';

		if ( ! html ) {
			if ( 'error' === type ) {
				if ( message === settings.missingVariation ) {
					detail = settings.missingVariationHelp || '';
				} else if ( message === settings.missingChoice ) {
					detail = settings.missingChoiceHelp || '';
				}
				html = '<div class="woocommerce-error vibp-bundle-notice vibp-bundle-notice--error" role="alert"><span class="vibp-bundle-notice__icon" aria-hidden="true">!</span><span class="vibp-bundle-notice__copy"><strong>' + escapeHtml( message ) + '</strong>' + ( detail ? '<small>' + escapeHtml( detail ) + '</small>' : '' ) + '</span></div>';
			} else {
				html = '<div class="woocommerce-message" role="alert">' + escapeHtml( message ) + '</div>';
			}
		}

		$wrapper.html( html );

		if ( $wrapper[0] && $wrapper[0].scrollIntoView ) {
			$wrapper[0].scrollIntoView( {
				block: 'nearest',
				behavior: 'smooth'
			} );
		}
	}

	function parseAjaxFailureData( jqXHR ) {
		var text;
		var match;

		if ( jqXHR && jqXHR.responseJSON && jqXHR.responseJSON.data ) {
			return jqXHR.responseJSON.data;
		}

		text = jqXHR && jqXHR.responseText ? $.trim( jqXHR.responseText ) : '';
		if ( ! text ) {
			return {};
		}

		try {
			return JSON.parse( text ).data || {};
		} catch ( error ) {
			match = text.match( /\{"success"[\s\S]*\}$/ );
			if ( match && match[0] ) {
				try {
					return JSON.parse( match[0] ).data || {};
				} catch ( ignored ) {}
			}
		}

		return {};
	}

	function initVariationForm( $variationForm ) {
		if ( $.fn.wc_variation_form ) {
			$variationForm.wc_variation_form();
		}

		$variationForm.find( '.vibp-attributes-confirmed' ).val( '' );
		disableBundleSwatchNavigation( $variationForm );
		syncBundleItem( $variationForm );
	}

	function isOptionalItemIncluded( $variationForm ) {
		var $item = $variationForm.closest( '.vibp-bundle-item' );
		var $checkbox = $item.find( '.vibp-optional-toggle input[type="checkbox"]' ).first();
		var $choice = $item.find( '.vibp-choice-toggle input[type="radio"]' ).first();

		if ( $choice.length ) {
			return $choice.is( ':checked' );
		}

		return ! $checkbox.length || $checkbox.is( ':checked' );
	}

	function syncChoiceGroup( $radio ) {
		var groupName = $radio.attr( 'name' );
		var groupMatch;
		var groupKey;
		var $form;
		var $selected;

		if ( ! groupName ) {
			return;
		}

		$( 'input[name="' + groupName.replace( /"/g, '\\"' ) + '"]' ).each( function() {
			var $item = $( this ).closest( '.vibp-bundle-item' );
			var checked = $( this ).is( ':checked' );

			$item.toggleClass( 'is-included', checked );
			$item.find( '.vibp-choice-included' ).val( checked ? '1' : '' );
			$item.find( '.vibp-child-variations select, .vibp-child-variations .visw-option' ).prop( 'disabled', ! checked );
			$item.find( '.vibp-child-multi-variations input' ).prop( 'disabled', ! checked );
			$item.find( '.vibp-child-multi-variations' ).each( function() {
				syncMultiVariationItem( $( this ), { updatePrice: false } );
			} );
		} );

		groupMatch = groupName.match( /^vibp_choice_group\[(.+)\]$/ );
		groupKey = groupMatch ? groupMatch[1] : groupName;
		$form = $radio.closest( '.vibp-bundle-cart' );
		$selected = $( 'input[name="' + groupName.replace( /"/g, '\\"' ) + '"]:checked' );

		if ( $form.length && $selected.length ) {
			ensureHiddenInput( $form, 'vibp_selected_choice[' + groupKey + ']' ).val( $selected.val() );
			ensureHiddenInput( $form, 'vibp_selected_choice_product[' + groupKey + ']' ).val( $selected.data( 'product_id' ) || $selected.closest( '.vibp-bundle-item' ).data( 'product_id' ) || '' );
		}
	}

	function syncAllChoiceGroups( $form ) {
		var groups = {};

		$form.find( '.vibp-choice-toggle input[type="radio"]' ).each( function() {
			var name = $( this ).attr( 'name' );

			if ( name && ! groups[ name ] ) {
				groups[ name ] = true;
				syncChoiceGroup( $form.find( 'input[name="' + name.replace( /"/g, '\\"' ) + '"]:checked' ).first() );
			}
		} );
	}

	function ensureHiddenInput( $form, name ) {
		var $input = $form.find( 'input[type="hidden"][name="' + name.replace( /"/g, '\\"' ) + '"]' );

		if ( ! $input.length ) {
			$input = $( '<input type="hidden" />' ).attr( 'name', name ).appendTo( $form );
		}

		return $input;
	}

	function hasMissingChoiceGroup( $form ) {
		var groups = {};
		var missing = false;

		$form.find( '.vibp-choice-toggle input[type="radio"]' ).each( function() {
			var name = $( this ).attr( 'name' );

			if ( name ) {
				groups[ name ] = true;
			}
		} );

		$.each( groups, function( name ) {
			if ( ! $form.find( 'input[name="' + name.replace( /"/g, '\\"' ) + '"]:checked' ).length ) {
				missing = true;
				return false;
			}

			return true;
		} );

		return missing;
	}

	function disableBundleSwatchNavigation( $scope ) {
		$scope.find( '.visw-option' ).each( function() {
			$( this )
				.attr( 'href', '#' )
				.attr( 'data-variation_url', '' )
				.attr( 'data-add_to_cart_url', '' )
				.removeAttr( 'data-visw-add-to-cart-url' );
		} );
	}

	$( function() {
		$( '.vibp-child-variations' ).each( function() {
			initVariationForm( $( this ) );
		} );
		$( '.vibp-child-multi-variations' ).each( function() {
			syncMultiVariationItem( $( this ), { renderPrice: false } );
		} );
		$( '.vibp-optional-toggle input[type="checkbox"]' ).trigger( 'change' );
		$( '.vibp-choice-toggle input[type="radio"]:checked' ).each( function() {
			syncChoiceGroup( $( this ) );
		} );
		$( '.vibp-bundle-cart' ).each( function() {
			notifyBundlePriceChanged( $( this ), { renderPrice: false } );
		} );
	} );

	$( document ).on(
		'change found_variation hide_variation woocommerce_variation_has_changed wc_variation_form',
		'.vibp-child-variations',
		function( event ) {
			var $variationForm = $( this );
			if ( 'change' === event.type && event.originalEvent && $( event.target ).is( 'select[name^="attribute_"]' ) ) {
				markAttributesConfirmed( $variationForm );
			}
			disableBundleSwatchNavigation( $variationForm );
			syncBundleItem( $variationForm );
		}
	);

	$( document ).on( 'click', '.vibp-child-variations .visw-option', function( event ) {
		event.preventDefault();

		$( this )
			.attr( 'href', '#' )
			.attr( 'data-variation_url', '' )
			.attr( 'data-add_to_cart_url', '' );

		var $variationForm = $( this ).closest( '.vibp-child-variations' );
		markAttributesConfirmed( $variationForm );

		window.setTimeout( function() {
			disableBundleSwatchNavigation( $variationForm );
			syncBundleItem( $variationForm );
		}, 20 );
	} );

	$( document ).on( 'click', '.vibp-child-variations .visw-clear-selection', function() {
		var $variationForm = $( this ).closest( '.vibp-child-variations' );

		$variationForm.find( '.vibp-attributes-confirmed' ).val( '' );

		window.setTimeout( function() {
			syncBundleItem( $variationForm );
		}, 20 );
	} );

	$( document ).on( 'change', '.vibp-multi-variation-input', function() {
		var $multi = $( this ).closest( '.vibp-child-multi-variations' );
		var maxChoices = parseInt( $multi.attr( 'data-max_choices' ) || $multi.attr( 'data-quantity' ) || '1', 10 ) || 1;
		var $option = $( this ).closest( '.vibp-multi-variation-option' );
		var $qtyInput = $option.find( '.vibp-multi-variation-qty-input' ).first();

		if ( ! isOptionalItemIncluded( $multi ) ) {
			$( this ).prop( 'checked', false );
			$qtyInput.val( 0 );
			syncMultiVariationItem( $multi );
			return;
		}

		if ( $( this ).is( ':checked' ) && getMultiVariationSelectedQty( $multi ) >= maxChoices && parseInt( $qtyInput.val() || '0', 10 ) < 1 ) {
			$( this ).prop( 'checked', false );
		} else if ( $( this ).is( ':checked' ) && parseInt( $qtyInput.val() || '0', 10 ) < 1 ) {
			$qtyInput.val( 1 );
		} else if ( ! $( this ).is( ':checked' ) ) {
			$qtyInput.val( 0 );
		}

		if ( $( this ).is( ':checked' ) ) {
			$multi.data( 'vibpPreviewVariationId', $( this ).val() || '' );
		}

		syncMultiVariationItem( $multi, { previewVariationId: $( this ).val() || '' } );
	} );

	$( document ).on( 'click', '.vibp-multi-variation-option', function( event ) {
		var $target = $( event.target );
		var $option;
		var $multi;
		var $input;
		var $qtyInput;
		var maxChoices;

		if ( $target.closest( '.vibp-multi-variation-qty, .vibp-multi-variation-input' ).length ) {
			return;
		}

		$option = $( this );
		$multi = $option.closest( '.vibp-child-multi-variations' );
		$input = $option.find( '.vibp-multi-variation-input' ).first();
		$qtyInput = $option.find( '.vibp-multi-variation-qty-input' ).first();
		maxChoices = parseInt( $multi.attr( 'data-max_choices' ) || $multi.attr( 'data-quantity' ) || '1', 10 ) || 1;

		if ( ! isOptionalItemIncluded( $multi ) ) {
			return;
		}

		if ( $input.is( ':checked' ) ) {
			$input.prop( 'checked', false );
			$qtyInput.val( 0 );
		} else if ( getMultiVariationSelectedQty( $multi ) < maxChoices ) {
			$input.prop( 'checked', true );
			$qtyInput.val( 1 );
		}

		if ( $input.is( ':checked' ) ) {
			$multi.data( 'vibpPreviewVariationId', $input.val() || '' );
		}

		syncMultiVariationItem( $multi, { previewVariationId: $input.val() || '' } );
	} );

	$( document ).on( 'click', '.vibp-multi-variation-qty-button', function( event ) {
		var $button = $( this );
		var $option = $button.closest( '.vibp-multi-variation-option' );
		var $multi = $button.closest( '.vibp-child-multi-variations' );
		var $input = $option.find( '.vibp-multi-variation-input' ).first();
		var $qtyInput = $option.find( '.vibp-multi-variation-qty-input' ).first();
		var maxChoices = parseInt( $multi.attr( 'data-max_choices' ) || $multi.attr( 'data-quantity' ) || '1', 10 ) || 1;
		var current = Math.max( 0, parseInt( $qtyInput.val() || '0', 10 ) || 0 );
		var delta = parseInt( $button.attr( 'data-vibp-delta' ) || '0', 10 ) || 0;
		var totalWithoutCurrent = getMultiVariationSelectedQty( $multi ) - current;
		var next = current + delta;

		event.preventDefault();
		event.stopPropagation();

		next = Math.max( 0, Math.min( next, maxChoices - totalWithoutCurrent ) );
		$qtyInput.val( next );
		$input.prop( 'checked', next > 0 );
		if ( next > 0 ) {
			$multi.data( 'vibpPreviewVariationId', $input.val() || '' );
		}
		syncMultiVariationItem( $multi, { previewVariationId: $input.val() || '' } );
	} );

	$( document ).on( 'input change', '.vibp-multi-variation-qty-input', function( event ) {
		var $qtyInput = $( this );
		var $option = $qtyInput.closest( '.vibp-multi-variation-option' );
		var $multi = $qtyInput.closest( '.vibp-child-multi-variations' );
		var $input = $option.find( '.vibp-multi-variation-input' ).first();
		var maxChoices = parseInt( $multi.attr( 'data-max_choices' ) || $multi.attr( 'data-quantity' ) || '1', 10 ) || 1;
		var current = Math.max( 0, parseInt( $qtyInput.val() || '0', 10 ) || 0 );
		var totalWithoutCurrent = getMultiVariationSelectedQty( $multi ) - current;
		var next = Math.max( 0, Math.min( current, maxChoices - totalWithoutCurrent ) );

		event.stopPropagation();

		$qtyInput.val( next );
		$input.prop( 'checked', next > 0 );
		if ( next > 0 ) {
			$multi.data( 'vibpPreviewVariationId', $input.val() || '' );
		}
		syncMultiVariationItem( $multi, { previewVariationId: $input.val() || '' } );
	} );

	$( document ).on( 'change', '.vibp-optional-toggle input[type="checkbox"]', function() {
		var $item = $( this ).closest( '.vibp-bundle-item' );

		$item.toggleClass( 'is-included', $( this ).is( ':checked' ) );
		$item.find( '.vibp-child-variations select, .vibp-child-variations .visw-option' ).prop( 'disabled', ! $( this ).is( ':checked' ) );
		$item.find( '.vibp-child-multi-variations input' ).prop( 'disabled', ! $( this ).is( ':checked' ) );
		$item.find( '.vibp-child-multi-variations' ).each( function() {
			syncMultiVariationItem( $( this ), { updatePrice: false } );
		} );
		notifyBundlePriceChanged( $( this ).closest( '.vibp-bundle-cart' ) );
	} );

	$( document ).on( 'change', '.vibp-choice-toggle input[type="radio"]', function() {
		syncChoiceGroup( $( this ) );
		notifyBundlePriceChanged( $( this ).closest( '.vibp-bundle-cart' ) );
	} );

	$( document ).on( 'click', '.vibp-bundle-item--choice', function( event ) {
		if ( $( event.target ).closest( '.vibp-child-variations, .vibp-child-multi-variations, a, button, input, select, label' ).length ) {
			return;
		}

		var $radio = $( this ).find( '.vibp-choice-toggle input[type="radio"]' ).first();
		if ( $radio.length && ! $radio.is( ':checked' ) ) {
			$radio.prop( 'checked', true ).trigger( 'change' );
		}
	} );

	$( document ).on( 'submit.vibpAjaxAdd', '.vibp-bundle-cart', function( event ) {
		var valid = true;
		var $form = $( this );
		var settings = window.vibpBundle || {};
		var $button;
		var originalText;
		var formData;
		var productId;
		var lastResponse = null;

		if ( ! settings.ajaxAddToCart || ! settings.ajaxUrl || ! window.FormData ) {
			return;
		}

		event.preventDefault();
		event.stopImmediatePropagation();

		if ( $form.data( 'vibpAjaxSubmitting' ) ) {
			return;
		}

		syncAllChoiceGroups( $form );
		notifyBundlePriceChanged( $form, { renderPrice: false } );

		if ( hasMissingChoiceGroup( $form ) ) {
			showBundleNotice( $form, '', settings.missingChoice || 'فضلاً اختر أحد الخيارات', 'error' );
			$form.trigger( 'vibp_bundle_ajax_error' );
			return;
		}

		$form.find( '.vibp-child-variations' ).each( function() {
			if ( ! isOptionalItemIncluded( $( this ) ) ) {
				return;
			}

			syncBundleItem( $( this ), { updatePrice: false } );

			if ( ! parseInt( $( this ).find( '.vibp-selected-variation' ).val() || '0', 10 ) ) {
				valid = false;
			}
		} );

		$form.find( '.vibp-child-multi-variations' ).each( function() {
			var maxChoices = parseInt( $( this ).attr( 'data-max_choices' ) || $( this ).attr( 'data-quantity' ) || '1', 10 ) || 1;

			if ( ! isOptionalItemIncluded( $( this ) ) ) {
				return;
			}

			syncMultiVariationItem( $( this ), { updatePrice: false } );

			if ( getMultiVariationSelectedQty( $( this ) ) !== maxChoices ) {
				valid = false;
			}
		} );

		if ( ! valid ) {
			showBundleNotice( $form, '', settings.missingVariation || 'فضلاً اختر لون المفرش', 'error' );
			$form.trigger( 'vibp_bundle_ajax_error' );
			return;
		}

		$button = $form.find( '.single_add_to_cart_button' ).first();
		originalText = $button.text();
		formData = new FormData( $form[0] );
		productId = $button.attr( 'value' ) || $button.val() || $form.find( '[name="product_id"]' ).val() || '';

		if ( formData.set ) {
			formData.set( 'action', 'vibp_add_bundle_to_cart' );
			formData.set( 'nonce', settings.ajaxAddNonce || $form.find( '[name="nonce"]' ).val() || '' );
		} else {
			formData.append( 'action', 'vibp_add_bundle_to_cart' );
			formData.append( 'nonce', settings.ajaxAddNonce || $form.find( '[name="nonce"]' ).val() || '' );
		}

		if ( productId && ! formData.get( 'add-to-cart' ) ) {
			formData.append( 'add-to-cart', productId );
		}

		$form.data( 'vibpAjaxSubmitting', true );
		$button.prop( 'disabled', true ).addClass( 'loading' ).text( settings.addingText || originalText );

		$.ajax( {
			url: settings.ajaxUrl,
			type: 'POST',
			data: formData,
			processData: false,
			contentType: false
		} ).done( function( response ) {
			var data = response && response.data ? response.data : {};
			lastResponse = response;

			if ( response && response.success ) {
				showBundleNotice( $form, data.notices || '', data.message || 'Bundle added to cart.', 'success' );
				$( document.body ).trigger( 'added_to_cart', [ data.fragments || {}, data.cart_hash || '', $button ] );
				$( document.body ).trigger( 'wc_fragment_refresh' );
				$form.trigger( 'vibp_bundle_ajax_added', [ response ] );
				return;
			}

			showBundleNotice( $form, data.notices || '', data.message || settings.errorText || 'Could not add bundle to cart.', 'error' );
			$form.trigger( 'vibp_bundle_ajax_error', [ response ] );
		} ).fail( function( jqXHR ) {
			var data = parseAjaxFailureData( jqXHR );
			showBundleNotice( $form, data.notices || '', data.message || settings.errorText || 'Could not add bundle to cart.', 'error' );
			$form.trigger( 'vibp_bundle_ajax_error', [ data ] );
		} ).always( function() {
			$form.removeData( 'vibpAjaxSubmitting' );
			$button.prop( 'disabled', false ).removeClass( 'loading' ).text( originalText );
			$form.trigger( 'vibp_bundle_ajax_complete', [ lastResponse ] );
		} );
	} );

	$( document ).on( 'submit', '.vibp-bundle-cart', function( event ) {
		var valid = true;
		var $form = $( this );
		var settings = window.vibpBundle || {};

		syncAllChoiceGroups( $form );
		notifyBundlePriceChanged( $form, { renderPrice: false } );

		if ( hasMissingChoiceGroup( $form ) ) {
			event.preventDefault();
			showBundleNotice( $form, '', settings.missingChoice || 'فضلاً اختر أحد الخيارات', 'error' );
			return;
		}

		$form.find( '.vibp-child-variations' ).each( function() {
			if ( ! isOptionalItemIncluded( $( this ) ) ) {
				return;
			}

			syncBundleItem( $( this ), { updatePrice: false } );

			if ( ! parseInt( $( this ).find( '.vibp-selected-variation' ).val() || '0', 10 ) ) {
				valid = false;
			}
		} );

		$form.find( '.vibp-child-multi-variations' ).each( function() {
			var maxChoices = parseInt( $( this ).attr( 'data-max_choices' ) || $( this ).attr( 'data-quantity' ) || '1', 10 ) || 1;

			if ( ! isOptionalItemIncluded( $( this ) ) ) {
				return;
			}

			syncMultiVariationItem( $( this ), { updatePrice: false } );

			if ( getMultiVariationSelectedQty( $( this ) ) !== maxChoices ) {
				valid = false;
			}
		} );

		if ( ! valid ) {
			event.preventDefault();
			showBundleNotice( $form, '', settings.missingVariation || 'فضلاً اختر لون المفرش', 'error' );
		}
		if ( ! valid ) {
			return;
		}

		if ( ! settings.ajaxAddToCart || ! settings.ajaxUrl || ! window.FormData ) {
			return;
		}

		event.preventDefault();

		var $button = $form.find( '.single_add_to_cart_button' ).first();
		var originalText = $button.text();
		var formData = new FormData( $form[0] );
		var productId = $button.attr( 'value' ) || $button.val() || $form.find( '[name="add-to-cart"]' ).val() || '';

		if ( formData.set ) {
			formData.set( 'action', 'vibp_add_bundle_to_cart' );
			formData.set( 'nonce', settings.ajaxAddNonce || '' );
		} else {
			formData.append( 'action', 'vibp_add_bundle_to_cart' );
			formData.append( 'nonce', settings.ajaxAddNonce || '' );
		}

		if ( productId && ! formData.get( 'add-to-cart' ) ) {
			formData.append( 'add-to-cart', productId );
		}

		$button.prop( 'disabled', true ).addClass( 'loading' ).text( settings.addingText || originalText );

		$.ajax( {
			url: settings.ajaxUrl,
			type: 'POST',
			data: formData,
			processData: false,
			contentType: false
		} ).done( function( response ) {
			if ( response && response.success ) {
				window.location.href = response.data && response.data.cart_url ? response.data.cart_url : ( settings.cartUrl || window.location.href );
				return;
			}

			if ( response && response.data && response.data.message ) {
				window.alert( response.data.message );
			} else {
				window.alert( settings.errorText || 'تعذر إضافة التجميعة إلى السلة.' );
			}
		} ).fail( function( jqXHR ) {
			var data = parseAjaxFailureData( jqXHR );
			window.alert( data.message || settings.errorText || 'تعذر إضافة التجميعة إلى السلة.' );
		} ).always( function() {
			$button.prop( 'disabled', false ).removeClass( 'loading' ).text( originalText );
		} );
	} );
}( jQuery ) );
// source --> https://mfrash.com/wp-content/plugins/vartion-image-swatches/assets/frontend.js?ver=1.1.10 
( function( $ ) {
	'use strict';

	function settingEnabled( key ) {
		if ( typeof window.viswSettings === 'undefined' || window.viswSettings[ key ] === undefined ) {
			return true;
		}

		return !! window.viswSettings[ key ];
	}

	function findSelect( $field ) {
		var $select = $field.prevAll( '.visw-native-select' ).first().find( 'select' ).first();

		if ( $select.length ) {
			return $select;
		}

		return $field.closest( 'td, .value' ).find( 'select' ).first();
	}

	function findHidden( $field ) {
		return $field.prevAll( '.visw-hidden-attribute' ).first();
	}

	function setSelectValue( $select, value ) {
		if ( ! $select.length ) {
			return;
		}

		if ( value === '' && ! $select.find( 'option[value=""]' ).length ) {
			$select.prepend( '<option value=""></option>' );
		}

		$select.find( 'option' ).prop( 'selected', false );
		$select.find( 'option' ).filter( function() {
			return String( this.value ) === value;
		} ).prop( 'selected', true );

		$select.val( value );
	}

	function ensurePreviewModal() {
		var $modal = $( '.visw-preview-modal' );

		if ( $modal.length ) {
			return $modal;
		}

		$modal = $(
			'<div class="visw-preview-modal" aria-hidden="true">' +
				'<button type="button" class="visw-preview-close" aria-label="Close">×</button>' +
				'<div class="visw-preview-frame">' +
					'<img class="visw-preview-image" src="" alt="" />' +
				'</div>' +
			'</div>'
		);

		$( 'body' ).append( $modal );
		return $modal;
	}

	function openPreviewModal( $button ) {
		var imageUrl = $button.attr( 'data-main_image' ) || $button.find( 'img' ).attr( 'src' ) || '';

		if ( ! imageUrl ) {
			return;
		}

		var label = $button.attr( 'title' ) || $button.find( 'img' ).attr( 'alt' ) || '';
		var $modal = ensurePreviewModal();

		$modal.find( '.visw-preview-image' ).attr( {
			src: imageUrl,
			alt: label
		} );
		$modal.addClass( 'is-open' ).attr( 'aria-hidden', 'false' );
		$( 'body' ).addClass( 'visw-preview-open' );
	}

	function closePreviewModal() {
		$( '.visw-preview-modal' ).removeClass( 'is-open' ).attr( 'aria-hidden', 'true' );
		$( 'body' ).removeClass( 'visw-preview-open' );
	}

	function updateAddToCartButton( $form, variationId, addToCartUrl ) {
		var $button = $form.find( '.single_add_to_cart_button' ).first();

		if ( ! $button.length ) {
			return;
		}

		if ( ! $button.attr( 'data-visw-original-href' ) ) {
			$button.attr( 'data-visw-original-href', $button.attr( 'href' ) || '' );
		}

		if ( variationId ) {
			$form.find( 'input[name="variation_id"]' ).val( variationId ).trigger( 'change' );
			$button.attr( 'data-variation_id', variationId );
			$button.removeClass( 'disabled wc-variation-selection-needed wc-variation-is-unavailable' );
			$button.prop( 'disabled', false );
		}

		if ( addToCartUrl ) {
			$button.attr( 'href', addToCartUrl );
			$button.attr( 'data-visw-add-to-cart-url', addToCartUrl );
		}
	}

	function updateStockMessage( $form, availabilityHtml ) {
		var $messages = $form.find( '.visw-stock-message' );

		if ( ! $messages.length ) {
			return;
		}

		if ( availabilityHtml ) {
			$messages.html( availabilityHtml ).show();
		} else {
			$messages.empty().hide();
		}
	}

	function rememberOriginalBrowserUrl( $form ) {
		if ( $form.attr( 'data-visw-original-url' ) !== undefined ) {
			return;
		}

		$form.attr( 'data-visw-original-url', window.location.href );
	}

	function updateBrowserUrl( $form, variationUrl ) {
		if ( ! settingEnabled( 'updateUrl' ) ) {
			return;
		}

		if ( ! variationUrl || ! window.history || ! window.history.pushState ) {
			return;
		}

		rememberOriginalBrowserUrl( $form );
		window.history.pushState( { viswVariation: true }, document.title, variationUrl );
	}

	function restoreBrowserUrl( $form ) {
		if ( ! settingEnabled( 'updateUrl' ) ) {
			return;
		}

		var originalUrl = $form.attr( 'data-visw-original-url' );

		if ( ! originalUrl || ! window.history || ! window.history.pushState ) {
			return;
		}

		window.history.pushState( { viswVariation: false }, document.title, originalUrl );
	}

	function resetAddToCartButton( $form ) {
		var $button = $form.find( '.single_add_to_cart_button' ).first();

		$form.find( 'input[name="variation_id"]' ).val( '' ).trigger( 'change' );

		if ( ! $button.length ) {
			return;
		}

		if ( $button.attr( 'data-visw-original-href' ) !== undefined ) {
			$button.attr( 'href', $button.attr( 'data-visw-original-href' ) );
		}

		$button
			.removeAttr( 'data-variation_id data-visw-add-to-cart-url' )
			.addClass( 'disabled wc-variation-selection-needed' )
			.prop( 'disabled', false );
	}

	function getProductScope( $form ) {
		var $scope = $form.closest( '.product' );

		if ( $scope.length ) {
			return $scope;
		}

		return $( document );
	}

	function getProductGallery( $form ) {
		return getProductScope( $form ).find( '.woocommerce-product-gallery' ).first();
	}

	function focusMainGallerySlide( $form ) {
		var $gallery = getProductGallery( $form );
		var $scope = getProductScope( $form );
		var flexslider = $gallery.data( 'flexslider' );

		if ( flexslider && typeof flexslider.flexAnimate === 'function' ) {
			flexslider.flexAnimate( 0, true );
		}

		if ( typeof $gallery.flexslider === 'function' ) {
			try {
				$gallery.flexslider( 0 );
			} catch ( error ) {
				// Some themes expose FlexSlider differently; the manual fallback below still updates the visible image.
			}
		}

		$scope.find( '.flexslider, .woocommerce-product-gallery, .woocommerce-product-gallery__wrapper' ).each( function() {
			var slider = $( this ).data( 'flexslider' );
			if ( slider && typeof slider.flexAnimate === 'function' ) {
				slider.flexAnimate( 0, true );
			}
		} );

		$gallery.trigger( 'woocommerce_gallery_reset_slide_position' );
		$gallery.find( '.woocommerce-product-gallery__image' ).removeClass( 'flex-active-slide' ).first().addClass( 'flex-active-slide' );
		$gallery.find( '.woocommerce-product-gallery__wrapper, .slides' ).css( {
			transform: 'translate3d(0px, 0px, 0px)',
			'transition-duration': '0s'
		} );
	}

	function getVisibleGalleryImage( $form ) {
		var gallery = getProductGallery( $form ).get( 0 );

		if ( ! gallery || ! document.elementFromPoint ) {
			return $();
		}

		var rect = gallery.getBoundingClientRect();
		var points = [
			[ rect.left + rect.width / 2, rect.top + rect.height / 2 ],
			[ rect.left + rect.width / 2, rect.top + Math.min( rect.height - 10, 40 ) ],
			[ rect.left + Math.min( rect.width - 10, 40 ), rect.top + rect.height / 2 ]
		];

		for ( var i = 0; i < points.length; i++ ) {
			var element = document.elementFromPoint( points[ i ][ 0 ], points[ i ][ 1 ] );
			var $element = $( element );
			var $image = $element.filter( 'img' );

			if ( ! $image.length ) {
				$image = $element.closest( '.woocommerce-product-gallery__image' ).find( 'img' ).first();
			}

			if ( $image.length && $image.closest( '.woocommerce-product-gallery' ).get( 0 ) === gallery ) {
				return $image;
			}
		}

		return $();
	}

	function getMainGalleryImages( $form ) {
		var $scope = getProductScope( $form );
		var $gallery = getProductGallery( $form );
		var $images = $();

		$images = $images.add( $gallery.find( '.woocommerce-product-gallery__wrapper > .woocommerce-product-gallery__image:first img' ) );
		$images = $images.add( $gallery.find( '.flex-viewport .woocommerce-product-gallery__image.flex-active-slide img' ) );
		$images = $images.add( $gallery.find( '.flex-viewport .woocommerce-product-gallery__image[aria-hidden="false"] img' ) );
		$images = $images.add( $gallery.find( '.flex-viewport .swiper-slide-active img, .flex-viewport .slick-current img' ) );
		$images = $images.add( $gallery.find( '.woocommerce-product-gallery__wrapper > .woocommerce-product-gallery__image img.wp-post-image' ) );
		$images = $images.add( $scope.find( 'img.wp-post-image' ).first() );
		$images = $images.add( getVisibleGalleryImage( $form ) );

		return $images.length ? $images.filter( function() {
			return ! $( this ).closest( '.flex-control-nav, .woocommerce-product-gallery__thumbnails, .gallery-thumbnails, .thumbs, .thumbnails' ).length;
		} ) : $();
	}

	function getVariationById( $form, variationId ) {
		var variations = $form.data( 'product_variations' ) || [];
		var numericId = parseInt( variationId, 10 );

		if ( ! numericId ) {
			return null;
		}

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

		return null;
	}

	function rememberOriginalImage( $image ) {
		if ( $image.attr( 'data-visw-original-src' ) !== undefined ) {
			return;
		}

		$image.attr( {
			'data-visw-original-src': $image.attr( 'src' ) || '',
			'data-visw-original-srcset': $image.attr( 'srcset' ) || '',
			'data-visw-original-sizes': $image.attr( 'sizes' ) || '',
			'data-visw-original-alt': $image.attr( 'alt' ) || '',
			'data-visw-original-title': $image.attr( 'title' ) || ''
		} );

		var $link = $image.closest( 'a' );
		if ( $link.length && $link.attr( 'data-visw-original-href' ) === undefined ) {
			$link.attr( 'data-visw-original-href', $link.attr( 'href' ) || '' );
		}
	}

	function setOptionalImageAttr( $image, attrName, value ) {
		if ( value ) {
			$image.attr( attrName, value );
		} else {
			$image.removeAttr( attrName );
		}
	}

	function updateMainProductImage( $form, imageUrl, imageSrcset, imageSizes, imageAlt, imageTitle ) {
		if ( ! settingEnabled( 'changeMainImage' ) ) {
			return;
		}

		if ( ! imageUrl ) {
			return;
		}

		focusMainGallerySlide( $form );

		var variation = getVariationById( $form, $form.find( 'input[name="variation_id"]' ).val() );
		if ( variation && typeof $form.wc_variations_image_update === 'function' ) {
			$form.wc_variations_image_update( variation );
		}

		getMainGalleryImages( $form ).each( function() {
			var $image = $( this );
			var $link = $image.closest( 'a' );

			rememberOriginalImage( $image );

			$image.attr( 'src', imageUrl );
			$image.attr( 'data-src', imageUrl );
			$image.attr( 'data-large_image', imageUrl );
			setOptionalImageAttr( $image, 'srcset', imageSrcset );
			setOptionalImageAttr( $image, 'sizes', imageSizes );

			if ( imageAlt ) {
				$image.attr( 'alt', imageAlt );
			}

			if ( imageTitle ) {
				$image.attr( 'title', imageTitle );
			}

			if ( $link.length ) {
				$link.attr( 'href', imageUrl );
			}
		} );

		setTimeout( function() {
			focusMainGallerySlide( $form );
			getMainGalleryImages( $form ).each( function() {
				var $image = $( this );
				var $link = $image.closest( 'a' );
				$image.attr( 'src', imageUrl );
				$image.attr( 'data-src', imageUrl );
				$image.attr( 'data-large_image', imageUrl );
				setOptionalImageAttr( $image, 'srcset', imageSrcset );
				setOptionalImageAttr( $image, 'sizes', imageSizes );
				if ( $link.length ) {
					$link.attr( 'href', imageUrl );
				}
			} );
		}, 80 );
	}

	function restoreMainProductImage( $form ) {
		if ( ! settingEnabled( 'changeMainImage' ) ) {
			return;
		}

		focusMainGallerySlide( $form );

		getMainGalleryImages( $form ).each( function() {
			var $image = $( this );
			var originalSrc = $image.attr( 'data-visw-original-src' );

			if ( originalSrc === undefined ) {
				return;
			}

			$image.attr( 'src', originalSrc );
			$image.attr( 'data-src', originalSrc );
			$image.attr( 'data-large_image', originalSrc );
			setOptionalImageAttr( $image, 'srcset', $image.attr( 'data-visw-original-srcset' ) || '' );
			setOptionalImageAttr( $image, 'sizes', $image.attr( 'data-visw-original-sizes' ) || '' );
			$image.attr( 'alt', $image.attr( 'data-visw-original-alt' ) || '' );
			$image.attr( 'title', $image.attr( 'data-visw-original-title' ) || '' );

			var $link = $image.closest( 'a' );
			if ( $link.length && $link.attr( 'data-visw-original-href' ) !== undefined ) {
				$link.attr( 'href', $link.attr( 'data-visw-original-href' ) );
			}
		} );
	}

	function syncField( $field ) {
		var $select = findSelect( $field );
		var value = $select.val() || '';
		var $hidden = findHidden( $field );

		if ( $hidden.length ) {
			$hidden.val( value );
		}

		$field.find( '.visw-option' ).each( function() {
			var $button = $( this );
			var buttonValue = String( $button.attr( 'data-value' ) );
			var $option = $select.find( 'option' ).filter( function() {
				return String( this.value ) === buttonValue;
			} );
			var disabled = ! $option.length || $option.prop( 'disabled' );
			var selected = value && buttonValue === String( value );

			$button
				.toggleClass( 'is-selected', selected )
				.toggleClass( 'is-disabled', disabled )
				.prop( 'disabled', disabled )
				.attr( 'aria-disabled', disabled ? 'true' : 'false' )
				.attr( 'aria-checked', selected ? 'true' : 'false' );
		} );
	}

	function syncSelectedSwatches( $form ) {
		$form.find( '.visw-field' ).each( function() {
			var $field = $( this );
			var $selected = $field.find( '.visw-option.is-selected' ).first();

			if ( ! $selected.length ) {
				return;
			}

			var value = String( $selected.attr( 'data-value' ) );
			var $select = findSelect( $field );
			var $hidden = findHidden( $field );
			var variationId = $selected.attr( 'data-variation_id' ) || '';
			var addToCartUrl = $selected.attr( 'data-add_to_cart_url' ) || '';
			var variationUrl = $selected.attr( 'data-variation_url' ) || '';
			var availabilityHtml = $selected.attr( 'data-availability_html' ) || '';
			var mainImage = $selected.attr( 'data-main_image' ) || '';
			var mainSrcset = $selected.attr( 'data-main_srcset' ) || '';
			var mainSizes = $selected.attr( 'data-main_sizes' ) || '';
			var mainAlt = $selected.attr( 'data-main_alt' ) || '';
			var mainTitle = $selected.attr( 'data-main_title' ) || '';

			setSelectValue( $select, value );

			if ( $hidden.length ) {
				$hidden.val( value );
			}

			updateAddToCartButton( $form, variationId, addToCartUrl );
			updateStockMessage( $form, availabilityHtml );
			updateMainProductImage( $form, mainImage, mainSrcset, mainSizes, mainAlt, mainTitle );
			$field.attr( 'data-current_variation_url', variationUrl );
		} );
	}

	function getChosenAttributes( $form ) {
		var chosen = {};

		$form.find( '.visw-native-select select, select[name^="attribute_"]' ).each( function() {
			var $select = $( this );
			var name = $select.data( 'attribute_name' ) || $select.attr( 'name' );

			if ( name ) {
				chosen[ name ] = $select.val() || '';
			}
		} );

		$form.find( '.visw-hidden-attribute' ).each( function() {
			var $input = $( this );
			var name = $input.data( 'attribute_name' );

			if ( name && $input.val() ) {
				chosen[ name ] = $input.val();
			}
		} );

		return chosen;
	}

	function hasCompleteChoice( chosen ) {
		var hasChoice = false;

		for ( var name in chosen ) {
			if ( ! Object.prototype.hasOwnProperty.call( chosen, name ) ) {
				continue;
			}

			if ( ! chosen[ name ] ) {
				return false;
			}

			hasChoice = true;
		}

		return hasChoice;
	}

	function matchVariation( variation, chosen ) {
		var attributes = variation.attributes || {};

		for ( var name in attributes ) {
			if ( ! Object.prototype.hasOwnProperty.call( attributes, name ) ) {
				continue;
			}

			if ( attributes[ name ] && String( attributes[ name ] ) !== String( chosen[ name ] || '' ) ) {
				return false;
			}
		}

		return true;
	}

	function setVariationId( $form ) {
		var $variationId = $form.find( 'input[name="variation_id"]' );

		if ( ! $variationId.length ) {
			return;
		}

		var variations = $form.data( 'product_variations' ) || [];
		var chosen = getChosenAttributes( $form );

		if ( ! hasCompleteChoice( chosen ) ) {
			resetAddToCartButton( $form );
			return;
		}

		for ( var i = 0; i < variations.length; i++ ) {
			if ( matchVariation( variations[ i ], chosen ) ) {
				$variationId.val( variations[ i ].variation_id ).trigger( 'change' );
				updateAddToCartButton( $form, variations[ i ].variation_id, '' );
				updateStockMessage( $form, variations[ i ].availability_html || '' );
				return;
			}
		}
	}

	function findVariationById( $form, variationId ) {
		var variations = $form.data( 'product_variations' ) || [];
		var numericId = parseInt( variationId, 10 );

		if ( ! numericId ) {
			return null;
		}

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

		return null;
	}

	function applyUrlSelection( $form ) {
		if ( ! settingEnabled( 'readUrlOnLoad' ) || ! window.URLSearchParams ) {
			return;
		}

		var params = new URLSearchParams( window.location.search );
		var variation = findVariationById( $form, params.get( 'variation_id' ) );
		var changed = false;

		$form.find( 'select[name^="attribute_"]' ).each( function() {
			var $select = $( this );
			var attributeName = $select.data( 'attribute_name' ) || $select.attr( 'name' );
			var value = attributeName ? params.get( attributeName ) : '';

			if ( ! value && variation && variation.attributes && variation.attributes[ attributeName ] ) {
				value = variation.attributes[ attributeName ];
			}

			if ( value ) {
				setSelectValue( $select, value );
				changed = true;
			}
		} );

		$form.find( '.visw-field' ).each( function() {
			var $field = $( this );
			var $select = findSelect( $field );
			var $hidden = findHidden( $field );
			var attributeName = $select.data( 'attribute_name' ) || $select.attr( 'name' );
			var value = attributeName ? params.get( attributeName ) : '';

			if ( ! value && variation && variation.attributes && variation.attributes[ attributeName ] ) {
				value = variation.attributes[ attributeName ];
			}

			if ( ! value ) {
				return;
			}

			setSelectValue( $select, value );

			if ( $hidden.length ) {
				$hidden.val( value );
			}

			$field.find( '.visw-option' ).removeClass( 'is-selected' ).attr( 'aria-checked', 'false' );
			$field.find( '.visw-option' ).filter( function() {
				return String( $( this ).attr( 'data-value' ) ) === String( value );
			} ).addClass( 'is-selected' ).attr( 'aria-checked', 'true' );

			changed = true;
		} );

		if ( changed ) {
			$form.find( 'select[name^="attribute_"]' ).trigger( 'change' );
			$form.trigger( 'woocommerce_variation_select_change' );
			syncSelectedSwatches( $form );
			setVariationId( $form );
		}
	}

	function clearField( $field ) {
		var $select = findSelect( $field );
		var $hidden = findHidden( $field );
		var $form = $field.closest( '.variations_form' );

		setSelectValue( $select, '' );

		if ( $hidden.length ) {
			$hidden.val( '' );
		}

		$field.find( '.visw-option' )
			.removeClass( 'is-selected' )
			.attr( 'aria-checked', 'false' );

		resetAddToCartButton( $form );
		updateStockMessage( $form, '' );
		restoreMainProductImage( $form );
		restoreBrowserUrl( $form );
		$select.trigger( 'change' );
		$form.trigger( 'woocommerce_variation_select_change' );
		syncField( $field );
	}

	function syncForm( $form ) {
		$form.find( '.visw-field' ).each( function() {
			syncField( $( this ) );
		} );
	}

	$( document ).on( 'click', '.visw-option', function( event ) {
		event.preventDefault();

		var $button = $( this );
		var wasSelected = $button.hasClass( 'is-selected' );

		if ( $button.hasClass( 'is-disabled' ) ) {
			return;
		}

		var $field = $button.closest( '.visw-field' );
		var $select = findSelect( $field );
		var $hidden = findHidden( $field );
		var value = String( $button.attr( 'data-value' ) );
		var variationId = $button.attr( 'data-variation_id' ) || '';
		var addToCartUrl = $button.attr( 'data-add_to_cart_url' ) || '';
		var variationUrl = $button.attr( 'data-variation_url' ) || '';
		var availabilityHtml = $button.attr( 'data-availability_html' ) || '';
		var mainImage = $button.attr( 'data-main_image' ) || '';
		var mainSrcset = $button.attr( 'data-main_srcset' ) || '';
		var mainSizes = $button.attr( 'data-main_sizes' ) || '';
		var mainAlt = $button.attr( 'data-main_alt' ) || '';
		var mainTitle = $button.attr( 'data-main_title' ) || '';

		if ( ! $select.length ) {
			return;
		}

		if ( wasSelected && $button.hasClass( 'visw-option--image' ) ) {
			updateMainProductImage( $select.closest( '.variations_form' ), mainImage, mainSrcset, mainSizes, mainAlt, mainTitle );
			openPreviewModal( $button );
			return;
		}

		setSelectValue( $select, value );

		if ( $hidden.length ) {
			$hidden.val( value );
		}

		$select.trigger( 'change' );
		$select.closest( '.variations_form' ).trigger( 'woocommerce_variation_select_change' );
		syncField( $field );
		updateAddToCartButton( $select.closest( '.variations_form' ), variationId, addToCartUrl );
		updateStockMessage( $select.closest( '.variations_form' ), availabilityHtml );
		updateMainProductImage( $select.closest( '.variations_form' ), mainImage, mainSrcset, mainSizes, mainAlt, mainTitle );
		updateBrowserUrl( $select.closest( '.variations_form' ), variationUrl );
		setVariationId( $select.closest( '.variations_form' ) );
	} );

	$( document ).on( 'click', '.visw-preview-close, .visw-preview-modal', function( event ) {
		if ( event.target !== this ) {
			return;
		}

		event.preventDefault();
		closePreviewModal();
	} );

	$( document ).on( 'keyup', function( event ) {
		if ( event.key === 'Escape' ) {
			closePreviewModal();
		}
	} );

	$( document ).on( 'click', '.visw-clear-selection', function( event ) {
		event.preventDefault();
		clearField( $( this ).closest( '.visw-field' ) );
	} );

	$( document ).on( 'change', '.variations_form select', function() {
		syncForm( $( this ).closest( '.variations_form' ) );
	} );

	$( document ).on( 'found_variation', '.variations_form', function( event, variation ) {
		updateStockMessage( $( this ), variation && variation.availability_html ? variation.availability_html : '' );
	} );

	$( document ).on( 'hide_variation reset_data', '.variations_form', function() {
		updateStockMessage( $( this ), '' );
	} );

	$( document ).on( 'click', '.single_add_to_cart_button', function() {
		var $form = $( this ).closest( 'form.variations_form' );

		if ( ! $form.length ) {
			return;
		}

		syncSelectedSwatches( $form );
		setVariationId( $form );
	} );

	$( document ).on( 'submit', 'form.variations_form', function() {
		var $form = $( this );

		syncSelectedSwatches( $form );
		setVariationId( $form );
	} );

	$( document ).on(
		'wc_variation_form woocommerce_update_variation_values woocommerce_variation_has_changed reset_data',
		'.variations_form',
		function() {
			syncForm( $( this ) );
		}
	);

	$( function() {
		$( '.variations_form' ).each( function() {
			var $form = $( this );
			if ( typeof window.viswSettings !== 'undefined' ) {
				if ( window.viswSettings.clearLabel ) {
					$form.find( '.visw-clear-selection' ).text( window.viswSettings.clearLabel );
				}
				if ( ! window.viswSettings.showClear ) {
					$form.find( '.visw-actions' ).hide();
				}
			}
			applyUrlSelection( $form );
			syncForm( $form );
			syncSelectedSwatches( $form );
			setVariationId( $form );
		} );
	} );
}( jQuery ) );
// source --> https://mfrash.com/wp-content/plugins/wc-customer-photo-reviews/assets/wcpr.js?ver=2.4.32 
(function () {
	'use strict';

	function qs(selector, root) {
		return (root || document).querySelector(selector);
	}

	function qsa(selector, root) {
		return Array.prototype.slice.call((root || document).querySelectorAll(selector));
	}

	function postForm(formData) {
		return fetch(wcprConfig.ajaxUrl, {
			method: 'POST',
			credentials: 'same-origin',
			body: formData
		}).then(function (response) {
			return response.json();
		});
	}

	function getFormNonce(form) {
		var field = qs('input[name="nonce"]', form);
		return field && field.value ? field.value : wcprConfig.nonce;
	}

	function setMessage(element, message, type) {
		if (!element) {
			return;
		}
		element.textContent = message || '';
		element.classList.remove('is-error', 'is-success');
		if (type) {
			element.classList.add('is-' + type);
		}
	}

	function handlePreview(input) {
		var container = input.closest('.wcpr-form') || input.closest('.wcpr-order-product-review') || input.closest('.wcpr-upload');
		var preview = container ? qs('.wcpr-preview', container) : null;
		if (!preview) {
			return;
		}

		preview.innerHTML = '';
		Array.prototype.slice.call(input.files || []).forEach(function (file) {
			if (!file.type || file.type.indexOf('image/') !== 0) {
				return;
			}

			var img = document.createElement('img');
			img.alt = file.name;
			img.src = URL.createObjectURL(file);
			img.onload = function () {
				URL.revokeObjectURL(img.src);
			};
			preview.appendChild(img);
		});
	}

	function refreshReviews(section, html) {
		var wrap = qs('.wcpr-reviews-wrap', section);
		if (wrap && html) {
			wrap.innerHTML = html;
		}
	}

	function openModal(modal) {
		if (!modal) {
			return;
		}
		modal.hidden = false;
		document.documentElement.classList.add('wcpr-modal-open');
		var firstField = qs('input[name="rating"]', modal) || qs('textarea, input, button', modal);
		if (firstField) {
			setTimeout(function () {
				firstField.focus({ preventScroll: true });
			}, 30);
		}
	}

	function closeModal(modal) {
		if (!modal) {
			return;
		}
		modal.hidden = true;
		document.documentElement.classList.remove('wcpr-modal-open');
	}

	function shouldScrollToReviews() {
		if (window.location.hash === '#wcpr-reviews') {
			return true;
		}

		try {
			return new URLSearchParams(window.location.search).get('wcpr_after_login') === '1';
		} catch (error) {
			return window.location.search.indexOf('wcpr_after_login=1') !== -1;
		}
	}

	function scrollToReviewsAfterLogin() {
		if (!shouldScrollToReviews()) {
			return;
		}

		var section = document.getElementById('wcpr-reviews') || qs('.wcpr[data-product-id]');
		if (!section) {
			return;
		}

		setTimeout(function () {
			section.scrollIntoView({ behavior: 'smooth', block: 'start' });

			if (!window.history || !window.history.replaceState || window.location.search.indexOf('wcpr_after_login=1') === -1) {
				return;
			}

			try {
				var url = new URL(window.location.href);
				url.searchParams.delete('wcpr_after_login');
				url.hash = 'wcpr-reviews';
				window.history.replaceState(null, '', url.pathname + url.search + url.hash);
			} catch (error) {
				// Keep the original URL when older browsers cannot parse it.
			}
		}, 250);
	}

	function refreshReviewFormsForCache() {
		qsa('.wcpr-form-card[data-product-id]').forEach(function (card) {
			var productId = card.getAttribute('data-product-id');
			if (!productId || card.getAttribute('data-wcpr-refreshing') === '1') {
				return;
			}

			var formData = new FormData();
			formData.append('action', 'wcpr_refresh_form');
			formData.append('product_id', productId);
			card.setAttribute('data-wcpr-refreshing', '1');

			postForm(formData).then(function (json) {
				if (!json || !json.success || !json.data || !json.data.html) {
					return;
				}

				if (json.data.nonce) {
					wcprConfig.nonce = json.data.nonce;
				}

				var wrapper = document.createElement('div');
				wrapper.innerHTML = json.data.html;
				var freshCard = qs('.wcpr-form-card', wrapper);
				if (freshCard) {
					card.replaceWith(freshCard);
				}
			}).finally(function () {
				card.removeAttribute('data-wcpr-refreshing');
			});
		});
	}

	function handleSubmit(form) {
		var section = form.closest('.wcpr');
		var message = qs('.wcpr-message', form);
		var button = qs('.wcpr-submit', form);
		var rating = qs('input[name="rating"]:checked', form);

		if (!rating) {
			setMessage(message, wcprConfig.i18n.choose_rating, 'error');
			return;
		}

		var formData = new FormData(form);
		formData.set('nonce', getFormNonce(form));
		button.disabled = true;
		button.textContent = wcprConfig.i18n.sending;
		setMessage(message, '', null);

		postForm(formData).then(function (json) {
			if (json && json.success) {
				var modal = form.closest('.wcpr-modal');
				form.reset();
				var preview = qs('.wcpr-preview', form);
				if (preview) {
					preview.innerHTML = '';
				}
				setMessage(message, json.data.message, 'success');
				refreshReviews(section, json.data.html);
				if (modal) {
					setTimeout(function () {
						closeModal(modal);
						setMessage(message, '', null);
					}, 900);
				}
			} else {
				setMessage(message, json && json.data ? json.data.message : 'حدث خطأ', 'error');
			}
		}).catch(function () {
			setMessage(message, 'حدث خطأ', 'error');
		}).finally(function () {
			button.disabled = false;
			button.textContent = wcprConfig.i18n.submit;
		});
	}

	function handleHelpful(button) {
		if (!button || button.disabled || button.getAttribute('data-wcpr-busy') === '1') {
			return;
		}

		var formData = new FormData();
		var count = qs('.wcpr-helpful-count', button);

		formData.append('action', 'wcpr_helpful');
		formData.append('nonce', wcprConfig.nonce);
		formData.append('comment_id', button.getAttribute('data-comment-id'));
		button.setAttribute('data-wcpr-busy', '1');
		button.disabled = true;

		postForm(formData).then(function (json) {
			if (json && json.success && count) {
				count.textContent = json.data.count;
				button.classList.add('is-voted');
				button.setAttribute('aria-label', json.data.message || button.textContent);
				button.setAttribute('title', json.data.message || button.textContent);
			} else if (json && json.data && json.data.message) {
				button.classList.add('is-voted');
				button.setAttribute('aria-label', json.data.message);
				button.setAttribute('title', json.data.message);
			}
		}).finally(function () {
			button.disabled = false;
			button.removeAttribute('data-wcpr-busy');
		});
	}

	function handleHelpfulTap(event) {
		var helpful = event.target.closest('.wcpr-helpful');
		if (!helpful) {
			return false;
		}

		event.preventDefault();

		if (event.type === 'click' && helpful.getAttribute('data-wcpr-touch-handled') === '1') {
			return true;
		}

		if (event.type === 'touchend') {
			helpful.setAttribute('data-wcpr-touch-handled', '1');
			window.setTimeout(function () {
				helpful.removeAttribute('data-wcpr-touch-handled');
			}, 700);
		}

		handleHelpful(helpful);
		return true;
	}

	function handleLoadMore(button) {
		var section = button.closest('.wcpr');
		var list = qs('.wcpr-list', section);
		var formData = new FormData();
		var isAllReviews = button.getAttribute('data-scope') === 'all';

		formData.append('action', isAllReviews ? 'wcpr_load_all_reviews' : 'wcpr_load_reviews');
		formData.append('nonce', wcprConfig.nonce);
		formData.append('page', button.getAttribute('data-next-page'));
		if (isAllReviews) {
			formData.append('per_page', button.getAttribute('data-per-page') || '20');
			formData.append('limit', button.getAttribute('data-limit') || '0');
			formData.append('rating', button.getAttribute('data-rating') || '0');
			formData.append('photos', button.getAttribute('data-photos') || '0');
			formData.append('comments', button.getAttribute('data-comments') || '0');
			formData.append('review_order', button.getAttribute('data-review-order') || 'latest');
		} else {
			formData.append('product_id', section.getAttribute('data-product-id'));
			formData.append('rating', button.getAttribute('data-rating') || '0');
			formData.append('photos', button.getAttribute('data-photos') || '0');
			formData.append('comments', button.getAttribute('data-comments') || '0');
			formData.append('review_order', button.getAttribute('data-review-order') || 'rating_high');
		}
		button.disabled = true;
		button.textContent = wcprConfig.i18n.loading;

		postForm(formData).then(function (json) {
			if (!json || !json.success || !list) {
				return;
			}

			var holder = document.createElement('div');
			holder.innerHTML = json.data.html;
			var nextList = qs('.wcpr-list', holder);
			if (nextList) {
				qsa('.wcpr-review', nextList).forEach(function (review) {
					list.appendChild(review);
				});
			}

			var nextButton = qs('.wcpr-load-more', holder);
			if (nextButton) {
				button.setAttribute('data-next-page', nextButton.getAttribute('data-next-page'));
				if (nextButton.getAttribute('data-per-page')) {
					button.setAttribute('data-per-page', nextButton.getAttribute('data-per-page'));
				}
				if (nextButton.getAttribute('data-limit')) {
					button.setAttribute('data-limit', nextButton.getAttribute('data-limit'));
				}
				button.setAttribute('data-rating', nextButton.getAttribute('data-rating') || '0');
				button.setAttribute('data-photos', nextButton.getAttribute('data-photos') || '0');
				button.setAttribute('data-comments', nextButton.getAttribute('data-comments') || '0');
				button.setAttribute('data-review-order', nextButton.getAttribute('data-review-order') || (isAllReviews ? 'latest' : 'rating_high'));
				button.disabled = false;
				button.textContent = nextButton.textContent;
			} else {
				button.remove();
			}
		}).catch(function () {
			button.disabled = false;
		});
	}

	function handleAllReviewsFilter(form) {
		var section = form.closest('.wcpr-all-reviews');
		var wrap = qs('.wcpr-reviews-wrap', section);
		var formData = new FormData();
		var button = qs('.wcpr-load-more', wrap);

		formData.append('action', 'wcpr_load_all_reviews');
		formData.append('nonce', wcprConfig.nonce);
		formData.append('page', '1');
		formData.append('per_page', button ? button.getAttribute('data-per-page') || '20' : form.getAttribute('data-per-page') || '20');
		formData.append('limit', button ? button.getAttribute('data-limit') || '0' : form.getAttribute('data-limit') || '0');
		formData.append('rating', qs('[name="rating"]', form).value || '0');
		formData.append('photos', qs('[name="photos"]', form).value || '0');
		formData.append('comments', qs('[name="comments"]', form) ? qs('[name="comments"]', form).value || '0' : '0');
		formData.append('review_order', qs('[name="order"]', form).value || 'latest');

		form.setAttribute('data-loading', '1');
		postForm(formData).then(function (json) {
			if (json && json.success && wrap) {
				wrap.innerHTML = json.data.html;
			}
		}).finally(function () {
			form.removeAttribute('data-loading');
		});
	}

	function handleProductReviewsFilter(form) {
		var section = form.closest('.wcpr');
		var wrap = qs('.wcpr-reviews-wrap', section);
		var formData = new FormData();

		if (!section || !wrap) {
			return;
		}

		formData.append('action', 'wcpr_load_reviews');
		formData.append('nonce', wcprConfig.nonce);
		formData.append('page', '1');
		formData.append('product_id', section.getAttribute('data-product-id'));
		formData.append('rating', qs('[name="rating"]', form).value || '0');
		var orderValue = qs('[name="order"]', form).value || 'rating_high';
		var photosField = qs('[name="photos"]', form);
		var commentsField = qs('[name="comments"]', form);
		formData.append('photos', orderValue === 'photos' ? '1' : (photosField ? photosField.value || '0' : '0'));
		formData.append('comments', orderValue === 'comments' ? '1' : (commentsField ? commentsField.value || '0' : '0'));
		formData.append('review_order', orderValue);

		form.setAttribute('data-loading', '1');
		postForm(formData).then(function (json) {
			if (json && json.success) {
				wrap.innerHTML = json.data.html;
			}
		}).finally(function () {
			form.removeAttribute('data-loading');
		});
	}

	function handlePhotoSliderNav(button) {
		var slider = button.closest('.wcpr-photo-slider');
		var track = slider ? qs('.wcpr-photo-slider-track', slider) : null;
		if (!track) {
			return;
		}

		var amount = Math.max(180, Math.round(track.clientWidth * 0.75));
		var direction = button.getAttribute('data-direction') === 'prev' ? -1 : 1;
		track.scrollBy({ left: amount * direction, behavior: 'smooth' });
	}

	function ensureLightbox() {
		var box = qs('.wcpr-lightbox');
		if (box) {
			return box;
		}

		box = document.createElement('div');
		box.className = 'wcpr-lightbox';
		box.hidden = true;
		box.innerHTML = '<button type="button" aria-label="إغلاق">×</button><img alt="">';
		document.body.appendChild(box);
		box.addEventListener('click', function (event) {
			if (event.target === box || event.target.tagName === 'BUTTON') {
				box.hidden = true;
			}
		});
		document.addEventListener('keydown', function (event) {
			if (event.key === 'Escape') {
				box.hidden = true;
				qsa('.wcpr-modal:not([hidden])').forEach(closeModal);
			}
		});
		return box;
	}

	function initReviewSliders() {
		var reduceMotion = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches;
		if (reduceMotion) {
			return;
		}

		qsa('.wcpr-slider-track').forEach(function (track) {
			if (track.getAttribute('data-wcpr-ready') === '1') {
				return;
			}

			var originalCount = parseInt(track.getAttribute('data-wcpr-count'), 10) || 0;
			var cards = qsa('.wcpr-slider-card', track);
			var viewport = track.closest('.wcpr-slider-viewport');
			var index = 0;
			var timer = null;
			var step = 0;

			if (!viewport || originalCount < 2 || cards.length < 2) {
				return;
			}

			track.setAttribute('data-wcpr-ready', '1');

			function getInterval() {
				var isMobile = window.matchMedia && window.matchMedia('(max-width: 720px)').matches;
				var totalSeconds = parseInt(track.getAttribute(isMobile ? 'data-wcpr-mobile-speed' : 'data-wcpr-speed'), 10) || (isMobile ? 70 : 42);
				return Math.max(isMobile ? 4200 : 3200, Math.round((totalSeconds * 1000) / originalCount));
			}

			function measureStep() {
				var first = cards[0];
				var styles = window.getComputedStyle(track);
				var gap = parseFloat(styles.columnGap || styles.gap || '0') || 0;
				step = first.getBoundingClientRect().width + gap;
			}

			function applyPosition(animate) {
				track.style.transition = animate ? 'transform 0.62s ease' : 'none';
				track.style.transform = 'translateX(' + (index * step) + 'px)';
			}

			function moveNext() {
				measureStep();
				index += 1;
				applyPosition(true);

				if (index >= originalCount) {
					window.setTimeout(function () {
						index = 0;
						applyPosition(false);
					}, 680);
				}
			}

			function stop() {
				if (timer) {
					window.clearInterval(timer);
					timer = null;
				}
			}

			function start() {
				stop();
				timer = window.setInterval(moveNext, getInterval());
			}

			measureStep();
			applyPosition(false);
			start();

			viewport.addEventListener('mouseenter', stop);
			viewport.addEventListener('mouseleave', start);
			viewport.addEventListener('focusin', stop);
			viewport.addEventListener('focusout', start);
			window.addEventListener('resize', function () {
				measureStep();
				applyPosition(false);
				start();
			});
			document.addEventListener('visibilitychange', function () {
				if (document.hidden) {
					stop();
				} else {
					start();
				}
			});
		});
	}

	function initOrderReviewForm() {
		var ratingLabels = {
			1: 'ضعيف',
			2: 'مقبول',
			3: 'جيد',
			4: 'جيد جدًا',
			5: 'ممتاز'
		};

		qsa('.wcpr-order-comment textarea').forEach(function (textarea) {
			var counter = qs('.wcpr-order-count', textarea.closest('.wcpr-order-comment'));
			var max = parseInt(textarea.getAttribute('maxlength'), 10) || 500;

			function updateCounter() {
				if (counter) {
					counter.textContent = textarea.value.length + '/' + max;
				}
			}

			textarea.addEventListener('input', updateCounter);
			updateCounter();
		});

		qsa('.wcpr-order-rating-row input[type="radio"]').forEach(function (input) {
			input.addEventListener('change', function () {
				var row = input.closest('.wcpr-order-rating-row');
				var text = qs('.wcpr-order-rating-text', row);
				if (text) {
					text.textContent = ratingLabels[input.value] || '';
				}
			});
		});
	}

	function copyCouponCode(button) {
		var text = button.getAttribute('data-wcpr-copy') || '';
		var copiedLabel = button.getAttribute('data-copied') || 'تم النسخ';
		var originalLabel = button.getAttribute('data-label') || button.textContent;

		function markCopied() {
			button.textContent = copiedLabel;
			button.classList.add('is-copied');
			window.setTimeout(function () {
				button.textContent = originalLabel;
				button.classList.remove('is-copied');
			}, 1800);
		}

		if (navigator.clipboard && navigator.clipboard.writeText) {
			navigator.clipboard.writeText(text).then(markCopied).catch(function () {
				copyCouponCodeFallback(text, markCopied);
			});
			return;
		}

		copyCouponCodeFallback(text, markCopied);
	}

	function copyCouponCodeFallback(text, done) {
		var textarea = document.createElement('textarea');
		textarea.value = text;
		textarea.setAttribute('readonly', 'readonly');
		textarea.style.position = 'fixed';
		textarea.style.top = '-1000px';
		document.body.appendChild(textarea);
		textarea.select();

		try {
			document.execCommand('copy');
			done();
		} catch (error) {
			// Keep the code visible if browser copy permissions are blocked.
		}

		document.body.removeChild(textarea);
	}

	function applyAutomatedDiscountDisplay() {
		var discount = wcprConfig && wcprConfig.automatedDiscount ? wcprConfig.automatedDiscount : null;
		if (!discount || !discount.priceHtml) {
			return;
		}

		var applyCount = 0;
		var customPriceWrap = document.getElementById('mfrash-price-wrap');
		var isCurrentDiscount = isAutomatedDiscountCurrentSelection(discount);
		var selectors = [
			'.summary .price',
			'.entry-summary .price',
			'.product .summary p.price',
			'.single-product .price',
			'.woocommerce-variation-price .price',
			'[class*="price"]',
			'[class*="Price"]'
		];
		var nodes = [];

		selectors.forEach(function (selector) {
			qsa(selector).forEach(function (node) {
				if (nodes.indexOf(node) === -1) {
					nodes.push(node);
				}
			});
		});

		if (!customPriceWrap) {
			nodes.forEach(function (node) {
				if (node.closest('.wcpr') || node.closest('del') || node.closest('.woocommerce-mini-cart')) {
					return;
				}
				if (node.innerHTML !== discount.priceHtml) {
					node.innerHTML = discount.priceHtml;
				}
				node.setAttribute('data-mfrash-gad-applied', '1');
				applyCount += 1;
			});
		}

		if (!customPriceWrap && !applyCount) {
			qsa('.summary, .entry-summary, form.cart, .product').some(function (scope) {
				var amounts = qsa('.amount, bdi', scope);
				if (!amounts.length) {
					return false;
				}

				if (amounts[0].textContent !== (discount.priceText || '')) {
					amounts[0].textContent = discount.priceText || '';
				}
				amounts[0].setAttribute('data-mfrash-gad-applied', '1');
				return true;
			});
		}

		applyAutomatedDiscountNotice(discount);

		if (document.body.getAttribute('data-mfrash-gad-listener') !== '1') {
			document.body.setAttribute('data-mfrash-gad-listener', '1');
			document.body.addEventListener('found_variation', function (event) {
				if (!event.detail || !event.detail.variation_id || parseInt(event.detail.variation_id, 10) !== parseInt(discount.productId, 10)) {
					return;
				}

				window.setTimeout(applyAutomatedDiscountDisplay, 20);
				window.setTimeout(applyAutomatedDiscountDisplay, 250);
				window.setTimeout(function () {
					applyAutomatedDiscountInlineNote(document.getElementById('mfrash-price-wrap'), isAutomatedDiscountCurrentSelection(discount));
				}, 450);
			});
		}

		if (!document.body.getAttribute('data-mfrash-gad-observer')) {
			document.body.setAttribute('data-mfrash-gad-observer', '1');
			var target = customPriceWrap ? (qs('form.variations_form') || qs('.summary') || qs('.entry-summary')) : (qs('.summary') || qs('.entry-summary') || qs('form.cart'));
			if (target && window.MutationObserver) {
				var observer = new MutationObserver(function () {
					window.clearTimeout(target._mfrashGadTimer);
					target._mfrashGadTimer = window.setTimeout(applyAutomatedDiscountDisplay, 80);
				});
				observer.observe(target, { childList: true, subtree: true, characterData: true });
			}
		}

		if (window.jQuery && document.body.getAttribute('data-mfrash-gad-jquery') !== '1') {
			document.body.setAttribute('data-mfrash-gad-jquery', '1');
			window.jQuery(document.body).on('found_variation show_variation reset_data hide_variation', function () {
				var refreshInlineNote = function () {
					applyAutomatedDiscountInlineNote(document.getElementById('mfrash-price-wrap'), isAutomatedDiscountCurrentSelection(discount));
				};

				refreshInlineNote();
				window.setTimeout(refreshInlineNote, 60);
				window.setTimeout(refreshInlineNote, 220);
			});
		}
	}

	function applyAutomatedDiscountNotice(discount) {
		var customPriceWrap = document.getElementById('mfrash-price-wrap');
		if (customPriceWrap) {
			applyAutomatedDiscountInlineNote(customPriceWrap, isAutomatedDiscountCurrentSelection(discount));
		}
	}

	function isAutomatedDiscountCurrentSelection(discount) {
		if (!discount || !discount.parentId || !discount.productId) {
			return true;
		}

		var visiblePrice = qs('#mfrash-price-wrap #mfrash-final-price');
		var visibleAmount = visiblePrice ? parseLocalizedNumber(visiblePrice.getAttribute('data-price') || visiblePrice.textContent) : 0;
		if (visibleAmount > 0 && Math.abs(visibleAmount - parseFloat(discount.price || 0)) < 0.02) {
			return true;
		}

		var variationInput = qs('form.variations_form input.variation_id');
		var variationId = variationInput && variationInput.value ? parseInt(variationInput.value, 10) : 0;
		return variationId > 0 && variationId === parseInt(discount.productId, 10);
	}

	function parseLocalizedNumber(value) {
		value = String(value || '').replace(/[^\d.,]/g, '');
		if (!value) {
			return 0;
		}

		if (value.indexOf(',') !== -1 && value.indexOf('.') !== -1) {
			value = value.replace(/,/g, '');
		} else if (value.indexOf(',') !== -1) {
			value = value.replace(',', '.');
		}

		var number = parseFloat(value);
		return Number.isFinite(number) ? number : 0;
	}

	function applyAutomatedDiscountInlineNote(priceWrap, isActive) {
		if (!priceWrap) {
			return;
		}

		var existing = qs('.mfrash-gad-inline-note-wrap', priceWrap);
		var text = getAutomatedDiscountBadgeText();
		if (existing) {
			existing.remove();
		}

		if (!isActive || !text) {
			priceWrap.classList.remove('mfrash-gad-active-wrap');
			priceWrap.style.removeProperty('--mfrash-gad-badge-text');
			return;
		}

		priceWrap.style.setProperty('--mfrash-gad-badge-text', JSON.stringify(text));
		priceWrap.classList.add('mfrash-gad-active-wrap');
	}

	function getAutomatedDiscountBadgeText() {
		if (wcprConfig && typeof wcprConfig.automatedDiscountBadgeText === 'string') {
			return wcprConfig.automatedDiscountBadgeText.trim();
		}

		var discountText = wcprConfig && wcprConfig.automatedDiscount && typeof wcprConfig.automatedDiscount.badgeText === 'string' ? wcprConfig.automatedDiscount.badgeText.trim() : '';
		var fallbackText = wcprConfig && wcprConfig.i18n && typeof wcprConfig.i18n.discount_badge === 'string' ? wcprConfig.i18n.discount_badge.trim() : '';
		return discountText || fallbackText || 'عرض خاص لفترة محدودة';
	}

	document.addEventListener('keydown', function (event) {
		if (event.key === 'Escape') {
			qsa('.wcpr-modal:not([hidden])').forEach(closeModal);
		}
	});

	if (document.readyState === 'loading') {
		document.addEventListener('DOMContentLoaded', function () {
			scrollToReviewsAfterLogin();
			refreshReviewFormsForCache();
			applyAutomatedDiscountDisplay();
			initReviewSliders();
			initOrderReviewForm();
		});
	} else {
		scrollToReviewsAfterLogin();
		refreshReviewFormsForCache();
		applyAutomatedDiscountDisplay();
		initReviewSliders();
		initOrderReviewForm();
	}

	document.addEventListener('change', function (event) {
		if (event.target.matches('.wcpr-upload input[type="file"]')) {
			handlePreview(event.target);
		}

		if (event.target.closest('[data-wcpr-all-filters]')) {
			handleAllReviewsFilter(event.target.closest('[data-wcpr-all-filters]'));
		}

		if (event.target.closest('[data-wcpr-product-filters]')) {
			handleProductReviewsFilter(event.target.closest('[data-wcpr-product-filters]'));
		}
	});

	document.addEventListener('submit', function (event) {
		if (event.target.matches('.wcpr-form')) {
			event.preventDefault();
			handleSubmit(event.target);
		}

		if (event.target.matches('[data-wcpr-product-filters], [data-wcpr-all-filters]')) {
			event.preventDefault();
		}
	});

	document.addEventListener('click', function (event) {
		var loadMore = event.target.closest('.wcpr-load-more');
		var imageButton = event.target.closest('.wcpr-image-button');
		var openButton = event.target.closest('.wcpr-open-modal');
		var closeButton = event.target.closest('[data-wcpr-close]');
		var copyButton = event.target.closest('.wcpr-copy-coupon');
		var photoNav = event.target.closest('.wcpr-photo-nav');

		if (handleHelpfulTap(event)) {
			return;
		}

		if (loadMore) {
			handleLoadMore(loadMore);
		}

		if (photoNav) {
			handlePhotoSliderNav(photoNav);
		}

		if (imageButton) {
			var box = ensureLightbox();
			var img = qs('img', box);
			img.src = imageButton.getAttribute('data-full');
			box.hidden = false;
		}

		if (openButton) {
			openModal(qs('.wcpr-modal', openButton.closest('.wcpr-form-card')));
		}

		if (closeButton) {
			closeModal(closeButton.closest('.wcpr-modal'));
		}

		if (copyButton) {
			event.preventDefault();
			copyCouponCode(copyButton);
		}
	});

	document.addEventListener('touchend', function (event) {
		handleHelpfulTap(event);
	}, { passive: false });
}());
// source --> https://mfrash.com/wp-content/plugins/wc-otp-msegat/assets/popup.js?ver=1.1.29 
/* WC OTP Msegat - Popup JS */
(function ($) {
    'use strict';

    var phone     = '';
    var countdown = null;

    /* -------------------------------------------------------
       Open / Close
    ------------------------------------------------------- */
    function openPopup() {
        $('#wc-otp-overlay').fadeIn(200);
        $('body').addClass('wc-otp-open');
        setTimeout(function () { $('#wc-otp-phone-input').focus(); }, 250);
    }

    function closePopup() {
        $('#wc-otp-overlay').fadeOut(200);
        $('body').removeClass('wc-otp-open');
    }

    // Expose globally
    window.wcOtpPopupOpen = openPopup;

    // Auto-open if PHP flagged it before JS loaded
    if (window._wcOtpAutoOpen) {
        $(function () { openPopup(); });
    }

    $(document).ready(function () {

        /* ---- Close handlers — always go back to previous page ---- */
        $('#wc-otp-overlay').on('click', function (e) {
            if ($(e.target).is('#wc-otp-overlay')) { window.history.back(); }
        });
        $('#wc-otp-close-btn').on('click', function () {
            window.history.back();
        });
        $(document).on('keydown', function (e) {
            if (e.key === 'Escape') { window.history.back(); }
        });

        /* ---- Login triggers on page ---- */
        $(document).on('click', '.woocommerce-form-login__submit, .login-trigger, [data-otp-trigger]', function (e) {
            e.preventDefault();
            openPopup();
        });

        /* ---- Back ---- */
        $('#wc-otp-back-btn').on('click', function () { showStep('phone'); });

        /* ====================================================
           STEP 1 — Phone
        ==================================================== */
        $('#wc-otp-phone-input').on('keypress', function (e) {
            if (e.which === 13) { e.preventDefault(); $('#wc-otp-send-btn').trigger('click'); }
        });

        // Only allow digits
        $('#wc-otp-phone-input').on('input', function () {
            var v = $(this).val().replace(/\D/g, '');
            $(this).val(v);
        });

        $('#wc-otp-send-btn').on('click', function () {
            var raw = $('#wc-otp-phone-input').val().replace(/\D/g, '');
            if (!raw || raw.length < 9) {
                setMsg('phone', 'يرجى إدخال رقم جوال صحيح (9 أرقام على الأقل).', 'error');
                return;
            }

            $(this).prop('disabled', true).text(wcOtpPopup.sendingText);
            setMsg('phone', '', '');

            $.ajax({
                url:  wcOtpPopup.ajaxUrl,
                type: 'POST',
                data: { action: 'wc_otp_send_login', nonce: wcOtpPopup.nonce, phone: raw },
                success: function (res) {
                    if (res.success) {
                        phone = res.data.phone;
                        $('#wc-otp-sent-to').text('تم إرسال رمز التحقق إلى: +' + phone);
                        showStep('verify');
                        resetDigits();
                        startCountdown(res.data.cooldown || 30);
                        $('.wc-otp-digit').first().focus();
                    } else {
                        setMsg('phone', res.data.message, 'error');
                    }
                    $('#wc-otp-send-btn').prop('disabled', false).text(wcOtpPopup.sendText);
                },
                error: function () {
                    setMsg('phone', 'حدث خطأ، يرجى المحاولة مرة أخرى.', 'error');
                    $('#wc-otp-send-btn').prop('disabled', false).text(wcOtpPopup.sendText);
                }
            });
        });

        /* ====================================================
           STEP 2 — OTP digit inputs
           Supports: typing, backspace, paste, SMS auto-fill
        ==================================================== */

        // Mobile SMS auto-fill: when browser fills the first box with the full code
        $(document).on('input', '.wc-otp-digit', function () {
            var $this = $(this);
            var val   = $this.val().replace(/\D/g, '');

            // Handle auto-fill: if more than 1 digit pasted into one box
            if (val.length > 1) {
                distributeDigits(val);
                return;
            }

            $this.val(val.slice(0, 1));
            if (val) $this.next('.wc-otp-digit').focus();
            updateCombined();
        });

        $(document).on('keydown', '.wc-otp-digit', function (e) {
            if (e.key === 'Backspace' && !$(this).val()) {
                $(this).prev('.wc-otp-digit').focus();
            }
            // Allow: numbers, backspace, tab, arrows
            if (!/^\d$/.test(e.key) && !['Backspace','Tab','ArrowLeft','ArrowRight','Delete'].includes(e.key)) {
                e.preventDefault();
            }
        });

        // Paste support — works from any digit box
        $(document).on('paste', '.wc-otp-digit', function (e) {
            e.preventDefault();
            var pasted = (e.originalEvent.clipboardData || window.clipboardData).getData('text').replace(/\D/g, '');
            if (pasted) distributeDigits(pasted);
        });

        function distributeDigits(digits) {
            var $digits = $('.wc-otp-digit');
            $digits.each(function (i) { $(this).val(digits[i] || ''); });
            // Focus last filled or last box
            var lastIdx = Math.min(digits.length, 4) - 1;
            $digits.eq(lastIdx < 0 ? 0 : lastIdx).focus();
            updateCombined();
        }

        function updateCombined() {
            var code = '';
            $('.wc-otp-digit').each(function () { code += $(this).val(); });
            $('#wc-otp-combined').val(code);
            $('#wc-otp-verify-btn').prop('disabled', code.length < 4);
            // Auto-submit when all 4 filled
            if (code.length === 4) {
                setTimeout(function () { $('#wc-otp-verify-btn').trigger('click'); }, 300);
            }
        }

        function resetDigits() {
            $('.wc-otp-digit').val('');
            $('#wc-otp-combined').val('');
            $('#wc-otp-verify-btn').prop('disabled', true);
        }

        /* ====================================================
           STEP 2 — Verify
        ==================================================== */
        $('#wc-otp-verify-btn').on('click', function () {
            var code = $('#wc-otp-combined').val();
            if (code.length < 4) return;

            $(this).prop('disabled', true).text(wcOtpPopup.verifyingText);
            setMsg('verify', '', '');

            var isAccount = wcOtpPopup.isAccountArea === 'yes' || window.location.href.indexOf('my-account') !== -1 || window.location.href.indexOf('my-account-2') !== -1;

            $.ajax({
                url:  wcOtpPopup.ajaxUrl,
                type: 'POST',
                data: {
                    action:     'wc_otp_verify_login',
                    nonce:      wcOtpPopup.nonce,
                    phone:      phone,
                    otp_code:   code,
                    is_account: isAccount ? 1 : 0,
                    redirect_url: wcOtpPopup.redirectUrl || window.location.href
                },
                success: function (res) {
                    if (res.success) {
                        clearInterval(countdown);
                        showStep('success');
                        setTimeout(function () {
                            window.location.href = res.data.redirect_url || wcOtpPopup.redirectUrl || window.location.href;
                        }, 1200);
                    } else {
                        setMsg('verify', res.data.message, 'error');
                        resetDigits();
                        $('.wc-otp-digit').first().focus();
                        $('#wc-otp-verify-btn').prop('disabled', false).text(wcOtpPopup.verifyText);
                    }
                },
                error: function () {
                    setMsg('verify', 'حدث خطأ، يرجى المحاولة مرة أخرى.', 'error');
                    $('#wc-otp-verify-btn').prop('disabled', false).text(wcOtpPopup.verifyText);
                }
            });
        });

        /* ---- Resend ---- */
        $('#wc-otp-resend-btn').on('click', function () {
            $(this).hide();
            setMsg('verify', '', '');
            resetDigits();

            var raw = phone; // already normalized
            $.ajax({
                url:  wcOtpPopup.ajaxUrl,
                type: 'POST',
                data: { action: 'wc_otp_send_login', nonce: wcOtpPopup.nonce, phone: raw },
                success: function (res) {
                    if (res.success) {
                        setMsg('verify', res.data.message, 'success');
                        startCountdown(res.data.cooldown || 30);
                    } else {
                        setMsg('verify', res.data.message, 'error');
                        $('#wc-otp-resend-btn').show();
                    }
                },
                error: function () {
                    setMsg('verify', 'حدث خطأ.', 'error');
                    $('#wc-otp-resend-btn').show();
                }
            });
        });

        /* ====================================================
           Helpers
        ==================================================== */
        function showStep(step) {
            $('.wc-otp-step').hide().removeClass('active');
            $('#wc-otp-step-' + step).show().addClass('active');
        }

        function setMsg(area, msg, type) {
            var $el = area === 'phone' ? $('#wc-otp-phone-msg') : $('#wc-otp-verify-msg');
            $el.removeClass('success error').text(msg);
            if (type) $el.addClass(type);
        }

        function startCountdown(seconds) {
            clearInterval(countdown);
            var remaining = seconds;
            $('#wc-otp-resend-btn').hide();
            $('#wc-otp-countdown-text').text('إعادة الإرسال بعد ' + remaining + wcOtpPopup.seconds);
            countdown = setInterval(function () {
                remaining--;
                if (remaining <= 0) {
                    clearInterval(countdown);
                    $('#wc-otp-countdown-text').text('');
                    $('#wc-otp-resend-btn').show();
                } else {
                    $('#wc-otp-countdown-text').text('إعادة الإرسال بعد ' + remaining + wcOtpPopup.seconds);
                }
            }, 1000);
        }

        function isBlockedPage() {
            var href = window.location.href;
            var blocked = wcOtpPopup.blockGuest === 'yes';
            return blocked && (href.indexOf('checkout') !== -1 || href.indexOf('my-account') !== -1);
        }

    });

})(jQuery);
// source --> https://mfrash.com/wp-content/plugins/wpc-badge-management/assets/js/frontend.js?ver=3.1.7 
(function ($) {
    'use strict';

    $('.woocommerce-product-gallery').on('wc-product-gallery-after-init', function () {
        if ($('.wpcbm-wrapper-single-image .wpcbm-badges').length && !$('.woocommerce-product-gallery .wpcbm-wrapper-single-image').length) {
            $('.wpcbm-wrapper-single-image').appendTo('.woocommerce-product-gallery');
            $('.woocommerce-product-gallery > *:not(.wpcbm-wrapper-single-image)').appendTo('.wpcbm-wrapper-single-image');
        }
    });
})(jQuery);
// source --> https://mfrash.com/wp-content/themes/porto/inc/lib/live-search/live-search.min.js?ver=7.9.0 
!function(e){"use strict";"function"==typeof define&&define.amd?define(["jquery"],e):e("object"==typeof exports&&"function"==typeof require?require("jquery"):jQuery)}((function(e){"use strict";function t(n,o){var s=this;s.element=n,s.el=e(n),s.suggestions=[],s.badQueries=[],s.selectedIndex=-1,s.currentValue=s.element.value,s.timeoutId=null,s.cachedResponse={},s.onChangeTimeout=null,s.onChange=null,s.isLocal=!1,s.suggestionsContainer=null,s.noSuggestionsContainer=null,s.options=e.extend(!0,{},t.defaults,o),s.classes={selected:"autocomplete-selected",suggestion:"autocomplete-suggestion"},s.hint=null,s.hintValue="",s.selection=null,s.initialize(),s.setOptions(o)}var n={escapeRegExChars:function(e){return e.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&")},createNode:function(e){var t=document.createElement("div");return t.className=e,t.style.position="absolute",t.style.display="none",t}},o=27,s=9,i=13,a=38,r=39,l=40,u=e.noop;t.utils=n,e.Autocomplete=t,t.defaults={ajaxSettings:{},autoSelectFirst:!1,appendTo:"body",serviceUrl:null,lookup:null,onSelect:null,width:"auto",minChars:1,maxHeight:300,deferRequestBy:0,params:{},formatResult:function(e,t){if(!t)return e.value;var o="("+n.escapeRegExChars(t)+")";return e.value.replace(new RegExp(o,"gi"),"<strong>$1</strong>").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/&lt;(\/?strong)&gt;/g,"<$1>")},formatGroup:function(e,t){return'<div class="autocomplete-group">'+t+"</div>"},delimiter:null,zIndex:9999,type:"GET",noCache:!1,onSearchStart:u,onSearchComplete:u,onSearchError:u,preserveInput:!1,containerClass:"autocomplete-suggestions",tabDisabled:!1,dataType:"text",currentRequest:null,triggerSelectOnValidInput:!0,preventBadQueries:!0,lookupFilter:function(e,t,n){return-1!==e.value.toLowerCase().indexOf(n)},paramName:"query",transformResult:function(e){return"string"==typeof e?JSON.parse(e):e},showNoSuggestionNotice:!1,noSuggestionNotice:"No results",orientation:"bottom",forceFixPosition:!1},t.prototype={initialize:function(){var n,o=this,s="."+o.classes.suggestion,i=o.classes.selected,a=o.options;o.element.setAttribute("autocomplete","off"),o.noSuggestionsContainer=e('<div class="autocomplete-no-suggestion"></div>').html(this.options.noSuggestionNotice).get(0),o.suggestionsContainer=t.utils.createNode(a.containerClass),(n=e(o.suggestionsContainer)).appendTo(a.appendTo||"body"),"auto"!==a.width&&n.css("width",a.width),n.on("mouseover.autocomplete",s,(function(){o.activate(e(this).data("index"))})),n.on("mouseout.autocomplete",(function(){o.selectedIndex=-1,n.children("."+i).removeClass(i)})),n.on("click.autocomplete",s,(function(){o.select(e(this).data("index"))})),n.on("click.autocomplete",(function(){clearTimeout(o.blurTimeoutId)})),o.fixPositionCapture=function(){o.visible&&o.fixPosition()},e(window).on("resize.autocomplete",o.fixPositionCapture),o.el.on("keydown.autocomplete",(function(e){o.onKeyPress(e)})),o.el.on("keyup.autocomplete",(function(e){o.onKeyUp(e)})),o.el.on("blur.autocomplete",(function(){o.onBlur()})),o.el.on("focus.autocomplete",(function(){o.onFocus()})),o.el.on("change.autocomplete",(function(e){o.onKeyUp(e)})),o.el.on("input.autocomplete",(function(e){o.onKeyUp(e)}))},onFocus:function(){var e=this;e.fixPosition(),e.el.val().length>=e.options.minChars&&e.onValueChange()},onBlur:function(){var e=this;e.blurTimeoutId=setTimeout((function(){e.hide()}),200)},abortAjax:function(){var e=this;e.currentRequest&&(e.currentRequest.abort(),e.currentRequest=null)},setOptions:function(t){var n=this,o=e.extend({},n.options,t);n.isLocal=Array.isArray(o.lookup),n.isLocal&&(o.lookup=n.verifySuggestionsFormat(o.lookup)),o.orientation=n.validateOrientation(o.orientation,"bottom"),e(n.suggestionsContainer).css({"max-height":o.maxHeight+"px",width:o.width+"px","z-index":o.zIndex}),this.options=o},clearCache:function(){this.cachedResponse={},this.badQueries=[]},clear:function(){this.clearCache(),this.currentValue="",this.suggestions=[]},disable:function(){var e=this;e.disabled=!0,clearTimeout(e.onChangeTimeout),e.abortAjax()},enable:function(){this.disabled=!1},fixPosition:function(){var t=this,n=e(t.suggestionsContainer),o=n.parent().get(0);if(o===document.body||t.options.forceFixPosition){var s=t.options.orientation,i=n.outerHeight(),a=t.el.outerHeight(),r=t.el.offset(),l={top:r.top,left:r.left};if("auto"===s){var u=e(window).height(),c=e(window).scrollTop(),g=-c+r.top-i,p=c+u-(r.top+a+i);s=Math.max(g,p)===g?"top":"bottom"}if(l.top+="top"===s?-i:a,o!==document.body){var d,h=n.css("opacity");t.visible||n.css("opacity",0).show(),d=n.offsetParent().offset(),l.top-=d.top,l.top+=o.scrollTop,l.left-=d.left,t.visible||n.css("opacity",h).hide()}"auto"===t.options.width&&(l.width=t.el.outerWidth()+"px"),n.css(l)}},isCursorAtEnd:function(){var e,t=this.el.val().length,n=this.element.selectionStart;return"number"==typeof n?n===t:!document.selection||((e=document.selection.createRange()).moveStart("character",-t),t===e.text.length)},onKeyPress:function(e){var t=this;if(t.disabled||t.visible||e.which!==l||!t.currentValue){if(!t.disabled&&t.visible){switch(e.which){case o:t.el.val(t.currentValue),t.hide();break;case r:if(t.hint&&t.options.onHint&&t.isCursorAtEnd()){t.selectHint();break}return;case s:if(t.hint&&t.options.onHint)return void t.selectHint();if(-1===t.selectedIndex)return void t.hide();if(t.select(t.selectedIndex),!1===t.options.tabDisabled)return;break;case i:if(-1===t.selectedIndex)return void t.hide();t.select(t.selectedIndex);break;case a:t.moveUp();break;case l:t.moveDown();break;default:return}e.stopImmediatePropagation(),e.preventDefault()}}else t.suggest()},onKeyUp:function(e){var t=this;if(!t.disabled){switch(e.which){case a:case l:return}clearTimeout(t.onChangeTimeout),t.currentValue!==t.el.val()&&(t.findBestHint(),t.options.deferRequestBy>0?t.onChangeTimeout=setTimeout((function(){t.onValueChange()}),t.options.deferRequestBy):t.onValueChange())}},onValueChange:function(){if(!this.ignoreValueChange){var t=this,n=t.options,o=t.el.val(),s=t.getQuery(o);return t.selection&&t.currentValue!==s&&(t.selection=null,(n.onInvalidateSelection||e.noop).call(t.element)),clearTimeout(t.onChangeTimeout),t.currentValue=o,t.selectedIndex=-1,n.triggerSelectOnValidInput&&t.isExactMatch(s)?void t.select(0):void(s.length<n.minChars?t.hide():t.getSuggestions(s))}this.ignoreValueChange=!1},isExactMatch:function(e){var t=this.suggestions;return 1===t.length&&t[0].value.toLowerCase()===e.toLowerCase()},getQuery:function(e){var t,n=this.options.delimiter;return n?(t=e.split(n))[t.length-1].trim():e},getSuggestionsLocal:function(t){var n,o=this.options,s=t.toLowerCase(),i=o.lookupFilter,a=parseInt(o.lookupLimit,10);return n={suggestions:e.grep(o.lookup,(function(e){return i(e,t,s)}))},a&&n.suggestions.length>a&&(n.suggestions=n.suggestions.slice(0,a)),n},getSuggestions:function(t){var n,o,s,i,a=this,r=a.options,l=r.serviceUrl;if(r.params[r.paramName]=t,!1!==r.onSearchStart.call(a.element,r.params)){if(o=r.ignoreParams?null:r.params,"function"==typeof r.lookup)return void r.lookup(t,(function(e){a.suggestions=e.suggestions,a.suggest(),r.onSearchComplete.call(a.element,t,e.suggestions)}));a.isLocal?n=a.getSuggestionsLocal(t):("function"==typeof l&&(l=l.call(a.element,t)),s=l+"?"+e.param(o||{}),n=a.cachedResponse[s]),n&&Array.isArray(n.suggestions)?(a.suggestions=n.suggestions,a.suggest(),r.onSearchComplete.call(a.element,t,n.suggestions)):a.isBadQuery(t)?r.onSearchComplete.call(a.element,t,[]):(a.abortAjax(),i={url:l,data:o,type:r.type,dataType:r.dataType},e.extend(i,r.ajaxSettings),a.currentRequest=e.ajax(i).done((function(e){var n;a.currentRequest=null,n=r.transformResult(e,t),a.processResponse(n,t,s),r.onSearchComplete.call(a.element,t,n.suggestions)})).fail((function(e,n,o){r.onSearchError.call(a.element,t,e,n,o)})))}},isBadQuery:function(e){if(!this.options.preventBadQueries)return!1;for(var t=this.badQueries,n=t.length;n--;)if(0===e.indexOf(t[n]))return!0;return!1},hide:function(){var t=this,n=e(t.suggestionsContainer);"function"==typeof t.options.onHide&&t.visible&&t.options.onHide.call(t.element,n),t.visible=!1,t.selectedIndex=-1,clearTimeout(t.onChangeTimeout),e(t.suggestionsContainer).hide(),t.signalHint(null)},suggest:function(){if(this.suggestions.length){var t,n=this,o=n.options,s=o.groupBy,i=o.formatResult,a=n.getQuery(n.currentValue),r=n.classes.suggestion,l=n.classes.selected,u=e(n.suggestionsContainer),c=e(n.noSuggestionsContainer),g=o.beforeRender,p="",d=function(e,n){var i=e.data[s];return t===i?"":(t=i,o.formatGroup(e,t))};return o.triggerSelectOnValidInput&&n.isExactMatch(a)?void n.select(0):(e.each(n.suggestions,(function(e,t){s&&(p+=d(t,0)),p+='<div class="'+r+'" data-index="'+e+'">'+i(t,a,e)+"</div>"})),this.adjustContainerWidth(),c.detach(),u.html(p),"function"==typeof g&&g.call(n.element,u,n.suggestions),n.fixPosition(),u.show(),o.autoSelectFirst&&(n.selectedIndex=0,u.scrollTop(0),u.children("."+r).first().addClass(l)),n.visible=!0,void n.findBestHint())}this.options.showNoSuggestionNotice?this.noSuggestions():this.hide()},noSuggestions:function(){var t=this,n=t.options.beforeRender,o=e(t.suggestionsContainer),s=e(t.noSuggestionsContainer);this.adjustContainerWidth(),s.detach(),o.empty(),o.append(s),"function"==typeof n&&n.call(t.element,o,t.suggestions),t.fixPosition(),o.show(),t.visible=!0},adjustContainerWidth:function(){var t,n=this,o=n.options,s=e(n.suggestionsContainer);"auto"===o.width?(t=n.el.outerWidth(),s.css("width",t>0?t:300)):"flex"===o.width&&s.css("width","")},findBestHint:function(){var t=this,n=t.el.val().toLowerCase(),o=null;n&&(e.each(t.suggestions,(function(e,t){var s=0===t.value.toLowerCase().indexOf(n);return s&&(o=t),!s})),t.signalHint(o))},signalHint:function(t){var n="",o=this;t&&(n=o.currentValue+t.value.substr(o.currentValue.length)),o.hintValue!==n&&(o.hintValue=n,o.hint=t,(this.options.onHint||e.noop)(n))},verifySuggestionsFormat:function(t){return t.length&&"string"==typeof t[0]?e.map(t,(function(e){return{value:e,data:null}})):t},validateOrientation:function(t,n){return t=(t||"").trim().toLowerCase(),-1===e.inArray(t,["auto","bottom","top"])&&(t=n),t},processResponse:function(e,t,n){var o=this,s=o.options;e.suggestions=o.verifySuggestionsFormat(e.suggestions),s.noCache||(o.cachedResponse[n]=e,s.preventBadQueries&&!e.suggestions.length&&o.badQueries.push(t)),t===o.getQuery(o.currentValue)&&(o.suggestions=e.suggestions,o.suggest())},activate:function(t){var n,o=this,s=o.classes.selected,i=e(o.suggestionsContainer),a=i.find("."+o.classes.suggestion);return i.find("."+s).removeClass(s),o.selectedIndex=t,-1!==o.selectedIndex&&a.length>o.selectedIndex?(n=a.get(o.selectedIndex),e(n).addClass(s),n):null},selectHint:function(){var t=this,n=e.inArray(t.hint,t.suggestions);t.select(n)},select:function(e){this.hide(),this.onSelect(e)},moveUp:function(){var t=this;if(-1!==t.selectedIndex)return 0===t.selectedIndex?(e(t.suggestionsContainer).children("."+t.classes.suggestion).first().removeClass(t.classes.selected),t.selectedIndex=-1,t.ignoreValueChange=!1,t.el.val(t.currentValue),void t.findBestHint()):void t.adjustScroll(t.selectedIndex-1)},moveDown:function(){var e=this;e.selectedIndex!==e.suggestions.length-1&&e.adjustScroll(e.selectedIndex+1)},adjustScroll:function(t){var n=this,o=n.activate(t);if(o){var s,i,a,r=e(o).outerHeight();s=o.offsetTop,a=(i=e(n.suggestionsContainer).scrollTop())+n.options.maxHeight-r,s<i?e(n.suggestionsContainer).scrollTop(s):s>a&&e(n.suggestionsContainer).scrollTop(s-n.options.maxHeight+r),n.options.preserveInput||(n.ignoreValueChange=!0,n.el.val(n.getValue(n.suggestions[t].value))),n.signalHint(null)}},onSelect:function(e){var t=this,n=t.options.onSelect,o=t.suggestions[e];t.currentValue=t.getValue(o.value),t.currentValue===t.el.val()||t.options.preserveInput||t.el.val(t.currentValue),t.signalHint(null),t.suggestions=[],t.selection=o,"function"==typeof n&&n.call(t.element,o)},getValue:function(e){var t,n,o=this.options.delimiter;return o?1===(n=(t=this.currentValue).split(o)).length?e:t.substr(0,t.length-n[n.length-1].length)+e:e},dispose:function(){var t=this;t.el.off(".autocomplete").removeData("autocomplete"),e(window).off("resize.autocomplete",t.fixPositionCapture),e(t.suggestionsContainer).remove()}},e.fn.devbridgeAutocomplete=function(n,o){var s="autocomplete";return arguments.length?this.each((function(){var i=e(this),a=i.data(s);"string"==typeof n?a&&"function"==typeof a[n]&&a[n](o):(a&&a.dispose&&a.dispose(),a=new t(this,n),i.data(s,a))})):this.first().data(s)},e.fn.autocomplete||(e.fn.autocomplete=e.fn.devbridgeAutocomplete)})),jQuery(document).ready((function(e){"use strict";e(".searchform").each((function(){var t=e(this),n=t.find(".live-search-list"),o=t.find("#cat, #product_cat, #portfolio_cat"),s="undefined"!=typeof theme&&theme.ajax_url?theme.ajax_url:"undefined"!=typeof js_porto_vars&&js_porto_vars.ajax_url?js_porto_vars.ajax_url:ajaxurl,i=s+(-1===s.indexOf("?")?"?":"&")+"action=porto_ajax_search_posts&nonce="+porto_live_search.nonce,a="",r="";t.find('input[name="post_type"]').length&&t.find('input[name="post_type"]').val()&&(r="&post_type="+t.find('input[name="post_type"]').val(),i+=r),o.length&&(o.val()&&"0"!=o.val()&&(i+="&cat="+o.val()),o.on("change",(function(e){"object"==typeof a?(o.val()&&"0"!=o.val()?a.setOptions({serviceUrl:s+(-1===s.indexOf("?")?"?":"&")+"action=porto_ajax_search_posts&nonce="+porto_live_search.nonce+"&cat="+o.val()+r}):a.setOptions({serviceUrl:s+(-1===s.indexOf("?")?"?":"&")+"action=porto_ajax_search_posts&nonce="+porto_live_search.nonce+r}),a.hide(),a.onValueChange()):i=s+(-1===s.indexOf("?")?"?":"&")+"action=porto_ajax_search_posts&nonce="+porto_live_search.nonce+"&cat="+o.val()+r}))),t.find('input[type="text"]').on("focus keyup",(function(){var o=e(this);o.hasClass("porto-search-init")||o.closest("#side-nav-panel").length>0||(o.devbridgeAutocomplete({minChars:3,appendTo:n,triggerSelectOnValidInput:!1,serviceUrl:i,deferRequestBy:300,onSearchStart:function(){t.find("button").addClass("loading porto-ajax-loading").find(".porto-loading-icon").length||t.find("button").append('<span class="porto-loading-icon"></span>')},onSelect:function(e){-1!=e.id&&"undefined"!=typeof theme&&(window.location.href=e.url)},onHide:function(){n.removeClass("porto-opened")},onSearchComplete:function(){t.find("button").removeClass("loading").removeClass("porto-ajax-loading").find(".porto-loading-icon")},beforeRender:function(t){e(t).removeAttr("style")},formatResult:function(t,o){var s="("+e.Autocomplete.utils.escapeRegExChars(o)+")",i="";return t.img&&"undefined"!=typeof theme&&(i+='<img class="search-image" src="'+t.img+'">'),(t.sku||t.tag)&&(i+='<div class="search-info-wrap">'),i+='<div class="search-name">'+t.value.replace(new RegExp(s,"gi"),"<strong>$1</strong>")+"</div>",t.sku&&(i+='<div class="search-sku"><span>'+porto_live_search.sku+"</span>"+t.sku.replace(new RegExp(s,"gi"),"<strong>$1</strong>")+"</div>"),t.tag&&(i+='<div class="search-tag"><span>'+porto_live_search.product_tags+"</span>"+t.tag.replace(new RegExp(s,"gi"),"<strong>$1</strong>")+"</div>"),(t.sku||t.tag)&&(i+="</div>"),t.price&&"undefined"!=typeof theme&&(i+='<span class="search-price">'+t.price+"<span>"),n.addClass("porto-opened"),i}}),a=o.devbridgeAutocomplete(),o.addClass("porto-search-init"))}))}))}));