(function ($){
'use strict';
var HIDE_DELAY_MS=200;
var hideTimer=null;
var debounceTimer=null;
var qtyRequestCount=0;
var pointerInside=false;
var lastPointer={ x: 0, y: 0, has: false };
function getAjaxUrl(){
var params=window.wc_cart_fragments_params||window.wc_add_to_cart_params;
if(!params||!params.wc_ajax_url){
return null;
}
return params.wc_ajax_url.toString().replace('%%endpoint%%', 'zeodeo_update_mini_cart_item_qty');
}
function getCartItemKey($input){
var $wrapper=$input.closest('.zeodeo-mini-cart-quantity');
return $wrapper.attr('data-cart-item-key')||$wrapper.data('cartItemKey')||'';
}
function getQuantityInput($button){
return $button.parent().find('input.zeodeo-mini-cart-qty, input.qty[type="number"]');
}
function getHeaderCart(){
return $('#header .cart-info').has('.widget_shopping_cart_content').first();
}
function isDesktopHoverCart(){
return window.matchMedia('(min-width: 992px)').matches;
}
function isPointerOverCart(){
var $cart=getHeaderCart();
if(!$cart.length){
return false;
}
if(lastPointer.has&&document.elementFromPoint){
var el=document.elementFromPoint(lastPointer.x, lastPointer.y);
if(el&&($cart[0]===el||$.contains($cart[0], el))){
return true;
}
return false;
}
return $cart.is(':hover');
}
function openCart(){
var $cart=getHeaderCart();
if(!$cart.length){
return;
}
window.clearTimeout(hideTimer);
hideTimer=null;
$cart.addClass('is-open');
}
function closeCart(){
var $cart=getHeaderCart();
if(!$cart.length){
return;
}
$cart.removeClass('is-open');
}
function scheduleCloseCart(){
window.clearTimeout(hideTimer);
hideTimer=window.setTimeout(function (){
hideTimer=null;
if(pointerInside||qtyRequestCount > 0||isPointerOverCart()){
if(isPointerOverCart()){
pointerInside=true;
openCart();
}
return;
}
closeCart();
}, HIDE_DELAY_MS);
}
function syncCartOpenState(){
if(!isDesktopHoverCart()){
pointerInside=false;
closeCart();
return;
}
pointerInside=isPointerOverCart();
if(pointerInside||qtyRequestCount > 0){
openCart();
return;
}
scheduleCloseCart();
}
function changeMiniCartQuantity($input, direction){
var quantity=parseInt($.trim($input.val()), 10)||1;
var min=parseInt($input.attr('min'), 10)||1;
var max=parseInt($input.attr('max'), 10);
var step=parseInt($input.attr('step'), 10)||1;
if(direction < 0){
quantity=Math.max(quantity - step, min);
}else{
quantity +=step;
if(max > 0){
quantity=Math.min(quantity, max);
}}
$input.val(quantity);
return quantity;
}
function blockMiniCartItem($item){
if(!$item.length||typeof $.fn.block==='undefined'){
return;
}
$item.addClass('processing').block({
message: null,
overlayCSS: {
background: '#fff',
opacity: 0.6
}});
}
function unblockMiniCartItem($item){
if(!$item.length||!$item.closest('body').length||typeof $.fn.unblock==='undefined'){
return;
}
$item.removeClass('processing').unblock();
}
function applyFragmentHtml(selector, html){
var $targets=$(selector);
if(!$targets.length){
return;
}
if(selector.indexOf('widget_shopping_cart_content')!==-1){
var $parsed=$($.parseHTML($.trim(html)));
var $newWidget=$parsed.filter('.widget_shopping_cart_content');
if(!$newWidget.length){
$newWidget=$parsed.find('.widget_shopping_cart_content').first();
}
if($newWidget.length){
$targets.html($newWidget.html());
return;
}}
$targets.replaceWith(html);
}
function applyFragments(response){
if(!response||!response.fragments){
return;
}
var keepOpen=pointerInside||qtyRequestCount > 0||isPointerOverCart();
$.each(response.fragments, function (selector, html){
applyFragmentHtml(selector, html);
});
if(response.cart_hash&&window.sessionStorage&&window.wc_cart_fragments_params){
try {
sessionStorage.setItem(wc_cart_fragments_params.cart_hash_key, response.cart_hash);
} catch (error){
}}
$(document.body).trigger('wc_fragments_refreshed');
if(keepOpen){
openCart();
}
syncCartOpenState();
}
function normalizeQuantity($input){
var quantity=parseInt($.trim($input.val()), 10);
var min=parseInt($input.attr('min'), 10)||1;
var max=parseInt($input.attr('max'), 10);
var step=parseInt($input.attr('step'), 10)||1;
if(isNaN(quantity)){
quantity=min;
}
quantity=Math.max(min, quantity);
if(max > 0){
quantity=Math.min(quantity, max);
}
if(step > 1){
quantity=Math.round(quantity / step) * step;
quantity=Math.max(min, quantity);
}
$input.val(quantity);
return quantity;
}
function updateMiniCartQty($input){
var $item=$input.closest('.mini_cart_item');
var cartItemKey=getCartItemKey($input);
var ajaxUrl=getAjaxUrl();
var quantity=normalizeQuantity($input);
var request=$item.data('zeodeoQtyRequest');
if(!cartItemKey||!ajaxUrl){
return;
}
if(request&&request.readyState!==4){
request.abort();
qtyRequestCount=Math.max(0, qtyRequestCount - 1);
}
blockMiniCartItem($item);
qtyRequestCount +=1;
openCart();
request=$.ajax({
type: 'POST',
url: ajaxUrl,
data: {
cart_item_key: cartItemKey,
quantity: quantity
},
dataType: 'json'
});
$item.data('zeodeoQtyRequest', request);
request.done(function (response){
applyFragments(response);
}).fail(function (xhr, status){
if(status==='abort'){
return;
}
$(document.body).trigger('wc_fragment_refresh');
}).always(function (response, status){
if(status==='abort'){
return;
}
qtyRequestCount=Math.max(0, qtyRequestCount - 1);
if($item.data('zeodeoQtyRequest')===request){
unblockMiniCartItem($item);
$item.removeData('zeodeoQtyRequest');
}
syncCartOpenState();
});
}
function debouncedUpdate($input){
window.clearTimeout(debounceTimer);
debounceTimer=window.setTimeout(function (){
updateMiniCartQty($input);
}, 400);
}
function needsMiniCartRefresh(){
var $widget=$('.widget_shopping_cart_content').first();
if(!$widget.length){
return false;
}
var $shipping=$widget.find('.zeodeo-mini-cart-shipping').first();
if($shipping.length){
var shippingText=$.trim($shipping.text());
if(!$shipping.find('.zeodeo-mini-cart-fs').length ||
!$shipping.find('.zeodeo-mini-cart-delivery__link').length ||
/Until free shipping/i.test(shippingText)
){
return true;
}}
var $items=$widget.find('.mini_cart_item');
if(!$items.length){
return false;
}
var $qtyBlocks=$widget.find('.zeodeo-mini-cart-quantity');
if(!$qtyBlocks.length){
return true;
}
var hasControls=false;
$qtyBlocks.each(function (){
if($(this).find('input.zeodeo-mini-cart-qty, .zeodeo-mini-cart-qty-static').length){
hasControls=true;
}});
return !hasControls;
}
function clearStoredFragments(){
if(!window.sessionStorage||!window.wc_cart_fragments_params){
return;
}
try {
sessionStorage.removeItem(wc_cart_fragments_params.fragment_name);
sessionStorage.removeItem(wc_cart_fragments_params.cart_hash_key);
} catch (error){
}}
function refreshMiniCartFragments(){
if(!needsMiniCartRefresh()){
return;
}
clearStoredFragments();
$(document.body).trigger('wc_fragment_refresh');
}
$(document)
.on('mousemove.zeodeoMiniCart', function (e){
lastPointer.x=e.clientX;
lastPointer.y=e.clientY;
lastPointer.has=true;
});
$(document.body)
.on('mouseenter', '#header .cart-info', function (){
if(!isDesktopHoverCart()||!$(this).find('.widget_shopping_cart_content').length){
return;
}
pointerInside=true;
openCart();
})
.on('mouseleave', '#header .cart-info', function (){
if(!isDesktopHoverCart()||!$(this).find('.widget_shopping_cart_content').length){
return;
}
pointerInside=false;
scheduleCloseCart();
})
.on('click', '.woocommerce-mini-cart-item .ip-prod-quantity-minus', function (e){
var $input=getQuantityInput($(this));
if(!$input.length){
return;
}
e.preventDefault();
e.stopImmediatePropagation();
changeMiniCartQuantity($input, -1);
window.clearTimeout(debounceTimer);
updateMiniCartQty($input);
})
.on('click', '.woocommerce-mini-cart-item .ip-prod-quantity-plus', function (e){
var $input=getQuantityInput($(this));
if(!$input.length){
return;
}
e.preventDefault();
e.stopImmediatePropagation();
changeMiniCartQuantity($input, 1);
window.clearTimeout(debounceTimer);
updateMiniCartQty($input);
})
.on('change', '.woocommerce-mini-cart-item input.zeodeo-mini-cart-qty', function (){
debouncedUpdate($(this));
})
.on('keydown', '.woocommerce-mini-cart-item input.zeodeo-mini-cart-qty', function (e){
if(e.key==='Enter'){
e.preventDefault();
updateMiniCartQty($(this));
}})
.on('wc_fragments_refreshed added_to_cart removed_from_cart', function (){
window.setTimeout(function (){
refreshMiniCartFragments();
syncCartOpenState();
}, 50);
});
$(function (){
refreshMiniCartFragments();
});
})(jQuery);