Channel Setting Oval Engagement Rings

Solitaire
Solitaire
Halo
Halo
Vintage
Vintage
Side Stone
Side Stone
Trilogy
Trilogy
Cluster
Cluster
$(document).ready(function() { // Category slider arrows - safe check so JS does not break if slider is missing 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 $('[data-toggle="collapse"]').on('click', function(e) { e.preventDefault(); var target = $(this).data('target'); var $target = $(target); // Toggle the collapse $target.collapse('toggle'); // Update the button state 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'); } }); // Handle collapse events $('.collapse').on('show.bs.collapse', function() { var $button = $('[data-target="#' + $(this).attr('id') + '"]'); var $icon = $button.find('.fa'); $button.removeClass('collapsed'); $icon.removeClass('fa-plus').addClass('fa-minus'); }); $('.collapse').on('hide.bs.collapse', function() { var $button = $('[data-target="#' + $(this).attr('id') + '"]'); var $icon = $button.find('.fa'); $button.addClass('collapsed'); $icon.removeClass('fa-minus').addClass('fa-plus'); }); // Initialize filter UI state on page load updateFilterUI(); // Infinite Scroll Implementation var currentPage = 1; var isLoading = false; var hasMoreProducts = true; var loadMoreThreshold = 200; // pixels from bottom to trigger load var scrollTimeout; var infiniteScrollEnabled = true; // Function to load more products function loadMoreProducts() { if (isLoading || !hasMoreProducts || !infiniteScrollEnabled) return; isLoading = true; $('#infinite-scroll-loader').show(); $('.product-wrapper-grid').addClass('loading'); // Build the AJAX URL with current parameters var url = 'index.php?route=product/category|loadMoreProducts'; var urlParams = new URLSearchParams(window.location.search); var category_id = $('#category_id').val(); urlParams.set('category_id', category_id); var filter_param = $('#filter_param').val(); urlParams.set('filter_param', filter_param); var filter = $('#filter').val(); urlParams.set('filter', filter); var sort = $('#sort').val(); urlParams.set('sort', sort); var order = $('#order').val(); urlParams.set('order', order); // Add current URL parameters urlParams.set('page', currentPage + 1); // Add the parameters to the URL url += '&' + urlParams.toString(); $.ajax({ url: url, type: 'GET', dataType: 'json', success: function(response) { if (response.products && response.products.length > 0) { // Append new products to the grid var $productGrid = $('.product-wrapper-grid-row'); response.products.forEach(function(product) { var productHtml = generateProductHtml(product); $productGrid.append(productHtml); }); currentPage++; hasMoreProducts = response.has_more; // If no more products, show end message if (!hasMoreProducts) { $('#end-of-products').show(); } } else { hasMoreProducts = false; $('#end-of-products').show(); } }, error: function(xhr, status, error) { console.error('Error loading more products:', error); // Fallback to regular pagination on error $('#fallback-pagination').show(); }, complete: function() { isLoading = false; $('#infinite-scroll-loader').hide(); $('.product-wrapper-grid').removeClass('loading'); } }); } if ('IntersectionObserver' in window) { const loadTrigger = document.getElementById('load-more-trigger'); const observer = new IntersectionObserver((entries) => { if (entries[0].isIntersecting) { loadMoreProducts(); } }, { root: null, rootMargin: '200px', // preload before reaching end threshold: 0 }); if (loadTrigger) { observer.observe(loadTrigger); } } // Function to generate product HTML 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'; } else { grid_size = 'col-xl-4'; } var html = '
'; html += '
'; html += '
'; html += ''; html += '
'; html += '
'; html += ''; html += '
'; html += '
From
'; html += '

' + product.sale_price + '

'; html += '
'; html += '
'; html += '
'; html += '
'; html += '
    '; html += '
  • '; html += '
  • '; html += '
  • '; html += '
  • '; html += '
'; html += '
'; html += '
'; html += '
'; html += '
'; html += '
'; html += '
'; html += '
'; html += '
'; return html; } // Initialize infinite scroll on page load // Check if we have more than one page of products var totalProducts = parseInt($('#category_product_total').val()) || 0; var productsPerPage = parseInt($('#category_limit').val()) || 12; var totalPages = Math.ceil(totalProducts / productsPerPage); if (totalPages <= 1) { // Only one page, show end message hasMoreProducts = false; $('#end-of-products').show(); } // View Mode Toggle Functionality var infiniteScrollEnabled = true; $('#infinite-scroll-toggle').on('click', function() { if (!infiniteScrollEnabled) { infiniteScrollEnabled = true; $(this).removeClass('btn-outline-secondary').addClass('btn-outline-primary active'); $('#pagination-toggle').removeClass('btn-outline-primary active').addClass('btn-outline-secondary'); $('#fallback-pagination').hide(); $('#infinite-scroll-loader').show(); $('#end-of-products').show(); } }); $('#pagination-toggle').on('click', function() { if (infiniteScrollEnabled) { infiniteScrollEnabled = false; $(this).removeClass('btn-outline-secondary').addClass('btn-outline-primary active'); $('#infinite-scroll-toggle').removeClass('btn-outline-primary active').addClass('btn-outline-secondary'); $('#fallback-pagination').show(); $('#infinite-scroll-loader').hide(); $('#end-of-products').hide(); } }); // Colour dot click handler — swap product card image to selected metal colour $(document).on('click', '.color-panel-item', function(e) { e.stopPropagation(); var color = $(this).data('color'); var productId = $(this).data('product-id'); var $container = $('.thumb-img-' + productId); $container.find('img').each(function() { var src = $(this).attr('src') || ''; if (src) { src = src.replace(/_ww_|_yy_|_rr_/g, '_' + color + '_'); $(this).attr('src', src); } }); }); // Update scroll handler to respect toggle state with debouncing $(window).off('scroll.infinite').on('scroll.infinite', function() { clearTimeout(scrollTimeout); scrollTimeout = setTimeout(function() { if (infiniteScrollEnabled && $(window).scrollTop() + $(window).height() >= $(document).height() - loadMoreThreshold) { loadMoreProducts(); } }, 100); // 100ms debounce }); // Function to update filter UI state function updateFilterUI() { var filter_param = $('#filter_param').val(); var filter = $('#filter').val(); // Parse current filter parameters var activeFilterIds = []; if (filter_param) { var filtered_param = []; if (filter_param.indexOf('_') !== -1) { var filter_param_arr = filter_param.split("_"); filter_param_arr.forEach(function(param) { if (param.indexOf('.') !== -1) { var exp_data = param.split("."); if (exp_data[1]) { filtered_param.push(exp_data[1]); } } else { filtered_param.push(param); } }); } else { if (filter_param.indexOf('.') !== -1) { var exp_data = filter_param.split("."); if (exp_data[1]) { filtered_param.push(exp_data[1]); } } else { filtered_param.push(filter_param); } } activeFilterIds = filtered_param; } if (filter) { var filterIds = filter.split(','); filterIds.forEach(function(filterId) { if (filterId && activeFilterIds.indexOf(filterId) === -1) { activeFilterIds.push(filterId); } }); } // Remove all active/selected states $('.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'); $('.filter-checkbox[id="checkbox' + filterId + '"]').prop('checked', true); }); } // AJAX Filter Functionality function applyFilters(updateUrl = true) { $('.product-wrapper-grid').addClass('loading'); $('#infinite-scroll-loader').show(); var category_id = $('#category_id').val(); var filter_param = $('#filter_param').val(); var filter = $('#filter').val(); var sort = $('#sort').val(); var order = $('#order').val(); var stone_price_min = $('#stone_price_min').val() || '0'; var stone_price_max = $('#stone_price_max').val() || '50000'; var url = 'index.php?route=product/category|loadMoreProducts'; var urlParams = new URLSearchParams(); urlParams.set('category_id', category_id); urlParams.set('filter_param', filter_param); urlParams.set('filter', filter); urlParams.set('sort', sort); urlParams.set('order', order); urlParams.set('page', 1); // Reset to first page for new filters url += '&' + urlParams.toString(); $.ajax({ url: url, type: 'GET', dataType: 'json', success: function(response) { // Clear existing products $('.product-wrapper-grid-row').empty(); currentPage = 1; hasMoreProducts = true; if (response.products && response.products.length > 0) { var $productGrid = $('.product-wrapper-grid-row'); response.products.forEach(function(product) { var productHtml = generateProductHtml(product); $productGrid.append(productHtml); }); currentPage++; hasMoreProducts = response.has_more; if (!hasMoreProducts) { $('#end-of-products').show(); } else { $('#end-of-products').hide(); } } else { hasMoreProducts = false; $('#end-of-products').show(); } updateFilterUI(); }, error: function(xhr, status, error) { console.error('Error applying filters:', error); location.reload(); // Fallback to full page reload on error }, complete: function() { $('.product-wrapper-grid').removeClass('loading'); $('#infinite-scroll-loader').hide(); } }); } // Handle price range slider changes $(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]]; // Update hidden inputs $('#stone_price_min').val(minValue); $('#stone_price_max').val(maxValue); // Update display values $('.span_stone_price_min').text('£' + minValue); $('.span_stone_price_max').text('£' + maxValue); applyFiltersWithCarat(minValue, maxValue, true); }); // Function to apply filters with carat range function applyFiltersWithCarat(minPrice, maxPrice, updateUrl = true) { $('.product-wrapper-grid').addClass('loading'); $('#infinite-scroll-loader').show(); var category_id = $('#category_id').val(); var filter_param = $('#filter_param').val(); var filter = $('#filter').val(); var sort = $('#sort').val(); var order = $('#order').val(); var url = 'index.php?route=product/category|loadMoreProducts'; var urlParams = new URLSearchParams(); urlParams.set('category_id', category_id); urlParams.set('filter_param', filter_param); urlParams.set('filter', filter); urlParams.set('stone_price_min', minPrice); urlParams.set('stone_price_max', maxPrice); urlParams.set('sort', sort); urlParams.set('order', order); 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) { var $productGrid = $('.product-wrapper-grid-row'); response.products.forEach(function(product) { var productHtml = generateProductHtml(product); $productGrid.append(productHtml); }); currentPage++; hasMoreProducts = response.has_more; if (!hasMoreProducts) { $('#end-of-products').show(); } else { $('#end-of-products').hide(); } } else { hasMoreProducts = false; $('#end-of-products').show(); } updateFilterUI(); }, error: function(xhr, status, error) { console.error('Error applying filters:', error); location.reload(); }, complete: function() { $('.product-wrapper-grid').removeClass('loading'); $('#infinite-scroll-loader').hide(); } }); } }); $('#faqAccordion').on('shown.bs.collapse', function (e) { $(e.target).prev('.faq-header').find('.fa') .removeClass('fa-plus') .addClass('fa-minus'); }); $('#faqAccordion').on('hidden.bs.collapse', function (e) { $(e.target).prev('.faq-header').find('.fa') .removeClass('fa-minus') .addClass('fa-plus'); });