{"version":3,"file":"kendo.router.min.js","names":["factory","define","amd","$","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","this","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","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 (factory) {\n typeof define === 'function' && define.amd ? define(['kendo.core'], factory) :\n factory();\n})((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\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}));\n"]}