/**
 * @file track-list.js
 */
'../event-target'에서 EventTarget 가져오기;
'../mixins/evented'에서 {isEvented} 가져오기;

/**
 * {@link TextTrackList}, {@link AudioTrackList} 및 사이의 공통 기능
 * {@link VideoTrackList}
 *
 * @extends 이벤트 타겟
 */
클래스 TrackList는 EventTarget {를 확장합니다.
  /**
   * 이 클래스의 인스턴스 생성
   *
   * @param {트랙[]} 트랙
   * 목록을 초기화할 트랙 목록.
   *
   * @추상적인
   */
  생성자(트랙 = []) {
    감독자();

    this.tracks_ = [];

    /**
     * @memberof 트랙리스트
     * @member {번호} 길이
     * 이 Trackist에 있는 `Track`의 현재 수입니다.
     * @사례
     */
    Object.defineProperty(이것, '길이', {
      얻다() {
        this.tracks_.length 반환;
      }
    });

    에 대한 (하자 i = 0; i < 트랙.길이; i++) {
      this.addTrack(트랙[i]);
    }
  }

  /**
   * `TrackList`에 {@link Track} 추가
   *
   * @param {트랙} 트랙
   * 목록에 추가할 오디오, 비디오 또는 텍스트 트랙입니다.
   *
   * @fires 트랙리스트#addtrack
   */
  addTrack(트랙) {
    const 인덱스 = this.tracks_.length;

    if (!('' + index in this)) {
      Object.defineProperty(이것, 색인, {
        얻다() {
          return this.tracks_[인덱스];
        }
      });
    }

    // 중복 트랙을 추가하지 않음
    if (this.tracks_.indexOf(track) === -1) {
      this.tracks_.push(트랙);
      /**
       * 트랙 목록에 트랙이 추가되면 트리거됩니다.
       *
       * @event 트랙리스트#addtrack
       * @type {이벤트대상~이벤트}
       * @property {트랙} 트랙
       * 추가된 트랙에 대한 참조입니다.
       */
      this.trigger({
        길,
        유형: 'addtrack',
        대상: 이
      });
    }

    /**
     * 트랙 레이블이 변경되면 트리거됩니다.
     *
     * @event 트랙리스트#addtrack
     * @type {이벤트대상~이벤트}
     * @property {트랙} 트랙
     * 추가된 트랙에 대한 참조입니다.
     */
    track.labelchange_ = () => {
      this.trigger({
        길,
        유형: '라벨변경',
        대상: 이
      });
    };

    if (isEvented(트랙)) {
      track.addEventListener('labelchange', track.labelchange_);
    }
  }

  /**
   * `TrackList`에서 {@link Track} 제거
   *
   * @param {트랙} rtrack
   * 목록에서 제거할 오디오, 비디오 또는 텍스트 트랙입니다.
   *
   * @fires TrackList#removetrack
   */
  removeTrack(rtrack) {
    추적하자;

    for (let i = 0, l = this.length; i < 엘; i++) {
      if (이[i] === rtrack) {
        트랙 = this[i];
        경우 (track.off) {
          트랙.오프();
        }

        this.tracks_.splice(i, 1);

        부서지다;
      }
    }

    if (!트랙) {
      반품;
    }

    /**
     * 트랙 목록에서 트랙이 제거되면 트리거됩니다.
     *
     * @event 트랙리스트#removetrack
     * @type {이벤트대상~이벤트}
     * @property {트랙} 트랙
     * 제거된 트랙에 대한 참조입니다.
     */
    this.trigger({
      길,
      유형: 'removetrack',
      대상: 이
    });
  }

  /**
   * 트랙 ID로 TrackList에서 트랙 가져오기
   *
   * @param {string} id - 가져올 트랙의 id
   * @method getTrackById
   * @return {트랙}
   * @사적인
   */
  getTrackById(ID) {
    let 결과 = null;

    for (let i = 0, l = this.length; i < 엘; i++) {
      const track = this[i];

      경우 (track.id === id) {
        결과 = 트랙;
        부서지다;
      }
    }

    반환 결과;
  }
}

/**
 * 다른 트랙이 선택/활성화되면 트리거됩니다.
 *
 * @event 트랙리스트#변경
 * @type {이벤트대상~이벤트}
 */

/**
 * on + eventName으로 호출할 수 있는 이벤트. {@link EventHandler}를 참조하세요.
 *
 * @property {객체} TrackList#allowedEvents_
 * @사적인
 */
TrackList.prototype.allowedEvents_ = {
  변경: '변경',
  addtrack: '추가트랙',
  removetrack: '제거트랙',
  labelchange: '라벨체인지'
};

// 기능 감지를 허용하기 위해 속성 EventHandler 지원을 에뮬레이션합니다.
for (TrackList.prototype.allowedEvents_의 const 이벤트) {
  TrackList.prototype['on' + event] = null;
}

기본 TrackList 내보내기;