public static void removeInternalEventListenerJoystick(
      ItsNatCompNormalEventListenersJoystick listeners,
      ClientDocumentImpl clientDoc,
      String type,
      boolean useCapture,
      boolean updateClient) {
    ItsNatDocumentImpl itsNatDoc = listeners.getItsNatDocumentImpl();
    if (itsNatDoc.isLoadingPhaseAndFastLoadMode()) {
      EventListener listener = listeners.getLoadScheduledMap().remove(type + "_" + useCapture);
      Document doc = itsNatDoc.getDocument();

      Browser browser = clientDoc.getBrowser();
      EventTarget target;
      String eventType;
      if (!(browser instanceof BrowserSVGPlugin)) {
        target = (EventTarget) ((DocumentView) doc).getDefaultView();
        eventType = "load";
      } else {
        target = (EventTarget) doc.getDocumentElement();
        eventType = "SVGLoad";
      }

      clientDoc.removeEventListener(target, eventType, listener, false);
    } else {
      removeInternalEventListenerJoystick2(listeners, clientDoc, type, useCapture, updateClient);
    }
  }
  public static void addInternalEventListenerJoystick(
      final ItsNatCompNormalEventListenersJoystick listeners,
      final ClientDocumentImpl clientDoc,
      final String type,
      final boolean useCapture,
      final int commMode,
      final ParamTransport[] extraParams,
      final String preSendCode,
      final long eventTimeout,
      final String bindToCustomFunc) {
    ItsNatDocumentImpl itsNatDoc = listeners.getItsNatDocumentImpl();
    if (itsNatDoc.isLoadingPhaseAndFastLoadMode()) {
      // En tiempo de carga en modo fast load el acceso a nodos no tolera cambios en el DOM de
      // elementos eliminados/cambiados de posición
      // y eso puede ocurrir mientras se construye la lista
      // Tenemos que delegar el proceso a después de la carga
      EventListener listener =
          new EventListenerSerializableInternal() {
            @Override
            public void handleEvent(Event evt) {
              addInternalEventListenerJoystick2(
                  listeners,
                  clientDoc,
                  type,
                  useCapture,
                  commMode,
                  extraParams,
                  preSendCode,
                  eventTimeout,
                  bindToCustomFunc);
            }
          };
      Document doc = itsNatDoc.getDocument();

      Browser browser = clientDoc.getBrowser();
      EventTarget target;
      String eventType;
      if (!(browser instanceof BrowserSVGPlugin)) {
        target = (EventTarget) ((DocumentView) doc).getDefaultView();
        eventType = "load";
      } else {
        target = (EventTarget) doc.getDocumentElement();
        eventType = "SVGLoad";
      }
      clientDoc.addEventListener(target, eventType, listener, false);
      listeners.getLoadScheduledMap().put(type + "_" + useCapture, listener);
    } else {
      addInternalEventListenerJoystick2(
          listeners,
          clientDoc,
          type,
          useCapture,
          commMode,
          extraParams,
          preSendCode,
          eventTimeout,
          bindToCustomFunc);
    }
  }
 public static boolean mustAddRemove(ItsNatCompNormalEventListenersJoystick listeners) {
   if (!listeners.isJoystickEnabled()) return false;
   if (!listeners.hasEnabledNormalEvents()) return false;
   ItsNatDocumentImpl itsNatDoc = listeners.getItsNatDocumentImpl();
   if (itsNatDoc.isLoadingPhaseAndFastLoadMode())
     return false; // Se hace de una vez cuando termina la carga
   return true;
 }
  public static void removeInternalEventListenerJoystick(
      ItsNatCompNormalEventListenersJoystick listeners, Element contentElem, String type) {
    if (contentElem == null) return;

    ItsNatDocumentImpl itsNatDoc = listeners.getItsNatDocumentImpl();
    ClientDocumentImpl[] clients = itsNatDoc.getAllClientDocumentsCopy();
    for (int i = 0; i < clients.length; i++) {
      removeInternalEventListenerJoystick(listeners, clients[i], contentElem, type);
    }
  }