function Popup(parentDomNode, options) {

  options = options || {};

  this._parentDomNode = parentDomNode;
  this._domNode = document.createElement('div');
  this._domNode.style.display = 'none';
  this._domNode.className = 'tmap-popup';

  this._parentDomNode.appendChild(this._domNode);
  $tw.utils.addClass(this._domNode, options.className);

  this._isEnabled = true;
  this._isPreventShowOrHide = false;
  this._isHideOnClick = !!options.hideOnClick;
  this._timeoutShow = null;
  this._timeoutHide = null;
  this._isDisplayNoneAfterAnimation = true;

  // delays
  let val = parseInt(options.leavingDelay);
  this._hideDelayLeavingPopup = utils.isInteger(val) ? val : 200;

  val = parseInt(options.hideDelay);
  this._hideDelay = utils.isInteger(val) ? val : 200;

  val = parseInt(options.showDelay);
  this._showDelay = utils.isInteger(val) ? val : 200;

  // force early binding of functions to this context
  utils.bindTo(this, [
    '_show',
    '_hide',
    '_handleEnter',
    '_handleLeave',
    '_handleAnimationEnd',
    '_handleClick'
  ]);

  // specify handlers
  this._listeners = {
    'mouseenter': this._handleEnter,
    'mouseleave': this._handleLeave,
    'click': [ this._handleClick, true ]
  };

  const fn = this._handleAnimationEnd;
  this._listeners[$tw.utils.convertEventName('animationEnd')] = fn;
  this._listeners[$tw.utils.convertEventName('transitionEnd')] = fn;

  // add handlers
  utils.setDomListeners('add', this._domNode, this._listeners, false);

}
Installs a hidden popup below `parentDomNode` that may be shown
and or hidden.

@constructor

@param {Element} [parentDomNode] - The popup container. The
   popup will create itself in this container.
@param {Hashmap} [options] - An options object.
@param {string} [options.className] - A classname to be added to
   the popup div.
@param {int} [options.delay] - The default delay for the popup
   show and hide.