docs: function touchNavigation() {
      if (this.events.hasOwnProperty('touchStart')) {
          return false;
      }
      let index,
          hDistance,
          vDistance,
          hDistanceLast,
          vDistanceLast,
          hDistancePercent,
          vSwipe = false,
          hSwipe = false,
          hSwipMinDistance = 0,
          vSwipMinDistance = 0,
          doingPinch = false,
          pinchBigger = false,
          startCoords = { },
          endCoords = { },
          slider = this.slidesContainer,
          activeSlide = null,
          xDown = 0,
          yDown = 0,
          activeSlideImage = null,
          activeSlideMedia = null,
          activeSlideDesc = null;
  
      let winWidth = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
      let winHeight = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
      let body = document.body;
  
      this.events['doctouchmove'] = addEvent('touchmove', {
          onElement: document,
          withCallback: (e, target) => {
              if (hasClass(body, 'gdesc-open')) {
                  e.preventDefault()
                  return false
              }
          }, useCapture: { passive: false }
      })
  
  
      this.events['touchStart'] = addEvent('touchstart', {
          onElement: body,
          withCallback: (e, target) => {
              if (hasClass(body, 'gdesc-open')) {
                  return;
              }
              addClass(body, 'touching');
              activeSlide = this.getActiveSlide()
              activeSlideImage = activeSlide.querySelector('.gslide-image')
              activeSlideMedia = activeSlide.querySelector('.gslide-media')
              activeSlideDesc = activeSlide.querySelector('.gslide-description')
  
              index = this.index;
              endCoords = e.targetTouches[0];
              startCoords.pageX = e.targetTouches[0].pageX;
              startCoords.pageY = e.targetTouches[0].pageY;
              xDown = e.targetTouches[0].clientX;
              yDown = e.targetTouches[0].clientY;
          }
      })
  
      this.events['gestureStart'] = addEvent('gesturestart', {
          onElement: body,
          withCallback: (e, target) => {
              if (activeSlideImage) {
                  e.preventDefault()
                  doingPinch = true
              }
          }
      })
  
      this.events['gestureChange'] = addEvent('gesturechange', {
          onElement: body,
          withCallback: (e, target) => {
              e.preventDefault()
              slideCSSTransform(activeSlideImage, `scale(${e.scale})`)
          }
      })
  
      this.events['gesturEend'] = addEvent('gestureend', {
          onElement: body,
          withCallback: (e, target) => {
              doingPinch = false
              if (e.scale < 1) {
                  pinchBigger = false
                  slideCSSTransform(activeSlideImage, `scale(1)`)
              } else{
                  pinchBigger = true
              }
          }
      })
  
      this.events['touchMove'] = addEvent('touchmove', {
          onElement: body,
          withCallback: (e, target) => {
              if (!hasClass(body, 'touching')) {
                  return;
              }
              if (hasClass(body, 'gdesc-open') || doingPinch || pinchBigger) {
                  return;
              }
              e.preventDefault();
              endCoords = e.targetTouches[0];
              let slideHeight = activeSlide.querySelector('.gslide-inner-content').offsetHeight;
              let slideWidth = activeSlide.querySelector('.gslide-inner-content').offsetWidth;
  
              let xUp = e.targetTouches[0].clientX;
              let yUp = e.targetTouches[0].clientY;
              let xDiff = xDown - xUp;
              let yDiff = yDown - yUp;
  
              if (Math.abs(xDiff) > Math.abs(yDiff)) { /*most significant*/
                  vSwipe = false
                  hSwipe = true
              } else {
                  hSwipe = false
                  vSwipe = true
              }
  
              if (vSwipe) {
                  vDistanceLast = vDistance;
                  vDistance = endCoords.pageY - startCoords.pageY;
                  if (Math.abs(vDistance) >= vSwipMinDistance || vSwipe) {
                      let opacity = 0.75 - Math.abs(vDistance) / slideHeight;
                      activeSlideMedia.style.opacity = opacity;
                      if (activeSlideDesc) {
                          activeSlideDesc.style.opacity = opacity;
                      }
                      slideCSSTransform(activeSlideMedia, `translate3d(0, ${vDistance}px, 0)`)
                  }
                  return;
              }
  
              hDistanceLast = hDistance;
              hDistance = endCoords.pageX - startCoords.pageX;
              hDistancePercent = hDistance * 100 / winWidth;
  
              if (hSwipe) {
                  if (this.index + 1 == this.elements.length && hDistance < -60) {
                      resetSlideMove(activeSlide)
                      return false;
                  }
                  if (this.index - 1 < 0 && hDistance > 60) {
                      resetSlideMove(activeSlide)
                      return false;
                  }
  
                  let opacity = 0.75 - Math.abs(hDistance) / slideWidth;
                  activeSlideMedia.style.opacity = opacity;
                  if (activeSlideDesc) {
                      activeSlideDesc.style.opacity = opacity;
                  }
                  slideCSSTransform(activeSlideMedia, `translate3d(${hDistancePercent}%, 0, 0)`)
              }
          }, useCapture: { passive: false }
      })
  
  
  
      this.events['touchEnd'] = addEvent('touchend', {
          onElement: body,
          withCallback: (e, target) => {
              vDistance = endCoords.pageY - startCoords.pageY;
              hDistance = endCoords.pageX - startCoords.pageX;
              hDistancePercent = hDistance * 100 / winWidth;
  
              removeClass(body, 'touching')
  
              let slideHeight = activeSlide.querySelector('.gslide-inner-content').offsetHeight;
              let slideWidth = activeSlide.querySelector('.gslide-inner-content').offsetWidth;
  
              // Swipe to top/bottom to close
              if (vSwipe) {
                  let onEnd = (slideHeight / 2)
                      vSwipe = false;
                  if (Math.abs(vDistance) >= onEnd) {
                      this.close()
                      return;
                  }
                  resetSlideMove(activeSlide)
                  return
              }
  
              if (hSwipe) {
                  hSwipe = false;
                  let where = 'prev'
                  let asideExist = true
                  if(hDistance < 0){
                      where = 'next'
                      hDistance = Math.abs(hDistance)
                  }
                  if (where == 'prev' && this.index - 1 < 0) {
                      asideExist = false
                  }
                  if (where == 'next' && this.index + 1 >= this.elements.length) {
                      asideExist = false
                  }
                  if (asideExist && hDistance >= (slideWidth / 2) - 90) {
                      if (where == 'next') {
                         this.nextSlide();
                      }
                      else{
                         this.prevSlide();
                      }
                      return;
                  }
                  resetSlideMove(activeSlide)
              }
          }
      })
  }