code: function event(name, objs, listener, useCapture, remove) {
      var ex = Array.isArray(objs) ? objs : [objs];
      for (var i = 0, l = ex.length, obj; i < l; i++) {
          if (listener && !remove) ex[i].addListener ? ex[i].addListener(name, listener) : ex[i].addEventListener(name, listener, useCapture);
          else if (listener) ex[i].removeListener ? ex[i].removeListener(name, listener) : ex[i].removeEventListener(name, listener, useCapture);
          else if (ex[i].emitAsync || ex[i].emit) {
              obj = arguments.length > event.length ? [name].concat(Array.prototype.slice.apply(arguments, event.length)) : null;
              if (obj) ex[i].emitAsync ? ex[i].emitAsync.apply(ex[i], obj) : ex[i].emit.apply(ex[i], obj);
              else ex[i].emitAsync ? ex[i].emitAsync(name) : ex[i].emit(name);
          } else {
              obj = typeof Event === 'object' ? new Event(name) : null;
              if (!obj && typeof document !== 'undefined' && document.createEvent) {
                  obj = document.createEvent('HTMLEvents');
                  obj.initEvent(name, true, true);
              }
              ex[i].dispatchEvent(obj);
          }
      }
  }
docs: Either emits/dispatches, adds or removes a listener
  
  @arg {String} name the event name
  @arg {(Object | Object[])} objs the element(s) to perform the operation on
  @arg {function} [listener] the listener to add or remove
  @arg {Boolean} [useCapture] the capture argument passed to add or remove a listener
  @arg {Boolean} [remove] true to remove the listener