window.jvbSwiper=new class{constructor(){this.isInitialized=!1,this.initSubscribers(),this.initHandlers(),this.swipe={startX:null,endX:null,startY:null,endY:null,minSwipe:50},this.pinch={active:!1,startDistance:0,lastDistance:0,scale:1}}initHandlers(){this.touchStartHandler=this.handleTouchStart.bind(this),this.touchMoveHandler=this.handleTouchMove.bind(this),this.touchEndHandler=this.handleTouchEnd.bind(this)}initListeners(){this.isInitialized||(this.isInitialized=!0,document.addEventListener("touchstart",this.touchStartHandler),document.addEventListener("touchmove",this.touchMoveHandler),document.addEventListener("touchend",this.touchEndHandler))}cleanupListeners(){this.subscribers.size>0||(this.isInitialized=!1,document.removeEventListener("touchstart",this.touchStartHandler),document.removeEventListener("touchmove",this.touchMoveHandler),document.removeEventListener("touchend",this.touchEndHandler))}handleTouchStart(t){if(2===t.touches.length){const i=t.touches[0].clientX-t.touches[1].clientX,s=t.touches[0].clientY-t.touches[1].clientY,e=Math.sqrt(i*i+s*s);return this.pinch.active=!0,this.pinch.startDistance=this.pinch.lastDistance=e,void this.notify("pinch-start",{distance:e})}this.swipe.startX=t.touches[0].clientX,this.swipe.startY=t.touches[0].clientY}handleTouchMove(t){if(this.pinch.active&&2===t.touches.length){const i=t.touches[0].clientX-t.touches[1].clientX,s=t.touches[0].clientY-t.touches[1].clientY,e=Math.sqrt(i*i+s*s),n=e/this.pinch.startDistance;return this.pinch.lastDistance=e,this.pinch.scale=n,this.notify("pinch-move",{e:t,distance:e,scale:n}),void(e>this.pinch.startDistance?this.notify("pinch-out",{scale:n}):this.notify("pinch-in",{scale:n}))}this.swipe.endX=t.touches[0].clientX,this.swipe.endY=t.touches[0].clientY}handleTouchEnd(t){if(this.pinch.active)return this.notify("pinch-end",{finalScale:this.pinch.scale}),void(this.pinch.active=!1);if(!(this.swipe.startX&&this.swipe.endX&&this.swipe.startY&&this.swipe.endY))return;const i=this.swipe.startX-this.swipe.endX,s=this.swipe.startY-this.swipe.endY;if(Math.abs(i)>this.swipe.minSwipe){let t=i>0?"swipe-right":"swipe-left";this.notify(t)}if(Math.abs(s)>this.swipe.minSwipe){let t=s>0?"swipe-up":"swipe-down";this.notify(t)}this.swipe.startX=this.swipe.startY=this.swipe.endX=this.swipe.endY=null}initSubscribers(){this.subscribers=new Set}subscribe(t){return this.isInitialized||this.initListeners(),this.subscribers.add(t),()=>this.subscribers.delete(t)}unsubscribe(t){this.subscribers.delete(t),0===this.subscribers.size&&this.cleanupListeners()}notify(t,i={}){this.subscribers.forEach((s=>{try{s(t,i)}catch(t){console.error("Subscriber error:",t)}}))}destroy(){this.subscribers.clear(),this.cleanupListeners()}};
|