/**
 * @파일 url.js
 * @모듈 URL
 */
'글로벌/문서'에서 문서 가져오기;
'글로벌/창'에서 창 가져오기;

/**
 * @typedef {객체} url:URL객체
 *
 * @property {문자열} 프로토콜
 * 구문 분석된 URL의 프로토콜입니다.
 *
 * @property {문자열} 호스트 이름
 * 구문 분석된 URL의 호스트 이름입니다.
 *
 * @property {문자열} 포트
 * 구문 분석된 URL의 포트입니다.
 *
 * @property {문자열} 경로명
 * 구문 분석된 URL의 경로 이름입니다.
 *
 * @property {문자열} 검색
 * 파싱된 URL의 검색 쿼리입니다.
 *
 * @property {문자열} 해시
 * 구문 분석된 URL의 해시입니다.
 *
 * @property {문자열} 호스트
 * 구문 분석된 URL의 호스트입니다.
 */

/**
 * URL의 요소를 해결하고 구문 분석합니다.
 *
 * @기능
 * @param {문자열} URL
 * 파싱할 URL
 *
 * @return {url:URL객체}
 * url 상세정보 객체
 */
내보내기 const parseUrl = function(url) {
  // IE11을 삭제할 수 있게 되면 이 전체 메서드를 URL로 대체할 수 있습니다.

  const props = ['프로토콜', '호스트 이름', '포트', '경로 이름', '검색', '해시', '호스트'];

  // 앵커에 URL을 추가하고 브라우저가 URL을 구문 분석하도록 합니다.
  const a = document.createElement('a');

  a.href = URL;

  // 특정 URL 속성을 새 개체에 복사
  // IE에도 앵커가 손실되기 때문에 필요합니다.
  // dom에서 제거될 때의 속성
  const 세부 정보 = {};

  에 대한 (하자 i = 0; i < 소품.길이; i++) {
    세부사항[props[i]] = a[props[i]];
  }

  // IE는 다른 사람과 달리 호스트 속성에 포트를 추가합니다. 만약에
  // 표준 포트에 포트 식별자가 추가되면 제거합니다.
  if (details.protocol === 'http:') {
    details.host = details.host.replace(/:80$/, '');
  }

  if (details.protocol === 'https:') {
    세부사항.호스트 = 세부사항.호스트.대체(/:443$/, '');
  }

  if (!details.protocol) {
    details.protocol = window.location.protocol;
  }

  /* istanbul if 무시 */
  if (!details.host) {
    세부사항.호스트 = 창.위치.호스트;
  }

  반환 세부 정보;
};

/**
 * 상대 URL의 절대 버전을 가져옵니다. Flash에 올바른 URL을 알려주는 데 사용됩니다.
 *
 * @기능
 * @param {문자열} URL
 * URL을 절대화
 *
 * @return {문자열}
 * 절대 URL
 *
 * @see http://stackoverflow.com/questions/470832/getting-an-absolute-url-from-a-relative-one-ie6-issue
 */
내보내기 const getAbsoluteURL = 함수(url) {
  // 절대 URL인지 확인
  if (!url.match(/^https?:\/\//)) {
    // 절대 URL로 변환합니다. 외부에서 호스팅되는 Flash에는 절대 URL이 필요합니다.
    // 앵커에 URL을 추가하고 브라우저가 URL을 구문 분석하도록 합니다.
    const a = document.createElement('a');

    a.href = URL;

    url = a.href;
  }

  반환 URL;
};

/**
 * 전달된 파일 이름의 확장자를 반환합니다. 빈 문자열을 반환합니다
 * 유효하지 않은 경로를 전달한 경우.
 *
 * @기능
 * @param {문자열} 경로
 * '/path/to/file.mp4'와 같은 파일 이름 경로
 *
 * @return {문자열}
 * 소문자의 확장자 또는 없는 경우 빈 문자열
 * 확장자를 찾을 수 있습니다.
 */
내보내기 const getFileExtension = 함수(경로) {
  if (경로 유형 === '문자열') {
    const splitPathRe = /^(\/?)([\s\S]*?)((?:\.{1,2}|[^\/]+?)(\.([^\.\/ \?]+)))(?:[\/]*|[\?].*)$/;
    const pathParts = splitPathRe.exec(경로);

    if (경로 부분) {
      return pathParts.pop().toLowerCase();
    }
  }

  반품 '';
};

/**
 * 전달된 URL이 교차 도메인 요청인지 여부를 반환합니다.
 *
 * @기능
 * @param {문자열} URL
 * 확인할 URL입니다.
 *
 * @param {객체} [winLoc]
 * URL을 확인할 도메인, 기본값은 window.location
 *
 * @param {문자열} [winLoc.protocol]
 * 창 위치 프로토콜의 기본값은 window.location.protocol입니다.
 *
 * @param {문자열} [winLoc.호스트]
 * 창 위치 호스트는 기본적으로 window.location.host입니다.
 *
 * @return {부울}
 * 교차 도메인 요청인지 여부.
 */
내보내기 const isCrossOrigin = function(url, winLoc = window.location) {
  const urlInfo = parseUrl(url);

  // IE8 프로토콜 상대 URL은 프로토콜에 대해 ':'을 반환합니다.
  const srcProtocol = urlInfo.protocol === ':' ? winLoc.protocol : urlInfo.protocol;

  // URL이 다른 도메인/출처인지 확인
  // IE8은 location.origin을 알지 못하므로 여기에서는 의존하지 않습니다.
  const crossOrigin = (srcProtocol + urlInfo.host) !== (winLoc.protocol + winLoc.host);

  crossOrigin 반환;
};