import EventType from"../events/EventType.js";import Interaction,{zoomByDelta}from"./Interaction.js";import{DEVICE_PIXEL_RATIO,FIREFOX}from"../has.js";import{always,focus}from"../events/condition.js";import{clamp}from"../math.js";const Mode={TRACKPAD:"trackpad",WHEEL:"wheel"};class MouseWheelZoom extends Interaction{constructor(t){t=t||{};super(t),this.totalDelta_=0,this.lastDelta_=0,this.maxDelta_=void 0!==t.maxDelta?t.maxDelta:1,this.duration_=void 0!==t.duration?t.duration:250,this.timeout_=void 0!==t.timeout?t.timeout:80,this.useAnchor_=void 0===t.useAnchor||t.useAnchor,this.constrainResolution_=void 0!==t.constrainResolution&&t.constrainResolution,this.condition_=t.condition||always,this.lastAnchor_=null,this.startTime_=void 0,this.timeoutId_,this.mode_=void 0,this.trackpadEventGap_=400,this.trackpadTimeoutId_,this.deltaPerZoom_=300}conditionInternal_(t){let e=!0;return(e=t.map.getTargetElement().hasAttribute("tabindex")?focus(t):e)&&this.condition_(t)}endInteraction_(){this.trackpadTimeoutId_=void 0;const t=this.getMap().getView();t.endInteraction(void 0,this.lastDelta_?0<this.lastDelta_?1:-1:0,this.lastAnchor_)}handleEvent(t){if(!this.conditionInternal_(t))return!0;if(t.type!==EventType.WHEEL)return!0;t.preventDefault();const e=t.map;var i=t.originalEvent;this.useAnchor_&&(this.lastAnchor_=t.coordinate);let o;if(t.type==EventType.WHEEL&&(o=i.deltaY,FIREFOX&&i.deltaMode===WheelEvent.DOM_DELTA_PIXEL&&(o/=DEVICE_PIXEL_RATIO),i.deltaMode===WheelEvent.DOM_DELTA_LINE&&(o*=40)),0===o)return!1;this.lastDelta_=o;t=Date.now();void 0===this.startTime_&&(this.startTime_=t),(!this.mode_||t-this.startTime_>this.trackpadEventGap_)&&(this.mode_=Math.abs(o)<4?Mode.TRACKPAD:Mode.WHEEL);const s=e.getView();if(this.mode_===Mode.TRACKPAD&&!s.getConstrainResolution()&&!this.constrainResolution_)return this.trackpadTimeoutId_?clearTimeout(this.trackpadTimeoutId_):(s.getAnimating()&&s.cancelAnimations(),s.beginInteraction()),this.trackpadTimeoutId_=setTimeout(this.endInteraction_.bind(this),this.timeout_),s.adjustZoom(-o/this.deltaPerZoom_,this.lastAnchor_),this.startTime_=t,!1;this.totalDelta_+=o;i=Math.max(this.timeout_-(t-this.startTime_),0);return clearTimeout(this.timeoutId_),this.timeoutId_=setTimeout(this.handleWheelZoom_.bind(this,e),i),!1}handleWheelZoom_(t){const e=t.getView();e.getAnimating()&&e.cancelAnimations();let i=-clamp(this.totalDelta_,-this.maxDelta_*this.deltaPerZoom_,this.maxDelta_*this.deltaPerZoom_)/this.deltaPerZoom_;(e.getConstrainResolution()||this.constrainResolution_)&&(i=i?0<i?1:-1:0),zoomByDelta(e,i,this.lastAnchor_,this.duration_),this.mode_=void 0,this.totalDelta_=0,this.lastAnchor_=null,this.startTime_=void 0,this.timeoutId_=void 0}setMouseAnchor(t){(this.useAnchor_=t)||(this.lastAnchor_=null)}}export default MouseWheelZoom;export{Mode};