| import { __extends } from "tslib"; | 
| import { addEventListener, removeEventListener, normalizeEvent, getNativeEvent } from '../core/event.js'; | 
| import * as zrUtil from '../core/util.js'; | 
| import Eventful from '../core/Eventful.js'; | 
| import env from '../core/env.js'; | 
| var TOUCH_CLICK_DELAY = 300; | 
| var globalEventSupported = env.domSupported; | 
| var localNativeListenerNames = (function () { | 
|     var mouseHandlerNames = [ | 
|         'click', 'dblclick', 'mousewheel', 'wheel', 'mouseout', | 
|         'mouseup', 'mousedown', 'mousemove', 'contextmenu' | 
|     ]; | 
|     var touchHandlerNames = [ | 
|         'touchstart', 'touchend', 'touchmove' | 
|     ]; | 
|     var pointerEventNameMap = { | 
|         pointerdown: 1, pointerup: 1, pointermove: 1, pointerout: 1 | 
|     }; | 
|     var pointerHandlerNames = zrUtil.map(mouseHandlerNames, function (name) { | 
|         var nm = name.replace('mouse', 'pointer'); | 
|         return pointerEventNameMap.hasOwnProperty(nm) ? nm : name; | 
|     }); | 
|     return { | 
|         mouse: mouseHandlerNames, | 
|         touch: touchHandlerNames, | 
|         pointer: pointerHandlerNames | 
|     }; | 
| })(); | 
| var globalNativeListenerNames = { | 
|     mouse: ['mousemove', 'mouseup'], | 
|     pointer: ['pointermove', 'pointerup'] | 
| }; | 
| var wheelEventSupported = false; | 
| function isPointerFromTouch(event) { | 
|     var pointerType = event.pointerType; | 
|     return pointerType === 'pen' || pointerType === 'touch'; | 
| } | 
| function setTouchTimer(scope) { | 
|     scope.touching = true; | 
|     if (scope.touchTimer != null) { | 
|         clearTimeout(scope.touchTimer); | 
|         scope.touchTimer = null; | 
|     } | 
|     scope.touchTimer = setTimeout(function () { | 
|         scope.touching = false; | 
|         scope.touchTimer = null; | 
|     }, 700); | 
| } | 
| function markTouch(event) { | 
|     event && (event.zrByTouch = true); | 
| } | 
| function normalizeGlobalEvent(instance, event) { | 
|     return normalizeEvent(instance.dom, new FakeGlobalEvent(instance, event), true); | 
| } | 
| function isLocalEl(instance, el) { | 
|     var elTmp = el; | 
|     var isLocal = false; | 
|     while (elTmp && elTmp.nodeType !== 9 | 
|         && !(isLocal = elTmp.domBelongToZr | 
|             || (elTmp !== el && elTmp === instance.painterRoot))) { | 
|         elTmp = elTmp.parentNode; | 
|     } | 
|     return isLocal; | 
| } | 
| var FakeGlobalEvent = (function () { | 
|     function FakeGlobalEvent(instance, event) { | 
|         this.stopPropagation = zrUtil.noop; | 
|         this.stopImmediatePropagation = zrUtil.noop; | 
|         this.preventDefault = zrUtil.noop; | 
|         this.type = event.type; | 
|         this.target = this.currentTarget = instance.dom; | 
|         this.pointerType = event.pointerType; | 
|         this.clientX = event.clientX; | 
|         this.clientY = event.clientY; | 
|     } | 
|     return FakeGlobalEvent; | 
| }()); | 
| var localDOMHandlers = { | 
|     mousedown: function (event) { | 
|         event = normalizeEvent(this.dom, event); | 
|         this.__mayPointerCapture = [event.zrX, event.zrY]; | 
|         this.trigger('mousedown', event); | 
|     }, | 
|     mousemove: function (event) { | 
|         event = normalizeEvent(this.dom, event); | 
|         var downPoint = this.__mayPointerCapture; | 
|         if (downPoint && (event.zrX !== downPoint[0] || event.zrY !== downPoint[1])) { | 
|             this.__togglePointerCapture(true); | 
|         } | 
|         this.trigger('mousemove', event); | 
|     }, | 
|     mouseup: function (event) { | 
|         event = normalizeEvent(this.dom, event); | 
|         this.__togglePointerCapture(false); | 
|         this.trigger('mouseup', event); | 
|     }, | 
|     mouseout: function (event) { | 
|         event = normalizeEvent(this.dom, event); | 
|         var element = event.toElement || event.relatedTarget; | 
|         if (!isLocalEl(this, element)) { | 
|             if (this.__pointerCapturing) { | 
|                 event.zrEventControl = 'no_globalout'; | 
|             } | 
|             this.trigger('mouseout', event); | 
|         } | 
|     }, | 
|     wheel: function (event) { | 
|         wheelEventSupported = true; | 
|         event = normalizeEvent(this.dom, event); | 
|         this.trigger('mousewheel', event); | 
|     }, | 
|     mousewheel: function (event) { | 
|         if (wheelEventSupported) { | 
|             return; | 
|         } | 
|         event = normalizeEvent(this.dom, event); | 
|         this.trigger('mousewheel', event); | 
|     }, | 
|     touchstart: function (event) { | 
|         event = normalizeEvent(this.dom, event); | 
|         markTouch(event); | 
|         this.__lastTouchMoment = new Date(); | 
|         this.handler.processGesture(event, 'start'); | 
|         localDOMHandlers.mousemove.call(this, event); | 
|         localDOMHandlers.mousedown.call(this, event); | 
|     }, | 
|     touchmove: function (event) { | 
|         event = normalizeEvent(this.dom, event); | 
|         markTouch(event); | 
|         this.handler.processGesture(event, 'change'); | 
|         localDOMHandlers.mousemove.call(this, event); | 
|     }, | 
|     touchend: function (event) { | 
|         event = normalizeEvent(this.dom, event); | 
|         markTouch(event); | 
|         this.handler.processGesture(event, 'end'); | 
|         localDOMHandlers.mouseup.call(this, event); | 
|         if (+new Date() - (+this.__lastTouchMoment) < TOUCH_CLICK_DELAY) { | 
|             localDOMHandlers.click.call(this, event); | 
|         } | 
|     }, | 
|     pointerdown: function (event) { | 
|         localDOMHandlers.mousedown.call(this, event); | 
|     }, | 
|     pointermove: function (event) { | 
|         if (!isPointerFromTouch(event)) { | 
|             localDOMHandlers.mousemove.call(this, event); | 
|         } | 
|     }, | 
|     pointerup: function (event) { | 
|         localDOMHandlers.mouseup.call(this, event); | 
|     }, | 
|     pointerout: function (event) { | 
|         if (!isPointerFromTouch(event)) { | 
|             localDOMHandlers.mouseout.call(this, event); | 
|         } | 
|     } | 
| }; | 
| zrUtil.each(['click', 'dblclick', 'contextmenu'], function (name) { | 
|     localDOMHandlers[name] = function (event) { | 
|         event = normalizeEvent(this.dom, event); | 
|         this.trigger(name, event); | 
|     }; | 
| }); | 
| var globalDOMHandlers = { | 
|     pointermove: function (event) { | 
|         if (!isPointerFromTouch(event)) { | 
|             globalDOMHandlers.mousemove.call(this, event); | 
|         } | 
|     }, | 
|     pointerup: function (event) { | 
|         globalDOMHandlers.mouseup.call(this, event); | 
|     }, | 
|     mousemove: function (event) { | 
|         this.trigger('mousemove', event); | 
|     }, | 
|     mouseup: function (event) { | 
|         var pointerCaptureReleasing = this.__pointerCapturing; | 
|         this.__togglePointerCapture(false); | 
|         this.trigger('mouseup', event); | 
|         if (pointerCaptureReleasing) { | 
|             event.zrEventControl = 'only_globalout'; | 
|             this.trigger('mouseout', event); | 
|         } | 
|     } | 
| }; | 
| function mountLocalDOMEventListeners(instance, scope) { | 
|     var domHandlers = scope.domHandlers; | 
|     if (env.pointerEventsSupported) { | 
|         zrUtil.each(localNativeListenerNames.pointer, function (nativeEventName) { | 
|             mountSingleDOMEventListener(scope, nativeEventName, function (event) { | 
|                 domHandlers[nativeEventName].call(instance, event); | 
|             }); | 
|         }); | 
|     } | 
|     else { | 
|         if (env.touchEventsSupported) { | 
|             zrUtil.each(localNativeListenerNames.touch, function (nativeEventName) { | 
|                 mountSingleDOMEventListener(scope, nativeEventName, function (event) { | 
|                     domHandlers[nativeEventName].call(instance, event); | 
|                     setTouchTimer(scope); | 
|                 }); | 
|             }); | 
|         } | 
|         zrUtil.each(localNativeListenerNames.mouse, function (nativeEventName) { | 
|             mountSingleDOMEventListener(scope, nativeEventName, function (event) { | 
|                 event = getNativeEvent(event); | 
|                 if (!scope.touching) { | 
|                     domHandlers[nativeEventName].call(instance, event); | 
|                 } | 
|             }); | 
|         }); | 
|     } | 
| } | 
| function mountGlobalDOMEventListeners(instance, scope) { | 
|     if (env.pointerEventsSupported) { | 
|         zrUtil.each(globalNativeListenerNames.pointer, mount); | 
|     } | 
|     else if (!env.touchEventsSupported) { | 
|         zrUtil.each(globalNativeListenerNames.mouse, mount); | 
|     } | 
|     function mount(nativeEventName) { | 
|         function nativeEventListener(event) { | 
|             event = getNativeEvent(event); | 
|             if (!isLocalEl(instance, event.target)) { | 
|                 event = normalizeGlobalEvent(instance, event); | 
|                 scope.domHandlers[nativeEventName].call(instance, event); | 
|             } | 
|         } | 
|         mountSingleDOMEventListener(scope, nativeEventName, nativeEventListener, { capture: true }); | 
|     } | 
| } | 
| function mountSingleDOMEventListener(scope, nativeEventName, listener, opt) { | 
|     scope.mounted[nativeEventName] = listener; | 
|     scope.listenerOpts[nativeEventName] = opt; | 
|     addEventListener(scope.domTarget, nativeEventName, listener, opt); | 
| } | 
| function unmountDOMEventListeners(scope) { | 
|     var mounted = scope.mounted; | 
|     for (var nativeEventName in mounted) { | 
|         if (mounted.hasOwnProperty(nativeEventName)) { | 
|             removeEventListener(scope.domTarget, nativeEventName, mounted[nativeEventName], scope.listenerOpts[nativeEventName]); | 
|         } | 
|     } | 
|     scope.mounted = {}; | 
| } | 
| var DOMHandlerScope = (function () { | 
|     function DOMHandlerScope(domTarget, domHandlers) { | 
|         this.mounted = {}; | 
|         this.listenerOpts = {}; | 
|         this.touching = false; | 
|         this.domTarget = domTarget; | 
|         this.domHandlers = domHandlers; | 
|     } | 
|     return DOMHandlerScope; | 
| }()); | 
| var HandlerDomProxy = (function (_super) { | 
|     __extends(HandlerDomProxy, _super); | 
|     function HandlerDomProxy(dom, painterRoot) { | 
|         var _this = _super.call(this) || this; | 
|         _this.__pointerCapturing = false; | 
|         _this.dom = dom; | 
|         _this.painterRoot = painterRoot; | 
|         _this._localHandlerScope = new DOMHandlerScope(dom, localDOMHandlers); | 
|         if (globalEventSupported) { | 
|             _this._globalHandlerScope = new DOMHandlerScope(document, globalDOMHandlers); | 
|         } | 
|         mountLocalDOMEventListeners(_this, _this._localHandlerScope); | 
|         return _this; | 
|     } | 
|     HandlerDomProxy.prototype.dispose = function () { | 
|         unmountDOMEventListeners(this._localHandlerScope); | 
|         if (globalEventSupported) { | 
|             unmountDOMEventListeners(this._globalHandlerScope); | 
|         } | 
|     }; | 
|     HandlerDomProxy.prototype.setCursor = function (cursorStyle) { | 
|         this.dom.style && (this.dom.style.cursor = cursorStyle || 'default'); | 
|     }; | 
|     HandlerDomProxy.prototype.__togglePointerCapture = function (isPointerCapturing) { | 
|         this.__mayPointerCapture = null; | 
|         if (globalEventSupported | 
|             && ((+this.__pointerCapturing) ^ (+isPointerCapturing))) { | 
|             this.__pointerCapturing = isPointerCapturing; | 
|             var globalHandlerScope = this._globalHandlerScope; | 
|             isPointerCapturing | 
|                 ? mountGlobalDOMEventListeners(this, globalHandlerScope) | 
|                 : unmountDOMEventListeners(globalHandlerScope); | 
|         } | 
|     }; | 
|     return HandlerDomProxy; | 
| }(Eventful)); | 
| export default HandlerDomProxy; |