{"version":3,"file":"kendo.router.min.js","names":["global","factory","exports","module","require","define","amd","globalThis","self","kendorouter","js","this","$","undefined$1","kendo","window","CHANGE","SAME","support","location","history","BROKEN_BACK_NAV","browser","msie","hashStrip","document","absoluteURL","path","pathPrefix","RegExp","test","protocol","host","replace","hashDelimiter","bang","locationHash","href","indexOf","split","stripRoot","root","url","substr","length","HistoryAdapter","Class","extend","back","setTimeout","forward","replaceLocation","PushStateAdapter","init","navigate","to","pushState","title","replaceState","normalize","current","pathname","search","change","callback","bind","stop","unbind","normalizeCurrent","options","fixedUrl","hash","hashBang","fixHash","fixBang","HashAdapter","_id","guid","prefix","fix","hashChange","on","_interval","setInterval","off","clearInterval","History","Observable","start","_started","adapter","createAdapter","historyLength","locations","_checkUrl","silent","_navigate","backCalled","push","decodeURIComponent","trigger","decode","call","newLength","navigatingInExisting","prev","backButtonPressed","pop","jQuery","kendo$1","INIT","ROUTE_MISSING","BACK","optionalParam","namedParam","splatParam","escapeRegExp","namedParamReplace","match","optional","stripUrl","Route","route","ignoreCase","routeToRegExp","_callback","params","idx","queryStringParams","parseQueryStringParams","_back","exec","slice","apply","worksWith","Router","fn","routes","destroy","_urlChangedProxy","_sameProxy","_backProxy","that","backProxy","e","urlChangedProxy","_urlChanged","same","_same","initEventObject","preventDefault","noop"],"sources":["kendo.router.js"],"mappings":"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","sourcesContent":["(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('kendo.core.js')) :\n typeof define === 'function' && define.amd ? define(['kendo.core'], factory) :\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, (global.kendorouter = global.kendorouter || {}, global.kendorouter.js = factory()));\n})(this, (function () {\n var __meta__ = {\n id: \"router\",\n name: \"Router\",\n category: \"framework\",\n description: \"The Router class is responsible for tracking the application state and navigating between the application states.\",\n depends: [ \"core\" ],\n hidden: false\n };\n\n (function($, undefined$1) {\n var kendo = window.kendo,\n CHANGE = \"change\",\n BACK = \"back\",\n SAME = \"same\",\n support = kendo.support,\n location = window.location,\n history = window.history,\n CHECK_URL_INTERVAL = 50,\n BROKEN_BACK_NAV = kendo.support.browser.msie,\n hashStrip = /^#*/,\n document = window.document;\n\n function absoluteURL(path, pathPrefix) {\n if (!pathPrefix) {\n return path;\n }\n\n if (path + \"/\" === pathPrefix) {\n path = pathPrefix;\n }\n\n var regEx = new RegExp(\"^\" + pathPrefix, \"i\");\n\n if (!regEx.test(path)) {\n path = pathPrefix + \"/\" + path;\n }\n\n return location.protocol + '//' + (location.host + \"/\" + path).replace(/\\/\\/+/g, '/');\n }\n\n function hashDelimiter(bang) {\n return bang ? \"#!\" : \"#\";\n }\n\n function locationHash(hashDelimiter) {\n var href = location.href;\n\n // ignore normal anchors if in hashbang mode - however, still return \"\" if no hash present\n if (hashDelimiter === \"#!\" && href.indexOf(\"#\") > -1 && href.indexOf(\"#!\") < 0) {\n return null;\n }\n\n return href.split(hashDelimiter)[1] || \"\";\n }\n\n function stripRoot(root, url) {\n if (url.indexOf(root) === 0) {\n return (url.substr(root.length)).replace(/\\/\\//g, '/');\n } else {\n return url;\n }\n }\n\n var HistoryAdapter = kendo.Class.extend({\n back: function() {\n if (BROKEN_BACK_NAV) {\n setTimeout(function() { history.back(); });\n } else {\n history.back();\n }\n },\n\n forward: function() {\n if (BROKEN_BACK_NAV) {\n setTimeout(function() { history.forward(); });\n } else {\n history.forward();\n }\n },\n\n length: function() {\n return history.length;\n },\n\n replaceLocation: function(url) {\n location.replace(url);\n }\n });\n\n var PushStateAdapter = HistoryAdapter.extend({\n init: function(root) {\n this.root = root;\n },\n\n navigate: function(to) {\n history.pushState({}, document.title, absoluteURL(to, this.root));\n },\n\n replace: function(to) {\n history.replaceState({}, document.title, absoluteURL(to, this.root));\n },\n\n normalize: function(url) {\n return stripRoot(this.root, url);\n },\n\n current: function() {\n var current = location.pathname;\n\n if (location.search) {\n current += location.search;\n }\n\n return stripRoot(this.root, current);\n },\n\n change: function(callback) {\n $(window).bind(\"popstate.kendo\", callback);\n },\n\n stop: function() {\n $(window).unbind(\"popstate.kendo\");\n },\n\n normalizeCurrent: function(options) {\n var fixedUrl,\n root = options.root,\n pathname = location.pathname,\n hash = locationHash(hashDelimiter(options.hashBang));\n\n if (root === pathname + \"/\") {\n fixedUrl = root;\n }\n\n if (root === pathname && hash) {\n fixedUrl = absoluteURL(hash.replace(hashStrip, ''), root);\n }\n\n if (fixedUrl) {\n history.pushState({}, document.title, fixedUrl);\n }\n }\n });\n\n function fixHash(url) {\n return url.replace(/^(#)?/, \"#\");\n }\n\n function fixBang(url) {\n return url.replace(/^(#(!)?)?/, \"#!\");\n }\n\n var HashAdapter = HistoryAdapter.extend({\n init: function(bang) {\n this._id = kendo.guid();\n this.prefix = hashDelimiter(bang);\n this.fix = bang ? fixBang : fixHash;\n },\n\n navigate: function(to) {\n location.hash = this.fix(to);\n },\n\n replace: function(to) {\n this.replaceLocation(this.fix(to));\n },\n\n normalize: function(url) {\n if (url.indexOf(this.prefix) < 0) {\n return url;\n } else {\n return url.split(this.prefix)[1];\n }\n },\n\n change: function(callback) {\n if (support.hashChange) {\n $(window).on(\"hashchange.\" + this._id, callback);\n } else {\n this._interval = setInterval(callback, CHECK_URL_INTERVAL);\n }\n },\n\n stop: function() {\n $(window).off(\"hashchange.\" + this._id);\n clearInterval(this._interval);\n },\n\n current: function() {\n return locationHash(this.prefix);\n },\n\n normalizeCurrent: function(options) {\n var pathname = location.pathname,\n root = options.root;\n\n if (options.pushState && root !== pathname) {\n this.replaceLocation(root + this.prefix + stripRoot(root, pathname));\n return true; // browser will reload at this point.\n }\n\n return false;\n }\n });\n\n var History = kendo.Observable.extend({\n start: function(options) {\n options = options || {};\n\n this.bind([CHANGE, BACK, SAME], options);\n\n if (this._started) {\n return;\n }\n\n this._started = true;\n\n options.root = options.root || \"/\";\n\n var adapter = this.createAdapter(options),\n current;\n\n // adapter may reload the document\n if (adapter.normalizeCurrent(options)) {\n return;\n }\n\n current = adapter.current();\n\n $.extend(this, {\n adapter: adapter,\n root: options.root,\n historyLength: adapter.length(),\n current: current,\n locations: [current]\n });\n\n adapter.change(this._checkUrl.bind(this));\n },\n\n createAdapter: function(options) {\n return support.pushState && options.pushState ? new PushStateAdapter(options.root) : new HashAdapter(options.hashBang);\n },\n\n stop: function() {\n if (!this._started) {\n return;\n }\n this.adapter.stop();\n this.unbind(CHANGE);\n this._started = false;\n },\n\n change: function(callback) {\n this.bind(CHANGE, callback);\n },\n\n replace: function(to, silent) {\n\n this._navigate(to, silent, function(adapter) {\n adapter.replace(to);\n this.locations[this.locations.length - 1] = this.current;\n });\n },\n\n navigate: function(to, silent) {\n if (to === \"#:back\") {\n this.backCalled = true;\n this.adapter.back();\n return;\n }\n\n this._navigate(to, silent, function(adapter) {\n adapter.navigate(to);\n this.locations.push(this.current);\n });\n },\n\n _navigate: function(to, silent, callback) {\n var adapter = this.adapter;\n\n to = adapter.normalize(to);\n\n if (this.current === to || this.current === decodeURIComponent(to)) {\n this.trigger(SAME);\n return;\n }\n\n if (!silent) {\n if (this.trigger(CHANGE, { url: to, decode: false })) {\n return;\n }\n }\n\n this.current = to;\n\n callback.call(this, adapter);\n\n this.historyLength = adapter.length();\n },\n\n _checkUrl: function() {\n var adapter = this.adapter,\n current = adapter.current(),\n newLength = adapter.length(),\n navigatingInExisting = this.historyLength === newLength,\n back = current === this.locations[this.locations.length - 2] && navigatingInExisting,\n backCalled = this.backCalled,\n prev = this.current;\n\n if (current === null || this.current === current || this.current === decodeURIComponent(current)) {\n return true;\n }\n\n this.historyLength = newLength;\n this.backCalled = false;\n\n this.current = current;\n\n if (back && this.trigger(\"back\", { url: prev, to: current })) {\n adapter.forward();\n this.current = prev;\n return;\n }\n\n if (this.trigger(CHANGE, { url: current, backButtonPressed: !backCalled })) {\n if (back) {\n adapter.forward();\n } else {\n adapter.back();\n this.historyLength --;\n }\n this.current = prev;\n return;\n }\n\n if (back) {\n this.locations.pop();\n } else {\n this.locations.push(current);\n }\n }\n });\n\n kendo.History = History;\n kendo.History.HistoryAdapter = HistoryAdapter;\n kendo.History.HashAdapter = HashAdapter;\n kendo.History.PushStateAdapter = PushStateAdapter;\n kendo.absoluteURL = absoluteURL;\n kendo.history = new History();\n })(window.kendo.jQuery);\n var kendo$1 = kendo;\n\n (function() {\n var kendo = window.kendo,\n history = kendo.history,\n Observable = kendo.Observable,\n INIT = \"init\",\n ROUTE_MISSING = \"routeMissing\",\n CHANGE = \"change\",\n BACK = \"back\",\n SAME = \"same\",\n optionalParam = /\\((.*?)\\)/g,\n namedParam = /(\\(\\?)?:\\w+/g,\n splatParam = /\\*\\w+/g,\n escapeRegExp = /[\\-{}\\[\\]+?.,\\\\\\^$|#\\s]/g;\n\n function namedParamReplace(match, optional) {\n return optional ? match : '([^\\/]+)';\n }\n\n function routeToRegExp(route, ignoreCase) {\n return new RegExp('^' + route\n .replace(escapeRegExp, '\\\\$&')\n .replace(optionalParam, '(?:$1)?')\n .replace(namedParam, namedParamReplace)\n .replace(splatParam, '(.*?)') + '$', ignoreCase ? \"i\" : \"\");\n }\n\n function stripUrl(url) {\n return url.replace(/(\\?.*)|(#.*)/g, \"\");\n }\n\n var Route = kendo.Class.extend({\n init: function(route, callback, ignoreCase) {\n if (!(route instanceof RegExp)) {\n route = routeToRegExp(route, ignoreCase);\n }\n\n this.route = route;\n this._callback = callback;\n },\n\n callback: function(url, back, decode) {\n var params,\n idx = 0,\n length,\n queryStringParams = kendo.parseQueryStringParams(url);\n queryStringParams._back = back;\n\n url = stripUrl(url);\n params = this.route.exec(url).slice(1);\n length = params.length;\n\n if (decode) {\n for (; idx < length; idx ++) {\n if (typeof params[idx] !== 'undefined') {\n params[idx] = decodeURIComponent(params[idx]);\n }\n }\n }\n\n params.push(queryStringParams);\n\n this._callback.apply(null, params);\n },\n\n worksWith: function(url, back, decode) {\n if (this.route.test(stripUrl(url))) {\n this.callback(url, back, decode);\n return true;\n } else {\n return false;\n }\n }\n });\n\n var Router = Observable.extend({\n init: function(options) {\n if (!options) {\n options = {};\n }\n\n Observable.fn.init.call(this);\n\n this.routes = [];\n this.pushState = options.pushState;\n this.hashBang = options.hashBang;\n this.root = options.root;\n this.ignoreCase = options.ignoreCase !== false;\n\n this.bind([INIT, ROUTE_MISSING, CHANGE, SAME, BACK], options);\n },\n\n destroy: function() {\n history.unbind(CHANGE, this._urlChangedProxy);\n history.unbind(SAME, this._sameProxy);\n history.unbind(BACK, this._backProxy);\n this.unbind();\n },\n\n start: function() {\n var that = this,\n sameProxy = function() { that._same(); },\n backProxy = function(e) { that._back(e); },\n urlChangedProxy = function(e) { that._urlChanged(e); };\n\n history.start({\n same: sameProxy,\n change: urlChangedProxy,\n back: backProxy,\n pushState: that.pushState,\n hashBang: that.hashBang,\n root: that.root\n });\n\n // eslint-disable-next-line no-undef\n var initEventObject = { url: history.current || \"/\", preventDefault: $.noop };\n\n if (!that.trigger(INIT, initEventObject)) {\n that._urlChanged(initEventObject);\n }\n\n this._urlChangedProxy = urlChangedProxy;\n this._backProxy = backProxy;\n },\n\n route: function(route, callback) {\n this.routes.push(new Route(route, callback, this.ignoreCase));\n },\n\n navigate: function(url, silent) {\n kendo.history.navigate(url, silent);\n },\n\n replace: function(url, silent) {\n kendo.history.replace(url, silent);\n },\n\n _back: function(e) {\n if (this.trigger(BACK, { url: e.url, to: e.to })) {\n e.preventDefault();\n }\n },\n\n _same: function() {\n this.trigger(SAME);\n },\n\n _urlChanged: function(e) {\n var url = e.url;\n var decode = !!e.decode;\n var back = e.backButtonPressed;\n\n if (!url) {\n url = \"/\";\n }\n\n if (this.trigger(CHANGE, { url: e.url, params: kendo.parseQueryStringParams(e.url), backButtonPressed: back })) {\n e.preventDefault();\n return;\n }\n\n var idx = 0,\n routes = this.routes,\n route,\n length = routes.length;\n\n for (; idx < length; idx ++) {\n route = routes[idx];\n\n if (route.worksWith(url, back, decode)) {\n return;\n }\n }\n\n if (this.trigger(ROUTE_MISSING, { url: url, params: kendo.parseQueryStringParams(url), backButtonPressed: back })) {\n e.preventDefault();\n }\n }\n });\n\n kendo.Router = Router;\n })();\n\n return kendo$1;\n\n}));\n"]}