/**
 * @file setup.js - 없이 플레이어를 설정하는 기능
 * 동영상 태그의 데이터 설정 '속성'에 기반한 사용자 상호작용.
 *
 * @모듈 설정
 */
import * as Dom from './utils/dom';
'글로벌/문서'에서 문서 가져오기;
'글로벌/창'에서 창 가져오기;

let _windowLoaded = 거짓;
let videojs;

/**
 * 플레이어가 시작될 때 데이터 설정 '속성'이 있는 모든 태그를 설정합니다.
 */
const autoSetup = 함수() {

  if (videojs.options.autoSetup === false) {
    반품;
  }

  const vids = Array.prototype.slice.call(document.getElementsByTagName('비디오'));
  const audios = Array.prototype.slice.call(document.getElementsByTagName('audio'));
  const divs = Array.prototype.slice.call(document.getElementsByTagName('video-js'));
  const mediaEls = vids.concat(audios, divs);

  // 미디어 요소가 있는지 확인
  if (mediaEls && mediaEls.길이 > 0) {

    for (let i = 0, e = mediaEls.length; i < 이자형; i++) {
      const mediaEl = mediaEls[i];

      // 요소가 존재하는지 확인합니다. getAttribute func가 있습니다.
      if (미디어엘 && mediaEl.getAttribute) {

        // 이 플레이어가 아직 설정되지 않았는지 확인합니다.
        if (mediaEl.player === 정의되지 않음) {
          const options = mediaEl.getAttribute('data-setup');

          // data-setup attr이 존재하는지 확인합니다.
          // data-setup 속성을 추가한 경우에만 자동 설정합니다.
          if (옵션 !== null) {
            // 새로운 video.js 인스턴스를 만듭니다.
            videojs(미디어엘);
          }
        }

      // getAttribute가 정의되지 않은 경우 DOM을 기다려야 합니다.
      } else {
        autoSetupTimeout(1);
        부서지다;
      }
    }

  // 동영상이 없으므로 페이지 로드가 완료될 때까지 계속 반복합니다.
  } 그렇지 않으면 (!_windowLoaded) {
    autoSetupTimeout(1);
  }
};

/**
 * autoSetup을 실행하기 전에 페이지가 로드될 때까지 기다리십시오. 이것은 호출됩니다
 * `hasLoaded`가 false를 반환하는 경우 autoSetup.
 *
 * @param {숫자} 대기
 * 대기 시간(ms)
 *
 * @param {모듈:비디오js} [vjs]
 * videojs 라이브러리 기능
 */
기능 autoSetupTimeout(대기, vjs) {
  // 브라우저가 아닌 환경에서 파손으로부터 보호
  if (!Dom.isReal()) {
    반품;
  }

  경우 (vjs) {
    videojs = vjs;
  }

  window.setTimeout(autoSetup, wait);
}

/**
 * 창 로드 상태의 내부 추적을 true로 설정하는 데 사용됩니다.
 *
 * @사적인
 */
함수 setWindowLoaded() {
  _windowLoaded = 참;
  window.removeEventListener('로드', setWindowLoaded);
}

if (Dom.isReal()) {
  if (document.readyState === '완료') {
    setWindowLoaded();
  } else {
    /**
     * 창에서 로드 이벤트를 수신하고 _windowLoaded를 true로 설정합니다.
     *
     * 여기서는 GUID 증가를 피하기 위해 표준 이벤트 리스너를 사용합니다.
     * 플레이어가 생성되기 전.
     *
     * @listens 로드
     */
    window.addEventListener('로드', setWindowLoaded);
  }
}

/**
 * 창이 로드되었는지 확인
 */
const hasLoaded = 함수() {
  _windowLoaded 반환;
};

내보내기 {autoSetup, autoSetupTimeout, hasLoaded};