/**
 * @file url.js
 * @module 網址
 */
從“全局/文檔”導入文檔;
從“全局/窗口”導入窗口;

/**
 * @typedef {物件} 網址:目錄物件
 *
 * @property {string} 協議
 * 被解析的 url 的協議。
 *
 * @property {string} 主機名
 * 已解析的 url 的主機名。
 *
 * @property {string} 端口
 * 被解析的url的端口。
 *
 * @property {string} 路徑名
 * 被解析的 url 的路徑名。
 *
 * @property {string} 搜索
 * 已解析的 url 的搜索查詢。
 *
 * @property {string} 散列
 * 已解析的 url 的哈希值。
 *
 * @property {string} 主機
 * 被解析的 url 的主機。
 */

/**
 * 解析和解析 URL 的元素。
 *
 * @功能
 * @param {String} 網址
 * 要解析的url
 *
 * @return {網址:存取物件}
 * url詳情對象
 */
export const parseUrl = function(url) {
  // 一旦我們能夠刪除 IE11,整個方法就可以替換為 URL

  const props = ['協議', '主機名', '端口', '路徑名', '搜索', '哈希', '主機'];

  // 將 url 添加到錨點,讓瀏覽器解析 URL
  const a = document.createElement('a');

  a.href = 網址;

  // 將特定的 URL 屬性複製到一個新對象
  // 這對於 IE 也是需要的,因為錨失去了它
  // 從 dom 中移除時的屬性
  const 細節 = {};

  對於(讓我 = 0; 我 < 推出。長度; 我 ++){
    細節[道具[i]] = a[道具[i]];
  }

  // IE 將端口添加到主機屬性,與其他人不同。如果
  // 為標準端口添加一個端口標識符,去掉它。
  如果(詳細信息.protocol === 'http:'){
    主機 = 詳細信息。主機。替換(/:80$/,「);
  }

  如果(細節.protocol ==='https:'){
    主機 = 詳細信息。主機更換(/:4433$/,「);
  }

  如果(!詳細信息. 協議) {
    details.protocol = window.location.protocol;
  }

  /* 伊斯坦布爾 如果忽略 */
  如果(!details.host){
    details.host = window.location.host;
  }

  退貨詳情;
};

/**
 * 獲取相對 URL 的絕對版本。用於告訴 Flash 正確的 URL。
 *
 * @功能
 * @param {string} 網址
 * 絕對URL
 *
 * @return {字符串}
 * 絕對網址
 *
 * @see http://stackoverflow.com/questions/470832/getting-an-absolute-url-from-a-relative-one-ie6-issue
 */
export const getAbsoluteURL = function(url) {
  // 檢查是否是絕對URL
  如果(!網址。匹配(/^ HTTPS?:\/\//)) {
    // 轉換為絕對 URL。場外託管的 Flash 需要一個絕對 URL。
    // 將 url 添加到錨點,讓瀏覽器解析 URL
    const a = document.createElement('a');

    a.href = 網址;

    url = a.href;
  }

  返回網址;
};

/**
 * 返回傳遞的文件名的擴展名。它將返回一個空字符串
 * 如果傳遞了無效路徑。
 *
 * @功能
 * @param {string} 路徑
 * 文件名路徑,如“/path/to/file.mp4”
 *
 * @return {字符串}
 * 小寫的擴展名,如果沒有則為空字符串
 * 可以找到擴展名。
 */
導出常量 getFileExtension = 函數(路徑){
  如果(路徑類型==='字符串'){
    常量分割路徑 = /^ (\/?)([\ s\ S] *?)(?:\. {1,2} | [^\/] +?)(\. ([^\.\/\?]+)))(?: [\/] *| [\?]。*) $/;
    const pathParts = splitPathRe.exec(path);

    如果(路徑部分){
      返回 pathParts.pop().toLowerCase();
    }
  }

  返回 '';
};

/**
 * 返回傳遞的url是否為跨域請求。
 *
 * @功能
 * @param {string} 網址
 * 要檢查的網址。
 *
 * @param {對象} [winLoc]
 * 檢查 url 的域,默認為 window.location
 *
 * @param {string} [winLoc.protocol]
 * 窗口定位協議默認為window.location.protocol
 *
 * @param {string} [winLoc.host]
 * 窗口位置主機默認為window.location.host
 *
 * @return {布爾值}
 * 是否跨域請求。
 */
export const isCrossOrigin = function(url, winLoc = window.location) {
  const urlInfo = parseUrl(url);

  // IE8 協議相對 url 將返回 ':' 作為協議
  常量 SRC 協議 = 網址。協議 === ':'?網絡協議:網絡協議;

  // 檢查 url 是否用於另一個域/來源
  // IE8 不知道 location.origin,所以我們不會在這裡依賴它
  常量交叉起源 =(SRC 協議 + 主機)!==(網絡協議 + 溫洛克主機);

  返回交叉點;
};