(function ($) {
'use strict';
var ION_BAG_SVG = '';
var ionShopMediaCatalog = null;
var ionShopMediaCatalogPromise = null;
function getCardProductId($card) {
var direct = parseInt($card.attr('data-ion-shop-product-id') || 0, 10);
if (direct > 0) return direct;
var buttonId = parseInt($card.find('[data-product_id]').first().attr('data-product_id') || 0, 10);
if (buttonId > 0) return buttonId;
var idMatch = String($card.attr('id') || '').match(/(?:product-)?(\d+)/);
if (idMatch) return parseInt(idMatch[1], 10) || 0;
var classMatch = String($card.attr('class') || '').match(/(?:^|\s)post-(\d+)(?:\s|$)/);
return classMatch ? (parseInt(classMatch[1], 10) || 0) : 0;
}
function getMediaCatalogUrl() {
if (window.IonShopRedesign && IonShopRedesign.mediaCatalogUrl) {
return String(IonShopRedesign.mediaCatalogUrl);
}
return window.location.origin.replace(/\/+$/, '') + '/wp-content/uploads/ion-shop-media/catalog.json';
}
function applyLiveProductImages($scope) {
if (!ionShopMediaCatalog || !ionShopMediaCatalog.products) return;
var $cards = $scope && $scope.is && $scope.is('li.product, .ion-shop-card') ? $scope : $();
if ($scope && $scope.find) {
$cards = $cards.add($scope.find('li.product, .ion-shop-card'));
}
$cards.each(function () {
var $card = $(this);
var productId = getCardProductId($card);
if (!productId) return;
$card.attr('data-ion-shop-product-id', productId);
var record = ionShopMediaCatalog.products[String(productId)];
if (!record || !record.url) return;
var $box = $card.find('.ion-shop-card-image').first();
if (!$box.length) return;
var $img = $box.find('img.ion-shop-product-image, img').first();
if (!$img.length) {
$img = $('');
$box.prepend($img);
}
$img.off('error.ionShopRedesign')
.removeAttr('srcset sizes data-srcset data-lazy-srcset data-original data-lazy-src data-ll-status style')
.attr({
src: String(record.url),
alt: String(record.alt || $card.find('h2, h3').first().text() || 'Product image'),
loading: 'lazy',
decoding: 'async'
})
.show();
if (parseInt(record.width || 0, 10) > 0) {
$img.attr('width', parseInt(record.width, 10));
}
if (parseInt(record.height || 0, 10) > 0) {
$img.attr('height', parseInt(record.height, 10));
}
$box.find('.ion-shop-image-fallback').remove();
});
}
function loadLiveMediaCatalog($root) {
if (ionShopMediaCatalogPromise || !window.fetch) return ionShopMediaCatalogPromise;
var url = getMediaCatalogUrl();
if (!url) return null;
var separator = url.indexOf('?') === -1 ? '?' : '&';
var oneMinuteBucket = Math.floor(Date.now() / 60000);
ionShopMediaCatalogPromise = window.fetch(url + separator + 'ion_shop_media=' + oneMinuteBucket, {
cache: 'no-store',
credentials: 'same-origin'
})
.then(function (response) {
if (!response.ok) throw new Error('Shop media catalog unavailable');
return response.json();
})
.then(function (catalog) {
if (!catalog || typeof catalog !== 'object' || !catalog.products) return null;
ionShopMediaCatalog = catalog;
applyLiveProductImages($root || $('#ion-shop-redesign'));
fixBrokenProductImages($root || $('#ion-shop-redesign'));
return catalog;
})
.catch(function () {
return null;
});
return ionShopMediaCatalogPromise;
}
function openIonLiveChat() {
if (window.Tawk_API && typeof window.Tawk_API.maximize === 'function') {
window.Tawk_API.maximize();
return;
}
if (window.Tawk_API && typeof window.Tawk_API.toggle === 'function') {
window.Tawk_API.toggle();
return;
}
if (window.Tidio && typeof window.Tidio.open === 'function') {
window.Tidio.open();
return;
}
if (window.LiveChatWidget && typeof window.LiveChatWidget.call === 'function') {
window.LiveChatWidget.call('maximize');
return;
}
window.location.href = '/contact/';
}
function fixBrokenProductImages($scope) {
$scope.find('.ion-shop-product-image').each(function () {
var img = this;
var $img = $(img);
var markBroken = function () {
var $box = $img.closest('.ion-shop-card-image');
if (!$box.find('.ion-shop-image-fallback').length) {
$box.append('