/**
 * @Datei text-track-menu-item.js
 * /
import MenuItem from '../../menu/menu-item.js';
importiere Komponente aus '../../component.js';
import window from 'global/window';
dokument aus 'global/document' importieren;

/**
 * Der spezifische Menüpunkttyp für die Auswahl einer Sprache innerhalb einer Textspurart
 *
 * @extends MenuItem
 * /
class TextTrackMenuItem extends MenuItem {

  /**
   * Erzeugt eine Instanz dieser Klasse.
   *
   * @param {Player} Spieler
   *        Der `Player`, dem diese Klasse zugeordnet werden soll.
   *
   * @param {Object} [Optionen]
   *        Der Schlüssel/Wertspeicher der Playeroptionen.
   * /
  constructor(spieler, optionen) {
    const track = options.track;
    const tracks = player.textTracks();

    // Ändern Sie die Optionen für die Init der übergeordneten MenuItem-Klasse.
    options.label = track.label || track.language || 'Unknown';
    options.selected = track.mode === 'showing';

    super(Spieler, Optionen);

    this.track = track;
    // Bestimmen Sie die relevante(n) Art(en) von Spuren für diese Komponente und filtern Sie
    // aus leeren Arten.
    this.kinds = (options.kinds || [options.kind || this.track.kind]).filter(Boolean);

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

    player.on(['loadstart', 'texttrackchange'], changeHandler);
    tracks.addEventListener('change', changeHandler);
    tracks.addEventListener('selectedlanguagechange', selectedLanguageChangeHandler);
    this.on('dispose', function() {
      player.off(['loadstart', 'texttrackchange'], changeHandler);
      tracks.removeEventListener('change', changeHandler);
      tracks.removeEventListener('selectedlanguagechange', selectedLanguageChangeHandler);
    });

    // iOS7 sendet keine Änderungsereignisse an TextTrackLists, wenn ein
    // Der Modus der zugehörigen Spur ändert sich. Ohne etwas wie
    // Object.observe() (ebenfalls nicht vorhanden auf iOS7), ist es nicht
    // Erkennung von Änderungen am Modus-Attribut und Polyfill möglich
    // das Änderungsereignis. Als schlechten Ersatz versenden wir manuell
    // Änderungsereignisse, wenn die Steuerelemente den Modus ändern.
    if (tracks.onchange === undefined) {
      ereignis lassen;

      this.on(['tap', 'click'], function() {
        if (typeof window.Event !== 'object') {
          // Android 2.3 löst einen Illegal Constructor Fehler für window.Event aus
          Versuchen {
            event = new window.Event('change');
          } catch (err) {
            // Fortsetzen ohne Rücksicht auf Fehler
          }
        }

        if (!event) {
          event = document.createEvent('Event');
          event.initEvent('change', true, true);
        }

        tracks.dispatchEvent(event);
      });
    }

    // Festlegen des Standardstatus basierend auf den aktuellen Tracks
    this.handleTracksChange();
  }

  /**
   * Diese Funktion wird aufgerufen, wenn ein "TextTrackMenuItem" angeklickt wird. Sehen
   * {@link ClickableComponent} für genauere Informationen darüber, was ein Klick sein kann.
   *
   * @param {EventTarget~Event} event
   *        Das `Keydown`-, `Tap`- oder `Click`-Ereignis, das diese Funktion ausgelöst hat
   *        genannt.
   *
   * @listens tap
   * @listens klicken
   * /
  handleClick(event) {
    const referenceTrack = this.track;
    const tracks = this.player_.textTracks();

    super.handleClick(event);

    if (!tracks) {
      rückkehr;
    }

    for (let i = 0; i < tracks.length; i++) {
      const track = tracks[i];

      // Wenn der Track aus der Liste der Text-Tracks nicht von der richtigen Art ist,
      // Überspringen Sie es. Wir wollen nicht, dass Spuren unvereinbarer Art(en) beeinträchtigt werden.
      if (this.kinds.indexOf(track.kind) === -1) {
        weiter;
      }

      // Wenn diese Textspur die Spur der Komponente ist und sie nicht angezeigt wird,
      // auf "Anzeigen" einstellen.
      if (track === referenceTrack) {
        if (track.mode !== 'showing') {
          track.mode = 'anzeigen';
        }

      // Wenn diese Textspur nicht die Spur der Komponente ist und es sich nicht um
      // deaktiviert, setzen Sie ihn auf deaktiviert.
      } else if (track.mode !== 'disabled') {
        track.mode = 'deaktiviert';
      }
    }
  }

  /**
   * Änderung der Textspurliste handhaben
   *
   * @param {EventTarget~Event} event
   *        Das "Change"-Ereignis, das zum Aufruf dieser Funktion geführt hat.
   *
   * @listens TextTrackList#ändern
   * /
  handleTracksChange(event) {
    const shouldBeSelected = this.track.mode === 'showing';

    // Vermeiden Sie redundante selected()-Aufrufe, da diese zu
    // Bildschirmlesegeräte lesen den angehängten Kontrolltext unnötigerweise
    if (shouldBeSelected !== this.isSelected_) {
      this.selected(shouldBeSelected);
    }
  }

  handleSelectedLanguageChange(event) {
    if (this.track.mode === 'showing') {
      const selectedLanguage = this.player_.cache_.selectedLanguage;

      // Ersetzen Sie nicht die Art der Spur in derselben Sprache
      if (selectedLanguage && selectedLanguage.enabled &&
        selectedLanguage.language === this.track.language &&
        selectedLanguage.kind !== this.track.kind) {
        rückkehr;
      }

      this.player_.cache_.selectedLanguage = {
        aktiviert: wahr,
        sprache: this.track.language,
        art: this.track.kind
      };
    }
  }

  dispose() {
    // Entfernen der Referenz auf das Track-Objekt bei Dispose
    this.track = null;

    super.dispose();
  }

}

Component.registerComponent('TextTrackMenuItem', TextTrackMenuItem);
standard TextTrackMenuItem exportieren;