import Control from"./Control.js";import EventType from"../events/EventType.js";import PointerEventType from"../pointer/EventType.js";import{CLASS_CONTROL,CLASS_UNSELECTABLE}from"../css.js";import{clamp}from"../math.js";import{easeOut}from"../easing.js";import{listen,unlistenByKey}from"../events.js";import{stopPropagation}from"../events/Event.js";const Direction={VERTICAL:0,HORIZONTAL:1};class ZoomSlider extends Control{constructor(t){t=t||{},super({element:document.createElement("div"),render:t.render}),this.dragListenerKeys_=[],this.currentResolution_=void 0,this.direction_=Direction.VERTICAL,this.dragging_,this.heightLimit_=0,this.widthLimit_=0,this.startX_,this.startY_,this.thumbSize_=null,this.sliderInitialized_=!1,this.duration_=void 0!==t.duration?t.duration:200;t=void 0!==t.className?t.className:"ol-zoomslider";const e=document.createElement("button"),i=(e.setAttribute("type","button"),e.className=t+"-thumb "+CLASS_UNSELECTABLE,this.element);i.className=t+" "+CLASS_UNSELECTABLE+" "+CLASS_CONTROL,i.appendChild(e),i.addEventListener(PointerEventType.POINTERDOWN,this.handleDraggerStart_.bind(this),!1),i.addEventListener(PointerEventType.POINTERMOVE,this.handleDraggerDrag_.bind(this),!1),i.addEventListener(PointerEventType.POINTERUP,this.handleDraggerEnd_.bind(this),!1),i.addEventListener(EventType.CLICK,this.handleContainerClick_.bind(this),!1),e.addEventListener(EventType.CLICK,stopPropagation,!1)}setMap(t){super.setMap(t),t&&t.render()}initSlider_(){var t=this.element,e=t.offsetWidth;let i=t.offsetHeight;if(0===e&&0===i)return this.sliderInitialized_=!1;var s=getComputedStyle(t),s=(e-=parseFloat(s.paddingRight)+parseFloat(s.paddingLeft),i-=parseFloat(s.paddingTop)+parseFloat(s.paddingBottom),t.firstElementChild),t=getComputedStyle(s),n=s.offsetWidth+parseFloat(t.marginRight)+parseFloat(t.marginLeft),s=s.offsetHeight+parseFloat(t.marginTop)+parseFloat(t.marginBottom);return this.thumbSize_=[n,s],e>i?(this.direction_=Direction.HORIZONTAL,this.widthLimit_=e-n):(this.direction_=Direction.VERTICAL,this.heightLimit_=i-s),this.sliderInitialized_=!0}handleContainerClick_(t){const e=this.getMap().getView();t=this.getRelativePosition_(t.offsetX-this.thumbSize_[0]/2,t.offsetY-this.thumbSize_[1]/2),t=this.getResolutionForPosition_(t),t=e.getConstrainedZoom(e.getZoomForResolution(t));e.animateInternal({zoom:t,duration:this.duration_,easing:easeOut})}handleDraggerStart_(t){var e,i;this.dragging_||t.target!==this.element.firstElementChild||(e=this.element.firstElementChild,this.getMap().getView().beginInteraction(),this.startX_=t.clientX-parseFloat(e.style.left),this.startY_=t.clientY-parseFloat(e.style.top),this.dragging_=!0,0===this.dragListenerKeys_.length&&(t=this.handleDraggerDrag_,e=this.handleDraggerEnd_,i=this.getMap().getOwnerDocument(),this.dragListenerKeys_.push(listen(i,PointerEventType.POINTERMOVE,t,this),listen(i,PointerEventType.POINTERUP,e,this))))}handleDraggerDrag_(t){var e;this.dragging_&&(e=t.clientX-this.startX_,t=t.clientY-this.startY_,e=this.getRelativePosition_(e,t),this.currentResolution_=this.getResolutionForPosition_(e),this.getMap().getView().setResolution(this.currentResolution_))}handleDraggerEnd_(t){if(this.dragging_){const e=this.getMap().getView();e.endInteraction(),this.dragging_=!1,this.startX_=void 0,this.startY_=void 0,this.dragListenerKeys_.forEach(unlistenByKey),this.dragListenerKeys_.length=0}}setThumbPosition_(t){t=this.getPositionForResolution_(t);const e=this.element.firstElementChild;this.direction_==Direction.HORIZONTAL?e.style.left=this.widthLimit_*t+"px":e.style.top=this.heightLimit_*t+"px"}getRelativePosition_(t,e){let i;return i=this.direction_===Direction.HORIZONTAL?t/this.widthLimit_:e/this.heightLimit_,clamp(i,0,1)}getResolutionForPosition_(t){const e=this.getMap().getView().getResolutionForValueFunction();return e(1-t)}getPositionForResolution_(t){const e=this.getMap().getView().getValueForResolutionFunction();return clamp(1-e(t),0,1)}render(t){t.frameState&&(this.sliderInitialized_||this.initSlider_())&&(t=t.frameState.viewState.resolution,this.currentResolution_=t,this.setThumbPosition_(t))}}export default ZoomSlider;