{"version":3,"file":"EventGroup.js","sourceRoot":"../src/","sources":["EventGroup.ts"],"names":[],"mappings":"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","sourcesContent":["import { assign } from './object';\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\n/**\n * @internal\n */\nexport interface IEventRecord {\n  target: any;\n  eventName: string;\n  parent: any;\n  callback: (args?: any) => void;\n  elementCallback?: (...args: any[]) => void;\n  objectCallback?: (args?: any) => void;\n  options?: boolean | AddEventListenerOptions;\n}\n\n/**\n * @internal\n */\nexport interface IEventRecordsByName {\n  [eventName: string]: IEventRecordList;\n}\n\n/**\n * @internal\n */\nexport interface IEventRecordList {\n  [id: string]: IEventRecord[] | number;\n  count: number;\n}\n\n/**\n * @internal\n */\nexport interface IDeclaredEventsByName {\n  [eventName: string]: boolean;\n}\n\n/** An instance of EventGroup allows anything with a handle to it to trigger events on it.\n *  If the target is an HTMLElement, the event will be attached to the element and can be\n *  triggered as usual (like clicking for onClick).\n *  The event can be triggered by calling EventGroup.raise() here. If the target is an\n *  HTMLElement, the event gets raised and is handled by the browser. Otherwise, it gets\n *  handled here in EventGroup, and the handler is called in the context of the parent\n *  (which is passed in in the constructor).\n *\n * @public\n * {@docCategory EventGroup}\n */\nexport class EventGroup {\n  private static _uniqueId: number = 0;\n  private _parent: any;\n  private _eventRecords: IEventRecord[];\n  private _id: number = EventGroup._uniqueId++;\n  private _isDisposed: boolean;\n\n  /** For IE8, bubbleEvent is ignored here and must be dealt with by the handler.\n   *  Events raised here by default have bubbling set to false and cancelable set to true.\n   *  This applies also to built-in events being raised manually here on HTMLElements,\n   *  which may lead to unexpected behavior if it differs from the defaults.\n   *\n   */\n  public static raise(target: any, eventName: string, eventArgs?: any, bubbleEvent?: boolean): boolean | undefined {\n    let retVal;\n\n    if (EventGroup._isElement(target)) {\n      if (typeof document !== 'undefined' && document.createEvent) {\n        let ev = document.createEvent('HTMLEvents');\n\n        ev.initEvent(eventName, bubbleEvent || false, true);\n\n        assign(ev, eventArgs);\n\n        retVal = target.dispatchEvent(ev);\n      } else if (typeof document !== 'undefined' && (document as any).createEventObject) {\n        // IE8\n        let evObj = (document as any).createEventObject(eventArgs);\n        // cannot set cancelBubble on evObj, fireEvent will overwrite it\n        target.fireEvent('on' + eventName, evObj);\n      }\n    } else {\n      while (target && retVal !== false) {\n        let events = <IEventRecordsByName>target.__events__;\n        let eventRecords = events ? events[eventName] : null;\n\n        if (eventRecords) {\n          for (let id in eventRecords) {\n            if (eventRecords.hasOwnProperty(id)) {\n              let eventRecordList = <IEventRecord[]>eventRecords[id];\n\n              for (let listIndex = 0; retVal !== false && listIndex < eventRecordList.length; listIndex++) {\n                let record = eventRecordList[listIndex];\n\n                if (record.objectCallback) {\n                  retVal = record.objectCallback.call(record.parent, eventArgs);\n                }\n              }\n            }\n          }\n        }\n\n        // If the target has a parent, bubble the event up.\n        target = bubbleEvent ? target.parent : null;\n      }\n    }\n\n    return retVal;\n  }\n\n  public static isObserved(target: any, eventName: string): boolean {\n    let events = target && <IEventRecordsByName>target.__events__;\n\n    return !!events && !!events[eventName];\n  }\n\n  /** Check to see if the target has declared support of the given event. */\n  public static isDeclared(target: any, eventName: string): boolean {\n    let declaredEvents = target && <IDeclaredEventsByName>target.__declaredEvents;\n\n    return !!declaredEvents && !!declaredEvents[eventName];\n  }\n\n  public static stopPropagation(event: any): void {\n    if (event.stopPropagation) {\n      event.stopPropagation();\n    } else {\n      // IE8\n      event.cancelBubble = true;\n    }\n  }\n\n  private static _isElement(target: HTMLElement): boolean {\n    return (\n      !!target && (!!target.addEventListener || (typeof HTMLElement !== 'undefined' && target instanceof HTMLElement))\n    );\n  }\n\n  /** parent: the context in which events attached to non-HTMLElements are called */\n  public constructor(parent: any) {\n    this._parent = parent;\n    this._eventRecords = [];\n  }\n\n  public dispose(): void {\n    if (!this._isDisposed) {\n      this._isDisposed = true;\n\n      this.off();\n      this._parent = null;\n    }\n  }\n\n  /** On the target, attach a set of events, where the events object is a name to function mapping. */\n  public onAll(target: any, events: { [key: string]: (args?: any) => void }, useCapture?: boolean): void {\n    for (let eventName in events) {\n      if (events.hasOwnProperty(eventName)) {\n        this.on(target, eventName, events[eventName], useCapture);\n      }\n    }\n  }\n\n  /**\n   * On the target, attach an event whose handler will be called in the context of the parent\n   * of this instance of EventGroup.\n   */\n  public on(\n    target: any,\n    eventName: string,\n    callback: (args?: any) => void,\n    options?: boolean | AddEventListenerOptions,\n  ): void {\n    if (eventName.indexOf(',') > -1) {\n      let events = eventName.split(/[ ,]+/);\n\n      for (let i = 0; i < events.length; i++) {\n        this.on(target, events[i], callback, options);\n      }\n    } else {\n      let parent = this._parent;\n      let eventRecord: IEventRecord = {\n        target: target,\n        eventName: eventName,\n        parent: parent,\n        callback: callback,\n        options,\n      };\n\n      // Initialize and wire up the record on the target, so that it can call the callback if the event fires.\n      let events = <IEventRecordsByName>(target.__events__ = target.__events__ || {});\n      events[eventName] =\n        events[eventName] ||\n        <IEventRecordList>{\n          count: 0,\n        };\n      events[eventName][this._id] = events[eventName][this._id] || [];\n      (<IEventRecord[]>events[eventName][this._id]).push(eventRecord);\n      events[eventName].count++;\n\n      if (EventGroup._isElement(target)) {\n        let processElementEvent = (...args: any[]) => {\n          if (this._isDisposed) {\n            return;\n          }\n\n          let result;\n          try {\n            result = callback.apply(parent, args);\n            if (result === false && args[0]) {\n              let e = args[0];\n\n              if (e.preventDefault) {\n                e.preventDefault();\n              }\n\n              if (e.stopPropagation) {\n                e.stopPropagation();\n              }\n\n              e.cancelBubble = true;\n            }\n          } catch (e) {\n            // ignore\n          }\n\n          return result;\n        };\n\n        eventRecord.elementCallback = processElementEvent;\n\n        if (target.addEventListener) {\n          (<EventTarget>target).addEventListener(eventName, processElementEvent, options);\n        } else if (target.attachEvent) {\n          // IE8\n          target.attachEvent('on' + eventName, processElementEvent);\n        }\n      } else {\n        let processObjectEvent = (...args: any[]) => {\n          if (this._isDisposed) {\n            return;\n          }\n\n          return callback.apply(parent, args);\n        };\n\n        eventRecord.objectCallback = processObjectEvent;\n      }\n\n      // Remember the record locally, so that it can be removed.\n      this._eventRecords.push(eventRecord);\n    }\n  }\n\n  public off(\n    target?: any,\n    eventName?: string,\n    callback?: (args?: any) => void,\n    options?: boolean | AddEventListenerOptions,\n  ): void {\n    for (let i = 0; i < this._eventRecords.length; i++) {\n      let eventRecord = this._eventRecords[i];\n      if (\n        (!target || target === eventRecord.target) &&\n        (!eventName || eventName === eventRecord.eventName) &&\n        (!callback || callback === eventRecord.callback) &&\n        (typeof options !== 'boolean' || options === eventRecord.options)\n      ) {\n        let events = <IEventRecordsByName>eventRecord.target.__events__;\n        let targetArrayLookup = events[eventRecord.eventName];\n        let targetArray = targetArrayLookup ? <IEventRecord[]>targetArrayLookup[this._id] : null;\n\n        // We may have already target's entries, so check for null.\n        if (targetArray) {\n          if (targetArray.length === 1 || !callback) {\n            targetArrayLookup.count -= targetArray.length;\n            delete events[eventRecord.eventName][this._id];\n          } else {\n            targetArrayLookup.count--;\n            targetArray.splice(targetArray.indexOf(eventRecord), 1);\n          }\n\n          if (!targetArrayLookup.count) {\n            delete events[eventRecord.eventName];\n          }\n        }\n\n        if (eventRecord.elementCallback) {\n          if (eventRecord.target.removeEventListener) {\n            eventRecord.target.removeEventListener(\n              eventRecord.eventName,\n              eventRecord.elementCallback,\n              eventRecord.options,\n            );\n          } else if (eventRecord.target.detachEvent) {\n            // IE8\n            eventRecord.target.detachEvent('on' + eventRecord.eventName, eventRecord.elementCallback);\n          }\n        }\n\n        this._eventRecords.splice(i--, 1);\n      }\n    }\n  }\n\n  /** Trigger the given event in the context of this instance of EventGroup. */\n  public raise(eventName: string, eventArgs?: any, bubbleEvent?: boolean): boolean | undefined {\n    return EventGroup.raise(this._parent, eventName, eventArgs, bubbleEvent);\n  }\n\n  /** Declare an event as being supported by this instance of EventGroup. */\n  public declare(event: string | string[]): void {\n    let declaredEvents = (this._parent.__declaredEvents = this._parent.__declaredEvents || {});\n\n    if (typeof event === 'string') {\n      declaredEvents[event] = true;\n    } else {\n      for (let i = 0; i < event.length; i++) {\n        declaredEvents[event[i]] = true;\n      }\n    }\n  }\n}\n"]}