/**
 * @file track-list.js
 */
從 '../event-target' 導入 EventTarget;
從'../mixins/evented'導入{isEvented};

/**
 * {@link TextTrackList}、{@link AudioTrackList} 和
 * {@link VideoTrackList}
 *
 * @extends 事件目標
 */
類 TrackList 擴展 EventTarget {
  /**
   * 創建這個類的一個實例
   *
   * @param {Track[]} 曲目
   * 用於初始化列表的曲目列表。
   *
   * @抽象的
   */
  構造函數(軌道= []){
    極好的();

    this.tracks_ = [];

    /**
     * @memberof 曲目列表
     * @member {number} 長度
     * 此 Trackist 中的當前 `Track` 數。
     * @實例
     */
    Object.defineProperty(this, '長度', {
      得到() {
        返回 this.tracks_.length;
      }
    });

    對於(讓我 = 0; 我 < 跟踪。長度; 我 ++){
      this.addTrack(tracks[i]);
    }
  }

  /**
   * 添加 {@link Track} 到 `TrackList`
   *
   * @param {Track} 軌道
   * 要添加到列表中的音頻、視頻或文本軌道。
   *
   * @fires TrackList#addtrack
   */
  添加軌道(軌道){
    const index = this.tracks_.length;

    如果(!(「+ 在這個索引)){
      Object.defineProperty(這個,索引,{
        得到() {
          返回 this.tracks_[index];
        }
      });
    }

    // 不要添加重複的曲目
    如果 (this.tracks_.indexOf(track) === -1) {
      this.tracks_.push(track);
      /**
       * 當曲目添加到曲目列表時觸發。
       *
       * @event 曲目列表#addtrack
       * @type {EventTarget~Event}
       * @property {軌道}軌道
       * 對添加的軌道的引用。
       */
      這個。觸發({
        追踪,
        類型:“添加曲目”,
        目標:這個
      });
    }

    /**
     * 當曲目標籤改變時觸發。
     *
     * @event 曲目列表#addtrack
     * @type {EventTarget~Event}
     * @property {軌道}軌道
     * 對添加的軌道的引用。
     */
    track.labelchange_ = () => {
      這個。觸發({
        追踪,
        類型:'labelchange',
        目標:這個
      });
    };

    如果(isEvented(軌道)){
      track.addEventListener('labelchange', track.labelchange_);
    }
  }

  /**
   * 從 `TrackList` 中刪除 {@link Track}
   *
   * @param {Track} rtrack
   * 要從列表中刪除的音頻、視頻或文本軌道。
   *
   * @fires TrackList#removetrack
   */
  removeTrack(rtrack){
    讓跟踪;

    對於(讓我 = 0,升 = 這個。長度;  < 我; 我 ++){
      如果(這個[i] === rtrack){
        軌道=這個[我];
        如果(track.off){
          軌道關閉();
        }

        this.tracks_.splice(i, 1);

        休息;
      }
    }

    如果(!跟踪){
      返回;
    }

    /**
     * 從曲目列表中刪除曲目時觸發。
     *
     * @event TrackList#removetrack
     * @type {EventTarget~Event}
     * @property {軌道}軌道
     * 對已刪除曲目的引用。
     */
    這個。觸發({
      追踪,
      類型:'removetrack',
      目標:這個
    });
  }

  /**
   * 通過 tracks id 從 TrackList 中獲取一個 Track
   *
   * @param {string} id - 要獲取的軌道的 id
   * @method getTrackById
   * @return {軌道}
   * @私人的
   */
  getTrackById(id) {
    讓結果=空;

    對於(讓我 = 0,升 = 這個。長度;  < 我; 我 ++){
      const track = this[i];

      如果(track.id === id){
        結果=跟踪;
        休息;
      }
    }

    返回結果;
  }
}

/**
 * 當選擇/啟用不同的軌道時觸發。
 *
 * @event 曲目列表#change
 * @type {EventTarget~Event}
 */

/**
 * 可以用 on + eventName 調用的事件。請參閱{@link EventHandler}。
 *
 * @property {Object} TrackList#allowedEvents_
 * @私人的
 */
TrackList.prototype.allowedEvents_ = {
  改變:'改變',
  添加軌道:'添加軌道',
  removetrack: 'removetrack',
  labelchange:'labelchange'
};

// 模擬屬性 EventHandler 支持以允許進行特徵檢測
對於(TrackList.prototype.allowedEvents_ 中的常量事件){
  TrackList.prototype['on' + event] = null;
}

導出默認曲目列表;