Pave Setting Asscher Rose Gold Engagement Rings

which // comes after this script tag. Poll until $ exists // before running any jQuery-dependent code. // ============================================= function initCategoryPage() { // Read More / Read Less $(document).on('click', '.read-more-toggle', function(e) { e.preventDefault(); e.stopPropagation(); var $btn = $(this); var $container = $btn.closest('.read-more-container'); var $content = $container.find('.read-more-content'); if ($container.hasClass('expanded')) { $container.removeClass('expanded'); $content.css('max-height', '80px'); $btn.text('Read More'); } else { $container.addClass('expanded'); $content.css('max-height', $content[0].scrollHeight + 'px'); $btn.text('Read Less'); } }); // Category slider arrows var slider = document.getElementById('categoryStyleSlider'); var leftArrow = document.querySelector('.left-arrow'); var rightArrow = document.querySelector('.right-arrow'); if (slider && leftArrow) { leftArrow.addEventListener('click', function () { slider.scrollBy({ left: -150, behavior: 'smooth' }); }); } if (slider && rightArrow) { rightArrow.addEventListener('click', function () { slider.scrollBy({ left: 150, behavior: 'smooth' }); }); } // Initialize Bootstrap collapse functionality (for FAQs) $(document).on('click', '[data-toggle="collapse"]', function(e) { e.preventDefault(); var target = $(this).data('target'); var $target = $(target); $target.collapse('toggle'); var $button = $(this); var $icon = $button.find('.fa'); if ($target.hasClass('show')) { $button.removeClass('collapsed'); $icon.removeClass('fa-plus').addClass('fa-minus'); } else { $button.addClass('collapsed'); $icon.removeClass('fa-minus').addClass('fa-plus'); } }); $(document).on('show.bs.collapse', '.collapse', function() { var $button = $('[data-target="#' + $(this).attr('id') + '"]'); $button.find('.fa').removeClass('fa-plus').addClass('fa-minus'); $button.removeClass('collapsed'); }); $(document).on('hide.bs.collapse', '.collapse', function() { var $button = $('[data-target="#' + $(this).attr('id') + '"]'); $button.find('.fa').removeClass('fa-minus').addClass('fa-plus'); $button.addClass('collapsed'); }); // Initialize filter UI state on page load updateFilterUI(); // Infinite Scroll var currentPage = 1; var isLoading = false; var hasMoreProducts = true; var loadMoreThreshold = 200; var scrollTimeout; var infiniteScrollEnabled = true; function loadMoreProducts() { if (isLoading || !hasMoreProducts || !infiniteScrollEnabled) return; isLoading = true; $('#infinite-scroll-loader').show(); $('.product-wrapper-grid').addClass('loading'); var url = 'index.php?route=product/category|loadMoreProducts'; var urlParams = new URLSearchParams(window.location.search); urlParams.set('category_id', $('#category_id').val()); urlParams.set('filter_param', $('#filter_param').val()); urlParams.set('filter', $('#filter').val()); urlParams.set('sort', $('#sort').val()); urlParams.set('order', $('#order').val()); urlParams.set('page', currentPage + 1); url += '&' + urlParams.toString(); $.ajax({ url: url, type: 'GET', dataType: 'json', success: function(response) { if (response.products && response.products.length > 0) { var $productGrid = $('.product-wrapper-grid-row'); response.products.forEach(function(product) { $productGrid.append(generateProductHtml(product)); }); currentPage++; hasMoreProducts = response.has_more; if (!hasMoreProducts) { $('#end-of-products').show(); } } else { hasMoreProducts = false; $('#end-of-products').show(); } }, error: function() { $('#fallback-pagination').show(); }, complete: function() { isLoading = false; $('#infinite-scroll-loader').hide(); $('.product-wrapper-grid').removeClass('loading'); } }); } if ('IntersectionObserver' in window) { var loadTrigger = document.getElementById('load-more-trigger'); if (loadTrigger) { var observer = new IntersectionObserver(function(entries) { if (entries[0].isIntersecting) { loadMoreProducts(); } }, { root: null, rootMargin: '200px', threshold: 0 }); observer.observe(loadTrigger); } } function generateProductHtml(product) { var style_view = $('#style-view-toggle').find('.active').data('style-view'); var grid_size = 'col-xl-4'; if (style_view == 2) { grid_size = 'col-xl-6'; } else if (style_view == 3) { grid_size = 'col-xl-4'; } else if (style_view == 4) { grid_size = 'col-xl-3'; } var imageAlt = product.name ? product.name + ' | Sunshine Diamonds' : 'Diamond Jewellery | Sunshine Diamonds'; imageAlt = imageAlt.replace(/"/g, '"'); var html = '
'; html += '
'; html += '
'; html += ''; html += '
From
'; html += '

' + product.sale_price + '

'; html += '
    '; html += '
  • '; html += '
  • '; html += '
  • '; html += '
  • '; html += '
