/**
 * @file 章節-button.js
 */
從 './text-track-button.js' 導入 TextTrackButton;
從 '../../component.js' 導入組件;
從“./chapters-track-menu-item.js”導入 ChaptersTrackMenuItem;
從 '../../utils/string-cases.js' 導入 {toTitleCase};

/**
 * 用於切換和選擇章節的按鈕組件
 * 章節的行為與其他文本軌道大不相同
 * 線索是導航與其他替代語言的曲目
 *
 * @extends 文本跟踪按鈕
 */
類 ChaptersButton 擴展 TextTrackButton {

  /**
   * 創建此類的一個實例。
   *
   * @param {Player} 播放器
   * 此類應附加到的 `Player`。
   *
   * @param {對象} [選項]
   * 播放器選項的鍵/值存儲。
   *
   * @param {Component~ReadyCallback} [就緒]
   * 函數就緒時調用的函數。
   */
  構造函數(播放器,選項,準備就緒){
    超級(播放器,選項,準備就緒);

    this.selectCurrentItem_ = () => {
      this.items.forEach(item => {
        item.selected(this.track_.activeCues[0] === item.cue);
      });
    };
  }

  /**
   * 構建默認的 DOM `className`。
   *
   * @return {字符串}
   * 此對象的 DOM `className`。
   */
  buildCSSClass() {
    返回`vjs-chapters-button ${super.buildCSSClass()}`;
  }

  buildWrapperCSSClass() {
    返回`vjs-chapters-button ${super.buildWrapperCSSClass()}`;
  }

  /**
   * 根據項目的當前狀態更新菜單。
   *
   * @param {EventTarget~Event} [事件]
   * 觸發此函數運行的事件。
   *
   * @listens TextTrackList#addtrack
   * @listens TextTrackList#removetrack
   * @listens TextTrackList#change
   */
  更新(事件){
    if (event && event.track && event.track.kind !== 'chapters') {
      返回;
    }

    const track = this.findChaptersTrack();

    如果(跟踪!== this.track_){
      this.setTrack(track);
      超級更新();
    } else if (!this.items || (track && track.cues && track.cues.length !== this.items.length)) {
      // 最初更新菜單,或者如果設置後提示的數量發生變化
      超級更新();
    }
  }

  /**
   * 為章節按鈕設置當前選擇的曲目。
   *
   * @param {TextTrack} 軌道
   * 要選擇的新曲目。如果這是當前選擇的,則不會發生任何變化
   * 追踪。
   */
  設置軌道(軌道){
    如果(this.track_ === track){
      返回;
    }

    如果(!this.updateHandler_){
      this.updateHandler_ = this.update.bind(this);
    }

    // 這裡的 this.track_ 指的是舊的軌道實例
    如果(this.track_){
      const remoteTextTrackEl = this.player_.remoteTextTrackEls().getTrackElementByTrack_(this.track_);

      如果 (remoteTextTrackEl) {
        remoteTextTrackEl.removeEventListener('load', this.updateHandler_);
      }

      this.track_.removeEventListener('cuechange', this.selectCurrentItem_);

      this.track_ = null;
    }

    this.track_ = 軌道;

    // 這裡this.track_指的是新的track實例
    如果(this.track_){
      this.track_.mode = '隱藏';

      const remoteTextTrackEl = this.player_.remoteTextTrackEls().getTrackElementByTrack_(this.track_);

      如果 (remoteTextTrackEl) {
        remoteTextTrackEl.addEventListener('load', this.updateHandler_);
      }

      this.track_.addEventListener('cuechange', this.selectCurrentItem_);
    }
  }

  /**
   * 找到當前被這個 ChaptersButton 使用的軌道對象
   *
   * @return {TextTrack|undefined}
   * 當前曲目或未定義,如果未找到。
   */
  findChaptersTrack() {
    const tracks = this.player_.textTracks() || [];

    對於(讓 i = tracks.length - 1; i >= 0; i--){
      // 我們將始終選擇最後一首曲目作為我們的章節曲目
      const track = tracks[i];

      如果(track.kind === this.kind_){
        返回軌道;
      }
    }
  }

  /**
   * 根據曲目標籤獲取 ChaptersButton 的標題。這也將
   * 如果標籤不存在,則使用當前曲目本地化類型作為後備。
   *
   * @return {字符串}
   * 曲目當前標籤或本地化的曲目種類。
   */
  getMenuCaption() {
    如果(this.track_ && this.track_.label){
      返回 this.track_.label;
    }
    返回 this.localize(toTitleCase(this.kind_));
  }

  /**
   * 從章節軌道創建菜單
   *
   * @return {菜單}
   * 章節按鈕的新菜單
   */
  創建菜單(){
    this.options_.title = this.getMenuCaption();
    返回 super.createMenu();
  }

  /**
   * 為每個文本軌道創建一個菜單項
   *
   * @return {TextTrackMenuItem[]}
   * 菜單項數組
   */
  創建項目(){
    常量項 = [];

    如果(!this.track_){
      退換貨品;
    }

    const cues = this.track_.cues;

    如果(!提示){
      退換貨品;
    }

    for (let i = 0, l = cues.length; i < l; i++) {
      const cue = 提示[i];
      const mi = new ChaptersTrackMenuItem(this.player_, { track: this.track_, cue });

      items.push(mi);
    }

    退換貨品;
  }

}

/**
 * `kind` 的 TextTrack 來尋找它與這個菜單相關聯。
 *
 * @type {字符串}
 * @私人的
 */
ChaptersButton.prototype.kind_ = '章節';

/**
 * 應顯示在 `ChaptersButton` 控件上的文本。添加本地化。
 *
 * @type {字符串}
 * @私人的
 */
ChaptersButton.prototype.controlText_ = '章節';

Component.registerComponent('ChaptersButton', ChaptersButton);
導出默認章節按鈕;