let animObjects = [];
let deScrollOptions = [];

class DeScrollOption {
  constructor(classes) {
    var arr_classes = classes.split(' ')

    this.active = false;
    this.animation_preview = false;
    this.editMode = false;
    this.elementWatcher = null;
    this.scrollTop = 0; 
    this.id = '';
    this.transform = 'translateX'; 
    this.distance = '50'; 
    this.duration = '1000', 
    this.direction = 'normal', 
    this.easing = 'linear',
    this.start_animate = 0,
    this.finish_animate = 0,

    this.translateX = false,
    this.translateX_distance = '',

    this.translateY = false,
    this.translateY_distance = '',

		this.rotate = false,
		this.rotate_distance = '',
						
    this.scale = false,
    this.scale_distance = '',
				
    this.skew = false,
    this.skew_distance = '',

    this.run_on_desktop = false,
    this.run_on_tablet = false,
    this.run_on_mobile = false,
    this.run_animation = true,

    jQuery.each(arr_classes, (index, value) => {
      if ( value.search('de_scroll_animation_yes') === 0 ) {
        this.active = true;
      }

      if ( value.search('de_scroll_animation_preview_yes') === 0 ) {
        this.animation_preview = true;
      }

      if ( value.search('elementor-element-edit-mode') === 0 ) {
        this.editMode = true;
      }

      if ( value.length === 25 && value.search('elementor-element-') === 0 ) {
        this.id = value.replace('elementor-element-','')
      }

      if ( value.search('de_scroll_transform_') === 0 ) {
        this.transform = value.replace('de_scroll_transform_','')
      }

      if ( value.search('de_scroll_distance_') === 0 ) {
        this.distance = value.replace('de_scroll_distance_','')
      }

      if ( value.search('de_scroll_start_animate_') === 0 ) {
        this.start_animate = parseInt(value.replace('de_scroll_start_animate_',''))
      }

      if ( value.search('de_scroll_finish_animate_') === 0 ) {
        this.finish_animate = parseInt(value.replace('de_scroll_finish_animate_',''))
      }

      if (this.finish_animate < this.start_animate) {
          this.finish_animate = parseInt(this.start_animate) + 100
      }

      if ( 'de_scroll_translateX_popover_checked' === value ) { this.translateX = true }
      if ( 'de_scroll_translateY_popover_checked' === value ) { this.translateY = true }
      if ( 'de_scroll_rotate_popover_checked' === value ) { this.rotate = true }
      if ( 'de_scroll_scale_popover_checked' === value ) { this.scale = true }
      if ( 'de_scroll_skew_popover_checked' === value ) { this.skew = true }

      if ( value.search('de_scroll_translateX_distance_') === 0 ) {
        this.translateX_distance = value.replace('de_scroll_translateX_distance_','')
      }
      if ( value.search('de_scroll_translateY_distance_') === 0 ) {
        this.translateY_distance = value.replace('de_scroll_translateY_distance_','')
      }
      if ( value.search('de_scroll_rotate_distance_') === 0 ) {
        this.rotate_distance = value.replace('de_scroll_rotate_distance_','')
      }
      if ( value.search('de_scroll_scale_distance_') === 0 ) {
        this.scale_distance = value.replace('de_scroll_scale_distance_','')
      }
      if ( value.search('de_scroll_skew_distance_') === 0 ) {
        this.skew_distance = value.replace('de_scroll_skew_distance_','')
      }
      if ( value.search('de_scroll_animation_on_desktop_yes') === 0 ) {
        this.run_on_desktop = true;
      }
      if ( value.search('de_scroll_animation_on_tablet_yes') === 0 ) {
        this.run_on_tablet = true;
      }
      if ( value.search('de_scroll_animation_on_mobile_yes') === 0 ) {
        this.run_on_mobile = true;
      }
    })

  }
}

class DeScrollAnimationHandlerClass extends elementorModules.frontend.handlers.Base {
    getDefaultSettings() {
        return {
            selectors: {
                wrapper: '.de_scroll_animation_yes',
                widget_container: '.elementor-widget-container',
            },
            last_known_scroll_position: this.last_known_scroll_position,
        };
    }

    getDefaultElements() {
        const selectors = this.getSettings( 'selectors' );
        return {
            $wrapper: this.$element.find( selectors.wrapper ),
            $widget_container: this.$element.find( selectors.widget_container ),
            $body: this.$element.find( 'body' ),
            $document: this.$element.find( 'document' ),
        };
    }