'; return html; } // Check if more than one page var totalProducts = parseInt($('#category_product_total').val()) || 0; var productsPerPage = parseInt($('#category_limit').val()) || 12; if (Math.ceil(totalProducts / productsPerPage) <= 1) { hasMoreProducts = false; $('#end-of-products').show(); } // Scroll fallback $(window).off('scroll.infinite').on('scroll.infinite', function() { clearTimeout(scrollTimeout); scrollTimeout = setTimeout(function() { if (infiniteScrollEnabled && $(window).scrollTop() + $(window).height() >= $(document).height() - loadMoreThreshold) { loadMoreProducts(); } }, 100); }); // Colour dot click handler $(document).on('click', '.color-panel-item', function(e) { e.stopPropagation(); var color = $(this).data('color'); var productId = $(this).data('product-id'); $('.thumb-img-' + productId).find('img').each(function() { var src = $(this).attr('src') || ''; if (src) { $(this).attr('src', src.replace(/_ww_|_yy_|_rr_/g, '_' + color + '_')); } }); }); function updateFilterUI() { var filter_param = $('#filter_param').val(); var filter = $('#filter').val(); var activeFilterIds = []; if (filter_param) { var parts = filter_param.indexOf('_') !== -1 ? filter_param.split('_') : [filter_param]; parts.forEach(function(param) { var id = param.indexOf('.') !== -1 ? param.split('.')[1] : param; if (id) activeFilterIds.push(id); }); } if (filter) { filter.split(',').forEach(function(filterId) { if (filterId && activeFilterIds.indexOf(filterId) === -1) { activeFilterIds.push(filterId); } }); } $('.category-box, .category-a-box, .js_filter_option, .filter-checkbox').removeClass('selected active').prop('checked', false); activeFilterIds.forEach(function(filterId) { $('.category-box[data-filter-id="' + filterId + '"]').addClass('selected'); $('.category-a-box[data-filter-id="' + filterId + '"]').addClass('selected'); $('.js_filter_option[data-filter-id="' + filterId + '"]').addClass('active'); $('#checkbox' + filterId).prop('checked', true); }); } function applyFilters() { $('.product-wrapper-grid').addClass('loading'); $('#infinite-scroll-loader').show(); var url = 'index.php?route=product/category|loadMoreProducts'; var urlParams = new URLSearchParams(); urlParams.set('category_id', $('#category_id').val()); urlParams.set('filter_param', $('#filter_param').val()); urlParams.set('filter', $('#filter').val()); urlParams.set('sort', $('#sort').val()); urlParams.set('order', $('#order').val()); urlParams.set('page', 1); url += '&' + urlParams.toString(); $.ajax({ url: url, type: 'GET', dataType: 'json', success: function(response) { $('.product-wrapper-grid-row').empty(); currentPage = 1; hasMoreProducts = true; if (response.products && response.products.length > 0) { response.products.forEach(function(product) { $('.product-wrapper-grid-row').append(generateProductHtml(product)); }); currentPage++; hasMoreProducts = response.has_more; $('#end-of-products').toggle(!hasMoreProducts); } else { hasMoreProducts = false; $('#end-of-products').show(); } updateFilterUI(); }, error: function() { location.reload(); }, complete: function() { $('.product-wrapper-grid').removeClass('loading'); $('#infinite-scroll-loader').hide(); } }); } // Price range slider $(document).on('slidechange', '.slider-price-range', function(event, ui) { var priceSliderSteps = [ 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000, 1100, 1200, 1300, 1400, 1500, 1600, 1700, 1800, 1900, 2000, 2100, 2200, 2300, 2400, 2500, 3000, 5000, 7500, 10000, 20000, 30000, 40000, 50000, 60000, 70000, 80000, 90000, 100000, 300000, 500000, 700000, 999999 ]; var minValue = priceSliderSteps[ui.values[0]]; var maxValue = priceSliderSteps[ui.values[1]]; $('#stone_price_min').val(minValue); $('#stone_price_max').val(maxValue); $('.span_stone_price_min').text('£' + minValue); $('.span_stone_price_max').text('£' + maxValue); applyFiltersWithCarat(minValue, maxValue); }); function applyFiltersWithCarat(minPrice, maxPrice) { $('.product-wrapper-grid').addClass('loading'); $('#infinite-scroll-loader').show(); var url = 'index.php?route=product/category|loadMoreProducts'; var urlParams = new URLSearchParams(); urlParams.set('category_id', $('#category_id').val()); urlParams.set('filter_param', $('#filter_param').val()); urlParams.set('filter', $('#filter').val()); urlParams.set('stone_price_min', minPrice); urlParams.set('stone_price_max', maxPrice); urlParams.set('sort', $('#sort').val()); urlParams.set('order', $('#order').val()); urlParams.set('page', 1); url += '&' + urlParams.toString(); $.ajax({ url: url, type: 'GET', dataType: 'json', success: function(response) { $('.product-wrapper-grid-row').empty(); currentPage = 1; hasMoreProducts = true; if (response.products && response.products.length > 0) { response.products.forEach(function(product) { $('.product-wrapper-grid-row').append(generateProductHtml(product)); }); currentPage++; hasMoreProducts = response.has_more; $('#end-of-products').toggle(!hasMoreProducts); } else { hasMoreProducts = false; $('#end-of-products').show(); } updateFilterUI(); }, error: function() { location.reload(); }, complete: function() { $('.product-wrapper-grid').removeClass('loading'); $('#infinite-scroll-loader').hide(); } }); } } // end initCategoryPage // ============================================= // Wait for jQuery to be available then run. // Handles the case where jQuery loads inside //
which renders AFTER this script. // ============================================= (function waitForJQuery() { if (typeof window.jQuery !== 'undefined') { window.jQuery(document).ready(function() { initCategoryPage(); }); } else { setTimeout(waitForJQuery, 50); } })();