Ext.ns("Terrasoft.utils.uri");

/**
 * Utility class for working with URI.
 * @singleton
 */

/**
 * Returns query of the link.
 * @param {HTMLAnchorElement | String} link.
 * @return {String}.
 */
Terrasoft.utils.uri.getQueryStrig = function (link) {
  if (Ext.isString(link)) {
    var href = link;
    link = document.createElement("a");
    link.href = href;
  }
  var queryString = "";
  if (link instanceof HTMLAnchorElement) {
    queryString = link.search || "";
  }
  return queryString.substring(1);
};

/**
 * Alias for {@link Terrasoft.utils.uri#getQueryStrig}
 * @member Terrasoft
 * @method getQueryStrig
 * @inheritdoc Terrasoft.utils.uri#getQueryStrig
 */
Terrasoft.getQueryStrig = Terrasoft.utils.uri.getQueryStrig;

/**
 * Removes parameters from query of the uri.
 * @param {HTMLAnchorElement | String} sourceLink.
 * @param {Array[]} parameters.
 * @returns {String} uri.
 */
Terrasoft.utils.uri.removeQueryParameters = function (sourceLink, parameters) {
  function getUri(sourceLink) {
    if (sourceLink instanceof HTMLAnchorElement) {
      var hrefNode = sourceLink.attributes.getNamedItem("href");
      var uri = "";
      if (hrefNode) {
        uri = hrefNode.nodeValue;
      }
      return uri;
    } else {
      return sourceLink;
    }
  }

  var uri = getUri(sourceLink);
  if (Ext.isEmpty(uri) || !Ext.isString(uri)) {
    return "";
  }
  var link = document.createElement("a");
  link.href = uri;
  if (Ext.isEmpty(link.search)) {
    return uri;
  }
  var queryString = Terrasoft.getQueryStrig(link);
  var queryParameters = Ext.urlDecode(queryString);
  Terrasoft.removeProperties(queryParameters, parameters);
  link.search = Ext.urlEncode(queryParameters);
  var href = link.href || "";
  if (Ext.String.endsWith(href, "?")) {
    href = href.replace(/\?$/, "");
  }
  link = null;
  return href;
};

/**
 * Alias for {@link Terrasoft.utils.uri#removeQueryParameters}
 * @member Terrasoft
 * @method removeQueryParameters
 * @inheritdoc Terrasoft.utils.uri#removeQueryParameters
 */
Terrasoft.removeQueryParameters = Terrasoft.utils.uri.removeQueryParameters;

/**
 * Checks whether string is valid URL.
 * @param {String} value String representation of URL.
 * @return {Boolean} Returns true if string is valid URL.
 */
Terrasoft.utils.uri.isUrl = function (value) {
  /*jshint maxlen:170 */
  //jscs:disable maximumLineLength
  var pattern = /(((^https?)|(^ftp)):\/\/([\-\w])+(\.[a-z]{2,4})*(:[0-9]+)?(\/[%\-\w]+(\.\w{2,})?)*(([\w\-\.\?\\\/+@&#;`~=%!]*)(\.\w{2,})?)*)\/?/i;
  //jscs:enable maximumLineLength
  /*jshint maxlen:120 */
  return pattern.test(value);
};

/**
 * Alias for {@link Terrasoft.utils.uri#isUrl}
 * @member Terrasoft
 * @method isUrl
 * @inheritdoc Terrasoft.utils.uri#isUrl
 */
Terrasoft.isUrl = Terrasoft.utils.uri.isUrl;

/**
 * Returns urls from input string.
 * @param {String} value String representation of URL.
 * @return {String[]} Returns urls from input string.
 */
Terrasoft.utils.uri.getUrls = function (value) {
  if (!Ext.isString(value)) {
    return [];
  }
  /*jshint maxlen:170 */
  //jscs:disable maximumLineLength
  var pattern = /(((https?)|(ftp)):\/\/([\-\w])+(\.[a-z]{2,4})*(:[0-9]+)?(\/[%\-\w]+(\.\w{2,})?)*(([\w\-\.\?\\\/+@&#;`~=%!]*)(\.\w{2,})?)*)\/?/ig;
  //jscs:enable maximumLineLength
  return value.match(pattern) || [];
};

/**
 * Alias for {@link Terrasoft.utils.uri#getUrls}
 * @member Terrasoft
 * @method getUrls
 * @inheritdoc Terrasoft.utils.uri#getUrls
 */
Terrasoft.getUrls = Terrasoft.utils.uri.getUrls;

/**
 * Adds protocol prefix for URL string.
 * @param {String} url Uniform resource locator.
 * @return {String} URL with protocol prefix.
 */
Terrasoft.utils.uri.addProtocolPrefix = function (url) {
  var rg = new RegExp("((ftp|http|https|file):\/\/)+", "i");
  return rg.test(url) ? url : "http://" + url;
};

/**
 * Alias for {@link Terrasoft.utils.uri#addProtocolPrefix}
 * @member Terrasoft
 * @method addProtocolPrefix
 * @inheritdoc Terrasoft.utils.uri#addProtocolPrefix
 */
Terrasoft.addProtocolPrefix = Terrasoft.utils.uri.addProtocolPrefix;

/**
 * Checks whether string is valid URL ignoring protocol.
 * @param {String} url String representation of URL.
 * @return {Boolean} Returns true if string is valid URL.
 */
Terrasoft.utils.uri.isAValidUrlIgnoreProtocol = function (url) {
  return new RegExp(/[-a-zA-Z0-9@:%_\+.~#?&//=]{2,256}\.[a-z]{2,4}\b(\/[-a-zA-Z0-9@:%_\+.~#?&//=]*)?/gi).test(url);
};

/**
 * Checks whether string is valid network path.
 * @param {String} path String representation of URL.
 * @return {Boolean} Returns true if string is valid URL.
 */
Terrasoft.utils.uri.isAValidNetworkPath = function (path) {
  return new RegExp(/^\\(\\[^\s\\]+)+(\\)?$/gi).test(path);
};

/**
 * Returns Url origin.
 * @param {String} url Any valid URL.
 * @return {String} origin of the given URL.
 */
Terrasoft.utils.uri.getUrlOrigin = function (url) {
  var linkElement = document.createElement("a");
  linkElement.href = url;
  return linkElement.origin;
};

/**
 * Alias for {@link Terrasoft.utils.uri#getUrlOrigin}
 * @member Terrasoft
 * @method getUrlOrigin
 * @inheritdoc Terrasoft.utils.uri#getUrlOrigin
 */
Terrasoft.getUrlOrigin = Terrasoft.utils.uri.getUrlOrigin;

/**
 * Returns Url of empty module.
 * @return {String} Empty module url.
 */
Terrasoft.getEmptyModuleUrl = function () {
  return "../core/hash/Terrasoft/amd/empty-module";
};