    /**
     * @file dom-data.js
     * @module dom-data
     */
    import * as Guid from './guid.js';

    /**
     * Element Data Store.
     *
     * Allows for binding data to an element without putting it directly on the
     * element. Ex. Event listeners are stored here.
     * (also from jsninja.com, slightly modified and updated for closure compiler)
     *
     * @type {Object}
     * @private
     */
    const elData = {};

    /*
     * Unique attribute name to store an element's guid in
     *
     * @type {String}
     * @constant
     * @private
     */
    const elIdAttr = 'vdata' + (new Date()).getTime();

    /**
     * Returns the cache object where data for an element is stored
     *
     * @param {Element} el
     *        Element to store data for.
     *
     * @return {Object}
     *         The cache object for that el that was passed in.
     */
    export function getData(el) {
      let id = el[elIdAttr];

      if (!id) {
        id = el[elIdAttr] = Guid.newGUID();
      }

      if (!elData[id]) {
        elData[id] = {};
      }

      return elData[id];
    }

    /**
     * Returns whether or not an element has cached data
     *
     * @param {Element} el
     *        Check if this element has cached data.
     *
     * @return {boolean}
     *         - True if the DOM element has cached data.
     *         - False otherwise.
     */
    export function hasData(el) {
      const id = el[elIdAttr];

      if (!id) {
        return false;
      }

      return !!Object.getOwnPropertyNames(elData[id]).length;
    }

    /**
     * Delete data for the element from the cache and the guid attr from getElementById
     *
     * @param {Element} el
     *        Remove cached data for this element.
     */
    export function removeData(el) {
      const id = el[elIdAttr];

      if (!id) {
        return;
      }

      // Remove all stored data
      delete elData[id];

      // Remove the elIdAttr property from the DOM node
      try {
        delete el[elIdAttr];
      } catch (e) {
        if (el.removeAttribute) {
          el.removeAttribute(elIdAttr);
        } else {
          // IE doesn't appear to support removeAttribute on the document element
          el[elIdAttr] = null;
        }
      }
    }