| import Eventful from './Eventful.js'; | 
| import env from './env.js'; | 
| import { isCanvasEl, transformCoordWithViewport } from './dom.js'; | 
| var MOUSE_EVENT_REG = /^(?:mouse|pointer|contextmenu|drag|drop)|click/; | 
| var _calcOut = []; | 
| var firefoxNotSupportOffsetXY = env.browser.firefox | 
|     && +env.browser.version.split('.')[0] < 39; | 
| export function clientToLocal(el, e, out, calculate) { | 
|     out = out || {}; | 
|     if (calculate) { | 
|         calculateZrXY(el, e, out); | 
|     } | 
|     else if (firefoxNotSupportOffsetXY | 
|         && e.layerX != null | 
|         && e.layerX !== e.offsetX) { | 
|         out.zrX = e.layerX; | 
|         out.zrY = e.layerY; | 
|     } | 
|     else if (e.offsetX != null) { | 
|         out.zrX = e.offsetX; | 
|         out.zrY = e.offsetY; | 
|     } | 
|     else { | 
|         calculateZrXY(el, e, out); | 
|     } | 
|     return out; | 
| } | 
| function calculateZrXY(el, e, out) { | 
|     if (env.domSupported && el.getBoundingClientRect) { | 
|         var ex = e.clientX; | 
|         var ey = e.clientY; | 
|         if (isCanvasEl(el)) { | 
|             var box = el.getBoundingClientRect(); | 
|             out.zrX = ex - box.left; | 
|             out.zrY = ey - box.top; | 
|             return; | 
|         } | 
|         else { | 
|             if (transformCoordWithViewport(_calcOut, el, ex, ey)) { | 
|                 out.zrX = _calcOut[0]; | 
|                 out.zrY = _calcOut[1]; | 
|                 return; | 
|             } | 
|         } | 
|     } | 
|     out.zrX = out.zrY = 0; | 
| } | 
| export function getNativeEvent(e) { | 
|     return e | 
|         || window.event; | 
| } | 
| export function normalizeEvent(el, e, calculate) { | 
|     e = getNativeEvent(e); | 
|     if (e.zrX != null) { | 
|         return e; | 
|     } | 
|     var eventType = e.type; | 
|     var isTouch = eventType && eventType.indexOf('touch') >= 0; | 
|     if (!isTouch) { | 
|         clientToLocal(el, e, e, calculate); | 
|         var wheelDelta = getWheelDeltaMayPolyfill(e); | 
|         e.zrDelta = wheelDelta ? wheelDelta / 120 : -(e.detail || 0) / 3; | 
|     } | 
|     else { | 
|         var touch = eventType !== 'touchend' | 
|             ? e.targetTouches[0] | 
|             : e.changedTouches[0]; | 
|         touch && clientToLocal(el, touch, e, calculate); | 
|     } | 
|     var button = e.button; | 
|     if (e.which == null && button !== undefined && MOUSE_EVENT_REG.test(e.type)) { | 
|         e.which = (button & 1 ? 1 : (button & 2 ? 3 : (button & 4 ? 2 : 0))); | 
|     } | 
|     return e; | 
| } | 
| function getWheelDeltaMayPolyfill(e) { | 
|     var rawWheelDelta = e.wheelDelta; | 
|     if (rawWheelDelta) { | 
|         return rawWheelDelta; | 
|     } | 
|     var deltaX = e.deltaX; | 
|     var deltaY = e.deltaY; | 
|     if (deltaX == null || deltaY == null) { | 
|         return rawWheelDelta; | 
|     } | 
|     var delta = deltaY !== 0 ? Math.abs(deltaY) : Math.abs(deltaX); | 
|     var sign = deltaY > 0 ? -1 | 
|         : deltaY < 0 ? 1 | 
|             : deltaX > 0 ? -1 | 
|                 : 1; | 
|     return 3 * delta * sign; | 
| } | 
| export function addEventListener(el, name, handler, opt) { | 
|     el.addEventListener(name, handler, opt); | 
| } | 
| export function removeEventListener(el, name, handler, opt) { | 
|     el.removeEventListener(name, handler, opt); | 
| } | 
| export var stop = function (e) { | 
|     e.preventDefault(); | 
|     e.stopPropagation(); | 
|     e.cancelBubble = true; | 
| }; | 
| export function isMiddleOrRightButtonOnMouseUpDown(e) { | 
|     return e.which === 2 || e.which === 3; | 
| } | 
| export { Eventful as Dispatcher }; |