HEX
Server: Apache/2.4.52 (Ubuntu)
System: Linux spn-python 5.15.0-89-generic #99-Ubuntu SMP Mon Oct 30 20:42:41 UTC 2023 x86_64
User: arjun (1000)
PHP: 8.1.2-1ubuntu2.20
Disabled: NONE
Upload Files
File: /var/www/html/bwcdev/wp-content/themes/salient/js/nectar-single-product.js
/**
 * Salient single WooCommerce product script file.
 *
 * @package Salient
 * @author ThemeNectar
 */
/* global define */
/* global module */
/* global wc_single_product_params */

(function ($) {

    'use strict';

    var dw, dh, rw, rh, lx, ly;

    var defaults = {

        // The text to display within the notice box while loading the zoom image.
        loadingNotice: 'Loading image',

        // The text to display within the notice box if an error occurs loading the zoom image.
        errorNotice: 'The image could not be loaded',

        // The time (in milliseconds) to display the error notice.
        errorDuration: 2500,

        // Prevent clicks on the zoom image link.
        preventClicks: true,

        // Callback function to execute when the flyout is displayed.
        onShow: undefined,

        // Callback function to execute when the flyout is removed.
        onHide: undefined

    };

    /**
     * EasyZoom
     * @constructor
     * @param {Object} target
     * @param {Object} options
     */
    function EasyZoom(target, options) {
        this.$target = $(target);
        this.opts = $.extend({}, defaults, options);

        if (this.isOpen === undefined) {
            this._init();
        }

        return this;
    }

    /**
     * Init
     * @private
     */
    EasyZoom.prototype._init = function() {
        var self = this;

        this.$link   = this.$target.find('a');
        this.$image  = this.$target.find('img');

        this.$flyout = $('<div class="easyzoom-flyout" />');
        this.$notice = $('<div class="easyzoom-notice" />');

        this.$target
            .on('mouseenter.easyzoom touchstart.easyzoom', function(e) {
                self.isMouseOver = true;

                if (!e.originalEvent.touches || e.originalEvent.touches.length === 1) {
                    e.preventDefault();
                    self.show(e, true);
                }
            })
            .on('mousemove.easyzoom touchmove.easyzoom', function(e) {
                if (self.isOpen) {
                    e.preventDefault();
                    self._move(e);
                }
            })
            .on('mouseleave.easyzoom touchend.easyzoom', function() {
                self.isMouseOver = false;

                if (self.isOpen) {
                    self.hide();
                }
            });

        if (this.opts.preventClicks) {
            this.$target.on('click.easyzoom', 'a', function(e) {
                e.preventDefault();
            });
        }
    };

    /**
     * Show
     * @param {MouseEvent|TouchEvent} e
     * @param {Boolean} testMouseOver
     */
    EasyZoom.prototype.show = function(e, testMouseOver) {
        var w1, h1, w2, h2;
        var self = this;

        if (! this.isReady) {
            this._load(this.$link.attr('href'), function() {
                if (self.isMouseOver || !testMouseOver) {
                    self.show(e);
                }
            });

            return;
        }

        this.$target.append(this.$flyout);

        w1 = this.$target.width();
        h1 = this.$target.height();

        w2 = this.$flyout.width();
        h2 = this.$flyout.height();

        dw = this.$zoom.width() - w2;
        dh = this.$zoom.height() - h2;

        rw = dw / w1;
        rh = dh / h1;

        this.isOpen = true;

        if (this.opts.onShow) {
            this.opts.onShow.call(this);
        }

        if (e) {
            this._move(e);
        }
    };

    /**
     * Load
     * @private
     * @param {String} href
     * @param {Function} callback
     */
    EasyZoom.prototype._load = function(href, callback) {
        var zoom = new Image();

        this.$target.addClass('is-loading').append(this.$notice.text(this.opts.loadingNotice));

        this.$zoom = $(zoom);

        zoom.onerror = $.proxy(function() {
            var self = this;

            this.$notice.text(this.opts.errorNotice);
            this.$target.removeClass('is-loading').addClass('is-error');

            this.detachNotice = setTimeout(function() {
                self.$notice.detach();
                self.detachNotice = null;
            }, this.opts.errorDuration);
        }, this);

        zoom.onload = $.proxy(function() {

            // IE may fire a load event even on error so check the image has dimensions
            if (!zoom.width) {
                return;
            }

            this.isReady = true;

            this.$notice.detach();
            this.$flyout.html(this.$zoom);
            this.$target.removeClass('is-loading').addClass('is-ready');

            callback();
        }, this);

        zoom.style.position = 'absolute';
        zoom.src = href;
    };

    /**
     * Move
     * @private
     * @param {Event} e
     */
    EasyZoom.prototype._move = function(e) {

        if (e.type.indexOf('touch') === 0) {
            var touchlist = e.touches || e.originalEvent.touches;
            lx = touchlist[0].pageX;
            ly = touchlist[0].pageY;
        }
        else {
            lx = e.pageX || lx;
            ly = e.pageY || ly;
        }

        var offset  = this.$target.offset();
        var pt = ly - offset.top;
        var pl = lx - offset.left;
        var xt = Math.ceil(pt * rh);
        var xl = Math.ceil(pl * rw);

        // Close if outside
        if (xl < 0 || xt < 0 || xl > dw || xt > dh) {
            this.hide();
        }
        else {
            this.$zoom.css({
                top:  '' + (xt * -1) + 'px',
                left: '' + (xl * -1) + 'px'
            });
        }

    };

    /**
     * Hide
     */
    EasyZoom.prototype.hide = function() {
        if (this.isOpen) {
            this.$flyout.detach();
            this.isOpen = false;

            if (this.opts.onHide) {
                this.opts.onHide.call(this);
            }
        }
    };

    /**
     * Swap
     * @param {String} standardSrc
     * @param {String} zoomHref
     * @param {String|Array} srcsetStringOrArray (Optional)
     */
    EasyZoom.prototype.swap = function(standardSrc, zoomHref, srcsetStringOrArray) {
        this.hide();
        this.isReady = false;

        if (this.detachNotice) {
            clearTimeout(this.detachNotice);
        }

        if (this.$notice.parent().length) {
            this.$notice.detach();
        }

        if ($.isArray(srcsetStringOrArray)) {
            srcsetStringOrArray = srcsetStringOrArray.join();
        }

        this.$target.removeClass('is-loading is-ready is-error');
        this.$image.attr({
            src: standardSrc,
            srcset: srcsetStringOrArray
        });
        this.$link.attr('href', zoomHref);
    };

    /**
     * Teardown
     */
    EasyZoom.prototype.teardown = function() {
        this.hide();

        this.$target.removeClass('is-loading is-ready is-error').off('.easyzoom');

        if (this.detachNotice) {
            clearTimeout(this.detachNotice);
        }

        delete this.$link;
        delete this.$zoom;
        delete this.$image;
        delete this.$notice;
        delete this.$flyout;

        delete this.isOpen;
        delete this.isReady;
    };

    // jQuery plugin wrapper
    $.fn.easyZoom = function(options) {
        return this.each(function() {
            var api = $.data(this, 'easyZoom');

            if (!api) {
                $.data(this, 'easyZoom', new EasyZoom(this, options));
            }
            else if (api.isOpen === undefined) {
                api._init();
            }
        });
    };

    // AMD and CommonJS module compatibility
    if (typeof define === 'function' && define.amd){
        define(function() {
            return EasyZoom;
        });
    }
    else if (typeof module !== 'undefined' && module.exports) {
        module.exports = EasyZoom;
    }

})(jQuery);




