/**
 * @Datei url.js
 * @modul url
 * /
dokument aus 'global/document' importieren;
import window from 'global/window';

/**
 * @typedef {Object} url:URLObject
 *
 * @property {string} protocol
 *           Das Protokoll der Url, die geparst wurde.
 *
 * @property {string} hostname
 *           Der Hostname der URL, die geparst wurde.
 *
 * @property {string} port
 *           Der Port der Url, die geparst wurde.
 *
 * @Eigenschaft {string} pathname
 *           Der Pfadname der URL, die geparst wurde.
 *
 * @property {string} search
 *           Die Suchanfrage der Url, die geparst wurde.
 *
 * @Eigenschaft {string} hash
 *           Der Hash der Url, die geparst wurde.
 *
 * @property {string} host
 *           Der Host der Url, die geparst wurde.
 * /

/**
 * Auflösen und Parsen der Elemente einer URL.
 *
 * @Funktion
 * @param {String} url
 *           Die zu analysierende Url
 *
 * @return {url:URLObject}
 *           Ein Objekt mit Url-Details
 * /
export const parseUrl = function(url) {
  // Diese gesamte Methode kann durch eine URL ersetzt werden, sobald wir in der Lage sind, den IE11 zu verwerfen

  const props = ['protocol', 'hostname', 'port', 'pathname', 'search', 'hash', 'host'];

  // Fügen Sie die URL zu einem Anker hinzu und lassen Sie den Browser die URL auswerten
  const a = document.createElement('a');

  a.href = url;

  // Kopieren der spezifischen URL-Eigenschaften in ein neues Objekt
  // Dies ist auch für den IE erforderlich, da der Anker seine
  // Eigenschaften, wenn es aus dem Dom entfernt wird
  const details = {};

  for (let i = 0; i < props.length; i++) {
    details[props[i]] = a[props[i]];
  }

  // Im Gegensatz zu allen anderen fügt der IE den Port zur Host-Eigenschaft hinzu. Wenn
  // eine Anschlusskennung für Standardanschlüsse hinzugefügt wird, entfernen Sie diese.
  if (details.protocol === 'http:') {
    details.host = details.host.replace(/:80$/, '');
  }

  if (details.protocol === 'https:') {
    details.host = details.host.replace(/:443$/, '');
  }

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

  /* istanbul ignorieren wenn */
  if (!details.host) {
    details.host = window.location.host;
  }

  details zur Rückgabe;
};

/**
 * Absolute Version der relativen URL abrufen. Wird verwendet, um Flash die richtige URL mitzuteilen.
 *
 * @Funktion
 * @param {string} url
 *           URL absolut machen
 *
 * @return {string}
 *           Absolute URL
 *
 * @see http://stackoverflow.com/questions/470832/getting-an-absolute-url-from-a-relative-one-ie6-issue
 * /
export const getAbsoluteURL = function(url) {
  // Prüfen, ob absolute URL
  if (!url.match(/^https?:\/\//)) {
    // In absolute URL umwandeln. Flash, das außerhalb des Unternehmens gehostet wird, benötigt eine absolute URL.
    // Fügen Sie die URL zu einem Anker hinzu und lassen Sie den Browser die URL auswerten
    const a = document.createElement('a');

    a.href = url;

    url = a.href;
  }

  return url;
};

/**
 * Gibt die Erweiterung des übergebenen Dateinamens zurück. Es wird eine leere Zeichenkette zurückgegeben
 * wenn ein ungültiger Pfad übergeben wird.
 *
 * @Funktion
 * @param {string} Pfad
 *           Der Dateinamen-Pfad wie '/pfad/zu/datei.mp4'
 *
 * @return {string}
 *           Die Erweiterung in Kleinbuchstaben oder eine leere Zeichenkette, wenn keine
 *           erweiterung gefunden werden konnte.
 * /
export const getFileExtension = function(path) {
  if (typeof pfad === 'string') {
    const splitPathRe = /^(\/?)([\s\S]*?)((?:\.{1,2}|[^\/]+?)(\.([^\.\/\?]+)))(?:[\/]*|[\?].*)$/;
    const pathParts = splitPathRe.exec(path);

    if (pathParts) {
      return pathParts.pop().toLowerCase();
    }
  }

  zurückgeben '';
};

/**
 * Gibt zurück, ob die übergebene URL eine domänenübergreifende Anfrage ist oder nicht.
 *
 * @Funktion
 * @param {string} url
 *           Die zu prüfende Url.
 *
 * @param {Object} [winLoc]
 *           die Domäne, gegen die die URL geprüft werden soll, Standardwert ist window.location
 *
 * @param {string} [winLoc.protocol]
 *           Das Protokoll für den Fensterstandort ist standardmäßig window.location.protocol
 *
 * @param {string} [winLoc.host]
 *           Der Standardwert für den Fensterstandort host ist window.location.host
 *
 * @return {boolean}
 *           Unabhängig davon, ob es sich um eine bereichsübergreifende Anfrage handelt oder nicht.
 * /
export const isCrossOrigin = function(url, winLoc = window.location) {
  const urlInfo = parseUrl(url);

  // Relative URLs zum IE8-Protokoll geben ':' für das Protokoll zurück
  const srcProtocol = urlInfo.protocol === ':' ? winLoc.protocol : urlInfo.protocol;

  // Prüfen Sie, ob die Url für eine andere Domain/Herkunft ist
  // Der IE8 kennt location.origin nicht, daher verlassen wir uns hier nicht darauf
  const crossOrigin = (srcProtocol + urlInfo.host) !== (winLoc.protocol + winLoc.host);

  return crossOrigin;
};