    onInit() {    
      // console.log(elementorFrontend.config.responsive.breakpoints)
      // console.log(elementorFrontend.config.responsive.activeBreakpoints)
      // console.log(elementorFrontend.config.responsive.breakpoints.mobile.value)
      // console.log('scrollWidth : ' + document.scrollingElement.scrollWidth)

      var observer = new MutationObserver(function(mutations) {
        mutations.forEach(function(mutation) {
          if (mutation.attributeName === "class") {
            var attributeValue = $(mutation.target).prop(mutation.attributeName);
            
            var $arr_classes = attributeValue.split(' ')

            var do_animation = false
            var do_animation_preview = false
      
            jQuery.each($arr_classes, (index, value) => {
              if ( value.search('de_scroll_animation_yes') === 0 ) {
                  do_animation = true;
              }

              if ( value.search('de_scroll_animation_preview_yes') === 0 ) {
                do_animation_preview = true;
              }
            })

            if (do_animation) {
                let deScrollOption = new DeScrollOption(attributeValue);
                let animindex = animObjects.length;
                let i;
                for (i = 0; i < deScrollOptions.length; i++) {
                  if ( deScrollOptions[i].id === deScrollOption.id ) {
                    animindex = i;
                    break;
                  }
                }

                let tZ_perspective = 0;

                deScrollOptions[animindex] = new DeScrollOption(attributeValue);

                // reset transform
                var el = document.querySelector(".elementor-element-" + deScrollOption.id + ".de_scroll_animation_yes .elementor-widget-container")

                if (el) {
                  el.setAttribute('style','')
                  // console.log(el)
                }

                // create anim
                animObjects[animindex] = anime({
                  targets: ".elementor-element-" + deScrollOption.id + ".de_scroll_animation_yes .elementor-widget-container",
                  perspective: [tZ_perspective, tZ_perspective],
                  scale: function() {
                    let result = 1;
                    if ( deScrollOption.scale ) {
                      result = deScrollOption.scale_distance;
                    }
                    return result;
                  },
                  translateX: function() {
                    let result = 0;
                    if ( deScrollOption.translateX ) {
                      result = deScrollOption.translateX_distance;
                    }
                    return result;
                  },
                  translateY: function() {
                    let result = 0;
                    if ( deScrollOption.translateY ) {
                      result = deScrollOption.translateY_distance;
                    }
                    return result;
                  },
                  rotate: function() {
                    let result = 0;
                    if ( deScrollOption.rotate ) {
                      result = deScrollOption.rotate_distance;
                    }
                    return result;
                  },
                  skew: function() {
                    let result = 0;
                    if ( deScrollOption.skew ) {
                      result = deScrollOption.skew_distance;
                    }
                    return result;
                  },
                  // delay: function(el, i) {
                  //   return i * 100;
                  // },
                  // elasticity: 200,
                  easing: deScrollOption.easing,
                  direction: "normal",
                  autoplay: false,
                  duration: deScrollOption.duration
                });
            }
          }
        });
      });

      if (this.$element) {
        var elementId = this.$element.context.attributes['data-id'].nodeValue;
        var elementSelector = document.querySelector("[data-id='" + elementId + "']");
        if (elementSelector) {
            observer.observe(elementSelector, {
                attributes: true
            });

            if ( this.$element.context.classList.contains('de_scroll_animation_yes') ) {
              let last_known_scroll_position = 0;
              let ticking = false;
              let animindex = animObjects.length;
              let optionindex = deScrollOptions.length;

              
              deScrollOptions[optionindex] = new DeScrollOption(this.$element.context.className);
              
              let tZ_perspective = 0;

              animObjects[animindex] = anime({
                targets: ".elementor-element-" + deScrollOptions[optionindex].id + ".de_scroll_animation_yes .elementor-widget-container",
                perspective: [tZ_perspective, tZ_perspective],
                scale: function() {
                  let result = 1;
                  if ( deScrollOptions[optionindex].scale ) {
                    result = deScrollOptions[optionindex].scale_distance;
                  }
                  return result;
                },
                translateX: function() {
                  let result = 0;
                  if ( deScrollOptions[optionindex].translateX ) {
                    result = deScrollOptions[optionindex].translateX_distance;
                  }
                  return result;
                },
                translateY: function() {
                  let result = 0;
                  if ( deScrollOptions[optionindex].translateY ) {
                    result = deScrollOptions[optionindex].translateY_distance;
                  }
                  return result;
                },
                rotate: function() {
                  let result = 0;
                  if ( deScrollOptions[optionindex].rotate ) {
                    result = deScrollOptions[optionindex].rotate_distance;
                  }
                  return result;
                },
                skew: function() {
                  let result = 0;
                  if ( deScrollOptions[optionindex].skew ) {
                    result = deScrollOptions[optionindex].skew_distance;
                  }
                  return result;
                },
                // delay: function(el, i) {
                //   return i * 100;
                // },
                // elasticity: 200,
                easing: deScrollOptions[optionindex].easing,
                autoplay: false,
                duration: deScrollOptions[optionindex].duration
              });

              var elRect = elementSelector.getBoundingClientRect()
              deScrollOptions[optionindex].scrollTop = elRect.y

              document.onscroll = () => { 
                if (!ticking) {
                  window.requestAnimationFrame(function() {
                    var i;
                    for (i = 0; i < animObjects.length; i++) {
                      // last_known_scroll_position = ( document.scrollingElement.scrollTop - deScrollOptions[i].scrollTop ) / window.innerHeight

                      last_known_scroll_position = 0

                      // console.log(document.querySelector(animObjects[i].targets))
                      var scrolledEl = document.querySelector(".elementor-element-" + deScrollOptions[i].id + ".de_scroll_animation_yes .elementor-widget-container")
                      var sTop = 0
                      if (scrolledEl) {
                        var scrollbarHeight = document.scrollingElement.scrollHeight
                        var scrollbarTop = document.scrollingElement.scrollTop
                        
                        var rect = scrolledEl.getBoundingClientRect()
                        sTop = rect.y
                        var sHeight = rect.height 
                        // var wHeight = window.innerHeight - sHeight - 50
                        var wHeight = window.innerHeight

                        // console.log('document.body.clientHeight : ' + document.body.clientHeight)
                        // console.log('window.clientHeight : ' + window.clientHeight)
                        // console.log('window.innerHeight :' + window.innerHeight)
                        // console.log(document.documentElement.offsetHeight)

                        // if ( scrollbarTop === 0 ) {
                        //   last_known_scroll_position = 0
                        // } else if ( sTop <= 50 ) {
                        //   last_known_scroll_position = 100
                        // } else if ( sTop <= wHeight ) {
                        //   if ( sHeight > (.5 * wHeight) ) {
                        //     last_known_scroll_position = ( wHeight - sTop) / sHeight * 100
                        //   } else {
                        //     last_known_scroll_position = ( wHeight - sTop) / wHeight * 100
                        //   }
                        // }

                        

                        if ( scrollbarTop === 0 ) {
                          last_known_scroll_position = 0
                        } else if ( sTop <= wHeight ) {
                          var animHeight = (deScrollOptions[i].finish_animate - deScrollOptions[i].start_animate) * sHeight / 100
                          var animTop = sTop + deScrollOptions[i].start_animate * sHeight / 100
                          last_known_scroll_position = ( wHeight - animTop) / animHeight * 100
                          // if (deScrollOptions[i].id === 'cd08401') {
                          //   console.log('last_known_scroll_position : ' + last_known_scroll_position)
                          //   console.log('wHeight : ' + wHeight)
                          //   console.log('animTop : ' + animTop)
                          //   console.log('start_animate : ' + deScrollOptions[i].start_animate)
                          //   console.log('finish_animate : ' + deScrollOptions[i].finish_animate)
                          //   console.log('sHeight : ' + sHeight)
                          // }
                        }

                      }

                      if (!deScrollOptions[i].run_animation) {
                        last_known_scroll_position = 0
                      }

                      if ( deScrollOptions[i].editMode ) {
                        if ( deScrollOptions[i].animation_preview ) {
                          animObjects[i].seek((last_known_scroll_position / 100) * animObjects[i].duration);
                        }
                      } else {
                        // if ( deScrollOptions[i].id === 'a2d5ac4' ) {
                        //   console.log(sHeight)
                        //   console.log('calc : ' + (last_known_scroll_position / 100) * animObjects[i].duration )
                        // }
                        animObjects[i].seek((last_known_scroll_position / 100) * animObjects[i].duration);
                      }

                      
                      
                    }
                    ticking = false;
                  });
              
                  ticking = true;
                }
              
              }    
            } //if (this.$element.context.classList.contains('de_scroll_animation_yes'))

        }
      }
    }

