/**
 * @file text-track-menu-item.js
 * /
importar MenuItem desde '../../menu/menu-item.js';
importar componente desde '../../component.js';
importar ventana desde 'global/window';
importar documento desde 'global/document';

/**
 * El tipo de elemento de menú específico para seleccionar un idioma dentro de un tipo de pista de texto
 *
 * @extiende elemento de menú
 * /
clase TextTrackMenuItem extiende MenuItem {

  /**
   * Crea una instancia de esta clase.
   *
   * @param {Jugador} jugador
   * El `Jugador` al que se debe adjuntar esta clase.
   *
   * @param {Objeto} [opciones]
   * El almacén de clave/valor de las opciones del jugador.
   * /
  constructor(jugador, opciones) {
    const pista = opciones.pista;
    const pistas = player.textTracks();

    // Modificar las opciones para el inicio de la clase principal MenuItem.
    opciones.etiqueta = pista.etiqueta || pista.idioma || 'Desconocido';
    options.selected = track.mode === 'mostrando';

    super(jugador, opciones);

    esta.pista = pista;
    // Determinar el(los) tipo(s) de pista(s) relevante(s) para este componente y filtrar
    // sacar tipos vacíos.
    este.tipos = (opciones.tipos || [opciones.tipo || este.pista.tipo]).filter(Boolean);

    const changeHandler = (... argumentos) => {
      this.handleTracksChange.apply(this, args);
    };
    const seleccionadoLanguageChangeHandler = (... argumentos) => {
      this.handleSelectedLanguageChange.apply(this, args);
    };

    player.on(['loadstart', 'texttrackchange'], changeHandler);
    pistas.addEventListener('cambio', changeHandler);
    tracks.addEventListener('cambio de idioma seleccionado', manejador de cambio de idioma seleccionado);
    this.on('dispose', function() {
      player.off(['loadstart', 'texttrackchange'], changeHandler);
      pistas.removeEventListener('cambio', changeHandler);
      tracks.removeEventListener('cambio de idioma seleccionado', manejador de cambio de idioma seleccionado);
    });

    // iOS7 no envía eventos de cambio a TextTrackLists cuando un
    // cambia el modo de la pista asociada. sin algo como
    // Object.observe() (tampoco presente en iOS7), no es
    // posible detectar cambios en el atributo mode y polyfill
    // el evento de cambio. Como un mal sustituto, despachamos manualmente
    // cambia los eventos cada vez que los controles modifican el modo.
    if (tracks.onchange === indefinido) {
      dejar evento;

      this.on(['tocar', 'hacer clic'], function() {
        if (tipo de ventana.Evento !== 'objeto') {
          // Android 2.3 arroja un error de constructor ilegal para window.Event
          intentar {
            evento = nueva ventana.Evento('cambio');
          } catch (err) {
            // continuar independientemente del error
          }
        }

        si (!evento) {
          evento = documento.createEvent('Evento');
          event.initEvent('cambiar', verdadero, verdadero);
        }

        pistas.dispatchEvent(evento);
      });
    }

    // establece el estado predeterminado basado en las pistas actuales
    this.handleTracksChange();
  }

  /**
   * Esto se llama cuando se "hace clic" en `TextTrackMenuItem`. Ver
   * {@link ClickableComponent} para obtener información más detallada sobre lo que puede ser un clic.
   *
   * @param {EventTarget~Evento} evento
   * El evento `keydown`, `top` o `click` que hizo que esta función se desactivara
   * llamado.
   *
   * @escucha toca
   * @escucha clic
   * /
  handleClick(evento) {
    const referenciaPista = esta.pista;
    const pistas = this.player_.textTracks();

    super.handleClick(evento);

    si (!pistas) {
      devolver;
    }

    para (sea i = 0; i < pistas.longitud; i++) {
      const pista = pistas[i];

      // Si la pista de la lista de pistas de texto no es del tipo correcto,
      // Saltarlo. No queremos afectar pistas de tipo(s) incompatible(s).
      if (this.kinds.indexOf(track.kind) === -1) {
        continuar;
      }

      // Si esta pista de texto es la pista del componente y no se muestra,
      // configurarlo para que se muestre.
      if (pista === pista de referencia) {
        if (track.mode !== 'mostrando') {
          track.mode = 'mostrando';
        }

      // Si esta pista de texto no es la pista del componente y no lo es
      // deshabilitado, configúrelo como deshabilitado.
      } else if (track.mode !== 'deshabilitado') {
        track.mode = 'deshabilitado';
      }
    }
  }

  /**
   * Manejar el cambio de la lista de pistas de texto
   *
   * @param {EventTarget~Evento} evento
   * El evento `cambio` que provocó que se llamara a esta función.
   *
   * @escucha TextTrackList#cambio
   * /
  handleTracksChange(evento) {
    const shouldBeSelected = this.track.mode === 'mostrando';

    // Evita llamadas redundantes a selected() porque pueden causar
    // lectores de pantalla para leer el texto de control adjunto innecesariamente
    if (deberíaSeleccionado !== this.isSelected_) {
      this.selected(deberíaSerSeleccionado);
    }
  }

  handleSelectedLanguageChange(evento) {
    if (this.track.mode === 'mostrando') {
      const idiomaSeleccionado = this.player_.cache_.selectedLanguage;

      // No reemplaces el tipo de pista en el mismo idioma
      if (Idioma seleccionado && idioma seleccionado.habilitado &&
        idioma seleccionado.idioma === este.pista.idioma &&
        idioma.seleccionado.tipo !== este.pista.tipo) {
        devolver;
      }

      this.player_.cache_.selectedLanguage = {
        habilitado: verdadero,
        idioma: este.pista.idioma,
        tipo: este.pista.tipo
      };
    }
  }

  disponer () {
    // eliminar la referencia al objeto de seguimiento al desechar
    esta.pista = nulo;

    super.dispose();
  }

}

Component.registerComponent('TextTrackMenuItem', TextTrackMenuItem);
exportar TextTrackMenuItem predeterminado;