(function (global, factory) {
	if (typeof define === "function" && define.amd) {
		define('ss.sspath', ['jQuery'], factory);
	} else if (typeof exports !== "undefined") {
		factory(require('jQuery'));
	} else {
		var mod = {
			exports: {}
		};
		factory(global.jQuery);
		global.ssSspath = mod.exports;
	}
})(this, function (_jQuery) {
	'use strict';

	var _jQuery2 = _interopRequireDefault(_jQuery);

	function _interopRequireDefault(obj) {
		return obj && obj.__esModule ? obj : {
			default: obj
		};
	}

	var $window = (0, _jQuery2.default)(window),
	    $html = (0, _jQuery2.default)('html'),
	    $head = (0, _jQuery2.default)('head'),
	    path = {
		urlParseRE: /^(((([^:\/#\?]+:)?(?:(\/\/)((?:(([^:@\/#\?]+)(?:\:([^:@\/#\?]+))?)@)?(([^:\/#\?\]\[]+|\[[^\/\]@#?]+\])(?:\:([0-9]+))?))?)?)?((\/?(?:[^\/\?#]+\/+)*)([^\?#]*)))?(\?[^#]+)?)(#.*)?/,

		parseUrl: function parseUrl(url) {
			if (_jQuery2.default.type(url) === "object") {
				return url;
			}

			var matches = path.urlParseRE.exec(url || "") || [];

			return {
				href: matches[0] || "",
				hrefNoHash: matches[1] || "",
				hrefNoSearch: matches[2] || "",
				domain: matches[3] || "",
				protocol: matches[4] || "",
				doubleSlash: matches[5] || "",
				authority: matches[6] || "",
				username: matches[8] || "",
				password: matches[9] || "",
				host: matches[10] || "",
				hostname: matches[11] || "",
				port: matches[12] || "",
				pathname: matches[13] || "",
				directory: matches[14] || "",
				filename: matches[15] || "",
				search: matches[16] || "",
				hash: matches[17] || ""
			};
		},

		makePathAbsolute: function makePathAbsolute(relPath, absPath) {
			if (relPath && relPath.charAt(0) === "/") {
				return relPath;
			}

			relPath = relPath || "";
			absPath = absPath ? absPath.replace(/^\/|(\/[^\/]*|[^\/]+)$/g, "") : "";

			var absStack = absPath ? absPath.split("/") : [],
			    relStack = relPath.split("/");
			for (var i = 0; i < relStack.length; i++) {
				var d = relStack[i];
				switch (d) {
					case ".":
						break;
					case "..":
						if (absStack.length) {
							absStack.pop();
						}
						break;
					default:
						absStack.push(d);
						break;
				}
			}
			return "/" + absStack.join("/");
		},

		isSameDomain: function isSameDomain(absUrl1, absUrl2) {
			return path.parseUrl(absUrl1).domain === path.parseUrl(absUrl2).domain;
		},

		isRelativeUrl: function isRelativeUrl(url) {
			return path.parseUrl(url).protocol === "";
		},

		isAbsoluteUrl: function isAbsoluteUrl(url) {
			return path.parseUrl(url).protocol !== "";
		},

		makeUrlAbsolute: function makeUrlAbsolute(relUrl, absUrl) {
			if (!path.isRelativeUrl(relUrl)) {
				return relUrl;
			}

			var relObj = path.parseUrl(relUrl),
			    absObj = path.parseUrl(absUrl),
			    protocol = relObj.protocol || absObj.protocol,
			    doubleSlash = relObj.protocol ? relObj.doubleSlash : relObj.doubleSlash || absObj.doubleSlash,
			    authority = relObj.authority || absObj.authority,
			    hasPath = relObj.pathname !== "",
			    pathname = path.makePathAbsolute(relObj.pathname || absObj.filename, absObj.pathname),
			    search = relObj.search || !hasPath && absObj.search || "",
			    hash = relObj.hash;

			return protocol + doubleSlash + authority + pathname + search + hash;
		},

		addSearchParams: function addSearchParams(url, params) {
			var u = path.parseUrl(url),
			    params = typeof params === "string" ? path.convertSearchToArray(params) : params,
			    newParams = _jQuery2.default.extend(path.convertSearchToArray(u.search), params);
			return u.hrefNoSearch + '?' + _jQuery2.default.param(newParams) + (u.hash || "");
		},

		getSearchParams: function getSearchParams(url) {
			var u = path.parseUrl(url);
			return path.convertSearchToArray(u.search);
		},

		convertSearchToArray: function convertSearchToArray(search) {
			var parts,
			    i,
			    tmp,
			    params = {};
			search = search.replace(/^\?/, '');
			parts = search ? search.split('&') : [];
			for (i = 0; i < parts.length; i++) {
				tmp = parts[i].split('=');
				params[decodeURIComponent(tmp[0])] = decodeURIComponent(tmp[1]);
			}
			return params;
		},

		convertUrlToDataUrl: function convertUrlToDataUrl(absUrl) {
			var u = path.parseUrl(absUrl);
			if (path.isEmbeddedPage(u)) {
				return u.hash.split(dialogHashKey)[0].replace(/^#/, "");
			} else if (path.isSameDomain(u, document)) {
				return u.hrefNoHash.replace(document.domain, "");
			}
			return absUrl;
		},

		get: function get(newPath) {
			if (newPath === undefined) {
				newPath = location.hash;
			}
			return path.stripHash(newPath).replace(/[^\/]*\.[^\/*]+$/, '');
		},

		getFilePath: function getFilePath(path) {
			var splitkey = '&' + _jQuery2.default.mobile.subPageUrlKey;
			return path && path.split(splitkey)[0].split(dialogHashKey)[0];
		},

		set: function set(path) {
			location.hash = path;
		},

		isPath: function isPath(url) {
			return (/\//.test(url)
			);
		},

		clean: function clean(url) {
			return url.replace(document.domain, "");
		},

		stripHash: function stripHash(url) {
			return url.replace(/^#/, "");
		},

		cleanHash: function cleanHash(hash) {
			return path.stripHash(hash.replace(/\?.*$/, "").replace(dialogHashKey, ""));
		},

		isExternal: function isExternal(url) {
			var u = path.parseUrl(url);
			return u.protocol && u.domain !== document.domain ? true : false;
		},

		hasProtocol: function hasProtocol(url) {
			return (/^(:?\w+:)/.test(url)
			);
		}
	};

	_jQuery2.default.path = path;
});