    bindEvents() {
    }
} //class DeScrollAnimationHandlerClass

jQuery( window ).on( 'elementor/frontend/init', () => {
  const addHandler = ( $element ) => {
    elementorFrontend.elementsHandler.addHandler( DeScrollAnimationHandlerClass, {
      $element,
    } );
  };

  elementorFrontend.hooks.addAction( 'frontend/element_ready/global', addHandler );
} );

jQuery( document ).ready( () => {
  de_scroll_init_responsive()
})

jQuery( window ).on( 'resize', () => {
  de_scroll_init_responsive()
})

function de_scroll_init_responsive() {
  var onDesktop = false
  var onTablet = false
  var onMobile = false
  var docWidth = document.scrollingElement.scrollWidth
  var tabletBreakpoint = elementorFrontend.config.responsive.breakpoints.tablet.value
  var mobileBreakpoint = elementorFrontend.config.responsive.breakpoints.mobile.value

  if ( docWidth > tabletBreakpoint ) {
    onDesktop = true 
  } else if ( docWidth <= mobileBreakpoint ) {
    onMobile = true
  } else {
    onTablet = true
  }

  for (i = 0; i < deScrollOptions.length; i++) {
    deScrollOptions[i].run_animation = false

    if ( onDesktop && deScrollOptions[i].run_on_desktop ) {
      deScrollOptions[i].run_animation = true
    }

    if ( onTablet && deScrollOptions[i].run_on_tablet ) {
      deScrollOptions[i].run_animation = true
    }

    if ( onMobile && deScrollOptions[i].run_on_mobile ) {
      deScrollOptions[i].run_animation = true
    }
  }
}