jQuery(document).ready(function($){
  
  'use strict';
  
  //init easyZoom	
  if(!$('body').hasClass('mobile') && !$().zoom ){
    var $easyzoom = $(".easyzoom").easyZoom({
      preventClicks: true,
      loadingNotice: ' ',
      errorNotice: ' '
    });
    
    if($('.easyzoom').length > 0) {
      var easyzoom_api = $easyzoom.data('easyZoom');
      
      $("table.variations").on('change', 'select', function() {
        easyzoom_api.teardown();
        easyzoom_api._init();
      });
    }
  }
  
  
  
  /*helper function to scroll the page in an animated manner*/
  function nectar_scrollToY(scrollTargetY, speed, easing) {
    
    var scrollY = window.scrollY || document.documentElement.scrollTop,
    scrollTargetY = scrollTargetY || 0,
    speed = speed || 2000,
    easing = easing || 'easeOutSine',
    currentTime = 0;
    
    var time = Math.max(.1, Math.min(Math.abs(scrollY - scrollTargetY) / speed, .8));
    
    
    var easingEquations = {
      easeInOutQuint: function (pos) {
        if ((pos /= 0.5) < 1) {
          return 0.5 * Math.pow(pos, 5);
        }
        return 0.5 * (Math.pow((pos - 2), 5) + 2);
      }
    };
    
    
    function tick() {
      currentTime += 1 / 60;
      
      var p = currentTime / time;
      var t = easingEquations[easing](p);
      
      if (p < 1) {
        requestAnimationFrame(tick);
        
        window.scrollTo(0, scrollY + ((scrollTargetY - scrollY) * t));
      } else {
        window.scrollTo(0, scrollTargetY);
      }
    }
    
    tick();
  }  
  
  
  
  function initZoomForTarget( zoomTarget ) {
    
    
    var galleryWidth = $('.woocommerce-product-gallery').width(),
    zoomEnabled  = false;
    
    $( zoomTarget ).each( function( index, target ) {
      var image = zoomTarget.find( 'img' );
      if ( image.data( 'large_image_width' ) > galleryWidth ) {
        zoomEnabled = true;
        return false;
      }
    } );
    
    // But only zoom if the img is larger than its container.
    if ( zoomEnabled ) {
      var zoom_options = $.extend( {
        touch: false
      }, wc_single_product_params.zoom_options );
      
      if ( 'ontouchstart' in document.documentElement ) {
        if($('[data-gallery-style="left_thumb_sticky"]').length > 0 && $(window).width() > 1000) {
          //skip processing.
        } else {
          zoom_options.on = 'click';
        }
      }
      
      zoomTarget.trigger( 'zoom.destroy' );
      zoomTarget.zoom( zoom_options );
    }
  }
  
  
  var $mainProdSlider = false;
  var $thumbProdSlider = false;
  
  function nectarWooProdSliderInit() {
    
    //init flickity		
    $mainProdSlider = $('.product div.images .flickity.product-slider .slider').flickity({
      draggable: true,
      imagesLoaded: true,
      prevNextButtons: false,
      pageDots: false,
      resize: true,
      adaptiveHeight: true,
      
      on: {
        change: function( index ) {
          if($().zoom) {
            initZoomForTarget(this.$element.find('.flickity-slider > .slide:eq('+index+')'));
          }
          this.$element.find('.flickity-slider > .slide').removeClass('flex-active-slide');
          this.$element.find('.flickity-slider > .slide:eq('+index+')').addClass('flex-active-slide');
        }
      }
      
    });
    
    $thumbProdSlider = $('.product div .flickity.product-thumbs .slider').flickity({
      asNavFor: '.images .flickity.product-slider .slider',
      contain: true,
      resize: true,
      groupCells: true,
      adaptiveHeight: true,
      imagesLoaded: true,
      prevNextButtons: true,
      cellAlign: 'left',
      pageDots: false
    });
    
  }
  
  
  function nectarWooProdSliderDestroy() {
    $mainProdSlider.flickity('destroy');
    $thumbProdSlider.flickity('destroy');
  } 
  
  
  function leftAlignedRelationsInit() {
    //left aligned - thumbnail relation
    $('[data-gallery-style="left_thumb_sticky"] .flickity.product-slider .slide').each(function(i){
      i = i + 1;
      $(this).find('.woocommerce-product-gallery__image').attr('id','nectar_woo_gallery_slide_'+ i);
      
      //zoom
      initZoomForTarget($(this));
    });
    
    $('[data-gallery-style="left_thumb_sticky"] .flickity.product-thumbs .thumb').each(function(i){
      i = i + 1;
      $(this).find('.thumb-inner').wrapInner('<a class="skip-hash" href="#nectar_woo_gallery_slide_'+ i +'" />');
      $(this).find('.thumb-inner a').on('click',function(e){ e.preventDefault(); });
    });
    
    
    //first thumb active
    if($('.product[data-gallery-style="left_thumb_sticky"] .product-thumbs .thumb-inner > a.active').length == 0) {
      $('.product[data-gallery-style="left_thumb_sticky"] .product-thumbs .thumb:first-child .thumb-inner > a').addClass('active');
    }
    
  }
  
  function leftAlignedRelationsDestroy() {
    //left aligned - thumbnail relation
    $('[data-gallery-style="left_thumb_sticky"] .flickity.product-slider .slide').each(function(){
      $(this).find('.woocommerce-product-gallery__image').attr('id','');
    });
    
    $('[data-gallery-style="left_thumb_sticky"] .flickity.product-thumbs .thumb').each(function(){
      $(this).find('.thumb-inner > a > img').unwrap();
    });
    
  }
  
  var leftAlignedScrollTop = $(window).scrollTop();
  var headerSpace = $('#header-space').height();
  
  function leftAlignedActive() {
    
    leftAlignedScrollTop = $(window).scrollTop();
    
    var closestToTop = $('.product[data-gallery-style="left_thumb_sticky"] .images .slide:first-child');
    $('.product[data-gallery-style="left_thumb_sticky"] .images .slide').each(function(){
      if($(this).offset().top - leftAlignedScrollTop < headerSpace + 250) {
        closestToTop = $(this);
      }
    });
    
    
    var id = closestToTop.find('.woocommerce-product-gallery__image').attr('id');
    
    if($('.product-thumbs .thumb-inner').find('a[href="#'+ id +'"]').length > 0) {
      $('.product-thumbs .thumb-inner a').removeClass('active');
      $('.product-thumbs .thumb-inner').find('a[href="#'+ id +'"]').addClass('active');
    }
    
    
  }
  
  
  
  function leftAlignedZoomIcon() {
    if($('body.using-mobile-browser').length == 0) {
      
      if($('.product[data-gallery-style="left_thumb_sticky"] .images .slide').length > 1) {
        $(window).on('scroll',function(){
          requestAnimationFrame(leftAlignedActive);
        });
      }
      
      var zoomMouseTimeout;
      
      $('body').on('mouseover','.product[data-gallery-style="left_thumb_sticky"] .images .slide',function(){
        
        var imgWidth = ($(this).find('.woocommerce-product-gallery__image img[data-large_image_width]').length > 0) ? parseInt($(this).find('.woocommerce-product-gallery__image img').data('large_image_width')) : 0;
        
        //only if image is larger than gallery
        if(imgWidth > $('.single-product .images .product-slider').width()) {
          
          $(this).removeClass('nectar-no-larger-img');      
          
          if(!$(this).hasClass('zoom-img-active')) {
            //skip processing.
          } else {
            clearTimeout(zoomMouseTimeout);
          }
        } else {
          $(this).addClass('nectar-no-larger-img');
        }
        
      });
      
      $('body').on('mouseleave','.product[data-gallery-style="left_thumb_sticky"] .images .slide',function(){
        
        if($(this).hasClass('zoom-img-active')) {
          clearTimeout(zoomMouseTimeout);
        }
        
        var $that = $(this);
        
        zoomMouseTimeout = setTimeout(function(){
          $that.removeClass('zoom-img-active');
        },300);
        
      });
      
      $('body').on('mouseup','.product[data-gallery-style="left_thumb_sticky"] .images .slide',function(){
        
        clearTimeout(zoomMouseTimeout);
        
        if($(this).hasClass('zoom-img-active')) {
          $(this).removeClass('zoom-img-active');
        } else {
          $('.product[data-gallery-style="left_thumb_sticky"] .images .slide').removeClass('zoom-img-active');
          $(this).addClass('zoom-img-active');
        }
        
      });
    }
  }
  
  
  
  
  function nectarWooProdSliderLiveOrDie() {
    
    if($(window).width() < 1000 && $mainProdSlider == false && $thumbProdSlider == false) {
      
      //carousel
      nectarWooProdSliderInit();  
      leftAlignedRelationsDestroy();
      
    } else if($(window).width() > 1000 && $mainProdSlider && $thumbProdSlider) {
      
      //sticky scroll
      leftAlignedRelationsInit();
      nectarWooProdSliderDestroy();
      
      $mainProdSlider = false;
      $thumbProdSlider = false;
      
    }
    
  }
  
  if($('[data-gallery-style="left_thumb_sticky"]').length > 0) {
    nectarWooProdSliderLiveOrDie();
    leftAlignedRelationsInit();
    $(window).on('resize',nectarWooProdSliderLiveOrDie);
    leftAlignedZoomIcon();
  } else if($('[data-gallery-style="ios_slider"]').length > 0) {
    nectarWooProdSliderInit();
  }
  
  
  
  if( $('.slider').length > 0 ) { 
    
    var $startingImage = ($('.slide div a:first > img').length > 0) ? $('.slide div a:first > img').attr('src') : '';
    var $startingImageLink = ($('.slide div a:first').length > 0) ? $('.slide div a:first').attr('href') : '';
    var $startingImageThumb = ($('.slider > .thumb:first .thumb-inner img').length > 0) ? $('.slider > .thumb:first .thumb-inner img').attr('src') : $startingImage;
    
    $('select[name*="attribute_"]').on('blur',function(){
      
      var $that = $(this);
      var attr_data = $('.variations_form').data('product_variations');
      
      if($that.val().length > 0) {
        
        //give woo time to update img
        setTimeout(function(){
          
          $(attr_data).each(function(i, el){
            
            if(el.image && el.image.src) {
              
              if(el.image.src == $('.slide div a:first > img').attr('src')){     
                
                if(el.image.url){
                  $('.slide div a:first').attr('href',el.image.url);
                  $('.slide div a:first > img').attr('src',el.image.src);
                  
                  if(el.image.gallery_thumbnail_src) {
                    $('.product-thumbs .flickity-slider > .thumb:first-child img, .product-thumbs .slider > .thumb:first-child img').attr('src',el.image.gallery_thumbnail_src).removeAttr('srcset');
                    
                    //left aligned
                    if($('[data-gallery-style="left_thumb_sticky"]').length > 0 && $('body.mobile').length == 0) {
                      nectar_scrollToY(0, 700, 'easeInOutQuint');
                    } 
                    //non left aligned
                    else {
                      $thumbProdSlider.flickity( 'selectCell', 0 );
                      $mainProdSlider.flickity( 'selectCell', 0 );
                      $mainProdSlider.flickity( 'resize' );
                    }
                    
                    //update zoom
                    if($().zoom) {
                      if( $('[data-gallery-style="left_thumb_sticky"]').length > 0 && $('body.mobile').length == 0) {
                        initZoomForTarget($('.product-slider .slider > .slide:first-child'));
                      }
                      else if( $('[data-gallery-style="ios_slider"]').length > 0 ) {
                        initZoomForTarget($('.product-slider .flickity-slider > .slide:first-child'));
                      }
                    }
                    
                  }
                  
                } // if found img url
                
              } // if the sources match
              
            } else {
              
              //pre 3.0
              if(el.image_src == $('.slide div a:first > img').attr('src')){
                
                if(el.image_link){
                  $('.slide div a:first').attr('href',el.image_link);
                  $('.slide div a:first > img').attr('src',el.image_src);
                  $('.slider > .thumb:first .thumb-inner img').attr('src',el.image_src).removeAttr('srcset');
                  
                  
                }
              }
              
            }
            
            
          });		
          
        },30);
        
      } else {
        
        $('.slide div a:first').attr('href',$startingImageLink);
        $('.slide div a:first > img').attr('src',$startingImage);
        $('.product-thumbs .flickity-slider > .thumb:first-child img, .product-thumbs .slider > .thumb:first-child img').attr('src',$startingImageThumb).removeAttr('srcset');
        
        //resize
        if($('[data-gallery-style="left_thumb_sticky"]').length > 0 && $('body.mobile').length == 0) {
          //skip processing.
        } else {
          $mainProdSlider.flickity( 'resize' );
        }
        
        //update zoom
        if($().zoom) {
          if( $('[data-gallery-style="left_thumb_sticky"]').length > 0 && $('body.mobile').length == 0) {
            initZoomForTarget($('.product-slider .slider > .slide:first-child'));
          }
          else if( $('[data-gallery-style="ios_slider"]').length > 0 ) {
            initZoomForTarget($('.product-slider .flickity-slider > .slide:first-child'));
          }
        }
        
      }
      
    });
    
    
  }
  
  
  
  
  function productStickySS() {
    $('.product[data-gallery-style="left_thumb_sticky"] .flickity.product-thumbs, .product[data-gallery-style="left_thumb_sticky"][data-tab-pos="in_sidebar"] .single-product-summary, .product[data-gallery-style="left_thumb_sticky"][data-tab-pos="fullwidth"] .summary.entry-summary').each(function(){
      
      //padding from top of screen
      var $ssExtraTopSpace = 50;
      var $secondaryHeaderHeight = ($('#header-secondary-outer').length > 0) ? $('#header-secondary-outer').height() : 0;
      
      if($('#header-outer[data-remove-fixed="0"]').length > 0 && $('body[data-hhun="1"]').length == 0 && $('#header-outer[data-format="left-header"]').length == 0) { 
        $ssExtraTopSpace += $('#header-outer').outerHeight();	
        
        //resize effect
        if($('#header-outer[data-shrink-num][data-header-resize="1"]').length > 0 ) {
          var shrinkNum = 6;		
          var headerPadding2 = parseInt($('#header-outer').attr('data-padding')) - parseInt($('#header-outer').attr('data-padding'))/1.8;
          shrinkNum = $('#header-outer').attr('data-shrink-num');
          $ssExtraTopSpace -= shrinkNum;
          $ssExtraTopSpace -= headerPadding2;
        }
        
        //condense
        if($('body.mobile').length == 0 && $('#header-outer[data-condense="true"]').length > 0) {
          
          var $headerSpan9 = $('#header-outer[data-format="centered-menu-bottom-bar"] header#top .span_9');
          
          $ssExtraTopSpace = 50;
          $ssExtraTopSpace += $('#header-outer').height() - (parseInt($headerSpan9.position().top) - parseInt($('#header-outer #logo').css('margin-top')) ) - parseInt($secondaryHeaderHeight);
        }
        
        
      }
      
      if($('#wpadminbar').length > 0) {
        $ssExtraTopSpace += $('#wpadminbar').outerHeight();
      }
      
      if($('#header-outer').attr('data-using-secondary') == '1') {
        $ssExtraTopSpace += $('#header-secondary-outer').outerHeight();
      }
      
      
      $(this).theiaStickySidebar({
        additionalMarginTop: $ssExtraTopSpace,
        updateSidebarHeight: false
      });
      
    });
    
  }
  
  if( $().theiaStickySidebar && $('.product[data-gallery-style="left_thumb_sticky"] .product-slider .slide').length > 0 ) {
    
    //wrap for sticky
    var prodDesc;
    var prodImg = $('.single-product .product[data-gallery-style="left_thumb_sticky"] > .single-product-main-image').detach();
    if($('.product[data-gallery-style="left_thumb_sticky"][data-tab-pos="in_sidebar"]').length > 0) {
      prodDesc = $('.single-product .product[data-gallery-style="left_thumb_sticky"] > .single-product-summary').detach();
    } else {
      prodDesc = $('.single-product .product[data-gallery-style="left_thumb_sticky"] > .summary.entry-summary').detach();
    }
    
    $('.single-product .product[data-gallery-style="left_thumb_sticky"]').prepend('<div class="nectar-sticky-prod-wrap" />');
    $('.single-product .product[data-gallery-style="left_thumb_sticky"] .nectar-sticky-prod-wrap').append(prodImg).append(prodDesc);
    
    //init sticky
    productStickySS();
  }
  
  
});