File: D:/HostingSpaces/Velosophe/dev.abloc.cc/wwwroot/app/themes/abloc/js/dev/ab-shop.js
(function($) {
'use strict';
// Extend core script
$.extend($.nmTheme, {
/**
* Initialize scripts
*/
shop_init: function() {
var self = this;
// Shop select config
self.shopSelectConfig = {
onOpen: function() {
$(this).closest('tr').addClass('open');
// Trigger "focusin" event on original select element to make sure WooCommerce updates the options
$(this).children('select').trigger('focusin');
},
onChange: function() {
$(this).closest('tr').removeClass('open');
},
onClose: function() {
$(this).closest('tr').removeClass('open');
}
};
/* Shop */
if (self.isShop) {
// Shop vars and elements
self.shopAjax = false;
self.scrollOffsetDesktop = parseInt(ab_wp_vars.shopScrollOffset);
self.scrollOffsetTablet = parseInt(ab_wp_vars.shopScrollOffsetTablet);
self.scrollOffsetMobile = parseInt(ab_wp_vars.shopScrollOffsetMobile);
self.infloadScroll = false;
self.categoryClicked = false;
self.shopLoaderSpeed = 300;
self.shopScrollSpeed = 410;
self.$shopBrowseWrap = $('#ab-shop-browse-wrap');
self.imageLazyLoading = (ab_wp_vars.shopImageLazyLoad != '0') ? true : false;
if (ab_wp_vars.shopFiltersAjax != '0') {
// Check if AJAX should be disabled on mobile devices
self.filtersEnableAjax = (self.isTouch && ab_wp_vars.shopFiltersAjax != '1') ? false : true;
} else {
self.filtersEnableAjax = false;
}
// Set page-scroll offset
self.shopSetScrollOffset();
// Set shop min-height (keep above "shopSetScrollOffset()")
self.shopSetMinHeight();
/* Bind: Window resize */
var timer = null;
self.$window.resize(function() {
if (timer) { clearTimeout(timer); }
timer = setTimeout(function() {
// Set shop min-height
self.shopSetMinHeight();
// Set page-scroll offset
self.shopSetScrollOffset();
}, 250);
});
// Load product images (init Unveil)
if (self.$pageIncludes.hasClass('banner-slider')) {
// Wait for "banner-slider-loaded" event (banner slider changes height)
self.$document.on('banner-slider-loaded', function() {
self.shopUrlHashScroll();
self.shopLoadImages();
});
} else {
self.shopUrlHashScroll();
self.shopLoadImages();
}
if (self.filtersEnableAjax) {
/* Bind: Back button "popstate" event */
self.$window.on('popstate.nmshop', function(e) {
// Return if no "popstate" tag/id is set
if (!e.originalEvent.state) { return; }
// Make sure the "popstate" event is ours (nmShop)
if (e.originalEvent.state.nmShop) {
// Load full page from saved "pushState" url
self.shopGetPage(window.location.href, true);
}
});
}
/*
* Bind: Header main menu shop link
* Note: "shop-link" class is added manually in WP admin
*/
$('#ab-main-menu-ul').children('.shop-link').find('> a').bind('click', function(e) {
e.preventDefault();
self.shopScrollToTop(); // Smooth-scroll to shop
});
if (self.filtersEnableAjax) {
/* Bind: Results bar - Filters reset link */
self.$shopWrap.on('click', '#ab-shop-filters-reset', function(e) {
e.preventDefault();
var resetUrl = location.href.replace(location.search, ''); // Get current URL without query-strings
self.shopGetPage(resetUrl);
});
/* Bind: Results bar - Search/taxonomy reset link */
self.$shopWrap.on('click', '#ab-shop-search-taxonomy-reset', function(e) {
e.preventDefault();
var $resetButton = $(this);
if ($resetButton.closest('.ab-shop-results-bar').hasClass('is-search')) {
// Search
var urlSearchParam = self.urlGetParameter('s'), // Check for the "s" parameter in the current page URL
// Search from external page: Get default/main shop URL (current URL may not be the default shop URL)
// Search from shop page: Get current URL without query-strings (current URL is a shop URL)
resetUrl = (urlSearchParam) ? $resetButton.data('shop-url') : location.href.replace(location.search, '');
} else {
// Category or tag
var resetUrl = $resetButton.data('shop-url'); // Get default/main shop URL
}
self.shopGetPage(resetUrl);
});
}
}
/*
* Variation selects - Bind: Product variations updated event - Triggered from "add-to-cart-variation.js"
* Note: See "self.shopSelectConfig" for related "focusin" event
*/
if (self.shopCustomSelect) {
self.$document.on('woocommerce_update_variation_values', '#ab-variations-form', function() {
// Update select(s) in case options have been added/removed by WooCommerce
$('#ab-variations-form').find('select').each(function() {
$(this).selectOrDie('update');
});
});
}
/* Products */
if (self.$pageIncludes.hasClass('products')) {
/* Bind: Product hover image swap */
if (!self.isTouch) {
if (self.isShop) {
$('#ab-shop-products').on('hover.nmImageSwap', '.ab-products li.hover-image-load', function() {
self.productLoadHoverImage($(this));
});
} else {
$('.ab-products').on('hover.nmImageSwap', '.hover-image-load', function() {
self.productLoadHoverImage($(this));
});
}
}
}
// Only bind if add-to-cart redirect is disabled
if (typeof wc_add_to_cart_params !== 'undefined' && wc_add_to_cart_params.cart_redirect_after_add !== 'yes') {
/* Add-to-cart event: Show mini cart with loader overlay */
self.$body.on('adding_to_cart', function(event, $button, data) {
// Is widget/cart panel enabled?
if (self.$widgetPanel.length) {
if (!self.quickviewIsOpen()) {
self.widgetPanelShow(true); // Args: showLoader
}
} else {
// Show widget/cart panel overlay
self.$widgetPanelOverlay.addClass('ab-loader show');
}
});
/* Add-to-cart event: Hide mini cart loader overlay */
self.$body.on('added_to_cart', function(event, fragments, cartHash) {
// Is widget/cart panel enabled?
if (self.$widgetPanel.length) {
if (!self.quickviewIsOpen()) {
self.widgetPanelCartHideLoader();
}
} else {
// Hide widget/cart panel overlay
self.$widgetPanelOverlay.trigger('click').removeClass('show ab-loader');
}
});
} else {
// Disable default WooCommerce AJAX add-to-cart event if redirect is enabled
self.$document.off( 'click', '.add_to_cart_button' );
}
// Load extension scripts
self.shopLoadExtension();
},
/**
* Shop: Load extension scripts
*/
shopLoadExtension: function() {
var self = this;
/* Extension: Add to cart */
if (ab_wp_vars.shopAjaxAddToCart !== '0' && $.nmThemeExtensions.add_to_cart) {
$.nmThemeExtensions.add_to_cart.call(self);
}
if (self.isShop) {
/* Extension: Infinite load */
if ($.nmThemeExtensions.infload) {
$.nmThemeExtensions.infload.call(self);
}
/* Extension: Filters */
if ($.nmThemeExtensions.filters) {
$.nmThemeExtensions.filters.call(self);
/* Extension: Filters scrollbar */
/*if ($.nmThemeExtensions.filters_scrollbar) {
$.nmThemeExtensions.filters_scrollbar.call(self);
}*/
}
/* Extension: Search */
if (self.searchEnabled && $.nmThemeExtensions.search) {
$.nmThemeExtensions.search.call(self);
}
}
/* Extension: Quickview */
if (self.$pageIncludes.hasClass('quickview')) {
if ($.nmThemeExtensions.quickview) {
$.nmThemeExtensions.quickview.call(self);
}
}
},
/**
* Shop: Check for URL #hash and scroll/jump to shop if added
*/
shopUrlHashScroll: function() {
var self = this;
if (window.location.hash === '#shop') {
self.shopScrollToTop(true); // Arg: (jumpTo)
}
},
/**
* Shop/Single-product: Toggle variation details
*/
/*shopToggleVariationDetails: function() {
var $variationDetails = $('#ab-product-summary').find('.single_variation'),
$variationDetailsChildren = $variationDetails.children(),
variationDetailsEmpty = true;
// Show variation details container (if it's not empty)
if ($variationDetailsChildren.length) {
// WooCommerce v2.5: Make sure the variation details wrapper elements are not empty either
for (var i = 0; i < $variationDetailsChildren.length; i++) {
if ($.trim($variationDetailsChildren.eq(i).html()).length) {
variationDetailsEmpty = false;
break;
}
}
}
if (variationDetailsEmpty) {
$variationDetails.removeClass('show');
} else {
$variationDetails.addClass('show');
}
},*/
/**
* Shop/Single-product: Check variation details (hide if empty)
*/
shopCheckVariationDetails: function($variationDetailsWrap) {
var $variationDetailsChildren = $variationDetailsWrap.children(),
variationDetailsEmpty = true;
if ($variationDetailsChildren.length) {
// Check for variation detail elements
for (var i = 0; i < $variationDetailsChildren.length; i++) {
if ($variationDetailsChildren.eq(i).children().length) {
variationDetailsEmpty = false;
break;
}
}
}
if (variationDetailsEmpty) {
$variationDetailsWrap.hide();
} else {
$variationDetailsWrap.show();
}
},
/**
* Shop: Initialize Unveil (load images)
*/
shopLoadImages: function() {
var self = this;
// Make sure image lazy-loading is enabled
if (self.imageLazyLoading) {
// Remove any previous Unveil events
self.$window.off('scroll.unveil resize.unveil lookup.unveil');
var $images = self.$shopBrowseWrap.find('.ab-products li:not(.image-loaded) .ab-shop-loop-thumbnail .unveil-image'); // Get un-loaded images only
if ($images.length) {
var scrollTolerance = 1;
$images.unveil(scrollTolerance, function() {
$(this).parents('li').first().addClass('image-loaded');
});
}
}
},
/**
* Shop: Set page-scroll offset
*/
shopSetScrollOffset: function() {
var self = this,
pageWidth = self.$body.width();
// Desktop
if (pageWidth > 863) {
self.scrollOffset = (self.$header.hasClass('static-on-scroll')) ? self.$header.outerHeight() : self.scrollOffsetDesktop;
}
// Tablet
else if (pageWidth > 383) {
self.scrollOffset = self.scrollOffsetTablet;
}
// Mobile
else {
self.scrollOffset = self.scrollOffsetMobile;
}
},
/**
* Shop: Set shop min-height
*/
shopSetMinHeight: function() {
var self = this,
footerHeight = $('#ab-footer').outerHeight(true);
self.$shopWrap.css('min-height', (self.$window.height() - (footerHeight + self.scrollOffset))+'px');
},
/**
* Deprecated - Remove
* Shop: Set shop container "min-height" and (if shop-top is -below- tolerance) smooth-scroll shop directly below header
* - Returns variable "to" with the smooth-scroll animation speed so "setTimeout()" can be used
*/
/*shopMaybeScrollToTop: function(noAnim) {
var self = this,
to = 0;
// Set shop min-height
self.shopSetMinHeight();
var shopPosition = Math.round(self.$shopWrap.offset().top - self.scrollOffset),
tolerance = 100 // 100px tolerance;
if ((self.$document.scrollTop()+tolerance) < shopPosition) {
to = self.shopScrollSpeed;
if (noAnim) {
self.$window.scrollTop(shopPosition);
} else {
$('html, body').animate({'scrollTop': shopPosition}, self.shopScrollSpeed);
}
}
return to;
},*/
/**
* Shop: Scroll to shop-top (directly below header)
* - Returns variable "to" with the smooth-scroll animation speed so "setTimeout()" can be used
*/
shopScrollToTop: function(setHeight, jumpTo) {
var self = this,
to = 0;
if (self.$window.width() > 399) {
var shopPosition = Math.round(self.$shopWrap.offset().top - self.scrollOffset);
} else {
var shopPosition = Math.round($('#ab-shop-products').offset().top - 24 - self.scrollOffset);
}
if (setHeight) {
// Set shop min-height
self.shopSetMinHeight();
}
if (jumpTo) {
$('html, body').scrollTop(shopPosition);
} else {
to = self.shopScrollSpeed;
$('html, body').animate({'scrollTop': shopPosition}, self.shopScrollSpeed);
}
return to;
},
/**
* Shop: Remove any visible shop notices
*/
shopRemoveNotices: function() {
$('#ab-shop-notices-wrap').empty();
},
/**
* Shop: Show "loader" overlay
*/
shopShowLoader: function(disableAnimation) {
var $shopLoader = $('#ab-shop-products-overlay');
if (disableAnimation) {
$shopLoader.addClass('no-anim');
}
$shopLoader.addClass('show');
},
/**
* Shop: Hide "loader" overlay
*/
shopHideLoader: function(disableAnimation) {
var self = this,
$shopLoader = $('#ab-shop-products-overlay');
if (!disableAnimation) {
$shopLoader.removeClass('no-anim');
}
$shopLoader.removeClass('ab-loader').addClass('fade-out');
setTimeout(function() {
$shopLoader.removeClass('show fade-out').addClass('ab-loader');
}, self.shopLoaderSpeed);
if (self.infloadScroll) {
self.infscrollLock = false; // "Unlock" infinite scroll
self.$window.trigger('scroll'); // Load next page (if correct scroll position)
}
},
/**
* Quick view: Check if quick view modal is open
*/
quickviewIsOpen: function() {
return $('#ab-quickview').is(':visible');
},
/**
* Product: Load hover image
*/
productLoadHoverImage: function($productWrap) {
var self = this;
if ($productWrap.hasClass('hover-image-loading')) {
return;
}
var $image = $productWrap.find('.ab-shop-loop-thumbnail .hover-image'), // Note: Don't create this variable outside the function first (it will overwrite '.load' below)
imageSrc = $image.attr('data-src');
if (!imageSrc) {
console.log('NM: No image src found - productLoadHoverImage()');
$productWrap.removeClass('hover-image-load');
return;
}
$productWrap.addClass('hover-image-loading');
// Bind image 'load' event
$image.load(function() {
var $this = $(this),
$imageWrap = $this.closest('li');
$this.unbind('load');
$imageWrap.addClass('hover-image-loaded').removeClass('hover-image-load hover-image-loading');
});
// Load image
$image.attr('src', imageSrc);
}
});
// Add extension so it can be called from $.nmThemeExtensions
$.nmThemeExtensions.shop = $.nmTheme.shop_init;
})(jQuery);