/** * WP Alpha Theme Framework * Alpha Woocommerce * * @package WP Alpha Framework * @since 1.2.0 */ window.theme = window.theme || {}; ( function( $ ) { theme.woocommerce = { init: function() { this.removerId = 0; // Functions for products this.initProductsAttributeAction(); this.initProductsQuickview(); this.initProductsCartAction(); this.initProductsWishlistAction(); this.initProductsHover(); this.initAjaxAddToCart(); this.initResetVariation(); theme.call( this.initProducts.bind( this ), 500 ); }, /** * Initialize products * - rating tooltip * - product types * * @since 1.0 * @param {HTMLElement|jQuery|string} selector * @return {void} */ initProducts: function( selector ) { this.ratingTooltip( selector ); // theme.quantityInput(theme.$(selector, '.qty')); // theme.$(selector, 'input.qty').off('change', handleQTY).on('change', handleQTY); }, /** * Init ajax add to cart for quickview. * * * @since 1.2.0 */ initAjaxAddToCart: function() { theme.$body.on( 'click', '.single_add_to_cart_button', function( e ) { var $btn = $( e.currentTarget ); if ( $btn.hasClass( 'disabled' ) || $btn.hasClass( 'has_buy_now' ) ) { return; } var $product = $btn.closest( '.product-single' ); if ( !$product.length || $product.hasClass( 'product-type-external' ) || $product.hasClass( 'product-type-grouped' ) || !$product.hasClass( 'product-widget' ) && !$product.hasClass( 'product-quickview' ) ) { return; } e.preventDefault(); var $form = $btn.closest( 'form.cart' ); if ( $form.hasClass( 'd-loading' ) ) { return; } var variation_id = $form.find( 'input[name="variation_id"]' ).val(), product_id = variation_id ? $form.find( 'input[name="product_id"]' ).val() : $btn.val(), quantity = $form.find( 'input[name="quantity"]' ).val(), $attributes = $form.find( 'select[data-attribute_name]' ), data = { product_id: variation_id ? variation_id : product_id, quantity: quantity }; $attributes.each( function() { var $this = $( this ); data[$this.attr( 'data-attribute_name' )] = $this.val(); } ); // Initialize ajax url var ajax_url = ''; // Resolve issue. For the variable product that has any type, ajax add to cart does not work // in single product widget and quickview // 2021-06-20 if ( $product.hasClass( 'product-widget' ) || $product.hasClass( 'product-quickview' ) ) { ajax_url = alpha_vars.ajax_url; data.action = 'alpha_ajax_add_to_cart'; } else { ajax_url = wc_add_to_cart_params.wc_ajax_url.toString().replace( '%%endpoint%%', 'add_to_cart' ); } theme.doLoading( $btn, 'small' ); $btn.removeClass( 'added' ); // Trigger event. theme.$body.trigger( 'adding_to_cart', [$btn, data] ); $.ajax( { type: 'POST', url: ajax_url, data: data, dataType: 'json', success: function( response ) { if ( !response ) { return; } if ( response.error && response.product_url ) { location = response.product_url; return; } // Redirect to cart option if ( wc_add_to_cart_params.cart_redirect_after_add === 'yes' ) { location = wc_add_to_cart_params.cart_url; return; } // trigger event $( document.body ).trigger( 'added_to_cart', [response.fragments, response.cart_hash, $btn] ); // show minipopup box var link = $form.attr( 'action' ), image = $product.find( '.wp-post-image' ).attr( 'src' ), title = $product.find( '.product_title' ).text(), price = variation_id ? $form.find( '.woocommerce-variation-price .price' ).html() : $product.find( '.price' ).html(), count = parseInt( $form.find( '.qty' ).val() ), id = $product.attr( 'id' ); price || ( price = $product.find( '.price' ).html() ); var $popup_product = $( '.minipopup-area' ).find( "#" + id ); if ( id == $popup_product.attr( 'id' ) ) { $popup_product.find( '.cart-count' ).html( parseInt( $popup_product.find( '.cart-count' ).html() ) + count ); } else { theme.minipopup.open( { content: '
\
\
\
' + count + ' x ' + title + '' + alpha_vars.texts.cart_suffix + '
\
' } ); } }, complete: function() { theme.endLoading( $btn ); } } ); } ); }, /** * Ajax add to cart for variation products * * @since 1.0 */ initProductsAttributeAction: function() { theme.$body .on( 'click', '.product-variation-wrapper button', function( e ) { var $this = $( this ), $variation = $this.parent(), $wrapper = $this.closest( '.product-variation-wrapper' ), attr = 'attribute_' + String( $variation.data( 'attr' ) ), variationData = $wrapper.data( 'product_variations' ), attributes = $wrapper.data( 'product_attrs' ), attrValue = $this.attr( 'name' ), $price = $wrapper.closest( '.product-loop' ).find( '.price' ), priceHtml = $wrapper.data( 'price' ); if ( $this.hasClass( 'disabled' ) ) { return; } // if ( $this.hasClass( 'active' ) ) { // $this.removeClass( 'active' ) // .parent().next().val( '' ).change(); // } else { // $this.addClass( 'active' ).siblings().removeClass( 'active' ); // $this.parent().next().val( $this.attr( 'name' ) ).change(); // } var suitableData = variationData, matchedData = variationData; // Get Attributes if ( undefined == attributes ) { attributes = []; $wrapper.find( '.product-variations' ).each( function() { attributes.push( 'attribute_' + String( $( this ).data( 'attr' ) ) ); } ); $wrapper.data( 'product_attrs', attributes ); } // Save HTML if ( undefined == priceHtml ) { priceHtml = $price.html(); $wrapper.data( 'price', priceHtml ); } // Update Matched Array if ( attrValue == $wrapper.data( attr ) ) { $wrapper.removeData( attr ); let tempArray = []; variationData.forEach( function( item, index ) { var flag = true; attributes.forEach( function( attr_item ) { if ( undefined != $wrapper.data( attr_item ) && $wrapper.data( attr_item ) != item['attributes'][attr_item] && "" != item['attributes'][attr_item] ) { flag = false; } } ); if ( flag ) { tempArray.push( item ); } } ); matchedData = tempArray; } else { $wrapper.data( attr, attrValue ); let tempArray = []; variationData.forEach( function( item, index ) { var flag = true; attributes.forEach( function( attr_item ) { if ( undefined != $wrapper.data( attr_item ) && $wrapper.data( attr_item ) != item['attributes'][attr_item] && "" != item['attributes'][attr_item] ) { flag = false; } } ); if ( flag ) { tempArray.push( item ); } } ); matchedData = tempArray; } var showPrice = true; attributes.forEach( function( attr_item ) { if ( attr != attr_item || ( attr_item == attr && undefined == $wrapper.data( attr ) ) ) { let $variation = $wrapper.find( '.' + attr_item.slice( 10 ) + ' > *:not(.guide-link)' ); $variation.each( function() { var $this = $( this ); if ( !$this.hasClass( 'select-box' ) ) { $this.addClass( 'disabled' ); } else { $this.find( 'option' ).css( 'display', 'none' ); } } ) variationData.forEach( function( item ) { let flag = true; attributes.forEach( function( atr_item ) { if ( undefined != $wrapper.data( atr_item ) && attr_item != atr_item && item['attributes'][atr_item] != $wrapper.data( atr_item ) && "" != item['attributes'][atr_item] ) { flag = false; } } ); if ( true == flag ) { if ( "" == item['attributes'][attr_item] ) { $variation.removeClass( 'disabled' ); $variation.each( function() { var $this = $( this ); if ( !$this.hasClass( 'select-box' ) ) { $this.removeClass( 'disabled' ); } else { $this.find( 'option' ).css( 'display', '' ); } } ) } else { $variation.each( function() { var $this = $( this ); if ( !$this.hasClass( 'select-box' ) ) { if ( $this.attr( 'name' ) == item['attributes'][attr_item] ) { $this.removeClass( 'disabled' ); } } else { $this.find( 'option' ).each( function() { var $this = $( this ); if ( $this.attr( 'value' ) == item['attributes'][attr_item] || $this.attr( 'value' ) == '' ) { $this.css( 'display', '' ); } } ); } } ); } } } ); } if ( undefined == $wrapper.data( attr_item ) ) { showPrice = false; } } ); if ( true == showPrice && 1 == matchedData.length ) { $price.closest( '.product-loop' ).data( 'variation', matchedData[0]['variation_id'] ); $price.html( $( matchedData[0]['price_html'] ).html() ); $price.closest( '.product-loop' ).find( '.add_to_cart_button' ) .removeClass( 'product_type_variable' ) .addClass( 'product_type_simple' ); } else { $price.html( priceHtml ); $price.closest( '.product-loop' ).removeData( 'variation' ) .find( '.add_to_cart_button' ) .removeClass( 'product_type_simple' ) .addClass( 'product_type_variable' ); } } ) .on( 'change', '.product-variation-wrapper select', function( e ) { var $this = $( this ), $variation = $this.parent(), $wrapper = $this.closest( '.product-variation-wrapper' ), attr = $this.data( 'attribute_name' ), variationData = $wrapper.data( 'product_variations' ), attributes = $wrapper.data( 'product_attrs' ), attrValue = $this.val(), $price = $wrapper.closest( '.product-loop' ).find( '.price' ), priceHtml = $wrapper.data( 'price' ); var suitableData = variationData, matchedData = variationData; // Get Attributes if ( undefined == attributes ) { attributes = []; $wrapper.find( '.product-variations' ).each( function() { attributes.push( 'attribute_' + String( $( this ).data( 'attr' ) ) ); } ); $wrapper.data( 'product_attrs', attributes ); } // Save HTML if ( undefined == priceHtml ) { priceHtml = $price.html(); $wrapper.data( 'price', priceHtml ); } // Update Matched Array if ( "" == attrValue ) { $wrapper.removeData( attr ); let tempArray = []; variationData.forEach( function( item, index ) { var flag = true; attributes.forEach( function( attr_item ) { if ( undefined != $wrapper.data( attr_item ) && $wrapper.data( attr_item ) != item['attributes'][attr_item] && "" != item['attributes'][attr_item] ) { flag = false; } } ); if ( flag ) { tempArray.push( item ); } } ); matchedData = tempArray; } else { $wrapper.data( attr, attrValue ); let tempArray = []; variationData.forEach( function( item, index ) { var flag = true; attributes.forEach( function( attr_item ) { if ( undefined != $wrapper.data( attr_item ) && $wrapper.data( attr_item ) != item['attributes'][attr_item] && "" != item['attributes'][attr_item] ) { flag = false; } } ); if ( flag ) { tempArray.push( item ); } } ); matchedData = tempArray; } var showPrice = true; attributes.forEach( function( attr_item ) { if ( attr != attr_item || ( attr_item == attr && undefined == $wrapper.data( attr ) ) ) { let $variation = $wrapper.find( '.' + attr_item.slice( 10 ) + ' > *' ); $variation.each( function() { var $this = $( this ); if ( !$this.hasClass( 'select-box' ) ) { $this.addClass( 'disabled' ); } else { $this.find( 'option' ).css( 'display', 'none' ); } } ); variationData.forEach( function( item ) { let flag = true; attributes.forEach( function( atr_item ) { if ( undefined != $wrapper.data( atr_item ) && attr_item != atr_item && item['attributes'][atr_item] != $wrapper.data( atr_item ) && "" != item['attributes'][atr_item] ) { flag = false; } } ); if ( true == flag ) { if ( "" == item['attributes'][attr_item] ) { $variation.removeClass( 'disabled' ); $variation.each( function() { var $this = $( this ); if ( !$this.hasClass( 'select-box' ) ) { $this.removeClass( 'disabled' ); } else { $this.find( 'option' ).css( 'display', '' ); } } ); } else { $variation.each( function() { var $this = $( this ); if ( !$this.hasClass( 'select-box' ) ) { if ( $this.attr( 'name' ) == item['attributes'][attr_item] ) { $this.removeClass( 'disabled' ); } } else { $this.find( 'option' ).each( function() { var $this = $( this ); if ( $this.attr( 'value' ) == item['attributes'][attr_item] || $this.attr( 'value' ) == '' ) { $this.css( 'display', '' ); } } ); } } ); } } } ); } if ( undefined == $wrapper.data( attr_item ) ) { showPrice = false; } } ); if ( true == showPrice && 1 == matchedData.length ) { $price.closest( '.product-loop' ).data( 'variation', matchedData[0]['variation_id'] ); $price.html( $( matchedData[0]['price_html'] ).html() ); $price.closest( '.product-loop' ).find( '.add_to_cart_button' ) .removeClass( 'product_type_variable' ) .addClass( 'product_type_simple' ); } else { $price.html( priceHtml ); $price.closest( '.product-loop' ).removeData( 'variation' ) .find( '.add_to_cart_button' ) .removeClass( 'product_type_simple' ) .addClass( 'product_type_variable' ); } } ) .on( 'click', '.product-loop.product-type-variable .add_to_cart_button', function( e ) { var $this = $( this ), $variations = $this.closest( '.product' ).find( '.product-variation-wrapper' ), attributes = $variations.data( 'product_attrs' ), $product = $this.closest( '.product-loop' ); if ( undefined != $product.data( 'variation' ) ) { let data = { action: "alpha_add_to_cart", product_id: $product.data( 'variation' ), quantity: 1 }; attributes.forEach( function( item ) { data[item] = $variations.data( item ); } ); $.ajax( { type: 'POST', dataType: 'json', url: alpha_vars.ajax_url, data: data, success: function( response ) { $( document.body ).trigger( 'added_to_cart', [response.fragments, response.cart_hash, $this] ); } } ); e.preventDefault(); } } ) .on( 'found_variation', '.variations_form', function( e, variation ) { var $product = $( e.currentTarget ).closest( '.product' ); // Display sale countdown of matched variation. var $counter = $product.find( '.countdown-variations' ); if ( $counter.length ) { if ( variation && variation.is_purchasable && variation.alpha_date_on_sale_to ) { var $countdown = $counter.find( '.countdown' ); if ( $countdown.data( 'until' ) != variation.alpha_date_on_sale_to && typeof theme.countdown == 'function' ) { theme.countdown( $countdown, { until: new Date( variation.alpha_date_on_sale_to ) } ); $countdown.data( 'until', variation.alpha_date_on_sale_to ); } $counter.slideDown(); } else { $counter.slideUp(); } } // Refresh price in sticky add to cart if ( $( '.product-sticky-content .price' ).length && typeof variation.price_html != 'undefined' ) { $( '.product-sticky-content .price' ).html( variation.price_html ); } } ) .on( 'reset_image', '.variations_form', function( e ) { var $product = $( e.currentTarget ).closest( '.product' ); $product.find( '.countdown-variations' ).slideUp(); // Refresh price in sticky add to cart if ( $( '.product-sticky-content .price' ).length ) { $( '.product-sticky-content .price' ).html( $product.find( 'p.price:not(.price-sticky)' ).html() ); } } ); }, /** * Initialize products quickview action * * @since 1.0 */ initProductsQuickview: function() { theme.$body.on( 'click', '.btn-quickview', function( e ) { e.preventDefault(); var $this = $( this ); var ajax_data = { action: 'alpha_quickview', product_id: $this.data( 'product' ) }; var quickviewType = alpha_vars.quickview_type || 'loading'; if ( quickviewType == 'zoom' && window.innerWidth < 768 ) { quickviewType = 'loading'; } if ( $this.closest( '.shop_table' ).length ) { theme.doLoading( $this, 'small' ); } function finishQuickView() { theme.createProductSingle( '.mfp-product .product-single' ); if ( $this.closest( '.shop_table' ).length ) { theme.endLoading( $this ); } theme.woocommerce.ratingTooltip( '.mfp-product .product-single' ); theme.$body.trigger( 'alpha_ajax_yith_wcwl_require' ); } function openQuickview( quickviewType ) { theme.popup( { type: 'ajax', mainClass: 'mfp-product mfp-fade' + ( quickviewType == 'offcanvas' ? ' mfp-offcanvas' : '' ), items: { src: alpha_vars.ajax_url }, ajax: { settings: { method: 'POST', data: ajax_data }, cursor: 'mfp-ajax-cur', // CSS class that will be added to body during the loading (adds "progress" cursor) tError: '
' + alpha_vars.texts.popup_error + '
' }, preloader: false, callbacks: { afterChange: function() { var skeletonTemplate; if ( alpha_vars.skeleton_screen ) { var extraClass = alpha_vars.quickview_thumbs == 'horizontal' ? '' : ' pg-vertical'; if ( quickviewType == 'offcanvas' ) { skeletonTemplate = '
';; } else { skeletonTemplate = '
'; } } else { skeletonTemplate = '
'; } this.container.html( '
' + skeletonTemplate + '
' ); this.contentContainer = this.container.children( '.mfp-content' ); this.preloader = false; }, beforeClose: function() { this.container.empty(); }, ajaxContentAdded: function() { var self = this; this.wrap.imagesLoaded( function() { finishQuickView(); } ); // Move close button out of product because of product's overflow. this.wrap.find( '.mfp-close' ).appendTo( this.content ); // Remove preloader setTimeout( function() { self.contentContainer.next( '.mfp-preloader' ).remove(); }, 300 ); } } } ); } // 1. Quickview / Preload skeleton screen for "loading", "offcanvas". if ( alpha_vars.skeleton_screen && quickviewType != 'zoom' ) { openQuickview( quickviewType ); } else if ( quickviewType == 'zoom' ) { // 2. Quickview / Zoomed Product var zoomLoadedData = ''; function zoomInit() { var instance = $.magnificPopup.instance; if ( instance.isOpen && instance.content && instance.wrap.hasClass( 'zoom-start2' ) && !instance.wrap.hasClass( 'zoom-finish' ) && zoomLoadedData ) { var i = 1; var timer = theme.requestInterval( function() { instance.wrap.addClass( 'zoom-start3' ); if ( instance.content ) { var $data = $( zoomLoadedData ); var $gallery = $data.find( '.woocommerce-product-gallery' ); var $summary = $data.find( '.summary' ); var $product = instance.content.find( '.product-single' ); $product.children( 'div:first-child' ).html( $gallery ); $product.find( '.entry-summary.summary' ).remove(); $product.attr( 'id', $data.attr( 'id' ) ); $product.attr( 'class', $data.attr( 'class' ) ); instance.content.css( 'clip-path', i < 30 ? 'inset(0 calc(' + ( ( 31 - i ) * 50 / 30 ) + '% - 20px) 0 0)' : 'none' ); if ( i >= 30 ) { theme.deleteTimeout( timer ); instance.wrap.addClass( 'zoom-finish' ); $product.children( 'div:last-child' ).append( $summary ); $( '.mfp-animated-image' ).remove(); theme.requestTimeout( function() { instance.wrap.addClass( 'zoom-loaded mfp-anim-finish' ); theme.endLoading( $product.children( 'div:last-child' ) ); finishQuickView(); }, 50 ); } ++i; } else { theme.deleteTimeout( timer ); } }, 16 ); } } var $image; if ( $this.hasClass( 'alpha-tb-quickview' ) ) { // post type builder $image = $this.parent().find( '.alpha-tb-featured-image img:first-child' ); } else if ( $this.parent( '.hotspot-product' ).length ) { $image = $this.parent().find( '.product-media img' ); } else if ( $this.closest( '.shop_table' ).length ) { $image = $this.closest( 'tr' ).find( '.product-thumbnail img' ); } else { $image = $this.closest( '.product' ).find( '.product-media img:first-child' ); } if ( !$image.length ) { openQuickview( 'loading' ); return; } var imageSrc = $this.data( 'mfp-src' ); $( '' ).imagesLoaded( function() { $this.data( 'magnificPoup' ) || $this .magnificPopup( { type: 'image', mainClass: 'mfp-product mfp-zoom mfp-anim', preloader: false, item: { src: imageSrc }, closeOnBgClick: false, zoom: { enabled: true, duration: 550, easing: 'cubic-bezier(.55,0,.1,1)', opener: function() { return $image; } }, callbacks: { beforeOpen: theme.defaults.popup.callbacks.beforeOpen, open: function() { var wrapper = '
'; if ( alpha_vars.quickview_thumbs != 'horizontal' && window.innerWidth >= 992 ) { this.content.addClass( 'vertical' ); } this.content.find( 'figcaption' ).remove(); if ( this.items[0] ) { var $wrap = this.items[0].img.wrap( wrapper ); if ( !this.items[0].el.closest( '.product' ).find( '.woocommerce-placeholder' ).length ) { $wrap.after( '
' ); } } var self = this; setTimeout( function() { self.bgOverlay.removeClass( 'mfp-ready' ); }, 16 ); setTimeout( function() { self.wrap.addClass( 'zoom-start' ); theme.requestFrame( function() { var $img = self.content.find( '.thumbs>img:first-child' ); var w = $img.length ? $img.width() : 0; var h = $img.length ? $img.height() : 0; var i = 0; self.bgOverlay.addClass( 'mfp-ready' ); var timer = theme.requestInterval( function() { if ( self.content ) { self.content.css( 'clip-path', alpha_vars.quickview_thumbs != 'horizontal' && window.innerWidth >= 992 ? 'inset(' + ( 30 - i ) + 'px calc(' + alpha_vars.quickview_percent + ' + ' + ( 10 - i ) + 'px) ' + ( 30 - i ) + 'px ' + ( ( 30 - i ) * ( 30 + w ) / 30 ) + 'px)' : 'inset(' + ( 30 - i ) + 'px calc(' + alpha_vars.quickview_percent + ' + ' + ( 10 - i ) + 'px) ' + ( ( 30 - i ) * ( 30 + h ) / 30 ) + 'px ' + ( 30 - i ) + 'px)' ); if ( i >= 30 ) { theme.deleteTimeout( timer ); self.wrap.addClass( 'zoom-start2' ); if ( !zoomLoadedData ) { theme.doLoading( self.content.find( '.product > div:first-child' ) ); } zoomInit(); } else { i += 3; } } else { theme.deleteTimeout( timer ); } }, 16 ); } ); }, 560 ); }, beforeClose: function() { $this.removeData( 'magnificPopup' ); $this.off( 'click.magnificPopup' ); $( '.mfp-animated-image' ).remove(); }, close: theme.defaults.popup.callbacks.close } } ); $this.magnificPopup( 'open' ); } ); // Get images loaded ajax content $.post( alpha_vars.ajax_url, ajax_data ) .done( function( data ) { $( data ).imagesLoaded( function() { zoomLoadedData = data; zoomInit(); } ); } ); } else { // 3. Quickview / Loading Icon Inner Product if ( $this.hasClass( 'alpha-tb-quickview' ) ) { theme.doLoading( $this.closest( '.product' ).find( '.alpha-tb-featured-image' ) ); } else { theme.doLoading( $this.closest( '.product' ).find( '.product-media' ) ); } // Get images loaded ajax content $.post( alpha_vars.ajax_url, ajax_data ) .done( function( data ) { $( data ).imagesLoaded( function() { theme.popup( { type: 'inline', mainClass: 'mfp-product mfp-fade ' + ( quickviewType == 'offcanvas' ? 'mfp-offcanvas' : 'mfp-anim' ), items: { src: data }, callbacks: { open: function() { var self = this; function finishLoad() { self.wrap.addClass( 'mfp-anim-finish' ); } if ( quickviewType == 'offcanvas' ) { setTimeout( finishLoad, 316 ); } else { theme.requestFrame( finishLoad ); } finishQuickView(); } } } ) if ( $this.hasClass( 'alpha-tb-quickview' ) ) { theme.endLoading( $this.closest( '.product' ).find( '.alpha-tb-featured-image' ) ); } else { theme.endLoading( $this.closest( '.product' ).find( '.product-media' ) ); } } ) } ); } } ); }, /** * Initialize products cart action * * @since 1.0 */ initProductsCartAction: function() { theme.$body // Before product is added to cart .on( 'click', '.add_to_cart_button:not(.product_type_variable)', function( e ) { $( '.minicart-icon' ).addClass( 'adding' ); theme.doLoading( e.currentTarget, 'small' ); } ) // After product is added to cart .on( 'added_to_cart', function( e, fragments, cart_hash, $thisbutton ) { var $product = $thisbutton.closest( '.product' ); if ( $thisbutton.closest( '.minipopup-area' ).length ) { $product = theme.$body.find( '.product.post-' + $thisbutton.attr( 'data-product_id' ) ); } // remove newly added "view cart" button. if ( typeof alpha_elementor != 'undefined' ) { // For elementor editor preview setTimeout( function() { $thisbutton.next( '.added_to_cart' ).remove(); } ); } else { $thisbutton.next( '.added_to_cart' ).remove(); } // if not product single, then open minipopup if ( !$product.hasClass( 'product-single' ) ) { var link, image, title, price, id; if ( $product.length ) { // inside product element link = $product.find( '.product-media .woocommerce-loop-product__link' ).attr( 'href' ); image = $product.find( '.product-media img:first-child, .alpha-tb-featured-image img:first-child' ).attr( 'src' ); title = $product.find( '.woocommerce-loop-product__title a' ).text(); price = $product.find( '.price' ).html(); id = $thisbutton.data( 'product_id' ); var $popup_product = $( '.minipopup-area' ).find( "#product-" + id ); } else { $product = $thisbutton.closest( '.compare-basic-info' ); link = $product.find( '.product-title' ).attr( 'href' ); image = $product.find( '.product-media img' ).attr( 'src' ); title = $product.closest( '.alpha-compare-table' ).find( '.compare-title .compare-value' ).eq( $thisbutton.closest( '.compare-value' ).index() - 1 ).find( '.product-title' ).html(); if ( title == undefined ) { title = $product.children( '.product-title' ).html(); } price = $product.closest( '.alpha-compare-table' ).find( '.compare-price .compare-value' ).eq( $thisbutton.closest( '.compare-value' ).index() - 1 ).html(); } if ( $popup_product && id == $popup_product.attr( 'data-product-id' ) ) { $popup_product.find( '.cart-count' ).html( parseInt( $popup_product.find( '.cart-count' ).html() ) + 1 ); } else { if ( $product.hasClass( 'alpha-tb-item' ) ) { // post type builder title = $product.data( 'title' ); link = $product.data( 'link' ); } theme.minipopup.open( { content: '
\
\
\
\
' } ); } } theme.quantityInput( '.qty' ); $( '.minicart-icon' ).removeClass( 'adding' ); } ) .on( 'added_to_cart ajax_request_not_sent.adding_to_cart', function( e, f, c, $thisbutton ) { if ( typeof $thisbutton !== 'undefined' ) { theme.endLoading( $thisbutton ); } } ) .on( 'wc_fragments_refreshed', function( e, f ) { theme.quantityInput( '.qty' ); setTimeout( function() { $( '.sticky-sidebar' ).trigger( 'recalc.pin' ); }, 400 ); } ) // Refresh cart table when cart item is removed .off( 'click', '.widget_shopping_cart .remove' ) .on( 'click', '.widget_shopping_cart .remove', function( e ) { e.preventDefault(); var $this = $( this ); var cart_id = $this.data( "cart_item_key" ); $.ajax( { type: 'POST', dataType: 'json', url: alpha_vars.ajax_url, data: { action: "alpha_cart_item_remove", nonce: alpha_vars.nonce, cart_id: cart_id }, success: function( response ) { var this_page = location.toString(), item_count = $( response.fragments['div.widget_shopping_cart_content'] ).find( '.mini_cart_item' ).length; this_page = this_page.replace( 'add-to-cart', 'added-to-cart' ); $( document.body ).trigger( 'wc_fragment_refresh' ); // Block widgets and fragments if ( item_count == 0 && ( $( 'body' ).hasClass( 'woocommerce-cart' ) || $( 'body' ).hasClass( 'woocommerce-checkout' ) ) ) { $( '.page-content' ).block(); } else { $( '.shop_table.cart, .shop_table.review-order, .updating, .cart_totals' ).block(); } // Unblock $( '.widget_shopping_cart, .updating' ).stop( true ).unblock(); // Cart page elements if ( item_count == 0 && ( $( 'body' ).hasClass( 'woocommerce-cart' ) || $( 'body' ).hasClass( 'woocommerce-checkout' ) ) ) { $( '.page-content' ).load( this_page + ' .page-content:eq(0) > *', function() { $( '.page-content' ).unblock(); } ); } else { $( '.shop_table.cart' ).load( this_page + ' .shop_table.cart:eq(0) > *', function() { $( '.shop_table.cart' ).unblock(); theme.quantityInput( '.shop_table .qty' ); } ); $( '.cart_totals' ).load( this_page + ' .cart_totals:eq(0) > *', function() { $( '.cart_totals' ).unblock(); } ); // Checkout page elements $( '.shop_table.review-order' ).load( this_page + ' .shop_table.review-order:eq(0) > *', function() { $( '.shop_table.review-order' ).unblock(); } ); } } } ); return false; } ) // Removing cart item from minicart .on( 'click', '.remove_from_cart_button', function( e ) { theme.doLoading( $( this ).closest( '.mini_cart_item' ), 'small' ); } ); }, /** * Initialize products wishlist action * * @since 1.0 */ initProductsWishlistAction: function() { function updateMiniWishList() { var $minilist = $( '.mini-basket-box .widget_wishlist_content' ); if ( !$minilist.length ) { return; } if ( !$minilist.find( '.d-loading' ).length ) { theme.doLoading( $minilist, 'small' ); } $.ajax( { url: alpha_vars.ajax_url, data: { action: 'alpha_update_mini_wishlist' }, type: 'post', success: function( data ) { if ( $minilist.closest( '.mini-basket-box' ).find( '.wish-count' ).length ) { $minilist.closest( '.mini-basket-box' ).find( '.wish-count' ).text( $( data ).find( '.wish-count' ).text() ); } $minilist.html( $( data ).find( '.widget_wishlist_content' ).html() ); } } ); }; theme.$body // Add item to wishlist .on( 'click', '.add_to_wishlist, .yith-wcwl-add-button .delete_item', function( e ) { theme.doLoading( $( e.currentTarget ).closest( '.yith-wcwl-add-to-wishlist' ), 'small' ); } ) .on( 'added_to_wishlist', function() { $( '.wish-count' ).each( function() { $( this ).html( parseInt( $( this ).html() ) + 1 ); } ); updateMiniWishList(); } ) .on( 'removed_from_wishlist', function() { $( '.wish-count' ).each( function() { $( this ).html( parseInt( $( this ).html() ) - 1 ); } ); updateMiniWishList(); } ) .on( 'added_to_cart', function( e, fragments, cart_hash, $button ) { if ( $button.closest( '#yith-wcwl-form' ).length ) { $( '.wish-count' ).each( function() { $( this ).html( parseInt( $( this ).html() ) - 1 ); } ) }; updateMiniWishList(); } ) .on( 'alpha_ajax_yith_wcwl_require', function() { // Ajax load at the first by Yith Wishlist Plugin if ( ( 'undefined' !== typeof yith_wcwl_l10n ) && yith_wcwl_l10n.enable_ajax_loading ) { if ( $( '.wishlist-fragment' ).length ) { var options = {}, $product = $( '.wishlist-fragment' ), id = $product.attr( 'class' ).split( ' ' ).filter( ( val ) => { return val.length && val !== 'exists'; } ).join( yith_wcwl_l10n.fragments_index_glue ); options[id] = $product.data( 'fragment-options' ); if ( !options ) { return; } var data = { action: yith_wcwl_l10n.actions.load_fragments, context: 'frontend', fragments: options }; if ( typeof yith_wcwl_l10n.nonce != 'undefined' ) { data.nonce = yith_wcwl_l10n.nonce.load_fragments_nonce; } $.ajax( { data: data, method: 'post', success: function( data ) { if ( typeof data.fragments !== 'undefined' ) { $.each( data.fragments, function( i, v ) { var itemSelector = '.' + i.split( yith_wcwl_l10n.fragments_index_glue ).filter( ( val ) => { return val.length && val !== 'exists' && val !== 'with-count'; } ).join( '.' ), toReplace = $( itemSelector ); // find replace tempalte var replaceWith = $( v ).filter( itemSelector ); if ( !replaceWith.length ) { replaceWith = $( v ).find( itemSelector ); } if ( toReplace.length && replaceWith.length ) { toReplace.replaceWith( replaceWith ); } } ); } }, url: yith_wcwl_l10n.ajax_url } ); } } } ) .on( 'click', '.wishlist-dropdown .wishlist-item .remove_from_wishlist', function( e ) { e.preventDefault(); var id = $( this ).attr( 'data-product_id' ), $table = $( '.wishlist_table #yith-wcwl-row-' + id + ' .remove_from_wishlist' ); theme.doLoading( $( this ).closest( '.wishlist-item' ), 'small' ); if ( $table.length ) { $table.trigger( 'click' ); } else { $.ajax( { url: yith_wcwl_l10n.ajax_url, data: { action: yith_wcwl_l10n.actions.remove_from_wishlist_action, nonce: yith_wcwl_l10n.nonce.remove_from_wishlist_nonce, remove_from_wishlist: id, from: 'theme' }, method: 'post', success: function( data ) { theme.$body.trigger( 'removed_from_wishlist' ); } } ); } } ) if ( alpha_vars.skeleton_screen ) { theme.$body.trigger( 'yith_wcwl_reload_fragments' ); } }, /** * Initialize products hover in double touch * * @since 1.0 */ initProductsHover: function() { if ( !$( 'html' ).hasClass( 'touchable' ) || !alpha_vars.prod_open_click_mob ) { return; } var isTouchFired = false; function _clickProduct( e ) { if ( isTouchFired && !$( this ).hasClass( 'hover-active' ) ) { e.preventDefault(); $( '.hover-active' ).removeClass( 'hover-active' ); $( this ).addClass( 'hover-active' ); } } function _clickGlobal( e ) { isTouchFired = e.type == 'touchstart'; $( e.target ).closest( '.hover-active' ).length || $( '.hover-active' ).removeClass( 'hover-active' ); } theme.$body.on( 'click', '.product-wrap .product', _clickProduct ); $( document ).on( 'click', _clickGlobal ); document.addEventListener( 'touchstart', _clickGlobal, { passive: true } ); }, /** * Initialize rating tooltips * Find all .star-rating from selector, and initialize tooltip. * * @since 1.0 * @param {HTMLElement|jQuery|string} selector * @return {void} */ ratingTooltip: function( selector ) { var ratingHandler = function() { var res = this.firstElementChild.getBoundingClientRect().width / this.getBoundingClientRect().width * 5; this.lastElementChild.innerText = res ? res.toFixed( 2 ) : res; this.classList.add( 'rating-loaded' ); } theme.$( selector, '.star-rating' ).each( function() { if ( this.lastElementChild && !this.lastElementChild.classList.contains( 'tooltiptext' ) ) { var span = document.createElement( 'span' ); span.classList.add( 'tooltiptext' ); span.classList.add( 'tooltip-top' ); this.appendChild( span ); this.addEventListener( 'mouseover', ratingHandler ); this.addEventListener( 'touchstart', ratingHandler, { passive: true } ); } } ); }, /** * Remove alerts automatically * * @since 1.0 * @return {void} */ initAlertAction: function() { this.removerId && clearTimeout( this.removerId ); this.removerId = setTimeout( function() { $( '.woocommerce-page .main-content .alert:not(.woocommerce-info) .btn-close' ).not( ':hidden' ).trigger( 'click' ); }, 10000 ); }, /** * Initialize reset variation link * * @since 1.0 * @return {void} */ initResetVariation: function() { theme.$body.on( 'check_variations', '.variations_form', function() { var $reset = $( theme.byClass( 'reset_variations', this ) ); $reset.css( 'visibility' ) == 'hidden' ? $reset.hide() : $reset.show(); } ); } } /** * Create product gallery object * * @class ProductGallery * @since 1.0 * @param {string|jQuery} selector * @return {void} */ theme.createProductGallery = ( function() { function ProductGallery( $el ) { return this.init( $el ); } var firstScrollTopOnSticky = true; function setupThumbs( self ) { self.$thumbs = self.$wc_gallery.find( '.product-thumbs' ); self.$thumbsDots = self.$thumbs.children(); self.isVertical = self.$thumbs.parent().parent().hasClass( 'pg-vertical' ); self.$thumbsWrap = self.$thumbs.parent(); // # setup thumbs slider theme.slider( self.$thumbs, {}, true ); // # refresh thumbs self.isVertical && window.addEventListener( 'resize', function() { theme.requestTimeout( function() { self.$thumbs.data( 'slider' ).update(); }, 100 ) }, { passive: true } ); } // Public Properties ProductGallery.prototype.init = function( $wc_gallery ) { var self = this; // If woocommmerce product gallery is undefined, create it typeof $wc_gallery.data( 'product_gallery' ) == 'undefined' && $wc_gallery.wc_product_gallery(); this.$wc_gallery = $wc_gallery; this.wc_gallery = $wc_gallery.data( 'product_gallery' ); // Remove woocommerce zoom triggers $( '.woocommerce-product-gallery__trigger' ).remove(); // Add full image trigger, and init zoom this.$slider = $wc_gallery.find( '.product-single-carousel' ); if ( this.$slider.length ) { this.initThumbs(); // init thumbs together for single slider } else { this.$slider = this.$wc_gallery.find( '.product-gallery-carousel' ); if ( this.$slider.length ) { // gallery slider this.$slider.on( 'initialized.slider', this.initZoom.bind( this ) ); } else { // other types this.initZoom(); } } // Prevent going to image link $wc_gallery .off( 'click', '.woocommerce-product-gallery__image a' ) .on( 'click', theme.preventDefault ); if ( !$wc_gallery.closest( '.product-quickview' ).length && !$wc_gallery.closest( '.product-widget' ).length ) { // If only single product page if ( !document.body.classList.contains( 'single-' + alpha_vars.theme + '_template' ) ) $wc_gallery.on( 'click', '.woocommerce-product-gallery__image a', this.openImageFull.bind( this ) ); // Initialize sticky thumbs type. if ( $wc_gallery.find( '.product-sticky-thumbs' ).length ) { $wc_gallery.on( 'click', '.product-sticky-thumbs img', this.clickStickyThumbnail.bind( this ) ); window.addEventListener( 'scroll', this.scrollStickyThumbnail.bind( this ), { passive: true } ); } } // init slider after load, such as quickview if ( 'complete' === theme.status ) { self.$slider && self.$slider.length && theme.slider( self.$slider ); } theme.$window.on( 'alpha_complete', function() { setTimeout( self.initAfterLazyload.bind( self ), 200 ); } ) } ProductGallery.prototype.initAfterLazyload = function() { this.currentPostImageSrc = this.$wc_gallery.find( '.wp-post-image' ).attr( 'src' ); } /** * Intialize thumbs in vertical thumbs type * * @since 1.0 */ ProductGallery.prototype.initThumbs = function() { var self = this; setupThumbs( self ); // init thumbs this.$slider .on( 'initialized.slider', function( e ) { // init thumbnails self.initZoom(); } ) } ProductGallery.prototype.openImageFull = function( e ) { if ( wc_single_product_params.photoswipe_options ) { e.preventDefault(); // Carousel Type var carousel = this.$wc_gallery.find( '.product-single-carousel' ).data( 'slider' ); if ( carousel ) { wc_single_product_params.photoswipe_options.index = carousel.activeIndex; } if ( this.wc_gallery.$images.filter( '.yith_featured_content' ).length ) { wc_single_product_params.photoswipe_options.index = carousel ? carousel.activeIndex - 1 : $( e.currentTarget ).closest( '.woocommerce-product-gallery__image' ).index() - 1; } this.wc_gallery.openPhotoswipe( e ); // to disable elementor's light box. e.stopPropagation(); } } /** * Event handler triggered when sticky thumbnail is clicked * * @since 1.0 * @param {Event} e Mouse click event */ ProductGallery.prototype.clickStickyThumbnail = function( e ) { var self = this; var $thumb = $( e.currentTarget ); $thumb.addClass( 'active' ).siblings( '.active' ).removeClass( 'active' ); this.isStickyScrolling = true; theme.scrollTo( this.$wc_gallery.find( '.product-sticky-images > :nth-child(' + ( $thumb.index() + 1 ) + ')' ) ); setTimeout( function() { self.isStickyScrolling = false; }, 300 ); } /** * Event handler triggered while scrolling on sticky thumbnails * * @since 1.0 */ ProductGallery.prototype.scrollStickyThumbnail = function() { var self = this; if ( this.isStickyScrolling ) { return; } this.$wc_gallery.find( '.product-sticky-images img:not(.zoomImg)' ).each( function() { if ( theme.isOnScreen( this ) ) { self.$wc_gallery.find( '.product-sticky-thumbs-inner > :nth-child(' + ( $( this ).closest( '.woocommerce-product-gallery__image' ).index() + 1 ) + ')' ) .addClass( 'active' ).siblings().removeClass( 'active' ); return false; } } ); } ProductGallery.prototype.initZoomImage = function( zoomTarget ) { if ( alpha_vars.single_product.zoom_enabled ) { var width = zoomTarget.children( 'img' ).attr( 'data-large_image_width' ), // zoom option zoom_options = $.extend( { touch: false }, alpha_vars.single_product.zoom_options ); if ( 'ontouchstart' in document.documentElement ) { zoom_options.on = 'click'; } zoomTarget.trigger( 'zoom.destroy' ).children( '.zoomImg' ).remove(); // zoom if ( 'undefined' != typeof width && zoomTarget.width() < width ) { zoomTarget.zoom( zoom_options ); // show zoom on hover // setTimeout(function () { zoomTarget.find( ':hover' ).length && zoomTarget.trigger( 'mouseover' ); // }, 100); } } } ProductGallery.prototype.changePostImage = function( variation ) { var $image = this.$wc_gallery.find( '.wp-post-image' ); // Has post image been changed? if ( $image.hasClass( 'd-lazyload' ) || this.currentPostImageSrc == $image.attr( 'src' ) ) { return; } else { this.currentPostImageSrc = $image.attr( 'src' ); } // Add found class to form, change nav thumbnail image on found variation var $postThumbImage = this.$wc_gallery.find( '.product-thumbs img' ).eq( 0 ).add( '.product-sticky-content .wp-post-image' ), $gallery = this.$wc_gallery.find( '.product-gallery' ); if ( $postThumbImage.length ) { if ( typeof variation != 'undefined' ) { if ( 'reset' == variation ) { $postThumbImage.wc_reset_variation_attr( 'src' ); $postThumbImage.wc_reset_variation_attr( 'srcset' ); $postThumbImage.wc_reset_variation_attr( 'sizes' ); $postThumbImage.wc_reset_variation_attr( 'alt' ); } else { $postThumbImage.wc_set_variation_attr( 'src', variation.image.gallery_thumbnail_src ); variation.image.alt && $postThumbImage.wc_set_variation_attr( 'alt', variation.image.alt ); variation.image.srcset && $postThumbImage.wc_set_variation_attr( 'srcset', variation.image.srcset ); variation.image.sizes && $postThumbImage.wc_set_variation_attr( 'sizes', variation.image.sizes ); } } else { $postThumbImage.wc_set_variation_attr( 'src', this.currentPostImageSrc ); $image.attr( 'srcset' ) && $postThumbImage.wc_set_variation_attr( 'srcset', $image.attr( 'srcset' ) ); $image.attr( 'sizes' ) && $postThumbImage.wc_set_variation_attr( 'sizes', $image.attr( 'sizes' ) ); $image.attr( 'alt' ) && $postThumbImage.wc_set_variation_attr( 'alt', $image.attr( 'alt' ) ); } } // Refresh zoom this.initZoomImage( $image.parent() ); // Refresh if carousel layout var carousel = $gallery.children( '.product-single-carousel,.product-gallery-carousel' ).data( 'slider' ); carousel && ( carousel.update() ); if ( !firstScrollTopOnSticky ) { // If sticky, go to top; if ( this.$wc_gallery.closest( '.product' ).find( '.sticky-sidebar .summary' ).length ) { theme.scrollTo( this.$wc_gallery, 400 ); } } firstScrollTopOnSticky = false; } ProductGallery.prototype.initZoom = function() { if ( alpha_vars.single_product.zoom_enabled ) { var self = this; // if not quickview, widget if ( !this.$wc_gallery.closest( '.product-quickview' ).length && !this.$wc_gallery.closest( '.product-widget' ).length ) { var buttons = ''; if ( !this.$wc_gallery.hasClass( 'woocommerce-product-gallery--without-images' ) ) { buttons = ''; } buttons += ( this.$wc_gallery.data( 'buttons' ) || '' ); // show image full toggler if ( this.$slider.length && this.$slider.hasClass( 'product-single-carousel' ) ) { // if default or horizontal type, show only one if ( !this.$slider.find( '.product-gallery-btn' ).length ) { this.$slider.after( buttons ); } } else { // else other types this.$wc_gallery.find( '.woocommerce-product-gallery__image > a' ).each( function() { if ( !$( this ).parent().find( '.product-gallery-btn' ).length ) { $( this ).after( buttons ); } } ); } } // zoom images this.$wc_gallery.find( '.woocommerce-product-gallery__image > a' ).each( function() { self.initZoomImage( $( this ) ); } ); } } return function( selector ) { if ( $.fn.wc_product_gallery ) { theme.$( selector ).each( function() { var $this = $( this ); $this.data( 'alpha_product_gallery', new ProductGallery( $this ) ); } ); } } } )(); /** * Create product single object * * @class ProductSingle * @since 1.0 * @param {string|jQuery} selector * @return {void} */ theme.createProductSingle = ( function() { function ProductSingle( $el ) { return this.init( $el ); } // Public Properties ProductSingle.prototype.init = function( $el ) { this.$product = $el; // gallery $el.find( '.woocommerce-product-gallery' ).each( function() { theme.createProductGallery( $( this ) ); } ) // variation $( '.reset_variations' ).hide().removeClass( 'd-none' ); // after load, such as quickview if ( 'complete' === theme.status ) { // variation form if ( $.fn.wc_variation_form && typeof wc_add_to_cart_variation_params !== 'undefined' ) { this.$product.find( '.variations_form' ).wc_variation_form(); } // quantity input theme.quantityInput( this.$product.find( '.qty' ) ); // countdown if ( typeof theme.countdown == 'function' ) { theme.countdown( this.$product.find( '.product-countdown' ) ); } } else { // sticky add to cart cart if ( !this.$product.hasClass( 'product-widget' ) || this.$product.hasClass( 'product-quickview' ) ) { this.stickyCartForm( this.$product.find( '.product-sticky-content' ) ); } } } /** * Make cart form as sticky * * @since 1.0 * @param {string|jQuery} selector * @return {void} */ ProductSingle.prototype.stickyCartForm = function( selector ) { var $stickyForm = theme.$( selector ); if ( $stickyForm.length != 1 ) { return; } var $product = $stickyForm.closest( '.product' ); var sticky = $stickyForm.data( 'sticky-content' ); if ( sticky ) { /** * Register getTop function for sticky "add to cart" form, that runs above 768px. * * @since 1.0 */ sticky.getTop = function() { var $parent; if ( $stickyForm.closest( '.sticky-sidebar' ).length ) { $parent = $product.find( '.woocommerce-product-gallery' ); } else { $parent = $stickyForm.closest( 'form.cart' ); // if ( $parent.hasClass( 'elementor' ) ) { // $parent = $stickyForm.closest( '.cart' ); // } } return $parent.offset().top + $parent.height(); } sticky.onFixed = function() { theme.$body.addClass( 'addtocart-fixed' ); } sticky.onUnfixed = function() { theme.$body.removeClass( 'addtocart-fixed' ); } } // Fix top in mobile, fix bottom otherwise function _changeFixPos() { theme.requestTimeout( function() { $stickyForm.removeClass( 'fix-top fix-bottom' ).addClass( window.innerWidth < 768 ? 'fix-top' : 'fix-bottom' ); }, 50 ); } theme.$window.on( 'sticky_refresh_size.alpha', _changeFixPos ); _changeFixPos(); } return function( selector ) { theme.$( selector ).each( function() { var $this = $( this ); $this.data( 'alpha_product_single', new ProductSingle( $this ) ); } ); } } )(); /** * Create quantity input object * * @class QuantityInput * @since 1.0 * @param {string} selector * @return {void} */ theme.quantityInput = ( function() { function QuantityInput( $el ) { return this.init( $el ); } QuantityInput.min = 1; QuantityInput.max = 1000000; QuantityInput.prototype.init = function( $el ) { var self = this; self.$minus = false; self.$plus = false; self.$value = false; self.value = false; // call Events self.startIncrease = self.startIncrease.bind( self ); self.startDecrease = self.startDecrease.bind( self ); self.stop = self.stop.bind( self ); // Variables self.min = parseInt( $el.attr( 'min' ) ); self.max = parseInt( $el.attr( 'max' ) ); self.min || ( $el.attr( 'min', self.min = QuantityInput.min ) ) self.max || ( $el.attr( 'max', self.max = QuantityInput.max ) ) // Add DOM elements and event listeners self.$value = $el.val( self.value = Math.max( parseInt( $el.val() ), 1 ) ); self.$minus = $el.parent().find( '.quantity-minus' ).on( 'click', theme.preventDefault ); self.$plus = $el.parent().find( '.quantity-plus' ).on( 'click', theme.preventDefault ); if ( 'ontouchstart' in document ) { self.$minus.get( 0 ).addEventListener( 'touchstart', self.startDecrease, { passive: true } ) self.$plus.get( 0 ).addEventListener( 'touchstart', self.startIncrease, { passive: true } ) } else { self.$minus.on( 'mousedown', self.startDecrease ) self.$plus.on( 'mousedown', self.startIncrease ) } theme.$body.on( 'mouseup', self.stop ) .on( 'touchend', self.stop ); } QuantityInput.prototype.startIncrease = function( e ) { var self = this; self.value = self.$value.val(); self.value < self.max && ( self.$value.val( ++self.value ), self.$value.trigger( 'change' ) ); self.increaseTimer = theme.requestTimeout( function() { self.speed = 1; self.increaseTimer = theme.requestInterval( function() { self.$value.val( self.value = Math.min( self.value + Math.floor( self.speed *= 1.05 ), self.max ) ); }, 50 ); }, 400 ); } QuantityInput.prototype.stop = function( e ) { ( this.increaseTimer || this.decreaseTimer ) && this.$value.trigger( 'change' ); this.increaseTimer && ( theme.deleteTimeout( this.increaseTimer ), this.increaseTimer = 0 ); this.decreaseTimer && ( theme.deleteTimeout( this.decreaseTimer ), this.decreaseTimer = 0 ); } QuantityInput.prototype.startDecrease = function( e ) { var self = this; self.value = self.$value.val(); self.value > self.min && ( self.$value.val( --self.value ), self.$value.trigger( 'change' ) ); self.decreaseTimer = theme.requestTimeout( function() { self.speed = 1; self.decreaseTimer = theme.requestInterval( function() { self.$value.val( self.value = Math.max( self.value - Math.floor( self.speed *= 1.05 ), self.min ) ); }, 50 ); }, 400 ); } return function( selector ) { theme.$( selector ).each( function() { var $this = $( this ); // if not initialized $this.data( 'quantityinput' ) || $this.data( 'quantityinput', new QuantityInput( $this ) ); } ); } } )(); $( window ).on( 'alpha_complete', function() { theme.woocommerce.init(); theme.quantityInput( '.qty' ); } ); } )( window.jQuery );