{"version":3,"file":"kendo.all.min.js","sources":["kendo.all.js"],"sourcesContent":["(function (global, factory) {\r\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('jquery')) :\r\n typeof define === 'function' && define.amd ? define(['jquery'], factory) :\r\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, (global.kendoall = global.kendoall || {}, global.kendoall.js = factory()));\r\n})(this, (function () {\r\n let breakpoints;\r\n const EVENT = \"change\";\r\n\r\n const defaultBreakpoints = {\r\n small: \"(max-width: 500px)\",\r\n medium: \"(min-width: 500.1px) and (max-width: 768px)\",\r\n large: \"(min-width: 768.1px)\",\r\n };\r\n\r\n function createMediaQuery(query) {\r\n let mediaQueryList = window.matchMedia(query);\r\n let onEnterCallbacks = [];\r\n let onLeaveCallbacks = [];\r\n let onChangeHandlers = [];\r\n let kendoMediaQuery = { mediaQueryList };\r\n\r\n const onChangeHandler = (ev) => {\r\n onChangeHandlers.forEach((cb) => cb(ev));\r\n\r\n if (ev.matches) {\r\n onEnterCallbacks.forEach((cb) => cb(ev));\r\n } else {\r\n onLeaveCallbacks.forEach((cb) => cb(ev));\r\n }\r\n };\r\n\r\n mediaQueryList.addEventListener(EVENT, onChangeHandler);\r\n\r\n const onChange = (cb) => {\r\n onChangeHandlers.push(cb);\r\n return kendoMediaQuery;\r\n };\r\n\r\n const onEnter = (cb) => {\r\n onEnterCallbacks.push(cb);\r\n\r\n if (mediaQueryList.matches) {\r\n const media = mediaQueryList.media;\r\n const matches = true;\r\n\r\n const ev = new MediaQueryListEvent(EVENT, {\r\n media,\r\n matches,\r\n });\r\n\r\n cb(ev);\r\n }\r\n\r\n return kendoMediaQuery;\r\n };\r\n\r\n const onLeave = (cb) => {\r\n onLeaveCallbacks.push(cb);\r\n return kendoMediaQuery;\r\n };\r\n\r\n const destroy = () => {\r\n if (mediaQueryList) {\r\n mediaQueryList.removeEventListener(EVENT, onChangeHandler);\r\n }\r\n onEnterCallbacks = null;\r\n onLeaveCallbacks = null;\r\n onChangeHandlers = null;\r\n mediaQueryList = null;\r\n kendoMediaQuery = null;\r\n };\r\n\r\n kendoMediaQuery.onChange = onChange;\r\n kendoMediaQuery.onEnter = onEnter;\r\n kendoMediaQuery.onLeave = onLeave;\r\n kendoMediaQuery.destroy = destroy;\r\n\r\n return kendoMediaQuery;\r\n }\r\n\r\n function mediaQuery(query) {\r\n if (!query) {\r\n return;\r\n }\r\n\r\n breakpoints =\r\n breakpoints ||\r\n Object.assign({}, defaultBreakpoints, kendo.defaults.breakpoints);\r\n\r\n if (query in breakpoints) {\r\n query = breakpoints[query];\r\n }\r\n\r\n return createMediaQuery(query);\r\n }\r\n\r\n var __meta__$2G = {\r\n id: \"core\",\r\n name: \"Core\",\r\n category: \"framework\",\r\n description: \"The core of the Kendo framework.\"\r\n };\r\n\r\n var packageMetadata = {\r\n name: '@progress/kendo-ui',\r\n productName: 'Kendo UI',\r\n productCodes: ['KENDOUICOMPLETE', 'KENDOUI', 'UIASPCORE', 'KENDOMVC', 'KENDOUIMVC'],\r\n publishDate: 0,\r\n version: '2024.3.806'.replace(/^\\s+|\\s+$/g, ''),\r\n licensingDocsUrl: 'https://docs.telerik.com/kendo-ui/intro/installation/using-license-code?utm_medium=product&utm_source=kendojquery&utm_campaign=kendo-ui-jquery-purchase-license-keys-warning'\r\n };\r\n\r\n\r\n (function($, window, undefined$1) {\r\n var kendo = window.kendo = window.kendo || { cultures: {} },\r\n extend = $.extend,\r\n each = $.each,\r\n isArray = Array.isArray,\r\n noop = $.noop,\r\n math = Math,\r\n Template,\r\n JSON = window.JSON || {},\r\n support = {},\r\n percentRegExp = /%/,\r\n formatRegExp = /\\{(\\d+)(:[^\\}]+)?\\}/g,\r\n boxShadowRegExp = /(\\d+(?:\\.?)\\d*)px\\s*(\\d+(?:\\.?)\\d*)px\\s*(\\d+(?:\\.?)\\d*)px\\s*(\\d+)?/i,\r\n numberRegExp = /^(\\+|-?)\\d+(\\.?)\\d*$/,\r\n MONTH = \"month\",\r\n HOUR = \"hour\",\r\n ZONE = \"zone\",\r\n WEEKDAY = \"weekday\",\r\n QUARTER = \"quarter\",\r\n DATE_FIELD_MAP = {\r\n \"G\": \"era\",\r\n \"y\": \"year\",\r\n \"q\": QUARTER,\r\n \"Q\": QUARTER,\r\n \"M\": MONTH,\r\n \"L\": MONTH,\r\n \"d\": \"day\",\r\n \"E\": WEEKDAY,\r\n \"c\": WEEKDAY,\r\n \"e\": WEEKDAY,\r\n \"h\": HOUR,\r\n \"H\": HOUR,\r\n \"k\": HOUR,\r\n \"K\": HOUR,\r\n \"m\": \"minute\",\r\n \"s\": \"second\",\r\n \"a\": \"dayperiod\",\r\n \"t\": \"dayperiod\",\r\n \"x\": ZONE,\r\n \"X\": ZONE,\r\n \"z\": ZONE,\r\n \"Z\": ZONE\r\n },\r\n NAME_TYPES = {\r\n month: {\r\n type: \"months\",\r\n minLength: 3,\r\n standAlone: \"L\"\r\n },\r\n\r\n quarter: {\r\n type: \"quarters\",\r\n minLength: 3,\r\n standAlone: \"q\"\r\n },\r\n\r\n weekday: {\r\n type: \"days\",\r\n minLength: {\r\n E: 0,\r\n c: 3,\r\n e: 3\r\n },\r\n standAlone: \"c\"\r\n },\r\n\r\n dayperiod: {\r\n type: \"dayPeriods\",\r\n minLength: 0\r\n },\r\n\r\n era: {\r\n type: \"eras\",\r\n minLength: 0\r\n }\r\n },\r\n FUNCTION = \"function\",\r\n STRING = \"string\",\r\n NUMBER = \"number\",\r\n OBJECT = \"object\",\r\n NULL = \"null\",\r\n BOOLEAN = \"boolean\",\r\n UNDEFINED = \"undefined\",\r\n PREFIX = \"prefix\",\r\n ARIA_LABELLEDBY = \"aria-labelledby\",\r\n ARIA_LABEL = \"aria-label\",\r\n LABELIDPART = \"_label\",\r\n getterCache = {},\r\n setterCache = {},\r\n slice = [].slice,\r\n cssPropertiesNames = [ \"themeColor\", \"fillMode\", \"shape\", \"size\", \"rounded\", \"positionMode\" ],\r\n // avoid extending the depricated properties in latest verions of jQuery\r\n noDepricateExtend = function() {\r\n var src, copyIsArray, copy, name, options, clone,\r\n target = arguments[ 0 ] || {},\r\n i = 1,\r\n length = arguments.length,\r\n deep = false;\r\n\r\n // Handle a deep copy situation\r\n if ( typeof target === \"boolean\" ) {\r\n deep = target;\r\n\r\n // skip the boolean and the target\r\n target = arguments[ i ] || {};\r\n i++;\r\n }\r\n\r\n // Handle case when target is a string or something (possible in deep copy)\r\n if ( typeof target !== \"object\" && typeof target !== \"function\") {\r\n target = {};\r\n }\r\n\r\n // extend jQuery itself if only one argument is passed\r\n if ( i === length ) {\r\n target = this;\r\n i--;\r\n }\r\n\r\n for ( ; i < length; i++ ) {\r\n\r\n // Only deal with non-null/undefined values\r\n if ( ( options = arguments[ i ] ) != null ) {\r\n\r\n // Extend the base object\r\n for ( name in options ) {\r\n // filters, concat and : properties are depricated in the jQuery 3.3.0\r\n // accessing these properties throw a warning when jQuery migrate is included\r\n if (name == \"filters\" || name == \"concat\" || name == \":\") {\r\n continue;\r\n }\r\n src = target[ name ];\r\n copy = options[ name ];\r\n\r\n // Prevent never-ending loop\r\n if ( target === copy ) {\r\n continue;\r\n }\r\n\r\n // Recurse if we're merging plain objects or arrays\r\n if ( deep && copy && ( jQuery.isPlainObject( copy ) ||\r\n ( copyIsArray = Array.isArray( copy ) ) ) ) {\r\n\r\n if ( copyIsArray ) {\r\n copyIsArray = false;\r\n clone = src && Array.isArray( src ) ? src : [];\r\n\r\n } else {\r\n clone = src && jQuery.isPlainObject( src ) ? src : {};\r\n }\r\n\r\n // Never move original objects, clone them\r\n target[ name ] = noDepricateExtend( deep, clone, copy );\r\n\r\n // Don't bring in undefined values\r\n } else if ( copy !== undefined$1 ) {\r\n target[ name ] = copy;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Return the modified object\r\n return target;\r\n };\r\n\r\n kendo.version = \"2024.3.806\".replace(/^\\s+|\\s+$/g, '');\r\n\r\n function Class() {}\r\n\r\n Class.extend = function(proto) {\r\n var base = function() {},\r\n member,\r\n that = this,\r\n subclass = proto && proto.init ? proto.init : function() {\r\n that.apply(this, arguments);\r\n },\r\n fn;\r\n\r\n base.prototype = that.prototype;\r\n fn = subclass.fn = subclass.prototype = new base();\r\n\r\n for (member in proto) {\r\n if (proto[member] != null && proto[member].constructor === Object) {\r\n // Merge object members\r\n fn[member] = extend(true, {}, base.prototype[member], proto[member]);\r\n } else {\r\n fn[member] = proto[member];\r\n }\r\n }\r\n\r\n fn.constructor = subclass;\r\n subclass.extend = that.extend;\r\n\r\n return subclass;\r\n };\r\n\r\n Class.prototype._initOptions = function(options) {\r\n this.options = deepExtend({}, this.options, options);\r\n };\r\n\r\n const isPresent = kendo.isPresent = (value) => value !== null && value !== undefined$1;\r\n const isBlank = kendo.isBlank = (value) => value === null || value === undefined$1;\r\n const isString = kendo.isString = (value) => typeof value === 'string';\r\n const isNumeric = kendo.isNumeric = (value) => !isNaN(value - parseFloat(value));\r\n const isDate = kendo.isDate = (value) => value && value.getTime;\r\n const isFunction = kendo.isFunction = (value) => typeof value === 'function';\r\n\r\n var preventDefault = function() {\r\n this._defaultPrevented = true;\r\n };\r\n\r\n var isDefaultPrevented = function() {\r\n return this._defaultPrevented === true;\r\n };\r\n\r\n var Observable = Class.extend({\r\n init: function() {\r\n this._events = {};\r\n },\r\n\r\n bind: function(eventName, handlers, one) {\r\n var that = this,\r\n idx,\r\n eventNames = typeof eventName === STRING ? [eventName] : eventName,\r\n length,\r\n original,\r\n handler,\r\n handlersIsFunction = typeof handlers === FUNCTION,\r\n events;\r\n\r\n if (handlers === undefined$1) {\r\n for (idx in eventName) {\r\n that.bind(idx, eventName[idx]);\r\n }\r\n return that;\r\n }\r\n\r\n for (idx = 0, length = eventNames.length; idx < length; idx++) {\r\n eventName = eventNames[idx];\r\n\r\n handler = handlersIsFunction ? handlers : handlers[eventName];\r\n\r\n if (handler) {\r\n if (one) {\r\n original = handler;\r\n handler = function() {\r\n that.unbind(eventName, handler);\r\n original.apply(that, arguments);\r\n };\r\n handler.original = original;\r\n }\r\n events = that._events[eventName] = that._events[eventName] || [];\r\n events.push(handler);\r\n }\r\n }\r\n\r\n return that;\r\n },\r\n\r\n one: function(eventNames, handlers) {\r\n return this.bind(eventNames, handlers, true);\r\n },\r\n\r\n first: function(eventName, handlers) {\r\n var that = this,\r\n idx,\r\n eventNames = typeof eventName === STRING ? [eventName] : eventName,\r\n length,\r\n handler,\r\n handlersIsFunction = typeof handlers === FUNCTION,\r\n events;\r\n\r\n for (idx = 0, length = eventNames.length; idx < length; idx++) {\r\n eventName = eventNames[idx];\r\n\r\n handler = handlersIsFunction ? handlers : handlers[eventName];\r\n\r\n if (handler) {\r\n events = that._events[eventName] = that._events[eventName] || [];\r\n events.unshift(handler);\r\n }\r\n }\r\n\r\n return that;\r\n },\r\n\r\n trigger: function(eventName, e) {\r\n var that = this,\r\n events = that._events[eventName],\r\n idx,\r\n length;\r\n\r\n if (events) {\r\n e = e || {};\r\n\r\n e.sender = that;\r\n\r\n e._defaultPrevented = false;\r\n\r\n e.preventDefault = preventDefault;\r\n\r\n e.isDefaultPrevented = isDefaultPrevented;\r\n\r\n events = events.slice();\r\n\r\n for (idx = 0, length = events.length; idx < length; idx++) {\r\n events[idx].call(that, e);\r\n }\r\n\r\n return e._defaultPrevented === true;\r\n }\r\n\r\n return false;\r\n },\r\n\r\n unbind: function(eventName, handler) {\r\n var that = this,\r\n events = that._events[eventName],\r\n idx;\r\n\r\n if (eventName === undefined$1) {\r\n that._events = {};\r\n } else if (events) {\r\n if (handler) {\r\n for (idx = events.length - 1; idx >= 0; idx--) {\r\n if (events[idx] === handler || events[idx].original === handler) {\r\n events.splice(idx, 1);\r\n }\r\n }\r\n } else {\r\n that._events[eventName] = [];\r\n }\r\n }\r\n\r\n return that;\r\n }\r\n });\r\n\r\n\r\n function compilePart(part, stringPart) {\r\n if (stringPart) {\r\n return \"'\" +\r\n part.split(\"'\").join(\"\\\\'\")\r\n .split('\\\\\"').join('\\\\\\\\\\\\\"')\r\n .replace(/\\n/g, \"\\\\n\")\r\n .replace(/\\r/g, \"\\\\r\")\r\n .replace(/\\t/g, \"\\\\t\") + \"'\";\r\n } else {\r\n var first = part.charAt(0),\r\n rest = part.substring(1);\r\n\r\n if (first === \"=\") {\r\n return \"+(\" + rest + \")+\";\r\n } else if (first === \":\") {\r\n return \"+$kendoHtmlEncode(\" + rest + \")+\";\r\n } else {\r\n return \";\" + part + \";$kendoOutput+=\";\r\n }\r\n }\r\n }\r\n\r\n var argumentNameRegExp = /^\\w+/,\r\n encodeRegExp = /\\$\\{([^}]*)\\}/g,\r\n escapedCurlyRegExp = /\\\\\\}/g,\r\n curlyRegExp = /__CURLY__/g,\r\n escapedSharpRegExp = /\\\\#/g,\r\n sharpRegExp = /__SHARP__/g,\r\n zeros = [\"\", \"0\", \"00\", \"000\", \"0000\"];\r\n\r\n Template = {\r\n paramName: \"data\", // name of the parameter of the generated template\r\n useWithBlock: true, // whether to wrap the template in a with() block\r\n render: function(template, data) {\r\n var idx,\r\n length,\r\n html = \"\";\r\n\r\n for (idx = 0, length = data.length; idx < length; idx++) {\r\n html += template(data[idx]);\r\n }\r\n\r\n return html;\r\n },\r\n compile: function(template, options) {\r\n var settings = extend({}, this, options),\r\n paramName = settings.paramName,\r\n argumentName = paramName.match(argumentNameRegExp)[0],\r\n useWithBlock = settings.useWithBlock,\r\n functionBody = \"var $kendoOutput, $kendoHtmlEncode = kendo.htmlEncode;\",\r\n fn,\r\n parts,\r\n idx;\r\n\r\n if (isFunction(template)) {\r\n return template;\r\n }\r\n\r\n functionBody += useWithBlock ? \"with(\" + paramName + \"){\" : \"\";\r\n\r\n functionBody += \"$kendoOutput=\";\r\n\r\n parts = template\r\n .replace(escapedCurlyRegExp, \"__CURLY__\")\r\n .replace(encodeRegExp, \"#=$kendoHtmlEncode($1)#\")\r\n .replace(curlyRegExp, \"}\")\r\n .replace(escapedSharpRegExp, \"__SHARP__\")\r\n .split(\"#\");\r\n\r\n for (idx = 0; idx < parts.length; idx ++) {\r\n functionBody += compilePart(parts[idx], idx % 2 === 0);\r\n }\r\n\r\n functionBody += useWithBlock ? \";}\" : \";\";\r\n\r\n functionBody += \"return $kendoOutput;\";\r\n\r\n functionBody = functionBody.replace(sharpRegExp, \"#\");\r\n\r\n try {\r\n // This function evaluation is required for legacy support of the Kendo Template syntax - non CSP compliant.\r\n fn = new Function(argumentName, functionBody);\r\n fn._slotCount = Math.floor(parts.length / 2);\r\n return fn;\r\n } catch (e) {\r\n if (kendo.debugTemplates) {\r\n window.console.warn(`Invalid template:'${template}' Generated code:'${functionBody}'`);\r\n } else {\r\n throw new Error(kendo.format(\"Invalid template:'{0}' Generated code:'{1}'\", template, functionBody));\r\n }\r\n }\r\n }\r\n };\r\n\r\n function pad(number, digits, end) {\r\n number = number + \"\";\r\n digits = digits || 2;\r\n end = digits - number.length;\r\n\r\n if (end) {\r\n return zeros[digits].substring(0, end) + number;\r\n }\r\n\r\n return number;\r\n }\r\n\r\n //JSON stringify\r\n (function() {\r\n var escapable = /[\\\\\\\"\\x00-\\x1f\\x7f-\\x9f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g,\r\n gap,\r\n indent,\r\n meta = {\r\n \"\\b\": \"\\\\b\",\r\n \"\\t\": \"\\\\t\",\r\n \"\\n\": \"\\\\n\",\r\n \"\\f\": \"\\\\f\",\r\n \"\\r\": \"\\\\r\",\r\n \"\\\"\": '\\\\\"',\r\n \"\\\\\": \"\\\\\\\\\"\r\n },\r\n rep,\r\n toString = {}.toString;\r\n\r\n\r\n if (typeof Date.prototype.toJSON !== FUNCTION) {\r\n\r\n Date.prototype.toJSON = function() {\r\n var that = this;\r\n\r\n return isFinite(that.valueOf()) ?\r\n pad(that.getUTCFullYear(), 4) + \"-\" +\r\n pad(that.getUTCMonth() + 1) + \"-\" +\r\n pad(that.getUTCDate()) + \"T\" +\r\n pad(that.getUTCHours()) + \":\" +\r\n pad(that.getUTCMinutes()) + \":\" +\r\n pad(that.getUTCSeconds()) + \"Z\" : null;\r\n };\r\n\r\n String.prototype.toJSON = Number.prototype.toJSON = Boolean.prototype.toJSON = function() {\r\n return this.valueOf();\r\n };\r\n }\r\n\r\n function quote(string) {\r\n escapable.lastIndex = 0;\r\n return escapable.test(string) ? \"\\\"\" + string.replace(escapable, function(a) {\r\n var c = meta[a];\r\n return typeof c === STRING ? c :\r\n \"\\\\u\" + (\"0000\" + a.charCodeAt(0).toString(16)).slice(-4);\r\n }) + \"\\\"\" : \"\\\"\" + string + \"\\\"\";\r\n }\r\n\r\n function str(key, holder) {\r\n var i,\r\n k,\r\n v,\r\n length,\r\n mind = gap,\r\n partial,\r\n value = holder[key],\r\n type;\r\n\r\n if (value && typeof value === OBJECT && typeof value.toJSON === FUNCTION) {\r\n value = value.toJSON(key);\r\n }\r\n\r\n if (typeof rep === FUNCTION) {\r\n value = rep.call(holder, key, value);\r\n }\r\n\r\n type = typeof value;\r\n if (type === STRING) {\r\n return quote(value);\r\n } else if (type === NUMBER) {\r\n return isFinite(value) ? String(value) : NULL;\r\n } else if (type === BOOLEAN || type === NULL) {\r\n return String(value);\r\n } else if (type === OBJECT) {\r\n if (!value) {\r\n return NULL;\r\n }\r\n gap += indent;\r\n partial = [];\r\n if (toString.apply(value) === \"[object Array]\") {\r\n length = value.length;\r\n for (i = 0; i < length; i++) {\r\n partial[i] = str(i, value) || NULL;\r\n }\r\n v = partial.length === 0 ? \"[]\" : gap ?\r\n \"[\\n\" + gap + partial.join(\",\\n\" + gap) + \"\\n\" + mind + \"]\" :\r\n \"[\" + partial.join(\",\") + \"]\";\r\n gap = mind;\r\n return v;\r\n }\r\n if (rep && typeof rep === OBJECT) {\r\n length = rep.length;\r\n for (i = 0; i < length; i++) {\r\n if (typeof rep[i] === STRING) {\r\n k = rep[i];\r\n v = str(k, value);\r\n if (v) {\r\n partial.push(quote(k) + (gap ? \": \" : \":\") + v);\r\n }\r\n }\r\n }\r\n } else {\r\n for (k in value) {\r\n if (Object.hasOwnProperty.call(value, k)) {\r\n v = str(k, value);\r\n if (v) {\r\n partial.push(quote(k) + (gap ? \": \" : \":\") + v);\r\n }\r\n }\r\n }\r\n }\r\n\r\n v = partial.length === 0 ? \"{}\" : gap ?\r\n \"{\\n\" + gap + partial.join(\",\\n\" + gap) + \"\\n\" + mind + \"}\" :\r\n \"{\" + partial.join(\",\") + \"}\";\r\n gap = mind;\r\n return v;\r\n }\r\n }\r\n\r\n if (typeof JSON.stringify !== FUNCTION) {\r\n JSON.stringify = function(value, replacer, space) {\r\n var i;\r\n gap = \"\";\r\n indent = \"\";\r\n\r\n if (typeof space === NUMBER) {\r\n for (i = 0; i < space; i += 1) {\r\n indent += \" \";\r\n }\r\n\r\n } else if (typeof space === STRING) {\r\n indent = space;\r\n }\r\n\r\n rep = replacer;\r\n if (replacer && typeof replacer !== FUNCTION && (typeof replacer !== OBJECT || typeof replacer.length !== NUMBER)) {\r\n throw new Error(\"JSON.stringify\");\r\n }\r\n\r\n return str(\"\", { \"\": value });\r\n };\r\n }\r\n })();\r\n\r\n // Date and Number formatting\r\n (function() {\r\n var dateFormatRegExp = /EEEE|dddd|ddd|dd|d|MMMM|MMM|MM|M|yyyy|yy|HH|H|hh|h|mm|m|fff|ff|f|tt|ss|s|zzz|zz|z|\"[^\"]*\"|'[^']*'/g,\r\n standardFormatRegExp = /^(n|c|p|e)(\\d*)$/i,\r\n literalRegExp = /(\\\\.)|(['][^']*[']?)|([\"][^\"]*[\"]?)/g,\r\n commaRegExp = /\\,/g,\r\n EMPTY = \"\",\r\n POINT = \".\",\r\n COMMA = \",\",\r\n SHARP = \"#\",\r\n ZERO = \"0\",\r\n PLACEHOLDER = \"??\",\r\n EN = \"en-US\",\r\n objectToString = {}.toString;\r\n\r\n //cultures\r\n kendo.cultures = kendo.cultures || {}; // Ensure cultures object exists\r\n kendo.cultures[\"en-US\"] = {\r\n name: EN,\r\n numberFormat: {\r\n pattern: [\"-n\"],\r\n decimals: 2,\r\n \",\": \",\",\r\n \".\": \".\",\r\n groupSize: [3],\r\n percent: {\r\n pattern: [\"-n %\", \"n %\"],\r\n decimals: 2,\r\n \",\": \",\",\r\n \".\": \".\",\r\n groupSize: [3],\r\n symbol: \"%\"\r\n },\r\n currency: {\r\n name: \"US Dollar\",\r\n abbr: \"USD\",\r\n pattern: [\"($n)\", \"$n\"],\r\n decimals: 2,\r\n \",\": \",\",\r\n \".\": \".\",\r\n groupSize: [3],\r\n symbol: \"$\"\r\n }\r\n },\r\n calendars: {\r\n standard: {\r\n days: {\r\n names: [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"],\r\n namesAbbr: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\r\n namesShort: [ \"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\" ]\r\n },\r\n months: {\r\n names: [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"],\r\n namesAbbr: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"]\r\n },\r\n AM: [ \"AM\", \"am\", \"AM\" ],\r\n PM: [ \"PM\", \"pm\", \"PM\" ],\r\n patterns: {\r\n d: \"M/d/yyyy\",\r\n D: \"dddd, MMMM dd, yyyy\",\r\n F: \"dddd, MMMM dd, yyyy h:mm:ss tt\",\r\n g: \"M/d/yyyy h:mm tt\",\r\n G: \"M/d/yyyy h:mm:ss tt\",\r\n m: \"MMMM dd\",\r\n M: \"MMMM dd\",\r\n s: \"yyyy'-'MM'-'ddTHH':'mm':'ss\",\r\n t: \"h:mm tt\",\r\n T: \"h:mm:ss tt\",\r\n u: \"yyyy'-'MM'-'dd HH':'mm':'ss'Z'\",\r\n y: \"MMMM, yyyy\",\r\n Y: \"MMMM, yyyy\"\r\n },\r\n \"/\": \"/\",\r\n \":\": \":\",\r\n firstDay: 0,\r\n twoDigitYearMax: 2029\r\n }\r\n }\r\n };\r\n\r\n\r\n function findCulture(culture) {\r\n if (culture) {\r\n if (culture.numberFormat) {\r\n return culture;\r\n }\r\n\r\n if (typeof culture === STRING) {\r\n var cultures = kendo.cultures;\r\n return cultures[culture] || cultures[culture.split(\"-\")[0]] || null;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n function getCulture(culture) {\r\n if (culture) {\r\n culture = findCulture(culture);\r\n }\r\n\r\n return culture || kendo.cultures.current;\r\n }\r\n\r\n function appendDesignatorsToCultures(calendars) {\r\n // Don't ask. It's temporary.\r\n if ((calendars.standard.AM && calendars.standard.AM.length)\r\n && (calendars.standard.PM && calendars.standard.PM.length)\r\n && (calendars.standard.AM.indexOf(\"PMA0\") < 0)\r\n && (calendars.standard.AM.indexOf(\"AM\") > -1 || calendars.standard.PM.indexOf(\"PM\") > -1)) {\r\n calendars.standard.AM.push(\"a\", \"A\", \"PMa\", \"PMA\", \"PMa0\", \"PMA0\");\r\n calendars.standard.PM.push(\"p\", \"P\", \"AMp\", \"AMP\", \"AMp0\", \"AMP0\");\r\n }\r\n }\r\n\r\n kendo.culture = function(cultureName) {\r\n var cultures = kendo.cultures, culture;\r\n\r\n if (cultureName !== undefined$1) {\r\n culture = findCulture(cultureName) || cultures[EN];\r\n culture.calendar = culture.calendars.standard;\r\n cultures.current = culture;\r\n } else {\r\n appendDesignatorsToCultures(cultures.current.calendars);\r\n return cultures.current;\r\n }\r\n };\r\n\r\n kendo.findCulture = findCulture;\r\n kendo.getCulture = getCulture;\r\n\r\n //set current culture to en-US.\r\n kendo.culture(EN);\r\n\r\n function formatDate(date, format, culture) {\r\n culture = getCulture(culture);\r\n\r\n var calendar = culture.calendars.standard,\r\n days = calendar.days,\r\n months = calendar.months;\r\n\r\n format = format.pattern || calendar.patterns[format] || format;\r\n\r\n return format.replace(dateFormatRegExp, function(match) {\r\n var minutes;\r\n var result;\r\n var sign;\r\n\r\n if (match === \"d\") {\r\n result = date.getDate();\r\n } else if (match === \"dd\") {\r\n result = pad(date.getDate());\r\n } else if (match === \"ddd\") {\r\n result = days.namesAbbr[date.getDay()];\r\n } else if (match === \"dddd\" || match === \"EEEE\") {\r\n result = days.names[date.getDay()];\r\n } else if (match === \"M\") {\r\n result = date.getMonth() + 1;\r\n } else if (match === \"MM\") {\r\n result = pad(date.getMonth() + 1);\r\n } else if (match === \"MMM\") {\r\n result = months.namesAbbr[date.getMonth()];\r\n } else if (match === \"MMMM\") {\r\n result = months.names[date.getMonth()];\r\n } else if (match === \"yy\") {\r\n result = pad(date.getFullYear() % 100);\r\n } else if (match === \"yyyy\") {\r\n result = pad(date.getFullYear(), 4);\r\n } else if (match === \"h\" ) {\r\n result = date.getHours() % 12 || 12;\r\n } else if (match === \"hh\") {\r\n result = pad(date.getHours() % 12 || 12);\r\n } else if (match === \"H\") {\r\n result = date.getHours();\r\n } else if (match === \"HH\") {\r\n result = pad(date.getHours());\r\n } else if (match === \"m\") {\r\n result = date.getMinutes();\r\n } else if (match === \"mm\") {\r\n result = pad(date.getMinutes());\r\n } else if (match === \"s\") {\r\n result = date.getSeconds();\r\n } else if (match === \"ss\") {\r\n result = pad(date.getSeconds());\r\n } else if (match === \"f\") {\r\n result = math.floor(date.getMilliseconds() / 100);\r\n } else if (match === \"ff\") {\r\n result = date.getMilliseconds();\r\n if (result > 99) {\r\n result = math.floor(result / 10);\r\n }\r\n result = pad(result);\r\n } else if (match === \"fff\") {\r\n result = pad(date.getMilliseconds(), 3);\r\n } else if (match === \"tt\" || match === \"aa\") {\r\n result = date.getHours() < 12 ? calendar.AM[0] : calendar.PM[0];\r\n } else if (match === \"zzz\") {\r\n minutes = date.getTimezoneOffset();\r\n sign = minutes < 0;\r\n\r\n result = math.abs(minutes / 60).toString().split(\".\")[0];\r\n minutes = math.abs(minutes) - (result * 60);\r\n\r\n result = (sign ? \"+\" : \"-\") + pad(result);\r\n result += \":\" + pad(minutes);\r\n } else if (match === \"zz\" || match === \"z\") {\r\n result = date.getTimezoneOffset() / 60;\r\n sign = result < 0;\r\n\r\n result = math.abs(result).toString().split(\".\")[0];\r\n result = (sign ? \"+\" : \"-\") + (match === \"zz\" ? pad(result) : result);\r\n }\r\n\r\n return result !== undefined$1 ? result : match.slice(1, match.length - 1);\r\n });\r\n }\r\n\r\n //number formatting\r\n function formatNumber(number, format, culture) {\r\n culture = getCulture(culture);\r\n\r\n var numberFormat = culture.numberFormat,\r\n decimal = numberFormat[POINT],\r\n precision = numberFormat.decimals,\r\n pattern = numberFormat.pattern[0],\r\n literals = [],\r\n symbol,\r\n isCurrency, isPercent,\r\n customPrecision,\r\n formatAndPrecision,\r\n negative = number < 0,\r\n integer,\r\n fraction,\r\n integerLength,\r\n fractionLength,\r\n replacement = EMPTY,\r\n value = EMPTY,\r\n idx,\r\n length,\r\n ch,\r\n hasGroup,\r\n hasNegativeFormat,\r\n decimalIndex,\r\n sharpIndex,\r\n zeroIndex,\r\n hasZero, hasSharp,\r\n percentIndex,\r\n currencyIndex,\r\n startZeroIndex,\r\n start = -1,\r\n end;\r\n\r\n //return empty string if no number\r\n if (number === undefined$1) {\r\n return EMPTY;\r\n }\r\n\r\n if (!isFinite(number)) {\r\n return number;\r\n }\r\n\r\n //if no format then return number.toString() or number.toLocaleString() if culture.name is not defined\r\n if (!format) {\r\n return culture.name.length ? number.toLocaleString() : number.toString();\r\n }\r\n\r\n formatAndPrecision = standardFormatRegExp.exec(format);\r\n\r\n // standard formatting\r\n if (formatAndPrecision) {\r\n format = formatAndPrecision[1].toLowerCase();\r\n\r\n isCurrency = format === \"c\";\r\n isPercent = format === \"p\";\r\n\r\n if (isCurrency || isPercent) {\r\n //get specific number format information if format is currency or percent\r\n numberFormat = isCurrency ? numberFormat.currency : numberFormat.percent;\r\n decimal = numberFormat[POINT];\r\n precision = numberFormat.decimals;\r\n symbol = numberFormat.symbol;\r\n pattern = numberFormat.pattern[negative ? 0 : 1];\r\n }\r\n\r\n customPrecision = formatAndPrecision[2];\r\n\r\n if (customPrecision) {\r\n precision = +customPrecision;\r\n }\r\n\r\n //return number in exponential format\r\n if (format === \"e\") {\r\n var exp = customPrecision ? number.toExponential(precision) : number.toExponential(); // toExponential() and toExponential(undefined) differ in FF #653438.\r\n\r\n return exp.replace(POINT, numberFormat[POINT]);\r\n }\r\n\r\n // multiply if format is percent\r\n if (isPercent) {\r\n number *= 100;\r\n }\r\n\r\n number = round(number, precision);\r\n negative = number < 0;\r\n number = number.split(POINT);\r\n\r\n integer = number[0];\r\n fraction = number[1];\r\n\r\n //exclude \"-\" if number is negative.\r\n if (negative) {\r\n integer = integer.substring(1);\r\n }\r\n\r\n value = groupInteger(integer, 0, integer.length, numberFormat);\r\n\r\n if (fraction) {\r\n value += decimal + fraction;\r\n }\r\n\r\n if (format === \"n\" && !negative) {\r\n return value;\r\n }\r\n\r\n number = EMPTY;\r\n\r\n for (idx = 0, length = pattern.length; idx < length; idx++) {\r\n ch = pattern.charAt(idx);\r\n\r\n if (ch === \"n\") {\r\n number += value;\r\n } else if (ch === \"$\" || ch === \"%\") {\r\n number += symbol;\r\n } else {\r\n number += ch;\r\n }\r\n }\r\n\r\n return number;\r\n }\r\n\r\n //custom formatting\r\n //\r\n //separate format by sections.\r\n\r\n if (format.indexOf(\"'\") > -1 || format.indexOf(\"\\\"\") > -1 || format.indexOf(\"\\\\\") > -1) {\r\n format = format.replace(literalRegExp, function(match) {\r\n var quoteChar = match.charAt(0).replace(\"\\\\\", \"\"),\r\n literal = match.slice(1).replace(quoteChar, \"\");\r\n\r\n literals.push(literal);\r\n\r\n return PLACEHOLDER;\r\n });\r\n }\r\n\r\n format = format.split(\";\");\r\n if (negative && format[1]) {\r\n //get negative format\r\n format = format[1];\r\n hasNegativeFormat = true;\r\n } else if (number === 0 && format[2]) {\r\n //format for zeros\r\n format = format[2];\r\n if (format.indexOf(SHARP) == -1 && format.indexOf(ZERO) == -1) {\r\n //return format if it is string constant.\r\n return format;\r\n }\r\n } else {\r\n format = format[0];\r\n }\r\n\r\n percentIndex = format.indexOf(\"%\");\r\n currencyIndex = format.indexOf(\"$\");\r\n\r\n isPercent = percentIndex != -1;\r\n isCurrency = currencyIndex != -1;\r\n\r\n //multiply number if the format has percent\r\n if (isPercent) {\r\n number *= 100;\r\n }\r\n\r\n if (isCurrency && format[currencyIndex - 1] === \"\\\\\") {\r\n format = format.split(\"\\\\\").join(\"\");\r\n isCurrency = false;\r\n }\r\n\r\n if (isCurrency || isPercent) {\r\n //get specific number format information if format is currency or percent\r\n numberFormat = isCurrency ? numberFormat.currency : numberFormat.percent;\r\n decimal = numberFormat[POINT];\r\n precision = numberFormat.decimals;\r\n symbol = numberFormat.symbol;\r\n }\r\n\r\n hasGroup = format.indexOf(COMMA) > -1;\r\n if (hasGroup) {\r\n format = format.replace(commaRegExp, EMPTY);\r\n }\r\n\r\n decimalIndex = format.indexOf(POINT);\r\n length = format.length;\r\n\r\n if (decimalIndex != -1) {\r\n fraction = number.toString().split(\"e\");\r\n if (fraction[1]) {\r\n fraction = round(number, Math.abs(fraction[1]));\r\n } else {\r\n fraction = fraction[0];\r\n }\r\n fraction = fraction.split(POINT)[1] || EMPTY;\r\n zeroIndex = format.lastIndexOf(ZERO) - decimalIndex;\r\n sharpIndex = format.lastIndexOf(SHARP) - decimalIndex;\r\n hasZero = zeroIndex > -1;\r\n hasSharp = sharpIndex > -1;\r\n idx = fraction.length;\r\n\r\n if (!hasZero && !hasSharp) {\r\n format = format.substring(0, decimalIndex) + format.substring(decimalIndex + 1);\r\n length = format.length;\r\n decimalIndex = -1;\r\n idx = 0;\r\n }\r\n\r\n if (hasZero && zeroIndex > sharpIndex) {\r\n idx = zeroIndex;\r\n } else if (sharpIndex > zeroIndex) {\r\n if (hasSharp && idx > sharpIndex) {\r\n var rounded = round(number, sharpIndex, negative);\r\n\r\n while (rounded.charAt(rounded.length - 1) === ZERO && sharpIndex > 0 && sharpIndex > zeroIndex) {\r\n sharpIndex--;\r\n\r\n rounded = round(number, sharpIndex, negative);\r\n }\r\n\r\n idx = sharpIndex;\r\n } else if (hasZero && idx < zeroIndex) {\r\n idx = zeroIndex;\r\n }\r\n }\r\n }\r\n\r\n number = round(number, idx, negative);\r\n\r\n sharpIndex = format.indexOf(SHARP);\r\n startZeroIndex = zeroIndex = format.indexOf(ZERO);\r\n\r\n //define the index of the first digit placeholder\r\n if (sharpIndex == -1 && zeroIndex != -1) {\r\n start = zeroIndex;\r\n } else if (sharpIndex != -1 && zeroIndex == -1) {\r\n start = sharpIndex;\r\n } else {\r\n start = sharpIndex > zeroIndex ? zeroIndex : sharpIndex;\r\n }\r\n\r\n sharpIndex = format.lastIndexOf(SHARP);\r\n zeroIndex = format.lastIndexOf(ZERO);\r\n\r\n //define the index of the last digit placeholder\r\n if (sharpIndex == -1 && zeroIndex != -1) {\r\n end = zeroIndex;\r\n } else if (sharpIndex != -1 && zeroIndex == -1) {\r\n end = sharpIndex;\r\n } else {\r\n end = sharpIndex > zeroIndex ? sharpIndex : zeroIndex;\r\n }\r\n\r\n if (start == length) {\r\n end = start;\r\n }\r\n\r\n if (start != -1) {\r\n value = number.toString().split(POINT);\r\n integer = value[0];\r\n fraction = value[1] || EMPTY;\r\n\r\n integerLength = integer.length;\r\n fractionLength = fraction.length;\r\n\r\n if (negative && (number * -1) >= 0) {\r\n negative = false;\r\n }\r\n\r\n number = format.substring(0, start);\r\n\r\n if (negative && !hasNegativeFormat) {\r\n number += \"-\";\r\n }\r\n\r\n for (idx = start; idx < length; idx++) {\r\n ch = format.charAt(idx);\r\n\r\n if (decimalIndex == -1) {\r\n if (end - idx < integerLength) {\r\n number += integer;\r\n break;\r\n }\r\n } else {\r\n if (zeroIndex != -1 && zeroIndex < idx) {\r\n replacement = EMPTY;\r\n }\r\n\r\n if ((decimalIndex - idx) <= integerLength && decimalIndex - idx > -1) {\r\n number += integer;\r\n idx = decimalIndex;\r\n }\r\n\r\n if (decimalIndex === idx) {\r\n number += (fraction ? decimal : EMPTY) + fraction;\r\n idx += end - decimalIndex + 1;\r\n continue;\r\n }\r\n }\r\n\r\n if (ch === ZERO) {\r\n number += ch;\r\n replacement = ch;\r\n } else if (ch === SHARP) {\r\n number += replacement;\r\n }\r\n }\r\n\r\n if (hasGroup) {\r\n number = groupInteger(number, start + (negative && !hasNegativeFormat ? 1 : 0), Math.max(end, (integerLength + start)), numberFormat);\r\n }\r\n\r\n if (end >= start) {\r\n number += format.substring(end + 1);\r\n }\r\n\r\n //replace symbol placeholders\r\n if (isCurrency || isPercent) {\r\n value = EMPTY;\r\n for (idx = 0, length = number.length; idx < length; idx++) {\r\n ch = number.charAt(idx);\r\n value += (ch === \"$\" || ch === \"%\") ? symbol : ch;\r\n }\r\n number = value;\r\n }\r\n\r\n length = literals.length;\r\n\r\n if (length) {\r\n for (idx = 0; idx < length; idx++) {\r\n number = number.replace(PLACEHOLDER, literals[idx]);\r\n }\r\n }\r\n }\r\n\r\n return number;\r\n }\r\n\r\n var groupInteger = function(number, start, end, numberFormat) {\r\n var decimalIndex = number.indexOf(numberFormat[POINT]);\r\n var groupSizes = numberFormat.groupSize.slice();\r\n var groupSize = groupSizes.shift();\r\n var integer, integerLength;\r\n var idx, parts, value;\r\n var newGroupSize;\r\n\r\n end = decimalIndex !== -1 ? decimalIndex : end + 1;\r\n\r\n integer = number.substring(start, end);\r\n integerLength = integer.length;\r\n\r\n if (integerLength >= groupSize) {\r\n idx = integerLength;\r\n parts = [];\r\n\r\n while (idx > -1) {\r\n value = integer.substring(idx - groupSize, idx);\r\n if (value) {\r\n parts.push(value);\r\n }\r\n idx -= groupSize;\r\n newGroupSize = groupSizes.shift();\r\n groupSize = newGroupSize !== undefined$1 ? newGroupSize : groupSize;\r\n\r\n if (groupSize === 0) {\r\n if (idx > 0) {\r\n parts.push(integer.substring(0, idx));\r\n }\r\n break;\r\n }\r\n }\r\n\r\n integer = parts.reverse().join(numberFormat[COMMA]);\r\n number = number.substring(0, start) + integer + number.substring(end);\r\n }\r\n\r\n return number;\r\n };\r\n\r\n var round = function(value, precision, negative) {\r\n precision = precision || 0;\r\n\r\n value = value.toString().split('e');\r\n value = Math.round(+(value[0] + 'e' + (value[1] ? (+value[1] + precision) : precision)));\r\n\r\n if (negative) {\r\n value = -value;\r\n }\r\n\r\n value = value.toString().split('e');\r\n value = +(value[0] + 'e' + (value[1] ? (+value[1] - precision) : -precision));\r\n\r\n return value.toFixed(Math.min(precision, 20));\r\n };\r\n\r\n var toString = function(value, fmt, culture) {\r\n if (fmt) {\r\n if (objectToString.call(value) === \"[object Date]\") {\r\n return formatDate(value, fmt, culture);\r\n } else if (typeof value === NUMBER) {\r\n return formatNumber(value, fmt, culture);\r\n }\r\n }\r\n\r\n return value !== undefined$1 ? value : \"\";\r\n };\r\n\r\n kendo.format = function(fmt) {\r\n var values = arguments;\r\n\r\n return fmt.replace(formatRegExp, function(match, index, placeholderFormat) {\r\n var value = values[parseInt(index, 10) + 1];\r\n\r\n return toString(value, placeholderFormat ? placeholderFormat.substring(1) : \"\");\r\n });\r\n };\r\n\r\n kendo._extractFormat = function(format) {\r\n if (format.slice(0,3) === \"{0:\") {\r\n format = format.slice(3, format.length - 1);\r\n }\r\n\r\n return format;\r\n };\r\n\r\n kendo._activeElement = function() {\r\n try {\r\n return document.activeElement;\r\n } catch (e) {\r\n return document.documentElement.activeElement;\r\n }\r\n };\r\n\r\n kendo._round = round;\r\n kendo._outerWidth = function(element, includeMargin, calculateFromHidden) {\r\n element = $(element);\r\n if (calculateFromHidden) {\r\n return getHiddenDimensions(element, includeMargin).width;\r\n }\r\n\r\n return $(element).outerWidth(includeMargin || false) || 0;\r\n };\r\n kendo._outerHeight = function(element, includeMargin, calculateFromHidden) {\r\n element = $(element);\r\n if (calculateFromHidden) {\r\n return getHiddenDimensions(element, includeMargin).height;\r\n }\r\n\r\n return $(element).outerHeight(includeMargin || false) || 0;\r\n };\r\n kendo.toString = toString;\r\n })();\r\n\r\n\r\n (function() {\r\n var nonBreakingSpaceRegExp = /\\u00A0/g,\r\n spaceRegExp = /\\s/g,\r\n exponentRegExp = /[eE][\\-+]?[0-9]+/,\r\n shortTimeZoneRegExp = /[+|\\-]\\d{1,2}/,\r\n longTimeZoneRegExp = /[+|\\-]\\d{1,2}:?\\d{2}/,\r\n dateRegExp = /^\\/Date\\((.*?)\\)\\/$/,\r\n offsetRegExp = /[+-]\\d*/,\r\n FORMATS_SEQUENCE = [ [], [ \"G\", \"g\", \"F\" ], [ \"D\", \"d\", \"y\", \"m\", \"T\", \"t\" ] ],\r\n STANDARD_FORMATS = [\r\n [\r\n \"yyyy-MM-ddTHH:mm:ss.fffffffzzz\",\r\n \"yyyy-MM-ddTHH:mm:ss.fffffff\",\r\n \"yyyy-MM-ddTHH:mm:ss.fffzzz\",\r\n \"yyyy-MM-ddTHH:mm:ss.fff\",\r\n \"ddd MMM dd yyyy HH:mm:ss\",\r\n \"yyyy-MM-ddTHH:mm:sszzz\",\r\n \"yyyy-MM-ddTHH:mmzzz\",\r\n \"yyyy-MM-ddTHH:mmzz\",\r\n \"yyyy-MM-ddTHH:mm:ss\",\r\n \"yyyy-MM-dd HH:mm:ss\",\r\n \"yyyy/MM/dd HH:mm:ss\"\r\n ], [\r\n \"yyyy-MM-ddTHH:mm\",\r\n \"yyyy-MM-dd HH:mm\",\r\n \"yyyy/MM/dd HH:mm\"\r\n ], [\r\n \"yyyy/MM/dd\",\r\n \"yyyy-MM-dd\",\r\n \"HH:mm:ss\",\r\n \"HH:mm\"\r\n ]\r\n ],\r\n numberRegExp = {\r\n 2: /^\\d{1,2}/,\r\n 3: /^\\d{1,3}/,\r\n 4: /^\\d{4}/,\r\n exact3: /^\\d{3}/\r\n },\r\n objectToString = {}.toString;\r\n\r\n function outOfRange(value, start, end) {\r\n return !(value >= start && value <= end);\r\n }\r\n\r\n function designatorPredicate(designator) {\r\n return designator.charAt(0);\r\n }\r\n\r\n function mapDesignators(designators) {\r\n return $.map(designators, designatorPredicate);\r\n }\r\n\r\n //if date's day is different than the typed one - adjust\r\n function adjustDST(date, hours) {\r\n if (!hours && date.getHours() === 23) {\r\n date.setHours(date.getHours() + 2);\r\n }\r\n }\r\n\r\n function lowerArray(data) {\r\n var idx = 0,\r\n length = data.length,\r\n array = [];\r\n\r\n for (; idx < length; idx++) {\r\n array[idx] = (data[idx] + \"\").toLowerCase();\r\n }\r\n\r\n return array;\r\n }\r\n\r\n function lowerLocalInfo(localInfo) {\r\n var newLocalInfo = {}, property;\r\n\r\n for (property in localInfo) {\r\n newLocalInfo[property] = lowerArray(localInfo[property]);\r\n }\r\n\r\n return newLocalInfo;\r\n }\r\n\r\n function unpadZero(value) {\r\n return value.replace(/^0*/, '');\r\n }\r\n\r\n function parseExact(value, format, culture, strict, shouldUnpadZeros) {\r\n if (!value) {\r\n return null;\r\n }\r\n\r\n var lookAhead = function(match) {\r\n var i = 0;\r\n while (format[idx] === match) {\r\n i++;\r\n idx++;\r\n }\r\n if (i > 0) {\r\n idx -= 1;\r\n }\r\n return i;\r\n },\r\n longestDesignatorLength = (designators) => Array.from(designators).sort((a, b) => b.length - a.length)[0].length,\r\n getNumber = function(size) {\r\n var rg, match, part = \"\";\r\n if (size === 2) {\r\n for (let i = 0; i <= size; i++) {\r\n part += value[valueIdx + i] || \"\";\r\n }\r\n }\r\n\r\n // If the value comes in the form of 021, 022, 023 we must trim the leading zero otherwise the result will be 02 in all three cases instead of 21/22/23.\r\n if (shouldUnpadZeros && part.match(numberRegExp.exact3) && Number.isInteger(Number(part)) && Number(part) > 0) {\r\n part = unpadZero(part);\r\n } else {\r\n part = value.substr(valueIdx, size);\r\n }\r\n\r\n rg = numberRegExp[size] || new RegExp('^\\\\d{1,' + size + '}');\r\n match = part.match(rg);\r\n\r\n if (match) {\r\n match = match[0];\r\n valueIdx += match.length;\r\n return parseInt(match, 10);\r\n }\r\n return null;\r\n },\r\n getIndexByName = function(names, lower, subLength) {\r\n var i = 0,\r\n length = names.length,\r\n name, nameLength,\r\n matchLength = 0,\r\n matchIdx = 0,\r\n subValue;\r\n\r\n for (; i < length; i++) {\r\n name = names[i];\r\n nameLength = name.length;\r\n subValue = value.substr(valueIdx, subLength || nameLength); // The `subLength` is part of the appendDesignatorsToCultures logic.\r\n\r\n if (lower) {\r\n subValue = subValue.toLowerCase();\r\n }\r\n\r\n if (subValue == name && nameLength > matchLength) {\r\n matchLength = nameLength;\r\n matchIdx = i;\r\n }\r\n }\r\n\r\n if (matchLength) {\r\n valueIdx += matchLength;\r\n return matchIdx + 1;\r\n }\r\n\r\n return null;\r\n },\r\n checkLiteral = function() {\r\n var result = false;\r\n if (value.charAt(valueIdx) === format[idx]) {\r\n valueIdx++;\r\n result = true;\r\n }\r\n return result;\r\n },\r\n calendar = culture.calendars.standard,\r\n year = null,\r\n month = null,\r\n day = null,\r\n hours = null,\r\n minutes = null,\r\n seconds = null,\r\n milliseconds = null,\r\n idx = 0,\r\n valueIdx = 0,\r\n literal = false,\r\n date = new Date(),\r\n twoDigitYearMax = calendar.twoDigitYearMax || 2029,\r\n defaultYear = date.getFullYear(),\r\n ch, count, length, pattern,\r\n pmHour, UTC, matches,\r\n amDesignators, pmDesignators,\r\n hoursOffset, minutesOffset,\r\n hasTime, match;\r\n\r\n if (!format) {\r\n format = \"d\"; //shord date format\r\n }\r\n\r\n //if format is part of the patterns get real format\r\n pattern = calendar.patterns[format];\r\n if (pattern) {\r\n format = pattern;\r\n }\r\n\r\n format = format.split(\"\");\r\n length = format.length;\r\n\r\n for (; idx < length; idx++) {\r\n ch = format[idx];\r\n\r\n if (literal) {\r\n if (ch === \"'\") {\r\n literal = false;\r\n } else {\r\n checkLiteral();\r\n }\r\n } else {\r\n if (ch === \"d\") {\r\n count = lookAhead(\"d\");\r\n if (!calendar._lowerDays) {\r\n calendar._lowerDays = lowerLocalInfo(calendar.days);\r\n }\r\n\r\n if (day !== null && count > 2) {\r\n continue;\r\n }\r\n\r\n day = count < 3 ? getNumber(2) : getIndexByName(calendar._lowerDays[count == 3 ? \"namesAbbr\" : \"names\"], true);\r\n\r\n if (day === null || outOfRange(day, 1, 31)) {\r\n return null;\r\n }\r\n } else if (ch === \"M\") {\r\n count = lookAhead(\"M\");\r\n if (!calendar._lowerMonths) {\r\n calendar._lowerMonths = lowerLocalInfo(calendar.months);\r\n }\r\n month = count < 3 ? getNumber(2) : getIndexByName(calendar._lowerMonths[count == 3 ? 'namesAbbr' : 'names'], true);\r\n\r\n if (month === null || outOfRange(month, 1, 12)) {\r\n return null;\r\n }\r\n month -= 1; //because month is zero based\r\n } else if (ch === \"y\") {\r\n count = lookAhead(\"y\");\r\n year = getNumber(count);\r\n\r\n if (year === null) {\r\n return null;\r\n }\r\n\r\n if (count == 2) {\r\n if (typeof twoDigitYearMax === \"string\") {\r\n twoDigitYearMax = defaultYear + parseInt(twoDigitYearMax, 10);\r\n }\r\n\r\n year = (defaultYear - defaultYear % 100) + year;\r\n if (year > twoDigitYearMax) {\r\n year -= 100;\r\n }\r\n }\r\n } else if (ch === \"h\" ) {\r\n lookAhead(\"h\");\r\n hours = getNumber(2);\r\n if (hours == 12) {\r\n hours = 0;\r\n }\r\n if (hours === null || outOfRange(hours, 0, 11)) {\r\n return null;\r\n }\r\n } else if (ch === \"H\") {\r\n lookAhead(\"H\");\r\n hours = getNumber(2);\r\n if (hours === null || outOfRange(hours, 0, 23)) {\r\n return null;\r\n }\r\n } else if (ch === \"m\") {\r\n lookAhead(\"m\");\r\n minutes = getNumber(2);\r\n if (minutes === null || outOfRange(minutes, 0, 59)) {\r\n return null;\r\n }\r\n } else if (ch === \"s\") {\r\n lookAhead(\"s\");\r\n seconds = getNumber(2);\r\n if (seconds === null || outOfRange(seconds, 0, 59)) {\r\n return null;\r\n }\r\n } else if (ch === \"f\") {\r\n count = lookAhead(\"f\");\r\n\r\n match = value.substr(valueIdx, count).match(numberRegExp[3]);\r\n milliseconds = getNumber(count); //move value index position\r\n\r\n if (milliseconds !== null) {\r\n milliseconds = parseFloat(\"0.\" + match[0], 10);\r\n milliseconds = kendo._round(milliseconds, 3);\r\n milliseconds *= 1000;\r\n }\r\n\r\n if (milliseconds === null || outOfRange(milliseconds, 0, 999)) {\r\n return null;\r\n }\r\n\r\n } else if (ch === \"t\") {\r\n count = lookAhead(\"t\");\r\n amDesignators = calendar.AM;\r\n pmDesignators = calendar.PM;\r\n\r\n if (count === 1) {\r\n amDesignators = mapDesignators(amDesignators);\r\n pmDesignators = mapDesignators(pmDesignators);\r\n }\r\n\r\n pmHour = getIndexByName(pmDesignators, false, longestDesignatorLength(pmDesignators));\r\n if (!pmHour && !getIndexByName(amDesignators, false, longestDesignatorLength(amDesignators))) {\r\n return null;\r\n }\r\n }\r\n else if (ch === \"z\") {\r\n UTC = true;\r\n count = lookAhead(\"z\");\r\n\r\n if (value.substr(valueIdx, 1) === \"Z\") {\r\n checkLiteral();\r\n continue;\r\n }\r\n\r\n matches = value.substr(valueIdx, 6)\r\n .match(count > 2 ? longTimeZoneRegExp : shortTimeZoneRegExp);\r\n\r\n if (!matches) {\r\n return null;\r\n }\r\n\r\n matches = matches[0].split(\":\");\r\n\r\n hoursOffset = matches[0];\r\n minutesOffset = matches[1];\r\n\r\n if (!minutesOffset && hoursOffset.length > 3) { //(+|-)[hh][mm] format is used\r\n valueIdx = hoursOffset.length - 2;\r\n minutesOffset = hoursOffset.substring(valueIdx);\r\n hoursOffset = hoursOffset.substring(0, valueIdx);\r\n }\r\n\r\n hoursOffset = parseInt(hoursOffset, 10);\r\n if (outOfRange(hoursOffset, -12, 13)) {\r\n return null;\r\n }\r\n\r\n if (count > 2) {\r\n minutesOffset = matches[0][0] + minutesOffset;\r\n minutesOffset = parseInt(minutesOffset, 10);\r\n if (isNaN(minutesOffset) || outOfRange(minutesOffset, -59, 59)) {\r\n return null;\r\n }\r\n }\r\n } else if (ch === \"'\") {\r\n literal = true;\r\n checkLiteral();\r\n } else if (!checkLiteral()) {\r\n return null;\r\n }\r\n }\r\n }\r\n\r\n // if more characters follow, assume wrong format\r\n // https://github.com/telerik/kendo-ui-core/issues/3476\r\n if (strict && !/^\\s*$/.test(value.substr(valueIdx))) {\r\n return null;\r\n }\r\n\r\n hasTime = hours !== null || minutes !== null || seconds || null;\r\n\r\n if (year === null && month === null && day === null && hasTime) {\r\n year = defaultYear;\r\n month = date.getMonth();\r\n day = date.getDate();\r\n } else {\r\n if (year === null) {\r\n year = defaultYear;\r\n }\r\n\r\n if (day === null) {\r\n day = 1;\r\n }\r\n }\r\n\r\n if (pmHour && hours < 12) {\r\n hours += 12;\r\n }\r\n\r\n if (UTC) {\r\n if (hoursOffset) {\r\n hours += -hoursOffset;\r\n }\r\n\r\n if (minutesOffset) {\r\n minutes += -minutesOffset;\r\n }\r\n\r\n value = new Date(Date.UTC(year, month, day, hours, minutes, seconds, milliseconds));\r\n } else {\r\n value = new Date(year, month, day, hours, minutes, seconds, milliseconds);\r\n adjustDST(value, hours);\r\n }\r\n\r\n if (year < 100) {\r\n value.setFullYear(year);\r\n }\r\n\r\n if (value.getDate() !== day && UTC === undefined$1) {\r\n return null;\r\n }\r\n\r\n return value;\r\n }\r\n\r\n function parseMicrosoftFormatOffset(offset) {\r\n var sign = offset.substr(0, 1) === \"-\" ? -1 : 1;\r\n\r\n offset = offset.substring(1);\r\n offset = (parseInt(offset.substr(0, 2), 10) * 60) + parseInt(offset.substring(2), 10);\r\n\r\n return sign * offset;\r\n }\r\n\r\n function getDefaultFormats(culture) {\r\n var length = math.max(FORMATS_SEQUENCE.length, STANDARD_FORMATS.length);\r\n var calendar = culture.calendar || culture.calendars.standard;\r\n var patterns = calendar.patterns;\r\n var cultureFormats, formatIdx, idx;\r\n var formats = [];\r\n\r\n for (idx = 0; idx < length; idx++) {\r\n cultureFormats = FORMATS_SEQUENCE[idx];\r\n for (formatIdx = 0; formatIdx < cultureFormats.length; formatIdx++) {\r\n formats.push(patterns[cultureFormats[formatIdx]]);\r\n }\r\n formats = formats.concat(STANDARD_FORMATS[idx]);\r\n }\r\n\r\n return formats;\r\n }\r\n\r\n function internalParseDate(value, formats, culture, strict, shouldUnpadZeros) {\r\n if (objectToString.call(value) === \"[object Date]\") {\r\n return value;\r\n }\r\n\r\n var idx = 0;\r\n var date = null;\r\n var length;\r\n var tzoffset;\r\n\r\n if (value && value.indexOf(\"/D\") === 0) {\r\n date = dateRegExp.exec(value);\r\n if (date) {\r\n date = date[1];\r\n tzoffset = offsetRegExp.exec(date.substring(1));\r\n\r\n date = new Date(parseInt(date, 10));\r\n\r\n if (tzoffset) {\r\n tzoffset = parseMicrosoftFormatOffset(tzoffset[0]);\r\n date = kendo.timezone.apply(date, 0);\r\n date = kendo.timezone.convert(date, 0, -1 * tzoffset);\r\n }\r\n\r\n return date;\r\n }\r\n }\r\n\r\n culture = kendo.getCulture(culture);\r\n\r\n if (!formats) {\r\n formats = getDefaultFormats(culture);\r\n }\r\n\r\n formats = isArray(formats) ? formats : [formats];\r\n length = formats.length;\r\n\r\n for (; idx < length; idx++) {\r\n date = parseExact(value, formats[idx], culture, strict, shouldUnpadZeros);\r\n if (date) {\r\n return date;\r\n }\r\n }\r\n\r\n return date;\r\n }\r\n\r\n kendo.parseDate = function(value, formats, culture, shouldUnpadZeros) {\r\n return internalParseDate(value, formats, culture, false, shouldUnpadZeros);\r\n };\r\n\r\n kendo.parseExactDate = function(value, formats, culture) {\r\n return internalParseDate(value, formats, culture, true);\r\n };\r\n\r\n kendo.parseInt = function(value, culture) {\r\n var result = kendo.parseFloat(value, culture);\r\n if (result) {\r\n result = result | 0;\r\n }\r\n return result;\r\n };\r\n\r\n kendo.parseFloat = function(value, culture, format) {\r\n if (!value && value !== 0) {\r\n return null;\r\n }\r\n\r\n if (typeof value === NUMBER) {\r\n return value;\r\n }\r\n\r\n value = value.toString();\r\n culture = kendo.getCulture(culture);\r\n\r\n var number = culture.numberFormat,\r\n percent = number.percent,\r\n currency = number.currency,\r\n symbol = currency.symbol,\r\n percentSymbol = percent.symbol,\r\n negative = value.indexOf(\"-\"),\r\n parts, isPercent;\r\n\r\n //handle exponential number\r\n if (exponentRegExp.test(value)) {\r\n value = parseFloat(value.replace(number[\".\"], \".\"));\r\n if (isNaN(value)) {\r\n value = null;\r\n }\r\n return value;\r\n }\r\n\r\n if (negative > 0) {\r\n return null;\r\n } else {\r\n negative = negative > -1;\r\n }\r\n\r\n if (value.indexOf(symbol) > -1 || (format && format.toLowerCase().indexOf(\"c\") > -1)) {\r\n number = currency;\r\n parts = number.pattern[0].replace(\"$\", symbol).split(\"n\");\r\n if (value.indexOf(parts[0]) > -1 && value.indexOf(parts[1]) > -1) {\r\n value = value.replace(parts[0], \"\").replace(parts[1], \"\");\r\n negative = true;\r\n }\r\n } else if (value.indexOf(percentSymbol) > -1) {\r\n isPercent = true;\r\n number = percent;\r\n symbol = percentSymbol;\r\n }\r\n\r\n value = value.replace(\"-\", \"\")\r\n .replace(symbol, \"\")\r\n .replace(nonBreakingSpaceRegExp, \" \")\r\n .split(number[\",\"].replace(nonBreakingSpaceRegExp, \" \")).join(\"\")\r\n .replace(spaceRegExp, \"\")\r\n .replace(number[\".\"], \".\");\r\n\r\n value = parseFloat(value);\r\n\r\n if (isNaN(value)) {\r\n value = null;\r\n } else if (negative) {\r\n value *= -1;\r\n }\r\n\r\n if (value && isPercent) {\r\n value /= 100;\r\n }\r\n\r\n return value;\r\n };\r\n })();\r\n\r\n function getShadows(element) {\r\n var shadow = element.css(\"box-shadow\"),\r\n radius = shadow ? shadow.match(boxShadowRegExp) || [ 0, 0, 0, 0, 0 ] : [ 0, 0, 0, 0, 0 ],\r\n blur = math.max((+radius[3]), +(radius[4] || 0));\r\n\r\n return {\r\n left: (-radius[1]) + blur,\r\n right: (+radius[1]) + blur,\r\n bottom: (+radius[2]) + blur\r\n };\r\n }\r\n\r\n function getHiddenDimensions(element, includeMargin) {\r\n var clone, width, height;\r\n\r\n clone = element.clone();\r\n clone.css(\"display\", \"\");\r\n clone.css(\"visibility\", \"hidden\");\r\n clone.appendTo($(\"body\"));\r\n\r\n width = clone.outerWidth(includeMargin || false);\r\n height = clone.outerHeight(includeMargin || false);\r\n\r\n clone.remove();\r\n\r\n return {\r\n width: width || 0,\r\n height: height || 0\r\n };\r\n }\r\n\r\n function wrap(element, autosize, resize, shouldCorrectWidth = true, autowidth) {\r\n var percentage,\r\n outerWidth = kendo._outerWidth,\r\n outerHeight = kendo._outerHeight,\r\n parent = element.parent(),\r\n windowOuterWidth = outerWidth(window);\r\n\r\n parent.parent().removeClass(\"k-animation-container-sm\");\r\n\r\n if (!parent.hasClass(\"k-child-animation-container\")) {\r\n var width = element[0].style.width,\r\n height = element[0].style.height,\r\n percentWidth = percentRegExp.test(width),\r\n percentHeight = percentRegExp.test(height),\r\n forceDimensions = element.hasClass(\"k-tooltip\") || element.is(\".k-menu-horizontal.k-context-menu\"),\r\n calculateFromHidden = element.hasClass(\"k-tooltip\");\r\n\r\n percentage = percentWidth || percentHeight;\r\n\r\n if (!percentWidth && (!autosize || (autosize && width) || forceDimensions)) { width = autosize ? outerWidth(element, false, calculateFromHidden) + 1 : outerWidth(element, false, calculateFromHidden); }\r\n if (!percentHeight && (!autosize || (autosize && height)) || forceDimensions) { height = outerHeight(element, false, calculateFromHidden); }\r\n\r\n element.wrap(\r\n $(\"
\")\r\n .addClass(\"k-child-animation-container\")\r\n .css({\r\n width: autowidth ? \"auto\" : width,\r\n height: height\r\n }));\r\n parent = element.parent();\r\n\r\n parent.wrap(\r\n $(\"
\")\r\n .addClass(\"k-animation-container\")\r\n .attr(\"role\", \"region\")\r\n );\r\n\r\n if (percentage) {\r\n element.css({\r\n width: \"100%\",\r\n height: \"100%\"\r\n });\r\n }\r\n } else {\r\n wrapResize(element, autosize, shouldCorrectWidth);\r\n }\r\n\r\n parent = parent.parent();\r\n\r\n if (windowOuterWidth < outerWidth(parent)) {\r\n parent.addClass(\"k-animation-container-sm\");\r\n resize = true;\r\n }\r\n\r\n if (resize) {\r\n wrapResize(element, autosize, shouldCorrectWidth);\r\n }\r\n\r\n return parent;\r\n }\r\n\r\n function wrapResize(element, autosize, shouldCorrectWidth) {\r\n var percentage,\r\n outerWidth = kendo._outerWidth,\r\n outerHeight = kendo._outerHeight,\r\n parent = element.parent(),\r\n wrapper = element.closest(\".k-animation-container\"),\r\n calculateFromHidden = element.hasClass(\"k-tooltip\"),\r\n visible = element.is(\":visible\"),\r\n wrapperStyle = parent[0].style,\r\n elementHeight = element[0].style.height;\r\n\r\n if (wrapper.is(\":hidden\")) {\r\n wrapper.css({\r\n display: \"\",\r\n position: \"\"\r\n });\r\n }\r\n\r\n percentage = percentRegExp.test(wrapperStyle.width) || percentRegExp.test(wrapperStyle.height);\r\n\r\n if (!percentage) {\r\n if (!visible) {\r\n element.add(parent).show();\r\n }\r\n if (shouldCorrectWidth) {\r\n parent.css(\"width\", \"\"); // Needed to get correct width dimensions\r\n }\r\n parent.css({\r\n width: autosize ? outerWidth(element, false, calculateFromHidden) + 1 : outerWidth(element, false, calculateFromHidden),\r\n });\r\n\r\n if (elementHeight === \"auto\") {\r\n element.css({ height: outerHeight(parent) });\r\n } else {\r\n parent.css({\r\n height: outerHeight(element)\r\n });\r\n }\r\n\r\n if (!visible) {\r\n element.hide();\r\n }\r\n }\r\n }\r\n\r\n function deepExtend(destination) {\r\n var i = 1,\r\n length = arguments.length;\r\n\r\n for (i = 1; i < length; i++) {\r\n deepExtendOne(destination, arguments[i]);\r\n }\r\n\r\n return destination;\r\n }\r\n\r\n function deepExtendOne(destination, source) {\r\n var ObservableArray = kendo.data.ObservableArray,\r\n LazyObservableArray = kendo.data.LazyObservableArray,\r\n DataSource = kendo.data.DataSource,\r\n HierarchicalDataSource = kendo.data.HierarchicalDataSource,\r\n property,\r\n propValue,\r\n propType,\r\n propInit,\r\n destProp;\r\n\r\n for (property in source) {\r\n if (property === '__proto__' || property === 'constructor') {\r\n continue;\r\n }\r\n\r\n propValue = source[property];\r\n propType = typeof propValue;\r\n\r\n if (propType === OBJECT && propValue !== null) {\r\n propInit = propValue.constructor;\r\n } else {\r\n propInit = null;\r\n }\r\n\r\n if (propInit &&\r\n propInit !== Array && propInit !== ObservableArray && propInit !== LazyObservableArray &&\r\n propInit !== DataSource && propInit !== HierarchicalDataSource && propInit !== RegExp &&\r\n (!kendo.isFunction(window.ArrayBuffer) || propInit !== ArrayBuffer) && !(propValue instanceof HTMLElement)) {\r\n\r\n if (propValue instanceof Date) {\r\n destination[property] = new Date(propValue.getTime());\r\n } else if (isFunction(propValue.clone)) {\r\n destination[property] = propValue.clone();\r\n } else {\r\n destProp = destination[property];\r\n if (typeof (destProp) === OBJECT) {\r\n destination[property] = destProp || {};\r\n } else {\r\n destination[property] = {};\r\n }\r\n deepExtendOne(destination[property], propValue);\r\n }\r\n } else if (propType !== UNDEFINED) {\r\n destination[property] = propValue;\r\n }\r\n }\r\n\r\n return destination;\r\n }\r\n\r\n function testRx(agent, rxs, dflt) {\r\n for (var rx in rxs) {\r\n if (rxs.hasOwnProperty(rx) && rxs[rx].test(agent)) {\r\n return rx;\r\n }\r\n }\r\n return dflt !== undefined$1 ? dflt : agent;\r\n }\r\n\r\n function toHyphens(str) {\r\n return str.replace(/([a-z][A-Z])/g, function(g) {\r\n return g.charAt(0) + '-' + g.charAt(1).toLowerCase();\r\n });\r\n }\r\n\r\n function toCamelCase(str) {\r\n return str.replace(/\\-(\\w)/g, function(strMatch, g1) {\r\n return g1.toUpperCase();\r\n });\r\n }\r\n\r\n function getComputedStyles(element, properties) {\r\n var styles = {}, computedStyle;\r\n\r\n if (document.defaultView && document.defaultView.getComputedStyle) {\r\n computedStyle = document.defaultView.getComputedStyle(element, \"\");\r\n\r\n if (properties) {\r\n $.each(properties, function(idx, value) {\r\n styles[value] = computedStyle.getPropertyValue(value);\r\n });\r\n }\r\n } else {\r\n computedStyle = element.currentStyle;\r\n\r\n if (properties) {\r\n $.each(properties, function(idx, value) {\r\n styles[value] = computedStyle[toCamelCase(value)];\r\n });\r\n }\r\n }\r\n\r\n if (!kendo.size(styles)) {\r\n styles = computedStyle;\r\n }\r\n\r\n return styles;\r\n }\r\n\r\n function isScrollable(element) {\r\n if (element.dataset[kendo.ns + \"scrollable\"] === \"false\") {\r\n return false;\r\n }\r\n\r\n if (element && element.className && typeof(element.className) === \"string\" && element.className.indexOf(\"k-auto-scrollable\") > -1) {\r\n return true;\r\n }\r\n\r\n var overflow = getComputedStyles(element, [\"overflow\"]).overflow;\r\n return overflow.indexOf(\"auto\") > -1 || overflow.indexOf(\"scroll\") > -1;\r\n }\r\n\r\n function scrollLeft(element, value) {\r\n var webkit = support.browser.webkit;\r\n var mozila = support.browser.mozilla;\r\n var browserVersion = support.browser.version;\r\n var el, isRtl;\r\n\r\n if (element instanceof $ && value !== undefined$1) {\r\n element.each(function(i, e) {\r\n scrollLeft(e, value);\r\n });\r\n\r\n return;\r\n } else {\r\n el = element instanceof $ ? element[0] : element;\r\n }\r\n\r\n if (!el) {\r\n return;\r\n }\r\n\r\n isRtl = support.isRtl(element);\r\n\r\n // After updating browser detection,\r\n // Test in which if should the Safari browsers go\r\n if (value !== undefined$1) {\r\n if (isRtl && webkit && (browserVersion < 85 || support.browser.safari)) {\r\n el.scrollLeft = el.scrollWidth - el.clientWidth - value;\r\n } else if (isRtl && (mozila || webkit) && value > 0) {\r\n el.scrollLeft = -value;\r\n } else {\r\n el.scrollLeft = value;\r\n }\r\n } else {\r\n if (isRtl && webkit && (browserVersion < 85 || support.browser.safari)) {\r\n return el.scrollWidth - el.clientWidth - el.scrollLeft;\r\n } else {\r\n return Math.abs(el.scrollLeft);\r\n }\r\n }\r\n }\r\n\r\n (function() {\r\n support._scrollbar = undefined$1;\r\n\r\n support.scrollbar = function(refresh) {\r\n if (!isNaN(support._scrollbar) && !refresh) {\r\n return support._scrollbar;\r\n } else {\r\n var div = document.createElement(\"div\"),\r\n result;\r\n\r\n div.style.cssText = \"overflow:scroll;overflow-x:hidden;zoom:1;clear:both;display:block\";\r\n div.innerHTML = \" \";\r\n document.body.appendChild(div);\r\n\r\n support._scrollbar = result = div.offsetWidth - div.scrollWidth;\r\n\r\n document.body.removeChild(div);\r\n\r\n return result;\r\n }\r\n };\r\n\r\n support.isRtl = function(element) {\r\n return $(element).closest(\".k-rtl\").length > 0;\r\n };\r\n\r\n var table = document.createElement(\"table\");\r\n\r\n // Internet Explorer does not support setting the innerHTML of TBODY and TABLE elements\r\n try {\r\n table.innerHTML = \"\";\r\n\r\n support.tbodyInnerHtml = true;\r\n } catch (e) {\r\n support.tbodyInnerHtml = false;\r\n }\r\n\r\n support.touch = \"ontouchstart\" in window;\r\n\r\n let docStyle = document.documentElement.style;\r\n let elementProto = \"HTMLElement\" in window ? HTMLElement.prototype : [];\r\n\r\n // Transforms and Transitions - no longer required, however these were public properties in the past.\r\n // It is possible some customers may have used them so keep them for the time being.\r\n support.transforms = support.transitions = { css: \"\", prefix: \"\", event: \"transitionend\" };\r\n support.hasHW3D = (\"WebKitCSSMatrix\" in window && \"m11\" in new window.WebKitCSSMatrix()) || \"MozPerspective\" in docStyle || \"msPerspective\" in docStyle;\r\n support.cssFlexbox = (\"flexWrap\" in docStyle) || (\"WebkitFlexWrap\" in docStyle) || (\"msFlexWrap\" in docStyle);\r\n\r\n table = null;\r\n support.devicePixelRatio = window.devicePixelRatio === undefined$1 ? 1 : window.devicePixelRatio;\r\n\r\n try {\r\n support.screenWidth = window.outerWidth || window.screen ? window.screen.availWidth : window.innerWidth;\r\n support.screenHeight = window.outerHeight || window.screen ? window.screen.availHeight : window.innerHeight;\r\n } catch (e) {\r\n //window.outerWidth throws error when in IE showModalDialog.\r\n support.screenWidth = window.screen.availWidth;\r\n support.screenHeight = window.screen.availHeight;\r\n }\r\n\r\n support.detectOS = function(ua) {\r\n var os = false, minorVersion, match = [],\r\n notAndroidPhone = !/mobile safari/i.test(ua),\r\n agentRxs = {\r\n wp: /(Windows Phone(?: OS)?)\\s(\\d+)\\.(\\d+(\\.\\d+)?)/,\r\n fire: /(Silk)\\/(\\d+)\\.(\\d+(\\.\\d+)?)/,\r\n android: /(Android|Android.*(?:Opera|Firefox).*?\\/)\\s*(\\d+)\\.?(\\d+(\\.\\d+)?)?/,\r\n iphone: /(iPhone|iPod).*OS\\s+(\\d+)[\\._]([\\d\\._]+)/,\r\n ipad: /(iPad).*OS\\s+(\\d+)[\\._]([\\d_]+)/,\r\n meego: /(MeeGo).+NokiaBrowser\\/(\\d+)\\.([\\d\\._]+)/,\r\n webos: /(webOS)\\/(\\d+)\\.(\\d+(\\.\\d+)?)/,\r\n blackberry: /(BlackBerry|BB10).*?Version\\/(\\d+)\\.(\\d+(\\.\\d+)?)/,\r\n playbook: /(PlayBook).*?Tablet\\s*OS\\s*(\\d+)\\.(\\d+(\\.\\d+)?)/,\r\n windows: /(MSIE)\\s+(\\d+)\\.(\\d+(\\.\\d+)?)/,\r\n tizen: /(tizen).*?Version\\/(\\d+)\\.(\\d+(\\.\\d+)?)/i,\r\n sailfish: /(sailfish).*rv:(\\d+)\\.(\\d+(\\.\\d+)?).*firefox/i,\r\n ffos: /(Mobile).*rv:(\\d+)\\.(\\d+(\\.\\d+)?).*Firefox/\r\n },\r\n osRxs = {\r\n ios: /^i(phone|pad|pod)$/i,\r\n android: /^android|fire$/i,\r\n blackberry: /^blackberry|playbook/i,\r\n windows: /windows/,\r\n wp: /wp/,\r\n flat: /sailfish|ffos|tizen/i,\r\n meego: /meego/\r\n },\r\n formFactorRxs = {\r\n tablet: /playbook|ipad|fire/i\r\n },\r\n browserRxs = {\r\n omini: /Opera\\sMini/i,\r\n omobile: /Opera\\sMobi/i,\r\n firefox: /Firefox|Fennec/i,\r\n mobilesafari: /version\\/.*safari/i,\r\n ie: /MSIE|Windows\\sPhone/i,\r\n chrome: /chrome|crios/i,\r\n webkit: /webkit/i\r\n };\r\n\r\n for (var agent in agentRxs) {\r\n if (agentRxs.hasOwnProperty(agent)) {\r\n match = ua.match(agentRxs[agent]);\r\n if (match) {\r\n if (agent == \"windows\" && \"plugins\" in navigator) { return false; } // Break if not Metro/Mobile Windows\r\n\r\n os = {};\r\n os.device = agent;\r\n os.tablet = testRx(agent, formFactorRxs, false);\r\n os.browser = testRx(ua, browserRxs, \"default\");\r\n os.name = testRx(agent, osRxs);\r\n os[os.name] = true;\r\n os.majorVersion = match[2];\r\n os.minorVersion = (match[3] || \"0\").replace(\"_\", \".\");\r\n minorVersion = os.minorVersion.replace(\".\", \"\").substr(0, 2);\r\n os.flatVersion = os.majorVersion + minorVersion + (new Array(3 - (minorVersion.length < 3 ? minorVersion.length : 2)).join(\"0\"));\r\n os.cordova = typeof window.PhoneGap !== UNDEFINED || typeof window.cordova !== UNDEFINED; // Use file protocol to detect appModes.\r\n os.appMode = window.navigator.standalone || (/file|local|wmapp/).test(window.location.protocol) || os.cordova; // Use file protocol to detect appModes.\r\n\r\n if (os.android && (support.devicePixelRatio < 1.5 && os.flatVersion < 400 || notAndroidPhone) && (support.screenWidth > 800 || support.screenHeight > 800)) {\r\n os.tablet = agent;\r\n }\r\n\r\n break;\r\n }\r\n }\r\n }\r\n return os;\r\n };\r\n\r\n var mobileOS = support.mobileOS = support.detectOS(navigator.userAgent);\r\n\r\n support.wpDevicePixelRatio = mobileOS.wp ? screen.width / 320 : 0;\r\n\r\n support.hasNativeScrolling = false;\r\n\r\n if (mobileOS.ios || (mobileOS.android && mobileOS.majorVersion > 2) || mobileOS.wp) {\r\n support.hasNativeScrolling = mobileOS;\r\n }\r\n\r\n support.delayedClick = function() {\r\n\r\n // only the mobile devices with touch events do this.\r\n if (support.touch) {\r\n // All iOS devices so far (by the time I am writing this, iOS 9.0.2 is the latest),\r\n // delay their click events.\r\n if (mobileOS.ios) {\r\n return true;\r\n }\r\n\r\n if (mobileOS.android) {\r\n\r\n if (!support.browser.chrome) { // older webkits and webviews delay the click\r\n return true;\r\n }\r\n\r\n // from here on, we deal with Chrome on Android.\r\n if (support.browser.version < 32) {\r\n return false;\r\n }\r\n\r\n // Chrome 32+ does conditional fast clicks if the view port is not user scalable.\r\n return !($(\"meta[name=viewport]\").attr(\"content\") || \"\").match(/user-scalable=no/i);\r\n }\r\n }\r\n\r\n return false;\r\n };\r\n\r\n support.mouseAndTouchPresent = support.touch && !(support.mobileOS.ios || support.mobileOS.android);\r\n\r\n support.detectBrowser = function(ua) {\r\n var browser = false,\r\n match = [],\r\n chromiumEdgeMatch = [],\r\n browserRxs = {\r\n edge: /(edge)[ \\/]([\\w.]+)/i,\r\n webkit: /(chrome|crios)[ \\/]([\\w.]+)/i,\r\n safari: /(webkit)[ \\/]([\\w.]+)/i,\r\n opera: /(opera)(?:.*version|)[ \\/]([\\w.]+)/i,\r\n msie: /(msie\\s|trident.*? rv:)([\\w.]+)/i,\r\n mozilla: /(mozilla)(?:.*? rv:([\\w.]+)|)/i\r\n };\r\n\r\n for (var agent in browserRxs) {\r\n if (browserRxs.hasOwnProperty(agent)) {\r\n match = ua.match(browserRxs[agent]);\r\n if (match) {\r\n browser = {};\r\n browser[agent] = true;\r\n browser[match[1].toLowerCase().split(\" \")[0].split(\"/\")[0]] = true;\r\n browser.version = parseInt(document.documentMode || match[2], 10);\r\n\r\n if (browser.chrome) {\r\n chromiumEdgeMatch = ua.match(/(edg)[ \\/]([\\w.]+)/i);\r\n\r\n if (chromiumEdgeMatch) {\r\n browser.chromiumEdge = true;\r\n }\r\n }\r\n\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return browser;\r\n };\r\n\r\n support.browser = support.detectBrowser(navigator.userAgent);\r\n\r\n if (!mobileOS && support.touch && support.browser.safari) {\r\n mobileOS = support.mobileOS = {\r\n ios: true,\r\n tablet: \"tablet\",\r\n device: \"ipad\",\r\n majorVersion: 13\r\n };\r\n }\r\n\r\n support.detectClipboardAccess = function() {\r\n var commands = {\r\n copy: document.queryCommandSupported ? document.queryCommandSupported(\"copy\") : false,\r\n cut: document.queryCommandSupported ? document.queryCommandSupported(\"cut\") : false,\r\n paste: document.queryCommandSupported ? document.queryCommandSupported(\"paste\") : false\r\n };\r\n\r\n if (support.browser.chrome) {\r\n //not using queryCommandSupported due to chromium issues 476508 and 542948\r\n commands.paste = false;\r\n if (support.browser.version >= 43) {\r\n commands.copy = true;\r\n commands.cut = true;\r\n }\r\n }\r\n\r\n return commands;\r\n };\r\n\r\n support.clipboard = support.detectClipboardAccess();\r\n\r\n support.zoomLevel = function() {\r\n try {\r\n var browser = support.browser;\r\n var ie11WidthCorrection = 0;\r\n var docEl = document.documentElement;\r\n\r\n if (browser.msie && browser.version == 11 && docEl.scrollHeight > docEl.clientHeight && !support.touch) {\r\n ie11WidthCorrection = support.scrollbar();\r\n }\r\n\r\n return support.touch ? (docEl.clientWidth / window.innerWidth) :\r\n browser.msie && browser.version >= 10 ? (((top || window).document.documentElement.offsetWidth + ie11WidthCorrection) / (top || window).innerWidth) : 1;\r\n } catch (e) {\r\n return 1;\r\n }\r\n };\r\n\r\n (function(browser) {\r\n // add browser-specific CSS class\r\n var cssClass = \"\",\r\n docElement = $(document.documentElement),\r\n majorVersion = parseInt(browser.version, 10);\r\n\r\n if (browser.msie) {\r\n cssClass = \"ie\";\r\n } else if (browser.mozilla) {\r\n cssClass = \"ff\";\r\n } else if (browser.safari) {\r\n cssClass = \"safari\";\r\n } else if (browser.webkit) {\r\n cssClass = \"webkit\";\r\n } else if (browser.opera) {\r\n cssClass = \"opera\";\r\n } else if (browser.edge) {\r\n cssClass = \"edge\";\r\n }\r\n\r\n if (cssClass) {\r\n cssClass = \"k-\" + cssClass + \" k-\" + cssClass + majorVersion;\r\n }\r\n if (support.mobileOS) {\r\n cssClass += \" k-mobile\";\r\n }\r\n\r\n if (!support.cssFlexbox) {\r\n cssClass += \" k-no-flexbox\";\r\n }\r\n\r\n docElement.addClass(cssClass);\r\n })(support.browser);\r\n\r\n support.eventCapture = document.documentElement.addEventListener;\r\n\r\n var input = document.createElement(\"input\");\r\n\r\n support.placeholder = \"placeholder\" in input;\r\n support.propertyChangeEvent = \"onpropertychange\" in input;\r\n\r\n support.input = (function() {\r\n var types = [\"number\", \"date\", \"time\", \"month\", \"week\", \"datetime\", \"datetime-local\"];\r\n var length = types.length;\r\n var value = \"test\";\r\n var result = {};\r\n var idx = 0;\r\n var type;\r\n\r\n for (;idx < length; idx++) {\r\n type = types[idx];\r\n input.setAttribute(\"type\", type);\r\n input.value = value;\r\n\r\n result[type.replace(\"-\", \"\")] = input.type !== \"text\" && input.value !== value;\r\n }\r\n\r\n return result;\r\n })();\r\n\r\n input.style.cssText = \"float:left;\";\r\n\r\n support.cssFloat = !!input.style.cssFloat;\r\n\r\n input = null;\r\n\r\n support.stableSort = (function() {\r\n // Chrome sort is not stable for more than *10* items\r\n // IE9+ sort is not stable for than *512* items\r\n var threshold = 513;\r\n\r\n var sorted = [{\r\n index: 0,\r\n field: \"b\"\r\n }];\r\n\r\n for (var i = 1; i < threshold; i++) {\r\n sorted.push({\r\n index: i,\r\n field: \"a\"\r\n });\r\n }\r\n\r\n sorted.sort(function(a, b) {\r\n return a.field > b.field ? 1 : (a.field < b.field ? -1 : 0);\r\n });\r\n\r\n return sorted[0].index === 1;\r\n })();\r\n\r\n support.matchesSelector = elementProto.webkitMatchesSelector || elementProto.mozMatchesSelector ||\r\n elementProto.msMatchesSelector || elementProto.oMatchesSelector ||\r\n elementProto.matchesSelector || elementProto.matches ||\r\n function( selector ) {\r\n var nodeList = document.querySelectorAll ? ( this.parentNode || document ).querySelectorAll( selector ) || [] : $(selector),\r\n i = nodeList.length;\r\n\r\n while (i--) {\r\n if (nodeList[i] == this) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n };\r\n\r\n support.matchMedia = \"matchMedia\" in window;\r\n\r\n support.pushState = window.history && window.history.pushState;\r\n\r\n support.hashChange = \"onhashchange\" in window;\r\n\r\n support.customElements = \"registerElement\" in window.document;\r\n\r\n var chrome = support.browser.chrome,\r\n mobileChrome = support.browser.crios,\r\n mozilla = support.browser.mozilla,\r\n safari = support.browser.safari;\r\n support.msPointers = !chrome && window.MSPointerEvent;\r\n support.pointers = !chrome && !mobileChrome && !mozilla && !safari && window.PointerEvent;\r\n support.kineticScrollNeeded = mobileOS && (mobileOS.device !== \"ipad\" || mobileOS.majorVersion < 13) && (support.touch || support.msPointers || support.pointers);\r\n })();\r\n\r\n\r\n function size(obj) {\r\n var result = 0, key;\r\n for (key in obj) {\r\n if (obj.hasOwnProperty(key) && key != \"toJSON\") { // Ignore fake IE7 toJSON.\r\n result++;\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n function getOffset(element, type, positioned) {\r\n if (!type) {\r\n type = \"offset\";\r\n }\r\n\r\n var offset = element[type]();\r\n // clone ClientRect object to JS object (jQuery3)\r\n var result = {\r\n top: offset.top,\r\n right: offset.right,\r\n bottom: offset.bottom,\r\n left: offset.left\r\n };\r\n\r\n // IE10 touch zoom is living in a separate viewport\r\n if (support.browser.msie && (support.pointers || support.msPointers) && !positioned) {\r\n var sign = support.isRtl(element) ? 1 : -1;\r\n\r\n result.top -= (window.pageYOffset - (document.documentElement.scrollTop));\r\n result.left -= (window.pageXOffset + (sign * document.documentElement.scrollLeft));\r\n }\r\n\r\n return result;\r\n }\r\n\r\n var directions = {\r\n left: { reverse: \"right\" },\r\n right: { reverse: \"left\" },\r\n down: { reverse: \"up\" },\r\n up: { reverse: \"down\" },\r\n top: { reverse: \"bottom\" },\r\n bottom: { reverse: \"top\" },\r\n \"in\": { reverse: \"out\" },\r\n out: { reverse: \"in\" }\r\n };\r\n\r\n function parseEffects(input) {\r\n var effects = {};\r\n\r\n each((typeof input === \"string\" ? input.split(\" \") : input), function(idx) {\r\n effects[idx] = this;\r\n });\r\n\r\n return effects;\r\n }\r\n\r\n function fx(element) {\r\n return new kendo.effects.Element(element);\r\n }\r\n\r\n var effects = {};\r\n\r\n $.extend(effects, {\r\n enabled: true,\r\n Element: function(element) {\r\n this.element = $(element);\r\n },\r\n\r\n promise: function(element, options) {\r\n if (!element.is(\":visible\")) {\r\n element.css({ display: element.data(\"olddisplay\") || \"block\" }).css(\"display\");\r\n }\r\n\r\n if (options.hide) {\r\n element.data(\"olddisplay\", element.css(\"display\")).hide();\r\n }\r\n\r\n if (options.init) {\r\n options.init();\r\n }\r\n\r\n if (options.completeCallback) {\r\n options.completeCallback(element); // call the external complete callback with the element\r\n }\r\n\r\n element.dequeue();\r\n },\r\n\r\n disable: function() {\r\n this.enabled = false;\r\n this.promise = this.promiseShim;\r\n },\r\n\r\n enable: function() {\r\n this.enabled = true;\r\n this.promise = this.animatedPromise;\r\n }\r\n });\r\n\r\n effects.promiseShim = effects.promise;\r\n\r\n function prepareAnimationOptions(options, duration, reverse, complete) {\r\n if (typeof options === STRING) {\r\n // options is the list of effect names separated by space e.g. animate(element, \"fadeIn slideDown\")\r\n\r\n // only callback is provided e.g. animate(element, options, function() {});\r\n if (isFunction(duration)) {\r\n complete = duration;\r\n duration = 400;\r\n reverse = false;\r\n }\r\n\r\n if (isFunction(reverse)) {\r\n complete = reverse;\r\n reverse = false;\r\n }\r\n\r\n if (typeof duration === BOOLEAN) {\r\n reverse = duration;\r\n duration = 400;\r\n }\r\n\r\n options = {\r\n effects: options,\r\n duration: duration,\r\n reverse: reverse,\r\n complete: complete\r\n };\r\n }\r\n\r\n return extend({\r\n //default options\r\n effects: {},\r\n duration: 400, //jQuery default duration\r\n reverse: false,\r\n init: noop,\r\n teardown: noop,\r\n hide: false\r\n }, options, { completeCallback: options.complete, complete: noop }); // Move external complete callback, so deferred.resolve can be always executed.\r\n\r\n }\r\n\r\n function animate(element, options, duration, reverse, complete) {\r\n var idx = 0,\r\n length = element.length,\r\n instance;\r\n\r\n for (; idx < length; idx ++) {\r\n instance = $(element[idx]);\r\n instance.queue(function() {\r\n effects.promise(instance, prepareAnimationOptions(options, duration, reverse, complete));\r\n });\r\n }\r\n\r\n return element;\r\n }\r\n\r\n function toggleClass(element, classes, options, add) {\r\n if (classes) {\r\n classes = classes.split(\" \");\r\n\r\n each(classes, function(idx, value) {\r\n element.toggleClass(value, add);\r\n });\r\n }\r\n\r\n return element;\r\n }\r\n\r\n if (!(\"kendoAnimate\" in $.fn)) {\r\n extend($.fn, {\r\n kendoStop: function(clearQueue, gotoEnd) {\r\n return this.stop(clearQueue, gotoEnd);\r\n },\r\n\r\n kendoAnimate: function(options, duration, reverse, complete) {\r\n return animate(this, options, duration, reverse, complete);\r\n },\r\n\r\n kendoAddClass: function(classes, options) {\r\n return kendo.toggleClass(this, classes, options, true);\r\n },\r\n\r\n kendoRemoveClass: function(classes, options) {\r\n return kendo.toggleClass(this, classes, options, false);\r\n },\r\n kendoToggleClass: function(classes, options, toggle) {\r\n return kendo.toggleClass(this, classes, options, toggle);\r\n }\r\n });\r\n }\r\n\r\n var ampRegExp = /&/g,\r\n ltRegExp = //g;\r\n\r\n function htmlDecode(value) {\r\n var entities = {\r\n '&': '&',\r\n '<': '<',\r\n '>': '>',\r\n '"': '\"',\r\n ''': \"'\"\r\n };\r\n\r\n return value.replace(/&(?:amp|lt|gt|quot|#39);/g, function(match) {\r\n return entities[match];\r\n });\r\n }\r\n\r\n function htmlEncode(value, shouldDecode) {\r\n if (shouldDecode === true) {\r\n value = htmlDecode(value);\r\n }\r\n\r\n return (\"\" + value).replace(ampRegExp, \"&\").replace(ltRegExp, \"<\").replace(gtRegExp, \">\").replace(quoteRegExp, \""\").replace(aposRegExp, \"'\");\r\n }\r\n\r\n function unescape(value) {\r\n var template;\r\n\r\n try {\r\n template = window.decodeURIComponent(value);\r\n } catch (error) {\r\n // If the string contains Unicode characters\r\n // the decodeURIComponent() will throw an error.\r\n // Therefore: convert to UTF-8 character\r\n template = value.replace(/%u([\\dA-F]{4})|%([\\dA-F]{2})/gi, function(_, m1, m2) {\r\n return String.fromCharCode(parseInt(\"0x\" + (m1 || m2), 16));\r\n });\r\n }\r\n\r\n return template;\r\n }\r\n\r\n var eventTarget = function(e) {\r\n return e.target;\r\n };\r\n\r\n if (support.touch) {\r\n\r\n eventTarget = function(e) {\r\n var touches = \"originalEvent\" in e ? e.originalEvent.changedTouches : \"changedTouches\" in e ? e.changedTouches : null;\r\n\r\n return touches ? document.elementFromPoint(touches[0].clientX, touches[0].clientY) : e.target;\r\n };\r\n\r\n each([\"swipe\", \"swipeLeft\", \"swipeRight\", \"swipeUp\", \"swipeDown\", \"doubleTap\", \"tap\"], function(m, value) {\r\n $.fn[value] = function(callback) {\r\n return this.on(value, callback);\r\n };\r\n });\r\n }\r\n\r\n if (support.touch) {\r\n if (!support.mobileOS) {\r\n support.mousedown = \"mousedown touchstart\";\r\n support.mouseup = \"mouseup touchend\";\r\n support.mousemove = \"mousemove touchmove\";\r\n support.mousecancel = \"mouseleave touchcancel\";\r\n support.click = \"click\";\r\n support.resize = \"resize\";\r\n } else {\r\n support.mousedown = \"touchstart\";\r\n support.mouseup = \"touchend\";\r\n support.mousemove = \"touchmove\";\r\n support.mousecancel = \"touchcancel\";\r\n support.click = \"touchend\";\r\n support.resize = \"orientationchange\";\r\n }\r\n } else if (support.pointers) {\r\n support.mousemove = \"pointermove\";\r\n support.mousedown = \"pointerdown\";\r\n support.mouseup = \"pointerup\";\r\n support.mousecancel = \"pointercancel\";\r\n support.click = \"pointerup\";\r\n support.resize = \"orientationchange resize\";\r\n } else if (support.msPointers) {\r\n support.mousemove = \"MSPointerMove\";\r\n support.mousedown = \"MSPointerDown\";\r\n support.mouseup = \"MSPointerUp\";\r\n support.mousecancel = \"MSPointerCancel\";\r\n support.click = \"MSPointerUp\";\r\n support.resize = \"orientationchange resize\";\r\n } else {\r\n support.mousemove = \"mousemove\";\r\n support.mousedown = \"mousedown\";\r\n support.mouseup = \"mouseup\";\r\n support.mousecancel = \"mouseleave\";\r\n support.click = \"click\";\r\n support.resize = \"resize\";\r\n }\r\n\r\n var wrapExpression = function(members, paramName) {\r\n var result = paramName || \"d\",\r\n index,\r\n idx,\r\n length,\r\n member,\r\n count = 1;\r\n\r\n for (idx = 0, length = members.length; idx < length; idx++) {\r\n member = members[idx];\r\n if (member !== \"\") {\r\n index = member.indexOf(\"[\");\r\n\r\n if (index !== 0) {\r\n if (index == -1) {\r\n member = \".\" + member;\r\n } else {\r\n count++;\r\n member = \".\" + member.substring(0, index) + \" || {})\" + member.substring(index);\r\n }\r\n }\r\n\r\n count++;\r\n result += member + ((idx < length - 1) ? \" || {})\" : \")\");\r\n }\r\n }\r\n return new Array(count).join(\"(\") + result;\r\n },\r\n localUrlRe = /^([a-z]+:)?\\/\\//i;\r\n\r\n extend(kendo, {\r\n widgets: [],\r\n _widgetRegisteredCallbacks: [],\r\n ui: kendo.ui || {},\r\n fx: kendo.fx || fx,\r\n effects: kendo.effects || effects,\r\n mobile: kendo.mobile || { },\r\n data: kendo.data || {},\r\n dataviz: kendo.dataviz || {},\r\n drawing: kendo.drawing || {},\r\n spreadsheet: { messages: {} },\r\n keys: {\r\n INSERT: 45,\r\n DELETE: 46,\r\n BACKSPACE: 8,\r\n TAB: 9,\r\n ENTER: 13,\r\n ESC: 27,\r\n LEFT: 37,\r\n UP: 38,\r\n RIGHT: 39,\r\n DOWN: 40,\r\n END: 35,\r\n HOME: 36,\r\n SPACEBAR: 32,\r\n PAGEUP: 33,\r\n PAGEDOWN: 34,\r\n F2: 113,\r\n F10: 121,\r\n F12: 123,\r\n NUMPAD_PLUS: 107,\r\n NUMPAD_MINUS: 109,\r\n NUMPAD_DOT: 110\r\n },\r\n support: kendo.support || support,\r\n animate: kendo.animate || animate,\r\n ns: \"\",\r\n attr: function(value) {\r\n return \"data-\" + kendo.ns + value;\r\n },\r\n getShadows: getShadows,\r\n wrap: wrap,\r\n deepExtend: deepExtend,\r\n getComputedStyles: getComputedStyles,\r\n isScrollable: isScrollable,\r\n scrollLeft: scrollLeft,\r\n size: size,\r\n toCamelCase: toCamelCase,\r\n toHyphens: toHyphens,\r\n getOffset: kendo.getOffset || getOffset,\r\n parseEffects: kendo.parseEffects || parseEffects,\r\n toggleClass: kendo.toggleClass || toggleClass,\r\n directions: kendo.directions || directions,\r\n Observable: Observable,\r\n Class: Class,\r\n Template: Template,\r\n template: Template.compile.bind(Template),\r\n render: Template.render.bind(Template),\r\n stringify: JSON.stringify.bind(JSON),\r\n eventTarget: eventTarget,\r\n htmlEncode: htmlEncode,\r\n unescape: unescape,\r\n isLocalUrl: function(url) {\r\n return url && !localUrlRe.test(url);\r\n },\r\n mediaQuery: mediaQuery,\r\n\r\n expr: function(expression, safe, paramName) {\r\n expression = expression || \"\";\r\n\r\n if (typeof safe == STRING) {\r\n paramName = safe;\r\n safe = false;\r\n }\r\n\r\n paramName = paramName || \"d\";\r\n\r\n if (expression && expression.charAt(0) !== \"[\") {\r\n expression = \".\" + expression;\r\n }\r\n\r\n if (safe) {\r\n expression = expression.replace(/\"([^.]*)\\.([^\"]*)\"/g,'\"$1_$DOT$_$2\"');\r\n expression = expression.replace(/'([^.]*)\\.([^']*)'/g,\"'$1_$DOT$_$2'\");\r\n expression = wrapExpression(expression.split(\".\"), paramName);\r\n expression = expression.replace(/_\\$DOT\\$_/g, \".\");\r\n } else {\r\n expression = paramName + expression;\r\n }\r\n\r\n return expression;\r\n },\r\n\r\n exprToArray: (expression, safe) => {\r\n expression = expression || \"\";\r\n\r\n return expression.indexOf(\".\") >= 0 || expression.indexOf(\"[\") >= 0 ?\r\n expression.split(/[[\\].]/).map(v => v.replace(/[\"']/g, '')).filter(v => v) :\r\n expression === \"\" ? [] : [expression];\r\n },\r\n\r\n getter: function(expression, safe) {\r\n var key = expression + safe;\r\n\r\n return getterCache[key] = getterCache[key] || ((obj) => {\r\n const fields = kendo.exprToArray(expression, safe);\r\n\r\n let result = obj;\r\n for (let idx = 0; idx < fields.length; idx++) {\r\n result = result[fields[idx]];\r\n if (!kendo.isPresent(result) && safe) {\r\n return result;\r\n }\r\n }\r\n\r\n return result;\r\n });\r\n },\r\n\r\n setter: function(expression) {\r\n return setterCache[expression] = setterCache[expression] || ((obj, value) => {\r\n const fields = kendo.exprToArray(expression);\r\n\r\n const innerSetter = ({ parent, val, prop, props }) => {\r\n if (props.length) {\r\n parent = parent[props.shift()];\r\n innerSetter({ parent, val, prop, props });\r\n } else {\r\n parent[prop] = val;\r\n }\r\n };\r\n\r\n innerSetter({\r\n parent: obj,\r\n val: value,\r\n prop: fields.pop(),\r\n props: fields\r\n });\r\n });\r\n },\r\n\r\n accessor: function(expression) {\r\n return {\r\n get: kendo.getter(expression),\r\n set: kendo.setter(expression)\r\n };\r\n },\r\n\r\n guid: function() {\r\n var id = \"\", i, random, chars = \"abcdef\";\r\n\r\n id += chars[Math.floor(Math.random() * Math.floor(chars.length))];\r\n\r\n for (i = 1; i < 32; i++) {\r\n random = math.random() * 16 | 0;\r\n\r\n if (i == 8 || i == 12 || i == 16 || i == 20) {\r\n id += \"-\";\r\n }\r\n id += (i == 12 ? 4 : (i == 16 ? (random & 3 | 8) : random)).toString(16);\r\n }\r\n\r\n return id;\r\n },\r\n\r\n roleSelector: function(role) {\r\n return role.replace(/(\\S+)/g, \"[\" + kendo.attr(\"role\") + \"=$1],\").slice(0, -1);\r\n },\r\n\r\n directiveSelector: function(directives) {\r\n var selectors = directives.split(\" \");\r\n\r\n if (selectors) {\r\n for (var i = 0; i < selectors.length; i++) {\r\n if (selectors[i] != \"view\") {\r\n selectors[i] = selectors[i].replace(/(\\w*)(view|bar|strip|over)$/, \"$1-$2\");\r\n }\r\n }\r\n }\r\n\r\n return selectors.join(\" \").replace(/(\\S+)/g, \"kendo-mobile-$1,\").slice(0, -1);\r\n },\r\n\r\n triggeredByInput: function(e) {\r\n return (/^(label|input|textarea|select)$/i).test(e.target.tagName);\r\n },\r\n\r\n onWidgetRegistered: function(callback) {\r\n for (var i = 0, len = kendo.widgets.length; i < len; i++) {\r\n callback(kendo.widgets[i]);\r\n }\r\n\r\n kendo._widgetRegisteredCallbacks.push(callback);\r\n },\r\n\r\n logToConsole: function(message, type) {\r\n var console = window.console;\r\n\r\n if (!kendo.suppressLog && typeof(console) != \"undefined\" && console.log) {\r\n console[type || \"log\"](message);\r\n }\r\n }\r\n });\r\n\r\n var Widget = Observable.extend( {\r\n init: function(element, options) {\r\n var that = this;\r\n\r\n if (!validatePackage()) {\r\n that._showWatermarkOverlay = addWatermarkOverlay;\r\n }\r\n\r\n that.element = kendo.jQuery(element).handler(that);\r\n\r\n Observable.fn.init.call(that);\r\n\r\n var dataSource = options ? options.dataSource : null;\r\n var props;\r\n\r\n if (options) {\r\n props = (that.componentTypes || {})[(options || {}).componentType];\r\n }\r\n\r\n if (dataSource) {\r\n // avoid deep cloning the data source\r\n options = extend({}, options, { dataSource: {} });\r\n }\r\n\r\n options = that.options = extend(true, {}, that.options, that.defaults, props || {}, options);\r\n\r\n if (dataSource) {\r\n options.dataSource = dataSource;\r\n }\r\n\r\n if (!that.element.attr(kendo.attr(\"role\"))) {\r\n that.element.attr(kendo.attr(\"role\"), (options.name || \"\").toLowerCase());\r\n }\r\n\r\n that.element.data(\"kendo\" + options.prefix + options.name, that);\r\n\r\n that.bind(that.events, options);\r\n },\r\n\r\n events: [],\r\n\r\n options: {\r\n prefix: \"\"\r\n },\r\n\r\n _hasBindingTarget: function() {\r\n return !!this.element[0].kendoBindingTarget;\r\n },\r\n\r\n _tabindex: function(target) {\r\n target = target || this.wrapper;\r\n\r\n var element = this.element,\r\n TABINDEX = \"tabindex\",\r\n tabindex = target.attr(TABINDEX) || element.attr(TABINDEX);\r\n\r\n element.removeAttr(TABINDEX);\r\n\r\n target.attr(TABINDEX, !isNaN(tabindex) ? tabindex : 0);\r\n },\r\n\r\n setOptions: function(options) {\r\n this._clearCssClasses(options);\r\n this._setEvents(options);\r\n $.extend(this.options, options);\r\n this._applyCssClasses();\r\n },\r\n\r\n _setEvents: function(options) {\r\n var that = this,\r\n idx = 0,\r\n length = that.events.length,\r\n e;\r\n\r\n for (; idx < length; idx ++) {\r\n e = that.events[idx];\r\n if (that.options[e] && options[e]) {\r\n that.unbind(e, that.options[e]);\r\n if (that._events && that._events[e]) {\r\n delete that._events[e];\r\n }\r\n }\r\n }\r\n\r\n that.bind(that.events, options);\r\n },\r\n\r\n resize: function(force) {\r\n var size = this.getSize(),\r\n currentSize = this._size;\r\n\r\n if (force || (size.width > 0 || size.height > 0) && (!currentSize || size.width !== currentSize.width || size.height !== currentSize.height)) {\r\n this._size = size;\r\n this._resize(size, force);\r\n this.trigger(\"resize\", size);\r\n }\r\n },\r\n\r\n getSize: function() {\r\n return kendo.dimensions(this.element);\r\n },\r\n\r\n size: function(size) {\r\n if (!size) {\r\n return this.getSize();\r\n } else {\r\n this.setSize(size);\r\n }\r\n },\r\n\r\n setSize: $.noop,\r\n _resize: $.noop,\r\n\r\n destroy: function() {\r\n var that = this;\r\n\r\n that.element.removeData(\"kendo\" + that.options.prefix + that.options.name);\r\n that.element.removeData(\"handler\");\r\n that.unbind();\r\n },\r\n _destroy: function() {\r\n this.destroy();\r\n },\r\n\r\n _applyCssClasses: function(element) {\r\n var protoOptions = this.__proto__.options,\r\n options = this.options,\r\n el = element || this.wrapper || this.element,\r\n classes = [],\r\n i, prop, validFill, widgetName;\r\n\r\n if (!kendo.cssProperties.propertyDictionary[protoOptions.name]) {\r\n return;\r\n }\r\n\r\n for (i = 0; i < cssPropertiesNames.length; i++) {\r\n prop = cssPropertiesNames[i];\r\n widgetName = this.options._altname || protoOptions.name;\r\n\r\n if (protoOptions.hasOwnProperty(prop)) {\r\n if (prop === \"themeColor\") {\r\n validFill = kendo.cssProperties.getValidClass({\r\n widget: widgetName,\r\n propName: \"fillMode\",\r\n value: options.fillMode\r\n });\r\n\r\n if (validFill && validFill.length) {\r\n classes.push(kendo.cssProperties.getValidClass({\r\n widget: widgetName,\r\n propName: prop,\r\n value: options[prop],\r\n fill: options.fillMode\r\n }));\r\n }\r\n } else {\r\n classes.push(kendo.cssProperties.getValidClass({\r\n widget: widgetName,\r\n propName: prop,\r\n value: options[prop]\r\n }));\r\n }\r\n }\r\n }\r\n\r\n el.addClass(classes.join(\" \"));\r\n },\r\n\r\n _ariaLabel: function(target) {\r\n var that = this,\r\n inputElm = that.element,\r\n inputId = inputElm.attr(\"id\"),\r\n labelElm = $(\"label[for=\\\"\" + inputId + \"\\\"]\"),\r\n ariaLabel = inputElm.attr(ARIA_LABEL),\r\n ariaLabelledBy = inputElm.attr(ARIA_LABELLEDBY),\r\n labelId;\r\n\r\n if (target[0] === inputElm[0]) {\r\n return;\r\n }\r\n\r\n if (ariaLabel) {\r\n target.attr(ARIA_LABEL, ariaLabel);\r\n } else if (ariaLabelledBy) {\r\n target.attr(ARIA_LABELLEDBY, ariaLabelledBy);\r\n } else if (labelElm.length) {\r\n labelId = labelElm.attr(\"id\") || that._generateLabelId(labelElm, inputId || kendo.guid());\r\n target.attr(ARIA_LABELLEDBY, labelId);\r\n }\r\n },\r\n\r\n _clearCssClasses: function(newOptions, element) {\r\n var protoOptions = this.__proto__.options,\r\n currentOptions = this.options,\r\n el = element || this.wrapper || this.element,\r\n i, prop, widgetName;\r\n\r\n if (!kendo.cssProperties.propertyDictionary[protoOptions.name]) {\r\n return;\r\n }\r\n\r\n for (i = 0; i < cssPropertiesNames.length; i++) {\r\n prop = cssPropertiesNames[i];\r\n widgetName = this.options._altname || protoOptions.name;\r\n\r\n if (protoOptions.hasOwnProperty(prop) && newOptions.hasOwnProperty(prop)) {\r\n if (prop === \"themeColor\") {\r\n el.removeClass(kendo.cssProperties.getValidClass({\r\n widget: widgetName,\r\n propName: prop,\r\n value: currentOptions[prop],\r\n fill: currentOptions.fillMode\r\n }));\r\n } else {\r\n if (prop === \"fillMode\") {\r\n el.removeClass(kendo.cssProperties.getValidClass({\r\n widget: widgetName,\r\n propName: \"themeColor\",\r\n value: currentOptions.themeColor,\r\n fill: currentOptions.fillMode\r\n }));\r\n }\r\n\r\n el.removeClass(kendo.cssProperties.getValidClass({\r\n widget: widgetName,\r\n propName: prop,\r\n value: currentOptions[prop]\r\n }));\r\n }\r\n }\r\n }\r\n },\r\n\r\n _generateLabelId: function(label, inputId) {\r\n var labelId = inputId + LABELIDPART;\r\n\r\n label.attr(\"id\", labelId);\r\n\r\n return labelId;\r\n },\r\n });\r\n\r\n var DataBoundWidget = Widget.extend({\r\n dataItems: function() {\r\n return this.dataSource.flatView();\r\n }\r\n });\r\n\r\n kendo.dimensions = function(element, dimensions) {\r\n var domElement = element[0];\r\n\r\n if (dimensions) {\r\n element.css(dimensions);\r\n }\r\n\r\n return { width: domElement.offsetWidth, height: domElement.offsetHeight };\r\n };\r\n\r\n kendo.notify = noop;\r\n\r\n var templateRegExp = /template$/i,\r\n jsonRegExp = /^\\s*(?:\\{(?:.|\\r\\n|\\n)*\\}|\\[(?:.|\\r\\n|\\n)*\\])\\s*$/,\r\n jsonFormatRegExp = /^\\{(\\d+)(:[^\\}]+)?\\}|^\\[[A-Za-z_]+\\]$/,\r\n dashRegExp = /([A-Z])/g;\r\n\r\n function parseOption(element, option) {\r\n var value;\r\n\r\n if (option.indexOf(\"data\") === 0) {\r\n option = option.substring(4);\r\n option = option.charAt(0).toLowerCase() + option.substring(1);\r\n }\r\n\r\n option = option.replace(dashRegExp, \"-$1\");\r\n value = element.getAttribute(\"data-\" + kendo.ns + option);\r\n\r\n if (value === null) {\r\n value = undefined$1;\r\n } else if (value === \"null\") {\r\n value = null;\r\n } else if (value === \"true\") {\r\n value = true;\r\n } else if (value === \"false\") {\r\n value = false;\r\n } else if (numberRegExp.test(value) && option != \"mask\" && option != \"format\") {\r\n value = parseFloat(value);\r\n } else if (jsonRegExp.test(value) && !jsonFormatRegExp.test(value)) {\r\n try {\r\n value = JSON.parse(value);\r\n } catch (error) {\r\n // Fallback to function eval for legacy reason - non CSP compliant\r\n value = new Function(\"return (\" + value + \")\")();\r\n }\r\n }\r\n\r\n return value;\r\n }\r\n\r\n function parseOptions(element, options, source) {\r\n var result = {},\r\n option,\r\n value,\r\n role = element.getAttribute(\"data-\" + kendo.ns + \"role\");\r\n\r\n for (option in options) {\r\n value = parseOption(element, option);\r\n\r\n if (value !== undefined$1) {\r\n\r\n if (templateRegExp.test(option) && role != \"drawer\") {\r\n if (typeof value === \"string\") {\r\n if ($(\"#\" + value).length) {\r\n value = kendo.template($(\"#\" + value).html());\r\n } else if (source) {\r\n value = kendo.template(source[value]);\r\n }\r\n } else {\r\n value = element.getAttribute(option);\r\n }\r\n }\r\n\r\n result[option] = value;\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n kendo.initWidget = function(element, options, roles) {\r\n var result,\r\n option,\r\n widget,\r\n idx,\r\n length,\r\n role,\r\n value,\r\n dataSource,\r\n fullPath,\r\n widgetKeyRegExp;\r\n\r\n // Preserve backwards compatibility with (element, options, namespace) signature, where namespace was kendo.ui\r\n if (!roles) {\r\n roles = kendo.ui.roles;\r\n } else if (roles.roles) {\r\n roles = roles.roles;\r\n }\r\n\r\n element = element.nodeType ? element : element[0];\r\n\r\n role = element.getAttribute(\"data-\" + kendo.ns + \"role\");\r\n\r\n if (!role) {\r\n return;\r\n }\r\n\r\n fullPath = role.indexOf(\".\") === -1;\r\n\r\n // look for any widget that may be already instantiated based on this role.\r\n // The prefix used is unknown, hence the regexp\r\n //\r\n\r\n if (fullPath) {\r\n widget = roles[role];\r\n } else { // full namespace path - like kendo.ui.Widget\r\n widget = kendo.getter(role)(window);\r\n }\r\n\r\n var data = $(element).data(),\r\n widgetKey = widget ? \"kendo\" + widget.fn.options.prefix + widget.fn.options.name : \"\";\r\n\r\n if (fullPath) {\r\n widgetKeyRegExp = new RegExp(\"^kendo.*\" + role + \"$\", \"i\");\r\n } else { // full namespace path - like kendo.ui.Widget\r\n widgetKeyRegExp = new RegExp(\"^\" + widgetKey + \"$\", \"i\");\r\n }\r\n\r\n for (var key in data) {\r\n if (key.match(widgetKeyRegExp)) {\r\n // we have detected a widget of the same kind - save its reference, we will set its options\r\n if (key === widgetKey) {\r\n result = data[key];\r\n } else {\r\n return data[key];\r\n }\r\n }\r\n }\r\n\r\n if (!widget) {\r\n return;\r\n }\r\n\r\n dataSource = parseOption(element, \"dataSource\");\r\n\r\n options = $.extend({}, parseOptions(element, $.extend({}, widget.fn.options, widget.fn.defaults) ), options);\r\n\r\n if (dataSource) {\r\n if (typeof dataSource === STRING) {\r\n options.dataSource = kendo.getter(dataSource)(window);\r\n } else {\r\n options.dataSource = dataSource;\r\n }\r\n }\r\n\r\n for (idx = 0, length = widget.fn.events.length; idx < length; idx++) {\r\n option = widget.fn.events[idx];\r\n\r\n value = parseOption(element, option);\r\n\r\n if (value !== undefined$1) {\r\n options[option] = kendo.getter(value)(window);\r\n }\r\n }\r\n\r\n if (!result) {\r\n result = new widget(element, options);\r\n } else if (!$.isEmptyObject(options)) {\r\n result.setOptions(options);\r\n }\r\n\r\n return result;\r\n };\r\n\r\n kendo.rolesFromNamespaces = function(namespaces) {\r\n var roles = [],\r\n idx,\r\n length;\r\n\r\n if (!namespaces[0]) {\r\n namespaces = [kendo.ui, kendo.dataviz.ui];\r\n }\r\n\r\n for (idx = 0, length = namespaces.length; idx < length; idx ++) {\r\n roles[idx] = namespaces[idx].roles;\r\n }\r\n\r\n return extend.apply(null, [{}].concat(roles.reverse()));\r\n };\r\n\r\n kendo.init = function(element) {\r\n var roles = kendo.rolesFromNamespaces(slice.call(arguments, 1));\r\n\r\n $(element).find(\"[data-\" + kendo.ns + \"role]\").addBack().each(function() {\r\n kendo.initWidget(this, {}, roles);\r\n });\r\n };\r\n\r\n kendo.destroy = function(element) {\r\n $(element).find(\"[data-\" + kendo.ns + \"role]\").addBack().each(function() {\r\n var data = $(this).data();\r\n\r\n for (var key in data) {\r\n if (key.indexOf(\"kendo\") === 0 && typeof data[key].destroy === FUNCTION) {\r\n data[key].destroy();\r\n }\r\n }\r\n });\r\n };\r\n\r\n function containmentComparer(a, b) {\r\n return $.contains(a, b) ? -1 : 1;\r\n }\r\n\r\n function resizableWidget() {\r\n var widget = $(this);\r\n return ($.inArray(widget.attr(\"data-\" + kendo.ns + \"role\"), [\"slider\", \"rangeslider\", \"breadcrumb\"]) > -1) || widget.is(\":visible\");\r\n }\r\n\r\n kendo.resize = function(element, force) {\r\n var widgets = $(element).find(\"[data-\" + kendo.ns + \"role]\").addBack().filter(resizableWidget);\r\n\r\n if (!widgets.length) {\r\n return;\r\n }\r\n\r\n // sort widgets based on their parent-child relation\r\n var widgetsArray = $.makeArray(widgets);\r\n widgetsArray.sort(containmentComparer);\r\n\r\n // resize widgets\r\n $.each(widgetsArray, function() {\r\n var widget = kendo.widgetInstance($(this));\r\n if (widget) {\r\n widget.resize(force);\r\n }\r\n });\r\n };\r\n\r\n kendo.parseOptions = parseOptions;\r\n\r\n extend(kendo.ui, {\r\n Widget: Widget,\r\n DataBoundWidget: DataBoundWidget,\r\n roles: {},\r\n progress: function(container, toggle, options) {\r\n var mask = container.find(\".k-loading-mask\"),\r\n support = kendo.support,\r\n browser = support.browser,\r\n isRtl, leftRight, webkitCorrection, containerScrollLeft, cssClass;\r\n\r\n options = $.extend({}, {\r\n width: \"100%\",\r\n height: \"100%\",\r\n top: container.scrollTop(),\r\n opacity: false\r\n }, options);\r\n\r\n cssClass = options.opacity ? 'k-loading-mask k-opaque' : 'k-loading-mask';\r\n\r\n if (toggle) {\r\n if (!mask.length) {\r\n isRtl = support.isRtl(container);\r\n leftRight = isRtl ? \"right\" : \"left\";\r\n containerScrollLeft = kendo.scrollLeft(container);\r\n webkitCorrection = browser.webkit ? (!isRtl ? 0 : container[0].scrollWidth - container.width() - 2 * containerScrollLeft) : 0;\r\n\r\n mask = $(kendo.format(\"
{1}
\", cssClass, kendo.ui.progress.messages.loading))\r\n .width(options.width).height(options.height)\r\n .css(\"top\", options.top)\r\n .css(leftRight, Math.abs(containerScrollLeft) + webkitCorrection)\r\n .prependTo(container);\r\n }\r\n } else if (mask) {\r\n mask.remove();\r\n }\r\n },\r\n plugin: function(widget, register, prefix) {\r\n var name = widget.fn.options.name,\r\n getter;\r\n\r\n register = register || kendo.ui;\r\n prefix = prefix || \"\";\r\n\r\n register[name] = widget;\r\n\r\n register.roles[name.toLowerCase()] = widget;\r\n\r\n getter = \"getKendo\" + prefix + name;\r\n name = \"kendo\" + prefix + name;\r\n\r\n var widgetEntry = { name: name, widget: widget, prefix: prefix || \"\" };\r\n kendo.widgets.push(widgetEntry);\r\n\r\n for (var i = 0, len = kendo._widgetRegisteredCallbacks.length; i < len; i++) {\r\n kendo._widgetRegisteredCallbacks[i](widgetEntry);\r\n }\r\n\r\n $.fn[name] = function(options) {\r\n var value = this,\r\n args;\r\n\r\n if (typeof options === STRING) {\r\n args = slice.call(arguments, 1);\r\n\r\n this.each(function() {\r\n var widget = $.data(this, name),\r\n method,\r\n result;\r\n\r\n if (!widget) {\r\n throw new Error(kendo.format(\"Cannot call method '{0}' of {1} before it is initialized\", options, name));\r\n }\r\n\r\n method = widget[options];\r\n\r\n if (typeof method !== FUNCTION) {\r\n throw new Error(kendo.format(\"Cannot find method '{0}' of {1}\", options, name));\r\n }\r\n\r\n result = method.apply(widget, args);\r\n\r\n if (result !== undefined$1) {\r\n value = result;\r\n return false;\r\n }\r\n });\r\n } else {\r\n this.each(function() {\r\n return new widget(this, options);\r\n });\r\n }\r\n\r\n return value;\r\n };\r\n\r\n $.fn[name].widget = widget;\r\n\r\n $.fn[getter] = function() {\r\n return this.data(name);\r\n };\r\n }\r\n });\r\n\r\n kendo.ui.progress.messages = {\r\n loading: \"Loading...\"\r\n };\r\n\r\n var ContainerNullObject = { bind: function() { return this; }, nullObject: true, options: {} };\r\n\r\n var MobileWidget = Widget.extend({\r\n init: function(element, options) {\r\n Widget.fn.init.call(this, element, options);\r\n this.element.autoApplyNS();\r\n this.wrapper = this.element;\r\n this.element.addClass(\"km-widget\");\r\n },\r\n\r\n destroy: function() {\r\n Widget.fn.destroy.call(this);\r\n this.element.kendoDestroy();\r\n },\r\n\r\n options: {\r\n prefix: \"Mobile\"\r\n },\r\n\r\n events: [],\r\n\r\n view: function() {\r\n var viewElement = this.element.closest(kendo.roleSelector(\"view splitview modalview drawer\"));\r\n return kendo.widgetInstance(viewElement, kendo.mobile.ui) || ContainerNullObject;\r\n },\r\n\r\n viewHasNativeScrolling: function() {\r\n var view = this.view();\r\n return view && view.options.useNativeScrolling;\r\n },\r\n\r\n container: function() {\r\n var element = this.element.closest(kendo.roleSelector(\"view layout modalview drawer splitview\"));\r\n return kendo.widgetInstance(element.eq(0), kendo.mobile.ui) || ContainerNullObject;\r\n }\r\n });\r\n\r\n extend(kendo.mobile, {\r\n init: function(element) {\r\n kendo.init(element, kendo.mobile.ui, kendo.ui, kendo.dataviz.ui);\r\n },\r\n\r\n roles: {},\r\n\r\n ui: {\r\n Widget: MobileWidget,\r\n DataBoundWidget: DataBoundWidget.extend(MobileWidget.prototype),\r\n roles: {},\r\n plugin: function(widget) {\r\n kendo.ui.plugin(widget, kendo.mobile.ui, \"Mobile\");\r\n }\r\n }\r\n });\r\n\r\n deepExtend(kendo.dataviz, {\r\n init: function(element) {\r\n kendo.init(element, kendo.dataviz.ui);\r\n },\r\n ui: {\r\n roles: {},\r\n themes: {},\r\n views: [],\r\n plugin: function(widget) {\r\n kendo.ui.plugin(widget, kendo.dataviz.ui);\r\n }\r\n },\r\n roles: {}\r\n });\r\n\r\n kendo.touchScroller = function(elements, options) {\r\n // return the first touch scroller\r\n if (!options) { options = {}; }\r\n\r\n options.useNative = true;\r\n\r\n return $(elements).map(function(idx, element) {\r\n element = $(element);\r\n if (support.kineticScrollNeeded && kendo.mobile.ui.Scroller && !element.data(\"kendoMobileScroller\")) {\r\n element.kendoMobileScroller(options);\r\n return element.data(\"kendoMobileScroller\");\r\n } else {\r\n return false;\r\n }\r\n })[0];\r\n };\r\n\r\n kendo.preventDefault = function(e) {\r\n e.preventDefault();\r\n };\r\n\r\n kendo.widgetInstance = function(element, suites) {\r\n var role = element.data(kendo.ns + \"role\"),\r\n widgets = [], i, length,\r\n elementData = element.data(\"kendoView\");\r\n\r\n if (role) {\r\n // HACK!!! mobile view scroller widgets are instantiated on data-role=\"content\" elements. We need to discover them when resizing.\r\n if (role === \"content\") {\r\n role = \"scroller\";\r\n }\r\n\r\n // kendo.View is not a ui plugin\r\n\r\n if (role === \"view\" && elementData) {\r\n return elementData;\r\n }\r\n\r\n if (suites) {\r\n if (suites[0]) {\r\n for (i = 0, length = suites.length; i < length; i ++) {\r\n widgets.push(suites[i].roles[role]);\r\n }\r\n } else {\r\n widgets.push(suites.roles[role]);\r\n }\r\n }\r\n else {\r\n widgets = [ kendo.ui.roles[role], kendo.dataviz.ui.roles[role], kendo.mobile.ui.roles[role] ];\r\n }\r\n\r\n if (role.indexOf(\".\") >= 0) {\r\n widgets = [ kendo.getter(role)(window) ];\r\n }\r\n\r\n for (i = 0, length = widgets.length; i < length; i ++) {\r\n var widget = widgets[i];\r\n if (widget) {\r\n var instance = element.data(\"kendo\" + widget.fn.options.prefix + widget.fn.options.name);\r\n if (instance) {\r\n return instance;\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n kendo.onResize = function(callback) {\r\n var handler = callback;\r\n if (support.mobileOS.android) {\r\n handler = function() { setTimeout(callback, 600); };\r\n }\r\n\r\n $(window).on(support.resize, handler);\r\n return handler;\r\n };\r\n\r\n kendo.unbindResize = function(callback) {\r\n $(window).off(support.resize, callback);\r\n };\r\n\r\n kendo.attrValue = function(element, key) {\r\n return element.data(kendo.ns + key);\r\n };\r\n\r\n kendo.days = {\r\n Sunday: 0,\r\n Monday: 1,\r\n Tuesday: 2,\r\n Wednesday: 3,\r\n Thursday: 4,\r\n Friday: 5,\r\n Saturday: 6\r\n };\r\n\r\n function focusable(element, isTabIndexNotNaN) {\r\n var nodeName = element.nodeName.toLowerCase();\r\n\r\n return (/input|select|textarea|button|object/.test(nodeName) ?\r\n !element.disabled :\r\n nodeName === \"a\" ?\r\n element.href || isTabIndexNotNaN :\r\n isTabIndexNotNaN\r\n ) &&\r\n visible(element);\r\n }\r\n\r\n function visible(element) {\r\n return $.expr.pseudos.visible(element) &&\r\n !$(element).parents().addBack().filter(function() {\r\n return $.css(this,\"visibility\") === \"hidden\";\r\n }).length;\r\n }\r\n\r\n $.extend($.expr.pseudos, {\r\n kendoFocusable: function(element) {\r\n var idx = $.attr(element, \"tabindex\");\r\n return focusable(element, !isNaN(idx) && idx > -1);\r\n }\r\n });\r\n\r\n var MOUSE_EVENTS = [\"mousedown\", \"mousemove\", \"mouseenter\", \"mouseleave\", \"mouseover\", \"mouseout\", \"mouseup\", \"click\"];\r\n var EXCLUDE_BUST_CLICK_SELECTOR = \"label, input, [data-rel=external]\";\r\n\r\n var MouseEventNormalizer = {\r\n setupMouseMute: function() {\r\n var idx = 0,\r\n length = MOUSE_EVENTS.length,\r\n element = document.documentElement;\r\n\r\n if (MouseEventNormalizer.mouseTrap || !support.eventCapture) {\r\n return;\r\n }\r\n\r\n MouseEventNormalizer.mouseTrap = true;\r\n\r\n MouseEventNormalizer.bustClick = false;\r\n MouseEventNormalizer.captureMouse = false;\r\n\r\n var handler = function(e) {\r\n if (MouseEventNormalizer.captureMouse) {\r\n if (e.type === \"click\") {\r\n if (MouseEventNormalizer.bustClick && !$(e.target).is(EXCLUDE_BUST_CLICK_SELECTOR)) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n }\r\n } else {\r\n e.stopPropagation();\r\n }\r\n }\r\n };\r\n\r\n for (; idx < length; idx++) {\r\n element.addEventListener(MOUSE_EVENTS[idx], handler, true);\r\n }\r\n },\r\n\r\n muteMouse: function(e) {\r\n MouseEventNormalizer.captureMouse = true;\r\n if (e.data.bustClick) {\r\n MouseEventNormalizer.bustClick = true;\r\n }\r\n clearTimeout(MouseEventNormalizer.mouseTrapTimeoutID);\r\n },\r\n\r\n unMuteMouse: function() {\r\n clearTimeout(MouseEventNormalizer.mouseTrapTimeoutID);\r\n MouseEventNormalizer.mouseTrapTimeoutID = setTimeout(function() {\r\n MouseEventNormalizer.captureMouse = false;\r\n MouseEventNormalizer.bustClick = false;\r\n }, 400);\r\n }\r\n };\r\n\r\n var eventMap = {\r\n down: \"touchstart mousedown\",\r\n move: \"mousemove touchmove\",\r\n up: \"mouseup touchend touchcancel\",\r\n cancel: \"mouseleave touchcancel\"\r\n };\r\n\r\n if (support.touch && (support.mobileOS.ios || support.mobileOS.android)) {\r\n eventMap = {\r\n down: \"touchstart\",\r\n move: \"touchmove\",\r\n up: \"touchend touchcancel\",\r\n cancel: \"touchcancel\"\r\n };\r\n } else if (support.pointers) {\r\n eventMap = {\r\n down: \"pointerdown\",\r\n move: \"pointermove\",\r\n up: \"pointerup\",\r\n cancel: \"pointercancel pointerleave\"\r\n };\r\n } else if (support.msPointers) {\r\n eventMap = {\r\n down: \"MSPointerDown\",\r\n move: \"MSPointerMove\",\r\n up: \"MSPointerUp\",\r\n cancel: \"MSPointerCancel MSPointerLeave\"\r\n };\r\n }\r\n\r\n if (support.msPointers && !(\"onmspointerenter\" in window)) { // IE10\r\n // Create MSPointerEnter/MSPointerLeave events using mouseover/out and event-time checks\r\n $.each({\r\n MSPointerEnter: \"MSPointerOver\",\r\n MSPointerLeave: \"MSPointerOut\"\r\n }, function( orig, fix ) {\r\n $.event.special[ orig ] = {\r\n delegateType: fix,\r\n bindType: fix,\r\n\r\n handle: function( event ) {\r\n var ret,\r\n target = this,\r\n related = event.relatedTarget,\r\n handleObj = event.handleObj;\r\n\r\n // For mousenter/leave call the handler if related is outside the target.\r\n // NB: No relatedTarget if the mouse left/entered the browser window\r\n if ( !related || (related !== target && !$.contains( target, related )) ) {\r\n event.type = handleObj.origType;\r\n ret = handleObj.handler.apply( this, arguments );\r\n event.type = fix;\r\n }\r\n return ret;\r\n }\r\n };\r\n });\r\n }\r\n\r\n\r\n var getEventMap = function(e) { return (eventMap[e] || e); },\r\n eventRegEx = /([^ ]+)/g;\r\n\r\n kendo.applyEventMap = function(events, ns) {\r\n events = events.replace(eventRegEx, getEventMap);\r\n\r\n if (ns) {\r\n events = events.replace(eventRegEx, \"$1.\" + ns);\r\n }\r\n\r\n return events;\r\n };\r\n\r\n kendo.keyDownHandler = function(e, widget) {\r\n var events = widget._events.kendoKeydown;\r\n\r\n if (!events) {\r\n return true;\r\n }\r\n\r\n events = events.slice();\r\n e.sender = widget;\r\n e.preventKendoKeydown = false;\r\n for (var idx = 0, length = events.length; idx < length; idx++) {\r\n events[idx].call(widget, e);\r\n }\r\n\r\n return !e.preventKendoKeydown;\r\n };\r\n\r\n var on = $.fn.on;\r\n\r\n function kendoJQuery(selector, context) {\r\n return new kendoJQuery.fn.init(selector, context);\r\n }\r\n\r\n noDepricateExtend(true, kendoJQuery, $);\r\n\r\n kendoJQuery.fn = kendoJQuery.prototype = new $();\r\n\r\n kendoJQuery.fn.constructor = kendoJQuery;\r\n\r\n kendoJQuery.fn.init = function(selector, context) {\r\n if (context && context instanceof $ && !(context instanceof kendoJQuery)) {\r\n context = kendoJQuery(context);\r\n }\r\n\r\n return $.fn.init.call(this, selector, context, rootjQuery);\r\n };\r\n\r\n kendoJQuery.fn.init.prototype = kendoJQuery.fn;\r\n\r\n var rootjQuery = kendoJQuery(document);\r\n\r\n extend(kendoJQuery.fn, {\r\n handler: function(handler) {\r\n this.data(\"handler\", handler);\r\n return this;\r\n },\r\n\r\n autoApplyNS: function(ns) {\r\n this.data(\"kendoNS\", ns || kendo.guid());\r\n return this;\r\n },\r\n\r\n on: function() {\r\n var that = this,\r\n ns = that.data(\"kendoNS\");\r\n\r\n // support for event map signature\r\n if (arguments.length === 1) {\r\n return on.call(that, arguments[0]);\r\n }\r\n\r\n var context = that,\r\n args = slice.call(arguments);\r\n\r\n if (typeof args[args.length - 1] === UNDEFINED) {\r\n args.pop();\r\n }\r\n\r\n var callback = args[args.length - 1],\r\n events = kendo.applyEventMap(args[0], ns);\r\n\r\n // setup mouse trap\r\n if (support.mouseAndTouchPresent && events.search(/mouse|click/) > -1 && this[0] !== document.documentElement) {\r\n MouseEventNormalizer.setupMouseMute();\r\n\r\n var selector = args.length === 2 ? null : args[1],\r\n bustClick = events.indexOf(\"click\") > -1 && events.indexOf(\"touchend\") > -1;\r\n\r\n on.call(this,\r\n {\r\n touchstart: MouseEventNormalizer.muteMouse,\r\n touchend: MouseEventNormalizer.unMuteMouse\r\n },\r\n selector,\r\n {\r\n bustClick: bustClick\r\n });\r\n }\r\n\r\n if (arguments[0].indexOf(\"keydown\") !== -1 && args[1] && args[1].options) {\r\n args[0] = events;\r\n var widget = args[1];\r\n var keyDownCallBack = args[args.length - 1];\r\n args[args.length - 1] = function(e) {\r\n if (kendo.keyDownHandler(e, widget)) {\r\n return keyDownCallBack.apply(this, [e]);\r\n }\r\n };\r\n on.apply(that, args);\r\n return that;\r\n }\r\n\r\n if (typeof callback === STRING) {\r\n context = that.data(\"handler\");\r\n callback = context[callback];\r\n\r\n args[args.length - 1] = function(e) {\r\n callback.call(context, e);\r\n };\r\n }\r\n\r\n args[0] = events;\r\n\r\n on.apply(that, args);\r\n\r\n return that;\r\n },\r\n\r\n kendoDestroy: function(ns) {\r\n ns = ns || this.data(\"kendoNS\");\r\n\r\n if (ns) {\r\n this.off(\".\" + ns);\r\n }\r\n\r\n return this;\r\n }\r\n });\r\n\r\n kendo.jQuery = kendoJQuery;\r\n kendo.eventMap = eventMap;\r\n\r\n kendo.timezone = (function() {\r\n var months = { Jan: 0, Feb: 1, Mar: 2, Apr: 3, May: 4, Jun: 5, Jul: 6, Aug: 7, Sep: 8, Oct: 9, Nov: 10, Dec: 11 };\r\n var days = { Sun: 0, Mon: 1, Tue: 2, Wed: 3, Thu: 4, Fri: 5, Sat: 6 };\r\n\r\n function ruleToDate(year, rule) {\r\n var date;\r\n var targetDay;\r\n var ourDay;\r\n var month = rule[3];\r\n var on = rule[4];\r\n var time = rule[5];\r\n var cache = rule[8];\r\n\r\n if (!cache) {\r\n rule[8] = cache = {};\r\n }\r\n\r\n if (cache[year]) {\r\n return cache[year];\r\n }\r\n\r\n if (!isNaN(on)) {\r\n date = new Date(Date.UTC(year, months[month], on, time[0], time[1], time[2], 0));\r\n } else if (on.indexOf(\"last\") === 0) {\r\n date = new Date(Date.UTC(year, months[month] + 1, 1, time[0] - 24, time[1], time[2], 0));\r\n\r\n targetDay = days[on.substr(4, 3)];\r\n ourDay = date.getUTCDay();\r\n\r\n date.setUTCDate(date.getUTCDate() + targetDay - ourDay - (targetDay > ourDay ? 7 : 0));\r\n } else if (on.indexOf(\">=\") >= 0) {\r\n date = new Date(Date.UTC(year, months[month], on.substr(5), time[0], time[1], time[2], 0));\r\n\r\n targetDay = days[on.substr(0, 3)];\r\n ourDay = date.getUTCDay();\r\n\r\n date.setUTCDate(date.getUTCDate() + targetDay - ourDay + (targetDay < ourDay ? 7 : 0));\r\n } else if (on.indexOf(\"<=\") >= 0) {\r\n date = new Date(Date.UTC(year, months[month], on.substr(5), time[0], time[1], time[2], 0));\r\n\r\n targetDay = days[on.substr(0, 3)];\r\n ourDay = date.getUTCDay();\r\n\r\n date.setUTCDate(date.getUTCDate() + targetDay - ourDay - (targetDay > ourDay ? 7 : 0));\r\n }\r\n\r\n return cache[year] = date;\r\n }\r\n\r\n function findRule(utcTime, rules, zone) {\r\n rules = rules[zone];\r\n\r\n if (!rules) {\r\n var time = zone.split(\":\");\r\n var offset = 0;\r\n\r\n if (time.length > 1) {\r\n offset = time[0] * 60 + Number(time[1]);\r\n }\r\n\r\n return [-1000000, 'max', '-', 'Jan', 1, [0, 0, 0], offset, '-'];\r\n }\r\n\r\n var year = new Date(utcTime).getUTCFullYear();\r\n\r\n rules = jQuery.grep(rules, function(rule) {\r\n var from = rule[0];\r\n var to = rule[1];\r\n\r\n return from <= year && (to >= year || (from == year && to == \"only\") || to == \"max\");\r\n });\r\n\r\n rules.push(utcTime);\r\n\r\n rules.sort(function(a, b) {\r\n if (typeof a != \"number\") {\r\n a = Number(ruleToDate(year, a));\r\n }\r\n\r\n if (typeof b != \"number\") {\r\n b = Number(ruleToDate(year, b));\r\n }\r\n\r\n return a - b;\r\n });\r\n\r\n var rule = rules[jQuery.inArray(utcTime, rules) - 1] || rules[rules.length - 1];\r\n\r\n return isNaN(rule) ? rule : null;\r\n }\r\n\r\n function findZone(utcTime, zones, timezone) {\r\n var zoneRules = zones[timezone];\r\n\r\n if (typeof zoneRules === \"string\") {\r\n zoneRules = zones[zoneRules];\r\n }\r\n\r\n if (!zoneRules) {\r\n throw new Error('Timezone \"' + timezone + '\" is either incorrect, or kendo.timezones.min.js is not included.');\r\n }\r\n\r\n for (var idx = zoneRules.length - 1; idx >= 0; idx--) {\r\n var until = zoneRules[idx][3];\r\n\r\n if (until && utcTime > until) {\r\n break;\r\n }\r\n }\r\n\r\n var zone = zoneRules[idx + 1];\r\n\r\n if (!zone) {\r\n throw new Error('Timezone \"' + timezone + '\" not found on ' + utcTime + \".\");\r\n }\r\n\r\n return zone;\r\n }\r\n\r\n function zoneAndRule(utcTime, zones, rules, timezone) {\r\n if (typeof utcTime != NUMBER) {\r\n utcTime = Date.UTC(utcTime.getFullYear(), utcTime.getMonth(),\r\n utcTime.getDate(), utcTime.getHours(), utcTime.getMinutes(),\r\n utcTime.getSeconds(), utcTime.getMilliseconds());\r\n }\r\n\r\n var zone = findZone(utcTime, zones, timezone);\r\n\r\n return {\r\n zone: zone,\r\n rule: findRule(utcTime, rules, zone[1])\r\n };\r\n }\r\n\r\n function offset(utcTime, timezone) {\r\n if (timezone == \"Etc/UTC\" || timezone == \"Etc/GMT\") {\r\n return 0;\r\n }\r\n\r\n var info = zoneAndRule(utcTime, this.zones, this.rules, timezone);\r\n var zone = info.zone;\r\n var rule = info.rule;\r\n\r\n return kendo.parseFloat(rule ? zone[0] - rule[6] : zone[0]);\r\n }\r\n\r\n function abbr(utcTime, timezone) {\r\n var info = zoneAndRule(utcTime, this.zones, this.rules, timezone);\r\n var zone = info.zone;\r\n var rule = info.rule;\r\n\r\n var base = zone[2];\r\n\r\n if (base.indexOf(\"/\") >= 0) {\r\n return base.split(\"/\")[rule && +rule[6] ? 1 : 0];\r\n } else if (base.indexOf(\"%s\") >= 0) {\r\n return base.replace(\"%s\", (!rule || rule[7] == \"-\") ? '' : rule[7]);\r\n }\r\n\r\n return base;\r\n }\r\n\r\n function convert(date, fromOffset, toOffset) {\r\n var tempToOffset = toOffset;\r\n var diff;\r\n\r\n if (typeof fromOffset == STRING) {\r\n fromOffset = this.offset(date, fromOffset);\r\n }\r\n\r\n if (typeof toOffset == STRING) {\r\n toOffset = this.offset(date, toOffset);\r\n }\r\n\r\n var fromLocalOffset = date.getTimezoneOffset();\r\n\r\n date = new Date(date.getTime() + (fromOffset - toOffset) * 60000);\r\n\r\n var toLocalOffset = date.getTimezoneOffset();\r\n\r\n if (typeof tempToOffset == STRING) {\r\n tempToOffset = this.offset(date, tempToOffset);\r\n }\r\n\r\n diff = (toLocalOffset - fromLocalOffset) + (toOffset - tempToOffset);\r\n\r\n return new Date(date.getTime() + diff * 60000);\r\n }\r\n\r\n function apply(date, timezone) {\r\n return this.convert(date, date.getTimezoneOffset(), timezone);\r\n }\r\n\r\n function remove(date, timezone) {\r\n return this.convert(date, timezone, date.getTimezoneOffset());\r\n }\r\n\r\n function toLocalDate(time) {\r\n return this.apply(new Date(time), \"Etc/UTC\");\r\n }\r\n\r\n return {\r\n zones: {},\r\n rules: {},\r\n offset: offset,\r\n convert: convert,\r\n apply: apply,\r\n remove: remove,\r\n abbr: abbr,\r\n toLocalDate: toLocalDate\r\n };\r\n })();\r\n\r\n kendo.date = (function() {\r\n var MS_PER_MINUTE = 60000,\r\n MS_PER_DAY = 86400000;\r\n\r\n function adjustDST(date, hours) {\r\n if (hours === 0 && date.getHours() === 23) {\r\n date.setHours(date.getHours() + 2);\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n function setDayOfWeek(date, day, dir) {\r\n var hours = date.getHours();\r\n\r\n dir = dir || 1;\r\n day = ((day - date.getDay()) + (7 * dir)) % 7;\r\n\r\n date.setDate(date.getDate() + day);\r\n adjustDST(date, hours);\r\n }\r\n\r\n function dayOfWeek(date, day, dir) {\r\n date = new Date(date);\r\n setDayOfWeek(date, day, dir);\r\n return date;\r\n }\r\n\r\n function firstDayOfMonth(date) {\r\n return new Date(\r\n date.getFullYear(),\r\n date.getMonth(),\r\n 1\r\n );\r\n }\r\n\r\n function lastDayOfMonth(date) {\r\n var last = new Date(date.getFullYear(), date.getMonth() + 1, 0),\r\n first = firstDayOfMonth(date),\r\n timeOffset = Math.abs(last.getTimezoneOffset() - first.getTimezoneOffset());\r\n\r\n if (timeOffset) {\r\n last.setHours(first.getHours() + (timeOffset / 60));\r\n }\r\n\r\n return last;\r\n }\r\n\r\n function firstDayOfYear(date) {\r\n return new Date(date.getFullYear(), 0, 1);\r\n }\r\n\r\n function lastDayOfYear(date) {\r\n return new Date(date.getFullYear(), 11, 31);\r\n }\r\n\r\n function moveDateToWeekStart(date, weekStartDay) {\r\n if (weekStartDay !== 1) {\r\n return addDays(dayOfWeek(date, weekStartDay, -1), 4);\r\n }\r\n\r\n return addDays(date, (4 - (date.getDay() || 7)));\r\n }\r\n\r\n function calcWeekInYear(date, weekStartDay) {\r\n var firstWeekInYear = new Date(date.getFullYear(), 0, 1, -6);\r\n\r\n var newDate = moveDateToWeekStart(date, weekStartDay);\r\n\r\n var diffInMS = newDate.getTime() - firstWeekInYear.getTime();\r\n\r\n var days = Math.floor(diffInMS / MS_PER_DAY);\r\n\r\n return 1 + Math.floor(days / 7);\r\n }\r\n\r\n function weekInYear(date, weekStartDay) {\r\n if (weekStartDay === undefined$1) {\r\n weekStartDay = kendo.culture().calendar.firstDay;\r\n }\r\n\r\n var prevWeekDate = addDays(date, -7);\r\n var nextWeekDate = addDays(date, 7);\r\n\r\n var weekNumber = calcWeekInYear(date, weekStartDay);\r\n\r\n if (weekNumber === 0) {\r\n return calcWeekInYear(prevWeekDate, weekStartDay) + 1;\r\n }\r\n\r\n if (weekNumber === 53 && calcWeekInYear(nextWeekDate, weekStartDay) > 1) {\r\n return 1;\r\n }\r\n\r\n return weekNumber;\r\n }\r\n\r\n function getDate(date) {\r\n date = new Date(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0);\r\n adjustDST(date, 0);\r\n return date;\r\n }\r\n\r\n function toUtcTime(date) {\r\n return Date.UTC(date.getFullYear(), date.getMonth(),\r\n date.getDate(), date.getHours(), date.getMinutes(),\r\n date.getSeconds(), date.getMilliseconds());\r\n }\r\n\r\n function getMilliseconds(date) {\r\n return toInvariantTime(date).getTime() - getDate(toInvariantTime(date));\r\n }\r\n\r\n function isInTimeRange(value, min, max) {\r\n var msMin = getMilliseconds(min),\r\n msMax = getMilliseconds(max),\r\n msValue;\r\n\r\n if (!value || msMin == msMax) {\r\n return true;\r\n }\r\n\r\n if (min >= max) {\r\n max += MS_PER_DAY;\r\n }\r\n\r\n msValue = getMilliseconds(value);\r\n\r\n if (msMin > msValue) {\r\n msValue += MS_PER_DAY;\r\n }\r\n\r\n if (msMax < msMin) {\r\n msMax += MS_PER_DAY;\r\n }\r\n\r\n return msValue >= msMin && msValue <= msMax;\r\n }\r\n\r\n function isInDateRange(value, min, max) {\r\n var msMin = min.getTime(),\r\n msMax = max.getTime(),\r\n msValue;\r\n\r\n if (msMin >= msMax) {\r\n msMax += MS_PER_DAY;\r\n }\r\n\r\n msValue = value.getTime();\r\n\r\n return msValue >= msMin && msValue <= msMax;\r\n }\r\n\r\n function addDays(date, offset) {\r\n var hours = date.getHours();\r\n date = new Date(date);\r\n\r\n setTime(date, offset * MS_PER_DAY);\r\n adjustDST(date, hours);\r\n return date;\r\n }\r\n\r\n function setTime(date, milliseconds, ignoreDST) {\r\n var offset = date.getTimezoneOffset();\r\n var difference;\r\n\r\n date.setTime(date.getTime() + milliseconds);\r\n\r\n if (!ignoreDST) {\r\n difference = date.getTimezoneOffset() - offset;\r\n date.setTime(date.getTime() + difference * MS_PER_MINUTE);\r\n }\r\n }\r\n\r\n function setHours(date, time) {\r\n date = new Date(date.getFullYear(), date.getMonth(), date.getDate(), time.getHours(), time.getMinutes(), time.getSeconds(), time.getMilliseconds());\r\n adjustDST(date, time.getHours());\r\n return date;\r\n }\r\n\r\n function today() {\r\n return getDate(new Date());\r\n }\r\n\r\n function isToday(date) {\r\n return getDate(date).getTime() == today().getTime();\r\n }\r\n\r\n function toInvariantTime(date) {\r\n var staticDate = new Date(1980, 1, 1, 0, 0, 0);\r\n\r\n if (date) {\r\n staticDate.setHours(date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds());\r\n }\r\n\r\n return staticDate;\r\n }\r\n\r\n function addYear(date, offset) {\r\n var currentDate = new Date(date);\r\n\r\n return new Date(currentDate.setFullYear(currentDate.getFullYear() + offset));\r\n }\r\n\r\n function addLiteral(parts, value) {\r\n var lastPart = parts[parts.length - 1];\r\n if (lastPart && lastPart.type === \"LITERAL\") {\r\n lastPart.pattern += value;\r\n } else {\r\n parts.push({\r\n type: \"literal\",\r\n pattern: value\r\n });\r\n }\r\n }\r\n\r\n function isHour12(pattern) {\r\n return pattern === \"h\" || pattern === \"K\";\r\n }\r\n\r\n function dateNameType(formatLength) {\r\n var nameType;\r\n if (formatLength <= 3) {\r\n nameType = \"abbreviated\";\r\n } else if (formatLength === 4) {\r\n nameType = \"wide\";\r\n } else if (formatLength === 5) {\r\n nameType = \"narrow\";\r\n }\r\n\r\n return nameType;\r\n }\r\n\r\n function startsWith(text, searchString, position) {\r\n position = position || 0;\r\n return text.indexOf(searchString, position) === position;\r\n }\r\n\r\n function datePattern(format, info) {\r\n var calendar = info.calendar;\r\n var result;\r\n if (typeof format === \"string\") {\r\n if (calendar.patterns[format]) {\r\n result = calendar.patterns[format];\r\n } else {\r\n result = format;\r\n }\r\n }\r\n\r\n if (!result) {\r\n result = calendar.patterns.d;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n function splitDateFormat(format) {\r\n var info = kendo.culture();\r\n var pattern = datePattern(format, info).replaceAll(\"dddd\", \"EEEE\").replaceAll(\"ddd\", \"EEE\").replace(\"tt\", \"aa\");\r\n var parts = [];\r\n var dateFormatRegExp = /d{1,2}|E{1,6}|e{1,6}|c{3,6}|c{1}|M{1,5}|L{1,5}|y{1,4}|H{1,2}|h{1,2}|k{1,2}|K{1,2}|m{1,2}|a{1,5}|s{1,2}|S{1,3}|t{1,2}|z{1,4}|Z{1,5}|x{1,5}|X{1,5}|G{1,5}|q{1,5}|Q{1,5}|\"[^\"]*\"|'[^']*'/g;\r\n\r\n var lastIndex = dateFormatRegExp.lastIndex = 0;\r\n var match = dateFormatRegExp.exec(pattern);\r\n var specifier;\r\n var type;\r\n var part;\r\n var names;\r\n var minLength;\r\n var patternLength;\r\n\r\n while (match) {\r\n var value = match[0];\r\n\r\n if (lastIndex < match.index) {\r\n addLiteral(parts, pattern.substring(lastIndex, match.index));\r\n }\r\n\r\n if (startsWith(value, '\"') || startsWith(value, \"'\")) {\r\n addLiteral(parts, value);\r\n } else {\r\n specifier = value[0];\r\n type = DATE_FIELD_MAP[specifier];\r\n part = {\r\n type: type,\r\n pattern: value\r\n };\r\n\r\n if (type === \"hour\") {\r\n part.hour12 = isHour12(value);\r\n }\r\n\r\n names = NAME_TYPES[type];\r\n\r\n if (names) {\r\n minLength = typeof names.minLength === \"number\" ? names.minLength : names.minLength[specifier];\r\n patternLength = value.length;\r\n\r\n if (patternLength >= minLength && value !== \"aa\") {\r\n part.names = {\r\n type: names.type,\r\n nameType: dateNameType(patternLength),\r\n standAlone: names.standAlone === specifier\r\n };\r\n }\r\n }\r\n\r\n parts.push(part);\r\n }\r\n\r\n lastIndex = dateFormatRegExp.lastIndex;\r\n match = dateFormatRegExp.exec(pattern);\r\n }\r\n\r\n if (lastIndex < pattern.length) {\r\n addLiteral(parts, pattern.substring(lastIndex));\r\n }\r\n\r\n return parts;\r\n }\r\n\r\n function dateFormatNames(options) {\r\n let { type, nameType } = options;\r\n const info = kendo.culture();\r\n if (nameType === \"wide\") {\r\n nameType = \"names\";\r\n }\r\n if (nameType === \"abbreviated\") {\r\n nameType = \"namesAbbr\";\r\n }\r\n if (nameType === \"narrow\") {\r\n nameType = \"namesShort\";\r\n }\r\n let result = info.calendar[type][nameType];\r\n if (!result) {\r\n result = info.calendar[type][\"name\"];\r\n }\r\n return result;\r\n }\r\n\r\n function dateFieldName(options) {\r\n const info = kendo.culture();\r\n const dateFields = info.calendar.dateFields;\r\n const fieldNameInfo = dateFields[options.type] || {};\r\n\r\n return fieldNameInfo[options.nameType];\r\n }\r\n\r\n return {\r\n adjustDST: adjustDST,\r\n dayOfWeek: dayOfWeek,\r\n setDayOfWeek: setDayOfWeek,\r\n getDate: getDate,\r\n isInDateRange: isInDateRange,\r\n isInTimeRange: isInTimeRange,\r\n isToday: isToday,\r\n nextDay: function(date) {\r\n return addDays(date, 1);\r\n },\r\n previousDay: function(date) {\r\n return addDays(date, -1);\r\n },\r\n toUtcTime: toUtcTime,\r\n MS_PER_DAY: MS_PER_DAY,\r\n MS_PER_HOUR: 60 * MS_PER_MINUTE,\r\n MS_PER_MINUTE: MS_PER_MINUTE,\r\n setTime: setTime,\r\n setHours: setHours,\r\n addDays: addDays,\r\n today: today,\r\n toInvariantTime: toInvariantTime,\r\n firstDayOfMonth: firstDayOfMonth,\r\n splitDateFormat: splitDateFormat,\r\n dateFieldName: dateFieldName,\r\n dateFormatNames: dateFormatNames,\r\n lastDayOfMonth: lastDayOfMonth,\r\n weekInYear: weekInYear,\r\n getMilliseconds: getMilliseconds,\r\n firstDayOfYear: firstDayOfYear,\r\n lastDayOfYear: lastDayOfYear,\r\n nextYear: function(date) {\r\n return addYear(date, 1);\r\n },\r\n previousYear: function(date) {\r\n return addYear(date, -1);\r\n }\r\n };\r\n })();\r\n\r\n\r\n kendo.stripWhitespace = function(element) {\r\n if (document.createNodeIterator) {\r\n var iterator = document.createNodeIterator(element, NodeFilter.SHOW_TEXT, function(node) {\r\n return node.parentNode == element ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT;\r\n }, false);\r\n\r\n while (iterator.nextNode()) {\r\n if (iterator.referenceNode && !iterator.referenceNode.textContent.trim()) {\r\n iterator.referenceNode.parentNode.removeChild(iterator.referenceNode);\r\n }\r\n }\r\n } else { // IE7/8 support\r\n for (var i = 0; i < element.childNodes.length; i++) {\r\n var child = element.childNodes[i];\r\n\r\n if (child.nodeType == 3 && !/\\S/.test(child.nodeValue)) {\r\n element.removeChild(child);\r\n i--;\r\n }\r\n\r\n if (child.nodeType == 1) {\r\n kendo.stripWhitespace(child);\r\n }\r\n }\r\n }\r\n };\r\n\r\n var animationFrame = window.requestAnimationFrame ||\r\n window.webkitRequestAnimationFrame ||\r\n window.mozRequestAnimationFrame ||\r\n window.oRequestAnimationFrame ||\r\n window.msRequestAnimationFrame ||\r\n function(callback) { setTimeout(callback, 1000 / 60); };\r\n\r\n kendo.animationFrame = function(callback) {\r\n animationFrame.call(window, callback);\r\n };\r\n\r\n var animationQueue = [];\r\n\r\n kendo.queueAnimation = function(callback) {\r\n animationQueue[animationQueue.length] = callback;\r\n if (animationQueue.length === 1) {\r\n kendo.runNextAnimation();\r\n }\r\n };\r\n\r\n kendo.runNextAnimation = function() {\r\n kendo.animationFrame(function() {\r\n if (animationQueue[0]) {\r\n animationQueue.shift()();\r\n if (animationQueue[0]) {\r\n kendo.runNextAnimation();\r\n }\r\n }\r\n });\r\n };\r\n\r\n kendo.parseQueryStringParams = function(url) {\r\n var queryString = url.split('?')[1] || \"\",\r\n params = {},\r\n paramParts = queryString.split(/&|=/),\r\n length = paramParts.length,\r\n idx = 0;\r\n\r\n for (; idx < length; idx += 2) {\r\n if (paramParts[idx] !== \"\") {\r\n params[decodeURIComponent(paramParts[idx])] = decodeURIComponent(paramParts[idx + 1]);\r\n }\r\n }\r\n\r\n return params;\r\n };\r\n\r\n kendo.elementUnderCursor = function(e) {\r\n if (typeof e.x.client != \"undefined\") {\r\n return document.elementFromPoint(e.x.client, e.y.client);\r\n }\r\n };\r\n\r\n kendo.wheelDeltaY = function(jQueryEvent) {\r\n var e = jQueryEvent.originalEvent,\r\n deltaY = e.wheelDeltaY,\r\n delta;\r\n\r\n if (e.wheelDelta) { // Webkit and IE\r\n if (deltaY === undefined$1 || deltaY) { // IE does not have deltaY, thus always scroll (horizontal scrolling is treated as vertical)\r\n delta = e.wheelDelta;\r\n }\r\n } else if (e.detail && e.axis === e.VERTICAL_AXIS) { // Firefox and Opera\r\n delta = (-e.detail) * 10;\r\n }\r\n\r\n return delta;\r\n };\r\n\r\n kendo.throttle = function(fn, delay) {\r\n var timeout;\r\n var lastExecTime = 0;\r\n\r\n if (!delay || delay <= 0) {\r\n return fn;\r\n }\r\n\r\n var throttled = function() {\r\n var that = this;\r\n var elapsed = +new Date() - lastExecTime;\r\n var args = arguments;\r\n\r\n function exec() {\r\n fn.apply(that, args);\r\n lastExecTime = +new Date();\r\n }\r\n\r\n // first execution\r\n if (!lastExecTime) {\r\n return exec();\r\n }\r\n\r\n if (timeout) {\r\n clearTimeout(timeout);\r\n }\r\n\r\n if (elapsed > delay) {\r\n exec();\r\n } else {\r\n timeout = setTimeout(exec, delay - elapsed);\r\n }\r\n };\r\n\r\n throttled.cancel = function() {\r\n clearTimeout(timeout);\r\n };\r\n\r\n return throttled;\r\n };\r\n\r\n\r\n kendo.caret = function(element, start, end) {\r\n var rangeElement;\r\n var isPosition = start !== undefined$1;\r\n\r\n if (end === undefined$1) {\r\n end = start;\r\n }\r\n\r\n if (element[0]) {\r\n element = element[0];\r\n }\r\n\r\n if (isPosition && element.disabled) {\r\n return;\r\n }\r\n\r\n try {\r\n if (element.selectionStart !== undefined$1) {\r\n if (isPosition) {\r\n element.focus();\r\n var mobile = support.mobileOS;\r\n if (mobile.wp || mobile.android) {// without the timeout the caret is at the end of the input\r\n setTimeout(function() { element.setSelectionRange(start, end); }, 0);\r\n }\r\n else {\r\n element.setSelectionRange(start, end);\r\n }\r\n } else {\r\n start = [element.selectionStart, element.selectionEnd];\r\n }\r\n } else if (document.selection) {\r\n if ($(element).is(\":visible\")) {\r\n element.focus();\r\n }\r\n\r\n rangeElement = element.createTextRange();\r\n\r\n if (isPosition) {\r\n rangeElement.collapse(true);\r\n rangeElement.moveStart(\"character\", start);\r\n rangeElement.moveEnd(\"character\", end - start);\r\n rangeElement.select();\r\n } else {\r\n var rangeDuplicated = rangeElement.duplicate(),\r\n selectionStart, selectionEnd;\r\n\r\n rangeElement.moveToBookmark(document.selection.createRange().getBookmark());\r\n rangeDuplicated.setEndPoint('EndToStart', rangeElement);\r\n selectionStart = rangeDuplicated.text.length;\r\n selectionEnd = selectionStart + rangeElement.text.length;\r\n\r\n start = [selectionStart, selectionEnd];\r\n }\r\n }\r\n } catch (e) {\r\n /* element is not focused or it is not in the DOM */\r\n start = [];\r\n }\r\n\r\n return start;\r\n };\r\n\r\n kendo.antiForgeryTokens = function() {\r\n var tokens = { },\r\n csrf_token = $(\"meta[name=csrf-token],meta[name=_csrf]\").attr(\"content\"),\r\n csrf_param = $(\"meta[name=csrf-param],meta[name=_csrf_header]\").attr(\"content\");\r\n\r\n $(\"input[name^='__RequestVerificationToken']\").each(function() {\r\n tokens[this.name] = this.value;\r\n });\r\n\r\n if (csrf_param !== undefined$1 && csrf_token !== undefined$1) {\r\n tokens[csrf_param] = csrf_token;\r\n }\r\n\r\n return tokens;\r\n };\r\n\r\n kendo.cycleForm = function(form) {\r\n var firstElement = form.find(\"input, .k-widget, .k-dropdownlist, .k-combobox\").first();\r\n var lastElement = form.find(\"button, .k-button\").last();\r\n\r\n function focus(el) {\r\n var widget = kendo.widgetInstance(el);\r\n\r\n if (widget && widget.focus) {\r\n widget.focus();\r\n } else {\r\n el.trigger(\"focus\");\r\n }\r\n }\r\n\r\n lastElement.on(\"keydown\", function(e) {\r\n if (e.keyCode == kendo.keys.TAB && !e.shiftKey) {\r\n e.preventDefault();\r\n focus(firstElement);\r\n }\r\n });\r\n\r\n firstElement.on(\"keydown\", function(e) {\r\n if (e.keyCode == kendo.keys.TAB && e.shiftKey) {\r\n e.preventDefault();\r\n focus(lastElement);\r\n }\r\n });\r\n };\r\n\r\n kendo.focusElement = function(element) {\r\n var scrollTopPositions = [];\r\n var scrollableParents = element.parentsUntil(\"body\")\r\n .filter(function(index, element) {\r\n var computedStyle = kendo.getComputedStyles(element, [\"overflow\"]);\r\n return computedStyle.overflow !== \"visible\";\r\n })\r\n .add(window);\r\n\r\n scrollableParents.each(function(index, parent) {\r\n scrollTopPositions[index] = $(parent).scrollTop();\r\n });\r\n\r\n try {\r\n //The setActive method does not cause the document to scroll to the active object in the current page\r\n element[0].setActive();\r\n } catch (e) {\r\n element[0].focus();\r\n }\r\n\r\n scrollableParents.each(function(index, parent) {\r\n $(parent).scrollTop(scrollTopPositions[index]);\r\n });\r\n };\r\n\r\n kendo.focusNextElement = function() {\r\n if (document.activeElement) {\r\n var focussable = $(\":kendoFocusable\");\r\n var index = focussable.index(document.activeElement);\r\n\r\n if (index > -1) {\r\n var nextElement = focussable[index + 1] || focussable[0];\r\n nextElement.focus();\r\n }\r\n }\r\n };\r\n\r\n kendo.trim = function(value) {\r\n if (!!value) {\r\n return value.toString().trim();\r\n } else {\r\n return \"\";\r\n }\r\n };\r\n\r\n kendo.getWidgetFocusableElement = function(element) {\r\n var nextFocusable = element.closest(\":kendoFocusable\"),\r\n widgetInstance = kendo.widgetInstance(element),\r\n target;\r\n\r\n if (nextFocusable.length) {\r\n target = nextFocusable;\r\n } else if (widgetInstance) {\r\n target = widgetInstance.options.name === 'Editor' ?\r\n $(widgetInstance.body) :\r\n widgetInstance.wrapper.find(\":kendoFocusable\").first();\r\n } else {\r\n target = element;\r\n }\r\n\r\n return target;\r\n };\r\n\r\n kendo.addAttribute = function(element, attribute, value) {\r\n var current = element.attr(attribute) || \"\";\r\n\r\n if (current.indexOf(value) < 0) {\r\n element.attr(attribute, (current + \" \" + value).trim());\r\n }\r\n };\r\n\r\n kendo.removeAttribute = function(element, attribute, value) {\r\n var current = element.attr(attribute) || \"\";\r\n\r\n element.attr(attribute, current.replace(value, \"\").trim());\r\n };\r\n\r\n kendo.toggleAttribute = function(element, attribute, value) {\r\n var current = element.attr(attribute) || \"\";\r\n\r\n if (current.indexOf(value) < 0) {\r\n kendo.addAttribute(element, attribute, value);\r\n } else {\r\n kendo.removeAttribute(element, attribute, value);\r\n }\r\n };\r\n\r\n kendo.matchesMedia = function(mediaQuery) {\r\n var media = kendo._bootstrapToMedia(mediaQuery) || mediaQuery;\r\n return support.matchMedia && window.matchMedia(media).matches;\r\n };\r\n\r\n kendo._bootstrapToMedia = function(bootstrapMedia) {\r\n return {\r\n \"xs\": \"(max-width: 576px)\",\r\n \"sm\": \"(min-width: 576px)\",\r\n \"md\": \"(min-width: 768px)\",\r\n \"lg\": \"(min-width: 992px)\",\r\n \"xl\": \"(min-width: 1200px)\"\r\n }[bootstrapMedia];\r\n };\r\n\r\n kendo.fileGroupMap = {\r\n audio: [\".aif\", \".iff\", \".m3u\", \".m4a\", \".mid\", \".mp3\", \".mpa\", \".wav\", \".wma\", \".ogg\", \".wav\", \".wma\", \".wpl\"],\r\n video: [\".3g2\", \".3gp\", \".avi\", \".asf\", \".flv\", \".m4u\", \".rm\", \".h264\", \".m4v\", \".mkv\", \".mov\", \".mp4\", \".mpg\",\r\n \".rm\", \".swf\", \".vob\", \".wmv\"],\r\n image: [\".ai\", \".dds\", \".heic\", \".jpe\", \"jfif\", \".jif\", \".jp2\", \".jps\", \".eps\", \".bmp\", \".gif\", \".jpeg\",\r\n \".jpg\", \".png\", \".ps\", \".psd\", \".svg\", \".svgz\", \".tif\", \".tiff\"],\r\n txt: [\".doc\", \".docx\", \".log\", \".pages\", \".tex\", \".wpd\", \".wps\", \".odt\", \".rtf\", \".text\", \".txt\", \".wks\"],\r\n presentation: [\".key\", \".odp\", \".pps\", \".ppt\", \".pptx\"],\r\n data: [\".xlr\", \".xls\", \".xlsx\"],\r\n programming: [\".tmp\", \".bak\", \".msi\", \".cab\", \".cpl\", \".cur\", \".dll\", \".dmp\", \".drv\", \".icns\", \".ico\", \".link\",\r\n \".sys\", \".cfg\", \".ini\", \".asp\", \".aspx\", \".cer\", \".csr\", \".css\", \".dcr\", \".htm\", \".html\", \".js\",\r\n \".php\", \".rss\", \".xhtml\"],\r\n pdf: [\".pdf\"],\r\n config: [\".apk\", \".app\", \".bat\", \".cgi\", \".com\", \".exe\", \".gadget\", \".jar\", \".wsf\"],\r\n zip: [\".7z\", \".cbr\", \".gz\", \".sitx\", \".arj\", \".deb\", \".pkg\", \".rar\", \".rpm\", \".tar.gz\", \".z\", \".zip\", \".zipx\"],\r\n \"disc-image\": [\".dmg\", \".iso\", \".toast\", \".vcd\", \".bin\", \".cue\", \".mdf\"]\r\n };\r\n\r\n kendo.getFileGroup = function(extension, withPrefix) {\r\n var fileTypeMap = kendo.fileGroupMap;\r\n var groups = Object.keys(fileTypeMap);\r\n var type = \"file\";\r\n\r\n if (extension === undefined$1 || !extension.length) {\r\n return type;\r\n }\r\n\r\n for (var i = 0; i < groups.length; i += 1) {\r\n var extensions = fileTypeMap[groups[i]];\r\n\r\n if (extensions.indexOf(extension.toLowerCase()) > -1) {\r\n return withPrefix ? \"file-\" + groups[i] : groups[i];\r\n }\r\n }\r\n\r\n return type;\r\n };\r\n\r\n kendo.getFileSizeMessage = function(size) {\r\n var sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];\r\n\r\n if (size === 0) {\r\n return '0 Byte';\r\n }\r\n\r\n var i = parseInt(Math.floor(Math.log(size) / Math.log(1024)), 10);\r\n return Math.round(size / Math.pow(1024, i), 2) + ' ' + sizes[i];\r\n };\r\n\r\n kendo.selectorFromClasses = function(classes) {\r\n return \".\" + classes.split(\" \").join(\".\");\r\n };\r\n\r\n // Standardized Properties and CSS classes\r\n\r\n var themeColorValues = ['base', 'primary', 'secondary', 'tertiary', 'inherit', 'info', 'success', 'warning', 'error', 'dark', 'light', 'inverse'];\r\n var fillValues = ['solid', 'outline', 'flat'];\r\n //var postitionValues = ['edge', 'outside', 'inside'];\r\n var shapeValues = ['rectangle', 'square'];\r\n var sizeValues = [ ['small', 'sm'], ['medium', 'md'], ['large', 'lg'] ];\r\n var roundedValues = [ ['small', 'sm'], ['medium', 'md'], ['large', 'lg'] ];\r\n //var alignValues = [ ['top start', 'top-start'], ['top end', 'top-end'], ['bottom start', 'bottom-start'], ['bottom end', 'bottom-end'] ];\r\n var positionModeValues = [ 'fixed', 'static', 'sticky', 'absolute' ];\r\n var resizeValues = [ ['both', 'resize'], ['horizontal', 'resize-x'], ['vertical', 'resize-y'] ];\r\n var overflowValues = [ 'auto', 'hidden', 'visible', 'scroll', 'clip' ];\r\n var layoutFlowValues = [ ['vertical', '!k-flex-col'], ['horizontal', '!k-flex-row'] ];\r\n\r\n kendo.cssProperties = (function() {\r\n var defaultValues = {},\r\n propertyDictionary = {};\r\n\r\n function registerPrefix(widget, prefix) {\r\n var dict = kendo.cssProperties.propertyDictionary;\r\n\r\n if (!dict[widget]) {\r\n dict[widget] = {};\r\n }\r\n\r\n dict[widget][PREFIX] = prefix;\r\n }\r\n\r\n function registerValues(widget, args) {\r\n var dict = kendo.cssProperties.propertyDictionary,\r\n i, j, prop, values, newValues, currentValue;\r\n\r\n for (i = 0; i < args.length; i++) {\r\n prop = args[i].prop;\r\n newValues = args[i].values;\r\n\r\n if (!dict[widget][prop]) {\r\n dict[widget][prop] = {};\r\n }\r\n\r\n values = dict[widget][prop];\r\n\r\n for (j = 0; j < newValues.length; j++) {\r\n currentValue = newValues[j];\r\n\r\n if (isArray(newValues[j])) {\r\n values[currentValue[0]] = currentValue[1];\r\n } else {\r\n values[currentValue] = currentValue;\r\n }\r\n }\r\n }\r\n }\r\n\r\n function registerCssClass(propName, value, shorthand) {\r\n if (!defaultValues[propName]) {\r\n defaultValues[propName] = {};\r\n }\r\n\r\n defaultValues[propName][value] = shorthand || value;\r\n }\r\n\r\n function registerCssClasses(propName, arr) {\r\n for (var i = 0; i < arr.length; i++) {\r\n if (isArray(arr[i])) {\r\n registerCssClass(propName, arr[i][0], arr[i][1]);\r\n } else {\r\n registerCssClass(propName, arr[i]);\r\n }\r\n }\r\n }\r\n\r\n function getValidClass(args) {\r\n var widget = args.widget,\r\n propName = args.propName,\r\n value = args.value,\r\n fill = args.fill,\r\n cssProperties = kendo.cssProperties,\r\n defaultValues = cssProperties.defaultValues[propName],\r\n widgetProperties = cssProperties.propertyDictionary[widget],\r\n overridePrefix = args.prefix,\r\n widgetValues, validValue, prefix;\r\n\r\n if (!widgetProperties) {\r\n return \"\";\r\n }\r\n\r\n widgetValues = widgetProperties[propName];\r\n validValue = widgetValues ? widgetValues[value] || defaultValues[value] : defaultValues[value];\r\n\r\n if (validValue) {\r\n if (propName === \"themeColor\") {\r\n prefix = widgetProperties[PREFIX] + fill + \"-\";\r\n } else if (propName === \"positionMode\") {\r\n prefix = \"k-pos-\";\r\n } else if (propName === \"rounded\") {\r\n prefix = \"k-rounded-\";\r\n } else if (propName === \"resize\") {\r\n prefix = \"k-\";\r\n } else if (propName === \"overflow\") {\r\n prefix = \"k-overflow-\";\r\n } else if (propName === \"layoutFlow\") {\r\n prefix = \"\";\r\n } else {\r\n prefix = widgetProperties[PREFIX];\r\n }\r\n\r\n prefix = overridePrefix || prefix;\r\n\r\n return prefix + validValue;\r\n } else {\r\n return \"\";\r\n }\r\n }\r\n\r\n registerCssClasses(\"themeColor\", themeColorValues);\r\n registerCssClasses(\"fillMode\", fillValues);\r\n registerCssClasses(\"shape\", shapeValues);\r\n registerCssClasses(\"size\", sizeValues);\r\n registerCssClasses(\"positionMode\", positionModeValues);\r\n registerCssClasses(\"rounded\", roundedValues);\r\n registerCssClasses(\"resize\", resizeValues);\r\n registerCssClasses(\"overflow\", overflowValues);\r\n registerCssClasses(\"layoutFlow\", layoutFlowValues);\r\n\r\n return {\r\n positionModeValues: positionModeValues,\r\n roundedValues: roundedValues,\r\n sizeValues: sizeValues,\r\n shapeValues: shapeValues,\r\n fillModeValues: fillValues,\r\n themeColorValues: themeColorValues,\r\n\r\n defaultValues: defaultValues,\r\n propertyDictionary: propertyDictionary,\r\n\r\n registerValues: registerValues,\r\n getValidClass: getValidClass,\r\n registerPrefix: registerPrefix\r\n };\r\n }());\r\n\r\n //To do: delete below after implementing new styles and classes for BottomNavigation\r\n kendo.registerCssClass = function(propName, value, shorthand) {\r\n if (!kendo.propertyToCssClassMap[propName]) {\r\n kendo.propertyToCssClassMap[propName] = {};\r\n }\r\n\r\n kendo.propertyToCssClassMap[propName][value] = shorthand || value;\r\n };\r\n\r\n kendo.registerCssClasses = function(propName, arr) {\r\n for (var i = 0; i < arr.length; i++) {\r\n if (isArray(arr[i])) {\r\n kendo.registerCssClass(propName, arr[i][0], arr[i][1]);\r\n } else {\r\n kendo.registerCssClass(propName, arr[i]);\r\n }\r\n }\r\n };\r\n\r\n kendo.getValidCssClass = function(prefix, propName, value) {\r\n var validValue = kendo.propertyToCssClassMap[propName][value];\r\n\r\n if (validValue) {\r\n return prefix + validValue;\r\n }\r\n };\r\n\r\n kendo.propertyToCssClassMap = {};\r\n\r\n kendo.registerCssClasses(\"themeColor\", themeColorValues);\r\n kendo.registerCssClasses(\"fill\", fillValues);\r\n //kendo.registerCssClasses(\"postition\", postitionValues);\r\n kendo.registerCssClasses(\"shape\", shapeValues);\r\n kendo.registerCssClasses(\"size\", sizeValues);\r\n //kendo.registerCssClasses(\"align\", alignValues);\r\n kendo.registerCssClasses(\"positionMode\", positionModeValues);\r\n\r\n kendo.applyStylesFromKendoAttributes = function(element, styleProps) {\r\n let selector = styleProps.map(styleProp=> `[${kendo.attr(`style-${styleProp}`)}]`).join(',');\r\n element.find(selector).addBack(selector).each((_, currentElement) => {\r\n let $currentElement = $(currentElement);\r\n styleProps.forEach(function(styleProp) {\r\n let kendoAttr = kendo.attr(`style-${styleProp}`);\r\n if ($currentElement.attr(kendoAttr)) {\r\n $currentElement.css(styleProp, $currentElement.attr(kendoAttr));\r\n $currentElement.removeAttr(kendoAttr);\r\n }\r\n });\r\n });\r\n };\r\n\r\n // jQuery deferred helpers\r\n\r\n // influenced from: https://gist.github.com/fearphage/4341799\r\n kendo.whenAll = function(array) {\r\n var resolveValues = arguments.length == 1 && Array.isArray(array) ? array : Array.prototype.slice.call(arguments),\r\n length = resolveValues.length,\r\n remaining = length,\r\n deferred = $.Deferred(),\r\n i = 0,\r\n failed = 0,\r\n rejectContexts = Array(length),\r\n rejectValues = Array(length),\r\n resolveContexts = Array(length),\r\n value;\r\n\r\n function updateFunc(index, contexts, values) {\r\n return function() {\r\n if (values != resolveValues) {\r\n failed++;\r\n }\r\n\r\n deferred.notifyWith(\r\n contexts[index] = this,\r\n values[index] = Array.prototype.slice.call(arguments)\r\n );\r\n\r\n if (!(--remaining)) {\r\n deferred[(!failed ? 'resolve' : 'reject') + 'With'](contexts, values);\r\n }\r\n };\r\n }\r\n\r\n for (; i < length; i++) {\r\n if ((value = resolveValues[i]) && kendo.isFunction(value.promise)) {\r\n value.promise()\r\n .done(updateFunc(i, resolveContexts, resolveValues))\r\n .fail(updateFunc(i, rejectContexts, rejectValues));\r\n }\r\n\r\n else {\r\n deferred.notifyWith(this, value);\r\n --remaining;\r\n }\r\n }\r\n\r\n if (!remaining) {\r\n deferred.resolveWith(resolveContexts, resolveValues);\r\n }\r\n\r\n return deferred.promise();\r\n };\r\n\r\n // kendo.saveAs -----------------------------------------------\r\n (function() {\r\n function postToProxy(dataURI, fileName, proxyURL, proxyTarget) {\r\n var form = $(\"
\").attr({\r\n action: proxyURL,\r\n method: \"POST\",\r\n target: proxyTarget\r\n });\r\n\r\n var data = kendo.antiForgeryTokens();\r\n data.fileName = fileName;\r\n\r\n var parts = dataURI.split(\";base64,\");\r\n data.contentType = parts[0].replace(\"data:\", \"\");\r\n data.base64 = parts[1];\r\n\r\n for (var name in data) {\r\n if (data.hasOwnProperty(name)) {\r\n $('').attr({\r\n value: data[name],\r\n name: name,\r\n type: \"hidden\"\r\n }).appendTo(form);\r\n }\r\n }\r\n\r\n form.appendTo(\"body\").submit().remove();\r\n }\r\n\r\n var fileSaver = document.createElement(\"a\");\r\n var downloadAttribute = \"download\" in fileSaver && !kendo.support.browser.edge;\r\n\r\n function saveAsBlob(dataURI, fileName) {\r\n var blob = dataURI; // could be a Blob object\r\n\r\n if (typeof dataURI == \"string\") {\r\n var parts = dataURI.split(\";base64,\");\r\n var contentType = parts[0];\r\n var base64 = atob(parts[1]);\r\n var array = new Uint8Array(base64.length);\r\n\r\n for (var idx = 0; idx < base64.length; idx++) {\r\n array[idx] = base64.charCodeAt(idx);\r\n }\r\n blob = new Blob([array.buffer], { type: contentType });\r\n }\r\n\r\n navigator.msSaveBlob(blob, fileName);\r\n }\r\n\r\n function saveAsDataURI(dataURI, fileName) {\r\n if (window.Blob && dataURI instanceof Blob) {\r\n dataURI = URL.createObjectURL(dataURI);\r\n }\r\n\r\n fileSaver.download = fileName;\r\n fileSaver.href = dataURI;\r\n\r\n var e = document.createEvent(\"MouseEvents\");\r\n e.initMouseEvent(\"click\", true, false, window,\r\n 0, 0, 0, 0, 0, false, false, false, false, 0, null);\r\n\r\n fileSaver.dispatchEvent(e);\r\n setTimeout(function() {\r\n URL.revokeObjectURL(dataURI);\r\n });\r\n }\r\n\r\n kendo.saveAs = function(options) {\r\n var save = postToProxy;\r\n\r\n if (!options.forceProxy) {\r\n if (downloadAttribute) {\r\n save = saveAsDataURI;\r\n } else if (navigator.msSaveBlob) {\r\n save = saveAsBlob;\r\n }\r\n }\r\n\r\n save(options.dataURI, options.fileName, options.proxyURL, options.proxyTarget);\r\n };\r\n })();\r\n\r\n // kendo proxySetters\r\n kendo.proxyModelSetters = function proxyModelSetters(data) {\r\n var observable = {};\r\n\r\n Object.keys(data || {}).forEach(function(property) {\r\n Object.defineProperty(observable, property, {\r\n get: function() {\r\n return data[property];\r\n },\r\n set: function(value) {\r\n data[property] = value;\r\n data.dirty = true;\r\n }\r\n });\r\n });\r\n\r\n return observable;\r\n };\r\n\r\n kendo.getSeriesColors = function() {\r\n var seriesColorsTemplate = '
' +\r\n '
' +\r\n '
' +\r\n '
' +\r\n '
' +\r\n '
',\r\n series = $(seriesColorsTemplate),\r\n colors = [];\r\n\r\n series.appendTo($('body'));\r\n\r\n series.each(function(i, item) {\r\n colors.push($(item).css(\"background-color\"));\r\n });\r\n\r\n series.remove();\r\n\r\n return colors;\r\n };\r\n\r\n kendo.isElement = function(element) {\r\n return element instanceof Element || element instanceof HTMLDocument;\r\n };\r\n\r\n // Kendo defaults\r\n (function() {\r\n\r\n kendo.defaults = kendo.defaults || {};\r\n kendo.setDefaults = function(key, value) {\r\n var path = key.split(\".\");\r\n var curr = kendo.defaults;\r\n\r\n key = path.pop();\r\n\r\n path.forEach(function(part) {\r\n if (curr[part] === undefined$1) {\r\n curr[part] = {};\r\n }\r\n\r\n curr = curr[part];\r\n });\r\n\r\n if (value.constructor === Object) {\r\n curr[key] = deepExtend({}, curr[key], value);\r\n } else {\r\n curr[key] = value;\r\n }\r\n };\r\n\r\n // Use external global flags for templates.\r\n kendo.debugTemplates = window.DEBUG_KENDO_TEMPLATES;\r\n\r\n // Setup default mediaQuery breakpoints\r\n kendo.setDefaults('breakpoints', defaultBreakpoints);\r\n })();\r\n\r\n // Implement type() as it has been depricated in jQuery\r\n (function() {\r\n kendo.class2type = {};\r\n\r\n jQuery.each( \"Boolean Number String Function Array Date RegExp Object Error Symbol\".split( \" \" ),\r\n function( _i, name ) {\r\n kendo.class2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\r\n } );\r\n\r\n kendo.type = function(obj) {\r\n if ( obj == null ) {\r\n return obj + \"\";\r\n }\r\n\r\n // Support: Android <=2.3 only (functionish RegExp)\r\n return typeof obj === \"object\" || typeof obj === \"function\" ?\r\n kendo.class2type[Object.prototype.toString.call(obj)] || \"object\" :\r\n typeof obj;\r\n };\r\n }());\r\n\r\n var KendoLicensing = { validatePackage: function() { return true; },setScriptKey: function() {} };\r\n\r\n window.KendoLicensing = {\r\n setScriptKey: KendoLicensing.setScriptKey\r\n };\r\n\r\n function validatePackage() {\r\n return KendoLicensing.validatePackage(packageMetadata);\r\n }\r\n\r\n function addWatermarkOverlay(el) {\r\n KendoLicensing.addWatermarkOverlay && KendoLicensing.addWatermarkOverlay(el, packageMetadata);\r\n KendoLicensing.showBanner && KendoLicensing.showBanner(packageMetadata);\r\n }\r\n\r\n })(jQuery, window);\r\n var kendo$2B = kendo;\r\n\r\n var __meta__$2F = {\r\n id: \"router\",\r\n name: \"Router\",\r\n category: \"framework\",\r\n description: \"The Router class is responsible for tracking the application state and navigating between the application states.\",\r\n depends: [ \"core\" ],\r\n hidden: false\r\n };\r\n\r\n (function($, undefined$1) {\r\n var kendo = window.kendo,\r\n CHANGE = \"change\",\r\n BACK = \"back\",\r\n SAME = \"same\",\r\n support = kendo.support,\r\n location = window.location,\r\n history = window.history,\r\n CHECK_URL_INTERVAL = 50,\r\n BROKEN_BACK_NAV = kendo.support.browser.msie,\r\n hashStrip = /^#*/,\r\n document = window.document;\r\n\r\n function absoluteURL(path, pathPrefix) {\r\n if (!pathPrefix) {\r\n return path;\r\n }\r\n\r\n if (path + \"/\" === pathPrefix) {\r\n path = pathPrefix;\r\n }\r\n\r\n var regEx = new RegExp(\"^\" + pathPrefix, \"i\");\r\n\r\n if (!regEx.test(path)) {\r\n path = pathPrefix + \"/\" + path;\r\n }\r\n\r\n return location.protocol + '//' + (location.host + \"/\" + path).replace(/\\/\\/+/g, '/');\r\n }\r\n\r\n function hashDelimiter(bang) {\r\n return bang ? \"#!\" : \"#\";\r\n }\r\n\r\n function locationHash(hashDelimiter) {\r\n var href = location.href;\r\n\r\n // ignore normal anchors if in hashbang mode - however, still return \"\" if no hash present\r\n if (hashDelimiter === \"#!\" && href.indexOf(\"#\") > -1 && href.indexOf(\"#!\") < 0) {\r\n return null;\r\n }\r\n\r\n return href.split(hashDelimiter)[1] || \"\";\r\n }\r\n\r\n function stripRoot(root, url) {\r\n if (url.indexOf(root) === 0) {\r\n return (url.substr(root.length)).replace(/\\/\\//g, '/');\r\n } else {\r\n return url;\r\n }\r\n }\r\n\r\n var HistoryAdapter = kendo.Class.extend({\r\n back: function() {\r\n if (BROKEN_BACK_NAV) {\r\n setTimeout(function() { history.back(); });\r\n } else {\r\n history.back();\r\n }\r\n },\r\n\r\n forward: function() {\r\n if (BROKEN_BACK_NAV) {\r\n setTimeout(function() { history.forward(); });\r\n } else {\r\n history.forward();\r\n }\r\n },\r\n\r\n length: function() {\r\n return history.length;\r\n },\r\n\r\n replaceLocation: function(url) {\r\n location.replace(url);\r\n }\r\n });\r\n\r\n var PushStateAdapter = HistoryAdapter.extend({\r\n init: function(root) {\r\n this.root = root;\r\n },\r\n\r\n navigate: function(to) {\r\n history.pushState({}, document.title, absoluteURL(to, this.root));\r\n },\r\n\r\n replace: function(to) {\r\n history.replaceState({}, document.title, absoluteURL(to, this.root));\r\n },\r\n\r\n normalize: function(url) {\r\n return stripRoot(this.root, url);\r\n },\r\n\r\n current: function() {\r\n var current = location.pathname;\r\n\r\n if (location.search) {\r\n current += location.search;\r\n }\r\n\r\n return stripRoot(this.root, current);\r\n },\r\n\r\n change: function(callback) {\r\n $(window).bind(\"popstate.kendo\", callback);\r\n },\r\n\r\n stop: function() {\r\n $(window).unbind(\"popstate.kendo\");\r\n },\r\n\r\n normalizeCurrent: function(options) {\r\n var fixedUrl,\r\n root = options.root,\r\n pathname = location.pathname,\r\n hash = locationHash(hashDelimiter(options.hashBang));\r\n\r\n if (root === pathname + \"/\") {\r\n fixedUrl = root;\r\n }\r\n\r\n if (root === pathname && hash) {\r\n fixedUrl = absoluteURL(hash.replace(hashStrip, ''), root);\r\n }\r\n\r\n if (fixedUrl) {\r\n history.pushState({}, document.title, fixedUrl);\r\n }\r\n }\r\n });\r\n\r\n function fixHash(url) {\r\n return url.replace(/^(#)?/, \"#\");\r\n }\r\n\r\n function fixBang(url) {\r\n return url.replace(/^(#(!)?)?/, \"#!\");\r\n }\r\n\r\n var HashAdapter = HistoryAdapter.extend({\r\n init: function(bang) {\r\n this._id = kendo.guid();\r\n this.prefix = hashDelimiter(bang);\r\n this.fix = bang ? fixBang : fixHash;\r\n },\r\n\r\n navigate: function(to) {\r\n location.hash = this.fix(to);\r\n },\r\n\r\n replace: function(to) {\r\n this.replaceLocation(this.fix(to));\r\n },\r\n\r\n normalize: function(url) {\r\n if (url.indexOf(this.prefix) < 0) {\r\n return url;\r\n } else {\r\n return url.split(this.prefix)[1];\r\n }\r\n },\r\n\r\n change: function(callback) {\r\n if (support.hashChange) {\r\n $(window).on(\"hashchange.\" + this._id, callback);\r\n } else {\r\n this._interval = setInterval(callback, CHECK_URL_INTERVAL);\r\n }\r\n },\r\n\r\n stop: function() {\r\n $(window).off(\"hashchange.\" + this._id);\r\n clearInterval(this._interval);\r\n },\r\n\r\n current: function() {\r\n return locationHash(this.prefix);\r\n },\r\n\r\n normalizeCurrent: function(options) {\r\n var pathname = location.pathname,\r\n root = options.root;\r\n\r\n if (options.pushState && root !== pathname) {\r\n this.replaceLocation(root + this.prefix + stripRoot(root, pathname));\r\n return true; // browser will reload at this point.\r\n }\r\n\r\n return false;\r\n }\r\n });\r\n\r\n var History = kendo.Observable.extend({\r\n start: function(options) {\r\n options = options || {};\r\n\r\n this.bind([CHANGE, BACK, SAME], options);\r\n\r\n if (this._started) {\r\n return;\r\n }\r\n\r\n this._started = true;\r\n\r\n options.root = options.root || \"/\";\r\n\r\n var adapter = this.createAdapter(options),\r\n current;\r\n\r\n // adapter may reload the document\r\n if (adapter.normalizeCurrent(options)) {\r\n return;\r\n }\r\n\r\n current = adapter.current();\r\n\r\n $.extend(this, {\r\n adapter: adapter,\r\n root: options.root,\r\n historyLength: adapter.length(),\r\n current: current,\r\n locations: [current]\r\n });\r\n\r\n adapter.change(this._checkUrl.bind(this));\r\n },\r\n\r\n createAdapter: function(options) {\r\n return support.pushState && options.pushState ? new PushStateAdapter(options.root) : new HashAdapter(options.hashBang);\r\n },\r\n\r\n stop: function() {\r\n if (!this._started) {\r\n return;\r\n }\r\n this.adapter.stop();\r\n this.unbind(CHANGE);\r\n this._started = false;\r\n },\r\n\r\n change: function(callback) {\r\n this.bind(CHANGE, callback);\r\n },\r\n\r\n replace: function(to, silent) {\r\n\r\n this._navigate(to, silent, function(adapter) {\r\n adapter.replace(to);\r\n this.locations[this.locations.length - 1] = this.current;\r\n });\r\n },\r\n\r\n navigate: function(to, silent) {\r\n if (to === \"#:back\") {\r\n this.backCalled = true;\r\n this.adapter.back();\r\n return;\r\n }\r\n\r\n this._navigate(to, silent, function(adapter) {\r\n adapter.navigate(to);\r\n this.locations.push(this.current);\r\n });\r\n },\r\n\r\n _navigate: function(to, silent, callback) {\r\n var adapter = this.adapter;\r\n\r\n to = adapter.normalize(to);\r\n\r\n if (this.current === to || this.current === decodeURIComponent(to)) {\r\n this.trigger(SAME);\r\n return;\r\n }\r\n\r\n if (!silent) {\r\n if (this.trigger(CHANGE, { url: to, decode: false })) {\r\n return;\r\n }\r\n }\r\n\r\n this.current = to;\r\n\r\n callback.call(this, adapter);\r\n\r\n this.historyLength = adapter.length();\r\n },\r\n\r\n _checkUrl: function() {\r\n var adapter = this.adapter,\r\n current = adapter.current(),\r\n newLength = adapter.length(),\r\n navigatingInExisting = this.historyLength === newLength,\r\n back = current === this.locations[this.locations.length - 2] && navigatingInExisting,\r\n backCalled = this.backCalled,\r\n prev = this.current;\r\n\r\n if (current === null || this.current === current || this.current === decodeURIComponent(current)) {\r\n return true;\r\n }\r\n\r\n this.historyLength = newLength;\r\n this.backCalled = false;\r\n\r\n this.current = current;\r\n\r\n if (back && this.trigger(\"back\", { url: prev, to: current })) {\r\n adapter.forward();\r\n this.current = prev;\r\n return;\r\n }\r\n\r\n if (this.trigger(CHANGE, { url: current, backButtonPressed: !backCalled })) {\r\n if (back) {\r\n adapter.forward();\r\n } else {\r\n adapter.back();\r\n this.historyLength --;\r\n }\r\n this.current = prev;\r\n return;\r\n }\r\n\r\n if (back) {\r\n this.locations.pop();\r\n } else {\r\n this.locations.push(current);\r\n }\r\n }\r\n });\r\n\r\n kendo.History = History;\r\n kendo.History.HistoryAdapter = HistoryAdapter;\r\n kendo.History.HashAdapter = HashAdapter;\r\n kendo.History.PushStateAdapter = PushStateAdapter;\r\n kendo.absoluteURL = absoluteURL;\r\n kendo.history = new History();\r\n })(window.kendo.jQuery);\r\n var kendo$2A = kendo;\r\n\r\n (function() {\r\n var kendo = window.kendo,\r\n history = kendo.history,\r\n Observable = kendo.Observable,\r\n INIT = \"init\",\r\n ROUTE_MISSING = \"routeMissing\",\r\n CHANGE = \"change\",\r\n BACK = \"back\",\r\n SAME = \"same\",\r\n optionalParam = /\\((.*?)\\)/g,\r\n namedParam = /(\\(\\?)?:\\w+/g,\r\n splatParam = /\\*\\w+/g,\r\n escapeRegExp = /[\\-{}\\[\\]+?.,\\\\\\^$|#\\s]/g;\r\n\r\n function namedParamReplace(match, optional) {\r\n return optional ? match : '([^\\/]+)';\r\n }\r\n\r\n function routeToRegExp(route, ignoreCase) {\r\n return new RegExp('^' + route\r\n .replace(escapeRegExp, '\\\\$&')\r\n .replace(optionalParam, '(?:$1)?')\r\n .replace(namedParam, namedParamReplace)\r\n .replace(splatParam, '(.*?)') + '$', ignoreCase ? \"i\" : \"\");\r\n }\r\n\r\n function stripUrl(url) {\r\n return url.replace(/(\\?.*)|(#.*)/g, \"\");\r\n }\r\n\r\n var Route = kendo.Class.extend({\r\n init: function(route, callback, ignoreCase) {\r\n if (!(route instanceof RegExp)) {\r\n route = routeToRegExp(route, ignoreCase);\r\n }\r\n\r\n this.route = route;\r\n this._callback = callback;\r\n },\r\n\r\n callback: function(url, back, decode) {\r\n var params,\r\n idx = 0,\r\n length,\r\n queryStringParams = kendo.parseQueryStringParams(url);\r\n queryStringParams._back = back;\r\n\r\n url = stripUrl(url);\r\n params = this.route.exec(url).slice(1);\r\n length = params.length;\r\n\r\n if (decode) {\r\n for (; idx < length; idx ++) {\r\n if (typeof params[idx] !== 'undefined') {\r\n params[idx] = decodeURIComponent(params[idx]);\r\n }\r\n }\r\n }\r\n\r\n params.push(queryStringParams);\r\n\r\n this._callback.apply(null, params);\r\n },\r\n\r\n worksWith: function(url, back, decode) {\r\n if (this.route.test(stripUrl(url))) {\r\n this.callback(url, back, decode);\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n });\r\n\r\n var Router = Observable.extend({\r\n init: function(options) {\r\n if (!options) {\r\n options = {};\r\n }\r\n\r\n Observable.fn.init.call(this);\r\n\r\n this.routes = [];\r\n this.pushState = options.pushState;\r\n this.hashBang = options.hashBang;\r\n this.root = options.root;\r\n this.ignoreCase = options.ignoreCase !== false;\r\n\r\n this.bind([INIT, ROUTE_MISSING, CHANGE, SAME, BACK], options);\r\n },\r\n\r\n destroy: function() {\r\n history.unbind(CHANGE, this._urlChangedProxy);\r\n history.unbind(SAME, this._sameProxy);\r\n history.unbind(BACK, this._backProxy);\r\n this.unbind();\r\n },\r\n\r\n start: function() {\r\n var that = this,\r\n sameProxy = function() { that._same(); },\r\n backProxy = function(e) { that._back(e); },\r\n urlChangedProxy = function(e) { that._urlChanged(e); };\r\n\r\n history.start({\r\n same: sameProxy,\r\n change: urlChangedProxy,\r\n back: backProxy,\r\n pushState: that.pushState,\r\n hashBang: that.hashBang,\r\n root: that.root\r\n });\r\n\r\n // eslint-disable-next-line no-undef\r\n var initEventObject = { url: history.current || \"/\", preventDefault: $.noop };\r\n\r\n if (!that.trigger(INIT, initEventObject)) {\r\n that._urlChanged(initEventObject);\r\n }\r\n\r\n this._urlChangedProxy = urlChangedProxy;\r\n this._backProxy = backProxy;\r\n },\r\n\r\n route: function(route, callback) {\r\n this.routes.push(new Route(route, callback, this.ignoreCase));\r\n },\r\n\r\n navigate: function(url, silent) {\r\n kendo.history.navigate(url, silent);\r\n },\r\n\r\n replace: function(url, silent) {\r\n kendo.history.replace(url, silent);\r\n },\r\n\r\n _back: function(e) {\r\n if (this.trigger(BACK, { url: e.url, to: e.to })) {\r\n e.preventDefault();\r\n }\r\n },\r\n\r\n _same: function() {\r\n this.trigger(SAME);\r\n },\r\n\r\n _urlChanged: function(e) {\r\n var url = e.url;\r\n var decode = !!e.decode;\r\n var back = e.backButtonPressed;\r\n\r\n if (!url) {\r\n url = \"/\";\r\n }\r\n\r\n if (this.trigger(CHANGE, { url: e.url, params: kendo.parseQueryStringParams(e.url), backButtonPressed: back })) {\r\n e.preventDefault();\r\n return;\r\n }\r\n\r\n var idx = 0,\r\n routes = this.routes,\r\n route,\r\n length = routes.length;\r\n\r\n for (; idx < length; idx ++) {\r\n route = routes[idx];\r\n\r\n if (route.worksWith(url, back, decode)) {\r\n return;\r\n }\r\n }\r\n\r\n if (this.trigger(ROUTE_MISSING, { url: url, params: kendo.parseQueryStringParams(url), backButtonPressed: back })) {\r\n e.preventDefault();\r\n }\r\n }\r\n });\r\n\r\n kendo.Router = Router;\r\n })();\r\n\r\n /*\r\n This code is copied/inspired by the internal @progress/kendo-data-query repo:\r\n https://github.com/telerik/kendo-data-query/tree/develop/src/filtering\r\n\r\n !!!\r\n 1. If updates are to be synced consider the accentFoldingFiltering,\r\n which at the moment is not present as a feature in the data-query-package.\r\n\r\n 2. Double-check available operators as well.\r\n\r\n 3. Make sure objs are strings -> i.e., replace (a || \"\") to (a + '')\r\n !!!\r\n\r\n In future, if we consider reusing the code directly we should revise the above omissions.\r\n */\r\n\r\n const logic = {\r\n \"or\": {\r\n concat: (acc, fn) => a => acc(a) || fn(a),\r\n identity: () => false\r\n },\r\n \"and\": {\r\n concat: (acc, fn) => a => acc(a) && fn(a),\r\n identity: () => true\r\n }\r\n };\r\n\r\n const operatorsMap = {\r\n isnullorempty: (a) => kendo.isBlank(a) || a === '',\r\n isnotnullorempty: (a) => kendo.isPresent(a) && a !== '',\r\n contains: (a, b) => (a + '').indexOf(b) >= 0,\r\n doesnotcontain: (a, b) => (a + '').indexOf(b) === -1,\r\n doesnotendwith: (a, b) => (a + '').indexOf(b, (a || \"\").length - (b || \"\").length) < 0,\r\n doesnotstartwith: (a, b) => (a + '').lastIndexOf(b, 0) === -1,\r\n endswith: (a, b) => (a + '').indexOf(b, (a || \"\").length - (b || \"\").length) >= 0,\r\n eq: (a, b) => a === b,\r\n gt: (a, b) => a > b,\r\n gte: (a, b) => a >= b,\r\n isempty: (a) => a === '',\r\n isnotempty: (a) => a !== '',\r\n isnotnull: (a) => kendo.isPresent(a),\r\n isnull: (a) => kendo.isBlank(a),\r\n lt: (a, b) => a < b,\r\n lte: (a, b) => a <= b,\r\n neq: (a, b) => a != b,\r\n startswith: (a, b) => (a + '').lastIndexOf(b, 0) === 0\r\n };\r\n\r\n const dateRegExp = /^\\/Date\\((.*?)\\)\\/$/;\r\n\r\n const convertValue = (value, ignoreCase, accentFoldingFiltering) => {\r\n if (value != null && kendo.isString(value)) {\r\n const date = dateRegExp.exec(value);\r\n if (date) {\r\n return new Date(+date[1]).getTime();\r\n } else if (ignoreCase) {\r\n return accentFoldingFiltering ? value.toLocaleLowerCase(accentFoldingFiltering) : value.toLowerCase();\r\n }\r\n } else if (value != null && kendo.isDate(value)) {\r\n return value.getTime();\r\n }\r\n return value;\r\n };\r\n\r\n const typedGetter = (prop, value, ignoreCase, accentFoldingFiltering) => {\r\n if (!kendo.isPresent(value)) {\r\n return prop;\r\n }\r\n\r\n let acc = prop;\r\n\r\n if (kendo.isString(value)) {\r\n const date = dateRegExp.exec(value);\r\n if (date) {\r\n value = new Date(+date[1]);\r\n } else {\r\n acc = a => {\r\n const x = prop(a);\r\n if (typeof x === 'string' && ignoreCase) {\r\n return accentFoldingFiltering ? x.toLocaleLowerCase(accentFoldingFiltering) : x.toLowerCase();\r\n } else {\r\n return kendo.isNumeric(x) ? x + \"\" : x;\r\n }\r\n };\r\n }\r\n }\r\n\r\n if (kendo.isDate(value)) {\r\n return a => {\r\n const x = acc(a);\r\n return kendo.isDate(x) ? x.getTime() : x;\r\n };\r\n }\r\n return acc;\r\n };\r\n\r\n const transformFilter = ({ field, ignoreCase, value, operator = 'eq', accentFoldingFiltering }) => {\r\n field = !kendo.isPresent(field) ? a => a : field;\r\n\r\n ignoreCase = kendo.isPresent(ignoreCase) ? ignoreCase : true;\r\n\r\n const itemProp = typedGetter(\r\n kendo.isFunction(field) ? field : kendo.getter(field, true),\r\n value,\r\n ignoreCase,\r\n accentFoldingFiltering\r\n );\r\n\r\n value = convertValue(value, ignoreCase, accentFoldingFiltering);\r\n\r\n const op = kendo.isFunction(operator) ? operator : operatorsMap[operator];\r\n\r\n return a => op(itemProp(a), value, ignoreCase);\r\n };\r\n\r\n const isCompositeFilterDescriptor = (source) => kendo.isPresent(source.filters);\r\n\r\n const transformCompositeFilter = (filter) => {\r\n const accentFoldingFiltering = filter.accentFoldingFiltering;\r\n const combiner = logic[filter.logic || 'and'];\r\n return filter.filters\r\n .filter(kendo.isPresent)\r\n .map(x => (isCompositeFilterDescriptor(x) ? transformCompositeFilter(extendAccentFolding(x, accentFoldingFiltering)) : transformFilter(extendAccentFolding(x, accentFoldingFiltering))))\r\n .reduce(combiner.concat, combiner.identity);\r\n };\r\n\r\n const extendAccentFolding = (filter, accentFoldingFiltering) => (kendo.isPresent(accentFoldingFiltering) ? Object.assign(filter, { accentFoldingFiltering }) : filter);\r\n\r\n const filterExprNoEval = function(expr) {\r\n return transformCompositeFilter(expr);\r\n };\r\n\r\n var __meta__$2E = {\r\n id: \"data.odata\",\r\n name: \"OData\",\r\n category: \"framework\",\r\n depends: [ \"core\" ],\r\n hidden: true\r\n };\r\n\r\n (function($, undefined$1) {\r\n var kendo = window.kendo,\r\n extend = $.extend,\r\n NEWLINE = \"\\r\\n\",\r\n DOUBLELINE = \"\\r\\n\\r\\n\",\r\n isFunction = kendo.isFunction,\r\n odataFilters = {\r\n eq: \"eq\",\r\n neq: \"ne\",\r\n gt: \"gt\",\r\n gte: \"ge\",\r\n lt: \"lt\",\r\n lte: \"le\",\r\n contains: \"substringof\",\r\n doesnotcontain: \"substringof\",\r\n endswith: \"endswith\",\r\n startswith: \"startswith\",\r\n isnull: \"eq\",\r\n isnotnull: \"ne\",\r\n isnullorempty: \"eq\",\r\n isnotnullorempty: \"ne\",\r\n isempty: \"eq\",\r\n isnotempty: \"ne\"\r\n },\r\n odataFiltersVersionFour = extend({}, odataFilters, {\r\n contains: \"contains\"\r\n }),\r\n mappers = {\r\n pageSize: $.noop,\r\n page: $.noop,\r\n filter: function(params, filter, useVersionFour) {\r\n if (filter) {\r\n filter = toOdataFilter(filter, useVersionFour);\r\n if (filter) {\r\n params.$filter = filter;\r\n }\r\n }\r\n },\r\n sort: function(params, orderby) {\r\n var expr = $.map(orderby, function(value) {\r\n var order = value.field.replace(/\\./g, \"/\");\r\n\r\n if (value.dir === \"desc\") {\r\n order += \" desc\";\r\n }\r\n\r\n return order;\r\n }).join(\",\");\r\n\r\n if (expr) {\r\n params.$orderby = expr;\r\n }\r\n },\r\n skip: function(params, skip) {\r\n if (skip) {\r\n params.$skip = skip;\r\n }\r\n },\r\n take: function(params, take) {\r\n if (take) {\r\n params.$top = take;\r\n }\r\n }\r\n },\r\n defaultDataType = {\r\n read: {\r\n dataType: \"jsonp\"\r\n }\r\n };\r\n\r\n function toOdataFilter(filter, useOdataFour) {\r\n var result = [],\r\n logic = filter.logic || \"and\",\r\n idx,\r\n length,\r\n field,\r\n type,\r\n format,\r\n operator,\r\n value,\r\n ignoreCase,\r\n filters = filter.filters;\r\n\r\n for (idx = 0, length = filters.length; idx < length; idx++) {\r\n filter = filters[idx];\r\n field = filter.field;\r\n value = filter.value;\r\n operator = filter.operator;\r\n\r\n if (filter.filters) {\r\n filter = toOdataFilter(filter, useOdataFour);\r\n } else {\r\n ignoreCase = filter.ignoreCase;\r\n field = field.replace(/\\./g, \"/\");\r\n filter = odataFilters[operator];\r\n if (useOdataFour) {\r\n filter = odataFiltersVersionFour[operator];\r\n }\r\n\r\n if (operator === \"isnullorempty\") {\r\n filter = kendo.format(\"{0} {1} null or {0} {1} ''\", field, filter);\r\n } else if (operator === \"isnotnullorempty\") {\r\n filter = kendo.format(\"{0} {1} null and {0} {1} ''\", field, filter);\r\n } else if (operator === \"isnull\" || operator === \"isnotnull\") {\r\n filter = kendo.format(\"{0} {1} null\", field, filter);\r\n } else if (operator === \"isempty\" || operator === \"isnotempty\") {\r\n filter = kendo.format(\"{0} {1} ''\", field, filter);\r\n } else if (filter && value !== undefined$1) {\r\n type = kendo.type(value);\r\n if (type === \"string\") {\r\n format = \"'{1}'\";\r\n value = value.replace(/'/g, \"''\");\r\n\r\n if (ignoreCase === true) {\r\n field = \"tolower(\" + field + \")\";\r\n }\r\n\r\n } else if (type === \"date\") {\r\n if (useOdataFour) {\r\n format = \"{1:yyyy-MM-ddTHH:mm:ss+00:00}\";\r\n value = kendo.timezone.apply(value, 'Etc/UTC');\r\n } else {\r\n format = \"datetime'{1:yyyy-MM-ddTHH:mm:ss}'\";\r\n }\r\n } else {\r\n format = \"{1}\";\r\n }\r\n\r\n if (filter.length > 3) {\r\n if (filter !== \"substringof\") {\r\n format = \"{0}({2},\" + format + \")\";\r\n } else {\r\n format = \"{0}(\" + format + \",{2})\";\r\n if (operator === \"doesnotcontain\") {\r\n if (useOdataFour) {\r\n format = \"{0}({2},'{1}') eq -1\";\r\n filter = \"indexof\";\r\n } else {\r\n format += \" eq false\";\r\n }\r\n }\r\n }\r\n } else {\r\n format = \"{2} {0} \" + format;\r\n }\r\n\r\n filter = kendo.format(format, filter, value, field);\r\n }\r\n }\r\n\r\n result.push(filter);\r\n }\r\n\r\n filter = result.join(\" \" + logic + \" \");\r\n\r\n if (result.length > 1) {\r\n filter = \"(\" + filter + \")\";\r\n }\r\n\r\n return filter;\r\n }\r\n\r\n function stripMetadata(obj) {\r\n for (var name in obj) {\r\n if (name.indexOf(\"@odata\") === 0) {\r\n delete obj[name];\r\n }\r\n }\r\n }\r\n\r\n function hex16() {\r\n return Math.floor((1 + Math.random()) * 0x10000).toString(16).substr(1);\r\n }\r\n\r\n function createBoundary(prefix) {\r\n return prefix + hex16() + '-' + hex16() + '-' + hex16();\r\n }\r\n\r\n function createDelimeter(boundary, close) {\r\n var result = NEWLINE + \"--\" + boundary;\r\n\r\n if (close) {\r\n result += \"--\";\r\n }\r\n\r\n return result;\r\n }\r\n\r\n function createCommand(transport, item, httpVerb, command) {\r\n var transportUrl = transport.options[command].url;\r\n var commandPrefix = kendo.format(\"{0} \", httpVerb);\r\n\r\n if (isFunction(transportUrl)) {\r\n return commandPrefix + transportUrl(item);\r\n } else {\r\n return commandPrefix + transportUrl;\r\n }\r\n }\r\n\r\n function getOperationHeader(changeset, changeId) {\r\n var header = \"\";\r\n\r\n header += createDelimeter(changeset, false);\r\n header += NEWLINE + 'Content-Type: application/http';\r\n header += NEWLINE + 'Content-Transfer-Encoding: binary';\r\n header += NEWLINE + 'Content-ID: ' + changeId;\r\n\r\n return header;\r\n }\r\n\r\n function getOperationContent(item) {\r\n var content = \"\";\r\n\r\n content += NEWLINE + \"Content-Type: application/json;odata=minimalmetadata\";\r\n content += NEWLINE + \"Prefer: return=representation\";\r\n content += DOUBLELINE + kendo.stringify(item);\r\n\r\n return content;\r\n }\r\n\r\n function getOperations(collection, changeset, changeId, command, transport, skipContent) {\r\n var requestBody = \"\";\r\n\r\n for (var i = 0; i < collection.length; i++) {\r\n requestBody += getOperationHeader(changeset, changeId);\r\n requestBody += DOUBLELINE + createCommand(transport, collection[i], transport.options[command].type, command) + ' HTTP/1.1';\r\n if (!skipContent) {\r\n requestBody += getOperationContent(collection[i]);\r\n }\r\n requestBody += NEWLINE;\r\n changeId++;\r\n }\r\n\r\n return requestBody;\r\n }\r\n\r\n function processCollection(colection, boundary, changeset, changeId, transport, command, skipContent) {\r\n var requestBody = \"\";\r\n\r\n requestBody += getBoundary(boundary, changeset);\r\n requestBody += getOperations(colection, changeset, changeId, command, transport, skipContent);\r\n requestBody += createDelimeter(changeset, true);\r\n requestBody += NEWLINE;\r\n\r\n return requestBody;\r\n }\r\n\r\n function getBoundary(boundary,changeset) {\r\n var requestBody = \"\";\r\n\r\n requestBody += \"--\" + boundary + NEWLINE;\r\n requestBody += \"Content-Type: multipart/mixed; boundary=\" + changeset + NEWLINE;\r\n\r\n return requestBody;\r\n }\r\n\r\n function createBatchRequest(transport, colections) {\r\n \t\tvar options = extend({}, transport.options.batch);\r\n var boundary = createBoundary(\"sf_batch_\");\r\n var requestBody = \"\";\r\n var changeId = 0;\r\n var batchURL = transport.options.batch.url;\r\n var changeset = createBoundary(\"sf_changeset_\");\r\n\r\n options.type = transport.options.batch.type;\r\n options.url = isFunction(batchURL) ? batchURL() : batchURL;\r\n \t\toptions.headers = extend(options.headers || {}, {\r\n \t\t\t\"Content-Type\": \"multipart/mixed; boundary=\" + boundary\r\n \t\t});\r\n\r\n if (colections.updated.length) {\r\n requestBody += processCollection(colections.updated, boundary, changeset, changeId, transport, \"update\", false);\r\n changeId += colections.updated.length;\r\n changeset = createBoundary(\"sf_changeset_\");\r\n }\r\n\r\n if (colections.destroyed.length) {\r\n requestBody += processCollection(colections.destroyed, boundary, changeset, changeId, transport, \"destroy\", true);\r\n changeId += colections.destroyed.length;\r\n changeset = createBoundary(\"sf_changeset_\");\r\n }\r\n\r\n if (colections.created.length) {\r\n requestBody += processCollection(colections.created, boundary, changeset, changeId, transport, \"create\", false);\r\n }\r\n\r\n requestBody += createDelimeter(boundary, true);\r\n\r\n options.data = requestBody;\r\n\r\n return options;\r\n }\r\n\r\n function parseBatchResponse(responseText) {\r\n var responseMarkers = responseText.match(/--changesetresponse_[a-z0-9-]+$/gm);\r\n var markerIndex = 0;\r\n var collections = [];\r\n var changeBody;\r\n var status;\r\n var code;\r\n var marker;\r\n var jsonModel;\r\n\r\n collections.push({ models: [], passed: true });\r\n\r\n for (var i = 0; i < responseMarkers.length; i++) {\r\n marker = responseMarkers[i];\r\n if (marker.lastIndexOf('--', marker.length - 1)) {\r\n if (i < responseMarkers.length - 1) {\r\n collections.push({ models: [], passed: true });\r\n }\r\n continue;\r\n }\r\n\r\n if (!markerIndex) {\r\n markerIndex = responseText.indexOf(marker);\r\n } else {\r\n markerIndex = responseText.indexOf(marker, markerIndex + marker.length);\r\n }\r\n\r\n changeBody = responseText.substring(markerIndex, responseText.indexOf(\"--\", markerIndex + 1));\r\n status = changeBody.match(/^HTTP\\/1\\.\\d (\\d{3}) (.*)$/gm).pop();\r\n code = kendo.parseFloat(status.match(/\\d{3}/g).pop());\r\n\r\n if (code >= 200 && code <= 299) {\r\n jsonModel = changeBody.match(/\\{.*\\}/gm);\r\n if (jsonModel) {\r\n collections[collections.length - 1].models.push(JSON.parse(jsonModel[0]));\r\n }\r\n } else {\r\n collections[collections.length - 1].passed = false;\r\n }\r\n\r\n }\r\n\r\n return collections;\r\n }\r\n\r\n extend(true, kendo.data, {\r\n schemas: {\r\n odata: {\r\n type: \"json\",\r\n data: function(data) {\r\n return data.d.results || [data.d];\r\n },\r\n total: \"d.__count\"\r\n }\r\n },\r\n transports: {\r\n odata: {\r\n read: {\r\n cache: true, // to prevent jQuery from adding cache buster\r\n dataType: \"jsonp\",\r\n jsonp: \"$callback\"\r\n },\r\n update: {\r\n cache: true,\r\n dataType: \"json\",\r\n contentType: \"application/json\", // to inform the server the the request body is JSON encoded\r\n type: \"PUT\" // can be PUT or MERGE\r\n },\r\n create: {\r\n cache: true,\r\n dataType: \"json\",\r\n contentType: \"application/json\",\r\n type: \"POST\" // must be POST to create new entity\r\n },\r\n destroy: {\r\n cache: true,\r\n dataType: \"json\",\r\n type: \"DELETE\"\r\n },\r\n parameterMap: function(options, type, useVersionFour) {\r\n var params,\r\n value,\r\n option,\r\n dataType;\r\n\r\n options = options || {};\r\n type = type || \"read\";\r\n dataType = (this.options || defaultDataType)[type];\r\n dataType = dataType ? dataType.dataType : \"json\";\r\n\r\n if (type === \"read\") {\r\n params = {\r\n $inlinecount: \"allpages\"\r\n };\r\n\r\n if (dataType != \"json\") {\r\n params.$format = \"json\";\r\n }\r\n\r\n for (option in options) {\r\n if (mappers[option]) {\r\n mappers[option](params, options[option], useVersionFour);\r\n } else {\r\n params[option] = options[option];\r\n }\r\n }\r\n } else {\r\n if (dataType !== \"json\") {\r\n throw new Error(\"Only json dataType can be used for \" + type + \" operation.\");\r\n }\r\n\r\n if (type !== \"destroy\") {\r\n for (option in options) {\r\n value = options[option];\r\n if (typeof value === \"number\") {\r\n options[option] = value + \"\";\r\n }\r\n }\r\n\r\n params = kendo.stringify(options);\r\n }\r\n }\r\n\r\n return params;\r\n }\r\n }\r\n }\r\n });\r\n\r\n extend(true, kendo.data, {\r\n schemas: {\r\n \"odata-v4\": {\r\n type: \"json\",\r\n data: function(data) {\r\n if (Array.isArray(data)) {\r\n for (var i = 0; i < data.length; i++) {\r\n stripMetadata(data[i]);\r\n }\r\n return data;\r\n } else {\r\n data = $.extend({}, data);\r\n stripMetadata(data);\r\n\r\n if (data.value) {\r\n return data.value;\r\n }\r\n return [data];\r\n }\r\n },\r\n total: function(data) {\r\n return data[\"@odata.count\"];\r\n }\r\n }\r\n },\r\n transports: {\r\n \"odata-v4\": {\r\n batch: {\r\n type: \"POST\"\r\n },\r\n read: {\r\n cache: true, // to prevent jQuery from adding cache buster\r\n dataType: \"json\"\r\n },\r\n update: {\r\n cache: true,\r\n dataType: \"json\",\r\n contentType: \"application/json;IEEE754Compatible=true\", // to inform the server the the request body is JSON encoded\r\n type: \"PUT\" // can be PUT or MERGE\r\n },\r\n create: {\r\n cache: true,\r\n dataType: \"json\",\r\n contentType: \"application/json;IEEE754Compatible=true\",\r\n type: \"POST\" // must be POST to create new entity\r\n },\r\n destroy: {\r\n cache: true,\r\n dataType: \"json\",\r\n type: \"DELETE\"\r\n },\r\n parameterMap: function(options, type) {\r\n var result = kendo.data.transports.odata.parameterMap(options, type, true);\r\n if (type == \"read\") {\r\n result.$count = true;\r\n delete result.$inlinecount;\r\n }\r\n\r\n \t\t\t\t\tif (result && result.$filter) {\r\n \t\t\t\t\t\t// Remove the single quotation marks around the GUID (OData v4).\r\n \t\t\t\t\t\tresult.$filter = result.$filter.replace(/('[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}')/ig, function(x) {\r\n \t\t\t\t\t\t\treturn x.substring(1, x.length - 1);\r\n \t\t\t\t\t\t});\r\n \t\t\t\t\t}\r\n\r\n return result;\r\n },\r\n submit: function(e) {\r\n var that = this;\r\n var options = createBatchRequest(that, e.data);\r\n var collections = e.data;\r\n\r\n if (!collections.updated.length && !collections.destroyed.length && !collections.created.length) {\r\n return;\r\n }\r\n\r\n $.ajax(extend(true, {}, {\r\n success: function(response) {\r\n var responses = parseBatchResponse(response);\r\n var index = 0;\r\n var current;\r\n\r\n if (collections.updated.length) {\r\n current = responses[index];\r\n if (current.passed) {\r\n // Pass either the obtained models or an empty array if only status codes are returned.\r\n e.success(current.models.length ? current.models : [], \"update\");\r\n }\r\n index++;\r\n }\r\n if (collections.destroyed.length) {\r\n current = responses[index];\r\n if (current.passed) {\r\n // For delete operations OData returns only status codes.\r\n // Passing empty array to datasource will force it to correctly remove the deleted items from the pristine collection.\r\n e.success([], \"destroy\");\r\n }\r\n index++;\r\n }\r\n if (collections.created.length) {\r\n current = responses[index];\r\n if (current.passed) {\r\n e.success(current.models, \"create\");\r\n }\r\n }\r\n },\r\n error: function(response, status, error) {\r\n e.error(response, status, error);\r\n }\r\n }, options));\r\n }\r\n }\r\n }\r\n });\r\n\r\n })(window.kendo.jQuery);\r\n var kendo$2z = kendo;\r\n\r\n var __meta__$2D = {\r\n id: \"data.xml\",\r\n name: \"XML\",\r\n category: \"framework\",\r\n depends: [ \"core\" ],\r\n hidden: true\r\n };\r\n\r\n\r\n (function($, undefined$1) {\r\n var kendo = window.kendo,\r\n isArray = Array.isArray,\r\n isPlainObject = $.isPlainObject,\r\n map = $.map,\r\n each = $.each,\r\n extend = $.extend,\r\n getter = kendo.getter,\r\n Class = kendo.Class;\r\n\r\n var XmlDataReader = Class.extend({\r\n init: function(options) {\r\n var that = this,\r\n total = options.total,\r\n model = options.model,\r\n parse = options.parse,\r\n errors = options.errors,\r\n serialize = options.serialize,\r\n data = options.data;\r\n\r\n if (model) {\r\n if (isPlainObject(model)) {\r\n var base = options.modelBase || kendo.data.Model;\r\n\r\n if (model.fields) {\r\n each(model.fields, function(field, value) {\r\n if (isPlainObject(value) && value.field) {\r\n if (!kendo.isFunction(value.field)) {\r\n value = extend(value, { field: that.getter(value.field) });\r\n }\r\n } else {\r\n value = { field: that.getter(value) };\r\n }\r\n model.fields[field] = value;\r\n });\r\n }\r\n\r\n var id = model.id;\r\n if (id) {\r\n var idField = {};\r\n\r\n idField[that.xpathToMember(id, true)] = { field: that.getter(id) };\r\n model.fields = extend(idField, model.fields);\r\n model.id = that.xpathToMember(id);\r\n }\r\n model = base.define(model);\r\n }\r\n\r\n that.model = model;\r\n }\r\n\r\n if (total) {\r\n if (typeof total == \"string\") {\r\n total = that.getter(total);\r\n that.total = function(data) {\r\n return parseInt(total(data), 10);\r\n };\r\n } else if (typeof total == \"function\") {\r\n that.total = total;\r\n }\r\n }\r\n\r\n if (errors) {\r\n if (typeof errors == \"string\") {\r\n errors = that.getter(errors);\r\n that.errors = function(data) {\r\n return errors(data) || null;\r\n };\r\n } else if (typeof errors == \"function\") {\r\n that.errors = errors;\r\n }\r\n }\r\n\r\n if (data) {\r\n if (typeof data == \"string\") {\r\n data = that.xpathToMember(data);\r\n that.data = function(value) {\r\n var result = that.evaluate(value, data),\r\n modelInstance;\r\n\r\n result = isArray(result) ? result : [result];\r\n\r\n if (that.model && model.fields) {\r\n modelInstance = new that.model();\r\n\r\n return map(result, function(value) {\r\n if (value) {\r\n var record = {}, field;\r\n\r\n for (field in model.fields) {\r\n record[field] = modelInstance._parse(field, model.fields[field].field(value));\r\n }\r\n\r\n return record;\r\n }\r\n });\r\n }\r\n\r\n return result;\r\n };\r\n } else if (typeof data == \"function\") {\r\n that.data = data;\r\n }\r\n }\r\n\r\n if (typeof parse == \"function\") {\r\n var xmlParse = that.parse;\r\n\r\n that.parse = function(data) {\r\n var xml = parse.call(that, data);\r\n return xmlParse.call(that, xml);\r\n };\r\n }\r\n\r\n if (typeof serialize == \"function\") {\r\n that.serialize = serialize;\r\n }\r\n },\r\n total: function(result) {\r\n return this.data(result).length;\r\n },\r\n errors: function(data) {\r\n return data ? data.errors : null;\r\n },\r\n serialize: function(data) {\r\n return data;\r\n },\r\n parseDOM: function(element) {\r\n var result = {},\r\n parsedNode,\r\n node,\r\n nodeType,\r\n nodeName,\r\n member,\r\n attribute,\r\n attributes = element.attributes,\r\n attributeCount = attributes.length,\r\n idx;\r\n\r\n for (idx = 0; idx < attributeCount; idx++) {\r\n attribute = attributes[idx];\r\n result[\"@\" + attribute.nodeName] = attribute.nodeValue;\r\n }\r\n\r\n for (node = element.firstChild; node; node = node.nextSibling) {\r\n nodeType = node.nodeType;\r\n\r\n if (nodeType === 3 || nodeType === 4) {\r\n // text nodes or CDATA are stored as #text field\r\n result[\"#text\"] = node.nodeValue;\r\n } else if (nodeType === 1) {\r\n // elements are stored as fields\r\n parsedNode = this.parseDOM(node);\r\n\r\n nodeName = node.nodeName;\r\n\r\n member = result[nodeName];\r\n\r\n if (isArray(member)) {\r\n // elements of same nodeName are stored as array\r\n member.push(parsedNode);\r\n } else if (member !== undefined$1) {\r\n member = [member, parsedNode];\r\n } else {\r\n member = parsedNode;\r\n }\r\n\r\n result[nodeName] = member;\r\n }\r\n }\r\n return result;\r\n },\r\n\r\n evaluate: function(value, expression) {\r\n var members = expression.split(\".\"),\r\n member,\r\n result,\r\n length,\r\n intermediateResult,\r\n idx;\r\n\r\n while (member = members.shift()) {\r\n value = value[member];\r\n\r\n if (isArray(value)) {\r\n result = [];\r\n expression = members.join(\".\");\r\n\r\n for (idx = 0, length = value.length; idx < length; idx++) {\r\n intermediateResult = this.evaluate(value[idx], expression);\r\n\r\n intermediateResult = isArray(intermediateResult) ? intermediateResult : [intermediateResult];\r\n\r\n result.push.apply(result, intermediateResult);\r\n }\r\n\r\n return result;\r\n }\r\n }\r\n\r\n return value;\r\n },\r\n\r\n parse: function(xml) {\r\n var documentElement,\r\n tree,\r\n result = {};\r\n\r\n documentElement = xml.documentElement || $.parseXML(xml).documentElement;\r\n\r\n tree = this.parseDOM(documentElement);\r\n\r\n result[documentElement.nodeName] = tree;\r\n\r\n return result;\r\n },\r\n\r\n xpathToMember: function(member, raw) {\r\n if (!member) {\r\n return \"\";\r\n }\r\n\r\n member = member.replace(/^\\//, \"\") // remove the first \"/\"\r\n .replace(/\\//g, \".\"); // replace all \"/\" with \".\"\r\n\r\n if (member.indexOf(\"@\") >= 0) {\r\n // replace @attribute with '[\"@attribute\"]'\r\n return member.replace(/\\.?(@.*)/, raw ? '$1' : '[\"$1\"]');\r\n }\r\n\r\n if (member.indexOf(\"text()\") >= 0) {\r\n // replace \".text()\" with '[\"#text\"]'\r\n return member.replace(/(\\.?text\\(\\))/, raw ? '#text' : '[\"#text\"]');\r\n }\r\n\r\n return member;\r\n },\r\n getter: function(member) {\r\n return getter(this.xpathToMember(member), true);\r\n }\r\n });\r\n\r\n $.extend(true, kendo.data, {\r\n XmlDataReader: XmlDataReader,\r\n readers: {\r\n xml: XmlDataReader\r\n }\r\n });\r\n })(window.kendo.jQuery);\r\n var kendo$2y = kendo;\r\n\r\n var __meta__$2C = {\r\n id: \"data\",\r\n name: \"Data source\",\r\n category: \"framework\",\r\n description: \"Powerful component for using local and remote data.Fully supports CRUD, Sorting, Paging, Filtering, Grouping, and Aggregates.\",\r\n depends: [ \"core\" ],\r\n features: [ {\r\n id: \"data-odata\",\r\n name: \"OData\",\r\n description: \"Support for accessing Open Data Protocol (OData) services.\",\r\n depends: [ \"data.odata\" ]\r\n }, {\r\n id: \"data-signalr\",\r\n name: \"SignalR\",\r\n description: \"Support for binding to SignalR hubs.\",\r\n depends: [ \"data.signalr\" ]\r\n }, {\r\n id: \"data-XML\",\r\n name: \"XML\",\r\n description: \"Support for binding to XML.\",\r\n depends: [ \"data.xml\" ]\r\n }]\r\n };\r\n\r\n\r\n (function($, undefined$1) {\r\n var extend = $.extend,\r\n isPlainObject = $.isPlainObject,\r\n isEmptyObject = $.isEmptyObject,\r\n isArray = Array.isArray,\r\n grep = $.grep,\r\n ajax = $.ajax,\r\n map,\r\n each = $.each,\r\n noop = $.noop,\r\n kendo = window.kendo,\r\n isFunction = kendo.isFunction,\r\n Observable = kendo.Observable,\r\n Class = kendo.Class,\r\n STRING = \"string\",\r\n FUNCTION = \"function\",\r\n ASCENDING = \"asc\",\r\n CREATE = \"create\",\r\n READ = \"read\",\r\n UPDATE = \"update\",\r\n DESTROY = \"destroy\",\r\n CHANGE = \"change\",\r\n SYNC = \"sync\",\r\n GET = \"get\",\r\n ERROR = \"error\",\r\n REQUESTSTART = \"requestStart\",\r\n PROGRESS = \"progress\",\r\n REQUESTEND = \"requestEnd\",\r\n ITEMSLOADED = \"itemsLoaded\",\r\n ITEMLOAD = \"itemLoad\",\r\n crud = [CREATE, READ, UPDATE, DESTROY],\r\n identity = function(o) { return o; },\r\n getter = kendo.getter,\r\n stringify = kendo.stringify,\r\n math = Math,\r\n push = [].push,\r\n join = [].join,\r\n pop = [].pop,\r\n splice = [].splice,\r\n shift = [].shift,\r\n slice = [].slice,\r\n unshift = [].unshift,\r\n toString = {}.toString,\r\n stableSort = kendo.support.stableSort,\r\n dateRegExp = /^\\/Date\\((.*?)\\)\\/$/,\r\n objectKeys = [];\r\n\r\n var ObservableArray = Observable.extend({\r\n init: function(array, type) {\r\n var that = this;\r\n\r\n that.type = type || ObservableObject;\r\n\r\n Observable.fn.init.call(that);\r\n\r\n that.length = array.length;\r\n\r\n that.wrapAll(array, that);\r\n that._loadPromises = [];\r\n that._loadedNodes = [];\r\n },\r\n\r\n at: function(index) {\r\n return this[index];\r\n },\r\n\r\n toJSON: function(serializeFunctions) {\r\n var idx, length = this.length, value, json = new Array(length);\r\n\r\n for (idx = 0; idx < length; idx++) {\r\n value = this[idx];\r\n\r\n if (value instanceof ObservableObject) {\r\n value = value.toJSON(serializeFunctions);\r\n }\r\n\r\n json[idx] = value;\r\n }\r\n\r\n return json;\r\n },\r\n\r\n parent: noop,\r\n\r\n wrapAll: function(source, target) {\r\n var that = this,\r\n idx,\r\n length,\r\n parent = function() {\r\n return that;\r\n };\r\n\r\n target = target || [];\r\n\r\n for (idx = 0, length = source.length; idx < length; idx++) {\r\n target[idx] = that.wrap(source[idx], parent);\r\n }\r\n\r\n return target;\r\n },\r\n\r\n wrap: function(object, parent) {\r\n var that = this,\r\n observable;\r\n\r\n if (object !== null && toString.call(object) === \"[object Object]\") {\r\n observable = object instanceof that.type || object instanceof Model;\r\n\r\n if (!observable) {\r\n object = object instanceof ObservableObject ? object.toJSON() : object;\r\n object = new that.type(object);\r\n }\r\n\r\n object.parent = parent;\r\n\r\n object.bind(CHANGE, function(e) {\r\n var isGroup = object.hasOwnProperty(\"hasSubgroups\");\r\n that.trigger(CHANGE, {\r\n field: e.field,\r\n node: e.node,\r\n index: e.index,\r\n items: e.items || [this],\r\n action: e.node || isGroup ? (e.action || \"itemloaded\") : \"itemchange\"\r\n });\r\n });\r\n\r\n object.bind(ITEMLOAD, function(e) {\r\n that._loadPromises.push(e.promise);\r\n that._loading = true;\r\n\r\n e.promise.done(function() {\r\n that._loadedNodes.push(e.node);\r\n var index = that._loadPromises.indexOf(e.promise);\r\n that._loadPromises.splice(index, 1);\r\n\r\n if (!that._loadPromises.length) {\r\n that._loading = false;\r\n that.trigger(ITEMSLOADED, { collection: that, nodes: that._loadedNodes });\r\n that._loadedNodes = [];\r\n }\r\n });\r\n });\r\n }\r\n\r\n return object;\r\n },\r\n\r\n loading: function() {\r\n return this._loading;\r\n },\r\n\r\n push: function() {\r\n var index = this.length,\r\n items = this.wrapAll(arguments),\r\n result;\r\n\r\n result = push.apply(this, items);\r\n\r\n if (!this.omitChangeEvent) {\r\n this.trigger(CHANGE, {\r\n action: \"add\",\r\n index: index,\r\n items: items\r\n });\r\n }\r\n\r\n return result;\r\n },\r\n\r\n slice: slice,\r\n\r\n sort: [].sort,\r\n\r\n join: join,\r\n\r\n pop: function() {\r\n var length = this.length, result = pop.apply(this);\r\n\r\n if (length) {\r\n this.trigger(CHANGE, {\r\n action: \"remove\",\r\n index: length - 1,\r\n items: [result]\r\n });\r\n }\r\n\r\n return result;\r\n },\r\n\r\n splice: function(index, howMany, item) {\r\n var items = this.wrapAll(slice.call(arguments, 2)),\r\n result, i, len;\r\n\r\n result = splice.apply(this, [index, howMany].concat(items));\r\n\r\n if (result.length) {\r\n if (!this.omitChangeEvent) {\r\n this.trigger(CHANGE, {\r\n action: \"remove\",\r\n index: index,\r\n items: this.omitCache && this.omitCache.length ? result.concat(this.omitCache) : result\r\n });\r\n this.omitCache = [];\r\n }\r\n\r\n for (i = 0, len = result.length; i < len; i++) {\r\n if (result[i] && result[i].children) {\r\n result[i].unbind(CHANGE);\r\n }\r\n }\r\n }\r\n\r\n if (item) {\r\n if (!this.omitChangeEvent) {\r\n this.trigger(CHANGE, {\r\n action: \"add\",\r\n index: index,\r\n items: items\r\n });\r\n }\r\n }\r\n return result;\r\n },\r\n\r\n shift: function() {\r\n var length = this.length, result = shift.apply(this);\r\n\r\n if (length) {\r\n this.trigger(CHANGE, {\r\n action: \"remove\",\r\n index: 0,\r\n items: [result]\r\n });\r\n }\r\n\r\n return result;\r\n },\r\n\r\n unshift: function() {\r\n var items = this.wrapAll(arguments),\r\n result;\r\n\r\n result = unshift.apply(this, items);\r\n\r\n this.trigger(CHANGE, {\r\n action: \"add\",\r\n index: 0,\r\n items: items\r\n });\r\n\r\n return result;\r\n },\r\n\r\n indexOf: function(item) {\r\n var that = this,\r\n idx,\r\n length;\r\n\r\n for (idx = 0, length = that.length; idx < length; idx++) {\r\n if (that[idx] === item) {\r\n return idx;\r\n }\r\n }\r\n return -1;\r\n },\r\n\r\n forEach: function(callback, thisArg) {\r\n var idx = 0;\r\n var length = this.length;\r\n var context = thisArg || window;\r\n\r\n for (; idx < length; idx++) {\r\n callback.call(context, this[idx], idx, this);\r\n }\r\n },\r\n\r\n map: function(callback, thisArg) {\r\n var idx = 0;\r\n var result = [];\r\n var length = this.length;\r\n var context = thisArg || window;\r\n\r\n for (; idx < length; idx++) {\r\n result[idx] = callback.call(context, this[idx], idx, this);\r\n }\r\n\r\n return result;\r\n },\r\n\r\n reduce: function(callback) {\r\n var idx = 0,\r\n result,\r\n length = this.length;\r\n\r\n if (arguments.length == 2) {\r\n result = arguments[1];\r\n } else if (idx < length) {\r\n result = this[idx++];\r\n }\r\n\r\n for (; idx < length; idx++) {\r\n result = callback(result, this[idx], idx, this);\r\n }\r\n\r\n return result;\r\n },\r\n\r\n reduceRight: function(callback) {\r\n var idx = this.length - 1,\r\n result;\r\n\r\n if (arguments.length == 2) {\r\n result = arguments[1];\r\n } else if (idx > 0) {\r\n result = this[idx--];\r\n }\r\n\r\n for (; idx >= 0; idx--) {\r\n result = callback(result, this[idx], idx, this);\r\n }\r\n\r\n return result;\r\n },\r\n\r\n filter: function(callback, thisArg) {\r\n var idx = 0;\r\n var result = [];\r\n var item;\r\n var length = this.length;\r\n var context = thisArg || window;\r\n\r\n for (; idx < length; idx++) {\r\n item = this[idx];\r\n if (callback.call(context, item, idx, this)) {\r\n result[result.length] = item;\r\n }\r\n }\r\n\r\n return result;\r\n },\r\n\r\n find: function(callback, thisArg) {\r\n var idx = 0;\r\n var item;\r\n var length = this.length;\r\n var context = thisArg || window;\r\n\r\n for (; idx < length; idx++) {\r\n item = this[idx];\r\n if (callback.call(context, item, idx, this)) {\r\n return item;\r\n }\r\n }\r\n },\r\n\r\n every: function(callback, thisArg) {\r\n var idx = 0;\r\n var item;\r\n var length = this.length;\r\n var context = thisArg || window;\r\n\r\n for (; idx < length; idx++) {\r\n item = this[idx];\r\n if (!callback.call(context, item, idx, this)) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n },\r\n\r\n some: function(callback, thisArg) {\r\n var idx = 0;\r\n var item;\r\n var length = this.length;\r\n var context = thisArg || window;\r\n\r\n for (; idx < length; idx++) {\r\n item = this[idx];\r\n if (callback.call(context, item, idx, this)) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n },\r\n\r\n // non-standard collection methods\r\n remove: function(item) {\r\n var idx = this.indexOf(item);\r\n\r\n if (idx !== -1) {\r\n this.splice(idx, 1);\r\n }\r\n },\r\n\r\n empty: function() {\r\n this.splice(0, this.length);\r\n }\r\n });\r\n\r\n // Polyfill for Symbol.iterator\r\n if (typeof Symbol !== \"undefined\" && Symbol.iterator && !ObservableArray.prototype[Symbol.iterator]) {\r\n ObservableArray.prototype[Symbol.iterator] = [][Symbol.iterator];\r\n }\r\n\r\n var LazyObservableArray = ObservableArray.extend({\r\n init: function(data, type, events) {\r\n var parentFn = function() { return this; };\r\n\r\n Observable.fn.init.call(this);\r\n\r\n this.type = type || ObservableObject;\r\n\r\n if (events) {\r\n this._events = events;\r\n }\r\n\r\n for (var idx = 0; idx < data.length; idx++) {\r\n this[idx] = data[idx];\r\n }\r\n\r\n this.length = idx;\r\n this._parent = parentFn.bind(this);\r\n this._loadPromises = [];\r\n this._loadedNodes = [];\r\n },\r\n at: function(index) {\r\n var item = this[index];\r\n\r\n if (!(item instanceof this.type)) {\r\n item = this[index] = this.wrap(item, this._parent);\r\n } else {\r\n item.parent = this._parent;\r\n }\r\n\r\n return item;\r\n }\r\n });\r\n\r\n function eventHandler(context, type, field, prefix) {\r\n return function(e) {\r\n var event = {}, key;\r\n\r\n for (key in e) {\r\n event[key] = e[key];\r\n }\r\n\r\n if (prefix) {\r\n event.field = field + \".\" + e.field;\r\n } else {\r\n event.field = field;\r\n }\r\n\r\n if (type == CHANGE && context._notifyChange) {\r\n context._notifyChange(event);\r\n }\r\n\r\n context.trigger(type, event);\r\n };\r\n }\r\n\r\n function isPrimitiveType(value) {\r\n return (typeof value === \"object\" && Object.getPrototypeOf(value) === Object.getPrototypeOf({}))\r\n || Object.getPrototypeOf(value) === Object.getPrototypeOf(new Date())\r\n || typeof value !== \"object\";\r\n }\r\n\r\n function ownKeys(value, ignoreObjectKeys) {\r\n var props = [];\r\n var protoKeys = [];\r\n var keys, filteredObjectKeys;\r\n\r\n value = value || {};\r\n\r\n if (!isPrimitiveType(value)) {\r\n protoKeys = Object.getOwnPropertyNames(Object.getPrototypeOf(value)).filter(f => f.indexOf(\"__\") !== 0);\r\n }\r\n\r\n keys = Object.getOwnPropertyNames(value).concat(protoKeys);\r\n\r\n filteredObjectKeys = objectKeys.filter(function(key) {\r\n return keys.indexOf(key) < 0;\r\n });\r\n\r\n while (value) {\r\n Object.getOwnPropertyNames(value).forEach(function(prop) {\r\n if (props.indexOf(prop) === -1 && (!ignoreObjectKeys || filteredObjectKeys.indexOf(prop) < 0)) {\r\n props.push(prop);\r\n }\r\n });\r\n value = Object.getPrototypeOf(value);\r\n }\r\n\r\n return props;\r\n }\r\n\r\n objectKeys = ownKeys({}, false);\r\n\r\n var ObservableObject = Observable.extend({\r\n init: function(value) {\r\n var that = this,\r\n member,\r\n keys = ownKeys(value, true),\r\n parent = function() {\r\n return that;\r\n };\r\n\r\n Observable.fn.init.call(this);\r\n\r\n this._handlers = {};\r\n\r\n keys.forEach(function(field) {\r\n member = value[field];\r\n\r\n if (typeof member === \"object\" && member && !member.getTime && field.charAt(0) != \"_\") {\r\n member = that.wrap(member, field, parent);\r\n }\r\n\r\n that[field] = member;\r\n });\r\n\r\n that.uid = kendo.guid();\r\n },\r\n\r\n shouldSerialize: function(field, serializeFunctions) {\r\n return this.hasOwnProperty(field) && field !== \"_handlers\" && field !== \"_events\" && ((serializeFunctions && serializeFunctions[field]) || typeof this[field] !== FUNCTION) && field !== \"uid\";\r\n },\r\n\r\n forEach: function(f) {\r\n for (var i in this) {\r\n if (this.shouldSerialize(i)) {\r\n f(this[i], i);\r\n }\r\n }\r\n },\r\n\r\n toJSON: function(serializeFunctions) {\r\n var result = {}, value, field;\r\n\r\n for (field in this) {\r\n if (this.shouldSerialize(field, serializeFunctions)) {\r\n value = this[field];\r\n\r\n if (value instanceof ObservableObject || value instanceof ObservableArray) {\r\n value = value.toJSON(serializeFunctions);\r\n }\r\n\r\n result[field] = value;\r\n }\r\n }\r\n\r\n return result;\r\n },\r\n\r\n get: function(field) {\r\n var that = this, result;\r\n\r\n that.trigger(GET, { field: field });\r\n\r\n if (field === \"this\") {\r\n result = that;\r\n } else {\r\n result = kendo.getter(field, true)(that);\r\n }\r\n\r\n return result;\r\n },\r\n\r\n _set: function(field, value) {\r\n var that = this;\r\n var composite = field.indexOf(\".\") >= 0;\r\n\r\n if (composite) {\r\n var paths = field.split(\".\"),\r\n path = \"\";\r\n\r\n while (paths.length > 1) {\r\n path += paths.shift();\r\n var obj = kendo.getter(path, true)(that);\r\n if (obj instanceof ObservableObject) {\r\n obj.set(paths.join(\".\"), value);\r\n return composite;\r\n }\r\n path += \".\";\r\n }\r\n }\r\n\r\n kendo.setter(field)(that, value);\r\n\r\n return composite;\r\n },\r\n\r\n set: function(field, value) {\r\n var that = this,\r\n isSetPrevented = false,\r\n composite = field.indexOf(\".\") >= 0,\r\n current = kendo.getter(field, true)(that);\r\n\r\n if (current !== value) {\r\n if (current instanceof Observable && this._handlers[field]) {\r\n if (this._handlers[field].get) {\r\n current.unbind(GET, this._handlers[field].get);\r\n }\r\n current.unbind(CHANGE, this._handlers[field].change);\r\n }\r\n\r\n isSetPrevented = that.trigger(\"set\", { field: field, value: value });\r\n\r\n if (!isSetPrevented) {\r\n if (!composite) {\r\n value = that.wrap(value, field, function() { return that; });\r\n }\r\n if ((!that._set(field, value) || field.indexOf(\"(\") >= 0 || field.indexOf(\"[\") >= 0)) {\r\n that.trigger(CHANGE, { field: field });\r\n }\r\n }\r\n }\r\n\r\n return isSetPrevented;\r\n },\r\n\r\n parent: noop,\r\n\r\n wrap: function(object, field, parent) {\r\n var that = this;\r\n var get;\r\n var change;\r\n var type = toString.call(object);\r\n\r\n if (object != null && (type === \"[object Object]\" || type === \"[object Array]\")) {\r\n var isObservableArray = object instanceof ObservableArray;\r\n var isDataSource = object instanceof DataSource;\r\n\r\n if (type === \"[object Object]\" && !isDataSource && !isObservableArray) {\r\n if (!(object instanceof ObservableObject)) {\r\n object = new ObservableObject(object);\r\n }\r\n\r\n get = eventHandler(that, GET, field, true);\r\n object.bind(GET, get);\r\n change = eventHandler(that, CHANGE, field, true);\r\n object.bind(CHANGE, change);\r\n\r\n that._handlers[field] = { get: get, change: change };\r\n } else if (type === \"[object Array]\" || isObservableArray || isDataSource) {\r\n if (!isObservableArray && !isDataSource) {\r\n object = new ObservableArray(object);\r\n }\r\n\r\n change = eventHandler(that, CHANGE, field, false);\r\n\r\n object.bind(CHANGE, change);\r\n\r\n that._handlers[field] = { change: change };\r\n }\r\n\r\n object.parent = parent;\r\n }\r\n\r\n return object;\r\n }\r\n });\r\n\r\n function equal(x, y) {\r\n if (x === y) {\r\n return true;\r\n }\r\n\r\n var xtype = kendo.type(x), ytype = kendo.type(y), field;\r\n\r\n if (xtype !== ytype) {\r\n return false;\r\n }\r\n\r\n if (xtype === \"date\") {\r\n return x.getTime() === y.getTime();\r\n }\r\n\r\n if (xtype !== \"object\" && xtype !== \"array\") {\r\n return false;\r\n }\r\n\r\n for (field in x) {\r\n if (!equal(x[field], y[field])) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n var parsers = {\r\n \"number\": function(value) {\r\n if (typeof value === STRING && value.toLowerCase() === \"null\") {\r\n return null;\r\n }\r\n return kendo.parseFloat(value);\r\n },\r\n\r\n \"date\": function(value) {\r\n if (typeof value === STRING && value.toLowerCase() === \"null\") {\r\n return null;\r\n }\r\n return kendo.parseDate(value);\r\n },\r\n\r\n \"boolean\": function(value) {\r\n if (typeof value === STRING) {\r\n if (value.toLowerCase() === \"null\") {\r\n return null;\r\n } else {\r\n return value.toLowerCase() === \"true\";\r\n }\r\n }\r\n return value != null ? !!value : value;\r\n },\r\n\r\n \"string\": function(value) {\r\n if (typeof value === STRING && value.toLowerCase() === \"null\") {\r\n return null;\r\n }\r\n return value != null ? (value + \"\") : value;\r\n },\r\n\r\n \"default\": function(value) {\r\n return value;\r\n }\r\n };\r\n\r\n var defaultValues = {\r\n \"string\": \"\",\r\n \"number\": 0,\r\n \"date\": new Date(),\r\n \"boolean\": false,\r\n \"default\": \"\"\r\n };\r\n\r\n function getFieldByName(obj, name) {\r\n var field,\r\n fieldName;\r\n\r\n for (fieldName in obj) {\r\n field = obj[fieldName];\r\n if (isPlainObject(field) && field.field && field.field === name) {\r\n return field;\r\n } else if (field === name) {\r\n return field;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n var Model = ObservableObject.extend({\r\n init: function(data) {\r\n var that = this;\r\n\r\n if (!data || $.isEmptyObject(data)) {\r\n data = $.extend({}, that.defaults, data);\r\n\r\n if (that._initializers) {\r\n for (var idx = 0; idx < that._initializers.length; idx++) {\r\n var name = that._initializers[idx];\r\n data[name] = that.defaults[name]();\r\n }\r\n }\r\n }\r\n\r\n ObservableObject.fn.init.call(that, data);\r\n\r\n that.dirty = false;\r\n that.dirtyFields = {};\r\n\r\n if (that.idField) {\r\n that.id = that.get(that.idField);\r\n\r\n if (that.id === undefined$1) {\r\n that.id = that._defaultId;\r\n }\r\n }\r\n },\r\n\r\n shouldSerialize: function(field) {\r\n return ObservableObject.fn.shouldSerialize.call(this, field) &&\r\n field !== \"uid\" && !(this.idField !== \"id\" && field === \"id\") &&\r\n field !== \"dirty\" && field !== \"dirtyFields\" && field !== \"_accessors\";\r\n },\r\n\r\n _parse: function(field, value) {\r\n var that = this,\r\n fieldName = field,\r\n fields = (that.fields || {}),\r\n parse;\r\n\r\n field = fields[field];\r\n if (!field) {\r\n field = getFieldByName(fields, fieldName);\r\n }\r\n if (field) {\r\n parse = field.parse;\r\n if (!parse && field.type) {\r\n parse = parsers[field.type.toLowerCase()];\r\n }\r\n }\r\n\r\n return parse ? parse(value) : value;\r\n },\r\n\r\n _notifyChange: function(e) {\r\n var action = e.action;\r\n\r\n if (action == \"add\" || action == \"remove\") {\r\n this.dirty = true;\r\n this.dirtyFields[e.field] = true;\r\n }\r\n },\r\n\r\n editable: function(field) {\r\n field = (this.fields || {})[field];\r\n return field ? field.editable !== false : true;\r\n },\r\n\r\n set: function(field, value) {\r\n var that = this;\r\n var dirty = that.dirty;\r\n\r\n if (that.editable(field)) {\r\n value = that._parse(field, value);\r\n\r\n if (!equal(value, that.get(field))) {\r\n that.dirty = true;\r\n that.dirtyFields[field] = true;\r\n\r\n if (ObservableObject.fn.set.call(that, field, value) && !dirty) {\r\n that.dirty = dirty;\r\n\r\n if (!that.dirty) {\r\n that.dirtyFields[field] = false;\r\n }\r\n }\r\n } else {\r\n that.trigger(\"equalSet\", { field: field, value: value });\r\n }\r\n }\r\n },\r\n\r\n accept: function(data) {\r\n var that = this,\r\n parent = function() { return that; },\r\n field;\r\n\r\n for (field in data) {\r\n var value = data[field];\r\n\r\n if (field.charAt(0) != \"_\") {\r\n value = that.wrap(data[field], field, parent);\r\n }\r\n\r\n that._set(field, value);\r\n }\r\n\r\n if (that.idField) {\r\n that.id = that.get(that.idField);\r\n }\r\n\r\n that.dirty = false;\r\n that.dirtyFields = {};\r\n },\r\n\r\n isNew: function() {\r\n return this.id === this._defaultId;\r\n }\r\n });\r\n\r\n Model.define = function(base, options) {\r\n if (options === undefined$1) {\r\n options = base;\r\n base = Model;\r\n }\r\n\r\n var model,\r\n proto = extend({ defaults: {} }, options),\r\n name,\r\n field,\r\n type,\r\n value,\r\n idx,\r\n length,\r\n fields = {},\r\n originalName,\r\n id = proto.id,\r\n functionFields = [];\r\n\r\n if (id) {\r\n proto.idField = id;\r\n }\r\n\r\n if (proto.id) {\r\n delete proto.id;\r\n }\r\n\r\n if (id) {\r\n proto.defaults[id] = proto._defaultId = \"\";\r\n }\r\n\r\n if (toString.call(proto.fields) === \"[object Array]\") {\r\n for (idx = 0, length = proto.fields.length; idx < length; idx++) {\r\n field = proto.fields[idx];\r\n if (typeof field === STRING) {\r\n fields[field] = {};\r\n } else if (field.field) {\r\n fields[field.field] = field;\r\n }\r\n }\r\n proto.fields = fields;\r\n }\r\n\r\n for (name in proto.fields) {\r\n field = proto.fields[name];\r\n type = field.type || \"default\";\r\n value = null;\r\n originalName = name;\r\n\r\n name = typeof (field.field) === STRING ? field.field : name;\r\n\r\n if (!field.nullable || field.defaultValue) {\r\n value = proto.defaults[originalName !== name ? originalName : name] = field.defaultValue !== undefined$1 ? field.defaultValue : defaultValues[type.toLowerCase()];\r\n\r\n if (typeof value === \"function\") {\r\n functionFields.push(name);\r\n }\r\n }\r\n\r\n if (options.id === name) {\r\n proto._defaultId = value;\r\n }\r\n\r\n proto.defaults[originalName !== name ? originalName : name] = value;\r\n\r\n if ($.isPlainObject(field)) {\r\n field.parse = field.parse || parsers[type];\r\n } else {\r\n field = {\r\n parse: parsers[type]\r\n };\r\n }\r\n }\r\n\r\n if (functionFields.length > 0) {\r\n proto._initializers = functionFields;\r\n }\r\n\r\n model = base.extend(proto);\r\n model.define = function(options) {\r\n return Model.define(model, options);\r\n };\r\n\r\n if (proto.fields) {\r\n model.fields = proto.fields;\r\n model.idField = proto.idField;\r\n }\r\n\r\n return model;\r\n };\r\n\r\n var Comparer = {\r\n selector: function(field) {\r\n return isFunction(field) ? field : getter(field);\r\n },\r\n\r\n compare: function(field) {\r\n var selector = this.selector(field);\r\n return function(a, b) {\r\n a = selector(a);\r\n b = selector(b);\r\n\r\n if (a == null && b == null) {\r\n return 0;\r\n }\r\n\r\n if (a == null) {\r\n return -1;\r\n }\r\n\r\n if (b == null) {\r\n return 1;\r\n }\r\n\r\n if (a.localeCompare) {\r\n return a.localeCompare(b);\r\n }\r\n\r\n return a > b ? 1 : (a < b ? -1 : 0);\r\n };\r\n },\r\n\r\n create: function(sort) {\r\n var compare = sort.compare || this.compare(sort.field);\r\n\r\n if (sort.dir == \"desc\") {\r\n return function(a, b) {\r\n return compare(b, a, true);\r\n };\r\n }\r\n\r\n return compare;\r\n },\r\n\r\n combine: function(comparers) {\r\n return function(a, b) {\r\n var result = comparers[0](a, b),\r\n idx,\r\n length;\r\n\r\n for (idx = 1, length = comparers.length; idx < length; idx ++) {\r\n result = result || comparers[idx](a, b);\r\n }\r\n\r\n return result;\r\n };\r\n }\r\n };\r\n\r\n var StableComparer = extend({}, Comparer, {\r\n asc: function(field) {\r\n var selector = this.selector(field);\r\n return function(a, b) {\r\n var valueA = selector(a);\r\n var valueB = selector(b);\r\n\r\n if (valueA && valueA.getTime && valueB && valueB.getTime) {\r\n valueA = valueA.getTime();\r\n valueB = valueB.getTime();\r\n }\r\n\r\n if (valueA === valueB) {\r\n return a.__position - b.__position;\r\n }\r\n\r\n if (valueA == null) {\r\n return -1;\r\n }\r\n\r\n if (valueB == null) {\r\n return 1;\r\n }\r\n\r\n if (valueA.localeCompare) {\r\n return valueA.localeCompare(valueB);\r\n }\r\n\r\n return valueA > valueB ? 1 : -1;\r\n };\r\n },\r\n\r\n desc: function(field) {\r\n var selector = this.selector(field);\r\n return function(a, b) {\r\n var valueA = selector(a);\r\n var valueB = selector(b);\r\n\r\n if (valueA && valueA.getTime && valueB && valueB.getTime) {\r\n valueA = valueA.getTime();\r\n valueB = valueB.getTime();\r\n }\r\n\r\n if (valueA === valueB) {\r\n return a.__position - b.__position;\r\n }\r\n\r\n if (valueA == null) {\r\n return 1;\r\n }\r\n\r\n if (valueB == null) {\r\n return -1;\r\n }\r\n\r\n if (valueB.localeCompare) {\r\n return valueB.localeCompare(valueA);\r\n }\r\n\r\n return valueA < valueB ? 1 : -1;\r\n };\r\n },\r\n create: function(sort) {\r\n return this[sort.dir](sort.field);\r\n }\r\n });\r\n\r\n map = function(array, callback) {\r\n var idx, length = array.length, result = new Array(length);\r\n\r\n for (idx = 0; idx < length; idx++) {\r\n result[idx] = callback(array[idx], idx, array);\r\n }\r\n\r\n return result;\r\n };\r\n\r\n var operators = (function() {\r\n\r\n function quote(str) {\r\n if (typeof str == \"string\") {\r\n str = str.replace(/[\\r\\n]+/g, \"\");\r\n }\r\n return JSON.stringify(str);\r\n }\r\n\r\n function textOp(impl) {\r\n return function(a, b, ignore, accentFoldingFiltering) {\r\n b += \"\";\r\n if (ignore) {\r\n a = \"(\" + a + \" + '').toString()\" + ((accentFoldingFiltering) ? \".toLocaleLowerCase('\" + accentFoldingFiltering + \"')\" : \".toLowerCase()\");\r\n b = ((accentFoldingFiltering) ? b.toLocaleLowerCase(accentFoldingFiltering) : b.toLowerCase());\r\n }\r\n return impl(a, quote(b), ignore);\r\n };\r\n }\r\n\r\n function operator(op, a, b, ignore, accentFoldingFiltering) {\r\n if (b != null) {\r\n if (typeof b === STRING) {\r\n var date = dateRegExp.exec(b);\r\n if (date) {\r\n b = new Date(+date[1]);\r\n } else if (ignore) {\r\n b = quote(((accentFoldingFiltering) ? b.toLocaleLowerCase(accentFoldingFiltering) : b.toLowerCase()));\r\n a = \"((\" + a + \" || '')+'')\" + ((accentFoldingFiltering) ? \".toLocaleLowerCase('\" + accentFoldingFiltering + \"')\" : \".toLowerCase()\");\r\n } else {\r\n b = quote(b);\r\n }\r\n }\r\n\r\n if (b.getTime) {\r\n //b looks like a Date\r\n a = \"(\" + a + \"&&\" + a + \".getTime?\" + a + \".getTime():\" + a + \")\";\r\n b = b.getTime();\r\n }\r\n }\r\n\r\n return a + \" \" + op + \" \" + b;\r\n }\r\n\r\n function getMatchRegexp(pattern) {\r\n // take a pattern, as supported by Excel match filter, and\r\n // convert it to the equivalent JS regular expression.\r\n // Excel patterns support:\r\n //\r\n // * - match any sequence of characters\r\n // ? - match a single character\r\n //\r\n // to match a literal * or ?, they must be prefixed by a tilde (~)\r\n for (var rx = \"/^\", esc = false, i = 0; i < pattern.length; ++i) {\r\n var ch = pattern.charAt(i);\r\n if (esc) {\r\n rx += \"\\\\\" + ch;\r\n } else if (ch == \"~\") {\r\n esc = true;\r\n continue;\r\n } else if (ch == \"*\") {\r\n rx += \".*\";\r\n } else if (ch == \"?\") {\r\n rx += \".\";\r\n } else if (\".+^$()[]{}|\\\\/\\n\\r\\u2028\\u2029\\xA0\".indexOf(ch) >= 0) {\r\n rx += \"\\\\\" + ch;\r\n } else {\r\n rx += ch;\r\n }\r\n esc = false;\r\n }\r\n return rx + \"$/\";\r\n }\r\n\r\n return {\r\n quote: function(value) {\r\n if (value && value.getTime) {\r\n return \"new Date(\" + value.getTime() + \")\";\r\n }\r\n return quote(value);\r\n },\r\n eq: function(a, b, ignore, accentFoldingFiltering) {\r\n return operator(\"==\", a, b, ignore, accentFoldingFiltering);\r\n },\r\n neq: function(a, b, ignore, accentFoldingFiltering) {\r\n return operator(\"!=\", a, b, ignore, accentFoldingFiltering);\r\n },\r\n gt: function(a, b, ignore) {\r\n return operator(\">\", a, b, ignore);\r\n },\r\n gte: function(a, b, ignore) {\r\n return operator(\">=\", a, b, ignore);\r\n },\r\n lt: function(a, b, ignore) {\r\n return operator(\"<\", a, b, ignore);\r\n },\r\n lte: function(a, b, ignore) {\r\n return operator(\"<=\", a, b, ignore);\r\n },\r\n startswith: textOp(function(a, b) {\r\n return a + \".lastIndexOf(\" + b + \", 0) == 0\";\r\n }),\r\n doesnotstartwith: textOp(function(a, b) {\r\n return a + \".lastIndexOf(\" + b + \", 0) == -1\";\r\n }),\r\n endswith: textOp(function(a, b) {\r\n var n = b ? b.length - 2 : 0;\r\n return a + \".indexOf(\" + b + \", \" + a + \".length - \" + n + \") >= 0\";\r\n }),\r\n doesnotendwith: textOp(function(a, b) {\r\n var n = b ? b.length - 2 : 0;\r\n return a + \".indexOf(\" + b + \", \" + a + \".length - \" + n + \") < 0\";\r\n }),\r\n contains: textOp(function(a, b) {\r\n return a + \".indexOf(\" + b + \") >= 0\";\r\n }),\r\n doesnotcontain: textOp(function(a, b) {\r\n return a + \".indexOf(\" + b + \") == -1\";\r\n }),\r\n matches: textOp(function(a, b) {\r\n b = b.substring(1, b.length - 1);\r\n return getMatchRegexp(b) + \".test(\" + a + \")\";\r\n }),\r\n doesnotmatch: textOp(function(a, b) {\r\n b = b.substring(1, b.length - 1);\r\n return \"!\" + getMatchRegexp(b) + \".test(\" + a + \")\";\r\n }),\r\n isempty: function(a) {\r\n return a + \" === ''\";\r\n },\r\n isnotempty: function(a) {\r\n return a + \" !== ''\";\r\n },\r\n isnull: function(a) {\r\n return \"(\" + a + \" == null)\";\r\n },\r\n isnotnull: function(a) {\r\n return \"(\" + a + \" != null)\";\r\n },\r\n isnullorempty: function(a) {\r\n return \"(\" + a + \" === null) || (\" + a + \" === '')\";\r\n },\r\n isnotnullorempty: function(a) {\r\n return \"(\" + a + \" !== null) && (\" + a + \" !== '')\";\r\n }\r\n };\r\n })();\r\n\r\n function Query(data) {\r\n this.data = data || [];\r\n }\r\n\r\n // Continue to support legacy unsafe-eval for the spreadsheet\r\n Query.filterExpr = function(expression, options = { noEval: false }) {\r\n if (options.noEval) {\r\n // using no-eval for most cases\r\n return filterExprNoEval(expression);\r\n }\r\n\r\n var expressions = [],\r\n logic = { and: \" && \", or: \" || \" },\r\n idx,\r\n length,\r\n filter,\r\n expr,\r\n fieldFunctions = [],\r\n operatorFunctions = [],\r\n field,\r\n operator,\r\n filters = expression.filters;\r\n\r\n for (idx = 0, length = filters.length; idx < length; idx++) {\r\n filter = filters[idx];\r\n field = filter.field;\r\n operator = filter.operator;\r\n\r\n if (filter.filters) {\r\n expr = Query.filterExpr(filter);\r\n //Nested function fields or operators - update their index e.g. __o[0] -> __o[1]\r\n filter = expr.expression\r\n .replace(/__o\\[(\\d+)\\]/g, function(match, index) {\r\n index = +index;\r\n return \"__o[\" + (operatorFunctions.length + index) + \"]\";\r\n })\r\n .replace(/__f\\[(\\d+)\\]/g, function(match, index) {\r\n index = +index;\r\n return \"__f[\" + (fieldFunctions.length + index) + \"]\";\r\n });\r\n\r\n operatorFunctions.push.apply(operatorFunctions, expr.operators);\r\n fieldFunctions.push.apply(fieldFunctions, expr.fields);\r\n } else {\r\n if (typeof field === FUNCTION) {\r\n expr = \"__f[\" + fieldFunctions.length + \"](d)\";\r\n fieldFunctions.push(field);\r\n } else {\r\n expr = kendo.expr(field);\r\n }\r\n\r\n if (typeof operator === FUNCTION) {\r\n filter = \"__o[\" + operatorFunctions.length + \"](\" + expr + \", \" + operators.quote(filter.value) + \")\";\r\n operatorFunctions.push(operator);\r\n } else {\r\n filter = operators[(operator || \"eq\").toLowerCase()](expr, filter.value, filter.ignoreCase !== undefined$1 ? filter.ignoreCase : true, expression.accentFoldingFiltering);\r\n }\r\n }\r\n\r\n expressions.push(filter);\r\n }\r\n\r\n return { expression: \"(\" + expressions.join(logic[expression.logic]) + \")\", fields: fieldFunctions, operators: operatorFunctions };\r\n };\r\n\r\n function normalizeSort(field, dir) {\r\n if (field) {\r\n var descriptor = typeof field === STRING ? { field: field, dir: dir } : field,\r\n descriptors = isArray(descriptor) ? descriptor : (descriptor !== undefined$1 ? [descriptor] : []);\r\n\r\n return grep(descriptors, function(d) { return !!d.dir; });\r\n }\r\n }\r\n\r\n function sortFields(sorts, dir) {\r\n var sortObject = {};\r\n\r\n if (sorts) {\r\n var descriptor = typeof sorts === STRING ? { field: sorts, dir: dir } : sorts,\r\n descriptors = isArray(descriptor) ? descriptor : (descriptor !== undefined$1 ? [descriptor] : []);\r\n\r\n for (var i = 0; i < descriptors.length; i++) {\r\n sortObject[descriptors[i].field] = { dir: descriptors[i].dir, index: i + 1 };\r\n }\r\n }\r\n\r\n return sortObject;\r\n }\r\n\r\n var operatorMap = {\r\n \"==\": \"eq\",\r\n equals: \"eq\",\r\n isequalto: \"eq\",\r\n equalto: \"eq\",\r\n equal: \"eq\",\r\n \"!=\": \"neq\",\r\n ne: \"neq\",\r\n notequals: \"neq\",\r\n isnotequalto: \"neq\",\r\n notequalto: \"neq\",\r\n notequal: \"neq\",\r\n \"<\": \"lt\",\r\n islessthan: \"lt\",\r\n lessthan: \"lt\",\r\n less: \"lt\",\r\n \"<=\": \"lte\",\r\n le: \"lte\",\r\n islessthanorequalto: \"lte\",\r\n lessthanequal: \"lte\",\r\n \">\": \"gt\",\r\n isgreaterthan: \"gt\",\r\n greaterthan: \"gt\",\r\n greater: \"gt\",\r\n \">=\": \"gte\",\r\n isgreaterthanorequalto: \"gte\",\r\n greaterthanequal: \"gte\",\r\n ge: \"gte\",\r\n notsubstringof: \"doesnotcontain\",\r\n isnull: \"isnull\",\r\n isempty: \"isempty\",\r\n isnotempty: \"isnotempty\"\r\n };\r\n\r\n function normalizeOperator(expression) {\r\n var idx,\r\n length,\r\n filter,\r\n operator,\r\n filters = expression.filters;\r\n\r\n if (filters) {\r\n for (idx = 0, length = filters.length; idx < length; idx++) {\r\n filter = filters[idx];\r\n operator = filter.operator;\r\n\r\n if (operator && typeof operator === STRING) {\r\n filter.operator = operatorMap[operator.toLowerCase()] || operator;\r\n }\r\n\r\n normalizeOperator(filter);\r\n }\r\n }\r\n }\r\n\r\n function normalizeFilter(expression) {\r\n if (expression && !isEmptyObject(expression)) {\r\n if (isArray(expression) || !expression.filters) {\r\n expression = {\r\n logic: \"and\",\r\n filters: isArray(expression) ? expression : [expression]\r\n };\r\n }\r\n\r\n normalizeOperator(expression);\r\n\r\n return expression;\r\n }\r\n }\r\n\r\n Query.normalizeFilter = normalizeFilter;\r\n\r\n function compareDescriptor(f1, f2) {\r\n if (f1.logic || f2.logic) {\r\n return false;\r\n }\r\n\r\n return f1.field === f2.field && f1.value === f2.value && f1.operator === f2.operator;\r\n }\r\n\r\n function normalizeDescriptor(filter) {\r\n filter = filter || {};\r\n\r\n if (isEmptyObject(filter)) {\r\n return { logic: \"and\", filters: [] };\r\n }\r\n\r\n return normalizeFilter(filter);\r\n }\r\n\r\n function fieldComparer(a, b) {\r\n if (b.logic || (a.field > b.field)) {\r\n return 1;\r\n } else if (a.field < b.field) {\r\n return -1;\r\n } else {\r\n return 0;\r\n }\r\n }\r\n\r\n function compareFilters(expr1, expr2) {\r\n expr1 = normalizeDescriptor(expr1);\r\n expr2 = normalizeDescriptor(expr2);\r\n\r\n if (expr1.logic !== expr2.logic) {\r\n return false;\r\n }\r\n\r\n var f1, f2;\r\n var filters1 = (expr1.filters || []).slice();\r\n var filters2 = (expr2.filters || []).slice();\r\n\r\n if (filters1.length !== filters2.length) {\r\n return false;\r\n }\r\n\r\n filters1 = filters1.sort(fieldComparer);\r\n filters2 = filters2.sort(fieldComparer);\r\n\r\n for (var idx = 0; idx < filters1.length; idx++) {\r\n f1 = filters1[idx];\r\n f2 = filters2[idx];\r\n\r\n if (f1.logic && f2.logic) {\r\n if (!compareFilters(f1, f2)) {\r\n return false;\r\n }\r\n } else if (!compareDescriptor(f1, f2)) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n Query.compareFilters = compareFilters;\r\n\r\n function normalizeAggregate(expressions) {\r\n return isArray(expressions) ? expressions : [expressions];\r\n }\r\n\r\n function normalizeGroup(field, dir, compare, skipItemSorting) {\r\n var descriptor = typeof field === STRING ? { field: field, dir: dir, compare: compare, skipItemSorting: skipItemSorting } : field,\r\n descriptors = isArray(descriptor) ? descriptor : (descriptor !== undefined$1 ? [descriptor] : []);\r\n\r\n return map(descriptors, function(d) {\r\n return {\r\n field: d.field,\r\n dir: d.dir || \"asc\",\r\n aggregates: d.aggregates,\r\n compare: d.compare,\r\n skipItemSorting: d.skipItemSorting\r\n };\r\n });\r\n }\r\n\r\n function normalizeGroupWithoutCompare(field, dir, compare) {\r\n var descriptors = normalizeGroup(field, dir, compare);\r\n\r\n for (var i = 0; i < descriptors.length; i++) {\r\n delete descriptors[i].compare;\r\n }\r\n\r\n return descriptors;\r\n }\r\n\r\n function anyGroupDescriptorHasCompare(groupDescriptors) {\r\n var descriptors = isArray(groupDescriptors) ? groupDescriptors : [groupDescriptors];\r\n\r\n for (var i = 0; i < descriptors.length; i++) {\r\n if (descriptors[i] && isFunction(descriptors[i].compare)) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n Query.prototype = {\r\n toArray: function() {\r\n return this.data;\r\n },\r\n range: function(index, count) {\r\n return new Query(this.data.slice(index, index + count));\r\n },\r\n skip: function(count) {\r\n return new Query(this.data.slice(count));\r\n },\r\n take: function(count) {\r\n return new Query(this.data.slice(0, count));\r\n },\r\n select: function(selector) {\r\n return new Query(map(this.data, selector));\r\n },\r\n order: function(selector, dir, inPlace) {\r\n var sort = { dir: dir };\r\n\r\n if (selector) {\r\n if (selector.compare) {\r\n sort.compare = selector.compare;\r\n } else {\r\n sort.field = selector;\r\n }\r\n }\r\n\r\n if (inPlace) {\r\n return new Query(this.data.sort(Comparer.create(sort)));\r\n }\r\n\r\n return new Query(this.data.slice(0).sort(Comparer.create(sort)));\r\n },\r\n orderBy: function(selector, inPlace) {\r\n return this.order(selector, \"asc\", inPlace);\r\n },\r\n orderByDescending: function(selector, inPlace) {\r\n return this.order(selector, \"desc\", inPlace);\r\n },\r\n sort: function(field, dir, comparer, inPlace) {\r\n var idx,\r\n length,\r\n descriptors = normalizeSort(field, dir),\r\n comparers = [];\r\n\r\n comparer = comparer || Comparer;\r\n\r\n if (descriptors.length) {\r\n for (idx = 0, length = descriptors.length; idx < length; idx++) {\r\n comparers.push(comparer.create(descriptors[idx]));\r\n }\r\n\r\n return this.orderBy({ compare: comparer.combine(comparers) }, inPlace);\r\n }\r\n\r\n return this;\r\n },\r\n\r\n filter: function(expressions) {\r\n var compiled,\r\n data = this.data,\r\n result = [];\r\n\r\n expressions = normalizeFilter(expressions);\r\n\r\n if (!expressions || expressions.filters.length === 0) {\r\n return this;\r\n }\r\n\r\n compiled = Query.filterExpr(expressions, { noEval: true });\r\n\r\n result = data.filter(compiled);\r\n return new Query(result);\r\n },\r\n\r\n group: function(descriptors, allData, options) {\r\n descriptors = normalizeGroup(descriptors || []);\r\n allData = allData || this.data;\r\n\r\n var that = this,\r\n result = new Query(that.data),\r\n descriptor;\r\n\r\n var getFilteredData = (g, data) => {\r\n data = data || new Query(allData).filter([{\r\n field: g.field,\r\n operator: \"eq\",\r\n value: g.value,\r\n ignoreCase: false\r\n }]);\r\n\r\n return data;\r\n };\r\n\r\n if (descriptors.length > 0) {\r\n descriptor = descriptors[0];\r\n\r\n if (options && options.groupPaging) {\r\n result = new Query(allData).groupAllData(descriptor, allData).select(function(group) {\r\n var cachedFilteredData;\r\n\r\n var items = descriptors.length > 1 ? new Query(group.items).group(descriptors.slice(1), getFilteredData(group, cachedFilteredData).toArray(), options).toArray() : group.items;\r\n\r\n return {\r\n field: group.field,\r\n value: group.value,\r\n hasSubgroups: descriptors.length > 1,\r\n items: items,\r\n aggregates: descriptor.aggregates && descriptor.aggregates.length ? getFilteredData(group, cachedFilteredData).aggregate(descriptor.aggregates) : {},\r\n uid: kendo.guid(),\r\n itemCount: items.length,\r\n subgroupCount: items.length\r\n };\r\n });\r\n\r\n } else {\r\n result = result.groupBy(descriptor).select(function(group) {\r\n var cachedFilteredData;\r\n return {\r\n field: group.field,\r\n value: group.value,\r\n items: descriptors.length > 1 ? new Query(group.items).group(descriptors.slice(1), getFilteredData(group, cachedFilteredData).toArray()).toArray() : group.items,\r\n hasSubgroups: descriptors.length > 1,\r\n aggregates: descriptor.aggregates && descriptor.aggregates.length ? getFilteredData(group, cachedFilteredData).aggregate(descriptor.aggregates) : {},\r\n };\r\n });\r\n }\r\n }\r\n return result;\r\n },\r\n\r\n groupBy: function(descriptor) {\r\n var that = this;\r\n\r\n if (isEmptyObject(descriptor) || !this.data.length) {\r\n return new Query([]);\r\n }\r\n\r\n var field = descriptor.field,\r\n sorted = descriptor.skipItemSorting ? this.data : this._sortForGrouping(field, descriptor.dir || \"asc\"),\r\n accessor = kendo.accessor(field),\r\n item,\r\n groupValue = accessor.get(sorted[0], field),\r\n group = {\r\n field: field,\r\n value: groupValue,\r\n items: []\r\n },\r\n currentValue,\r\n idx,\r\n len,\r\n result = [group];\r\n\r\n for (idx = 0, len = sorted.length; idx < len; idx++) {\r\n item = sorted[idx];\r\n currentValue = accessor.get(item, field);\r\n if (!groupValueComparer(groupValue, currentValue)) {\r\n groupValue = currentValue;\r\n group = {\r\n field: field,\r\n value: groupValue,\r\n items: []\r\n };\r\n result.push(group);\r\n }\r\n group.items.push(item);\r\n }\r\n\r\n result = that._sortGroups(result, descriptor);\r\n\r\n return new Query(result);\r\n },\r\n\r\n groupAllData: function(descriptor, allData) {\r\n if (isEmptyObject(descriptor) || this.data && !this.data.length) {\r\n return new Query([]);\r\n }\r\n\r\n var field = descriptor.field,\r\n sorted = descriptor.skipItemSorting ? allData : new Query(allData).sort(field, descriptor.dir || \"asc\", StableComparer).toArray(),\r\n accessor = kendo.accessor(field),\r\n item,\r\n groupValue = accessor.get(sorted[0], field),\r\n group = {\r\n field: field,\r\n value: groupValue,\r\n items: []\r\n },\r\n currentValue,\r\n idx,\r\n len,\r\n result = [group];\r\n\r\n for (idx = 0, len = sorted.length; idx < len; idx++) {\r\n item = sorted[idx];\r\n currentValue = accessor.get(item, field);\r\n if (!groupValueComparer(groupValue, currentValue)) {\r\n groupValue = currentValue;\r\n group = {\r\n field: field,\r\n value: groupValue,\r\n items: []\r\n };\r\n result.push(group);\r\n }\r\n group.items.push(item);\r\n }\r\n\r\n result = this._sortGroups(result, descriptor);\r\n\r\n return new Query(result);\r\n },\r\n\r\n _sortForGrouping: function(field, dir) {\r\n var idx, length,\r\n data = this.data;\r\n\r\n if (!stableSort) {\r\n for (idx = 0, length = data.length; idx < length; idx++) {\r\n data[idx].__position = idx;\r\n }\r\n\r\n data = new Query(data).sort(field, dir, StableComparer).toArray();\r\n\r\n for (idx = 0, length = data.length; idx < length; idx++) {\r\n delete data[idx].__position;\r\n }\r\n return data;\r\n }\r\n\r\n return this.sort(field, dir).toArray();\r\n },\r\n\r\n _sortGroups: function(groups, descriptor) {\r\n var result = groups;\r\n\r\n if (descriptor && isFunction(descriptor.compare)) {\r\n result = new Query(result).order({ compare: descriptor.compare }, descriptor.dir || ASCENDING).toArray();\r\n }\r\n\r\n return result;\r\n },\r\n\r\n aggregate: function(aggregates) {\r\n var idx,\r\n len,\r\n result = {},\r\n state = {};\r\n\r\n if (aggregates && aggregates.length) {\r\n for (idx = 0, len = this.data.length; idx < len; idx++) {\r\n calculateAggregate(result, aggregates, this.data[idx], idx, len, state);\r\n }\r\n }\r\n return result;\r\n }\r\n };\r\n\r\n function groupValueComparer(a, b) {\r\n if (a && a.getTime && b && b.getTime) {\r\n return a.getTime() === b.getTime();\r\n }\r\n return a === b;\r\n }\r\n\r\n function calculateAggregate(accumulator, aggregates, item, index, length, state) {\r\n aggregates = aggregates || [];\r\n var idx,\r\n aggr,\r\n functionName,\r\n len = aggregates.length;\r\n\r\n for (idx = 0; idx < len; idx++) {\r\n aggr = aggregates[idx];\r\n functionName = aggr.aggregate;\r\n var field = aggr.field;\r\n accumulator[field] = accumulator[field] || {};\r\n state[field] = state[field] || {};\r\n state[field][functionName] = state[field][functionName] || {};\r\n accumulator[field][functionName] = functions[functionName.toLowerCase()](accumulator[field][functionName], item, kendo.accessor(field), index, length, state[field][functionName]);\r\n }\r\n }\r\n\r\n var functions = {\r\n sum: function(accumulator, item, accessor) {\r\n var value = accessor.get(item);\r\n\r\n if (!isNumber(accumulator)) {\r\n accumulator = value;\r\n } else if (isNumber(value)) {\r\n accumulator += value;\r\n }\r\n\r\n return accumulator;\r\n },\r\n count: function(accumulator) {\r\n return (accumulator || 0) + 1;\r\n },\r\n average: function(accumulator, item, accessor, index, length, state) {\r\n var value = accessor.get(item);\r\n\r\n if (state.count === undefined$1) {\r\n state.count = 0;\r\n }\r\n\r\n if (!isNumber(accumulator)) {\r\n accumulator = value;\r\n } else if (isNumber(value)) {\r\n accumulator += value;\r\n }\r\n\r\n if (isNumber(value)) {\r\n state.count++;\r\n }\r\n\r\n if (index == length - 1 && isNumber(accumulator)) {\r\n accumulator = accumulator / state.count;\r\n }\r\n return accumulator;\r\n },\r\n max: function(accumulator, item, accessor) {\r\n var value = accessor.get(item);\r\n\r\n if (!isNumber(accumulator) && !isDate(accumulator)) {\r\n accumulator = value;\r\n }\r\n\r\n if (accumulator < value && (isNumber(value) || isDate(value))) {\r\n accumulator = value;\r\n }\r\n return accumulator;\r\n },\r\n min: function(accumulator, item, accessor) {\r\n var value = accessor.get(item);\r\n\r\n if (!isNumber(accumulator) && !isDate(accumulator)) {\r\n accumulator = value;\r\n }\r\n\r\n if (accumulator > value && (isNumber(value) || isDate(value))) {\r\n accumulator = value;\r\n }\r\n return accumulator;\r\n }\r\n };\r\n\r\n function isNumber(val) {\r\n return typeof val === \"number\" && !isNaN(val);\r\n }\r\n\r\n function isDate(val) {\r\n return val && val.getTime;\r\n }\r\n\r\n function toJSON(array) {\r\n var idx, length = array.length, result = new Array(length);\r\n\r\n for (idx = 0; idx < length; idx++) {\r\n result[idx] = array[idx].toJSON();\r\n }\r\n\r\n return result;\r\n }\r\n\r\n Query.normalizeGroup = normalizeGroup;\r\n Query.normalizeSort = normalizeSort;\r\n\r\n Query.process = function(data, options, inPlace) {\r\n options = options || {};\r\n\r\n var group = options.group;\r\n var customGroupSort = anyGroupDescriptorHasCompare(normalizeGroup(group || []));\r\n var query = new Query(data),\r\n groupDescriptorsWithoutCompare = normalizeGroupWithoutCompare(group || []),\r\n normalizedSort = normalizeSort(options.sort || []),\r\n sort = customGroupSort ? normalizedSort : groupDescriptorsWithoutCompare.concat(normalizedSort),\r\n groupDescriptorsWithoutSort,\r\n total,\r\n filterCallback = options.filterCallback,\r\n filter = options.filter,\r\n skip = options.skip,\r\n take = options.take;\r\n\r\n if (sort && inPlace) {\r\n query = query.sort(sort, undefined$1, undefined$1, inPlace);\r\n }\r\n\r\n if (filter) {\r\n query = query.filter(filter);\r\n\r\n if (filterCallback) {\r\n query = filterCallback(query);\r\n }\r\n\r\n total = query.toArray().length;\r\n }\r\n\r\n if (sort) {\r\n if (!inPlace) {\r\n query = query.sort(sort);\r\n }\r\n\r\n if (group) {\r\n data = query.toArray();\r\n }\r\n }\r\n\r\n if (customGroupSort) {\r\n query = query.group(group, data, options);\r\n\r\n if (skip !== undefined$1 && take !== undefined$1 && !options.groupPaging) {\r\n query = new Query(flatGroups(query.toArray())).range(skip, take);\r\n\r\n groupDescriptorsWithoutSort = map(groupDescriptorsWithoutCompare, function(groupDescriptor) {\r\n return extend({}, groupDescriptor, {\r\n skipItemSorting: true\r\n });\r\n });\r\n\r\n query = query.group(groupDescriptorsWithoutSort, data, options);\r\n }\r\n } else {\r\n if (skip !== undefined$1 && take !== undefined$1) {\r\n total = query.data.length;\r\n\r\n if (skip + take > total && options.virtual) {\r\n skip -= skip + take - total;\r\n skip = skip < 0 ? 0 : skip;\r\n }\r\n query = query.range(skip, take);\r\n }\r\n\r\n if (group && (!isEmptyObject(group) || group.length !== 0)) {\r\n query = query.group(group, data, options);\r\n }\r\n }\r\n\r\n return {\r\n total: total,\r\n data: query.toArray()\r\n };\r\n };\r\n\r\n var LocalTransport = Class.extend({\r\n init: function(options) {\r\n this.data = options.data;\r\n },\r\n\r\n read: function(options) {\r\n options.success(this.data);\r\n },\r\n update: function(options) {\r\n options.success(options.data);\r\n },\r\n create: function(options) {\r\n options.success(options.data);\r\n },\r\n destroy: function(options) {\r\n options.success(options.data);\r\n }\r\n });\r\n\r\n var RemoteTransport = Class.extend( {\r\n init: function(options) {\r\n var that = this, parameterMap;\r\n\r\n options = that.options = extend({}, that.options, options);\r\n\r\n each(crud, function(index, type) {\r\n if (typeof options[type] === STRING) {\r\n options[type] = {\r\n url: options[type]\r\n };\r\n }\r\n });\r\n\r\n that.cache = options.cache ? Cache.create(options.cache) : {\r\n find: noop,\r\n add: noop\r\n };\r\n\r\n parameterMap = options.parameterMap;\r\n\r\n if (options.submit) {\r\n that.submit = options.submit;\r\n }\r\n\r\n if (isFunction(options.push)) {\r\n that.push = options.push;\r\n }\r\n\r\n if (!that.push) {\r\n that.push = identity;\r\n }\r\n\r\n that.parameterMap = isFunction(parameterMap) ? parameterMap : function(options) {\r\n var result = {};\r\n\r\n each(options, function(option, value) {\r\n if (option in parameterMap) {\r\n option = parameterMap[option];\r\n if (isPlainObject(option)) {\r\n value = option.value(value);\r\n option = option.key;\r\n }\r\n }\r\n\r\n result[option] = value;\r\n });\r\n\r\n return result;\r\n };\r\n },\r\n\r\n options: {\r\n parameterMap: identity\r\n },\r\n\r\n create: function(options) {\r\n return ajax(this.setup(options, CREATE));\r\n },\r\n\r\n read: function(options) {\r\n var that = this,\r\n success,\r\n error,\r\n result,\r\n cache = that.cache;\r\n\r\n options = that.setup(options, READ);\r\n\r\n success = options.success || noop;\r\n error = options.error || noop;\r\n\r\n result = cache.find(options.data);\r\n\r\n if (result !== undefined$1) {\r\n success(result);\r\n } else {\r\n options.success = function(result) {\r\n cache.add(options.data, result);\r\n\r\n success(result);\r\n };\r\n\r\n $.ajax(options);\r\n }\r\n },\r\n\r\n update: function(options) {\r\n return ajax(this.setup(options, UPDATE));\r\n },\r\n\r\n destroy: function(options) {\r\n return ajax(this.setup(options, DESTROY));\r\n },\r\n\r\n setup: function(options, type) {\r\n options = options || {};\r\n\r\n var that = this,\r\n parameters,\r\n operation = that.options[type],\r\n data = isFunction(operation.data) ? operation.data(options.data) : operation.data;\r\n\r\n options = extend(true, {}, operation, options);\r\n parameters = extend(true, {}, data, options.data);\r\n\r\n options.data = that.parameterMap(parameters, type);\r\n\r\n if (isFunction(options.url)) {\r\n options.url = options.url(parameters);\r\n }\r\n\r\n return options;\r\n }\r\n });\r\n\r\n var Cache = Class.extend({\r\n init: function() {\r\n this._store = {};\r\n },\r\n add: function(key, data) {\r\n if (key !== undefined$1) {\r\n this._store[stringify(key)] = data;\r\n }\r\n },\r\n find: function(key) {\r\n return this._store[stringify(key)];\r\n },\r\n clear: function() {\r\n this._store = {};\r\n },\r\n remove: function(key) {\r\n delete this._store[stringify(key)];\r\n }\r\n });\r\n\r\n Cache.create = function(options) {\r\n var store = {\r\n \"inmemory\": function() { return new Cache(); }\r\n };\r\n\r\n if (isPlainObject(options) && isFunction(options.find)) {\r\n return options;\r\n }\r\n\r\n if (options === true) {\r\n return new Cache();\r\n }\r\n\r\n return store[options]();\r\n };\r\n\r\n function serializeRecords(data, getters, modelInstance, originalFieldNames, fieldNames) {\r\n var record,\r\n getter,\r\n originalName,\r\n idx,\r\n setters = {},\r\n length;\r\n\r\n for (idx = 0, length = data.length; idx < length; idx++) {\r\n record = data[idx];\r\n for (getter in getters) {\r\n originalName = fieldNames[getter];\r\n\r\n if (originalName && originalName !== getter) {\r\n if (!setters[originalName]) {\r\n setters[originalName] = kendo.setter(originalName);\r\n }\r\n setters[originalName](record, getters[getter](record));\r\n delete record[getter];\r\n }\r\n }\r\n }\r\n }\r\n\r\n function convertRecords(data, getters, modelInstance, originalFieldNames, fieldNames) {\r\n var record,\r\n getter,\r\n originalName,\r\n idx,\r\n length;\r\n\r\n for (idx = 0, length = data.length; idx < length; idx++) {\r\n record = data[idx];\r\n for (getter in getters) {\r\n record[getter] = modelInstance._parse(getter, getters[getter](record));\r\n\r\n originalName = fieldNames[getter];\r\n if (originalName && originalName !== getter) {\r\n delete record[originalName];\r\n }\r\n }\r\n }\r\n }\r\n\r\n function convertGroup(data, getters, modelInstance, originalFieldNames, fieldNames) {\r\n var record,\r\n idx,\r\n fieldName,\r\n length;\r\n\r\n for (idx = 0, length = data.length; idx < length; idx++) {\r\n record = data[idx];\r\n\r\n fieldName = originalFieldNames[record.field];\r\n if (fieldName && fieldName != record.field) {\r\n record.field = fieldName;\r\n }\r\n\r\n record.value = modelInstance._parse(record.field, record.value);\r\n\r\n if (record.items) {\r\n if (record.hasSubgroups) {\r\n convertGroup(record.items, getters, modelInstance, originalFieldNames, fieldNames);\r\n } else {\r\n convertRecords(record.items, getters, modelInstance, originalFieldNames, fieldNames);\r\n }\r\n }\r\n }\r\n }\r\n\r\n function wrapDataAccess(originalFunction, model, converter, getters, originalFieldNames, fieldNames) {\r\n return function(data) {\r\n data = originalFunction(data);\r\n\r\n return wrapDataAccessBase(model, converter, getters, originalFieldNames, fieldNames)(data);\r\n };\r\n }\r\n\r\n function wrapDataAccessBase(model, converter, getters, originalFieldNames, fieldNames) {\r\n return function(data) {\r\n\r\n if (data && !isEmptyObject(getters)) {\r\n if (toString.call(data) !== \"[object Array]\" && !(data instanceof ObservableArray)) {\r\n data = [data];\r\n }\r\n\r\n converter(data, getters, new model(), originalFieldNames, fieldNames);\r\n }\r\n\r\n return data || [];\r\n };\r\n }\r\n\r\n var DataReader = Class.extend({\r\n init: function(schema) {\r\n var that = this, member, get, model, base;\r\n\r\n schema = schema || {};\r\n\r\n for (member in schema) {\r\n get = schema[member];\r\n\r\n that[member] = typeof get === STRING ? getter(get) : get;\r\n }\r\n\r\n base = schema.modelBase || Model;\r\n\r\n if (isPlainObject(that.model)) {\r\n that.model = model = base.define(that.model);\r\n }\r\n\r\n var dataFunction = that.data.bind(that);\r\n\r\n that._dataAccessFunction = dataFunction;\r\n\r\n if (that.model) {\r\n var groupsFunction = that.groups.bind(that),\r\n serializeFunction = that.serialize.bind(that),\r\n originalFieldNames = {},\r\n getters = {},\r\n serializeGetters = {},\r\n fieldNames = {},\r\n shouldSerialize = false,\r\n fieldName,\r\n name;\r\n\r\n model = that.model;\r\n\r\n if (model.fields) {\r\n each(model.fields, function(field, value) {\r\n var fromName;\r\n\r\n fieldName = field;\r\n\r\n if (isPlainObject(value) && value.field) {\r\n fieldName = value.field;\r\n } else if (typeof value === STRING) {\r\n fieldName = value;\r\n }\r\n\r\n if (isPlainObject(value) && value.from) {\r\n fromName = value.from;\r\n }\r\n\r\n shouldSerialize = shouldSerialize || (fromName && fromName !== field) || fieldName !== field;\r\n name = fromName || fieldName;\r\n getters[field] = name.indexOf(\".\") !== -1 ? getter(name, true) : getter(name);\r\n serializeGetters[field] = getter(field);\r\n originalFieldNames[fromName || fieldName] = field;\r\n fieldNames[field] = fromName || fieldName;\r\n });\r\n\r\n if (!schema.serialize && shouldSerialize) {\r\n that.serialize = wrapDataAccess(serializeFunction, model, serializeRecords, serializeGetters, originalFieldNames, fieldNames);\r\n }\r\n }\r\n\r\n that._dataAccessFunction = dataFunction;\r\n that._wrapDataAccessBase = wrapDataAccessBase(model, convertRecords, getters, originalFieldNames, fieldNames);\r\n that.data = wrapDataAccess(dataFunction, model, convertRecords, getters, originalFieldNames, fieldNames);\r\n that.groups = wrapDataAccess(groupsFunction, model, convertGroup, getters, originalFieldNames, fieldNames);\r\n }\r\n },\r\n errors: function(data) {\r\n return data ? data.errors : null;\r\n },\r\n parse: identity,\r\n data: identity,\r\n total: function(data) {\r\n return data.length;\r\n },\r\n groups: identity,\r\n aggregates: function() {\r\n return {};\r\n },\r\n serialize: function(data) {\r\n return data;\r\n }\r\n });\r\n\r\n function fillLastGroup(originalGroup, newGroup) {\r\n var currOriginal;\r\n var currentNew;\r\n\r\n if (newGroup.items && newGroup.items.length) {\r\n for (var i = 0; i < newGroup.items.length; i++) {\r\n currOriginal = originalGroup.items[originalGroup.items.length - 1];\r\n currentNew = newGroup.items[i];\r\n if (currOriginal && currentNew) {\r\n if (currOriginal.hasSubgroups && currOriginal.value == currentNew.value) {\r\n fillLastGroup(currOriginal, currentNew);\r\n } else if (currOriginal.field && currOriginal.value == currentNew.value) {\r\n currOriginal.items.omitChangeEvent = true;\r\n currOriginal.items.push.apply(currOriginal.items, currentNew.items);\r\n currOriginal.items.omitChangeEvent = false;\r\n } else {\r\n originalGroup.items.omitChangeEvent = true;\r\n originalGroup.items.push.apply(originalGroup.items, [currentNew]);\r\n originalGroup.items.omitChangeEvent = false;\r\n }\r\n } else if (currentNew) {\r\n originalGroup.items.omitChangeEvent = true;\r\n originalGroup.items.push.apply(originalGroup.items, [currentNew]);\r\n originalGroup.items.omitChangeEvent = false;\r\n }\r\n }\r\n }\r\n }\r\n function mergeGroups(target, dest, skip, take) {\r\n var group,\r\n idx = 0,\r\n items;\r\n\r\n while (dest.length && take) {\r\n group = dest[idx];\r\n items = group.items;\r\n\r\n var length = items.length;\r\n\r\n if (target && target.field === group.field && target.value === group.value) {\r\n if (target.hasSubgroups && target.items.length) {\r\n mergeGroups(target.items[target.items.length - 1], group.items, skip, take);\r\n } else {\r\n items = items.slice(skip, skip + take);\r\n target.items = target.items.concat(items);\r\n }\r\n dest.splice(idx--, 1);\r\n } else if (group.hasSubgroups && items.length) {\r\n mergeGroups(group, items, skip, take);\r\n if (!group.items.length) {\r\n dest.splice(idx--, 1);\r\n }\r\n } else {\r\n items = items.slice(skip, skip + take);\r\n group.items = items;\r\n\r\n if (!group.items.length) {\r\n dest.splice(idx--, 1);\r\n }\r\n }\r\n\r\n if (items.length === 0) {\r\n skip -= length;\r\n } else {\r\n skip = 0;\r\n take -= items.length;\r\n }\r\n\r\n if (++idx >= dest.length) {\r\n break;\r\n }\r\n }\r\n\r\n if (idx < dest.length) {\r\n dest.splice(idx, dest.length - idx);\r\n }\r\n }\r\n\r\n function flatGroups(groups, indexFunction) {\r\n var result = [];\r\n var groupsLength = (groups || []).length;\r\n var group;\r\n var items;\r\n var indexFn = isFunction(indexFunction) ? indexFunction : function(array, index) {\r\n return array[index];\r\n };\r\n\r\n for (var groupIndex = 0; groupIndex < groupsLength; groupIndex++) {\r\n group = indexFn(groups, groupIndex);\r\n\r\n if (group.hasSubgroups) {\r\n result = result.concat(flatGroups(group.items));\r\n } else {\r\n items = group.items;\r\n\r\n for (var itemIndex = 0; itemIndex < items.length; itemIndex++) {\r\n result.push(indexFn(items, itemIndex));\r\n }\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n function flattenGroups(data) {\r\n var idx,\r\n result = [],\r\n length,\r\n items,\r\n itemIndex;\r\n\r\n for (idx = 0, length = data.length; idx < length; idx++) {\r\n var group = data.at(idx);\r\n if (group.items) {\r\n if (group.hasSubgroups) {\r\n result = result.concat(flattenGroups(group.items));\r\n } else {\r\n items = group.items;\r\n for (itemIndex = 0; itemIndex < items.length; itemIndex++) {\r\n result.push(items.at(itemIndex));\r\n }\r\n }\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n function wrapGroupItems(data, model) {\r\n var idx, length, group;\r\n if (model) {\r\n for (idx = 0, length = data.length; idx < length; idx++) {\r\n group = data.at(idx);\r\n if (group.items) {\r\n if (group.hasSubgroups) {\r\n wrapGroupItems(group.items, model);\r\n } else {\r\n group.items = new LazyObservableArray(group.items, model, group.items._events);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n function eachGroupItems(data, func) {\r\n for (var idx = 0; idx < data.length; idx++) {\r\n if (data[idx].hasSubgroups) {\r\n if (eachGroupItems(data[idx].items, func)) {\r\n return true;\r\n }\r\n } else if (func(data[idx].items, data[idx])) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n function replaceInRanges(ranges, data, item, observable) {\r\n for (var idx = 0; idx < ranges.length; idx++) {\r\n if (ranges[idx].data === data) {\r\n break;\r\n }\r\n if (replaceInRange(ranges[idx].data, item, observable)) {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n function replaceInRange(items, item, observable) {\r\n for (var idx = 0, length = items.length; idx < length; idx++) {\r\n if (items[idx] && items[idx].hasSubgroups) {\r\n return replaceInRange(items[idx].items, item, observable);\r\n } else if (items[idx] === item || items[idx] === observable) {\r\n items[idx] = observable;\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n function replaceWithObservable(view, data, ranges, type, serverGrouping) {\r\n for (var viewIndex = 0, length = view.length; viewIndex < length; viewIndex++) {\r\n var item = view[viewIndex];\r\n\r\n if (!item || item instanceof type) {\r\n continue;\r\n }\r\n\r\n if (item.hasSubgroups !== undefined$1 && !serverGrouping) {\r\n replaceWithObservable(item.items, data, ranges, type, serverGrouping);\r\n } else {\r\n for (var idx = 0; idx < data.length; idx++) {\r\n if (data[idx] === item) {\r\n view[viewIndex] = data.at(idx);\r\n replaceInRanges(ranges, data, item, view[viewIndex]);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n function removeModel(data, model) {\r\n if (!data) {\r\n return;\r\n }\r\n var length = data.length;\r\n var dataItem;\r\n var idx;\r\n\r\n for (idx = 0; idx < length; idx++) {\r\n dataItem = data[idx];\r\n\r\n if (dataItem.uid && dataItem.uid == model.uid) {\r\n data.splice(idx, 1);\r\n return dataItem;\r\n }\r\n }\r\n }\r\n\r\n function indexOfPristineModel(data, model) {\r\n if (model) {\r\n return indexOf(data, function(item) {\r\n return (item.uid && item.uid == model.uid) || (item[model.idField] === model.id && model.id !== model._defaultId);\r\n });\r\n }\r\n return -1;\r\n }\r\n\r\n function indexOfModel(data, model) {\r\n if (model) {\r\n return indexOf(data, function(item) {\r\n return item.uid == model.uid;\r\n });\r\n }\r\n return -1;\r\n }\r\n\r\n function indexOf(data, comparer) {\r\n var idx, length;\r\n if (!data) {\r\n return;\r\n }\r\n\r\n for (idx = 0, length = data.length; idx < length; idx++) {\r\n if (comparer(data[idx])) {\r\n return idx;\r\n }\r\n }\r\n\r\n return -1;\r\n }\r\n\r\n function fieldNameFromModel(fields, name) {\r\n if (fields && !isEmptyObject(fields)) {\r\n var descriptor = fields[name];\r\n var fieldName;\r\n if (isPlainObject(descriptor)) {\r\n fieldName = descriptor.from || descriptor.field || name;\r\n } else {\r\n fieldName = fields[name] || name;\r\n }\r\n\r\n if (isFunction(fieldName)) {\r\n return name;\r\n }\r\n\r\n return fieldName;\r\n }\r\n return name;\r\n }\r\n\r\n function convertFilterDescriptorsField(descriptor, model) {\r\n var idx,\r\n length,\r\n target = {};\r\n\r\n for (var field in descriptor) {\r\n if (field !== \"filters\") {\r\n target[field] = descriptor[field];\r\n }\r\n }\r\n\r\n if (descriptor.filters) {\r\n target.filters = [];\r\n for (idx = 0, length = descriptor.filters.length; idx < length; idx++) {\r\n target.filters[idx] = convertFilterDescriptorsField(descriptor.filters[idx], model);\r\n }\r\n } else {\r\n target.field = fieldNameFromModel(model.fields, target.field);\r\n }\r\n return target;\r\n }\r\n\r\n function convertDescriptorsField(descriptors, model) {\r\n var idx,\r\n length,\r\n result = [],\r\n target,\r\n descriptor;\r\n\r\n for (idx = 0, length = descriptors.length; idx < length; idx ++) {\r\n target = {};\r\n\r\n descriptor = descriptors[idx];\r\n\r\n for (var field in descriptor) {\r\n target[field] = descriptor[field];\r\n }\r\n\r\n target.field = fieldNameFromModel(model.fields, target.field);\r\n\r\n if (target.aggregates && isArray(target.aggregates)) {\r\n target.aggregates = convertDescriptorsField(target.aggregates, model);\r\n }\r\n result.push(target);\r\n }\r\n return result;\r\n }\r\n\r\n var DataSource = Observable.extend({\r\n init: function(options) {\r\n var that = this, model, data;\r\n\r\n if (options) {\r\n data = options.data;\r\n }\r\n\r\n options = that.options = extend({}, that.options, options);\r\n\r\n that._map = {};\r\n that._prefetch = {};\r\n that._data = [];\r\n that._pristineData = [];\r\n that._ranges = [];\r\n that._view = [];\r\n that._pristineTotal = 0;\r\n that._destroyed = [];\r\n that._pageSize = options.pageSize;\r\n that._page = options.page || (options.pageSize ? 1 : undefined$1);\r\n that._sort = normalizeSort(options.sort);\r\n that._sortFields = sortFields(options.sort);\r\n that._filter = normalizeFilter(options.filter);\r\n that._group = normalizeGroup(options.group);\r\n that._aggregate = options.aggregate;\r\n that._total = options.total;\r\n that._groupPaging = options.groupPaging;\r\n\r\n if (that._groupPaging) {\r\n that._groupsState = {};\r\n }\r\n that._shouldDetachObservableParents = true;\r\n\r\n Observable.fn.init.call(that);\r\n\r\n that.transport = Transport.create(options, data, that);\r\n\r\n if (isFunction(that.transport.push)) {\r\n that.transport.push({\r\n pushCreate: that._pushCreate.bind(that),\r\n pushUpdate: that._pushUpdate.bind(that),\r\n pushDestroy: that._pushDestroy.bind(that)\r\n });\r\n }\r\n\r\n if (options.offlineStorage != null) {\r\n if (typeof options.offlineStorage == \"string\") {\r\n var key = options.offlineStorage;\r\n\r\n that._storage = {\r\n getItem: function() {\r\n return JSON.parse(localStorage.getItem(key));\r\n },\r\n setItem: function(item) {\r\n localStorage.setItem(key, stringify(that.reader.serialize(item)));\r\n }\r\n };\r\n } else {\r\n that._storage = options.offlineStorage;\r\n }\r\n }\r\n\r\n that.reader = new kendo.data.readers[options.schema.type || \"json\" ](options.schema);\r\n\r\n model = that.reader.model || {};\r\n\r\n that._detachObservableParents();\r\n\r\n that._data = that._observe(that._data);\r\n that._online = true;\r\n\r\n that.bind([\"push\", ERROR, CHANGE, REQUESTSTART, SYNC, REQUESTEND, PROGRESS], options);\r\n },\r\n\r\n options: {\r\n data: null,\r\n schema: {\r\n modelBase: Model\r\n },\r\n offlineStorage: null,\r\n serverSorting: false,\r\n serverPaging: false,\r\n serverFiltering: false,\r\n serverGrouping: false,\r\n serverAggregates: false,\r\n batch: false,\r\n inPlaceSort: false\r\n },\r\n\r\n clone: function() {\r\n return this;\r\n },\r\n\r\n online: function(value) {\r\n if (value !== undefined$1) {\r\n if (this._online != value) {\r\n this._online = value;\r\n\r\n if (value) {\r\n return this.sync();\r\n }\r\n }\r\n\r\n return $.Deferred().resolve().promise();\r\n } else {\r\n return this._online;\r\n }\r\n },\r\n\r\n offlineData: function(state) {\r\n if (this.options.offlineStorage == null) {\r\n return null;\r\n }\r\n\r\n if (state !== undefined$1) {\r\n return this._storage.setItem(state);\r\n }\r\n\r\n return this._storage.getItem() || [];\r\n },\r\n\r\n _isGrouped: function() {\r\n var group = this.group() || [];\r\n\r\n return group.length;\r\n },\r\n\r\n _isServerGrouped: function() {\r\n var group = this.group() || [];\r\n\r\n return this.options.serverGrouping && group.length;\r\n },\r\n\r\n _isServerGroupPaged: function() {\r\n return this._isServerGrouped() && this._groupPaging;\r\n },\r\n\r\n _isGroupPaged: function() {\r\n var group = this._group || [];\r\n\r\n return this._groupPaging && group.length;\r\n },\r\n\r\n _pushCreate: function(result) {\r\n this._push(result, \"pushCreate\");\r\n },\r\n\r\n _pushUpdate: function(result) {\r\n this._push(result, \"pushUpdate\");\r\n },\r\n\r\n _pushDestroy: function(result) {\r\n this._push(result, \"pushDestroy\");\r\n },\r\n\r\n _push: function(result, operation) {\r\n var data = this._readData(result);\r\n\r\n if (!data) {\r\n data = result;\r\n }\r\n\r\n this[operation](data);\r\n },\r\n\r\n _flatData: function(data, skip) {\r\n if (data) {\r\n if (this._isServerGrouped()) {\r\n return flattenGroups(data);\r\n }\r\n\r\n if (!skip) {\r\n for (var idx = 0; idx < data.length; idx++) {\r\n data.at(idx);\r\n }\r\n }\r\n }\r\n\r\n return data;\r\n },\r\n\r\n parent: noop,\r\n\r\n get: function(id) {\r\n var idx, length, data = this._flatData(this._data, this.options.useRanges);\r\n\r\n for (idx = 0, length = data.length; idx < length; idx++) {\r\n if (data[idx].id == id) {\r\n return data[idx];\r\n }\r\n }\r\n },\r\n\r\n getByUid: function(id) {\r\n return this._getByUid(id, this._data);\r\n },\r\n\r\n _getByUid: function(id, dataItems) {\r\n var idx, length, data = this._flatData(dataItems, this.options.useRanges);\r\n\r\n if (!data) {\r\n return;\r\n }\r\n\r\n for (idx = 0, length = data.length; idx < length; idx++) {\r\n if (data[idx].uid == id) {\r\n return data[idx];\r\n }\r\n }\r\n },\r\n\r\n indexOf: function(model) {\r\n return indexOfModel(this._data, model);\r\n },\r\n\r\n at: function(index) {\r\n return this._data.at(index);\r\n },\r\n\r\n data: function(value) {\r\n var that = this;\r\n if (value !== undefined$1) {\r\n that._detachObservableParents();\r\n that._data = this._observe(value);\r\n\r\n that._pristineData = value.slice(0);\r\n\r\n that._storeData();\r\n\r\n that._ranges = [];\r\n that.trigger(\"reset\");\r\n that._addRange(that._data);\r\n\r\n that._total = that._data.length;\r\n that._pristineTotal = that._total;\r\n\r\n that._process(that._data);\r\n } else {\r\n if (that._data) {\r\n for (var idx = 0; idx < that._data.length; idx++) {\r\n that._data.at(idx);\r\n }\r\n }\r\n\r\n return that._data;\r\n }\r\n },\r\n\r\n view: function(value) {\r\n if (value === undefined$1) {\r\n return this._view;\r\n } else {\r\n this._view = this._observeView(value);\r\n }\r\n },\r\n\r\n _observeView: function(data) {\r\n var that = this;\r\n replaceWithObservable(data, that._data, that._ranges, that.reader.model || ObservableObject, that._isServerGrouped());\r\n\r\n var view = new LazyObservableArray(data, that.reader.model);\r\n view.parent = function() { return that.parent(); };\r\n return view;\r\n },\r\n\r\n flatView: function() {\r\n var groups = this.group() || [];\r\n\r\n if (groups.length) {\r\n return flattenGroups(this._view);\r\n } else {\r\n return this._view;\r\n }\r\n },\r\n\r\n add: function(model) {\r\n return this.insert(this._data.length, model);\r\n },\r\n\r\n _createNewModel: function(model) {\r\n if (this.reader.model) {\r\n return new this.reader.model(model);\r\n }\r\n\r\n if (model instanceof ObservableObject) {\r\n return model;\r\n }\r\n\r\n return new ObservableObject(model);\r\n },\r\n\r\n insert: function(index, model) {\r\n if (!model) {\r\n model = index;\r\n index = 0;\r\n }\r\n\r\n if (!(model instanceof Model)) {\r\n model = this._createNewModel(model);\r\n }\r\n\r\n if (this._isServerGrouped()) {\r\n this._data.splice(index, 0, this._wrapInEmptyGroup(model));\r\n } else {\r\n this._data.splice(index, 0, model);\r\n }\r\n\r\n this._insertModelInRange(index, model);\r\n\r\n return model;\r\n },\r\n\r\n pushInsert: function(index, items) {\r\n var that = this;\r\n var rangeSpan = that._getCurrentRangeSpan();\r\n\r\n if (!items) {\r\n items = index;\r\n index = 0;\r\n }\r\n\r\n if (!isArray(items)) {\r\n items = [items];\r\n }\r\n\r\n var pushed = [];\r\n var autoSync = this.options.autoSync;\r\n this.options.autoSync = false;\r\n\r\n try {\r\n for (var idx = 0; idx < items.length; idx ++) {\r\n var item = items[idx];\r\n\r\n var result = this.insert(index, item);\r\n\r\n pushed.push(result);\r\n\r\n var pristine = result.toJSON();\r\n\r\n if (this._isServerGrouped()) {\r\n pristine = this._wrapInEmptyGroup(pristine);\r\n }\r\n\r\n this._pristineData.push(pristine);\r\n\r\n if (rangeSpan && rangeSpan.length) {\r\n $(rangeSpan).last()[0].pristineData.push(pristine);\r\n }\r\n\r\n index++;\r\n }\r\n } finally {\r\n this.options.autoSync = autoSync;\r\n }\r\n\r\n if (pushed.length) {\r\n this.trigger(\"push\", {\r\n type: \"create\",\r\n items: pushed\r\n });\r\n }\r\n },\r\n\r\n pushCreate: function(items) {\r\n this.pushInsert(this._data.length, items);\r\n },\r\n\r\n pushUpdate: function(items) {\r\n if (!isArray(items)) {\r\n items = [items];\r\n }\r\n\r\n var pushed = [];\r\n\r\n for (var idx = 0; idx < items.length; idx ++) {\r\n var item = items[idx];\r\n var model = this._createNewModel(item);\r\n\r\n var target = this.get(model.id);\r\n\r\n if (target) {\r\n pushed.push(target);\r\n\r\n target.accept(item);\r\n\r\n target.trigger(CHANGE);\r\n\r\n this._updatePristineForModel(target, item);\r\n } else {\r\n this.pushCreate(item);\r\n }\r\n }\r\n\r\n if (pushed.length) {\r\n this.trigger(\"push\", {\r\n type: \"update\",\r\n items: pushed\r\n });\r\n }\r\n },\r\n\r\n pushDestroy: function(items) {\r\n var pushed = this._removeItems(items);\r\n\r\n if (pushed.length) {\r\n this.trigger(\"push\", {\r\n type: \"destroy\",\r\n items: pushed\r\n });\r\n }\r\n },\r\n\r\n _removeItems: function(itemsToRemove, removePristine) {\r\n if (!isArray(itemsToRemove)) {\r\n itemsToRemove = [itemsToRemove];\r\n }\r\n\r\n var shouldRemovePristine = typeof removePristine !== \"undefined\" ? removePristine : true;\r\n\r\n var destroyed = [];\r\n var autoSync = this.options.autoSync;\r\n this.options.autoSync = false;\r\n try {\r\n for (var idx = 0; idx < itemsToRemove.length; idx ++) {\r\n var item = itemsToRemove[idx];\r\n var model = this._createNewModel(item);\r\n var found = false;\r\n var index = idx;\r\n\r\n this._eachItem(this._data, function(items) {\r\n // Ensure all children of a parent are removed before the change event is triggered.\r\n if (index !== itemsToRemove.length - 1) {\r\n items.omitChangeEvent = true;\r\n items.omitCache = [];\r\n } else {\r\n items.omitChangeEvent = false;\r\n }\r\n\r\n for (var idx = 0; idx < items.length; idx++) {\r\n var item = items.at(idx);\r\n if (item.id === model.id) {\r\n /* When the change event is omitted, certain calculations such as 'total' are broken because only the last item reaches the change handler.\r\n Keep track of all child items that had their change event omitted and when the change is finally triggered, concat them to the result.*/\r\n if (items.omitChangeEvent) {\r\n items.omitCache.push(item);\r\n }\r\n destroyed.push(item);\r\n items.splice(idx, 1);\r\n found = true;\r\n break;\r\n }\r\n }\r\n });\r\n\r\n if (found && shouldRemovePristine) {\r\n this._removePristineForModel(model);\r\n this._destroyed.pop();\r\n }\r\n }\r\n } finally {\r\n this.options.autoSync = autoSync;\r\n }\r\n\r\n return destroyed;\r\n },\r\n\r\n pushMove: function(index, items) {\r\n var pushed = this._moveItems(index, items);\r\n\r\n if (pushed.length) {\r\n this.trigger(\"push\", {\r\n type: \"update\",\r\n items: pushed\r\n });\r\n }\r\n },\r\n\r\n _moveItems: function(index, items) {\r\n if (!isArray(items)) {\r\n items = [items];\r\n }\r\n\r\n var moved = [];\r\n var autoSync = this.options.autoSync;\r\n this.options.autoSync = false;\r\n\r\n try {\r\n for (var i = 0; i < items.length; i ++) {\r\n var item = items[i];\r\n\r\n this._eachItem(this._data, function(dataItems) {\r\n for (var idx = 0; idx < dataItems.length; idx++) {\r\n var dataItem = dataItems.at(idx);\r\n if (dataItem.uid === item.uid) {\r\n moved.push(dataItem);\r\n dataItems.splice(index >= idx ? --index : index, 0, dataItems.splice(idx, 1)[0]);\r\n index++;\r\n break;\r\n }\r\n }\r\n });\r\n }\r\n } finally {\r\n this.options.autoSync = autoSync;\r\n }\r\n\r\n return moved;\r\n },\r\n\r\n remove: function(model) {\r\n var result,\r\n that = this,\r\n hasGroups = that._isServerGrouped();\r\n\r\n if (hasGroups && model.uid && (!model.isNew || !model.isNew())) {\r\n that._pushInDestroyed(model);\r\n }\r\n\r\n this._eachItem(that._data, function(items) {\r\n result = removeModel(items, model);\r\n\r\n if (result && hasGroups) {\r\n return true;\r\n }\r\n });\r\n\r\n this._removeModelFromRanges(model);\r\n\r\n return model;\r\n },\r\n\r\n destroyed: function() {\r\n return this._destroyed;\r\n },\r\n\r\n created: function() {\r\n var idx,\r\n length,\r\n result = [],\r\n data = this._flatData(this._data, this.options.useRanges);\r\n\r\n for (idx = 0, length = data.length; idx < length; idx++) {\r\n if (data[idx].isNew && data[idx].isNew() && !data[idx].notFetched) {\r\n result.push(data[idx]);\r\n }\r\n }\r\n return result;\r\n },\r\n\r\n updated: function() {\r\n var idx,\r\n length,\r\n result = [],\r\n data = this._flatData(this._data, this.options.useRanges);\r\n\r\n for (idx = 0, length = data.length; idx < length; idx++) {\r\n if ((data[idx].isNew && !data[idx].isNew()) && data[idx].dirty) {\r\n result.push(data[idx]);\r\n }\r\n }\r\n return result;\r\n },\r\n\r\n sync: function() {\r\n var that = this,\r\n created = [],\r\n updated = [],\r\n destroyed = that._destroyed;\r\n\r\n var promise = $.Deferred().resolve().promise();\r\n\r\n if (that.online()) {\r\n\r\n if (!that.reader.model) {\r\n return promise;\r\n }\r\n\r\n created = that.created();\r\n updated = that.updated();\r\n\r\n var promises = [];\r\n\r\n if (that.options.batch && that.transport.submit) {\r\n promises = that._sendSubmit(created, updated, destroyed);\r\n } else {\r\n promises.push.apply(promises, that._send(\"create\", created));\r\n promises.push.apply(promises, that._send(\"update\", updated));\r\n promises.push.apply(promises, that._send(\"destroy\", destroyed));\r\n }\r\n\r\n promise = $.when\r\n .apply(null, promises)\r\n .then(function() {\r\n var idx, length, changedItems = [];\r\n\r\n for (idx = 0, length = arguments.length; idx < length; idx++) {\r\n if (arguments[idx]) {\r\n that._accept(arguments[idx]);\r\n changedItems.push(...arguments[idx].models);\r\n }\r\n }\r\n\r\n that._storeData(true);\r\n\r\n that._syncEnd();\r\n\r\n that._change({ action: \"sync\", changedItems: changedItems });\r\n\r\n that.trigger(SYNC);\r\n\r\n if (that._isServerGroupPaged()) {\r\n that.read();\r\n }\r\n });\r\n } else {\r\n that._storeData(true);\r\n\r\n that._syncEnd();\r\n\r\n that._change({ action: \"sync\" });\r\n }\r\n\r\n return promise;\r\n },\r\n\r\n _syncEnd: noop,\r\n\r\n cancelChanges: function(model) {\r\n var that = this;\r\n\r\n if (model instanceof kendo.data.Model) {\r\n that._cancelModel(model);\r\n } else {\r\n that._destroyed = [];\r\n that._detachObservableParents();\r\n that._data = that._observe(that._pristineData);\r\n if (that.options.serverPaging) {\r\n that._total = that._pristineTotal;\r\n }\r\n\r\n that._ranges = [];\r\n that._addRange(that._data, 0);\r\n\r\n that._changesCanceled();\r\n\r\n that._change();\r\n\r\n that._markOfflineUpdatesAsDirty();\r\n\r\n if (that._isServerGrouped()) {\r\n that.read();\r\n }\r\n }\r\n },\r\n\r\n _changesCanceled: noop,\r\n\r\n _markOfflineUpdatesAsDirty: function() {\r\n var that = this;\r\n\r\n if (that.options.offlineStorage != null) {\r\n that._eachItem(that._data, function(items) {\r\n for (var idx = 0; idx < items.length; idx++) {\r\n var item = items.at(idx);\r\n if (item.__state__ == \"update\" || item.__state__ == \"create\") {\r\n item.dirty = true;\r\n }\r\n }\r\n });\r\n }\r\n },\r\n\r\n hasChanges: function() {\r\n var idx,\r\n length,\r\n data = this._flatData(this._data, this.options.useRanges);\r\n\r\n if (this._destroyed.length) {\r\n return true;\r\n }\r\n\r\n for (idx = 0, length = data.length; idx < length; idx++) {\r\n if ((data[idx].isNew && data[idx].isNew()) || data[idx].dirty) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n },\r\n\r\n _accept: function(result) {\r\n var that = this,\r\n models = result.models,\r\n response = result.response,\r\n idx = 0,\r\n serverGroup = that._isServerGrouped(),\r\n pristine = that._pristineData,\r\n type = result.type,\r\n length;\r\n\r\n that.trigger(REQUESTEND, { response: response, type: type });\r\n\r\n if (response && !isEmptyObject(response)) {\r\n response = that.reader.parse(response);\r\n\r\n if (that._handleCustomErrors(response)) {\r\n return;\r\n }\r\n\r\n response = that.reader.data(response);\r\n\r\n if (!isArray(response)) {\r\n response = [response];\r\n }\r\n } else {\r\n response = $.map(models, function(model) { return model.toJSON(); } );\r\n }\r\n\r\n if (type === \"destroy\") {\r\n that._destroyed = [];\r\n }\r\n\r\n for (idx = 0, length = models.length; idx < length; idx++) {\r\n if (type !== \"destroy\") {\r\n models[idx].accept(response[idx]);\r\n\r\n if (type === \"create\") {\r\n pristine.push(serverGroup ? that._wrapInEmptyGroup(models[idx].toJSON()) : response[idx]);\r\n } else if (type === \"update\") {\r\n that._updatePristineForModel(models[idx], response[idx]);\r\n }\r\n } else {\r\n that._removePristineForModel(models[idx]);\r\n }\r\n }\r\n },\r\n\r\n _updatePristineForModel: function(model, values) {\r\n this._executeOnPristineForModel(model, function(index, items) {\r\n kendo.deepExtend(items[index], values);\r\n });\r\n },\r\n\r\n _executeOnPristineForModel: function(model, callback) {\r\n this._eachPristineItem(\r\n function(items) {\r\n var index = indexOfPristineModel(items, model);\r\n if (index > -1) {\r\n callback(index, items);\r\n return true;\r\n }\r\n });\r\n },\r\n\r\n _removePristineForModel: function(model) {\r\n this._executeOnPristineForModel(model, function(index, items) {\r\n items.splice(index, 1);\r\n });\r\n },\r\n\r\n _readData: function(data) {\r\n var read = !this._isServerGrouped() ? this.reader.data : this.reader.groups;\r\n return read.call(this.reader, data);\r\n },\r\n\r\n _eachPristineItem: function(callback) {\r\n var that = this;\r\n var options = that.options;\r\n var rangeSpan = that._getCurrentRangeSpan();\r\n\r\n that._eachItem(that._pristineData, callback);\r\n\r\n if (options.serverPaging && options.useRanges) {\r\n each(rangeSpan, function(i, range) {\r\n that._eachItem(range.pristineData, callback);\r\n });\r\n }\r\n },\r\n\r\n _eachItem: function(data, callback) {\r\n if (data && data.length) {\r\n if (this._isServerGrouped()) {\r\n eachGroupItems(data, callback);\r\n } else {\r\n callback(data);\r\n }\r\n }\r\n },\r\n\r\n _pristineForModel: function(model) {\r\n var pristine,\r\n idx,\r\n callback = function(items) {\r\n idx = indexOfPristineModel(items, model);\r\n if (idx > -1) {\r\n pristine = items[idx];\r\n return true;\r\n }\r\n };\r\n\r\n this._eachPristineItem(callback);\r\n\r\n return pristine;\r\n },\r\n\r\n _cancelModel: function(model) {\r\n var that = this;\r\n var pristine = this._pristineForModel(model);\r\n\r\n this._eachItem(this._data, function(items) {\r\n var idx = indexOfModel(items, model);\r\n if (idx >= 0) {\r\n if (pristine && (!model.isNew() || pristine.__state__)) {\r\n items[idx].accept(pristine);\r\n\r\n if (pristine.__state__ == \"update\") {\r\n items[idx].dirty = true;\r\n }\r\n\r\n } else {\r\n that._modelCanceled(model);\r\n\r\n items.splice(idx, 1);\r\n\r\n that._removeModelFromRanges(model);\r\n }\r\n }\r\n });\r\n },\r\n\r\n _modelCanceled: noop,\r\n\r\n _submit: function(promises, data) {\r\n var that = this;\r\n\r\n that.trigger(REQUESTSTART, { type: \"submit\" });\r\n\r\n that.trigger(PROGRESS);\r\n\r\n that.transport.submit(extend({\r\n success: function(response, type) {\r\n var promise = $.grep(promises, function(x) {\r\n return x.type == type;\r\n })[0];\r\n\r\n if (promise) {\r\n promise.resolve({\r\n response: response,\r\n models: promise.models,\r\n type: type\r\n });\r\n }\r\n },\r\n error: function(response, status, error) {\r\n for (var idx = 0; idx < promises.length; idx++) {\r\n promises[idx].reject(response);\r\n }\r\n\r\n that.error(response, status, error);\r\n }\r\n }, data));\r\n },\r\n\r\n _sendSubmit: function(created, updated, destroyed) {\r\n var that = this,\r\n promises = [];\r\n\r\n if (that.options.batch) {\r\n if (created.length) {\r\n promises.push($.Deferred(function(deferred) {\r\n deferred.type = \"create\";\r\n deferred.models = created;\r\n }));\r\n }\r\n\r\n if (updated.length) {\r\n promises.push($.Deferred(function(deferred) {\r\n deferred.type = \"update\";\r\n deferred.models = updated;\r\n }));\r\n }\r\n\r\n if (destroyed.length) {\r\n promises.push($.Deferred(function(deferred) {\r\n deferred.type = \"destroy\";\r\n deferred.models = destroyed;\r\n }));\r\n }\r\n\r\n that._submit(promises, {\r\n data: {\r\n created: that.reader.serialize(toJSON(created)),\r\n updated: that.reader.serialize(toJSON(updated)),\r\n destroyed: that.reader.serialize(toJSON(destroyed))\r\n }\r\n });\r\n }\r\n\r\n return promises;\r\n },\r\n\r\n _promise: function(data, models, type) {\r\n var that = this;\r\n\r\n return $.Deferred(function(deferred) {\r\n that.trigger(REQUESTSTART, { type: type });\r\n\r\n that.trigger(PROGRESS);\r\n\r\n that.transport[type].call(that.transport, extend({\r\n success: function(response) {\r\n deferred.resolve({\r\n response: response,\r\n models: models,\r\n type: type\r\n });\r\n },\r\n error: function(response, status, error) {\r\n deferred.reject(response);\r\n that.error(response, status, error);\r\n }\r\n }, data));\r\n }).promise();\r\n },\r\n\r\n _send: function(method, data) {\r\n var that = this,\r\n idx,\r\n length,\r\n promises = [],\r\n converted = that.reader.serialize(toJSON(data));\r\n\r\n if (that.options.batch) {\r\n if (data.length) {\r\n promises.push(that._promise( { data: { models: converted } }, data , method));\r\n }\r\n } else {\r\n for (idx = 0, length = data.length; idx < length; idx++) {\r\n promises.push(that._promise( { data: converted[idx] }, [ data[idx] ], method));\r\n }\r\n }\r\n\r\n return promises;\r\n },\r\n\r\n read: function(data) {\r\n var that = this, params = that._params(data);\r\n var deferred = $.Deferred();\r\n\r\n that._queueRequest(params, function() {\r\n var isPrevented = that.trigger(REQUESTSTART, { type: \"read\" });\r\n if (!isPrevented) {\r\n that.trigger(PROGRESS);\r\n\r\n that._ranges = [];\r\n that.trigger(\"reset\");\r\n if (that.online()) {\r\n that.transport.read({\r\n data: params,\r\n success: function(data) {\r\n that._ranges = [];\r\n that.success(data, params);\r\n\r\n deferred.resolve();\r\n },\r\n error: function() {\r\n var args = slice.call(arguments);\r\n\r\n that.error.apply(that, args);\r\n\r\n deferred.reject.apply(deferred, args);\r\n }\r\n });\r\n } else if (that.options.offlineStorage != null) {\r\n that.success(that.offlineData(), params);\r\n\r\n deferred.resolve();\r\n }\r\n } else {\r\n that._dequeueRequest();\r\n\r\n deferred.resolve(isPrevented);\r\n }\r\n });\r\n\r\n return deferred.promise();\r\n },\r\n\r\n _readAggregates: function(data) {\r\n return this.reader.aggregates(data);\r\n },\r\n\r\n success: function(data) {\r\n var that = this,\r\n options = that.options,\r\n items,\r\n replaceSubset;\r\n\r\n that.trigger(REQUESTEND, { response: data, type: \"read\" });\r\n\r\n if (that.online()) {\r\n data = that.reader.parse(data);\r\n\r\n if (that._handleCustomErrors(data)) {\r\n that._dequeueRequest();\r\n return;\r\n }\r\n\r\n that._total = that.reader.total(data);\r\n\r\n if (that._isServerGroupPaged()) {\r\n that._serverGroupsTotal = that._total;\r\n }\r\n\r\n if (that._pageSize > that._total) {\r\n that._pageSize = that._total;\r\n if (that.options.pageSize && that.options.pageSize > that._pageSize) {\r\n that._pageSize = that.options.pageSize;\r\n }\r\n }\r\n\r\n if (that._aggregate && options.serverAggregates) {\r\n that._aggregateResult = that._readAggregates(data);\r\n }\r\n\r\n data = that._readData(data);\r\n\r\n that._destroyed = [];\r\n } else {\r\n data = that._readData(data);\r\n\r\n items = [];\r\n var itemIds = {};\r\n var model = that.reader.model;\r\n var idField = model ? model.idField : \"id\";\r\n var idx;\r\n\r\n for (idx = 0; idx < this._destroyed.length; idx++) {\r\n var id = this._destroyed[idx][idField];\r\n itemIds[id] = id;\r\n }\r\n\r\n for (idx = 0; idx < data.length; idx++) {\r\n var item = data[idx];\r\n var state = item.__state__;\r\n if (state == \"destroy\") {\r\n if (!itemIds[item[idField]]) {\r\n this._pushInDestroyed(this._createNewModel(item));\r\n }\r\n } else {\r\n items.push(item);\r\n }\r\n }\r\n\r\n data = items;\r\n\r\n that._total = data.length;\r\n }\r\n\r\n that._pristineTotal = that._total;\r\n replaceSubset = that._skip && that._data.length && that._skip < that._data.length;\r\n\r\n if (that.options.endless) {\r\n if (replaceSubset) {\r\n that._pristineData.splice(that._skip, that._pristineData.length);\r\n }\r\n items = data.slice(0);\r\n for (var j = 0; j < items.length; j++) {\r\n that._pristineData.push(items[j]);\r\n }\r\n } else {\r\n that._pristineData = data.slice(0);\r\n }\r\n\r\n that._detachObservableParents();\r\n\r\n if (that.options.endless) {\r\n that._data.unbind(CHANGE, that._changeHandler);\r\n\r\n if (that._isServerGrouped() && that._data[that._data.length - 1].value === data[0].value) {\r\n fillLastGroup(that._data[that._data.length - 1], data[0]);\r\n data.shift();\r\n }\r\n\r\n data = that._observe(data);\r\n if (replaceSubset) {\r\n that._data.splice(that._skip, that._data.length);\r\n }\r\n for (var i = 0; i < data.length; i++) {\r\n that._data.push(data[i]);\r\n }\r\n that._data.bind(CHANGE, that._changeHandler);\r\n } else {\r\n that._data = that._observe(data);\r\n }\r\n\r\n that._markOfflineUpdatesAsDirty();\r\n\r\n that._storeData();\r\n\r\n that._addRange(that._data);\r\n\r\n that._process(that._data);\r\n\r\n that._dequeueRequest();\r\n },\r\n\r\n _detachObservableParents: function() {\r\n if (this._data && this._shouldDetachObservableParents) {\r\n for (var idx = 0; idx < this._data.length; idx++) {\r\n if (this._data[idx].parent) {\r\n this._data[idx].parent = noop;\r\n }\r\n }\r\n }\r\n },\r\n\r\n _storeData: function(updatePristine) {\r\n var serverGrouping = this._isServerGrouped();\r\n var model = this.reader.model;\r\n\r\n function items(data) {\r\n var state = [];\r\n\r\n for (var idx = 0; idx < data.length; idx++) {\r\n var dataItem = data.at(idx);\r\n var item = dataItem.toJSON();\r\n\r\n if (serverGrouping && dataItem.items) {\r\n item.items = items(dataItem.items);\r\n } else {\r\n item.uid = dataItem.uid;\r\n\r\n if (model) {\r\n if (dataItem.isNew()) {\r\n item.__state__ = \"create\";\r\n } else if (dataItem.dirty) {\r\n item.__state__ = \"update\";\r\n }\r\n }\r\n }\r\n state.push(item);\r\n }\r\n\r\n return state;\r\n }\r\n\r\n if (this.options.offlineStorage != null) {\r\n var state = items(this._data);\r\n\r\n var destroyed = [];\r\n\r\n for (var idx = 0; idx < this._destroyed.length; idx++) {\r\n var item = this._destroyed[idx].toJSON();\r\n item.__state__ = \"destroy\";\r\n destroyed.push(item);\r\n }\r\n\r\n this.offlineData(state.concat(destroyed));\r\n\r\n if (updatePristine) {\r\n this._pristineData = this.reader.reader ? this.reader.reader._wrapDataAccessBase(state) : this.reader._wrapDataAccessBase(state);\r\n }\r\n }\r\n },\r\n\r\n _addRange: function(data, skip) {\r\n var that = this,\r\n start = typeof (skip) !== \"undefined\" ? skip : (that._skip || 0),\r\n end,\r\n range = {\r\n data: data,\r\n pristineData: data.toJSON(),\r\n timestamp: that._timeStamp()\r\n };\r\n\r\n if (this._isGroupPaged()) {\r\n end = start + data.length;\r\n range.outerStart = start;\r\n range.outerEnd = end;\r\n } else {\r\n end = start + that._flatData(data, true).length;\r\n }\r\n\r\n range.start = start;\r\n range.end = end;\r\n that._ranges.push(range);\r\n that._sortRanges();\r\n\r\n if (that._isGroupPaged()) {\r\n if (!that._groupsFlat) {\r\n that._groupsFlat = [];\r\n }\r\n that._appendToGroupsFlat(range.data);\r\n that._updateOuterRangesLength();\r\n }\r\n },\r\n\r\n _appendToGroupsFlat: function(data) {\r\n var length = data.length;\r\n\r\n for (var i = 0; i < length; i++) {\r\n this._groupsFlat.push(data[i]);\r\n }\r\n },\r\n\r\n _getGroupByUid: function(uid) {\r\n var length = this._groupsFlat.length;\r\n var group;\r\n\r\n for (var i = 0; i < length; i++) {\r\n group = this._groupsFlat[i];\r\n if (group.uid === uid) {\r\n return group;\r\n }\r\n }\r\n },\r\n\r\n _sortRanges: function() {\r\n this._ranges.sort(function(x, y) {\r\n return x.start - y.start;\r\n });\r\n },\r\n\r\n error: function(xhr, status, errorThrown) {\r\n this._dequeueRequest();\r\n this.trigger(REQUESTEND, { });\r\n this.trigger(ERROR, { xhr: xhr, status: status, errorThrown: errorThrown });\r\n },\r\n\r\n _params: function(data) {\r\n var that = this,\r\n options = extend({\r\n take: that.take(),\r\n skip: that.skip(),\r\n page: that.page(),\r\n pageSize: that.pageSize(),\r\n sort: that._sort,\r\n filter: that._filter,\r\n group: that._group,\r\n aggregate: that._aggregate,\r\n groupPaging: !!that._groupPaging,\r\n isExcelExportRequest: that.options.isExcelExportRequest\r\n }, data);\r\n\r\n if (!that.options.serverPaging) {\r\n delete options.take;\r\n delete options.skip;\r\n delete options.page;\r\n delete options.pageSize;\r\n }\r\n\r\n if (!that.options.serverGrouping) {\r\n delete options.group;\r\n } else if (that.reader.model && options.group) {\r\n options.group = convertDescriptorsField(options.group, that.reader.model);\r\n }\r\n\r\n if (!that.options.serverFiltering) {\r\n delete options.filter;\r\n } else if (that.reader.model && options.filter) {\r\n options.filter = convertFilterDescriptorsField(options.filter, that.reader.model);\r\n }\r\n\r\n if (!that.options.serverSorting) {\r\n delete options.sort;\r\n } else if (that.reader.model && options.sort) {\r\n options.sort = convertDescriptorsField(options.sort, that.reader.model);\r\n }\r\n\r\n if (!that.options.serverAggregates) {\r\n delete options.aggregate;\r\n } else if (that.reader.model && options.aggregate) {\r\n options.aggregate = convertDescriptorsField(options.aggregate, that.reader.model);\r\n }\r\n\r\n if (!that.options.groupPaging || !(that.options.serverPaging && that.options.serverGrouping)) {\r\n delete options.groupPaging;\r\n }\r\n\r\n if (!that.options.isExcelExportRequest) {\r\n delete options.isExcelExportRequest;\r\n }\r\n\r\n return options;\r\n },\r\n\r\n _queueRequest: function(options, callback) {\r\n var that = this;\r\n if (!that._requestInProgress) {\r\n that._requestInProgress = true;\r\n that._pending = undefined$1;\r\n callback();\r\n } else {\r\n that._pending = { callback: callback.bind(that), options: options };\r\n }\r\n },\r\n\r\n _dequeueRequest: function() {\r\n var that = this;\r\n that._requestInProgress = false;\r\n if (that._pending) {\r\n that._queueRequest(that._pending.options, that._pending.callback);\r\n }\r\n },\r\n\r\n _handleCustomErrors: function(response) {\r\n if (this.reader.errors) {\r\n var errors = this.reader.errors(response);\r\n if (errors) {\r\n this.trigger(ERROR, { xhr: null, status: \"customerror\", errorThrown: \"custom error\", errors: errors });\r\n return true;\r\n }\r\n }\r\n return false;\r\n },\r\n\r\n _shouldWrap: function(data) {\r\n var model = this.reader.model;\r\n\r\n if (model && data.length) {\r\n return !(data[0] instanceof model);\r\n }\r\n\r\n return false;\r\n },\r\n\r\n _observe: function(data) {\r\n var that = this,\r\n model = that.reader.model;\r\n\r\n that._shouldDetachObservableParents = true;\r\n\r\n if (data instanceof ObservableArray) {\r\n that._shouldDetachObservableParents = false;\r\n if (that._shouldWrap(data)) {\r\n data.type = that.reader.model;\r\n data.wrapAll(data, data);\r\n }\r\n } else {\r\n var arrayType = that.pageSize() && !that.options.serverPaging ? LazyObservableArray : ObservableArray;\r\n data = new arrayType(data, that.reader.model);\r\n data.parent = function() { return that.parent(); };\r\n }\r\n\r\n if (that._isServerGrouped()) {\r\n wrapGroupItems(data, model);\r\n }\r\n\r\n if (that._changeHandler && that._data && that._data instanceof ObservableArray &&\r\n !(that.options.useRanges && that.options.serverPaging)) {\r\n that._data.unbind(CHANGE, that._changeHandler);\r\n } else {\r\n that._changeHandler = that._change.bind(that);\r\n }\r\n\r\n return data.bind(CHANGE, that._changeHandler);\r\n },\r\n\r\n _updateTotalForAction: function(action, items) {\r\n var that = this;\r\n\r\n var total = parseInt(that._total, 10);\r\n\r\n if (!isNumber(that._total)) {\r\n total = parseInt(that._pristineTotal, 10);\r\n }\r\n if (action === \"add\") {\r\n total += items.length;\r\n } else if (action === \"remove\") {\r\n total -= items.length;\r\n } else if (action !== \"itemchange\" && action !== \"sync\" && !that.options.serverPaging) {\r\n total = that._pristineTotal;\r\n } else if (action === \"sync\") {\r\n total = that._pristineTotal = parseInt(that._total, 10);\r\n }\r\n\r\n that._total = total;\r\n },\r\n\r\n _operationsForUpdatedFields: function() {\r\n const that = this,\r\n updatedFields = that._updatedFields || [],\r\n operations = {};\r\n\r\n let found = false,\r\n stringified;\r\n\r\n operations.sort = that._sort;\r\n operations.filter = that._filter;\r\n operations.group = that._group;\r\n operations.aggregate = that._aggregate;\r\n\r\n stringified = stringify(operations);\r\n found = updatedFields.some(u => stringified.indexOf((`\"field\":\"${u}\"`)) > -1);\r\n\r\n return !found;\r\n },\r\n\r\n _pushInDestroyed: function(model) {\r\n var isPushed = this._destroyed.find(function(item) {\r\n return item.uid === model.uid;\r\n });\r\n if (!isPushed) {\r\n this._destroyed.push(model);\r\n }\r\n },\r\n\r\n _change: function(e) {\r\n let that = this, idx, items, length, action = e ? e.action : \"\";\r\n\r\n if (action === \"remove\") {\r\n for (idx = 0, length = e.items.length; idx < length; idx++) {\r\n if (!e.items[idx].isNew || !e.items[idx].isNew()) {\r\n that._pushInDestroyed(e.items[idx]);\r\n }\r\n }\r\n }\r\n\r\n if (e) {\r\n items = e.items || [];\r\n e.partialUpdate = that._operationsForUpdatedFields() && !that._preventPartialUpdate;\r\n\r\n if (e.action === \"itemchange\" && items.some(i => i.dirtyFields)) {\r\n let item = e.items[0],\r\n keys = Object.keys(item.dirtyFields),\r\n result = keys;\r\n\r\n for (const key of keys) {\r\n if (item[key] instanceof Object) {\r\n let cleanObject = JSON.parse(kendo.stringify(item[key])),\r\n cleanObjectKeys = Object.keys(cleanObject).map((k) => key + \".\" + k);\r\n\r\n result.push(...cleanObjectKeys);\r\n }\r\n }\r\n\r\n that._updatedFields = result;\r\n }\r\n }\r\n\r\n if (that.options.autoSync && (action === \"add\" || action === \"remove\" || action === \"itemchange\")) {\r\n if (action === \"add\") {\r\n that._preventPartialUpdate = true;\r\n }\r\n\r\n var handler = function(args) {\r\n if (args.action === \"sync\") {\r\n that._preventPartialUpdate = false;\r\n that.unbind(\"change\", handler);\r\n that._updateTotalForAction(action, e.items);\r\n }\r\n };\r\n\r\n that.first(\"change\", handler);\r\n\r\n that.sync();\r\n\r\n } else {\r\n that._updateTotalForAction(action, e ? e.items : []);\r\n\r\n that._process(that._data, e);\r\n }\r\n },\r\n\r\n _calculateAggregates: function(data, options) {\r\n options = options || {};\r\n\r\n var query = new Query(data),\r\n aggregates = options.aggregate,\r\n filter = options.filter;\r\n\r\n if (filter) {\r\n query = query.filter(filter);\r\n }\r\n\r\n return query.aggregate(aggregates);\r\n },\r\n\r\n _process: function(data, e) {\r\n var that = this,\r\n options = {},\r\n result;\r\n\r\n if (that.options.serverPaging !== true) {\r\n options.skip = that._skip;\r\n options.take = that._take || that._pageSize;\r\n\r\n if (options.skip === undefined$1 && that._page !== undefined$1 && that._pageSize !== undefined$1) {\r\n options.skip = (that._page - 1) * that._pageSize;\r\n }\r\n\r\n if (that.options.useRanges) {\r\n options.skip = that.currentRangeStart();\r\n }\r\n }\r\n\r\n if (that.options.serverSorting !== true) {\r\n options.sort = that._sort;\r\n }\r\n\r\n if (that.options.serverFiltering !== true) {\r\n options.filter = that._filter;\r\n }\r\n\r\n if (that.options.serverGrouping !== true) {\r\n options.group = that._group;\r\n }\r\n\r\n if (that.options.serverAggregates !== true) {\r\n options.aggregate = that._aggregate;\r\n }\r\n\r\n if (that.options.serverGrouping) {\r\n that._clearEmptyGroups(data);\r\n }\r\n\r\n options.groupPaging = that._groupPaging;\r\n\r\n if (that._isGroupPaged() && e && (e.action === \"page\" || e.action === \"expandGroup\" || e.action === \"collapseGroup\")) {\r\n result = that._queryProcess(data, {\r\n aggregate: that._aggregate\r\n });\r\n } else {\r\n result = that._queryProcess(data, options);\r\n }\r\n\r\n if (that._filter && e && e.action === \"add\") {\r\n var model = e.items[0],\r\n resultData = result.data;\r\n\r\n if (that._isGrouped() && !this._isServerGrouped()) {\r\n resultData = flattenGroups(resultData);\r\n }\r\n\r\n var modelIsInView = resultData.find(function(item) {\r\n return item.uid === model.uid;\r\n });\r\n\r\n if (!modelIsInView) {\r\n result.data.splice(model.index, 0, that._isGrouped() ? that._wrapInEmptyGroup(model) : model);\r\n result.total++;\r\n }\r\n }\r\n\r\n if (that.options.serverAggregates !== true) {\r\n // for performance reasons, calculate aggregates for part of the data only after query process\r\n // this is necessary in the TreeList when paging\r\n that._aggregateResult = that._calculateAggregates(result.dataToAggregate || data, options);\r\n }\r\n\r\n that._setView(result, options, e);\r\n\r\n that._setFilterTotal(result.total, false);\r\n\r\n e = e || {};\r\n\r\n e.items = e.items || that._view;\r\n\r\n that.trigger(CHANGE, e);\r\n },\r\n\r\n _setView: function(result, options, e) {\r\n var that = this;\r\n\r\n if (that._isGroupPaged() && !that._isServerGrouped()) {\r\n if (e && (e.action === \"page\" || e.action === \"expandGroup\" || e.action === \"collapseGroup\")) {\r\n that.view(result.data);\r\n that._updateOuterRangesLength();\r\n } else {\r\n that._ranges = [];\r\n var query = new Query(result.data);\r\n that._addRange(that._observe(result.data));\r\n\r\n if (options.skip + options.take > result.data.length) {\r\n options.skip = Math.max(0, result.data.length - options.take);\r\n }\r\n\r\n that.view(query.range(options.skip, options.take).toArray());\r\n }\r\n\r\n } else {\r\n that.view(result.data);\r\n }\r\n },\r\n\r\n _clearEmptyGroups: function(data) {\r\n for (var idx = data.length - 1; idx >= 0; idx--) {\r\n var group = data[idx];\r\n if (group.hasSubgroups) {\r\n this._clearEmptyGroups(group.items);\r\n }\r\n\r\n if (group.items && !group.items.length && !group.itemCount) {\r\n splice.apply(group.parent(), [idx, 1]);\r\n }\r\n }\r\n },\r\n\r\n _queryProcess: function(data, options) {\r\n if (this.options.inPlaceSort) {\r\n return Query.process(data, options, this.options.inPlaceSort);\r\n }\r\n else {\r\n return Query.process(data, options);\r\n }\r\n },\r\n\r\n _mergeState: function(options) {\r\n var that = this;\r\n\r\n if (options !== undefined$1) {\r\n that._pageSize = options.pageSize;\r\n that._page = options.page;\r\n that._sort = options.sort;\r\n that._filter = options.filter;\r\n that._group = options.group;\r\n that._aggregate = options.aggregate;\r\n that._skip = that._currentRangeStart = options.skip;\r\n that._take = options.take;\r\n\r\n if (that._skip === undefined$1) {\r\n that._skip = that._currentRangeStart = that.skip();\r\n options.skip = that.skip();\r\n }\r\n\r\n if (that._take === undefined$1 && that._pageSize !== undefined$1) {\r\n that._take = that._pageSize;\r\n options.take = that._take;\r\n }\r\n\r\n if (that.options.virtual) {\r\n options.virtual = that.options.virtual;\r\n }\r\n\r\n if (options.sort) {\r\n that._sort = options.sort = normalizeSort(options.sort);\r\n that._sortFields = sortFields(options.sort);\r\n }\r\n\r\n if (options.filter) {\r\n that._filter = options.filter = (that.options.accentFoldingFiltering && !$.isEmptyObject(options.filter)) ? $.extend({}, normalizeFilter(options.filter), { accentFoldingFiltering: that.options.accentFoldingFiltering }) : normalizeFilter(options.filter);\r\n }\r\n\r\n if (options.group) {\r\n that._group = options.group = normalizeGroup(options.group);\r\n }\r\n if (options.aggregate) {\r\n that._aggregate = options.aggregate = normalizeAggregate(options.aggregate);\r\n }\r\n }\r\n return options;\r\n },\r\n\r\n query: function(options) {\r\n var result;\r\n var remote = this.options.serverSorting || this.options.serverPaging || this.options.serverFiltering || this.options.serverGrouping || this.options.serverAggregates;\r\n\r\n if (remote || ((this._data === undefined$1 || this._data.length === 0) && !this._destroyed.length)) {\r\n if (this.options.endless) {\r\n var moreItemsCount = options.pageSize - this.pageSize();\r\n if (moreItemsCount > 0) {\r\n moreItemsCount = this.pageSize();\r\n options.page = options.pageSize / moreItemsCount;\r\n options.pageSize = moreItemsCount;\r\n } else {\r\n options.page = 1;\r\n this.options.endless = false;\r\n }\r\n }\r\n return this.read(this._mergeState(options));\r\n }\r\n\r\n var isPrevented = this.trigger(REQUESTSTART, { type: \"read\" });\r\n if (!isPrevented) {\r\n this.trigger(PROGRESS);\r\n if (options) {\r\n options.groupPaging = this._groupPaging;\r\n }\r\n result = this._queryProcess(this._data, this._mergeState(options));\r\n\r\n this._setFilterTotal(result.total, true);\r\n\r\n this._aggregateResult = this._calculateAggregates(result.dataToAggregate || this._data, options);\r\n this._setView(result, options);\r\n this.trigger(REQUESTEND, { type: \"read\" });\r\n this.trigger(CHANGE, { items: result.data, action: options ? options.action : \"\" });\r\n }\r\n\r\n return $.Deferred().resolve(isPrevented).promise();\r\n },\r\n\r\n _hasExpandedSubGroups: function(group) {\r\n var result = false;\r\n var length = group.items ? group.items.length : 0;\r\n\r\n if (!group.hasSubgroups) {\r\n return false;\r\n }\r\n\r\n for (var i = 0; i < length; i++) {\r\n if (this._groupsState[group.items[i].uid]) {\r\n result = true;\r\n break;\r\n }\r\n }\r\n return result;\r\n },\r\n\r\n _findGroupedRange: function(data, result, options, parents, callback) {\r\n var that = this;\r\n var length = data.length;\r\n var group;\r\n var current;\r\n var itemsLength;\r\n var groupCount;\r\n var itemsToSkip;\r\n\r\n for (var i = 0; i < length; i++) {\r\n group = data[i];\r\n\r\n if (options.taken >= options.take) {\r\n break;\r\n }\r\n\r\n if (!that._getGroupByUid(group.uid)) {\r\n that._groupsFlat.push(group);\r\n }\r\n\r\n if (that._groupsState[group.uid]) {\r\n if (that._isServerGroupPaged()) {\r\n if (that._fetchGroupItems(group, options, parents, callback)) {\r\n that._fetchingGroupItems = true;\r\n return;\r\n }\r\n groupCount = (group.subgroupCount || group.itemCount) + 1;\r\n itemsToSkip = options.skip - options.skipped;\r\n if (!that._hasExpandedSubGroups(group) && itemsToSkip > groupCount) {\r\n options.skipped += groupCount;\r\n continue;\r\n }\r\n }\r\n\r\n if (options.includeParents && options.skipped < options.skip) {\r\n options.skipped++;\r\n group.excludeHeader = true;\r\n } else if (options.includeParents) {\r\n options.taken++;\r\n group.excludeHeader = false;\r\n }\r\n\r\n if (group.hasSubgroups && group.items && group.items.length) {\r\n group.currentItems = [];\r\n\r\n if (!parents) {\r\n parents = [];\r\n }\r\n parents.push(group);\r\n\r\n that._findGroupedRange(group.items, group.currentItems, options, parents, callback);\r\n parents.pop();\r\n\r\n if (group.currentItems.length || options.taken > 0) {\r\n result.push(group);\r\n } else {\r\n group.excludeHeader = false;\r\n }\r\n } else {\r\n current = [];\r\n itemsLength = group.items.length;\r\n\r\n for (var j = 0; j < itemsLength; j++) {\r\n if (options.skipped < options.skip) {\r\n options.skipped++;\r\n continue;\r\n }\r\n\r\n if (options.taken >= options.take) {\r\n break;\r\n }\r\n current.push(group.items[j]);\r\n options.taken++;\r\n }\r\n\r\n if (current.length || options.taken > 0) {\r\n group.currentItems = current;\r\n result.push(group);\r\n } else {\r\n group.excludeHeader = false;\r\n }\r\n }\r\n } else {\r\n if (options.skipped < options.skip) {\r\n options.skipped++;\r\n continue;\r\n }\r\n result.push(group);\r\n options.taken++;\r\n }\r\n }\r\n },\r\n\r\n _expandedSubGroupItemsCount: function(group, end, includeCurrentItems) {\r\n var that = this;\r\n var result = 0;\r\n var subGroup;\r\n var endSpecified = typeof end === \"number\";\r\n var length = endSpecified ? end : group.subgroupCount;\r\n var temp;\r\n\r\n if (!group.hasSubgroups) {\r\n return result;\r\n }\r\n\r\n for (var i = 0; i < length; i++) {\r\n subGroup = group.items[i];\r\n\r\n if (!subGroup) {\r\n break;\r\n }\r\n\r\n if (subGroup.hasSubgroups && that._groupsState[group.uid]) {\r\n temp = that._expandedSubGroupItemsCount(subGroup, length, true);\r\n result += temp;\r\n\r\n if (endSpecified) {\r\n length -= temp;\r\n }\r\n } else if (!subGroup.hasSubgroups && that._groupsState[subGroup.uid]) {\r\n temp = subGroup.items ? subGroup.items.length : 0;\r\n result += temp;\r\n if (endSpecified) {\r\n length -= temp;\r\n }\r\n }\r\n\r\n if (includeCurrentItems) {\r\n result += 1;\r\n if (endSpecified) {\r\n length -= 1;\r\n }\r\n }\r\n\r\n if (endSpecified && result > length) {\r\n return result;\r\n }\r\n }\r\n\r\n return result;\r\n },\r\n\r\n _fetchGroupItems: function(group, options, parents, callback) {\r\n var that = this;\r\n var groupItemsSkip;\r\n var firstItem;\r\n var lastItem;\r\n var groupItemCount = group.hasSubgroups ? group.subgroupCount : group.itemCount;\r\n var take = options.take;\r\n var skipped = options.skipped;\r\n var pageSize = that.take();\r\n var expandedSubGroupItemsCount;\r\n\r\n if (options.includeParents) {\r\n if (skipped < options.skip) {\r\n skipped += 1;\r\n } else {\r\n take -= 1;\r\n }\r\n }\r\n\r\n if (!group.items || (group.items && !group.items.length)) {\r\n that.getGroupItems(group, options, parents, callback, 0);\r\n return true;\r\n } else {\r\n expandedSubGroupItemsCount = this._expandedSubGroupItemsCount(group, options.skip - skipped);\r\n groupItemsSkip = Math.max(options.skip - (skipped + expandedSubGroupItemsCount), 0);\r\n\r\n if (groupItemsSkip >= groupItemCount) {\r\n return false;\r\n }\r\n\r\n firstItem = group.items[groupItemsSkip];\r\n lastItem = group.items[Math.min(groupItemsSkip + take, groupItemCount - 1)];\r\n\r\n if (firstItem.notFetched) {\r\n that.getGroupItems(group, options, parents, callback, groupItemsSkip, math.ceil((groupItemsSkip + pageSize) / pageSize));\r\n return true;\r\n }\r\n\r\n if (lastItem.notFetched) {\r\n that.getGroupItems(group, options, parents, callback, math.max(math.floor((groupItemsSkip + pageSize) / pageSize), 0) * pageSize, math.ceil((groupItemsSkip + pageSize) / pageSize));\r\n return true;\r\n }\r\n }\r\n },\r\n\r\n getGroupItems: function(group, options, parents, callback, groupItemsSkip, page) {\r\n var that = this;\r\n var take;\r\n var filter;\r\n var data;\r\n var subgroups;\r\n\r\n if (!group.items) {\r\n group.items = [];\r\n }\r\n\r\n take = that.take();\r\n filter = this._composeItemsFilter(group, parents);\r\n data = {\r\n page: page || 1,\r\n pageSize: take,\r\n skip: groupItemsSkip,\r\n take: take,\r\n filter: filter,\r\n aggregate: that._aggregate,\r\n sort: that._sort\r\n };\r\n subgroups = that.findSubgroups(group);\r\n\r\n if (subgroups && subgroups.length) {\r\n data.group = subgroups;\r\n }\r\n\r\n data.groupPaging = true;\r\n\r\n clearTimeout(that._timeout);\r\n that._timeout = setTimeout(function() {\r\n that._queueRequest(data, function() {\r\n if (!that.trigger(REQUESTSTART, {\r\n type: \"read\"\r\n })) {\r\n that.transport.read({\r\n data: data,\r\n success: that._groupItemsSuccessHandler(group, options.skip, that.take(), callback, groupItemsSkip),\r\n error: function() {\r\n var args = slice.call(arguments);\r\n that.error.apply(that, args);\r\n }\r\n });\r\n } else {\r\n that._dequeueRequest();\r\n }\r\n });\r\n }, 100);\r\n },\r\n\r\n _groupItemsSuccessHandler: function(group, skip, take, callback, groupItemsSkip) {\r\n var that = this;\r\n var timestamp = that._timeStamp();\r\n callback = isFunction(callback) ? callback : noop;\r\n var totalField = that.options.schema && that.options.schema.total ? that.options.schema.total : \"Total\";\r\n\r\n return function(data) {\r\n var temp;\r\n var model = Model.define(that.options.schema.model);\r\n var totalCount;\r\n\r\n that._dequeueRequest();\r\n\r\n that.trigger(REQUESTEND, {\r\n response: data,\r\n type: \"read\"\r\n });\r\n\r\n if (isFunction(totalField)) {\r\n totalCount = totalField(data);\r\n } else {\r\n totalCount = data[totalField];\r\n }\r\n\r\n data = that.reader.parse(data);\r\n\r\n if (group.hasSubgroups) {\r\n temp = that.reader.groups(data);\r\n group.subgroupCount = totalCount;\r\n } else {\r\n temp = that.reader.data(data);\r\n temp = temp.map(function(item) {\r\n return new model(item);\r\n });\r\n }\r\n\r\n group.items.omitChangeEvent = true;\r\n for (var i = 0; i < totalCount; i++) {\r\n if (i >= groupItemsSkip && i < (groupItemsSkip + take) ) {\r\n group.items.splice(i, 1, temp[i - groupItemsSkip]);\r\n } else {\r\n if (!group.items[i]) {\r\n group.items.splice(i, 0, { notFetched: true });\r\n }\r\n }\r\n }\r\n group.items.omitChangeEvent = false;\r\n\r\n that._updateRangePristineData(group);\r\n that._fetchingGroupItems = false;\r\n\r\n if (!group.countAdded) {\r\n that._serverGroupsTotal += totalCount;\r\n group.countAdded = true;\r\n }\r\n\r\n that.range(skip, take, callback, \"expandGroup\");\r\n\r\n if (timestamp >= that._currentRequestTimeStamp || !that._skipRequestsInProgress) {\r\n that.trigger(CHANGE, {});\r\n }\r\n };\r\n },\r\n\r\n findSubgroups: function(group) {\r\n var indexOfCurrentGroup = this._group.map(function(g) {\r\n return g.field;\r\n }).indexOf(group.field);\r\n\r\n return this._group.slice(indexOfCurrentGroup + 1, this._group.length);\r\n },\r\n\r\n _composeItemsFilter: function(group, parents) {\r\n var filter = {\r\n logic: \"and\",\r\n filters: []\r\n };\r\n\r\n if (this.filter()) {\r\n filter.filters.push(this.filter());\r\n }\r\n\r\n filter = extend(true, {}, filter);\r\n filter.filters.push({\r\n field: group.field,\r\n operator: \"eq\",\r\n value: group.value\r\n });\r\n\r\n if (parents) {\r\n for (var i = 0; i < parents.length; i++) {\r\n filter.filters.push({\r\n field: parents[i].field,\r\n operator: \"eq\",\r\n value: parents[i].value\r\n });\r\n }\r\n }\r\n\r\n return filter;\r\n },\r\n\r\n _updateRangePristineData: function(group) {\r\n var that = this;\r\n var ranges = that._ranges;\r\n var rangesLength = ranges.length;\r\n var temp;\r\n var currentGroup;\r\n var range;\r\n var dataLength;\r\n var indexes;\r\n var currIdx;\r\n\r\n for (var i = 0; i < rangesLength; i++) {\r\n range = ranges[i];\r\n dataLength = range.data.length;\r\n indexes = [];\r\n temp = null;\r\n\r\n for (var j = 0; j < dataLength; j++) {\r\n currentGroup = range.data[j];\r\n indexes.push(j);\r\n\r\n if ((currentGroup.uid === group.uid) || (currentGroup.hasSubgroups && currentGroup.items.length && that._containsSubGroup(currentGroup, group, indexes))) {\r\n break;\r\n }\r\n indexes.pop();\r\n }\r\n\r\n //if (indexes.length) {\r\n // temp = ranges[i].pristineData;\r\n\r\n // while (indexes.length > 1) {\r\n // currIdx = indexes.splice(0, 1)[0];\r\n // temp = temp[currIdx].items;\r\n // }\r\n // temp[indexes[0]] = that._cloneGroup(group);\r\n // break;\r\n //}\r\n }\r\n },\r\n\r\n _containsSubGroup: function(group, subgroup, indexes) {\r\n var that = this;\r\n var length = group.items.length;\r\n var currentSubGroup;\r\n\r\n if (group.hasSubgroups && length) {\r\n for (var i = 0; i < length; i++) {\r\n currentSubGroup = group.items[i];\r\n indexes.push(i);\r\n if (currentSubGroup.uid === subgroup.uid ||\r\n (currentSubGroup.hasSubgroups &&\r\n currentSubGroup.items.length &&\r\n that._containsSubGroup(currentSubGroup, subgroup, indexes))) {\r\n return true;\r\n }\r\n indexes.pop();\r\n }\r\n }\r\n\r\n },\r\n\r\n _cloneGroup: function(group) {\r\n var that = this;\r\n group = typeof group.toJSON == \"function\" ? group.toJSON() : group;\r\n\r\n if (group.items && group.items.length) {\r\n group.items = group.items.map(function(item) {\r\n return that._cloneGroup(item);\r\n });\r\n }\r\n\r\n return group;\r\n },\r\n\r\n _setFilterTotal: function(filterTotal, setDefaultValue) {\r\n var that = this;\r\n\r\n if (!that.options.serverFiltering) {\r\n if (filterTotal !== undefined$1) {\r\n that._total = filterTotal;\r\n } else if (setDefaultValue) {\r\n that._total = that._data.length;\r\n }\r\n }\r\n },\r\n\r\n fetch: function(callback) {\r\n var that = this;\r\n var fn = function(isPrevented) {\r\n if (isPrevented !== true && isFunction(callback)) {\r\n callback.call(that);\r\n }\r\n };\r\n\r\n return this._query().done(fn);\r\n },\r\n\r\n _query: function(options) {\r\n var that = this;\r\n\r\n return that.query(extend({}, {\r\n page: that.page(),\r\n pageSize: that.pageSize(),\r\n sort: that.sort(),\r\n filter: that.filter(),\r\n group: that.group(),\r\n aggregate: that.aggregate()\r\n }, options));\r\n },\r\n\r\n next: function(options) {\r\n var that = this,\r\n page = that.page(),\r\n total = that.total();\r\n\r\n options = options || {};\r\n\r\n if (!page || (total && page + 1 > that.totalPages())) {\r\n return;\r\n }\r\n\r\n that._skip = that._currentRangeStart = page * that.take();\r\n\r\n page += 1;\r\n options.page = page;\r\n\r\n that._query(options);\r\n\r\n return page;\r\n },\r\n\r\n prev: function(options) {\r\n var that = this,\r\n page = that.page();\r\n\r\n options = options || {};\r\n\r\n if (!page || page === 1) {\r\n return;\r\n }\r\n\r\n that._skip = that._currentRangeStart = that._skip - that.take();\r\n\r\n page -= 1;\r\n options.page = page;\r\n\r\n that._query(options);\r\n\r\n return page;\r\n },\r\n\r\n page: function(val) {\r\n var that = this,\r\n skip;\r\n\r\n if (val !== undefined$1) {\r\n val = math.max(math.min(math.max(val, 1), that.totalPages()), 1);\r\n var take = that.take();\r\n\r\n if (that._isGroupPaged()) {\r\n val -= 1;\r\n that.range(val * take, take, null, \"page\");\r\n return;\r\n }\r\n that._query(that._pageableQueryOptions({ page: val }));\r\n return;\r\n }\r\n skip = that.skip();\r\n\r\n return skip !== undefined$1 ? math.round((skip || 0) / (that.take() || 1)) + 1 : undefined$1;\r\n },\r\n\r\n pageSize: function(val) {\r\n var that = this;\r\n\r\n if (val !== undefined$1) {\r\n that._query(that._pageableQueryOptions({ pageSize: val, page: 1 }));\r\n return;\r\n }\r\n\r\n return that.take();\r\n },\r\n\r\n sort: function(val) {\r\n var that = this;\r\n\r\n if (val !== undefined$1) {\r\n that.trigger(\"sort\");\r\n that._query({ sort: val });\r\n return;\r\n }\r\n\r\n return that._sort;\r\n },\r\n\r\n filter: function(val) {\r\n var that = this;\r\n\r\n if (val === undefined$1) {\r\n return that._filter;\r\n }\r\n\r\n that.trigger(\"reset\");\r\n that._query({ filter: val, page: 1 });\r\n },\r\n\r\n group: function(val) {\r\n var that = this;\r\n var options = { group: val };\r\n\r\n if (that._groupPaging) {\r\n // clear ranges if ungrouping is performed\r\n if (val !== undefined$1 && (!val || !val.length) ) {\r\n that._ranges = [];\r\n }\r\n options.page = 1;\r\n }\r\n\r\n if (val !== undefined$1) {\r\n that._query(options);\r\n return;\r\n }\r\n\r\n return that._group;\r\n },\r\n\r\n getGroupsFlat: function(data) {\r\n var idx,\r\n result = [],\r\n length;\r\n\r\n for (idx = 0, length = data.length; idx < length; idx++) {\r\n var group = data[idx];\r\n if (group.hasSubgroups) {\r\n result = result.concat(this.getGroupsFlat(group.items));\r\n }\r\n\r\n result.push(group);\r\n }\r\n\r\n return result;\r\n },\r\n\r\n total: function() {\r\n return parseInt(this._total || 0, 10);\r\n },\r\n\r\n groupsTotal: function(includeExpanded) {\r\n var that = this;\r\n\r\n if (!that._group.length) {\r\n return that.total();\r\n }\r\n\r\n if (that._isServerGrouped()) {\r\n if (that._serverGroupsTotal) {\r\n return that._serverGroupsTotal;\r\n }\r\n that._serverGroupsTotal = that.total();\r\n\r\n return that._serverGroupsTotal;\r\n }\r\n\r\n return that._calculateGroupsTotal(that._ranges.length ? that._ranges[0].data : [], includeExpanded);\r\n },\r\n\r\n _calculateGroupsTotal: function(groups, includeExpanded, itemsField, ignoreState) {\r\n var that = this;\r\n itemsField = itemsField || \"items\";\r\n var total;\r\n var length;\r\n\r\n if (that._group.length && groups) {\r\n total = 0;\r\n length = groups.length;\r\n\r\n for (var i = 0; i < length; i++) {\r\n total += that.groupCount(groups[i], includeExpanded, itemsField, ignoreState);\r\n }\r\n that._groupsTotal = total;\r\n return total;\r\n }\r\n\r\n that._groupsTotal = that._data.length;\r\n return that._groupsTotal;\r\n },\r\n\r\n groupCount: function(group, includeExpanded, itemsField, ignoreState) {\r\n var that = this;\r\n var total = 0;\r\n\r\n if (group.hasSubgroups && that._groupsState[group.uid]) {\r\n if (includeExpanded && !group.excludeHeader || ignoreState) {\r\n total += 1;\r\n }\r\n\r\n group[itemsField].forEach(function(subgroup) {\r\n total += that.groupCount(subgroup, includeExpanded, itemsField, ignoreState);\r\n });\r\n } else {\r\n if (that._groupsState[group.uid]) {\r\n if (includeExpanded && !group.excludeHeader || ignoreState) {\r\n total++;\r\n }\r\n total += group[itemsField] ? group[itemsField].length : 0;\r\n } else {\r\n total++;\r\n }\r\n }\r\n return total;\r\n },\r\n\r\n countGroupRange: function(range) {\r\n var total = 0;\r\n var length = range.length;\r\n\r\n for (var i = 0; i < length; i++) {\r\n total += this.groupCount(range[i], true);\r\n }\r\n\r\n return total;\r\n },\r\n\r\n aggregate: function(val) {\r\n var that = this;\r\n\r\n if (val !== undefined$1) {\r\n that._query({ aggregate: val });\r\n return;\r\n }\r\n\r\n return that._aggregate;\r\n },\r\n\r\n aggregates: function() {\r\n var result = this._aggregateResult;\r\n\r\n if (isEmptyObject(result)) {\r\n result = this._emptyAggregates(this.aggregate());\r\n }\r\n\r\n return result;\r\n },\r\n\r\n _emptyAggregates: function(aggregates) {\r\n var result = {};\r\n\r\n if (!isEmptyObject(aggregates)) {\r\n var aggregate = {};\r\n\r\n if (!isArray(aggregates)) {\r\n aggregates = [aggregates];\r\n }\r\n\r\n for (var idx = 0; idx < aggregates.length; idx++) {\r\n aggregate[aggregates[idx].aggregate] = 0;\r\n result[aggregates[idx].field] = aggregate;\r\n }\r\n }\r\n\r\n return result;\r\n },\r\n\r\n _pageableQueryOptions: function(options) {\r\n return options;\r\n },\r\n\r\n _wrapInEmptyGroup: function(model) {\r\n var groups = this.group(),\r\n parent,\r\n group,\r\n idx,\r\n length;\r\n\r\n for (idx = groups.length - 1, length = 0; idx >= length; idx--) {\r\n group = groups[idx];\r\n parent = {\r\n value: model.get ? model.get(group.field) : model[group.field],\r\n field: group.field,\r\n items: parent ? [parent] : [model],\r\n hasSubgroups: !!parent,\r\n aggregates: this._emptyAggregates(group.aggregates)\r\n };\r\n }\r\n\r\n return parent;\r\n },\r\n\r\n totalPages: function() {\r\n var that = this,\r\n pageSize = that.pageSize() || that.total(),\r\n total = that._isGroupPaged() ? that.groupsTotal(true) : that.total();\r\n\r\n return math.ceil((total || 0) / pageSize);\r\n },\r\n\r\n inRange: function(skip, take) {\r\n var that = this,\r\n end = math.min(skip + take, that.total());\r\n\r\n if (!that.options.serverPaging && that._data.length > 0) {\r\n return true;\r\n }\r\n\r\n return that._findRange(skip, end).length > 0;\r\n },\r\n\r\n lastRange: function() {\r\n var ranges = this._ranges;\r\n return ranges[ranges.length - 1] || { start: 0, end: 0, data: [] };\r\n },\r\n\r\n firstItemUid: function() {\r\n var ranges = this._ranges;\r\n return ranges.length && ranges[0].data.length && ranges[0].data[0].uid;\r\n },\r\n\r\n enableRequestsInProgress: function() {\r\n this._skipRequestsInProgress = false;\r\n },\r\n\r\n _timeStamp: function() {\r\n return new Date().getTime();\r\n },\r\n\r\n range: function(skip, take, callback, action) {\r\n this._currentRequestTimeStamp = this._timeStamp();\r\n this._skipRequestsInProgress = true;\r\n var total = this._isGroupPaged() ? this.groupsTotal(true) : this.total();\r\n\r\n if (action === \"expandGroup\" || action === \"collapseGroup\") {\r\n this._updateOuterRangesLength();\r\n }\r\n\r\n skip = math.min(skip || 0, total);\r\n callback = isFunction(callback) ? callback : noop;\r\n\r\n var that = this,\r\n pageSkip = math.max(math.floor(skip / take), 0) * take,\r\n size = math.min(pageSkip + take, total),\r\n data;\r\n\r\n data = that._findRange(skip, math.min(skip + take, total), callback);\r\n\r\n if ((data.length || total === 0) && !that._fetchingGroupItems) {\r\n that._processRangeData(data, skip, take, that._originalPageSkip || pageSkip, that._originalSize || size, {\r\n action: action\r\n });\r\n that._originalPageSkip = null;\r\n that._originalSize = null;\r\n callback();\r\n return;\r\n }\r\n\r\n if (that._isGroupPaged()) {\r\n that._originalPageSkip = pageSkip;\r\n that._originalSize = size;\r\n\r\n pageSkip = math.max(math.floor(that._adjustPageSkip(skip, take) / take), 0) * take;\r\n size = math.min(pageSkip + take, total);\r\n }\r\n\r\n if (take !== undefined$1 && !that._fetchingGroupItems) {\r\n if ((that._isGroupPaged() && !that._groupRangeExists(pageSkip, take)) || !that._rangeExists(pageSkip, size)) {\r\n that.prefetch(pageSkip, take, function() {\r\n if (skip > pageSkip && size < that.total() && !that._rangeExists(size, math.min(size + take, that.total()))) {\r\n that.prefetch(size, take, function() {\r\n that.range(skip, take, callback );\r\n });\r\n } else {\r\n that.range(skip, take, callback);\r\n }\r\n });\r\n } else if (pageSkip < skip) {\r\n that.prefetch(size, take, function() {\r\n that.range(skip, take, callback );\r\n });\r\n }\r\n }\r\n },\r\n\r\n _findRange: function(start, end, callback) {\r\n var that = this,\r\n ranges = that._ranges,\r\n range,\r\n data = [],\r\n skipIdx,\r\n takeIdx,\r\n startIndex,\r\n endIndex,\r\n rangeData,\r\n rangeEnd,\r\n processed,\r\n options = that.options,\r\n remote = options.serverSorting || options.serverPaging || options.serverFiltering || options.serverGrouping || options.serverAggregates,\r\n flatData,\r\n count,\r\n length,\r\n groupMapOptions = {\r\n take: end - start,\r\n skip: start,\r\n skipped: 0,\r\n taken: 0,\r\n includeParents: true\r\n },\r\n prevRangeEnd,\r\n isGroupPaged = that._isGroupPaged(),\r\n startField = isGroupPaged ? \"outerStart\" : \"start\",\r\n endField = isGroupPaged ? \"outerEnd\" : \"end\",\r\n currentDataLength;\r\n\r\n for (skipIdx = 0, length = ranges.length; skipIdx < length; skipIdx++) {\r\n range = ranges[skipIdx];\r\n\r\n if (isGroupPaged) {\r\n if (range.outerStart >= end) {\r\n return [];\r\n }\r\n\r\n if (start > range.outerEnd) {\r\n groupMapOptions.skipped += range.outerEnd - (prevRangeEnd || 0);\r\n prevRangeEnd = range.outerEnd;\r\n continue;\r\n }\r\n\r\n if (typeof prevRangeEnd !== \"undefined\" && prevRangeEnd != range.outerStart) {\r\n groupMapOptions.skipped += range.outerStart - prevRangeEnd;\r\n }\r\n\r\n if (groupMapOptions.skipped > groupMapOptions.skip) {\r\n return [];\r\n }\r\n\r\n if (typeof prevRangeEnd === \"undefined\" && start > 0 && range.start > 0) {\r\n groupMapOptions.skipped = range.outerStart;\r\n }\r\n\r\n takeIdx = skipIdx;\r\n while (true) {\r\n this._findGroupedRange(range.data, data, groupMapOptions, null, callback);\r\n currentDataLength = that._calculateGroupsTotal(data, true, \"currentItems\");\r\n\r\n if (currentDataLength >= groupMapOptions.take) {\r\n return data;\r\n }\r\n\r\n if (that._fetchingGroupItems) {\r\n return [];\r\n }\r\n takeIdx++;\r\n\r\n if (ranges[takeIdx] && ranges[takeIdx].outerStart === range.outerEnd) {\r\n range = ranges[takeIdx];\r\n } else {\r\n break;\r\n }\r\n }\r\n } else if (start >= range[startField] && start <= range[endField]) {\r\n count = 0;\r\n\r\n for (takeIdx = skipIdx; takeIdx < length; takeIdx++) {\r\n range = ranges[takeIdx];\r\n flatData = that._flatData(range.data, true);\r\n\r\n if (flatData.length && start + count >= range.start) {\r\n rangeData = range.data;\r\n rangeEnd = range.end;\r\n\r\n if (!remote) {\r\n if (options.inPlaceSort) {\r\n processed = that._queryProcess(range.data, { filter: that.filter() });\r\n } else {\r\n var sort = normalizeGroupWithoutCompare(that.group() || []).concat(normalizeSort(that.sort() || []));\r\n processed = that._queryProcess(range.data, { sort: sort, filter: that.filter() });\r\n }\r\n flatData = rangeData = processed.data;\r\n\r\n if (processed.total !== undefined$1) {\r\n rangeEnd = processed.total;\r\n }\r\n }\r\n\r\n startIndex = 0;\r\n if (start + count > range.start) {\r\n startIndex = (start + count) - range.start;\r\n }\r\n endIndex = flatData.length;\r\n if (rangeEnd > end) {\r\n endIndex = endIndex - (rangeEnd - end);\r\n }\r\n count += endIndex - startIndex;\r\n data = that._mergeGroups(data, rangeData, startIndex, endIndex);\r\n\r\n if (end <= range.end && count == end - start) {\r\n return data;\r\n }\r\n }\r\n }\r\n break;\r\n }\r\n prevRangeEnd = range.outerEnd;\r\n }\r\n return [];\r\n },\r\n\r\n _getRangesMismatch: function(pageSkip) {\r\n var that = this;\r\n var ranges = that._ranges;\r\n var mismatch = 0;\r\n var i = 0;\r\n\r\n while (true) {\r\n var range = ranges[i];\r\n if (!range || range.outerStart > pageSkip) {\r\n break;\r\n }\r\n\r\n if (range.outerEnd != range.end) {\r\n mismatch = range.outerEnd - range.end;\r\n }\r\n i++;\r\n }\r\n\r\n return mismatch;\r\n },\r\n\r\n _mergeGroups: function(data, range, skip, take) {\r\n if (this._isServerGrouped()) {\r\n var temp = range.toJSON(),\r\n prevGroup;\r\n\r\n if (data.length) {\r\n prevGroup = data[data.length - 1];\r\n }\r\n\r\n mergeGroups(prevGroup, temp, skip, take);\r\n\r\n return data.concat(temp);\r\n }\r\n return data.concat(range.slice(skip, take));\r\n },\r\n\r\n _processRangeData: function(data, skip, take, pageSkip, size, eventData) {\r\n var that = this;\r\n\r\n that._pending = undefined$1;\r\n\r\n that._skip = skip > that.skip() && !that._omitPrefetch ? math.min(size, (that.totalPages() - 1) * that.take()) : pageSkip;\r\n\r\n that._currentRangeStart = skip;\r\n\r\n that._take = take;\r\n\r\n var paging = that.options.serverPaging;\r\n var sorting = that.options.serverSorting;\r\n var filtering = that.options.serverFiltering;\r\n var aggregates = that.options.serverAggregates;\r\n try {\r\n that.options.serverPaging = true;\r\n if (!that._isServerGrouped() && !(that.group() && that.group().length)) {\r\n that.options.serverSorting = true;\r\n }\r\n that.options.serverFiltering = true;\r\n that.options.serverPaging = true;\r\n that.options.serverAggregates = true;\r\n\r\n if (paging) {\r\n that._detachObservableParents();\r\n that._data = data = that._observe(data);\r\n }\r\n that._process(data, eventData);\r\n } finally {\r\n that.options.serverPaging = paging;\r\n that.options.serverSorting = sorting;\r\n that.options.serverFiltering = filtering;\r\n that.options.serverAggregates = aggregates;\r\n }\r\n },\r\n\r\n skip: function() {\r\n var that = this;\r\n\r\n if (that._skip === undefined$1) {\r\n return (that._page !== undefined$1 ? (that._page - 1) * (that.take() || 1) : undefined$1);\r\n }\r\n return that._skip;\r\n },\r\n\r\n currentRangeStart: function() {\r\n return this._currentRangeStart || 0;\r\n },\r\n\r\n take: function() {\r\n return this._take || this._pageSize;\r\n },\r\n\r\n _prefetchSuccessHandler: function(skip, size, callback, force) {\r\n var that = this;\r\n var timestamp = that._timeStamp();\r\n\r\n return function(data) {\r\n var found = false,\r\n range = { start: skip, end: size, data: [], timestamp: that._timeStamp() },\r\n idx,\r\n length,\r\n temp;\r\n\r\n that._dequeueRequest();\r\n\r\n that.trigger(REQUESTEND, { response: data, type: \"read\" });\r\n\r\n data = that.reader.parse(data);\r\n\r\n temp = that._readData(data);\r\n\r\n if (temp.length) {\r\n for (idx = 0, length = that._ranges.length; idx < length; idx++) {\r\n if (that._ranges[idx].start === skip) {\r\n found = true;\r\n range = that._ranges[idx];\r\n\r\n if (!that._isGroupPaged()) {\r\n range.pristineData = temp;\r\n range.data = that._observe(temp);\r\n range.end = range.start + that._flatData(range.data, true).length;\r\n that._sortRanges();\r\n }\r\n\r\n break;\r\n }\r\n }\r\n\r\n if (!found) {\r\n that._addRange(that._observe(temp), skip);\r\n }\r\n }\r\n\r\n that._total = that.reader.total(data);\r\n\r\n if (force || (timestamp >= that._currentRequestTimeStamp || !that._skipRequestsInProgress)) {\r\n if (callback && callback != noop && temp.length) {\r\n callback();\r\n } else {\r\n that.trigger(CHANGE, {});\r\n }\r\n }\r\n };\r\n },\r\n\r\n prefetch: function(skip, take, callback) {\r\n var that = this,\r\n size = math.min(skip + take, that.total()),\r\n options = {\r\n take: take,\r\n skip: skip,\r\n page: skip / take + 1,\r\n pageSize: take,\r\n sort: that._sort,\r\n filter: that._filter,\r\n group: that._group,\r\n aggregate: that._aggregate\r\n };\r\n\r\n\r\n if ((that._isGroupPaged() && !that._isServerGrouped() && that._groupRangeExists(skip, size))) {\r\n if (callback) {\r\n callback();\r\n }\r\n return;\r\n }\r\n\r\n if ((that._isServerGroupPaged() && !that._groupRangeExists(skip, size)) || !that._rangeExists(skip, size)) {\r\n clearTimeout(that._timeout);\r\n\r\n that._timeout = setTimeout(function() {\r\n that._queueRequest(options, function() {\r\n if (!that.trigger(REQUESTSTART, { type: \"read\" })) {\r\n if (that._omitPrefetch) {\r\n that.trigger(PROGRESS);\r\n }\r\n that.transport.read({\r\n data: that._params(options),\r\n success: that._prefetchSuccessHandler(skip, size, callback),\r\n error: function() {\r\n var args = slice.call(arguments);\r\n that.error.apply(that, args);\r\n }\r\n });\r\n } else {\r\n that._dequeueRequest();\r\n }\r\n });\r\n }, 100);\r\n } else if (callback) {\r\n callback();\r\n }\r\n },\r\n\r\n _multiplePrefetch: function(skip, take, callback) {\r\n var that = this,\r\n size = math.min(skip + take, that.total()),\r\n options = {\r\n take: take,\r\n skip: skip,\r\n page: skip / take + 1,\r\n pageSize: take,\r\n sort: that._sort,\r\n filter: that._filter,\r\n group: that._group,\r\n aggregate: that._aggregate\r\n };\r\n\r\n if (!that._rangeExists(skip, size)) {\r\n if (!that.trigger(REQUESTSTART, { type: \"read\" })) {\r\n that.transport.read({\r\n data: that._params(options),\r\n success: that._prefetchSuccessHandler(skip, size, callback, true)\r\n });\r\n }\r\n } else if (callback) {\r\n callback();\r\n }\r\n },\r\n\r\n _adjustPageSkip: function(start, take) {\r\n var that = this;\r\n var prevRange = that._getPrevRange(start);\r\n var result;\r\n var total = that.total();\r\n var mismatch;\r\n\r\n if (prevRange) {\r\n mismatch = that._getRangesMismatch(start);\r\n\r\n if (!mismatch) {\r\n return start;\r\n }\r\n start -= mismatch;\r\n }\r\n result = math.max(math.floor(start / take), 0) * take;\r\n\r\n if (result > total) {\r\n while (true) {\r\n result -= take;\r\n if (result < total) {\r\n break;\r\n }\r\n }\r\n }\r\n return result;\r\n },\r\n\r\n _getNextRange: function(end) {\r\n var that = this,\r\n ranges = that._ranges,\r\n idx,\r\n length;\r\n\r\n for (idx = 0, length = ranges.length; idx < length; idx++) {\r\n if (ranges[idx].start <= end && ranges[idx].end >= end) {\r\n return ranges[idx];\r\n }\r\n }\r\n },\r\n\r\n _getPrevRange: function(start) {\r\n var that = this,\r\n ranges = that._ranges,\r\n idx,\r\n range,\r\n length = ranges.length;\r\n\r\n for (idx = length - 1; idx >= 0; idx--) {\r\n if (ranges[idx].outerStart <= start) {\r\n range = ranges[idx];\r\n break;\r\n }\r\n\r\n }\r\n\r\n return range;\r\n },\r\n\r\n _rangeExists: function(start, end) {\r\n var that = this,\r\n ranges = that._ranges,\r\n idx,\r\n length;\r\n\r\n for (idx = 0, length = ranges.length; idx < length; idx++) {\r\n if (ranges[idx].start <= start && ranges[idx].end >= end) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n },\r\n\r\n _groupRangeExists: function(start, end) {\r\n var that = this,\r\n ranges = that._ranges,\r\n idx,\r\n length,\r\n availableItemsCount = 0,\r\n total = that.groupsTotal(true);\r\n\r\n if (end > total && !that._isServerGrouped()) {\r\n end = total;\r\n }\r\n\r\n for (idx = 0, length = ranges.length; idx < length; idx++) {\r\n var range = ranges[idx];\r\n if (range.outerStart <= start && range.outerEnd >= start) {\r\n availableItemsCount += range.outerEnd - start;\r\n } else if (range.outerStart <= end && range.outerEnd >= end) {\r\n availableItemsCount += end - range.outerStart;\r\n }\r\n }\r\n\r\n return availableItemsCount >= end - start;\r\n },\r\n\r\n _getCurrentRangeSpan: function() {\r\n var that = this;\r\n var ranges = that._ranges;\r\n var start = that.currentRangeStart();\r\n var end = start + (that.take() || 0);\r\n var rangeSpan = [];\r\n var range;\r\n var idx;\r\n var length = ranges.length;\r\n\r\n for (idx = 0; idx < length; idx++) {\r\n range = ranges[idx];\r\n\r\n if ((range.start <= start && range.end >= start) || (range.start >= start && range.start <= end)) {\r\n rangeSpan.push(range);\r\n }\r\n }\r\n\r\n return rangeSpan;\r\n },\r\n\r\n _removeModelFromRanges: function(model) {\r\n var that = this;\r\n var range;\r\n\r\n for (var idx = 0, length = this._ranges.length; idx < length; idx++) {\r\n range = this._ranges[idx];\r\n\r\n that._removeModelFromRange(range, model);\r\n }\r\n\r\n that._updateRangesLength();\r\n },\r\n\r\n _removeModelFromRange: function(range, model) {\r\n this._eachItem(range.data, function(data) {\r\n if (!data) {\r\n return;\r\n }\r\n for (var idx = 0; idx < data.length; idx++) {\r\n var dataItem = data[idx];\r\n\r\n if (dataItem.uid && dataItem.uid == model.uid) {\r\n [].splice.call(data, idx, 1);\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n\r\n _insertModelInRange: function(index, model) {\r\n var that = this;\r\n var ranges = that._ranges || [];\r\n var rangesLength = ranges.length;\r\n var range;\r\n var i;\r\n\r\n for (i = 0; i < rangesLength; i++) {\r\n range = ranges[i];\r\n\r\n if (range.start <= index && range.end >= index) {\r\n if (!that._getByUid(model.uid, range.data)) {\r\n if (that._isServerGrouped()) {\r\n range.data.splice(index, 0, that._wrapInEmptyGroup(model));\r\n } else {\r\n range.data.splice(index, 0, model);\r\n }\r\n }\r\n\r\n break;\r\n }\r\n }\r\n\r\n that._updateRangesLength();\r\n },\r\n\r\n _updateRangesLength: function() {\r\n var that = this;\r\n var ranges = that._ranges || [];\r\n var rangesLength = ranges.length;\r\n var mismatchFound = false;\r\n var mismatchLength = 0;\r\n var lengthDifference = 0;\r\n var rangeLength;\r\n var range;\r\n var i;\r\n\r\n for (i = 0; i < rangesLength; i++) {\r\n range = ranges[i];\r\n rangeLength = that._isGroupPaged() ? range.data.length : that._flatData(range.data, true).length;\r\n lengthDifference = rangeLength - math.abs(range.end - range.start);\r\n\r\n if (!mismatchFound && lengthDifference !== 0) {\r\n mismatchFound = true;\r\n mismatchLength = lengthDifference;\r\n range.end += mismatchLength;\r\n continue;\r\n }\r\n\r\n if (mismatchFound) {\r\n range.start += mismatchLength;\r\n range.end += mismatchLength;\r\n }\r\n }\r\n },\r\n\r\n _updateOuterRangesLength: function() {\r\n var that = this;\r\n var ranges = that._ranges || [];\r\n var rangesLength = ranges.length;\r\n var mismatchLength = 0;\r\n var range;\r\n var i;\r\n var prevRange;\r\n var rangeLength;\r\n\r\n for (i = 0; i < rangesLength; i++) {\r\n range = ranges[i];\r\n rangeLength = that._isGroupPaged() ? that._calculateGroupsTotal(range.data, true, \"items\", true) : that._flatData(range.data, true).length;\r\n\r\n if (prevRange) {\r\n if (prevRange.end != range.start) {\r\n mismatchLength = range.start - prevRange.end;\r\n }\r\n range.outerStart = prevRange.outerEnd + mismatchLength;\r\n mismatchLength = 0;\r\n } else {\r\n range.outerStart = range.start;\r\n }\r\n\r\n range.outerEnd = range.outerStart + rangeLength;\r\n prevRange = range;\r\n }\r\n }\r\n });\r\n\r\n var Transport = {};\r\n\r\n Transport.create = function(options, data, dataSource) {\r\n var transport,\r\n transportOptions = options.transport ? $.extend({}, options.transport) : null;\r\n\r\n if (transportOptions) {\r\n transportOptions.read = typeof transportOptions.read === STRING ? { url: transportOptions.read } : transportOptions.read;\r\n\r\n if (options.type === \"jsdo\") {\r\n transportOptions.dataSource = dataSource;\r\n }\r\n\r\n if (options.type) {\r\n kendo.data.transports = kendo.data.transports || {};\r\n kendo.data.schemas = kendo.data.schemas || {};\r\n\r\n if (!kendo.data.transports[options.type]) {\r\n kendo.logToConsole(\"Unknown DataSource transport type '\" + options.type + \"'.\\nVerify that registration scripts for this type are included after Kendo UI on the page.\", \"warn\");\r\n } else if (!isPlainObject(kendo.data.transports[options.type])) {\r\n transport = new kendo.data.transports[options.type](extend(transportOptions, { data: data }));\r\n } else {\r\n transportOptions = extend(true, {}, kendo.data.transports[options.type], transportOptions);\r\n }\r\n\r\n options.schema = extend(true, {}, kendo.data.schemas[options.type], options.schema);\r\n }\r\n\r\n if (!transport) {\r\n transport = isFunction(transportOptions.read) ? transportOptions : new RemoteTransport(transportOptions);\r\n }\r\n } else {\r\n transport = new LocalTransport({ data: options.data || [] });\r\n }\r\n return transport;\r\n };\r\n\r\n DataSource.create = function(options) {\r\n if (isArray(options) || options instanceof ObservableArray) {\r\n options = { data: options };\r\n }\r\n\r\n var dataSource = options || {},\r\n data = dataSource.data,\r\n fields = dataSource.fields,\r\n table = dataSource.table,\r\n select = dataSource.select,\r\n idx,\r\n length,\r\n model = {},\r\n field;\r\n\r\n if (!data && fields && !dataSource.transport) {\r\n if (table) {\r\n data = inferTable(table, fields);\r\n } else if (select) {\r\n data = inferSelect(select, fields);\r\n\r\n if (dataSource.group === undefined$1 && data[0] && data[0].optgroup !== undefined$1) {\r\n dataSource.group = \"optgroup\";\r\n }\r\n }\r\n }\r\n\r\n if (kendo.data.Model && fields && (!dataSource.schema || !dataSource.schema.model)) {\r\n for (idx = 0, length = fields.length; idx < length; idx++) {\r\n field = fields[idx];\r\n if (field.type) {\r\n model[field.field] = field;\r\n }\r\n }\r\n\r\n if (!isEmptyObject(model)) {\r\n dataSource.schema = extend(true, dataSource.schema, { model: { fields: model } });\r\n }\r\n }\r\n\r\n dataSource.data = data;\r\n\r\n select = null;\r\n dataSource.select = null;\r\n table = null;\r\n dataSource.table = null;\r\n\r\n return dataSource instanceof DataSource ? dataSource : new DataSource(dataSource);\r\n };\r\n\r\n function inferSelect(select, fields) {\r\n select = $(select)[0];\r\n var options = select.options;\r\n var firstField = fields[0];\r\n var secondField = fields[1];\r\n\r\n var data = [];\r\n var idx, length;\r\n var optgroup;\r\n var option;\r\n var record;\r\n var value;\r\n\r\n for (idx = 0, length = options.length; idx < length; idx++) {\r\n record = {};\r\n option = options[idx];\r\n optgroup = option.parentNode;\r\n\r\n if (optgroup === select) {\r\n optgroup = null;\r\n }\r\n\r\n if (option.disabled || (optgroup && optgroup.disabled)) {\r\n continue;\r\n }\r\n\r\n if (optgroup) {\r\n record.optgroup = optgroup.label;\r\n }\r\n\r\n record[firstField.field] = option.text;\r\n\r\n value = option.attributes.value;\r\n\r\n if (value && value.specified) {\r\n value = option.value;\r\n } else {\r\n value = option.text;\r\n }\r\n\r\n record[secondField.field] = value;\r\n\r\n data.push(record);\r\n }\r\n\r\n return data;\r\n }\r\n\r\n function inferTable(table, fields) {\r\n var tbody = $(table)[0].tBodies[0],\r\n rows = tbody ? tbody.rows : [],\r\n idx,\r\n length,\r\n fieldIndex,\r\n fieldCount = fields.length,\r\n data = [],\r\n cells,\r\n record,\r\n cell,\r\n empty;\r\n\r\n for (idx = 0, length = rows.length; idx < length; idx++) {\r\n record = {};\r\n empty = true;\r\n cells = rows[idx].cells;\r\n\r\n for (fieldIndex = 0; fieldIndex < fieldCount; fieldIndex++) {\r\n cell = cells[fieldIndex];\r\n if (cell.nodeName.toLowerCase() !== \"th\") {\r\n empty = false;\r\n record[fields[fieldIndex].field] = cell.innerHTML;\r\n }\r\n }\r\n if (!empty) {\r\n data.push(record);\r\n }\r\n }\r\n\r\n return data;\r\n }\r\n\r\n var Node = Model.define({\r\n idField: \"id\",\r\n\r\n init: function(value) {\r\n var that = this,\r\n hasChildren = that.hasChildren || value && value.hasChildren,\r\n childrenField = \"items\",\r\n childrenOptions = {};\r\n\r\n kendo.data.Model.fn.init.call(that, value);\r\n\r\n if (typeof that.children === STRING) {\r\n childrenField = that.children;\r\n }\r\n\r\n childrenOptions = {\r\n schema: {\r\n data: childrenField,\r\n model: {\r\n hasChildren: hasChildren,\r\n id: that.idField,\r\n fields: that.fields\r\n }\r\n }\r\n };\r\n\r\n if (typeof that.children !== STRING) {\r\n extend(childrenOptions, that.children);\r\n }\r\n\r\n childrenOptions.data = value;\r\n\r\n if (!hasChildren) {\r\n hasChildren = childrenOptions.schema.data;\r\n }\r\n\r\n if (typeof hasChildren === STRING) {\r\n hasChildren = kendo.getter(hasChildren);\r\n }\r\n\r\n if (isFunction(hasChildren)) {\r\n var hasChildrenObject = hasChildren.call(that, that);\r\n\r\n if (hasChildrenObject && hasChildrenObject.length === 0) {\r\n that.hasChildren = false;\r\n } else {\r\n that.hasChildren = !!hasChildrenObject;\r\n }\r\n }\r\n\r\n that._childrenOptions = childrenOptions;\r\n\r\n if (that.hasChildren) {\r\n that._initChildren();\r\n }\r\n\r\n that._loaded = !!(value && value._loaded);\r\n },\r\n\r\n _initChildren: function() {\r\n var that = this;\r\n var children, transport, parameterMap;\r\n\r\n if (!(that.children instanceof HierarchicalDataSource)) {\r\n children = that.children = new HierarchicalDataSource(that._childrenOptions);\r\n\r\n transport = children.transport;\r\n parameterMap = transport.parameterMap;\r\n\r\n transport.parameterMap = function(data, type) {\r\n data[that.idField || \"id\"] = that.id;\r\n\r\n if (parameterMap) {\r\n data = parameterMap.call(that, data, type);\r\n }\r\n\r\n return data;\r\n };\r\n\r\n children.parent = function() {\r\n return that;\r\n };\r\n\r\n children.bind(CHANGE, function(e) {\r\n e.node = e.node || that;\r\n that.trigger(CHANGE, e);\r\n });\r\n\r\n children.bind(ERROR, function(e) {\r\n var collection = that.parent();\r\n\r\n if (collection) {\r\n e.node = e.node || that;\r\n collection.trigger(ERROR, e);\r\n }\r\n });\r\n\r\n children.bind(ITEMSLOADED, function(e) {\r\n var collection = that.parent();\r\n\r\n if (collection) {\r\n collection.trigger(ITEMSLOADED, e);\r\n }\r\n });\r\n\r\n that._updateChildrenField();\r\n }\r\n },\r\n\r\n append: function(model) {\r\n this._initChildren();\r\n this.loaded(true);\r\n this.children.add(model);\r\n },\r\n\r\n hasChildren: false,\r\n\r\n level: function() {\r\n var parentNode = this.parentNode(),\r\n level = 0;\r\n\r\n while (parentNode && parentNode.parentNode) {\r\n level++;\r\n parentNode = parentNode.parentNode ? parentNode.parentNode() : null;\r\n }\r\n\r\n return level;\r\n },\r\n\r\n _updateChildrenField: function() {\r\n var fieldName = this._childrenOptions.schema.data;\r\n\r\n this[fieldName || \"items\"] = this.children.data();\r\n },\r\n\r\n _childrenLoaded: function() {\r\n this._loaded = true;\r\n\r\n this._updateChildrenField();\r\n },\r\n\r\n load: function() {\r\n var options = {};\r\n var method = \"_query\";\r\n var children, promise;\r\n\r\n if (this.hasChildren) {\r\n this._initChildren();\r\n\r\n children = this.children;\r\n\r\n options[this.idField || \"id\"] = this.id;\r\n\r\n if (!this._loaded) {\r\n children._data = undefined$1;\r\n method = \"read\";\r\n }\r\n\r\n children.one(CHANGE, this._childrenLoaded.bind(this));\r\n\r\n if (this._matchFilter) {\r\n options.filter = { field: '_matchFilter', operator: 'eq', value: true };\r\n }\r\n\r\n promise = children[method](options);\r\n if (!this._loaded) {\r\n this.trigger(ITEMLOAD, { promise: promise, node: this });\r\n }\r\n } else {\r\n this.loaded(true);\r\n }\r\n\r\n return promise || $.Deferred().resolve().promise();\r\n },\r\n\r\n parentNode: function() {\r\n var array = this.parent();\r\n\r\n return array.parent();\r\n },\r\n\r\n loaded: function(value) {\r\n if (value !== undefined$1) {\r\n this._loaded = value;\r\n } else {\r\n return this._loaded;\r\n }\r\n },\r\n\r\n shouldSerialize: function(field) {\r\n return Model.fn.shouldSerialize.call(this, field) &&\r\n field !== \"children\" &&\r\n field !== \"_loaded\" &&\r\n field !== \"hasChildren\" &&\r\n field !== \"_childrenOptions\";\r\n }\r\n });\r\n\r\n function dataMethod(name) {\r\n return function() {\r\n var data = this._data,\r\n result = DataSource.fn[name].apply(this, slice.call(arguments));\r\n\r\n if (this._data != data) {\r\n this._attachBubbleHandlers();\r\n }\r\n\r\n return result;\r\n };\r\n }\r\n\r\n var HierarchicalDataSource = DataSource.extend({\r\n init: function(options) {\r\n var node = Node.define({\r\n children: options\r\n });\r\n\r\n if (options.filter && !options.serverFiltering) {\r\n this._hierarchicalFilter = options.filter;\r\n options.filter = null;\r\n }\r\n\r\n DataSource.fn.init.call(this, extend(true, {}, { schema: { modelBase: node, model: node } }, options));\r\n\r\n this._attachBubbleHandlers();\r\n },\r\n\r\n _attachBubbleHandlers: function() {\r\n var that = this;\r\n\r\n that._data.bind(ERROR, function(e) {\r\n that.trigger(ERROR, e);\r\n });\r\n\r\n that._data.bind(ITEMSLOADED, function(e) {\r\n that.trigger(ITEMSLOADED, e);\r\n });\r\n },\r\n\r\n loading: function() {\r\n if (this._data) {\r\n return this._data.loading() || this._childrenLoading();\r\n }\r\n return false;\r\n },\r\n\r\n _childrenLoading: function() {\r\n var isLoading = false;\r\n this._data.forEach(function(node) {\r\n if (node.hasChildren && node.children.loading()) {\r\n isLoading = true;\r\n }\r\n });\r\n return isLoading;\r\n },\r\n\r\n read: function(data) {\r\n var result = DataSource.fn.read.call(this, data);\r\n\r\n if (this._hierarchicalFilter) {\r\n if (this._data && this._data.length > 0) {\r\n this.filter(this._hierarchicalFilter);\r\n } else {\r\n this.options.filter = this._hierarchicalFilter;\r\n this._filter = normalizeFilter(this.options.filter);\r\n this._hierarchicalFilter = null;\r\n }\r\n }\r\n\r\n return result;\r\n },\r\n\r\n remove: function(node) {\r\n var parentNode = node.parentNode(),\r\n dataSource = this,\r\n result;\r\n\r\n if (parentNode && parentNode._initChildren) {\r\n dataSource = parentNode.children;\r\n }\r\n\r\n result = DataSource.fn.remove.call(dataSource, node);\r\n\r\n if (parentNode && !dataSource.data().length) {\r\n parentNode.hasChildren = false;\r\n }\r\n\r\n return result;\r\n },\r\n\r\n success: dataMethod(\"success\"),\r\n\r\n data: dataMethod(\"data\"),\r\n\r\n insert: function(index, model) {\r\n var parentNode = this.parent();\r\n\r\n if (parentNode && parentNode._initChildren) {\r\n parentNode.hasChildren = true;\r\n parentNode._initChildren();\r\n }\r\n\r\n return DataSource.fn.insert.call(this, index, model);\r\n },\r\n\r\n filter: function(val) {\r\n if (val === undefined$1) {\r\n return this._filter;\r\n }\r\n\r\n if (!this.options.serverFiltering && this._markHierarchicalQuery(val)) {\r\n val = { logic: \"or\", filters: [val, { field: '_matchFilter', operator: 'equals', value: true }] };\r\n }\r\n\r\n this.trigger(\"reset\");\r\n this._query({ filter: val, page: 1 });\r\n },\r\n\r\n _markHierarchicalQuery: function(expressions) {\r\n var compiled;\r\n var accentFoldingFiltering = this.options.accentFoldingFiltering;\r\n\r\n expressions = accentFoldingFiltering ? $.extend({}, normalizeFilter(expressions), { accentFoldingFiltering: accentFoldingFiltering }) : normalizeFilter(expressions);\r\n\r\n if (!expressions || expressions.filters.length === 0) {\r\n this._updateHierarchicalFilter(function() {return true;});\r\n return false;\r\n }\r\n\r\n compiled = Query.filterExpr(expressions, { noEval: true });\r\n\r\n this._updateHierarchicalFilter(compiled);\r\n return true;\r\n },\r\n\r\n _updateHierarchicalFilter: function(filter) {\r\n var current;\r\n var data = this._data;\r\n var result = false;\r\n\r\n for (var idx = 0; idx < data.length; idx++) {\r\n current = data[idx];\r\n\r\n if (current.hasChildren) {\r\n current._matchFilter = current.children._updateHierarchicalFilter(filter);\r\n if (!current._matchFilter) {\r\n current._matchFilter = filter(current);\r\n }\r\n } else {\r\n current._matchFilter = filter(current);\r\n }\r\n\r\n if (current._matchFilter) {\r\n result = true;\r\n }\r\n }\r\n return result;\r\n },\r\n\r\n _find: function(method, value) {\r\n var idx, length, node, children;\r\n var data = this._data;\r\n\r\n if (!data) {\r\n return;\r\n }\r\n\r\n node = DataSource.fn[method].call(this, value);\r\n\r\n if (node) {\r\n return node;\r\n }\r\n\r\n data = this._flatData(this._data);\r\n\r\n for (idx = 0, length = data.length; idx < length; idx++) {\r\n children = data[idx].children;\r\n\r\n if (!(children instanceof HierarchicalDataSource)) {\r\n continue;\r\n }\r\n\r\n node = children[method](value);\r\n\r\n if (node) {\r\n return node;\r\n }\r\n }\r\n },\r\n\r\n get: function(id) {\r\n return this._find(\"get\", id);\r\n },\r\n\r\n getByUid: function(uid) {\r\n return this._find(\"getByUid\", uid);\r\n }\r\n });\r\n\r\n function inferList(list, fields) {\r\n var items = $(list).children(),\r\n idx,\r\n length,\r\n data = [],\r\n record,\r\n textField = fields[0].field,\r\n urlField = fields[1] && fields[1].field,\r\n spriteCssClassField = fields[2] && fields[2].field,\r\n imageUrlField = fields[3] && fields[3].field,\r\n item,\r\n id,\r\n textChild,\r\n className,\r\n children;\r\n\r\n function elements(collection, tagName) {\r\n return collection.filter(tagName).add(collection.find(tagName));\r\n }\r\n\r\n for (idx = 0, length = items.length; idx < length; idx++) {\r\n record = { _loaded: true };\r\n item = items.eq(idx);\r\n\r\n textChild = item[0].firstChild;\r\n children = item.children();\r\n list = children.filter(\"ul\");\r\n children = children.filter(\":not(ul)\");\r\n\r\n id = item.attr(\"data-id\");\r\n\r\n if (id) {\r\n record.id = id;\r\n }\r\n\r\n if (textChild) {\r\n record[textField] = textChild.nodeType == 3 ? textChild.nodeValue : children.text();\r\n }\r\n\r\n if (urlField) {\r\n record[urlField] = elements(children, \"a\").attr(\"href\");\r\n }\r\n\r\n if (imageUrlField) {\r\n record[imageUrlField] = elements(children, \"img\").attr(\"src\");\r\n }\r\n\r\n if (spriteCssClassField) {\r\n className = elements(children, \".k-sprite\").prop(\"className\");\r\n record[spriteCssClassField] = className && kendo.trim(className.replace(\"k-sprite\", \"\"));\r\n }\r\n\r\n if (list.length) {\r\n record.items = inferList(list.eq(0), fields);\r\n }\r\n\r\n if (item.attr(\"data-hasChildren\") == \"true\") {\r\n record.hasChildren = true;\r\n }\r\n\r\n data.push(record);\r\n }\r\n\r\n return data;\r\n }\r\n\r\n HierarchicalDataSource.create = function(options) {\r\n options = options && options.push ? { data: options } : options;\r\n\r\n var dataSource = options || {},\r\n data = dataSource.data,\r\n fields = dataSource.fields,\r\n list = dataSource.list;\r\n\r\n if (data && data._dataSource) {\r\n return data._dataSource;\r\n }\r\n\r\n if (!data && fields && !dataSource.transport) {\r\n if (list) {\r\n data = inferList(list, fields);\r\n }\r\n }\r\n\r\n dataSource.data = data;\r\n\r\n return dataSource instanceof HierarchicalDataSource ? dataSource : new HierarchicalDataSource(dataSource);\r\n };\r\n\r\n var Buffer = kendo.Observable.extend({\r\n init: function(dataSource, viewSize, disablePrefetch) {\r\n kendo.Observable.fn.init.call(this);\r\n\r\n this._prefetching = false;\r\n this.dataSource = dataSource;\r\n this.prefetch = !disablePrefetch;\r\n\r\n var buffer = this;\r\n\r\n dataSource.bind(\"change\", function() {\r\n buffer._change();\r\n });\r\n\r\n dataSource.bind(\"reset\", function() {\r\n buffer._reset();\r\n });\r\n\r\n this._syncWithDataSource();\r\n\r\n this.setViewSize(viewSize);\r\n },\r\n\r\n setViewSize: function(viewSize) {\r\n this.viewSize = viewSize;\r\n this._recalculate();\r\n },\r\n\r\n at: function(index) {\r\n var pageSize = this.pageSize,\r\n itemPresent = true;\r\n\r\n if (index >= this.total()) {\r\n this.trigger(\"endreached\", { index: index });\r\n return null;\r\n }\r\n\r\n if (!this.useRanges) {\r\n return this.dataSource.view()[index];\r\n }\r\n if (this.useRanges) {\r\n // out of range request\r\n if (index < this.dataOffset || index >= this.skip + pageSize) {\r\n itemPresent = this.range(Math.floor(index / pageSize) * pageSize);\r\n }\r\n\r\n // prefetch\r\n if (index === this.prefetchThreshold) {\r\n this._prefetch();\r\n }\r\n\r\n // mid-range jump - prefetchThreshold and nextPageThreshold may be equal, do not change to else if\r\n if (index === this.midPageThreshold) {\r\n this.range(this.nextMidRange, true);\r\n }\r\n // next range jump\r\n else if (index === this.nextPageThreshold) {\r\n this.range(this.nextFullRange);\r\n }\r\n // pull-back\r\n else if (index === this.pullBackThreshold) {\r\n if (this.offset === this.skip) { // from full range to mid range\r\n this.range(this.previousMidRange);\r\n } else { // from mid range to full range\r\n this.range(this.previousFullRange);\r\n }\r\n }\r\n\r\n if (itemPresent) {\r\n return this.dataSource.at(index - this.dataOffset);\r\n } else {\r\n this.trigger(\"endreached\", { index: index });\r\n return null;\r\n }\r\n }\r\n },\r\n\r\n indexOf: function(item) {\r\n return this.dataSource.data().indexOf(item) + this.dataOffset;\r\n },\r\n\r\n total: function() {\r\n return parseInt(this.dataSource.total(), 10);\r\n },\r\n\r\n next: function() {\r\n var buffer = this,\r\n pageSize = buffer.pageSize,\r\n offset = buffer.skip - buffer.viewSize + pageSize,\r\n pageSkip = math.max(math.floor(offset / pageSize), 0) * pageSize;\r\n\r\n this.offset = offset;\r\n this.dataSource.prefetch(pageSkip, pageSize, function() {\r\n buffer._goToRange(offset, true);\r\n });\r\n },\r\n\r\n range: function(offset, nextRange) {\r\n if (this.offset === offset) {\r\n return true;\r\n }\r\n\r\n var buffer = this,\r\n pageSize = this.pageSize,\r\n pageSkip = math.max(math.floor(offset / pageSize), 0) * pageSize,\r\n dataSource = this.dataSource;\r\n\r\n if (nextRange) {\r\n pageSkip += pageSize;\r\n }\r\n\r\n if (dataSource.inRange(offset, pageSize)) {\r\n this.offset = offset;\r\n this._recalculate();\r\n this._goToRange(offset);\r\n return true;\r\n } else if (this.prefetch) {\r\n dataSource.prefetch(pageSkip, pageSize, function() {\r\n buffer.offset = offset;\r\n buffer._recalculate();\r\n buffer._goToRange(offset, true);\r\n });\r\n return false;\r\n }\r\n\r\n return true;\r\n },\r\n\r\n syncDataSource: function() {\r\n var offset = this.offset;\r\n this.offset = null;\r\n this.range(offset);\r\n },\r\n\r\n destroy: function() {\r\n this.unbind();\r\n },\r\n\r\n _prefetch: function() {\r\n var buffer = this,\r\n pageSize = this.pageSize,\r\n prefetchOffset = this.skip + pageSize,\r\n dataSource = this.dataSource;\r\n\r\n if (!dataSource.inRange(prefetchOffset, pageSize) && !this._prefetching && this.prefetch) {\r\n this._prefetching = true;\r\n this.trigger(\"prefetching\", { skip: prefetchOffset, take: pageSize });\r\n\r\n dataSource.prefetch(prefetchOffset, pageSize, function() {\r\n buffer._prefetching = false;\r\n buffer.trigger(\"prefetched\", { skip: prefetchOffset, take: pageSize });\r\n });\r\n }\r\n },\r\n\r\n _goToRange: function(offset, expanding) {\r\n if (this.offset !== offset) {\r\n return;\r\n }\r\n\r\n this.dataOffset = offset;\r\n this._expanding = expanding;\r\n this.dataSource.range(offset, this.pageSize);\r\n this.dataSource.enableRequestsInProgress();\r\n },\r\n\r\n _reset: function() {\r\n this._syncPending = true;\r\n },\r\n\r\n _change: function() {\r\n var dataSource = this.dataSource;\r\n\r\n this.length = this.useRanges ? dataSource.lastRange().end : dataSource.view().length;\r\n\r\n if (this._syncPending) {\r\n this._syncWithDataSource();\r\n this._recalculate();\r\n this._syncPending = false;\r\n this.trigger(\"reset\", { offset: this.offset });\r\n }\r\n\r\n this.trigger(\"resize\");\r\n\r\n if (this._expanding) {\r\n this.trigger(\"expand\");\r\n }\r\n\r\n delete this._expanding;\r\n },\r\n\r\n _syncWithDataSource: function() {\r\n var dataSource = this.dataSource;\r\n\r\n this._firstItemUid = dataSource.firstItemUid();\r\n this.dataOffset = this.offset = dataSource.skip() || 0;\r\n this.pageSize = dataSource.pageSize();\r\n this.useRanges = dataSource.options.serverPaging;\r\n },\r\n\r\n _recalculate: function() {\r\n var pageSize = this.pageSize,\r\n offset = this.offset,\r\n viewSize = this.viewSize,\r\n skip = Math.ceil(offset / pageSize) * pageSize;\r\n\r\n this.skip = skip;\r\n this.midPageThreshold = skip + pageSize - 1;\r\n this.nextPageThreshold = skip + viewSize - 1;\r\n this.prefetchThreshold = skip + Math.floor(pageSize / 3 * 2);\r\n this.pullBackThreshold = this.offset - 1;\r\n\r\n this.nextMidRange = skip + pageSize - viewSize;\r\n this.nextFullRange = skip;\r\n this.previousMidRange = offset - viewSize;\r\n this.previousFullRange = skip - pageSize;\r\n }\r\n });\r\n\r\n var BatchBuffer = kendo.Observable.extend({\r\n init: function(dataSource, batchSize) {\r\n var batchBuffer = this;\r\n\r\n kendo.Observable.fn.init.call(batchBuffer);\r\n\r\n this.dataSource = dataSource;\r\n this.batchSize = batchSize;\r\n this._total = 0;\r\n\r\n this.buffer = new Buffer(dataSource, batchSize * 3);\r\n\r\n this.buffer.bind({\r\n \"endreached\": function(e) {\r\n batchBuffer.trigger(\"endreached\", { index: e.index });\r\n },\r\n \"prefetching\": function(e) {\r\n batchBuffer.trigger(\"prefetching\", { skip: e.skip, take: e.take });\r\n },\r\n \"prefetched\": function(e) {\r\n batchBuffer.trigger(\"prefetched\", { skip: e.skip, take: e.take });\r\n },\r\n \"reset\": function() {\r\n batchBuffer._total = 0;\r\n batchBuffer.trigger(\"reset\");\r\n },\r\n \"resize\": function() {\r\n batchBuffer._total = Math.ceil(this.length / batchBuffer.batchSize);\r\n batchBuffer.trigger(\"resize\", { total: batchBuffer.total(), offset: this.offset });\r\n }\r\n });\r\n },\r\n\r\n syncDataSource: function() {\r\n this.buffer.syncDataSource();\r\n },\r\n\r\n at: function(index) {\r\n var buffer = this.buffer,\r\n skip = index * this.batchSize,\r\n take = this.batchSize,\r\n view = [],\r\n item;\r\n\r\n if (buffer.offset > skip) {\r\n buffer.at(buffer.offset - 1);\r\n }\r\n\r\n for (var i = 0; i < take; i++) {\r\n item = buffer.at(skip + i);\r\n\r\n if (item === null) {\r\n break;\r\n }\r\n\r\n view.push(item);\r\n }\r\n\r\n return view;\r\n },\r\n\r\n total: function() {\r\n return this._total;\r\n },\r\n\r\n destroy: function() {\r\n this.buffer.destroy();\r\n this.unbind();\r\n }\r\n });\r\n\r\n extend(true, kendo.data, {\r\n readers: {\r\n json: DataReader\r\n },\r\n Query: Query,\r\n DataSource: DataSource,\r\n HierarchicalDataSource: HierarchicalDataSource,\r\n Node: Node,\r\n Comparer: Comparer,\r\n ObservableObject: ObservableObject,\r\n ObservableArray: ObservableArray,\r\n LazyObservableArray: LazyObservableArray,\r\n LocalTransport: LocalTransport,\r\n RemoteTransport: RemoteTransport,\r\n Cache: Cache,\r\n DataReader: DataReader,\r\n Model: Model,\r\n Buffer: Buffer,\r\n BatchBuffer: BatchBuffer\r\n });\r\n })(window.kendo.jQuery);\r\n var kendo$2x = kendo;\r\n\r\n var __meta__$2B = {\r\n id: \"binder\",\r\n name: \"MVVM\",\r\n category: \"framework\",\r\n description: \"Model View ViewModel (MVVM) is a design pattern which helps developers separate the Model (the data) from the View (the UI).\",\r\n depends: [ \"core\", \"data\" ]\r\n };\r\n\r\n\r\n (function($, undefined$1) {\r\n var kendo = window.kendo,\r\n encode = kendo.htmlEncode,\r\n Observable = kendo.Observable,\r\n ObservableObject = kendo.data.ObservableObject,\r\n ObservableArray = kendo.data.ObservableArray,\r\n toString = {}.toString,\r\n binders = {},\r\n Class = kendo.Class,\r\n VALUE = \"value\",\r\n SOURCE = \"source\",\r\n EVENTS = \"events\",\r\n CHECKED = \"checked\",\r\n CSS = \"css\",\r\n deleteExpando = true,\r\n FUNCTION = \"function\",\r\n CHANGE = \"change\";\r\n\r\n (function() {\r\n var a = document.createElement(\"a\");\r\n\r\n try {\r\n delete a.test;\r\n } catch (e) {\r\n deleteExpando = false;\r\n }\r\n })();\r\n\r\n var Binding = Observable.extend( {\r\n init: function(parents, path) {\r\n var that = this;\r\n\r\n Observable.fn.init.call(that);\r\n\r\n that.source = parents[0];\r\n that.parents = parents;\r\n that.path = path;\r\n that.dependencies = {};\r\n that.dependencies[path] = true;\r\n that.observable = that.source instanceof Observable;\r\n\r\n that._access = function(e) {\r\n that.dependencies[e.field] = true;\r\n };\r\n\r\n if (that.observable) {\r\n that._change = function(e) {\r\n that.change(e);\r\n };\r\n\r\n that.source.bind(CHANGE, that._change);\r\n }\r\n },\r\n\r\n _parents: function() {\r\n var parents = this.parents;\r\n var value = this.get();\r\n\r\n if (value && typeof value.parent == \"function\") {\r\n var parent = value.parent();\r\n\r\n if ($.inArray(parent, parents) < 0) {\r\n parents = [parent].concat(parents);\r\n }\r\n }\r\n\r\n return parents;\r\n },\r\n\r\n change: function(e) {\r\n var dependency,\r\n ch,\r\n field = e.field,\r\n that = this;\r\n\r\n if (that.path === \"this\") {\r\n that.trigger(CHANGE, e);\r\n } else {\r\n for (dependency in that.dependencies) {\r\n if (dependency.indexOf(field) === 0) {\r\n ch = dependency.charAt(field.length);\r\n\r\n if (!ch || ch === \".\" || ch === \"[\") {\r\n that.trigger(CHANGE, e);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n },\r\n\r\n start: function(source) {\r\n source.bind(\"get\", this._access);\r\n },\r\n\r\n stop: function(source) {\r\n source.unbind(\"get\", this._access);\r\n },\r\n\r\n get: function() {\r\n\r\n var that = this,\r\n source = that.source,\r\n index = 0,\r\n path = that.path,\r\n result = source;\r\n\r\n if (!that.observable) {\r\n return result;\r\n }\r\n\r\n that.start(that.source);\r\n\r\n result = source.get(path);\r\n\r\n // Traverse the observable hierarchy if the binding is not resolved at the current level.\r\n while (result === undefined$1 && source) {\r\n\r\n source = that.parents[++index];\r\n\r\n if (source instanceof ObservableObject) {\r\n result = source.get(path);\r\n }\r\n }\r\n\r\n // second pass try to get the parent from the object hierarchy\r\n if (result === undefined$1) {\r\n source = that.source; //get the initial source\r\n\r\n while (result === undefined$1 && source) {\r\n source = source.parent();\r\n\r\n if (source instanceof ObservableObject) {\r\n result = source.get(path);\r\n }\r\n }\r\n }\r\n\r\n // If the result is a function - invoke it\r\n if (typeof result === \"function\") {\r\n index = path.lastIndexOf(\".\");\r\n\r\n // If the function is a member of a nested observable object make that nested observable the context (this) of the function\r\n if (index > 0) {\r\n source = source.get(path.substring(0, index));\r\n }\r\n\r\n // Invoke the function\r\n that.start(source);\r\n\r\n if (source !== that.source) {\r\n result = result.call(source, that.source);\r\n } else {\r\n result = result.call(source);\r\n }\r\n\r\n that.stop(source);\r\n }\r\n\r\n // If the binding is resolved by a parent object\r\n if (source && source !== that.source) {\r\n\r\n that.currentSource = source; // save parent object\r\n\r\n // Listen for changes in the parent object\r\n source.unbind(CHANGE, that._change)\r\n .bind(CHANGE, that._change);\r\n }\r\n\r\n that.stop(that.source);\r\n\r\n return result;\r\n },\r\n\r\n set: function(value) {\r\n var source = this.currentSource || this.source;\r\n\r\n var field = kendo.getter(this.path)(source);\r\n\r\n if (typeof field === \"function\") {\r\n if (source !== this.source) {\r\n field.call(source, this.source, value);\r\n } else {\r\n field.call(source, value);\r\n }\r\n } else {\r\n source.set(this.path, value);\r\n }\r\n },\r\n\r\n destroy: function() {\r\n if (this.observable) {\r\n this.source.unbind(CHANGE, this._change);\r\n if (this.currentSource) {\r\n this.currentSource.unbind(CHANGE, this._change);\r\n }\r\n }\r\n\r\n this.unbind();\r\n }\r\n });\r\n\r\n var EventBinding = Binding.extend( {\r\n get: function() {\r\n var source = this.source,\r\n path = this.path,\r\n index = 0,\r\n handler;\r\n\r\n handler = source.get(path);\r\n\r\n while (!handler && source) {\r\n source = this.parents[++index];\r\n\r\n if (source instanceof ObservableObject) {\r\n handler = source.get(path);\r\n }\r\n }\r\n\r\n if (!handler) {\r\n return;\r\n }\r\n\r\n return handler.bind(source);\r\n }\r\n });\r\n\r\n var TemplateBinding = Binding.extend( {\r\n init: function(source, path, template) {\r\n var that = this;\r\n\r\n Binding.fn.init.call(that, source, path);\r\n\r\n that.template = template;\r\n },\r\n\r\n render: function(value) {\r\n var html;\r\n\r\n this.start(this.source);\r\n\r\n html = kendo.render(this.template, value);\r\n\r\n this.stop(this.source);\r\n\r\n return html;\r\n }\r\n });\r\n\r\n var Binder = Class.extend({\r\n init: function(element, bindings, options) {\r\n this.element = element;\r\n this.bindings = bindings;\r\n this.options = options;\r\n },\r\n\r\n bind: function(binding, attribute) {\r\n var that = this;\r\n\r\n binding = attribute ? binding[attribute] : binding;\r\n\r\n binding.bind(CHANGE, function(e) {\r\n that.refresh(attribute || e);\r\n });\r\n\r\n that.refresh(attribute);\r\n },\r\n\r\n destroy: function() {\r\n }\r\n });\r\n\r\n var TypedBinder = Binder.extend({\r\n dataType: function() {\r\n var dataType = this.element.getAttribute(\"data-\" + kendo.ns + \"type\") || this.element.type || \"text\";\r\n return dataType.toLowerCase();\r\n },\r\n\r\n parsedValue: function() {\r\n return this._parseValue(this.element.value, this.dataType());\r\n },\r\n\r\n _parseValue: function(value, dataType) {\r\n if (dataType == \"date\") {\r\n value = kendo.parseDate(value, \"yyyy-MM-dd\");\r\n } else if (dataType == \"datetime-local\") {\r\n value = kendo.parseDate(value, [\"yyyy-MM-ddTHH:mm:ss\", \"yyyy-MM-ddTHH:mm\"] );\r\n } else if (dataType == \"number\") {\r\n value = kendo.parseFloat(value);\r\n } else if (dataType == \"boolean\") {\r\n value = value.toLowerCase();\r\n if (kendo.parseFloat(value) !== null) {\r\n value = Boolean(kendo.parseFloat(value));\r\n } else {\r\n value = (value.toLowerCase() === \"true\");\r\n }\r\n }\r\n return value;\r\n }\r\n });\r\n\r\n binders.attr = Binder.extend({\r\n refresh: function(key) {\r\n this.element.setAttribute(key, this.bindings.attr[key].get());\r\n }\r\n });\r\n\r\n binders.css = Binder.extend({\r\n init: function(element, bindings, options) {\r\n Binder.fn.init.call(this, element, bindings, options);\r\n this.classes = {};\r\n },\r\n refresh: function(className) {\r\n var element = $(this.element),\r\n binding = this.bindings.css[className],\r\n hasClass = this.classes[className] = binding.get();\r\n if (hasClass) {\r\n element.addClass(className);\r\n } else {\r\n element.removeClass(className);\r\n }\r\n }\r\n });\r\n\r\n binders.style = Binder.extend({\r\n refresh: function(key) {\r\n this.element.style[key] = this.bindings.style[key].get() || \"\";\r\n }\r\n });\r\n\r\n binders.enabled = Binder.extend({\r\n refresh: function() {\r\n if (this.bindings.enabled.get()) {\r\n this.element.removeAttribute(\"disabled\");\r\n } else {\r\n this.element.setAttribute(\"disabled\", \"disabled\");\r\n }\r\n }\r\n });\r\n\r\n binders.readonly = Binder.extend({\r\n refresh: function() {\r\n if (this.bindings.readonly.get()) {\r\n this.element.setAttribute(\"readonly\", \"readonly\");\r\n } else {\r\n this.element.removeAttribute(\"readonly\");\r\n }\r\n }\r\n });\r\n\r\n binders.disabled = Binder.extend({\r\n refresh: function() {\r\n if (this.bindings.disabled.get()) {\r\n this.element.setAttribute(\"disabled\", \"disabled\");\r\n } else {\r\n this.element.removeAttribute(\"disabled\");\r\n }\r\n }\r\n });\r\n\r\n binders.events = Binder.extend({\r\n init: function(element, bindings, options) {\r\n Binder.fn.init.call(this, element, bindings, options);\r\n this.handlers = {};\r\n },\r\n\r\n refresh: function(key) {\r\n var element = $(this.element),\r\n binding = this.bindings.events[key],\r\n handler = this.handlers[key];\r\n\r\n if (handler) {\r\n element.off(key, handler);\r\n }\r\n\r\n handler = this.handlers[key] = binding.get();\r\n\r\n element.on(key, binding.source, handler);\r\n },\r\n\r\n destroy: function() {\r\n var element = $(this.element),\r\n handler;\r\n\r\n for (handler in this.handlers) {\r\n element.off(handler, this.handlers[handler]);\r\n }\r\n }\r\n });\r\n\r\n binders.text = Binder.extend({\r\n refresh: function() {\r\n var text = this.bindings.text.get();\r\n var dataFormat = this.element.getAttribute(\"data-\" + kendo.ns + \"format\") || \"\";\r\n if (text == null) {\r\n text = \"\";\r\n }\r\n\r\n $(this.element).text(kendo.toString(text, dataFormat));\r\n }\r\n });\r\n\r\n binders.visible = Binder.extend({\r\n refresh: function() {\r\n if (this.bindings.visible.get()) {\r\n this.element.style.display = \"\";\r\n } else {\r\n this.element.style.display = \"none\";\r\n }\r\n }\r\n });\r\n\r\n binders.invisible = Binder.extend({\r\n refresh: function() {\r\n if (!this.bindings.invisible.get()) {\r\n this.element.style.display = \"\";\r\n } else {\r\n this.element.style.display = \"none\";\r\n }\r\n }\r\n });\r\n\r\n binders.html = Binder.extend({\r\n refresh: function() {\r\n this.element.innerHTML = this.bindings.html.get();\r\n }\r\n });\r\n\r\n binders.value = TypedBinder.extend({\r\n init: function(element, bindings, options) {\r\n TypedBinder.fn.init.call(this, element, bindings, options);\r\n\r\n this._change = this.change.bind(this);\r\n this.eventName = options.valueUpdate || CHANGE;\r\n\r\n $(this.element).on(this.eventName, this._change);\r\n\r\n this._initChange = false;\r\n },\r\n\r\n change: function() {\r\n this._initChange = this.eventName != CHANGE;\r\n\r\n this.bindings[VALUE].set(this.parsedValue());\r\n\r\n this._initChange = false;\r\n },\r\n\r\n refresh: function() {\r\n if (!this._initChange) {\r\n var value = this.bindings[VALUE].get();\r\n\r\n if (value == null) {\r\n value = \"\";\r\n }\r\n\r\n var type = this.dataType();\r\n\r\n if (type == \"date\") {\r\n value = kendo.toString(value, \"yyyy-MM-dd\");\r\n } else if (type == \"datetime-local\") {\r\n value = kendo.toString(value, \"yyyy-MM-ddTHH:mm:ss\");\r\n }\r\n\r\n this.element.value = value;\r\n }\r\n\r\n this._initChange = false;\r\n },\r\n\r\n destroy: function() {\r\n $(this.element).off(this.eventName, this._change);\r\n }\r\n });\r\n\r\n binders.source = Binder.extend({\r\n init: function(element, bindings, options) {\r\n Binder.fn.init.call(this, element, bindings, options);\r\n\r\n var source = this.bindings.source.get();\r\n\r\n if (source instanceof kendo.data.DataSource && options.autoBind !== false) {\r\n source.fetch();\r\n }\r\n },\r\n\r\n refresh: function(e) {\r\n var that = this,\r\n source = that.bindings.source.get();\r\n\r\n if (source instanceof ObservableArray || source instanceof kendo.data.DataSource) {\r\n e = e || {};\r\n\r\n if (e.action == \"add\") {\r\n that.add(e.index, e.items);\r\n } else if (e.action == \"remove\") {\r\n that.remove(e.index, e.items);\r\n } else if (e.action != \"itemchange\") {\r\n that.render();\r\n }\r\n } else {\r\n that.render();\r\n }\r\n },\r\n\r\n container: function() {\r\n var element = this.element;\r\n\r\n if (element.nodeName.toLowerCase() == \"table\") {\r\n if (!element.tBodies[0]) {\r\n element.appendChild(document.createElement(\"tbody\"));\r\n }\r\n element = element.tBodies[0];\r\n }\r\n\r\n return element;\r\n },\r\n\r\n template: function() {\r\n var options = this.options,\r\n template = options.template,\r\n nodeName = this.container().nodeName.toLowerCase();\r\n\r\n if (!template) {\r\n if (nodeName == \"select\") {\r\n if (options.valueField || options.textField) {\r\n template = (data) => {\r\n const valueAttr = kendo.getter(options.valueField || options.textField)(data);\r\n const innerText = kendo.getter(options.textField || options.valueField)(data);\r\n return ``;\r\n };\r\n } else {\r\n template = (data) => ``;\r\n }\r\n } else if (nodeName == \"tbody\") {\r\n template = (data) => `${encode(data)}`;\r\n } else if (nodeName == \"ul\" || nodeName == \"ol\") {\r\n template = (data) => `
  • ${encode(data)}
  • `;\r\n } else {\r\n template = (data) => `${encode(data)}`;\r\n }\r\n template = kendo.template(template);\r\n }\r\n\r\n return template;\r\n },\r\n\r\n add: function(index, items) {\r\n var element = this.container(),\r\n parents,\r\n idx,\r\n length,\r\n child,\r\n clone = element.cloneNode(false),\r\n reference = element.children[index];\r\n\r\n $(clone).html(kendo.render(this.template(), items));\r\n\r\n if (clone.children.length) {\r\n parents = this.bindings.source._parents();\r\n\r\n for (idx = 0, length = items.length; idx < length; idx++) {\r\n child = clone.children[0];\r\n element.insertBefore(child, reference || null);\r\n bindElement(child, items[idx], this.options.roles, [items[idx]].concat(parents));\r\n }\r\n }\r\n },\r\n\r\n remove: function(index, items) {\r\n var idx, element = this.container();\r\n\r\n for (idx = 0; idx < items.length; idx++) {\r\n var child = element.children[index];\r\n unbindElementTree(child, true);\r\n if (child.parentNode == element) {\r\n element.removeChild(child);\r\n }\r\n }\r\n },\r\n\r\n render: function() {\r\n var source = this.bindings.source.get(),\r\n parents,\r\n idx,\r\n length,\r\n element = this.container(),\r\n template = this.template();\r\n\r\n if (source == null) {\r\n return;\r\n }\r\n\r\n if (source instanceof kendo.data.DataSource) {\r\n source = source.view();\r\n }\r\n\r\n if (!(source instanceof ObservableArray) && toString.call(source) !== \"[object Array]\") {\r\n source = [source];\r\n }\r\n\r\n if (this.bindings.template) {\r\n unbindElementChildren(element, true);\r\n\r\n $(element).html(this.bindings.template.render(source));\r\n\r\n if (element.children.length) {\r\n parents = this.bindings.source._parents();\r\n\r\n for (idx = 0, length = source.length; idx < length; idx++) {\r\n bindElement(element.children[idx], source[idx], this.options.roles, [source[idx]].concat(parents));\r\n }\r\n }\r\n } else {\r\n $(element).html(kendo.render(template, source));\r\n }\r\n }\r\n });\r\n\r\n binders.input = {\r\n checked: TypedBinder.extend({\r\n init: function(element, bindings, options) {\r\n TypedBinder.fn.init.call(this, element, bindings, options);\r\n this._change = this.change.bind(this);\r\n\r\n $(this.element).change(this._change);\r\n },\r\n\r\n change: function() {\r\n var element = this.element;\r\n var value = this.value();\r\n\r\n if (element.type == \"radio\") {\r\n value = this.parsedValue();\r\n this.bindings[CHECKED].set(value);\r\n } else if (element.type == \"checkbox\") {\r\n var source = this.bindings[CHECKED].get();\r\n var index;\r\n\r\n if (source instanceof ObservableArray) {\r\n value = this.parsedValue();\r\n if (value instanceof Date) {\r\n for (var i = 0; i < source.length; i++) {\r\n if (source[i] instanceof Date && +source[i] === +value) {\r\n index = i;\r\n break;\r\n }\r\n }\r\n } else {\r\n index = source.indexOf(value);\r\n }\r\n if (index > -1) {\r\n source.splice(index, 1);\r\n } else {\r\n source.push(value);\r\n }\r\n } else {\r\n this.bindings[CHECKED].set(value);\r\n }\r\n }\r\n },\r\n\r\n refresh: function() {\r\n var value = this.bindings[CHECKED].get(),\r\n source = value,\r\n type = this.dataType(),\r\n element = this.element;\r\n\r\n if (element.type == \"checkbox\") {\r\n if (source instanceof ObservableArray) {\r\n var index = -1;\r\n value = this.parsedValue();\r\n if (value instanceof Date) {\r\n for (var i = 0; i < source.length; i++) {\r\n if (source[i] instanceof Date && +source[i] === +value) {\r\n index = i;\r\n break;\r\n }\r\n }\r\n } else {\r\n index = source.indexOf(value);\r\n }\r\n element.checked = (index >= 0);\r\n } else {\r\n element.checked = source;\r\n }\r\n } else if (element.type == \"radio\") {\r\n if (type == \"date\") {\r\n value = kendo.toString(value, \"yyyy-MM-dd\");\r\n } else if (type == \"datetime-local\") {\r\n value = kendo.toString(value, \"yyyy-MM-ddTHH:mm:ss\");\r\n }\r\n\r\n if (value !== null && typeof(value) !== \"undefined\" && element.value === value.toString()) {\r\n element.checked = true;\r\n } else {\r\n element.checked = false;\r\n }\r\n }\r\n },\r\n\r\n value: function() {\r\n var element = this.element,\r\n value = element.value;\r\n\r\n if (element.type == \"checkbox\") {\r\n value = element.checked;\r\n }\r\n\r\n return value;\r\n },\r\n destroy: function() {\r\n $(this.element).off(CHANGE, this._change);\r\n }\r\n })\r\n };\r\n\r\n binders.select = {\r\n source: binders.source.extend({\r\n refresh: function(e) {\r\n var that = this,\r\n source = that.bindings.source.get();\r\n\r\n if (source instanceof ObservableArray || source instanceof kendo.data.DataSource) {\r\n e = e || {};\r\n if (e.action == \"add\") {\r\n that.add(e.index, e.items);\r\n } else if (e.action == \"remove\") {\r\n that.remove(e.index, e.items);\r\n } else if (e.action == \"itemchange\" || e.action === undefined$1) {\r\n that.render();\r\n if (that.bindings.value) {\r\n if (that.bindings.value) {\r\n var val = retrievePrimitiveValues(that.bindings.value.get(), $(that.element).data(\"valueField\"));\r\n if (val === null) {\r\n that.element.selectedIndex = -1;\r\n } else {\r\n that.element.value = val;\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n that.render();\r\n }\r\n }\r\n }),\r\n value: TypedBinder.extend({\r\n init: function(target, bindings, options) {\r\n TypedBinder.fn.init.call(this, target, bindings, options);\r\n\r\n this._change = this.change.bind(this);\r\n $(this.element).change(this._change);\r\n },\r\n\r\n parsedValue: function() {\r\n var dataType = this.dataType();\r\n var values = [];\r\n var value, option, idx, length;\r\n for (idx = 0, length = this.element.options.length; idx < length; idx++) {\r\n option = this.element.options[idx];\r\n\r\n if (option.selected) {\r\n value = option.attributes.value;\r\n\r\n if (value && value.specified) {\r\n value = option.value;\r\n } else {\r\n value = option.text;\r\n }\r\n\r\n values.push(this._parseValue(value, dataType));\r\n }\r\n }\r\n return values;\r\n },\r\n\r\n change: function() {\r\n var values = [],\r\n element = this.element,\r\n source,\r\n field = this.options.valueField || this.options.textField,\r\n valuePrimitive = this.options.valuePrimitive,\r\n option,\r\n valueIndex,\r\n value,\r\n idx,\r\n length;\r\n\r\n for (idx = 0, length = element.options.length; idx < length; idx++) {\r\n option = element.options[idx];\r\n\r\n if (option.selected) {\r\n value = option.attributes.value;\r\n\r\n if (value && value.specified) {\r\n value = option.value;\r\n } else {\r\n value = option.text;\r\n }\r\n\r\n if (field) {\r\n values.push(value);\r\n } else {\r\n values.push(this._parseValue(value, this.dataType()));\r\n }\r\n\r\n }\r\n }\r\n\r\n if (field) {\r\n source = this.bindings.source.get();\r\n if (source instanceof kendo.data.DataSource) {\r\n source = source.view();\r\n }\r\n\r\n for (valueIndex = 0; valueIndex < values.length; valueIndex++) {\r\n for (idx = 0, length = source.length; idx < length; idx++) {\r\n var sourceValue = source[idx].get(field);\r\n var match = (String(sourceValue) === values[valueIndex]);\r\n if (match) {\r\n values[valueIndex] = source[idx];\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n value = this.bindings[VALUE].get();\r\n if (value instanceof ObservableArray) {\r\n value.splice.apply(value, [0, value.length].concat(values));\r\n } else if (!valuePrimitive && (value instanceof ObservableObject || value === null || value === undefined$1 || !field)) {\r\n this.bindings[VALUE].set(values[0]);\r\n } else {\r\n this.bindings[VALUE].set(values[0].get(field));\r\n }\r\n },\r\n refresh: function() {\r\n var optionIndex,\r\n element = this.element,\r\n options = element.options,\r\n value = this.bindings[VALUE].get(),\r\n values = value,\r\n field = this.options.valueField || this.options.textField,\r\n found = false,\r\n type = this.dataType(),\r\n optionValue;\r\n\r\n if (!(values instanceof ObservableArray)) {\r\n values = new ObservableArray([value]);\r\n }\r\n\r\n element.selectedIndex = -1;\r\n\r\n for (var valueIndex = 0; valueIndex < values.length; valueIndex++) {\r\n value = values[valueIndex];\r\n\r\n\r\n if (field && value instanceof ObservableObject) {\r\n value = value.get(field);\r\n }\r\n\r\n if (type == \"date\") {\r\n value = kendo.toString(values[valueIndex], \"yyyy-MM-dd\");\r\n } else if (type == \"datetime-local\") {\r\n value = kendo.toString(values[valueIndex], \"yyyy-MM-ddTHH:mm:ss\");\r\n }\r\n\r\n for (optionIndex = 0; optionIndex < options.length; optionIndex++) {\r\n optionValue = options[optionIndex].value;\r\n\r\n if (optionValue === \"\" && value !== \"\") {\r\n optionValue = options[optionIndex].text;\r\n }\r\n\r\n if (value != null && optionValue == value.toString()) {\r\n options[optionIndex].selected = true;\r\n found = true;\r\n }\r\n }\r\n }\r\n },\r\n destroy: function() {\r\n $(this.element).off(CHANGE, this._change);\r\n }\r\n })\r\n };\r\n\r\n function dataSourceBinding(bindingName, fieldName, setter) {\r\n return Binder.extend({\r\n init: function(widget, bindings, options) {\r\n var that = this;\r\n\r\n Binder.fn.init.call(that, widget.element[0], bindings, options);\r\n\r\n that.widget = widget;\r\n that._dataBinding = that.dataBinding.bind(that);\r\n that._dataBound = that.dataBound.bind(that);\r\n that._itemChange = that.itemChange.bind(that);\r\n },\r\n\r\n itemChange: function(e) {\r\n bindElement(e.item[0], e.data, this._ns(e.ns), [e.data].concat(this.bindings[bindingName]._parents()));\r\n },\r\n\r\n dataBinding: function(e) {\r\n var idx,\r\n length,\r\n widget = this.widget,\r\n items = e.removedItems || widget.items();\r\n\r\n for (idx = 0, length = items.length; idx < length; idx++) {\r\n unbindElementTree(items[idx], false);\r\n }\r\n },\r\n\r\n _ns: function(ns) {\r\n ns = ns || kendo.ui;\r\n var all = [ kendo.ui, kendo.dataviz.ui, kendo.mobile.ui ];\r\n all.splice($.inArray(ns, all), 1);\r\n all.unshift(ns);\r\n\r\n return kendo.rolesFromNamespaces(all);\r\n },\r\n\r\n dataBound: function(e) {\r\n var idx,\r\n length,\r\n widget = this.widget,\r\n items = e.addedItems || widget.items(),\r\n dataSource = widget[fieldName],\r\n view,\r\n parents,\r\n hds = kendo.data.HierarchicalDataSource;\r\n\r\n if (hds && dataSource instanceof hds) {\r\n // suppress binding of HDS items, because calling view() on root\r\n // will return only root items, and widget.items() returns all items\r\n return;\r\n }\r\n\r\n if (items.length) {\r\n view = e.addedDataItems || dataSource.flatView();\r\n parents = this.bindings[bindingName]._parents();\r\n\r\n for (idx = 0, length = view.length; idx < length; idx++) {\r\n if (items[idx]) {\r\n bindElement(items[idx], view[idx], this._ns(e.ns), [view[idx]].concat(parents));\r\n }\r\n }\r\n }\r\n },\r\n\r\n refresh: function(e) {\r\n var that = this,\r\n source,\r\n widget = that.widget,\r\n select, multiselect, dropdowntree;\r\n\r\n e = e || {};\r\n\r\n if (!e.action) {\r\n that.destroy();\r\n\r\n widget.bind(\"dataBinding\", that._dataBinding);\r\n widget.bind(\"dataBound\", that._dataBound);\r\n widget.bind(\"itemChange\", that._itemChange);\r\n\r\n source = that.bindings[bindingName].get();\r\n\r\n if (widget[fieldName] instanceof kendo.data.DataSource && widget[fieldName] != source) {\r\n if (source instanceof kendo.data.DataSource) {\r\n widget[setter](source);\r\n } else if (source && source._dataSource) {\r\n widget[setter](source._dataSource);\r\n } else {\r\n select = kendo.ui.Select && widget instanceof kendo.ui.Select;\r\n multiselect = kendo.ui.MultiSelect && widget instanceof kendo.ui.MultiSelect;\r\n dropdowntree = kendo.ui.DropDownTree && widget instanceof kendo.ui.DropDownTree;\r\n\r\n if (!dropdowntree) {\r\n widget[fieldName].data(source);\r\n } else {\r\n widget.treeview[fieldName].data(source);\r\n }\r\n\r\n if (that.bindings.value && (select || multiselect)) {\r\n widget.value(retrievePrimitiveValues(that.bindings.value.get(), widget.options.dataValueField));\r\n }\r\n }\r\n }\r\n }\r\n },\r\n\r\n destroy: function() {\r\n var widget = this.widget;\r\n\r\n widget.unbind(\"dataBinding\", this._dataBinding);\r\n widget.unbind(\"dataBound\", this._dataBound);\r\n widget.unbind(\"itemChange\", this._itemChange);\r\n }\r\n });\r\n }\r\n\r\n binders.widget = {\r\n events: Binder.extend({\r\n init: function(widget, bindings, options) {\r\n Binder.fn.init.call(this, widget.element[0], bindings, options);\r\n this.widget = widget;\r\n this.handlers = {};\r\n },\r\n\r\n refresh: function(key) {\r\n var binding = this.bindings.events[key],\r\n handler = this.handlers[key];\r\n\r\n if (handler) {\r\n this.widget.unbind(key, handler);\r\n }\r\n\r\n handler = binding.get();\r\n\r\n this.handlers[key] = function(e) {\r\n e.data = binding.source;\r\n\r\n handler(e);\r\n\r\n if (e.data === binding.source) {\r\n delete e.data;\r\n }\r\n };\r\n\r\n this.widget.bind(key, this.handlers[key]);\r\n },\r\n\r\n destroy: function() {\r\n var handler;\r\n\r\n for (handler in this.handlers) {\r\n this.widget.unbind(handler, this.handlers[handler]);\r\n }\r\n }\r\n }),\r\n\r\n checked: Binder.extend({\r\n init: function(widget, bindings, options) {\r\n Binder.fn.init.call(this, widget.element[0], bindings, options);\r\n\r\n this.widget = widget;\r\n this._change = this.change.bind(this);\r\n this.widget.bind(CHANGE, this._change);\r\n },\r\n change: function() {\r\n this.bindings[CHECKED].set(this.value());\r\n },\r\n\r\n refresh: function() {\r\n var val = this.bindings[CHECKED].get();\r\n\r\n if (this.element.type === \"radio\") {\r\n if (val !== undefined$1) {\r\n this.widget.check(val.toString() === this.value());\r\n } else {\r\n this.widget.check(false);\r\n }\r\n } else {\r\n this.widget.check(val === true);\r\n }\r\n },\r\n\r\n value: function() {\r\n var element = this.element,\r\n value = element.value;\r\n\r\n if (value == \"on\" || value == \"off\" || this.element.type == \"checkbox\") {\r\n value = element.checked;\r\n }\r\n\r\n return value;\r\n },\r\n\r\n destroy: function() {\r\n this.widget.unbind(CHANGE, this._change);\r\n }\r\n }),\r\n\r\n start: Binder.extend({\r\n init: function(widget, bindings, options) {\r\n Binder.fn.init.call(this, widget.element[0], bindings, options);\r\n this._change = this.change.bind(this);\r\n this.widget = widget;\r\n this.widget.bind(CHANGE, this._change);\r\n },\r\n\r\n change: function() {\r\n this.bindings.start.set(this.widget.range().start);\r\n },\r\n\r\n refresh: function() {\r\n var that = this;\r\n var start = this.bindings.start.get();\r\n var end = that.widget._range ? that.widget._range.end : null;\r\n this.widget.range({ start: start, end: end });\r\n },\r\n\r\n destroy: function() {\r\n this.widget.unbind(CHANGE, this._change);\r\n }\r\n }),\r\n\r\n end: Binder.extend({\r\n init: function(widget, bindings, options) {\r\n Binder.fn.init.call(this, widget.element[0], bindings, options);\r\n this._change = this.change.bind(this);\r\n this.widget = widget;\r\n this.widget.bind(CHANGE, this._change);\r\n },\r\n\r\n change: function() {\r\n this.bindings.end.set(this.widget.range().end);\r\n },\r\n\r\n refresh: function() {\r\n var that = this;\r\n var end = this.bindings.end.get();\r\n var start = that.widget._range ? that.widget._range.start : null;\r\n this.widget.range({ start: start, end: end });\r\n },\r\n\r\n destroy: function() {\r\n this.widget.unbind(CHANGE, this._change);\r\n }\r\n }),\r\n\r\n visible: Binder.extend({\r\n init: function(widget, bindings, options) {\r\n Binder.fn.init.call(this, widget.element[0], bindings, options);\r\n\r\n this.widget = widget;\r\n },\r\n\r\n refresh: function() {\r\n var visible = this.bindings.visible.get();\r\n this.widget.wrapper[0].style.display = visible ? \"\" : \"none\";\r\n }\r\n }),\r\n\r\n invisible: Binder.extend({\r\n init: function(widget, bindings, options) {\r\n Binder.fn.init.call(this, widget.element[0], bindings, options);\r\n\r\n this.widget = widget;\r\n },\r\n\r\n refresh: function() {\r\n var invisible = this.bindings.invisible.get();\r\n this.widget.wrapper[0].style.display = invisible ? \"none\" : \"\";\r\n }\r\n }),\r\n\r\n floatingLabel: Binder.extend({\r\n init: function(widget, bindings, options) {\r\n Binder.fn.init.call(this, widget.element[0], bindings, options);\r\n\r\n if (!widget.floatingLabel) {\r\n return;\r\n }\r\n\r\n widget.floatingLabel.refresh();\r\n }\r\n }),\r\n\r\n enabled: Binder.extend({\r\n init: function(widget, bindings, options) {\r\n Binder.fn.init.call(this, widget.element[0], bindings, options);\r\n\r\n this.widget = widget;\r\n this.readonly = this.element.readOnly;\r\n },\r\n\r\n refresh: function() {\r\n if (this.widget.enable) {\r\n this.widget.enable(this.bindings.enabled.get());\r\n }\r\n if (this.readonly && this.widget.readonly) {\r\n this.widget.readonly(this.readonly);\r\n }\r\n }\r\n }),\r\n\r\n disabled: Binder.extend({\r\n init: function(widget, bindings, options) {\r\n Binder.fn.init.call(this, widget.element[0], bindings, options);\r\n\r\n this.widget = widget;\r\n },\r\n\r\n refresh: function() {\r\n if (this.widget.enable) {\r\n this.widget.enable(!this.bindings.disabled.get());\r\n }\r\n }\r\n }),\r\n\r\n source: dataSourceBinding(\"source\", \"dataSource\", \"setDataSource\"),\r\n\r\n value: Binder.extend({\r\n init: function(widget, bindings, options) {\r\n Binder.fn.init.call(this, widget.element[0], bindings, options);\r\n\r\n this.widget = widget;\r\n this._change = this.change.bind(this);\r\n this.widget.first(CHANGE, this._change);\r\n\r\n var value = this.bindings.value.get();\r\n\r\n this._valueIsObservableObject = !options.valuePrimitive && (value == null || value instanceof ObservableObject);\r\n this._valueIsObservableArray = value instanceof ObservableArray;\r\n this._initChange = false;\r\n },\r\n\r\n _source: function() {\r\n var source;\r\n\r\n if (this.widget.dataItem) {\r\n source = this.widget.dataItem();\r\n if (source && source instanceof ObservableObject) {\r\n return [source];\r\n }\r\n }\r\n\r\n if (this.bindings.source) {\r\n source = this.bindings.source.get();\r\n }\r\n\r\n if (!source || source instanceof kendo.data.DataSource) {\r\n source = this.widget.dataSource.flatView();\r\n }\r\n\r\n return source;\r\n },\r\n\r\n change: function() {\r\n var value = this.widget.value(),\r\n field = this.options.dataValueField || this.options.dataTextField,\r\n isArray = toString.call(value) === \"[object Array]\",\r\n isObservableObject = this._valueIsObservableObject,\r\n valueIndex, valueLength, values = [],\r\n sourceItem, sourceValue,\r\n idx, length, source;\r\n\r\n this._initChange = true;\r\n\r\n if (field) {\r\n\r\n if (value === \"\" && (isObservableObject || this.options.valuePrimitive)) {\r\n value = null;\r\n } else {\r\n source = this._source();\r\n\r\n if (isArray) {\r\n valueLength = value.length;\r\n values = value.slice(0);\r\n }\r\n\r\n for (idx = 0, length = source.length; idx < length; idx++) {\r\n sourceItem = source[idx];\r\n sourceValue = sourceItem.get(field);\r\n\r\n if (isArray) {\r\n for (valueIndex = 0; valueIndex < valueLength; valueIndex++) {\r\n if (sourceValue == values[valueIndex]) {\r\n values[valueIndex] = sourceItem;\r\n break;\r\n }\r\n }\r\n } else if (sourceValue == value) {\r\n value = isObservableObject ? sourceItem : sourceValue;\r\n break;\r\n }\r\n }\r\n\r\n if (values[0]) {\r\n if (this._valueIsObservableArray) {\r\n value = values;\r\n } else if (isObservableObject || !field) {\r\n value = values[0];\r\n } else {\r\n value = values[0].get(field);\r\n }\r\n }\r\n }\r\n }\r\n\r\n this.bindings.value.set(value);\r\n this._initChange = false;\r\n },\r\n\r\n refresh: function() {\r\n if (!this._initChange) {\r\n var widget = this.widget;\r\n var options = widget.options;\r\n var textField = options.dataTextField;\r\n var valueField = options.dataValueField || textField;\r\n var value = this.bindings.value.get();\r\n var text = options.text || \"\";\r\n var idx = 0, length;\r\n var values = [];\r\n\r\n if (value === undefined$1) {\r\n value = null;\r\n }\r\n\r\n if (valueField) {\r\n if (value instanceof ObservableArray) {\r\n for (length = value.length; idx < length; idx++) {\r\n values[idx] = value[idx].get(valueField);\r\n }\r\n value = values;\r\n } else if (value instanceof ObservableObject) {\r\n text = value.get(textField);\r\n value = value.get(valueField);\r\n }\r\n }\r\n\r\n if (options.autoBind === false && !options.cascadeFrom && widget.listView && !widget.listView.bound()) {\r\n if (textField === valueField && !text) {\r\n text = value;\r\n }\r\n\r\n if (!text && (value || value === 0) && options.valuePrimitive) {\r\n widget.value(value);\r\n } else {\r\n widget._preselect(value, text);\r\n }\r\n } else {\r\n widget.value(value);\r\n }\r\n }\r\n\r\n this._initChange = false;\r\n },\r\n\r\n destroy: function() {\r\n this.widget.unbind(CHANGE, this._change);\r\n }\r\n }),\r\n dropdowntree: {\r\n value: Binder.extend({\r\n init: function(widget, bindings, options) {\r\n Binder.fn.init.call(this, widget.element[0], bindings, options);\r\n\r\n this.widget = widget;\r\n this._change = this.change.bind(this);\r\n this.widget.first(CHANGE, this._change);\r\n this._initChange = false;\r\n },\r\n\r\n change: function() {\r\n var that = this,\r\n oldValues = that.bindings[VALUE].get(),\r\n valuePrimitive = that.options.valuePrimitive,\r\n selectedNode = that.widget.treeview.select(),\r\n nonPrimitiveValues = that.widget._isMultipleSelection() ? that.widget._getAllChecked() : (that.widget.treeview.dataItem(selectedNode) || that.widget.value()),\r\n newValues = (valuePrimitive || that.widget.options.autoBind === false) ? that.widget.value() : nonPrimitiveValues;\r\n\r\n var field = this.options.dataValueField || this.options.dataTextField;\r\n\r\n newValues = newValues.slice ? newValues.slice(0) : newValues;\r\n\r\n that._initChange = true;\r\n\r\n if (oldValues instanceof ObservableArray) {\r\n var remove = [];\r\n var newLength = newValues.length;\r\n var i = 0, j = 0;\r\n var old = oldValues[i];\r\n var same = false;\r\n var removeIndex;\r\n var newValue;\r\n var found;\r\n\r\n while (old !== undefined$1) {\r\n found = false;\r\n for (j = 0; j < newLength; j++) {\r\n if (valuePrimitive) {\r\n same = newValues[j] == old;\r\n } else {\r\n newValue = newValues[j];\r\n\r\n newValue = newValue.get ? newValue.get(field) : newValue;\r\n same = newValue == (old.get ? old.get(field) : old);\r\n }\r\n\r\n if (same) {\r\n newValues.splice(j, 1);\r\n newLength -= 1;\r\n found = true;\r\n break;\r\n }\r\n }\r\n\r\n if (!found) {\r\n remove.push(old);\r\n arraySplice(oldValues, i, 1);\r\n removeIndex = i;\r\n } else {\r\n i += 1;\r\n }\r\n\r\n old = oldValues[i];\r\n }\r\n\r\n arraySplice(oldValues, oldValues.length, 0, newValues);\r\n\r\n if (remove.length) {\r\n oldValues.trigger(\"change\", {\r\n action: \"remove\",\r\n items: remove,\r\n index: removeIndex\r\n });\r\n }\r\n\r\n if (newValues.length) {\r\n oldValues.trigger(\"change\", {\r\n action: \"add\",\r\n items: newValues,\r\n index: oldValues.length - 1\r\n });\r\n }\r\n } else {\r\n that.bindings[VALUE].set(newValues);\r\n }\r\n\r\n that._initChange = false;\r\n },\r\n\r\n refresh: function() {\r\n if (!this._initChange) {\r\n var options = this.options,\r\n widget = this.widget,\r\n field = options.dataValueField || options.dataTextField,\r\n value = this.bindings.value.get(),\r\n data = value,\r\n idx = 0, length,\r\n values = [],\r\n selectedValue;\r\n\r\n if (field) {\r\n if (value instanceof ObservableArray) {\r\n for (length = value.length; idx < length; idx++) {\r\n selectedValue = value[idx];\r\n values[idx] = selectedValue.get ? selectedValue.get(field) : selectedValue;\r\n }\r\n value = values;\r\n } else if (value instanceof ObservableObject) {\r\n value = value.get(field);\r\n }\r\n }\r\n if (options.autoBind === false && options.valuePrimitive !== true) {\r\n widget._preselect(data, value);\r\n } else {\r\n widget.value(value);\r\n }\r\n }\r\n },\r\n\r\n destroy: function() {\r\n this.widget.unbind(CHANGE, this._change);\r\n }\r\n })\r\n },\r\n gantt: {\r\n dependencies: dataSourceBinding(\"dependencies\", \"dependencies\", \"setDependenciesDataSource\")\r\n },\r\n\r\n multiselect: {\r\n value: Binder.extend({\r\n init: function(widget, bindings, options) {\r\n Binder.fn.init.call(this, widget.element[0], bindings, options);\r\n\r\n this.widget = widget;\r\n this._change = this.change.bind(this);\r\n this.widget.first(CHANGE, this._change);\r\n this._initChange = false;\r\n },\r\n\r\n change: function() {\r\n var that = this,\r\n oldValues = that.bindings[VALUE].get(),\r\n valuePrimitive = that.options.valuePrimitive,\r\n newValues = valuePrimitive ? that.widget.value() : that.widget.dataItems();\r\n\r\n var field = this.options.dataValueField || this.options.dataTextField;\r\n\r\n newValues = newValues.slice(0);\r\n\r\n that._initChange = true;\r\n\r\n if (oldValues instanceof ObservableArray) {\r\n var remove = [];\r\n\r\n var newLength = newValues.length;\r\n\r\n var i = 0, j = 0;\r\n var old = oldValues[i];\r\n var same = false;\r\n var removeIndex;\r\n var newValue;\r\n var found;\r\n\r\n while (old !== undefined$1) {\r\n found = false;\r\n for (j = 0; j < newLength; j++) {\r\n if (valuePrimitive) {\r\n same = newValues[j] == old;\r\n } else {\r\n newValue = newValues[j];\r\n\r\n newValue = newValue.get ? newValue.get(field) : newValue;\r\n same = newValue == (old.get ? old.get(field) : old);\r\n }\r\n\r\n if (same) {\r\n newValues.splice(j, 1);\r\n newLength -= 1;\r\n found = true;\r\n break;\r\n }\r\n }\r\n\r\n if (!found) {\r\n remove.push(old);\r\n arraySplice(oldValues, i, 1);\r\n removeIndex = i;\r\n } else {\r\n i += 1;\r\n }\r\n\r\n old = oldValues[i];\r\n }\r\n\r\n arraySplice(oldValues, oldValues.length, 0, newValues);\r\n\r\n if (remove.length) {\r\n oldValues.trigger(\"change\", {\r\n action: \"remove\",\r\n items: remove,\r\n index: removeIndex\r\n });\r\n }\r\n\r\n if (newValues.length) {\r\n oldValues.trigger(\"change\", {\r\n action: \"add\",\r\n items: newValues,\r\n index: oldValues.length - 1\r\n });\r\n }\r\n } else {\r\n that.bindings[VALUE].set(newValues);\r\n }\r\n\r\n that._initChange = false;\r\n },\r\n\r\n refresh: function() {\r\n if (!this._initChange) {\r\n var options = this.options,\r\n widget = this.widget,\r\n field = options.dataValueField || options.dataTextField,\r\n value = this.bindings.value.get(),\r\n data = value,\r\n idx = 0, length,\r\n values = [],\r\n selectedValue;\r\n\r\n if (value === undefined$1) {\r\n value = null;\r\n }\r\n\r\n if (field) {\r\n if (value instanceof ObservableArray) {\r\n for (length = value.length; idx < length; idx++) {\r\n selectedValue = value[idx];\r\n values[idx] = selectedValue.get ? selectedValue.get(field) : selectedValue;\r\n }\r\n value = values;\r\n } else if (value instanceof ObservableObject) {\r\n value = value.get(field);\r\n }\r\n }\r\n\r\n if (options.autoBind === false && options.valuePrimitive !== true && !widget._isBound()) {\r\n widget._preselect(data, value);\r\n } else {\r\n widget.value(value);\r\n }\r\n }\r\n },\r\n\r\n destroy: function() {\r\n this.widget.unbind(CHANGE, this._change);\r\n }\r\n\r\n })\r\n },\r\n scheduler: {\r\n source: dataSourceBinding(\"source\", \"dataSource\", \"setDataSource\").extend({\r\n dataBound: function(e) {\r\n var idx;\r\n var length;\r\n var widget = this.widget;\r\n var elements = e.addedItems || widget.items();\r\n var data, parents;\r\n\r\n if (elements.length) {\r\n data = e.addedDataItems || widget.dataItems();\r\n parents = this.bindings.source._parents();\r\n\r\n for (idx = 0, length = data.length; idx < length; idx++) {\r\n bindElement(elements[idx], data[idx], this._ns(e.ns), [data[idx]].concat(parents));\r\n }\r\n }\r\n }\r\n })\r\n },\r\n\r\n grid: {\r\n source: dataSourceBinding(\"source\", \"dataSource\", \"setDataSource\").extend({\r\n dataBound: function(e) {\r\n var idx,\r\n length,\r\n widget = this.widget,\r\n elements = e.addedItems || widget.items(),\r\n parents,\r\n data;\r\n\r\n if (elements.length) {\r\n data = e.addedDataItems || widget.dataItems();\r\n parents = this.bindings.source._parents();\r\n\r\n for (idx = 0, length = data.length; idx < length; idx++) {\r\n bindElement(elements[idx], data[idx], this._ns(e.ns), [data[idx]].concat(parents));\r\n }\r\n }\r\n }\r\n })\r\n },\r\n\r\n badge: {\r\n text: Binder.extend({\r\n init: function(widget, bindings, options) {\r\n Binder.fn.init.call(this, widget.element[0], bindings, options);\r\n\r\n this.widget = widget;\r\n },\r\n refresh: function() {\r\n var text = this.bindings.text.get();\r\n\r\n if (text == null) {\r\n text = \"\";\r\n }\r\n this.widget.text(text);\r\n }\r\n })\r\n }\r\n };\r\n\r\n var arraySplice = function(arr, idx, remove, add) {\r\n add = add || [];\r\n remove = remove || 0;\r\n\r\n var addLength = add.length;\r\n var oldLength = arr.length;\r\n\r\n var shifted = [].slice.call(arr, idx + remove);\r\n var shiftedLength = shifted.length;\r\n var index;\r\n\r\n if (addLength) {\r\n addLength = idx + addLength;\r\n index = 0;\r\n\r\n for (; idx < addLength; idx++) {\r\n arr[idx] = add[index];\r\n index++;\r\n }\r\n\r\n arr.length = addLength;\r\n } else if (remove) {\r\n arr.length = idx;\r\n\r\n remove += idx;\r\n while (idx < remove) {\r\n delete arr[--remove];\r\n }\r\n }\r\n\r\n if (shiftedLength) {\r\n shiftedLength = idx + shiftedLength;\r\n index = 0;\r\n\r\n for (; idx < shiftedLength; idx++) {\r\n arr[idx] = shifted[index];\r\n index++;\r\n }\r\n\r\n arr.length = shiftedLength;\r\n }\r\n\r\n idx = arr.length;\r\n\r\n while (idx < oldLength) {\r\n delete arr[idx];\r\n idx++;\r\n }\r\n };\r\n\r\n var BindingTarget = Class.extend( {\r\n init: function(target, options) {\r\n this.target = target;\r\n this.options = options;\r\n this.toDestroy = [];\r\n },\r\n\r\n bind: function(bindings) {\r\n var key,\r\n hasValue,\r\n hasSource,\r\n hasEvents,\r\n hasChecked,\r\n hasCss,\r\n widgetBinding = this instanceof WidgetBindingTarget,\r\n specificBinders = this.binders();\r\n\r\n for (key in bindings) {\r\n if (key == VALUE) {\r\n hasValue = true;\r\n } else if (key == SOURCE) {\r\n hasSource = true;\r\n } else if (key == EVENTS && !widgetBinding) {\r\n hasEvents = true;\r\n } else if (key == CHECKED) {\r\n hasChecked = true;\r\n } else if (key == CSS) {\r\n hasCss = true;\r\n } else {\r\n this.applyBinding(key, bindings, specificBinders);\r\n }\r\n }\r\n if (hasSource) {\r\n this.applyBinding(SOURCE, bindings, specificBinders);\r\n }\r\n\r\n if (hasValue) {\r\n this.applyBinding(VALUE, bindings, specificBinders);\r\n }\r\n\r\n if (hasChecked) {\r\n this.applyBinding(CHECKED, bindings, specificBinders);\r\n }\r\n\r\n if (hasEvents && !widgetBinding) {\r\n this.applyBinding(EVENTS, bindings, specificBinders);\r\n }\r\n\r\n if (hasCss && !widgetBinding) {\r\n this.applyBinding(CSS, bindings, specificBinders);\r\n }\r\n\r\n if (widgetBinding && this.target && this.target.floatingLabel) {\r\n this.applyBinding(\"floatingLabel\", bindings, specificBinders);\r\n }\r\n },\r\n\r\n binders: function() {\r\n return binders[this.target.nodeName.toLowerCase()] || {};\r\n },\r\n\r\n applyBinding: function(name, bindings, specificBinders) {\r\n var binder = specificBinders[name] || binders[name],\r\n toDestroy = this.toDestroy,\r\n attribute,\r\n binding = bindings[name];\r\n\r\n if (binder) {\r\n binder = new binder(this.target, bindings, this.options);\r\n\r\n toDestroy.push(binder);\r\n\r\n if (binding instanceof Binding) {\r\n binder.bind(binding);\r\n toDestroy.push(binding);\r\n } else {\r\n for (attribute in binding) {\r\n binder.bind(binding, attribute);\r\n toDestroy.push(binding[attribute]);\r\n }\r\n }\r\n } else if (name !== \"template\") {\r\n throw new Error(\"The \" + name + \" binding is not supported by the \" + this.target.nodeName.toLowerCase() + \" element\");\r\n }\r\n },\r\n\r\n destroy: function() {\r\n var idx,\r\n length,\r\n toDestroy = this.toDestroy;\r\n\r\n for (idx = 0, length = toDestroy.length; idx < length; idx++) {\r\n toDestroy[idx].destroy();\r\n }\r\n }\r\n });\r\n\r\n var WidgetBindingTarget = BindingTarget.extend( {\r\n binders: function() {\r\n return binders.widget[this.target.options.name.toLowerCase()] || {};\r\n },\r\n\r\n applyBinding: function(name, bindings, specificBinders) {\r\n var binder = specificBinders[name] || binders.widget[name],\r\n toDestroy = this.toDestroy,\r\n attribute,\r\n binding = bindings[name];\r\n\r\n if (binder) {\r\n binder = new binder(this.target, bindings, this.target.options);\r\n\r\n toDestroy.push(binder);\r\n\r\n\r\n if (binding instanceof Binding) {\r\n binder.bind(binding);\r\n toDestroy.push(binding);\r\n } else {\r\n for (attribute in binding) {\r\n binder.bind(binding, attribute);\r\n toDestroy.push(binding[attribute]);\r\n }\r\n }\r\n } else {\r\n throw new Error(\"The \" + name + \" binding is not supported by the \" + this.target.options.name + \" widget\");\r\n }\r\n }\r\n });\r\n\r\n function bindingTargetForRole(element, roles) {\r\n var widget = kendo.initWidget(element, {}, roles);\r\n\r\n if (widget) {\r\n return new WidgetBindingTarget(widget);\r\n }\r\n }\r\n\r\n var keyValueRegExp = /[A-Za-z0-9_\\-]+:(\\{([^}]*)\\}|[^,}]+)/g,\r\n whiteSpaceRegExp = /\\s/g;\r\n\r\n function parseBindings(bind) {\r\n var result = {},\r\n idx,\r\n length,\r\n token,\r\n colonIndex,\r\n key,\r\n value,\r\n tokens;\r\n\r\n tokens = bind.match(keyValueRegExp);\r\n\r\n for (idx = 0, length = tokens.length; idx < length; idx++) {\r\n token = tokens[idx];\r\n colonIndex = token.indexOf(\":\");\r\n\r\n key = token.substring(0, colonIndex);\r\n value = token.substring(colonIndex + 1);\r\n\r\n if (value.charAt(0) == \"{\") {\r\n value = parseBindings(value);\r\n }\r\n\r\n result[key] = value;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n function createBindings(bindings, source, type) {\r\n var binding,\r\n result = {};\r\n\r\n for (binding in bindings) {\r\n result[binding] = new type(source, bindings[binding]);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n function bindElement(element, source, roles, parents) {\r\n\r\n if (!element || element.getAttribute(\"data-\" + kendo.ns + \"stop\")) {\r\n return;\r\n }\r\n\r\n var role = element.getAttribute(\"data-\" + kendo.ns + \"role\"),\r\n idx,\r\n bind = element.getAttribute(\"data-\" + kendo.ns + \"bind\"),\r\n childrenCopy = [],\r\n deep = true,\r\n bindings,\r\n options = {},\r\n target;\r\n\r\n parents = parents || [source];\r\n\r\n if (role || bind) {\r\n unbindElement(element, false);\r\n }\r\n\r\n if (role) {\r\n target = bindingTargetForRole(element, roles);\r\n }\r\n\r\n if (bind) {\r\n bind = parseBindings(bind.replace(whiteSpaceRegExp, \"\"));\r\n\r\n if (!target) {\r\n options = kendo.parseOptions(element, { textField: \"\", valueField: \"\", template: \"\", valueUpdate: CHANGE, valuePrimitive: false, autoBind: true }, source);\r\n options.roles = roles;\r\n target = new BindingTarget(element, options);\r\n }\r\n\r\n target.source = source;\r\n\r\n bindings = createBindings(bind, parents, Binding);\r\n\r\n if (options.template) {\r\n bindings.template = new TemplateBinding(parents, \"\", options.template);\r\n }\r\n\r\n if (bindings.click) {\r\n bind.events = bind.events || {};\r\n bind.events.click = bind.click;\r\n bindings.click.destroy();\r\n delete bindings.click;\r\n }\r\n\r\n if (bindings.source) {\r\n deep = false;\r\n }\r\n\r\n if (bind.attr) {\r\n bindings.attr = createBindings(bind.attr, parents, Binding);\r\n }\r\n\r\n if (bind.style) {\r\n bindings.style = createBindings(bind.style, parents, Binding);\r\n }\r\n\r\n if (bind.events) {\r\n bindings.events = createBindings(bind.events, parents, EventBinding);\r\n }\r\n\r\n if (bind.css) {\r\n bindings.css = createBindings(bind.css, parents, Binding);\r\n }\r\n\r\n target.bind(bindings);\r\n }\r\n\r\n if (target) {\r\n element.kendoBindingTarget = target;\r\n }\r\n\r\n var children = element.children;\r\n if (deep && children && !element.getAttribute(\"data-\" + kendo.ns + \"stop\")) {\r\n // https://github.com/telerik/kendo/issues/1240 for the weirdness.\r\n for (idx = 0; idx < children.length; idx++) {\r\n childrenCopy[idx] = children[idx];\r\n }\r\n\r\n for (idx = 0; idx < childrenCopy.length; idx++) {\r\n bindElement(childrenCopy[idx], source, roles, parents);\r\n }\r\n }\r\n }\r\n\r\n function bind(dom, object) {\r\n var idx,\r\n length,\r\n node,\r\n roles = kendo.rolesFromNamespaces([].slice.call(arguments, 2));\r\n\r\n object = kendo.observable(object);\r\n dom = $(dom);\r\n\r\n for (idx = 0, length = dom.length; idx < length; idx++) {\r\n node = dom[idx];\r\n if (node.nodeType === 1) {\r\n bindElement(node, object, roles);\r\n }\r\n }\r\n }\r\n\r\n function unbindElement(element, destroyWidget) {\r\n var bindingTarget = element.kendoBindingTarget;\r\n\r\n if (bindingTarget) {\r\n bindingTarget.destroy();\r\n\r\n if (deleteExpando) {\r\n delete element.kendoBindingTarget;\r\n } else if (element.removeAttribute) {\r\n element.removeAttribute(\"kendoBindingTarget\");\r\n } else {\r\n element.kendoBindingTarget = null;\r\n }\r\n }\r\n\r\n if (destroyWidget) {\r\n var widget = kendo.widgetInstance($(element));\r\n if (widget && typeof widget.destroy === FUNCTION) {\r\n widget.destroy();\r\n }\r\n }\r\n }\r\n\r\n function unbindElementTree(element, destroyWidgets) {\r\n\r\n if (!element) {\r\n return;\r\n }\r\n\r\n unbindElement(element, destroyWidgets);\r\n\r\n unbindElementChildren(element, destroyWidgets);\r\n }\r\n\r\n function unbindElementChildren(element, destroyWidgets) {\r\n var children = element.children;\r\n\r\n if (children) {\r\n for (var idx = 0, length = children.length; idx < length; idx++) {\r\n unbindElementTree(children[idx], destroyWidgets);\r\n }\r\n }\r\n }\r\n\r\n function unbind(dom) {\r\n var idx, length;\r\n\r\n dom = $(dom);\r\n\r\n for (idx = 0, length = dom.length; idx < length; idx++ ) {\r\n unbindElementTree(dom[idx], false);\r\n }\r\n }\r\n\r\n function notify(widget, namespace) {\r\n var element = widget.element,\r\n bindingTarget = element[0].kendoBindingTarget;\r\n\r\n if (bindingTarget) {\r\n bind(element, bindingTarget.source, namespace);\r\n }\r\n }\r\n\r\n function retrievePrimitiveValues(value, valueField) {\r\n var values = [];\r\n var idx = 0;\r\n var length;\r\n var item;\r\n\r\n if (!valueField) {\r\n return value;\r\n }\r\n\r\n if (value instanceof ObservableArray) {\r\n for (length = value.length; idx < length; idx++) {\r\n item = value[idx];\r\n values[idx] = item.get ? item.get(valueField) : item[valueField];\r\n }\r\n value = values;\r\n } else if (value instanceof ObservableObject) {\r\n value = value.get(valueField);\r\n }\r\n\r\n return value;\r\n }\r\n\r\n kendo.unbind = unbind;\r\n kendo.bind = bind;\r\n kendo.data.binders = binders;\r\n kendo.data.Binder = Binder;\r\n kendo.notify = notify;\r\n\r\n kendo.observable = function(object) {\r\n if (!(object instanceof ObservableObject)) {\r\n object = new ObservableObject(object);\r\n }\r\n\r\n return object;\r\n };\r\n\r\n kendo.observableHierarchy = function(array) {\r\n var dataSource = kendo.data.HierarchicalDataSource.create(array);\r\n\r\n function recursiveRead(data) {\r\n var i, children;\r\n\r\n for (i = 0; i < data.length; i++) {\r\n data[i]._initChildren();\r\n\r\n children = data[i].children;\r\n\r\n children.fetch();\r\n\r\n data[i].items = children.data();\r\n\r\n recursiveRead(data[i].items);\r\n }\r\n }\r\n\r\n dataSource.fetch();\r\n\r\n recursiveRead(dataSource.data());\r\n\r\n dataSource._data._dataSource = dataSource;\r\n\r\n return dataSource._data;\r\n };\r\n\r\n })(window.kendo.jQuery);\r\n var kendo$2w = kendo;\r\n\r\n let __meta__$2A = {\r\n id: \"fx\",\r\n name: \"Effects\",\r\n category: \"framework\",\r\n description: \"Required for animation effects in all Kendo UI widgets.\",\r\n depends: [ \"core\" ]\r\n };\r\n\r\n (function($, undefined$1) {\r\n let kendo = window.kendo,\r\n fx = kendo.effects,\r\n each = $.each,\r\n extend = $.extend,\r\n support = kendo.support,\r\n matrix3dRegExp = /matrix3?d?\\s*\\(.*,\\s*([\\d\\.\\-]+)\\w*?,\\s*([\\d\\.\\-]+)\\w*?,\\s*([\\d\\.\\-]+)\\w*?,\\s*([\\d\\.\\-]+)\\w*?/i,\r\n translateXRegExp = /translatex?$/i,\r\n oldEffectsRegExp = /(zoom|fade|expand)(\\w+)/,\r\n singleEffectRegExp = /(zoom|fade|expand)/,\r\n transformProps = [\"perspective\", \"rotate\", \"rotatex\", \"rotatey\", \"rotatez\", \"rotate3d\", \"scale\", \"scalex\", \"scaley\", \"scalez\", \"scale3d\", \"skew\", \"skewx\", \"skewy\", \"translate\", \"translatex\", \"translatey\", \"translatez\", \"translate3d\", \"matrix\", \"matrix3d\"],\r\n transform2d = [\"rotate\", \"scale\", \"scalex\", \"scaley\", \"skew\", \"skewx\", \"skewy\", \"translate\", \"translatex\", \"translatey\", \"matrix\"],\r\n round = Math.round,\r\n BLANK = \"\",\r\n PX = \"px\",\r\n NONE = \"none\",\r\n AUTO = \"auto\",\r\n WIDTH = \"width\",\r\n HEIGHT = \"height\",\r\n HIDDEN = \"hidden\",\r\n ORIGIN = \"origin\",\r\n ABORT_ID = \"abortId\",\r\n OVERFLOW = \"overflow\",\r\n POSITION = \"position\",\r\n COMPLETE_CALLBACK = \"completeCallback\",\r\n TRANSITIONEND = \"transitionend\",\r\n TRANSITION = \"transition\",\r\n TRANSFORM = \"transform\",\r\n BACKFACE = \"backface-visibility\",\r\n PERSPECTIVE = \"perspective\",\r\n DEFAULT_PERSPECTIVE = \"1500px\",\r\n TRANSFORM_PERSPECTIVE = \"perspective(\" + DEFAULT_PERSPECTIVE + \")\",\r\n directions = {\r\n left: {\r\n reverse: \"right\",\r\n property: \"left\",\r\n transition: \"translatex\",\r\n vertical: false,\r\n modifier: -1\r\n },\r\n right: {\r\n reverse: \"left\",\r\n property: \"left\",\r\n transition: \"translatex\",\r\n vertical: false,\r\n modifier: 1\r\n },\r\n down: {\r\n reverse: \"up\",\r\n property: \"top\",\r\n transition: \"translatey\",\r\n vertical: true,\r\n modifier: 1\r\n },\r\n up: {\r\n reverse: \"down\",\r\n property: \"top\",\r\n transition: \"translatey\",\r\n vertical: true,\r\n modifier: -1\r\n },\r\n top: {\r\n reverse: \"bottom\"\r\n },\r\n bottom: {\r\n reverse: \"top\"\r\n },\r\n \"in\": {\r\n reverse: \"out\",\r\n modifier: -1\r\n },\r\n out: {\r\n reverse: \"in\",\r\n modifier: 1\r\n },\r\n\r\n vertical: {\r\n reverse: \"vertical\"\r\n },\r\n\r\n horizontal: {\r\n reverse: \"horizontal\"\r\n }\r\n };\r\n\r\n kendo.directions = directions;\r\n\r\n extend($.fn, {\r\n kendoStop: function(clearQueue, gotoEnd) {\r\n return fx.stopQueue(this, clearQueue || false, gotoEnd || false);\r\n }\r\n });\r\n\r\n kendo.toggleClass = function(element, classes, options, add) {\r\n if (classes) {\r\n classes = classes.split(\" \");\r\n\r\n options = extend({\r\n exclusive: \"all\",\r\n duration: 400,\r\n ease: \"ease-out\"\r\n }, options);\r\n\r\n element.css(TRANSITION, options.exclusive + \" \" + options.duration + \"ms \" + options.ease);\r\n setTimeout(function() {\r\n element.css(TRANSITION, \"\").css(HEIGHT);\r\n }, options.duration); // TODO: this should fire a kendoAnimate session instead.\r\n\r\n each(classes, function(idx, value) {\r\n element.toggleClass(value, add);\r\n });\r\n }\r\n\r\n return element;\r\n };\r\n\r\n kendo.parseEffects = function(input, mirror) {\r\n var effects = {};\r\n\r\n if (typeof input === \"string\") {\r\n each(input.split(\" \"), function(idx, value) {\r\n var redirectedEffect = !singleEffectRegExp.test(value),\r\n resolved = value.replace(oldEffectsRegExp, function(match, $1, $2) {\r\n return $1 + \":\" + $2.toLowerCase();\r\n }), // Support for old zoomIn/fadeOut style, now deprecated.\r\n effect = resolved.split(\":\"),\r\n direction = effect[1],\r\n effectBody = {};\r\n\r\n if (effect.length > 1) {\r\n effectBody.direction = (mirror && redirectedEffect ? directions[direction].reverse : direction);\r\n }\r\n\r\n effects[effect[0]] = effectBody;\r\n });\r\n } else {\r\n each(input, function(idx) {\r\n var direction = this.direction;\r\n\r\n if (direction && mirror && !singleEffectRegExp.test(idx)) {\r\n this.direction = directions[direction].reverse;\r\n }\r\n\r\n effects[idx] = this;\r\n });\r\n }\r\n\r\n return effects;\r\n };\r\n\r\n function parseInteger(value) {\r\n return parseInt(value, 10);\r\n }\r\n\r\n function parseCSS(element, property) {\r\n return parseInteger(element.css(property));\r\n }\r\n\r\n function keys(obj) {\r\n var acc = [];\r\n for (var propertyName in obj) {\r\n acc.push(propertyName);\r\n }\r\n return acc;\r\n }\r\n\r\n function strip3DTransforms(properties) {\r\n for (var key in properties) {\r\n if (transformProps.indexOf(key) != -1 && transform2d.indexOf(key) == -1) {\r\n delete properties[key];\r\n }\r\n }\r\n\r\n return properties;\r\n }\r\n\r\n function normalizeCSS(element, properties) {\r\n var transformation = [], cssValues = {}, lowerKey, key, value, isTransformed;\r\n\r\n for (key in properties) {\r\n lowerKey = key.toLowerCase();\r\n isTransformed = transformProps.indexOf(lowerKey) != -1;\r\n\r\n if (!support.hasHW3D && isTransformed && transform2d.indexOf(lowerKey) == -1) {\r\n delete properties[key];\r\n } else {\r\n value = properties[key];\r\n\r\n if (isTransformed) {\r\n transformation.push(key + \"(\" + value + \")\");\r\n } else {\r\n cssValues[key] = value;\r\n }\r\n }\r\n }\r\n\r\n if (transformation.length) {\r\n cssValues[TRANSFORM] = transformation.join(\" \");\r\n }\r\n\r\n return cssValues;\r\n }\r\n\r\n extend(fx, {\r\n transition: function(element, properties, options) {\r\n let css,\r\n delay = 0,\r\n oldKeys = element.data(\"keys\") || [],\r\n timeoutID;\r\n\r\n options = extend({\r\n duration: 200,\r\n ease: \"ease-out\",\r\n complete: null,\r\n exclusive: \"all\"\r\n },\r\n options\r\n );\r\n\r\n let stopTransitionCalled = false;\r\n\r\n let stopTransition = function() {\r\n if (!stopTransitionCalled) {\r\n stopTransitionCalled = true;\r\n\r\n if (timeoutID) {\r\n clearTimeout(timeoutID);\r\n timeoutID = null;\r\n }\r\n\r\n element\r\n .removeData(ABORT_ID)\r\n .dequeue()\r\n .css(TRANSITION, \"\")\r\n .css(TRANSITION);\r\n\r\n options.complete.call(element);\r\n }\r\n };\r\n\r\n options.duration = $.fx ? $.fx.speeds[options.duration] || options.duration : options.duration;\r\n\r\n css = normalizeCSS(element, properties);\r\n\r\n $.merge(oldKeys, keys(css));\r\n\r\n if ($.hasOwnProperty(\"uniqueSort\")) {\r\n element\r\n .data(\"keys\", $.uniqueSort(oldKeys))\r\n .height();\r\n } else {\r\n element\r\n .data(\"keys\", $.unique(oldKeys))\r\n .height();\r\n }\r\n\r\n element.css(TRANSITION, options.exclusive + \" \" + options.duration + \"ms \" + options.ease).css(TRANSITION);\r\n element.css(css).css(TRANSFORM);\r\n\r\n /**\r\n * Use transitionEnd event for browsers who support it - but duplicate it with setTimeout, as the transitionEnd event will not be triggered if no CSS properties change.\r\n * This should be cleaned up at some point (widget by widget), and refactored to widgets not relying on the complete callback if no transition occurs.\r\n *\r\n * For IE9 and below, resort to setTimeout.\r\n */\r\n element.one(TRANSITIONEND, stopTransition);\r\n if (options.duration !== 0) {\r\n delay = 500;\r\n }\r\n\r\n timeoutID = setTimeout(stopTransition, options.duration + delay);\r\n element.data(ABORT_ID, timeoutID);\r\n element.data(COMPLETE_CALLBACK, stopTransition);\r\n },\r\n\r\n stopQueue: function(element, clearQueue, gotoEnd) {\r\n var cssValues,\r\n taskKeys = element.data(\"keys\"),\r\n retainPosition = (!gotoEnd && taskKeys),\r\n completeCallback = element.data(COMPLETE_CALLBACK);\r\n\r\n if (retainPosition) {\r\n cssValues = kendo.getComputedStyles(element[0], taskKeys);\r\n }\r\n\r\n if (completeCallback) {\r\n completeCallback();\r\n }\r\n\r\n if (retainPosition) {\r\n element.css(cssValues);\r\n }\r\n\r\n return element\r\n .removeData(\"keys\")\r\n .stop(clearQueue);\r\n }\r\n });\r\n\r\n function animationProperty(element, property) {\r\n let transform = element.css(TRANSFORM);\r\n if (transform == NONE) {\r\n return property == \"scale\" ? 1 : 0;\r\n }\r\n\r\n let match = transform.match(new RegExp(property + \"\\\\s*\\\\(([\\\\d\\\\w\\\\.]+)\")),\r\n computed = 0;\r\n\r\n if (match) {\r\n computed = parseInteger(match[1]);\r\n } else {\r\n match = transform.match(matrix3dRegExp) || [0, 0, 0, 0, 0];\r\n property = property.toLowerCase();\r\n\r\n if (translateXRegExp.test(property)) {\r\n computed = parseFloat(match[3] / match[2]);\r\n } else if (property == \"translatey\") {\r\n computed = parseFloat(match[4] / match[2]);\r\n } else if (property == \"scale\") {\r\n computed = parseFloat(match[2]);\r\n } else if (property == \"rotate\") {\r\n computed = parseFloat(Math.atan2(match[2], match[1]));\r\n }\r\n }\r\n\r\n return computed;\r\n }\r\n\r\n var EffectSet = kendo.Class.extend({\r\n init: function(element, options) {\r\n var that = this;\r\n\r\n that.element = element;\r\n that.effects = [];\r\n that.options = options;\r\n that.restore = [];\r\n },\r\n\r\n run: function(effects) {\r\n let that = this,\r\n effect,\r\n idx, jdx,\r\n length = effects.length,\r\n element = that.element,\r\n options = that.options,\r\n deferred = $.Deferred(),\r\n start = {},\r\n end = {},\r\n target,\r\n children,\r\n childrenLength;\r\n\r\n that.effects = effects;\r\n\r\n deferred.done(that.complete.bind(that));\r\n\r\n element.data(\"animating\", true);\r\n\r\n for (idx = 0; idx < length; idx ++) {\r\n effect = effects[idx];\r\n\r\n effect.setReverse(options.reverse);\r\n effect.setOptions(options);\r\n\r\n that.addRestoreProperties(effect.restore);\r\n\r\n effect.prepare(start, end);\r\n\r\n children = effect.children();\r\n\r\n for (jdx = 0, childrenLength = children.length; jdx < childrenLength; jdx ++) {\r\n children[jdx].duration(options.duration).run();\r\n }\r\n }\r\n\r\n // legacy support for options.properties\r\n for (var effectName in options.effects) {\r\n extend(end, options.effects[effectName].properties);\r\n }\r\n\r\n // Show the element initially\r\n if (!element.is(\":visible\")) {\r\n extend(start, { display: element.data(\"olddisplay\") || \"block\" });\r\n }\r\n\r\n if (!options.reset) {\r\n target = element.data(\"targetTransform\");\r\n\r\n if (target) {\r\n start = extend(target, start);\r\n }\r\n }\r\n\r\n start = normalizeCSS(element, start);\r\n\r\n element.css(start)\r\n .css(TRANSFORM); // Nudge\r\n\r\n for (idx = 0; idx < length; idx ++) {\r\n effects[idx].setup();\r\n }\r\n\r\n if (options.init) {\r\n options.init();\r\n }\r\n\r\n element.data(\"targetTransform\", end);\r\n fx.animate(element, end, extend({}, options, { complete: deferred.resolve }));\r\n\r\n return deferred.promise();\r\n },\r\n\r\n stop: function() {\r\n $(this.element).kendoStop(true, true);\r\n },\r\n\r\n addRestoreProperties: function(restore) {\r\n var element = this.element,\r\n value,\r\n i = 0,\r\n length = restore.length;\r\n\r\n for (; i < length; i ++) {\r\n value = restore[i];\r\n\r\n this.restore.push(value);\r\n\r\n if (!element.data(value)) {\r\n element.data(value, element.css(value));\r\n }\r\n }\r\n },\r\n\r\n restoreCallback: function() {\r\n var element = this.element;\r\n\r\n for (var i = 0, length = this.restore.length; i < length; i ++) {\r\n var value = this.restore[i];\r\n element.css(value, element.data(value));\r\n }\r\n },\r\n\r\n complete: function() {\r\n let that = this,\r\n idx = 0,\r\n element = that.element,\r\n options = that.options,\r\n effects = that.effects,\r\n length = effects.length;\r\n\r\n element\r\n .removeData(\"animating\")\r\n .dequeue(); // call next animation from the queue\r\n\r\n if (options.hide) {\r\n element.data(\"olddisplay\", element.css(\"display\")).hide();\r\n }\r\n\r\n this.restoreCallback();\r\n\r\n for (; idx < length; idx ++) {\r\n effects[idx].teardown();\r\n }\r\n\r\n if (options.completeCallback) {\r\n options.completeCallback(element);\r\n }\r\n }\r\n });\r\n\r\n fx.promise = function(element, options) {\r\n var effects = [],\r\n effectClass,\r\n effectSet = new EffectSet(element, options),\r\n parsedEffects = kendo.parseEffects(options.effects),\r\n effect;\r\n\r\n options.effects = parsedEffects;\r\n\r\n for (var effectName in parsedEffects) {\r\n effectClass = fx[capitalize(effectName)];\r\n\r\n if (effectClass) {\r\n effect = new effectClass(element, parsedEffects[effectName].direction);\r\n effects.push(effect);\r\n }\r\n }\r\n\r\n if (effects[0]) {\r\n effectSet.run(effects);\r\n } else { // Not sure how would an fx promise reach this state - means that you call kendoAnimate with no valid effects? Why?\r\n if (!element.is(\":visible\")) {\r\n element.css({ display: element.data(\"olddisplay\") || \"block\" }).css(\"display\");\r\n }\r\n\r\n if (options.init) {\r\n options.init();\r\n }\r\n\r\n element.dequeue();\r\n effectSet.complete();\r\n }\r\n };\r\n\r\n extend(fx, {\r\n animate: function(elements, properties, options) {\r\n let useTransition = options.transition !== false;\r\n delete options.transition;\r\n\r\n if (\"transition\" in fx && useTransition) {\r\n fx.transition(elements, properties, options);\r\n } else {\r\n elements.animate(strip3DTransforms(properties), { queue: false, show: false, hide: false, duration: options.duration, complete: options.complete }); // Stop animate from showing/hiding the element to be able to hide it later on.\r\n }\r\n }\r\n });\r\n\r\n fx.animatedPromise = fx.promise;\r\n\r\n var Effect = kendo.Class.extend({\r\n init: function(element, direction) {\r\n var that = this;\r\n that.element = element;\r\n that._direction = direction;\r\n that.options = {};\r\n that._additionalEffects = [];\r\n\r\n if (!that.restore) {\r\n that.restore = [];\r\n }\r\n },\r\n\r\n // Public API\r\n reverse: function() {\r\n this._reverse = true;\r\n return this.run();\r\n },\r\n\r\n play: function() {\r\n this._reverse = false;\r\n return this.run();\r\n },\r\n\r\n add: function(additional) {\r\n this._additionalEffects.push(additional);\r\n return this;\r\n },\r\n\r\n direction: function(value) {\r\n this._direction = value;\r\n return this;\r\n },\r\n\r\n duration: function(duration) {\r\n this._duration = duration;\r\n return this;\r\n },\r\n\r\n compositeRun: function() {\r\n var that = this,\r\n effectSet = new EffectSet(that.element, { reverse: that._reverse, duration: that._duration }),\r\n effects = that._additionalEffects.concat([ that ]);\r\n\r\n return effectSet.run(effects);\r\n },\r\n\r\n run: function() {\r\n if (this._additionalEffects && this._additionalEffects[0]) {\r\n return this.compositeRun();\r\n }\r\n\r\n let that = this,\r\n element = that.element,\r\n idx = 0,\r\n restore = that.restore,\r\n length = restore.length,\r\n value,\r\n deferred = $.Deferred(),\r\n start = {},\r\n end = {},\r\n target,\r\n children = that.children(),\r\n childrenLength = children.length;\r\n\r\n deferred.done(that._complete.bind(that));\r\n\r\n element.data(\"animating\", true);\r\n\r\n for (idx = 0; idx < length; idx ++) {\r\n value = restore[idx];\r\n\r\n if (!element.data(value)) {\r\n element.data(value, element.css(value));\r\n }\r\n }\r\n\r\n for (idx = 0; idx < childrenLength; idx ++) {\r\n children[idx].duration(that._duration).run();\r\n }\r\n\r\n that.prepare(start, end);\r\n\r\n if (!element.is(\":visible\")) {\r\n extend(start, { display: element.data(\"olddisplay\") || \"block\" });\r\n }\r\n\r\n target = element.data(\"targetTransform\");\r\n\r\n if (target) {\r\n start = extend(target, start);\r\n }\r\n\r\n start = normalizeCSS(element, start);\r\n\r\n element.css(start).css(TRANSFORM); // Trick webkit into re-rendering\r\n\r\n that.setup();\r\n\r\n element.data(\"targetTransform\", end);\r\n fx.animate(element, end, { duration: that._duration, complete: deferred.resolve });\r\n\r\n return deferred.promise();\r\n },\r\n\r\n stop: function() {\r\n var idx = 0,\r\n children = this.children(),\r\n childrenLength = children.length;\r\n\r\n for (idx = 0; idx < childrenLength; idx ++) {\r\n children[idx].stop();\r\n }\r\n\r\n $(this.element).kendoStop(true, true);\r\n return this;\r\n },\r\n\r\n restoreCallback: function() {\r\n var element = this.element;\r\n\r\n for (var i = 0, length = this.restore.length; i < length; i ++) {\r\n var value = this.restore[i];\r\n element.css(value, element.data(value));\r\n }\r\n },\r\n\r\n _complete: function() {\r\n let that = this,\r\n element = that.element;\r\n\r\n element\r\n .removeData(\"animating\")\r\n .dequeue(); // call next animation from the queue\r\n\r\n that.restoreCallback();\r\n\r\n if (that.shouldHide()) {\r\n element.data(\"olddisplay\", element.css(\"display\")).hide();\r\n }\r\n\r\n that.teardown();\r\n },\r\n\r\n /////////////////////////// Support for kendo.animate;\r\n setOptions: function(options) {\r\n extend(true, this.options, options);\r\n },\r\n\r\n children: function() {\r\n return [];\r\n },\r\n\r\n shouldHide: $.noop,\r\n\r\n setup: $.noop,\r\n prepare: $.noop,\r\n teardown: $.noop,\r\n directions: [],\r\n\r\n setReverse: function(reverse) {\r\n this._reverse = reverse;\r\n return this;\r\n }\r\n });\r\n\r\n function capitalize(word) {\r\n return word.charAt(0).toUpperCase() + word.substring(1);\r\n }\r\n\r\n function createEffect(name, definition) {\r\n var effectClass = Effect.extend(definition),\r\n directions = effectClass.prototype.directions;\r\n\r\n fx[capitalize(name)] = effectClass;\r\n\r\n fx.Element.prototype[name] = function(direction, opt1, opt2, opt3) {\r\n return new effectClass(this.element, direction, opt1, opt2, opt3);\r\n };\r\n\r\n each(directions, function(idx, theDirection) {\r\n fx.Element.prototype[name + capitalize(theDirection)] = function(opt1, opt2, opt3) {\r\n return new effectClass(this.element, theDirection, opt1, opt2, opt3);\r\n };\r\n });\r\n }\r\n\r\n var FOUR_DIRECTIONS = [\"left\", \"right\", \"up\", \"down\"],\r\n IN_OUT = [\"in\", \"out\"];\r\n\r\n createEffect(\"slideIn\", {\r\n directions: FOUR_DIRECTIONS,\r\n\r\n divisor: function(value) {\r\n this.options.divisor = value;\r\n return this;\r\n },\r\n\r\n prepare: function(start, end) {\r\n let that = this,\r\n tmp,\r\n element = that.element,\r\n outerWidth = kendo._outerWidth,\r\n outerHeight = kendo._outerHeight,\r\n direction = directions[that._direction],\r\n offset = -direction.modifier * (direction.vertical ? outerHeight(element) : outerWidth(element)),\r\n startValue = offset / (that.options && that.options.divisor || 1) + PX,\r\n endValue = \"0px\";\r\n\r\n if (that._reverse) {\r\n tmp = start;\r\n start = end;\r\n end = tmp;\r\n }\r\n\r\n start[direction.transition] = startValue;\r\n end[direction.transition] = endValue;\r\n }\r\n });\r\n\r\n createEffect(\"tile\", {\r\n directions: FOUR_DIRECTIONS,\r\n\r\n init: function(element, direction, previous) {\r\n Effect.prototype.init.call(this, element, direction);\r\n this.options = { previous: previous };\r\n },\r\n\r\n previousDivisor: function(value) {\r\n this.options.previousDivisor = value;\r\n return this;\r\n },\r\n\r\n children: function() {\r\n var that = this,\r\n reverse = that._reverse,\r\n previous = that.options.previous,\r\n divisor = that.options.previousDivisor || 1,\r\n dir = that._direction;\r\n\r\n var children = [ kendo.fx(that.element).slideIn(dir).setReverse(reverse) ];\r\n\r\n if (previous) {\r\n children.push( kendo.fx(previous).slideIn(directions[dir].reverse).divisor(divisor).setReverse(!reverse) );\r\n }\r\n\r\n return children;\r\n }\r\n });\r\n\r\n function createToggleEffect(name, property, defaultStart, defaultEnd) {\r\n createEffect(name, {\r\n directions: IN_OUT,\r\n\r\n startValue: function(value) {\r\n this._startValue = value;\r\n return this;\r\n },\r\n\r\n endValue: function(value) {\r\n this._endValue = value;\r\n return this;\r\n },\r\n\r\n shouldHide: function() {\r\n return this._shouldHide;\r\n },\r\n\r\n prepare: function(start, end) {\r\n var that = this,\r\n startValue,\r\n endValue,\r\n out = this._direction === \"out\",\r\n startDataValue = that.element.data(property),\r\n startDataValueIsSet = !(isNaN(startDataValue) || startDataValue == defaultStart);\r\n\r\n if (startDataValueIsSet) {\r\n startValue = startDataValue;\r\n } else if (typeof this._startValue !== \"undefined\") {\r\n startValue = this._startValue;\r\n } else {\r\n startValue = out ? defaultStart : defaultEnd;\r\n }\r\n\r\n if (typeof this._endValue !== \"undefined\") {\r\n endValue = this._endValue;\r\n } else {\r\n endValue = out ? defaultEnd : defaultStart;\r\n }\r\n\r\n if (this._reverse) {\r\n start[property] = endValue;\r\n end[property] = startValue;\r\n } else {\r\n start[property] = startValue;\r\n end[property] = endValue;\r\n }\r\n\r\n that._shouldHide = end[property] === defaultEnd;\r\n }\r\n });\r\n }\r\n\r\n createToggleEffect(\"fade\", \"opacity\", 1, 0);\r\n createToggleEffect(\"zoom\", \"scale\", 1, 0.01);\r\n\r\n createEffect(\"slideMargin\", {\r\n prepare: function(start, end) {\r\n var that = this,\r\n element = that.element,\r\n options = that.options,\r\n origin = element.data(ORIGIN),\r\n offset = options.offset,\r\n margin,\r\n reverse = that._reverse;\r\n\r\n if (!reverse && origin === null) {\r\n element.data(ORIGIN, parseFloat(element.css(\"margin-\" + options.axis)));\r\n }\r\n\r\n margin = (element.data(ORIGIN) || 0);\r\n end[\"margin-\" + options.axis] = !reverse ? margin + offset : margin;\r\n }\r\n });\r\n\r\n createEffect(\"slideTo\", {\r\n prepare: function(start, end) {\r\n let that = this,\r\n element = that.element,\r\n options = that.options,\r\n offset = options.offset.split(\",\"),\r\n reverse = that._reverse;\r\n\r\n end.translatex = !reverse ? offset[0] : 0;\r\n end.translatey = !reverse ? offset[1] : 0;\r\n\r\n element.css(\"left\");\r\n }\r\n });\r\n\r\n createEffect(\"expand\", {\r\n directions: [\"horizontal\", \"vertical\"],\r\n\r\n restore: [ OVERFLOW ],\r\n\r\n prepare: function(start, end) {\r\n var that = this,\r\n element = that.element,\r\n options = that.options,\r\n reverse = that._reverse,\r\n property = that._direction === \"vertical\" ? HEIGHT : WIDTH,\r\n setLength = element[0].style[property],\r\n oldLength = element.data(property),\r\n length = parseFloat(oldLength || setLength),\r\n realLength = round(element.css(property, AUTO)[property]());\r\n\r\n start.overflow = HIDDEN;\r\n\r\n length = (options && options.reset) ? realLength || length : length || realLength;\r\n\r\n end[property] = (reverse ? 0 : length) + PX;\r\n start[property] = (reverse ? length : 0) + PX;\r\n\r\n if (oldLength === undefined$1) {\r\n element.data(property, setLength);\r\n }\r\n },\r\n\r\n shouldHide: function() {\r\n return this._reverse;\r\n },\r\n\r\n teardown: function() {\r\n var that = this,\r\n element = that.element,\r\n property = that._direction === \"vertical\" ? HEIGHT : WIDTH,\r\n length = element.data(property);\r\n\r\n if (length == AUTO || length === BLANK) {\r\n setTimeout(function() { element.css(property, AUTO).css(property); }, 0); // jQuery animate complete callback in IE is called before the last animation step!\r\n }\r\n }\r\n });\r\n\r\n var TRANSFER_START_STATE = { position: \"absolute\", marginLeft: 0, marginTop: 0, scale: 1 };\r\n /**\r\n * Intersection point formulas are taken from here - http://zonalandeducation.com/mmts/intersections/intersectionOfTwoLines1/intersectionOfTwoLines1.html\r\n * Formula for a linear function from two points from here - http://demo.activemath.org/ActiveMath2/search/show.cmd?id=mbase://AC_UK_calculus/functions/ex_linear_equation_two_points\r\n * The transform origin point is the intersection point of the two lines from the top left corners/top right corners of the element and target.\r\n * The math and variables below MAY BE SIMPLIFIED (zeroes removed), but this would make the formula too cryptic.\r\n */\r\n createEffect(\"transfer\", {\r\n init: function(element, target) {\r\n this.element = element;\r\n this.options = { target: target };\r\n this.restore = [];\r\n },\r\n\r\n setup: function() {\r\n this.element.appendTo(document.body);\r\n },\r\n\r\n prepare: function(start, end) {\r\n var that = this,\r\n element = that.element,\r\n outerBox = fx.box(element),\r\n innerBox = fx.box(that.options.target),\r\n currentScale = animationProperty(element, \"scale\"),\r\n scale = fx.fillScale(innerBox, outerBox),\r\n transformOrigin = fx.transformOrigin(innerBox, outerBox);\r\n\r\n extend(start, TRANSFER_START_STATE);\r\n end.scale = 1;\r\n\r\n element.css(TRANSFORM, \"scale(1)\").css(TRANSFORM);\r\n element.css(TRANSFORM, \"scale(\" + currentScale + \")\");\r\n\r\n start.top = outerBox.top;\r\n start.left = outerBox.left;\r\n start.transformOrigin = transformOrigin.x + PX + \" \" + transformOrigin.y + PX;\r\n\r\n if (that._reverse) {\r\n start.scale = scale;\r\n } else {\r\n end.scale = scale;\r\n }\r\n }\r\n });\r\n\r\n\r\n var CLIPS = {\r\n top: \"rect(auto auto $size auto)\",\r\n bottom: \"rect($size auto auto auto)\",\r\n left: \"rect(auto $size auto auto)\",\r\n right: \"rect(auto auto auto $size)\"\r\n };\r\n\r\n var ROTATIONS = {\r\n top: { start: \"rotatex(0deg)\", end: \"rotatex(180deg)\" },\r\n bottom: { start: \"rotatex(-180deg)\", end: \"rotatex(0deg)\" },\r\n left: { start: \"rotatey(0deg)\", end: \"rotatey(-180deg)\" },\r\n right: { start: \"rotatey(180deg)\", end: \"rotatey(0deg)\" }\r\n };\r\n\r\n function clipInHalf(container, direction) {\r\n var vertical = kendo.directions[direction].vertical,\r\n size = (container[vertical ? HEIGHT : WIDTH]() / 2) + \"px\";\r\n\r\n return CLIPS[direction].replace(\"$size\", size);\r\n }\r\n\r\n createEffect(\"turningPage\", {\r\n directions: FOUR_DIRECTIONS,\r\n\r\n init: function(element, direction, container) {\r\n Effect.prototype.init.call(this, element, direction);\r\n this._container = container;\r\n },\r\n\r\n prepare: function(start, end) {\r\n var that = this,\r\n reverse = that._reverse,\r\n direction = reverse ? directions[that._direction].reverse : that._direction,\r\n rotation = ROTATIONS[direction];\r\n\r\n start.zIndex = 1;\r\n\r\n if (that._clipInHalf) {\r\n start.clip = clipInHalf(that._container, kendo.directions[direction].reverse);\r\n }\r\n\r\n start[BACKFACE] = HIDDEN;\r\n\r\n end[TRANSFORM] = TRANSFORM_PERSPECTIVE + (reverse ? rotation.start : rotation.end);\r\n start[TRANSFORM] = TRANSFORM_PERSPECTIVE + (reverse ? rotation.end : rotation.start);\r\n },\r\n\r\n setup: function() {\r\n this._container.append(this.element);\r\n },\r\n\r\n face: function(value) {\r\n this._face = value;\r\n return this;\r\n },\r\n\r\n shouldHide: function() {\r\n var that = this,\r\n reverse = that._reverse,\r\n face = that._face;\r\n\r\n return (reverse && !face) || (!reverse && face);\r\n },\r\n\r\n clipInHalf: function(value) {\r\n this._clipInHalf = value;\r\n return this;\r\n },\r\n\r\n temporary: function() {\r\n this.element.addClass('temp-page');\r\n return this;\r\n }\r\n });\r\n\r\n createEffect(\"staticPage\", {\r\n directions: FOUR_DIRECTIONS,\r\n\r\n init: function(element, direction, container) {\r\n Effect.prototype.init.call(this, element, direction);\r\n this._container = container;\r\n },\r\n\r\n restore: [\"clip\"],\r\n\r\n prepare: function(start, end) {\r\n var that = this,\r\n direction = that._reverse ? directions[that._direction].reverse : that._direction;\r\n\r\n start.clip = clipInHalf(that._container, direction);\r\n start.opacity = 0.999;\r\n end.opacity = 1;\r\n },\r\n\r\n shouldHide: function() {\r\n var that = this,\r\n reverse = that._reverse,\r\n face = that._face;\r\n\r\n return (reverse && !face) || (!reverse && face);\r\n },\r\n\r\n face: function(value) {\r\n this._face = value;\r\n return this;\r\n }\r\n });\r\n\r\n createEffect(\"pageturn\", {\r\n directions: [\"horizontal\", \"vertical\"],\r\n\r\n init: function(element, direction, face, back) {\r\n Effect.prototype.init.call(this, element, direction);\r\n this.options = {};\r\n this.options.face = face;\r\n this.options.back = back;\r\n },\r\n\r\n children: function() {\r\n var that = this,\r\n options = that.options,\r\n direction = that._direction === \"horizontal\" ? \"left\" : \"top\",\r\n reverseDirection = kendo.directions[direction].reverse,\r\n reverse = that._reverse,\r\n temp,\r\n faceClone = options.face.clone(true).removeAttr(\"id\"),\r\n backClone = options.back.clone(true).removeAttr(\"id\"),\r\n element = that.element;\r\n\r\n if (reverse) {\r\n temp = direction;\r\n direction = reverseDirection;\r\n reverseDirection = temp;\r\n }\r\n\r\n return [\r\n kendo.fx(options.face).staticPage(direction, element).face(true).setReverse(reverse),\r\n kendo.fx(options.back).staticPage(reverseDirection, element).setReverse(reverse),\r\n kendo.fx(faceClone).turningPage(direction, element).face(true).clipInHalf(true).temporary().setReverse(reverse),\r\n kendo.fx(backClone).turningPage(reverseDirection, element).clipInHalf(true).temporary().setReverse(reverse)\r\n ];\r\n },\r\n\r\n prepare: function(start, end) {\r\n start[PERSPECTIVE] = DEFAULT_PERSPECTIVE;\r\n start.transformStyle = \"preserve-3d\";\r\n // hack to trigger transition end.\r\n start.opacity = 0.999;\r\n end.opacity = 1;\r\n },\r\n\r\n teardown: function() {\r\n this.element.find(\".temp-page\").remove();\r\n }\r\n });\r\n\r\n createEffect(\"flip\", {\r\n directions: [\"horizontal\", \"vertical\"],\r\n\r\n init: function(element, direction, face, back) {\r\n Effect.prototype.init.call(this, element, direction);\r\n this.options = {};\r\n this.options.face = face;\r\n this.options.back = back;\r\n },\r\n\r\n children: function() {\r\n var that = this,\r\n options = that.options,\r\n direction = that._direction === \"horizontal\" ? \"left\" : \"top\",\r\n reverseDirection = kendo.directions[direction].reverse,\r\n reverse = that._reverse,\r\n temp,\r\n element = that.element;\r\n\r\n if (reverse) {\r\n temp = direction;\r\n direction = reverseDirection;\r\n reverseDirection = temp;\r\n }\r\n\r\n return [\r\n kendo.fx(options.face).turningPage(direction, element).face(true).setReverse(reverse),\r\n kendo.fx(options.back).turningPage(reverseDirection, element).setReverse(reverse)\r\n ];\r\n },\r\n\r\n prepare: function(start) {\r\n start[PERSPECTIVE] = DEFAULT_PERSPECTIVE;\r\n start.transformStyle = \"preserve-3d\";\r\n }\r\n });\r\n\r\n var RESTORE_OVERFLOW = !support.mobileOS.android;\r\n var IGNORE_TRANSITION_EVENT_SELECTOR = \".km-touch-scrollbar, .km-actionsheet-wrapper\";\r\n\r\n createEffect(\"replace\", {\r\n _before: $.noop,\r\n _after: $.noop,\r\n init: function(element, previous, transitionClass) {\r\n Effect.prototype.init.call(this, element);\r\n this._previous = $(previous);\r\n this._transitionClass = transitionClass;\r\n },\r\n\r\n duration: function() {\r\n throw new Error(\"The replace effect does not support duration setting; the effect duration may be customized through the transition class rule\");\r\n },\r\n\r\n beforeTransition: function(callback) {\r\n this._before = callback;\r\n return this;\r\n },\r\n\r\n afterTransition: function(callback) {\r\n this._after = callback;\r\n return this;\r\n },\r\n\r\n _both: function() {\r\n return $().add(this._element).add(this._previous);\r\n },\r\n\r\n _containerClass: function() {\r\n var direction = this._direction,\r\n containerClass = \"k-fx k-fx-start k-fx-\" + this._transitionClass;\r\n\r\n if (direction) {\r\n containerClass += \" k-fx-\" + direction;\r\n }\r\n\r\n if (this._reverse) {\r\n containerClass += \" k-fx-reverse\";\r\n }\r\n\r\n return containerClass;\r\n },\r\n\r\n complete: function(e) {\r\n if (!this.deferred || (e && $(e.target).is(IGNORE_TRANSITION_EVENT_SELECTOR))) {\r\n return;\r\n }\r\n\r\n var container = this.container;\r\n\r\n container\r\n .removeClass(\"k-fx-end\")\r\n .removeClass(this._containerClass())\r\n .off(TRANSITIONEND, this.completeProxy);\r\n\r\n this._previous.hide().removeClass(\"k-fx-current\");\r\n this.element.removeClass(\"k-fx-next\");\r\n\r\n if (RESTORE_OVERFLOW) {\r\n container.css(OVERFLOW, \"\");\r\n }\r\n\r\n if (!this.isAbsolute) {\r\n this._both().css(POSITION, \"\");\r\n }\r\n\r\n this.deferred.resolve();\r\n delete this.deferred;\r\n },\r\n\r\n run: function() {\r\n if (this._additionalEffects && this._additionalEffects[0]) {\r\n return this.compositeRun();\r\n }\r\n\r\n let that = this,\r\n element = that.element,\r\n previous = that._previous,\r\n container = element.parents().filter(previous.parents()).first(),\r\n both = that._both(),\r\n deferred = $.Deferred(),\r\n originalPosition = element.css(POSITION),\r\n originalOverflow;\r\n\r\n // edge case for grid/scheduler, where the previous is already destroyed.\r\n if (!container.length) {\r\n container = element.parent();\r\n }\r\n\r\n this.container = container;\r\n this.deferred = deferred;\r\n this.isAbsolute = originalPosition == \"absolute\";\r\n\r\n if (!this.isAbsolute) {\r\n both.css(POSITION, \"absolute\");\r\n }\r\n\r\n if (RESTORE_OVERFLOW) {\r\n originalOverflow = container.css(OVERFLOW);\r\n container.css(OVERFLOW, \"hidden\");\r\n }\r\n\r\n element.addClass(\"k-fx-hidden\");\r\n\r\n container.addClass(this._containerClass());\r\n\r\n this.completeProxy = this.complete.bind(this);\r\n container.on(TRANSITIONEND, this.completeProxy);\r\n\r\n kendo.animationFrame(function() {\r\n element.removeClass(\"k-fx-hidden\").addClass(\"k-fx-next\");\r\n previous.css(\"display\", \"\").addClass(\"k-fx-current\");\r\n that._before(previous, element);\r\n kendo.animationFrame(function() {\r\n container.removeClass(\"k-fx-start\").addClass(\"k-fx-end\");\r\n that._after(previous, element);\r\n });\r\n });\r\n\r\n return deferred.promise();\r\n },\r\n\r\n stop: function() {\r\n this.complete();\r\n }\r\n });\r\n\r\n var Animation = kendo.Class.extend({\r\n init: function() {\r\n var that = this;\r\n that._tickProxy = that._tick.bind(that);\r\n that._started = false;\r\n },\r\n\r\n tick: $.noop,\r\n done: $.noop,\r\n onEnd: $.noop,\r\n onCancel: $.noop,\r\n\r\n start: function() {\r\n if (!this.enabled()) {\r\n return;\r\n }\r\n\r\n if (!this.done()) {\r\n this._started = true;\r\n kendo.animationFrame(this._tickProxy);\r\n } else {\r\n this.onEnd();\r\n }\r\n },\r\n\r\n enabled: function() {\r\n return true;\r\n },\r\n\r\n cancel: function() {\r\n this._started = false;\r\n this.onCancel();\r\n },\r\n\r\n _tick: function() {\r\n var that = this;\r\n if (!that._started) { return; }\r\n\r\n that.tick();\r\n\r\n if (!that.done()) {\r\n kendo.animationFrame(that._tickProxy);\r\n } else {\r\n that._started = false;\r\n that.onEnd();\r\n }\r\n }\r\n });\r\n\r\n var Transition = Animation.extend({\r\n init: function(options) {\r\n var that = this;\r\n extend(that, options);\r\n Animation.fn.init.call(that);\r\n },\r\n\r\n done: function() {\r\n return this.timePassed() >= this.duration;\r\n },\r\n\r\n timePassed: function() {\r\n return Math.min(this.duration, (new Date()) - this.startDate);\r\n },\r\n\r\n moveTo: function(options) {\r\n var that = this,\r\n movable = that.movable;\r\n\r\n that.initial = movable[that.axis];\r\n that.delta = options.location - that.initial;\r\n\r\n that.duration = typeof options.duration == \"number\" ? options.duration : 300;\r\n\r\n that.tick = that._easeProxy(options.ease);\r\n\r\n that.startDate = new Date();\r\n that.start();\r\n },\r\n\r\n _easeProxy: function(ease) {\r\n var that = this;\r\n\r\n return function() {\r\n that.movable.moveAxis(that.axis, ease(that.timePassed(), that.initial, that.delta, that.duration));\r\n };\r\n }\r\n });\r\n\r\n extend(Transition, {\r\n easeOutExpo: function(t, b, c, d) {\r\n return (t == d) ? b + c : c * (-Math.pow(2, -10 * t / d) + 1) + b;\r\n },\r\n\r\n easeOutBack: function(t, b, c, d, s) {\r\n s = 1.70158;\r\n return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b;\r\n }\r\n });\r\n\r\n fx.Animation = Animation;\r\n fx.Transition = Transition;\r\n fx.createEffect = createEffect;\r\n\r\n fx.box = function(element) {\r\n element = $(element);\r\n var result = element.offset();\r\n result.width = kendo._outerWidth(element);\r\n result.height = kendo._outerHeight(element);\r\n return result;\r\n };\r\n\r\n fx.transformOrigin = function(inner, outer) {\r\n var x = (inner.left - outer.left) * outer.width / (outer.width - inner.width),\r\n y = (inner.top - outer.top) * outer.height / (outer.height - inner.height);\r\n\r\n return {\r\n x: isNaN(x) ? 0 : x,\r\n y: isNaN(y) ? 0 : y\r\n };\r\n };\r\n\r\n fx.fillScale = function(inner, outer) {\r\n return Math.min(inner.width / outer.width, inner.height / outer.height);\r\n };\r\n\r\n fx.fitScale = function(inner, outer) {\r\n return Math.max(inner.width / outer.width, inner.height / outer.height);\r\n };\r\n })(window.kendo.jQuery);\r\n var kendo$2v = kendo;\r\n\r\n var __meta__$2z = {\r\n id: \"view\",\r\n name: \"View\",\r\n category: \"framework\",\r\n description: \"The View class instantiates and handles the events of a certain screen from the application.\",\r\n depends: [ \"core\", \"binder\", \"fx\" ],\r\n hidden: false\r\n };\r\n\r\n (function($, undefined$1) {\r\n var kendo = window.kendo,\r\n attr = kendo.attr,\r\n ui = kendo.ui,\r\n attrValue = kendo.attrValue,\r\n directiveSelector = kendo.directiveSelector,\r\n Observable = kendo.Observable,\r\n Widget = kendo.ui.Widget,\r\n roleSelector = kendo.roleSelector,\r\n\r\n SCRIPT = \"SCRIPT\",\r\n INIT = \"init\",\r\n TRANSITION_START = \"transitionStart\",\r\n TRANSITION_END = \"transitionEnd\",\r\n SHOW = \"show\",\r\n HIDE = \"hide\",\r\n ATTACH = \"attach\",\r\n DETACH = \"detach\",\r\n sizzleErrorRegExp = /unrecognized expression/;\r\n\r\n var LOAD_START = \"loadStart\";\r\n var LOAD_COMPLETE = \"loadComplete\";\r\n var SHOW_START = \"showStart\";\r\n var SAME_VIEW_REQUESTED = \"sameViewRequested\";\r\n var VIEW_SHOW = \"viewShow\";\r\n var VIEW_TYPE_DETERMINED = \"viewTypeDetermined\";\r\n var AFTER = \"after\";\r\n var classNames = {\r\n content: \"k-content\",\r\n view: \"k-view\",\r\n stretchedView: \"k-stretched-view\",\r\n widget: \"k-widget\",\r\n header: \"k-header\",\r\n footer: \"k-footer\"\r\n };\r\n\r\n var View = kendo.ui.Widget.extend({\r\n init: function(content, options) {\r\n var that = this;\r\n options = options || {};\r\n that.id = kendo.guid();\r\n\r\n Observable.fn.init.call(that);\r\n this.options = $.extend({}, this.options, options);\r\n\r\n that.content = content;\r\n\r\n if (that.options.renderOnInit) {\r\n Widget.fn.init.call(that, that._createElement(), options);\r\n }\r\n\r\n if (that.options.wrapInSections) {\r\n that._renderSections();\r\n }\r\n\r\n that.tagName = options.tagName || \"div\";\r\n that.model = options.model;\r\n that._wrap = options.wrap !== false;\r\n this._evalTemplate = options.evalTemplate || false;\r\n this._useWithBlock = options.useWithBlock;\r\n that._fragments = {};\r\n\r\n that.bind([ INIT, SHOW, HIDE, TRANSITION_START, TRANSITION_END ], options);\r\n },\r\n\r\n options: {\r\n name: \"View\",\r\n renderOnInit: false,\r\n wrapInSections: false,\r\n detachOnHide: true,\r\n detachOnDestroy: true\r\n },\r\n\r\n render: function(container) {\r\n var that = this,\r\n notInitialized = !that.element;\r\n\r\n // The order below matters - kendo.bind should happen when the element is in the DOM, and show should be triggered after init.\r\n\r\n if (notInitialized) {\r\n that.element = that._createElement();\r\n }\r\n\r\n if (container) {\r\n $(container).append(that.element);\r\n }\r\n\r\n if (notInitialized) {\r\n kendo.bind(that.element, that.model);\r\n that.trigger(INIT);\r\n }\r\n\r\n if (container) {\r\n that._eachFragment(ATTACH);\r\n that.trigger(SHOW);\r\n }\r\n\r\n return that.element;\r\n },\r\n\r\n clone: function() {\r\n return new ViewClone(this);\r\n },\r\n\r\n triggerBeforeShow: function() {\r\n return true;\r\n },\r\n\r\n triggerBeforeHide: function() {\r\n return true;\r\n },\r\n\r\n showStart: function() {\r\n var that = this;\r\n var element = that.render();\r\n\r\n if (element) {\r\n element.css(\"display\", \"\");\r\n }\r\n\r\n this.trigger(SHOW_START, { view: this });\r\n },\r\n\r\n showEnd: function() {\r\n },\r\n\r\n hideEnd: function() {\r\n this.hide();\r\n },\r\n\r\n beforeTransition: function(type) {\r\n this.trigger(TRANSITION_START, { type: type });\r\n },\r\n\r\n afterTransition: function(type) {\r\n this.trigger(TRANSITION_END, { type: type });\r\n },\r\n\r\n hide: function() {\r\n if (this.options.detachOnHide) {\r\n this._eachFragment(DETACH);\r\n $(this.element).detach();\r\n }\r\n\r\n this.trigger(HIDE);\r\n },\r\n\r\n destroy: function() {\r\n var that = this;\r\n var element = that.element;\r\n\r\n if (element) {\r\n Widget.fn.destroy.call(that);\r\n\r\n kendo.unbind(element);\r\n kendo.destroy(element);\r\n\r\n if (that.options.detachOnDestroy) {\r\n element.remove();\r\n }\r\n }\r\n },\r\n\r\n // ported from mobile view\r\n purge: function() {\r\n var that = this;\r\n\r\n that.destroy();\r\n $(that.element).add(that.content).add(that.wrapper).off().remove();\r\n },\r\n\r\n fragments: function(fragments) {\r\n $.extend(this._fragments, fragments);\r\n },\r\n\r\n _eachFragment: function(methodName) {\r\n for (var placeholder in this._fragments) {\r\n this._fragments[placeholder][methodName](this, placeholder);\r\n }\r\n },\r\n\r\n _createElement: function() {\r\n var that = this,\r\n wrapper = \"<\" + that.tagName + \">\",\r\n element,\r\n content;\r\n\r\n try {\r\n content = $(document.getElementById(that.content) || that.content); // support passing id without #\r\n\r\n if (content[0].tagName === SCRIPT) {\r\n content = content.html();\r\n }\r\n } catch (e) {\r\n if (sizzleErrorRegExp.test(e.message)) {\r\n content = that.content;\r\n }\r\n }\r\n\r\n if (typeof content === \"string\") {\r\n content = content.replace(/^\\s+|\\s+$/g, '');\r\n if (that._evalTemplate) {\r\n content = kendo.template(content, { useWithBlock: that._useWithBlock })(that.model || {});\r\n }\r\n\r\n element = $(wrapper).append(content);\r\n // drop the wrapper if asked - this seems like the easiest (although not very intuitive) way to avoid messing up templates with questionable content, like this one for instance:\r\n // \r\n if (!that._wrap) {\r\n element = element.contents();\r\n }\r\n } else {\r\n element = content;\r\n if (that._evalTemplate) {\r\n var result = $(kendo.template($(\"
    \").append(element.clone(true)).html(), { useWithBlock: that._useWithBlock })(that.model || {}));\r\n\r\n // template uses DOM\r\n if ($.contains(document, element[0])) {\r\n element.replaceWith(result);\r\n }\r\n\r\n element = result;\r\n }\r\n if (that._wrap) {\r\n element = element.wrapAll(wrapper).parent();\r\n }\r\n }\r\n\r\n return element;\r\n },\r\n\r\n _renderSections: function() {\r\n var that = this;\r\n\r\n if (that.options.wrapInSections) {\r\n that._wrapper();\r\n that._createContent();\r\n that._createHeader();\r\n that._createFooter();\r\n }\r\n },\r\n\r\n _wrapper: function() {\r\n var that = this;\r\n var content = that.content;\r\n\r\n if (content.is(roleSelector(\"view\"))) {\r\n that.wrapper = that.content;\r\n } else {\r\n that.wrapper = content\r\n .wrap('
    ')\r\n .parent();\r\n }\r\n\r\n var wrapper = that.wrapper;\r\n\r\n wrapper.attr(\"id\", that.id);\r\n\r\n wrapper.addClass(classNames.view);\r\n wrapper.addClass(classNames.widget);\r\n wrapper.attr(\"role\", \"view\");\r\n },\r\n\r\n _createContent: function() {\r\n var that = this;\r\n var wrapper = $(that.wrapper);\r\n var contentSelector = roleSelector(\"content\");\r\n\r\n if (!wrapper.children(contentSelector)[0]) {\r\n var ccontentElements = wrapper.children().filter(function() {\r\n var child = $(this);\r\n if (!child.is(roleSelector(\"header\")) && !child.is(roleSelector(\"footer\"))) {\r\n return child;\r\n }\r\n });\r\n\r\n ccontentElements.wrap(\"
    ');\r\n }\r\n\r\n // use contentElement instead of content as view.content can be a string\r\n this.contentElement = wrapper.children(roleSelector(\"content\"));\r\n\r\n this.contentElement\r\n .addClass(classNames.stretchedView)\r\n .addClass(classNames.content);\r\n },\r\n\r\n _createHeader: function() {\r\n var that = this;\r\n var wrapper = that.wrapper;\r\n\r\n this.header = wrapper.children(roleSelector(\"header\")).addClass(classNames.header);\r\n },\r\n\r\n _createFooter: function() {\r\n var that = this;\r\n var wrapper = that.wrapper;\r\n\r\n this.footer = wrapper.children(roleSelector(\"footer\")).addClass(classNames.footer);\r\n }\r\n });\r\n\r\n var ViewClone = kendo.Class.extend({\r\n init: function(view) {\r\n $.extend(this, {\r\n element: view.element.clone(true),\r\n transition: view.transition,\r\n id: view.id\r\n });\r\n\r\n view.element.parent().append(this.element);\r\n },\r\n\r\n hideEnd: function() {\r\n this.element.remove();\r\n },\r\n\r\n beforeTransition: $.noop,\r\n afterTransition: $.noop\r\n });\r\n\r\n var Layout = View.extend({\r\n init: function(content, options) {\r\n View.fn.init.call(this, content, options);\r\n this.containers = {};\r\n },\r\n\r\n container: function(selector) {\r\n var container = this.containers[selector];\r\n\r\n if (!container) {\r\n container = this._createContainer(selector);\r\n this.containers[selector] = container;\r\n }\r\n\r\n return container;\r\n },\r\n\r\n showIn: function(selector, view, transition) {\r\n this.container(selector).show(view, transition);\r\n },\r\n\r\n _createContainer: function(selector) {\r\n var root = this.render(),\r\n element = root.find(selector),\r\n container;\r\n\r\n if (!element.length && root.is(selector)) {\r\n if (root.is(selector)) {\r\n element = root;\r\n } else {\r\n\r\n throw new Error(\"can't find a container with the specified \" + selector + \" selector\");\r\n }\r\n }\r\n\r\n container = new ViewContainer(element);\r\n\r\n container.bind(\"accepted\", function(e) {\r\n e.view.render(element);\r\n });\r\n\r\n return container;\r\n }\r\n });\r\n\r\n var Fragment = View.extend({\r\n attach: function(view, placeholder) {\r\n view.element.find(placeholder).replaceWith(this.render());\r\n },\r\n\r\n detach: function() {\r\n }\r\n });\r\n\r\n var transitionRegExp = /^(\\w+)(:(\\w+))?( (\\w+))?$/;\r\n\r\n function parseTransition(transition) {\r\n if (!transition) {\r\n return {};\r\n }\r\n\r\n var matches = transition.match(transitionRegExp) || [];\r\n\r\n return {\r\n type: matches[1],\r\n direction: matches[3],\r\n reverse: matches[5] === \"reverse\"\r\n };\r\n }\r\n\r\n var ViewContainer = Observable.extend({\r\n init: function(container) {\r\n Observable.fn.init.call(this);\r\n this.container = container;\r\n this.history = [];\r\n this.view = null;\r\n this.running = false;\r\n },\r\n\r\n after: function() {\r\n this.running = false;\r\n this.trigger(\"complete\", { view: this.view });\r\n this.trigger(\"after\");\r\n },\r\n\r\n end: function() {\r\n this.view.showEnd();\r\n this.previous.hideEnd();\r\n this.after();\r\n },\r\n\r\n show: function(view, transition, locationID) {\r\n if (!view.triggerBeforeShow() || (this.view && !this.view.triggerBeforeHide())) {\r\n this.trigger(\"after\");\r\n return false;\r\n }\r\n\r\n locationID = locationID || view.id;\r\n\r\n var that = this,\r\n current = (view === that.view) ? view.clone() : that.view,\r\n history = that.history,\r\n previousEntry = history[history.length - 2] || {},\r\n back = previousEntry.id === locationID,\r\n // If explicit transition is set, it will be with highest priority\r\n // Next we will try using the history record transition or the view transition configuration\r\n theTransition = transition || ( back ? history[history.length - 1].transition : view.transition ),\r\n transitionData = parseTransition(theTransition);\r\n\r\n if (that.running) {\r\n that.effect.stop();\r\n }\r\n\r\n if (theTransition === \"none\") {\r\n theTransition = null;\r\n }\r\n\r\n that.trigger(\"accepted\", { view: view });\r\n that.view = view;\r\n that.previous = current;\r\n that.running = true;\r\n\r\n if (!back) {\r\n history.push({ id: locationID, transition: theTransition });\r\n } else {\r\n history.pop();\r\n }\r\n\r\n if (!current) {\r\n view.showStart();\r\n view.showEnd();\r\n that.after();\r\n return true;\r\n }\r\n\r\n if (!theTransition || !kendo.effects.enabled) {\r\n view.showStart();\r\n that.end();\r\n } else {\r\n // hide the view element before init/show - prevents blinks on iPad\r\n // the replace effect will remove this class\r\n view.element.addClass(\"k-fx-hidden\");\r\n view.showStart();\r\n // do not reverse the explicit transition\r\n if (back && !transition) {\r\n transitionData.reverse = !transitionData.reverse;\r\n }\r\n\r\n that.effect = kendo.fx(view.element).replace(current.element, transitionData.type)\r\n .beforeTransition(function() {\r\n view.beforeTransition(\"show\");\r\n current.beforeTransition(\"hide\");\r\n })\r\n .afterTransition(function() {\r\n view.afterTransition(\"show\");\r\n current.afterTransition(\"hide\");\r\n })\r\n .direction(transitionData.direction)\r\n .setReverse(transitionData.reverse);\r\n\r\n that.effect.run().then(function() { that.end(); });\r\n }\r\n\r\n return true;\r\n },\r\n\r\n destroy: function() {\r\n var that = this;\r\n var view = that.view;\r\n\r\n if (view && view.destroy) {\r\n view.destroy();\r\n }\r\n }\r\n });\r\n\r\n var ViewEngine = Observable.extend({\r\n init: function(options) {\r\n var that = this,\r\n views,\r\n container;\r\n\r\n Observable.fn.init.call(that);\r\n that.options = options;\r\n\r\n $.extend(that, options);\r\n that.sandbox = $(\"
    \");\r\n container = that.container;\r\n\r\n views = that._hideViews(container);\r\n that.rootView = views.first();\r\n that.layouts = {};\r\n\r\n that.viewContainer = new kendo.ViewContainer(that.container);\r\n\r\n that.viewContainer.bind(\"accepted\", function(e) {\r\n e.view.params = that.params;\r\n });\r\n\r\n that.viewContainer.bind(\"complete\", function(e) {\r\n that.trigger(VIEW_SHOW, { view: e.view });\r\n });\r\n\r\n that.viewContainer.bind(AFTER, function() {\r\n that.trigger(AFTER);\r\n });\r\n\r\n this.bind(this.events, options);\r\n },\r\n\r\n events: [\r\n SHOW_START,\r\n AFTER,\r\n VIEW_SHOW,\r\n LOAD_START,\r\n LOAD_COMPLETE,\r\n SAME_VIEW_REQUESTED,\r\n VIEW_TYPE_DETERMINED\r\n ],\r\n\r\n destroy: function() {\r\n var that = this;\r\n var viewContainer = that.viewContainer;\r\n\r\n kendo.destroy(that.container);\r\n\r\n for (var id in that.layouts) {\r\n this.layouts[id].destroy();\r\n }\r\n\r\n if (viewContainer) {\r\n viewContainer.destroy();\r\n }\r\n },\r\n\r\n view: function() {\r\n return this.viewContainer.view;\r\n },\r\n\r\n showView: function(url, transition, params) {\r\n url = url.replace(new RegExp(\"^\" + this.remoteViewURLPrefix), \"\");\r\n if (url === \"\" && this.remoteViewURLPrefix) {\r\n url = \"/\";\r\n }\r\n\r\n if (url.replace(/^#/, \"\") === this.url) {\r\n this.trigger(SAME_VIEW_REQUESTED);\r\n return false;\r\n }\r\n\r\n this.trigger(SHOW_START);\r\n\r\n var that = this,\r\n element = that._findViewElement(url),\r\n view = kendo.widgetInstance(element);\r\n\r\n that.url = url.replace(/^#/, \"\");\r\n\r\n that.params = params;\r\n\r\n if (view && view.reload) {\r\n view.purge();\r\n element = [];\r\n }\r\n\r\n this.trigger(VIEW_TYPE_DETERMINED, { remote: element.length === 0, url: url });\r\n\r\n if (element[0]) {\r\n if (!view) {\r\n view = that._createView(element);\r\n }\r\n\r\n return that.viewContainer.show(view, transition, url);\r\n } else {\r\n return true;\r\n }\r\n },\r\n\r\n append: function(html, url) {\r\n var sandbox = this.sandbox,\r\n urlPath = (url || \"\").split(\"?\")[0],\r\n container = this.container,\r\n views,\r\n view;\r\n\r\n if (html.indexOf(\" -1) {\r\n html = $(\"
    \").append(html).html();\r\n }\r\n\r\n sandbox[0].innerHTML = html;\r\n\r\n container.append(sandbox.children(\"script, style\"));\r\n\r\n views = this._hideViews(sandbox);\r\n view = views.first();\r\n\r\n // Generic HTML content found as remote view - no remote view markers\r\n if (!view.length) {\r\n views = view = sandbox.wrapInner(\"
    \").children(); // one element\r\n }\r\n\r\n if (urlPath) {\r\n view.hide().attr(attr(\"url\"), urlPath);\r\n }\r\n\r\n container.append(views);\r\n\r\n html = null; // Garbage collection.\r\n return this._createView(view);\r\n },\r\n\r\n _locate: function(selectors) {\r\n return roleSelector(selectors);\r\n },\r\n\r\n _findViewElement: function(url) {\r\n var element,\r\n urlPath = url.split(\"?\")[0];\r\n\r\n if (!urlPath) {\r\n return this.rootView;\r\n }\r\n\r\n element = this.container.children(\"[\" + attr(\"url\") + \"='\" + urlPath + \"']\");\r\n\r\n // do not try to search for \"#/foo/bar\" id, jQuery throws error\r\n if (!element[0] && urlPath.indexOf(\"/\") === -1) {\r\n element = this.container.children(urlPath.charAt(0) === \"#\" ? urlPath : \"#\" + urlPath);\r\n }\r\n\r\n if (!element[0]) {\r\n element = this._findViewElementById(url);\r\n }\r\n\r\n return element;\r\n },\r\n\r\n _findViewElementById: function(id) {\r\n var element = this.container.children(\"[id='\" + id + \"']\");\r\n return element;\r\n },\r\n\r\n _createView: function(element) {\r\n //return this._createMobileView(element);\r\n return this._createSpaView(element);\r\n },\r\n\r\n _createMobileView: function(element) {\r\n return kendo.initWidget(element, {\r\n defaultTransition: this.transition,\r\n loader: this.loader,\r\n container: this.container,\r\n getLayout: this.getLayoutProxy,\r\n modelScope: this.modelScope,\r\n reload: attrValue(element, \"reload\")\r\n }, ui.roles);\r\n },\r\n\r\n _createSpaView: function(element) {\r\n var viewOptions = (this.options || {}).viewOptions || {};\r\n return new kendo.View(element, {\r\n renderOnInit: viewOptions.renderOnInit,\r\n wrap: viewOptions.wrap || false,\r\n wrapInSections: viewOptions.wrapInSections,\r\n detachOnHide: viewOptions.detachOnHide,\r\n detachOnDestroy: viewOptions.detachOnDestroy\r\n });\r\n },\r\n\r\n _hideViews: function(container) {\r\n return container.children(this._locate(\"view\")).hide();\r\n }\r\n });\r\n\r\n kendo.ViewEngine = ViewEngine;\r\n\r\n kendo.ViewContainer = ViewContainer;\r\n kendo.Fragment = Fragment;\r\n kendo.Layout = Layout;\r\n kendo.View = View;\r\n kendo.ViewClone = ViewClone;\r\n\r\n })(window.kendo.jQuery);\r\n var kendo$2u = kendo;\r\n\r\n var __meta__$2y = {\r\n id: \"dom\",\r\n name: \"Virtual DOM\",\r\n category: \"framework\",\r\n depends: [ \"core\" ],\r\n advanced: true\r\n };\r\n\r\n (function(kendo) {\r\n function Node() {\r\n this.node = null;\r\n }\r\n\r\n Node.prototype = {\r\n remove: function() {\r\n if (this.node.parentNode) {\r\n this.node.parentNode.removeChild(this.node);\r\n }\r\n this.attr = {};\r\n },\r\n attr: {},\r\n text: function() {\r\n return \"\";\r\n }\r\n };\r\n\r\n function NullNode() {\r\n }\r\n\r\n NullNode.prototype = {\r\n nodeName: \"#null\",\r\n attr: { style: {} },\r\n children: [],\r\n remove: function() {\r\n }\r\n };\r\n\r\n var NULL_NODE = new NullNode();\r\n\r\n function Element(nodeName, attr, children) {\r\n this.nodeName = nodeName;\r\n\r\n this.attr = attr || {};\r\n\r\n this.children = children || [];\r\n }\r\n\r\n Element.prototype = new Node();\r\n\r\n Element.prototype.appendTo = function(parent) {\r\n var node = typeof(this.nodeName) === \"string\" ? document.createElement(this.nodeName) : this.nodeName;\r\n\r\n var children = this.children;\r\n\r\n for (var index = 0; index < children.length; index++) {\r\n children[index].render(node, NULL_NODE);\r\n }\r\n\r\n parent.appendChild(node);\r\n\r\n return node;\r\n };\r\n\r\n Element.prototype.render = function(parent, cached) {\r\n var node;\r\n\r\n if (cached.nodeName !== this.nodeName) {\r\n cached.remove();\r\n\r\n node = this.appendTo(parent);\r\n } else {\r\n node = cached.node;\r\n\r\n var index;\r\n\r\n var children = this.children;\r\n\r\n var length = children.length;\r\n\r\n var cachedChildren = cached.children;\r\n\r\n var cachedLength = cachedChildren.length;\r\n\r\n if (Math.abs(cachedLength - length) > 2) {\r\n this.render({\r\n appendChild: function(node) {\r\n parent.replaceChild(node, cached.node);\r\n }\r\n }, NULL_NODE);\r\n\r\n return;\r\n }\r\n\r\n for (index = 0; index < length; index++) {\r\n children[index].render(node, cachedChildren[index] || NULL_NODE);\r\n }\r\n\r\n for (index = length; index < cachedLength; index++) {\r\n cachedChildren[index].remove();\r\n }\r\n }\r\n\r\n this.node = node;\r\n\r\n this.syncAttributes(cached.attr);\r\n\r\n this.removeAttributes(cached.attr);\r\n };\r\n\r\n Element.prototype.syncAttributes = function(cachedAttr) {\r\n var attr = this.attr;\r\n\r\n for (var name in attr) {\r\n var value = attr[name];\r\n\r\n var cachedValue = cachedAttr[name];\r\n\r\n if (name === \"style\") {\r\n this.setStyle(value, cachedValue);\r\n } else if (value !== cachedValue) {\r\n this.setAttribute(name, value, cachedValue);\r\n }\r\n }\r\n };\r\n\r\n Element.prototype.setStyle = function(style, cachedValue) {\r\n var node = this.node;\r\n var key;\r\n\r\n if (cachedValue) {\r\n for (key in style) {\r\n if (style[key] !== cachedValue[key]) {\r\n node.style[key] = style[key];\r\n }\r\n }\r\n } else {\r\n for (key in style) {\r\n node.style[key] = style[key];\r\n }\r\n }\r\n };\r\n\r\n Element.prototype.removeStyle = function(cachedStyle) {\r\n var style = this.attr.style || {};\r\n var node = this.node;\r\n\r\n for (var key in cachedStyle) {\r\n if (style[key] === undefined) {\r\n node.style[key] = \"\";\r\n }\r\n }\r\n };\r\n\r\n Element.prototype.removeAttributes = function(cachedAttr) {\r\n var attr = this.attr;\r\n\r\n for (var name in cachedAttr) {\r\n if (name === \"style\") {\r\n this.removeStyle(cachedAttr.style);\r\n } else if (attr[name] === undefined) {\r\n this.removeAttribute(name);\r\n }\r\n }\r\n };\r\n\r\n Element.prototype.removeAttribute = function(name) {\r\n var node = this.node;\r\n\r\n if (name === \"style\") {\r\n node.style.cssText = \"\";\r\n } else if (name === \"className\") {\r\n node.className = \"\";\r\n } else {\r\n node.removeAttribute(name);\r\n }\r\n };\r\n\r\n Element.prototype.setAttribute = function(name, value) {\r\n var node = this.node;\r\n\r\n if (node[name] !== undefined) {\r\n node[name] = value;\r\n } else {\r\n node.setAttribute(name, value);\r\n }\r\n };\r\n\r\n Element.prototype.text = function() {\r\n var str = \"\";\r\n for (var i = 0; i < this.children.length; ++i) {\r\n str += this.children[i].text();\r\n }\r\n return str;\r\n };\r\n\r\n function TextNode(nodeValue, force) {\r\n this.nodeValue = String(nodeValue);\r\n this.force = force;\r\n }\r\n\r\n TextNode.prototype = new Node();\r\n\r\n TextNode.prototype.nodeName = \"#text\";\r\n\r\n TextNode.prototype.render = function(parent, cached) {\r\n var node;\r\n\r\n if (cached.nodeName !== this.nodeName || this.force) {\r\n cached.remove();\r\n\r\n node = document.createTextNode(this.nodeValue);\r\n\r\n parent.appendChild(node);\r\n } else {\r\n node = cached.node;\r\n\r\n if (this.nodeValue !== cached.nodeValue) {\r\n if (node.parentNode) {\r\n // sometimes in IE parentNode is null (reason unknown),\r\n // and IE throws an error when you try to set a\r\n // parentless' nodeValue, because why not.\r\n node.nodeValue = this.nodeValue;\r\n }\r\n }\r\n }\r\n\r\n this.node = node;\r\n };\r\n\r\n TextNode.prototype.text = function() {\r\n return this.nodeValue;\r\n };\r\n\r\n function HtmlNode(html, replace) {\r\n this.html = html;\r\n this.replace = replace;\r\n }\r\n\r\n HtmlNode.prototype = {\r\n nodeName: \"#html\",\r\n attr: {},\r\n remove: function() {\r\n for (var index = 0; index < this.nodes.length; index++) {\r\n var el = this.nodes[index];\r\n if (el.parentNode) {\r\n el.parentNode.removeChild(el);\r\n }\r\n }\r\n },\r\n render: function(parent, cached) {\r\n var lastChild, replacedNode;\r\n if (cached.nodeName !== this.nodeName || cached.html !== this.html || this.replace) {\r\n if (this.replace && cached.replace && cached.nodes && cached.nodes.length && cached.nodes[0].outerHTML) {\r\n // This could be changed to a for loop that replaces several nodes instead of the first one. Presently, there is no use-case scenario for that.\r\n replacedNode = replaceNode(parent, cached.nodes[0], this.html);\r\n lastChild = parent.lastChild;\r\n } else {\r\n cached.remove();\r\n lastChild = parent.lastChild;\r\n insertHtml(parent, this.html);\r\n }\r\n this.nodes = [];\r\n\r\n if (replacedNode) {\r\n this.nodes.push(replacedNode);\r\n }\r\n\r\n for (var child = lastChild ? lastChild.nextSibling : parent.firstChild; child; child = child.nextSibling) {\r\n this.nodes.push(child);\r\n }\r\n } else {\r\n this.nodes = cached.nodes.slice(0);\r\n }\r\n }\r\n };\r\n\r\n var HTML_CONTAINER = document.createElement(\"div\");\r\n\r\n function insertHtml(node, html) {\r\n HTML_CONTAINER.innerHTML = html;\r\n\r\n while (HTML_CONTAINER.firstChild) {\r\n node.appendChild(HTML_CONTAINER.firstChild);\r\n }\r\n }\r\n\r\n function replaceNode(parent, node, html) {\r\n var firstChild;\r\n\r\n HTML_CONTAINER.innerHTML = html;\r\n firstChild = HTML_CONTAINER.firstChild;\r\n\r\n parent.replaceChild(firstChild, node);\r\n\r\n return firstChild;\r\n }\r\n\r\n function html(value, force) {\r\n return new HtmlNode(value, force);\r\n }\r\n\r\n function element(nodeName, attrs, children) {\r\n return new Element(nodeName, attrs, children);\r\n }\r\n\r\n function text(value, force) {\r\n return new TextNode(value, force);\r\n }\r\n\r\n function Tree(root) {\r\n this.root = root;\r\n this.children = [];\r\n }\r\n\r\n Tree.prototype = {\r\n html: html,\r\n element: element,\r\n text: text,\r\n render: function(children) {\r\n var cachedChildren = this.children;\r\n\r\n var index;\r\n\r\n var length;\r\n\r\n for (index = 0, length = children.length; index < length; index++) {\r\n var cached = cachedChildren[index];\r\n if (!cached) {\r\n cached = NULL_NODE;\r\n } else if (!cached.node || !cached.node.parentNode) {\r\n cached.remove();\r\n cached = NULL_NODE;\r\n }\r\n children[index].render(this.root, cached);\r\n }\r\n\r\n for (index = length; index < cachedChildren.length; index++) {\r\n cachedChildren[index].remove();\r\n }\r\n\r\n this.children = children;\r\n }\r\n };\r\n\r\n kendo.dom = {\r\n html: html,\r\n text: text,\r\n element: element,\r\n Tree: Tree,\r\n Node: Node\r\n };\r\n })(window.kendo);\r\n\r\n (function () {\r\n\r\n /* global JSZip */\r\n\r\n kendo.ooxml = kendo.ooxml || {};\r\n\r\n kendo.ooxml.createZip = function() {\r\n if (typeof JSZip === \"undefined\") {\r\n throw new Error(\"JSZip not found. Check http://docs.telerik.com/kendo-ui/framework/excel/introduction#requirements for more details.\");\r\n }\r\n\r\n return new JSZip();\r\n };\r\n\r\n })();\r\n\r\n /***********************************************************************\r\n * WARNING: this file is auto-generated. If you change it directly,\r\n * your modifications will eventually be lost. The source code is in\r\n * `kendo-ooxml` repository, you should make your changes there and\r\n * run `src-modules/sync.sh` in this repository.\r\n */\r\n\r\n (function($) {\r\n /* eslint-disable space-before-blocks, space-before-function-paren */\r\n\r\n window.kendo.ooxml = window.kendo.ooxml || {};\r\n var ooxml = kendo.ooxml;\r\n\r\n var map = $.map;\r\n var createZip = ooxml.createZip;\r\n\r\n var current = {\r\n toString: function (value) { return value; }\r\n };\r\n\r\n var IntlService = kendo.Class.extend({\r\n\r\n });\r\n\r\n IntlService.register = function(userImplementation) {\r\n current = userImplementation;\r\n };\r\n\r\n IntlService.toString = function(value, format) {\r\n return current.toString(value, format);\r\n };\r\n\r\n // date packing utilities from Kendo Spreadsheet\r\n\r\n // Julian days algorithms from http://www.hermetic.ch/cal_stud/jdn.htm#comp\r\n function dateToJulianDays(y, m, d) {\r\n return ((1461 * (y + 4800 + ((m - 13) / 12 | 0))) / 4 | 0) +\r\n ((367 * (m - 1 - 12 * ((m - 13) / 12 | 0))) / 12 | 0) -\r\n ((3 * (((y + 4900 + ((m - 13) / 12 | 0)) / 100 | 0))) / 4 | 0) +\r\n d - 32075;\r\n }\r\n\r\n // This uses the Google Spreadsheet approach: treat 1899-12-31 as day 1, allowing to avoid\r\n // implementing the \"Leap Year Bug\" yet still be Excel compatible for dates starting 1900-03-01.\r\n var BASE_DATE = dateToJulianDays(1900, 0, -1);\r\n\r\n function packDate(year, month, date) {\r\n return dateToJulianDays(year, month, date) - BASE_DATE;\r\n }\r\n\r\n function packTime(hh, mm, ss, ms) {\r\n return (hh + (mm + (ss + ms / 1000) / 60) / 60) / 24;\r\n }\r\n\r\n function dateToSerial(date) {\r\n var time = packTime(date.getHours(),\r\n date.getMinutes(),\r\n date.getSeconds(),\r\n date.getMilliseconds());\r\n var serial = packDate(date.getFullYear(),\r\n date.getMonth(),\r\n date.getDate());\r\n return serial < 0 ? serial - 1 + time : serial + time;\r\n }\r\n\r\n var MIME_TYPE = \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\";\r\n var DATA_URL_PREFIX = \"data:\" + MIME_TYPE + \";base64,\";\r\n var DATA_URL_OPTIONS = { compression: \"DEFLATE\", type: \"base64\" };\r\n var BLOB_OPTIONS = { compression: \"DEFLATE\", type: \"blob\" };\r\n var ARRAYBUFFER_OPTIONS = { compression: \"DEFLATE\", type: \"arraybuffer\" };\r\n\r\n /* eslint-disable key-spacing, no-confusing-arrow, no-constant-condition, indent, no-nested-ternary, consistent-return */\r\n\r\n function toDataURI(content) {\r\n return DATA_URL_PREFIX + content;\r\n }\r\n\r\n function indexOf(thing, array) {\r\n return array.indexOf(thing);\r\n }\r\n\r\n var parseJSON = JSON.parse.bind(JSON);\r\n\r\n function ESC(val) {\r\n return String(val)\r\n .replace(/&/g, \"&\")\r\n .replace(//g, \">\")\r\n .replace(/\\\"/g, \""\")\r\n .replace(/\\'/g, \"'\");\r\n }\r\n\r\n function repeat(count, func) {\r\n var str = \"\";\r\n for (var i = 0; i < count; ++i) {\r\n str += func(i);\r\n }\r\n return str;\r\n }\r\n\r\n function foreach(arr, func) {\r\n var str = \"\";\r\n if (arr != null) {\r\n if (Array.isArray(arr)) {\r\n for (var i = 0; i < arr.length; ++i) {\r\n str += func(arr[i], i);\r\n }\r\n } else if (typeof arr == \"object\") {\r\n Object.keys(arr).forEach(function (key, i) {\r\n str += func(arr[key], key, i);\r\n });\r\n }\r\n }\r\n return str;\r\n }\r\n\r\n var XMLHEAD = '\\r';\r\n\r\n var RELS = XMLHEAD + \"\\n \\n \\n \\n \\n \";\r\n\r\n var CORE = function (ref) {\r\n var creator = ref.creator;\r\n var lastModifiedBy = ref.lastModifiedBy;\r\n var created = ref.created;\r\n var modified = ref.modified;\r\n\r\n return (XMLHEAD + \"\\n \\n \" + (ESC(creator)) + \"\\n \" + (ESC(lastModifiedBy)) + \"\\n \" + (ESC(created)) + \"\\n \" + (ESC(modified)) + \"\\n\");\r\n };\r\n\r\n var APP = function (ref) {\r\n var sheets = ref.sheets;\r\n\r\n return (XMLHEAD + \"\\n\\n Microsoft Excel\\n 0\\n false\\n \\n \\n \\n Worksheets\\n \\n \\n \" + (sheets.length) + \"\\n \\n \\n \\n \\n \" + (foreach(sheets, function (sheet, i) { return sheet.options.title\r\n ? (\"\" + (ESC(sheet.options.title)) + \"\")\r\n : (\"Sheet\" + (i + 1) + \"\"); }\r\n )) + \"\\n \\n false\\n false\\n false\\n 14.0300\\n\");\r\n };\r\n\r\n var CONTENT_TYPES = function (ref) {\r\n var sheetCount = ref.sheetCount;\r\n var commentFiles = ref.commentFiles;\r\n var drawingFiles = ref.drawingFiles;\r\n\r\n return (XMLHEAD + \"\\n\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \" + (repeat(sheetCount, function (idx) { return (\"\"); })) + \"\\n \" + (foreach(commentFiles, function (filename) { return (\"\"); })) + \"\\n \" + (foreach(drawingFiles, function (filename) { return (\"\"); })) + \"\\n \\n \\n\");\r\n };\r\n\r\n var WORKBOOK = function (ref) {\r\n var sheets = ref.sheets;\r\n var filterNames = ref.filterNames;\r\n var userNames = ref.userNames;\r\n\r\n return (XMLHEAD + \"\\n\\n \\n \\n \\n \\n \\n \\n \" + (foreach(sheets, function (ref, i) {\r\n var options = ref.options;\r\n\r\n var name = options.name || options.title || (\"Sheet\" + (i + 1));\r\n var state = options.state || 'visible';\r\n return (\"\");\r\n })) + \"\\n \\n \" + (filterNames.length || userNames.length ? (\"\\n \\n \" + (foreach(filterNames, function (f) { return (\"\\n \"); })) + \"\\n \" + (foreach(userNames, function (f) { return (\"\\n \"); })) + \"\\n \") : '') + \"\\n \\n\");\r\n };\r\n\r\n var WORKSHEET = function (ref$1) {\r\n var frozenColumns = ref$1.frozenColumns;\r\n var frozenRows = ref$1.frozenRows;\r\n var columns = ref$1.columns;\r\n var defaults = ref$1.defaults;\r\n var data = ref$1.data;\r\n var index = ref$1.index;\r\n var mergeCells = ref$1.mergeCells;\r\n var autoFilter = ref$1.autoFilter;\r\n var filter = ref$1.filter;\r\n var showGridLines = ref$1.showGridLines;\r\n var hyperlinks = ref$1.hyperlinks;\r\n var validations = ref$1.validations;\r\n var defaultCellStyleId = ref$1.defaultCellStyleId;\r\n var rtl = ref$1.rtl;\r\n var legacyDrawing = ref$1.legacyDrawing;\r\n var drawing = ref$1.drawing;\r\n var lastRow = ref$1.lastRow;\r\n var lastCol = ref$1.lastCol;\r\n var hasDisabledCells = ref$1.hasDisabledCells;\r\n\r\n return (XMLHEAD + \"\\n\\n \" + (lastRow && lastCol ? (\"\") : \"\") + \"\\n\\n \\n \\n \" + (frozenRows || frozenColumns ? (\"\\n \") : '') + \"\\n \\n \\n\\n \\n\\n \" + (defaultCellStyleId != null || (columns && columns.length > 0) ? (\"\\n \\n \" + (!columns || !columns.length ? (\"\\n \") : '') + \"\\n \" + (foreach(columns, function (column, ci) {\r\n var columnIndex = typeof column.index === \"number\" ? column.index + 1 : (ci + 1);\r\n if (column.width === 0) {\r\n return (\"\");\r\n }\r\n return (\"\");\r\n })) + \"\\n \") : '') + \"\\n\\n \\n \" + (foreach(data, function (row, ri) {\r\n var rowIndex = typeof row.index === \"number\" ? row.index + 1 : (ri + 1);\r\n return (\"\\n \\n \" + (foreach(row.data, function (cell) { return (\"\\n \\n \" + (cell.formula != null ? writeFormula(cell.formula) : '') + \"\\n \" + (cell.value != null ? (\"\" + (ESC(cell.value)) + \"\") : '') + \"\\n \"); })) + \"\\n \\n \");})) + \"\\n \\n\\n \" + (hasDisabledCells ? \"\" : '') + \"\\n\\n \" + (autoFilter ? (\"\")\r\n : filter ? spreadsheetFilters(filter) : '') + \"\\n\\n \" + (mergeCells.length ? (\"\\n \\n \" + (foreach(mergeCells, function (ref) { return (\"\"); })) + \"\\n \") : '') + \"\\n\\n \" + (validations.length ? (\"\\n \\n \" + (foreach(validations, function (val) { return (\"\\n \\n \" + (val.formula1 ? (\"\" + (ESC(val.formula1)) + \"\") : '') + \"\\n \" + (val.formula2 ? (\"\" + (ESC(val.formula2)) + \"\") : '') + \"\\n \"); })) + \"\\n \") : '') + \"\\n\\n \" + (hyperlinks.length ? (\"\\n \\n \" + (foreach(hyperlinks, function (link) { return (\"\\n \"); })) + \"\\n \") : '') + \"\\n\\n \\n \" + (drawing ? (\"\") : '') + \"\\n \" + (legacyDrawing ? (\"\") : '') + \"\\n\");\r\n };\r\n\r\n var WORKBOOK_RELS = function (ref) {\r\n var count = ref.count;\r\n\r\n return (XMLHEAD + \"\\n\\n \" + (repeat(count, function (idx) { return (\"\\n \"); })) + \"\\n \\n \\n\");\r\n };\r\n\r\n var WORKSHEET_RELS = function (ref) {\r\n var hyperlinks = ref.hyperlinks;\r\n var comments = ref.comments;\r\n var sheetIndex = ref.sheetIndex;\r\n var drawings = ref.drawings;\r\n\r\n return (XMLHEAD + \"\\n\\n \" + (foreach(hyperlinks, function (link) { return (\"\\n \"); })) + \"\\n \" + (!comments.length ? '' : (\"\\n \\n \")) + \"\\n \" + (!drawings.length ? '' : (\"\\n \")) + \"\\n\");\r\n };\r\n\r\n var COMMENTS_XML = function (ref) {\r\n var comments = ref.comments;\r\n\r\n return (XMLHEAD + \"\\n\\n \\n \\n \\n \\n \" + (foreach(comments, function (comment) { return (\"\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \" + (ESC(comment.text)) + \"\\n \\n \\n \"); })) + \"\\n \\n\");\r\n };\r\n\r\n var LEGACY_DRAWING = function (ref) {\r\n var comments = ref.comments;\r\n\r\n return (\"\\n \\n \\n \\n \\n \" + (foreach(comments, function (comment) { return (\"\\n \\n \\n \\n \\n \\n \" + (comment.anchor) + \"\\n False\\n \" + (comment.row) + \"\\n \" + (comment.col) + \"\\n \\n \"); })) + \"\\n\");\r\n };\r\n\r\n var DRAWINGS_XML = function (drawings) { return (XMLHEAD + \"\\n\\n \" + (foreach(drawings, function (drawing, index) { return (\"\\n \\n \\n \" + (drawing.col) + \"\\n \" + (drawing.colOffset) + \"\\n \" + (drawing.row) + \"\\n \" + (drawing.rowOffset) + \"\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \"); })) + \"\\n\"); };\r\n\r\n var DRAWINGS_RELS_XML = function (rels) { return (XMLHEAD + \"\\n\\n \" + (foreach(rels, function (rel) { return (\"\\n \"); })) + \"\\n\"); };\r\n\r\n var SHARED_STRINGS = function (ref) {\r\n var count = ref.count;\r\n var uniqueCount = ref.uniqueCount;\r\n var indexes = ref.indexes;\r\n\r\n return (XMLHEAD + \"\\n\\n \" + (foreach(Object.keys(indexes), function (index) { return (\"\\n \" + (ESC(index.substring(1))) + \"\"); })) + \"\\n\");\r\n };\r\n\r\n var STYLES = function (ref) {\r\n var formats = ref.formats;\r\n var fonts = ref.fonts;\r\n var fills = ref.fills;\r\n var borders = ref.borders;\r\n var styles = ref.styles;\r\n\r\n return (XMLHEAD + \"\\n\\n \\n \" + (foreach(formats, function (format, fi) { return (\"\\n \"); })) + \"\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \" + (foreach(fonts, function (font) { return (\"\\n \\n \" + (font.bold ? '' : '') + \"\\n \" + (font.italic ? '' : '') + \"\\n \" + (font.underline ? '' : '') + \"\\n \\n \" + (font.color ? (\"\") : '') + \"\\n \" + (font.fontFamily ? (\"\\n \\n \\n \") : \"\\n \\n \\n \\n \") + \"\\n \"); })) + \"\\n \\n \\n \\n \\n \" + (foreach(fills, function (fill) { return (\"\\n \" + (fill.background ? (\"\\n \\n \\n \\n \\n \\n \") : '')); })) + \"\\n \\n \\n \\n \" + (foreach(borders, borderTemplate)) + \"\\n \\n \\n \\n \\n \\n \\n \" + (foreach(styles, function (style) { return (\"\\n \\n \" + (style.textAlign || style.verticalAlign || style.wrap ? (\"\\n \\n \") : '') + \"\\n \" + (style.disabled != null ? (\"\\n \\n \") : '') + \"\\n \\n \"); })) + \"\\n \\n \\n \\n \\n \\n \\n\");\r\n };\r\n\r\n function writeFormula(formula) {\r\n if (typeof formula == \"string\") {\r\n return (\"\" + (ESC(formula)) + \"\");\r\n }\r\n // array formulas\r\n return (\"\" + (ESC(formula.src)) + \"\");\r\n }\r\n\r\n function numChar(colIndex) {\r\n var letter = Math.floor(colIndex / 26) - 1;\r\n\r\n return (letter >= 0 ? numChar(letter) : \"\") + String.fromCharCode(65 + (colIndex % 26));\r\n }\r\n\r\n function ref(rowIndex, colIndex) {\r\n return numChar(colIndex) + (rowIndex + 1);\r\n }\r\n\r\n function $ref(rowIndex, colIndex) {\r\n return \"$\" + numChar(colIndex) + \"$\" + (rowIndex + 1);\r\n }\r\n\r\n function filterRowIndex(options) {\r\n var frozenRows = options.frozenRows || (options.freezePane || {}).rowSplit || 1;\r\n return frozenRows - 1;\r\n }\r\n\r\n function toWidth(px) {\r\n var maximumDigitWidth = 7;\r\n return (px / maximumDigitWidth) - (Math.floor(128 / maximumDigitWidth) / 256);\r\n }\r\n\r\n function toHeight(px) {\r\n return px * 0.75;\r\n }\r\n\r\n function stripFunnyChars(value) {\r\n return String(value)\r\n .replace(/[\\x00-\\x09\\x0B\\x0C\\x0E-\\x1F]/g, \"\") // leave CRLF in\r\n .replace(/\\r?\\n/g, \"\\r\\n\"); // make sure LF is preceded by CR\r\n }\r\n\r\n var Worksheet = kendo.Class.extend({\r\n init: function(options, sharedStrings, styles, borders) {\r\n this.options = options;\r\n this._strings = sharedStrings;\r\n this._styles = styles;\r\n this._borders = borders;\r\n this._validations = {};\r\n this._comments = [];\r\n this._drawings = options.drawings || [];\r\n this._hyperlinks = (this.options.hyperlinks || []).map(\r\n function (link, i) { return $.extend({}, link, { rId: (\"link\" + i) }); });\r\n },\r\n\r\n relsToXML: function() {\r\n var hyperlinks = this._hyperlinks;\r\n var comments = this._comments;\r\n var drawings = this._drawings;\r\n\r\n if (hyperlinks.length || comments.length || drawings.length) {\r\n return WORKSHEET_RELS({\r\n hyperlinks : hyperlinks,\r\n comments : comments,\r\n sheetIndex : this.options.sheetIndex,\r\n drawings : drawings\r\n });\r\n }\r\n },\r\n\r\n toXML: function(index) {\r\n var this$1$1 = this;\r\n\r\n var mergeCells = this.options.mergedCells || [];\r\n var rows = this.options.rows || [];\r\n var data = inflate(rows, mergeCells);\r\n\r\n this._readCells(data);\r\n\r\n var autoFilter = this.options.filter;\r\n var filter;\r\n if (autoFilter && (typeof autoFilter.from === \"number\") && (typeof autoFilter.to === \"number\")) {\r\n // Grid enables auto filter\r\n autoFilter = {\r\n from: ref(filterRowIndex(this.options), autoFilter.from),\r\n to: ref(filterRowIndex(this.options), autoFilter.to)\r\n };\r\n } else if (autoFilter && autoFilter.ref && autoFilter.columns) {\r\n // this is probably from the Spreadsheet\r\n filter = autoFilter;\r\n autoFilter = null;\r\n }\r\n\r\n var validations = [];\r\n for (var i in this._validations) {\r\n if (Object.prototype.hasOwnProperty.call(this$1$1._validations, i)) {\r\n validations.push(this$1$1._validations[i]);\r\n }\r\n }\r\n\r\n var defaultCellStyleId = null;\r\n var defaultCellStyle = this.options.defaultCellStyle;\r\n if (this._hasDisabledCells) {\r\n if (!defaultCellStyle) {\r\n defaultCellStyle = { disabled: false };\r\n } else {\r\n defaultCellStyle = $.extend({ disabled: false }, defaultCellStyle);\r\n }\r\n }\r\n if (defaultCellStyle) {\r\n defaultCellStyleId = this._lookupStyle(defaultCellStyle);\r\n }\r\n\r\n var freezePane = this.options.freezePane || {};\r\n var defaults = this.options.defaults || {};\r\n var lastRow = this.options.rows ? this._getLastRow() : 1;\r\n var lastCol = this.options.rows ? this._getLastCol() : 1;\r\n\r\n return WORKSHEET({\r\n frozenColumns: this.options.frozenColumns || freezePane.colSplit,\r\n frozenRows: this.options.frozenRows || freezePane.rowSplit,\r\n columns: this.options.columns,\r\n defaults: defaults,\r\n data: data,\r\n index: index,\r\n mergeCells: mergeCells,\r\n autoFilter: autoFilter,\r\n filter: filter,\r\n showGridLines: this.options.showGridLines,\r\n hyperlinks: this._hyperlinks,\r\n validations: validations,\r\n defaultCellStyleId: defaultCellStyleId,\r\n rtl: this.options.rtl !== undefined ? this.options.rtl : defaults.rtl,\r\n legacyDrawing: this._comments.length ? (\"vml\" + (this.options.sheetIndex)) : null,\r\n drawing: this._drawings.length ? (\"drw\" + (this.options.sheetIndex)) : null,\r\n lastRow: lastRow,\r\n lastCol: lastCol,\r\n hasDisabledCells: this._hasDisabledCells,\r\n });\r\n },\r\n\r\n commentsXML: function() {\r\n if (this._comments.length) {\r\n return COMMENTS_XML({ comments: this._comments });\r\n }\r\n },\r\n\r\n drawingsXML: function(images) {\r\n if (this._drawings.length) {\r\n var rels = {};\r\n var main = this._drawings.map(function (drw) {\r\n var ref = parseRef(drw.topLeftCell);\r\n var img = rels[drw.image];\r\n if (!img) {\r\n img = rels[drw.image] = {\r\n rId: (\"img\" + (drw.image)),\r\n target: images[drw.image].target\r\n };\r\n }\r\n return {\r\n col : ref.col,\r\n colOffset : pixelsToExcel(drw.offsetX),\r\n row : ref.row,\r\n rowOffset : pixelsToExcel(drw.offsetY),\r\n width : pixelsToExcel(drw.width),\r\n height : pixelsToExcel(drw.height),\r\n imageId : img.rId\r\n };\r\n });\r\n return {\r\n main: DRAWINGS_XML(main),\r\n rels: DRAWINGS_RELS_XML(rels)\r\n };\r\n }\r\n },\r\n\r\n legacyDrawing: function() {\r\n if (this._comments.length) {\r\n return LEGACY_DRAWING({ comments: this._comments });\r\n }\r\n },\r\n\r\n _lookupString: function(value) {\r\n var key = \"$\" + value;\r\n var index = this._strings.indexes[key];\r\n var result;\r\n\r\n if (index !== undefined) {\r\n result = index;\r\n } else {\r\n result = this._strings.indexes[key] = this._strings.uniqueCount;\r\n this._strings.uniqueCount ++;\r\n }\r\n\r\n this._strings.count ++;\r\n\r\n return result;\r\n },\r\n\r\n _lookupStyle: function(style) {\r\n var json = JSON.stringify(style);\r\n\r\n if (json === \"{}\") {\r\n return 0;\r\n }\r\n\r\n var index = indexOf(json, this._styles);\r\n\r\n if (index < 0) {\r\n index = this._styles.push(json) - 1;\r\n }\r\n\r\n // There is one default style\r\n return index + 1;\r\n },\r\n\r\n _lookupBorder: function(border) {\r\n var json = JSON.stringify(border);\r\n if (json === \"{}\") {\r\n return;\r\n }\r\n\r\n var index = indexOf(json, this._borders);\r\n if (index < 0) {\r\n index = this._borders.push(json) - 1;\r\n }\r\n\r\n // There is one default border\r\n return index + 1;\r\n },\r\n\r\n _readCells: function(rowData) {\r\n var this$1$1 = this;\r\n\r\n for (var i = 0; i < rowData.length; i++) {\r\n var row = rowData[i];\r\n var cells = row.cells;\r\n\r\n row.data = [];\r\n\r\n for (var j = 0; j < cells.length; j++) {\r\n var cellData = this$1$1._cell(cells[j], row.index, j);\r\n if (cellData) {\r\n row.data.push(cellData);\r\n }\r\n }\r\n }\r\n },\r\n\r\n _cell: function(data, rowIndex, cellIndex) {\r\n var this$1$1 = this;\r\n\r\n if (!data || data === EMPTY_CELL) {\r\n return null;\r\n }\r\n\r\n var value = data.value;\r\n\r\n var border = {};\r\n\r\n if (data.borderLeft) {\r\n border.left = data.borderLeft;\r\n }\r\n\r\n if (data.borderRight) {\r\n border.right = data.borderRight;\r\n }\r\n\r\n if (data.borderTop) {\r\n border.top = data.borderTop;\r\n }\r\n\r\n if (data.borderBottom) {\r\n border.bottom = data.borderBottom;\r\n }\r\n\r\n if (data.dBorders) {\r\n border.diagonal = data.dBorders;\r\n }\r\n\r\n border = this._lookupBorder(border);\r\n\r\n var defStyle = this.options.defaultCellStyle || {};\r\n var style = { borderId: border };\r\n\r\n (function (add) {\r\n add(\"color\");\r\n add(\"background\");\r\n add(\"bold\");\r\n add(\"italic\");\r\n add(\"underline\");\r\n if (!add(\"fontFamily\")) { add(\"fontName\", \"fontFamily\"); }\r\n add(\"fontSize\");\r\n add(\"format\");\r\n if (!add(\"textAlign\")) { add(\"hAlign\", \"textAlign\"); }\r\n if (!add(\"verticalAlign\")) { add(\"vAlign\", \"verticalAlign\"); }\r\n add(\"wrap\");\r\n add(\"indent\");\r\n if (!add(\"disabled\")) {\r\n if (add(\"enable\")) {\r\n style.disabled = !style.enable;\r\n delete style.enable;\r\n }\r\n }\r\n if (style.disabled) {\r\n this$1$1._hasDisabledCells = true;\r\n }\r\n })(function (prop, target) {\r\n var val = data[prop];\r\n if (val === undefined) {\r\n val = defStyle[prop];\r\n }\r\n if (val !== undefined) {\r\n style[target || prop] = val;\r\n return true;\r\n }\r\n });\r\n\r\n var columns = this.options.columns || [];\r\n\r\n var column = columns[cellIndex];\r\n var type = typeof value;\r\n\r\n if (column && column.autoWidth && (!data.colSpan || data.colSpan === 1)) {\r\n var displayValue = value;\r\n\r\n // XXX: let's not bring kendo.toString in only for this.\r\n // better wait until the spreadsheet engine is available as a separate\r\n // component, then we can use a real Excel-like formatter.\r\n //\r\n if (type === \"number\") {\r\n // kendo.toString will not behave exactly like the Excel format\r\n // Still, it's the best we have available for estimating the character count.\r\n displayValue = IntlService.toString(value, data.format);\r\n }\r\n\r\n column.width = Math.max(column.width || 0, String(displayValue).length);\r\n }\r\n\r\n if (type === \"string\") {\r\n value = stripFunnyChars(value);\r\n value = this._lookupString(value);\r\n type = \"s\";\r\n } else if (type === \"number\") {\r\n type = \"n\";\r\n } else if (type === \"boolean\") {\r\n type = \"b\";\r\n value = Number(value);\r\n } else if (value && value.getTime) {\r\n type = null;\r\n value = dateToSerial(value);\r\n if (!style.format) {\r\n style.format = \"mm-dd-yy\";\r\n }\r\n } else {\r\n type = null;\r\n value = null;\r\n }\r\n\r\n style = this._lookupStyle(style);\r\n\r\n var cellName = ref(rowIndex, cellIndex);\r\n\r\n if (data.validation) {\r\n this._addValidation(data.validation, cellName);\r\n }\r\n\r\n if (data.comment) {\r\n var anchor = [\r\n cellIndex + 1, // start column\r\n 15, // start column offset\r\n rowIndex, // start row\r\n 10, // start row offset\r\n cellIndex + 3, // end column\r\n 15, // end column offset\r\n rowIndex + 3, // end row\r\n 4 // end row offset\r\n ];\r\n this._comments.push({\r\n ref : cellName,\r\n text : data.comment,\r\n row : rowIndex,\r\n col : cellIndex,\r\n anchor : anchor.join(\", \")\r\n });\r\n }\r\n\r\n return {\r\n value: value,\r\n formula: data.formula,\r\n type: type,\r\n style: style,\r\n ref: cellName\r\n };\r\n },\r\n\r\n _addValidation: function(v, ref) {\r\n var tmp = {\r\n showErrorMessage : v.type === \"reject\" ? 1 : 0,\r\n formula1 : v.from,\r\n formula2 : v.to,\r\n type : MAP_EXCEL_TYPE[v.dataType] || v.dataType,\r\n operator : MAP_EXCEL_OPERATOR[v.comparerType] || v.comparerType,\r\n allowBlank : v.allowNulls ? 1 : 0,\r\n showDropDown : v.showButton ? 0 : 1, // LOL, Excel!\r\n error : v.messageTemplate,\r\n errorTitle : v.titleTemplate\r\n };\r\n var json = JSON.stringify(tmp);\r\n if (!this._validations[json]) {\r\n this._validations[json] = tmp;\r\n tmp.sqref = [];\r\n }\r\n this._validations[json].sqref.push(ref);\r\n },\r\n\r\n _getLastRow: function() {\r\n return countData(this.options.rows);\r\n },\r\n\r\n _getLastCol: function() {\r\n var last = 0;\r\n this.options.rows.forEach(function(row) {\r\n if (row.cells) {\r\n last = Math.max(last, countData(row.cells));\r\n }\r\n });\r\n return last;\r\n }\r\n });\r\n\r\n function countData(data) {\r\n var last = data.length;\r\n data.forEach(function(el) {\r\n if (el.index && el.index >= last) {\r\n last = el.index + 1;\r\n }\r\n });\r\n return last;\r\n }\r\n\r\n var MAP_EXCEL_OPERATOR = {\r\n // includes only what differs; key is our operator, value is Excel\r\n // operator.\r\n greaterThanOrEqualTo : \"greaterThanOrEqual\",\r\n lessThanOrEqualTo : \"lessThanOrEqual\"\r\n };\r\n\r\n var MAP_EXCEL_TYPE = {\r\n // eslint-disable-next-line id-denylist\r\n number: \"decimal\"\r\n };\r\n\r\n var defaultFormats = {\r\n \"General\": 0,\r\n \"0\": 1,\r\n \"0.00\": 2,\r\n \"#,##0\": 3,\r\n \"#,##0.00\": 4,\r\n \"0%\": 9,\r\n \"0.00%\": 10,\r\n \"0.00E+00\": 11,\r\n \"# ?/?\": 12,\r\n \"# ??/??\": 13,\r\n \"mm-dd-yy\": 14,\r\n \"d-mmm-yy\": 15,\r\n \"d-mmm\": 16,\r\n \"mmm-yy\": 17,\r\n \"h:mm AM/PM\": 18,\r\n \"h:mm:ss AM/PM\": 19,\r\n \"h:mm\": 20,\r\n \"h:mm:ss\": 21,\r\n \"m/d/yy h:mm\": 22,\r\n \"#,##0 ;(#,##0)\": 37,\r\n \"#,##0 ;[Red](#,##0)\": 38,\r\n \"#,##0.00;(#,##0.00)\": 39,\r\n \"#,##0.00;[Red](#,##0.00)\": 40,\r\n \"mm:ss\": 45,\r\n \"[h]:mm:ss\": 46,\r\n \"mmss.0\": 47,\r\n \"##0.0E+0\": 48,\r\n \"@\": 49,\r\n \"[$-404]e/m/d\": 27,\r\n \"m/d/yy\": 30,\r\n \"t0\": 59,\r\n \"t0.00\": 60,\r\n \"t#,##0\": 61,\r\n \"t#,##0.00\": 62,\r\n \"t0%\": 67,\r\n \"t0.00%\": 68,\r\n \"t# ?/?\": 69,\r\n \"t# ??/??\": 70\r\n };\r\n\r\n function maybeRGB(value) {\r\n function hex(val) {\r\n var x = parseInt(val, 10).toString(16);\r\n return x.length < 2 ? \"0\" + x : x;\r\n }\r\n\r\n var m = /^rgba?\\((\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*([0-9.]+)\\s*)?\\)/i.exec(value.trim());\r\n if (m) {\r\n var opacity = (m[4] ? parseFloat(m[4]) : 1) * 255 | 0;\r\n return \"#\" + hex(opacity) + hex(m[1]) + hex(m[2]) + hex(m[3]);\r\n }\r\n return value;\r\n }\r\n\r\n function convertColor(value) {\r\n var color = maybeRGB(value);\r\n if (color.length < 6) {\r\n color = color.replace(/(\\w)/g, function($0, $1) {\r\n return $1 + $1;\r\n });\r\n }\r\n\r\n color = color.substring(1).toUpperCase();\r\n\r\n if (color.length < 8) {\r\n color = \"FF\" + color;\r\n }\r\n\r\n return color;\r\n }\r\n\r\n var Workbook = kendo.Class.extend({\r\n init: function(options) {\r\n var this$1$1 = this;\r\n\r\n this.options = options || {};\r\n this._strings = {\r\n indexes: {},\r\n count: 0,\r\n uniqueCount: 0\r\n };\r\n this._styles = [];\r\n this._borders = [];\r\n this._images = this.options.images;\r\n this._imgId = 0;\r\n\r\n this._sheets = map(this.options.sheets || [], function (options, i) {\r\n options.defaults = this$1$1.options;\r\n options.sheetIndex = i + 1;\r\n return new Worksheet(options, this$1$1._strings, this$1$1._styles, this$1$1._borders);\r\n });\r\n },\r\n\r\n imageFilename: function(mimeType) {\r\n var id = ++this._imgId;\r\n switch (mimeType) {\r\n case \"image/jpg\":\r\n case \"image/jpeg\":\r\n return (\"image\" + id + \".jpg\");\r\n case \"image/png\":\r\n return (\"image\" + id + \".png\");\r\n case \"image/gif\":\r\n return (\"image\" + id + \".gif\");\r\n default:\r\n return (\"image\" + id + \".bin\"); // XXX: anything better to do here?\r\n }\r\n },\r\n\r\n toZIP: function() {\r\n var this$1$1 = this;\r\n\r\n var zip = createZip();\r\n\r\n var docProps = zip.folder(\"docProps\");\r\n\r\n docProps.file(\"core.xml\", CORE({\r\n creator: this.options.creator || \"Kendo UI\",\r\n lastModifiedBy: this.options.creator || \"Kendo UI\",\r\n created: this.options.date || new Date().toJSON(),\r\n modified: this.options.date || new Date().toJSON()\r\n }));\r\n\r\n var sheetCount = this._sheets.length;\r\n\r\n docProps.file(\"app.xml\", APP({ sheets: this._sheets }));\r\n\r\n var rels = zip.folder(\"_rels\");\r\n rels.file(\".rels\", RELS);\r\n\r\n var xl = zip.folder(\"xl\");\r\n\r\n var xlRels = xl.folder(\"_rels\");\r\n xlRels.file(\"workbook.xml.rels\", WORKBOOK_RELS({ count: sheetCount }));\r\n\r\n if (this._images) {\r\n var media = xl.folder(\"media\");\r\n Object.keys(this._images).forEach(function (id) {\r\n var img = this$1$1._images[id];\r\n var filename = this$1$1.imageFilename(img.type);\r\n media.file(filename, img.data);\r\n img.target = \"../media/\" + filename;\r\n });\r\n }\r\n\r\n var sheetIds = {};\r\n xl.file(\"workbook.xml\", WORKBOOK({\r\n sheets: this._sheets,\r\n filterNames: map(this._sheets, function(sheet, index) {\r\n var options = sheet.options;\r\n var sheetName = (options.name || options.title || \"Sheet\" + (index + 1));\r\n sheetIds[sheetName.toLowerCase()] = index;\r\n var filter = options.filter;\r\n if (filter) {\r\n if (filter.ref) {\r\n // spreadsheet provides `ref`\r\n var a = filter.ref.split(\":\");\r\n var from = parseRef(a[0]);\r\n var to = parseRef(a[1]);\r\n return {\r\n localSheetId: index,\r\n name: sheetName,\r\n from: $ref(from.row, from.col),\r\n to: $ref(to.row, to.col)\r\n };\r\n } else if (typeof filter.from !== \"undefined\" && typeof filter.to !== \"undefined\") {\r\n // grid does this\r\n return {\r\n localSheetId: index,\r\n name: sheetName,\r\n from: $ref(filterRowIndex(options), filter.from),\r\n to: $ref(filterRowIndex(options), filter.to)\r\n };\r\n }\r\n }\r\n }),\r\n userNames: map(this.options.names || [], function(def) {\r\n return {\r\n name: def.localName,\r\n localSheetId: def.sheet ? sheetIds[def.sheet.toLowerCase()] : null,\r\n value: def.value,\r\n hidden: def.hidden\r\n };\r\n })\r\n }));\r\n\r\n var worksheets = xl.folder(\"worksheets\");\r\n var drawings = xl.folder(\"drawings\");\r\n var drawingsRels = drawings.folder(\"_rels\");\r\n var sheetRels = worksheets.folder(\"_rels\");\r\n var commentFiles = [];\r\n var drawingFiles = [];\r\n\r\n for (var idx = 0; idx < sheetCount; idx++) {\r\n var sheet = this$1$1._sheets[idx];\r\n var sheetName = \"sheet\" + (idx + 1) + \".xml\";\r\n var sheetXML = sheet.toXML(idx); // must be called before relsToXML\r\n var relsXML = sheet.relsToXML();\r\n var commentsXML = sheet.commentsXML();\r\n var legacyDrawing = sheet.legacyDrawing();\r\n var drawingsXML = sheet.drawingsXML(this$1$1._images);\r\n\r\n if (relsXML) {\r\n sheetRels.file(sheetName + \".rels\", relsXML);\r\n }\r\n if (commentsXML) {\r\n var name = \"comments\" + (sheet.options.sheetIndex) + \".xml\";\r\n xl.file(name, commentsXML);\r\n commentFiles.push(name);\r\n }\r\n if (legacyDrawing) {\r\n drawings.file((\"vmlDrawing\" + (sheet.options.sheetIndex) + \".vml\"), legacyDrawing);\r\n }\r\n if (drawingsXML) {\r\n var name$1 = \"drawing\" + (sheet.options.sheetIndex) + \".xml\";\r\n drawings.file(name$1, drawingsXML.main);\r\n drawingsRels.file((name$1 + \".rels\"), drawingsXML.rels);\r\n drawingFiles.push(name$1);\r\n }\r\n\r\n worksheets.file(sheetName, sheetXML);\r\n }\r\n\r\n var borders = map(this._borders, parseJSON);\r\n\r\n var styles = map(this._styles, parseJSON);\r\n\r\n var hasFont = function(style) {\r\n return style.underline || style.bold || style.italic || style.color || style.fontFamily || style.fontSize;\r\n };\r\n\r\n var convertFontSize = function(value) {\r\n var fontInPx = Number(value);\r\n var fontInPt;\r\n\r\n if (fontInPx) {\r\n fontInPt = fontInPx * 3 / 4;\r\n }\r\n\r\n return fontInPt;\r\n };\r\n\r\n var fonts = map(styles, function(style) {\r\n if (style.fontSize) {\r\n style.fontSize = convertFontSize(style.fontSize);\r\n }\r\n\r\n if (style.color) {\r\n style.color = convertColor(style.color);\r\n }\r\n\r\n if (hasFont(style)) {\r\n return style;\r\n }\r\n });\r\n\r\n var formats = map(styles, function(style) {\r\n if (style.format && defaultFormats[style.format] === undefined) {\r\n return style;\r\n }\r\n });\r\n\r\n var fills = map(styles, function(style) {\r\n if (style.background) {\r\n style.background = convertColor(style.background);\r\n return style;\r\n }\r\n });\r\n\r\n xl.file(\"styles.xml\", STYLES({\r\n fonts: fonts,\r\n fills: fills,\r\n formats: formats,\r\n borders: borders,\r\n styles: map(styles, function(style) {\r\n var result = {};\r\n\r\n if (hasFont(style)) {\r\n result.fontId = indexOf(style, fonts) + 1;\r\n }\r\n\r\n if (style.background) {\r\n result.fillId = indexOf(style, fills) + 2;\r\n }\r\n\r\n result.textAlign = style.textAlign;\r\n result.indent = style.indent;\r\n result.verticalAlign = style.verticalAlign;\r\n result.wrap = style.wrap;\r\n result.borderId = style.borderId;\r\n\r\n if (style.format) {\r\n if (defaultFormats[style.format] !== undefined) {\r\n result.numFmtId = defaultFormats[style.format];\r\n } else {\r\n result.numFmtId = 165 + indexOf(style, formats);\r\n }\r\n }\r\n\r\n if (style.disabled != null) {\r\n result.disabled = style.disabled;\r\n }\r\n\r\n return result;\r\n })\r\n }));\r\n\r\n xl.file(\"sharedStrings.xml\", SHARED_STRINGS(this._strings));\r\n\r\n zip.file(\"[Content_Types].xml\", CONTENT_TYPES({\r\n sheetCount: sheetCount,\r\n commentFiles: commentFiles,\r\n drawingFiles: drawingFiles\r\n }));\r\n\r\n return zip;\r\n },\r\n\r\n toDataURL: function() {\r\n var zip = this.toZIP();\r\n\r\n return zip.generateAsync ? zip.generateAsync(DATA_URL_OPTIONS).then(toDataURI) : toDataURI(zip.generate(DATA_URL_OPTIONS));\r\n },\r\n\r\n toBlob: function() {\r\n var zip = this.toZIP();\r\n if (zip.generateAsync) {\r\n return zip.generateAsync(BLOB_OPTIONS);\r\n }\r\n return new Blob([ zip.generate(ARRAYBUFFER_OPTIONS) ], { type: MIME_TYPE });\r\n }\r\n });\r\n\r\n function borderStyle(width) {\r\n var alias = \"thin\";\r\n\r\n if (width === 2) {\r\n alias = \"medium\";\r\n } else if (width === 3) {\r\n alias = \"thick\";\r\n }\r\n\r\n return alias;\r\n }\r\n\r\n function borderSideTemplate(name, style) {\r\n var result = \"\";\r\n\r\n if (style) {\r\n result += \"<\" + name + \" style=\\\"\" + borderStyle(style.size) + \"\\\">\";\r\n if (style.color) {\r\n result += \"\";\r\n }\r\n result += \"\";\r\n }\r\n\r\n return result;\r\n }\r\n\r\n function borderTemplate(border) {\r\n var diag = border.diagonal ? border.diagonal.type : 0;\r\n return (\"\\n \" + (borderSideTemplate(\"left\", border.left)) + \"\\n \" + (borderSideTemplate(\"right\", border.right)) + \"\\n \" + (borderSideTemplate(\"top\", border.top)) + \"\\n \" + (borderSideTemplate(\"bottom\", border.bottom)) + \"\\n \" + (borderSideTemplate(\"diagonal\", border.diagonal)) + \"\\n \");\r\n }\r\n\r\n var EMPTY_CELL = {};\r\n function inflate(rows, mergedCells) {\r\n var rowData = [];\r\n var rowsByIndex = [];\r\n\r\n indexRows(rows, function(row, index) {\r\n var data = {\r\n _source: row,\r\n index: index,\r\n height: row.height,\r\n level: row.level,\r\n cells: []\r\n };\r\n\r\n rowData.push(data);\r\n rowsByIndex[index] = data;\r\n });\r\n\r\n var sorted = sortByIndex(rowData).slice(0);\r\n var ctx = {\r\n rowData: rowData,\r\n rowsByIndex: rowsByIndex,\r\n mergedCells: mergedCells\r\n };\r\n\r\n for (var i = 0; i < sorted.length; i++) {\r\n fillCells(sorted[i], ctx);\r\n delete sorted[i]._source;\r\n }\r\n\r\n return sortByIndex(rowData);\r\n }\r\n\r\n function indexRows(rows, callback) {\r\n for (var i = 0; i < rows.length; i++) {\r\n var row = rows[i];\r\n if (!row) {\r\n continue;\r\n }\r\n\r\n var index = row.index;\r\n if (typeof index !== \"number\") {\r\n index = i;\r\n }\r\n\r\n callback(row, index);\r\n }\r\n }\r\n\r\n function sortByIndex(items) {\r\n return items.sort(function(a, b) {\r\n return a.index - b.index;\r\n });\r\n }\r\n\r\n function pushUnique(array, el) {\r\n if (array.indexOf(el) < 0) {\r\n array.push(el);\r\n }\r\n }\r\n\r\n function getSpan(mergedCells, ref) {\r\n for (var i = 0; i < mergedCells.length; ++i) {\r\n var range = mergedCells[i];\r\n var a = range.split(\":\");\r\n var topLeft = a[0];\r\n if (topLeft === ref) {\r\n var bottomRight = a[1];\r\n topLeft = parseRef(topLeft);\r\n bottomRight = parseRef(bottomRight);\r\n return {\r\n rowSpan: bottomRight.row - topLeft.row + 1,\r\n colSpan: bottomRight.col - topLeft.col + 1\r\n };\r\n }\r\n }\r\n }\r\n\r\n function parseRef(ref) {\r\n function getcol(str) {\r\n var upperStr = str.toUpperCase();\r\n var col = 0;\r\n for (var i = 0; i < upperStr.length; ++i) {\r\n col = col * 26 + upperStr.charCodeAt(i) - 64;\r\n }\r\n return col - 1;\r\n }\r\n\r\n function getrow(str) {\r\n return parseInt(str, 10) - 1;\r\n }\r\n\r\n var m = /^([a-z]+)(\\d+)$/i.exec(ref);\r\n return {\r\n row: getrow(m[2]),\r\n col: getcol(m[1])\r\n };\r\n }\r\n\r\n function pixelsToExcel(px) {\r\n return Math.round(px * 9525);\r\n }\r\n\r\n function fillCells(data, ctx) {\r\n var row = data._source;\r\n var rowIndex = data.index;\r\n var cells = row.cells;\r\n var cellData = data.cells;\r\n\r\n if (!cells) {\r\n return;\r\n }\r\n\r\n for (var i = 0; i < cells.length; i++) {\r\n var cell = cells[i] || EMPTY_CELL;\r\n\r\n var rowSpan = cell.rowSpan || 1;\r\n var colSpan = cell.colSpan || 1;\r\n\r\n var cellIndex = insertCell(cellData, cell);\r\n var topLeftRef = ref(rowIndex, cellIndex);\r\n\r\n if (rowSpan === 1 && colSpan === 1) {\r\n // could still be merged: the spreadsheet does not send\r\n // rowSpan/colSpan, but mergedCells is already populated.\r\n // https://github.com/telerik/kendo-ui-core/issues/2401\r\n var tmp = getSpan(ctx.mergedCells, topLeftRef);\r\n if (tmp) {\r\n colSpan = tmp.colSpan;\r\n rowSpan = tmp.rowSpan;\r\n }\r\n }\r\n\r\n spanCell(cell, cellData, cellIndex, colSpan);\r\n\r\n if (rowSpan > 1 || colSpan > 1) {\r\n pushUnique(ctx.mergedCells,\r\n topLeftRef + \":\" + ref(rowIndex + rowSpan - 1,\r\n cellIndex + colSpan - 1));\r\n }\r\n\r\n if (rowSpan > 1) {\r\n for (var ri = rowIndex + 1; ri < rowIndex + rowSpan; ri++) {\r\n var nextRow = ctx.rowsByIndex[ri];\r\n if (!nextRow) {\r\n nextRow = ctx.rowsByIndex[ri] = { index: ri, cells: [] };\r\n ctx.rowData.push(nextRow);\r\n }\r\n\r\n spanCell(cell, nextRow.cells, cellIndex - 1, colSpan + 1);\r\n }\r\n }\r\n }\r\n }\r\n\r\n function insertCell(data, cell) {\r\n var index;\r\n\r\n if (typeof cell.index === \"number\") {\r\n index = cell.index;\r\n insertCellAt(data, cell, cell.index);\r\n } else {\r\n index = appendCell(data, cell);\r\n }\r\n\r\n return index;\r\n }\r\n\r\n function insertCellAt(data, cell, index) {\r\n data[index] = cell;\r\n }\r\n\r\n function appendCell(data, cell) {\r\n var index = data.length;\r\n\r\n for (var i = 0; i < data.length + 1; i++) {\r\n if (!data[i]) {\r\n data[i] = cell;\r\n index = i;\r\n break;\r\n }\r\n }\r\n\r\n return index;\r\n }\r\n\r\n function spanCell(cell, row, startIndex, colSpan) {\r\n for (var i = 1; i < colSpan; i++) {\r\n var tmp = {\r\n borderTop : cell.borderTop,\r\n borderRight : cell.borderRight,\r\n borderBottom : cell.borderBottom,\r\n borderLeft : cell.borderLeft\r\n };\r\n insertCellAt(row, tmp, startIndex + i);\r\n }\r\n }\r\n\r\n var SPREADSHEET_FILTERS = function (ref$1) {\r\n var ref = ref$1.ref;\r\n var columns = ref$1.columns;\r\n var generators = ref$1.generators;\r\n\r\n return (\"\\n\\n \" + (foreach(columns, function (col) { return (\"\\n \\n \" + (generators[col.filter](col)) + \"\\n \\n \"); })) + \"\\n\");\r\n };\r\n\r\n var SPREADSHEET_CUSTOM_FILTER = function (ref) {\r\n var logic = ref.logic;\r\n var criteria = ref.criteria;\r\n\r\n return (\"\\n\\n\" + (foreach(criteria, function (f) {\r\n var op = spreadsheetFilters.customOperator(f);\r\n var val = spreadsheetFilters.customValue(f);\r\n return (\"\");\r\n })) + \"\\n\");\r\n };\r\n\r\n var SPREADSHEET_DYNAMIC_FILTER = function (ref) {\r\n var type = ref.type;\r\n\r\n return (\"\");\r\n };\r\n\r\n var SPREADSHEET_TOP_FILTER = function (ref) {\r\n var type = ref.type;\r\n var value = ref.value;\r\n\r\n return (\"\");\r\n };\r\n\r\n var SPREADSHEET_VALUE_FILTER = function (ref) {\r\n var blanks = ref.blanks;\r\n var values = ref.values;\r\n\r\n return (\"\\n \" + (foreach(values, function (value) { return (\"\\n \"); })) + \"\\n \");\r\n };\r\n\r\n function spreadsheetFilters(filter) {\r\n return SPREADSHEET_FILTERS({\r\n ref: filter.ref,\r\n columns: filter.columns,\r\n generators: {\r\n custom : SPREADSHEET_CUSTOM_FILTER,\r\n dynamic : SPREADSHEET_DYNAMIC_FILTER,\r\n top : SPREADSHEET_TOP_FILTER,\r\n value : SPREADSHEET_VALUE_FILTER\r\n }\r\n });\r\n }\r\n\r\n spreadsheetFilters.customOperator = function(f) {\r\n return {\r\n eq : \"equal\",\r\n gt : \"greaterThan\",\r\n gte : \"greaterThanOrEqual\",\r\n lt : \"lessThan\",\r\n lte : \"lessThanOrEqual\",\r\n ne : \"notEqual\",\r\n\r\n // These are not in the spec, but seems to be how Excel does\r\n // it (see customValue below). For the non-negated versions,\r\n // the operator attribute is missing completely.\r\n doesnotstartwith: \"notEqual\",\r\n doesnotendwith: \"notEqual\",\r\n doesnotcontain: \"notEqual\",\r\n doesnotmatch: \"notEqual\"\r\n }[f.operator.toLowerCase()];\r\n };\r\n\r\n function quoteSheet(name) {\r\n if (/^\\'/.test(name)) { // assume already quoted, the Spreadsheet does it.\r\n return name;\r\n }\r\n if (/^[a-z_][a-z0-9_]*$/i.test(name)) {\r\n return name; // no need to quote it\r\n }\r\n return \"'\" + name.replace(/\\x27/g, \"\\\\'\") + \"'\";\r\n }\r\n\r\n spreadsheetFilters.customValue = function(f) {\r\n function esc(str) {\r\n return str.replace(/([*?])/g, \"~$1\");\r\n }\r\n\r\n switch (f.operator.toLowerCase()) {\r\n case \"startswith\":\r\n case \"doesnotstartwith\":\r\n return esc(f.value) + \"*\";\r\n\r\n case \"endswith\":\r\n case \"doesnotendwith\":\r\n return \"*\" + esc(f.value);\r\n\r\n case \"contains\":\r\n case \"doesnotcontain\":\r\n return \"*\" + esc(f.value) + \"*\";\r\n\r\n default:\r\n return f.value;\r\n }\r\n };\r\n\r\n spreadsheetFilters.dynamicFilterType = function(type) {\r\n return {\r\n quarter1 : \"Q1\",\r\n quarter2 : \"Q2\",\r\n quarter3 : \"Q3\",\r\n quarter4 : \"Q4\",\r\n january : \"M1\",\r\n february : \"M2\",\r\n march : \"M3\",\r\n april : \"M4\",\r\n may : \"M5\",\r\n june : \"M6\",\r\n july : \"M7\",\r\n august : \"M8\",\r\n september : \"M9\",\r\n october : \"M10\",\r\n november : \"M11\",\r\n december : \"M12\"\r\n }[type.toLowerCase()] || type;\r\n };\r\n\r\n kendo.deepExtend(kendo.ooxml, {\r\n IntlService: IntlService,\r\n Workbook: Workbook,\r\n Worksheet: Worksheet\r\n });\r\n\r\n })(window.kendo.jQuery);\r\n\r\n // import * as ooxml from \"/kendo-ooxml/src/main.js\";\r\n // kendo.ooxml = ooxml;\r\n\r\n (function ($) {\r\n\r\n var Workbook = kendo.ooxml.Workbook;\r\n\r\n kendo.ooxml.IntlService.register({\r\n toString: kendo.toString\r\n });\r\n\r\n var toDataURL = Workbook.prototype.toDataURL;\r\n\r\n Object.assign(Workbook.prototype, {\r\n toDataURL: function() {\r\n var result = toDataURL.call(this);\r\n if (typeof result !== 'string') {\r\n throw new Error('The toDataURL method can be used only with jsZip 2. Either include jsZip 2 or use the toDataURLAsync method.');\r\n }\r\n\r\n return result;\r\n },\r\n\r\n toDataURLAsync: function() {\r\n var deferred = $.Deferred();\r\n var result = toDataURL.call(this);\r\n if (typeof result === 'string') {\r\n result = deferred.resolve(result);\r\n } else if (result && result.then){\r\n result.then(function(dataURI) {\r\n deferred.resolve(dataURI);\r\n }, function() {\r\n deferred.reject();\r\n });\r\n }\r\n\r\n return deferred.promise();\r\n }\r\n });\r\n\r\n })(window.kendo.jQuery);\r\n\r\n var __meta__$2x = {\r\n id: \"ooxml\",\r\n name: \"XLSX generation\",\r\n category: \"framework\",\r\n advanced: true,\r\n depends: [ \"core\" ]\r\n };\r\n\r\n /***********************************************************************\r\n * WARNING: this file is auto-generated. If you change it directly,\r\n * your modifications will eventually be lost. The source code is in\r\n * `kendo-ooxml` repository, you should make your changes there and\r\n * run `src-modules/sync.sh` in this repository.\r\n */\r\n\r\n (function($) {\r\n /* eslint-disable space-before-blocks, space-before-function-paren */\r\n\r\n window.kendo.excel = window.kendo.excel || {};\r\n\r\n var getter = kendo.getter;\r\n var map = $.map;\r\n\r\n var current = {\r\n compile: function(template) {\r\n return template;\r\n }\r\n };\r\n\r\n var TemplateService = kendo.Class.extend({\r\n\r\n });\r\n\r\n TemplateService.register = function(userImplementation) {\r\n current = userImplementation;\r\n };\r\n\r\n TemplateService.compile = function(template) {\r\n return current.compile(template);\r\n };\r\n\r\n function defaultGroupHeaderTemplate(data) {\r\n return ((data.title) + \": \" + (data.value));\r\n }\r\n\r\n function createArray(length, callback) {\r\n var result = [];\r\n\r\n for (var idx = 0; idx < length; idx++) {\r\n result.push(callback(idx));\r\n }\r\n\r\n return result;\r\n }\r\n\r\n function defaultItemId(item) {\r\n return item.id;\r\n }\r\n\r\n var ExcelExporter = kendo.Class.extend({\r\n init: function(options) {\r\n options.columns = this._trimColumns(options.columns || []);\r\n\r\n this.allColumns = map(this._leafColumns(options.columns || []), this._prepareColumn);\r\n\r\n this.columns = this._visibleColumns(this.allColumns);\r\n\r\n this.options = options;\r\n this.data = options.data || [];\r\n this.aggregates = options.aggregates || {};\r\n this.groups = [].concat(options.groups || []);\r\n this.hasGroups = this.groups.length > 0;\r\n this.hierarchy = options.hierarchy;\r\n this.hasGroupHeaderColumn = this.columns.some(function (column) { return column.groupHeaderColumnTemplate; });\r\n this.collapsible = this.options.collapsible;\r\n },\r\n\r\n workbook: function() {\r\n var workbook = {\r\n sheets: [ {\r\n columns: this._columns(),\r\n rows: this.hierarchy ? this._hierarchyRows() : this._rows(),\r\n freezePane: this._freezePane(),\r\n filter: this._filter()\r\n } ]\r\n };\r\n\r\n return workbook;\r\n },\r\n\r\n _trimColumns: function(columns) {\r\n var this$1$1 = this;\r\n\r\n return columns.filter(function (column) {\r\n var result = Boolean(column.field);\r\n\r\n if (!result && column.columns) {\r\n result = this$1$1._trimColumns(column.columns).length > 0;\r\n }\r\n\r\n return result;\r\n });\r\n },\r\n\r\n _leafColumns: function(columns) {\r\n var this$1$1 = this;\r\n\r\n var result = [];\r\n\r\n for (var idx = 0; idx < columns.length; idx++) {\r\n if (!columns[idx].columns) {\r\n result.push(columns[idx]);\r\n } else {\r\n result = result.concat(this$1$1._leafColumns(columns[idx].columns));\r\n }\r\n }\r\n\r\n return result;\r\n },\r\n\r\n _prepareColumn: function(column) {\r\n if (!column.field) {\r\n return null;\r\n }\r\n\r\n var value = function(dataItem) {\r\n return getter(column.field, true)(dataItem);\r\n };\r\n\r\n var values = null;\r\n\r\n if (column.values) {\r\n values = {};\r\n\r\n column.values.forEach(function(item) {\r\n values[item.value] = item.text;\r\n });\r\n\r\n value = function(dataItem) {\r\n return values[getter(column.field, true)(dataItem)];\r\n };\r\n }\r\n\r\n return $.extend({}, column, {\r\n value: value,\r\n values: values,\r\n groupHeaderTemplate: column.groupHeaderTemplate ? TemplateService.compile(column.groupHeaderTemplate) : defaultGroupHeaderTemplate,\r\n groupHeaderColumnTemplate: column.groupHeaderColumnTemplate ? TemplateService.compile(column.groupHeaderColumnTemplate) : null,\r\n groupFooterTemplate: column.groupFooterTemplate ? TemplateService.compile(column.groupFooterTemplate) : null,\r\n footerTemplate: column.footerTemplate ? TemplateService.compile(column.footerTemplate) : null\r\n });\r\n },\r\n\r\n _filter: function() {\r\n if (!this.options.filterable) {\r\n return null;\r\n }\r\n\r\n var depth = this._depth();\r\n\r\n return {\r\n from: depth,\r\n to: depth + this.columns.length - 1\r\n };\r\n },\r\n\r\n _createPaddingCells: function(length) {\r\n var this$1$1 = this;\r\n\r\n return createArray(length, function () { return $.extend({\r\n background: \"#dfdfdf\",\r\n color: \"#333\"\r\n }, this$1$1.options.paddingCellOptions); });\r\n },\r\n\r\n _dataRow: function(dataItem, level, depth) {\r\n var this$1$1 = this;\r\n\r\n var cells = this._createPaddingCells(level);\r\n\r\n // grouped\r\n if (this.hasGroups && depth && dataItem.items) {\r\n cells = cells.concat(this._groupHeaderCells(dataItem, level, depth));\r\n var rows = this._dataRows(dataItem.items, level + 1);\r\n\r\n rows.unshift({\r\n type: \"group-header\",\r\n cells: cells,\r\n level: this.collapsible ? level : null\r\n });\r\n\r\n return rows.concat(this._footer(dataItem, level));\r\n }\r\n\r\n var dataCells = [];\r\n\r\n for (var cellIdx = 0; cellIdx < this.columns.length; cellIdx++) {\r\n dataCells[cellIdx] = this$1$1._cell(dataItem, this$1$1.columns[cellIdx]);\r\n }\r\n\r\n if (this.hierarchy) {\r\n dataCells[0].colSpan = depth - level + 1;\r\n }\r\n\r\n return [ {\r\n type: \"data\",\r\n cells: cells.concat(dataCells),\r\n level: this.collapsible ? level : null\r\n } ];\r\n },\r\n\r\n _groupHeaderCells: function(dataItem, level, depth) {\r\n var cells = [];\r\n\r\n var column = this.allColumns.filter(function(column) {\r\n return column.field === dataItem.field;\r\n })[0] || {};\r\n\r\n var title = column && column.title ? column.title : dataItem.field;\r\n var template = column ? column.groupHeaderTemplate || column.groupHeaderColumnTemplate : null;\r\n var group = $.extend({\r\n title: title,\r\n field: dataItem.field,\r\n value: column && column.values ? column.values[dataItem.value] : dataItem.value,\r\n aggregates: dataItem.aggregates,\r\n items: dataItem.items\r\n }, dataItem.aggregates[dataItem.field]);\r\n\r\n var value = template ? template(group) : (title + \": \" + (dataItem.value));\r\n\r\n cells.push($.extend({\r\n value: value,\r\n background: \"#dfdfdf\",\r\n color: \"#333\",\r\n colSpan: (this.hasGroupHeaderColumn ? 1 : this.columns.length) + depth - level\r\n }, column.groupHeaderCellOptions));\r\n\r\n if (this.hasGroupHeaderColumn) {\r\n this.columns.forEach(function(column, index) {\r\n if (index > 0) {\r\n cells.push($.extend({\r\n background: \"#dfdfdf\",\r\n color: \"#333\",\r\n value: column.groupHeaderColumnTemplate ?\r\n column.groupHeaderColumnTemplate($.extend({ group: group }, group, dataItem.aggregates[column.field])) :\r\n undefined\r\n }, column.groupHeaderCellOptions));\r\n }\r\n });\r\n }\r\n\r\n return cells;\r\n },\r\n\r\n _dataRows: function(dataItems, level) {\r\n var this$1$1 = this;\r\n\r\n var depth = this._depth();\r\n var rows = [];\r\n\r\n for (var idx = 0; idx < dataItems.length; idx++) {\r\n rows.push.apply(rows, this$1$1._dataRow(dataItems[idx], level, depth));\r\n }\r\n\r\n return rows;\r\n },\r\n\r\n _hierarchyRows: function() {\r\n var this$1$1 = this;\r\n\r\n var depth = this._depth();\r\n var data = this.data;\r\n var itemLevel = this.hierarchy.itemLevel;\r\n var itemId = this.hierarchy.itemId || defaultItemId;\r\n var hasFooter = this._hasFooterTemplate();\r\n var rows = [];\r\n var parents = [];\r\n var previousLevel = 0;\r\n var previousItemId;\r\n\r\n if (!hasFooter) {\r\n this.collapsible = false;\r\n }\r\n\r\n for (var idx = 0; idx < data.length; idx++) {\r\n var item = data[idx];\r\n var level = itemLevel(item, idx);\r\n\r\n if (hasFooter) {\r\n if (level > previousLevel) {\r\n parents.push({ id: previousItemId, level: previousLevel });\r\n } else if (level < previousLevel) {\r\n rows.push.apply(rows, this$1$1._hierarchyFooterRows(parents, level, depth));\r\n }\r\n\r\n previousLevel = level;\r\n previousItemId = itemId(item, idx);\r\n }\r\n\r\n rows.push.apply(rows, this$1$1._dataRow(item, level + 1, depth));\r\n }\r\n\r\n if (hasFooter) {\r\n rows.push.apply(rows, this._hierarchyFooterRows(parents, 0, depth));\r\n\r\n var rootAggregate = data.length ? this.aggregates[data[0].parentId] : {};\r\n rows.push(this._hierarchyFooter(rootAggregate, 0, depth));\r\n }\r\n\r\n this._prependHeaderRows(rows);\r\n\r\n return rows;\r\n },\r\n\r\n _hierarchyFooterRows: function(parents, currentLevel, depth) {\r\n var this$1$1 = this;\r\n\r\n var rows = [];\r\n while (parents.length && parents[parents.length - 1].level >= currentLevel) {\r\n var parent = parents.pop();\r\n rows.push(this$1$1._hierarchyFooter(this$1$1.aggregates[parent.id], parent.level + 1, depth));\r\n }\r\n\r\n return rows;\r\n },\r\n\r\n _hasFooterTemplate: function() {\r\n var columns = this.columns;\r\n for (var idx = 0; idx < columns.length; idx++) {\r\n if (columns[idx].footerTemplate) {\r\n return true;\r\n }\r\n }\r\n },\r\n\r\n _hierarchyFooter: function(aggregates, level, depth) {\r\n var cells = this.columns.map(function(column, index) {\r\n var colSpan = index ? 1 : depth - level + 1;\r\n if (column.footerTemplate) {\r\n var fieldAggregates = (aggregates || {})[column.field];\r\n return $.extend({\r\n background: \"#dfdfdf\",\r\n color: \"#333\",\r\n colSpan: colSpan,\r\n value: column.footerTemplate($.extend({ aggregates: aggregates }, fieldAggregates))\r\n }, column.footerCellOptions);\r\n }\r\n\r\n return $.extend({\r\n background: \"#dfdfdf\",\r\n color: \"#333\",\r\n colSpan: colSpan\r\n }, column.footerCellOptions);\r\n });\r\n\r\n return {\r\n type: \"footer\",\r\n cells: this._createPaddingCells(level).concat(cells),\r\n level: this.collapsible ? level : null\r\n };\r\n },\r\n\r\n _footer: function(dataItem, level) {\r\n var rows = [];\r\n var footer = this.columns.some(function (column) { return column.groupFooterTemplate; });\r\n\r\n var templateData, group;\r\n if (footer) {\r\n group = {\r\n group: { items: dataItem.items,\r\n field: dataItem.field,\r\n value: dataItem.value }\r\n };\r\n templateData = {};\r\n Object.keys(dataItem.aggregates).forEach(function (key) {\r\n templateData[key] = $.extend({}, dataItem.aggregates[key], group);\r\n });\r\n }\r\n\r\n var cells = this.columns.map(function (column) {\r\n if (column.groupFooterTemplate) {\r\n var data = $.extend({}, templateData, dataItem.aggregates[column.field], group);\r\n return $.extend({\r\n background: \"#dfdfdf\",\r\n color: \"#333\",\r\n value: column.groupFooterTemplate(data)\r\n }, column.groupFooterCellOptions);\r\n }\r\n\r\n return $.extend({\r\n background: \"#dfdfdf\",\r\n color: \"#333\"\r\n }, column.groupFooterCellOptions);\r\n });\r\n\r\n if (footer) {\r\n rows.push({\r\n type: \"group-footer\",\r\n cells: this._createPaddingCells(this.groups.length).concat(cells),\r\n level: this.collapsible ? level : null\r\n });\r\n }\r\n\r\n return rows;\r\n },\r\n\r\n _isColumnVisible: function(column) {\r\n return this._visibleColumns([ column ]).length > 0 && (column.field || column.columns);\r\n },\r\n\r\n _visibleColumns: function(columns) {\r\n var this$1$1 = this;\r\n\r\n return columns.filter(function (column) {\r\n var exportable = column.exportable;\r\n if (typeof exportable === 'object') {\r\n exportable = column.exportable.excel;\r\n }\r\n\r\n var visibleInExport = !column.hidden && exportable !== false;\r\n var visibleInExportOnly = column.hidden && exportable === true;\r\n var visible = visibleInExport || visibleInExportOnly;\r\n if (visible && column.columns) {\r\n visible = this$1$1._visibleColumns(column.columns).length > 0;\r\n }\r\n return visible;\r\n });\r\n },\r\n\r\n _headerRow: function(row, groups) {\r\n var this$1$1 = this;\r\n\r\n var headers = row.cells.map(function(cell) {\r\n return $.extend(cell, {\r\n colSpan: cell.colSpan > 1 ? cell.colSpan : 1,\r\n rowSpan: row.rowSpan > 1 && !cell.colSpan ? row.rowSpan : 1\r\n });\r\n });\r\n\r\n if (this.hierarchy && headers[0].firstCell) {\r\n headers[0].colSpan += this._depth();\r\n }\r\n\r\n return {\r\n type: \"header\",\r\n cells: createArray(groups.length, function () { return $.extend({\r\n background: \"#7a7a7a\",\r\n color: \"#fff\"\r\n }, this$1$1.options.headerPaddingCellOptions); }).concat(headers)\r\n };\r\n },\r\n\r\n _prependHeaderRows: function(rows) {\r\n var this$1$1 = this;\r\n\r\n var groups = this.groups;\r\n\r\n var headerRows = [ { rowSpan: 1, cells: [], index: 0 } ];\r\n\r\n this._prepareHeaderRows(headerRows, this.options.columns);\r\n\r\n for (var idx = headerRows.length - 1; idx >= 0; idx--) {\r\n rows.unshift(this$1$1._headerRow(headerRows[idx], groups));\r\n }\r\n },\r\n\r\n _prepareHeaderRows: function(rows, columns, parentCell, parentRow) {\r\n var this$1$1 = this;\r\n\r\n var row = parentRow || rows[rows.length - 1];\r\n var childRow = rows[row.index + 1];\r\n var totalColSpan = 0;\r\n\r\n for (var idx = 0; idx < columns.length; idx++) {\r\n var column = columns[idx];\r\n if (this$1$1._isColumnVisible(column)) {\r\n\r\n var cell = $.extend({\r\n background: \"#7a7a7a\",\r\n color: \"#fff\",\r\n value: column.title || column.field,\r\n colSpan: 0,\r\n firstCell: idx === 0 && (!parentCell || parentCell.firstCell)\r\n }, column.headerCellOptions);\r\n row.cells.push(cell);\r\n\r\n if (column.columns && column.columns.length) {\r\n if (!childRow) {\r\n childRow = { rowSpan: 0, cells: [], index: rows.length };\r\n rows.push(childRow);\r\n }\r\n cell.colSpan = this$1$1._trimColumns(this$1$1._visibleColumns(column.columns)).length;\r\n this$1$1._prepareHeaderRows(rows, column.columns, cell, childRow);\r\n totalColSpan += cell.colSpan - 1;\r\n row.rowSpan = rows.length - row.index;\r\n }\r\n }\r\n }\r\n\r\n if (parentCell) {\r\n parentCell.colSpan += totalColSpan;\r\n }\r\n },\r\n\r\n _rows: function() {\r\n var this$1$1 = this;\r\n\r\n var rows = this._dataRows(this.data, 0);\r\n\r\n if (this.columns.length) {\r\n this._prependHeaderRows(rows);\r\n var footer = false;\r\n\r\n var cells = this.columns.map(function (column) {\r\n if (column.footerTemplate) {\r\n footer = true;\r\n\r\n return $.extend({\r\n background: \"#dfdfdf\",\r\n color: \"#333\",\r\n value: column.footerTemplate($.extend({}, this$1$1.aggregates, this$1$1.aggregates[column.field]))\r\n }, column.footerCellOptions);\r\n }\r\n\r\n return $.extend({\r\n background: \"#dfdfdf\",\r\n color: \"#333\"\r\n }, column.footerCellOptions);\r\n });\r\n\r\n if (footer) {\r\n rows.push({\r\n type: \"footer\",\r\n cells: this._createPaddingCells(this.groups.length).concat(cells)\r\n });\r\n }\r\n }\r\n\r\n return rows;\r\n },\r\n\r\n _headerDepth: function(columns) {\r\n var this$1$1 = this;\r\n\r\n var result = 1;\r\n var max = 0;\r\n\r\n for (var idx = 0; idx < columns.length; idx++) {\r\n if (columns[idx].columns) {\r\n var temp = this$1$1._headerDepth(columns[idx].columns);\r\n if (temp > max) {\r\n max = temp;\r\n }\r\n }\r\n }\r\n return result + max;\r\n },\r\n\r\n _freezePane: function() {\r\n var columns = this._visibleColumns(this.options.columns || []);\r\n\r\n var colSplit = this._visibleColumns(this._trimColumns(this._leafColumns(columns.filter(function(column) {\r\n return column.locked;\r\n })))).length;\r\n\r\n return {\r\n rowSplit: this._headerDepth(columns),\r\n colSplit: colSplit ? colSplit + this.groups.length : 0\r\n };\r\n },\r\n\r\n _cell: function(dataItem, column) {\r\n return $.extend({\r\n value: column.value(dataItem)\r\n }, column.cellOptions);\r\n },\r\n\r\n _depth: function() {\r\n var depth = 0;\r\n\r\n if (this.hierarchy) {\r\n depth = this.hierarchy.depth;\r\n } else {\r\n depth = this.groups.length;\r\n }\r\n\r\n return depth;\r\n },\r\n\r\n _columns: function() {\r\n var depth = this._depth();\r\n var columns = createArray(depth, function () { return ({ width: 20 }); });\r\n\r\n return columns.concat(this.columns.map(function(column) {\r\n return {\r\n width: parseInt(column.width, 10),\r\n autoWidth: column.width ? false : true\r\n };\r\n }));\r\n }\r\n });\r\n\r\n kendo.deepExtend(kendo.excel, {\r\n ExcelExporter: ExcelExporter,\r\n TemplateService: TemplateService\r\n });\r\n\r\n })(window.kendo.jQuery);\r\n\r\n (function($, kendo) {\r\n\r\n var ExcelExporter = kendo.excel.ExcelExporter;\r\n\r\n var extend = $.extend;\r\n\r\n kendo.excel.TemplateService.register({\r\n compile: kendo.template\r\n });\r\n\r\n kendo.ExcelExporter = kendo.Class.extend({\r\n init: function(options) {\r\n this.options = options;\r\n var dataSource = options.dataSource;\r\n\r\n if (dataSource instanceof kendo.data.DataSource) {\r\n\r\n if (!dataSource.filter()) {\r\n dataSource.options.filter = undefined;\r\n }\r\n\r\n this.dataSource = new dataSource.constructor(extend(\r\n {},\r\n dataSource.options,\r\n {\r\n page: options.allPages ? 0 : dataSource.page(),\r\n filter: dataSource.filter(),\r\n pageSize: (options.allPages || options.groupPaging) ? dataSource.total() : dataSource.pageSize() || dataSource.total(),\r\n sort: dataSource.sort(),\r\n group: dataSource.group(),\r\n aggregate: dataSource.aggregate(),\r\n isExcelExportRequest: true\r\n }));\r\n\r\n var data = dataSource.data();\r\n\r\n if (data.length > 0) {\r\n if (options.hierarchy) {\r\n for (var i = 0; i < data.length; i++) {\r\n if (data[i].expanded === false || data[i].expanded === undefined) {\r\n data[i].expanded = true;\r\n data[i].shouldRestoreExpandedState = true;\r\n }\r\n }\r\n }\r\n // Avoid toJSON() for perf and avoid data() to prevent reparenting.\r\n this.dataSource._data = data;\r\n\r\n var transport = this.dataSource.transport;\r\n if (dataSource._isServerGrouped() && transport.options && transport.options.data) { // clear the transport data when using aspnet-mvc transport\r\n transport.options.data = null;\r\n }\r\n }\r\n\r\n } else {\r\n this.dataSource = kendo.data.DataSource.create(dataSource);\r\n }\r\n },\r\n\r\n _hierarchy: function() {\r\n var hierarchy = this.options.hierarchy;\r\n var dataSource = this.dataSource;\r\n\r\n if (hierarchy && dataSource.level) {\r\n hierarchy = {\r\n itemLevel: function(item) {\r\n return dataSource.level(item);\r\n }\r\n };\r\n\r\n var view = dataSource.view();\r\n var depth = 0;\r\n var level;\r\n\r\n for (var idx = 0; idx < view.length; idx++) {\r\n level = dataSource.level(view[idx]);\r\n\r\n if (level > depth) {\r\n depth = level;\r\n }\r\n }\r\n\r\n hierarchy.depth = depth + 1;\r\n } else {\r\n hierarchy = false;\r\n }\r\n\r\n return {\r\n hierarchy: hierarchy\r\n };\r\n },\r\n\r\n _restoreExpandedState: function() {\r\n var options = this.options,\r\n dataSource = options.dataSource,\r\n data = dataSource.data(),\r\n hierarchy = options.hierarchy;\r\n\r\n if (data.length > 0) {\r\n if (hierarchy) {\r\n for (var i = 0; i < data.length; i++) {\r\n if (data[i].shouldRestoreExpandedState) {\r\n data[i].expanded = false;\r\n delete data[i].shouldRestoreExpandedState;\r\n }\r\n }\r\n }\r\n }\r\n },\r\n\r\n workbook: function() {\r\n return $.Deferred((function(d) {\r\n this.dataSource.fetch()\r\n .then((function() {\r\n\r\n var workbook = new ExcelExporter(extend({}, this.options, this._hierarchy(), {\r\n data: this.dataSource.view(),\r\n groups: this.dataSource.group(),\r\n aggregates: this.dataSource.aggregates()\r\n })).workbook();\r\n\r\n d.resolve(workbook, this.dataSource.view());\r\n }).bind(this));\r\n }).bind(this)).promise();\r\n }\r\n });\r\n\r\n\r\n })(kendo.jQuery, kendo);\r\n\r\n (function($, kendo) {\r\n\r\n\r\n kendo.ExcelMixin = {\r\n extend: function(proto) {\r\n proto.events.push(\"excelExport\");\r\n proto.options.excel = $.extend(proto.options.excel, this.options);\r\n proto.saveAsExcel = this.saveAsExcel;\r\n },\r\n options: {\r\n proxyURL: \"\",\r\n allPages: false,\r\n filterable: false,\r\n fileName: \"Export.xlsx\",\r\n collapsible: false\r\n },\r\n saveAsExcel: function(deferred) {\r\n var excel = this.options.excel || {};\r\n\r\n var exporter = new kendo.ExcelExporter({\r\n columns: this.columns,\r\n dataSource: this.dataSource,\r\n allPages: excel.allPages,\r\n filterable: excel.filterable,\r\n hierarchy: excel.hierarchy,\r\n collapsible: excel.collapsible\r\n });\r\n\r\n exporter.workbook().then((function(book, data) {\r\n if (!this.trigger(\"excelExport\", { workbook: book, data: data })) {\r\n var workbook = new kendo.ooxml.Workbook(book);\r\n\r\n if (!workbook.options) {\r\n workbook.options = {};\r\n }\r\n workbook.options.skipCustomHeight = true;\r\n\r\n workbook.toDataURLAsync().then(function(dataURI) {\r\n kendo.saveAs({\r\n dataURI: dataURI,\r\n fileName: book.fileName || excel.fileName,\r\n proxyURL: excel.proxyURL,\r\n forceProxy: excel.forceProxy\r\n });\r\n\r\n exporter._restoreExpandedState();\r\n if (deferred) {\r\n deferred.resolve();\r\n }\r\n });\r\n }\r\n }).bind(this));\r\n }\r\n };\r\n\r\n })(kendo.jQuery, kendo);\r\n\r\n var __meta__$2w = {\r\n id: \"excel\",\r\n name: \"Excel export\",\r\n category: \"framework\",\r\n advanced: true,\r\n mixin: true,\r\n depends: [ \"data\", \"ooxml\" ]\r\n };\r\n\r\n var __meta__$2v = {\r\n id: \"data.signalr\",\r\n name: \"SignalR\",\r\n category: \"framework\",\r\n depends: [ \"data\" ],\r\n hidden: true\r\n };\r\n\r\n (function($) {\r\n var kendo = window.kendo;\r\n var isFunction = kendo.isFunction;\r\n\r\n function isJQueryPromise(promise) {\r\n return promise && isFunction(promise.done) && isFunction(promise.fail);\r\n }\r\n\r\n function isNativePromise(promise) {\r\n return promise && isFunction(promise.then) && isFunction(promise.catch);\r\n }\r\n\r\n var transport = kendo.data.RemoteTransport.extend({\r\n init: function(options) {\r\n var signalr = options && options.signalr ? options.signalr : {};\r\n\r\n var promise = signalr.promise;\r\n\r\n if (!promise) {\r\n throw new Error('The \"promise\" option must be set.');\r\n }\r\n\r\n if (!isJQueryPromise(promise) && !isNativePromise(promise)) {\r\n throw new Error('The \"promise\" option must be a Promise.');\r\n }\r\n\r\n this.promise = promise;\r\n\r\n var hub = signalr.hub;\r\n\r\n if (!hub) {\r\n throw new Error('The \"hub\" option must be set.');\r\n }\r\n\r\n if (typeof hub.on != \"function\" || typeof hub.invoke != \"function\") {\r\n throw new Error('The \"hub\" option is not a valid SignalR hub proxy.');\r\n }\r\n\r\n this.hub = hub;\r\n\r\n kendo.data.RemoteTransport.fn.init.call(this, options);\r\n },\r\n\r\n push: function(callbacks) {\r\n var client = this.options.signalr.client || {};\r\n\r\n if (client.create) {\r\n this.hub.on(client.create, callbacks.pushCreate);\r\n }\r\n\r\n if (client.update) {\r\n this.hub.on(client.update, callbacks.pushUpdate);\r\n }\r\n\r\n if (client.destroy) {\r\n this.hub.on(client.destroy, callbacks.pushDestroy);\r\n }\r\n },\r\n\r\n _crud: function(options, type) {\r\n var hub = this.hub;\r\n var promise = this.promise;\r\n var server = this.options.signalr.server;\r\n\r\n if (!server || !server[type]) {\r\n throw new Error(kendo.format('The \"server.{0}\" option must be set.', type));\r\n }\r\n\r\n var args = [server[type]];\r\n\r\n var data = this.parameterMap(options.data, type);\r\n\r\n if (!$.isEmptyObject(data)) {\r\n args.push(data);\r\n }\r\n\r\n if (isJQueryPromise(promise)) {\r\n promise.done(function() {\r\n hub.invoke.apply(hub, args)\r\n .done(options.success)\r\n .fail(options.error);\r\n });\r\n } else if (isNativePromise(promise)) {\r\n promise.then(function() {\r\n hub.invoke.apply(hub, args)\r\n .then(options.success)\r\n .catch(options.error);\r\n });\r\n }\r\n },\r\n\r\n read: function(options) {\r\n this._crud(options, \"read\");\r\n },\r\n\r\n create: function(options) {\r\n this._crud(options, \"create\");\r\n },\r\n\r\n update: function(options) {\r\n this._crud(options, \"update\");\r\n },\r\n\r\n destroy: function(options) {\r\n this._crud(options, \"destroy\");\r\n }\r\n });\r\n\r\n $.extend(true, kendo.data, {\r\n transports: {\r\n signalr: transport\r\n }\r\n });\r\n\r\n })(window.kendo.jQuery);\r\n var kendo$2t = kendo;\r\n\r\n (function($) {\r\n\r\n function createPromise() {\r\n return $.Deferred();\r\n }\r\n\r\n function promiseAll(promises) {\r\n return $.when.apply($, promises);\r\n }\r\n\r\n function extendStatic(dest, src) {\r\n if (!src) {\r\n return;\r\n }\r\n\r\n if (typeof src.__proto__ === 'function') {\r\n dest.__proto__ = src;\r\n } else {\r\n for (var member in src) {\r\n if (src.hasOwnProperty(member)) {\r\n dest[member] = src[member];\r\n }\r\n }\r\n }\r\n }\r\n\r\n kendo.drawing.util = kendo.drawing.util || {};\r\n kendo.deepExtend(kendo.drawing.util, {\r\n createPromise: createPromise,\r\n promiseAll: promiseAll,\r\n extendStatic: extendStatic\r\n });\r\n\r\n })(window.kendo.jQuery);\r\n\r\n /***********************************************************************\r\n * WARNING: this file is auto-generated. If you change it directly,\r\n * your modifications will eventually be lost. The source code is in\r\n * `kendo-drawing` repository, you should make your changes there and\r\n * run `src-modules/sync.sh` in this repository.\r\n */\r\n /* eslint-disable space-before-blocks, space-before-function-paren, no-multi-spaces */\r\n\r\n var __meta__$2u = {\r\n id: \"color\",\r\n name: \"Color utils\",\r\n category: \"framework\",\r\n advanced: true,\r\n description: \"Color utilities used across components\",\r\n depends: [ \"core\" ]\r\n };\r\n\r\n window.kendo = window.kendo || {};\r\n\r\n var Class$3 = kendo.Class;\r\n var support = kendo.support;\r\n\r\n var namedColors = {\r\n aliceblue: \"f0f8ff\", antiquewhite: \"faebd7\", aqua: \"00ffff\",\r\n aquamarine: \"7fffd4\", azure: \"f0ffff\", beige: \"f5f5dc\",\r\n bisque: \"ffe4c4\", black: \"000000\", blanchedalmond: \"ffebcd\",\r\n blue: \"0000ff\", blueviolet: \"8a2be2\", brown: \"a52a2a\",\r\n burlywood: \"deb887\", cadetblue: \"5f9ea0\", chartreuse: \"7fff00\",\r\n chocolate: \"d2691e\", coral: \"ff7f50\", cornflowerblue: \"6495ed\",\r\n cornsilk: \"fff8dc\", crimson: \"dc143c\", cyan: \"00ffff\",\r\n darkblue: \"00008b\", darkcyan: \"008b8b\", darkgoldenrod: \"b8860b\",\r\n darkgray: \"a9a9a9\", darkgrey: \"a9a9a9\", darkgreen: \"006400\",\r\n darkkhaki: \"bdb76b\", darkmagenta: \"8b008b\", darkolivegreen: \"556b2f\",\r\n darkorange: \"ff8c00\", darkorchid: \"9932cc\", darkred: \"8b0000\",\r\n darksalmon: \"e9967a\", darkseagreen: \"8fbc8f\", darkslateblue: \"483d8b\",\r\n darkslategray: \"2f4f4f\", darkslategrey: \"2f4f4f\", darkturquoise: \"00ced1\",\r\n darkviolet: \"9400d3\", deeppink: \"ff1493\", deepskyblue: \"00bfff\",\r\n dimgray: \"696969\", dimgrey: \"696969\", dodgerblue: \"1e90ff\",\r\n firebrick: \"b22222\", floralwhite: \"fffaf0\", forestgreen: \"228b22\",\r\n fuchsia: \"ff00ff\", gainsboro: \"dcdcdc\", ghostwhite: \"f8f8ff\",\r\n gold: \"ffd700\", goldenrod: \"daa520\", gray: \"808080\",\r\n grey: \"808080\", green: \"008000\", greenyellow: \"adff2f\",\r\n honeydew: \"f0fff0\", hotpink: \"ff69b4\", indianred: \"cd5c5c\",\r\n indigo: \"4b0082\", ivory: \"fffff0\", khaki: \"f0e68c\",\r\n lavender: \"e6e6fa\", lavenderblush: \"fff0f5\", lawngreen: \"7cfc00\",\r\n lemonchiffon: \"fffacd\", lightblue: \"add8e6\", lightcoral: \"f08080\",\r\n lightcyan: \"e0ffff\", lightgoldenrodyellow: \"fafad2\", lightgray: \"d3d3d3\",\r\n lightgrey: \"d3d3d3\", lightgreen: \"90ee90\", lightpink: \"ffb6c1\",\r\n lightsalmon: \"ffa07a\", lightseagreen: \"20b2aa\", lightskyblue: \"87cefa\",\r\n lightslategray: \"778899\", lightslategrey: \"778899\", lightsteelblue: \"b0c4de\",\r\n lightyellow: \"ffffe0\", lime: \"00ff00\", limegreen: \"32cd32\",\r\n linen: \"faf0e6\", magenta: \"ff00ff\", maroon: \"800000\",\r\n mediumaquamarine: \"66cdaa\", mediumblue: \"0000cd\", mediumorchid: \"ba55d3\",\r\n mediumpurple: \"9370d8\", mediumseagreen: \"3cb371\", mediumslateblue: \"7b68ee\",\r\n mediumspringgreen: \"00fa9a\", mediumturquoise: \"48d1cc\", mediumvioletred: \"c71585\",\r\n midnightblue: \"191970\", mintcream: \"f5fffa\", mistyrose: \"ffe4e1\",\r\n moccasin: \"ffe4b5\", navajowhite: \"ffdead\", navy: \"000080\",\r\n oldlace: \"fdf5e6\", olive: \"808000\", olivedrab: \"6b8e23\",\r\n orange: \"ffa500\", orangered: \"ff4500\", orchid: \"da70d6\",\r\n palegoldenrod: \"eee8aa\", palegreen: \"98fb98\", paleturquoise: \"afeeee\",\r\n palevioletred: \"d87093\", papayawhip: \"ffefd5\", peachpuff: \"ffdab9\",\r\n peru: \"cd853f\", pink: \"ffc0cb\", plum: \"dda0dd\",\r\n powderblue: \"b0e0e6\", purple: \"800080\", red: \"ff0000\",\r\n rosybrown: \"bc8f8f\", royalblue: \"4169e1\", saddlebrown: \"8b4513\",\r\n salmon: \"fa8072\", sandybrown: \"f4a460\", seagreen: \"2e8b57\",\r\n seashell: \"fff5ee\", sienna: \"a0522d\", silver: \"c0c0c0\",\r\n skyblue: \"87ceeb\", slateblue: \"6a5acd\", slategray: \"708090\",\r\n slategrey: \"708090\", snow: \"fffafa\", springgreen: \"00ff7f\",\r\n steelblue: \"4682b4\", tan: \"d2b48c\", teal: \"008080\",\r\n thistle: \"d8bfd8\", tomato: \"ff6347\", turquoise: \"40e0d0\",\r\n violet: \"ee82ee\", wheat: \"f5deb3\", white: \"ffffff\",\r\n whitesmoke: \"f5f5f5\", yellow: \"ffff00\", yellowgreen: \"9acd32\"\r\n };\r\n\r\n var browser = support.browser;\r\n\r\n var matchNamedColor = function (color) {\r\n var colorNames = Object.keys(namedColors);\r\n colorNames.push(\"transparent\");\r\n\r\n var regexp = new RegExp(\"^(\" + colorNames.join(\"|\") + \")(\\\\W|$)\", \"i\");\r\n matchNamedColor = function (color) { return regexp.exec(color); };\r\n\r\n return regexp.exec(color);\r\n };\r\n\r\n var BaseColor = Class$3.extend({\r\n init: function() { },\r\n\r\n toHSV: function() { return this; },\r\n\r\n toRGB: function() { return this; },\r\n\r\n toHex: function(options) { return this.toBytes().toHex(options); },\r\n\r\n toBytes: function() { return this; },\r\n\r\n toCss: function(options) { return \"#\" + this.toHex(options); },\r\n\r\n toCssRgba: function() {\r\n var rgb = this.toBytes();\r\n return (\"rgba(\" + (rgb.r) + \", \" + (rgb.g) + \", \" + (rgb.b) + \", \" + (parseFloat((Number(this.a)).toFixed(3))) + \")\");\r\n },\r\n\r\n toDisplay: function() {\r\n if (browser.msie && browser.version < 9) {\r\n return this.toCss(); // no RGBA support; does it support any opacity in colors?\r\n }\r\n return this.toCssRgba();\r\n },\r\n\r\n equals: function(c) {\r\n return c === this || ((c !== null && c !== undefined) && this.toCssRgba() === parseColor(c).toCssRgba());\r\n },\r\n\r\n diff: function(other) {\r\n if (other === null) {\r\n return NaN;\r\n }\r\n\r\n var c1 = this.toBytes();\r\n var c2 = other.toBytes();\r\n\r\n return Math.sqrt(Math.pow((c1.r - c2.r) * 0.30, 2) +\r\n Math.pow((c1.g - c2.g) * 0.59, 2) +\r\n Math.pow((c1.b - c2.b) * 0.11, 2));\r\n },\r\n\r\n clone: function() {\r\n var c = this.toBytes();\r\n if (c === this) {\r\n c = new Bytes(c.r, c.g, c.b, c.a);\r\n }\r\n\r\n return c;\r\n }\r\n });\r\n\r\n var RGB = BaseColor.extend({\r\n init: function(r, g, b, a) {\r\n BaseColor.fn.init.call(this);\r\n\r\n this.r = r;\r\n this.g = g;\r\n this.b = b;\r\n this.a = a;\r\n },\r\n\r\n toHSV: function() {\r\n var ref = this;\r\n var r = ref.r;\r\n var g = ref.g;\r\n var b = ref.b;\r\n var min = Math.min(r, g, b);\r\n var max = Math.max(r, g, b);\r\n var delta = max - min;\r\n var v = max;\r\n var h, s;\r\n\r\n if (delta === 0) {\r\n return new HSV(0, 0, v, this.a);\r\n }\r\n\r\n if (max !== 0) {\r\n s = delta / max;\r\n if (r === max) {\r\n h = (g - b) / delta;\r\n } else if (g === max) {\r\n h = 2 + (b - r) / delta;\r\n } else {\r\n h = 4 + (r - g) / delta;\r\n }\r\n\r\n h *= 60;\r\n if (h < 0) {\r\n h += 360;\r\n }\r\n } else {\r\n s = 0;\r\n h = -1;\r\n }\r\n\r\n return new HSV(h, s, v, this.a);\r\n },\r\n\r\n toHSL: function() {\r\n var ref = this;\r\n var r = ref.r;\r\n var g = ref.g;\r\n var b = ref.b;\r\n var max = Math.max(r, g, b);\r\n var min = Math.min(r, g, b);\r\n var h, s, l = (max + min) / 2;\r\n\r\n if (max === min) {\r\n h = s = 0;\r\n } else {\r\n var d = max - min;\r\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\r\n switch (max) {\r\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\r\n case g: h = (b - r) / d + 2; break;\r\n case b: h = (r - g) / d + 4; break;\r\n default: break;\r\n }\r\n }\r\n\r\n return new HSL(h * 60, s * 100, l * 100, this.a);\r\n },\r\n\r\n toBytes: function() {\r\n return new Bytes(this.r * 255, this.g * 255, this.b * 255, this.a);\r\n }\r\n });\r\n\r\n var Bytes = RGB.extend({\r\n init: function(r, g, b, a) {\r\n RGB.fn.init.call(this, Math.round(r), Math.round(g), Math.round(b), a);\r\n },\r\n\r\n toRGB: function() {\r\n return new RGB(this.r / 255, this.g / 255, this.b / 255, this.a);\r\n },\r\n\r\n toHSV: function() {\r\n return this.toRGB().toHSV();\r\n },\r\n\r\n toHSL: function() {\r\n return this.toRGB().toHSL();\r\n },\r\n\r\n toHex: function(options) {\r\n var value = hex(this.r, 2) + hex(this.g, 2) + hex(this.b, 2);\r\n\r\n if (options && options.alpha) {\r\n value += hex(Math.round(this.a * 255), 2);\r\n }\r\n\r\n return value;\r\n },\r\n\r\n toBytes: function() {\r\n return this;\r\n }\r\n });\r\n\r\n function hex(n, width, pad) {\r\n if (pad === void 0) { pad = \"0\"; }\r\n\r\n var result = n.toString(16);\r\n while (width > result.length) {\r\n result = pad + result;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n var HSV = BaseColor.extend({\r\n init: function(h, s, v, a) {\r\n BaseColor.fn.init.call(this);\r\n\r\n this.h = h;\r\n this.s = s;\r\n this.v = v;\r\n this.a = a;\r\n },\r\n\r\n toRGB: function() {\r\n var ref = this;\r\n var h = ref.h;\r\n var s = ref.s;\r\n var v = ref.v;\r\n var r, g, b;\r\n\r\n if (s === 0) {\r\n r = g = b = v;\r\n } else {\r\n h /= 60;\r\n\r\n var i = Math.floor(h);\r\n var f = h - i;\r\n var p = v * (1 - s);\r\n var q = v * (1 - s * f);\r\n var t = v * (1 - s * (1 - f));\r\n\r\n switch (i) {\r\n case 0: r = v; g = t; b = p; break;\r\n case 1: r = q; g = v; b = p; break;\r\n case 2: r = p; g = v; b = t; break;\r\n case 3: r = p; g = q; b = v; break;\r\n case 4: r = t; g = p; b = v; break;\r\n default: r = v; g = p; b = q; break;\r\n }\r\n }\r\n\r\n return new RGB(r, g, b, this.a);\r\n },\r\n\r\n toHSL: function() {\r\n return this.toRGB().toHSL();\r\n },\r\n\r\n toBytes: function() {\r\n return this.toRGB().toBytes();\r\n }\r\n });\r\n\r\n var HSL = BaseColor.extend({\r\n init: function(h, s, l, a) {\r\n BaseColor.fn.init.call(this);\r\n\r\n this.h = h;\r\n this.s = s;\r\n this.l = l;\r\n this.a = a;\r\n },\r\n\r\n toRGB: function() {\r\n var h = this.h / 360;\r\n var s = this.s / 100;\r\n var l = this.l / 100;\r\n var r, g, b;\r\n\r\n if (s === 0) {\r\n r = g = b = l; // achromatic\r\n } else {\r\n var q = l < 0.5 ? l * (1 + s) : l + s - l * s;\r\n var p = 2 * l - q;\r\n r = hue2rgb(p, q, h + 1 / 3);\r\n g = hue2rgb(p, q, h);\r\n b = hue2rgb(p, q, h - 1 / 3);\r\n }\r\n\r\n return new RGB(r, g, b, this.a);\r\n },\r\n\r\n toHSV: function() {\r\n return this.toRGB().toHSV();\r\n },\r\n\r\n toBytes: function() {\r\n return this.toRGB().toBytes();\r\n }\r\n });\r\n\r\n function hue2rgb(p, q, s) {\r\n var t = s;\r\n\r\n if (t < 0) {\r\n t += 1;\r\n }\r\n\r\n if (t > 1) {\r\n t -= 1;\r\n }\r\n\r\n if (t < 1 / 6) {\r\n return p + (q - p) * 6 * t;\r\n }\r\n\r\n if (t < 1 / 2) {\r\n return q;\r\n }\r\n\r\n if (t < 2 / 3) {\r\n return p + (q - p) * (2 / 3 - t) * 6;\r\n }\r\n\r\n return p;\r\n }\r\n\r\n function alphaFromHex(a) {\r\n return parseFloat(parseFloat(parseInt(a, 16) / 255 ).toFixed(3));\r\n }\r\n\r\n function parseColor(value, safe) {\r\n var m, ret;\r\n\r\n if (value == null || value === \"none\" || value == \"\") {\r\n return null;\r\n }\r\n\r\n if (value instanceof BaseColor) {\r\n return value;\r\n }\r\n\r\n var color = value.toLowerCase();\r\n if ((m = matchNamedColor(color))) {\r\n if (m[1] === \"transparent\") {\r\n color = new RGB(1, 1, 1, 0);\r\n } else {\r\n color = parseColor(namedColors[m[1]], safe);\r\n }\r\n color.match = [ m[1] ];\r\n return color;\r\n }\r\n if ((m = /^#?([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})\\b/i.exec(color))) {\r\n ret = new Bytes(parseInt(m[1], 16),\r\n parseInt(m[2], 16),\r\n parseInt(m[3], 16), 1);\r\n } else if ((m = /^#?([0-9a-f])([0-9a-f])([0-9a-f])\\b/i.exec(color))) {\r\n ret = new Bytes(parseInt(m[1] + m[1], 16),\r\n parseInt(m[2] + m[2], 16),\r\n parseInt(m[3] + m[3], 16), 1);\r\n } else if ((m = /^#?([0-9a-f])([0-9a-f])([0-9a-f])([0-9a-f])\\b/i.exec(color))) { // Parse 4 digit hex color\r\n ret = new Bytes(parseInt(m[1] + m[1], 16),\r\n parseInt(m[2] + m[2], 16),\r\n parseInt(m[3] + m[3], 16),\r\n alphaFromHex(m[4] + m[4]));\r\n } else if ((m = /^#?([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})\\b/i.exec(color))) { // Parse 8 digit hex color\r\n ret = new Bytes(parseInt(m[1], 16),\r\n parseInt(m[2], 16),\r\n parseInt(m[3], 16),\r\n alphaFromHex(m[4]));\r\n } else if ((m = /^rgb\\(\\s*([0-9]+)\\s*,\\s*([0-9]+)\\s*,\\s*([0-9]+)\\s*\\)/.exec(color))) {\r\n ret = new Bytes(parseInt(m[1], 10),\r\n parseInt(m[2], 10),\r\n parseInt(m[3], 10), 1);\r\n } else if ((m = /^rgba\\(\\s*([0-9]+)\\s*,\\s*([0-9]+)\\s*,\\s*([0-9]+)\\s*,\\s*([0-9.]+)\\s*\\)/.exec(color))) {\r\n ret = new Bytes(parseInt(m[1], 10),\r\n parseInt(m[2], 10),\r\n parseInt(m[3], 10), parseFloat(m[4]));\r\n } else if ((m = /^rgb\\(\\s*([0-9]*\\.?[0-9]+)%\\s*,\\s*([0-9]*\\.?[0-9]+)%\\s*,\\s*([0-9]*\\.?[0-9]+)%\\s*\\)/.exec(color))) {\r\n ret = new RGB(parseFloat(m[1]) / 100,\r\n parseFloat(m[2]) / 100,\r\n parseFloat(m[3]) / 100, 1);\r\n } else if ((m = /^rgba\\(\\s*([0-9]*\\.?[0-9]+)%\\s*,\\s*([0-9]*\\.?[0-9]+)%\\s*,\\s*([0-9]*\\.?[0-9]+)%\\s*,\\s*([0-9.]+)\\s*\\)/.exec(color))) {\r\n ret = new RGB(parseFloat(m[1]) / 100,\r\n parseFloat(m[2]) / 100,\r\n parseFloat(m[3]) / 100, parseFloat(m[4]));\r\n } else if ((m = /^color\\(\\s*srgb\\s*([0-9]*\\.?[0-9]+)\\s+([0-9]*\\.?[0-9]+)\\s+([0-9]*\\.?[0-9]+)\\s*(\\/\\s+([0-9]*\\.?[0-9]+))?\\)/.exec(color))) {\r\n ret = new RGB(\r\n parseFloat(m[1]),\r\n parseFloat(m[2]),\r\n parseFloat(m[3]),\r\n parseFloat(m[5] || '1'));\r\n }\r\n\r\n if (ret) {\r\n ret.match = m;\r\n } else if (!safe) {\r\n throw new Error(\"Cannot parse color: \" + color);\r\n }\r\n\r\n return ret;\r\n }\r\n\r\n var DARK_TRESHOLD = 180;\r\n\r\n var Color = Class$3.extend({\r\n init: function(value) {\r\n var this$1$1 = this;\r\n\r\n if (arguments.length === 1) {\r\n var formats = Color.formats;\r\n var resolvedColor = this.resolveColor(value);\r\n\r\n for (var idx = 0; idx < formats.length; idx++) {\r\n var formatRegex = formats[idx].re;\r\n var processor = formats[idx].process;\r\n var parts = formatRegex.exec(resolvedColor);\r\n\r\n if (parts) {\r\n var channels = processor(parts);\r\n this$1$1.r = channels[0];\r\n this$1$1.g = channels[1];\r\n this$1$1.b = channels[2];\r\n }\r\n }\r\n } else {\r\n this.r = arguments[0];\r\n this.g = arguments[1];\r\n this.b = arguments[2];\r\n }\r\n\r\n this.r = this.normalizeByte(this.r);\r\n this.g = this.normalizeByte(this.g);\r\n this.b = this.normalizeByte(this.b);\r\n },\r\n\r\n toHex: function() {\r\n var pad = this.padDigit;\r\n var r = this.r.toString(16);\r\n var g = this.g.toString(16);\r\n var b = this.b.toString(16);\r\n\r\n return \"#\" + pad(r) + pad(g) + pad(b);\r\n },\r\n\r\n resolveColor: function(value) {\r\n var color = value || \"black\";\r\n\r\n if (color.charAt(0) === \"#\") {\r\n color = color.substr(1, 6);\r\n }\r\n\r\n color = color.replace(/ /g, \"\");\r\n color = color.toLowerCase();\r\n color = Color.namedColors[color] || color;\r\n\r\n return color;\r\n },\r\n\r\n normalizeByte: function(value) {\r\n if (value < 0 || isNaN(value)) {\r\n return 0;\r\n }\r\n\r\n return value > 255 ? 255 : value;\r\n },\r\n\r\n padDigit: function(value) {\r\n return (value.length === 1) ? \"0\" + value : value;\r\n },\r\n\r\n brightness: function(value) {\r\n var round = Math.round;\r\n\r\n this.r = round(this.normalizeByte(this.r * value));\r\n this.g = round(this.normalizeByte(this.g * value));\r\n this.b = round(this.normalizeByte(this.b * value));\r\n\r\n return this;\r\n },\r\n\r\n percBrightness: function() {\r\n return Math.sqrt(0.241 * this.r * this.r + 0.691 * this.g * this.g + 0.068 * this.b * this.b);\r\n },\r\n\r\n isDark: function() {\r\n return this.percBrightness() < DARK_TRESHOLD;\r\n }\r\n });\r\n\r\n Color.fromBytes = function(r, g, b, a) {\r\n return new Bytes(r, g, b, a != null ? a : 1);\r\n };\r\n\r\n Color.fromRGB = function(r, g, b, a) {\r\n return new RGB(r, g, b, a != null ? a : 1);\r\n };\r\n\r\n Color.fromHSV = function(h, s, v, a) {\r\n return new HSV(h, s, v, a != null ? a : 1);\r\n };\r\n\r\n Color.fromHSL = function(h, s, l, a) {\r\n return new HSL(h, s, l, a != null ? a : 1);\r\n };\r\n\r\n Color.formats = [ {\r\n re: /^rgb\\((\\d{1,3}),\\s*(\\d{1,3}),\\s*(\\d{1,3})\\)$/,\r\n process: function(parts) {\r\n return [\r\n parseInt(parts[1], 10), parseInt(parts[2], 10), parseInt(parts[3], 10)\r\n ];\r\n }\r\n }, {\r\n re: /^(\\w{2})(\\w{2})(\\w{2})$/,\r\n process: function(parts) {\r\n return [\r\n parseInt(parts[1], 16), parseInt(parts[2], 16), parseInt(parts[3], 16)\r\n ];\r\n }\r\n }, {\r\n re: /^(\\w{1})(\\w{1})(\\w{1})$/,\r\n process: function(parts) {\r\n return [\r\n parseInt(parts[1] + parts[1], 16),\r\n parseInt(parts[2] + parts[2], 16),\r\n parseInt(parts[3] + parts[3], 16)\r\n ];\r\n }\r\n } ];\r\n\r\n Color.namedColors = namedColors;\r\n\r\n kendo.deepExtend(kendo, {\r\n parseColor: parseColor,\r\n namedColors: namedColors,\r\n Color: Color\r\n });\r\n\r\n /***********************************************************************\r\n * WARNING: this file is auto-generated. If you change it directly,\r\n * your modifications will eventually be lost. The source code is in\r\n * `kendo-drawing` repository, you should make your changes there and\r\n * run `src-modules/sync.sh` in this repository.\r\n */\r\n\r\n (function($) {\r\n /* eslint-disable space-before-blocks, space-before-function-paren */\r\n\r\n window.kendo.util = window.kendo.util || {};\r\n\r\n var LRUCache = kendo.Class.extend({\r\n init: function(size) {\r\n\r\n this._size = size;\r\n this._length = 0;\r\n this._map = {};\r\n },\r\n\r\n put: function(key, value) {\r\n var map = this._map;\r\n var entry = { key: key, value: value };\r\n\r\n map[key] = entry;\r\n\r\n if (!this._head) {\r\n this._head = this._tail = entry;\r\n } else {\r\n this._tail.newer = entry;\r\n entry.older = this._tail;\r\n this._tail = entry;\r\n }\r\n\r\n if (this._length >= this._size) {\r\n map[this._head.key] = null;\r\n this._head = this._head.newer;\r\n this._head.older = null;\r\n } else {\r\n this._length++;\r\n }\r\n },\r\n\r\n get: function(key) {\r\n var entry = this._map[key];\r\n\r\n if (entry) {\r\n if (entry === this._head && entry !== this._tail) {\r\n this._head = entry.newer;\r\n this._head.older = null;\r\n }\r\n\r\n if (entry !== this._tail) {\r\n if (entry.older) {\r\n entry.older.newer = entry.newer;\r\n entry.newer.older = entry.older;\r\n }\r\n\r\n entry.older = this._tail;\r\n entry.newer = null;\r\n\r\n this._tail.newer = entry;\r\n this._tail = entry;\r\n }\r\n\r\n return entry.value;\r\n }\r\n }\r\n });\r\n\r\n var REPLACE_REGEX = /\\r?\\n|\\r|\\t/g;\r\n var SPACE = ' ';\r\n\r\n function normalizeText(text) {\r\n return String(text).replace(REPLACE_REGEX, SPACE);\r\n }\r\n\r\n function objectKey(object) {\r\n var parts = [];\r\n for (var key in object) {\r\n parts.push(key + object[key]);\r\n }\r\n\r\n return parts.sort().join(\"\");\r\n }\r\n\r\n // Computes FNV-1 hash\r\n // See http://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function\r\n function hashKey(str) {\r\n // 32-bit FNV-1 offset basis\r\n // See http://isthe.com/chongo/tech/comp/fnv/#FNV-param\r\n var hash = 0x811C9DC5;\r\n\r\n for (var i = 0; i < str.length; ++i) {\r\n hash += (hash << 1) + (hash << 4) + (hash << 7) + (hash << 8) + (hash << 24);\r\n hash ^= str.charCodeAt(i);\r\n }\r\n\r\n return hash >>> 0;\r\n }\r\n\r\n function zeroSize() {\r\n return { width: 0, height: 0, baseline: 0 };\r\n }\r\n\r\n var DEFAULT_OPTIONS = {\r\n baselineMarkerSize: 1\r\n };\r\n\r\n var defaultMeasureBox;\r\n\r\n if (typeof document !== \"undefined\") {\r\n defaultMeasureBox = document.createElement(\"div\");\r\n defaultMeasureBox.style.cssText = \"position: absolute !important; top: -4000px !important; width: auto !important; height: auto !important;\" +\r\n \"padding: 0 !important; margin: 0 !important; border: 0 !important;\" +\r\n \"line-height: normal !important; visibility: hidden !important; white-space: pre!important;\";\r\n }\r\n\r\n var TextMetrics = kendo.Class.extend({\r\n init: function(options) {\r\n\r\n this._cache = new LRUCache(1000);\r\n this.options = $.extend({}, DEFAULT_OPTIONS, options);\r\n },\r\n\r\n measure: function(text, style, options) {\r\n if (options === void 0) { options = {}; }\r\n\r\n if (typeof text === 'undefined' || text === null) {\r\n return zeroSize();\r\n }\r\n\r\n var styleKey = objectKey(style);\r\n var cacheKey = hashKey(text + styleKey);\r\n var cachedResult = this._cache.get(cacheKey);\r\n\r\n if (cachedResult) {\r\n return cachedResult;\r\n }\r\n\r\n var size = zeroSize();\r\n var measureBox = options.box || defaultMeasureBox;\r\n var baselineMarker = this._baselineMarker().cloneNode(false);\r\n\r\n for (var key in style) {\r\n var value = style[key];\r\n if (typeof value !== \"undefined\") {\r\n measureBox.style[key] = value;\r\n }\r\n }\r\n\r\n var textStr = options.normalizeText !== false ? normalizeText(text) : String(text);\r\n\r\n measureBox.textContent = textStr;\r\n measureBox.appendChild(baselineMarker);\r\n document.body.appendChild(measureBox);\r\n\r\n if (textStr.length) {\r\n size.width = measureBox.offsetWidth - this.options.baselineMarkerSize;\r\n size.height = measureBox.offsetHeight;\r\n size.baseline = baselineMarker.offsetTop + this.options.baselineMarkerSize;\r\n }\r\n\r\n if (size.width > 0 && size.height > 0) {\r\n this._cache.put(cacheKey, size);\r\n }\r\n\r\n measureBox.parentNode.removeChild(measureBox);\r\n\r\n return size;\r\n },\r\n\r\n _baselineMarker: function() {\r\n var marker = document.createElement(\"div\");\r\n marker.style.cssText = \"display: inline-block; vertical-align: baseline;width: \" +\r\n this.options.baselineMarkerSize + \"px; height: \" + this.options.baselineMarkerSize + \"px;overflow: hidden;\";\r\n\r\n return marker;\r\n }\r\n });\r\n\r\n TextMetrics.current = new TextMetrics();\r\n\r\n function measureText(text, style, measureBox) {\r\n return TextMetrics.current.measure(text, style, measureBox);\r\n }\r\n\r\n kendo.deepExtend(kendo.util, {\r\n LRUCache: LRUCache,\r\n TextMetrics: TextMetrics,\r\n measureText: measureText,\r\n objectKey: objectKey,\r\n hashKey: hashKey,\r\n normalizeText: normalizeText\r\n });\r\n\r\n })(window.kendo.jQuery);\r\n\r\n /***********************************************************************\r\n * WARNING: this file is auto-generated. If you change it directly,\r\n * your modifications will eventually be lost. The source code is in\r\n * `kendo-drawing` repository, you should make your changes there and\r\n * run `src-modules/sync.sh` in this repository.\r\n */\r\n\r\n (function($) {\r\n /* eslint-disable space-before-blocks, space-before-function-paren */\r\n\r\n window.kendo = window.kendo || {};\r\n var kendoDrawing = kendo.drawing;\r\n var kendoDrawingUtil = kendoDrawing.util;\r\n var extendStatic = kendoDrawingUtil.extendStatic;\r\n var Class = kendo.Class;\r\n var kendoUtil = kendo.util;\r\n var support = kendo.support;\r\n var supportBrowser = support.browser;\r\n var htmlEncode = kendo.htmlEncode;\r\n\r\n var createPromise = kendoDrawingUtil.createPromise;\r\n var promiseAll = kendoDrawingUtil.promiseAll;\r\n\r\n var HasObservers = (function (Class$$1) {\r\n function HasObservers () {\r\n Class$$1.apply(this, arguments);\r\n }\r\n\r\n extendStatic(HasObservers, Class$$1);\r\n HasObservers.prototype = Object.create( Class$$1 && Class$$1.prototype );\r\n HasObservers.prototype.constructor = HasObservers;\r\n HasObservers.fn = HasObservers.prototype;\r\n HasObservers.fn.init = HasObservers.fn.constructor;\r\n\r\n HasObservers.prototype.observers = function observers () {\r\n this._observers = this._observers || [];\r\n return this._observers;\r\n };\r\n\r\n HasObservers.prototype.addObserver = function addObserver (element) {\r\n if (!this._observers) {\r\n this._observers = [ element ];\r\n } else {\r\n this._observers.push(element);\r\n }\r\n return this;\r\n };\r\n\r\n HasObservers.prototype.removeObserver = function removeObserver (element) {\r\n var observers = this.observers();\r\n var index = observers.indexOf(element);\r\n if (index !== -1) {\r\n observers.splice(index, 1);\r\n }\r\n return this;\r\n };\r\n\r\n HasObservers.prototype.trigger = function trigger (methodName, event) {\r\n var observers = this._observers;\r\n\r\n if (observers && !this._suspended) {\r\n for (var idx = 0; idx < observers.length; idx++) {\r\n var observer = observers[idx];\r\n if (observer[methodName]) {\r\n observer[methodName](event);\r\n }\r\n }\r\n }\r\n return this;\r\n };\r\n\r\n HasObservers.prototype.optionsChange = function optionsChange (e) {\r\n if (e === void 0) { e = {}; }\r\n\r\n e.element = this;\r\n this.trigger(\"optionsChange\", e);\r\n };\r\n\r\n HasObservers.prototype.geometryChange = function geometryChange () {\r\n this.trigger(\"geometryChange\", {\r\n element: this\r\n });\r\n };\r\n\r\n HasObservers.prototype.suspend = function suspend () {\r\n this._suspended = (this._suspended || 0) + 1;\r\n return this;\r\n };\r\n\r\n HasObservers.prototype.resume = function resume () {\r\n this._suspended = Math.max((this._suspended || 0) - 1, 0);\r\n return this;\r\n };\r\n\r\n HasObservers.prototype._observerField = function _observerField (field, value) {\r\n if (this[field]) {\r\n this[field].removeObserver(this);\r\n }\r\n this[field] = value;\r\n value.addObserver(this);\r\n };\r\n\r\n return HasObservers;\r\n }(Class));\r\n\r\n function append$1$1(first, second) {\r\n first.push.apply(first, second);\r\n return first;\r\n }\r\n\r\n /* eslint-disable key-spacing,no-multi-spaces,no-param-reassign */\r\n\r\n var literals = {\r\n 1 : \"i\", 10 : \"x\", 100 : \"c\",\r\n 2 : \"ii\", 20 : \"xx\", 200 : \"cc\",\r\n 3 : \"iii\", 30 : \"xxx\", 300 : \"ccc\",\r\n 4 : \"iv\", 40 : \"xl\", 400 : \"cd\",\r\n 5 : \"v\", 50 : \"l\", 500 : \"d\",\r\n 6 : \"vi\", 60 : \"lx\", 600 : \"dc\",\r\n 7 : \"vii\", 70 : \"lxx\", 700 : \"dcc\",\r\n 8 : \"viii\", 80 : \"lxxx\", 800 : \"dccc\",\r\n 9 : \"ix\", 90 : \"xc\", 900 : \"cm\",\r\n 1000 : \"m\"\r\n };\r\n\r\n function arabicToRoman(n) {\r\n var values = [ 1000,\r\n 900 , 800, 700, 600, 500, 400, 300, 200, 100,\r\n 90 , 80 , 70 , 60 , 50 , 40 , 30 , 20 , 10 ,\r\n 9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 ];\r\n\r\n var roman = \"\";\r\n while (n > 0) {\r\n if (n < values[0]) {\r\n values.shift();\r\n } else {\r\n roman += literals[values[0]];\r\n n -= values[0];\r\n }\r\n }\r\n return roman;\r\n }\r\n\r\n var UNDEFINED = \"undefined\";\r\n\r\n function defined(value) {\r\n return typeof value !== UNDEFINED;\r\n }\r\n\r\n var defId = 1;\r\n\r\n function definitionId() {\r\n return \"kdef\" + defId++;\r\n }\r\n\r\n var DEG_TO_RAD = Math.PI / 180;\r\n var MAX_NUM = Number.MAX_VALUE;\r\n var MIN_NUM = -Number.MAX_VALUE;\r\n\r\n function deg(radians) {\r\n return radians / DEG_TO_RAD;\r\n }\r\n\r\n var fromCharCode = String.fromCharCode;\r\n\r\n // Encodes a string as UTF-8\r\n function encodeUTF8(input) {\r\n var output = \"\";\r\n\r\n for (var i = 0; i < input.length; i++) {\r\n var code = input.charCodeAt(i);\r\n\r\n if (0xD800 <= code && code <= 0xDBFF) {\r\n var hi = code;\r\n var low = input.charCodeAt(++i);\r\n\r\n if (!isNaN(low)) {\r\n // Combine high and low surrogate\r\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/charCodeAt\r\n code = (hi - 0xD800) * 0x400 +\r\n (low - 0xDC00) + 0x10000;\r\n }\r\n }\r\n\r\n if (code < 0x80) {\r\n // One byte\r\n output += fromCharCode(code);\r\n } else if (code < 0x800) {\r\n // Two bytes\r\n output += fromCharCode(0xC0 | (code >>> 6));\r\n output += fromCharCode(0x80 | (code & 0x3f));\r\n } else if (code < 0x10000) {\r\n // Three bytes\r\n output += fromCharCode(0xE0 | (code >>> 12));\r\n output += fromCharCode(0x80 | (code >>> 6 & 0x3f));\r\n output += fromCharCode(0x80 | (code & 0x3f));\r\n } else if (code < 0x10FFFF) {\r\n // Four bytes\r\n output += fromCharCode(0xF0 | (code >>> 18));\r\n output += fromCharCode(0x80 | (code >>> 12 & 0x3f));\r\n output += fromCharCode(0x80 | (code >>> 6 & 0x3f));\r\n output += fromCharCode(0x80 | (code & 0x3f));\r\n }\r\n }\r\n\r\n return output;\r\n }\r\n\r\n // Encodes a string as UTF-16 big-endian\r\n\r\n var KEY_STR = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\r\n\r\n function encodeBase64(input) {\r\n var output = \"\";\r\n var i = 0;\r\n\r\n var utfInput = encodeUTF8(input);\r\n\r\n while (i < utfInput.length) {\r\n var chr1 = utfInput.charCodeAt(i++);\r\n var chr2 = utfInput.charCodeAt(i++);\r\n var chr3 = utfInput.charCodeAt(i++);\r\n\r\n var enc1 = chr1 >> 2;\r\n var enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);\r\n var enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);\r\n var enc4 = chr3 & 63;\r\n\r\n if (isNaN(chr2)) {\r\n enc3 = enc4 = 64;\r\n } else if (isNaN(chr3)) {\r\n enc4 = 64;\r\n }\r\n\r\n output = output +\r\n KEY_STR.charAt(enc1) + KEY_STR.charAt(enc2) +\r\n KEY_STR.charAt(enc3) + KEY_STR.charAt(enc4);\r\n }\r\n\r\n return output;\r\n }\r\n\r\n function eventCoordinates(e) {\r\n if (defined((e.x || {}).location)) {\r\n return {\r\n x: e.x.location,\r\n y: e.y.location\r\n };\r\n }\r\n\r\n return {\r\n x: e.pageX || e.clientX || 0,\r\n y: e.pageY || e.clientY || 0\r\n };\r\n }\r\n\r\n function eventElement(e) {\r\n if (e === void 0) { e = {}; }\r\n\r\n return e.touch ? e.touch.initialTouch : e.target;\r\n }\r\n\r\n function isTransparent(color) {\r\n return color === \"\" || color === null || color === \"none\" || color === \"transparent\" || !defined(color);\r\n }\r\n\r\n function last(array) {\r\n if (array) {\r\n return array[array.length - 1];\r\n }\r\n }\r\n\r\n function limitValue(value, min, max) {\r\n return Math.max(Math.min(value, max), min);\r\n }\r\n\r\n /* eslint-disable no-multi-spaces, key-spacing, indent, camelcase, space-before-blocks, eqeqeq, brace-style */\r\n /* eslint-disable space-infix-ops, space-before-function-paren, array-bracket-spacing, object-curly-spacing */\r\n /* eslint-disable no-nested-ternary, max-params, default-case, no-else-return, no-empty */\r\n /* eslint-disable no-param-reassign, no-var, block-scoped-var */\r\n\r\n // mergeSort is stable.\r\n function mergeSort(a, cmp) {\r\n if (a.length < 2) {\r\n return a.slice();\r\n }\r\n function merge(a, b) {\r\n var r = [], ai = 0, bi = 0, i = 0;\r\n while (ai < a.length && bi < b.length) {\r\n if (cmp(a[ai], b[bi]) <= 0) {\r\n r[i++] = a[ai++];\r\n } else {\r\n r[i++] = b[bi++];\r\n }\r\n }\r\n if (ai < a.length) {\r\n r.push.apply(r, a.slice(ai));\r\n }\r\n if (bi < b.length) {\r\n r.push.apply(r, b.slice(bi));\r\n }\r\n return r;\r\n }\r\n return (function sort(a) {\r\n if (a.length <= 1) {\r\n return a;\r\n }\r\n var m = Math.floor(a.length / 2);\r\n var left = a.slice(0, m);\r\n var right = a.slice(m);\r\n left = sort(left);\r\n right = sort(right);\r\n return merge(left, right);\r\n })(a);\r\n }\r\n\r\n var now = Date.now || function() {\r\n return new Date().getTime();\r\n };\r\n\r\n function rad(degrees) {\r\n return degrees * DEG_TO_RAD;\r\n }\r\n\r\n function pow(p) {\r\n if (p) {\r\n return Math.pow(10, p);\r\n }\r\n\r\n return 1;\r\n }\r\n\r\n function round(value, precision) {\r\n var power = pow(precision);\r\n return Math.round(value * power) / power;\r\n }\r\n\r\n function valueOrDefault(value, defaultValue) {\r\n return defined(value) ? value : defaultValue;\r\n }\r\n\r\n function bindEvents(element, events) {\r\n for (var eventName in events) {\r\n var eventNames = eventName.trim().split(\" \");\r\n for (var idx = 0; idx < eventNames.length; idx++) {\r\n element.addEventListener(eventNames[idx], events[eventName], false);\r\n }\r\n }\r\n }\r\n\r\n function elementOffset(element) {\r\n var box = element.getBoundingClientRect();\r\n\r\n var documentElement = document.documentElement;\r\n\r\n return {\r\n top: box.top + (window.pageYOffset || documentElement.scrollTop) - (documentElement.clientTop || 0),\r\n left: box.left + (window.pageXOffset || documentElement.scrollLeft) - (documentElement.clientLeft || 0)\r\n };\r\n }\r\n\r\n function elementStyles(element, styles) {\r\n var result = {};\r\n var style = window.getComputedStyle(element) || {};\r\n var stylesArray = Array.isArray(styles) ? styles : [ styles ];\r\n\r\n for (var idx = 0; idx < stylesArray.length; idx++) {\r\n var field = stylesArray[idx];\r\n result[field] = style[field];\r\n }\r\n\r\n return result;\r\n }\r\n\r\n function getPixels(value) {\r\n if (isNaN(value)) {\r\n return value;\r\n }\r\n return value + \"px\";\r\n }\r\n\r\n function elementSize(element, size) {\r\n if (size) {\r\n var width = size.width;\r\n var height = size.height;\r\n\r\n if (defined(width)) {\r\n element.style.width = getPixels(width);\r\n }\r\n\r\n if (defined(height)) {\r\n element.style.height = getPixels(height);\r\n }\r\n\r\n } else {\r\n var size$1 = elementStyles(element, [ 'width', 'height' ]);\r\n\r\n return {\r\n width: parseInt(size$1.width, 10),\r\n height: parseInt(size$1.height, 10)\r\n };\r\n }\r\n }\r\n\r\n function unbindEvents(element, events) {\r\n if (events === void 0) { events = {}; }\r\n\r\n for (var name in events) {\r\n var eventNames = name.trim().split(\" \");\r\n for (var idx = 0; idx < eventNames.length; idx++) {\r\n element.removeEventListener(eventNames[idx], events[name], false);\r\n }\r\n }\r\n }\r\n\r\n function elementPadding(element) {\r\n var ref = elementStyles(element, [ \"paddingLeft\", \"paddingTop\" ]);\r\n var paddingLeft = ref.paddingLeft;\r\n var paddingTop = ref.paddingTop;\r\n return {\r\n top: parseFloat(paddingTop),\r\n left: parseFloat(paddingLeft)\r\n };\r\n }\r\n\r\n var Matrix = (function (Class$$1) {\r\n function Matrix(a, b, c, d, e, f) {\r\n if (a === void 0) { a = 0; }\r\n if (b === void 0) { b = 0; }\r\n if (c === void 0) { c = 0; }\r\n if (d === void 0) { d = 0; }\r\n if (e === void 0) { e = 0; }\r\n if (f === void 0) { f = 0; }\r\n\r\n Class$$1.call(this);\r\n\r\n this.a = a;\r\n this.b = b;\r\n this.c = c;\r\n this.d = d;\r\n this.e = e;\r\n this.f = f;\r\n }\r\n\r\n extendStatic(Matrix, Class$$1);\r\n Matrix.prototype = Object.create( Class$$1 && Class$$1.prototype );\r\n Matrix.prototype.constructor = Matrix;\r\n Matrix.fn = Matrix.prototype;\r\n Matrix.fn.init = Matrix.fn.constructor;\r\n\r\n Matrix.prototype.multiplyCopy = function multiplyCopy (matrix) {\r\n return new Matrix(\r\n this.a * matrix.a + this.c * matrix.b,\r\n this.b * matrix.a + this.d * matrix.b,\r\n this.a * matrix.c + this.c * matrix.d,\r\n this.b * matrix.c + this.d * matrix.d,\r\n this.a * matrix.e + this.c * matrix.f + this.e,\r\n this.b * matrix.e + this.d * matrix.f + this.f\r\n );\r\n };\r\n\r\n Matrix.prototype.invert = function invert () {\r\n var ref = this;\r\n var a = ref.a;\r\n var b = ref.b;\r\n var d = ref.c;\r\n var e = ref.d;\r\n var g = ref.e;\r\n var h = ref.f;\r\n var det = a * e - b * d;\r\n\r\n if (det === 0) {\r\n return null;\r\n }\r\n\r\n return new Matrix(e / det, -b / det, -d / det, a / det,\r\n (d * h - e * g) / det, (b * g - a * h) / det);\r\n };\r\n\r\n Matrix.prototype.clone = function clone () {\r\n return new Matrix(this.a, this.b, this.c, this.d, this.e, this.f);\r\n };\r\n\r\n Matrix.prototype.equals = function equals (other) {\r\n if (!other) {\r\n return false;\r\n }\r\n\r\n return this.a === other.a && this.b === other.b &&\r\n this.c === other.c && this.d === other.d &&\r\n this.e === other.e && this.f === other.f;\r\n };\r\n\r\n Matrix.prototype.round = function round$1 (precision) {\r\n this.a = round(this.a, precision);\r\n this.b = round(this.b, precision);\r\n this.c = round(this.c, precision);\r\n this.d = round(this.d, precision);\r\n this.e = round(this.e, precision);\r\n this.f = round(this.f, precision);\r\n\r\n return this;\r\n };\r\n\r\n Matrix.prototype.toArray = function toArray (precision) {\r\n var result = [ this.a, this.b, this.c, this.d, this.e, this.f ];\r\n\r\n if (defined(precision)) {\r\n for (var i = 0; i < result.length; i++) {\r\n result[i] = round(result[i], precision);\r\n }\r\n }\r\n\r\n return result;\r\n };\r\n\r\n Matrix.prototype.toString = function toString (precision, separator) {\r\n if (separator === void 0) { separator = \",\"; }\r\n\r\n return this.toArray(precision).join(separator);\r\n };\r\n\r\n Matrix.translate = function translate (x, y) {\r\n return new Matrix(1, 0, 0, 1, x, y);\r\n };\r\n\r\n Matrix.unit = function unit () {\r\n return new Matrix(1, 0, 0, 1, 0, 0);\r\n };\r\n\r\n Matrix.rotate = function rotate (angle, x, y) {\r\n var matrix = new Matrix();\r\n matrix.a = Math.cos(rad(angle));\r\n matrix.b = Math.sin(rad(angle));\r\n matrix.c = -matrix.b;\r\n matrix.d = matrix.a;\r\n matrix.e = (x - x * matrix.a + y * matrix.b) || 0;\r\n matrix.f = (y - y * matrix.a - x * matrix.b) || 0;\r\n\r\n return matrix;\r\n };\r\n\r\n Matrix.scale = function scale (scaleX, scaleY) {\r\n return new Matrix(scaleX, 0, 0, scaleY, 0, 0);\r\n };\r\n\r\n return Matrix;\r\n }(Class));\r\n\r\n Matrix.IDENTITY = Matrix.unit();\r\n\r\n var matrixRegexp = /matrix\\((.*)\\)/;\r\n\r\n function parseMatrix(matrixString) {\r\n var match = matrixString.match(matrixRegexp);\r\n if (match === null || match.length !== 2) {\r\n return Matrix.unit();\r\n }\r\n\r\n var members = match[1].split(',').map(function (x) { return parseFloat(x); });\r\n return new (Function.prototype.bind.apply( Matrix, [ null ].concat( members) ));\r\n }\r\n\r\n function transformMatrix(element) {\r\n var transform = getComputedStyle(element).transform;\r\n\r\n if (transform === 'none') {\r\n return Matrix.unit();\r\n }\r\n\r\n return parseMatrix(transform);\r\n }\r\n\r\n function elementScale(element) {\r\n if (!element) {\r\n return Matrix.unit();\r\n }\r\n\r\n var matrix = transformMatrix(element);\r\n var parent = element.parentElement;\r\n while (parent) {\r\n var parentMatrix = transformMatrix(parent);\r\n matrix = matrix.multiplyCopy(parentMatrix);\r\n parent = parent.parentElement;\r\n }\r\n\r\n matrix.b = matrix.c = matrix.e = matrix.f = 0;\r\n return matrix;\r\n }\r\n\r\n var util = {\r\n \tappend: append$1$1,\r\n \tarabicToRoman: arabicToRoman,\r\n \tcreatePromise: createPromise,\r\n \tdefined: defined,\r\n \tdefinitionId: definitionId,\r\n \tdeg: deg,\r\n \tencodeBase64: encodeBase64,\r\n \teventCoordinates: eventCoordinates,\r\n \teventElement: eventElement,\r\n \tisTransparent: isTransparent,\r\n \tlast: last,\r\n \tlimitValue: limitValue,\r\n \tmergeSort: mergeSort,\r\n \tnow: now,\r\n \tpromiseAll: promiseAll,\r\n \trad: rad,\r\n \tround: round,\r\n \tvalueOrDefault: valueOrDefault,\r\n \tbindEvents: bindEvents,\r\n \telementOffset: elementOffset,\r\n \telementSize: elementSize,\r\n \telementStyles: elementStyles,\r\n \tunbindEvents: unbindEvents,\r\n \telementPadding: elementPadding,\r\n \telementScale: elementScale,\r\n \tDEG_TO_RAD: DEG_TO_RAD,\r\n \tMAX_NUM: MAX_NUM,\r\n \tMIN_NUM: MIN_NUM\r\n };\r\n\r\n var toString$1 = {}.toString;\r\n\r\n var OptionsStore = (function (HasObservers$$1) {\r\n function OptionsStore(options, prefix) {\r\n var this$1$1 = this;\r\n if (prefix === void 0) { prefix = \"\"; }\r\n\r\n HasObservers$$1.call(this);\r\n\r\n this.prefix = prefix;\r\n\r\n for (var field in options) {\r\n var member = options[field];\r\n member = this$1$1._wrap(member, field);\r\n this$1$1[field] = member;\r\n }\r\n }\r\n\r\n extendStatic(OptionsStore, HasObservers$$1);\r\n OptionsStore.prototype = Object.create( HasObservers$$1 && HasObservers$$1.prototype );\r\n OptionsStore.prototype.constructor = OptionsStore;\r\n OptionsStore.fn = OptionsStore.prototype;\r\n OptionsStore.fn.init = OptionsStore.fn.constructor;\r\n\r\n OptionsStore.prototype.get = function get (field) {\r\n var parts = field.split(\".\");\r\n var result = this;\r\n\r\n while (parts.length && result) {\r\n var part = parts.shift();\r\n result = result[part];\r\n }\r\n\r\n return result;\r\n };\r\n\r\n OptionsStore.prototype.set = function set (field, value) {\r\n var current = this.get(field);\r\n\r\n if (current !== value) {\r\n this._set(field, this._wrap(value, field));\r\n this.optionsChange({\r\n field: this.prefix + field,\r\n value: value\r\n });\r\n }\r\n };\r\n\r\n OptionsStore.prototype._set = function _set (field, value) {\r\n var this$1$1 = this;\r\n\r\n var composite = field.indexOf(\".\") >= 0;\r\n var parentObj = this;\r\n var fieldName = field;\r\n\r\n if (composite) {\r\n var parts = fieldName.split(\".\");\r\n var prefix = this.prefix;\r\n\r\n while (parts.length > 1) {\r\n fieldName = parts.shift();\r\n prefix += fieldName + \".\";\r\n\r\n var obj = parentObj[fieldName];\r\n\r\n if (!obj) {\r\n obj = new OptionsStore({}, prefix);\r\n obj.addObserver(this$1$1);\r\n parentObj[fieldName] = obj;\r\n }\r\n parentObj = obj;\r\n }\r\n fieldName = parts[0];\r\n }\r\n\r\n parentObj._clear(fieldName);\r\n parentObj[fieldName] = value;\r\n };\r\n\r\n OptionsStore.prototype._clear = function _clear (field) {\r\n var current = this[field];\r\n if (current && current.removeObserver) {\r\n current.removeObserver(this);\r\n }\r\n };\r\n\r\n OptionsStore.prototype._wrap = function _wrap (object, field) {\r\n var type = toString$1.call(object);\r\n var wrapped = object;\r\n\r\n if (wrapped !== null && defined(wrapped) && type === \"[object Object]\") {\r\n if (!(object instanceof OptionsStore) && !(object instanceof Class)) {\r\n wrapped = new OptionsStore(wrapped, this.prefix + field + \".\");\r\n }\r\n\r\n wrapped.addObserver(this);\r\n }\r\n\r\n return wrapped;\r\n };\r\n\r\n return OptionsStore;\r\n }(HasObservers));\r\n\r\n function setAccessor(field) {\r\n return function(value) {\r\n if (this[field] !== value) {\r\n this[field] = value;\r\n this.geometryChange();\r\n }\r\n\r\n return this;\r\n };\r\n }\r\n\r\n function getAccessor(field) {\r\n return function() {\r\n return this[field];\r\n };\r\n }\r\n\r\n function defineAccessors(fn, fields) {\r\n for (var i = 0; i < fields.length; i++) {\r\n var name = fields[i];\r\n var capitalized = name.charAt(0).toUpperCase() +\r\n name.substring(1, name.length);\r\n\r\n fn[\"set\" + capitalized] = setAccessor(name);\r\n fn[\"get\" + capitalized] = getAccessor(name);\r\n }\r\n }\r\n\r\n var withAccessors = function (TBase, names) {\r\n var result = (function (TBase) {\r\n function result () {\r\n TBase.apply(this, arguments);\r\n }extendStatic(result, TBase);\r\n result.prototype = Object.create( TBase && TBase.prototype );\r\n result.prototype.constructor = result;\r\n result.fn = result.prototype;\r\n result.fn.init = result.fn.constructor;\r\n\r\n return result;\r\n }(TBase));\r\n defineAccessors(result.prototype, names);\r\n\r\n return result;\r\n };\r\n\r\n function toMatrix(transformation) {\r\n if (transformation && typeof transformation.matrix === \"function\") {\r\n return transformation.matrix();\r\n }\r\n\r\n return transformation;\r\n }\r\n\r\n var Point = (function (superclass) {\r\n function Point(x, y) {\r\n superclass.call(this);\r\n\r\n this.x = x || 0;\r\n this.y = y || 0;\r\n }\r\n\r\n extendStatic(Point, superclass);\r\n Point.prototype = Object.create( superclass && superclass.prototype );\r\n Point.prototype.constructor = Point;\r\n Point.fn = Point.prototype;\r\n Point.fn.init = Point.fn.constructor;\r\n\r\n var staticAccessors = { ZERO: {} };\r\n\r\n Point.prototype.equals = function equals (other) {\r\n return other && other.x === this.x && other.y === this.y;\r\n };\r\n\r\n Point.prototype.clone = function clone () {\r\n return new Point(this.x, this.y);\r\n };\r\n\r\n Point.prototype.rotate = function rotate (angle, origin) {\r\n var originPoint = Point.create(origin) || Point.ZERO;\r\n\r\n return this.transform(Matrix.rotate(angle, originPoint.x, originPoint.y));\r\n };\r\n\r\n Point.prototype.translate = function translate (x, y) {\r\n this.x += x;\r\n this.y += y;\r\n\r\n this.geometryChange();\r\n\r\n return this;\r\n };\r\n\r\n Point.prototype.translateWith = function translateWith (point) {\r\n return this.translate(point.x, point.y);\r\n };\r\n\r\n Point.prototype.move = function move (x, y) {\r\n this.x = this.y = 0;\r\n return this.translate(x, y);\r\n };\r\n\r\n Point.prototype.scale = function scale (scaleX, scaleY) {\r\n if (scaleY === void 0) { scaleY = scaleX; }\r\n\r\n this.x *= scaleX;\r\n this.y *= scaleY;\r\n\r\n this.geometryChange();\r\n\r\n return this;\r\n };\r\n\r\n Point.prototype.scaleCopy = function scaleCopy (scaleX, scaleY) {\r\n return this.clone().scale(scaleX, scaleY);\r\n };\r\n\r\n Point.prototype.transform = function transform (transformation) {\r\n var matrix = toMatrix(transformation);\r\n var ref = this;\r\n var x = ref.x;\r\n var y = ref.y;\r\n\r\n this.x = matrix.a * x + matrix.c * y + matrix.e;\r\n this.y = matrix.b * x + matrix.d * y + matrix.f;\r\n\r\n this.geometryChange();\r\n\r\n return this;\r\n };\r\n\r\n Point.prototype.transformCopy = function transformCopy (transformation) {\r\n var point = this.clone();\r\n\r\n if (transformation) {\r\n point.transform(transformation);\r\n }\r\n\r\n return point;\r\n };\r\n\r\n Point.prototype.distanceTo = function distanceTo (point) {\r\n var dx = this.x - point.x;\r\n var dy = this.y - point.y;\r\n\r\n return Math.sqrt(dx * dx + dy * dy);\r\n };\r\n\r\n Point.prototype.round = function round$1 (digits) {\r\n this.x = round(this.x, digits);\r\n this.y = round(this.y, digits);\r\n\r\n this.geometryChange();\r\n\r\n return this;\r\n };\r\n\r\n Point.prototype.toArray = function toArray (digits) {\r\n var doRound = defined(digits);\r\n var x = doRound ? round(this.x, digits) : this.x;\r\n var y = doRound ? round(this.y, digits) : this.y;\r\n\r\n return [ x, y ];\r\n };\r\n\r\n Point.prototype.toString = function toString (digits, separator) {\r\n if (separator === void 0) { separator = \" \"; }\r\n\r\n var ref = this;\r\n var x = ref.x;\r\n var y = ref.y;\r\n\r\n if (defined(digits)) {\r\n x = round(x, digits);\r\n y = round(y, digits);\r\n }\r\n\r\n return x + separator + y;\r\n };\r\n\r\n Point.create = function create (arg0, arg1) {\r\n if (defined(arg0)) {\r\n if (arg0 instanceof Point) {\r\n return arg0;\r\n } else if (arguments.length === 1 && arg0.length === 2) {\r\n return new Point(arg0[0], arg0[1]);\r\n }\r\n\r\n return new Point(arg0, arg1);\r\n }\r\n };\r\n\r\n Point.min = function min () {\r\n var arguments$1 = arguments;\r\n\r\n var minX = MAX_NUM;\r\n var minY = MAX_NUM;\r\n\r\n for (var i = 0; i < arguments.length; i++) {\r\n var point = arguments$1[i];\r\n minX = Math.min(point.x, minX);\r\n minY = Math.min(point.y, minY);\r\n }\r\n\r\n return new Point(minX, minY);\r\n };\r\n\r\n Point.max = function max () {\r\n var arguments$1 = arguments;\r\n\r\n var maxX = MIN_NUM;\r\n var maxY = MIN_NUM;\r\n\r\n for (var i = 0; i < arguments.length; i++) {\r\n var point = arguments$1[i];\r\n maxX = Math.max(point.x, maxX);\r\n maxY = Math.max(point.y, maxY);\r\n }\r\n\r\n return new Point(maxX, maxY);\r\n };\r\n\r\n Point.minPoint = function minPoint () {\r\n return new Point(MIN_NUM, MIN_NUM);\r\n };\r\n\r\n Point.maxPoint = function maxPoint () {\r\n return new Point(MAX_NUM, MAX_NUM);\r\n };\r\n\r\n staticAccessors.ZERO.get = function () {\r\n return new Point(0, 0);\r\n };\r\n\r\n Object.defineProperties( Point, staticAccessors );\r\n\r\n return Point;\r\n }(withAccessors(HasObservers, [ \"x\", \"y\" ])));\r\n\r\n var Size = (function (superclass) {\r\n function Size(width, height) {\r\n superclass.call(this);\r\n\r\n this.width = width || 0;\r\n this.height = height || 0;\r\n }\r\n\r\n extendStatic(Size, superclass);\r\n Size.prototype = Object.create( superclass && superclass.prototype );\r\n Size.prototype.constructor = Size;\r\n Size.fn = Size.prototype;\r\n Size.fn.init = Size.fn.constructor;\r\n\r\n var staticAccessors = { ZERO: {} };\r\n\r\n Size.prototype.equals = function equals (other) {\r\n return other && other.width === this.width && other.height === this.height;\r\n };\r\n\r\n Size.prototype.clone = function clone () {\r\n return new Size(this.width, this.height);\r\n };\r\n\r\n Size.prototype.toArray = function toArray (digits) {\r\n var doRound = defined(digits);\r\n var width = doRound ? round(this.width, digits) : this.width;\r\n var height = doRound ? round(this.height, digits) : this.height;\r\n\r\n return [ width, height ];\r\n };\r\n\r\n Size.create = function create (arg0, arg1) {\r\n if (defined(arg0)) {\r\n if (arg0 instanceof Size) {\r\n return arg0;\r\n } else if (arguments.length === 1 && arg0.length === 2) {\r\n return new Size(arg0[0], arg0[1]);\r\n }\r\n\r\n return new Size(arg0, arg1);\r\n }\r\n };\r\n\r\n staticAccessors.ZERO.get = function () {\r\n return new Size(0, 0);\r\n };\r\n\r\n Object.defineProperties( Size, staticAccessors );\r\n\r\n return Size;\r\n }(withAccessors(HasObservers, [ \"width\", \"height\" ])));\r\n\r\n var Rect = (function (HasObservers$$1) {\r\n function Rect(origin, size, cornerRadius) {\r\n if (origin === void 0) { origin = new Point(); }\r\n if (size === void 0) { size = new Size(); }\r\n if (cornerRadius === void 0) { cornerRadius = 0; }\r\n\r\n HasObservers$$1.call(this);\r\n\r\n this.setOrigin(origin);\r\n this.setSize(size);\r\n this.setCornerRadius(cornerRadius);\r\n }\r\n\r\n extendStatic(Rect, HasObservers$$1);\r\n Rect.prototype = Object.create( HasObservers$$1 && HasObservers$$1.prototype );\r\n Rect.prototype.constructor = Rect;\r\n Rect.fn = Rect.prototype;\r\n Rect.fn.init = Rect.fn.constructor;\r\n\r\n Rect.prototype.clone = function clone () {\r\n return new Rect(\r\n this.origin.clone(),\r\n this.size.clone()\r\n );\r\n };\r\n\r\n Rect.prototype.equals = function equals (other) {\r\n return other &&\r\n other.origin.equals(this.origin) &&\r\n other.size.equals(this.size);\r\n };\r\n\r\n Rect.prototype.setOrigin = function setOrigin (value) {\r\n this._observerField(\"origin\", Point.create(value));\r\n this.geometryChange();\r\n return this;\r\n };\r\n\r\n Rect.prototype.getOrigin = function getOrigin () {\r\n return this.origin;\r\n };\r\n\r\n Rect.prototype.setCornerRadius = function setCornerRadius (radius) {\r\n this.cornerRadius = Array.isArray(radius) ? radius : [ radius, radius ];\r\n\r\n this.geometryChange();\r\n return this;\r\n };\r\n\r\n Rect.prototype.getCornerRadius = function getCornerRadius () {\r\n return this.cornerRadius;\r\n };\r\n\r\n Rect.prototype.setSize = function setSize (value) {\r\n this._observerField(\"size\", Size.create(value));\r\n this.geometryChange();\r\n return this;\r\n };\r\n\r\n Rect.prototype.getSize = function getSize () {\r\n return this.size;\r\n };\r\n\r\n Rect.prototype.width = function width () {\r\n return this.size.width;\r\n };\r\n\r\n Rect.prototype.height = function height () {\r\n return this.size.height;\r\n };\r\n\r\n Rect.prototype.topLeft = function topLeft () {\r\n return this.origin.clone();\r\n };\r\n\r\n Rect.prototype.bottomRight = function bottomRight () {\r\n return this.origin.clone().translate(this.width(), this.height());\r\n };\r\n\r\n Rect.prototype.topRight = function topRight () {\r\n return this.origin.clone().translate(this.width(), 0);\r\n };\r\n\r\n Rect.prototype.bottomLeft = function bottomLeft () {\r\n return this.origin.clone().translate(0, this.height());\r\n };\r\n\r\n Rect.prototype.center = function center () {\r\n return this.origin.clone().translate(this.width() / 2, this.height() / 2);\r\n };\r\n\r\n Rect.prototype.bbox = function bbox (matrix) {\r\n var tl = this.topLeft().transformCopy(matrix);\r\n var tr = this.topRight().transformCopy(matrix);\r\n var br = this.bottomRight().transformCopy(matrix);\r\n var bl = this.bottomLeft().transformCopy(matrix);\r\n\r\n return Rect.fromPoints(tl, tr, br, bl);\r\n };\r\n\r\n Rect.prototype.transformCopy = function transformCopy (m) {\r\n return Rect.fromPoints(\r\n this.topLeft().transform(m),\r\n this.bottomRight().transform(m)\r\n );\r\n };\r\n\r\n Rect.prototype.expand = function expand (x, y) {\r\n if (y === void 0) { y = x; }\r\n\r\n this.size.width += 2 * x;\r\n this.size.height += 2 * y;\r\n\r\n this.origin.translate(-x, -y);\r\n\r\n return this;\r\n };\r\n\r\n Rect.prototype.expandCopy = function expandCopy (x, y) {\r\n return this.clone().expand(x, y);\r\n };\r\n\r\n Rect.prototype.containsPoint = function containsPoint (point) {\r\n var origin = this.origin;\r\n var bottomRight = this.bottomRight();\r\n return !(point.x < origin.x || point.y < origin.y || bottomRight.x < point.x || bottomRight.y < point.y);\r\n };\r\n\r\n Rect.prototype._isOnPath = function _isOnPath (point, width) {\r\n var rectOuter = this.expandCopy(width, width);\r\n var rectInner = this.expandCopy(-width, -width);\r\n\r\n return rectOuter.containsPoint(point) && !rectInner.containsPoint(point);\r\n };\r\n\r\n Rect.fromPoints = function fromPoints () {\r\n var topLeft = Point.min.apply(null, arguments);\r\n var bottomRight = Point.max.apply(null, arguments);\r\n var size = new Size(\r\n bottomRight.x - topLeft.x,\r\n bottomRight.y - topLeft.y\r\n );\r\n\r\n return new Rect(topLeft, size);\r\n };\r\n\r\n Rect.union = function union (a, b) {\r\n return Rect.fromPoints(\r\n Point.min(a.topLeft(), b.topLeft()),\r\n Point.max(a.bottomRight(), b.bottomRight())\r\n );\r\n };\r\n\r\n Rect.intersect = function intersect (a, b) {\r\n var rect1 = {\r\n left: a.topLeft().x,\r\n top: a.topLeft().y,\r\n right: a.bottomRight().x,\r\n bottom: a.bottomRight().y\r\n };\r\n\r\n var rect2 = {\r\n left: b.topLeft().x,\r\n top: b.topLeft().y,\r\n right: b.bottomRight().x,\r\n bottom: b.bottomRight().y\r\n };\r\n\r\n if (rect1.left <= rect2.right &&\r\n rect2.left <= rect1.right &&\r\n rect1.top <= rect2.bottom &&\r\n rect2.top <= rect1.bottom) {\r\n return Rect.fromPoints(\r\n new Point(Math.max(rect1.left, rect2.left), Math.max(rect1.top, rect2.top)),\r\n new Point(Math.min(rect1.right, rect2.right), Math.min(rect1.bottom, rect2.bottom))\r\n );\r\n }\r\n };\r\n\r\n return Rect;\r\n }(HasObservers));\r\n\r\n var Transformation = (function (HasObservers$$1) {\r\n function Transformation(matrix) {\r\n if (matrix === void 0) { matrix = Matrix.unit(); }\r\n\r\n HasObservers$$1.call(this);\r\n\r\n this._matrix = matrix;\r\n }\r\n\r\n extendStatic(Transformation, HasObservers$$1);\r\n Transformation.prototype = Object.create( HasObservers$$1 && HasObservers$$1.prototype );\r\n Transformation.prototype.constructor = Transformation;\r\n Transformation.fn = Transformation.prototype;\r\n Transformation.fn.init = Transformation.fn.constructor;\r\n\r\n Transformation.prototype.clone = function clone () {\r\n return new Transformation(\r\n this._matrix.clone()\r\n );\r\n };\r\n\r\n Transformation.prototype.equals = function equals (other) {\r\n return other &&\r\n other._matrix.equals(this._matrix);\r\n };\r\n\r\n Transformation.prototype.translate = function translate (x, y) {\r\n this._matrix = this._matrix.multiplyCopy(Matrix.translate(x, y));\r\n\r\n this._optionsChange();\r\n return this;\r\n };\r\n\r\n Transformation.prototype.scale = function scale (scaleX, scaleY, origin) {\r\n if (scaleY === void 0) { scaleY = scaleX; }\r\n if (origin === void 0) { origin = null; }\r\n\r\n var originPoint = origin;\r\n\r\n if (originPoint) {\r\n originPoint = Point.create(originPoint);\r\n this._matrix = this._matrix.multiplyCopy(Matrix.translate(originPoint.x, originPoint.y));\r\n }\r\n\r\n this._matrix = this._matrix.multiplyCopy(Matrix.scale(scaleX, scaleY));\r\n\r\n if (originPoint) {\r\n this._matrix = this._matrix.multiplyCopy(Matrix.translate(-originPoint.x, -originPoint.y));\r\n }\r\n\r\n this._optionsChange();\r\n return this;\r\n };\r\n\r\n Transformation.prototype.rotate = function rotate (angle, origin) {\r\n var originPoint = Point.create(origin) || Point.ZERO;\r\n\r\n this._matrix = this._matrix.multiplyCopy(Matrix.rotate(angle, originPoint.x, originPoint.y));\r\n\r\n this._optionsChange();\r\n return this;\r\n };\r\n\r\n Transformation.prototype.multiply = function multiply (transformation) {\r\n var matrix = toMatrix(transformation);\r\n\r\n this._matrix = this._matrix.multiplyCopy(matrix);\r\n\r\n this._optionsChange();\r\n return this;\r\n };\r\n\r\n Transformation.prototype.matrix = function matrix (value) {\r\n if (value) {\r\n this._matrix = value;\r\n this._optionsChange();\r\n return this;\r\n }\r\n\r\n return this._matrix;\r\n };\r\n\r\n Transformation.prototype._optionsChange = function _optionsChange () {\r\n this.optionsChange({\r\n field: \"transform\",\r\n value: this\r\n });\r\n };\r\n\r\n return Transformation;\r\n }(HasObservers));\r\n\r\n function transform$1(matrix) {\r\n if (matrix === null) {\r\n return null;\r\n }\r\n\r\n if (matrix instanceof Transformation) {\r\n return matrix;\r\n }\r\n\r\n return new Transformation(matrix);\r\n }\r\n\r\n var Element$1 = (function (HasObservers$$1) {\r\n function Element(options) {\r\n HasObservers$$1.call(this);\r\n\r\n this._initOptions(options);\r\n }\r\n\r\n extendStatic(Element, HasObservers$$1);\r\n Element.prototype = Object.create( HasObservers$$1 && HasObservers$$1.prototype );\r\n Element.prototype.constructor = Element;\r\n Element.fn = Element.prototype;\r\n Element.fn.init = Element.fn.constructor;\r\n\r\n var prototypeAccessors = { nodeType: {} };\r\n\r\n prototypeAccessors.nodeType.get = function () {\r\n return \"Rect\";\r\n };\r\n\r\n Element.prototype._initOptions = function _initOptions (options) {\r\n if (options === void 0) { options = {}; }\r\n\r\n var clip = options.clip;\r\n var transform = options.transform;\r\n\r\n if (transform) {\r\n options.transform = transform$1(transform);\r\n }\r\n\r\n if (clip && !clip.id) {\r\n clip.id = definitionId();\r\n }\r\n\r\n this.options = new OptionsStore(options);\r\n this.options.addObserver(this);\r\n };\r\n\r\n Element.prototype.transform = function transform (value) {\r\n if (defined(value)) {\r\n this.options.set(\"transform\", transform$1(value));\r\n } else {\r\n return this.options.get(\"transform\");\r\n }\r\n };\r\n\r\n Element.prototype.parentTransform = function parentTransform () {\r\n var element = this;\r\n var parentMatrix;\r\n\r\n while (element.parent) {\r\n element = element.parent;\r\n var transformation = element.transform();\r\n if (transformation) {\r\n parentMatrix = transformation.matrix().multiplyCopy(parentMatrix || Matrix.unit());\r\n }\r\n }\r\n\r\n if (parentMatrix) {\r\n return transform$1(parentMatrix);\r\n }\r\n };\r\n\r\n Element.prototype.currentTransform = function currentTransform (parentTransform) {\r\n if (parentTransform === void 0) { parentTransform = this.parentTransform(); }\r\n\r\n var elementTransform = this.transform();\r\n var elementMatrix = toMatrix(elementTransform);\r\n\r\n var parentMatrix = toMatrix(parentTransform);\r\n var combinedMatrix;\r\n\r\n if (elementMatrix && parentMatrix) {\r\n combinedMatrix = parentMatrix.multiplyCopy(elementMatrix);\r\n } else {\r\n combinedMatrix = elementMatrix || parentMatrix;\r\n }\r\n\r\n if (combinedMatrix) {\r\n return transform$1(combinedMatrix);\r\n }\r\n };\r\n\r\n Element.prototype.visible = function visible (value) {\r\n if (defined(value)) {\r\n this.options.set(\"visible\", value);\r\n return this;\r\n }\r\n\r\n return this.options.get(\"visible\") !== false;\r\n };\r\n\r\n Element.prototype.clip = function clip (value) {\r\n var options = this.options;\r\n if (defined(value)) {\r\n if (value && !value.id) {\r\n value.id = definitionId();\r\n }\r\n options.set(\"clip\", value);\r\n return this;\r\n }\r\n\r\n return options.get(\"clip\");\r\n };\r\n\r\n Element.prototype.opacity = function opacity (value) {\r\n if (defined(value)) {\r\n this.options.set(\"opacity\", value);\r\n return this;\r\n }\r\n\r\n return valueOrDefault(this.options.get(\"opacity\"), 1);\r\n };\r\n\r\n Element.prototype.className = function className (value) {\r\n if (defined(value)) {\r\n this.options.set(\"className\", value);\r\n return this;\r\n }\r\n\r\n return this.options.get(\"className\");\r\n };\r\n\r\n Element.prototype.clippedBBox = function clippedBBox (transformation) {\r\n var bbox = this._clippedBBox(transformation);\r\n if (bbox) {\r\n var clip = this.clip();\r\n return clip ? Rect.intersect(bbox, clip.bbox(transformation)) : bbox;\r\n }\r\n };\r\n\r\n Element.prototype.containsPoint = function containsPoint (point, parentTransform) {\r\n if (this.visible()) {\r\n var transform = this.currentTransform(parentTransform);\r\n var transformedPoint = point;\r\n if (transform) {\r\n transformedPoint = point.transformCopy(transform.matrix().invert());\r\n }\r\n return (this._hasFill() && this._containsPoint(transformedPoint)) || (this._isOnPath && this._hasStroke() && this._isOnPath(transformedPoint));\r\n }\r\n return false;\r\n };\r\n\r\n Element.prototype._hasFill = function _hasFill () {\r\n var fill = this.options.fill;\r\n return fill && !isTransparent(fill.color);\r\n };\r\n\r\n Element.prototype._hasStroke = function _hasStroke () {\r\n var stroke = this.options.stroke;\r\n return stroke && stroke.width > 0 && !isTransparent(stroke.color);\r\n };\r\n\r\n Element.prototype._clippedBBox = function _clippedBBox (transformation) {\r\n return this.bbox(transformation);\r\n };\r\n\r\n Object.defineProperties( Element.prototype, prototypeAccessors );\r\n\r\n return Element;\r\n }(HasObservers));\r\n\r\n function ellipseExtremeAngles(center, rx, ry, matrix) {\r\n var extremeX = 0;\r\n var extremeY = 0;\r\n\r\n if (matrix) {\r\n extremeX = Math.atan2(matrix.c * ry, matrix.a * rx);\r\n if (matrix.b !== 0) {\r\n extremeY = Math.atan2(matrix.d * ry, matrix.b * rx);\r\n }\r\n }\r\n\r\n return {\r\n x: extremeX,\r\n y: extremeY\r\n };\r\n }\r\n\r\n var PI_DIV_2 = Math.PI / 2;\r\n\r\n var Circle$2 = (function (superclass) {\r\n function Circle(center, radius) {\r\n if (center === void 0) { center = new Point(); }\r\n if (radius === void 0) { radius = 0; }\r\n\r\n superclass.call(this);\r\n\r\n this.setCenter(center);\r\n this.setRadius(radius);\r\n }\r\n\r\n extendStatic(Circle, superclass);\r\n Circle.prototype = Object.create( superclass && superclass.prototype );\r\n Circle.prototype.constructor = Circle;\r\n Circle.fn = Circle.prototype;\r\n Circle.fn.init = Circle.fn.constructor;\r\n\r\n Circle.prototype.setCenter = function setCenter (value) {\r\n this._observerField(\"center\", Point.create(value));\r\n this.geometryChange();\r\n return this;\r\n };\r\n\r\n Circle.prototype.getCenter = function getCenter () {\r\n return this.center;\r\n };\r\n\r\n Circle.prototype.equals = function equals (other) {\r\n return other &&\r\n other.center.equals(this.center) &&\r\n other.radius === this.radius;\r\n };\r\n\r\n Circle.prototype.clone = function clone () {\r\n return new Circle(this.center.clone(), this.radius);\r\n };\r\n\r\n Circle.prototype.pointAt = function pointAt (angle) {\r\n return this._pointAt(rad(angle));\r\n };\r\n\r\n Circle.prototype.bbox = function bbox (matrix) {\r\n var this$1$1 = this;\r\n\r\n var extremeAngles = ellipseExtremeAngles(this.center, this.radius, this.radius, matrix);\r\n var minPoint = Point.maxPoint();\r\n var maxPoint = Point.minPoint();\r\n\r\n for (var i = 0; i < 4; i++) {\r\n var currentPointX = this$1$1._pointAt(extremeAngles.x + i * PI_DIV_2).transformCopy(matrix);\r\n var currentPointY = this$1$1._pointAt(extremeAngles.y + i * PI_DIV_2).transformCopy(matrix);\r\n var currentPoint = new Point(currentPointX.x, currentPointY.y);\r\n\r\n minPoint = Point.min(minPoint, currentPoint);\r\n maxPoint = Point.max(maxPoint, currentPoint);\r\n }\r\n\r\n return Rect.fromPoints(minPoint, maxPoint);\r\n };\r\n\r\n Circle.prototype._pointAt = function _pointAt (angle) {\r\n var ref = this;\r\n var center = ref.center;\r\n var radius = ref.radius;\r\n\r\n return new Point(\r\n center.x + radius * Math.cos(angle),\r\n center.y + radius * Math.sin(angle)\r\n );\r\n };\r\n\r\n Circle.prototype.containsPoint = function containsPoint (point) {\r\n var ref = this;\r\n var center = ref.center;\r\n var radius = ref.radius;\r\n var inCircle = Math.pow(point.x - center.x, 2) +\r\n Math.pow(point.y - center.y, 2) <= Math.pow(radius, 2);\r\n return inCircle;\r\n };\r\n\r\n Circle.prototype._isOnPath = function _isOnPath (point, width) {\r\n var ref = this;\r\n var center = ref.center;\r\n var radius = ref.radius;\r\n var pointDistance = center.distanceTo(point);\r\n\r\n return radius - width <= pointDistance && pointDistance <= radius + width;\r\n };\r\n\r\n return Circle;\r\n }(withAccessors(HasObservers, [ \"radius\" ])));\r\n\r\n var GRADIENT = \"Gradient\";\r\n\r\n var paintable = function (TBase) { return (\r\n (function (TBase) {\r\n function anonymous () {\r\n TBase.apply(this, arguments);\r\n }\r\n\r\n extendStatic(anonymous, TBase);\r\n anonymous.prototype = Object.create( TBase && TBase.prototype );\r\n anonymous.prototype.constructor = anonymous;\r\n anonymous.fn = anonymous.prototype;\r\n anonymous.fn.init = anonymous.fn.constructor;\r\n\r\n anonymous.prototype.fill = function fill (color, opacity) {\r\n var options = this.options;\r\n\r\n if (defined(color)) {\r\n if (color && color.nodeType !== GRADIENT) {\r\n var newFill = {\r\n color: color\r\n };\r\n if (defined(opacity)) {\r\n newFill.opacity = opacity;\r\n }\r\n options.set(\"fill\", newFill);\r\n } else {\r\n options.set(\"fill\", color);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n return options.get(\"fill\");\r\n };\r\n\r\n anonymous.prototype.stroke = function stroke (color, width, opacity) {\r\n if (defined(color)) {\r\n this.options.set(\"stroke.color\", color);\r\n\r\n if (defined(width)) {\r\n this.options.set(\"stroke.width\", width);\r\n }\r\n\r\n if (defined(opacity)) {\r\n this.options.set(\"stroke.opacity\", opacity);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n return this.options.get(\"stroke\");\r\n };\r\n\r\n return anonymous;\r\n }(TBase))\r\n ); };\r\n\r\n var IDENTITY_MATRIX_HASH = Matrix.IDENTITY.toString();\r\n\r\n var measurable = function (TBase) { return (\r\n (function (TBase) {\r\n function anonymous () {\r\n TBase.apply(this, arguments);\r\n }\r\n\r\n extendStatic(anonymous, TBase);\r\n anonymous.prototype = Object.create( TBase && TBase.prototype );\r\n anonymous.prototype.constructor = anonymous;\r\n anonymous.fn = anonymous.prototype;\r\n anonymous.fn.init = anonymous.fn.constructor;\r\n\r\n anonymous.prototype.bbox = function bbox (transformation) {\r\n var combinedMatrix = toMatrix(this.currentTransform(transformation));\r\n var matrixHash = combinedMatrix ? combinedMatrix.toString() : IDENTITY_MATRIX_HASH;\r\n var bbox;\r\n\r\n if (this._bboxCache && this._matrixHash === matrixHash) {\r\n bbox = this._bboxCache.clone();\r\n } else {\r\n bbox = this._bbox(combinedMatrix);\r\n this._bboxCache = bbox ? bbox.clone() : null;\r\n this._matrixHash = matrixHash;\r\n }\r\n\r\n var strokeWidth = this.options.get(\"stroke.width\");\r\n if (strokeWidth && bbox) {\r\n bbox.expand(strokeWidth / 2);\r\n }\r\n\r\n return bbox;\r\n };\r\n\r\n anonymous.prototype.geometryChange = function geometryChange () {\r\n delete this._bboxCache;\r\n this.trigger(\"geometryChange\", {\r\n element: this\r\n });\r\n };\r\n\r\n return anonymous;\r\n }(TBase))\r\n ); };\r\n\r\n function geometryAccessor(name) {\r\n var fieldName = \"_\" + name;\r\n return function(value) {\r\n if (defined(value)) {\r\n this._observerField(fieldName, value);\r\n this.geometryChange();\r\n return this;\r\n }\r\n\r\n return this[fieldName];\r\n };\r\n }\r\n\r\n function defineGeometryAccessors(fn, names) {\r\n for (var i = 0; i < names.length; i++) {\r\n fn[names[i]] = geometryAccessor(names[i]);\r\n }\r\n }\r\n\r\n var withGeometry = function (TBase, names) {\r\n if (names === void 0) { names = [ \"geometry\" ]; }\r\n\r\n var result = (function (TBase) {\r\n function result () {\r\n TBase.apply(this, arguments);\r\n }extendStatic(result, TBase);\r\n result.prototype = Object.create( TBase && TBase.prototype );\r\n result.prototype.constructor = result;\r\n result.fn = result.prototype;\r\n result.fn.init = result.fn.constructor;\r\n\r\n return result;\r\n }(TBase));\r\n defineGeometryAccessors(result.prototype, names);\r\n\r\n return result;\r\n };\r\n\r\n var DEFAULT_STROKE = \"#000\";\r\n\r\n var Circle = (function (superclass) {\r\n function Circle(geometry, options) {\r\n if (geometry === void 0) { geometry = new Circle$2(); }\r\n if (options === void 0) { options = {}; }\r\n\r\n superclass.call(this, options);\r\n\r\n this.geometry(geometry);\r\n\r\n if (!defined(this.options.stroke)) {\r\n this.stroke(DEFAULT_STROKE);\r\n }\r\n }\r\n\r\n extendStatic(Circle, superclass);\r\n Circle.prototype = Object.create( superclass && superclass.prototype );\r\n Circle.prototype.constructor = Circle;\r\n Circle.fn = Circle.prototype;\r\n Circle.fn.init = Circle.fn.constructor;\r\n\r\n var prototypeAccessors = { nodeType: {} };\r\n\r\n prototypeAccessors.nodeType.get = function () {\r\n return \"Circle\";\r\n };\r\n\r\n Circle.prototype.rawBBox = function rawBBox () {\r\n return this._geometry.bbox();\r\n };\r\n\r\n Circle.prototype._bbox = function _bbox (matrix) {\r\n return this._geometry.bbox(matrix);\r\n };\r\n\r\n Circle.prototype._containsPoint = function _containsPoint (point) {\r\n return this.geometry().containsPoint(point);\r\n };\r\n\r\n Circle.prototype._isOnPath = function _isOnPath (point) {\r\n return this.geometry()._isOnPath(point, this.options.stroke.width / 2);\r\n };\r\n\r\n Object.defineProperties( Circle.prototype, prototypeAccessors );\r\n\r\n return Circle;\r\n }(paintable(measurable(withGeometry(Element$1)))));\r\n\r\n var PRECISION = 10;\r\n\r\n function close$1(a, b, tolerance) {\r\n if (tolerance === void 0) { tolerance = PRECISION; }\r\n\r\n return round(Math.abs(a - b), tolerance) === 0;\r\n }\r\n\r\n function closeOrLess(a, b, tolerance) {\r\n return a < b || close$1(a, b, tolerance);\r\n }\r\n\r\n function lineIntersection(p0, p1, p2, p3) {\r\n var s1x = p1.x - p0.x;\r\n var s2x = p3.x - p2.x;\r\n var s1y = p1.y - p0.y;\r\n var s2y = p3.y - p2.y;\r\n var nx = p0.x - p2.x;\r\n var ny = p0.y - p2.y;\r\n var d = s1x * s2y - s2x * s1y;\r\n var s = (s1x * ny - s1y * nx) / d;\r\n var t = (s2x * ny - s2y * nx) / d;\r\n\r\n if (s >= 0 && s <= 1 && t >= 0 && t <= 1) {\r\n return new Point(p0.x + t * s1x, p0.y + t * s1y);\r\n }\r\n }\r\n\r\n var MAX_INTERVAL = 45;\r\n var pow$1 = Math.pow;\r\n var accessors = [ \"radiusX\", \"radiusY\", \"startAngle\", \"endAngle\", \"anticlockwise\" ];\r\n\r\n var Arc$2 = (function (superclass) {\r\n function Arc(center, options) {\r\n if (center === void 0) { center = new Point(); }\r\n if (options === void 0) { options = {}; }\r\n\r\n superclass.call(this);\r\n\r\n this.setCenter(center);\r\n\r\n this.radiusX = options.radiusX;\r\n this.radiusY = options.radiusY || options.radiusX;\r\n this.startAngle = options.startAngle;\r\n this.endAngle = options.endAngle;\r\n this.anticlockwise = options.anticlockwise || false;\r\n this.xRotation = options.xRotation;\r\n }\r\n\r\n extendStatic(Arc, superclass);\r\n Arc.prototype = Object.create( superclass && superclass.prototype );\r\n Arc.prototype.constructor = Arc;\r\n Arc.fn = Arc.prototype;\r\n Arc.fn.init = Arc.fn.constructor;\r\n\r\n Arc.prototype.clone = function clone () {\r\n return new Arc(this.center, {\r\n radiusX: this.radiusX,\r\n radiusY: this.radiusY,\r\n startAngle: this.startAngle,\r\n endAngle: this.endAngle,\r\n anticlockwise: this.anticlockwise\r\n });\r\n };\r\n\r\n Arc.prototype.setCenter = function setCenter (value) {\r\n this._observerField(\"center\", Point.create(value));\r\n this.geometryChange();\r\n return this;\r\n };\r\n\r\n Arc.prototype.getCenter = function getCenter () {\r\n return this.center;\r\n };\r\n\r\n Arc.prototype.pointAt = function pointAt (angle) {\r\n var center = this.center;\r\n var radian = rad(angle);\r\n\r\n return new Point(\r\n center.x + this.radiusX * Math.cos(radian),\r\n center.y + this.radiusY * Math.sin(radian)\r\n );\r\n };\r\n\r\n Arc.prototype.curvePoints = function curvePoints () {\r\n var this$1$1 = this;\r\n\r\n var startAngle = this.startAngle;\r\n var dir = this.anticlockwise ? -1 : 1;\r\n var curvePoints = [ this.pointAt(startAngle) ];\r\n var interval = this._arcInterval();\r\n var intervalAngle = interval.endAngle - interval.startAngle;\r\n var subIntervalsCount = Math.ceil(intervalAngle / MAX_INTERVAL);\r\n var subIntervalAngle = intervalAngle / subIntervalsCount;\r\n var currentAngle = startAngle;\r\n var transformation;\r\n if (this.xRotation) {\r\n transformation = transform$1().rotate(this.xRotation, this.center);\r\n }\r\n\r\n for (var i = 1; i <= subIntervalsCount; i++) {\r\n var nextAngle = currentAngle + dir * subIntervalAngle;\r\n var points = this$1$1._intervalCurvePoints(currentAngle, nextAngle, transformation);\r\n\r\n curvePoints.push(points.cp1, points.cp2, points.p2);\r\n currentAngle = nextAngle;\r\n }\r\n\r\n return curvePoints;\r\n };\r\n\r\n Arc.prototype.bbox = function bbox (matrix) {\r\n var this$1$1 = this;\r\n\r\n var interval = this._arcInterval();\r\n var startAngle = interval.startAngle;\r\n var endAngle = interval.endAngle;\r\n var extremeAngles = ellipseExtremeAngles(this.center, this.radiusX, this.radiusY, matrix);\r\n var extremeX = deg(extremeAngles.x);\r\n var extremeY = deg(extremeAngles.y);\r\n var endPoint = this.pointAt(endAngle).transformCopy(matrix);\r\n var currentAngleX = bboxStartAngle(extremeX, startAngle);\r\n var currentAngleY = bboxStartAngle(extremeY, startAngle);\r\n var currentPoint = this.pointAt(startAngle).transformCopy(matrix);\r\n var minPoint = Point.min(currentPoint, endPoint);\r\n var maxPoint = Point.max(currentPoint, endPoint);\r\n\r\n while (currentAngleX < endAngle || currentAngleY < endAngle) {\r\n var currentPointX = (void 0);\r\n if (currentAngleX < endAngle) {\r\n currentPointX = this$1$1.pointAt(currentAngleX).transformCopy(matrix);\r\n currentAngleX += 90;\r\n }\r\n\r\n var currentPointY = (void 0);\r\n if (currentAngleY < endAngle) {\r\n currentPointY = this$1$1.pointAt(currentAngleY).transformCopy(matrix);\r\n currentAngleY += 90;\r\n }\r\n\r\n currentPoint = new Point(currentPointX.x, currentPointY.y);\r\n minPoint = Point.min(minPoint, currentPoint);\r\n maxPoint = Point.max(maxPoint, currentPoint);\r\n }\r\n\r\n return Rect.fromPoints(minPoint, maxPoint);\r\n };\r\n\r\n Arc.prototype._arcInterval = function _arcInterval () {\r\n var ref = this;\r\n var startAngle = ref.startAngle;\r\n var endAngle = ref.endAngle;\r\n var anticlockwise = ref.anticlockwise;\r\n\r\n if (anticlockwise) {\r\n var oldStart = startAngle;\r\n startAngle = endAngle;\r\n endAngle = oldStart;\r\n }\r\n\r\n if (startAngle > endAngle || (anticlockwise && startAngle === endAngle)) {\r\n endAngle += 360;\r\n }\r\n\r\n return {\r\n startAngle: startAngle,\r\n endAngle: endAngle\r\n };\r\n };\r\n\r\n Arc.prototype._intervalCurvePoints = function _intervalCurvePoints (startAngle, endAngle, transformation) {\r\n var p1 = this.pointAt(startAngle);\r\n var p2 = this.pointAt(endAngle);\r\n var p1Derivative = this._derivativeAt(startAngle);\r\n var p2Derivative = this._derivativeAt(endAngle);\r\n var t = (rad(endAngle) - rad(startAngle)) / 3;\r\n var cp1 = new Point(p1.x + t * p1Derivative.x, p1.y + t * p1Derivative.y);\r\n var cp2 = new Point(p2.x - t * p2Derivative.x, p2.y - t * p2Derivative.y);\r\n if (transformation) {\r\n p1.transform(transformation);\r\n p2.transform(transformation);\r\n cp1.transform(transformation);\r\n cp2.transform(transformation);\r\n }\r\n\r\n return {\r\n p1: p1,\r\n cp1: cp1,\r\n cp2: cp2,\r\n p2: p2\r\n };\r\n };\r\n\r\n Arc.prototype._derivativeAt = function _derivativeAt (angle) {\r\n var radian = rad(angle);\r\n\r\n return new Point(-this.radiusX * Math.sin(radian), this.radiusY * Math.cos(radian));\r\n };\r\n\r\n Arc.prototype.containsPoint = function containsPoint (point) {\r\n var interval = this._arcInterval();\r\n var intervalAngle = interval.endAngle - interval.startAngle;\r\n var ref = this;\r\n var center = ref.center;\r\n var radiusX = ref.radiusX;\r\n var radiusY = ref.radiusY;\r\n var distance = center.distanceTo(point);\r\n var angleRad = Math.atan2(point.y - center.y, point.x - center.x);\r\n var pointRadius = (radiusX * radiusY) /\r\n Math.sqrt(pow$1(radiusX, 2) * pow$1(Math.sin(angleRad), 2) + pow$1(radiusY, 2) * pow$1(Math.cos(angleRad), 2));\r\n var startPoint = this.pointAt(this.startAngle).round(PRECISION);\r\n var endPoint = this.pointAt(this.endAngle).round(PRECISION);\r\n var intersection = lineIntersection(center, point.round(PRECISION), startPoint, endPoint);\r\n var containsPoint;\r\n\r\n if (intervalAngle < 180) {\r\n containsPoint = intersection && closeOrLess(center.distanceTo(intersection), distance) && closeOrLess(distance, pointRadius);\r\n } else {\r\n var angle = calculateAngle(center.x, center.y, radiusX, radiusY, point.x, point.y);\r\n if (angle !== 360) {\r\n angle = (360 + angle) % 360;\r\n }\r\n\r\n var inAngleRange = interval.startAngle <= angle && angle <= interval.endAngle;\r\n containsPoint = (inAngleRange && closeOrLess(distance, pointRadius)) || (!inAngleRange && (!intersection || intersection.equals(point)));\r\n }\r\n return containsPoint;\r\n };\r\n\r\n Arc.prototype._isOnPath = function _isOnPath (point, width) {\r\n var interval = this._arcInterval();\r\n var center = this.center;\r\n var angle = calculateAngle(center.x, center.y, this.radiusX, this.radiusY, point.x, point.y);\r\n if (angle !== 360) {\r\n angle = (360 + angle) % 360;\r\n }\r\n\r\n var inAngleRange = interval.startAngle <= angle && angle <= interval.endAngle;\r\n\r\n return inAngleRange && this.pointAt(angle).distanceTo(point) <= width;\r\n };\r\n\r\n Arc.fromPoints = function fromPoints (start, end, rx, ry, largeArc, swipe, rotation) {// eslint-disable-line max-params\r\n var arcParameters = normalizeArcParameters({\r\n x1: start.x,\r\n y1: start.y,\r\n x2: end.x,\r\n y2: end.y,\r\n rx: rx,\r\n ry: ry,\r\n largeArc: largeArc,\r\n swipe: swipe,\r\n rotation: rotation\r\n });\r\n\r\n return new Arc(arcParameters.center, {\r\n startAngle: arcParameters.startAngle,\r\n endAngle: arcParameters.endAngle,\r\n radiusX: arcParameters.radiusX,\r\n radiusY: arcParameters.radiusY,\r\n xRotation: arcParameters.xRotation,\r\n anticlockwise: swipe === 0\r\n });\r\n };\r\n\r\n return Arc;\r\n }(withAccessors(HasObservers, accessors)));\r\n\r\n function calculateAngle(cx, cy, rx, ry, x, y) {\r\n var cos = round((x - cx) / rx, 3);\r\n var sin = round((y - cy) / ry, 3);\r\n\r\n return round(deg(Math.atan2(sin, cos)));\r\n }\r\n\r\n function normalizeArcParameters(parameters) {\r\n var x1 = parameters.x1;\r\n var y1 = parameters.y1;\r\n var x2 = parameters.x2;\r\n var y2 = parameters.y2;\r\n var rx = parameters.rx;\r\n var ry = parameters.ry;\r\n var largeArc = parameters.largeArc;\r\n var swipe = parameters.swipe;\r\n var rotation = parameters.rotation; if (rotation === void 0) { rotation = 0; }\r\n\r\n var radians = rad(rotation);\r\n var cosine = Math.cos(radians);\r\n var sine = Math.sin(radians);\r\n\r\n var xT = cosine * (x1 - x2) / 2 + sine * (y1 - y2) / 2;\r\n var yT = -sine * (x1 - x2) / 2 + cosine * (y1 - y2) / 2;\r\n\r\n var sign = largeArc !== swipe ? 1 : -1;\r\n\r\n var xt2 = Math.pow(xT, 2);\r\n var yt2 = Math.pow(yT, 2);\r\n var rx2 = Math.pow(rx, 2);\r\n var ry2 = Math.pow(ry, 2);\r\n\r\n var delta = xt2 / rx2 + yt2 / ry2;\r\n\r\n if (delta > 1) {\r\n delta = Math.sqrt(xt2 / rx2 + yt2 / ry2);\r\n rx = delta * rx;\r\n rx2 = Math.pow(rx, 2);\r\n\r\n ry = delta * ry;\r\n ry2 = Math.pow(ry, 2);\r\n }\r\n\r\n var constT = sign * Math.sqrt((rx2 * ry2 - rx2 * yt2 - ry2 * xt2) / (rx2 * yt2 + ry2 * xt2));\r\n // due to rounding errors the value could become NaN even after radii correction\r\n if (isNaN(constT)) {\r\n constT = 0;\r\n }\r\n\r\n var cxT = constT * (rx * yT) / ry;\r\n var cyT = - constT * (ry * xT) / rx;\r\n\r\n var cx = cosine * cxT - sine * cyT + (x1 + x2) / 2;\r\n var cy = sine * cxT + cosine * cyT + (y1 + y2) / 2;\r\n\r\n var uX = (xT - cxT) / rx;\r\n var uY = (yT - cyT) / ry;\r\n var vX = -(xT + cxT) / rx;\r\n var vY = -(yT + cyT) / ry;\r\n\r\n var startAngle = (uY >= 0 ? 1 : -1) * deg(Math.acos(uX / Math.sqrt(uX * uX + uY * uY)));\r\n\r\n var angleCosine = round((uX * vX + uY * vY) / (Math.sqrt(uX * uX + uY * uY) * Math.sqrt(vX * vX + vY * vY)), 10);\r\n var angle = (uX * vY - uY * vX >= 0 ? 1 : -1) * deg(Math.acos(angleCosine));\r\n\r\n if (!swipe && angle > 0) {\r\n angle -= 360;\r\n }\r\n\r\n if (swipe && angle < 0) {\r\n angle += 360;\r\n }\r\n var endAngle = startAngle + angle;\r\n var signEndAngle = endAngle >= 0 ? 1 : -1;\r\n endAngle = (Math.abs(endAngle) % 360) * signEndAngle;\r\n\r\n return {\r\n center: new Point(cx, cy),\r\n startAngle: startAngle,\r\n endAngle: endAngle,\r\n radiusX: rx,\r\n radiusY: ry,\r\n xRotation: rotation\r\n };\r\n }\r\n\r\n function bboxStartAngle(angle, start) {\r\n var startAngle = angle;\r\n\r\n while (startAngle < start) {\r\n startAngle += 90;\r\n }\r\n\r\n return startAngle;\r\n }\r\n\r\n var push = [].push;\r\n var pop = [].pop;\r\n var splice = [].splice;\r\n var shift = [].shift;\r\n var slice = [].slice;\r\n var unshift = [].unshift;\r\n\r\n var ElementsArray = (function (HasObservers$$1) {\r\n function ElementsArray(array) {\r\n if (array === void 0) { array = []; }\r\n\r\n HasObservers$$1.call(this);\r\n\r\n this.length = 0;\r\n this._splice(0, array.length, array);\r\n }\r\n\r\n extendStatic(ElementsArray, HasObservers$$1);\r\n ElementsArray.prototype = Object.create( HasObservers$$1 && HasObservers$$1.prototype );\r\n ElementsArray.prototype.constructor = ElementsArray;\r\n ElementsArray.fn = ElementsArray.prototype;\r\n ElementsArray.fn.init = ElementsArray.fn.constructor;\r\n\r\n ElementsArray.prototype.elements = function elements (value) {\r\n if (value) {\r\n this._splice(0, this.length, value);\r\n\r\n this._change();\r\n return this;\r\n }\r\n\r\n return this.slice(0);\r\n };\r\n\r\n ElementsArray.prototype.push = function push$1 () {\r\n var elements = arguments;\r\n var result = push.apply(this, elements);\r\n\r\n this._add(elements);\r\n\r\n return result;\r\n };\r\n\r\n ElementsArray.prototype.slice = function slice$1 () {\r\n return slice.call(this);\r\n };\r\n\r\n ElementsArray.prototype.pop = function pop$1 () {\r\n var length = this.length;\r\n var result = pop.apply(this);\r\n\r\n if (length) {\r\n this._remove([ result ]);\r\n }\r\n\r\n return result;\r\n };\r\n\r\n ElementsArray.prototype.splice = function splice$1 (index, howMany) {\r\n var elements = slice.call(arguments, 2);\r\n var result = this._splice(index, howMany, elements);\r\n\r\n this._change();\r\n\r\n return result;\r\n };\r\n\r\n ElementsArray.prototype.shift = function shift$1 () {\r\n var length = this.length;\r\n var result = shift.apply(this);\r\n\r\n if (length) {\r\n this._remove([ result ]);\r\n }\r\n\r\n return result;\r\n };\r\n\r\n ElementsArray.prototype.unshift = function unshift$1 () {\r\n var elements = arguments;\r\n var result = unshift.apply(this, elements);\r\n\r\n this._add(elements);\r\n\r\n return result;\r\n };\r\n\r\n ElementsArray.prototype.indexOf = function indexOf (element) {\r\n var this$1$1 = this;\r\n\r\n var length = this.length;\r\n\r\n for (var idx = 0; idx < length; idx++) {\r\n if (this$1$1[idx] === element) {\r\n return idx;\r\n }\r\n }\r\n return -1;\r\n };\r\n\r\n ElementsArray.prototype._splice = function _splice (index, howMany, elements) {\r\n var result = splice.apply(this, [ index, howMany ].concat(elements));\r\n\r\n this._clearObserver(result);\r\n this._setObserver(elements);\r\n\r\n return result;\r\n };\r\n\r\n ElementsArray.prototype._add = function _add (elements) {\r\n this._setObserver(elements);\r\n this._change();\r\n };\r\n\r\n ElementsArray.prototype._remove = function _remove (elements) {\r\n this._clearObserver(elements);\r\n this._change();\r\n };\r\n\r\n ElementsArray.prototype._setObserver = function _setObserver (elements) {\r\n var this$1$1 = this;\r\n\r\n for (var idx = 0; idx < elements.length; idx++) {\r\n elements[idx].addObserver(this$1$1);\r\n }\r\n };\r\n\r\n ElementsArray.prototype._clearObserver = function _clearObserver (elements) {\r\n var this$1$1 = this;\r\n\r\n for (var idx = 0; idx < elements.length; idx++) {\r\n elements[idx].removeObserver(this$1$1);\r\n }\r\n };\r\n\r\n ElementsArray.prototype._change = function _change () {};\r\n\r\n return ElementsArray;\r\n }(HasObservers));\r\n\r\n var GeometryElementsArray = (function (ElementsArray$$1) {\r\n function GeometryElementsArray () {\r\n ElementsArray$$1.apply(this, arguments);\r\n }\r\n\r\n extendStatic(GeometryElementsArray, ElementsArray$$1);\r\n GeometryElementsArray.prototype = Object.create( ElementsArray$$1 && ElementsArray$$1.prototype );\r\n GeometryElementsArray.prototype.constructor = GeometryElementsArray;\r\n GeometryElementsArray.fn = GeometryElementsArray.prototype;\r\n GeometryElementsArray.fn.init = GeometryElementsArray.fn.constructor;\r\n\r\n GeometryElementsArray.prototype._change = function _change () {\r\n this.geometryChange();\r\n };\r\n\r\n return GeometryElementsArray;\r\n }(ElementsArray));\r\n\r\n function isOutOfEndPoint(endPoint, controlPoint, point) {\r\n var angle = deg(Math.atan2(controlPoint.y - endPoint.y, controlPoint.x - endPoint.x));\r\n var rotatedPoint = point.transformCopy(transform$1().rotate(-angle, endPoint));\r\n\r\n return rotatedPoint.x < endPoint.x;\r\n }\r\n\r\n function calculateCurveAt(t, field, points) {\r\n var t1 = 1 - t;\r\n return Math.pow(t1, 3) * points[0][field] +\r\n 3 * Math.pow(t1, 2) * t * points[1][field] +\r\n 3 * Math.pow(t, 2) * t1 * points[2][field] +\r\n Math.pow(t, 3) * points[3][field];\r\n }\r\n\r\n function toCubicPolynomial(points, field) {\r\n return [ -points[0][field] + 3 * points[1][field] - 3 * points[2][field] + points[3][field],\r\n 3 * (points[0][field] - 2 * points[1][field] + points[2][field]),\r\n 3 * (-points[0][field] + points[1][field]),\r\n points[0][field]\r\n ];\r\n }\r\n\r\n var ComplexNumber = (function (Class$$1) {\r\n function ComplexNumber(real, img) {\r\n if (real === void 0) { real = 0; }\r\n if (img === void 0) { img = 0; }\r\n\r\n Class$$1.call(this);\r\n\r\n this.real = real;\r\n this.img = img;\r\n }\r\n\r\n extendStatic(ComplexNumber, Class$$1);\r\n ComplexNumber.prototype = Object.create( Class$$1 && Class$$1.prototype );\r\n ComplexNumber.prototype.constructor = ComplexNumber;\r\n ComplexNumber.fn = ComplexNumber.prototype;\r\n ComplexNumber.fn.init = ComplexNumber.fn.constructor;\r\n\r\n ComplexNumber.prototype.add = function add (cNumber) {\r\n return new ComplexNumber(round(this.real + cNumber.real, PRECISION), round(this.img + cNumber.img, PRECISION));\r\n };\r\n\r\n ComplexNumber.prototype.addConstant = function addConstant (value) {\r\n return new ComplexNumber(this.real + value, this.img);\r\n };\r\n\r\n ComplexNumber.prototype.negate = function negate () {\r\n return new ComplexNumber(-this.real, -this.img);\r\n };\r\n\r\n ComplexNumber.prototype.multiply = function multiply (cNumber) {\r\n return new ComplexNumber(this.real * cNumber.real - this.img * cNumber.img,\r\n this.real * cNumber.img + this.img * cNumber.real);\r\n };\r\n\r\n ComplexNumber.prototype.multiplyConstant = function multiplyConstant (value) {\r\n return new ComplexNumber(this.real * value, this.img * value);\r\n };\r\n\r\n ComplexNumber.prototype.nthRoot = function nthRoot (n) {\r\n var rad$$1 = Math.atan2(this.img, this.real);\r\n var r = Math.sqrt(Math.pow(this.img, 2) + Math.pow(this.real, 2));\r\n var nthR = Math.pow(r, 1 / n);\r\n\r\n return new ComplexNumber(nthR * Math.cos(rad$$1 / n), nthR * Math.sin(rad$$1 / n)); //Moivre's formula\r\n };\r\n\r\n ComplexNumber.prototype.equals = function equals (cNumber) {\r\n return this.real === cNumber.real && this.img === cNumber.img;\r\n };\r\n\r\n ComplexNumber.prototype.isReal = function isReal () {\r\n return this.img === 0;\r\n };\r\n\r\n return ComplexNumber;\r\n }(Class));\r\n\r\n function numberSign$1(x) {\r\n return x < 0 ? -1 : 1;\r\n }\r\n\r\n function solveQuadraticEquation(a, b, c) {\r\n var squareRoot = Math.sqrt(Math.pow(b, 2) - 4 * a * c);\r\n return [\r\n (-b + squareRoot) / (2 * a),\r\n (-b - squareRoot) / (2 * a)\r\n ];\r\n }\r\n\r\n //Cardano's formula\r\n function solveCubicEquation(a, b, c, d) {\r\n if (a === 0) {\r\n return solveQuadraticEquation(b, c, d);\r\n }\r\n\r\n var p = (3 * a * c - Math.pow(b, 2)) / (3 * Math.pow(a, 2));\r\n var q = (2 * Math.pow(b, 3) - 9 * a * b * c + 27 * Math.pow(a, 2) * d) / (27 * Math.pow(a, 3));\r\n var Q = Math.pow(p / 3, 3) + Math.pow(q / 2, 2);\r\n var i = new ComplexNumber(0,1);\r\n var b3a = -b / (3 * a);\r\n var x1, x2, y1, y2, y3, z1, z2;\r\n\r\n if (Q < 0) {\r\n x1 = new ComplexNumber(-q / 2, Math.sqrt(-Q)).nthRoot(3);\r\n x2 = new ComplexNumber(-q / 2, - Math.sqrt(-Q)).nthRoot(3);\r\n } else {\r\n x1 = -q / 2 + Math.sqrt(Q);\r\n x1 = new ComplexNumber(numberSign$1(x1) * Math.pow(Math.abs(x1), 1 / 3));\r\n x2 = -q / 2 - Math.sqrt(Q);\r\n x2 = new ComplexNumber(numberSign$1(x2) * Math.pow(Math.abs(x2), 1 / 3));\r\n }\r\n\r\n y1 = x1.add(x2);\r\n\r\n z1 = x1.add(x2).multiplyConstant(-1 / 2);\r\n z2 = x1.add(x2.negate()).multiplyConstant(Math.sqrt(3) / 2);\r\n\r\n y2 = z1.add(i.multiply(z2));\r\n y3 = z1.add(i.negate().multiply(z2));\r\n\r\n var result = [];\r\n\r\n if (y1.isReal()) {\r\n result.push(round(y1.real + b3a, PRECISION));\r\n }\r\n if (y2.isReal()) {\r\n result.push(round(y2.real + b3a, PRECISION));\r\n }\r\n if (y3.isReal()) {\r\n result.push(round(y3.real + b3a, PRECISION));\r\n }\r\n\r\n return result;\r\n }\r\n\r\n function hasRootsInRange(points, point, field, rootField, range) {\r\n var polynomial = toCubicPolynomial(points, rootField);\r\n var roots = solveCubicEquation(polynomial[0], polynomial[1], polynomial[2], polynomial[3] - point[rootField]);\r\n var intersection;\r\n\r\n for (var idx = 0; idx < roots.length; idx++) {\r\n if (0 <= roots[idx] && roots[idx] <= 1) {\r\n intersection = calculateCurveAt(roots[idx], field, points);\r\n if (Math.abs(intersection - point[field]) <= range) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n function curveIntersectionsCount(points, point, bbox) {\r\n var polynomial = toCubicPolynomial(points, \"x\");\r\n var roots = solveCubicEquation(polynomial[0], polynomial[1], polynomial[2], polynomial[3] - point.x);\r\n var rayIntersection, intersectsRay;\r\n var count = 0;\r\n for (var i = 0; i < roots.length; i++) {\r\n rayIntersection = calculateCurveAt(roots[i], \"y\", points);\r\n intersectsRay = close$1(rayIntersection, point.y) || rayIntersection > point.y;\r\n if (intersectsRay && (((roots[i] === 0 || roots[i] === 1) && bbox.bottomRight().x > point.x) || (0 < roots[i] && roots[i] < 1))) {\r\n count++;\r\n }\r\n }\r\n\r\n return count;\r\n }\r\n\r\n function lineIntersectionsCount(a, b, point) {\r\n var intersects;\r\n if (a.x !== b.x) {\r\n var minX = Math.min(a.x, b.x);\r\n var maxX = Math.max(a.x, b.x);\r\n var minY = Math.min(a.y, b.y);\r\n var maxY = Math.max(a.y, b.y);\r\n var inRange = minX <= point.x && point.x < maxX;\r\n\r\n if (minY === maxY) {\r\n intersects = point.y <= minY && inRange;\r\n } else {\r\n intersects = inRange && (((maxY - minY) * ((a.x - b.x) * (a.y - b.y) > 0 ? point.x - minX : maxX - point.x)) / (maxX - minX) + minY - point.y) >= 0;\r\n }\r\n }\r\n\r\n return intersects ? 1 : 0;\r\n }\r\n\r\n function pointAccessor(name) {\r\n var fieldName = \"_\" + name;\r\n return function(value) {\r\n if (defined(value)) {\r\n this._observerField(fieldName, Point.create(value));\r\n this.geometryChange();\r\n return this;\r\n }\r\n\r\n return this[fieldName];\r\n };\r\n }\r\n\r\n function definePointAccessors(fn, names) {\r\n for (var i = 0; i < names.length; i++) {\r\n fn[names[i]] = pointAccessor(names[i]);\r\n }\r\n }\r\n\r\n var withPoints = function (TBase, names) {\r\n var result = (function (TBase) {\r\n function result () {\r\n TBase.apply(this, arguments);\r\n }extendStatic(result, TBase);\r\n result.prototype = Object.create( TBase && TBase.prototype );\r\n result.prototype.constructor = result;\r\n result.fn = result.prototype;\r\n result.fn.init = result.fn.constructor;\r\n\r\n return result;\r\n }(TBase));\r\n definePointAccessors(result.prototype, names);\r\n\r\n return result;\r\n };\r\n\r\n var points = [ \"anchor\", \"controlIn\", \"controlOut\" ];\r\n\r\n var Segment = (function (superclass) {\r\n function Segment(anchor, controlIn, controlOut) {\r\n superclass.call(this);\r\n\r\n this.anchor(anchor || new Point());\r\n this.controlIn(controlIn);\r\n this.controlOut(controlOut);\r\n }\r\n\r\n extendStatic(Segment, superclass);\r\n Segment.prototype = Object.create( superclass && superclass.prototype );\r\n Segment.prototype.constructor = Segment;\r\n Segment.fn = Segment.prototype;\r\n Segment.fn.init = Segment.fn.constructor;\r\n\r\n Segment.prototype.bboxTo = function bboxTo (toSegment, matrix) {\r\n var segmentAnchor = this.anchor().transformCopy(matrix);\r\n var toSegmentAnchor = toSegment.anchor().transformCopy(matrix);\r\n var rect;\r\n\r\n if (this.controlOut() && toSegment.controlIn()) {\r\n rect = this._curveBoundingBox(\r\n segmentAnchor, this.controlOut().transformCopy(matrix),\r\n toSegment.controlIn().transformCopy(matrix), toSegmentAnchor\r\n );\r\n } else {\r\n rect = this._lineBoundingBox(segmentAnchor, toSegmentAnchor);\r\n }\r\n\r\n return rect;\r\n };\r\n\r\n Segment.prototype._lineBoundingBox = function _lineBoundingBox (p1, p2) {\r\n return Rect.fromPoints(p1, p2);\r\n };\r\n\r\n Segment.prototype._curveBoundingBox = function _curveBoundingBox (p1, cp1, cp2, p2) {\r\n var points = [ p1, cp1, cp2, p2 ];\r\n var extremesX = this._curveExtremesFor(points, \"x\");\r\n var extremesY = this._curveExtremesFor(points, \"y\");\r\n var xLimits = arrayLimits([ extremesX.min, extremesX.max, p1.x, p2.x ]);\r\n var yLimits = arrayLimits([ extremesY.min, extremesY.max, p1.y, p2.y ]);\r\n\r\n return Rect.fromPoints(new Point(xLimits.min, yLimits.min), new Point(xLimits.max, yLimits.max));\r\n };\r\n\r\n Segment.prototype._curveExtremesFor = function _curveExtremesFor (points, field) {\r\n var extremes = this._curveExtremes(\r\n points[0][field], points[1][field],\r\n points[2][field], points[3][field]\r\n );\r\n\r\n return {\r\n min: calculateCurveAt(extremes.min, field, points),\r\n max: calculateCurveAt(extremes.max, field, points)\r\n };\r\n };\r\n\r\n Segment.prototype._curveExtremes = function _curveExtremes (x1, x2, x3, x4) {\r\n var a = x1 - 3 * x2 + 3 * x3 - x4;\r\n var b = - 2 * (x1 - 2 * x2 + x3);\r\n var c = x1 - x2;\r\n var sqrt = Math.sqrt(b * b - 4 * a * c);\r\n var t1 = 0;\r\n var t2 = 1;\r\n\r\n if (a === 0) {\r\n if (b !== 0) {\r\n t1 = t2 = -c / b;\r\n }\r\n } else if (!isNaN(sqrt)) {\r\n t1 = (- b + sqrt) / (2 * a);\r\n t2 = (- b - sqrt) / (2 * a);\r\n }\r\n\r\n var min = Math.max(Math.min(t1, t2), 0);\r\n if (min < 0 || min > 1) {\r\n min = 0;\r\n }\r\n\r\n var max = Math.min(Math.max(t1, t2), 1);\r\n if (max > 1 || max < 0) {\r\n max = 1;\r\n }\r\n\r\n return {\r\n min: min,\r\n max: max\r\n };\r\n };\r\n\r\n Segment.prototype._intersectionsTo = function _intersectionsTo (segment, point) {\r\n var intersectionsCount;\r\n if (this.controlOut() && segment.controlIn()) {\r\n intersectionsCount = curveIntersectionsCount([ this.anchor(), this.controlOut(), segment.controlIn(), segment.anchor() ], point, this.bboxTo(segment));\r\n } else {\r\n intersectionsCount = lineIntersectionsCount(this.anchor(), segment.anchor(), point);\r\n }\r\n return intersectionsCount;\r\n };\r\n\r\n Segment.prototype._isOnCurveTo = function _isOnCurveTo (segment, point, width, endSegment) {\r\n var bbox = this.bboxTo(segment).expand(width, width);\r\n if (bbox.containsPoint(point)) {\r\n var p1 = this.anchor();\r\n var p2 = this.controlOut();\r\n var p3 = segment.controlIn();\r\n var p4 = segment.anchor();\r\n\r\n if (endSegment === \"start\" && p1.distanceTo(point) <= width) {\r\n return !isOutOfEndPoint(p1, p2, point);\r\n } else if (endSegment === \"end\" && p4.distanceTo(point) <= width) {\r\n return !isOutOfEndPoint(p4, p3, point);\r\n }\r\n\r\n //the approach is not entirely correct but is close and the alternatives are solving a 6th degree polynomial or testing the segment points\r\n var points = [ p1, p2, p3, p4 ];\r\n if (hasRootsInRange(points, point, \"x\", \"y\", width) || hasRootsInRange(points, point, \"y\", \"x\", width)) {\r\n return true;\r\n }\r\n var rotation = transform$1().rotate(45, point);\r\n var rotatedPoints = [ p1.transformCopy(rotation), p2.transformCopy(rotation), p3.transformCopy(rotation), p4.transformCopy(rotation) ];\r\n return hasRootsInRange(rotatedPoints, point, \"x\", \"y\", width) || hasRootsInRange(rotatedPoints, point, \"y\", \"x\", width);\r\n }\r\n };\r\n\r\n Segment.prototype._isOnLineTo = function _isOnLineTo (segment, point, width) {\r\n var p1 = this.anchor();\r\n var p2 = segment.anchor();\r\n var angle = deg(Math.atan2(p2.y - p1.y, p2.x - p1.x));\r\n var rect = new Rect([ p1.x, p1.y - width / 2 ], [ p1.distanceTo(p2), width ]);\r\n return rect.containsPoint(point.transformCopy(transform$1().rotate(-angle, p1)));\r\n };\r\n\r\n Segment.prototype._isOnPathTo = function _isOnPathTo (segment, point, width, endSegment) {\r\n var isOnPath;\r\n if (this.controlOut() && segment.controlIn()) {\r\n isOnPath = this._isOnCurveTo(segment, point, width / 2, endSegment);\r\n } else {\r\n isOnPath = this._isOnLineTo(segment, point, width);\r\n }\r\n return isOnPath;\r\n };\r\n\r\n return Segment;\r\n }(withPoints(HasObservers, points)));\r\n\r\n function arrayLimits(arr) {\r\n var length = arr.length;\r\n var min = MAX_NUM;\r\n var max = MIN_NUM;\r\n\r\n for (var i = 0; i < length; i ++) {\r\n max = Math.max(max, arr[i]);\r\n min = Math.min(min, arr[i]);\r\n }\r\n\r\n return {\r\n min: min,\r\n max: max\r\n };\r\n }\r\n\r\n var geometry = {\r\n \tCircle: Circle$2,\r\n \tArc: Arc$2,\r\n \tRect: Rect,\r\n \tPoint: Point,\r\n \tSegment: Segment,\r\n \tMatrix: Matrix,\r\n \tSize: Size,\r\n \ttoMatrix: toMatrix,\r\n \tTransformation: Transformation,\r\n \ttransform: transform$1\r\n };\r\n\r\n var WEIGHT = 0.333;\r\n var EXTREMUM_ALLOWED_DEVIATION = 0.01;\r\n var X = \"x\";\r\n var Y = \"y\";\r\n\r\n function pointsToCurve(pointsIn, closed) {\r\n var points = pointsIn.slice(0);\r\n var segments = [];\r\n var length = points.length;\r\n\r\n if (length > 2) {\r\n removeDuplicates(0, points);\r\n length = points.length;\r\n }\r\n\r\n if (length < 2 || (length === 2 && points[0].equals(points[1]))) {\r\n return segments;\r\n }\r\n\r\n var p0 = points[0];\r\n var p1 = points[1];\r\n var p2 = points[2];\r\n\r\n segments.push(new Segment(p0));\r\n\r\n while (p0.equals(points[length - 1])) {\r\n closed = true;\r\n points.pop();\r\n length--;\r\n }\r\n\r\n if (length === 2) {\r\n var tangent = getTangent(p0,p1, X, Y);\r\n\r\n last(segments).controlOut(\r\n firstControlPoint(tangent, p0, p1, X, Y)\r\n );\r\n\r\n segments.push(new Segment(\r\n p1,\r\n secondControlPoint(tangent, p0, p1, X, Y)\r\n ));\r\n\r\n return segments;\r\n }\r\n\r\n var initialControlPoint, lastControlPoint;\r\n\r\n if (closed) {\r\n p0 = points[length - 1]; p1 = points[0]; p2 = points[1];\r\n var controlPoints = getControlPoints(p0, p1, p2);\r\n initialControlPoint = controlPoints[1];\r\n lastControlPoint = controlPoints[0];\r\n } else {\r\n var tangent$1 = getTangent(p0, p1, X,Y);\r\n initialControlPoint = firstControlPoint(tangent$1, p0, p1, X, Y);\r\n }\r\n\r\n var cp0 = initialControlPoint;\r\n for (var idx = 0; idx <= length - 3; idx++) {\r\n removeDuplicates(idx, points);\r\n length = points.length;\r\n if (idx + 3 <= length) {\r\n p0 = points[idx]; p1 = points[idx + 1]; p2 = points[idx + 2];\r\n var controlPoints$1 = getControlPoints(p0,p1,p2);\r\n\r\n last(segments).controlOut(cp0);\r\n cp0 = controlPoints$1[1];\r\n\r\n var cp1 = controlPoints$1[0];\r\n segments.push(new Segment(p1, cp1));\r\n }\r\n }\r\n\r\n if (closed) {\r\n p0 = points[length - 2]; p1 = points[length - 1]; p2 = points[0];\r\n var controlPoints$2 = getControlPoints(p0, p1, p2);\r\n\r\n last(segments).controlOut(cp0);\r\n segments.push(new Segment(\r\n p1,\r\n controlPoints$2[0]\r\n ));\r\n\r\n last(segments).controlOut(controlPoints$2[1]);\r\n segments.push(new Segment(\r\n p2,\r\n lastControlPoint\r\n ));\r\n } else {\r\n var tangent$2 = getTangent(p1, p2, X, Y);\r\n\r\n last(segments).controlOut(cp0);\r\n segments.push(new Segment(\r\n p2,\r\n secondControlPoint(tangent$2, p1, p2, X, Y)\r\n ));\r\n }\r\n\r\n return segments;\r\n }\r\n\r\n function removeDuplicates(idx, points) {\r\n while (points[idx + 1] && (points[idx].equals(points[idx + 1]) || points[idx + 1].equals(points[idx + 2]))) {\r\n points.splice(idx + 1, 1);\r\n }\r\n }\r\n\r\n function invertAxis(p0, p1, p2) {\r\n var invertAxis = false;\r\n\r\n if (p0.x === p1.x) {\r\n invertAxis = true;\r\n } else if (p1.x === p2.x) {\r\n if ((p1.y < p2.y && p0.y <= p1.y) || (p2.y < p1.y && p1.y <= p0.y)) {\r\n invertAxis = true;\r\n }\r\n } else {\r\n var fn = lineFunction(p0,p1);\r\n var y2 = calculateFunction(fn, p2.x);\r\n if (!(p0.y <= p1.y && p2.y <= y2) &&\r\n !(p1.y <= p0.y && p2.y >= y2)) {\r\n invertAxis = true;\r\n }\r\n }\r\n\r\n return invertAxis;\r\n }\r\n\r\n function isLine(p0, p1, p2) {\r\n var fn = lineFunction(p0, p1);\r\n var y2 = calculateFunction(fn, p2.x);\r\n\r\n return (p0.x === p1.x && p1.x === p2.x) || round(y2, 1) === round(p2.y, 1);\r\n }\r\n\r\n function lineFunction(p1, p2) {\r\n var a = (p2.y - p1.y) / (p2.x - p1.x);\r\n var b = p1.y - a * p1.x;\r\n\r\n return [ b, a ];\r\n }\r\n\r\n function getControlPoints(p0, p1, p2) {\r\n var xField = X;\r\n var yField = Y;\r\n var restrict = false;\r\n var switchOrientation = false;\r\n var tangent;\r\n\r\n if (isLine(p0, p1, p2)) {\r\n tangent = getTangent(p0, p1, X, Y);\r\n } else {\r\n var monotonic = {\r\n x: isMonotonicByField(p0, p1, p2, X),\r\n y: isMonotonicByField(p0, p1, p2, Y)\r\n };\r\n\r\n if (monotonic.x && monotonic.y) {\r\n tangent = getTangent(p0, p2, X, Y);\r\n restrict = true;\r\n } else {\r\n if (invertAxis(p0, p1, p2)) {\r\n xField = Y;\r\n yField = X;\r\n }\r\n\r\n if (monotonic[xField]) {\r\n tangent = 0;\r\n } else {\r\n var sign;\r\n if ((p2[yField] < p0[yField] && p0[yField] <= p1[yField]) ||\r\n (p0[yField] < p2[yField] && p1[yField] <= p0[yField])) {\r\n sign = numberSign((p2[yField] - p0[yField]) * (p1[xField] - p0[xField]));\r\n } else {\r\n sign = -numberSign((p2[xField] - p0[xField]) * (p1[yField] - p0[yField]));\r\n }\r\n\r\n tangent = EXTREMUM_ALLOWED_DEVIATION * sign;\r\n switchOrientation = true;\r\n }\r\n }\r\n }\r\n\r\n var secondCP = secondControlPoint(tangent, p0, p1, xField, yField);\r\n\r\n if (switchOrientation) {\r\n var oldXField = xField;\r\n xField = yField;\r\n yField = oldXField;\r\n }\r\n\r\n var firstCP = firstControlPoint(tangent, p1, p2, xField, yField);\r\n\r\n if (restrict) {\r\n restrictControlPoint(p0, p1, secondCP, tangent);\r\n restrictControlPoint(p1, p2, firstCP, tangent);\r\n }\r\n\r\n return [ secondCP, firstCP ];\r\n }\r\n\r\n function restrictControlPoint(p1, p2, cp, tangent) {\r\n if (p1.y < p2.y) {\r\n if (p2.y < cp.y) {\r\n cp.x = p1.x + (p2.y - p1.y) / tangent;\r\n cp.y = p2.y;\r\n } else if (cp.y < p1.y) {\r\n cp.x = p2.x - (p2.y - p1.y) / tangent;\r\n cp.y = p1.y;\r\n }\r\n } else {\r\n if (cp.y < p2.y) {\r\n cp.x = p1.x - (p1.y - p2.y) / tangent;\r\n cp.y = p2.y;\r\n } else if (p1.y < cp.y) {\r\n cp.x = p2.x + (p1.y - p2.y) / tangent;\r\n cp.y = p1.y;\r\n }\r\n }\r\n }\r\n\r\n function getTangent(p0, p1, xField, yField) {\r\n var x = p1[xField] - p0[xField];\r\n var y = p1[yField] - p0[yField];\r\n var tangent;\r\n\r\n if (x === 0) {\r\n tangent = 0;\r\n } else {\r\n tangent = y / x;\r\n }\r\n\r\n return tangent;\r\n }\r\n\r\n function isMonotonicByField(p0, p1, p2, field) {\r\n return (p2[field] > p1[field] && p1[field] > p0[field]) ||\r\n (p2[field] < p1[field] && p1[field] < p0[field]);\r\n }\r\n\r\n function firstControlPoint(tangent, p0, p3, xField, yField) {\r\n var t1 = p0[xField];\r\n var t2 = p3[xField];\r\n var distance = (t2 - t1) * WEIGHT;\r\n\r\n return point(t1 + distance, p0[yField] + distance * tangent, xField, yField);\r\n }\r\n\r\n function secondControlPoint(tangent, p0, p3, xField, yField) {\r\n var t1 = p0[xField];\r\n var t2 = p3[xField];\r\n var distance = (t2 - t1) * WEIGHT;\r\n\r\n return point(t2 - distance, p3[yField] - distance * tangent, xField, yField);\r\n }\r\n\r\n function point(xValue, yValue, xField, yField) {\r\n var controlPoint = new Point();\r\n controlPoint[xField] = xValue;\r\n controlPoint[yField] = yValue;\r\n\r\n return controlPoint;\r\n }\r\n\r\n function calculateFunction(fn, x) {\r\n var length = fn.length;\r\n var result = 0;\r\n\r\n for (var i = 0; i < length; i++) {\r\n result += Math.pow(x,i) * fn[i];\r\n }\r\n return result;\r\n }\r\n\r\n function numberSign(value) {\r\n return value <= 0 ? -1 : 1;\r\n }\r\n\r\n var ShapeMap = {\r\n l: function(path, options) {\r\n var parameters = options.parameters;\r\n var position = options.position;\r\n\r\n for (var i = 0; i < parameters.length; i += 2) {\r\n var point = new Point(parameters[i], parameters[i + 1]);\r\n\r\n if (options.isRelative) {\r\n point.translateWith(position);\r\n }\r\n\r\n path.lineTo(point.x, point.y);\r\n\r\n position.x = point.x;\r\n position.y = point.y;\r\n }\r\n },\r\n\r\n c: function(path, options) {\r\n var parameters = options.parameters;\r\n var position = options.position;\r\n\r\n for (var i = 0; i < parameters.length; i += 6) {\r\n var controlOut = new Point(parameters[i], parameters[i + 1]);\r\n var controlIn = new Point(parameters[i + 2], parameters[i + 3]);\r\n var point = new Point(parameters[i + 4], parameters[i + 5]);\r\n if (options.isRelative) {\r\n controlIn.translateWith(position);\r\n controlOut.translateWith(position);\r\n point.translateWith(position);\r\n }\r\n\r\n path.curveTo(controlOut, controlIn, point);\r\n\r\n position.x = point.x;\r\n position.y = point.y;\r\n }\r\n },\r\n\r\n v: function(path, options) {\r\n var value = options.isRelative ? 0 : options.position.x;\r\n\r\n toLineParamaters(options.parameters, true, value);\r\n this.l(path, options);\r\n },\r\n\r\n h: function(path, options) {\r\n var value = options.isRelative ? 0 : options.position.y;\r\n\r\n toLineParamaters(options.parameters, false, value);\r\n this.l(path, options);\r\n },\r\n\r\n a: function(path, options) {\r\n var parameters = options.parameters;\r\n var position = options.position;\r\n\r\n for (var i = 0; i < parameters.length; i += 7) {\r\n var radiusX = parameters[i];\r\n var radiusY = parameters[i + 1];\r\n var rotation = parameters[i + 2];\r\n var largeArc = parameters[i + 3];\r\n var swipe = parameters[i + 4];\r\n var endPoint = new Point(parameters[i + 5], parameters[i + 6]);\r\n\r\n if (options.isRelative) {\r\n endPoint.translateWith(position);\r\n }\r\n if (position.x !== endPoint.x || position.y !== endPoint.y) {\r\n path.arcTo(endPoint, radiusX, radiusY, largeArc, swipe, rotation);\r\n\r\n position.x = endPoint.x;\r\n position.y = endPoint.y;\r\n }\r\n }\r\n },\r\n\r\n s: function(path, options) {\r\n var parameters = options.parameters;\r\n var position = options.position;\r\n var previousCommand = options.previousCommand;\r\n var lastControlIn;\r\n\r\n if (previousCommand === \"s\" || previousCommand === \"c\") {\r\n lastControlIn = last(last(path.paths).segments).controlIn();\r\n }\r\n\r\n for (var i = 0; i < parameters.length; i += 4) {\r\n var controlIn = new Point(parameters[i], parameters[i + 1]);\r\n var endPoint = new Point(parameters[i + 2], parameters[i + 3]);\r\n var controlOut = (void 0);\r\n\r\n if (options.isRelative) {\r\n controlIn.translateWith(position);\r\n endPoint.translateWith(position);\r\n }\r\n\r\n if (lastControlIn) {\r\n controlOut = reflectionPoint(lastControlIn, position);\r\n } else {\r\n controlOut = position.clone();\r\n }\r\n\r\n lastControlIn = controlIn;\r\n\r\n path.curveTo(controlOut, controlIn, endPoint);\r\n\r\n position.x = endPoint.x;\r\n position.y = endPoint.y;\r\n }\r\n },\r\n\r\n q: function(path, options) {\r\n var parameters = options.parameters;\r\n var position = options.position;\r\n\r\n for (var i = 0; i < parameters.length; i += 4) {\r\n var controlPoint = new Point(parameters[i], parameters[i + 1]);\r\n var endPoint = new Point(parameters[i + 2], parameters[i + 3]);\r\n\r\n if (options.isRelative) {\r\n controlPoint.translateWith(position);\r\n endPoint.translateWith(position);\r\n }\r\n\r\n var cubicControlPoints = quadraticToCubicControlPoints(position, controlPoint, endPoint);\r\n\r\n path.curveTo(cubicControlPoints.controlOut, cubicControlPoints.controlIn, endPoint);\r\n\r\n position.x = endPoint.x;\r\n position.y = endPoint.y;\r\n }\r\n },\r\n\r\n t: function(path, options) {\r\n var parameters = options.parameters;\r\n var position = options.position;\r\n var previousCommand = options.previousCommand;\r\n var controlPoint;\r\n\r\n if (previousCommand === \"q\" || previousCommand === \"t\") {\r\n var lastSegment = last(last(path.paths).segments);\r\n controlPoint = lastSegment.controlIn().clone()\r\n .translateWith(position.scaleCopy(-1 / 3))\r\n .scale(3 / 2);\r\n }\r\n\r\n for (var i = 0; i < parameters.length; i += 2) {\r\n var endPoint = new Point(parameters[i], parameters[i + 1]);\r\n if (options.isRelative) {\r\n endPoint.translateWith(position);\r\n }\r\n\r\n if (controlPoint) {\r\n controlPoint = reflectionPoint(controlPoint, position);\r\n } else {\r\n controlPoint = position.clone();\r\n }\r\n\r\n var cubicControlPoints = quadraticToCubicControlPoints(position, controlPoint, endPoint);\r\n\r\n path.curveTo(cubicControlPoints.controlOut, cubicControlPoints.controlIn, endPoint);\r\n\r\n position.x = endPoint.x;\r\n position.y = endPoint.y;\r\n }\r\n }\r\n };\r\n\r\n function toLineParamaters(parameters, isVertical, value) {\r\n var insertPosition = isVertical ? 0 : 1;\r\n\r\n for (var i = 0; i < parameters.length; i += 2) {\r\n parameters.splice(i + insertPosition, 0, value);\r\n }\r\n }\r\n\r\n function reflectionPoint(point, center) {\r\n if (point && center) {\r\n return center.scaleCopy(2).translate(-point.x, -point.y);\r\n }\r\n }\r\n\r\n var third = 1 / 3;\r\n\r\n function quadraticToCubicControlPoints(position, controlPoint, endPoint) {\r\n var scaledPoint = controlPoint.clone().scale(2 / 3);\r\n return {\r\n controlOut: scaledPoint.clone().translateWith(position.scaleCopy(third)),\r\n controlIn: scaledPoint.translateWith(endPoint.scaleCopy(third))\r\n };\r\n }\r\n\r\n var SEGMENT_REGEX = /([a-df-z]{1})([^a-df-z]*)(z)?/gi;\r\n var SPLIT_REGEX = /[,\\s]?([+\\-]?(?:\\d*\\.\\d+|\\d+)(?:[eE][+\\-]?\\d+)?)/g;\r\n var MOVE = \"m\";\r\n var CLOSE = \"z\";\r\n\r\n function parseParameters(str) {\r\n var parameters = [];\r\n str.replace(SPLIT_REGEX, function(match, number) {\r\n parameters.push(parseFloat(number));\r\n });\r\n return parameters;\r\n }\r\n\r\n function parsePath(pathInstance, str) {\r\n var position = new Point();\r\n var previousCommand;\r\n\r\n str.replace(SEGMENT_REGEX, function (match, element, params, closePath) {\r\n var command = element.toLowerCase();\r\n var isRelative = command === element;\r\n var parameters = parseParameters(params.trim());\r\n\r\n if (command === MOVE) {\r\n if (isRelative) {\r\n position.x += parameters[0];\r\n position.y += parameters[1];\r\n } else {\r\n position.x = parameters[0];\r\n position.y = parameters[1];\r\n }\r\n\r\n pathInstance.moveTo(position.x, position.y);\r\n\r\n if (parameters.length > 2) {\r\n command = \"l\";\r\n parameters.splice(0, 2);\r\n }\r\n }\r\n\r\n if (ShapeMap[command]) {\r\n ShapeMap[command](\r\n pathInstance, {\r\n parameters: parameters,\r\n position: position,\r\n isRelative: isRelative,\r\n previousCommand: previousCommand\r\n }\r\n );\r\n\r\n if (closePath && closePath.toLowerCase() === CLOSE) {\r\n pathInstance.close();\r\n }\r\n } else if (command !== MOVE) {\r\n throw new Error(\"Error while parsing SVG path. Unsupported command: \" + command);\r\n }\r\n\r\n previousCommand = command;\r\n });\r\n\r\n return pathInstance;\r\n }\r\n\r\n function elementsBoundingBox(elements, applyTransform, transformation) {\r\n var boundingBox;\r\n\r\n for (var i = 0; i < elements.length; i++) {\r\n var element = elements[i];\r\n if (element.visible()) {\r\n var elementBoundingBox = applyTransform ? element.bbox(transformation) : element.rawBBox();\r\n if (elementBoundingBox) {\r\n if (boundingBox) {\r\n boundingBox = Rect.union(boundingBox, elementBoundingBox);\r\n } else {\r\n boundingBox = elementBoundingBox;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return boundingBox;\r\n }\r\n\r\n function elementsClippedBoundingBox(elements, transformation) {\r\n var boundingBox;\r\n\r\n for (var i = 0; i < elements.length; i++) {\r\n var element = elements[i];\r\n if (element.visible()) {\r\n var elementBoundingBox = element.clippedBBox(transformation);\r\n if (elementBoundingBox) {\r\n if (boundingBox) {\r\n boundingBox = Rect.union(boundingBox, elementBoundingBox);\r\n } else {\r\n boundingBox = elementBoundingBox;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return boundingBox;\r\n }\r\n\r\n var SPACE = ' ';\r\n var printPoints = function (precision) { return function () {\r\n var points = [], len = arguments.length;\r\n while ( len-- ) points[ len ] = arguments[ len ];\r\n\r\n return points.map(function (p) { return p.toString(precision); }).join(SPACE);\r\n } };\r\n var segmentType = function (segmentStart, segmentEnd) { return segmentStart.controlOut() && segmentEnd.controlIn() ? 'C' : 'L'; };\r\n\r\n var Path = (function (superclass) {\r\n function Path(options) {\r\n superclass.call(this, options);\r\n this.segments = new GeometryElementsArray();\r\n this.segments.addObserver(this);\r\n\r\n if (!defined(this.options.stroke)) {\r\n this.stroke('#000');\r\n\r\n if (!defined(this.options.stroke.lineJoin)) {\r\n this.options.set('stroke.lineJoin', 'miter');\r\n }\r\n }\r\n }\r\n\r\n extendStatic(Path, superclass);\r\n Path.prototype = Object.create( superclass && superclass.prototype );\r\n Path.prototype.constructor = Path;\r\n Path.fn = Path.prototype;\r\n Path.fn.init = Path.fn.constructor;\r\n\r\n var prototypeAccessors = { nodeType: {} };\r\n\r\n prototypeAccessors.nodeType.get = function () {\r\n return 'Path';\r\n };\r\n\r\n Path.prototype.moveTo = function moveTo (x, y) {\r\n this.suspend();\r\n this.segments.elements([]);\r\n this.resume();\r\n\r\n this.lineTo(x, y);\r\n\r\n return this;\r\n };\r\n\r\n Path.prototype.lineTo = function lineTo (x, y) {\r\n var point$$1 = defined(y) ? new Point(x, y) : x;\r\n var segment = new Segment(point$$1);\r\n\r\n this.segments.push(segment);\r\n\r\n return this;\r\n };\r\n\r\n Path.prototype.curveTo = function curveTo (controlOut, controlIn, point$$1) {\r\n if (this.segments.length > 0) {\r\n var lastSegment = last(this.segments);\r\n var segment = new Segment(point$$1, controlIn);\r\n this.suspend();\r\n lastSegment.controlOut(controlOut);\r\n this.resume();\r\n\r\n this.segments.push(segment);\r\n }\r\n\r\n return this;\r\n };\r\n\r\n Path.prototype.arc = function arc (startAngle, endAngle, radiusX, radiusY, anticlockwise) {\r\n if (this.segments.length > 0) {\r\n var lastSegment = last(this.segments);\r\n var anchor = lastSegment.anchor();\r\n var start = rad(startAngle);\r\n var center = new Point(anchor.x - radiusX * Math.cos(start),\r\n anchor.y - radiusY * Math.sin(start));\r\n var arc = new Arc$2(center, {\r\n startAngle: startAngle,\r\n endAngle: endAngle,\r\n radiusX: radiusX,\r\n radiusY: radiusY,\r\n anticlockwise: anticlockwise\r\n });\r\n\r\n this._addArcSegments(arc);\r\n }\r\n\r\n return this;\r\n };\r\n\r\n Path.prototype.arcTo = function arcTo (end, rx, ry, largeArc, swipe, rotation) {\r\n if (this.segments.length > 0) {\r\n var lastSegment = last(this.segments);\r\n var anchor = lastSegment.anchor();\r\n var arc = Arc$2.fromPoints(anchor, Point.create(end), rx, ry, largeArc, swipe, rotation);\r\n\r\n this._addArcSegments(arc);\r\n }\r\n return this;\r\n };\r\n\r\n Path.prototype._addArcSegments = function _addArcSegments (arc) {\r\n var this$1$1 = this;\r\n\r\n this.suspend();\r\n\r\n var curvePoints = arc.curvePoints();\r\n\r\n for (var i = 1; i < curvePoints.length; i += 3) {\r\n this$1$1.curveTo(curvePoints[i], curvePoints[i + 1], curvePoints[i + 2]);\r\n }\r\n\r\n this.resume();\r\n this.geometryChange();\r\n };\r\n\r\n Path.prototype.close = function close () {\r\n this.options.closed = true;\r\n this.geometryChange();\r\n\r\n return this;\r\n };\r\n\r\n Path.prototype.rawBBox = function rawBBox () {\r\n return this._bbox();\r\n };\r\n\r\n Path.prototype.toString = function toString (digits) {\r\n var output = '';\r\n\r\n var segments = this.segments;\r\n var length = segments.length;\r\n if (length > 0) {\r\n var parts = [];\r\n var print = printPoints(digits);\r\n var currentType;\r\n\r\n for (var i = 1; i < length; i++) {\r\n var type = segmentType(segments[i - 1], segments[i]);\r\n if (type !== currentType) {\r\n currentType = type;\r\n parts.push(type);\r\n }\r\n\r\n if (type === 'L') {\r\n parts.push(print(segments[i].anchor()));\r\n } else {\r\n parts.push(print(\r\n segments[i - 1].controlOut(), segments[i].controlIn(), segments[i].anchor()\r\n ));\r\n }\r\n }\r\n\r\n output = 'M' + print(segments[0].anchor()) + SPACE + parts.join(SPACE);\r\n if (this.options.closed) {\r\n output += 'Z';\r\n }\r\n }\r\n\r\n return output;\r\n };\r\n\r\n Path.prototype._containsPoint = function _containsPoint (point$$1) {\r\n var segments = this.segments;\r\n var length = segments.length;\r\n var intersectionsCount = 0;\r\n var previous, current;\r\n\r\n for (var idx = 1; idx < length; idx++) {\r\n previous = segments[idx - 1];\r\n current = segments[idx];\r\n intersectionsCount += previous._intersectionsTo(current, point$$1);\r\n }\r\n\r\n if (this.options.closed || !segments[0].anchor().equals(segments[length - 1].anchor())) {\r\n intersectionsCount += lineIntersectionsCount(segments[0].anchor(), segments[length - 1].anchor(), point$$1);\r\n }\r\n\r\n return intersectionsCount % 2 !== 0;\r\n };\r\n\r\n Path.prototype._isOnPath = function _isOnPath (point$$1, width) {\r\n var segments = this.segments;\r\n var length = segments.length;\r\n var pathWidth = width || this.options.stroke.width;\r\n\r\n if (length > 1) {\r\n if (segments[0]._isOnPathTo(segments[1], point$$1, pathWidth, 'start')) {\r\n return true;\r\n }\r\n\r\n for (var idx = 2; idx <= length - 2; idx++) {\r\n if (segments[idx - 1]._isOnPathTo(segments[idx], point$$1, pathWidth)) {\r\n return true;\r\n }\r\n }\r\n\r\n if (segments[length - 2]._isOnPathTo(segments[length - 1], point$$1, pathWidth, 'end')) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n Path.prototype._bbox = function _bbox (matrix) {\r\n var segments = this.segments;\r\n var length = segments.length;\r\n var boundingBox;\r\n\r\n if (length === 1) {\r\n var anchor = segments[0].anchor().transformCopy(matrix);\r\n boundingBox = new Rect(anchor, Size.ZERO);\r\n } else if (length > 0) {\r\n for (var i = 1; i < length; i++) {\r\n var segmentBox = segments[i - 1].bboxTo(segments[i], matrix);\r\n if (boundingBox) {\r\n boundingBox = Rect.union(boundingBox, segmentBox);\r\n } else {\r\n boundingBox = segmentBox;\r\n }\r\n }\r\n }\r\n\r\n return boundingBox;\r\n };\r\n\r\n Path.parse = function parse (str, options) {\r\n return MultiPath.parse(str, options);\r\n };\r\n\r\n Path.fromRect = function fromRect (rect, options) {\r\n var path = new Path(options);\r\n var ref = rect.cornerRadius;\r\n var rx = ref[0];\r\n var ry = ref[1];\r\n\r\n if (rx === 0 && ry === 0) {\r\n path.moveTo(rect.topLeft())\r\n .lineTo(rect.topRight())\r\n .lineTo(rect.bottomRight())\r\n .lineTo(rect.bottomLeft())\r\n .close();\r\n } else {\r\n var origin = rect.origin;\r\n var x = origin.x;\r\n var y = origin.y;\r\n var width = rect.width();\r\n var height = rect.height();\r\n rx = limitValue(rx, 0, width / 2);\r\n ry = limitValue(ry, 0, height / 2);\r\n\r\n path.moveTo(x + rx, y)\r\n .lineTo(x + width - rx, y)\r\n .arcTo([ x + width, y + ry ], rx, ry, false)\r\n .lineTo(x + width, y + height - ry)\r\n .arcTo([ x + width - rx, y + height ], rx, ry, false)\r\n .lineTo(x + rx, y + height)\r\n .arcTo([ x, y + height - ry ], rx, ry, false)\r\n .lineTo(x, y + ry)\r\n .arcTo([ x + rx, y ], rx, ry, false);\r\n }\r\n\r\n return path;\r\n };\r\n\r\n Path.fromPoints = function fromPoints (points, options) {\r\n if (points) {\r\n var path = new Path(options);\r\n\r\n for (var i = 0; i < points.length; i++) {\r\n var point$$1 = Point.create(points[i]);\r\n if (point$$1) {\r\n if (i === 0) {\r\n path.moveTo(point$$1);\r\n } else {\r\n path.lineTo(point$$1);\r\n }\r\n }\r\n }\r\n\r\n return path;\r\n }\r\n };\r\n\r\n Path.curveFromPoints = function curveFromPoints (points, options) {\r\n if (points) {\r\n var segments = pointsToCurve(points);\r\n var path = new Path(options);\r\n path.segments.push.apply(path.segments, segments);\r\n\r\n return path;\r\n }\r\n };\r\n\r\n Path.fromArc = function fromArc (arc, options) {\r\n var path = new Path(options);\r\n var startAngle = arc.startAngle;\r\n var start = arc.pointAt(startAngle);\r\n path.moveTo(start.x, start.y);\r\n path.arc(startAngle, arc.endAngle, arc.radiusX, arc.radiusY, arc.anticlockwise);\r\n return path;\r\n };\r\n\r\n Object.defineProperties( Path.prototype, prototypeAccessors );\r\n\r\n return Path;\r\n }(paintable(measurable(Element$1))));\r\n\r\n var MultiPath = (function (superclass) {\r\n function MultiPath(options) {\r\n superclass.call(this, options);\r\n this.paths = new GeometryElementsArray();\r\n this.paths.addObserver(this);\r\n\r\n if (!defined(this.options.stroke)) {\r\n this.stroke('#000');\r\n }\r\n }\r\n\r\n extendStatic(MultiPath, superclass);\r\n MultiPath.prototype = Object.create( superclass && superclass.prototype );\r\n MultiPath.prototype.constructor = MultiPath;\r\n MultiPath.fn = MultiPath.prototype;\r\n MultiPath.fn.init = MultiPath.fn.constructor;\r\n\r\n var prototypeAccessors$1 = { nodeType: {} };\r\n\r\n MultiPath.parse = function parse (str, options) {\r\n var instance = new MultiPath(options);\r\n return parsePath(instance, str);\r\n };\r\n\r\n MultiPath.prototype.toString = function toString (digits) {\r\n var paths = this.paths;\r\n var output = '';\r\n\r\n if (paths.length > 0) {\r\n var result = [];\r\n\r\n for (var i = 0; i < paths.length; i++) {\r\n result.push(paths[i].toString(digits));\r\n }\r\n\r\n output = result.join(SPACE);\r\n }\r\n\r\n return output;\r\n };\r\n\r\n prototypeAccessors$1.nodeType.get = function () {\r\n return 'MultiPath';\r\n };\r\n\r\n MultiPath.prototype.moveTo = function moveTo (x, y) {\r\n var path = new Path();\r\n path.moveTo(x, y);\r\n\r\n this.paths.push(path);\r\n\r\n return this;\r\n };\r\n\r\n MultiPath.prototype.lineTo = function lineTo (x, y) {\r\n if (this.paths.length > 0) {\r\n last(this.paths).lineTo(x, y);\r\n }\r\n\r\n return this;\r\n };\r\n\r\n MultiPath.prototype.curveTo = function curveTo (controlOut, controlIn, point$$1) {\r\n if (this.paths.length > 0) {\r\n last(this.paths).curveTo(controlOut, controlIn, point$$1);\r\n }\r\n\r\n return this;\r\n };\r\n\r\n MultiPath.prototype.arc = function arc (startAngle, endAngle, radiusX, radiusY, anticlockwise) {\r\n if (this.paths.length > 0) {\r\n last(this.paths).arc(startAngle, endAngle, radiusX, radiusY, anticlockwise);\r\n }\r\n\r\n return this;\r\n };\r\n\r\n MultiPath.prototype.arcTo = function arcTo (end, rx, ry, largeArc, swipe, rotation) {\r\n if (this.paths.length > 0) {\r\n last(this.paths).arcTo(end, rx, ry, largeArc, swipe, rotation);\r\n }\r\n\r\n return this;\r\n };\r\n\r\n MultiPath.prototype.close = function close () {\r\n if (this.paths.length > 0) {\r\n last(this.paths).close();\r\n }\r\n\r\n return this;\r\n };\r\n\r\n MultiPath.prototype._bbox = function _bbox (matrix) {\r\n return elementsBoundingBox(this.paths, true, matrix);\r\n };\r\n\r\n MultiPath.prototype.rawBBox = function rawBBox () {\r\n return elementsBoundingBox(this.paths, false);\r\n };\r\n\r\n MultiPath.prototype._containsPoint = function _containsPoint (point$$1) {\r\n var paths = this.paths;\r\n\r\n for (var idx = 0; idx < paths.length; idx++) {\r\n if (paths[idx]._containsPoint(point$$1)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n MultiPath.prototype._isOnPath = function _isOnPath (point$$1) {\r\n var paths = this.paths;\r\n var width = this.options.stroke.width;\r\n\r\n for (var idx = 0; idx < paths.length; idx++) {\r\n if (paths[idx]._isOnPath(point$$1, width)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n MultiPath.prototype._clippedBBox = function _clippedBBox (transformation) {\r\n return elementsClippedBoundingBox(this.paths, this.currentTransform(transformation));\r\n };\r\n\r\n Object.defineProperties( MultiPath.prototype, prototypeAccessors$1 );\r\n\r\n return MultiPath;\r\n }(paintable(measurable(Element$1))));\r\n\r\n var DEFAULT_STROKE$1 = \"#000\";\r\n\r\n var Arc = (function (superclass) {\r\n function Arc(geometry, options) {\r\n if (geometry === void 0) { geometry = new Arc$2(); }\r\n if (options === void 0) { options = {}; }\r\n\r\n superclass.call(this, options);\r\n\r\n this.geometry(geometry);\r\n\r\n if (!defined(this.options.stroke)) {\r\n this.stroke(DEFAULT_STROKE$1);\r\n }\r\n }\r\n\r\n extendStatic(Arc, superclass);\r\n Arc.prototype = Object.create( superclass && superclass.prototype );\r\n Arc.prototype.constructor = Arc;\r\n Arc.fn = Arc.prototype;\r\n Arc.fn.init = Arc.fn.constructor;\r\n\r\n var prototypeAccessors = { nodeType: {} };\r\n\r\n prototypeAccessors.nodeType.get = function () {\r\n return \"Arc\";\r\n };\r\n\r\n Arc.prototype._bbox = function _bbox (matrix) {\r\n return this._geometry.bbox(matrix);\r\n };\r\n\r\n Arc.prototype.rawBBox = function rawBBox () {\r\n return this.geometry().bbox();\r\n };\r\n\r\n Arc.prototype.toPath = function toPath () {\r\n var path = new Path();\r\n var curvePoints = this.geometry().curvePoints();\r\n\r\n if (curvePoints.length > 0) {\r\n path.moveTo(curvePoints[0].x, curvePoints[0].y);\r\n\r\n for (var i = 1; i < curvePoints.length; i += 3) {\r\n path.curveTo(curvePoints[i], curvePoints[i + 1], curvePoints[i + 2]);\r\n }\r\n }\r\n\r\n return path;\r\n };\r\n\r\n Arc.prototype._containsPoint = function _containsPoint (point) {\r\n return this.geometry().containsPoint(point);\r\n };\r\n\r\n Arc.prototype._isOnPath = function _isOnPath (point) {\r\n return this.geometry()._isOnPath(point, this.options.stroke.width / 2);\r\n };\r\n\r\n Object.defineProperties( Arc.prototype, prototypeAccessors );\r\n\r\n return Arc;\r\n }(paintable(measurable(withGeometry(Element$1)))));\r\n\r\n var DEFAULT_FONT = \"12px sans-serif\";\r\n var DEFAULT_FILL = \"#000\";\r\n\r\n var Text = (function (superclass) {\r\n function Text(content, position, options) {\r\n if (position === void 0) { position = new Point(); }\r\n if (options === void 0) { options = {}; }\r\n\r\n superclass.call(this, options);\r\n\r\n this.content(content);\r\n this.position(position);\r\n\r\n if (!this.options.font) {\r\n this.options.font = DEFAULT_FONT;\r\n }\r\n\r\n if (!defined(this.options.fill)) {\r\n this.fill(DEFAULT_FILL);\r\n }\r\n }\r\n\r\n extendStatic(Text, superclass);\r\n Text.prototype = Object.create( superclass && superclass.prototype );\r\n Text.prototype.constructor = Text;\r\n Text.fn = Text.prototype;\r\n Text.fn.init = Text.fn.constructor;\r\n\r\n var prototypeAccessors = { nodeType: {} };\r\n\r\n prototypeAccessors.nodeType.get = function () {\r\n return \"Text\";\r\n };\r\n\r\n Text.prototype.content = function content (value) {\r\n if (defined(value)) {\r\n this.options.set(\"content\", value);\r\n return this;\r\n }\r\n\r\n return this.options.get(\"content\");\r\n };\r\n\r\n Text.prototype.measure = function measure () {\r\n var metrics = kendoUtil.measureText(this.content(), {\r\n font: this.options.get(\"font\")\r\n });\r\n\r\n return metrics;\r\n };\r\n\r\n Text.prototype.rect = function rect () {\r\n var size = this.measure();\r\n var pos = this.position().clone();\r\n return new Rect(pos, [ size.width, size.height ]);\r\n };\r\n\r\n Text.prototype.bbox = function bbox (transformation) {\r\n var combinedMatrix = toMatrix(this.currentTransform(transformation));\r\n return this.rect().bbox(combinedMatrix);\r\n };\r\n\r\n Text.prototype.rawBBox = function rawBBox () {\r\n return this.rect().bbox();\r\n };\r\n\r\n Text.prototype._containsPoint = function _containsPoint (point) {\r\n return this.rect().containsPoint(point);\r\n };\r\n\r\n Object.defineProperties( Text.prototype, prototypeAccessors );\r\n\r\n return Text;\r\n }(paintable(withPoints(Element$1, [ \"position\" ]))));\r\n\r\n var Image$1 = (function (superclass) {\r\n function Image(src, rect, options) {\r\n if (rect === void 0) { rect = new Rect(); }\r\n if (options === void 0) { options = {}; }\r\n\r\n superclass.call(this, options);\r\n\r\n this.src(src);\r\n this.rect(rect);\r\n }\r\n\r\n extendStatic(Image, superclass);\r\n Image.prototype = Object.create( superclass && superclass.prototype );\r\n Image.prototype.constructor = Image;\r\n Image.fn = Image.prototype;\r\n Image.fn.init = Image.fn.constructor;\r\n\r\n var prototypeAccessors = { nodeType: {} };\r\n\r\n prototypeAccessors.nodeType.get = function () {\r\n return \"Image\";\r\n };\r\n\r\n Image.prototype.src = function src (value) {\r\n if (defined(value)) {\r\n this.options.set(\"src\", value);\r\n return this;\r\n }\r\n\r\n return this.options.get(\"src\");\r\n };\r\n\r\n Image.prototype.bbox = function bbox (transformation) {\r\n var combinedMatrix = toMatrix(this.currentTransform(transformation));\r\n return this._rect.bbox(combinedMatrix);\r\n };\r\n\r\n Image.prototype.rawBBox = function rawBBox () {\r\n return this._rect.bbox();\r\n };\r\n\r\n Image.prototype._containsPoint = function _containsPoint (point) {\r\n return this._rect.containsPoint(point);\r\n };\r\n\r\n Image.prototype._hasFill = function _hasFill () {\r\n return this.src();\r\n };\r\n\r\n Object.defineProperties( Image.prototype, prototypeAccessors );\r\n\r\n return Image;\r\n }(withGeometry(Element$1, [ \"rect\" ])));\r\n\r\n var traversable = function (TBase, childrenField) { return (\r\n (function (TBase) {\r\n function anonymous () {\r\n TBase.apply(this, arguments);\r\n }\r\n\r\n extendStatic(anonymous, TBase);\r\n anonymous.prototype = Object.create( TBase && TBase.prototype );\r\n anonymous.prototype.constructor = anonymous;\r\n anonymous.fn = anonymous.prototype;\r\n anonymous.fn.init = anonymous.fn.constructor;\r\n\r\n anonymous.prototype.traverse = function traverse (callback) {\r\n var children = this[childrenField];\r\n\r\n for (var i = 0; i < children.length; i++) {\r\n var child = children[i];\r\n\r\n if (child.traverse) {\r\n child.traverse(callback);\r\n } else {\r\n callback(child);\r\n }\r\n }\r\n\r\n return this;\r\n };\r\n\r\n return anonymous;\r\n }(TBase))\r\n ); };\r\n\r\n var Group = (function (superclass) {\r\n function Group(options) {\r\n superclass.call(this, options);\r\n this.children = [];\r\n }\r\n\r\n extendStatic(Group, superclass);\r\n Group.prototype = Object.create( superclass && superclass.prototype );\r\n Group.prototype.constructor = Group;\r\n Group.fn = Group.prototype;\r\n Group.fn.init = Group.fn.constructor;\r\n\r\n var prototypeAccessors = { nodeType: {} };\r\n\r\n prototypeAccessors.nodeType.get = function () {\r\n return \"Group\";\r\n };\r\n\r\n Group.prototype.childrenChange = function childrenChange (action, items, index) {\r\n this.trigger(\"childrenChange\",{\r\n action: action,\r\n items: items,\r\n index: index\r\n });\r\n };\r\n\r\n Group.prototype.append = function append$1 () {\r\n append$1$1(this.children, arguments);\r\n this._reparent(arguments, this);\r\n\r\n this.childrenChange(\"add\", arguments);\r\n\r\n return this;\r\n };\r\n\r\n Group.prototype.insert = function insert (index, element) {\r\n this.children.splice(index, 0, element);\r\n element.parent = this;\r\n\r\n this.childrenChange(\"add\", [ element ], index);\r\n\r\n return this;\r\n };\r\n\r\n Group.prototype.insertAt = function insertAt (element, index) {\r\n return this.insert(index, element);\r\n };\r\n\r\n Group.prototype.remove = function remove (element) {\r\n var index = this.children.indexOf(element);\r\n if (index >= 0) {\r\n this.children.splice(index, 1);\r\n element.parent = null;\r\n this.childrenChange(\"remove\", [ element ], index);\r\n }\r\n\r\n return this;\r\n };\r\n\r\n Group.prototype.removeAt = function removeAt (index) {\r\n if (0 <= index && index < this.children.length) {\r\n var element = this.children[index];\r\n this.children.splice(index, 1);\r\n element.parent = null;\r\n this.childrenChange(\"remove\", [ element ], index);\r\n }\r\n\r\n return this;\r\n };\r\n\r\n Group.prototype.clear = function clear () {\r\n var items = this.children;\r\n this.children = [];\r\n this._reparent(items, null);\r\n\r\n this.childrenChange(\"remove\", items, 0);\r\n\r\n return this;\r\n };\r\n\r\n Group.prototype.bbox = function bbox (transformation) {\r\n return elementsBoundingBox(this.children, true, this.currentTransform(transformation));\r\n };\r\n\r\n Group.prototype.rawBBox = function rawBBox () {\r\n return elementsBoundingBox(this.children, false);\r\n };\r\n\r\n Group.prototype._clippedBBox = function _clippedBBox (transformation) {\r\n return elementsClippedBoundingBox(this.children, this.currentTransform(transformation));\r\n };\r\n\r\n Group.prototype.currentTransform = function currentTransform (transformation) {\r\n return Element$1.prototype.currentTransform.call(this, transformation) || null;\r\n };\r\n\r\n Group.prototype.containsPoint = function containsPoint (point, parentTransform) {\r\n if (this.visible()) {\r\n var children = this.children;\r\n var transform = this.currentTransform(parentTransform);\r\n for (var idx = 0; idx < children.length; idx++) {\r\n if (children[idx].containsPoint(point, transform)) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n Group.prototype._reparent = function _reparent (elements, newParent) {\r\n var this$1$1 = this;\r\n\r\n for (var i = 0; i < elements.length; i++) {\r\n var child = elements[i];\r\n var parent = child.parent;\r\n if (parent && parent !== this$1$1 && parent.remove) {\r\n parent.remove(child);\r\n }\r\n\r\n child.parent = newParent;\r\n }\r\n };\r\n\r\n Object.defineProperties( Group.prototype, prototypeAccessors );\r\n\r\n return Group;\r\n }(traversable(Element$1, \"children\")));\r\n\r\n function translateToPoint(point, bbox, element) {\r\n var transofrm = element.transform() || transform$1();\r\n var matrix = transofrm.matrix();\r\n matrix.e += point.x - bbox.origin.x;\r\n matrix.f += point.y - bbox.origin.y;\r\n\r\n transofrm.matrix(matrix);\r\n element.transform(transofrm);\r\n }\r\n\r\n function alignStart(size, rect, align, axis, sizeField) {\r\n var start;\r\n if (align === \"start\") {\r\n start = rect.origin[axis];\r\n } else if (align === \"end\") {\r\n start = rect.origin[axis] + rect.size[sizeField] - size;\r\n } else {\r\n start = rect.origin[axis] + (rect.size[sizeField] - size) / 2;\r\n }\r\n\r\n return start;\r\n }\r\n\r\n function alignStartReverse(size, rect, align, axis, sizeField) {\r\n var start;\r\n if (align === \"start\") {\r\n start = rect.origin[axis] + rect.size[sizeField] - size;\r\n } else if (align === \"end\") {\r\n start = rect.origin[axis];\r\n } else {\r\n start = rect.origin[axis] + (rect.size[sizeField] - size) / 2;\r\n }\r\n\r\n return start;\r\n }\r\n\r\n var DEFAULT_OPTIONS = {\r\n alignContent: \"start\",\r\n justifyContent: \"start\",\r\n alignItems: \"start\",\r\n spacing: 0,\r\n orientation: \"horizontal\",\r\n lineSpacing: 0,\r\n wrap: true,\r\n revers: false\r\n };\r\n\r\n var forEach = function (elements, callback) {\r\n elements.forEach(callback);\r\n };\r\n\r\n var forEachReverse = function (elements, callback) {\r\n var length = elements.length;\r\n\r\n for (var idx = length - 1; idx >= 0; idx--) {\r\n callback(elements[idx], idx);\r\n }\r\n };\r\n\r\n var Layout = (function (Group$$1) {\r\n function Layout(rect, options) {\r\n Group$$1.call(this, $.extend({}, DEFAULT_OPTIONS, options));\r\n this._rect = rect;\r\n this._fieldMap = {};\r\n }\r\n\r\n extendStatic(Layout, Group$$1);\r\n Layout.prototype = Object.create( Group$$1 && Group$$1.prototype );\r\n Layout.prototype.constructor = Layout;\r\n Layout.fn = Layout.prototype;\r\n Layout.fn.init = Layout.fn.constructor;\r\n\r\n Layout.prototype.rect = function rect (value) {\r\n if (value) {\r\n this._rect = value;\r\n return this;\r\n }\r\n\r\n return this._rect;\r\n };\r\n\r\n Layout.prototype._initMap = function _initMap () {\r\n var options = this.options;\r\n var fieldMap = this._fieldMap;\r\n if (options.orientation === \"horizontal\") {\r\n fieldMap.sizeField = \"width\";\r\n fieldMap.groupsSizeField = \"height\";\r\n fieldMap.groupAxis = \"x\";\r\n fieldMap.groupsAxis = \"y\";\r\n } else {\r\n fieldMap.sizeField = \"height\";\r\n fieldMap.groupsSizeField = \"width\";\r\n fieldMap.groupAxis = \"y\";\r\n fieldMap.groupsAxis = \"x\";\r\n }\r\n\r\n if (options.reverse) {\r\n this.forEach = forEachReverse;\r\n this.justifyAlign = alignStartReverse;\r\n } else {\r\n this.forEach = forEach;\r\n this.justifyAlign = alignStart;\r\n }\r\n };\r\n\r\n Layout.prototype.reflow = function reflow () {\r\n var this$1$1 = this;\r\n\r\n if (!this._rect || this.children.length === 0) {\r\n return;\r\n }\r\n this._initMap();\r\n\r\n if (this.options.transform) {\r\n this.transform(null);\r\n }\r\n\r\n var options = this.options;\r\n var rect = this._rect;\r\n var ref = this._initGroups();\r\n var groups = ref.groups;\r\n var groupsSize = ref.groupsSize;\r\n var ref$1 = this._fieldMap;\r\n var sizeField = ref$1.sizeField;\r\n var groupsSizeField = ref$1.groupsSizeField;\r\n var groupAxis = ref$1.groupAxis;\r\n var groupsAxis = ref$1.groupsAxis;\r\n var groupOrigin = new Point();\r\n var elementOrigin = new Point();\r\n var size = new Size();\r\n var groupStart = alignStart(groupsSize, rect, options.alignContent, groupsAxis, groupsSizeField);\r\n var elementStart, group, groupBox;\r\n\r\n var arrangeElements = function (bbox, idx) {\r\n var element = group.elements[idx];\r\n\r\n elementOrigin[groupAxis] = elementStart;\r\n elementOrigin[groupsAxis] = alignStart(bbox.size[groupsSizeField], groupBox, options.alignItems, groupsAxis, groupsSizeField);\r\n translateToPoint(elementOrigin, bbox, element);\r\n elementStart += bbox.size[sizeField] + options.spacing;\r\n };\r\n\r\n for (var groupIdx = 0; groupIdx < groups.length; groupIdx++) {\r\n group = groups[groupIdx];\r\n groupOrigin[groupAxis] = elementStart = this$1$1.justifyAlign(group.size, rect, options.justifyContent, groupAxis, sizeField);\r\n groupOrigin[groupsAxis] = groupStart;\r\n size[sizeField] = group.size;\r\n size[groupsSizeField] = group.lineSize;\r\n groupBox = new Rect(groupOrigin, size);\r\n this$1$1.forEach(group.bboxes, arrangeElements);\r\n\r\n groupStart += group.lineSize + options.lineSpacing;\r\n }\r\n\r\n if (!options.wrap && group.size > rect.size[sizeField]) {\r\n var scale = rect.size[sizeField] / groupBox.size[sizeField];\r\n var scaledStart = groupBox.topLeft().scale(scale, scale);\r\n var scaledSize = groupBox.size[groupsSizeField] * scale;\r\n var newStart = alignStart(scaledSize, rect, options.alignContent, groupsAxis, groupsSizeField);\r\n var transform = transform$1();\r\n if (groupAxis === \"x\") {\r\n transform.translate(rect.origin.x - scaledStart.x, newStart - scaledStart.y);\r\n } else {\r\n transform.translate(newStart - scaledStart.x, rect.origin.y - scaledStart.y);\r\n }\r\n transform.scale(scale, scale);\r\n\r\n this.transform(transform);\r\n }\r\n };\r\n\r\n Layout.prototype._initGroups = function _initGroups () {\r\n var this$1$1 = this;\r\n\r\n var ref = this;\r\n var options = ref.options;\r\n var children = ref.children;\r\n var lineSpacing = options.lineSpacing;\r\n var wrap = options.wrap;\r\n var spacing = options.spacing;\r\n var sizeField = this._fieldMap.sizeField;\r\n var group = this._newGroup();\r\n var groups = [];\r\n var addGroup = function() {\r\n groups.push(group);\r\n groupsSize += group.lineSize + lineSpacing;\r\n };\r\n var groupsSize = -lineSpacing;\r\n\r\n for (var idx = 0; idx < children.length; idx++) {\r\n var element = children[idx];\r\n var bbox = children[idx].clippedBBox();\r\n if (element.visible() && bbox) {\r\n if (wrap && group.size + bbox.size[sizeField] + spacing > this$1$1._rect.size[sizeField]) {\r\n if (group.bboxes.length === 0) {\r\n this$1$1._addToGroup(group, bbox, element);\r\n addGroup();\r\n group = this$1$1._newGroup();\r\n } else {\r\n addGroup();\r\n group = this$1$1._newGroup();\r\n this$1$1._addToGroup(group, bbox, element);\r\n }\r\n } else {\r\n this$1$1._addToGroup(group, bbox, element);\r\n }\r\n }\r\n }\r\n\r\n if (group.bboxes.length) {\r\n addGroup();\r\n }\r\n\r\n return {\r\n groups: groups,\r\n groupsSize: groupsSize\r\n };\r\n };\r\n\r\n Layout.prototype._addToGroup = function _addToGroup (group, bbox, element) {\r\n group.size += bbox.size[this._fieldMap.sizeField] + this.options.spacing;\r\n group.lineSize = Math.max(bbox.size[this._fieldMap.groupsSizeField], group.lineSize);\r\n group.bboxes.push(bbox);\r\n group.elements.push(element);\r\n };\r\n\r\n Layout.prototype._newGroup = function _newGroup () {\r\n return {\r\n lineSize: 0,\r\n size: -this.options.spacing,\r\n bboxes: [],\r\n elements: []\r\n };\r\n };\r\n\r\n return Layout;\r\n }(Group));\r\n\r\n var Rect$2 = (function (superclass) {\r\n function Rect$$1(geometry, options) {\r\n if (geometry === void 0) { geometry = new Rect(); }\r\n if (options === void 0) { options = {}; }\r\n\r\n superclass.call(this, options);\r\n\r\n this.geometry(geometry);\r\n\r\n if (!defined(this.options.stroke)) {\r\n this.stroke(\"#000\");\r\n }\r\n }\r\n\r\n extendStatic(Rect$$1, superclass);\r\n Rect$$1.prototype = Object.create( superclass && superclass.prototype );\r\n Rect$$1.prototype.constructor = Rect$$1;\r\n Rect$$1.fn = Rect$$1.prototype;\r\n Rect$$1.fn.init = Rect$$1.fn.constructor;\r\n\r\n var prototypeAccessors = { nodeType: {} };\r\n\r\n prototypeAccessors.nodeType.get = function () {\r\n return \"Rect\";\r\n };\r\n\r\n Rect$$1.prototype._bbox = function _bbox (matrix) {\r\n return this._geometry.bbox(matrix);\r\n };\r\n\r\n Rect$$1.prototype.rawBBox = function rawBBox () {\r\n return this._geometry.bbox();\r\n };\r\n\r\n Rect$$1.prototype._containsPoint = function _containsPoint (point) {\r\n return this._geometry.containsPoint(point);\r\n };\r\n\r\n Rect$$1.prototype._isOnPath = function _isOnPath (point) {\r\n return this.geometry()._isOnPath(point, this.options.stroke.width / 2);\r\n };\r\n\r\n Object.defineProperties( Rect$$1.prototype, prototypeAccessors );\r\n\r\n return Rect$$1;\r\n }(paintable(measurable(withGeometry(Element$1)))));\r\n\r\n function alignElements(elements, rect, alignment, axis, sizeField) {\r\n for (var idx = 0; idx < elements.length; idx++) {\r\n var bbox = elements[idx].clippedBBox();\r\n if (bbox) {\r\n var point = bbox.origin.clone();\r\n point[axis] = alignStart(bbox.size[sizeField], rect, alignment || \"start\", axis, sizeField);\r\n translateToPoint(point, bbox, elements[idx]);\r\n }\r\n }\r\n }\r\n\r\n function align(elements, rect, alignment) {\r\n alignElements(elements, rect, alignment, \"x\", \"width\");\r\n }\r\n\r\n function vAlign(elements, rect, alignment) {\r\n alignElements(elements, rect, alignment, \"y\", \"height\");\r\n }\r\n\r\n function stackElements(elements, stackAxis, otherAxis, sizeField) {\r\n if (elements.length > 1) {\r\n var origin = new Point();\r\n var previousBBox = elements[0].bbox;\r\n\r\n for (var idx = 1; idx < elements.length; idx++) {\r\n var element = elements[idx].element;\r\n var bbox = elements[idx].bbox;\r\n origin[stackAxis] = previousBBox.origin[stackAxis] + previousBBox.size[sizeField];\r\n origin[otherAxis] = bbox.origin[otherAxis];\r\n translateToPoint(origin, bbox, element);\r\n bbox.origin[stackAxis] = origin[stackAxis];\r\n previousBBox = bbox;\r\n }\r\n }\r\n }\r\n\r\n function createStackElements(elements) {\r\n var stackElements = [];\r\n\r\n for (var idx = 0; idx < elements.length; idx++) {\r\n var element = elements[idx];\r\n var bbox = element.clippedBBox();\r\n if (bbox) {\r\n stackElements.push({\r\n element: element,\r\n bbox: bbox\r\n });\r\n }\r\n }\r\n\r\n return stackElements;\r\n }\r\n\r\n function stack(elements) {\r\n stackElements(createStackElements(elements), \"x\", \"y\", \"width\");\r\n }\r\n\r\n function vStack(elements) {\r\n stackElements(createStackElements(elements), \"y\", \"x\", \"height\");\r\n }\r\n\r\n function getStacks(elements, rect, sizeField) {\r\n var maxSize = rect.size[sizeField];\r\n var stacks = [];\r\n var stack = [];\r\n var stackSize = 0;\r\n var element, bbox;\r\n\r\n var addElementToStack = function() {\r\n stack.push({\r\n element: element,\r\n bbox: bbox\r\n });\r\n };\r\n\r\n for (var idx = 0; idx < elements.length; idx++) {\r\n element = elements[idx];\r\n\r\n bbox = element.clippedBBox();\r\n if (bbox) {\r\n var size = bbox.size[sizeField];\r\n if (stackSize + size > maxSize) {\r\n if (stack.length) {\r\n stacks.push(stack);\r\n stack = [];\r\n addElementToStack();\r\n stackSize = size;\r\n } else {\r\n addElementToStack();\r\n stacks.push(stack);\r\n stack = [];\r\n stackSize = 0;\r\n }\r\n } else {\r\n addElementToStack();\r\n stackSize += size;\r\n }\r\n }\r\n }\r\n\r\n if (stack.length) {\r\n stacks.push(stack);\r\n }\r\n\r\n return stacks;\r\n }\r\n\r\n function wrapElements(elements, rect, axis, otherAxis, sizeField) {\r\n var stacks = getStacks(elements, rect, sizeField);\r\n var origin = rect.origin.clone();\r\n var result = [];\r\n\r\n for (var idx = 0; idx < stacks.length; idx++) {\r\n var stack = stacks[idx];\r\n var startElement = stack[0];\r\n origin[otherAxis] = startElement.bbox.origin[otherAxis];\r\n translateToPoint(origin, startElement.bbox, startElement.element);\r\n startElement.bbox.origin[axis] = origin[axis];\r\n stackElements(stack, axis, otherAxis, sizeField);\r\n result.push([]);\r\n for (var elementIdx = 0; elementIdx < stack.length; elementIdx++) {\r\n result[idx].push(stack[elementIdx].element);\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n function wrap(elements, rect) {\r\n return wrapElements(elements, rect, \"x\", \"y\", \"width\");\r\n }\r\n\r\n function vWrap(elements, rect) {\r\n return wrapElements(elements, rect, \"y\", \"x\", \"height\");\r\n }\r\n\r\n function fit(element, rect) {\r\n var bbox = element.clippedBBox();\r\n if (bbox) {\r\n var elementSize = bbox.size;\r\n var rectSize = rect.size;\r\n if (rectSize.width < elementSize.width || rectSize.height < elementSize.height) {\r\n var scale = Math.min(rectSize.width / elementSize.width, rectSize.height / elementSize.height);\r\n var transform = element.transform() || transform$1();\r\n transform.scale(scale, scale);\r\n element.transform(transform);\r\n }\r\n }\r\n }\r\n\r\n var StopsArray = (function (ElementsArray$$1) {\r\n function StopsArray () {\r\n ElementsArray$$1.apply(this, arguments);\r\n }\r\n\r\n extendStatic(StopsArray, ElementsArray$$1);\r\n StopsArray.prototype = Object.create( ElementsArray$$1 && ElementsArray$$1.prototype );\r\n StopsArray.prototype.constructor = StopsArray;\r\n StopsArray.fn = StopsArray.prototype;\r\n StopsArray.fn.init = StopsArray.fn.constructor;\r\n\r\n StopsArray.prototype._change = function _change () {\r\n this.optionsChange({\r\n field: \"stops\"\r\n });\r\n };\r\n\r\n return StopsArray;\r\n }(ElementsArray));\r\n\r\n function optionsAccessor(name) {\r\n return function(value) {\r\n if (defined(value)) {\r\n this.options.set(name, value);\r\n return this;\r\n }\r\n\r\n return this.options.get(name);\r\n };\r\n }\r\n\r\n function defineOptionsAccessors(fn, names) {\r\n for (var i = 0; i < names.length; i++) {\r\n fn[names[i]] = optionsAccessor(names[i]);\r\n }\r\n }\r\n\r\n var withOptions = function (TBase, names) {\r\n var result = (function (TBase) {\r\n function result () {\r\n TBase.apply(this, arguments);\r\n }extendStatic(result, TBase);\r\n result.prototype = Object.create( TBase && TBase.prototype );\r\n result.prototype.constructor = result;\r\n result.fn = result.prototype;\r\n result.fn.init = result.fn.constructor;\r\n\r\n return result;\r\n }(TBase));\r\n defineOptionsAccessors(result.prototype, names);\r\n\r\n return result;\r\n };\r\n\r\n var options = [ \"offset\", \"color\", \"opacity\" ];\r\n\r\n var GradientStop = (function (superclass) {\r\n function GradientStop(offset, color, opacity) {\r\n superclass.call(this);\r\n\r\n this.options = new OptionsStore({\r\n offset: offset,\r\n color: color,\r\n opacity: defined(opacity) ? opacity : 1\r\n });\r\n\r\n this.options.addObserver(this);\r\n }\r\n\r\n extendStatic(GradientStop, superclass);\r\n GradientStop.prototype = Object.create( superclass && superclass.prototype );\r\n GradientStop.prototype.constructor = GradientStop;\r\n GradientStop.fn = GradientStop.prototype;\r\n GradientStop.fn.init = GradientStop.fn.constructor;\r\n\r\n GradientStop.create = function create (arg) {\r\n if (defined(arg)) {\r\n var stop;\r\n if (arg instanceof GradientStop) {\r\n stop = arg;\r\n } else if (arg.length > 1) {\r\n stop = new GradientStop(arg[0], arg[1], arg[2]);\r\n } else {\r\n stop = new GradientStop(arg.offset, arg.color, arg.opacity);\r\n }\r\n\r\n return stop;\r\n }\r\n };\r\n\r\n return GradientStop;\r\n }(withOptions(HasObservers, options)));\r\n\r\n var Gradient = (function (HasObservers$$1) {\r\n function Gradient(options) {\r\n if (options === void 0) { options = {}; }\r\n\r\n HasObservers$$1.call(this);\r\n\r\n this.stops = new StopsArray(this._createStops(options.stops));\r\n this.stops.addObserver(this);\r\n this._userSpace = options.userSpace;\r\n this.id = definitionId();\r\n }\r\n\r\n extendStatic(Gradient, HasObservers$$1);\r\n Gradient.prototype = Object.create( HasObservers$$1 && HasObservers$$1.prototype );\r\n Gradient.prototype.constructor = Gradient;\r\n Gradient.fn = Gradient.prototype;\r\n Gradient.fn.init = Gradient.fn.constructor;\r\n\r\n var prototypeAccessors = { nodeType: {} };\r\n\r\n prototypeAccessors.nodeType.get = function () {\r\n return \"Gradient\";\r\n };\r\n\r\n Gradient.prototype.userSpace = function userSpace (value) {\r\n if (defined(value)) {\r\n this._userSpace = value;\r\n this.optionsChange();\r\n return this;\r\n }\r\n\r\n return this._userSpace;\r\n };\r\n\r\n Gradient.prototype._createStops = function _createStops (stops) {\r\n if (stops === void 0) { stops = []; }\r\n\r\n var result = [];\r\n for (var idx = 0; idx < stops.length; idx++) {\r\n result.push(GradientStop.create(stops[idx]));\r\n }\r\n\r\n return result;\r\n };\r\n\r\n Gradient.prototype.addStop = function addStop (offset, color, opacity) {\r\n this.stops.push(new GradientStop(offset, color, opacity));\r\n };\r\n\r\n Gradient.prototype.removeStop = function removeStop (stop) {\r\n var index = this.stops.indexOf(stop);\r\n if (index >= 0) {\r\n this.stops.splice(index, 1);\r\n }\r\n };\r\n\r\n Gradient.prototype.optionsChange = function optionsChange (e) {\r\n this.trigger(\"optionsChange\", {\r\n field: \"gradient\" + (e ? \".\" + e.field : \"\"),\r\n value: this\r\n });\r\n };\r\n\r\n Gradient.prototype.geometryChange = function geometryChange () {\r\n this.optionsChange();\r\n };\r\n\r\n Object.defineProperties( Gradient.prototype, prototypeAccessors );\r\n\r\n return Gradient;\r\n }(HasObservers));\r\n\r\n var points$1 = [ \"start\", \"end\" ];\r\n\r\n var LinearGradient = (function (superclass) {\r\n function LinearGradient(options) {\r\n if (options === void 0) { options = {}; }\r\n\r\n superclass.call(this, options);\r\n\r\n this.start(options.start || new Point());\r\n this.end(options.end || new Point(1, 0));\r\n }\r\n\r\n extendStatic(LinearGradient, superclass);\r\n LinearGradient.prototype = Object.create( superclass && superclass.prototype );\r\n LinearGradient.prototype.constructor = LinearGradient;\r\n LinearGradient.fn = LinearGradient.prototype;\r\n LinearGradient.fn.init = LinearGradient.fn.constructor;\r\n\r\n return LinearGradient;\r\n }(withPoints(Gradient, points$1)));\r\n\r\n var RadialGradient = (function (superclass) {\r\n function RadialGradient(options) {\r\n if (options === void 0) { options = {}; }\r\n\r\n superclass.call(this, options);\r\n\r\n this.center(options.center || new Point());\r\n this._radius = defined(options.radius) ? options.radius : 1;\r\n this._fallbackFill = options.fallbackFill;\r\n }\r\n\r\n extendStatic(RadialGradient, superclass);\r\n RadialGradient.prototype = Object.create( superclass && superclass.prototype );\r\n RadialGradient.prototype.constructor = RadialGradient;\r\n RadialGradient.fn = RadialGradient.prototype;\r\n RadialGradient.fn.init = RadialGradient.fn.constructor;\r\n\r\n RadialGradient.prototype.radius = function radius (value) {\r\n if (defined(value)) {\r\n this._radius = value;\r\n this.geometryChange();\r\n return this;\r\n }\r\n\r\n return this._radius;\r\n };\r\n\r\n RadialGradient.prototype.fallbackFill = function fallbackFill (value) {\r\n if (defined(value)) {\r\n this._fallbackFill = value;\r\n this.optionsChange();\r\n return this;\r\n }\r\n\r\n return this._fallbackFill;\r\n };\r\n\r\n return RadialGradient;\r\n }(withPoints(Gradient, [ \"center\" ])));\r\n\r\n function swing(position) {\r\n return 0.5 - Math.cos(position * Math.PI) / 2;\r\n }\r\n\r\n function linear(position) {\r\n return position;\r\n }\r\n\r\n function easeOutElastic(position, time, start, diff) {\r\n var s = 1.70158,\r\n p = 0,\r\n a = diff;\r\n\r\n if (position === 0) {\r\n return start;\r\n }\r\n\r\n if (position === 1) {\r\n return start + diff;\r\n }\r\n\r\n if (!p) {\r\n p = 0.5;\r\n }\r\n\r\n if (a < Math.abs(diff)) {\r\n a = diff;\r\n s = p / 4;\r\n } else {\r\n s = p / (2 * Math.PI) * Math.asin(diff / a);\r\n }\r\n\r\n return a * Math.pow(2, -10 * position) *\r\n Math.sin((Number(position) - s) * (1.1 * Math.PI) / p) + diff + start;\r\n }\r\n\r\n var easingFunctions = {\r\n \tswing: swing,\r\n \tlinear: linear,\r\n \teaseOutElastic: easeOutElastic\r\n };\r\n\r\n var instance;\r\n\r\n var AnimationFactory = (function (Class$$1) {\r\n function AnimationFactory() {\r\n Class$$1.call(this);\r\n\r\n this._items = [];\r\n }\r\n\r\n extendStatic(AnimationFactory, Class$$1);\r\n AnimationFactory.prototype = Object.create( Class$$1 && Class$$1.prototype );\r\n AnimationFactory.prototype.constructor = AnimationFactory;\r\n AnimationFactory.fn = AnimationFactory.prototype;\r\n AnimationFactory.fn.init = AnimationFactory.fn.constructor;\r\n\r\n var staticAccessors = { current: {} };\r\n\r\n staticAccessors.current.get = function () {\r\n if (!instance) {\r\n instance = new AnimationFactory();\r\n }\r\n\r\n return instance;\r\n };\r\n\r\n AnimationFactory.prototype.register = function register (name, type) {\r\n this._items.push({\r\n name: name,\r\n type: type\r\n });\r\n };\r\n\r\n AnimationFactory.prototype.create = function create (element, options) {\r\n var items = this._items;\r\n var match;\r\n\r\n if (options && options.type) {\r\n var type = options.type.toLowerCase();\r\n for (var i = 0; i < items.length; i++) {\r\n if (items[i].name.toLowerCase() === type) {\r\n match = items[i];\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (match) {\r\n return new match.type(element, options);\r\n }\r\n };\r\n\r\n Object.defineProperties( AnimationFactory, staticAccessors );\r\n\r\n return AnimationFactory;\r\n }(Class));\r\n\r\n var Animation = (function (Class$$1) {\r\n function Animation(element, options) {\r\n Class$$1.call(this);\r\n\r\n this.options = $.extend({}, this.options, options);\r\n this.element = element;\r\n }\r\n\r\n extendStatic(Animation, Class$$1);\r\n Animation.prototype = Object.create( Class$$1 && Class$$1.prototype );\r\n Animation.prototype.constructor = Animation;\r\n Animation.fn = Animation.prototype;\r\n Animation.fn.init = Animation.fn.constructor;\r\n\r\n var prototypeAccessors = { options: {} };\r\n\r\n Animation.create = function create (type, element, options) {\r\n return AnimationFactory.current.create(type, element, options);\r\n };\r\n\r\n prototypeAccessors.options.get = function () {\r\n return this._options || {\r\n duration: 500,\r\n easing: \"swing\"\r\n };\r\n };\r\n\r\n prototypeAccessors.options.set = function (value) {\r\n this._options = value;\r\n };\r\n\r\n Animation.prototype.setup = function setup () {};\r\n Animation.prototype.step = function step () {};\r\n\r\n Animation.prototype.play = function play () {\r\n var this$1$1 = this;\r\n\r\n var options = this.options;\r\n var duration = options.duration;\r\n var delay = options.delay; if (delay === void 0) { delay = 0; }\r\n var easing = easingFunctions[options.easing];\r\n var start = now() + delay;\r\n var finish = start + duration;\r\n\r\n if (duration === 0) {\r\n this.step(1);\r\n this.abort();\r\n } else {\r\n setTimeout(function () {\r\n var loop = function () {\r\n if (this$1$1._stopped) {\r\n return;\r\n }\r\n\r\n var wallTime = now();\r\n\r\n var time = limitValue(wallTime - start, 0, duration);\r\n var position = time / duration;\r\n var easingPosition = easing(position, time, 0, 1, duration);\r\n\r\n this$1$1.step(easingPosition);\r\n\r\n if (wallTime < finish) {\r\n kendo.animationFrame(loop);\r\n } else {\r\n this$1$1.abort();\r\n }\r\n };\r\n\r\n loop();\r\n }, delay);\r\n }\r\n };\r\n\r\n Animation.prototype.abort = function abort () {\r\n this._stopped = true;\r\n };\r\n\r\n Animation.prototype.destroy = function destroy () {\r\n this.abort();\r\n };\r\n\r\n Object.defineProperties( Animation.prototype, prototypeAccessors );\r\n\r\n return Animation;\r\n }(Class));\r\n\r\n var instance$1;\r\n\r\n var PathParser = (function (Class$$1) {\r\n function PathParser () {\r\n Class$$1.apply(this, arguments);\r\n }\r\n\r\n extendStatic(PathParser, Class$$1);\r\n PathParser.prototype = Object.create( Class$$1 && Class$$1.prototype );\r\n PathParser.prototype.constructor = PathParser;\r\n PathParser.fn = PathParser.prototype;\r\n PathParser.fn.init = PathParser.fn.constructor;\r\n\r\n var staticAccessors = { current: {} };\r\n\r\n staticAccessors.current.get = function () {\r\n if (!instance$1) {\r\n instance$1 = new PathParser();\r\n }\r\n\r\n return instance$1;\r\n };\r\n\r\n PathParser.prototype.parse = function parse (str, options) {\r\n var multiPath = new MultiPath(options);\r\n return parsePath(multiPath, str);\r\n };\r\n\r\n Object.defineProperties( PathParser, staticAccessors );\r\n\r\n return PathParser;\r\n }(Class));\r\n\r\n var BaseNode = (function (Class$$1) {\r\n function BaseNode(srcElement) {\r\n Class$$1.call(this);\r\n\r\n this.childNodes = [];\r\n this.parent = null;\r\n\r\n if (srcElement) {\r\n this.srcElement = srcElement;\r\n this.observe();\r\n }\r\n }\r\n\r\n extendStatic(BaseNode, Class$$1);\r\n BaseNode.prototype = Object.create( Class$$1 && Class$$1.prototype );\r\n BaseNode.prototype.constructor = BaseNode;\r\n BaseNode.fn = BaseNode.prototype;\r\n BaseNode.fn.init = BaseNode.fn.constructor;\r\n\r\n BaseNode.prototype.destroy = function destroy () {\r\n var this$1$1 = this;\r\n\r\n if (this.srcElement) {\r\n this.srcElement.removeObserver(this);\r\n }\r\n\r\n var children = this.childNodes;\r\n for (var i = 0; i < children.length; i++) {\r\n this$1$1.childNodes[i].destroy();\r\n }\r\n\r\n this.parent = null;\r\n };\r\n\r\n BaseNode.prototype.load = function load () {};\r\n\r\n BaseNode.prototype.observe = function observe () {\r\n if (this.srcElement) {\r\n this.srcElement.addObserver(this);\r\n }\r\n };\r\n\r\n BaseNode.prototype.append = function append (node) {\r\n this.childNodes.push(node);\r\n node.parent = this;\r\n };\r\n\r\n BaseNode.prototype.insertAt = function insertAt (node, pos) {\r\n this.childNodes.splice(pos, 0, node);\r\n node.parent = this;\r\n };\r\n\r\n BaseNode.prototype.remove = function remove (index, count) {\r\n var this$1$1 = this;\r\n\r\n var end = index + count;\r\n for (var i = index; i < end; i++) {\r\n this$1$1.childNodes[i].removeSelf();\r\n }\r\n this.childNodes.splice(index, count);\r\n };\r\n\r\n BaseNode.prototype.removeSelf = function removeSelf () {\r\n this.clear();\r\n this.destroy();\r\n };\r\n\r\n BaseNode.prototype.clear = function clear () {\r\n this.remove(0, this.childNodes.length);\r\n };\r\n\r\n BaseNode.prototype.invalidate = function invalidate () {\r\n if (this.parent) {\r\n this.parent.invalidate();\r\n }\r\n };\r\n\r\n BaseNode.prototype.geometryChange = function geometryChange () {\r\n this.invalidate();\r\n };\r\n\r\n BaseNode.prototype.optionsChange = function optionsChange () {\r\n this.invalidate();\r\n };\r\n\r\n BaseNode.prototype.childrenChange = function childrenChange (e) {\r\n if (e.action === \"add\") {\r\n this.load(e.items, e.index);\r\n } else if (e.action === \"remove\") {\r\n this.remove(e.index, e.items.length);\r\n }\r\n\r\n this.invalidate();\r\n };\r\n\r\n return BaseNode;\r\n }(Class));\r\n\r\n var events = [\r\n \"click\",\r\n \"mouseenter\",\r\n \"mouseleave\",\r\n \"mousemove\",\r\n \"resize\"\r\n ];\r\n\r\n var Surface$2 = (function (Observable$$1) {\r\n function Surface(element, options) {\r\n Observable$$1.call(this);\r\n\r\n this.options = $.extend({}, options);\r\n this.element = element;\r\n this.element._kendoExportVisual = this.exportVisual.bind(this);\r\n\r\n this._click = this._handler(\"click\");\r\n this._mouseenter = this._handler(\"mouseenter\");\r\n this._mouseleave = this._handler(\"mouseleave\");\r\n this._mousemove = this._handler(\"mousemove\");\r\n\r\n this._visual = new Group();\r\n\r\n elementSize(element, this.options);\r\n\r\n this.bind(events, this.options);\r\n\r\n this._enableTracking();\r\n }\r\n\r\n extendStatic(Surface, Observable$$1);\r\n Surface.prototype = Object.create( Observable$$1 && Observable$$1.prototype );\r\n Surface.prototype.constructor = Surface;\r\n Surface.fn = Surface.prototype;\r\n Surface.fn.init = Surface.fn.constructor;\r\n\r\n Surface.prototype.draw = function draw (element) {\r\n this._visual.children.push(element);\r\n };\r\n\r\n Surface.prototype.clear = function clear () {\r\n this._visual.children = [];\r\n };\r\n\r\n Surface.prototype.destroy = function destroy () {\r\n this._visual = null;\r\n this.element._kendoExportVisual = null;\r\n this.unbind();\r\n };\r\n\r\n Surface.prototype.eventTarget = function eventTarget (e) {\r\n var this$1$1 = this;\r\n\r\n var domNode = eventElement(e);\r\n var node;\r\n\r\n while (!node && domNode) {\r\n node = domNode._kendoNode;\r\n if (domNode === this$1$1.element) {\r\n break;\r\n }\r\n\r\n domNode = domNode.parentElement;\r\n }\r\n\r\n if (node) {\r\n return node.srcElement;\r\n }\r\n };\r\n\r\n Surface.prototype.exportVisual = function exportVisual () {\r\n return this._visual;\r\n };\r\n\r\n Surface.prototype.getSize = function getSize () {\r\n return elementSize(this.element);\r\n };\r\n\r\n Surface.prototype.currentSize = function currentSize (size) {\r\n if (size) {\r\n this._size = size;\r\n } else {\r\n return this._size;\r\n }\r\n };\r\n\r\n Surface.prototype.setSize = function setSize (size) {\r\n elementSize(this.element, size);\r\n\r\n this.currentSize(size);\r\n this._resize();\r\n };\r\n\r\n Surface.prototype.resize = function resize (force) {\r\n var size = this.getSize();\r\n var currentSize = this.currentSize();\r\n\r\n if (force || (size.width > 0 || size.height > 0) && (!currentSize || size.width !== currentSize.width || size.height !== currentSize.height)) {\r\n this.currentSize(size);\r\n this._resize(size, force);\r\n this.trigger(\"resize\", size);\r\n }\r\n };\r\n\r\n Surface.prototype.size = function size (value) {\r\n if (!value) {\r\n return this.getSize();\r\n }\r\n\r\n this.setSize(value);\r\n };\r\n\r\n Surface.prototype.suspendTracking = function suspendTracking () {\r\n this._suspendedTracking = true;\r\n };\r\n\r\n Surface.prototype.resumeTracking = function resumeTracking () {\r\n this._suspendedTracking = false;\r\n };\r\n\r\n Surface.prototype._enableTracking = function _enableTracking () {};\r\n\r\n Surface.prototype._resize = function _resize () {};\r\n\r\n Surface.prototype._handler = function _handler (eventName) {\r\n var this$1$1 = this;\r\n\r\n return function (e) {\r\n var node = this$1$1.eventTarget(e);\r\n if (node && !this$1$1._suspendedTracking) {\r\n this$1$1.trigger(eventName, {\r\n element: node,\r\n originalEvent: e,\r\n type: eventName\r\n });\r\n }\r\n };\r\n };\r\n\r\n Surface.prototype._elementOffset = function _elementOffset () {\r\n var element = this.element;\r\n var padding = elementPadding(element);\r\n var ref = elementOffset(element);\r\n var left = ref.left;\r\n var top = ref.top;\r\n\r\n return {\r\n left: left + padding.left,\r\n top: top + padding.top\r\n };\r\n };\r\n\r\n Surface.prototype._surfacePoint = function _surfacePoint (e) {\r\n var offset = this._elementOffset();\r\n var coord = eventCoordinates(e);\r\n var x = coord.x - offset.left;\r\n var y = coord.y - offset.top;\r\n\r\n var inverseTransform = elementScale(this.element).invert();\r\n var point = new Point(\r\n x,\r\n y\r\n ).transform(inverseTransform);\r\n\r\n return point;\r\n };\r\n\r\n return Surface;\r\n }(kendo.Observable));\r\n\r\n function renderAttr(name, value) {\r\n return (defined(value) && value !== null) ? (\" \" + name + \"=\\\"\" + value + \"\\\" \") : \"\";\r\n }\r\n\r\n function renderAllAttr(attrs) {\r\n var output = \"\";\r\n for (var i = 0; i < attrs.length; i++) {\r\n output += renderAttr(attrs[i][0], attrs[i][1]);\r\n }\r\n\r\n return output;\r\n }\r\n\r\n function renderStyle(attrs) {\r\n var output = \"\";\r\n for (var i = 0; i < attrs.length; i++) {\r\n var value = attrs[i][1];\r\n if (defined(value)) {\r\n output += attrs[i][0] + \":\" + value + \";\";\r\n }\r\n }\r\n\r\n if (output !== \"\") {\r\n return output;\r\n }\r\n }\r\n\r\n var NODE_MAP = {};\r\n\r\n var SVG_NS = \"http://www.w3.org/2000/svg\";\r\n var NONE = \"none\";\r\n var POINT_DIGITS = 3;\r\n\r\n var applyStyle = function (styleString, element) { return styleString.split(';').filter(function (s) { return s !== ''; }).forEach(function (s) {\r\n var parts = s.split(':');\r\n element.style[parts[0].trim()] = parts[1].trim();\r\n }); };\r\n\r\n var styleAttr = 'data-style';\r\n var replaceStyleAttr = function (html) { return html.replace(/\\sstyle=/g, ' ' + styleAttr + '='); };\r\n var restoreStyleAttr = function (container) {\r\n Array.from(container.querySelectorAll('[' + styleAttr +']')).forEach(function (element) {\r\n var styleString = element.getAttribute(styleAttr);\r\n element.removeAttribute(styleAttr);\r\n applyStyle(styleString, element);\r\n });\r\n };\r\n\r\n var renderSVG = function(container, svg) {\r\n container.innerHTML = replaceStyleAttr(svg);\r\n restoreStyleAttr(container);\r\n };\r\n\r\n if (typeof document !== \"undefined\") {\r\n var testFragment = \"\";\r\n var testContainer = document.createElement(\"div\");\r\n var hasParser = typeof DOMParser !== \"undefined\";\r\n\r\n testContainer.innerHTML = testFragment;\r\n\r\n if (hasParser && testContainer.firstChild.namespaceURI !== SVG_NS) {\r\n renderSVG = function(container, svg) {\r\n var parser = new DOMParser();\r\n var chartDoc = parser.parseFromString(replaceStyleAttr(svg), \"text/xml\");\r\n restoreStyleAttr(chartDoc);\r\n var importedDoc = document.adoptNode(chartDoc.documentElement);\r\n\r\n container.innerHTML = \"\";\r\n container.appendChild(importedDoc);\r\n };\r\n }\r\n }\r\n\r\n var renderSVG$1 = renderSVG;\r\n\r\n var TRANSFORM = \"transform\";\r\n var DefinitionMap = {\r\n clip: \"clip-path\",\r\n fill: \"fill\"\r\n };\r\n\r\n function isDefinition(type, value) {\r\n return type === \"clip\" || (type === \"fill\" && (!value || value.nodeType === \"Gradient\"));\r\n }\r\n\r\n function baseUrl() {\r\n var base = document.getElementsByTagName(\"base\")[0];\r\n var href = document.location.href;\r\n var url = \"\";\r\n\r\n if (base && !(supportBrowser || {}).msie) {\r\n var hashIndex = href.indexOf(\"#\");\r\n if (hashIndex !== -1) {\r\n href = href.substring(0, hashIndex);\r\n }\r\n\r\n url = href;\r\n }\r\n\r\n return url;\r\n }\r\n\r\n var Node = (function (BaseNode$$1) {\r\n function Node(srcElement, options) {\r\n BaseNode$$1.call(this, srcElement);\r\n this.definitions = {};\r\n\r\n this.options = options;\r\n }\r\n\r\n extendStatic(Node, BaseNode$$1);\r\n Node.prototype = Object.create( BaseNode$$1 && BaseNode$$1.prototype );\r\n Node.prototype.constructor = Node;\r\n Node.fn = Node.prototype;\r\n Node.fn.init = Node.fn.constructor;\r\n\r\n Node.prototype.destroy = function destroy () {\r\n if (this.element) {\r\n this.element._kendoNode = null;\r\n this.element = null;\r\n }\r\n\r\n this.clearDefinitions();\r\n BaseNode$$1.prototype.destroy.call(this);\r\n };\r\n\r\n Node.prototype.load = function load (elements, pos) {\r\n var this$1$1 = this;\r\n\r\n for (var i = 0; i < elements.length; i++) {\r\n var srcElement = elements[i];\r\n var children = srcElement.children;\r\n\r\n var childNode = new NODE_MAP[srcElement.nodeType](srcElement, this$1$1.options);\r\n\r\n if (defined(pos)) {\r\n this$1$1.insertAt(childNode, pos);\r\n } else {\r\n this$1$1.append(childNode);\r\n }\r\n\r\n childNode.createDefinitions();\r\n\r\n if (children && children.length > 0) {\r\n childNode.load(children);\r\n }\r\n\r\n var element = this$1$1.element;\r\n if (element) {\r\n childNode.attachTo(element, pos);\r\n }\r\n }\r\n };\r\n\r\n Node.prototype.root = function root () {\r\n var root = this;\r\n\r\n while (root.parent) {\r\n root = root.parent;\r\n }\r\n\r\n return root;\r\n };\r\n\r\n Node.prototype.attachTo = function attachTo (domElement, pos) {\r\n var container = document.createElement(\"div\");\r\n renderSVG$1(container,\r\n \"\" +\r\n this.render() +\r\n \"\"\r\n );\r\n\r\n var element = container.firstChild.firstChild;\r\n if (element) {\r\n if (defined(pos)) {\r\n domElement.insertBefore(element, domElement.childNodes[pos] || null);\r\n } else {\r\n domElement.appendChild(element);\r\n }\r\n this.setElement(element);\r\n }\r\n };\r\n\r\n Node.prototype.setElement = function setElement (element) {\r\n if (this.element) {\r\n this.element._kendoNode = null;\r\n }\r\n\r\n this.element = element;\r\n this.element._kendoNode = this;\r\n\r\n var nodes = this.childNodes;\r\n for (var i = 0; i < nodes.length; i++) {\r\n var childElement = element.childNodes[i];\r\n nodes[i].setElement(childElement);\r\n }\r\n };\r\n\r\n Node.prototype.clear = function clear () {\r\n this.clearDefinitions();\r\n\r\n if (this.element) {\r\n this.element.innerHTML = \"\";\r\n }\r\n\r\n var children = this.childNodes;\r\n for (var i = 0; i < children.length; i++) {\r\n children[i].destroy();\r\n }\r\n\r\n this.childNodes = [];\r\n };\r\n\r\n Node.prototype.removeSelf = function removeSelf () {\r\n if (this.element) {\r\n var parentNode = this.element.parentNode;\r\n if (parentNode) {\r\n parentNode.removeChild(this.element);\r\n }\r\n this.element = null;\r\n }\r\n\r\n BaseNode$$1.prototype.removeSelf.call(this);\r\n };\r\n\r\n Node.prototype.template = function template () {\r\n return this.renderChildren();\r\n };\r\n\r\n Node.prototype.render = function render () {\r\n return this.template();\r\n };\r\n\r\n Node.prototype.renderChildren = function renderChildren () {\r\n var nodes = this.childNodes;\r\n var output = \"\";\r\n\r\n for (var i = 0; i < nodes.length; i++) {\r\n output += nodes[i].render();\r\n }\r\n\r\n return output;\r\n };\r\n\r\n Node.prototype.optionsChange = function optionsChange (e) {\r\n var field = e.field;\r\n var value = e.value;\r\n\r\n if (field === \"visible\") {\r\n this.css(\"display\", value ? \"\" : NONE);\r\n } else if (DefinitionMap[field] && isDefinition(field, value)) {\r\n this.updateDefinition(field, value);\r\n } else if (field === \"opacity\") {\r\n this.attr(\"opacity\", value);\r\n } else if (field === \"cursor\") {\r\n this.css(\"cursor\", value);\r\n } else if (field === \"id\") {\r\n if (value) {\r\n this.attr(\"id\", value);\r\n } else {\r\n this.removeAttr(\"id\");\r\n }\r\n }\r\n\r\n BaseNode$$1.prototype.optionsChange.call(this, e);\r\n };\r\n\r\n Node.prototype.accessibilityOptionsChange = function accessibilityOptionsChange (e) {\r\n var field = e.field;\r\n var value = e.value;\r\n\r\n if (field === \"role\") {\r\n if (value) {\r\n this.attr(\"role\", value);\r\n } else {\r\n this.removeAttr(\"role\");\r\n }\r\n } else if (field === \"ariaLabel\") {\r\n if (value) {\r\n this.attr(\"aria-label\", htmlEncode(value));\r\n } else {\r\n this.removeAttr(\"aria-label\");\r\n }\r\n } else if (field === \"ariaRoleDescription\") {\r\n if (value) {\r\n this.attr(\"aria-roledescription\", htmlEncode(value));\r\n } else {\r\n this.removeAttr(\"aria-roledescription\");\r\n }\r\n } else if (field === \"ariaChecked\") {\r\n if (defined(value)) {\r\n this.attr(\"aria-checked\", value);\r\n } else {\r\n this.removeAttr(\"aria-checked\");\r\n }\r\n } else if (field === \"className\") {\r\n this.className(value);\r\n }\r\n };\r\n\r\n Node.prototype.attr = function attr (name, value) {\r\n if (this.element) {\r\n this.element.setAttribute(name, value);\r\n }\r\n };\r\n\r\n Node.prototype.allAttr = function allAttr (attrs) {\r\n var this$1$1 = this;\r\n\r\n for (var i = 0; i < attrs.length; i++) {\r\n this$1$1.attr(attrs[i][0], attrs[i][1]);\r\n }\r\n };\r\n\r\n Node.prototype.toggleAttr = function toggleAttr (name, value) {\r\n if (value) {\r\n this.attr(name, value);\r\n } else {\r\n this.removeAttr(name);\r\n }\r\n };\r\n\r\n Node.prototype.css = function css (name, value) {\r\n if (this.element) {\r\n this.element.style[name] = value;\r\n }\r\n };\r\n\r\n Node.prototype.allCss = function allCss (styles) {\r\n var this$1$1 = this;\r\n\r\n for (var i = 0; i < styles.length; i++) {\r\n this$1$1.css(styles[i][0], styles[i][1]);\r\n }\r\n };\r\n\r\n Node.prototype.className = function className (value) {\r\n var this$1$1 = this;\r\n\r\n if (this.element) {\r\n (ref = this.element.classList).remove.apply(ref, this.element.classList);\r\n value.split(\" \").forEach(function (item) {\r\n this$1$1.element.classList.add(item);\r\n });\r\n }\r\n var ref;\r\n };\r\n\r\n Node.prototype.removeAttr = function removeAttr (name) {\r\n if (this.element) {\r\n this.element.removeAttribute(name);\r\n }\r\n };\r\n\r\n Node.prototype.mapTransform = function mapTransform (transform) {\r\n var attrs = [];\r\n if (transform) {\r\n attrs.push([\r\n TRANSFORM,\r\n \"matrix(\" + transform.matrix().toString(6) + \")\"\r\n ]);\r\n }\r\n\r\n return attrs;\r\n };\r\n\r\n Node.prototype.renderTransform = function renderTransform () {\r\n return renderAllAttr(\r\n this.mapTransform(this.srcElement.transform())\r\n );\r\n };\r\n\r\n Node.prototype.transformChange = function transformChange (value) {\r\n if (value) {\r\n this.allAttr(this.mapTransform(value));\r\n } else {\r\n this.removeAttr(TRANSFORM);\r\n }\r\n };\r\n\r\n Node.prototype.mapStyle = function mapStyle () {\r\n var options = this.srcElement.options;\r\n var style = [ [ \"cursor\", options.cursor ] ];\r\n\r\n if (options.visible === false) {\r\n style.push([ \"display\", NONE ]);\r\n }\r\n\r\n return style;\r\n };\r\n\r\n Node.prototype.renderStyle = function renderStyle$1 () {\r\n return renderAttr(\"style\", renderStyle(this.mapStyle(true)));\r\n };\r\n\r\n Node.prototype.renderOpacity = function renderOpacity () {\r\n return renderAttr(\"opacity\", this.srcElement.options.opacity);\r\n };\r\n\r\n Node.prototype.renderId = function renderId () {\r\n return renderAttr(\"id\", this.srcElement.options.id);\r\n };\r\n\r\n Node.prototype.renderClassName = function renderClassName () {\r\n return renderAttr(\"class\", this.srcElement.options.className);\r\n };\r\n\r\n Node.prototype.renderRole = function renderRole () {\r\n return renderAttr(\"role\", this.srcElement.options.role);\r\n };\r\n\r\n Node.prototype.renderAriaLabel = function renderAriaLabel () {\r\n var value = this.srcElement.options.ariaLabel;\r\n if (value) {\r\n value = htmlEncode(value);\r\n }\r\n return renderAttr(\"aria-label\", value);\r\n };\r\n\r\n Node.prototype.renderAriaRoleDescription = function renderAriaRoleDescription () {\r\n var value = this.srcElement.options.ariaRoleDescription;\r\n if (value) {\r\n value = htmlEncode(value);\r\n }\r\n return renderAttr(\"aria-roledescription\", value);\r\n };\r\n\r\n Node.prototype.renderAriaChecked = function renderAriaChecked () {\r\n return renderAttr(\"aria-checked\", this.srcElement.options.ariaChecked);\r\n };\r\n\r\n Node.prototype.createDefinitions = function createDefinitions () {\r\n var srcElement = this.srcElement;\r\n var definitions = this.definitions;\r\n if (srcElement) {\r\n var options = srcElement.options;\r\n var hasDefinitions;\r\n\r\n for (var field in DefinitionMap) {\r\n var definition = options.get(field);\r\n if (definition && isDefinition(field, definition)) {\r\n definitions[field] = definition;\r\n hasDefinitions = true;\r\n }\r\n }\r\n if (hasDefinitions) {\r\n this.definitionChange({\r\n action: \"add\",\r\n definitions: definitions\r\n });\r\n }\r\n }\r\n };\r\n\r\n Node.prototype.definitionChange = function definitionChange (e) {\r\n if (this.parent) {\r\n this.parent.definitionChange(e);\r\n }\r\n };\r\n\r\n Node.prototype.updateDefinition = function updateDefinition (type, value) {\r\n var definitions = this.definitions;\r\n var current = definitions[type];\r\n var attr = DefinitionMap[type];\r\n var definition = {};\r\n if (current) {\r\n definition[type] = current;\r\n this.definitionChange({\r\n action: \"remove\",\r\n definitions: definition\r\n });\r\n delete definitions[type];\r\n }\r\n\r\n if (!value) {\r\n if (current) {\r\n this.removeAttr(attr);\r\n }\r\n } else {\r\n definition[type] = value;\r\n this.definitionChange({\r\n action: \"add\",\r\n definitions: definition\r\n });\r\n definitions[type] = value;\r\n this.attr(attr, this.refUrl(value.id));\r\n }\r\n };\r\n\r\n Node.prototype.clearDefinitions = function clearDefinitions () {\r\n var definitions = this.definitions;\r\n\r\n this.definitionChange({\r\n action: \"remove\",\r\n definitions: definitions\r\n });\r\n this.definitions = {};\r\n };\r\n\r\n Node.prototype.renderDefinitions = function renderDefinitions () {\r\n return renderAllAttr(this.mapDefinitions());\r\n };\r\n\r\n Node.prototype.mapDefinitions = function mapDefinitions () {\r\n var this$1$1 = this;\r\n\r\n var definitions = this.definitions;\r\n var attrs = [];\r\n\r\n for (var field in definitions) {\r\n attrs.push([ DefinitionMap[field], this$1$1.refUrl(definitions[field].id) ]);\r\n }\r\n\r\n return attrs;\r\n };\r\n\r\n Node.prototype.refUrl = function refUrl (id) {\r\n var skipBaseHref = (this.options || {}).skipBaseHref;\r\n var baseHref = this.baseUrl().replace(/'/g, \"\\\\'\");\r\n var base = skipBaseHref ? '' : baseHref;\r\n return (\"url(\" + base + \"#\" + id + \")\");\r\n };\r\n\r\n Node.prototype.baseUrl = function baseUrl$1 () {\r\n return baseUrl();\r\n };\r\n\r\n return Node;\r\n }(BaseNode));\r\n\r\n var GradientStopNode = (function (Node$$1) {\r\n function GradientStopNode () {\r\n Node$$1.apply(this, arguments);\r\n }\r\n\r\n extendStatic(GradientStopNode, Node$$1);\r\n GradientStopNode.prototype = Object.create( Node$$1 && Node$$1.prototype );\r\n GradientStopNode.prototype.constructor = GradientStopNode;\r\n GradientStopNode.fn = GradientStopNode.prototype;\r\n GradientStopNode.fn.init = GradientStopNode.fn.constructor;\r\n\r\n GradientStopNode.prototype.template = function template () {\r\n return (\"\");\r\n };\r\n\r\n GradientStopNode.prototype.renderOffset = function renderOffset () {\r\n return renderAttr(\"offset\", this.srcElement.offset());\r\n };\r\n\r\n GradientStopNode.prototype.mapStyle = function mapStyle () {\r\n var srcElement = this.srcElement;\r\n return [\r\n [ \"stop-color\", srcElement.color() ],\r\n [ \"stop-opacity\", srcElement.opacity() ]\r\n ];\r\n };\r\n\r\n GradientStopNode.prototype.optionsChange = function optionsChange (e) {\r\n if (e.field === \"offset\") {\r\n this.attr(e.field, e.value);\r\n } else if (e.field === \"color\" || e.field === \"opacity\") {\r\n this.css(\"stop-\" + e.field, e.value);\r\n }\r\n };\r\n\r\n return GradientStopNode;\r\n }(Node));\r\n\r\n var GradientNode = (function (Node$$1) {\r\n function GradientNode(srcElement) {\r\n Node$$1.call(this, srcElement);\r\n\r\n this.id = srcElement.id;\r\n\r\n this.loadStops();\r\n }\r\n\r\n extendStatic(GradientNode, Node$$1);\r\n GradientNode.prototype = Object.create( Node$$1 && Node$$1.prototype );\r\n GradientNode.prototype.constructor = GradientNode;\r\n GradientNode.fn = GradientNode.prototype;\r\n GradientNode.fn.init = GradientNode.fn.constructor;\r\n\r\n GradientNode.prototype.loadStops = function loadStops () {\r\n var this$1$1 = this;\r\n\r\n var stops = this.srcElement.stops;\r\n var element = this.element;\r\n\r\n for (var idx = 0; idx < stops.length; idx++) {\r\n var stopNode = new GradientStopNode(stops[idx]);\r\n this$1$1.append(stopNode);\r\n if (element) {\r\n stopNode.attachTo(element);\r\n }\r\n }\r\n };\r\n\r\n GradientNode.prototype.optionsChange = function optionsChange (e) {\r\n if (e.field === \"gradient.stops\") {\r\n BaseNode.prototype.clear.call(this);\r\n this.loadStops();\r\n } else if (e.field === \"gradient\") {\r\n this.allAttr(this.mapCoordinates());\r\n }\r\n };\r\n\r\n GradientNode.prototype.renderCoordinates = function renderCoordinates () {\r\n return renderAllAttr(this.mapCoordinates());\r\n };\r\n\r\n GradientNode.prototype.mapSpace = function mapSpace () {\r\n return [ \"gradientUnits\", this.srcElement.userSpace() ? \"userSpaceOnUse\" : \"objectBoundingBox\" ];\r\n };\r\n\r\n return GradientNode;\r\n }(Node));\r\n\r\n var LinearGradientNode = (function (GradientNode$$1) {\r\n function LinearGradientNode () {\r\n GradientNode$$1.apply(this, arguments);\r\n }\r\n\r\n extendStatic(LinearGradientNode, GradientNode$$1);\r\n LinearGradientNode.prototype = Object.create( GradientNode$$1 && GradientNode$$1.prototype );\r\n LinearGradientNode.prototype.constructor = LinearGradientNode;\r\n LinearGradientNode.fn = LinearGradientNode.prototype;\r\n LinearGradientNode.fn.init = LinearGradientNode.fn.constructor;\r\n\r\n LinearGradientNode.prototype.template = function template () {\r\n return (\"\" + (this.renderChildren()) + \"\");\r\n };\r\n\r\n LinearGradientNode.prototype.mapCoordinates = function mapCoordinates () {\r\n var srcElement = this.srcElement;\r\n var start = srcElement.start();\r\n var end = srcElement.end();\r\n var attrs = [\r\n [ \"x1\", start.x ],\r\n [ \"y1\", start.y ],\r\n [ \"x2\", end.x ],\r\n [ \"y2\", end.y ],\r\n this.mapSpace()\r\n ];\r\n\r\n return attrs;\r\n };\r\n\r\n return LinearGradientNode;\r\n }(GradientNode));\r\n\r\n var RadialGradientNode = (function (GradientNode$$1) {\r\n function RadialGradientNode () {\r\n GradientNode$$1.apply(this, arguments);\r\n }\r\n\r\n extendStatic(RadialGradientNode, GradientNode$$1);\r\n RadialGradientNode.prototype = Object.create( GradientNode$$1 && GradientNode$$1.prototype );\r\n RadialGradientNode.prototype.constructor = RadialGradientNode;\r\n RadialGradientNode.fn = RadialGradientNode.prototype;\r\n RadialGradientNode.fn.init = RadialGradientNode.fn.constructor;\r\n\r\n RadialGradientNode.prototype.template = function template () {\r\n return (\"\" + (this.renderChildren()) + \"\");\r\n };\r\n\r\n RadialGradientNode.prototype.mapCoordinates = function mapCoordinates () {\r\n var srcElement = this.srcElement;\r\n var center = srcElement.center();\r\n var radius = srcElement.radius();\r\n var attrs = [\r\n [ \"cx\", center.x ],\r\n [ \"cy\", center.y ],\r\n [ \"r\", radius ],\r\n this.mapSpace()\r\n ];\r\n return attrs;\r\n };\r\n\r\n return RadialGradientNode;\r\n }(GradientNode));\r\n\r\n var ClipNode = (function (Node$$1) {\r\n function ClipNode(srcElement) {\r\n Node$$1.call(this);\r\n\r\n this.srcElement = srcElement;\r\n this.id = srcElement.id;\r\n\r\n this.load([ srcElement ]);\r\n }\r\n\r\n extendStatic(ClipNode, Node$$1);\r\n ClipNode.prototype = Object.create( Node$$1 && Node$$1.prototype );\r\n ClipNode.prototype.constructor = ClipNode;\r\n ClipNode.fn = ClipNode.prototype;\r\n ClipNode.fn.init = ClipNode.fn.constructor;\r\n\r\n ClipNode.prototype.renderClipRule = function renderClipRule () {\r\n return renderAttr(\"clip-rule\", \"evenodd\");\r\n };\r\n ClipNode.prototype.template = function template () {\r\n return (\"\" + (this.renderChildren()) + \"\");\r\n };\r\n\r\n return ClipNode;\r\n }(Node));\r\n\r\n var DefinitionNode = (function (Node$$1) {\r\n function DefinitionNode() {\r\n Node$$1.call(this);\r\n this.definitionMap = {};\r\n }\r\n\r\n extendStatic(DefinitionNode, Node$$1);\r\n DefinitionNode.prototype = Object.create( Node$$1 && Node$$1.prototype );\r\n DefinitionNode.prototype.constructor = DefinitionNode;\r\n DefinitionNode.fn = DefinitionNode.prototype;\r\n DefinitionNode.fn.init = DefinitionNode.fn.constructor;\r\n\r\n DefinitionNode.prototype.attachTo = function attachTo (domElement) {\r\n this.element = domElement;\r\n };\r\n\r\n DefinitionNode.prototype.template = function template () {\r\n return (\"\" + (this.renderChildren()) + \"\");\r\n };\r\n\r\n DefinitionNode.prototype.definitionChange = function definitionChange (e) {\r\n var definitions = e.definitions;\r\n var action = e.action;\r\n\r\n if (action === \"add\") {\r\n this.addDefinitions(definitions);\r\n } else if (action === \"remove\") {\r\n this.removeDefinitions(definitions);\r\n }\r\n };\r\n\r\n DefinitionNode.prototype.createDefinition = function createDefinition (type, item) {\r\n var nodeType;\r\n if (type === \"clip\") {\r\n nodeType = ClipNode;\r\n } else if (type === \"fill\") {\r\n if (item instanceof LinearGradient) {\r\n nodeType = LinearGradientNode;\r\n } else if (item instanceof RadialGradient) {\r\n nodeType = RadialGradientNode;\r\n }\r\n }\r\n return new nodeType(item);\r\n };\r\n\r\n DefinitionNode.prototype.addDefinitions = function addDefinitions (definitions) {\r\n var this$1$1 = this;\r\n\r\n for (var field in definitions) {\r\n this$1$1.addDefinition(field, definitions[field]);\r\n }\r\n };\r\n\r\n DefinitionNode.prototype.addDefinition = function addDefinition (type, srcElement) {\r\n var ref = this;\r\n var element = ref.element;\r\n var definitionMap = ref.definitionMap;\r\n var id = srcElement.id;\r\n var mapItem = definitionMap[id];\r\n if (!mapItem) {\r\n var node = this.createDefinition(type, srcElement);\r\n definitionMap[id] = {\r\n element: node,\r\n count: 1\r\n };\r\n this.append(node);\r\n if (element) {\r\n node.attachTo(this.element);\r\n }\r\n } else {\r\n mapItem.count++;\r\n }\r\n };\r\n\r\n DefinitionNode.prototype.removeDefinitions = function removeDefinitions (definitions) {\r\n var this$1$1 = this;\r\n\r\n for (var field in definitions) {\r\n this$1$1.removeDefinition(definitions[field]);\r\n }\r\n };\r\n\r\n DefinitionNode.prototype.removeDefinition = function removeDefinition (srcElement) {\r\n var definitionMap = this.definitionMap;\r\n var id = srcElement.id;\r\n var mapItem = definitionMap[id];\r\n\r\n if (mapItem) {\r\n mapItem.count--;\r\n if (mapItem.count === 0) {\r\n this.remove(this.childNodes.indexOf(mapItem.element), 1);\r\n delete definitionMap[id];\r\n }\r\n }\r\n };\r\n\r\n return DefinitionNode;\r\n }(Node));\r\n\r\n var RootNode = (function (Node$$1) {\r\n function RootNode(options) {\r\n Node$$1.call(this);\r\n this.options = options;\r\n this.defs = new DefinitionNode();\r\n }\r\n\r\n extendStatic(RootNode, Node$$1);\r\n RootNode.prototype = Object.create( Node$$1 && Node$$1.prototype );\r\n RootNode.prototype.constructor = RootNode;\r\n RootNode.fn = RootNode.prototype;\r\n RootNode.fn.init = RootNode.fn.constructor;\r\n\r\n RootNode.prototype.attachTo = function attachTo (domElement) {\r\n this.element = domElement;\r\n this.defs.attachTo(domElement.firstElementChild);\r\n };\r\n\r\n RootNode.prototype.clear = function clear () {\r\n BaseNode.prototype.clear.call(this);\r\n };\r\n\r\n RootNode.prototype.template = function template () {\r\n return this.defs.render() + this.renderChildren();\r\n };\r\n\r\n RootNode.prototype.definitionChange = function definitionChange (e) {\r\n this.defs.definitionChange(e);\r\n };\r\n\r\n return RootNode;\r\n }(Node));\r\n\r\n var DASH_ARRAYS = {\r\n dot: [ 1.5, 3.5 ],\r\n dash: [ 4, 3.5 ],\r\n longdash: [ 8, 3.5 ],\r\n dashdot: [ 3.5, 3.5, 1.5, 3.5 ],\r\n longdashdot: [ 8, 3.5, 1.5, 3.5 ],\r\n longdashdotdot: [ 8, 3.5, 1.5, 3.5, 1.5, 3.5 ]\r\n };\r\n\r\n var SOLID = \"solid\";\r\n var BUTT = \"butt\";\r\n\r\n var ATTRIBUTE_MAP = {\r\n \"fill.opacity\": \"fill-opacity\",\r\n \"stroke.color\": \"stroke\",\r\n \"stroke.width\": \"stroke-width\",\r\n \"stroke.opacity\": \"stroke-opacity\"\r\n };\r\n\r\n var PathNode = (function (Node$$1) {\r\n function PathNode () {\r\n Node$$1.apply(this, arguments);\r\n }\r\n\r\n extendStatic(PathNode, Node$$1);\r\n PathNode.prototype = Object.create( Node$$1 && Node$$1.prototype );\r\n PathNode.prototype.constructor = PathNode;\r\n PathNode.fn = PathNode.prototype;\r\n PathNode.fn.init = PathNode.fn.constructor;\r\n\r\n PathNode.prototype.geometryChange = function geometryChange () {\r\n this.attr(\"d\", this.renderData());\r\n this.invalidate();\r\n };\r\n\r\n PathNode.prototype.optionsChange = function optionsChange (e) {\r\n switch (e.field) {\r\n case \"fill\":\r\n if (e.value) {\r\n this.allAttr(this.mapFill(e.value));\r\n } else {\r\n this.removeAttr(\"fill\");\r\n }\r\n break;\r\n\r\n case \"fill.color\":\r\n this.allAttr(this.mapFill({ color: e.value }));\r\n break;\r\n\r\n case \"stroke\":\r\n if (e.value) {\r\n this.allAttr(this.mapStroke(e.value));\r\n } else {\r\n this.removeAttr(\"stroke\");\r\n }\r\n break;\r\n\r\n case \"transform\":\r\n this.transformChange(e.value);\r\n break;\r\n\r\n default:\r\n var name = ATTRIBUTE_MAP[e.field];\r\n if (name) {\r\n this.attr(name, e.value);\r\n }\r\n break;\r\n }\r\n\r\n this.accessibilityOptionsChange(e);\r\n\r\n Node$$1.prototype.optionsChange.call(this, e);\r\n };\r\n\r\n PathNode.prototype.content = function content () {\r\n if (this.element) {\r\n this.element.textContent = this.srcElement.content();\r\n }\r\n };\r\n\r\n PathNode.prototype.renderData = function renderData () {\r\n return this.srcElement.toString(POINT_DIGITS) || undefined;\r\n };\r\n\r\n PathNode.prototype.mapStroke = function mapStroke (stroke) {\r\n var attrs = [];\r\n\r\n if (stroke && !isTransparent(stroke.color)) {\r\n attrs.push([ \"stroke\", stroke.color ]);\r\n attrs.push([ \"stroke-width\", stroke.width ]);\r\n attrs.push([ \"stroke-linecap\", this.renderLinecap(stroke) ]);\r\n attrs.push([ \"stroke-linejoin\", stroke.lineJoin ]);\r\n\r\n if (defined(stroke.opacity)) {\r\n attrs.push([ \"stroke-opacity\", stroke.opacity ]);\r\n }\r\n\r\n if (defined(stroke.dashType)) {\r\n attrs.push([ \"stroke-dasharray\", this.renderDashType(stroke) ]);\r\n }\r\n } else {\r\n attrs.push([ \"stroke\", NONE ]);\r\n }\r\n\r\n return attrs;\r\n };\r\n\r\n PathNode.prototype.renderStroke = function renderStroke () {\r\n return renderAllAttr(\r\n this.mapStroke(this.srcElement.options.stroke)\r\n );\r\n };\r\n\r\n PathNode.prototype.renderDashType = function renderDashType (stroke) {\r\n var dashType = stroke.dashType;\r\n var width = stroke.width; if (width === void 0) { width = 1; }\r\n\r\n if (dashType && dashType !== SOLID) {\r\n var dashArray = DASH_ARRAYS[dashType.toLowerCase()];\r\n var result = [];\r\n\r\n for (var i = 0; i < dashArray.length; i++) {\r\n result.push(dashArray[i] * width);\r\n }\r\n\r\n return result.join(\" \");\r\n }\r\n };\r\n\r\n PathNode.prototype.renderLinecap = function renderLinecap (stroke) {\r\n var dashType = stroke.dashType;\r\n var lineCap = stroke.lineCap;\r\n\r\n return (dashType && dashType !== \"solid\") ? BUTT : lineCap;\r\n };\r\n\r\n PathNode.prototype.mapFill = function mapFill (fill) {\r\n var attrs = [];\r\n if (!(fill && fill.nodeType === \"Gradient\")) {\r\n if (fill && !isTransparent(fill.color)) {\r\n attrs.push([ \"fill\", fill.color ]);\r\n\r\n if (defined(fill.opacity)) {\r\n attrs.push([ \"fill-opacity\", fill.opacity ]);\r\n }\r\n } else {\r\n attrs.push([ \"fill\", NONE ]);\r\n }\r\n }\r\n\r\n return attrs;\r\n };\r\n\r\n PathNode.prototype.renderFill = function renderFill () {\r\n return renderAllAttr(\r\n this.mapFill(this.srcElement.options.fill)\r\n );\r\n };\r\n\r\n PathNode.prototype.template = function template () {\r\n return \"\";\r\n };\r\n\r\n return PathNode;\r\n }(Node));\r\n\r\n var ArcNode = (function (PathNode$$1) {\r\n function ArcNode () {\r\n PathNode$$1.apply(this, arguments);\r\n }\r\n\r\n extendStatic(ArcNode, PathNode$$1);\r\n ArcNode.prototype = Object.create( PathNode$$1 && PathNode$$1.prototype );\r\n ArcNode.prototype.constructor = ArcNode;\r\n ArcNode.fn = ArcNode.prototype;\r\n ArcNode.fn.init = ArcNode.fn.constructor;\r\n\r\n ArcNode.prototype.renderData = function renderData () {\r\n return this.srcElement.toPath().toString(POINT_DIGITS);\r\n };\r\n\r\n return ArcNode;\r\n }(PathNode));\r\n\r\n var CircleNode = (function (PathNode$$1) {\r\n function CircleNode () {\r\n PathNode$$1.apply(this, arguments);\r\n }\r\n\r\n extendStatic(CircleNode, PathNode$$1);\r\n CircleNode.prototype = Object.create( PathNode$$1 && PathNode$$1.prototype );\r\n CircleNode.prototype.constructor = CircleNode;\r\n CircleNode.fn = CircleNode.prototype;\r\n CircleNode.fn.init = CircleNode.fn.constructor;\r\n\r\n CircleNode.prototype.geometryChange = function geometryChange () {\r\n var center = this.center();\r\n this.attr(\"cx\", center.x);\r\n this.attr(\"cy\", center.y);\r\n this.attr(\"r\", this.radius());\r\n this.invalidate();\r\n };\r\n\r\n CircleNode.prototype.center = function center () {\r\n return this.srcElement.geometry().center;\r\n };\r\n\r\n CircleNode.prototype.radius = function radius () {\r\n return this.srcElement.geometry().radius;\r\n };\r\n\r\n CircleNode.prototype.template = function template () {\r\n return \"\";\r\n };\r\n\r\n return CircleNode;\r\n }(PathNode));\r\n\r\n var GroupNode = (function (Node$$1) {\r\n function GroupNode () {\r\n Node$$1.apply(this, arguments);\r\n }\r\n\r\n extendStatic(GroupNode, Node$$1);\r\n GroupNode.prototype = Object.create( Node$$1 && Node$$1.prototype );\r\n GroupNode.prototype.constructor = GroupNode;\r\n GroupNode.fn = GroupNode.prototype;\r\n GroupNode.fn.init = GroupNode.fn.constructor;\r\n\r\n GroupNode.prototype.template = function template () {\r\n return (\"\" + (this.renderChildren()) + \"\");\r\n };\r\n\r\n GroupNode.prototype.optionsChange = function optionsChange (e) {\r\n var field = e.field;\r\n var value = e.value;\r\n\r\n if (field === \"transform\") {\r\n this.transformChange(value);\r\n }\r\n\r\n this.accessibilityOptionsChange(e);\r\n\r\n Node$$1.prototype.optionsChange.call(this, e);\r\n };\r\n\r\n return GroupNode;\r\n }(Node));\r\n\r\n var ImageNode = (function (PathNode$$1) {\r\n function ImageNode () {\r\n PathNode$$1.apply(this, arguments);\r\n }\r\n\r\n extendStatic(ImageNode, PathNode$$1);\r\n ImageNode.prototype = Object.create( PathNode$$1 && PathNode$$1.prototype );\r\n ImageNode.prototype.constructor = ImageNode;\r\n ImageNode.fn = ImageNode.prototype;\r\n ImageNode.fn.init = ImageNode.fn.constructor;\r\n\r\n ImageNode.prototype.geometryChange = function geometryChange () {\r\n this.allAttr(this.mapPosition());\r\n this.invalidate();\r\n };\r\n\r\n ImageNode.prototype.optionsChange = function optionsChange (e) {\r\n if (e.field === \"src\") {\r\n this.allAttr(this.mapSource());\r\n }\r\n\r\n PathNode$$1.prototype.optionsChange.call(this, e);\r\n };\r\n\r\n ImageNode.prototype.mapPosition = function mapPosition () {\r\n var rect = this.srcElement.rect();\r\n var tl = rect.topLeft();\r\n\r\n return [\r\n [ \"x\", tl.x ],\r\n [ \"y\", tl.y ],\r\n [ \"width\", rect.width() + \"px\" ],\r\n [ \"height\", rect.height() + \"px\" ]\r\n ];\r\n };\r\n\r\n ImageNode.prototype.renderPosition = function renderPosition () {\r\n return renderAllAttr(this.mapPosition());\r\n };\r\n\r\n ImageNode.prototype.mapSource = function mapSource (encode) {\r\n var src = this.srcElement.src();\r\n\r\n if (encode) {\r\n src = htmlEncode(src);\r\n }\r\n\r\n return [ [ \"xlink:href\", src ] ];\r\n };\r\n\r\n ImageNode.prototype.renderSource = function renderSource () {\r\n return renderAllAttr(this.mapSource(true));\r\n };\r\n\r\n ImageNode.prototype.template = function template () {\r\n return \"\" +\r\n \"\";\r\n };\r\n\r\n return ImageNode;\r\n }(PathNode));\r\n\r\n var MultiPathNode = (function (PathNode$$1) {\r\n function MultiPathNode () {\r\n PathNode$$1.apply(this, arguments);\r\n }\r\n\r\n extendStatic(MultiPathNode, PathNode$$1);\r\n MultiPathNode.prototype = Object.create( PathNode$$1 && PathNode$$1.prototype );\r\n MultiPathNode.prototype.constructor = MultiPathNode;\r\n MultiPathNode.fn = MultiPathNode.prototype;\r\n MultiPathNode.fn.init = MultiPathNode.fn.constructor;\r\n\r\n MultiPathNode.prototype.renderData = function renderData () {\r\n return this.srcElement.toString(POINT_DIGITS) || 'undefined';\r\n };\r\n\r\n return MultiPathNode;\r\n }(PathNode));\r\n\r\n var RectNode = (function (PathNode$$1) {\r\n function RectNode () {\r\n PathNode$$1.apply(this, arguments);\r\n }\r\n\r\n extendStatic(RectNode, PathNode$$1);\r\n RectNode.prototype = Object.create( PathNode$$1 && PathNode$$1.prototype );\r\n RectNode.prototype.constructor = RectNode;\r\n RectNode.fn = RectNode.prototype;\r\n RectNode.fn.init = RectNode.fn.constructor;\r\n\r\n RectNode.prototype.geometryChange = function geometryChange () {\r\n var geometry = this.srcElement.geometry();\r\n this.attr(\"x\", geometry.origin.x);\r\n this.attr(\"y\", geometry.origin.y);\r\n this.attr(\"width\", geometry.size.width);\r\n this.attr(\"height\", geometry.size.height);\r\n this.attr(\"rx\", geometry.cornerRadius[0]);\r\n this.attr(\"ry\", geometry.cornerRadius[1]);\r\n this.invalidate();\r\n };\r\n\r\n RectNode.prototype.size = function size () {\r\n return this.srcElement.geometry().size;\r\n };\r\n\r\n RectNode.prototype.origin = function origin () {\r\n return this.srcElement.geometry().origin;\r\n };\r\n\r\n RectNode.prototype.rx = function rx () {\r\n return this.srcElement.geometry().cornerRadius[0];\r\n };\r\n\r\n RectNode.prototype.ry = function ry () {\r\n return this.srcElement.geometry().cornerRadius[1];\r\n };\r\n\r\n RectNode.prototype.template = function template () {\r\n return \"\";\r\n };\r\n\r\n return RectNode;\r\n }(PathNode));\r\n\r\n var ENTITY_REGEX = /&(?:[a-zA-Z]+|#\\d+);/g;\r\n\r\n function decodeEntities(text) {\r\n if (!text || typeof text !== \"string\" || !ENTITY_REGEX.test(text)) {\r\n return text;\r\n }\r\n\r\n var element = decodeEntities._element;\r\n ENTITY_REGEX.lastIndex = 0;\r\n\r\n return text.replace(ENTITY_REGEX, function (match) {\r\n element.innerHTML = match;\r\n\r\n return element.textContent || element.innerText;\r\n });\r\n }\r\n\r\n if (typeof document !== \"undefined\") {\r\n decodeEntities._element = document.createElement(\"span\");\r\n }\r\n\r\n var TextNode = (function (PathNode$$1) {\r\n function TextNode () {\r\n PathNode$$1.apply(this, arguments);\r\n }\r\n\r\n extendStatic(TextNode, PathNode$$1);\r\n TextNode.prototype = Object.create( PathNode$$1 && PathNode$$1.prototype );\r\n TextNode.prototype.constructor = TextNode;\r\n TextNode.fn = TextNode.prototype;\r\n TextNode.fn.init = TextNode.fn.constructor;\r\n\r\n TextNode.prototype.geometryChange = function geometryChange () {\r\n var pos = this.pos();\r\n this.attr(\"x\", pos.x);\r\n this.attr(\"y\", pos.y);\r\n this.invalidate();\r\n };\r\n\r\n TextNode.prototype.optionsChange = function optionsChange (e) {\r\n if (e.field === \"font\") {\r\n this.attr(\"style\", renderStyle(this.mapStyle()));\r\n this.geometryChange();\r\n } else if (e.field === \"content\") {\r\n PathNode$$1.prototype.content.call(this, this.srcElement.content());\r\n }\r\n\r\n PathNode$$1.prototype.optionsChange.call(this, e);\r\n };\r\n\r\n TextNode.prototype.mapStyle = function mapStyle (encode) {\r\n var style = PathNode$$1.prototype.mapStyle.call(this, encode);\r\n var font = this.srcElement.options.font;\r\n\r\n if (encode) {\r\n font = htmlEncode(font);\r\n }\r\n\r\n style.push([ \"font\", font ], [ \"white-space\", \"pre\" ]);\r\n\r\n return style;\r\n };\r\n\r\n TextNode.prototype.pos = function pos () {\r\n var pos = this.srcElement.position();\r\n var size = this.srcElement.measure();\r\n return pos.clone().setY(pos.y + size.baseline);\r\n };\r\n\r\n TextNode.prototype.renderContent = function renderContent () {\r\n var content = this.srcElement.content();\r\n content = decodeEntities(content);\r\n content = htmlEncode(content);\r\n\r\n return kendoUtil.normalizeText(content);\r\n };\r\n\r\n TextNode.prototype.renderTextAnchor = function renderTextAnchor () {\r\n var anchor;\r\n\r\n if ((this.options || {}).rtl && !(supportBrowser.msie || supportBrowser.edge)) {\r\n anchor = 'end';\r\n }\r\n\r\n return renderAttr(\"text-anchor\", anchor);\r\n };\r\n\r\n TextNode.prototype.renderPaintOrder = function renderPaintOrder () {\r\n var paintOrder = this.srcElement.options.paintOrder;\r\n return paintOrder ? renderAttr(\"paint-order\", paintOrder) : \"\";\r\n };\r\n\r\n TextNode.prototype.template = function template () {\r\n return \"\" + (this.renderContent()) + \"\";\r\n };\r\n\r\n return TextNode;\r\n }(PathNode));\r\n\r\n NODE_MAP.Arc = ArcNode;\r\n NODE_MAP.Circle = CircleNode;\r\n NODE_MAP.Group = GroupNode;\r\n NODE_MAP.Image = ImageNode;\r\n NODE_MAP.MultiPath = MultiPathNode;\r\n NODE_MAP.Path = PathNode;\r\n NODE_MAP.Rect = RectNode;\r\n NODE_MAP.Text = TextNode;\r\n\r\n var RTL = 'rtl';\r\n\r\n function alignToScreen(element) {\r\n var ctm;\r\n\r\n try {\r\n ctm = element.getScreenCTM ? element.getScreenCTM() : null;\r\n } catch (e) { } // eslint-disable-line no-empty\r\n\r\n if (ctm) {\r\n var left = - ctm.e % 1;\r\n var top = - ctm.f % 1;\r\n var style = element.style;\r\n\r\n if (left !== 0 || top !== 0) {\r\n style.left = left + \"px\";\r\n style.top = top + \"px\";\r\n }\r\n }\r\n }\r\n\r\n var Surface$3 = (function (BaseSurface) {\r\n function Surface(element, options) {\r\n BaseSurface.call(this, element, options);\r\n\r\n this._root = new RootNode($.extend({\r\n rtl: elementStyles(element, 'direction').direction === RTL\r\n }, this.options));\r\n\r\n renderSVG$1(this.element, this._template(''));\r\n\r\n this._rootElement = this.element.firstElementChild;\r\n this._rootElement.style.width = '100%';\r\n this._rootElement.style.height = '100%';\r\n this._rootElement.style.overflow = 'hidden';\r\n\r\n alignToScreen(this._rootElement);\r\n\r\n this._root.attachTo(this._rootElement);\r\n\r\n bindEvents(this.element, {\r\n click: this._click,\r\n mouseover: this._mouseenter,\r\n mouseout: this._mouseleave,\r\n mousemove: this._mousemove\r\n });\r\n\r\n this.resize();\r\n }\r\n\r\n extendStatic(Surface, BaseSurface);\r\n Surface.prototype = Object.create( BaseSurface && BaseSurface.prototype );\r\n Surface.prototype.constructor = Surface;\r\n Surface.fn = Surface.prototype;\r\n Surface.fn.init = Surface.fn.constructor;\r\n\r\n var prototypeAccessors = { type: {} };\r\n\r\n prototypeAccessors.type.get = function () {\r\n return \"svg\";\r\n };\r\n\r\n Surface.prototype.destroy = function destroy () {\r\n if (this._root) {\r\n this._root.destroy();\r\n this._root = null;\r\n this._rootElement = null;\r\n unbindEvents(this.element, {\r\n click: this._click,\r\n mouseover: this._mouseenter,\r\n mouseout: this._mouseleave,\r\n mousemove: this._mousemove\r\n });\r\n }\r\n\r\n BaseSurface.prototype.destroy.call(this);\r\n };\r\n\r\n Surface.prototype.translate = function translate (offset) {\r\n var viewBox = (Math.round(offset.x)) + \" \" + (Math.round(offset.y)) + \" \" + (this._size.width) + \" \" + (this._size.height);\r\n\r\n this._offset = offset;\r\n this._rootElement.setAttribute(\"viewBox\", viewBox);\r\n };\r\n\r\n Surface.prototype.draw = function draw (element) {\r\n BaseSurface.prototype.draw.call(this, element);\r\n this._root.load([ element ]);\r\n };\r\n\r\n Surface.prototype.clear = function clear () {\r\n BaseSurface.prototype.clear.call(this);\r\n this._root.clear();\r\n };\r\n\r\n Surface.prototype.svg = function svg () {\r\n return \"\" + this._template();\r\n };\r\n\r\n Surface.prototype.exportVisual = function exportVisual () {\r\n var ref = this;\r\n var visual = ref._visual;\r\n var offset = ref._offset;\r\n\r\n if (offset) {\r\n var wrap = new Group();\r\n wrap.children.push(visual);\r\n\r\n wrap.transform(\r\n transform$1().translate(-offset.x, -offset.y)\r\n );\r\n\r\n visual = wrap;\r\n }\r\n\r\n return visual;\r\n };\r\n\r\n Surface.prototype._resize = function _resize () {\r\n if (this._offset) {\r\n this.translate(this._offset);\r\n }\r\n };\r\n\r\n Surface.prototype._template = function _template (svgStyles) {\r\n var styles = typeof svgStyles === 'string' ? svgStyles :\r\n \"style='width: 100%; height: 100%; overflow: hidden;' \";\r\n return (\"\" + (this._root.render()) + \"\");\r\n };\r\n\r\n Object.defineProperties( Surface.prototype, prototypeAccessors );\r\n\r\n return Surface;\r\n }(Surface$2));\r\n\r\n var NODE_MAP$2 = {};\r\n\r\n var Node$2 = (function (BaseNode$$1) {\r\n function Node(srcElement) {\r\n BaseNode$$1.call(this, srcElement);\r\n if (srcElement) {\r\n this.initClip();\r\n }\r\n }\r\n\r\n extendStatic(Node, BaseNode$$1);\r\n Node.prototype = Object.create( BaseNode$$1 && BaseNode$$1.prototype );\r\n Node.prototype.constructor = Node;\r\n Node.fn = Node.prototype;\r\n Node.fn.init = Node.fn.constructor;\r\n\r\n Node.prototype.initClip = function initClip () {\r\n var clip = this.srcElement.clip();\r\n if (clip) {\r\n this.clip = clip;\r\n clip.addObserver(this);\r\n }\r\n };\r\n\r\n Node.prototype.clear = function clear () {\r\n if (this.srcElement) {\r\n this.srcElement.removeObserver(this);\r\n }\r\n\r\n this.clearClip();\r\n\r\n BaseNode$$1.prototype.clear.call(this);\r\n };\r\n\r\n Node.prototype.clearClip = function clearClip () {\r\n if (this.clip) {\r\n this.clip.removeObserver(this);\r\n delete this.clip;\r\n }\r\n };\r\n\r\n Node.prototype.setClip = function setClip (ctx) {\r\n if (this.clip) {\r\n ctx.beginPath();\r\n\r\n var clipNode = new NODE_MAP$2[this.clip.nodeType](this.clip);\r\n clipNode.renderPoints(ctx, this.clip);\r\n\r\n ctx.clip(\"evenodd\");\r\n }\r\n };\r\n\r\n Node.prototype.optionsChange = function optionsChange (e) {\r\n if (e.field === \"clip\") {\r\n this.clearClip();\r\n this.initClip();\r\n }\r\n\r\n BaseNode$$1.prototype.optionsChange.call(this, e);\r\n };\r\n\r\n Node.prototype.setTransform = function setTransform (ctx) {\r\n if (this.srcElement) {\r\n var transform = this.srcElement.transform();\r\n if (transform) {\r\n ctx.transform.apply(ctx, transform.matrix().toArray(6));\r\n }\r\n }\r\n };\r\n\r\n Node.prototype.loadElements = function loadElements (elements, pos, cors) {\r\n var this$1$1 = this;\r\n\r\n for (var i = 0; i < elements.length; i++) {\r\n var srcElement = elements[i];\r\n var children = srcElement.children;\r\n\r\n var childNode = new NODE_MAP$2[srcElement.nodeType](srcElement, cors);\r\n\r\n if (children && children.length > 0) {\r\n childNode.load(children, pos, cors);\r\n }\r\n\r\n if (defined(pos)) {\r\n this$1$1.insertAt(childNode, pos);\r\n } else {\r\n this$1$1.append(childNode);\r\n }\r\n }\r\n };\r\n\r\n Node.prototype.load = function load (elements, pos, cors) {\r\n this.loadElements(elements, pos, cors);\r\n\r\n this.invalidate();\r\n };\r\n\r\n Node.prototype.setOpacity = function setOpacity (ctx) {\r\n if (this.srcElement) {\r\n var opacity = this.srcElement.opacity();\r\n if (defined(opacity)) {\r\n this.globalAlpha(ctx, opacity);\r\n }\r\n }\r\n };\r\n\r\n Node.prototype.globalAlpha = function globalAlpha (ctx, value) {\r\n var opactity = value;\r\n if (opactity && ctx.globalAlpha) {\r\n opactity *= ctx.globalAlpha;\r\n }\r\n ctx.globalAlpha = opactity;\r\n };\r\n\r\n Node.prototype.visible = function visible () {\r\n var src = this.srcElement;\r\n return !src || (src && src.options.visible !== false);\r\n };\r\n\r\n return Node;\r\n }(BaseNode));\r\n\r\n var GroupNode$2 = (function (superclass) {\r\n function GroupNode () {\r\n superclass.apply(this, arguments);\r\n }\r\n\r\n extendStatic(GroupNode, superclass);\r\n GroupNode.prototype = Object.create( superclass && superclass.prototype );\r\n GroupNode.prototype.constructor = GroupNode;\r\n GroupNode.fn = GroupNode.prototype;\r\n GroupNode.fn.init = GroupNode.fn.constructor;\r\n\r\n GroupNode.prototype.renderTo = function renderTo (ctx) {\r\n if (!this.visible()) {\r\n return;\r\n }\r\n\r\n ctx.save();\r\n\r\n this.setTransform(ctx);\r\n this.setClip(ctx);\r\n this.setOpacity(ctx);\r\n\r\n var childNodes = this.childNodes;\r\n for (var i = 0; i < childNodes.length; i++) {\r\n var child = childNodes[i];\r\n if (child.visible()) {\r\n child.renderTo(ctx);\r\n }\r\n }\r\n\r\n ctx.restore();\r\n };\r\n\r\n return GroupNode;\r\n }(traversable(Node$2, \"childNodes\")));\r\n\r\n var FRAME_DELAY = 1000 / 60;\r\n\r\n var RootNode$2 = (function (superclass) {\r\n function RootNode(canvas, size) {\r\n superclass.call(this);\r\n\r\n this.canvas = canvas;\r\n this.size = size;\r\n this.ctx = canvas.getContext(\"2d\");\r\n\r\n var invalidateHandler = this._invalidate.bind(this);\r\n this.invalidate = kendo.throttle(function () {\r\n kendo.animationFrame(invalidateHandler);\r\n }, FRAME_DELAY);\r\n }\r\n\r\n extendStatic(RootNode, superclass);\r\n RootNode.prototype = Object.create( superclass && superclass.prototype );\r\n RootNode.prototype.constructor = RootNode;\r\n RootNode.fn = RootNode.prototype;\r\n RootNode.fn.init = RootNode.fn.constructor;\r\n\r\n RootNode.prototype.destroy = function destroy () {\r\n superclass.prototype.destroy.call(this);\r\n this.canvas = null;\r\n this.ctx = null;\r\n };\r\n\r\n RootNode.prototype.load = function load (elements, pos, cors) {\r\n this.loadElements(elements, pos, cors);\r\n this._invalidate();\r\n };\r\n\r\n RootNode.prototype._rescale = function _rescale (scale) {\r\n var ref = this;\r\n var canvas = ref.canvas;\r\n var size = ref.size;\r\n canvas.width = size.width * scale;\r\n canvas.height = size.height * scale;\r\n this.ctx.scale(scale, scale);\r\n };\r\n\r\n RootNode.prototype._devicePixelRatio = function _devicePixelRatio () {\r\n if (typeof window.devicePixelRatio === 'number') {\r\n return window.devicePixelRatio;\r\n }\r\n\r\n return 1;\r\n };\r\n\r\n RootNode.prototype._invalidate = function _invalidate (options) {\r\n if (!this.ctx) {\r\n return;\r\n }\r\n\r\n var fixedScale = options && options.fixedScale;\r\n var scale = fixedScale ? 1 : this._devicePixelRatio();\r\n this._rescale(scale);\r\n\r\n this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\r\n this.renderTo(this.ctx);\r\n };\r\n\r\n return RootNode;\r\n }(traversable(GroupNode$2, \"childNodes\")));\r\n\r\n var QuadRoot = (function (Class$$1) {\r\n function QuadRoot() {\r\n Class$$1.call(this);\r\n\r\n this.shapes = [];\r\n }\r\n\r\n extendStatic(QuadRoot, Class$$1);\r\n QuadRoot.prototype = Object.create( Class$$1 && Class$$1.prototype );\r\n QuadRoot.prototype.constructor = QuadRoot;\r\n QuadRoot.fn = QuadRoot.prototype;\r\n QuadRoot.fn.init = QuadRoot.fn.constructor;\r\n\r\n QuadRoot.prototype._add = function _add (shape, bbox) {\r\n this.shapes.push({\r\n bbox: bbox,\r\n shape: shape\r\n });\r\n shape._quadNode = this;\r\n };\r\n\r\n QuadRoot.prototype.pointShapes = function pointShapes (point) {\r\n var shapes = this.shapes;\r\n var length = shapes.length;\r\n var result = [];\r\n for (var idx = 0; idx < length; idx++) {\r\n if (shapes[idx].bbox.containsPoint(point)) {\r\n result.push(shapes[idx].shape);\r\n }\r\n }\r\n return result;\r\n };\r\n\r\n QuadRoot.prototype.insert = function insert (shape, bbox) {\r\n this._add(shape, bbox);\r\n };\r\n\r\n QuadRoot.prototype.remove = function remove (shape) {\r\n var shapes = this.shapes;\r\n var length = shapes.length;\r\n\r\n for (var idx = 0; idx < length; idx++) {\r\n if (shapes[idx].shape === shape) {\r\n shapes.splice(idx, 1);\r\n break;\r\n }\r\n }\r\n };\r\n\r\n return QuadRoot;\r\n }(Class));\r\n\r\n var QuadNode = (function (QuadRoot$$1) {\r\n function QuadNode(rect) {\r\n QuadRoot$$1.call(this);\r\n this.children = [];\r\n this.rect = rect;\r\n }\r\n\r\n extendStatic(QuadNode, QuadRoot$$1);\r\n QuadNode.prototype = Object.create( QuadRoot$$1 && QuadRoot$$1.prototype );\r\n QuadNode.prototype.constructor = QuadNode;\r\n QuadNode.fn = QuadNode.prototype;\r\n QuadNode.fn.init = QuadNode.fn.constructor;\r\n\r\n QuadNode.prototype.inBounds = function inBounds (rect) {\r\n var nodeRect = this.rect;\r\n var nodeBottomRight = nodeRect.bottomRight();\r\n var bottomRight = rect.bottomRight();\r\n var inBounds = nodeRect.origin.x <= rect.origin.x && nodeRect.origin.y <= rect.origin.y && bottomRight.x <= nodeBottomRight.x &&\r\n bottomRight.y <= nodeBottomRight.y;\r\n return inBounds;\r\n };\r\n\r\n QuadNode.prototype.pointShapes = function pointShapes (point) {\r\n var children = this.children;\r\n var length = children.length;\r\n var result = QuadRoot$$1.prototype.pointShapes.call(this, point);\r\n for (var idx = 0; idx < length; idx++) {\r\n append$1$1(result, children[idx].pointShapes(point));\r\n }\r\n return result;\r\n };\r\n\r\n QuadNode.prototype.insert = function insert (shape, bbox) {\r\n var children = this.children;\r\n var inserted = false;\r\n\r\n if (this.inBounds(bbox)) {\r\n if (this.shapes.length < 4) {\r\n this._add(shape, bbox);\r\n } else {\r\n if (!children.length) {\r\n this._initChildren();\r\n }\r\n\r\n for (var idx = 0; idx < children.length; idx++) {\r\n if (children[idx].insert(shape, bbox)) {\r\n inserted = true;\r\n break;\r\n }\r\n }\r\n\r\n if (!inserted) {\r\n this._add(shape, bbox);\r\n }\r\n }\r\n inserted = true;\r\n }\r\n\r\n return inserted;\r\n };\r\n\r\n QuadNode.prototype._initChildren = function _initChildren () {\r\n var ref = this;\r\n var rect = ref.rect;\r\n var children = ref.children;\r\n var center = rect.center();\r\n var halfWidth = rect.width() / 2;\r\n var halfHeight = rect.height() / 2;\r\n\r\n children.push(\r\n new QuadNode(new Rect([ rect.origin.x, rect.origin.y ], [ halfWidth, halfHeight ])),\r\n new QuadNode(new Rect([ center.x, rect.origin.y ], [ halfWidth, halfHeight ])),\r\n new QuadNode(new Rect([ rect.origin.x, center.y ], [ halfWidth, halfHeight ])),\r\n new QuadNode(new Rect([ center.x, center.y ], [ halfWidth, halfHeight ]))\r\n );\r\n };\r\n\r\n return QuadNode;\r\n }(QuadRoot));\r\n\r\n var ROOT_SIZE = 3000;\r\n var LEVEL_STEP = 10000;\r\n var MAX_LEVEL = 75;\r\n\r\n var ShapesQuadTree = (function (Class$$1) {\r\n function ShapesQuadTree() {\r\n Class$$1.call(this);\r\n\r\n this.initRoots();\r\n }\r\n\r\n extendStatic(ShapesQuadTree, Class$$1);\r\n ShapesQuadTree.prototype = Object.create( Class$$1 && Class$$1.prototype );\r\n ShapesQuadTree.prototype.constructor = ShapesQuadTree;\r\n ShapesQuadTree.fn = ShapesQuadTree.prototype;\r\n ShapesQuadTree.fn.init = ShapesQuadTree.fn.constructor;\r\n\r\n ShapesQuadTree.prototype.initRoots = function initRoots () {\r\n this.rootMap = {};\r\n this.root = new QuadRoot();\r\n this.rootElements = [];\r\n };\r\n\r\n ShapesQuadTree.prototype.clear = function clear () {\r\n var this$1$1 = this;\r\n\r\n var rootElements = this.rootElements;\r\n for (var idx = 0; idx < rootElements.length; idx++) {\r\n this$1$1.remove(rootElements[idx]);\r\n }\r\n this.initRoots();\r\n };\r\n\r\n ShapesQuadTree.prototype.pointShape = function pointShape (point) {\r\n var sectorRoot = ( this.rootMap[ Math.floor( point.x / ROOT_SIZE ) ] || {} )[ Math.floor( point.y / ROOT_SIZE ) ];\r\n var result = this.root.pointShapes(point);\r\n\r\n if (sectorRoot) {\r\n result = result.concat(sectorRoot.pointShapes(point));\r\n }\r\n\r\n this.assignZindex(result);\r\n\r\n result.sort(zIndexComparer);\r\n for (var idx = 0; idx < result.length; idx++) {\r\n if (result[idx].containsPoint(point)) {\r\n return result[idx];\r\n }\r\n }\r\n };\r\n\r\n ShapesQuadTree.prototype.assignZindex = function assignZindex (elements) {\r\n var this$1$1 = this;\r\n\r\n for (var idx = 0; idx < elements.length; idx++) {\r\n var element = elements[idx];\r\n var zIndex = 0;\r\n var levelWeight = Math.pow(LEVEL_STEP, MAX_LEVEL);\r\n var parents = [];\r\n\r\n while (element) {\r\n parents.push(element);\r\n element = element.parent;\r\n }\r\n\r\n while (parents.length) {\r\n element = parents.pop();\r\n zIndex += ((element.parent ? element.parent.children : this$1$1.rootElements).indexOf(element) + 1) * levelWeight;\r\n levelWeight /= LEVEL_STEP;\r\n }\r\n\r\n elements[idx]._zIndex = zIndex;\r\n }\r\n };\r\n\r\n ShapesQuadTree.prototype.optionsChange = function optionsChange (e) {\r\n if (e.field === \"transform\" || e.field === \"stroke.width\") {\r\n this.bboxChange(e.element);\r\n }\r\n };\r\n\r\n ShapesQuadTree.prototype.geometryChange = function geometryChange (e) {\r\n this.bboxChange(e.element);\r\n };\r\n\r\n ShapesQuadTree.prototype.bboxChange = function bboxChange (element) {\r\n var this$1$1 = this;\r\n\r\n if (element.nodeType === \"Group\") {\r\n for (var idx = 0; idx < element.children.length; idx++) {\r\n this$1$1.bboxChange(element.children[idx]);\r\n }\r\n } else {\r\n if (element._quadNode) {\r\n element._quadNode.remove(element);\r\n }\r\n this._insertShape(element);\r\n }\r\n };\r\n\r\n ShapesQuadTree.prototype.add = function add (elements) {\r\n var elementsArray = Array.isArray(elements) ? elements.slice(0) : [ elements ];\r\n\r\n append$1$1(this.rootElements, elementsArray);\r\n this._insert(elementsArray);\r\n };\r\n\r\n ShapesQuadTree.prototype.childrenChange = function childrenChange (e) {\r\n var this$1$1 = this;\r\n\r\n if (e.action === \"remove\") {\r\n for (var idx = 0; idx < e.items.length; idx++) {\r\n this$1$1.remove(e.items[idx]);\r\n }\r\n } else {\r\n this._insert(Array.prototype.slice.call(e.items, 0));\r\n }\r\n };\r\n\r\n ShapesQuadTree.prototype._insert = function _insert (elements) {\r\n var this$1$1 = this;\r\n\r\n var element;\r\n\r\n while (elements.length > 0) {\r\n element = elements.pop();\r\n element.addObserver(this$1$1);\r\n if (element.nodeType === \"Group\") {\r\n append$1$1(elements, element.children);\r\n } else {\r\n this$1$1._insertShape(element);\r\n }\r\n }\r\n };\r\n\r\n ShapesQuadTree.prototype._insertShape = function _insertShape (shape) {\r\n var bbox = shape.bbox();\r\n if (bbox) {\r\n var sectors = this.getSectors(bbox);\r\n var x = sectors[0][0];\r\n var y = sectors[1][0];\r\n\r\n if (this.inRoot(sectors)) {\r\n this.root.insert(shape, bbox);\r\n } else {\r\n var rootMap = this.rootMap;\r\n if (!rootMap[x]) {\r\n rootMap[x] = {};\r\n }\r\n\r\n if (!rootMap[x][y]) {\r\n rootMap[x][y] = new QuadNode(\r\n new Rect([ x * ROOT_SIZE, y * ROOT_SIZE ], [ ROOT_SIZE, ROOT_SIZE ])\r\n );\r\n }\r\n\r\n rootMap[x][y].insert(shape, bbox);\r\n }\r\n }\r\n };\r\n\r\n ShapesQuadTree.prototype.remove = function remove (element) {\r\n var this$1$1 = this;\r\n\r\n element.removeObserver(this);\r\n\r\n if (element.nodeType === \"Group\") {\r\n var children = element.children;\r\n for (var idx = 0; idx < children.length; idx++) {\r\n this$1$1.remove(children[idx]);\r\n }\r\n } else if (element._quadNode) {\r\n element._quadNode.remove(element);\r\n delete element._quadNode;\r\n }\r\n };\r\n\r\n ShapesQuadTree.prototype.inRoot = function inRoot (sectors) {\r\n return sectors[0].length > 1 || sectors[1].length > 1;\r\n };\r\n\r\n ShapesQuadTree.prototype.getSectors = function getSectors (rect) {\r\n var bottomRight = rect.bottomRight();\r\n var bottomX = Math.floor(bottomRight.x / ROOT_SIZE);\r\n var bottomY = Math.floor(bottomRight.y / ROOT_SIZE);\r\n var sectors = [ [], [] ];\r\n for (var x = Math.floor(rect.origin.x / ROOT_SIZE); x <= bottomX; x++) {\r\n sectors[0].push(x);\r\n }\r\n for (var y = Math.floor(rect.origin.y / ROOT_SIZE); y <= bottomY; y++) {\r\n sectors[1].push(y);\r\n }\r\n return sectors;\r\n };\r\n\r\n return ShapesQuadTree;\r\n }(Class));\r\n\r\n function zIndexComparer(x1, x2) {\r\n if (x1._zIndex < x2._zIndex) {\r\n return 1;\r\n }\r\n if (x1._zIndex > x2._zIndex) {\r\n return -1;\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n var SurfaceCursor = function SurfaceCursor(surface) {\r\n surface.bind(\"mouseenter\", this._mouseenter.bind(this));\r\n surface.bind(\"mouseleave\", this._mouseleave.bind(this));\r\n\r\n this.element = surface.element;\r\n };\r\n\r\n SurfaceCursor.prototype.clear = function clear () {\r\n this._resetCursor();\r\n };\r\n\r\n SurfaceCursor.prototype.destroy = function destroy () {\r\n this._resetCursor();\r\n delete this.element;\r\n };\r\n\r\n SurfaceCursor.prototype._mouseenter = function _mouseenter (e) {\r\n var cursor = this._shapeCursor(e);\r\n\r\n if (!cursor) {\r\n this._resetCursor();\r\n } else {\r\n if (!this._current) {\r\n this._defaultCursor = this._getCursor();\r\n }\r\n\r\n this._setCursor(cursor);\r\n }\r\n };\r\n\r\n SurfaceCursor.prototype._mouseleave = function _mouseleave () {\r\n this._resetCursor();\r\n };\r\n\r\n SurfaceCursor.prototype._shapeCursor = function _shapeCursor (e) {\r\n var shape = e.element;\r\n\r\n while (shape && !defined(shape.options.cursor)) {\r\n shape = shape.parent;\r\n }\r\n\r\n if (shape) {\r\n return shape.options.cursor;\r\n }\r\n };\r\n\r\n SurfaceCursor.prototype._getCursor = function _getCursor () {\r\n if (this.element) {\r\n return this.element.style.cursor;\r\n }\r\n };\r\n\r\n SurfaceCursor.prototype._setCursor = function _setCursor (cursor) {\r\n if (this.element) {\r\n this.element.style.cursor = cursor;\r\n this._current = cursor;\r\n }\r\n };\r\n\r\n SurfaceCursor.prototype._resetCursor = function _resetCursor () {\r\n if (this._current) {\r\n this._setCursor(this._defaultCursor || \"\");\r\n delete this._current;\r\n }\r\n };\r\n\r\n function renderPath(ctx, path) {\r\n var segments = path.segments;\r\n\r\n if (segments.length === 0) {\r\n return;\r\n }\r\n\r\n var segment = segments[0];\r\n var anchor = segment.anchor();\r\n ctx.moveTo(anchor.x, anchor.y);\r\n\r\n for (var i = 1; i < segments.length; i++) {\r\n segment = segments[i];\r\n anchor = segment.anchor();\r\n\r\n var prevSeg = segments[i - 1];\r\n var prevOut = prevSeg.controlOut();\r\n var controlIn = segment.controlIn();\r\n\r\n if (prevOut && controlIn) {\r\n ctx.bezierCurveTo(prevOut.x, prevOut.y,\r\n controlIn.x, controlIn.y,\r\n anchor.x, anchor.y);\r\n } else {\r\n ctx.lineTo(anchor.x, anchor.y);\r\n }\r\n }\r\n\r\n if (path.options.closed) {\r\n ctx.closePath();\r\n }\r\n }\r\n\r\n function addGradientStops(gradient, stops) {\r\n for (var idx = 0; idx < stops.length; idx++) {\r\n var stop = stops[idx];\r\n var color = kendo.parseColor(stop.color());\r\n\r\n color.a *= stop.opacity();\r\n\r\n gradient.addColorStop(stop.offset(), color.toCssRgba());\r\n }\r\n }\r\n\r\n var PathNode$2 = (function (Node) {\r\n function PathNode () {\r\n Node.apply(this, arguments);\r\n }\r\n\r\n extendStatic(PathNode, Node);\r\n PathNode.prototype = Object.create( Node && Node.prototype );\r\n PathNode.prototype.constructor = PathNode;\r\n PathNode.fn = PathNode.prototype;\r\n PathNode.fn.init = PathNode.fn.constructor;\r\n\r\n PathNode.prototype.renderTo = function renderTo (ctx) {\r\n ctx.save();\r\n\r\n this.setTransform(ctx);\r\n this.setClip(ctx);\r\n this.setOpacity(ctx);\r\n\r\n ctx.beginPath();\r\n\r\n this.renderPoints(ctx, this.srcElement);\r\n\r\n this.setLineDash(ctx);\r\n this.setLineCap(ctx);\r\n this.setLineJoin(ctx);\r\n\r\n this.setFill(ctx);\r\n this.setStroke(ctx);\r\n\r\n ctx.restore();\r\n };\r\n\r\n PathNode.prototype.setFill = function setFill (ctx) {\r\n var fill = this.srcElement.options.fill;\r\n var hasFill = false;\r\n\r\n if (fill) {\r\n if (fill.nodeType === \"Gradient\") {\r\n this.setGradientFill(ctx, fill);\r\n hasFill = true;\r\n } else if (!isTransparent(fill.color)) {\r\n ctx.fillStyle = fill.color;\r\n\r\n ctx.save();\r\n this.globalAlpha(ctx, fill.opacity);\r\n ctx.fill();\r\n ctx.restore();\r\n\r\n hasFill = true;\r\n }\r\n }\r\n\r\n return hasFill;\r\n };\r\n\r\n PathNode.prototype.setGradientFill = function setGradientFill (ctx, fill) {\r\n var bbox = this.srcElement.rawBBox();\r\n var gradient;\r\n\r\n if (fill instanceof LinearGradient) {\r\n var start = fill.start();\r\n var end = fill.end();\r\n gradient = ctx.createLinearGradient(start.x, start.y, end.x, end.y);\r\n } else if (fill instanceof RadialGradient) {\r\n var center = fill.center();\r\n gradient = ctx.createRadialGradient(center.x, center.y, 0, center.x, center.y, fill.radius());\r\n }\r\n\r\n addGradientStops(gradient, fill.stops);\r\n\r\n ctx.save();\r\n\r\n if (!fill.userSpace()) {\r\n ctx.transform(bbox.width(), 0, 0, bbox.height(), bbox.origin.x, bbox.origin.y);\r\n }\r\n ctx.fillStyle = gradient;\r\n ctx.fill();\r\n\r\n ctx.restore();\r\n };\r\n\r\n PathNode.prototype.setStroke = function setStroke (ctx) {\r\n var stroke = this.srcElement.options.stroke;\r\n if (stroke && !isTransparent(stroke.color) && stroke.width > 0) {\r\n ctx.strokeStyle = stroke.color;\r\n ctx.lineWidth = valueOrDefault(stroke.width, 1);\r\n ctx.lineJoin = valueOrDefault(stroke.lineJoin, ctx.lineJoin);\r\n\r\n ctx.save();\r\n this.globalAlpha(ctx, stroke.opacity);\r\n ctx.stroke();\r\n ctx.restore();\r\n\r\n return true;\r\n }\r\n };\r\n\r\n PathNode.prototype.dashType = function dashType () {\r\n var stroke = this.srcElement.options.stroke;\r\n if (stroke && stroke.dashType) {\r\n return stroke.dashType.toLowerCase();\r\n }\r\n };\r\n\r\n PathNode.prototype.setLineDash = function setLineDash (ctx) {\r\n var dashType = this.dashType();\r\n if (dashType && dashType !== SOLID) {\r\n var dashArray = DASH_ARRAYS[dashType];\r\n if (ctx.setLineDash) {\r\n ctx.setLineDash(dashArray);\r\n } else {\r\n ctx.mozDash = dashArray;\r\n ctx.webkitLineDash = dashArray;\r\n }\r\n }\r\n };\r\n\r\n PathNode.prototype.setLineCap = function setLineCap (ctx) {\r\n var dashType = this.dashType();\r\n var stroke = this.srcElement.options.stroke;\r\n if (dashType && dashType !== SOLID) {\r\n ctx.lineCap = BUTT;\r\n } else if (stroke && stroke.lineCap) {\r\n ctx.lineCap = stroke.lineCap;\r\n }\r\n };\r\n\r\n PathNode.prototype.setLineJoin = function setLineJoin (ctx) {\r\n var stroke = this.srcElement.options.stroke;\r\n if (stroke && stroke.lineJoin) {\r\n ctx.lineJoin = stroke.lineJoin;\r\n }\r\n };\r\n\r\n PathNode.prototype.renderPoints = function renderPoints (ctx, path) {\r\n renderPath(ctx, path);\r\n };\r\n\r\n return PathNode;\r\n }(Node$2));\r\n\r\n var ArcNode$2 = (function (PathNode) {\r\n function ArcNode () {\r\n PathNode.apply(this, arguments);\r\n }\r\n\r\n extendStatic(ArcNode, PathNode);\r\n ArcNode.prototype = Object.create( PathNode && PathNode.prototype );\r\n ArcNode.prototype.constructor = ArcNode;\r\n ArcNode.fn = ArcNode.prototype;\r\n ArcNode.fn.init = ArcNode.fn.constructor;\r\n\r\n ArcNode.prototype.renderPoints = function renderPoints (ctx) {\r\n var path = this.srcElement.toPath();\r\n renderPath(ctx, path);\r\n };\r\n\r\n return ArcNode;\r\n }(PathNode$2));\r\n\r\n var CircleNode$2 = (function (PathNode) {\r\n function CircleNode () {\r\n PathNode.apply(this, arguments);\r\n }\r\n\r\n extendStatic(CircleNode, PathNode);\r\n CircleNode.prototype = Object.create( PathNode && PathNode.prototype );\r\n CircleNode.prototype.constructor = CircleNode;\r\n CircleNode.fn = CircleNode.prototype;\r\n CircleNode.fn.init = CircleNode.fn.constructor;\r\n\r\n CircleNode.prototype.renderPoints = function renderPoints (ctx) {\r\n var ref = this.srcElement.geometry();\r\n var center = ref.center;\r\n var radius = ref.radius;\r\n\r\n ctx.arc(center.x, center.y, radius, 0, Math.PI * 2);\r\n };\r\n\r\n return CircleNode;\r\n }(PathNode$2));\r\n\r\n var ImageNode$2 = (function (PathNode) {\r\n function ImageNode(srcElement, cors) {\r\n PathNode.call(this, srcElement);\r\n\r\n this.onLoad = this.onLoad.bind(this);\r\n this.onError = this.onError.bind(this);\r\n\r\n this.loading = createPromise();\r\n\r\n var img = this.img = new Image();\r\n var src = srcElement.src();\r\n\r\n if (cors && !(/^data:/i.test(src))) {\r\n img.crossOrigin = cors;\r\n }\r\n\r\n if (src) {\r\n img.src = src;\r\n }\r\n\r\n if (img.complete) {\r\n this.onLoad();\r\n } else {\r\n img.onload = this.onLoad;\r\n img.onerror = this.onError;\r\n }\r\n }\r\n\r\n extendStatic(ImageNode, PathNode);\r\n ImageNode.prototype = Object.create( PathNode && PathNode.prototype );\r\n ImageNode.prototype.constructor = ImageNode;\r\n ImageNode.fn = ImageNode.prototype;\r\n ImageNode.fn.init = ImageNode.fn.constructor;\r\n\r\n ImageNode.prototype.renderTo = function renderTo (ctx) {\r\n if (this.loading.state() === \"resolved\") {\r\n ctx.save();\r\n\r\n this.setTransform(ctx);\r\n this.setClip(ctx);\r\n\r\n this.drawImage(ctx);\r\n\r\n ctx.restore();\r\n }\r\n };\r\n\r\n ImageNode.prototype.optionsChange = function optionsChange (e) {\r\n if (e.field === \"src\") {\r\n this.loading = createPromise();\r\n this.img.src = this.srcElement.src();\r\n } else {\r\n PathNode.prototype.optionsChange.call(this, e);\r\n }\r\n };\r\n\r\n ImageNode.prototype.onLoad = function onLoad () {\r\n this.loading.resolve();\r\n this.invalidate();\r\n };\r\n\r\n ImageNode.prototype.onError = function onError () {\r\n this.loading.reject(new Error(\r\n \"Unable to load image '\" + this.img.src +\r\n \"'. Check for connectivity and verify CORS headers.\"\r\n ));\r\n };\r\n\r\n ImageNode.prototype.drawImage = function drawImage (ctx) {\r\n var rect = this.srcElement.rect();\r\n var topLeft = rect.topLeft();\r\n\r\n ctx.drawImage(\r\n this.img, topLeft.x, topLeft.y, rect.width(), rect.height()\r\n );\r\n };\r\n\r\n return ImageNode;\r\n }(PathNode$2));\r\n\r\n var MultiPathNode$2 = (function (PathNode) {\r\n function MultiPathNode () {\r\n PathNode.apply(this, arguments);\r\n }\r\n\r\n extendStatic(MultiPathNode, PathNode);\r\n MultiPathNode.prototype = Object.create( PathNode && PathNode.prototype );\r\n MultiPathNode.prototype.constructor = MultiPathNode;\r\n MultiPathNode.fn = MultiPathNode.prototype;\r\n MultiPathNode.fn.init = MultiPathNode.fn.constructor;\r\n\r\n MultiPathNode.prototype.renderPoints = function renderPoints (ctx) {\r\n var paths = this.srcElement.paths;\r\n for (var i = 0; i < paths.length; i++) {\r\n renderPath(ctx, paths[i]);\r\n }\r\n };\r\n\r\n return MultiPathNode;\r\n }(PathNode$2));\r\n\r\n var RectNode$2 = (function (PathNode) {\r\n function RectNode () {\r\n PathNode.apply(this, arguments);\r\n }\r\n\r\n extendStatic(RectNode, PathNode);\r\n RectNode.prototype = Object.create( PathNode && PathNode.prototype );\r\n RectNode.prototype.constructor = RectNode;\r\n RectNode.fn = RectNode.prototype;\r\n RectNode.fn.init = RectNode.fn.constructor;\r\n\r\n RectNode.prototype.renderPoints = function renderPoints (ctx) {\r\n var geometry = this.srcElement.geometry();\r\n var ref = geometry.cornerRadius;\r\n var rx = ref[0];\r\n var ry = ref[1];\r\n\r\n if (rx === 0 && ry === 0) {\r\n var origin = geometry.origin;\r\n var size = geometry.size;\r\n ctx.rect(origin.x, origin.y, size.width, size.height);\r\n } else {\r\n PathNode.prototype.renderPoints.call(this, ctx, Path.fromRect(geometry));\r\n }\r\n };\r\n\r\n return RectNode;\r\n }(PathNode$2));\r\n\r\n var TextNode$2 = (function (PathNode) {\r\n function TextNode () {\r\n PathNode.apply(this, arguments);\r\n }\r\n\r\n extendStatic(TextNode, PathNode);\r\n TextNode.prototype = Object.create( PathNode && PathNode.prototype );\r\n TextNode.prototype.constructor = TextNode;\r\n TextNode.fn = TextNode.prototype;\r\n TextNode.fn.init = TextNode.fn.constructor;\r\n\r\n TextNode.prototype.renderTo = function renderTo (ctx) {\r\n var text = this.srcElement;\r\n var pos = text.position();\r\n var size = text.measure();\r\n\r\n ctx.save();\r\n\r\n this.setTransform(ctx);\r\n this.setClip(ctx);\r\n this.setOpacity(ctx);\r\n\r\n ctx.beginPath();\r\n\r\n ctx.font = text.options.font;\r\n ctx.textAlign = 'left';\r\n\r\n if (text.options.paintOrder === 'stroke') {\r\n this.stroke(ctx, text, pos, size);\r\n this.fill(ctx, text, pos, size);\r\n } else {\r\n this.fill(ctx, text, pos, size);\r\n this.stroke(ctx, text, pos, size);\r\n }\r\n\r\n ctx.restore();\r\n };\r\n\r\n TextNode.prototype.stroke = function stroke (ctx, text, pos, size) {\r\n if (this.setStroke(ctx)) {\r\n this.setLineDash(ctx);\r\n ctx.strokeText(text.content(), pos.x, pos.y + size.baseline);\r\n }\r\n };\r\n\r\n TextNode.prototype.fill = function fill (ctx, text, pos, size) {\r\n if (this.setFill(ctx)) {\r\n ctx.fillText(text.content(), pos.x, pos.y + size.baseline);\r\n }\r\n };\r\n\r\n return TextNode;\r\n }(PathNode$2));\r\n\r\n NODE_MAP$2.Arc = ArcNode$2;\r\n NODE_MAP$2.Circle = CircleNode$2;\r\n NODE_MAP$2.Group = GroupNode$2;\r\n NODE_MAP$2.Image = ImageNode$2;\r\n NODE_MAP$2.MultiPath = MultiPathNode$2;\r\n NODE_MAP$2.Path = PathNode$2;\r\n NODE_MAP$2.Rect = RectNode$2;\r\n NODE_MAP$2.Text = TextNode$2;\r\n\r\n var Surface$4 = (function (BaseSurface) {\r\n function Surface(element, options) {\r\n BaseSurface.call(this, element, options);\r\n\r\n this.element.innerHTML = this._template(this);\r\n\r\n var canvas = this.element.firstElementChild;\r\n canvas.style.width = '100%';\r\n canvas.style.height = '100%';\r\n\r\n var size = elementSize(element);\r\n\r\n canvas.width = size.width;\r\n canvas.height = size.height;\r\n\r\n this._rootElement = canvas;\r\n\r\n this._root = new RootNode$2(canvas, size);\r\n\r\n this._mouseTrackHandler = this._trackMouse.bind(this);\r\n\r\n bindEvents(this.element, {\r\n click: this._mouseTrackHandler,\r\n mousemove: this._mouseTrackHandler\r\n });\r\n }\r\n\r\n extendStatic(Surface, BaseSurface);\r\n Surface.prototype = Object.create( BaseSurface && BaseSurface.prototype );\r\n Surface.prototype.constructor = Surface;\r\n Surface.fn = Surface.prototype;\r\n Surface.fn.init = Surface.fn.constructor;\r\n\r\n var prototypeAccessors = { type: {} };\r\n\r\n prototypeAccessors.type.get = function () {\r\n return \"canvas\";\r\n };\r\n\r\n Surface.prototype.destroy = function destroy () {\r\n BaseSurface.prototype.destroy.call(this);\r\n\r\n if (this._root) {\r\n this._root.destroy();\r\n this._root = null;\r\n }\r\n\r\n if (this._searchTree) {\r\n this._searchTree.clear();\r\n delete this._searchTree;\r\n }\r\n\r\n if (this._cursor) {\r\n this._cursor.destroy();\r\n delete this._cursor;\r\n }\r\n\r\n unbindEvents(this.element, {\r\n click: this._mouseTrackHandler,\r\n mousemove: this._mouseTrackHandler\r\n });\r\n };\r\n\r\n Surface.prototype.draw = function draw (element) {\r\n BaseSurface.prototype.draw.call(this, element);\r\n this._root.load([ element ], undefined, this.options.cors);\r\n\r\n if (this._searchTree) {\r\n this._searchTree.add([ element ]);\r\n }\r\n };\r\n\r\n Surface.prototype.clear = function clear () {\r\n BaseSurface.prototype.clear.call(this);\r\n this._root.clear();\r\n\r\n if (this._searchTree) {\r\n this._searchTree.clear();\r\n }\r\n\r\n if (this._cursor) {\r\n this._cursor.clear();\r\n }\r\n };\r\n\r\n Surface.prototype.eventTarget = function eventTarget (e) {\r\n if (this._searchTree) {\r\n var point = this._surfacePoint(e);\r\n var shape = this._searchTree.pointShape(point);\r\n return shape;\r\n }\r\n };\r\n\r\n Surface.prototype.image = function image () {\r\n var ref = this;\r\n var root = ref._root;\r\n var rootElement = ref._rootElement;\r\n var loadingStates = [];\r\n\r\n root.traverse(function (childNode) {\r\n if (childNode.loading) {\r\n loadingStates.push(childNode.loading);\r\n }\r\n });\r\n\r\n var promise = createPromise();\r\n var resolveDataURL = function () {\r\n root._invalidate({ fixedScale: true });\r\n\r\n try {\r\n var data = rootElement.toDataURL();\r\n promise.resolve(data);\r\n } catch (e) {\r\n promise.reject(e);\r\n }\r\n };\r\n\r\n promiseAll(loadingStates).then(resolveDataURL, resolveDataURL);\r\n\r\n return promise;\r\n };\r\n\r\n Surface.prototype.suspendTracking = function suspendTracking () {\r\n BaseSurface.prototype.suspendTracking.call(this);\r\n if (this._searchTree) {\r\n this._searchTree.clear();\r\n delete this._searchTree;\r\n }\r\n };\r\n\r\n Surface.prototype.resumeTracking = function resumeTracking () {\r\n BaseSurface.prototype.resumeTracking.call(this);\r\n if (!this._searchTree) {\r\n this._searchTree = new ShapesQuadTree();\r\n\r\n var childNodes = this._root.childNodes;\r\n var rootElements = [];\r\n for (var idx = 0; idx < childNodes.length; idx++) {\r\n rootElements.push(childNodes[idx].srcElement);\r\n }\r\n this._searchTree.add(rootElements);\r\n }\r\n };\r\n\r\n Surface.prototype._resize = function _resize () {\r\n this._rootElement.width = this._size.width;\r\n this._rootElement.height = this._size.height;\r\n\r\n this._root.size = this._size;\r\n this._root.invalidate();\r\n };\r\n\r\n Surface.prototype._template = function _template () {\r\n return \"\";\r\n };\r\n\r\n Surface.prototype._enableTracking = function _enableTracking () {\r\n this._searchTree = new ShapesQuadTree();\r\n this._cursor = new SurfaceCursor(this);\r\n\r\n BaseSurface.prototype._enableTracking.call(this);\r\n };\r\n\r\n Surface.prototype._trackMouse = function _trackMouse (e) {\r\n if (this._suspendedTracking) {\r\n return;\r\n }\r\n\r\n var shape = this.eventTarget(e);\r\n\r\n if (e.type !== \"click\") {\r\n var currentShape = this._currentShape;\r\n if (currentShape && currentShape !== shape) {\r\n this.trigger(\"mouseleave\", {\r\n element: currentShape,\r\n originalEvent: e,\r\n type: \"mouseleave\"\r\n });\r\n }\r\n\r\n if (shape && currentShape !== shape) {\r\n this.trigger(\"mouseenter\", {\r\n element: shape,\r\n originalEvent: e,\r\n type: \"mouseenter\"\r\n });\r\n }\r\n\r\n this.trigger(\"mousemove\", {\r\n element: shape,\r\n originalEvent: e,\r\n type: \"mousemove\"\r\n });\r\n\r\n this._currentShape = shape;\r\n } else if (shape) {\r\n this.trigger(\"click\", {\r\n element: shape,\r\n originalEvent: e,\r\n type: \"click\"\r\n });\r\n }\r\n };\r\n\r\n Object.defineProperties( Surface.prototype, prototypeAccessors );\r\n\r\n return Surface;\r\n }(Surface$2));\r\n\r\n var instance$2;\r\n var support$1;\r\n\r\n var hasDocument = function () { return typeof document !== \"undefined\"; };\r\n\r\n var supportsCanvas = function () { return hasDocument() &&\r\n document.createElement(\"canvas\").getContext; };\r\n\r\n var supportsSVG = function () { return hasDocument() &&\r\n document.implementation.hasFeature(\"http://www.w3.org/TR/SVG11/feature#BasicStructure\", \"1.1\"); };\r\n\r\n var SurfaceFactory = (function (Class$$1) {\r\n function SurfaceFactory() {\r\n Class$$1.call(this);\r\n\r\n this._items = [ {\r\n name: \"svg\",\r\n type: Surface$3\r\n }, {\r\n name: \"canvas\",\r\n type: Surface$4\r\n } ];\r\n }\r\n\r\n extendStatic(SurfaceFactory, Class$$1);\r\n SurfaceFactory.prototype = Object.create( Class$$1 && Class$$1.prototype );\r\n SurfaceFactory.prototype.constructor = SurfaceFactory;\r\n SurfaceFactory.fn = SurfaceFactory.prototype;\r\n SurfaceFactory.fn.init = SurfaceFactory.fn.constructor;\r\n\r\n var staticAccessors = { support: {},current: {} };\r\n\r\n staticAccessors.support.get = function () {\r\n if (!support$1) {\r\n support$1 = {\r\n canvas: supportsCanvas(),\r\n svg: supportsSVG()\r\n };\r\n }\r\n\r\n return support$1;\r\n };\r\n\r\n staticAccessors.current.get = function () {\r\n if (!instance$2) {\r\n instance$2 = new SurfaceFactory();\r\n }\r\n\r\n return instance$2;\r\n };\r\n\r\n SurfaceFactory.prototype.create = function create (element, options) {\r\n var items = this._items;\r\n var match = items[0];\r\n\r\n if (options && options.type) {\r\n var preferred = options.type.toLowerCase();\r\n for (var i = 0; i < items.length; i++) {\r\n if (items[i].name === preferred) {\r\n match = items[i];\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (match) {\r\n return new match.type(element, options);\r\n }\r\n\r\n kendo.logToConsole(\r\n \"Warning: Unable to create Kendo UI Drawing Surface. Possible causes:\\n\" +\r\n \"- The browser does not support SVG and Canvas. User agent: \" + (navigator.userAgent));\r\n };\r\n\r\n Object.defineProperties( SurfaceFactory, staticAccessors );\r\n\r\n return SurfaceFactory;\r\n }(Class));\r\n\r\n var Surface = (function (BaseSurface) {\r\n function Surface () {\r\n BaseSurface.apply(this, arguments);\r\n }\r\n\r\n extendStatic(Surface, BaseSurface);\r\n Surface.prototype = Object.create( BaseSurface && BaseSurface.prototype );\r\n Surface.prototype.constructor = Surface;\r\n Surface.fn = Surface.prototype;\r\n Surface.fn.init = Surface.fn.constructor;\r\n\r\n var staticAccessors = { support: {} };\r\n\r\n staticAccessors.support.get = function () {\r\n return SurfaceFactory.support;\r\n };\r\n\r\n Surface.create = function create (element, options) {\r\n return SurfaceFactory.current.create(element, options);\r\n };\r\n\r\n Object.defineProperties( Surface, staticAccessors );\r\n\r\n return Surface;\r\n }(Surface$2));\r\n\r\n function exportGroup(group) {\r\n var root = new RootNode({\r\n skipBaseHref: true\r\n });\r\n var bbox = group.clippedBBox();\r\n var rootGroup = group;\r\n\r\n if (bbox) {\r\n var origin = bbox.getOrigin();\r\n var exportRoot = new Group();\r\n exportRoot.transform(transform$1().translate(-origin.x, -origin.y));\r\n exportRoot.children.push(group);\r\n rootGroup = exportRoot;\r\n }\r\n\r\n root.load([ rootGroup ]);\r\n\r\n var svg = \"\" + (root.render()) + \"\";\r\n\r\n root.destroy();\r\n\r\n return svg;\r\n }\r\n\r\n var svg$1 = {\r\n \tSurface: Surface$3,\r\n \tRootNode: RootNode,\r\n \tNode: Node,\r\n \tGroupNode: GroupNode,\r\n \tArcNode: ArcNode,\r\n \tCircleNode: CircleNode,\r\n \tRectNode: RectNode,\r\n \tImageNode: ImageNode,\r\n \tTextNode: TextNode,\r\n \tPathNode: PathNode,\r\n \tMultiPathNode: MultiPathNode,\r\n \tDefinitionNode: DefinitionNode,\r\n \tClipNode: ClipNode,\r\n \tGradientStopNode: GradientStopNode,\r\n \tLinearGradientNode: LinearGradientNode,\r\n \tRadialGradientNode: RadialGradientNode,\r\n \texportGroup: exportGroup\r\n };\r\n\r\n var canvas = {\r\n \tSurface: Surface$4,\r\n \tRootNode: RootNode$2,\r\n \tNode: Node$2,\r\n \tGroupNode: GroupNode$2,\r\n \tArcNode: ArcNode$2,\r\n \tCircleNode: CircleNode$2,\r\n \tRectNode: RectNode$2,\r\n \tImageNode: ImageNode$2,\r\n \tTextNode: TextNode$2,\r\n \tPathNode: PathNode$2,\r\n \tMultiPathNode: MultiPathNode$2\r\n };\r\n\r\n function exportImage(group, options) {\r\n var defaults = {\r\n width: \"800px\", height: \"600px\",\r\n cors: \"Anonymous\"\r\n };\r\n\r\n var exportRoot = group;\r\n var bbox = group.clippedBBox();\r\n\r\n if (bbox) {\r\n var origin = bbox.getOrigin();\r\n exportRoot = new Group();\r\n exportRoot.transform(transform$1().translate(-origin.x, -origin.y));\r\n exportRoot.children.push(group);\r\n\r\n var size = bbox.getSize();\r\n defaults.width = size.width + \"px\";\r\n defaults.height = size.height + \"px\";\r\n }\r\n\r\n var surfaceOptions = $.extend(defaults, options);\r\n\r\n var container = document.createElement(\"div\");\r\n var style = container.style;\r\n\r\n style.display = \"none\";\r\n style.width = surfaceOptions.width;\r\n style.height = surfaceOptions.height;\r\n document.body.appendChild(container);\r\n\r\n var surface = new Surface$4(container, surfaceOptions);\r\n surface.suspendTracking();\r\n surface.draw(exportRoot);\r\n\r\n var promise = surface.image();\r\n var destroy = function () {\r\n surface.destroy();\r\n document.body.removeChild(container);\r\n };\r\n promise.then(destroy, destroy);\r\n\r\n return promise;\r\n }\r\n\r\n function exportSVG(group, options) {\r\n var svg = exportGroup(group);\r\n\r\n if (!options || !options.raw) {\r\n svg = \"data:image/svg+xml;base64,\" + encodeBase64(svg);\r\n }\r\n\r\n return createPromise().resolve(svg);\r\n }\r\n\r\n /* eslint-disable no-multi-spaces, key-spacing, indent, camelcase, space-before-blocks, eqeqeq, brace-style */\r\n /* eslint-disable space-infix-ops, space-before-function-paren, array-bracket-spacing, object-curly-spacing */\r\n /* eslint-disable no-nested-ternary, max-params, default-case, no-else-return, no-empty, yoda */\r\n /* eslint-disable no-param-reassign, no-var, block-scoped-var */\r\n\r\n var browser = supportBrowser || {};\r\n /*\r\n\r\n XXX: to test:\r\n\r\n - cloneNodes function:\r\n - drawing document containing canvas with page breaking\r\n - drawing document with named radio -s (should not clear selection)\r\n - IE9/IE10 don't support el.dataset; do they copy user data?\r\n\r\n - repeating table headers/footers on page breaking\r\n\r\n - forceBreak, keepTogether\r\n\r\n - avoidLinks\r\n\r\n */\r\n\r\n /* -----[ local vars ]----- */\r\n\r\n function slice$1$1(thing) {\r\n return Array.prototype.slice.call(thing);\r\n }\r\n\r\n var KENDO_PSEUDO_ELEMENT = \"KENDO-PSEUDO-ELEMENT\";\r\n var KENDO_BULLET_TYPE = 'data-kendo-bullet-type';\r\n\r\n var IMAGE_CACHE = {};\r\n\r\n var nodeInfo = {};\r\n nodeInfo._root = nodeInfo;\r\n\r\n /* -----[ Custom Text node to speed up rendering in kendo.pdf ]----- */\r\n\r\n var inBrowser = typeof window !== 'undefined';\r\n var microsoft = inBrowser ? browser.msie || browser.edge : false;\r\n\r\n var TextRect = (function (Text$$1) {\r\n function TextRect(str, rect, options) {\r\n Text$$1.call(this, str, rect.getOrigin(), options);\r\n this._pdfRect = rect;\r\n }\r\n\r\n extendStatic(TextRect, Text$$1);\r\n TextRect.prototype = Object.create( Text$$1 && Text$$1.prototype );\r\n TextRect.prototype.constructor = TextRect;\r\n TextRect.fn = TextRect.prototype;\r\n TextRect.fn.init = TextRect.fn.constructor;\r\n TextRect.prototype.rect = function rect () {\r\n // this is the crux of it: we can avoid a call to\r\n // measure(), which is what the base class does, since we\r\n // already know the rect. measure() is s-l-o-w.\r\n return this._pdfRect;\r\n };\r\n TextRect.prototype.rawBBox = function rawBBox () {\r\n // also let's avoid creating a new rectangle.\r\n return this._pdfRect;\r\n };\r\n\r\n return TextRect;\r\n }(Text));\r\n\r\n function addClass(el, cls) {\r\n if (el.classList) {\r\n el.classList.add(cls);\r\n } else {\r\n el.className += \" \" + cls;\r\n }\r\n }\r\n\r\n function removeClass(el, cls) {\r\n if (el.classList) {\r\n el.classList.remove(cls);\r\n } else {\r\n el.className = el.className.split(/\\s+/).reduce(function(a, word){\r\n if (word != cls) {\r\n a.push(word);\r\n }\r\n return a;\r\n }, []).join(\" \");\r\n }\r\n }\r\n\r\n function setCSS(el, styles) {\r\n Object.keys(styles).forEach(function(key){\r\n el.style[key] = styles[key];\r\n });\r\n }\r\n\r\n var matches = typeof Element !== \"undefined\" && Element.prototype && (function(p){\r\n if (p.matches) {\r\n return function(el, selector) { return el.matches(selector); };\r\n }\r\n if (p.webkitMatchesSelector) {\r\n return function(el, selector) { return el.webkitMatchesSelector(selector); };\r\n }\r\n if (p.mozMatchesSelector) {\r\n return function(el, selector) { return el.mozMatchesSelector(selector); };\r\n }\r\n if (p.msMatchesSelector) {\r\n return function(el, selector) { return el.msMatchesSelector(selector); };\r\n }\r\n return function(s) {\r\n \treturn [].indexOf.call(document.querySelectorAll(s), this) !== -1;\r\n };\r\n })(Element.prototype);\r\n\r\n function closest(el, selector) {\r\n if (el.closest) {\r\n return el.closest(selector);\r\n }\r\n // IE: stringifying rather than simply comparing with `document`,\r\n // which is not iframe-proof and fails in editor export —\r\n // https://github.com/telerik/kendo/issues/6721\r\n while (el && !/^\\[object (?:HTML)?Document\\]$/.test(String(el))) {\r\n if (el.nodeType == 1 /* Element */ && matches(el, selector)) {\r\n return el;\r\n }\r\n el = el.parentNode;\r\n }\r\n }\r\n\r\n // clone nodes ourselves, so that we redraw (DOM or\r\n // jQuery clone will not)\r\n var cloneNodes = (function($){\r\n if ($) {\r\n // if we have Kendo and jQuery, use this version as it will\r\n // maintain proper links between cloned element and Kendo\r\n // widgets (i.e. it clones jQuery data(), which isn't the same\r\n // as element's data attributes).\r\n // https://github.com/telerik/kendo-ui-core/issues/2750\r\n return function cloneNodes(el) {\r\n var clone = el.cloneNode(false);\r\n if (el.nodeType == 1 /* Element */) {\r\n var $el = $(el), $clone = $(clone), i;\r\n var data = $el.data();\r\n for (i in data) {\r\n $clone.data(i, data[i]);\r\n }\r\n if (/^canvas$/i.test(el.tagName)) {\r\n clone.getContext(\"2d\").drawImage(el, 0, 0);\r\n } else if (/^(?:input|select|textarea|option)$/i.test(el.tagName)) {\r\n // drop the name attributes so that we don't affect the selection of the\r\n // original nodes (i.e. checked status of radio buttons) when we insert our copy\r\n // into the DOM. https://github.com/telerik/kendo/issues/5409\r\n clone.removeAttribute(\"id\");\r\n clone.removeAttribute(\"name\");\r\n if (!/^textarea$/i.test(el.tagName)) {\r\n clone.value = el.value;\r\n }\r\n clone.checked = el.checked;\r\n clone.selected = el.selected;\r\n }\r\n for (i = el.firstChild; i; i = i.nextSibling) {\r\n clone.appendChild(cloneNodes(i));\r\n }\r\n }\r\n return clone;\r\n };\r\n } else {\r\n // the no-jQuery version\r\n return function cloneNodes(el) {\r\n var clone = (function dive(node){\r\n var clone = node.cloneNode(false);\r\n if (node._kendoExportVisual) {\r\n clone._kendoExportVisual = node._kendoExportVisual;\r\n }\r\n for (var i = node.firstChild; i; i = i.nextSibling) {\r\n clone.appendChild(dive(i));\r\n }\r\n return clone;\r\n })(el);\r\n\r\n // re-draw canvases - https://github.com/telerik/kendo/issues/4872\r\n var canvases = el.querySelectorAll(\"canvas\");\r\n if (canvases.length) {\r\n slice$1$1(clone.querySelectorAll(\"canvas\")).forEach(function (canvas$$1, i) {\r\n canvas$$1.getContext(\"2d\").drawImage(canvases[i], 0, 0);\r\n });\r\n }\r\n\r\n // remove \"name\" attributes from elements -\r\n // https://github.com/telerik/kendo/issues/5409\r\n var orig = el.querySelectorAll(\"input, select, textarea, option\");\r\n slice$1$1(clone.querySelectorAll(\"input, select, textarea, option\")).forEach(function (el, i) {\r\n el.removeAttribute(\"id\");\r\n el.removeAttribute(\"name\");\r\n if (!/^textarea$/i.test(el.tagName)) {\r\n el.value = orig[i].value;\r\n }\r\n el.checked = orig[i].checked;\r\n el.selected = orig[i].selected;\r\n });\r\n\r\n return clone;\r\n };\r\n }\r\n })(typeof window !== \"undefined\" && window.kendo && window.kendo.jQuery);\r\n\r\n function getXY(thing) {\r\n if (typeof thing == \"number\") {\r\n return { x: thing, y: thing };\r\n }\r\n if (Array.isArray(thing)) {\r\n return { x: thing[0], y: thing[1] };\r\n }\r\n return { x: thing.x, y: thing.y };\r\n }\r\n\r\n function drawDOM(element, options) {\r\n if (!options) {\r\n options = {};\r\n }\r\n var promise = createPromise();\r\n\r\n if (!element) {\r\n return promise.reject(\"No element to export\");\r\n }\r\n\r\n if (typeof window.getComputedStyle != \"function\") {\r\n throw new Error(\"window.getComputedStyle is missing. You are using an unsupported browser, or running in IE8 compatibility mode. Drawing HTML is supported in Chrome, Firefox, Safari and IE9+.\");\r\n }\r\n\r\n kendo.pdf.defineFont(getFontFaces(element.ownerDocument));\r\n\r\n var scale = getXY(options.scale || 1);\r\n\r\n function doOne(element) {\r\n var group = new Group();\r\n\r\n // translate to start of page\r\n var pos = element.getBoundingClientRect();\r\n setTransform$1(group, [\r\n scale.x,\r\n 0,\r\n 0,\r\n scale.y,\r\n (-pos.left * scale.x),\r\n (-pos.top * scale.y)\r\n ]);\r\n\r\n nodeInfo._clipbox = false;\r\n nodeInfo._matrix = Matrix.unit();\r\n nodeInfo._stackingContext = {\r\n element: element,\r\n group: group\r\n };\r\n\r\n if (options.avoidLinks === true) {\r\n nodeInfo._avoidLinks = \"a\";\r\n } else {\r\n nodeInfo._avoidLinks = options.avoidLinks;\r\n }\r\n\r\n addClass(element, \"k-pdf-export\");\r\n renderElement(element, group);\r\n removeClass(element, \"k-pdf-export\");\r\n\r\n return group;\r\n }\r\n\r\n cacheImages([ element ], function(){\r\n var forceBreak = options && options.forcePageBreak;\r\n var hasPaperSize = options && options.paperSize && options.paperSize != \"auto\";\r\n var paperOptions = kendo.pdf.getPaperOptions(function(key, def){\r\n if (key == \"paperSize\") {\r\n // PDF.getPaperOptions croaks on \"auto\", just pass dummy A4 as we might\r\n // still be interested in margins.\r\n return hasPaperSize ? options[key] : \"A4\";\r\n }\r\n return key in options ? options[key] : def;\r\n });\r\n var pageWidth = hasPaperSize && paperOptions.paperSize[0];\r\n var pageHeight = hasPaperSize && paperOptions.paperSize[1];\r\n var margin = options.margin && paperOptions.margin;\r\n var hasMargin = Boolean(margin);\r\n if (forceBreak || pageHeight) {\r\n if (!margin) {\r\n margin = { left: 0, top: 0, right: 0, bottom: 0 };\r\n }\r\n\r\n // we want paper size and margin to be unaffected by\r\n // scaling in the output, so we have to reverse-scale\r\n // before our calculations begin.\r\n if (pageWidth) { pageWidth /= scale.x; }\r\n if (pageHeight) { pageHeight /= scale.y; }\r\n margin.left /= scale.x;\r\n margin.right /= scale.x;\r\n margin.top /= scale.y;\r\n margin.bottom /= scale.y;\r\n\r\n var group = new Group({\r\n pdf: {\r\n multiPage : true,\r\n paperSize : hasPaperSize ? paperOptions.paperSize : \"auto\",\r\n _ignoreMargin : hasMargin // HACK! see exportPDF in pdf/drawing.js\r\n }\r\n });\r\n handlePageBreaks(\r\n function(x) {\r\n if (options.progress) {\r\n var canceled = false, pageNum = 0;\r\n (function next(){\r\n if (pageNum < x.pages.length) {\r\n var page = doOne(x.pages[pageNum]);\r\n group.append(page);\r\n options.progress({\r\n page: page,\r\n pageNum: ++pageNum,\r\n totalPages: x.pages.length,\r\n cancel: function() {\r\n canceled = true;\r\n }\r\n });\r\n if (!canceled) {\r\n setTimeout(next);\r\n } else {\r\n // XXX: should we also fail() the deferred object?\r\n x.container.parentNode.removeChild(x.container);\r\n }\r\n } else {\r\n x.container.parentNode.removeChild(x.container);\r\n promise.resolve(group);\r\n }\r\n })();\r\n } else {\r\n x.pages.forEach(function(page){\r\n group.append(doOne(page));\r\n });\r\n x.container.parentNode.removeChild(x.container);\r\n promise.resolve(group);\r\n }\r\n },\r\n element,\r\n forceBreak,\r\n pageWidth ? pageWidth - margin.left - margin.right : null,\r\n pageHeight ? pageHeight - margin.top - margin.bottom : null,\r\n margin,\r\n options\r\n );\r\n } else {\r\n promise.resolve(doOne(element));\r\n }\r\n });\r\n\r\n function makeTemplate(template) {\r\n if (template != null) {\r\n if (typeof template == \"string\") {\r\n template = kendo.template(template.replace(/^\\s+|\\s+$/g, \"\"));\r\n }\r\n if (typeof template == \"function\") {\r\n return function(data) {\r\n var el = template(data);\r\n if (el && typeof el == \"string\") {\r\n var div = document.createElement(\"div\");\r\n div.innerHTML = el;\r\n el = div.firstElementChild;\r\n }\r\n return el;\r\n };\r\n }\r\n // assumed DOM element\r\n return function() {\r\n return template.cloneNode(true);\r\n };\r\n }\r\n }\r\n\r\n function handlePageBreaks(callback, element, forceBreak, pageWidth, pageHeight, margin, options) {\r\n var template = makeTemplate(options.template);\r\n var doc = element.ownerDocument;\r\n var pages = [];\r\n var copy = options._destructive ? element : cloneNodes(element);\r\n var container = doc.createElement(\"KENDO-PDF-DOCUMENT\");\r\n var adjust = 0;\r\n\r\n // make sure elements are at the end (Grid widget\r\n // places TFOOT before TBODY, tricking our algorithm to\r\n // insert a page break right after the header).\r\n // https://github.com/telerik/kendo/issues/4699\r\n slice$1$1(copy.querySelectorAll(\"tfoot\")).forEach(function(tfoot){\r\n tfoot.parentNode.appendChild(tfoot);\r\n });\r\n\r\n // remember the index of each LI from an ordered list.\r\n // we'll use it to reconstruct the proper numbering.\r\n slice$1$1(copy.querySelectorAll(\"ol\")).forEach(function(ol){\r\n slice$1$1(ol.children).forEach(function(li, index){\r\n li.setAttribute(\"kendo-split-index\", index);\r\n });\r\n });\r\n\r\n setCSS(container, {\r\n display : \"block\",\r\n position : \"absolute\",\r\n boxSizing : \"content-box\",\r\n left : \"-10000px\",\r\n top : \"-10000px\"\r\n });\r\n\r\n if (pageWidth) {\r\n // subtle: if we don't set the width *and* margins here, the layout in this\r\n // container will be different from the one in our final page elements, and we'll\r\n // split at the wrong places.\r\n setCSS(container, {\r\n width : pageWidth + \"px\",\r\n paddingLeft : margin.left + \"px\",\r\n paddingRight : margin.right + \"px\"\r\n });\r\n\r\n // when the first element has a margin-top (i.e. a

    ) the page will be\r\n // inadvertently enlarged by that number (the browser will report the container's\r\n // bounding box top to start at the element's top, rather than including its\r\n // margin). Adding overflow: hidden seems to fix it.\r\n //\r\n // to understand the difference, try the following snippets in your browser:\r\n //\r\n // 1.
    \r\n //

    Foo

    \r\n //
    \r\n //\r\n // 2.
    \r\n //

    Foo

    \r\n //
    \r\n //\r\n // this detail is not important when automatic page breaking is not requested, hence\r\n // doing it only if pageWidth is defined.\r\n setCSS(copy, { overflow: \"hidden\" });\r\n }\r\n\r\n element.parentNode.insertBefore(container, element);\r\n container.appendChild(copy);\r\n\r\n // With cache disabled, images will still have height zero until their `complete` attribute\r\n // is true. `whenImagesAreActuallyLoaded` will wait for it.\r\n if (options.beforePageBreak) {\r\n whenImagesAreActuallyLoaded([ container ], function() {\r\n options.beforePageBreak(container, doPageBreak);\r\n });\r\n } else {\r\n whenImagesAreActuallyLoaded([ container ], doPageBreak);\r\n }\r\n\r\n function doPageBreak() {\r\n if (forceBreak != \"-\" || pageHeight) {\r\n splitElement(copy);\r\n }\r\n\r\n {\r\n var page = makePage();\r\n copy.parentNode.insertBefore(page, copy);\r\n page.appendChild(copy);\r\n }\r\n\r\n if (template) {\r\n pages.forEach(function(page, i){\r\n var el = template({\r\n element : page,\r\n pageNum : i + 1,\r\n totalPages : pages.length\r\n });\r\n if (el) {\r\n page.appendChild(el);\r\n }\r\n });\r\n }\r\n\r\n cacheImages(pages, callback.bind(null, { pages: pages, container: container }));\r\n }\r\n\r\n function keepTogether(el) {\r\n if (options.keepTogether && matches(el, options.keepTogether) && el.offsetHeight <= pageHeight - adjust) {\r\n return true;\r\n }\r\n\r\n var tag = el.tagName;\r\n if (/^h[1-6]$/i.test(tag) && el.offsetHeight >= pageHeight - adjust) {\r\n return false;\r\n }\r\n\r\n return (el.getAttribute(\"data-kendo-chart\") ||\r\n /^(?:img|tr|thead|th|tfoot|iframe|svg|object|canvas|input|textarea|select|video|h[1-6])/i.test(el.tagName));\r\n }\r\n\r\n function splitElement(element) {\r\n if (element.tagName == \"TABLE\") {\r\n setCSS(element, { tableLayout: \"fixed\" });\r\n }\r\n if (keepTogether(element)) {\r\n return;\r\n }\r\n var style = getComputedStyle$1(element);\r\n var bottomPadding = parseFloat(getPropertyValue(style, \"padding-bottom\"));\r\n var bottomBorder = parseFloat(getPropertyValue(style, \"border-bottom-width\"));\r\n var saveAdjust = adjust;\r\n adjust += bottomPadding + bottomBorder;\r\n var isFirst = true;\r\n for (var el = element.firstChild; el; el = el.nextSibling) {\r\n if (el.nodeType == 1 /* Element */) {\r\n isFirst = false;\r\n if (matches(el, forceBreak)) {\r\n breakAtElement(el);\r\n continue;\r\n }\r\n if (!pageHeight) {\r\n // we're in \"manual breaks mode\"\r\n splitElement(el);\r\n continue;\r\n }\r\n if (!/^(?:static|relative)$/.test(getPropertyValue(getComputedStyle$1(el), \"position\"))) {\r\n continue;\r\n }\r\n var fall = fallsOnMargin(el);\r\n if (fall == 1) {\r\n // element starts on next page, break before anyway.\r\n breakAtElement(el);\r\n }\r\n else if (fall) {\r\n // elements ends up on next page, or possibly doesn't fit on a page at\r\n // all. break before it anyway if it's an or , otherwise\r\n // attempt to split.\r\n if (keepTogether(el)) {\r\n breakAtElement(el);\r\n } else {\r\n splitElement(el);\r\n }\r\n }\r\n else {\r\n splitElement(el);\r\n }\r\n }\r\n else if (el.nodeType == 3 /* Text */ && pageHeight) {\r\n splitText(el, isFirst);\r\n isFirst = false;\r\n }\r\n }\r\n adjust = saveAdjust;\r\n }\r\n\r\n function firstInParent(el) {\r\n var p = el.parentNode, first = p.firstChild;\r\n if (el === first) {\r\n return true;\r\n }\r\n if (el === p.children[0]) {\r\n if (first.nodeType == 7 /* comment */ ||\r\n first.nodeType == 8 /* processing instruction */) {\r\n return true;\r\n }\r\n if (first.nodeType == 3 /* text */) {\r\n // if whitespace only we can probably consider it's first\r\n return !/\\S/.test(first.data);\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n function breakAtElement(el) {\r\n if (el.nodeType == 1 && el !== copy && firstInParent(el)) {\r\n return breakAtElement(el.parentNode);\r\n }\r\n var table, colgroup, thead, grid, gridHead;\r\n table = closest(el, \"table\");\r\n colgroup = table && table.querySelector(\"colgroup\");\r\n if (options.repeatHeaders) {\r\n thead = table && table.querySelector(\"thead\");\r\n\r\n // If we break page in a Kendo Grid, repeat its header. This ugly hack is\r\n // necessary because a scrollable grid will keep the header in a separate\r\n // element from its content.\r\n //\r\n // XXX: This is likely to break as soon as the widget HTML is modified.\r\n grid = closest(el, \".k-grid\");\r\n if (grid && grid.querySelector(\".k-auto-scrollable\")) {\r\n gridHead = grid.querySelector(\".k-grid-header\");\r\n }\r\n }\r\n var page = makePage();\r\n var range = doc.createRange();\r\n range.setStartBefore(copy);\r\n range.setEndBefore(el);\r\n page.appendChild(range.extractContents());\r\n copy.parentNode.insertBefore(page, copy);\r\n preventBulletOnListItem(el.parentNode);\r\n if (table) {\r\n table = closest(el, \"table\"); // that's the
    on next page!\r\n if (options.repeatHeaders && thead) {\r\n table.insertBefore(thead.cloneNode(true), table.firstChild);\r\n }\r\n if (colgroup) {\r\n table.insertBefore(colgroup.cloneNode(true), table.firstChild);\r\n }\r\n }\r\n if (options.repeatHeaders && gridHead) {\r\n grid = closest(el, \".k-grid\");\r\n grid.insertBefore(gridHead.cloneNode(true), grid.firstChild);\r\n }\r\n }\r\n\r\n function makePage() {\r\n var page = doc.createElement(\"KENDO-PDF-PAGE\");\r\n setCSS(page, {\r\n display : \"block\",\r\n boxSizing: \"content-box\",\r\n width : pageWidth ? (pageWidth + \"px\") : \"auto\",\r\n padding : (margin.top + \"px \" +\r\n margin.right + \"px \" +\r\n margin.bottom + \"px \" +\r\n margin.left + \"px\"),\r\n\r\n // allow absolutely positioned elements to be relative to current page\r\n position : \"relative\",\r\n\r\n // without the following we might affect layout of subsequent pages\r\n height : pageHeight ? (pageHeight + \"px\") : \"auto\",\r\n overflow : pageHeight || pageWidth ? \"hidden\" : \"visible\",\r\n clear : \"both\"\r\n });\r\n\r\n // debug\r\n // $(\"
    \").css({\r\n // position : \"absolute\",\r\n // left : margin.left,\r\n // top : margin.top,\r\n // width : pageWidth,\r\n // height : pageHeight,\r\n // boxSizing : \"border-box\",\r\n // background: \"rgba(255, 255, 0, 0.5)\"\r\n // //border : \"1px solid red\"\r\n // }).appendTo(page);\r\n\r\n if (options && options.pageClassName) {\r\n page.className = options.pageClassName;\r\n }\r\n pages.push(page);\r\n return page;\r\n }\r\n\r\n function fallsOnMargin(thing) {\r\n var box = thing.getBoundingClientRect();\r\n if (box.width === 0 || box.height === 0) {\r\n // I'd say an element with dimensions zero fits on current page.\r\n return 0;\r\n }\r\n var top = copy.getBoundingClientRect().top;\r\n var available = pageHeight - adjust;\r\n return (box.height > available) ? 3\r\n : (box.top - top > available) ? 1\r\n : (box.bottom - top > available) ? 2\r\n : 0;\r\n }\r\n\r\n function splitText(node, isFirst) {\r\n if (!/\\S/.test(node.data)) {\r\n return;\r\n }\r\n\r\n var len = node.data.length;\r\n var range = doc.createRange();\r\n range.selectNodeContents(node);\r\n var fall = fallsOnMargin(range);\r\n if (!fall) {\r\n return; // the whole text fits on current page\r\n }\r\n\r\n var nextnode = node;\r\n if (fall == 1) {\r\n // starts on next page, break before anyway.\r\n if (isFirst) {\r\n // avoid leaving an empty

    ,

  • , etc. on previous page.\r\n breakAtElement(node.parentNode);\r\n } else {\r\n breakAtElement(node);\r\n }\r\n }\r\n else {\r\n (function findEOP(min, pos, max) {\r\n range.setEnd(node, pos);\r\n if (min == pos || pos == max) {\r\n return pos;\r\n }\r\n if (fallsOnMargin(range)) {\r\n return findEOP(min, (min + pos) >> 1, pos);\r\n } else {\r\n return findEOP(pos, (pos + max) >> 1, max);\r\n }\r\n })(0, len >> 1, len);\r\n\r\n if (!/\\S/.test(range.toString()) && isFirst) {\r\n // avoid leaving an empty

    ,

  • , etc. on previous page.\r\n breakAtElement(node.parentNode);\r\n } else {\r\n // This is only needed for IE, but it feels cleaner to do it anyway. Without\r\n // it, IE will truncate a very long text (playground/pdf-long-text-2.html).\r\n nextnode = node.splitText(range.endOffset);\r\n\r\n var page = makePage();\r\n range.setStartBefore(copy);\r\n page.appendChild(range.extractContents());\r\n copy.parentNode.insertBefore(page, copy);\r\n preventBulletOnListItem(nextnode.parentNode);\r\n }\r\n }\r\n\r\n splitText(nextnode);\r\n }\r\n\r\n function preventBulletOnListItem(el) {\r\n // set a hint on continued LI elements, to tell the\r\n // renderer not to draw the bullet again.\r\n // https://github.com/telerik/kendo-ui-core/issues/2732\r\n var li = closest(el, \"li\");\r\n if (li) {\r\n li.setAttribute(\"kendo-no-bullet\", \"1\");\r\n preventBulletOnListItem(li.parentNode);\r\n }\r\n }\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n // This is needed for the Spreadsheet print functionality. Since\r\n // there we only need to draw text, this cuts through the ceremony\r\n // of drawDOM/renderElement and renders the text node directly.\r\n function drawText(element) {\r\n var group = new Group();\r\n nodeInfo._clipbox = false;\r\n nodeInfo._matrix = Matrix.unit();\r\n nodeInfo._stackingContext = {\r\n element: element,\r\n group: group\r\n };\r\n pushNodeInfo(element, getComputedStyle$1(element), group);\r\n if (element.firstChild.nodeType == 3 /* Text */) {\r\n // avoid the penalty of renderElement\r\n renderText(element, element.firstChild, group);\r\n } else {\r\n _renderElement(element, group);\r\n }\r\n popNodeInfo();\r\n return group;\r\n }\r\n\r\n var parseBackgroundImage = (function(){\r\n var tok_linear_gradient = /^((-webkit-|-moz-|-o-|-ms-)?linear-gradient\\s*)\\(/;\r\n //var tok_radial_gradient = /^((-webkit-|-moz-|-o-|-ms-)?radial-gradient\\s*)\\(/;\r\n var tok_percent = /^([-0-9.]+%)/;\r\n var tok_length = /^([-0-9.]+px)/;\r\n var tok_keyword = /^(left|right|top|bottom|to|center)\\W/;\r\n var tok_angle = /^([-0-9.]+(deg|grad|rad|turn)|0)/;\r\n var tok_whitespace = /^(\\s+)/;\r\n var tok_popen = /^(\\()/;\r\n var tok_pclose = /^(\\))/;\r\n var tok_comma = /^(,)/;\r\n var tok_url = /^(url)\\(/;\r\n var tok_content = /^(.*?)\\)/;\r\n\r\n var cache1 = {}, cache2 = {};\r\n\r\n function parse(input) {\r\n var orig = input;\r\n if (hasOwnProperty(cache1, orig)) {\r\n return cache1[orig];\r\n }\r\n function skip_ws() {\r\n var m = tok_whitespace.exec(input);\r\n if (m) {\r\n input = input.substr(m[1].length);\r\n }\r\n }\r\n function read(token) {\r\n skip_ws();\r\n var m = token.exec(input);\r\n if (m) {\r\n input = input.substr(m[1].length);\r\n return m[1];\r\n }\r\n }\r\n\r\n function read_stop() {\r\n var color = kendo.parseColor(input, true);\r\n var length, percent;\r\n if (color) {\r\n var match =\r\n /^#[0-9a-f]+/i.exec(input) ||\r\n /^rgba?\\(.*?\\)/i.exec(input) ||\r\n /^..*?\\b/.exec(input); // maybe named color\r\n input = input.substr(match[0].length);\r\n color = color.toRGB();\r\n if (!(length = read(tok_length))) {\r\n percent = read(tok_percent);\r\n }\r\n return { color: color, length: length, percent: percent };\r\n }\r\n }\r\n\r\n function read_linear_gradient(propName) {\r\n var angle;\r\n var to1, to2;\r\n var stops = [];\r\n var reverse = false;\r\n\r\n if (read(tok_popen)) {\r\n // 1. [ || to , ]?\r\n angle = read(tok_angle);\r\n if (angle == \"0\") {\r\n angle = \"0deg\"; // Edge\r\n }\r\n if (angle) {\r\n angle = parseAngle(angle);\r\n read(tok_comma);\r\n }\r\n else {\r\n to1 = read(tok_keyword);\r\n if (to1 == \"to\") {\r\n to1 = read(tok_keyword);\r\n } else if (to1 && /^-/.test(propName)) {\r\n reverse = true;\r\n }\r\n to2 = read(tok_keyword);\r\n read(tok_comma);\r\n }\r\n\r\n if (/-moz-/.test(propName) && angle == null && to1 == null) {\r\n var x = read(tok_percent), y = read(tok_percent);\r\n reverse = true;\r\n if (x == \"0%\") {\r\n to1 = \"left\";\r\n } else if (x == \"100%\") {\r\n to1 = \"right\";\r\n }\r\n if (y == \"0%\") {\r\n to2 = \"top\";\r\n } else if (y == \"100%\") {\r\n to2 = \"bottom\";\r\n }\r\n read(tok_comma);\r\n }\r\n\r\n // 2. color stops\r\n while (input && !read(tok_pclose)) {\r\n var stop = read_stop();\r\n if (!stop) {\r\n break;\r\n }\r\n stops.push(stop);\r\n read(tok_comma);\r\n }\r\n\r\n return {\r\n type : \"linear\",\r\n angle : angle,\r\n to : to1 && to2 ? to1 + \" \" + to2 : to1 ? to1 : to2 ? to2 : null,\r\n stops : stops,\r\n reverse : reverse\r\n };\r\n }\r\n }\r\n\r\n function read_url() {\r\n if (read(tok_popen)) {\r\n var url = read(tok_content);\r\n url = url.replace(/^['\"]+|[\"']+$/g, \"\");\r\n read(tok_pclose);\r\n return { type: \"url\", url: url };\r\n }\r\n }\r\n\r\n var tok;\r\n\r\n if ((tok = read(tok_linear_gradient))) {\r\n tok = read_linear_gradient(tok);\r\n }\r\n else if ((tok = read(tok_url))) {\r\n tok = read_url();\r\n }\r\n\r\n return (cache1[orig] = tok || { type: \"none\" });\r\n }\r\n\r\n return function(input) {\r\n if (hasOwnProperty(cache2, input)) {\r\n return cache2[input];\r\n }\r\n return (cache2[input] = splitProperty(input).map(parse));\r\n };\r\n })();\r\n\r\n var splitProperty = (function(){\r\n var cache = {};\r\n return function(input, separator) {\r\n if (!separator) {\r\n separator = /^\\s*,\\s*/;\r\n }\r\n\r\n var cacheKey = input + separator;\r\n\r\n if (hasOwnProperty(cache, cacheKey)) {\r\n return cache[cacheKey];\r\n }\r\n\r\n var ret = [];\r\n var last$$1 = 0, pos = 0;\r\n var in_paren = 0;\r\n var in_string = false;\r\n var m;\r\n\r\n function looking_at(rx) {\r\n return (m = rx.exec(input.substr(pos)));\r\n }\r\n\r\n function trim(str) {\r\n return str.replace(/^\\s+|\\s+$/g, \"\");\r\n }\r\n\r\n while (pos < input.length) {\r\n if (!in_string && looking_at(/^[\\(\\[\\{]/)) {\r\n in_paren++;\r\n pos++;\r\n }\r\n else if (!in_string && looking_at(/^[\\)\\]\\}]/)) {\r\n in_paren--;\r\n pos++;\r\n }\r\n else if (!in_string && looking_at(/^[\\\"\\']/)) {\r\n in_string = m[0];\r\n pos++;\r\n }\r\n else if (in_string == \"'\" && looking_at(/^\\\\\\'/)) {\r\n pos += 2;\r\n }\r\n else if (in_string == '\"' && looking_at(/^\\\\\\\"/)) {\r\n pos += 2;\r\n }\r\n else if (in_string == \"'\" && looking_at(/^\\'/)) {\r\n in_string = false;\r\n pos++;\r\n }\r\n else if (in_string == '\"' && looking_at(/^\\\"/)) {\r\n in_string = false;\r\n pos++;\r\n }\r\n else if (looking_at(separator)) {\r\n if (!in_string && !in_paren && pos > last$$1) {\r\n ret.push(trim(input.substring(last$$1, pos)));\r\n last$$1 = pos + m[0].length;\r\n }\r\n pos += m[0].length;\r\n }\r\n else {\r\n pos++;\r\n }\r\n }\r\n if (last$$1 < pos) {\r\n ret.push(trim(input.substring(last$$1, pos)));\r\n }\r\n return (cache[cacheKey] = ret);\r\n };\r\n })();\r\n\r\n var getFontURL = (function(cache){\r\n return function(el){\r\n // XXX: for IE we get here the whole cssText of the rule,\r\n // because the computedStyle.src is empty. Next time we need\r\n // to fix these regexps we better write a CSS parser. :-\\\r\n var url = cache[el];\r\n if (!url) {\r\n var m;\r\n if ((m = /url\\((['\"]?)([^'\")]*?)\\1\\)\\s+format\\((['\"]?)truetype\\3\\)/.exec(el))) {\r\n url = cache[el] = m[2];\r\n } else if ((m = /url\\((['\"]?)([^'\")]*?\\.ttf)\\1\\)/.exec(el))) {\r\n url = cache[el] = m[2];\r\n }\r\n }\r\n return url;\r\n };\r\n })(Object.create ? Object.create(null) : {});\r\n\r\n var getFontHeight = (function(cache){\r\n return function(font) {\r\n var height = cache[font];\r\n if (height == null) {\r\n height = cache[font] = kendoUtil.measureText(\"Mapq\", { font: font }).height;\r\n }\r\n return height;\r\n };\r\n })(Object.create ? Object.create(null) : {});\r\n\r\n function getFontFaces(doc) {\r\n if (doc == null) {\r\n doc = document;\r\n }\r\n var result = {};\r\n for (var i = 0; i < doc.styleSheets.length; ++i) {\r\n doStylesheet(doc.styleSheets[i]);\r\n }\r\n return result;\r\n function doStylesheet(ss) {\r\n if (ss) {\r\n var rules = null;\r\n try {\r\n rules = ss.cssRules;\r\n } catch (ex) {}\r\n if (rules) {\r\n addRules(ss, rules);\r\n }\r\n }\r\n }\r\n function findFonts(rule) {\r\n var src = getPropertyValue(rule.style, \"src\");\r\n if (src) {\r\n return splitProperty(src).reduce(function(a, el){\r\n var font = getFontURL(el);\r\n if (font) {\r\n a.push(font);\r\n }\r\n return a;\r\n }, []);\r\n } else {\r\n // Internet Explorer\r\n // XXX: this is gross. should work though for valid CSS.\r\n var font = getFontURL(rule.cssText);\r\n return font ? [ font ] : [];\r\n }\r\n }\r\n function addRules(styleSheet, rules) {\r\n for (var i = 0; i < rules.length; ++i) {\r\n var r = rules[i];\r\n switch (r.type) {\r\n case 3: // CSSImportRule\r\n doStylesheet(r.styleSheet);\r\n break;\r\n case 5: // CSSFontFaceRule\r\n var style = r.style;\r\n var family = splitProperty(getPropertyValue(style, \"font-family\"));\r\n var bold = /^([56789]00|bold)$/i.test(getPropertyValue(style, \"font-weight\"));\r\n var italic = \"italic\" == getPropertyValue(style, \"font-style\");\r\n var src = findFonts(r);\r\n if (src.length > 0) {\r\n addRule(styleSheet, family, bold, italic, src[0]);\r\n }\r\n }\r\n }\r\n }\r\n function addRule(styleSheet, names, bold, italic, url) {\r\n // We get full resolved absolute URLs in Chrome, but sadly\r\n // not in Firefox.\r\n if (!(/^data:/i.test(url))) {\r\n if (!(/^[^\\/:]+:\\/\\//.test(url) || /^\\//.test(url))) {\r\n url = String(styleSheet.href).replace(/[^\\/]*$/, \"\") + url;\r\n }\r\n }\r\n names.forEach(function(name){\r\n name = name.replace(/^(['\"]?)(.*?)\\1$/, \"$2\"); // it's quoted\r\n if (bold) {\r\n name += \"|bold\";\r\n }\r\n if (italic) {\r\n name += \"|italic\";\r\n }\r\n result[name] = url;\r\n });\r\n }\r\n }\r\n\r\n function hasOwnProperty(obj, key) {\r\n return Object.prototype.hasOwnProperty.call(obj, key);\r\n }\r\n\r\n function getCounter(name) {\r\n name = \"_counter_\" + name;\r\n return nodeInfo[name];\r\n }\r\n\r\n function getAllCounters(name) {\r\n var values = [], p = nodeInfo;\r\n name = \"_counter_\" + name;\r\n while (p) {\r\n if (hasOwnProperty(p, name)) {\r\n values.push(p[name]);\r\n }\r\n p = Object.getPrototypeOf(p);\r\n }\r\n return values.reverse();\r\n }\r\n\r\n function incCounter(name, inc) {\r\n var p = nodeInfo;\r\n name = \"_counter_\" + name;\r\n while (p && !hasOwnProperty(p, name)) {\r\n p = Object.getPrototypeOf(p);\r\n }\r\n if (!p) {\r\n p = nodeInfo._root;\r\n }\r\n p[name] = (p[name] || 0) + (inc == null ? 1 : inc);\r\n }\r\n\r\n function resetCounter(name, val) {\r\n name = \"_counter_\" + name;\r\n nodeInfo[name] = val == null ? 0 : val;\r\n }\r\n\r\n function doCounters(a, f, def) {\r\n for (var i = 0; i < a.length;) {\r\n var name = a[i++];\r\n var val = parseFloat(a[i]);\r\n if (isNaN(val)) {\r\n f(name, def);\r\n } else {\r\n f(name, val);\r\n ++i;\r\n }\r\n }\r\n }\r\n\r\n function updateCounters(style) {\r\n var counterReset = getPropertyValue(style, \"counter-reset\");\r\n if (counterReset) {\r\n doCounters(splitProperty(counterReset, /^\\s+/), resetCounter, 0);\r\n }\r\n var counterIncrement = getPropertyValue(style, \"counter-increment\");\r\n if (counterIncrement) {\r\n doCounters(splitProperty(counterIncrement, /^\\s+/), incCounter, 1);\r\n }\r\n }\r\n\r\n function parseColor$1(str, css) {\r\n var color = kendo.parseColor(str, true);\r\n if (color) {\r\n color = color.toRGB();\r\n if (css) {\r\n color = color.toCssRgba();\r\n } else if (color.a === 0) {\r\n color = null;\r\n }\r\n }\r\n return color;\r\n }\r\n\r\n function whenImagesAreActuallyLoaded(elements, callback) {\r\n var pending = 0;\r\n var done = false;\r\n elements.forEach(function(el){\r\n var images = el.querySelectorAll(\"img\");\r\n for (var i = 0; i < images.length; ++i) {\r\n var img = images[i];\r\n if (!img.complete) {\r\n pending++;\r\n img.onload = img.onerror = next;\r\n }\r\n }\r\n });\r\n\r\n if (!pending) {\r\n next();\r\n }\r\n\r\n function next() {\r\n if (!done && --pending <= 0) {\r\n callback();\r\n done = true;\r\n }\r\n }\r\n }\r\n\r\n function cacheImages(elements, callback) {\r\n var urls = [];\r\n function add(url) {\r\n if (!IMAGE_CACHE[url]) {\r\n IMAGE_CACHE[url] = true;\r\n urls.push(url);\r\n }\r\n }\r\n\r\n elements.forEach(function dive(element){\r\n if (/^img$/i.test(element.tagName)) {\r\n add(element.src);\r\n }\r\n parseBackgroundImage(\r\n getPropertyValue(\r\n getComputedStyle$1(element), \"background-image\"\r\n )\r\n ).forEach(function(bg){\r\n if (bg.type == \"url\") {\r\n add(bg.url);\r\n }\r\n });\r\n\r\n if (element.children) {\r\n slice$1$1(element.children).forEach(dive);\r\n }\r\n });\r\n\r\n var count = urls.length;\r\n function next() {\r\n if (--count <= 0) {\r\n // Even though we cached them, they simply won't be available immediately in the newly\r\n // created DOM. Previously we'd allow a 10ms timeout, but that's arbitrary and clearly\r\n // not working in all cases (https://github.com/telerik/kendo/issues/5399), so this\r\n // function will wait for their .complete attribute.\r\n whenImagesAreActuallyLoaded(elements, callback);\r\n }\r\n }\r\n if (count === 0) {\r\n next();\r\n }\r\n urls.forEach(function(url){\r\n var img = IMAGE_CACHE[url] = new window.Image();\r\n if (!(/^data:/i.test(url))) {\r\n img.crossOrigin = \"Anonymous\";\r\n }\r\n img.src = url;\r\n if (img.complete) {\r\n next();\r\n } else {\r\n img.onload = next;\r\n img.onerror = function() {\r\n IMAGE_CACHE[url] = null;\r\n next();\r\n };\r\n }\r\n });\r\n }\r\n\r\n function alphaNumeral(n) {\r\n var result = \"\";\r\n do {\r\n var r = n % 26;\r\n result = String.fromCharCode(97 + r) + result;\r\n n = Math.floor(n / 26);\r\n } while (n > 0);\r\n return result;\r\n }\r\n\r\n function pushNodeInfo(element, style, group) {\r\n nodeInfo = Object.create(nodeInfo);\r\n nodeInfo[element.tagName.toLowerCase()] = {\r\n element: element,\r\n style: style\r\n };\r\n var decoration = getPropertyValue(style, \"text-decoration\");\r\n if (decoration && decoration != \"none\") {\r\n var color = getPropertyValue(style, \"text-decoration-color\");\r\n decoration.split(/\\s+/g).forEach(function(name){\r\n if (!nodeInfo[name]) {\r\n nodeInfo[name] = color;\r\n if (name == \"underline\") {\r\n var offset = getPropertyValue(style, \"text-underline-offset\");\r\n if (offset != \"auto\") {\r\n nodeInfo[\"underline-offset\"] = parseFloat(offset);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n if (createsStackingContext(style)) {\r\n nodeInfo._stackingContext = {\r\n element: element,\r\n group: group\r\n };\r\n }\r\n }\r\n\r\n function popNodeInfo() {\r\n nodeInfo = Object.getPrototypeOf(nodeInfo);\r\n }\r\n\r\n function updateClipbox(path) {\r\n if (nodeInfo._clipbox != null) {\r\n var box = path.bbox(nodeInfo._matrix);\r\n if (nodeInfo._clipbox) {\r\n nodeInfo._clipbox = Rect.intersect(nodeInfo._clipbox, box);\r\n } else {\r\n nodeInfo._clipbox = box;\r\n }\r\n }\r\n }\r\n\r\n function emptyClipbox() {\r\n var cb = nodeInfo._clipbox;\r\n if (cb == null) {\r\n return true;\r\n }\r\n if (cb) {\r\n return cb.width() === 0 || cb.height() === 0;\r\n }\r\n }\r\n\r\n function createsStackingContext(style) {\r\n function prop(name) { return getPropertyValue(style, name); }\r\n if (prop(\"transform\") != \"none\" ||\r\n prop(\"position\") != \"static\" ||\r\n prop(\"z-index\") != \"auto\" ||\r\n prop(\"opacity\") < 1) {\r\n return true;\r\n }\r\n }\r\n\r\n function getComputedStyle$1(element, pseudoElt) {\r\n return window.getComputedStyle(element, pseudoElt || null);\r\n }\r\n\r\n function getPropertyValue(style, prop, defa) {\r\n var val = style.getPropertyValue(prop);\r\n if (val == null || val === \"\") {\r\n if (browser.webkit) {\r\n val = style.getPropertyValue(\"-webkit-\" + prop );\r\n } else if (browser.mozilla) {\r\n val = style.getPropertyValue(\"-moz-\" + prop );\r\n } else if (browser.opera) {\r\n val = style.getPropertyValue(\"-o-\" + prop);\r\n } else if (microsoft) {\r\n val = style.getPropertyValue(\"-ms-\" + prop);\r\n }\r\n }\r\n if (arguments.length > 2 && (val == null || val === \"\")) {\r\n return defa;\r\n } else {\r\n return val;\r\n }\r\n }\r\n\r\n function pleaseSetPropertyValue(style, prop, value, important) {\r\n style.setProperty(prop, value, important);\r\n if (browser.webkit) {\r\n style.setProperty(\"-webkit-\" + prop, value, important);\r\n } else if (browser.mozilla) {\r\n style.setProperty(\"-moz-\" + prop, value, important);\r\n } else if (browser.opera) {\r\n style.setProperty(\"-o-\" + prop, value, important);\r\n } else if (microsoft) {\r\n style.setProperty(\"-ms-\" + prop, value, important);\r\n prop = \"ms\" + prop.replace(/(^|-)([a-z])/g, function(s, p1, p2){\r\n return p1 + p2.toUpperCase();\r\n });\r\n style[prop] = value;\r\n }\r\n }\r\n\r\n function getBorder(style, side) {\r\n side = \"border-\" + side;\r\n return {\r\n width: parseFloat(getPropertyValue(style, side + \"-width\")),\r\n style: getPropertyValue(style, side + \"-style\"),\r\n color: parseColor$1(getPropertyValue(style, side + \"-color\"), true)\r\n };\r\n }\r\n\r\n function saveStyle(element, func) {\r\n var prev = element.style.cssText;\r\n var result = func();\r\n element.style.cssText = prev;\r\n return result;\r\n }\r\n\r\n function getBorderRadius(style, side) {\r\n var r = getPropertyValue(style, \"border-\" + side + \"-radius\").split(/\\s+/g).map(parseFloat);\r\n if (r.length == 1) {\r\n r.push(r[0]);\r\n }\r\n return sanitizeRadius({ x: r[0], y: r[1] });\r\n }\r\n\r\n function getContentBox(element) {\r\n var box = element.getBoundingClientRect();\r\n box = innerBox(box, \"border-*-width\", element);\r\n box = innerBox(box, \"padding-*\", element);\r\n return box;\r\n }\r\n\r\n function innerBox(box, prop, element) {\r\n var style, wt, wr, wb, wl;\r\n if (typeof prop == \"string\") {\r\n style = getComputedStyle$1(element);\r\n wt = parseFloat(getPropertyValue(style, prop.replace(\"*\", \"top\")));\r\n wr = parseFloat(getPropertyValue(style, prop.replace(\"*\", \"right\")));\r\n wb = parseFloat(getPropertyValue(style, prop.replace(\"*\", \"bottom\")));\r\n wl = parseFloat(getPropertyValue(style, prop.replace(\"*\", \"left\")));\r\n }\r\n else if (typeof prop == \"number\") {\r\n wt = wr = wb = wl = prop;\r\n }\r\n return {\r\n top : box.top + wt,\r\n right : box.right - wr,\r\n bottom : box.bottom - wb,\r\n left : box.left + wl,\r\n width : box.right - box.left - wr - wl,\r\n height : box.bottom - box.top - wb - wt\r\n };\r\n }\r\n\r\n function getTransform(style) {\r\n var transform$$1 = getPropertyValue(style, \"transform\");\r\n if (transform$$1 == \"none\") {\r\n return null;\r\n }\r\n var matrix = /^\\s*matrix\\(\\s*(.*?)\\s*\\)\\s*$/.exec(transform$$1);\r\n if (matrix) {\r\n var origin = getPropertyValue(style, \"transform-origin\");\r\n matrix = matrix[1].split(/\\s*,\\s*/g).map(parseFloat);\r\n origin = origin.split(/\\s+/g).map(parseFloat);\r\n return {\r\n matrix: matrix,\r\n origin: origin\r\n };\r\n }\r\n }\r\n\r\n function radiansToDegrees(radians) {\r\n return ((180 * radians) / Math.PI) % 360;\r\n }\r\n\r\n function parseAngle(angle) {\r\n var num = parseFloat(angle);\r\n if (/grad$/.test(angle)) {\r\n return Math.PI * num / 200;\r\n }\r\n else if (/rad$/.test(angle)) {\r\n return num;\r\n }\r\n else if (/turn$/.test(angle)) {\r\n return Math.PI * num * 2;\r\n }\r\n else if (/deg$/.test(angle)) {\r\n return Math.PI * num / 180;\r\n }\r\n }\r\n\r\n function setTransform$1(shape, m) {\r\n m = new Matrix(m[0], m[1], m[2], m[3], m[4], m[5]);\r\n shape.transform(m);\r\n return m;\r\n }\r\n\r\n function setClipping(shape, clipPath) {\r\n shape.clip(clipPath);\r\n }\r\n\r\n function addArcToPath(path, x, y, options) {\r\n var points = new Arc$2([ x, y ], options).curvePoints(), i = 1;\r\n while (i < points.length) {\r\n path.curveTo(points[i++], points[i++], points[i++]);\r\n }\r\n }\r\n\r\n function sanitizeRadius(r) {\r\n if (r.x <= 0 || r.y <= 0) {\r\n r.x = r.y = 0;\r\n }\r\n return r;\r\n }\r\n\r\n function adjustBorderRadiusForBox(box, rTL, rTR, rBR, rBL) {\r\n // adjust border radiuses such that the sum of adjacent\r\n // radiuses is not bigger than the length of the side.\r\n // seems the correct algorithm is variant (3) from here:\r\n // http://www.w3.org/Style/CSS/Tracker/issues/29?changelog\r\n var tl_x = Math.max(0, rTL.x), tl_y = Math.max(0, rTL.y);\r\n var tr_x = Math.max(0, rTR.x), tr_y = Math.max(0, rTR.y);\r\n var br_x = Math.max(0, rBR.x), br_y = Math.max(0, rBR.y);\r\n var bl_x = Math.max(0, rBL.x), bl_y = Math.max(0, rBL.y);\r\n\r\n var f = Math.min(\r\n box.width / (tl_x + tr_x),\r\n box.height / (tr_y + br_y),\r\n box.width / (br_x + bl_x),\r\n box.height / (bl_y + tl_y)\r\n );\r\n\r\n if (f < 1) {\r\n tl_x *= f; tl_y *= f;\r\n tr_x *= f; tr_y *= f;\r\n br_x *= f; br_y *= f;\r\n bl_x *= f; bl_y *= f;\r\n }\r\n\r\n return {\r\n tl: { x: tl_x, y: tl_y },\r\n tr: { x: tr_x, y: tr_y },\r\n br: { x: br_x, y: br_y },\r\n bl: { x: bl_x, y: bl_y }\r\n };\r\n }\r\n\r\n function elementRoundBox(element, box, type) {\r\n var style = getComputedStyle$1(element);\r\n\r\n var rTL = getBorderRadius(style, \"top-left\");\r\n var rTR = getBorderRadius(style, \"top-right\");\r\n var rBL = getBorderRadius(style, \"bottom-left\");\r\n var rBR = getBorderRadius(style, \"bottom-right\");\r\n\r\n if (type == \"padding\" || type == \"content\") {\r\n var bt = getBorder(style, \"top\");\r\n var br = getBorder(style, \"right\");\r\n var bb = getBorder(style, \"bottom\");\r\n var bl = getBorder(style, \"left\");\r\n rTL.x -= bl.width; rTL.y -= bt.width;\r\n rTR.x -= br.width; rTR.y -= bt.width;\r\n rBR.x -= br.width; rBR.y -= bb.width;\r\n rBL.x -= bl.width; rBL.y -= bb.width;\r\n if (type == \"content\") {\r\n var pt = parseFloat(getPropertyValue(style, \"padding-top\"));\r\n var pr = parseFloat(getPropertyValue(style, \"padding-right\"));\r\n var pb = parseFloat(getPropertyValue(style, \"padding-bottom\"));\r\n var pl = parseFloat(getPropertyValue(style, \"padding-left\"));\r\n rTL.x -= pl; rTL.y -= pt;\r\n rTR.x -= pr; rTR.y -= pt;\r\n rBR.x -= pr; rBR.y -= pb;\r\n rBL.x -= pl; rBL.y -= pb;\r\n }\r\n }\r\n\r\n if (typeof type == \"number\") {\r\n rTL.x -= type; rTL.y -= type;\r\n rTR.x -= type; rTR.y -= type;\r\n rBR.x -= type; rBR.y -= type;\r\n rBL.x -= type; rBL.y -= type;\r\n }\r\n\r\n return roundBox(box, rTL, rTR, rBR, rBL);\r\n }\r\n\r\n // Create a drawing.Path for a rounded rectangle. Receives the\r\n // bounding box and the border-radiuses in CSS order (top-left,\r\n // top-right, bottom-right, bottom-left). The radiuses must be\r\n // objects containing x (horiz. radius) and y (vertical radius).\r\n function roundBox(box, rTL0, rTR0, rBR0, rBL0) {\r\n var tmp = adjustBorderRadiusForBox(box, rTL0, rTR0, rBR0, rBL0);\r\n var rTL = tmp.tl;\r\n var rTR = tmp.tr;\r\n var rBR = tmp.br;\r\n var rBL = tmp.bl;\r\n var path = new Path({ fill: null, stroke: null });\r\n path.moveTo(box.left, box.top + rTL.y);\r\n if (rTL.x) {\r\n addArcToPath(path, box.left + rTL.x, box.top + rTL.y, {\r\n startAngle: -180,\r\n endAngle: -90,\r\n radiusX: rTL.x,\r\n radiusY: rTL.y\r\n });\r\n }\r\n path.lineTo(box.right - rTR.x, box.top);\r\n if (rTR.x) {\r\n addArcToPath(path, box.right - rTR.x, box.top + rTR.y, {\r\n startAngle: -90,\r\n endAngle: 0,\r\n radiusX: rTR.x,\r\n radiusY: rTR.y\r\n });\r\n }\r\n path.lineTo(box.right, box.bottom - rBR.y);\r\n if (rBR.x) {\r\n addArcToPath(path, box.right - rBR.x, box.bottom - rBR.y, {\r\n startAngle: 0,\r\n endAngle: 90,\r\n radiusX: rBR.x,\r\n radiusY: rBR.y\r\n });\r\n }\r\n path.lineTo(box.left + rBL.x, box.bottom);\r\n if (rBL.x) {\r\n addArcToPath(path, box.left + rBL.x, box.bottom - rBL.y, {\r\n startAngle: 90,\r\n endAngle: 180,\r\n radiusX: rBL.x,\r\n radiusY: rBL.y\r\n });\r\n }\r\n return path.close();\r\n }\r\n\r\n function formatCounter(val, style) {\r\n var str = String(parseFloat(val));\r\n switch (style) {\r\n case \"decimal-leading-zero\":\r\n if (str.length < 2) {\r\n str = \"0\" + str;\r\n }\r\n return str;\r\n case \"lower-roman\":\r\n return arabicToRoman(val).toLowerCase();\r\n case \"upper-roman\":\r\n return arabicToRoman(val).toUpperCase();\r\n case \"lower-latin\":\r\n case \"lower-alpha\":\r\n return alphaNumeral(val - 1);\r\n case \"upper-latin\":\r\n case \"upper-alpha\":\r\n return alphaNumeral(val - 1).toUpperCase();\r\n default:\r\n return str;\r\n }\r\n }\r\n\r\n function evalPseudoElementContent(element, content) {\r\n function displayCounter(name, style, separator) {\r\n if (!separator) {\r\n return formatCounter(getCounter(name) || 0, style);\r\n }\r\n separator = separator.replace(/^\\s*([\"'])(.*)\\1\\s*$/, \"$2\");\r\n return getAllCounters(name).map(function(val){\r\n return formatCounter(val, style);\r\n }).join(separator);\r\n }\r\n var a = splitProperty(content, /^\\s+/);\r\n var result = [], m;\r\n a.forEach(function(el){\r\n var tmp;\r\n if ((m = /^\\s*([\"'])(.*)\\1\\s*$/.exec(el))) {\r\n result.push(m[2].replace(/\\\\([0-9a-f]{4})/gi, function(s, p){\r\n return String.fromCharCode(parseInt(p, 16));\r\n }));\r\n }\r\n else if ((m = /^\\s*counter\\((.*?)\\)\\s*$/.exec(el))) {\r\n tmp = splitProperty(m[1]);\r\n result.push(displayCounter(tmp[0], tmp[1]));\r\n }\r\n else if ((m = /^\\s*counters\\((.*?)\\)\\s*$/.exec(el))) {\r\n tmp = splitProperty(m[1]);\r\n result.push(displayCounter(tmp[0], tmp[2], tmp[1]));\r\n }\r\n else if ((m = /^\\s*attr\\((.*?)\\)\\s*$/.exec(el))) {\r\n result.push(element.getAttribute(m[1]) || \"\");\r\n }\r\n else {\r\n result.push(el);\r\n }\r\n });\r\n return result.join(\"\");\r\n }\r\n\r\n function getCssText(style) {\r\n if (style.cssText) {\r\n return style.cssText;\r\n }\r\n // Status: NEW. Report year: 2002. Current year: 2014.\r\n // Nice played, Mozillians.\r\n // https://bugzilla.mozilla.org/show_bug.cgi?id=137687\r\n var result = [];\r\n for (var i = 0; i < style.length; ++i) {\r\n result.push(style[i] + \": \" + getPropertyValue(style, style[i]));\r\n }\r\n return result.join(\";\\n\");\r\n }\r\n\r\n function _renderWithPseudoElements(element, group) {\r\n if (element.tagName == KENDO_PSEUDO_ELEMENT) {\r\n _renderElement(element, group);\r\n return;\r\n }\r\n var fake = [];\r\n function pseudo(kind, place) {\r\n var style = getComputedStyle$1(element, kind), content = style.content;\r\n updateCounters(style);\r\n if (content && content != \"normal\" && content != \"none\" && style.width != \"0px\") {\r\n var psel = element.ownerDocument.createElement(KENDO_PSEUDO_ELEMENT);\r\n psel.style.cssText = getCssText(style);\r\n psel.textContent = evalPseudoElementContent(element, content);\r\n element.insertBefore(psel, place);\r\n fake.push(psel);\r\n }\r\n }\r\n pseudo(\":before\", element.firstChild);\r\n pseudo(\":after\", null);\r\n if (fake.length > 0) {\r\n var saveClass = element.className;\r\n element.className += \" kendo-pdf-hide-pseudo-elements\";\r\n _renderElement(element, group);\r\n element.className = saveClass;\r\n fake.forEach(function(el){ element.removeChild(el); });\r\n } else {\r\n _renderElement(element, group);\r\n }\r\n }\r\n\r\n function _renderElement(element, group) {\r\n var style = getComputedStyle$1(element);\r\n\r\n var top = getBorder(style, \"top\");\r\n var right = getBorder(style, \"right\");\r\n var bottom = getBorder(style, \"bottom\");\r\n var left = getBorder(style, \"left\");\r\n\r\n var rTL0 = getBorderRadius(style, \"top-left\");\r\n var rTR0 = getBorderRadius(style, \"top-right\");\r\n var rBL0 = getBorderRadius(style, \"bottom-left\");\r\n var rBR0 = getBorderRadius(style, \"bottom-right\");\r\n\r\n var dir = getPropertyValue(style, \"direction\");\r\n\r\n var backgroundColor = getPropertyValue(style, \"background-color\");\r\n backgroundColor = parseColor$1(backgroundColor);\r\n\r\n var backgroundImage = parseBackgroundImage( getPropertyValue(style, \"background-image\") );\r\n var backgroundRepeat = splitProperty( getPropertyValue(style, \"background-repeat\") );\r\n var backgroundPosition = splitProperty( getPropertyValue(style, \"background-position\") );\r\n var backgroundOrigin = splitProperty( getPropertyValue(style, \"background-origin\") );\r\n var backgroundSize = splitProperty( getPropertyValue(style, \"background-size\") );\r\n\r\n // IE shrinks the text with text-overflow: ellipsis,\r\n // apparently because the returned bounding box for the range\r\n // is limited to the visible area minus space for the dots,\r\n // instead of being the full width of the text.\r\n //\r\n // https://github.com/telerik/kendo/issues/5232\r\n // https://github.com/telerik/kendo-ui-core/issues/1868\r\n //\r\n // We have to test it here rather than in renderText because\r\n // text-overflow: ellipsis could be set on a parent element (not\r\n // necessarily the one containing the text); in this case,\r\n // getComputedStyle(elementWithTheText) will return \"clip\", not\r\n // \"ellipsis\" (which is probably a bug, but oh well...)\r\n var textOverflow, saveTextOverflow;\r\n if (microsoft) {\r\n textOverflow = style.textOverflow; // computed style\r\n if (textOverflow == \"ellipsis\") {\r\n saveTextOverflow = element.style.textOverflow; // own style.\r\n element.style.textOverflow = \"clip\";\r\n }\r\n }\r\n\r\n if (browser.msie && browser.version < 10) {\r\n // IE9 hacks. getPropertyValue won't return the correct\r\n // value. Sucks that we have to do it here, I'd prefer to\r\n // move it in getPropertyValue, but we don't have the\r\n // element.\r\n backgroundPosition = splitProperty(element.currentStyle.backgroundPosition);\r\n }\r\n\r\n var innerbox = innerBox(element.getBoundingClientRect(), \"border-*-width\", element);\r\n\r\n // CSS \"clip\" property - if present, replace the group with a\r\n // new one which is clipped. This must happen before drawing\r\n // the borders and background.\r\n (function(){\r\n var clip = getPropertyValue(style, \"clip\");\r\n var m = /^\\s*rect\\((.*)\\)\\s*$/.exec(clip);\r\n if (m) {\r\n var a = m[1].split(/[ ,]+/g);\r\n var top = a[0] == \"auto\" ? innerbox.top : parseFloat(a[0]) + innerbox.top;\r\n var right = a[1] == \"auto\" ? innerbox.right : parseFloat(a[1]) + innerbox.left;\r\n var bottom = a[2] == \"auto\" ? innerbox.bottom : parseFloat(a[2]) + innerbox.top;\r\n var left = a[3] == \"auto\" ? innerbox.left : parseFloat(a[3]) + innerbox.left;\r\n var tmp = new Group();\r\n var clipPath = new Path()\r\n .moveTo(left, top)\r\n .lineTo(right, top)\r\n .lineTo(right, bottom)\r\n .lineTo(left, bottom)\r\n .close();\r\n setClipping(tmp, clipPath);\r\n group.append(tmp);\r\n group = tmp;\r\n updateClipbox(clipPath);\r\n }\r\n })();\r\n\r\n var boxes, i, cells;\r\n var display = getPropertyValue(style, \"display\");\r\n\r\n if (display == \"table-row\") {\r\n // because of rowspan/colspan, we shouldn't draw background of table row elements on the\r\n // box given by its getBoundingClientRect, because if we do we risk overwritting a\r\n // previously rendered cell. https://github.com/telerik/kendo/issues/4881\r\n boxes = [];\r\n for (i = 0, cells = element.children; i < cells.length; ++i) {\r\n boxes.push(cells[i].getBoundingClientRect());\r\n }\r\n } else {\r\n boxes = element.getClientRects();\r\n if (boxes.length == 1) {\r\n // Workaround the missing borders in Chrome! getClientRects() boxes contains values\r\n // rounded to integer. getBoundingClientRect() appears to work fine. We still need\r\n // getClientRects() to support cases where there are more boxes (continued inline\r\n // elements that might have border/background).\r\n boxes = [ element.getBoundingClientRect() ];\r\n }\r\n }\r\n\r\n // This function workarounds another Chrome bug, where boxes returned for a table with\r\n // border-collapse: collapse will overlap the table border. Our rendering is not perfect in\r\n // such case anyway, but with this is better than without it.\r\n boxes = adjustBoxes(boxes);\r\n\r\n for (i = 0; i < boxes.length; ++i) {\r\n drawOneBox(boxes[i], i === 0, i == boxes.length - 1);\r\n }\r\n\r\n // Render links as separate groups. We can't use boxes returned by element's getClientRects\r\n // because if display type is \"inline\" (default for ), boxes will not include the height of\r\n // images inside. https://github.com/telerik/kendo-ui-core/issues/3359\r\n if (element.tagName == \"A\" && element.href && !/^#?$/.test(element.getAttribute(\"href\"))) {\r\n if (!nodeInfo._avoidLinks || !matches(element, nodeInfo._avoidLinks)) {\r\n var r = document.createRange();\r\n r.selectNodeContents(element);\r\n slice$1$1(r.getClientRects()).forEach(function(box){\r\n var g = new Group();\r\n g._pdfLink = {\r\n url : element.href,\r\n top : box.top,\r\n right : box.right,\r\n bottom : box.bottom,\r\n left : box.left\r\n };\r\n group.append(g);\r\n });\r\n }\r\n }\r\n\r\n if (boxes.length > 0 && display == \"list-item\" && !element.getAttribute(\"kendo-no-bullet\")) {\r\n drawBullet(boxes[0]);\r\n }\r\n\r\n // overflow: hidden/auto - if present, replace the group with\r\n // a new one clipped by the inner box.\r\n (function(){\r\n function clipit() {\r\n var clipPath = elementRoundBox(element, innerbox, \"padding\");\r\n var tmp = new Group();\r\n setClipping(tmp, clipPath);\r\n group.append(tmp);\r\n group = tmp;\r\n updateClipbox(clipPath);\r\n }\r\n if (isFormField(element)) {\r\n clipit();\r\n } else if (/^(hidden|auto|scroll)/.test(getPropertyValue(style, \"overflow\"))) {\r\n clipit();\r\n } else if (/^(hidden|auto|scroll)/.test(getPropertyValue(style, \"overflow-x\"))) {\r\n clipit();\r\n } else if (/^(hidden|auto|scroll)/.test(getPropertyValue(style, \"overflow-y\"))) {\r\n clipit();\r\n }\r\n })();\r\n\r\n if (!maybeRenderWidget(element, group) && !maybeRenderBullet(element, group)) {\r\n renderContents(element, group);\r\n }\r\n\r\n if (microsoft && textOverflow == \"ellipsis\") {\r\n element.style.textOverflow = saveTextOverflow;\r\n }\r\n\r\n return group; // only utility functions after this line.\r\n\r\n function adjustBoxes(boxes) {\r\n if (/^td$/i.test(element.tagName)) {\r\n var table = nodeInfo.table;\r\n if (table && getPropertyValue(table.style, \"border-collapse\") == \"collapse\") {\r\n var tableBorderLeft = getBorder(table.style, \"left\").width;\r\n var tableBorderTop = getBorder(table.style, \"top\").width;\r\n // check if we need to adjust\r\n if (tableBorderLeft === 0 && tableBorderTop === 0) {\r\n return boxes; // nope\r\n }\r\n var tableBox = table.element.getBoundingClientRect();\r\n var firstCell = table.element.rows[0].cells[0];\r\n var firstCellBox = firstCell.getBoundingClientRect();\r\n if (firstCellBox.top == tableBox.top || firstCellBox.left == tableBox.left) {\r\n return slice$1$1(boxes).map(function(box){\r\n return {\r\n left : box.left + tableBorderLeft,\r\n top : box.top + tableBorderTop,\r\n right : box.right + tableBorderLeft,\r\n bottom : box.bottom + tableBorderTop,\r\n height : box.height,\r\n width : box.width\r\n };\r\n });\r\n }\r\n }\r\n }\r\n return boxes;\r\n }\r\n\r\n // this function will be called to draw each border. it\r\n // draws starting at origin and the resulted path must be\r\n // translated/rotated to be placed in the proper position.\r\n //\r\n // arguments are named as if it draws the top border:\r\n //\r\n // - `len` the length of the edge\r\n // - `Wtop` the width of the edge (i.e. border-top-width)\r\n // - `Wleft` the width of the left edge (border-left-width)\r\n // - `Wright` the width of the right edge\r\n // - `rl` and `rl` -- the border radius on the left and right\r\n // (objects containing x and y, for horiz/vertical radius)\r\n // - `transform` -- transformation to apply\r\n //\r\n function drawEdge(color, len, Wtop, Wleft, Wright, rl, rr, transform$$1) {\r\n if (Wtop <= 0) {\r\n return;\r\n }\r\n\r\n var path, edge = new Group();\r\n setTransform$1(edge, transform$$1);\r\n group.append(edge);\r\n\r\n sanitizeRadius(rl);\r\n sanitizeRadius(rr);\r\n\r\n // draw main border. this is the area without the rounded corners\r\n path = new Path({\r\n fill: { color: color },\r\n stroke: null\r\n });\r\n edge.append(path);\r\n path.moveTo(rl.x ? Math.max(rl.x, Wleft) : 0, 0)\r\n .lineTo(len - (rr.x ? Math.max(rr.x, Wright) : 0), 0)\r\n .lineTo(len - Math.max(rr.x, Wright), Wtop)\r\n .lineTo(Math.max(rl.x, Wleft), Wtop)\r\n .close();\r\n\r\n if (rl.x) {\r\n drawRoundCorner(Wleft, rl, [ -1, 0, 0, 1, rl.x, 0 ]);\r\n }\r\n\r\n if (rr.x) {\r\n drawRoundCorner(Wright, rr, [ 1, 0, 0, 1, len - rr.x, 0 ]);\r\n }\r\n\r\n // draws one round corner, starting at origin (needs to be\r\n // translated/rotated to be placed properly).\r\n function drawRoundCorner(Wright, r, transform$$1) {\r\n var angle = Math.PI/2 * Wright / (Wright + Wtop);\r\n\r\n // not sanitizing this one, because negative values\r\n // are useful to fill the box correctly.\r\n var ri = {\r\n x: r.x - Wright,\r\n y: r.y - Wtop\r\n };\r\n\r\n var path = new Path({\r\n fill: { color: color },\r\n stroke: null\r\n }).moveTo(0, 0);\r\n\r\n setTransform$1(path, transform$$1);\r\n\r\n addArcToPath(path, 0, r.y, {\r\n startAngle: -90,\r\n endAngle: -radiansToDegrees(angle),\r\n radiusX: r.x,\r\n radiusY: r.y\r\n });\r\n\r\n if (ri.x > 0 && ri.y > 0) {\r\n path.lineTo(ri.x * Math.cos(angle), r.y - ri.y * Math.sin(angle));\r\n addArcToPath(path, 0, r.y, {\r\n startAngle: -radiansToDegrees(angle),\r\n endAngle: -90,\r\n radiusX: ri.x,\r\n radiusY: ri.y,\r\n anticlockwise: true\r\n });\r\n }\r\n else if (ri.x > 0) {\r\n path.lineTo(ri.x, Wtop)\r\n .lineTo(0, Wtop);\r\n }\r\n else {\r\n path.lineTo(ri.x, Wtop)\r\n .lineTo(ri.x, 0);\r\n }\r\n\r\n edge.append(path.close());\r\n }\r\n }\r\n\r\n function drawBackground(box) {\r\n var background = new Group();\r\n setClipping(background, roundBox(box, rTL0, rTR0, rBR0, rBL0));\r\n group.append(background);\r\n\r\n if (backgroundColor) {\r\n var path = new Path({\r\n fill: { color: backgroundColor.toCssRgba() },\r\n stroke: null\r\n });\r\n path.moveTo(box.left, box.top)\r\n .lineTo(box.right, box.top)\r\n .lineTo(box.right, box.bottom)\r\n .lineTo(box.left, box.bottom)\r\n .close();\r\n background.append(path);\r\n }\r\n\r\n for (var i = backgroundImage.length; --i >= 0;) {\r\n drawOneBackground(\r\n background, box,\r\n backgroundImage[i],\r\n backgroundRepeat[i % backgroundRepeat.length],\r\n backgroundPosition[i % backgroundPosition.length],\r\n backgroundOrigin[i % backgroundOrigin.length],\r\n backgroundSize[i % backgroundSize.length]\r\n );\r\n }\r\n }\r\n\r\n function drawOneBackground(group, box, background, backgroundRepeat, backgroundPosition, backgroundOrigin, backgroundSize) {\r\n if (!background || (background == \"none\")) {\r\n return;\r\n }\r\n\r\n if (background.type == \"url\") {\r\n var img = IMAGE_CACHE[background.url];\r\n if (img && img.width > 0 && img.height > 0) {\r\n drawBackgroundImage(group, box, img.width, img.height, function(group, rect){\r\n group.append(new Image$1(background.url, rect));\r\n });\r\n }\r\n } else if (background.type == \"linear\") {\r\n drawBackgroundImage(group, box, box.width, box.height, gradientRenderer(background));\r\n } else {\r\n return;\r\n }\r\n\r\n function drawBackgroundImage(group, box, img_width, img_height, renderBG) {\r\n var aspect_ratio = img_width / img_height, f;\r\n\r\n // for background-origin: border-box the box is already appropriate\r\n var orgBox = box;\r\n if (backgroundOrigin == \"content-box\") {\r\n orgBox = innerBox(orgBox, \"border-*-width\", element);\r\n orgBox = innerBox(orgBox, \"padding-*\", element);\r\n } else if (backgroundOrigin == \"padding-box\") {\r\n orgBox = innerBox(orgBox, \"border-*-width\", element);\r\n }\r\n\r\n if (!/^\\s*auto(\\s+auto)?\\s*$/.test(backgroundSize)) {\r\n if (backgroundSize == \"contain\") {\r\n f = Math.min(orgBox.width / img_width,\r\n orgBox.height / img_height);\r\n img_width *= f;\r\n img_height *= f;\r\n }\r\n else if (backgroundSize == \"cover\") {\r\n f = Math.max(orgBox.width / img_width,\r\n orgBox.height / img_height);\r\n img_width *= f;\r\n img_height *= f;\r\n }\r\n else {\r\n var size = backgroundSize.split(/\\s+/g);\r\n // compute width\r\n if (/%$/.test(size[0])) {\r\n img_width = orgBox.width * parseFloat(size[0]) / 100;\r\n } else {\r\n img_width = parseFloat(size[0]);\r\n }\r\n // compute height\r\n if (size.length == 1 || size[1] == \"auto\") {\r\n img_height = img_width / aspect_ratio;\r\n } else if (/%$/.test(size[1])) {\r\n img_height = orgBox.height * parseFloat(size[1]) / 100;\r\n } else {\r\n img_height = parseFloat(size[1]);\r\n }\r\n }\r\n }\r\n\r\n var pos = String(backgroundPosition);\r\n\r\n // IE sometimes reports single-word positions\r\n // https://github.com/telerik/kendo-ui-core/issues/2786\r\n //\r\n // it seems to switch to percentages when the horizontal\r\n // position is not \"center\", therefore we don't handle\r\n // multi-word cases here. All other browsers return\r\n // percentages or pixels instead of keywords. At least\r\n // for now...\r\n switch (pos) {\r\n case \"bottom\" : pos = \"50% 100%\"; break;\r\n case \"top\" : pos = \"50% 0\"; break;\r\n case \"left\" : pos = \"0 50%\"; break;\r\n case \"right\" : pos = \"100% 50%\"; break;\r\n case \"center\" : pos = \"50% 50%\"; break;\r\n }\r\n\r\n pos = pos.split(/\\s+/);\r\n if (pos.length == 1) {\r\n pos[1] = \"50%\";\r\n }\r\n\r\n if (/%$/.test(pos[0])) {\r\n pos[0] = parseFloat(pos[0]) / 100 * (orgBox.width - img_width);\r\n } else {\r\n pos[0] = parseFloat(pos[0]);\r\n }\r\n if (/%$/.test(pos[1])) {\r\n pos[1] = parseFloat(pos[1]) / 100 * (orgBox.height - img_height);\r\n } else {\r\n pos[1] = parseFloat(pos[1]);\r\n }\r\n\r\n var rect = new Rect([ orgBox.left + pos[0], orgBox.top + pos[1] ], [ img_width, img_height ]);\r\n\r\n // XXX: background-repeat could be implemented more\r\n // efficiently as a fill pattern (at least for PDF\r\n // output, probably SVG too).\r\n\r\n function rewX() {\r\n while (rect.origin.x > box.left) {\r\n rect.origin.x -= img_width;\r\n }\r\n }\r\n\r\n function rewY() {\r\n while (rect.origin.y > box.top) {\r\n rect.origin.y -= img_height;\r\n }\r\n }\r\n\r\n function repeatX() {\r\n while (rect.origin.x < box.right) {\r\n renderBG(group, rect.clone());\r\n rect.origin.x += img_width;\r\n }\r\n }\r\n\r\n if (backgroundRepeat == \"no-repeat\") {\r\n renderBG(group, rect);\r\n }\r\n else if (backgroundRepeat == \"repeat-x\") {\r\n rewX();\r\n repeatX();\r\n }\r\n else if (backgroundRepeat == \"repeat-y\") {\r\n rewY();\r\n while (rect.origin.y < box.bottom) {\r\n renderBG(group, rect.clone());\r\n rect.origin.y += img_height;\r\n }\r\n }\r\n else if (backgroundRepeat == \"repeat\") {\r\n rewX();\r\n rewY();\r\n var origin = rect.origin.clone();\r\n while (rect.origin.y < box.bottom) {\r\n rect.origin.x = origin.x;\r\n repeatX();\r\n rect.origin.y += img_height;\r\n }\r\n }\r\n }\r\n }\r\n\r\n function drawBullet() {\r\n var listStyleType = getPropertyValue(style, \"list-style-type\");\r\n if (listStyleType == \"none\") {\r\n return;\r\n }\r\n var listStylePosition = getPropertyValue(style, \"list-style-position\");\r\n\r\n function _drawBullet(f) {\r\n saveStyle(element, function(){\r\n element.style.position = \"relative\";\r\n var bullet = element.ownerDocument.createElement(KENDO_PSEUDO_ELEMENT);\r\n bullet.style.position = \"absolute\";\r\n bullet.style.boxSizing = \"border-box\";\r\n if (listStylePosition == \"outside\") {\r\n bullet.style.width = \"6em\";\r\n bullet.style.left = \"-6.8em\";\r\n bullet.style.textAlign = \"right\";\r\n } else {\r\n bullet.style.left = \"0px\";\r\n }\r\n f(bullet);\r\n element.insertBefore(bullet, element.firstChild);\r\n renderElement(bullet, group);\r\n element.removeChild(bullet);\r\n });\r\n }\r\n\r\n function elementIndex(f) {\r\n var a = element.parentNode.children;\r\n var k = element.getAttribute(\"kendo-split-index\");\r\n if (k != null) {\r\n return f(k|0, a.length);\r\n }\r\n for (var i = 0; i < a.length; ++i) {\r\n if (a[i] === element) {\r\n return f(i, a.length);\r\n }\r\n }\r\n }\r\n\r\n switch (listStyleType) {\r\n case \"circle\":\r\n case \"disc\":\r\n case \"square\":\r\n _drawBullet(function(bullet){\r\n bullet.innerHTML = ' ';\r\n bullet.setAttribute(KENDO_BULLET_TYPE, listStyleType);\r\n });\r\n break;\r\n\r\n case \"decimal\":\r\n case \"decimal-leading-zero\":\r\n _drawBullet(function(bullet){\r\n elementIndex(function(idx){\r\n ++idx;\r\n if (listStyleType == \"decimal-leading-zero\" && idx < 10) {\r\n idx = \"0\" + idx;\r\n }\r\n bullet.innerHTML = idx + \".\";\r\n });\r\n });\r\n break;\r\n\r\n case \"lower-roman\":\r\n case \"upper-roman\":\r\n _drawBullet(function(bullet){\r\n elementIndex(function(idx){\r\n idx = arabicToRoman(idx + 1);\r\n if (listStyleType == \"upper-roman\") {\r\n idx = idx.toUpperCase();\r\n }\r\n bullet.innerHTML = idx + \".\";\r\n });\r\n });\r\n break;\r\n\r\n case \"lower-latin\":\r\n case \"lower-alpha\":\r\n case \"upper-latin\":\r\n case \"upper-alpha\":\r\n _drawBullet(function(bullet){\r\n elementIndex(function(idx){\r\n idx = alphaNumeral(idx);\r\n if (/^upper/i.test(listStyleType)) {\r\n idx = idx.toUpperCase();\r\n }\r\n bullet.innerHTML = idx + \".\";\r\n });\r\n });\r\n break;\r\n }\r\n }\r\n\r\n // draws a single border box\r\n function drawOneBox(box, isFirst, isLast) {\r\n if (box.width === 0 || box.height === 0) {\r\n return;\r\n }\r\n\r\n drawBackground(box);\r\n\r\n var shouldDrawLeft = (left.width > 0 && ((isFirst && dir == \"ltr\") || (isLast && dir == \"rtl\")));\r\n var shouldDrawRight = (right.width > 0 && ((isLast && dir == \"ltr\") || (isFirst && dir == \"rtl\")));\r\n\r\n // The most general case is that the 4 borders have different widths and border\r\n // radiuses. The way that is handled is by drawing 3 Paths for each border: the\r\n // straight line, and two round corners which represent half of the entire rounded\r\n // corner. To simplify code those shapes are drawed at origin (by the drawEdge\r\n // function), then translated/rotated into the right position.\r\n //\r\n // However, this leads to poor results due to rounding in the simpler cases where\r\n // borders are straight lines. Therefore we handle a few such cases separately with\r\n // straight lines. C^wC^wC^w -- nope, scratch that. poor rendering was because of a bug\r\n // in Chrome (getClientRects() returns rounded integer values rather than exact floats.\r\n // web dev is still a ghetto.)\r\n\r\n // first, just in case there is no border...\r\n if (top.width === 0 && left.width === 0 && right.width === 0 && bottom.width === 0) {\r\n return;\r\n }\r\n\r\n // START paint borders\r\n // if all borders have equal colors...\r\n if (top.color == right.color && top.color == bottom.color && top.color == left.color) {\r\n\r\n // if same widths too, we can draw the whole border by stroking a single path.\r\n if (top.width == right.width && top.width == bottom.width && top.width == left.width)\r\n {\r\n if (shouldDrawLeft && shouldDrawRight) {\r\n // reduce box by half the border width, so we can draw it by stroking.\r\n box = innerBox(box, top.width/2);\r\n\r\n // adjust the border radiuses, again by top.width/2, and make the path element.\r\n var path = elementRoundBox(element, box, top.width/2);\r\n path.options.stroke = {\r\n color: top.color,\r\n width: top.width\r\n };\r\n group.append(path);\r\n return;\r\n }\r\n }\r\n }\r\n\r\n // if border radiuses are zero and widths are at most one pixel, we can again use simple\r\n // paths.\r\n if (rTL0.x === 0 && rTR0.x === 0 && rBR0.x === 0 && rBL0.x === 0) {\r\n // alright, 1.9px will do as well. the difference in color blending should not be\r\n // noticeable.\r\n if (top.width < 2 && left.width < 2 && right.width < 2 && bottom.width < 2) {\r\n // top border\r\n if (top.width > 0) {\r\n group.append(\r\n new Path({\r\n stroke: { width: top.width, color: top.color }\r\n })\r\n .moveTo(box.left, box.top + top.width/2)\r\n .lineTo(box.right, box.top + top.width/2)\r\n );\r\n }\r\n\r\n // bottom border\r\n if (bottom.width > 0) {\r\n group.append(\r\n new Path({\r\n stroke: { width: bottom.width, color: bottom.color }\r\n })\r\n .moveTo(box.left, box.bottom - bottom.width/2)\r\n .lineTo(box.right, box.bottom - bottom.width/2)\r\n );\r\n }\r\n\r\n // left border\r\n if (shouldDrawLeft) {\r\n group.append(\r\n new Path({\r\n stroke: { width: left.width, color: left.color }\r\n })\r\n .moveTo(box.left + left.width/2, box.top)\r\n .lineTo(box.left + left.width/2, box.bottom)\r\n );\r\n }\r\n\r\n // right border\r\n if (shouldDrawRight) {\r\n group.append(\r\n new Path({\r\n stroke: { width: right.width, color: right.color }\r\n })\r\n .moveTo(box.right - right.width/2, box.top)\r\n .lineTo(box.right - right.width/2, box.bottom)\r\n );\r\n }\r\n\r\n return;\r\n }\r\n }\r\n // END paint borders\r\n\r\n var tmp = adjustBorderRadiusForBox(box, rTL0, rTR0, rBR0, rBL0);\r\n var rTL = tmp.tl;\r\n var rTR = tmp.tr;\r\n var rBR = tmp.br;\r\n var rBL = tmp.bl;\r\n\r\n // top border\r\n drawEdge(top.color,\r\n box.width, top.width, left.width, right.width,\r\n rTL, rTR,\r\n [ 1, 0, 0, 1, box.left, box.top ]);\r\n\r\n // bottom border\r\n drawEdge(bottom.color,\r\n box.width, bottom.width, right.width, left.width,\r\n rBR, rBL,\r\n [ -1, 0, 0, -1, box.right, box.bottom ]);\r\n\r\n // for left/right borders we need to invert the border-radiuses\r\n function inv(p) {\r\n return { x: p.y, y: p.x };\r\n }\r\n\r\n // left border\r\n drawEdge(left.color,\r\n box.height, left.width, bottom.width, top.width,\r\n inv(rBL), inv(rTL),\r\n [ 0, -1, 1, 0, box.left, box.bottom ]);\r\n\r\n // right border\r\n drawEdge(right.color,\r\n box.height, right.width, top.width, bottom.width,\r\n inv(rTR), inv(rBR),\r\n [ 0, 1, -1, 0, box.right, box.top ]);\r\n }\r\n }\r\n\r\n function gradientRenderer(gradient) {\r\n return function(group, rect) {\r\n var width = rect.width(), height = rect.height();\r\n\r\n switch (gradient.type) {\r\n case \"linear\":\r\n\r\n // figure out the angle.\r\n var angle = gradient.angle != null ? gradient.angle : Math.PI;\r\n switch (gradient.to) {\r\n case \"top\":\r\n angle = 0;\r\n break;\r\n case \"left\":\r\n angle = -Math.PI / 2;\r\n break;\r\n case \"bottom\":\r\n angle = Math.PI;\r\n break;\r\n case \"right\":\r\n angle = Math.PI / 2;\r\n break;\r\n case \"top left\": case \"left top\":\r\n angle = -Math.atan2(height, width);\r\n break;\r\n case \"top right\": case \"right top\":\r\n angle = Math.atan2(height, width);\r\n break;\r\n case \"bottom left\": case \"left bottom\":\r\n angle = Math.PI + Math.atan2(height, width);\r\n break;\r\n case \"bottom right\": case \"right bottom\":\r\n angle = Math.PI - Math.atan2(height, width);\r\n break;\r\n }\r\n\r\n if (gradient.reverse) {\r\n angle -= Math.PI;\r\n }\r\n\r\n // limit the angle between 0..2PI\r\n angle %= 2 * Math.PI;\r\n if (angle < 0) {\r\n angle += 2 * Math.PI;\r\n }\r\n\r\n // compute gradient's start/end points. here len is the length of the gradient line\r\n // and x,y is the end point relative to the center of the rectangle in conventional\r\n // (math) axis direction.\r\n\r\n // this is the original (unscaled) length of the gradient line. needed to deal with\r\n // absolutely positioned color stops. formula from the CSS spec:\r\n // http://dev.w3.org/csswg/css-images-3/#linear-gradient-syntax\r\n var pxlen = Math.abs(width * Math.sin(angle)) + Math.abs(height * Math.cos(angle));\r\n\r\n // The math below is pretty simple, but it took a while to figure out. We compute x\r\n // and y, the *end* of the gradient line. However, we want to transform them into\r\n // element-based coordinates (SVG's gradientUnits=\"objectBoundingBox\"). That means,\r\n // x=0 is the left edge, x=1 is the right edge, y=0 is the top edge and y=1 is the\r\n // bottom edge.\r\n //\r\n // A naive approach would use the original angle for these calculations. Say we'd\r\n // like to draw a gradient angled at 45deg in a 100x400 box. When we use\r\n // objectBoundingBox, the renderer will draw it in a 1x1 *square* box, and then\r\n // scale that to the desired dimensions. The 45deg angle will look more like 70deg\r\n // after scaling. SVG (http://www.w3.org/TR/SVG/pservers.html#LinearGradients) says\r\n // the following:\r\n //\r\n // When gradientUnits=\"objectBoundingBox\" and 'gradientTransform' is the\r\n // identity matrix, the normal of the linear gradient is perpendicular to the\r\n // gradient vector in object bounding box space (i.e., the abstract coordinate\r\n // system where (0,0) is at the top/left of the object bounding box and (1,1) is\r\n // at the bottom/right of the object bounding box). When the object's bounding\r\n // box is not square, the gradient normal which is initially perpendicular to\r\n // the gradient vector within object bounding box space may render\r\n // non-perpendicular relative to the gradient vector in user space. If the\r\n // gradient vector is parallel to one of the axes of the bounding box, the\r\n // gradient normal will remain perpendicular. This transformation is due to\r\n // application of the non-uniform scaling transformation from bounding box space\r\n // to user space.\r\n //\r\n // which is an extremely long and confusing way to tell what I just said above.\r\n //\r\n // For this reason we need to apply the reverse scaling to the original angle, so\r\n // that when it'll finally be rendered it'll actually be at the desired slope. Now\r\n // I'll let you figure out the math yourself.\r\n\r\n var scaledAngle = Math.atan(width * Math.tan(angle) / height);\r\n var sin = Math.sin(scaledAngle), cos = Math.cos(scaledAngle);\r\n var len = Math.abs(sin) + Math.abs(cos);\r\n var x = len/2 * sin;\r\n var y = len/2 * cos;\r\n\r\n // Because of the arctangent, our scaledAngle ends up between -PI/2..PI/2, possibly\r\n // losing the intended direction of the gradient. The following fixes it.\r\n if (angle > Math.PI/2 && angle <= 3*Math.PI/2) {\r\n x = -x;\r\n y = -y;\r\n }\r\n\r\n // compute the color stops.\r\n var implicit = [], right = 0;\r\n var stops = gradient.stops.map(function(s, i){\r\n var offset = s.percent;\r\n if (offset) {\r\n offset = parseFloat(offset) / 100;\r\n } else if (s.length) {\r\n offset = parseFloat(s.length) / pxlen;\r\n } else if (i === 0) {\r\n offset = 0;\r\n } else if (i == gradient.stops.length - 1) {\r\n offset = 1;\r\n }\r\n var stop = {\r\n color: s.color.toCssRgba(),\r\n offset: offset\r\n };\r\n if (offset != null) {\r\n right = offset;\r\n // fix implicit offsets\r\n implicit.forEach(function(s, i){\r\n var stop = s.stop;\r\n stop.offset = s.left + (right - s.left) * (i + 1) / (implicit.length + 1);\r\n });\r\n implicit = [];\r\n } else {\r\n implicit.push({ left: right, stop: stop });\r\n }\r\n return stop;\r\n });\r\n\r\n var start = [ 0.5 - x, 0.5 + y ];\r\n var end = [ 0.5 + x, 0.5 - y ];\r\n\r\n // finally, draw it.\r\n group.append(\r\n Path.fromRect(rect)\r\n .stroke(null)\r\n .fill(new LinearGradient({\r\n start : start,\r\n end : end,\r\n stops : stops,\r\n userSpace : false\r\n }))\r\n );\r\n break;\r\n case \"radial\":\r\n // XXX:\r\n if (window.console && window.console.log) {\r\n window.console.log(\"Radial gradients are not yet supported in HTML renderer\");\r\n }\r\n break;\r\n }\r\n };\r\n }\r\n\r\n function maybeRenderWidget(element, group) {\r\n var visual;\r\n\r\n if (element._kendoExportVisual) {\r\n visual = element._kendoExportVisual();\r\n } else if (window.kendo && window.kendo.jQuery && element.getAttribute(window.kendo.attr(\"role\"))) {\r\n var widget = window.kendo.widgetInstance(window.kendo.jQuery(element));\r\n if (widget && (widget.exportDOMVisual || widget.exportVisual)) {\r\n if (widget.exportDOMVisual) {\r\n visual = widget.exportDOMVisual();\r\n } else {\r\n visual = widget.exportVisual();\r\n }\r\n }\r\n }\r\n\r\n if (!visual) {\r\n return false;\r\n }\r\n\r\n var wrap$$1 = new Group();\r\n wrap$$1.children.push(visual);\r\n\r\n var bbox = element.getBoundingClientRect();\r\n wrap$$1.transform(transform$1().translate(bbox.left, bbox.top));\r\n\r\n group.append(wrap$$1);\r\n\r\n return true;\r\n }\r\n\r\n function maybeRenderBullet(element, group) {\r\n var bulletType = element.getAttribute(KENDO_BULLET_TYPE);\r\n\r\n if (!bulletType) {\r\n return false;\r\n }\r\n\r\n var box = element.getBoundingClientRect();\r\n var color = getComputedStyle$1(element).color;\r\n\r\n if (bulletType === 'square') {\r\n var rectSize = box.height / 5;\r\n group.append(new Rect$2(new Rect([\r\n box.right - rectSize,\r\n box.top + box.height / 2.1\r\n ], [rectSize, rectSize])).fill(color).stroke(color));\r\n } else {\r\n var radius = box.height / 7;\r\n var center = [\r\n box.right - radius,\r\n box.top + (box.height + radius) / 2\r\n ];\r\n var circle = new Circle(new Circle$2(center, radius));\r\n if (bulletType === 'circle') {\r\n circle.stroke(color, 0.5);\r\n } else {\r\n circle.fill(color).stroke(null);\r\n }\r\n group.append(circle);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n function renderImage(element, url, group) {\r\n var box = getContentBox(element);\r\n var rect = new Rect([ box.left, box.top ], [ box.width, box.height ]);\r\n var image = new Image$1(url, rect);\r\n setClipping(image, elementRoundBox(element, box, \"content\"));\r\n group.append(image);\r\n }\r\n\r\n function zIndexSort(a, b) {\r\n var sa = getComputedStyle$1(a);\r\n var sb = getComputedStyle$1(b);\r\n var za = parseFloat(getPropertyValue(sa, \"z-index\"));\r\n var zb = parseFloat(getPropertyValue(sb, \"z-index\"));\r\n var pa = getPropertyValue(sa, \"position\");\r\n var pb = getPropertyValue(sb, \"position\");\r\n if (isNaN(za) && isNaN(zb)) {\r\n if ((/static|absolute/.test(pa)) && (/static|absolute/.test(pb))) {\r\n return 0;\r\n }\r\n if (pa == \"static\") {\r\n return -1;\r\n }\r\n if (pb == \"static\") {\r\n return 1;\r\n }\r\n return 0;\r\n }\r\n if (isNaN(za)) {\r\n return zb === 0 ? 0 : zb > 0 ? -1 : 1;\r\n }\r\n if (isNaN(zb)) {\r\n return za === 0 ? 0 : za > 0 ? 1 : -1;\r\n }\r\n return parseFloat(za) - parseFloat(zb);\r\n }\r\n\r\n function isFormField(element) {\r\n return /^(?:textarea|select|input)$/i.test(element.tagName);\r\n }\r\n\r\n function getSelectedOption(element) {\r\n if (element.selectedOptions && element.selectedOptions.length > 0) {\r\n return element.selectedOptions[0];\r\n }\r\n return element.options[element.selectedIndex];\r\n }\r\n\r\n function renderCheckbox(element, group) {\r\n var style = getComputedStyle$1(element);\r\n var color = getPropertyValue(style, \"color\");\r\n var box = element.getBoundingClientRect();\r\n if (element.type == \"checkbox\") {\r\n group.append(\r\n Path.fromRect(\r\n new Rect([ box.left+1, box.top+1 ],\r\n [ box.width-2, box.height-2 ])\r\n ).stroke(color, 1)\r\n );\r\n if (element.checked) {\r\n // fill a rectangle inside? looks kinda ugly.\r\n // group.append(\r\n // Path.fromRect(\r\n // new geo.Rect([ box.left+4, box.top+4 ],\r\n // [ box.width-8, box.height-8])\r\n // ).fill(color).stroke(null)\r\n // );\r\n\r\n // let's draw a checkmark instead. artistic, eh?\r\n group.append(\r\n new Path()\r\n .stroke(color, 1.2)\r\n .moveTo(box.left + 0.22 * box.width,\r\n box.top + 0.55 * box.height)\r\n .lineTo(box.left + 0.45 * box.width,\r\n box.top + 0.75 * box.height)\r\n .lineTo(box.left + 0.78 * box.width,\r\n box.top + 0.22 * box.width)\r\n );\r\n }\r\n } else {\r\n group.append(\r\n new Circle(\r\n new Circle$2([\r\n (box.left + box.right) / 2,\r\n (box.top + box.bottom) / 2\r\n ], Math.min(box.width-2, box.height-2) / 2)\r\n ).stroke(color, 1)\r\n );\r\n if (element.checked) {\r\n group.append(\r\n new Circle(\r\n new Circle$2([\r\n (box.left + box.right) / 2,\r\n (box.top + box.bottom) / 2\r\n ], Math.min(box.width-8, box.height-8) / 2)\r\n ).fill(color).stroke(null)\r\n );\r\n }\r\n }\r\n }\r\n\r\n function renderFormField(element, group) {\r\n var tag = element.tagName.toLowerCase();\r\n if (tag == \"input\" && (element.type == \"checkbox\" || element.type == \"radio\")) {\r\n return renderCheckbox(element, group);\r\n }\r\n var p = element.parentNode;\r\n var doc = element.ownerDocument;\r\n var el = doc.createElement(KENDO_PSEUDO_ELEMENT);\r\n var option;\r\n el.style.cssText = getCssText(getComputedStyle$1(element));\r\n if (tag == \"input\") {\r\n el.style.whiteSpace = \"pre\";\r\n }\r\n if (tag == \"select\" || tag == \"textarea\") {\r\n el.style.overflow = \"auto\";\r\n }\r\n if (tag == \"select\") {\r\n if (element.multiple) {\r\n for (var i = 0; i < element.options.length; ++i) {\r\n option = doc.createElement(KENDO_PSEUDO_ELEMENT);\r\n option.style.cssText = getCssText(getComputedStyle$1(element.options[i]));\r\n option.style.display = \"block\"; // IE9 messes up without this\r\n option.textContent = element.options[i].textContent;\r\n el.appendChild(option);\r\n }\r\n } else {\r\n option = getSelectedOption(element);\r\n if (option) {\r\n el.textContent = option.textContent;\r\n }\r\n }\r\n } else {\r\n el.textContent = element.value;\r\n }\r\n p.insertBefore(el, element);\r\n el.scrollLeft = element.scrollLeft;\r\n el.scrollTop = element.scrollTop;\r\n\r\n // must temporarily hide the original element, otherwise it\r\n // may affect layout of the fake element we want to render.\r\n element.style.display = \"none\";\r\n\r\n renderContents(el, group);\r\n element.style.display = \"\";\r\n p.removeChild(el);\r\n }\r\n\r\n function serializeSVG(element) {\r\n var serializer = new window.XMLSerializer();\r\n var xml = serializer.serializeToString(element);\r\n\r\n if (browser.mozilla && !(element.getAttribute(\"width\") && element.getAttribute(\"height\"))) {\r\n var doc = new window.DOMParser().parseFromString(xml, \"image/svg+xml\");\r\n var svg$$1 = doc.documentElement;\r\n var box = getContentBox(element);\r\n svg$$1.setAttribute(\"width\", box.width);\r\n svg$$1.setAttribute(\"height\", box.height);\r\n xml = serializer.serializeToString(svg$$1);\r\n }\r\n\r\n return xml;\r\n }\r\n\r\n function renderContents(element, group) {\r\n if (nodeInfo._stackingContext.element === element) {\r\n // the group that was set in pushNodeInfo might have\r\n // changed due to clipping/transforms, update it here.\r\n nodeInfo._stackingContext.group = group;\r\n }\r\n switch (element.tagName.toLowerCase()) {\r\n case \"img\":\r\n renderImage(element, element.src, group);\r\n break;\r\n\r\n case \"svg\":\r\n var xml = serializeSVG(element);\r\n var dataURL = \"data:image/svg+xml;base64,\" + (encodeBase64(xml));\r\n renderImage(element, dataURL, group);\r\n break;\r\n\r\n case \"canvas\":\r\n try {\r\n renderImage(element, element.toDataURL(\"image/png\"), group);\r\n } catch (ex) {\r\n // tainted; can't draw it, ignore.\r\n }\r\n break;\r\n\r\n case \"textarea\":\r\n case \"input\":\r\n case \"select\":\r\n renderFormField(element, group);\r\n break;\r\n\r\n default:\r\n var children = [], floats = [], positioned = [];\r\n for (var i = element.firstChild; i; i = i.nextSibling) {\r\n switch (i.nodeType) {\r\n case 3: // Text\r\n if (/\\S/.test(i.data)) {\r\n renderText(element, i, group);\r\n }\r\n break;\r\n case 1: // Element\r\n var style = getComputedStyle$1(i);\r\n var floating = getPropertyValue(style, \"float\");\r\n var position = getPropertyValue(style, \"position\");\r\n if (position != \"static\") {\r\n positioned.push(i);\r\n }\r\n else if (floating != \"none\") {\r\n floats.push(i);\r\n } else {\r\n children.push(i);\r\n }\r\n break;\r\n }\r\n }\r\n\r\n mergeSort(children, zIndexSort).forEach(function(el){ renderElement(el, group); });\r\n mergeSort(floats, zIndexSort).forEach(function(el){ renderElement(el, group); });\r\n mergeSort(positioned, zIndexSort).forEach(function(el){ renderElement(el, group); });\r\n }\r\n }\r\n\r\n function renderText(element, node, group) {\r\n if (emptyClipbox()) {\r\n return;\r\n }\r\n var style = getComputedStyle$1(element);\r\n\r\n if (parseFloat(getPropertyValue(style, \"text-indent\")) < -500) {\r\n // assume it should not be displayed. the slider's\r\n // draggable handle displays a Drag text for some reason,\r\n // having text-indent: -3333px.\r\n return;\r\n }\r\n\r\n var text = node.data;\r\n var start = 0;\r\n var end = text.search(/\\S\\s*$/) + 1;\r\n\r\n if (!end) {\r\n return; // whitespace-only node\r\n }\r\n\r\n var fontSize = getPropertyValue(style, \"font-size\");\r\n var lineHeight = getPropertyValue(style, \"line-height\");\r\n\r\n // simply getPropertyValue(\"font\") doesn't work in Firefox :-\\\r\n var font = [\r\n getPropertyValue(style, \"font-style\"),\r\n getPropertyValue(style, \"font-variant\"),\r\n getPropertyValue(style, \"font-weight\"),\r\n fontSize, // no need for line height here; it breaks layout in FF\r\n getPropertyValue(style, \"font-family\")\r\n ].join(\" \");\r\n\r\n fontSize = parseFloat(fontSize);\r\n lineHeight = parseFloat(lineHeight);\r\n\r\n if (fontSize === 0 || isNaN(fontSize)) {\r\n return;\r\n }\r\n\r\n var color = getPropertyValue(style, \"color\");\r\n var range = element.ownerDocument.createRange();\r\n var align$$1 = getPropertyValue(style, \"text-align\");\r\n var isJustified = align$$1 == \"justify\";\r\n var columnCount = getPropertyValue(style, \"column-count\", 1);\r\n var whiteSpace = getPropertyValue(style, \"white-space\");\r\n var textTransform = getPropertyValue(style, \"text-transform\");\r\n\r\n // A line of 500px, with a font of 12px, contains an average of 80 characters, but since we\r\n // err, we'd like to guess a bigger number rather than a smaller one. Multiplying by 5\r\n // seems to be a good option.\r\n var estimateLineLength = element.getBoundingClientRect().width / fontSize * 5;\r\n if (estimateLineLength === 0) {\r\n estimateLineLength = 500;\r\n }\r\n\r\n // we'll maintain this so we can workaround bugs in Chrome's Range.getClientRects\r\n // https://github.com/telerik/kendo/issues/5740\r\n var prevLineBottom = null;\r\n\r\n var underline = nodeInfo[\"underline\"];\r\n var lineThrough = nodeInfo[\"line-through\"];\r\n var overline = nodeInfo[\"overline\"];\r\n var underlineOffset = nodeInfo[\"underline-offset\"];\r\n\r\n if (underline) {\r\n forEachRect(decorateUnder);\r\n }\r\n\r\n // doChunk returns true when all text has been rendered\r\n while (!doChunk()) {}\r\n\r\n if (lineThrough || overline) {\r\n forEachRect(decorateOver);\r\n }\r\n\r\n return; // only function declarations after this line\r\n\r\n function forEachRect(callback) {\r\n range.selectNode(node);\r\n var clientRects = slice$1$1(range.getClientRects());\r\n\r\n forEachRect = function (cb) { return clientRects.forEach(cb); };\r\n forEachRect(callback);\r\n }\r\n\r\n function actuallyGetRangeBoundingRect(range) {\r\n // XXX: to be revised when this Chrome bug is fixed:\r\n // https://bugs.chromium.org/p/chromium/issues/detail?id=612459\r\n if (microsoft || browser.chrome || browser.safari) {\r\n // Workaround browser bugs: IE and Chrome would sometimes\r\n // return 0 or 1-width rectangles before or after the main\r\n // one. https://github.com/telerik/kendo/issues/4674\r\n\r\n // Actually Chrome 50 got worse, since the rectangles can now have the width of a\r\n // full character, making it hard to tell whether it's a bogus rectangle or valid\r\n // selection location. The workaround is to ignore rectangles that fall on the\r\n // previous line. https://github.com/telerik/kendo/issues/5740\r\n var rectangles = range.getClientRects(), box = {\r\n top : Infinity,\r\n right : -Infinity,\r\n bottom : -Infinity,\r\n left : Infinity\r\n }, done = false;\r\n for (var i = 0; i < rectangles.length; ++i) {\r\n var b = rectangles[i];\r\n if (b.width <= 1 || b.bottom === prevLineBottom) {\r\n continue; // bogus rectangle\r\n }\r\n box.left = Math.min(b.left , box.left);\r\n box.top = Math.min(b.top , box.top);\r\n box.right = Math.max(b.right , box.right);\r\n box.bottom = Math.max(b.bottom , box.bottom);\r\n done = true;\r\n }\r\n if (!done) {\r\n return range.getBoundingClientRect();\r\n }\r\n box.width = box.right - box.left;\r\n box.height = box.bottom - box.top;\r\n return box;\r\n }\r\n return range.getBoundingClientRect();\r\n }\r\n\r\n // Render a chunk of text, typically one line (but for justified text we render each word as\r\n // a separate Text object, because spacing is variable). Returns true when it finished the\r\n // current node. After each chunk it updates `start` to just after the last rendered\r\n // character.\r\n function doChunk() {\r\n var origStart = start;\r\n var box, pos = text.substr(start).search(/\\S/);\r\n start += pos;\r\n if (pos < 0 || start >= end) {\r\n return true;\r\n }\r\n\r\n // Select a single character to determine the height of a line of text. The box.bottom\r\n // will be essential for us to figure out where the next line begins.\r\n range.setStart(node, start);\r\n range.setEnd(node, start + 1);\r\n box = actuallyGetRangeBoundingRect(range);\r\n\r\n // for justified text we must split at each space, because space has variable width.\r\n var found = false;\r\n if (isJustified || columnCount > 1) {\r\n pos = text.substr(start).search(/\\s/);\r\n if (pos >= 0) {\r\n // we can only split there if it's on the same line, otherwise we'll fall back\r\n // to the default mechanism (see findEOL below).\r\n range.setEnd(node, start + pos);\r\n var r = actuallyGetRangeBoundingRect(range);\r\n if (r.bottom == box.bottom) {\r\n box = r;\r\n found = true;\r\n start += pos;\r\n }\r\n }\r\n }\r\n\r\n if (!found) {\r\n // This code does three things: (1) it selects one line of text in `range`, (2) it\r\n // leaves the bounding rect of that line in `box` and (3) it returns the position\r\n // just after the EOL. We know where the line starts (`start`) but we don't know\r\n // where it ends. To figure this out, we select a piece of text and look at the\r\n // bottom of the bounding box. If it changes, we have more than one line selected\r\n // and should retry with a smaller selection.\r\n //\r\n // To speed things up, we first try to select all text in the node (`start` ->\r\n // `end`). If there's more than one line there, then select only half of it. And\r\n // so on. When we find a value for `end` that fits in one line, we try increasing\r\n // it (also in halves) until we get to the next line. The algorithm stops when the\r\n // right side of the bounding box does not change.\r\n //\r\n // One more thing to note is that everything happens in a single Text DOM node.\r\n // There's no other tags inside it, therefore the left/top coordinates of the\r\n // bounding box will not change.\r\n pos = (function findEOL(min, eol, max){\r\n range.setEnd(node, eol);\r\n var r = actuallyGetRangeBoundingRect(range);\r\n if (r.bottom != box.bottom && min < eol) {\r\n return findEOL(min, (min + eol) >> 1, eol);\r\n } else if (r.right != box.right) {\r\n box = r;\r\n if (eol < max) {\r\n return findEOL(eol, (eol + max) >> 1, max);\r\n } else {\r\n return eol;\r\n }\r\n } else {\r\n return eol;\r\n }\r\n })(start, Math.min(end, start + estimateLineLength), end);\r\n\r\n if (pos == start) {\r\n // if EOL is at the start, then no more text fits on this line. Skip the\r\n // remainder of this node entirely to avoid a stack overflow.\r\n return true;\r\n }\r\n start = pos;\r\n\r\n pos = range.toString().search(/\\s+$/);\r\n if (pos === 0) {\r\n return false; // whitespace only; we should not get here.\r\n }\r\n if (pos > 0) {\r\n // eliminate trailing whitespace\r\n range.setEnd(node, range.startOffset + pos);\r\n box = actuallyGetRangeBoundingRect(range);\r\n }\r\n }\r\n\r\n // another workaround for IE: if we rely on getBoundingClientRect() we'll overlap with the bullet for LI\r\n // elements. Calling getClientRects() and using the *first* rect appears to give us the correct location.\r\n // Note: not to be used in Chrome as it randomly returns a zero-width rectangle from the previous line.\r\n if (microsoft) {\r\n box = range.getClientRects()[0];\r\n }\r\n\r\n var str = range.toString();\r\n if (!/^(?:pre|pre-wrap)$/i.test(whiteSpace)) {\r\n // node with non-significant space -- collapse whitespace.\r\n str = str.replace(/\\s+/g, \" \");\r\n }\r\n else if (/\\t/.test(str)) {\r\n // with significant whitespace we need to do something about literal TAB characters.\r\n // There's no TAB glyph in a font so they would be rendered in PDF as an empty box,\r\n // and the whole text will stretch to fill the original width. The core PDF lib\r\n // does not have sufficient context to deal with it.\r\n\r\n // calculate the starting column here, since we initially discarded any whitespace.\r\n var cc = 0;\r\n for (pos = origStart; pos < range.startOffset; ++pos) {\r\n var code = text.charCodeAt(pos);\r\n if (code == 9) {\r\n // when we meet a TAB we must round up to the next tab stop.\r\n // in all browsers TABs seem to be 8 characters.\r\n cc += 8 - cc % 8;\r\n } else if (code == 10 || code == 13) {\r\n // just in case we meet a newline we must restart.\r\n cc = 0;\r\n } else {\r\n // ordinary character --> advance one column\r\n cc++;\r\n }\r\n }\r\n\r\n // based on starting column, replace any TAB characters in the string we actually\r\n // have to display with spaces so that they align to columns multiple of 8.\r\n while ((pos = str.search(\"\\t\")) >= 0) {\r\n var indent = \" \".substr(0, 8 - (cc + pos) % 8);\r\n str = str.substr(0, pos) + indent + str.substr(pos + 1);\r\n }\r\n }\r\n\r\n if (!found) {\r\n prevLineBottom = box.bottom;\r\n }\r\n drawText(str, box);\r\n }\r\n\r\n function drawText(str, box) {\r\n // In IE the box height will be approximately lineHeight, while in\r\n // other browsers it'll (correctly) be the height of the bounding\r\n // box for the current text/font. Which is to say, IE sucks again.\r\n // The only good solution I can think of is to measure the text\r\n // ourselves and center the bounding box.\r\n if (microsoft && !isNaN(lineHeight)) {\r\n var height = getFontHeight(font);\r\n var top = (box.top + box.bottom - height) / 2;\r\n box = {\r\n top : top,\r\n right : box.right,\r\n bottom : top + height,\r\n left : box.left,\r\n height : height,\r\n width : box.right - box.left\r\n };\r\n }\r\n\r\n // var path = new Path({ stroke: { color: \"red\" }});\r\n // path.moveTo(box.left, box.top)\r\n // .lineTo(box.right, box.top)\r\n // .lineTo(box.right, box.bottom)\r\n // .lineTo(box.left, box.bottom)\r\n // .close();\r\n // group.append(path);\r\n\r\n switch (textTransform) {\r\n case \"uppercase\":\r\n str = str.toUpperCase();\r\n break;\r\n case \"lowercase\":\r\n str = str.toLowerCase();\r\n break;\r\n case \"capitalize\":\r\n str = str.replace(/(?:^|\\s)\\S/g, function (l) { return l.toUpperCase(); });\r\n break;\r\n }\r\n\r\n var text = new TextRect(\r\n str, new Rect([ box.left, box.top ],\r\n [ box.width, box.height ]),\r\n {\r\n font: font,\r\n fill: { color: color }\r\n }\r\n );\r\n group.append(text);\r\n }\r\n\r\n function drawTextLine(lineWidth, textBox, color, ypos) {\r\n if (color) {\r\n var path = new Path({ stroke: {\r\n width: lineWidth,\r\n color: color\r\n }});\r\n\r\n ypos -= lineWidth;\r\n path.moveTo(textBox.left, ypos)\r\n .lineTo(textBox.right, ypos);\r\n group.append(path);\r\n }\r\n }\r\n\r\n function decorateOver(box) {\r\n var width = fontSize / 12;\r\n drawTextLine(width, box, lineThrough, box.bottom - box.height / 2.7);\r\n drawTextLine(width, box, overline, box.top);\r\n }\r\n\r\n function decorateUnder(box) {\r\n var width = fontSize / 12;\r\n var underlinePos = box.bottom;\r\n if (underlineOffset != null) {\r\n underlinePos += underlineOffset;\r\n } else {\r\n underlinePos += width; // for \"auto\" it seems better to add line width\r\n }\r\n drawTextLine(width, box, underline, underlinePos);\r\n }\r\n }\r\n\r\n function groupInStackingContext(element, group, zIndex) {\r\n var main;\r\n if (zIndex != \"auto\") {\r\n // use the current stacking context\r\n main = nodeInfo._stackingContext.group;\r\n zIndex = parseFloat(zIndex);\r\n } else {\r\n // normal flow — use given container. we still have to\r\n // figure out where should we insert this element with the\r\n // assumption that its z-index is zero, as the group might\r\n // already contain elements with higher z-index.\r\n main = group;\r\n zIndex = 0;\r\n }\r\n var a = main.children;\r\n for (var i = 0; i < a.length; ++i) {\r\n if (a[i]._dom_zIndex != null && a[i]._dom_zIndex > zIndex) {\r\n break;\r\n }\r\n }\r\n\r\n var tmp = new Group();\r\n main.insert(i, tmp);\r\n tmp._dom_zIndex = zIndex;\r\n\r\n if (main !== group) {\r\n // console.log(\"Placing\", element, \"in\", nodeInfo._stackingContext.element, \"at position\", i, \" / \", a.length);\r\n // console.log(a.slice(i+1));\r\n\r\n // if (nodeInfo._matrix) {\r\n // tmp.transform(nodeInfo._matrix);\r\n // }\r\n if (nodeInfo._clipbox) {\r\n var m = nodeInfo._matrix.invert();\r\n var r = nodeInfo._clipbox.transformCopy(m);\r\n setClipping(tmp, Path.fromRect(r));\r\n // console.log(r);\r\n // tmp.append(Path.fromRect(r));\r\n // tmp.append(new Text(element.className || element.id, r.topLeft()));\r\n }\r\n }\r\n\r\n return tmp;\r\n }\r\n\r\n function renderElement(element, container) {\r\n var style = getComputedStyle$1(element);\r\n\r\n updateCounters(style);\r\n\r\n if (/^(style|script|link|meta|iframe|col|colgroup)$/i.test(element.tagName)) {\r\n return;\r\n }\r\n\r\n if (nodeInfo._clipbox == null) {\r\n return;\r\n }\r\n\r\n var opacity = parseFloat(getPropertyValue(style, \"opacity\"));\r\n var visibility = getPropertyValue(style, \"visibility\");\r\n var display = getPropertyValue(style, \"display\");\r\n\r\n if (opacity === 0 || visibility == \"hidden\" || display == \"none\") {\r\n return;\r\n }\r\n\r\n var tr = getTransform(style);\r\n var group;\r\n\r\n var zIndex = getPropertyValue(style, \"z-index\");\r\n if ((tr || opacity < 1) && zIndex == \"auto\") {\r\n zIndex = 0;\r\n }\r\n group = groupInStackingContext(element, container, zIndex);\r\n\r\n // XXX: remove at some point\r\n // group._pdfElement = element;\r\n // group.options._pdfDebug = \"\";\r\n // if (element.id) {\r\n // group.options._pdfDebug = \"#\" + element.id;\r\n // }\r\n // if (element.className) {\r\n // group.options._pdfDebug += \".\" + element.className.split(\" \").join(\".\");\r\n // }\r\n\r\n if (opacity < 1) {\r\n group.opacity(opacity * group.opacity());\r\n }\r\n\r\n pushNodeInfo(element, style, group);\r\n\r\n if (!tr) {\r\n _renderWithPseudoElements(element, group);\r\n }\r\n else {\r\n saveStyle(element, function(){\r\n // must clear transform, so getBoundingClientRect returns correct values.\r\n pleaseSetPropertyValue(element.style, \"transform\", \"none\", \"important\");\r\n\r\n // must also clear transitions, so correct values are returned *immediately*\r\n pleaseSetPropertyValue(element.style, \"transition\", \"none\", \"important\");\r\n\r\n // the presence of any transform makes it behave like it had position: relative,\r\n // because why not.\r\n // http://meyerweb.com/eric/thoughts/2011/09/12/un-fixing-fixed-elements-with-css-transforms/\r\n if (getPropertyValue(style, \"position\") == \"static\") {\r\n // but only if it's not already positioned. :-/\r\n pleaseSetPropertyValue(element.style, \"position\", \"relative\", \"important\");\r\n }\r\n\r\n // must translate to origin before applying the CSS\r\n // transformation, then translate back.\r\n var bbox = element.getBoundingClientRect();\r\n var x = bbox.left + tr.origin[0];\r\n var y = bbox.top + tr.origin[1];\r\n var m = [ 1, 0, 0, 1, -x, -y ];\r\n m = mmul(m, tr.matrix);\r\n m = mmul(m, [ 1, 0, 0, 1, x, y ]);\r\n m = setTransform$1(group, m);\r\n\r\n nodeInfo._matrix = nodeInfo._matrix.multiplyCopy(m);\r\n\r\n _renderWithPseudoElements(element, group);\r\n });\r\n }\r\n\r\n popNodeInfo();\r\n\r\n //drawDebugBox(element.getBoundingClientRect(), container);\r\n }\r\n\r\n // function drawDebugBox(box, group, color) {\r\n // var path = Path.fromRect(new geo.Rect([ box.left, box.top ], [ box.width, box.height ]));\r\n // if (color) {\r\n // path.stroke(color);\r\n // }\r\n // group.append(path);\r\n // }\r\n\r\n // function dumpTextNode(node) {\r\n // var txt = node.data.replace(/^\\s+/, \"\");\r\n // if (txt.length < 100) {\r\n // console.log(node.data.length + \": |\" + txt);\r\n // } else {\r\n // console.log(node.data.length + \": |\" + txt.substr(0, 50) + \"|...|\" + txt.substr(-50));\r\n // }\r\n // }\r\n\r\n function mmul(a, b) {\r\n var a1 = a[0], b1 = a[1], c1 = a[2], d1 = a[3], e1 = a[4], f1 = a[5];\r\n var a2 = b[0], b2 = b[1], c2 = b[2], d2 = b[3], e2 = b[4], f2 = b[5];\r\n return [\r\n a1*a2 + b1*c2, a1*b2 + b1*d2,\r\n c1*a2 + d1*c2, c1*b2 + d1*d2,\r\n e1*a2 + f1*c2 + e2, e1*b2 + f1*d2 + f2\r\n ];\r\n }\r\n\r\n var drawing = {\r\n \tsvg: svg$1,\r\n \tcanvas: canvas,\r\n \tutil: util,\r\n \tHasObservers: HasObservers,\r\n \tPathParser: PathParser,\r\n \tparsePath: parsePath,\r\n \tBaseNode: BaseNode,\r\n \tOptionsStore: OptionsStore,\r\n \tSurface: Surface,\r\n \tSurfaceFactory: SurfaceFactory,\r\n \texportImage: exportImage,\r\n \texportSVG: exportSVG,\r\n \tQuadNode: QuadNode,\r\n \tShapesQuadTree: ShapesQuadTree,\r\n \tElement: Element$1,\r\n \tCircle: Circle,\r\n \tArc: Arc,\r\n \tPath: Path,\r\n \tMultiPath: MultiPath,\r\n \tText: Text,\r\n \tImage: Image$1,\r\n \tGroup: Group,\r\n \tLayout: Layout,\r\n \tRect: Rect$2,\r\n \talign: align,\r\n \tvAlign: vAlign,\r\n \tstack: stack,\r\n \tvStack: vStack,\r\n \twrap: wrap,\r\n \tvWrap: vWrap,\r\n \tfit: fit,\r\n \tLinearGradient: LinearGradient,\r\n \tRadialGradient: RadialGradient,\r\n \tGradientStop: GradientStop,\r\n \tGradient: Gradient,\r\n \tAnimation: Animation,\r\n \tAnimationFactory: AnimationFactory,\r\n \tdrawDOM: drawDOM,\r\n \tdrawText: drawText,\r\n \tgetFontFaces: getFontFaces\r\n };\r\n\r\n kendo.deepExtend(kendo, {\r\n drawing: drawing,\r\n geometry: geometry\r\n });\r\n\r\n // Use unique SVG Definition IDs for Kendo UI\r\n defId = 1000;\r\n\r\n kendo.drawing.Segment = kendo.geometry.Segment;\r\n kendo.dataviz.drawing = kendo.drawing;\r\n kendo.dataviz.geometry = kendo.geometry;\r\n kendo.drawing.util.measureText = kendo.util.measureText;\r\n kendo.drawing.util.objectKey = kendo.util.objectKey;\r\n kendo.drawing.Color = kendo.Color;\r\n kendo.util.encodeBase64 = kendo.drawing.util.encodeBase64;\r\n\r\n })(window.kendo.jQuery);\r\n\r\n var __meta__$2t = {\r\n id: \"popup\",\r\n name: \"Pop-up\",\r\n category: \"framework\",\r\n depends: [ \"core\" ],\r\n advanced: true\r\n };\r\n\r\n (function($, undefined$1) {\r\n var kendo = window.kendo,\r\n ui = kendo.ui,\r\n Widget = ui.Widget,\r\n Class = kendo.Class,\r\n support = kendo.support,\r\n getOffset = kendo.getOffset,\r\n outerWidth = kendo._outerWidth,\r\n outerHeight = kendo._outerHeight,\r\n OPEN = \"open\",\r\n CLOSE = \"close\",\r\n DEACTIVATE = \"deactivate\",\r\n ACTIVATE = \"activate\",\r\n CENTER = \"center\",\r\n LEFT = \"left\",\r\n RIGHT = \"right\",\r\n TOP = \"top\",\r\n BOTTOM = \"bottom\",\r\n ABSOLUTE = \"absolute\",\r\n HIDDEN = \"hidden\",\r\n BODY = \"body\",\r\n LOCATION = \"location\",\r\n POSITION = \"position\",\r\n VISIBLE = \"visible\",\r\n EFFECTS = \"effects\",\r\n ACTIVE = \"k-active\",\r\n ACTIVECHILDREN = \".k-picker-wrap, .k-dropdown-wrap, .k-link\",\r\n MOUSEDOWN = \"down\",\r\n DOCUMENT_ELEMENT = $(document.documentElement),\r\n WINDOW = $(window),\r\n SCROLL = \"scroll\",\r\n TRANSFORM = \"transform\",\r\n extend = $.extend,\r\n NS = \".kendoPopup\",\r\n styles = [\"font-size\",\r\n \"font-family\",\r\n \"font-stretch\",\r\n \"font-style\",\r\n \"font-weight\",\r\n \"line-height\"];\r\n\r\n function contains(container, target) {\r\n if (!container || !target) {\r\n return false;\r\n }\r\n return container === target || $.contains(container, target);\r\n }\r\n\r\n var Popup = Widget.extend({\r\n init: function(element, options) {\r\n var that = this, parentPopup;\r\n\r\n options = options || {};\r\n\r\n if (options.isRtl) {\r\n options.origin = options.origin || BOTTOM + \" \" + RIGHT;\r\n options.position = options.position || TOP + \" \" + RIGHT;\r\n }\r\n\r\n Widget.fn.init.call(that, element, options);\r\n\r\n element = that.element;\r\n options = that.options;\r\n\r\n that.collisions = options.collision ? options.collision.split(\" \") : [];\r\n that.downEvent = kendo.applyEventMap(MOUSEDOWN, kendo.guid());\r\n\r\n if (that.collisions.length === 1) {\r\n that.collisions.push(that.collisions[0]);\r\n }\r\n\r\n parentPopup = $(that.options.anchor).closest(\".k-popup,.k-group\").filter(\":not([class^=km-])\"); // When popup is in another popup, make it relative.\r\n\r\n options.appendTo = $($(options.appendTo)[0] || parentPopup[0] || document.body);\r\n\r\n that.element.hide()\r\n .addClass(\"k-popup\")\r\n .toggleClass(\"k-rtl\", !!options.isRtl)\r\n .appendTo(options.appendTo)\r\n .attr(\"aria-hidden\", true)\r\n .on(\"mouseenter\" + NS, function() {\r\n that._hovered = true;\r\n })\r\n .on(\"wheel\" + NS, function(e) {\r\n var list = $(e.target).find(\".k-list\");\r\n var scrollArea = list.parent();\r\n if (list.length && list.is(\":visible\") && ((scrollArea.scrollTop() === 0 && e.originalEvent.deltaY < 0) ||\r\n (scrollArea.scrollTop() === scrollArea.prop('scrollHeight') - scrollArea.prop('offsetHeight') && e.originalEvent.deltaY > 0))) {\r\n e.preventDefault();\r\n }\r\n })\r\n .on(\"mouseleave\" + NS, function() {\r\n that._hovered = false;\r\n });\r\n\r\n that.wrapper = $();\r\n\r\n if (options.animation === false) {\r\n options.animation = { open: { effects: {} }, close: { hide: true, effects: {} } };\r\n }\r\n\r\n extend(options.animation.open, {\r\n complete: function() {\r\n that.wrapper.addClass(\"k-animation-container-shown\"); // Forcing refresh causes flickering in mobile.\r\n that.wrapper.css(\"overflow\",\"\");\r\n that._activated = true;\r\n that._trigger(ACTIVATE);\r\n }\r\n });\r\n\r\n extend(options.animation.close, {\r\n complete: function() {\r\n that._animationClose();\r\n }\r\n });\r\n\r\n that._mousedownProxy = function(e) {\r\n that._mousedown(e);\r\n };\r\n\r\n if (support.mobileOS.android) {\r\n that._resizeProxy = function(e) {\r\n setTimeout(function() {\r\n that._resize(e);\r\n }, 600); //Logic from kendo.onResize\r\n };\r\n } else {\r\n that._resizeProxy = function(e) {\r\n that._resize(e);\r\n };\r\n }\r\n\r\n if (options.toggleTarget) {\r\n $(options.toggleTarget).on(options.toggleEvent + NS, that.toggle.bind(that));\r\n }\r\n },\r\n\r\n events: [\r\n OPEN,\r\n ACTIVATE,\r\n CLOSE,\r\n DEACTIVATE\r\n ],\r\n\r\n options: {\r\n name: \"Popup\",\r\n toggleEvent: \"click\",\r\n origin: BOTTOM + \" \" + LEFT,\r\n position: TOP + \" \" + LEFT,\r\n anchor: BODY,\r\n appendTo: null,\r\n collision: \"flip fit\",\r\n viewport: window,\r\n copyAnchorStyles: true,\r\n autosize: false,\r\n autowidth: false,\r\n modal: false,\r\n adjustSize: {\r\n width: 0,\r\n height: 0\r\n },\r\n animation: {\r\n open: {\r\n effects: \"slideIn:down\",\r\n transition: true,\r\n duration: 200\r\n },\r\n close: { // if close animation effects are defined, they will be used instead of open.reverse\r\n duration: 100,\r\n hide: true\r\n }\r\n },\r\n omitOriginOffsets: false\r\n },\r\n\r\n _animationClose: function() {\r\n var that = this;\r\n var location = that.wrapper.data(LOCATION);\r\n\r\n that.wrapper.hide();\r\n\r\n if (location) {\r\n that.wrapper.css(location);\r\n }\r\n\r\n if (that.options.anchor != BODY) {\r\n that._hideActiveClass();\r\n }\r\n\r\n that._closing = false;\r\n that._trigger(DEACTIVATE);\r\n },\r\n\r\n destroy: function() {\r\n var that = this,\r\n options = that.options,\r\n element = that.element.off(NS),\r\n parent;\r\n\r\n Widget.fn.destroy.call(that);\r\n\r\n if (options.toggleTarget) {\r\n $(options.toggleTarget).off(NS);\r\n }\r\n\r\n if (!options.modal) {\r\n DOCUMENT_ELEMENT.off(that.downEvent, that._mousedownProxy);\r\n that._toggleResize(false);\r\n }\r\n\r\n kendo.destroy(that.element.children());\r\n element.removeData();\r\n\r\n if (options.appendTo[0] === document.body) {\r\n parent = element.closest(\".k-animation-container\");\r\n\r\n if (parent[0]) {\r\n parent.remove();\r\n } else {\r\n element.remove();\r\n }\r\n }\r\n },\r\n\r\n open: function(x, y) {\r\n var that = this,\r\n fixed = { isFixed: !isNaN(parseInt(y,10)), x: x, y: y },\r\n shouldCorrectWidth = that._shouldCorrectWidth,\r\n element = that.element,\r\n options = that.options,\r\n animation, wrapper,\r\n anchor = $(options.anchor),\r\n mobile = element[0] && element.hasClass(\"km-widget\"),\r\n listbox = element.find(\"[role='listbox']\"),\r\n parent;\r\n\r\n if (!that.visible()) {\r\n if (options.copyAnchorStyles) {\r\n if (mobile && styles[0] == \"font-size\") {\r\n styles.shift();\r\n }\r\n element.css(kendo.getComputedStyles(anchor[0], styles));\r\n }\r\n\r\n if (that.element.parent().data(\"animating\") || that._trigger(OPEN)) {\r\n return;\r\n }\r\n\r\n that._activated = false;\r\n\r\n if (!options.modal) {\r\n DOCUMENT_ELEMENT.off(that.downEvent, that._mousedownProxy)\r\n .on(that.downEvent, that._mousedownProxy);\r\n\r\n // this binding hangs iOS in editor\r\n // all elements in IE7/8 fire resize event, causing mayhem\r\n that._toggleResize(false);\r\n that._toggleResize(true);\r\n }\r\n\r\n that.wrapper = wrapper = kendo.wrap(element, options.autosize, options._resizeOnWrap, shouldCorrectWidth, options.autowidth)\r\n .css({\r\n overflow: HIDDEN,\r\n display: \"block\",\r\n position: ABSOLUTE\r\n })\r\n .attr(\"aria-hidden\", false);\r\n\r\n parent = element.parent();\r\n\r\n if (listbox.attr(\"aria-label\")) {\r\n wrapper.attr(\"aria-label\", listbox.attr(\"aria-label\"));\r\n } else if (listbox.attr(\"aria-labelledby\")) {\r\n wrapper.attr(\"aria-labelledby\", listbox.attr(\"aria-labelledby\"));\r\n }\r\n\r\n if (support.mobileOS.android) {\r\n parent.css(TRANSFORM, \"translatez(0)\"); // Android is VERY slow otherwise. Should be tested in other droids as well since it may cause blur.\r\n }\r\n\r\n wrapper.css(POSITION);\r\n\r\n if ($(options.appendTo)[0] == document.body) {\r\n wrapper.css(TOP, \"-10000px\");\r\n }\r\n\r\n that.flipped = that._position(fixed);\r\n animation = that._openAnimation();\r\n\r\n if (options.anchor != BODY && !that.element.hasClass(\"k-tooltip\")) {\r\n that._addActiveClass();\r\n }\r\n\r\n parent.hide();\r\n element.show();\r\n that.wrapper.show();\r\n\r\n parent.data(EFFECTS, animation.effects)\r\n .kendoStop(true)\r\n .kendoAnimate(animation);\r\n\r\n\r\n element.attr(\"aria-hidden\", false);\r\n }\r\n },\r\n\r\n _location: function(isFixed) {\r\n var that = this,\r\n element = that.element,\r\n options = that.options,\r\n wrapper,\r\n anchor = $(options.anchor),\r\n mobile = element[0] && element.hasClass(\"km-widget\");\r\n\r\n if (options.copyAnchorStyles) {\r\n if (mobile && styles[0] == \"font-size\") {\r\n styles.shift();\r\n }\r\n element.css(kendo.getComputedStyles(anchor[0], styles));\r\n }\r\n\r\n that.wrapper = wrapper = kendo.wrap(element, options.autosize)\r\n .css({\r\n overflow: HIDDEN,\r\n display: \"block\",\r\n position: ABSOLUTE\r\n });\r\n\r\n if (support.mobileOS.android) {\r\n wrapper.css(TRANSFORM, \"translatez(0)\"); // Android is VERY slow otherwise. Should be tested in other droids as well since it may cause blur.\r\n }\r\n\r\n wrapper.css(POSITION);\r\n\r\n if ($(options.appendTo)[0] == document.body) {\r\n wrapper.css(TOP, \"-10000px\");\r\n }\r\n\r\n that._position(isFixed || {});\r\n\r\n var offset = wrapper.offset();\r\n return {\r\n width: kendo._outerWidth(wrapper),\r\n height: kendo._outerHeight(wrapper),\r\n left: offset.left,\r\n top: offset.top\r\n };\r\n },\r\n\r\n _openAnimation: function() {\r\n var animation = extend(true, {}, this.options.animation.open);\r\n animation.effects = kendo.parseEffects(animation.effects, this.flipped);\r\n\r\n return animation;\r\n },\r\n\r\n _hideActiveClass: function() {\r\n var anchor = $(this.options.anchor);\r\n anchor\r\n .children(ACTIVECHILDREN)\r\n .removeClass(ACTIVE);\r\n\r\n },\r\n\r\n _addActiveClass: function() {\r\n $(this.options.anchor)\r\n .children(ACTIVECHILDREN)\r\n .addClass(ACTIVE);\r\n },\r\n\r\n position: function() {\r\n if (this.visible()) {\r\n this.flipped = this._position();\r\n }\r\n },\r\n\r\n toggle: function() {\r\n var that = this;\r\n\r\n that[that.visible() ? CLOSE : OPEN]();\r\n },\r\n\r\n visible: function() {\r\n return this.wrapper.is(\":\" + VISIBLE) && this.element.is(\":\" + VISIBLE);\r\n },\r\n\r\n close: function(skipEffects) {\r\n var that = this,\r\n parent = that.element.parent(),\r\n options = that.options, wrap,\r\n animation, openEffects, closeEffects;\r\n\r\n if (that.visible()) {\r\n wrap = (that.wrapper[0] ? that.wrapper : kendo.wrap(that.element).hide());\r\n\r\n that._toggleResize(false);\r\n\r\n if (that._closing || that._trigger(CLOSE)) {\r\n that._toggleResize(true);\r\n return;\r\n }\r\n\r\n that.wrapper.removeClass(\"k-animation-container-shown\");\r\n\r\n // Close all inclusive popups.\r\n that.element.find(\".k-popup\").each(function() {\r\n var that = $(this),\r\n popup = that.data(\"kendoPopup\");\r\n\r\n if (popup) {\r\n popup.close(skipEffects);\r\n }\r\n });\r\n\r\n DOCUMENT_ELEMENT.off(that.downEvent, that._mousedownProxy);\r\n\r\n if (skipEffects) {\r\n animation = { hide: true, effects: {} };\r\n } else {\r\n animation = extend(true, {}, options.animation.close);\r\n openEffects = parent.data(EFFECTS);\r\n closeEffects = animation.effects;\r\n\r\n if (!closeEffects && !kendo.size(closeEffects) && openEffects && kendo.size(openEffects)) {\r\n animation.effects = openEffects;\r\n animation.reverse = true;\r\n }\r\n\r\n that._closing = true;\r\n }\r\n\r\n parent.kendoStop(true);\r\n that.element.attr(\"aria-hidden\", true);\r\n wrap\r\n .css({ overflow: HIDDEN }) // stop callback will remove hidden overflow\r\n .attr(\"aria-hidden\", true);\r\n parent.kendoAnimate(animation);\r\n\r\n if (skipEffects) {\r\n that._animationClose();\r\n }\r\n }\r\n },\r\n\r\n _trigger: function(ev) {\r\n return this.trigger(ev, { type: ev });\r\n },\r\n\r\n _resize: function(e) {\r\n var that = this;\r\n\r\n if (support.resize.indexOf(e.type) !== -1) {\r\n clearTimeout(that._resizeTimeout);\r\n that._resizeTimeout = setTimeout(function() {\r\n that._position();\r\n that._resizeTimeout = null;\r\n }, 50);\r\n } else {\r\n if (!that._hovered || (that._activated && that.element.find(\".k-list\").length > 0)) {\r\n that.close();\r\n }\r\n }\r\n },\r\n\r\n _toggleResize: function(toggle) {\r\n var method = toggle ? \"on\" : \"off\";\r\n var eventNames = support.resize;\r\n\r\n if (!(support.mobileOS.ios || support.mobileOS.android || support.browser.safari)) {\r\n eventNames += \" \" + SCROLL;\r\n }\r\n\r\n if (toggle && !this.scrollableParents) {\r\n this.scrollableParents = this._scrollableParents();\r\n }\r\n\r\n if (this.scrollableParents && this.scrollableParents.length) {\r\n this.scrollableParents[method](SCROLL, this._resizeProxy);\r\n }\r\n\r\n WINDOW[method](eventNames, this._resizeProxy);\r\n },\r\n\r\n _mousedown: function(e) {\r\n var that = this,\r\n container = that.element[0],\r\n options = that.options,\r\n anchor = $(options.anchor)[0],\r\n toggleTarget = options.toggleTarget,\r\n target = kendo.eventTarget(e),\r\n popup = $(target).closest(\".k-popup\"),\r\n mobile = popup.parent().parent(\".km-shim\").length;\r\n\r\n popup = popup[0];\r\n if (!mobile && popup && popup !== that.element[0]) {\r\n return;\r\n }\r\n\r\n // This MAY result in popup not closing in certain cases.\r\n if ($(e.target).closest(\"a\").data(\"rel\") === \"popover\") {\r\n return;\r\n }\r\n\r\n if (!contains(container, target) && !contains(anchor, target) && !(toggleTarget && contains($(toggleTarget)[0], target))) {\r\n that.close();\r\n }\r\n },\r\n\r\n _fit: function(position, size, viewPortSize) {\r\n var output = 0;\r\n\r\n if (position + size > viewPortSize) {\r\n output = viewPortSize - (position + size);\r\n }\r\n\r\n if (position < 0) {\r\n output = -position;\r\n }\r\n\r\n return output;\r\n },\r\n\r\n _flip: function(offset, size, anchorSize, viewPortSize, origin, position, boxSize) {\r\n var output = 0;\r\n boxSize = boxSize || size;\r\n\r\n if (position !== origin && position !== CENTER && origin !== CENTER) {\r\n if (offset + boxSize > viewPortSize) {\r\n output += -(anchorSize + size);\r\n }\r\n\r\n if (offset + output < 0) {\r\n output += anchorSize + size;\r\n }\r\n }\r\n return output;\r\n },\r\n\r\n _scrollableParents: function() {\r\n return $(this.options.anchor)\r\n .parentsUntil(\"body\")\r\n .filter(function(index, element) {\r\n return kendo.isScrollable(element);\r\n });\r\n },\r\n\r\n _position: function(fixed) {\r\n var that = this,\r\n //element = that.element.css(POSITION, \"\"), /* fixes telerik/kendo-ui-core#790, comes from telerik/kendo#615 */\r\n element = that.element,\r\n wrapper = that.wrapper,\r\n options = that.options,\r\n viewport = $(options.viewport),\r\n zoomLevel = support.zoomLevel(),\r\n isWindow = !!((viewport[0] == window) && window.innerWidth && (zoomLevel <= 1.02)),\r\n anchor = $(options.anchor),\r\n origins = options.origin.toLowerCase().split(\" \"),\r\n positions = options.position.toLowerCase().split(\" \"),\r\n collisions = that.collisions,\r\n siblingContainer, parents,\r\n parentZIndex, zIndex = 10002,\r\n idx = 0,\r\n docEl = document.documentElement,\r\n length, viewportOffset, viewportWidth, viewportHeight;\r\n\r\n if (options.viewport === window) {\r\n viewportOffset = {\r\n top: (window.pageYOffset || document.documentElement.scrollTop || 0),\r\n left: (window.pageXOffset || document.documentElement.scrollLeft || 0)\r\n };\r\n } else {\r\n viewportOffset = viewport.offset();\r\n }\r\n\r\n if (isWindow) {\r\n viewportWidth = window.innerWidth;\r\n viewportHeight = window.innerHeight;\r\n } else {\r\n viewportWidth = viewport.width();\r\n viewportHeight = viewport.height();\r\n }\r\n\r\n if (isWindow && docEl.scrollHeight - docEl.clientHeight > 0) {\r\n var sign = options.isRtl ? -1 : 1;\r\n\r\n viewportWidth -= sign * kendo.support.scrollbar();\r\n }\r\n\r\n siblingContainer = anchor.parents().filter(wrapper.siblings());\r\n\r\n if (siblingContainer[0]) {\r\n parentZIndex = Math.max(Number(siblingContainer.css(\"zIndex\")), 0);\r\n\r\n // set z-index to be more than that of the container/sibling\r\n // compensate with more units for window z-stack\r\n if (parentZIndex) {\r\n zIndex = parentZIndex + 10;\r\n } else {\r\n parents = anchor.parentsUntil(siblingContainer);\r\n for (length = parents.length; idx < length; idx++) {\r\n parentZIndex = Number($(parents[idx]).css(\"zIndex\"));\r\n if (parentZIndex && zIndex < parentZIndex) {\r\n zIndex = parentZIndex + 10;\r\n }\r\n }\r\n }\r\n }\r\n\r\n wrapper.css(\"zIndex\", zIndex);\r\n\r\n if (fixed && fixed.isFixed) {\r\n wrapper.css({ left: fixed.x, top: fixed.y });\r\n } else {\r\n wrapper.css(that._align(origins, positions));\r\n }\r\n\r\n var pos = getOffset(wrapper, POSITION, anchor[0] === wrapper.offsetParent()[0]),\r\n offset = getOffset(wrapper),\r\n anchorParent = anchor.offsetParent().parent(\".k-animation-container,.k-popup,.k-group\"); // If the parent is positioned, get the current positions\r\n\r\n if (anchorParent.length) {\r\n pos = getOffset(wrapper, POSITION, true);\r\n offset = getOffset(wrapper);\r\n }\r\n\r\n offset.top -= viewportOffset.top;\r\n offset.left -= viewportOffset.left;\r\n\r\n if (!that.wrapper.data(LOCATION)) { // Needed to reset the popup location after every closure - fixes the resize bugs.\r\n wrapper.data(LOCATION, extend({}, pos));\r\n }\r\n\r\n var offsets = extend({}, offset),\r\n location = extend({}, pos),\r\n adjustSize = options.adjustSize;\r\n\r\n if (collisions[0] === \"fit\") {\r\n location.top += that._fit(offsets.top, outerHeight(wrapper) + adjustSize.height, viewportHeight / zoomLevel);\r\n }\r\n\r\n if (collisions[1] === \"fit\") {\r\n location.left += that._fit(offsets.left, outerWidth(wrapper) + adjustSize.width, viewportWidth / zoomLevel);\r\n }\r\n\r\n var flipPos = extend({}, location);\r\n var elementHeight = outerHeight(element);\r\n var wrapperHeight = outerHeight(wrapper);\r\n\r\n if (!wrapper.height() && elementHeight) {\r\n wrapperHeight = wrapperHeight + elementHeight;\r\n }\r\n\r\n if (collisions[0] === \"flip\") {\r\n location.top += that._flip(offsets.top, elementHeight, outerHeight(anchor), viewportHeight / zoomLevel, origins[0], positions[0], wrapperHeight);\r\n }\r\n\r\n if (collisions[1] === \"flip\") {\r\n location.left += that._flip(offsets.left, outerWidth(element), outerWidth(anchor), viewportWidth / zoomLevel, origins[1], positions[1], outerWidth(wrapper));\r\n }\r\n\r\n wrapper.css(location);\r\n\r\n return (location.left != flipPos.left || location.top != flipPos.top);\r\n },\r\n\r\n _align: function(origin, position) {\r\n var that = this,\r\n element = that.wrapper,\r\n anchor = $(that.options.anchor),\r\n verticalOrigin = origin[0],\r\n horizontalOrigin = origin[1],\r\n verticalPosition = position[0],\r\n horizontalPosition = position[1],\r\n anchorOffset = getOffset(anchor),\r\n appendTo = $(that.options.appendTo),\r\n appendToOffset,\r\n width = outerWidth(element) || outerWidth(element.find(\".k-child-animation-container\").children().first()),\r\n height = outerHeight(element) || outerHeight(element.find(\".k-child-animation-container\").children().first()),\r\n anchorWidth = outerWidth(anchor),\r\n anchorHeight = outerHeight(anchor),\r\n top = that.options.omitOriginOffsets ? 0 : anchorOffset.top,\r\n left = that.options.omitOriginOffsets ? 0 : anchorOffset.left,\r\n round = Math.round;\r\n\r\n if (appendTo[0] != document.body) {\r\n appendToOffset = getOffset(appendTo);\r\n top -= appendToOffset.top;\r\n left -= appendToOffset.left;\r\n }\r\n\r\n\r\n if (verticalOrigin === BOTTOM) {\r\n top += anchorHeight;\r\n }\r\n\r\n if (verticalOrigin === CENTER) {\r\n top += round(anchorHeight / 2);\r\n }\r\n\r\n if (verticalPosition === BOTTOM) {\r\n top -= height;\r\n }\r\n\r\n if (verticalPosition === CENTER) {\r\n top -= round(height / 2);\r\n }\r\n\r\n if (horizontalOrigin === RIGHT) {\r\n left += anchorWidth;\r\n }\r\n\r\n if (horizontalOrigin === CENTER) {\r\n left += round(anchorWidth / 2);\r\n }\r\n\r\n if (horizontalPosition === RIGHT) {\r\n left -= width;\r\n }\r\n\r\n if (horizontalPosition === CENTER) {\r\n left -= round(width / 2);\r\n }\r\n\r\n return {\r\n top: top,\r\n left: left\r\n };\r\n }\r\n });\r\n\r\n ui.plugin(Popup);\r\n\r\n var stableSort = kendo.support.stableSort;\r\n var tabKeyTrapNS = \"kendoTabKeyTrap\";\r\n var focusableNodesSelector = \"a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, [tabindex], *[contenteditable]\";\r\n var TabKeyTrap = Class.extend({\r\n init: function(element, options) {\r\n this.element = $(element);\r\n this.element.autoApplyNS(tabKeyTrapNS);\r\n },\r\n\r\n trap: function() {\r\n this.element.on(\"keydown\", this._keepInTrap.bind(this));\r\n },\r\n\r\n removeTrap: function() {\r\n this.element.kendoDestroy(tabKeyTrapNS);\r\n },\r\n\r\n destroy: function() {\r\n this.element.kendoDestroy(tabKeyTrapNS);\r\n this.element = undefined$1;\r\n },\r\n\r\n shouldTrap: function() {\r\n return true;\r\n },\r\n\r\n _keepInTrap: function(e) {\r\n if (e.which !== 9 || !this.shouldTrap() || e.isDefaultPrevented()) {\r\n return;\r\n }\r\n\r\n var elements = this._focusableElements();\r\n var sortedElements = this._sortFocusableElements(elements);\r\n var next = this._nextFocusable(e, sortedElements);\r\n\r\n if (next) {\r\n this._focus(next);\r\n }\r\n\r\n e.preventDefault();\r\n },\r\n _focusableElements: function() {\r\n var elements = this.element.find(focusableNodesSelector).filter(function(i, item) {\r\n return item.tabIndex >= 0 && $(item).is(':visible') && !$(item).is('[disabled]');\r\n });\r\n\r\n if (this.element.is(\"[tabindex]\")) {\r\n [].push.call(elements, this.element[0]);\r\n }\r\n\r\n return elements;\r\n },\r\n _sortFocusableElements: function(elements) {\r\n var sortedElements;\r\n\r\n if (stableSort) {\r\n sortedElements = [].sort.call(elements, function(prev, next) {\r\n return prev.tabIndex - next.tabIndex;\r\n });\r\n } else {\r\n var attrName = \"__k_index\";\r\n elements.each(function(i, item) {\r\n item.setAttribute(attrName, i);\r\n });\r\n\r\n sortedElements = [].sort.call(elements, function(prev, next) {\r\n return prev.tabIndex === next.tabIndex ?\r\n parseInt(prev.getAttribute(attrName), 10) - parseInt(next.getAttribute(attrName), 10) :\r\n prev.tabIndex - next.tabIndex;\r\n });\r\n\r\n elements.removeAttr(attrName);\r\n }\r\n\r\n return sortedElements;\r\n },\r\n _nextFocusable: function(e, elements) {\r\n var count = elements.length;\r\n var current = elements.index(e.target);\r\n\r\n return elements.get((current + (e.shiftKey ? -1 : 1)) % count);\r\n },\r\n _focus: function(element) {\r\n if (element.nodeName == \"IFRAME\") {\r\n element.contentWindow.document.body.focus();\r\n return;\r\n }\r\n\r\n element.focus();\r\n\r\n if (element.nodeName == \"INPUT\" && element.setSelectionRange && this._haveSelectionRange(element)) {\r\n element.setSelectionRange(0, element.value.length);\r\n }\r\n },\r\n _haveSelectionRange: function(element) {\r\n var elementType = element.type.toLowerCase();\r\n\r\n return elementType === \"text\" || elementType === \"search\" ||\r\n elementType === \"url\" || elementType === \"tel\" ||\r\n elementType === \"password\";\r\n }\r\n });\r\n ui.Popup.TabKeyTrap = TabKeyTrap;\r\n })(window.kendo.jQuery);\r\n var kendo$2s = kendo;\r\n\r\n var __meta__$2s = {\r\n id: \"html.base\",\r\n name: \"Html.Base\",\r\n category: \"web\",\r\n description: \"\",\r\n depends: [\"core\"],\r\n features: []\r\n };\r\n\r\n (function($, undefined$1) {\r\n var kendo = window.kendo,\r\n Class = kendo.Class;\r\n\r\n kendo.html = kendo.html || {};\r\n\r\n var HTMLBase = Class.extend({\r\n init: function(element, options) {\r\n var that = this;\r\n that.element = $(element);\r\n options = options || {};\r\n delete options.name;\r\n that._initOptions(options);\r\n },\r\n options: {\r\n stylingOptions: []\r\n },\r\n _addClasses: function() {\r\n var that = this,\r\n options = that.options,\r\n stylingOptions = options.stylingOptions,\r\n previouslyAddedClasses = that.wrapper.data(\"added-classes\");\r\n\r\n stylingOptions = stylingOptions.map(function(option) {\r\n var validFill;\r\n\r\n if (option === \"themeColor\") {\r\n validFill = kendo.cssProperties.getValidClass({\r\n widget: options.name,\r\n propName: \"fillMode\",\r\n value: options.fillMode\r\n });\r\n\r\n if (!validFill || validFill.length === 0) {\r\n return \"\";\r\n }\r\n }\r\n\r\n return kendo.cssProperties.getValidClass({\r\n widget: options.name,\r\n propName: option,\r\n value: options[option],\r\n fill: options.fillMode\r\n });\r\n });\r\n\r\n if (previouslyAddedClasses) {\r\n that.wrapper.removeClass(previouslyAddedClasses.join(\" \"));\r\n }\r\n\r\n that.wrapper.data(\"added-classes\", stylingOptions);\r\n that.wrapper.addClass(stylingOptions.join(\" \"));\r\n },\r\n html: function() {\r\n var that = this;\r\n\r\n return that.wrapper[0].outerHTML;\r\n }\r\n });\r\n\r\n $.extend(kendo.html, {\r\n HTMLBase: HTMLBase\r\n });\r\n\r\n })(window.kendo.jQuery);\r\n var kendo$2r = kendo;\r\n\r\n var __meta__$2r = {\r\n id: \"html.icon\",\r\n name: \"Html.Icon\",\r\n category: \"web\",\r\n description: \"HTML font icon rendering utility for Kendo UI for jQuery.\",\r\n depends: [\"html.base\"]\r\n };\r\n\r\n (function($, undefined$1) {\r\n var kendo = window.kendo,\r\n extend = $.extend,\r\n HTMLBase = kendo.html.HTMLBase;\r\n\r\n var KFONTICON = 'k-icon k-font-icon';\r\n var KI_PREFFIX = 'k-i-';\r\n var KSVGICON = 'k-icon k-svg-icon';\r\n var KSVG_PREFFIX = 'k-svg-i-';\r\n\r\n var FLIP_PREFIX = 'k-flip-';\r\n var FLIP_HORIZONTAL = `${FLIP_PREFIX}h`;\r\n var FLIP_VERTICAL = `${FLIP_PREFIX}v`;\r\n\r\n var THEME_COLOR_PREFIX = 'k-color-';\r\n\r\n var ICON_TYPES = {\r\n 'svg': (element, options) => new HTMLSvgIcon(element, options),\r\n 'font': (element, options) => new HTMLFontIcon(element, options)\r\n };\r\n\r\n var FLIP_CLASSES = {\r\n default: '',\r\n horizontal: FLIP_HORIZONTAL,\r\n vertical: FLIP_VERTICAL,\r\n both: `${FLIP_HORIZONTAL} ${FLIP_VERTICAL}`\r\n };\r\n\r\n var renderIcon = function(element, options) {\r\n if (!element || $.isPlainObject(element) || kendo.isString(element)) {\r\n options = element;\r\n element = $(\"\");\r\n }\r\n\r\n if (kendo.isString(options)) {\r\n options = {\r\n icon: options\r\n };\r\n }\r\n\r\n if (!kendo.isPresent(options.type)) {\r\n options.type = kendo.defaults.iconType ? kendo.defaults.iconType : 'svg';\r\n }\r\n\r\n if (kendo.isFunction(options.type)) {\r\n return options.type(element, options);\r\n }\r\n\r\n if (!kendo.isFunction(ICON_TYPES[options.type])) {\r\n return null;\r\n }\r\n\r\n return (ICON_TYPES[options.type](element, options)).html();\r\n };\r\n\r\n var HTMLBaseIcon = HTMLBase.extend({\r\n init: function(element, options) {\r\n var that = this;\r\n HTMLBase.fn.init.call(that, element, options);\r\n that._wrapper();\r\n },\r\n options: {\r\n name: 'HTMLIcon',\r\n size: 'none',\r\n themeColor: 'none',\r\n flip: 'default',\r\n iconClass: '',\r\n stylingOptions: [ 'size', 'themeColor', 'fill' ]\r\n },\r\n _wrapper: function() {\r\n var that = this;\r\n\r\n that._addClasses();\r\n },\r\n _addClasses: function() {\r\n var that = this,\r\n options = that.options,\r\n stylingOptions = options.stylingOptions,\r\n previouslyAddedClasses = that.wrapper.data(\"added-classes\");\r\n\r\n stylingOptions = stylingOptions.map(function(option) {\r\n if (option === 'themeColor') {\r\n return kendo.cssProperties.getValidClass({\r\n widget: options.name,\r\n propName: option,\r\n value: options[option],\r\n prefix: THEME_COLOR_PREFIX\r\n });\r\n }\r\n\r\n if (option === 'fill') {\r\n return FLIP_CLASSES[options.flip];\r\n }\r\n\r\n return kendo.cssProperties.getValidClass({\r\n widget: options.name,\r\n propName: option,\r\n value: options[option],\r\n fill: options.fillMode\r\n });\r\n });\r\n\r\n if (previouslyAddedClasses) {\r\n that.wrapper.removeClass(previouslyAddedClasses.filter(x => x !== that._className).join(\" \"));\r\n }\r\n\r\n that.wrapper.data(\"added-classes\", stylingOptions.concat([that._className]));\r\n that.wrapper.addClass(stylingOptions.join(\" \"));\r\n }\r\n });\r\n\r\n var HTMLFontIcon = HTMLBaseIcon.extend({\r\n init: function(element, options) {\r\n HTMLBaseIcon.fn.init.call(this, element, options);\r\n },\r\n options: extend({}, HTMLBaseIcon.fn.options, {\r\n name: 'HTMLFontIcon',\r\n icon: null\r\n }),\r\n _wrapper: function() {\r\n var that = this,\r\n // Find if there is an existing k-i- class appended to the element.\r\n currentIconClass = that.element[0].className.split(\" \").find(x => x.includes(KI_PREFFIX)),\r\n className = that.options.icon ? `${that.options.icon.startsWith(KI_PREFFIX) ? \"\" : KI_PREFFIX}${that.options.icon}` : \"\";\r\n\r\n that._className = className;\r\n that.wrapper = that.element\r\n .addClass(KFONTICON)\r\n .removeClass(currentIconClass) // Remove any existing icons.\r\n .addClass(className)\r\n .addClass(that.options.iconClass || '');\r\n\r\n HTMLBaseIcon.fn._wrapper.call(this);\r\n }\r\n });\r\n\r\n var HTMLSvgIcon = HTMLBaseIcon.extend({\r\n init: function(element, options) {\r\n // Ensure that the inner contents of the wrapping span element are always removed for re-rendering purposes.\r\n element.empty();\r\n HTMLBaseIcon.fn.init.call(this, element, options);\r\n },\r\n options: extend({}, HTMLBaseIcon.fn.options, {\r\n name: 'HTMLSVGIcon',\r\n icon: null\r\n }),\r\n _wrapper: function() {\r\n var that = this,\r\n icon = that.options.icon,\r\n iconClass = that.options.iconClass,\r\n // Find if there is an existing k-svg-i- class appended to the element.\r\n currentIconClass = that.element[0].className.split(\" \").find(x => x.includes(KSVG_PREFFIX)),\r\n svgElm = $(''),\r\n className;\r\n\r\n if (!icon && iconClass) {\r\n // match k-i-(some-icon-name)\r\n const regex = /k-i-(\\w+(?:-\\w+)*)/;\r\n let iconNameMatch = iconClass.match(regex);\r\n if (iconNameMatch) {\r\n icon = iconNameMatch[1];\r\n iconClass = iconClass.replace(iconNameMatch[0], \"\");\r\n }\r\n }\r\n\r\n if (kendo.isString(icon)) {\r\n // remove k-i- and convert kebab-case-icon to camelCaseIcon\r\n icon = icon.replace('k-i-', '').replace(/-./g, x=>x[1].toUpperCase());\r\n icon = kendo.ui.svgIcons[icon] || kendo.ui.svgIcons[`${icon}Icon`];\r\n }\r\n\r\n className = icon && icon.name ? `${KSVG_PREFFIX}${icon.name}` : '';\r\n that._className = className;\r\n\r\n that.wrapper = that.element\r\n .addClass(KSVGICON)\r\n .removeClass(currentIconClass) // Remove any existing icons.\r\n .addClass(className)\r\n .addClass(iconClass || '')\r\n .attr(\"aria-hidden\", true);\r\n\r\n if ($.isPlainObject(icon)) {\r\n svgElm.attr('viewBox', icon.viewBox || '')\r\n .attr({\r\n 'viewBox': icon.viewBox || '',\r\n 'focusable': 'false',\r\n 'xmlns': 'http://www.w3.org/2000/svg'\r\n })\r\n .html(icon.content || '');\r\n\r\n that.wrapper.append(svgElm[0].outerHTML);\r\n }\r\n\r\n HTMLBaseIcon.fn._wrapper.call(this);\r\n }\r\n });\r\n\r\n $.extend(kendo.html, {\r\n renderIcon: renderIcon,\r\n HTMLFontIcon: HTMLFontIcon,\r\n HTMLSvgIcon: HTMLSvgIcon,\r\n getIconRenderer: (type) => ICON_TYPES[type]\r\n });\r\n\r\n kendo.cssProperties.registerPrefix(\"HTMLFontIcon\", \"k-icon-\");\r\n\r\n kendo.cssProperties.registerValues(\"HTMLFontIcon\", [{\r\n prop: \"size\",\r\n values: kendo.cssProperties.sizeValues.concat([['xsmall', 'xs'], ['xlarge', 'xl'], ['xxlarge', 'xxl'], ['xxxlarge', 'xxxl']])\r\n }, {\r\n prop: \"themeColor\",\r\n values: ['primary', 'secondary', 'tertiary', 'inherit', 'info', 'success', 'warning', 'error', 'dark', 'light', 'inverse']\r\n }]);\r\n\r\n kendo.cssProperties.registerPrefix(\"HTMLSVGIcon\", \"k-icon-\");\r\n\r\n kendo.cssProperties.registerValues(\"HTMLSVGIcon\", [{\r\n prop: \"size\",\r\n values: kendo.cssProperties.sizeValues.concat([['xsmall', 'xs'], ['xlarge', 'xl'], ['xxlarge', 'xxl'], ['xxxlarge', 'xxxl']])\r\n }, {\r\n prop: \"themeColor\",\r\n values: ['primary', 'secondary', 'tertiary', 'inherit', 'info', 'success', 'warning', 'error', 'dark', 'light', 'inverse']\r\n }]);\r\n })(window.kendo.jQuery);\r\n var kendo$2q = kendo;\r\n\r\n const caretTrIcon = {\r\n name: 'caret-tr',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const caretBrIcon = {\r\n name: 'caret-br',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const caretBlIcon = {\r\n name: 'caret-bl',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const caretTlIcon = {\r\n name: 'caret-tl',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const caretAltUpIcon = {\r\n name: 'caret-alt-up',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const caretAltRightIcon = {\r\n name: 'caret-alt-right',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const caretAltDownIcon = {\r\n name: 'caret-alt-down',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const caretAltLeftIcon = {\r\n name: 'caret-alt-left',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const caretAltToTopIcon = {\r\n name: 'caret-alt-to-top',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const caretAltToRightIcon = {\r\n name: 'caret-alt-to-right',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const caretAltToBottomIcon = {\r\n name: 'caret-alt-to-bottom',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const caretAltToLeftIcon = {\r\n name: 'caret-alt-to-left',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const caretDoubleAltUpIcon = {\r\n name: 'caret-double-alt-up',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const caretDoubleAltRightIcon = {\r\n name: 'caret-double-alt-right',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const caretDoubleAltDownIcon = {\r\n name: 'caret-double-alt-down',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const caretDoubleAltLeftIcon = {\r\n name: 'caret-double-alt-left',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const caretAltExpandIcon = {\r\n name: 'caret-alt-expand',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const arrowsNoChangeIcon = {\r\n name: 'arrows-no-change',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const arrowOverflowDownIcon = {\r\n name: 'arrow-overflow-down',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const chevronUpIcon = {\r\n name: 'chevron-up',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const chevronRightIcon = {\r\n name: 'chevron-right',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const chevronDownIcon = {\r\n name: 'chevron-down',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const chevronLeftIcon = {\r\n name: 'chevron-left',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const arrowUpIcon = {\r\n name: 'arrow-up',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const arrowRightIcon = {\r\n name: 'arrow-right',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const arrowDownIcon = {\r\n name: 'arrow-down',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const arrowLeftIcon = {\r\n name: 'arrow-left',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const levelDownIcon = {\r\n name: 'level-down',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const levelUpIcon = {\r\n name: 'level-up',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const levelToTopIcon = {\r\n name: 'level-to-top',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const colResizeIcon = {\r\n name: 'col-resize',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const arrowsAxesIcon = {\r\n name: 'arrows-axes',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const arrowsSwapIcon = {\r\n name: 'arrows-swap',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const dragAndDropIcon = {\r\n name: 'drag-and-drop',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const categorizeIcon = {\r\n name: 'categorize',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const gridIcon = {\r\n name: 'grid',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const gridLayoutIcon = {\r\n name: 'grid-layout',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const groupIcon = {\r\n name: 'group',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const ungroupIcon = {\r\n name: 'ungroup',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const handleDragIcon = {\r\n name: 'handle-drag',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const layoutIcon = {\r\n name: 'layout',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const layout1By4Icon = {\r\n name: 'layout-1-by-4',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const layout2By2Icon = {\r\n name: 'layout-2-by-2',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const layoutSideBySideIcon = {\r\n name: 'layout-side-by-side',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const layoutStackedIcon = {\r\n name: 'layout-stacked',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const columnsIcon = {\r\n name: 'columns',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const rowsIcon = {\r\n name: 'rows',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const reorderIcon = {\r\n name: 'reorder',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const menuIcon = {\r\n name: 'menu',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const moreVerticalIcon = {\r\n name: 'more-vertical',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const moreHorizontalIcon = {\r\n name: 'more-horizontal',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const overlapIcon = {\r\n name: 'overlap',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const homeIcon = {\r\n name: 'home',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const arrowsLeftRightIcon = {\r\n name: 'arrows-left-right',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const arrowsTopBottomIcon = {\r\n name: 'arrows-top-bottom',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const borderRadiusBottomLeftIcon = {\r\n name: 'border-radius-bottom-left',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const borderRadiusBottomRightIcon = {\r\n name: 'border-radius-bottom-right',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const borderRadiusTopLeftIcon = {\r\n name: 'border-radius-top-left',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const borderRadiusTopRightIcon = {\r\n name: 'border-radius-top-right',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const borderRadiusIcon = {\r\n name: 'border-radius',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const borderStyleBottomIcon = {\r\n name: 'border-style-bottom',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const borderStyleLeftIcon = {\r\n name: 'border-style-left',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const borderStyleRightIcon = {\r\n name: 'border-style-right',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const borderStyleTopIcon = {\r\n name: 'border-style-top',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const borderStyleIcon = {\r\n name: 'border-style',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const boxSizingIcon = {\r\n name: 'box-sizing',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const chevronDoubleDownIcon = {\r\n name: 'chevron-double-down',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const chevronDoubleLeftIcon = {\r\n name: 'chevron-double-left',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const chevronDoubleRightIcon = {\r\n name: 'chevron-double-right',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const chevronDoubleUpIcon = {\r\n name: 'chevron-double-up',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const dataOdsIcon = {\r\n name: 'data-ods',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const nonRecurrenceIcon = {\r\n name: 'non-recurrence',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const displayBlockIcon = {\r\n name: 'display-block',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const displayFlexIcon = {\r\n name: 'display-flex',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const displayInlineFlexIcon = {\r\n name: 'display-inline-flex',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const dropletSliderIcon = {\r\n name: 'droplet-slider',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const fileReportIcon = {\r\n name: 'file-report',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const gapColumnIcon = {\r\n name: 'gap-column',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const gapRowIcon = {\r\n name: 'gap-row',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const handleResizeAltIcon = {\r\n name: 'handle-resize-alt',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const handleResizeIcon = {\r\n name: 'handle-resize',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const imagesIcon = {\r\n name: 'images',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const letterSpaceIcon = {\r\n name: 'letter-space',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const lineHeightIcon = {\r\n name: 'line-height',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const listLatinBigIcon = {\r\n name: 'list-latin-big',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const listLatinSmallIcon = {\r\n name: 'list-latin-small',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const listRomanBigIcon = {\r\n name: 'list-roman-big',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const listRomanSmallIcon = {\r\n name: 'list-roman-small',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const listUnorderedOutlineIcon = {\r\n name: 'list-unordered-outline',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const listUnorderedSquareIcon = {\r\n name: 'list-unordered-square',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const maxHeightIcon = {\r\n name: 'max-height',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const maxWidthIcon = {\r\n name: 'max-width',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const minHeightIcon = {\r\n name: 'min-height',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const minWidthIcon = {\r\n name: 'min-width',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const outlineOffsetIcon = {\r\n name: 'outline-offset',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const outlineWidthIcon = {\r\n name: 'outline-width',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const paddingBottomIcon = {\r\n name: 'padding-bottom',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const paddingLeftIcon = {\r\n name: 'padding-left',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const paddingRightIcon = {\r\n name: 'padding-right',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const paddingTopIcon = {\r\n name: 'padding-top',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const paddingIcon = {\r\n name: 'padding',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const positionBottomIcon = {\r\n name: 'position-bottom',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const positionLeftIcon = {\r\n name: 'position-left',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const positionRightIcon = {\r\n name: 'position-right',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const positionTopIcon = {\r\n name: 'position-top',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const regularExpressionIcon = {\r\n name: 'regular-expression',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const replaceAllIcon = {\r\n name: 'replace-all',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const replaceSingleIcon = {\r\n name: 'replace-single',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const reportElementIcon = {\r\n name: 'report-element',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const rightDoubleQuotesIcon = {\r\n name: 'right-double-quotes',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const wholeWordIcon = {\r\n name: 'whole-word',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const dataSdsIcon = {\r\n name: 'data-sds',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const downloadLightIcon = {\r\n name: 'download-light',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const eyeSlashIcon = {\r\n name: 'eye-slash',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const displayInlineBlockIcon = {\r\n name: 'display-inline-block',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const paperPlaneIcon = {\r\n name: 'paper-plane',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const gaugeLinearIcon = {\r\n name: 'gauge-linear',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const gaugeRadialIcon = {\r\n name: 'gauge-radial',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const envelopeBoxIcon = {\r\n name: 'envelope-box',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const envelopeLinkIcon = {\r\n name: 'envelope-link',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const envelopeIcon = {\r\n name: 'envelope',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const warningCircleIcon = {\r\n name: 'warning-circle',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const warningTriangleIcon = {\r\n name: 'warning-triangle',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const infoSolidIcon = {\r\n name: 'info-solid',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const fontGrowIcon = {\r\n name: 'font-grow',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const fontShrinkIcon = {\r\n name: 'font-shrink',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const textOverflowIcon = {\r\n name: 'text-overflow',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const textWrapArrowIcon = {\r\n name: 'text-wrap-arrow',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const textTruncateIcon = {\r\n name: 'text-truncate',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const textClipIcon = {\r\n name: 'text-clip',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const borderColorIcon = {\r\n name: 'border-color',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const borderTypeIcon = {\r\n name: 'border-type',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const thumbDownOutlineIcon = {\r\n name: 'thumb-down-outline',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const thumbDownIcon = {\r\n name: 'thumb-down',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const thumbUpOutlineIcon = {\r\n name: 'thumb-up-outline',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const thumbUpIcon = {\r\n name: 'thumb-up',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const sparklesIcon = {\r\n name: 'sparkles',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const paragraphMarkIcon = {\r\n name: 'paragraph-mark',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const paragraphHeightIcon = {\r\n name: 'paragraph-height',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const userOutlineIcon = {\r\n name: 'user-outline',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const undoIcon = {\r\n name: 'undo',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const redoIcon = {\r\n name: 'redo',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const arrowRotateCcwIcon = {\r\n name: 'arrow-rotate-ccw',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const arrowRotateCwIcon = {\r\n name: 'arrow-rotate-cw',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const arrowsNoRepeatIcon = {\r\n name: 'arrows-no-repeat',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const arrowRotateCcwSmallIcon = {\r\n name: 'arrow-rotate-ccw-small',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const arrowRotateCwSmallIcon = {\r\n name: 'arrow-rotate-cw-small',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const clockIcon = {\r\n name: 'clock',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const calendarIcon = {\r\n name: 'calendar',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const saveIcon = {\r\n name: 'save',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const printIcon = {\r\n name: 'print',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const pencilIcon = {\r\n name: 'pencil',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const trashIcon = {\r\n name: 'trash',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const paperclipIcon = {\r\n name: 'paperclip',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const paperclipAltIcon = {\r\n name: 'paperclip-alt',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const linkIcon = {\r\n name: 'link',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const unlinkIcon = {\r\n name: 'unlink',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const linkVerticalIcon = {\r\n name: 'link-vertical',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const unlinkVerticalIcon = {\r\n name: 'unlink-vertical',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const lockIcon = {\r\n name: 'lock',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const unlockIcon = {\r\n name: 'unlock',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const cancelIcon = {\r\n name: 'cancel',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const cancelOutlineIcon = {\r\n name: 'cancel-outline',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const cancelCircleIcon = {\r\n name: 'cancel-circle',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const checkIcon = {\r\n name: 'check',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const checkOutlineIcon = {\r\n name: 'check-outline',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const checkCircleIcon = {\r\n name: 'check-circle',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const xIcon = {\r\n name: 'x',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const xOutlineIcon = {\r\n name: 'x-outline',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const xCircleIcon = {\r\n name: 'x-circle',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const plusIcon = {\r\n name: 'plus',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const plusOutlineIcon = {\r\n name: 'plus-outline',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const plusCircleIcon = {\r\n name: 'plus-circle',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const minusIcon = {\r\n name: 'minus',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const minusOutlineIcon = {\r\n name: 'minus-outline',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const minusCircleIcon = {\r\n name: 'minus-circle',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const sortAscIcon = {\r\n name: 'sort-asc',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const sortDescIcon = {\r\n name: 'sort-desc',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const sortClearIcon = {\r\n name: 'sort-clear',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const sortAscSmallIcon = {\r\n name: 'sort-asc-small',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const sortDescSmallIcon = {\r\n name: 'sort-desc-small',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const filterIcon = {\r\n name: 'filter',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const filterClearIcon = {\r\n name: 'filter-clear',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const filterSmallIcon = {\r\n name: 'filter-small',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const filterSortAscSmallIcon = {\r\n name: 'filter-sort-asc-small',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const filterSortDescSmallIcon = {\r\n name: 'filter-sort-desc-small',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const filterAddExpressionIcon = {\r\n name: 'filter-add-expression',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const filterAddGroupIcon = {\r\n name: 'filter-add-group',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const loginIcon = {\r\n name: 'login',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const logoutIcon = {\r\n name: 'logout',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const downloadIcon = {\r\n name: 'download',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const uploadIcon = {\r\n name: 'upload',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const hyperlinkOpenIcon = {\r\n name: 'hyperlink-open',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const hyperlinkOpenSmIcon = {\r\n name: 'hyperlink-open-sm',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const launchIcon = {\r\n name: 'launch',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const windowIcon = {\r\n name: 'window',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const windowRestoreIcon = {\r\n name: 'window-restore',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const windowMinimizeIcon = {\r\n name: 'window-minimize',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const gearIcon = {\r\n name: 'gear',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const gearsIcon = {\r\n name: 'gears',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const wrenchIcon = {\r\n name: 'wrench',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const eyeIcon = {\r\n name: 'eye',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const searchIcon = {\r\n name: 'search',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const zoomInIcon = {\r\n name: 'zoom-in',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const zoomOutIcon = {\r\n name: 'zoom-out',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const arrowsMoveIcon = {\r\n name: 'arrows-move',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const calculatorIcon = {\r\n name: 'calculator',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const cartIcon = {\r\n name: 'cart',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const connectorIcon = {\r\n name: 'connector',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const plusSmIcon = {\r\n name: 'plus-sm',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const minusSmIcon = {\r\n name: 'minus-sm',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const kpiStatusDenyIcon = {\r\n name: 'kpi-status-deny',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const kpiStatusHoldIcon = {\r\n name: 'kpi-status-hold',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const kpiStatusOpenIcon = {\r\n name: 'kpi-status-open',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const equalIcon = {\r\n name: 'equal',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const notEqualIcon = {\r\n name: 'not-equal',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const lessOrEqualIcon = {\r\n name: 'less-or-equal',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const greaterOrEqualIcon = {\r\n name: 'greater-or-equal',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const divideIcon = {\r\n name: 'divide',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const accessibilityIcon = {\r\n name: 'accessibility',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const barcodeOutlineIcon = {\r\n name: 'barcode-outline',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const barcodeIcon = {\r\n name: 'barcode',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const barcodeScannerIcon = {\r\n name: 'barcode-scanner',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const qrCodeOutlineIcon = {\r\n name: 'qr-code-outline',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const qrCodeIcon = {\r\n name: 'qr-code',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const qrCodeScannerIcon = {\r\n name: 'qr-code-scanner',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const barcodeQrCodeScannerIcon = {\r\n name: 'barcode-qr-code-scanner',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const signatureIcon = {\r\n name: 'signature',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const handIcon = {\r\n name: 'hand',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const pointerIcon = {\r\n name: 'pointer',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const stickIcon = {\r\n name: 'stick',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const unstickIcon = {\r\n name: 'unstick',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const setColumnPositionIcon = {\r\n name: 'set-column-position',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const clockArrowRotateIcon = {\r\n name: 'clock-arrow-rotate',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const playIcon = {\r\n name: 'play',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const pauseIcon = {\r\n name: 'pause',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const stopIcon = {\r\n name: 'stop',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const rewindIcon = {\r\n name: 'rewind',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const forwardIcon = {\r\n name: 'forward',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const volumeDownIcon = {\r\n name: 'volume-down',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const volumeUpIcon = {\r\n name: 'volume-up',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const volumeMuteIcon = {\r\n name: 'volume-mute',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const hdIcon = {\r\n name: 'hd',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const closedCaptionsIcon = {\r\n name: 'closed-captions',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const playlistIcon = {\r\n name: 'playlist',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const musicNotesIcon = {\r\n name: 'music-notes',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const playSmIcon = {\r\n name: 'play-sm',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const pauseSmIcon = {\r\n name: 'pause-sm',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const stopSmIcon = {\r\n name: 'stop-sm',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const heartOutlineIcon = {\r\n name: 'heart-outline',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const heartIcon = {\r\n name: 'heart',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const starOutlineIcon = {\r\n name: 'star-outline',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const starIcon = {\r\n name: 'star',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const checkboxIcon = {\r\n name: 'checkbox',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const checkboxCheckedIcon = {\r\n name: 'checkbox-checked',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const checkboxIndeterminateIcon = {\r\n name: 'checkbox-indeterminate',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const checkboxNullIcon = {\r\n name: 'checkbox-null',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const circleIcon = {\r\n name: 'circle',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const radiobuttonIcon = {\r\n name: 'radiobutton',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const radiobuttonCheckedIcon = {\r\n name: 'radiobutton-checked',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const bellIcon = {\r\n name: 'bell',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const infoCircleIcon = {\r\n name: 'info-circle',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const questionCircleIcon = {\r\n name: 'question-circle',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const exclamationCircleIcon = {\r\n name: 'exclamation-circle',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const cameraIcon = {\r\n name: 'camera',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const imageIcon = {\r\n name: 'image',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const imageExportIcon = {\r\n name: 'image-export',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const zoomActualSizeIcon = {\r\n name: 'zoom-actual-size',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const zoomBestFitIcon = {\r\n name: 'zoom-best-fit',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const imageResizeIcon = {\r\n name: 'image-resize',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const cropIcon = {\r\n name: 'crop',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const mirrorIcon = {\r\n name: 'mirror',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const flipHorizontalIcon = {\r\n name: 'flip-horizontal',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const flipVerticalIcon = {\r\n name: 'flip-vertical',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const rotateIcon = {\r\n name: 'rotate',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const rotateRightIcon = {\r\n name: 'rotate-right',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const rotateLeftIcon = {\r\n name: 'rotate-left',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const brushIcon = {\r\n name: 'brush',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const paletteIcon = {\r\n name: 'palette',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const dropletIcon = {\r\n name: 'droplet',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const shapeLineIcon = {\r\n name: 'shape-line',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const brightnessContrastIcon = {\r\n name: 'brightness-contrast',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const slidersIcon = {\r\n name: 'sliders',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const invertColorsIcon = {\r\n name: 'invert-colors',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const transparencyIcon = {\r\n name: 'transparency',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const grayscaleIcon = {\r\n name: 'grayscale',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const blurIcon = {\r\n name: 'blur',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const sharpenIcon = {\r\n name: 'sharpen',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const shapesIcon = {\r\n name: 'shapes',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const roundCornersIcon = {\r\n name: 'round-corners',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const bringToFrontIcon = {\r\n name: 'bring-to-front',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const bringToBackIcon = {\r\n name: 'bring-to-back',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const bringForwardIcon = {\r\n name: 'bring-forward',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const bringBackwardIcon = {\r\n name: 'bring-backward',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const alignSelfStartIcon = {\r\n name: 'align-self-start',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const alignSelfCenterIcon = {\r\n name: 'align-self-center',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const alignSelfEndIcon = {\r\n name: 'align-self-end',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const alignSelfStartAltIcon = {\r\n name: 'align-self-start-alt',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const alignSelfCenterAltIcon = {\r\n name: 'align-self-center-alt',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const alignSelfEndAltIcon = {\r\n name: 'align-self-end-alt',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const thumbnailsUpIcon = {\r\n name: 'thumbnails-up',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const thumbnailsRightIcon = {\r\n name: 'thumbnails-right',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const thumbnailsDownIcon = {\r\n name: 'thumbnails-down',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const thumbnailsLeftIcon = {\r\n name: 'thumbnails-left',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const fullscreenIcon = {\r\n name: 'fullscreen',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const fullscreenExitIcon = {\r\n name: 'fullscreen-exit',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const dropletSlashIcon = {\r\n name: 'droplet-slash',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const photosIcon = {\r\n name: 'photos',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const alignToGridIcon = {\r\n name: 'align-to-grid',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const sizeToGridIcon = {\r\n name: 'size-to-grid',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const makeSameSizeIcon = {\r\n name: 'make-same-size',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const makeSameWidthIcon = {\r\n name: 'make-same-width',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const makeSameHeightIcon = {\r\n name: 'make-same-height',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const makeHorizontalSpacingEqualIcon = {\r\n name: 'make-horizontal-spacing-equal',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const increaseHorizontalSpacingIcon = {\r\n name: 'increase-horizontal-spacing',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const decreaseHorizontalSpacingIcon = {\r\n name: 'decrease-horizontal-spacing',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const removeHorizontalSpacingIcon = {\r\n name: 'remove-horizontal-spacing',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const makeVerticalSpacingEqualIcon = {\r\n name: 'make-vertical-spacing-equal',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const increaseVerticalSpacingIcon = {\r\n name: 'increase-vertical-spacing',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const decreaseVerticalSpacingIcon = {\r\n name: 'decrease-vertical-spacing',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const removeVerticalSpacingIcon = {\r\n name: 'remove-vertical-spacing',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const eyedropperIcon = {\r\n name: 'eyedropper',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const snapGridIcon = {\r\n name: 'snap-grid',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const snapToGridlinesIcon = {\r\n name: 'snap-to-gridlines',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const snapToSnaplinesIcon = {\r\n name: 'snap-to-snaplines',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const dimensionsIcon = {\r\n name: 'dimensions',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const alignSelfStretchIcon = {\r\n name: 'align-self-stretch',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const alignSelfStretchAltIcon = {\r\n name: 'align-self-stretch-alt',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const alignItemsStartIcon = {\r\n name: 'align-items-start',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const alignItemsCenterIcon = {\r\n name: 'align-items-center',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const alignItemsEndIcon = {\r\n name: 'align-items-end',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const alignItemsStretchIcon = {\r\n name: 'align-items-stretch',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const alignItemsBaselineIcon = {\r\n name: 'align-items-baseline',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const alignItemsStartAltIcon = {\r\n name: 'align-items-start-alt',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const alignItemsCenterAltIcon = {\r\n name: 'align-items-center-alt',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const alignItemsEndAltIcon = {\r\n name: 'align-items-end-alt',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const alignItemsStretchAltIcon = {\r\n name: 'align-items-stretch-alt',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const alignItemsBaselineAltIcon = {\r\n name: 'align-items-baseline-alt',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const justifyContentStartIcon = {\r\n name: 'justify-content-start',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const justifyContentCenterIcon = {\r\n name: 'justify-content-center',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const justifyContentEndIcon = {\r\n name: 'justify-content-end',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const justifyContentBetweenIcon = {\r\n name: 'justify-content-between',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const justifyContentAroundIcon = {\r\n name: 'justify-content-around',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const justifyContentStartAltIcon = {\r\n name: 'justify-content-start-alt',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const justifyContentCenterAltIcon = {\r\n name: 'justify-content-center-alt',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const justifyContentEndAltIcon = {\r\n name: 'justify-content-end-alt',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const justifyContentBetweenAltIcon = {\r\n name: 'justify-content-between-alt',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const justifyContentAroundAltIcon = {\r\n name: 'justify-content-around-alt',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const fileWrenchIcon = {\r\n name: 'file-wrench',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const boldIcon = {\r\n name: 'bold',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const italicIcon = {\r\n name: 'italic',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const underlineIcon = {\r\n name: 'underline',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const fontFamilyIcon = {\r\n name: 'font-family',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const foregroundColorIcon = {\r\n name: 'foreground-color',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const convertLowercaseIcon = {\r\n name: 'convert-lowercase',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const convertUppercaseIcon = {\r\n name: 'convert-uppercase',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const strikethroughIcon = {\r\n name: 'strikethrough',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const subscriptIcon = {\r\n name: 'subscript',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const supscriptIcon = {\r\n name: 'supscript',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const divIcon = {\r\n name: 'div',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const allIcon = {\r\n name: 'all',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const h1Icon = {\r\n name: 'h1',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const h2Icon = {\r\n name: 'h2',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const h3Icon = {\r\n name: 'h3',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const h4Icon = {\r\n name: 'h4',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const h5Icon = {\r\n name: 'h5',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const h6Icon = {\r\n name: 'h6',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const listOrderedIcon = {\r\n name: 'list-ordered',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const listUnorderedIcon = {\r\n name: 'list-unordered',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const indentIcon = {\r\n name: 'indent',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const outdentIcon = {\r\n name: 'outdent',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const insertTopIcon = {\r\n name: 'insert-top',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const insertMiddleIcon = {\r\n name: 'insert-middle',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const insertBottomIcon = {\r\n name: 'insert-bottom',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const alignTopIcon = {\r\n name: 'align-top',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const alignMiddleIcon = {\r\n name: 'align-middle',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const alignBottomIcon = {\r\n name: 'align-bottom',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const alignLeftIcon = {\r\n name: 'align-left',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const alignCenterIcon = {\r\n name: 'align-center',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const alignRightIcon = {\r\n name: 'align-right',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const alignJustifyIcon = {\r\n name: 'align-justify',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const alignRemoveIcon = {\r\n name: 'align-remove',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const textWrapIcon = {\r\n name: 'text-wrap',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const horizontalRuleIcon = {\r\n name: 'horizontal-rule',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const tableAlignTopLeftIcon = {\r\n name: 'table-align-top-left',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const tableAlignTopCenterIcon = {\r\n name: 'table-align-top-center',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const tableAlignTopRightIcon = {\r\n name: 'table-align-top-right',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const tableAlignMiddleLeftIcon = {\r\n name: 'table-align-middle-left',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const tableAlignMiddleCenterIcon = {\r\n name: 'table-align-middle-center',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const tableAlignMiddleRightIcon = {\r\n name: 'table-align-middle-right',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const tableAlignBottomLeftIcon = {\r\n name: 'table-align-bottom-left',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const tableAlignBottomCenterIcon = {\r\n name: 'table-align-bottom-center',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const tableAlignBottomRightIcon = {\r\n name: 'table-align-bottom-right',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const tableAlignRemoveIcon = {\r\n name: 'table-align-remove',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const bordersAllIcon = {\r\n name: 'borders-all',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const bordersOutsideIcon = {\r\n name: 'borders-outside',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const bordersInsideIcon = {\r\n name: 'borders-inside',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const bordersInsideHorizontalIcon = {\r\n name: 'borders-inside-horizontal',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const bordersInsideVerticalIcon = {\r\n name: 'borders-inside-vertical',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const borderTopIcon = {\r\n name: 'border-top',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const borderBottomIcon = {\r\n name: 'border-bottom',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const borderLeftIcon = {\r\n name: 'border-left',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const borderRightIcon = {\r\n name: 'border-right',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const bordersNoneIcon = {\r\n name: 'borders-none',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const bordersShowHideIcon = {\r\n name: 'borders-show-hide',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const formIcon = {\r\n name: 'form',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const formElementIcon = {\r\n name: 'form-element',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const codeSnippetIcon = {\r\n name: 'code-snippet',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const selectAllIcon = {\r\n name: 'select-all',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const buttonIcon = {\r\n name: 'button',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const selectBoxIcon = {\r\n name: 'select-box',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const calendarDateIcon = {\r\n name: 'calendar-date',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const groupBoxIcon = {\r\n name: 'group-box',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const textareaIcon = {\r\n name: 'textarea',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const textboxIcon = {\r\n name: 'textbox',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const textboxHiddenIcon = {\r\n name: 'textbox-hidden',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const passwordIcon = {\r\n name: 'password',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const paragraphAddIcon = {\r\n name: 'paragraph-add',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const editToolsIcon = {\r\n name: 'edit-tools',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const templateManagerIcon = {\r\n name: 'template-manager',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const changeManuallyIcon = {\r\n name: 'change-manually',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const trackChangesIcon = {\r\n name: 'track-changes',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const trackChangesEnableIcon = {\r\n name: 'track-changes-enable',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const trackChangesAcceptIcon = {\r\n name: 'track-changes-accept',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const trackChangesAcceptAllIcon = {\r\n name: 'track-changes-accept-all',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const trackChangesRejectIcon = {\r\n name: 'track-changes-reject',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const trackChangesRejectAllIcon = {\r\n name: 'track-changes-reject-all',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const documentManagerIcon = {\r\n name: 'document-manager',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const customIconIcon = {\r\n name: 'custom-icon',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const bookIcon = {\r\n name: 'book',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const imageAddIcon = {\r\n name: 'image-add',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const imageEditIcon = {\r\n name: 'image-edit',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const imageMapEditorIcon = {\r\n name: 'image-map-editor',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const commentIcon = {\r\n name: 'comment',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const commentRemoveIcon = {\r\n name: 'comment-remove',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const commentsRemoveIcon = {\r\n name: 'comments-remove',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const silverlightIcon = {\r\n name: 'silverlight',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const mediaManagerIcon = {\r\n name: 'media-manager',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const videoExternalIcon = {\r\n name: 'video-external',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const flashManagerIcon = {\r\n name: 'flash-manager',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const binocularsIcon = {\r\n name: 'binoculars',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const copyIcon = {\r\n name: 'copy',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const cutIcon = {\r\n name: 'cut',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const clipboardIcon = {\r\n name: 'clipboard',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const clipboardCodeIcon = {\r\n name: 'clipboard-code',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const clipboardWordIcon = {\r\n name: 'clipboard-word',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const clipboardWordAltIcon = {\r\n name: 'clipboard-word-alt',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const clipboardHtmlIcon = {\r\n name: 'clipboard-html',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const clipboardMarkdownIcon = {\r\n name: 'clipboard-markdown',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const clipboardTextIcon = {\r\n name: 'clipboard-text',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const applyFormatIcon = {\r\n name: 'apply-format',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const clearCssIcon = {\r\n name: 'clear-css',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const copyFormatIcon = {\r\n name: 'copy-format',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const stripAllFormattingIcon = {\r\n name: 'strip-all-formatting',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const stripCssFormatIcon = {\r\n name: 'strip-css-format',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const stripFontElementsIcon = {\r\n name: 'strip-font-elements',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const stripSpanElementsIcon = {\r\n name: 'strip-span-elements',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const stripWordFormattingIcon = {\r\n name: 'strip-word-formatting',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const formatCodeBlockIcon = {\r\n name: 'format-code-block',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const buildingBlocksIcon = {\r\n name: 'building-blocks',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const puzzlePieceIcon = {\r\n name: 'puzzle-piece',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const linkAddIcon = {\r\n name: 'link-add',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const globeLinkIcon = {\r\n name: 'globe-link',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const globeUnlinkIcon = {\r\n name: 'globe-unlink',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const envelopLinkIcon = {\r\n name: 'envelop-link',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const anchorIcon = {\r\n name: 'anchor',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const tableAddIcon = {\r\n name: 'table-add',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const tableIcon = {\r\n name: 'table',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const tablePropertiesIcon = {\r\n name: 'table-properties',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const tableCellIcon = {\r\n name: 'table-cell',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const tableCellPropertiesIcon = {\r\n name: 'table-cell-properties',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const tableColumnInsertLeftIcon = {\r\n name: 'table-column-insert-left',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const tableColumnInsertRightIcon = {\r\n name: 'table-column-insert-right',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const tableRowInsertAboveIcon = {\r\n name: 'table-row-insert-above',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const tableRowInsertBelowIcon = {\r\n name: 'table-row-insert-below',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const tableColumnDeleteIcon = {\r\n name: 'table-column-delete',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const tableRowDeleteIcon = {\r\n name: 'table-row-delete',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const tableCellDeleteIcon = {\r\n name: 'table-cell-delete',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const tableDeleteIcon = {\r\n name: 'table-delete',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const cellsMergeIcon = {\r\n name: 'cells-merge',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const cellsMergeHorizontallyIcon = {\r\n name: 'cells-merge-horizontally',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const cellsMergeVerticallyIcon = {\r\n name: 'cells-merge-vertically',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const cellSplitHorizontallyIcon = {\r\n name: 'cell-split-horizontally',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const cellSplitVerticallyIcon = {\r\n name: 'cell-split-vertically',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const tableUnmergeIcon = {\r\n name: 'table-unmerge',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const paneFreezeIcon = {\r\n name: 'pane-freeze',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const rowFreezeIcon = {\r\n name: 'row-freeze',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const columnFreezeIcon = {\r\n name: 'column-freeze',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const toolbarFloatIcon = {\r\n name: 'toolbar-float',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const spellCheckerIcon = {\r\n name: 'spell-checker',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const validationXhtmlIcon = {\r\n name: 'validation-xhtml',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const validationDataIcon = {\r\n name: 'validation-data',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const toggleFullScreenModeIcon = {\r\n name: 'toggle-full-screen-mode',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const formulaFxIcon = {\r\n name: 'formula-fx',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const sumIcon = {\r\n name: 'sum',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const symbolIcon = {\r\n name: 'symbol',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const dollarIcon = {\r\n name: 'dollar',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const percentIcon = {\r\n name: 'percent',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const customFormatIcon = {\r\n name: 'custom-format',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const decimalIncreaseIcon = {\r\n name: 'decimal-increase',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const decimalDecreaseIcon = {\r\n name: 'decimal-decrease',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const fontSizeIcon = {\r\n name: 'font-size',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const imageAbsolutePositionIcon = {\r\n name: 'image-absolute-position',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const tableWizardIcon = {\r\n name: 'table-wizard',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const crosstabIcon = {\r\n name: 'crosstab',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const crosstabWizardIcon = {\r\n name: 'crosstab-wizard',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const tableBodyIcon = {\r\n name: 'table-body',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const tableColumnGroupsIcon = {\r\n name: 'table-column-groups',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const tableCornerIcon = {\r\n name: 'table-corner',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const tableRowGroupsIcon = {\r\n name: 'table-row-groups',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const globeOutlineIcon = {\r\n name: 'globe-outline',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const globeIcon = {\r\n name: 'globe',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const mapMarkerIcon = {\r\n name: 'map-marker',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const mapMarkerTargetIcon = {\r\n name: 'map-marker-target',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const pinIcon = {\r\n name: 'pin',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const unpinIcon = {\r\n name: 'unpin',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const shareIcon = {\r\n name: 'share',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const userIcon = {\r\n name: 'user',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const inboxIcon = {\r\n name: 'inbox',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const bloggerIcon = {\r\n name: 'blogger',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const bloggerBoxIcon = {\r\n name: 'blogger-box',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const deliciousIcon = {\r\n name: 'delicious',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const deliciousBoxIcon = {\r\n name: 'delicious-box',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const diggIcon = {\r\n name: 'digg',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const diggBoxIcon = {\r\n name: 'digg-box',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const envelopIcon = {\r\n name: 'envelop',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const envelopBoxIcon = {\r\n name: 'envelop-box',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const facebookIcon = {\r\n name: 'facebook',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const facebookBoxIcon = {\r\n name: 'facebook-box',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const googleIcon = {\r\n name: 'google',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const googleBoxIcon = {\r\n name: 'google-box',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const googlePlusIcon = {\r\n name: 'google-plus',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const googlePlusBoxIcon = {\r\n name: 'google-plus-box',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const linkedinIcon = {\r\n name: 'linkedin',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const linkedinBoxIcon = {\r\n name: 'linkedin-box',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const myspaceIcon = {\r\n name: 'myspace',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const myspaceBoxIcon = {\r\n name: 'myspace-box',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const pinterestIcon = {\r\n name: 'pinterest',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const pinterestBoxIcon = {\r\n name: 'pinterest-box',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const redditIcon = {\r\n name: 'reddit',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const redditBoxIcon = {\r\n name: 'reddit-box',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const stumbleUponIcon = {\r\n name: 'stumble-upon',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const stumbleUponBoxIcon = {\r\n name: 'stumble-upon-box',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const tellAFriendIcon = {\r\n name: 'tell-a-friend',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const tellAFriendBoxIcon = {\r\n name: 'tell-a-friend-box',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const tumblrIcon = {\r\n name: 'tumblr',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const tumblrBoxIcon = {\r\n name: 'tumblr-box',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const twitterIcon = {\r\n name: 'twitter',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const twitterBoxIcon = {\r\n name: 'twitter-box',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const yammerIcon = {\r\n name: 'yammer',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const yammerBoxIcon = {\r\n name: 'yammer-box',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const behanceIcon = {\r\n name: 'behance',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const behanceBoxIcon = {\r\n name: 'behance-box',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const dribbbleIcon = {\r\n name: 'dribbble',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const dribbbleBoxIcon = {\r\n name: 'dribbble-box',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const rssIcon = {\r\n name: 'rss',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const rssBoxIcon = {\r\n name: 'rss-box',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const vimeoIcon = {\r\n name: 'vimeo',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const vimeoBoxIcon = {\r\n name: 'vimeo-box',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const youtubeIcon = {\r\n name: 'youtube',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const youtubeBoxIcon = {\r\n name: 'youtube-box',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const folderIcon = {\r\n name: 'folder',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const folderOpenIcon = {\r\n name: 'folder-open',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const folderAddIcon = {\r\n name: 'folder-add',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const folderUpIcon = {\r\n name: 'folder-up',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const folderMoreIcon = {\r\n name: 'folder-more',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const aggregateFieldsIcon = {\r\n name: 'aggregate-fields',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const fileIcon = {\r\n name: 'file',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const fileAddIcon = {\r\n name: 'file-add',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const fileTxtIcon = {\r\n name: 'file-txt',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const fileCsvIcon = {\r\n name: 'file-csv',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const fileExcelIcon = {\r\n name: 'file-excel',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const fileWordIcon = {\r\n name: 'file-word',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const fileMdbIcon = {\r\n name: 'file-mdb',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const filePptIcon = {\r\n name: 'file-ppt',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const filePdfIcon = {\r\n name: 'file-pdf',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const filePsdIcon = {\r\n name: 'file-psd',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const fileFlashIcon = {\r\n name: 'file-flash',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const fileConfigIcon = {\r\n name: 'file-config',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const fileAscxIcon = {\r\n name: 'file-ascx',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const fileBacIcon = {\r\n name: 'file-bac',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const fileZipIcon = {\r\n name: 'file-zip',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const filmIcon = {\r\n name: 'film',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const css3Icon = {\r\n name: 'css3',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const html5Icon = {\r\n name: 'html5',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const codeIcon = {\r\n name: 'code',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const cssIcon = {\r\n name: 'css',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const jsIcon = {\r\n name: 'js',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const exeIcon = {\r\n name: 'exe',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const csprojIcon = {\r\n name: 'csproj',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const vbprojIcon = {\r\n name: 'vbproj',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const csIcon = {\r\n name: 'cs',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const vbIcon = {\r\n name: 'vb',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const slnIcon = {\r\n name: 'sln',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const cloudIcon = {\r\n name: 'cloud',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const fileHorizontalIcon = {\r\n name: 'file-horizontal',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const subreportIcon = {\r\n name: 'subreport',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const dataIcon = {\r\n name: 'data',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const fileHeaderIcon = {\r\n name: 'file-header',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const fileFooterIcon = {\r\n name: 'file-footer',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const groupHeaderSectionIcon = {\r\n name: 'group-header-section',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const groupFooterSectionIcon = {\r\n name: 'group-footer-section',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const pageHeaderSectionIcon = {\r\n name: 'page-header-section',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const pageFooterSectionIcon = {\r\n name: 'page-footer-section',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const detailSectionIcon = {\r\n name: 'detail-section',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const tocSectionIcon = {\r\n name: 'toc-section',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const groupSectionIcon = {\r\n name: 'group-section',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const parametersIcon = {\r\n name: 'parameters',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const dataCsvIcon = {\r\n name: 'data-csv',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const dataJsonIcon = {\r\n name: 'data-json',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const dataSqlIcon = {\r\n name: 'data-sql',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const dataWebIcon = {\r\n name: 'data-web',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const groupCollectionIcon = {\r\n name: 'group-collection',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const parameterBooleanIcon = {\r\n name: 'parameter-boolean',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const parameterDateTimeIcon = {\r\n name: 'parameter-date-time',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const parameterFloatIcon = {\r\n name: 'parameter-float',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const parameterIntegerIcon = {\r\n name: 'parameter-integer',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const parameterStringIcon = {\r\n name: 'parameter-string',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const tocSectionLevelIcon = {\r\n name: 'toc-section-level',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const inheritedIcon = {\r\n name: 'inherited',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const fileVideoIcon = {\r\n name: 'file-video',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const fileAudioIcon = {\r\n name: 'file-audio',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const fileImageIcon = {\r\n name: 'file-image',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const filePresentationIcon = {\r\n name: 'file-presentation',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const fileDataIcon = {\r\n name: 'file-data',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const fileDiscImageIcon = {\r\n name: 'file-disc-image',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const fileProgrammingIcon = {\r\n name: 'file-programming',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const parametersByteArrayIcon = {\r\n name: 'parameters-byte-array',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const parametersUnknownIcon = {\r\n name: 'parameters-unknown',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const fileErrorIcon = {\r\n name: 'file-error',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const filesErrorIcon = {\r\n name: 'files-error',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const dataRestIcon = {\r\n name: 'data-rest',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const fileTypescriptIcon = {\r\n name: 'file-typescript',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const tablePositionStartIcon = {\r\n name: 'table-position-start',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const tablePositionCenterIcon = {\r\n name: 'table-position-center',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const tablePositionEndIcon = {\r\n name: 'table-position-end',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const listRomanUpperIcon = {\r\n name: 'list-roman-upper',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const listRomanLowerIcon = {\r\n name: 'list-roman-lower',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const importIcon = {\r\n name: 'import',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const exportIcon = {\r\n name: 'export',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const graphIcon = {\r\n name: 'graph',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const chartColumnClusteredIcon = {\r\n name: 'chart-column-clustered',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const chartColumnStackedIcon = {\r\n name: 'chart-column-stacked',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const chartColumnStacked100Icon = {\r\n name: 'chart-column-stacked100',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const chartColumnRangeIcon = {\r\n name: 'chart-column-range',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const chartBarClusteredIcon = {\r\n name: 'chart-bar-clustered',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const chartBarStackedIcon = {\r\n name: 'chart-bar-stacked',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const chartBarStacked100Icon = {\r\n name: 'chart-bar-stacked100',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const chartBarRangeIcon = {\r\n name: 'chart-bar-range',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const chartAreaClusteredIcon = {\r\n name: 'chart-area-clustered',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const chartAreaStackedIcon = {\r\n name: 'chart-area-stacked',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const chartAreaStacked100Icon = {\r\n name: 'chart-area-stacked100',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const chartAreaRangeIcon = {\r\n name: 'chart-area-range',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const chartLineIcon = {\r\n name: 'chart-line',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const chartLineStackedIcon = {\r\n name: 'chart-line-stacked',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const chartLineStacked100Icon = {\r\n name: 'chart-line-stacked100',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const chartLineMarkersIcon = {\r\n name: 'chart-line-markers',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const chartLineStackedMarkersIcon = {\r\n name: 'chart-line-stacked-markers',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const chartLineStacked100MarkersIcon = {\r\n name: 'chart-line-stacked100-markers',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const chartPieIcon = {\r\n name: 'chart-pie',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const chartDoughnutIcon = {\r\n name: 'chart-doughnut',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const chartScatterIcon = {\r\n name: 'chart-scatter',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const chartScatterSmoothLinesMarkersIcon = {\r\n name: 'chart-scatter-smooth-lines-markers',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const chartScatterSmoothLinesIcon = {\r\n name: 'chart-scatter-smooth-lines',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const chartScatterStraightLinesMarkersIcon = {\r\n name: 'chart-scatter-straight-lines-markers',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const chartScatterStraightLinesIcon = {\r\n name: 'chart-scatter-straight-lines',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const chartBubbleIcon = {\r\n name: 'chart-bubble',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const chartCandlestickIcon = {\r\n name: 'chart-candlestick',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const chartOhlcIcon = {\r\n name: 'chart-ohlc',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const chartRadarIcon = {\r\n name: 'chart-radar',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const chartRadarMarkersIcon = {\r\n name: 'chart-radar-markers',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const chartRadarFilledIcon = {\r\n name: 'chart-radar-filled',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const chartRoseIcon = {\r\n name: 'chart-rose',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n const chartChoroplethIcon = {\r\n name: 'chart-choropleth',\r\n content: '',\r\n viewBox: '0 0 512 512'\r\n };\r\n\r\n var svgIcons = /*#__PURE__*/Object.freeze({\r\n __proto__: null,\r\n accessibilityIcon: accessibilityIcon,\r\n aggregateFieldsIcon: aggregateFieldsIcon,\r\n alignBottomIcon: alignBottomIcon,\r\n alignCenterIcon: alignCenterIcon,\r\n alignItemsBaselineAltIcon: alignItemsBaselineAltIcon,\r\n alignItemsBaselineIcon: alignItemsBaselineIcon,\r\n alignItemsCenterAltIcon: alignItemsCenterAltIcon,\r\n alignItemsCenterIcon: alignItemsCenterIcon,\r\n alignItemsEndAltIcon: alignItemsEndAltIcon,\r\n alignItemsEndIcon: alignItemsEndIcon,\r\n alignItemsStartAltIcon: alignItemsStartAltIcon,\r\n alignItemsStartIcon: alignItemsStartIcon,\r\n alignItemsStretchAltIcon: alignItemsStretchAltIcon,\r\n alignItemsStretchIcon: alignItemsStretchIcon,\r\n alignJustifyIcon: alignJustifyIcon,\r\n alignLeftIcon: alignLeftIcon,\r\n alignMiddleIcon: alignMiddleIcon,\r\n alignRemoveIcon: alignRemoveIcon,\r\n alignRightIcon: alignRightIcon,\r\n alignSelfCenterAltIcon: alignSelfCenterAltIcon,\r\n alignSelfCenterIcon: alignSelfCenterIcon,\r\n alignSelfEndAltIcon: alignSelfEndAltIcon,\r\n alignSelfEndIcon: alignSelfEndIcon,\r\n alignSelfStartAltIcon: alignSelfStartAltIcon,\r\n alignSelfStartIcon: alignSelfStartIcon,\r\n alignSelfStretchAltIcon: alignSelfStretchAltIcon,\r\n alignSelfStretchIcon: alignSelfStretchIcon,\r\n alignToGridIcon: alignToGridIcon,\r\n alignTopIcon: alignTopIcon,\r\n allIcon: allIcon,\r\n anchorIcon: anchorIcon,\r\n applyFormatIcon: applyFormatIcon,\r\n arrowDownIcon: arrowDownIcon,\r\n arrowLeftIcon: arrowLeftIcon,\r\n arrowOverflowDownIcon: arrowOverflowDownIcon,\r\n arrowRightIcon: arrowRightIcon,\r\n arrowRotateCcwIcon: arrowRotateCcwIcon,\r\n arrowRotateCcwSmallIcon: arrowRotateCcwSmallIcon,\r\n arrowRotateCwIcon: arrowRotateCwIcon,\r\n arrowRotateCwSmallIcon: arrowRotateCwSmallIcon,\r\n arrowUpIcon: arrowUpIcon,\r\n arrowsAxesIcon: arrowsAxesIcon,\r\n arrowsLeftRightIcon: arrowsLeftRightIcon,\r\n arrowsMoveIcon: arrowsMoveIcon,\r\n arrowsNoChangeIcon: arrowsNoChangeIcon,\r\n arrowsNoRepeatIcon: arrowsNoRepeatIcon,\r\n arrowsSwapIcon: arrowsSwapIcon,\r\n arrowsTopBottomIcon: arrowsTopBottomIcon,\r\n barcodeIcon: barcodeIcon,\r\n barcodeOutlineIcon: barcodeOutlineIcon,\r\n barcodeQrCodeScannerIcon: barcodeQrCodeScannerIcon,\r\n barcodeScannerIcon: barcodeScannerIcon,\r\n behanceBoxIcon: behanceBoxIcon,\r\n behanceIcon: behanceIcon,\r\n bellIcon: bellIcon,\r\n binocularsIcon: binocularsIcon,\r\n bloggerBoxIcon: bloggerBoxIcon,\r\n bloggerIcon: bloggerIcon,\r\n blurIcon: blurIcon,\r\n boldIcon: boldIcon,\r\n bookIcon: bookIcon,\r\n borderBottomIcon: borderBottomIcon,\r\n borderColorIcon: borderColorIcon,\r\n borderLeftIcon: borderLeftIcon,\r\n borderRadiusBottomLeftIcon: borderRadiusBottomLeftIcon,\r\n borderRadiusBottomRightIcon: borderRadiusBottomRightIcon,\r\n borderRadiusIcon: borderRadiusIcon,\r\n borderRadiusTopLeftIcon: borderRadiusTopLeftIcon,\r\n borderRadiusTopRightIcon: borderRadiusTopRightIcon,\r\n borderRightIcon: borderRightIcon,\r\n borderStyleBottomIcon: borderStyleBottomIcon,\r\n borderStyleIcon: borderStyleIcon,\r\n borderStyleLeftIcon: borderStyleLeftIcon,\r\n borderStyleRightIcon: borderStyleRightIcon,\r\n borderStyleTopIcon: borderStyleTopIcon,\r\n borderTopIcon: borderTopIcon,\r\n borderTypeIcon: borderTypeIcon,\r\n bordersAllIcon: bordersAllIcon,\r\n bordersInsideHorizontalIcon: bordersInsideHorizontalIcon,\r\n bordersInsideIcon: bordersInsideIcon,\r\n bordersInsideVerticalIcon: bordersInsideVerticalIcon,\r\n bordersNoneIcon: bordersNoneIcon,\r\n bordersOutsideIcon: bordersOutsideIcon,\r\n bordersShowHideIcon: bordersShowHideIcon,\r\n boxSizingIcon: boxSizingIcon,\r\n brightnessContrastIcon: brightnessContrastIcon,\r\n bringBackwardIcon: bringBackwardIcon,\r\n bringForwardIcon: bringForwardIcon,\r\n bringToBackIcon: bringToBackIcon,\r\n bringToFrontIcon: bringToFrontIcon,\r\n brushIcon: brushIcon,\r\n buildingBlocksIcon: buildingBlocksIcon,\r\n buttonIcon: buttonIcon,\r\n calculatorIcon: calculatorIcon,\r\n calendarDateIcon: calendarDateIcon,\r\n calendarIcon: calendarIcon,\r\n cameraIcon: cameraIcon,\r\n cancelCircleIcon: cancelCircleIcon,\r\n cancelIcon: cancelIcon,\r\n cancelOutlineIcon: cancelOutlineIcon,\r\n caretAltDownIcon: caretAltDownIcon,\r\n caretAltExpandIcon: caretAltExpandIcon,\r\n caretAltLeftIcon: caretAltLeftIcon,\r\n caretAltRightIcon: caretAltRightIcon,\r\n caretAltToBottomIcon: caretAltToBottomIcon,\r\n caretAltToLeftIcon: caretAltToLeftIcon,\r\n caretAltToRightIcon: caretAltToRightIcon,\r\n caretAltToTopIcon: caretAltToTopIcon,\r\n caretAltUpIcon: caretAltUpIcon,\r\n caretBlIcon: caretBlIcon,\r\n caretBrIcon: caretBrIcon,\r\n caretDoubleAltDownIcon: caretDoubleAltDownIcon,\r\n caretDoubleAltLeftIcon: caretDoubleAltLeftIcon,\r\n caretDoubleAltRightIcon: caretDoubleAltRightIcon,\r\n caretDoubleAltUpIcon: caretDoubleAltUpIcon,\r\n caretTlIcon: caretTlIcon,\r\n caretTrIcon: caretTrIcon,\r\n cartIcon: cartIcon,\r\n categorizeIcon: categorizeIcon,\r\n cellSplitHorizontallyIcon: cellSplitHorizontallyIcon,\r\n cellSplitVerticallyIcon: cellSplitVerticallyIcon,\r\n cellsMergeHorizontallyIcon: cellsMergeHorizontallyIcon,\r\n cellsMergeIcon: cellsMergeIcon,\r\n cellsMergeVerticallyIcon: cellsMergeVerticallyIcon,\r\n changeManuallyIcon: changeManuallyIcon,\r\n chartAreaClusteredIcon: chartAreaClusteredIcon,\r\n chartAreaRangeIcon: chartAreaRangeIcon,\r\n chartAreaStacked100Icon: chartAreaStacked100Icon,\r\n chartAreaStackedIcon: chartAreaStackedIcon,\r\n chartBarClusteredIcon: chartBarClusteredIcon,\r\n chartBarRangeIcon: chartBarRangeIcon,\r\n chartBarStacked100Icon: chartBarStacked100Icon,\r\n chartBarStackedIcon: chartBarStackedIcon,\r\n chartBubbleIcon: chartBubbleIcon,\r\n chartCandlestickIcon: chartCandlestickIcon,\r\n chartChoroplethIcon: chartChoroplethIcon,\r\n chartColumnClusteredIcon: chartColumnClusteredIcon,\r\n chartColumnRangeIcon: chartColumnRangeIcon,\r\n chartColumnStacked100Icon: chartColumnStacked100Icon,\r\n chartColumnStackedIcon: chartColumnStackedIcon,\r\n chartDoughnutIcon: chartDoughnutIcon,\r\n chartLineIcon: chartLineIcon,\r\n chartLineMarkersIcon: chartLineMarkersIcon,\r\n chartLineStacked100Icon: chartLineStacked100Icon,\r\n chartLineStacked100MarkersIcon: chartLineStacked100MarkersIcon,\r\n chartLineStackedIcon: chartLineStackedIcon,\r\n chartLineStackedMarkersIcon: chartLineStackedMarkersIcon,\r\n chartOhlcIcon: chartOhlcIcon,\r\n chartPieIcon: chartPieIcon,\r\n chartRadarFilledIcon: chartRadarFilledIcon,\r\n chartRadarIcon: chartRadarIcon,\r\n chartRadarMarkersIcon: chartRadarMarkersIcon,\r\n chartRoseIcon: chartRoseIcon,\r\n chartScatterIcon: chartScatterIcon,\r\n chartScatterSmoothLinesIcon: chartScatterSmoothLinesIcon,\r\n chartScatterSmoothLinesMarkersIcon: chartScatterSmoothLinesMarkersIcon,\r\n chartScatterStraightLinesIcon: chartScatterStraightLinesIcon,\r\n chartScatterStraightLinesMarkersIcon: chartScatterStraightLinesMarkersIcon,\r\n checkCircleIcon: checkCircleIcon,\r\n checkIcon: checkIcon,\r\n checkOutlineIcon: checkOutlineIcon,\r\n checkboxCheckedIcon: checkboxCheckedIcon,\r\n checkboxIcon: checkboxIcon,\r\n checkboxIndeterminateIcon: checkboxIndeterminateIcon,\r\n checkboxNullIcon: checkboxNullIcon,\r\n chevronDoubleDownIcon: chevronDoubleDownIcon,\r\n chevronDoubleLeftIcon: chevronDoubleLeftIcon,\r\n chevronDoubleRightIcon: chevronDoubleRightIcon,\r\n chevronDoubleUpIcon: chevronDoubleUpIcon,\r\n chevronDownIcon: chevronDownIcon,\r\n chevronLeftIcon: chevronLeftIcon,\r\n chevronRightIcon: chevronRightIcon,\r\n chevronUpIcon: chevronUpIcon,\r\n circleIcon: circleIcon,\r\n clearCssIcon: clearCssIcon,\r\n clipboardCodeIcon: clipboardCodeIcon,\r\n clipboardHtmlIcon: clipboardHtmlIcon,\r\n clipboardIcon: clipboardIcon,\r\n clipboardMarkdownIcon: clipboardMarkdownIcon,\r\n clipboardTextIcon: clipboardTextIcon,\r\n clipboardWordAltIcon: clipboardWordAltIcon,\r\n clipboardWordIcon: clipboardWordIcon,\r\n clockArrowRotateIcon: clockArrowRotateIcon,\r\n clockIcon: clockIcon,\r\n closedCaptionsIcon: closedCaptionsIcon,\r\n cloudIcon: cloudIcon,\r\n codeIcon: codeIcon,\r\n codeSnippetIcon: codeSnippetIcon,\r\n colResizeIcon: colResizeIcon,\r\n columnFreezeIcon: columnFreezeIcon,\r\n columnsIcon: columnsIcon,\r\n commentIcon: commentIcon,\r\n commentRemoveIcon: commentRemoveIcon,\r\n commentsRemoveIcon: commentsRemoveIcon,\r\n connectorIcon: connectorIcon,\r\n convertLowercaseIcon: convertLowercaseIcon,\r\n convertUppercaseIcon: convertUppercaseIcon,\r\n copyFormatIcon: copyFormatIcon,\r\n copyIcon: copyIcon,\r\n cropIcon: cropIcon,\r\n crosstabIcon: crosstabIcon,\r\n crosstabWizardIcon: crosstabWizardIcon,\r\n csIcon: csIcon,\r\n csprojIcon: csprojIcon,\r\n css3Icon: css3Icon,\r\n cssIcon: cssIcon,\r\n customFormatIcon: customFormatIcon,\r\n customIconIcon: customIconIcon,\r\n cutIcon: cutIcon,\r\n dataCsvIcon: dataCsvIcon,\r\n dataIcon: dataIcon,\r\n dataJsonIcon: dataJsonIcon,\r\n dataOdsIcon: dataOdsIcon,\r\n dataRestIcon: dataRestIcon,\r\n dataSdsIcon: dataSdsIcon,\r\n dataSqlIcon: dataSqlIcon,\r\n dataWebIcon: dataWebIcon,\r\n decimalDecreaseIcon: decimalDecreaseIcon,\r\n decimalIncreaseIcon: decimalIncreaseIcon,\r\n decreaseHorizontalSpacingIcon: decreaseHorizontalSpacingIcon,\r\n decreaseVerticalSpacingIcon: decreaseVerticalSpacingIcon,\r\n deliciousBoxIcon: deliciousBoxIcon,\r\n deliciousIcon: deliciousIcon,\r\n detailSectionIcon: detailSectionIcon,\r\n diggBoxIcon: diggBoxIcon,\r\n diggIcon: diggIcon,\r\n dimensionsIcon: dimensionsIcon,\r\n displayBlockIcon: displayBlockIcon,\r\n displayFlexIcon: displayFlexIcon,\r\n displayInlineBlockIcon: displayInlineBlockIcon,\r\n displayInlineFlexIcon: displayInlineFlexIcon,\r\n divIcon: divIcon,\r\n divideIcon: divideIcon,\r\n documentManagerIcon: documentManagerIcon,\r\n dollarIcon: dollarIcon,\r\n downloadIcon: downloadIcon,\r\n downloadLightIcon: downloadLightIcon,\r\n dragAndDropIcon: dragAndDropIcon,\r\n dribbbleBoxIcon: dribbbleBoxIcon,\r\n dribbbleIcon: dribbbleIcon,\r\n dropletIcon: dropletIcon,\r\n dropletSlashIcon: dropletSlashIcon,\r\n dropletSliderIcon: dropletSliderIcon,\r\n editToolsIcon: editToolsIcon,\r\n envelopBoxIcon: envelopBoxIcon,\r\n envelopIcon: envelopIcon,\r\n envelopLinkIcon: envelopLinkIcon,\r\n envelopeBoxIcon: envelopeBoxIcon,\r\n envelopeIcon: envelopeIcon,\r\n envelopeLinkIcon: envelopeLinkIcon,\r\n equalIcon: equalIcon,\r\n exclamationCircleIcon: exclamationCircleIcon,\r\n exeIcon: exeIcon,\r\n exportIcon: exportIcon,\r\n eyeIcon: eyeIcon,\r\n eyeSlashIcon: eyeSlashIcon,\r\n eyedropperIcon: eyedropperIcon,\r\n facebookBoxIcon: facebookBoxIcon,\r\n facebookIcon: facebookIcon,\r\n fileAddIcon: fileAddIcon,\r\n fileAscxIcon: fileAscxIcon,\r\n fileAudioIcon: fileAudioIcon,\r\n fileBacIcon: fileBacIcon,\r\n fileConfigIcon: fileConfigIcon,\r\n fileCsvIcon: fileCsvIcon,\r\n fileDataIcon: fileDataIcon,\r\n fileDiscImageIcon: fileDiscImageIcon,\r\n fileErrorIcon: fileErrorIcon,\r\n fileExcelIcon: fileExcelIcon,\r\n fileFlashIcon: fileFlashIcon,\r\n fileFooterIcon: fileFooterIcon,\r\n fileHeaderIcon: fileHeaderIcon,\r\n fileHorizontalIcon: fileHorizontalIcon,\r\n fileIcon: fileIcon,\r\n fileImageIcon: fileImageIcon,\r\n fileMdbIcon: fileMdbIcon,\r\n filePdfIcon: filePdfIcon,\r\n filePptIcon: filePptIcon,\r\n filePresentationIcon: filePresentationIcon,\r\n fileProgrammingIcon: fileProgrammingIcon,\r\n filePsdIcon: filePsdIcon,\r\n fileReportIcon: fileReportIcon,\r\n fileTxtIcon: fileTxtIcon,\r\n fileTypescriptIcon: fileTypescriptIcon,\r\n fileVideoIcon: fileVideoIcon,\r\n fileWordIcon: fileWordIcon,\r\n fileWrenchIcon: fileWrenchIcon,\r\n fileZipIcon: fileZipIcon,\r\n filesErrorIcon: filesErrorIcon,\r\n filmIcon: filmIcon,\r\n filterAddExpressionIcon: filterAddExpressionIcon,\r\n filterAddGroupIcon: filterAddGroupIcon,\r\n filterClearIcon: filterClearIcon,\r\n filterIcon: filterIcon,\r\n filterSmallIcon: filterSmallIcon,\r\n filterSortAscSmallIcon: filterSortAscSmallIcon,\r\n filterSortDescSmallIcon: filterSortDescSmallIcon,\r\n flashManagerIcon: flashManagerIcon,\r\n flipHorizontalIcon: flipHorizontalIcon,\r\n flipVerticalIcon: flipVerticalIcon,\r\n folderAddIcon: folderAddIcon,\r\n folderIcon: folderIcon,\r\n folderMoreIcon: folderMoreIcon,\r\n folderOpenIcon: folderOpenIcon,\r\n folderUpIcon: folderUpIcon,\r\n fontFamilyIcon: fontFamilyIcon,\r\n fontGrowIcon: fontGrowIcon,\r\n fontShrinkIcon: fontShrinkIcon,\r\n fontSizeIcon: fontSizeIcon,\r\n foregroundColorIcon: foregroundColorIcon,\r\n formElementIcon: formElementIcon,\r\n formIcon: formIcon,\r\n formatCodeBlockIcon: formatCodeBlockIcon,\r\n formulaFxIcon: formulaFxIcon,\r\n forwardIcon: forwardIcon,\r\n fullscreenExitIcon: fullscreenExitIcon,\r\n fullscreenIcon: fullscreenIcon,\r\n gapColumnIcon: gapColumnIcon,\r\n gapRowIcon: gapRowIcon,\r\n gaugeLinearIcon: gaugeLinearIcon,\r\n gaugeRadialIcon: gaugeRadialIcon,\r\n gearIcon: gearIcon,\r\n gearsIcon: gearsIcon,\r\n globeIcon: globeIcon,\r\n globeLinkIcon: globeLinkIcon,\r\n globeOutlineIcon: globeOutlineIcon,\r\n globeUnlinkIcon: globeUnlinkIcon,\r\n googleBoxIcon: googleBoxIcon,\r\n googleIcon: googleIcon,\r\n googlePlusBoxIcon: googlePlusBoxIcon,\r\n googlePlusIcon: googlePlusIcon,\r\n graphIcon: graphIcon,\r\n grayscaleIcon: grayscaleIcon,\r\n greaterOrEqualIcon: greaterOrEqualIcon,\r\n gridIcon: gridIcon,\r\n gridLayoutIcon: gridLayoutIcon,\r\n groupBoxIcon: groupBoxIcon,\r\n groupCollectionIcon: groupCollectionIcon,\r\n groupFooterSectionIcon: groupFooterSectionIcon,\r\n groupHeaderSectionIcon: groupHeaderSectionIcon,\r\n groupIcon: groupIcon,\r\n groupSectionIcon: groupSectionIcon,\r\n h1Icon: h1Icon,\r\n h2Icon: h2Icon,\r\n h3Icon: h3Icon,\r\n h4Icon: h4Icon,\r\n h5Icon: h5Icon,\r\n h6Icon: h6Icon,\r\n handIcon: handIcon,\r\n handleDragIcon: handleDragIcon,\r\n handleResizeAltIcon: handleResizeAltIcon,\r\n handleResizeIcon: handleResizeIcon,\r\n hdIcon: hdIcon,\r\n heartIcon: heartIcon,\r\n heartOutlineIcon: heartOutlineIcon,\r\n homeIcon: homeIcon,\r\n horizontalRuleIcon: horizontalRuleIcon,\r\n html5Icon: html5Icon,\r\n hyperlinkOpenIcon: hyperlinkOpenIcon,\r\n hyperlinkOpenSmIcon: hyperlinkOpenSmIcon,\r\n imageAbsolutePositionIcon: imageAbsolutePositionIcon,\r\n imageAddIcon: imageAddIcon,\r\n imageEditIcon: imageEditIcon,\r\n imageExportIcon: imageExportIcon,\r\n imageIcon: imageIcon,\r\n imageMapEditorIcon: imageMapEditorIcon,\r\n imageResizeIcon: imageResizeIcon,\r\n imagesIcon: imagesIcon,\r\n importIcon: importIcon,\r\n inboxIcon: inboxIcon,\r\n increaseHorizontalSpacingIcon: increaseHorizontalSpacingIcon,\r\n increaseVerticalSpacingIcon: increaseVerticalSpacingIcon,\r\n indentIcon: indentIcon,\r\n infoCircleIcon: infoCircleIcon,\r\n infoSolidIcon: infoSolidIcon,\r\n inheritedIcon: inheritedIcon,\r\n insertBottomIcon: insertBottomIcon,\r\n insertMiddleIcon: insertMiddleIcon,\r\n insertTopIcon: insertTopIcon,\r\n invertColorsIcon: invertColorsIcon,\r\n italicIcon: italicIcon,\r\n jsIcon: jsIcon,\r\n justifyContentAroundAltIcon: justifyContentAroundAltIcon,\r\n justifyContentAroundIcon: justifyContentAroundIcon,\r\n justifyContentBetweenAltIcon: justifyContentBetweenAltIcon,\r\n justifyContentBetweenIcon: justifyContentBetweenIcon,\r\n justifyContentCenterAltIcon: justifyContentCenterAltIcon,\r\n justifyContentCenterIcon: justifyContentCenterIcon,\r\n justifyContentEndAltIcon: justifyContentEndAltIcon,\r\n justifyContentEndIcon: justifyContentEndIcon,\r\n justifyContentStartAltIcon: justifyContentStartAltIcon,\r\n justifyContentStartIcon: justifyContentStartIcon,\r\n kpiStatusDenyIcon: kpiStatusDenyIcon,\r\n kpiStatusHoldIcon: kpiStatusHoldIcon,\r\n kpiStatusOpenIcon: kpiStatusOpenIcon,\r\n launchIcon: launchIcon,\r\n layout1By4Icon: layout1By4Icon,\r\n layout2By2Icon: layout2By2Icon,\r\n layoutIcon: layoutIcon,\r\n layoutSideBySideIcon: layoutSideBySideIcon,\r\n layoutStackedIcon: layoutStackedIcon,\r\n lessOrEqualIcon: lessOrEqualIcon,\r\n letterSpaceIcon: letterSpaceIcon,\r\n levelDownIcon: levelDownIcon,\r\n levelToTopIcon: levelToTopIcon,\r\n levelUpIcon: levelUpIcon,\r\n lineHeightIcon: lineHeightIcon,\r\n linkAddIcon: linkAddIcon,\r\n linkIcon: linkIcon,\r\n linkVerticalIcon: linkVerticalIcon,\r\n linkedinBoxIcon: linkedinBoxIcon,\r\n linkedinIcon: linkedinIcon,\r\n listLatinBigIcon: listLatinBigIcon,\r\n listLatinSmallIcon: listLatinSmallIcon,\r\n listOrderedIcon: listOrderedIcon,\r\n listRomanBigIcon: listRomanBigIcon,\r\n listRomanLowerIcon: listRomanLowerIcon,\r\n listRomanSmallIcon: listRomanSmallIcon,\r\n listRomanUpperIcon: listRomanUpperIcon,\r\n listUnorderedIcon: listUnorderedIcon,\r\n listUnorderedOutlineIcon: listUnorderedOutlineIcon,\r\n listUnorderedSquareIcon: listUnorderedSquareIcon,\r\n lockIcon: lockIcon,\r\n loginIcon: loginIcon,\r\n logoutIcon: logoutIcon,\r\n makeHorizontalSpacingEqualIcon: makeHorizontalSpacingEqualIcon,\r\n makeSameHeightIcon: makeSameHeightIcon,\r\n makeSameSizeIcon: makeSameSizeIcon,\r\n makeSameWidthIcon: makeSameWidthIcon,\r\n makeVerticalSpacingEqualIcon: makeVerticalSpacingEqualIcon,\r\n mapMarkerIcon: mapMarkerIcon,\r\n mapMarkerTargetIcon: mapMarkerTargetIcon,\r\n maxHeightIcon: maxHeightIcon,\r\n maxWidthIcon: maxWidthIcon,\r\n mediaManagerIcon: mediaManagerIcon,\r\n menuIcon: menuIcon,\r\n minHeightIcon: minHeightIcon,\r\n minWidthIcon: minWidthIcon,\r\n minusCircleIcon: minusCircleIcon,\r\n minusIcon: minusIcon,\r\n minusOutlineIcon: minusOutlineIcon,\r\n minusSmIcon: minusSmIcon,\r\n mirrorIcon: mirrorIcon,\r\n moreHorizontalIcon: moreHorizontalIcon,\r\n moreVerticalIcon: moreVerticalIcon,\r\n musicNotesIcon: musicNotesIcon,\r\n myspaceBoxIcon: myspaceBoxIcon,\r\n myspaceIcon: myspaceIcon,\r\n nonRecurrenceIcon: nonRecurrenceIcon,\r\n notEqualIcon: notEqualIcon,\r\n outdentIcon: outdentIcon,\r\n outlineOffsetIcon: outlineOffsetIcon,\r\n outlineWidthIcon: outlineWidthIcon,\r\n overlapIcon: overlapIcon,\r\n paddingBottomIcon: paddingBottomIcon,\r\n paddingIcon: paddingIcon,\r\n paddingLeftIcon: paddingLeftIcon,\r\n paddingRightIcon: paddingRightIcon,\r\n paddingTopIcon: paddingTopIcon,\r\n pageFooterSectionIcon: pageFooterSectionIcon,\r\n pageHeaderSectionIcon: pageHeaderSectionIcon,\r\n paletteIcon: paletteIcon,\r\n paneFreezeIcon: paneFreezeIcon,\r\n paperPlaneIcon: paperPlaneIcon,\r\n paperclipAltIcon: paperclipAltIcon,\r\n paperclipIcon: paperclipIcon,\r\n paragraphAddIcon: paragraphAddIcon,\r\n paragraphHeightIcon: paragraphHeightIcon,\r\n paragraphMarkIcon: paragraphMarkIcon,\r\n parameterBooleanIcon: parameterBooleanIcon,\r\n parameterDateTimeIcon: parameterDateTimeIcon,\r\n parameterFloatIcon: parameterFloatIcon,\r\n parameterIntegerIcon: parameterIntegerIcon,\r\n parameterStringIcon: parameterStringIcon,\r\n parametersByteArrayIcon: parametersByteArrayIcon,\r\n parametersIcon: parametersIcon,\r\n parametersUnknownIcon: parametersUnknownIcon,\r\n passwordIcon: passwordIcon,\r\n pauseIcon: pauseIcon,\r\n pauseSmIcon: pauseSmIcon,\r\n pencilIcon: pencilIcon,\r\n percentIcon: percentIcon,\r\n photosIcon: photosIcon,\r\n pinIcon: pinIcon,\r\n pinterestBoxIcon: pinterestBoxIcon,\r\n pinterestIcon: pinterestIcon,\r\n playIcon: playIcon,\r\n playSmIcon: playSmIcon,\r\n playlistIcon: playlistIcon,\r\n plusCircleIcon: plusCircleIcon,\r\n plusIcon: plusIcon,\r\n plusOutlineIcon: plusOutlineIcon,\r\n plusSmIcon: plusSmIcon,\r\n pointerIcon: pointerIcon,\r\n positionBottomIcon: positionBottomIcon,\r\n positionLeftIcon: positionLeftIcon,\r\n positionRightIcon: positionRightIcon,\r\n positionTopIcon: positionTopIcon,\r\n printIcon: printIcon,\r\n puzzlePieceIcon: puzzlePieceIcon,\r\n qrCodeIcon: qrCodeIcon,\r\n qrCodeOutlineIcon: qrCodeOutlineIcon,\r\n qrCodeScannerIcon: qrCodeScannerIcon,\r\n questionCircleIcon: questionCircleIcon,\r\n radiobuttonCheckedIcon: radiobuttonCheckedIcon,\r\n radiobuttonIcon: radiobuttonIcon,\r\n redditBoxIcon: redditBoxIcon,\r\n redditIcon: redditIcon,\r\n redoIcon: redoIcon,\r\n regularExpressionIcon: regularExpressionIcon,\r\n removeHorizontalSpacingIcon: removeHorizontalSpacingIcon,\r\n removeVerticalSpacingIcon: removeVerticalSpacingIcon,\r\n reorderIcon: reorderIcon,\r\n replaceAllIcon: replaceAllIcon,\r\n replaceSingleIcon: replaceSingleIcon,\r\n reportElementIcon: reportElementIcon,\r\n rewindIcon: rewindIcon,\r\n rightDoubleQuotesIcon: rightDoubleQuotesIcon,\r\n rotateIcon: rotateIcon,\r\n rotateLeftIcon: rotateLeftIcon,\r\n rotateRightIcon: rotateRightIcon,\r\n roundCornersIcon: roundCornersIcon,\r\n rowFreezeIcon: rowFreezeIcon,\r\n rowsIcon: rowsIcon,\r\n rssBoxIcon: rssBoxIcon,\r\n rssIcon: rssIcon,\r\n saveIcon: saveIcon,\r\n searchIcon: searchIcon,\r\n selectAllIcon: selectAllIcon,\r\n selectBoxIcon: selectBoxIcon,\r\n setColumnPositionIcon: setColumnPositionIcon,\r\n shapeLineIcon: shapeLineIcon,\r\n shapesIcon: shapesIcon,\r\n shareIcon: shareIcon,\r\n sharpenIcon: sharpenIcon,\r\n signatureIcon: signatureIcon,\r\n silverlightIcon: silverlightIcon,\r\n sizeToGridIcon: sizeToGridIcon,\r\n slidersIcon: slidersIcon,\r\n slnIcon: slnIcon,\r\n snapGridIcon: snapGridIcon,\r\n snapToGridlinesIcon: snapToGridlinesIcon,\r\n snapToSnaplinesIcon: snapToSnaplinesIcon,\r\n sortAscIcon: sortAscIcon,\r\n sortAscSmallIcon: sortAscSmallIcon,\r\n sortClearIcon: sortClearIcon,\r\n sortDescIcon: sortDescIcon,\r\n sortDescSmallIcon: sortDescSmallIcon,\r\n sparklesIcon: sparklesIcon,\r\n spellCheckerIcon: spellCheckerIcon,\r\n starIcon: starIcon,\r\n starOutlineIcon: starOutlineIcon,\r\n stickIcon: stickIcon,\r\n stopIcon: stopIcon,\r\n stopSmIcon: stopSmIcon,\r\n strikethroughIcon: strikethroughIcon,\r\n stripAllFormattingIcon: stripAllFormattingIcon,\r\n stripCssFormatIcon: stripCssFormatIcon,\r\n stripFontElementsIcon: stripFontElementsIcon,\r\n stripSpanElementsIcon: stripSpanElementsIcon,\r\n stripWordFormattingIcon: stripWordFormattingIcon,\r\n stumbleUponBoxIcon: stumbleUponBoxIcon,\r\n stumbleUponIcon: stumbleUponIcon,\r\n subreportIcon: subreportIcon,\r\n subscriptIcon: subscriptIcon,\r\n sumIcon: sumIcon,\r\n supscriptIcon: supscriptIcon,\r\n symbolIcon: symbolIcon,\r\n tableAddIcon: tableAddIcon,\r\n tableAlignBottomCenterIcon: tableAlignBottomCenterIcon,\r\n tableAlignBottomLeftIcon: tableAlignBottomLeftIcon,\r\n tableAlignBottomRightIcon: tableAlignBottomRightIcon,\r\n tableAlignMiddleCenterIcon: tableAlignMiddleCenterIcon,\r\n tableAlignMiddleLeftIcon: tableAlignMiddleLeftIcon,\r\n tableAlignMiddleRightIcon: tableAlignMiddleRightIcon,\r\n tableAlignRemoveIcon: tableAlignRemoveIcon,\r\n tableAlignTopCenterIcon: tableAlignTopCenterIcon,\r\n tableAlignTopLeftIcon: tableAlignTopLeftIcon,\r\n tableAlignTopRightIcon: tableAlignTopRightIcon,\r\n tableBodyIcon: tableBodyIcon,\r\n tableCellDeleteIcon: tableCellDeleteIcon,\r\n tableCellIcon: tableCellIcon,\r\n tableCellPropertiesIcon: tableCellPropertiesIcon,\r\n tableColumnDeleteIcon: tableColumnDeleteIcon,\r\n tableColumnGroupsIcon: tableColumnGroupsIcon,\r\n tableColumnInsertLeftIcon: tableColumnInsertLeftIcon,\r\n tableColumnInsertRightIcon: tableColumnInsertRightIcon,\r\n tableCornerIcon: tableCornerIcon,\r\n tableDeleteIcon: tableDeleteIcon,\r\n tableIcon: tableIcon,\r\n tablePositionCenterIcon: tablePositionCenterIcon,\r\n tablePositionEndIcon: tablePositionEndIcon,\r\n tablePositionStartIcon: tablePositionStartIcon,\r\n tablePropertiesIcon: tablePropertiesIcon,\r\n tableRowDeleteIcon: tableRowDeleteIcon,\r\n tableRowGroupsIcon: tableRowGroupsIcon,\r\n tableRowInsertAboveIcon: tableRowInsertAboveIcon,\r\n tableRowInsertBelowIcon: tableRowInsertBelowIcon,\r\n tableUnmergeIcon: tableUnmergeIcon,\r\n tableWizardIcon: tableWizardIcon,\r\n tellAFriendBoxIcon: tellAFriendBoxIcon,\r\n tellAFriendIcon: tellAFriendIcon,\r\n templateManagerIcon: templateManagerIcon,\r\n textClipIcon: textClipIcon,\r\n textOverflowIcon: textOverflowIcon,\r\n textTruncateIcon: textTruncateIcon,\r\n textWrapArrowIcon: textWrapArrowIcon,\r\n textWrapIcon: textWrapIcon,\r\n textareaIcon: textareaIcon,\r\n textboxHiddenIcon: textboxHiddenIcon,\r\n textboxIcon: textboxIcon,\r\n thumbDownIcon: thumbDownIcon,\r\n thumbDownOutlineIcon: thumbDownOutlineIcon,\r\n thumbUpIcon: thumbUpIcon,\r\n thumbUpOutlineIcon: thumbUpOutlineIcon,\r\n thumbnailsDownIcon: thumbnailsDownIcon,\r\n thumbnailsLeftIcon: thumbnailsLeftIcon,\r\n thumbnailsRightIcon: thumbnailsRightIcon,\r\n thumbnailsUpIcon: thumbnailsUpIcon,\r\n tocSectionIcon: tocSectionIcon,\r\n tocSectionLevelIcon: tocSectionLevelIcon,\r\n toggleFullScreenModeIcon: toggleFullScreenModeIcon,\r\n toolbarFloatIcon: toolbarFloatIcon,\r\n trackChangesAcceptAllIcon: trackChangesAcceptAllIcon,\r\n trackChangesAcceptIcon: trackChangesAcceptIcon,\r\n trackChangesEnableIcon: trackChangesEnableIcon,\r\n trackChangesIcon: trackChangesIcon,\r\n trackChangesRejectAllIcon: trackChangesRejectAllIcon,\r\n trackChangesRejectIcon: trackChangesRejectIcon,\r\n transparencyIcon: transparencyIcon,\r\n trashIcon: trashIcon,\r\n tumblrBoxIcon: tumblrBoxIcon,\r\n tumblrIcon: tumblrIcon,\r\n twitterBoxIcon: twitterBoxIcon,\r\n twitterIcon: twitterIcon,\r\n underlineIcon: underlineIcon,\r\n undoIcon: undoIcon,\r\n ungroupIcon: ungroupIcon,\r\n unlinkIcon: unlinkIcon,\r\n unlinkVerticalIcon: unlinkVerticalIcon,\r\n unlockIcon: unlockIcon,\r\n unpinIcon: unpinIcon,\r\n unstickIcon: unstickIcon,\r\n uploadIcon: uploadIcon,\r\n userIcon: userIcon,\r\n userOutlineIcon: userOutlineIcon,\r\n validationDataIcon: validationDataIcon,\r\n validationXhtmlIcon: validationXhtmlIcon,\r\n vbIcon: vbIcon,\r\n vbprojIcon: vbprojIcon,\r\n videoExternalIcon: videoExternalIcon,\r\n vimeoBoxIcon: vimeoBoxIcon,\r\n vimeoIcon: vimeoIcon,\r\n volumeDownIcon: volumeDownIcon,\r\n volumeMuteIcon: volumeMuteIcon,\r\n volumeUpIcon: volumeUpIcon,\r\n warningCircleIcon: warningCircleIcon,\r\n warningTriangleIcon: warningTriangleIcon,\r\n wholeWordIcon: wholeWordIcon,\r\n windowIcon: windowIcon,\r\n windowMinimizeIcon: windowMinimizeIcon,\r\n windowRestoreIcon: windowRestoreIcon,\r\n wrenchIcon: wrenchIcon,\r\n xCircleIcon: xCircleIcon,\r\n xIcon: xIcon,\r\n xOutlineIcon: xOutlineIcon,\r\n yammerBoxIcon: yammerBoxIcon,\r\n yammerIcon: yammerIcon,\r\n youtubeBoxIcon: youtubeBoxIcon,\r\n youtubeIcon: youtubeIcon,\r\n zoomActualSizeIcon: zoomActualSizeIcon,\r\n zoomBestFitIcon: zoomBestFitIcon,\r\n zoomInIcon: zoomInIcon,\r\n zoomOutIcon: zoomOutIcon\r\n });\r\n\r\n var __meta__$2q = {\r\n id: \"icons\",\r\n name: \"Icons\",\r\n category: \"web\",\r\n description: \"The Icons set provides both FontIcon and SvgIcon components along with the SVG icons collection from @progress/kendo-svg-icons\",\r\n depends: [\"core\", \"html.icon\"]\r\n };\r\n\r\n (function($, undefined$1) {\r\n var kendo = window.kendo,\r\n html = kendo.html,\r\n ui = kendo.ui,\r\n Widget = ui.Widget,\r\n extend = $.extend;\r\n\r\n var FontIcon = Widget.extend({\r\n init: function(element, options) {\r\n var that = this;\r\n Widget.fn.init.call(that, element, options);\r\n\r\n delete options.name;\r\n that._icon = new html.HTMLFontIcon(element, $.extend({}, options));\r\n that.element = that.wrapper = that._icon.element;\r\n\r\n kendo.notify(that);\r\n },\r\n options: extend({}, html.HTMLFontIcon.fn.options, {\r\n name: 'FontIcon'\r\n }),\r\n setOptions: function(options) {\r\n var that = this;\r\n\r\n Widget.fn.setOptions.call(that, options);\r\n\r\n that._icon = new html.HTMLFontIcon(that.element, $.extend({}, that.options));\r\n }\r\n });\r\n\r\n var SvgIcon = Widget.extend({\r\n init: function(element, options) {\r\n var that = this;\r\n Widget.fn.init.call(that, element, options);\r\n\r\n delete options.name;\r\n that._icon = new html.HTMLSvgIcon(element, $.extend({}, options));\r\n that.element = that.wrapper = that._icon.element;\r\n\r\n kendo.notify(that);\r\n },\r\n options: extend({}, html.HTMLSvgIcon.fn.options, {\r\n name: 'SvgIcon'\r\n }),\r\n setOptions: function(options) {\r\n var that = this;\r\n\r\n Widget.fn.setOptions.call(that, options);\r\n\r\n if (options.icon) {\r\n this.element.html('');\r\n }\r\n\r\n that._icon = new html.HTMLSvgIcon(that.element, $.extend({}, that.options));\r\n }\r\n });\r\n\r\n kendo.ui.plugin(FontIcon);\r\n kendo.ui.plugin(SvgIcon);\r\n\r\n kendo.setDefaults('iconType', 'svg');\r\n kendo.ui.svgIcons = svgIcons;\r\n kendo.ui.icon = html.renderIcon;\r\n })(window.kendo.jQuery);\r\n var kendo$2p = kendo;\r\n\r\n (function($) {\r\n\r\n var NS = \".kendo\";\r\n var kendo = window.kendo;\r\n var deepExtend = kendo.deepExtend;\r\n var utils = kendo.drawing.util;\r\n var defined = utils.defined;\r\n var limitValue = utils.limitValue;\r\n var eventCoordinates = utils.eventCoordinates;\r\n var outerWidth = kendo._outerWidth;\r\n var outerHeight = kendo._outerHeight;\r\n\r\n var TOOLTIP_TEMPLATE = '
    ' +\r\n '
    ' +\r\n '
    ';\r\n var TOOLTIP_CLOSE_TEMPLATE = `
    ${kendo.ui.icon($(''), { icon: \"x\" })}
    `;\r\n\r\n var SurfaceTooltip = kendo.Class.extend({\r\n init: function(surface, options) {\r\n this.element = $(TOOLTIP_TEMPLATE);\r\n this.content = this.element.children(\".k-tooltip-content\");\r\n\r\n options = options || {};\r\n\r\n this.options = deepExtend({}, this.options, this._tooltipOptions(options));\r\n this.popupOptions = {\r\n appendTo: options.appendTo,\r\n animation: options.animation,\r\n copyAnchorStyles: false,\r\n collision: \"fit fit\"\r\n };\r\n\r\n this._openPopupHandler = this._openPopup.bind(this);\r\n\r\n this.surface = surface;\r\n this._bindEvents();\r\n },\r\n\r\n options: {\r\n position: \"top\",\r\n showOn: \"mouseenter\",\r\n offset: 7,\r\n autoHide: true,\r\n hideDelay: 0,\r\n showAfter: 100\r\n },\r\n\r\n _bindEvents: function() {\r\n this._showHandler = this._showEvent.bind(this);\r\n this._surfaceLeaveHandler = this._surfaceLeave.bind(this);\r\n this._mouseleaveHandler = this._mouseleave.bind(this);\r\n this._mousemoveHandler = this._mousemove.bind(this);\r\n\r\n this.surface.bind(\"click\", this._showHandler);\r\n this.surface.bind(\"mouseenter\", this._showHandler);\r\n this.surface.bind(\"mouseleave\", this._mouseleaveHandler);\r\n this.surface.bind(\"mousemove\", this._mousemoveHandler);\r\n\r\n this.surface.element.on(\"mouseleave\" + NS, this._surfaceLeaveHandler);\r\n\r\n this.element.on(\"click\" + NS, \".k-tooltip-button\", this._hideClick.bind(this));\r\n this.element.on(\"mouseleave\" + NS, this._tooltipLeave.bind(this));\r\n },\r\n\r\n getPopup: function() {\r\n if (!this.popup) {\r\n this.popup = new kendo.ui.Popup(this.element, this.popupOptions);\r\n }\r\n\r\n return this.popup;\r\n },\r\n\r\n destroy: function() {\r\n var popup = this.popup;\r\n\r\n this.surface.unbind(\"click\", this._showHandler);\r\n this.surface.unbind(\"mouseenter\", this._showHandler);\r\n this.surface.unbind(\"mouseleave\", this._mouseleaveHandler);\r\n this.surface.unbind(\"mousemove\", this._mousemoveHandler);\r\n\r\n this.surface.element.off(\"mouseleave\" + NS, this._surfaceLeaveHandler);\r\n this.element.off(\"click\" + NS);\r\n this.element.off(\"mouseleave\" + NS);\r\n\r\n if (popup) {\r\n popup.destroy();\r\n delete this.popup;\r\n }\r\n delete this.popupOptions;\r\n\r\n clearTimeout(this._timeout);\r\n\r\n delete this.element;\r\n delete this.content;\r\n delete this.surface;\r\n },\r\n\r\n _tooltipOptions: function(options) {\r\n options = options || {};\r\n return {\r\n position: options.position,\r\n showOn: options.showOn,\r\n offset: options.offset,\r\n autoHide: options.autoHide,\r\n width: options.width,\r\n height: options.height,\r\n content: options.content,\r\n shared: options.shared,\r\n hideDelay: options.hideDelay,\r\n showAfter: options.showAfter\r\n };\r\n },\r\n\r\n _tooltipShape: function(shape) {\r\n while (shape && !shape.options.tooltip) {\r\n shape = shape.parent;\r\n }\r\n return shape;\r\n },\r\n\r\n _updateContent: function(target, shape, options) {\r\n var content = options.content;\r\n if (kendo.isFunction(content)) {\r\n content = content({\r\n element: shape,\r\n target: target\r\n });\r\n }\r\n\r\n if (content) {\r\n this.content.html(content);\r\n return true;\r\n }\r\n },\r\n\r\n _position: function(shape, options, elementSize, event) {\r\n var position = options.position;\r\n var tooltipOffset = options.offset || 0;\r\n var surface = this.surface;\r\n var offset = surface._instance._elementOffset();\r\n var size = surface.getSize();\r\n var surfaceOffset = surface._instance._offset;\r\n var bbox = shape.bbox();\r\n var width = elementSize.width;\r\n var height = elementSize.height;\r\n var left = 0, top = 0;\r\n\r\n bbox.origin.translate(offset.left, offset.top);\r\n if (surfaceOffset) {\r\n bbox.origin.translate(-surfaceOffset.x, -surfaceOffset.y);\r\n }\r\n\r\n if (position == \"cursor\" && event) {\r\n var coord = eventCoordinates(event);\r\n left = coord.x - width / 2;\r\n top = coord.y - height - tooltipOffset;\r\n } else if (position == \"left\") {\r\n left = bbox.origin.x - width - tooltipOffset;\r\n top = bbox.center().y - height / 2;\r\n } else if (position == \"right\") {\r\n left = bbox.bottomRight().x + tooltipOffset;\r\n top = bbox.center().y - height / 2;\r\n } else if (position == \"bottom\") {\r\n left = bbox.center().x - width / 2;\r\n top = bbox.bottomRight().y + tooltipOffset;\r\n } else {\r\n left = bbox.center().x - width / 2;\r\n top = bbox.origin.y - height - tooltipOffset;\r\n }\r\n\r\n return {\r\n left: limitValue(left, offset.left, offset.left + size.width),\r\n top: limitValue(top, offset.top, offset.top + size.height)\r\n };\r\n },\r\n\r\n show: function(shape, options) {\r\n this._show(shape, shape, deepExtend({}, this.options, this._tooltipOptions(shape.options.tooltip), options));\r\n },\r\n\r\n hide: function() {\r\n var popup = this.popup;\r\n var current = this._current;\r\n\r\n delete this._current;\r\n clearTimeout(this._showTimeout);\r\n if (popup && popup.visible() && current &&\r\n !this.surface.trigger(\"tooltipClose\", { element: current.shape, target: current.target, popup: popup })) {\r\n popup.close();\r\n }\r\n },\r\n\r\n _hideClick: function(e) {\r\n e.preventDefault();\r\n this.hide();\r\n },\r\n\r\n _show: function(target, shape, options, event, delay) {\r\n var current = this._current;\r\n\r\n clearTimeout(this._timeout);\r\n\r\n if (current && ((current.shape === shape && options.shared) || current.target === target)) {\r\n return;\r\n }\r\n\r\n clearTimeout(this._showTimeout);\r\n\r\n var popup = this.getPopup();\r\n\r\n if (!this.surface.trigger(\"tooltipOpen\", { element: shape, target: target, popup: popup }) &&\r\n this._updateContent(target, shape, options)) {\r\n\r\n this._autoHide(options);\r\n var elementSize = this._measure(options);\r\n\r\n if (popup.visible()) {\r\n popup.close(true);\r\n }\r\n\r\n this._current = {\r\n options: options,\r\n elementSize: elementSize,\r\n shape: shape,\r\n target: target,\r\n position: this._position(options.shared ? shape : target, options, elementSize, event)\r\n };\r\n\r\n if (delay) {\r\n this._showTimeout = setTimeout(this._openPopupHandler, options.showAfter || 0);\r\n } else {\r\n this._openPopup();\r\n }\r\n }\r\n },\r\n\r\n _openPopup: function() {\r\n var current = this._current;\r\n var position = current.position;\r\n\r\n this.getPopup().open(position.left, position.top);\r\n },\r\n\r\n _autoHide: function(options) {\r\n if (options.autoHide && this._closeButton) {\r\n this.element.removeClass(\"k-tooltip-closable\");\r\n this._closeButton.remove();\r\n delete this._closeButton;\r\n }\r\n\r\n if (!options.autoHide && !this._closeButton) {\r\n this.element.addClass(\"k-tooltip-closable\");\r\n this._closeButton = $(TOOLTIP_CLOSE_TEMPLATE).appendTo(this.element);\r\n }\r\n },\r\n\r\n _showEvent: function(e) {\r\n var shape = this._tooltipShape(e.element);\r\n\r\n if (shape) {\r\n var options = deepExtend({}, this.options, this._tooltipOptions(shape.options.tooltip));\r\n\r\n if (options && options.showOn == e.type) {\r\n this._show(e.element, shape, options, e.originalEvent, true);\r\n }\r\n }\r\n },\r\n\r\n _measure: function(options) {\r\n this.element.css({\r\n width: defined(options.width) ? options.width : 'auto',\r\n height: defined(options.height) ? options.height : 'auto'\r\n });\r\n\r\n const clone = this.element.clone().appendTo(document.body).css({ visibility: 'hidden' });\r\n const width = outerWidth(clone);\r\n const height = outerHeight(clone);\r\n clone.remove();\r\n\r\n this.element.css({\r\n width: width,\r\n height: height\r\n });\r\n\r\n return {\r\n width: width,\r\n height: height\r\n };\r\n },\r\n\r\n _mouseleave: function(e) {\r\n if (this.popup && !this._popupRelatedTarget(e.originalEvent)) {\r\n var tooltip = this;\r\n var current = tooltip._current;\r\n\r\n if (current && current.options.autoHide) {\r\n tooltip._timeout = setTimeout(function() {\r\n clearTimeout(tooltip._showTimeout);\r\n tooltip.hide();\r\n }, current.options.hideDelay || 0);\r\n }\r\n }\r\n },\r\n\r\n _mousemove: function(e) {\r\n var current = this._current;\r\n if (current && e.element) {\r\n var options = current.options;\r\n if (options.position == \"cursor\") {\r\n var position = this._position(e.element, options, current.elementSize, e.originalEvent);\r\n current.position = position;\r\n this.getPopup().wrapper.css({ left: position.left, top: position.top });\r\n }\r\n }\r\n },\r\n\r\n _surfaceLeave: function(e) {\r\n if (this.popup && !this._popupRelatedTarget(e)) {\r\n clearTimeout(this._showTimeout);\r\n this.hide();\r\n }\r\n },\r\n\r\n _popupRelatedTarget: function(e) {\r\n return e.relatedTarget && $(e.relatedTarget).closest(this.popup.wrapper).length;\r\n },\r\n\r\n _tooltipLeave: function() {\r\n var tooltip = this;\r\n var current = tooltip._current;\r\n if (current && current.options.autoHide) {\r\n tooltip._timeout = setTimeout(function() {\r\n tooltip.hide();\r\n }, current.options.hideDelay || 0);\r\n }\r\n }\r\n });\r\n\r\n kendo.drawing.SurfaceTooltip = SurfaceTooltip;\r\n\r\n })(window.kendo.jQuery);\r\n\r\n (function($) {\r\n\r\n var kendo = window.kendo;\r\n var draw = kendo.drawing;\r\n var DrawingSurface = draw.Surface;\r\n var Widget = kendo.ui.Widget;\r\n var deepExtend = kendo.deepExtend;\r\n\r\n kendo.support.svg = DrawingSurface.support.svg;\r\n kendo.support.canvas = DrawingSurface.support.canvas;\r\n\r\n var Surface = Widget.extend({\r\n init: function(element, options) {\r\n Widget.fn.init.call(this, element, {});\r\n\r\n this.options = deepExtend({}, this.options, options);\r\n\r\n this._instance = DrawingSurface.create(this.element[0], options);\r\n if (this._instance.translate) {\r\n this.translate = translate;\r\n }\r\n\r\n this._triggerInstanceHandler = this._triggerInstanceEvent.bind(this);\r\n this._bindHandler(\"click\");\r\n this._bindHandler(\"mouseenter\");\r\n this._bindHandler(\"mouseleave\");\r\n this._bindHandler(\"mousemove\");\r\n\r\n this._enableTracking();\r\n },\r\n\r\n options: {\r\n name: \"Surface\",\r\n tooltip: {}\r\n },\r\n\r\n events: [\r\n \"click\",\r\n \"mouseenter\",\r\n \"mouseleave\",\r\n \"mousemove\",\r\n \"resize\",\r\n \"tooltipOpen\",\r\n \"tooltipClose\"\r\n ],\r\n\r\n _triggerInstanceEvent: function(e) {\r\n this.trigger(e.type, e);\r\n },\r\n\r\n _bindHandler: function(event) {\r\n this._instance.bind(event, this._triggerInstanceHandler);\r\n },\r\n\r\n draw: function(element) {\r\n this._instance.draw(element);\r\n },\r\n\r\n clear: function() {\r\n if (this._instance) {\r\n this._instance.clear();\r\n }\r\n this.hideTooltip();\r\n },\r\n\r\n destroy: function() {\r\n if (this._instance) {\r\n this._instance.destroy();\r\n delete this._instance;\r\n }\r\n\r\n if (this._tooltip) {\r\n this._tooltip.destroy();\r\n delete this._tooltip;\r\n }\r\n\r\n Widget.fn.destroy.call(this);\r\n },\r\n\r\n exportVisual: function() {\r\n return this._instance.exportVisual();\r\n },\r\n\r\n eventTarget: function(e) {\r\n return this._instance.eventTarget(e);\r\n },\r\n\r\n showTooltip: function(shape, options) {\r\n if (this._tooltip) {\r\n this._tooltip.show(shape, options);\r\n }\r\n },\r\n\r\n hideTooltip: function() {\r\n if (this._tooltip) {\r\n this._tooltip.hide();\r\n }\r\n },\r\n\r\n suspendTracking: function() {\r\n this._instance.suspendTracking();\r\n this.hideTooltip();\r\n },\r\n\r\n resumeTracking: function() {\r\n this._instance.resumeTracking();\r\n },\r\n\r\n getSize: function() {\r\n return {\r\n width: this.element.width(),\r\n height: this.element.height()\r\n };\r\n },\r\n\r\n setSize: function(size) {\r\n this.element.css({\r\n width: size.width,\r\n height: size.height\r\n });\r\n\r\n this._size = size;\r\n this._instance.currentSize(size);\r\n this._resize();\r\n },\r\n\r\n _resize: function() {\r\n this._instance.currentSize(this._size);\r\n this._instance._resize();\r\n },\r\n\r\n _enableTracking: function() {\r\n if (kendo.ui.Popup) {\r\n this._tooltip = new draw.SurfaceTooltip(this, this.options.tooltip || {});\r\n }\r\n }\r\n });\r\n\r\n kendo.ui.plugin(Surface);\r\n\r\n Surface.create = function(element, options) {\r\n return new Surface(element, options);\r\n };\r\n\r\n kendo.drawing.Surface = Surface;\r\n\r\n function translate(offset) {\r\n this._instance.translate(offset);\r\n }\r\n\r\n })(window.kendo.jQuery);\r\n\r\n (function($) {\r\n\r\n var kendo = window.kendo;\r\n var drawing = kendo.drawing;\r\n var drawDOM = drawing.drawDOM;\r\n\r\n drawing.drawDOM = function(element, options) {\r\n return drawDOM($(element)[0], options);\r\n };\r\n\r\n // Aliases used by spreadsheet/print.js\r\n drawing.drawDOM.drawText = drawing.drawText;\r\n drawing.drawDOM.getFontFaces = drawing.getFontFaces;\r\n\r\n })(window.kendo.jQuery);\r\n\r\n var __meta__$2p = {\r\n id: \"drawing\",\r\n name: \"Drawing API\",\r\n category: \"framework\",\r\n description: \"The Kendo UI low-level drawing API\",\r\n depends: [ \"core\", \"color\", \"popup\", \"icons\" ]\r\n };\r\n\r\n let __meta__$2o = {\r\n id: \"validator\",\r\n name: \"Validator\",\r\n category: \"web\",\r\n description: \"The Validator offers an easy way to do a client-side form validation.\",\r\n depends: [ \"core\" ]\r\n };\r\n\r\n\r\n (function($, undefined$1) {\r\n let kendo = window.kendo,\r\n Widget = kendo.ui.Widget,\r\n NS = \".kendoValidator\",\r\n INVALIDMSG = \"k-invalid-msg\",\r\n invalidMsgRegExp = new RegExp(INVALIDMSG,'i'),\r\n INVALIDINPUT = \"k-invalid\",\r\n VALIDINPUT = \"k-valid\",\r\n VALIDATIONSUMMARY = \"k-validation-summary\",\r\n INVALIDLABEL = \"k-text-error\",\r\n MESSAGEBOX = \"k-messagebox k-messagebox-error\",\r\n INPUTINNER = \".k-input-inner\",\r\n INPUTWRAPPER = \".k-input\",\r\n ARIAINVALID = \"aria-invalid\",\r\n ARIADESCRIBEDBY = \"aria-describedby\",\r\n emailRegExp = /^[a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/i,\r\n ALLOWED_URL_PROTOCOLS = [\"http:\", \"https:\", \"ftp:\", \"ftps:\"],\r\n INPUTSELECTOR = \":input:not(:button,[type=submit],[type=reset],[disabled],[readonly])\",\r\n CHECKBOXSELECTOR = \":checkbox:not([disabled],[readonly])\",\r\n NUMBERINPUTSELECTOR = \"[type=number],[type=range]\",\r\n BLUR = \"blur\",\r\n NAME = \"name\",\r\n FORM = \"form\",\r\n NOVALIDATE = \"novalidate\",\r\n //events\r\n VALIDATE = \"validate\",\r\n CHANGE = \"change\",\r\n VALIDATE_INPUT = \"validateInput\",\r\n\r\n patternMatcher = function(value, pattern) {\r\n if (typeof pattern === \"string\") {\r\n pattern = new RegExp('^(?:' + pattern + ')$');\r\n }\r\n return pattern.test(value);\r\n },\r\n matcher = function(input, selector, pattern) {\r\n var value = input.val();\r\n\r\n if (input.filter(selector).length && value !== \"\") {\r\n return patternMatcher(value, pattern);\r\n }\r\n return true;\r\n },\r\n hasAttribute = function(input, name) {\r\n if (input.length) {\r\n return input[0].attributes[name] != null;\r\n }\r\n return false;\r\n };\r\n\r\n if (!kendo.ui.validator) {\r\n kendo.ui.validator = { rules: {}, messages: {}, allowSubmit: $.noop, validateOnInit: $.noop };\r\n }\r\n\r\n function resolveRules(element) {\r\n var resolvers = kendo.ui.validator.ruleResolvers || {},\r\n rules = {},\r\n name;\r\n\r\n for (name in resolvers) {\r\n $.extend(true, rules, resolvers[name].resolve(element));\r\n }\r\n return rules;\r\n }\r\n\r\n function decode(value) {\r\n return value.replace(/&/g, '&')\r\n .replace(/"/g, '\"')\r\n .replace(/'/g, \"'\")\r\n .replace(/</g, '<')\r\n .replace(/>/g, '>');\r\n }\r\n\r\n function numberOfDecimalDigits(value) {\r\n value = (value + \"\").split('.');\r\n if (value.length > 1) {\r\n return value[1].length;\r\n }\r\n return 0;\r\n }\r\n\r\n function parseHtml(text) {\r\n if ($.parseHTML) {\r\n return $($.parseHTML(text));\r\n }\r\n return $(text);\r\n }\r\n\r\n function searchForMessageContainer(elements, fieldName) {\r\n var containers = $(),\r\n element,\r\n attr;\r\n\r\n for (var idx = 0, length = elements.length; idx < length; idx++) {\r\n element = elements[idx];\r\n if (invalidMsgRegExp.test(element.className)) {\r\n attr = element.getAttribute(kendo.attr(\"for\"));\r\n if (attr === fieldName) {\r\n containers = containers.add(element);\r\n }\r\n }\r\n }\r\n return containers;\r\n }\r\n\r\n function isLabelFor(label, element) {\r\n if (!label) {\r\n return false;\r\n }\r\n if (typeof label.nodeName !== 'string' || label.nodeName !== 'LABEL') {\r\n return false;\r\n }\r\n if (typeof label.getAttribute('for') !== 'string' || typeof element.getAttribute('id') !== 'string') {\r\n return false;\r\n }\r\n if (label.getAttribute('for') !== element.getAttribute('id')) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n var SUMMARYTEMPLATE = ({ errors }) => {\r\n let result = '
      ';\r\n for (var i = 0; i < errors.length; i += 1) {\r\n result += `
    • ${errors[i].message}
    • `;\r\n }\r\n\r\n result += '
    ';\r\n return result;\r\n };\r\n\r\n var Validator = Widget.extend({\r\n init: function(element, options) {\r\n var that = this,\r\n resolved = resolveRules(element),\r\n validateAttributeSelector = \"[\" + kendo.attr(\"validate\") + \"!=false]\";\r\n\r\n options = options || {};\r\n\r\n options.rules = $.extend({}, kendo.ui.validator.rules, resolved.rules, options.rules);\r\n options.messages = $.extend({}, kendo.ui.validator.messages, resolved.messages, options.messages);\r\n\r\n Widget.fn.init.call(that, element, options);\r\n\r\n that._errorTemplate = kendo.template(that.options.errorTemplate);\r\n that._summaryTemplate = kendo.template(that.options.validationSummary.template || SUMMARYTEMPLATE);\r\n\r\n if (that.element.is(FORM)) {\r\n that.element.attr(NOVALIDATE, NOVALIDATE);\r\n }\r\n\r\n that._inputSelector = INPUTSELECTOR + validateAttributeSelector;\r\n that._checkboxSelector = CHECKBOXSELECTOR + validateAttributeSelector;\r\n\r\n that._errors = {};\r\n that._attachEvents();\r\n that._isValidated = false;\r\n\r\n if (that._validateOnInit()) {\r\n that.validate();\r\n }\r\n },\r\n\r\n events: [ VALIDATE, CHANGE, VALIDATE_INPUT ],\r\n\r\n options: {\r\n name: \"Validator\",\r\n errorTemplate: ({ message }) => `${message}`,\r\n messages: {\r\n required: \"{0} is required\",\r\n pattern: \"{0} is not valid\",\r\n min: \"{0} should be greater than or equal to {1}\",\r\n max: \"{0} should be smaller than or equal to {1}\",\r\n step: \"{0} is not valid\",\r\n email: \"{0} is not valid email\",\r\n url: \"{0} is not valid URL\",\r\n date: \"{0} is not valid date\",\r\n dateCompare: \"End date should be greater than or equal to the start date\",\r\n captcha: \"The text you entered doesn't match the image.\"\r\n },\r\n rules: {\r\n required: function(input) {\r\n var noNameCheckbox = !input.attr(\"name\") && !input.is(\":checked\"),\r\n name = input.attr(\"name\"),\r\n quote = !!name && name.indexOf(\"'\") > -1 ? '\\\"' : \"'\",\r\n namedCheckbox = input.attr(\"name\") && !this.element.find(\"input[name=\" + quote + input.attr(\"name\") + quote + \"]:checked\").length,\r\n checkbox = input.filter(\"[type=checkbox]\").length && (noNameCheckbox || namedCheckbox),\r\n radio = input.filter(\"[type=radio]\").length && !this.element.find(\"input[name=\" + quote + input.attr(\"name\") + quote + \"]:checked\").length,\r\n value = input.val();\r\n\r\n return !(hasAttribute(input, \"required\") && (!value || value === \"\" || value.length === 0 || checkbox || radio));\r\n },\r\n pattern: function(input) {\r\n if (input.filter(\"[type=text],[type=email],[type=url],[type=tel],[type=search],[type=password]\").filter(\"[pattern]\").length && input.val() !== \"\") {\r\n return patternMatcher(input.val(), input.attr(\"pattern\"));\r\n }\r\n return true;\r\n },\r\n min: function(input) {\r\n if (input.filter(NUMBERINPUTSELECTOR + \",[\" + kendo.attr(\"type\") + \"=number]\").filter(\"[min]\").length && input.val() !== \"\") {\r\n var min = parseFloat(input.attr(\"min\")) || 0,\r\n val = kendo.parseFloat(input.val());\r\n\r\n return min <= val;\r\n }\r\n return true;\r\n },\r\n max: function(input) {\r\n if (input.filter(NUMBERINPUTSELECTOR + \",[\" + kendo.attr(\"type\") + \"=number]\").filter(\"[max]\").length && input.val() !== \"\") {\r\n var max = parseFloat(input.attr(\"max\")) || 0,\r\n val = kendo.parseFloat(input.val());\r\n\r\n return max >= val;\r\n }\r\n return true;\r\n },\r\n step: function(input) {\r\n if (input.filter(NUMBERINPUTSELECTOR + \",[\" + kendo.attr(\"type\") + \"=number]\").filter(\"[step]\").length && input.val() !== \"\") {\r\n var min = parseFloat(input.attr(\"min\")) || 0,\r\n step = kendo.parseFloat(input.attr(\"step\")) || 1,\r\n val = parseFloat(input.val()),\r\n decimals = numberOfDecimalDigits(step),\r\n raise;\r\n\r\n if (decimals) {\r\n raise = Math.pow(10, decimals);\r\n return ((Math.floor((val - min) * raise)) % (step * raise)) / Math.pow(100, decimals) === 0;\r\n }\r\n return ((val - min) % step) === 0;\r\n }\r\n return true;\r\n },\r\n email: function(input) {\r\n return matcher(input, \"[type=email],[\" + kendo.attr(\"type\") + \"=email]\", emailRegExp);\r\n },\r\n url: function(input) {\r\n if (input.filter(\"[type=url],[\" + kendo.attr(\"type\") + \"=url]\").length && input.val() !== \"\") {\r\n try {\r\n const url = new URL(input.val());\r\n return ALLOWED_URL_PROTOCOLS.includes(url.protocol);\r\n } catch {\r\n return false;\r\n }\r\n }\r\n return true;\r\n },\r\n date: function(input) {\r\n if (input.filter(\"[type^=date],[\" + kendo.attr(\"type\") + \"=date]\").length && input.val() !== \"\") {\r\n return kendo.parseDate(input.val(), input.attr(kendo.attr(\"format\"))) !== null;\r\n }\r\n return true;\r\n },\r\n captcha: function(input) {\r\n if (input.filter(\"[\" + kendo.attr(\"role\") + \"=captcha]\").length) {\r\n var that = this,\r\n captcha = kendo.widgetInstance(input),\r\n isValidated = function(isValid) {\r\n return typeof(isValid) !== 'undefined' && isValid !== null;\r\n };\r\n\r\n if (!input.data(\"captcha_validating\") && !isValidated(captcha.isValid()) && !!captcha.getCaptchaId()) {\r\n input.data(\"captcha_validating\", true);\r\n that._validating = true;\r\n captcha.validate().done(function() {\r\n that._validating = false;\r\n that._checkElement(input);\r\n }).fail(function(data) {\r\n that._validating = false;\r\n if (data.error && data.error === \"handler_not_defined\") {\r\n window.console.warn(\"Captcha's validationHandler is not defined! You should either define a proper validation endpoint or declare a callback function to ensure the required behavior.\");\r\n }\r\n });\r\n }\r\n\r\n if (isValidated(captcha.isValid())) {\r\n input.removeData(\"captcha_validating\");\r\n return captcha.isValid();\r\n }\r\n }\r\n return true;\r\n }\r\n },\r\n validateOnBlur: true,\r\n validationSummary: false\r\n },\r\n\r\n _allowSubmit: function() {\r\n return kendo.ui.validator.allowSubmit(this.element, this.errors());\r\n },\r\n\r\n _validateOnInit: function() {\r\n return kendo.ui.validator.validateOnInit(this.element);\r\n },\r\n\r\n destroy: function() {\r\n Widget.fn.destroy.call(this);\r\n\r\n this.element.off(NS);\r\n\r\n if (this.validationSummary) {\r\n this.validationSummary.off(NS);\r\n this.validationSummary = null;\r\n }\r\n },\r\n\r\n value: function() {\r\n if (!this._isValidated) {\r\n return false;\r\n }\r\n\r\n return this.errors().length === 0;\r\n },\r\n\r\n _submit: function(e) {\r\n if ((!this.validate() && !this._allowSubmit()) || this._validating) {\r\n e.stopPropagation();\r\n e.stopImmediatePropagation();\r\n e.preventDefault();\r\n return false;\r\n }\r\n return true;\r\n },\r\n\r\n _checkElement: function(element) {\r\n var state = this.value();\r\n\r\n this.validateInput(element);\r\n\r\n if (this.value() !== state) {\r\n this.trigger(CHANGE);\r\n }\r\n },\r\n\r\n _attachEvents: function() {\r\n var that = this;\r\n\r\n if (that.element.is(FORM)) {\r\n that.element.on(\"submit\" + NS, that._submit.bind(that));\r\n }\r\n\r\n if (that.options.validateOnBlur) {\r\n if (!that.element.is(INPUTSELECTOR)) {\r\n that.element.on(BLUR + NS, that._inputSelector, function() {\r\n that._checkElement($(this));\r\n });\r\n\r\n that.element.on(\"click\" + NS, that._checkboxSelector, function() {\r\n that._checkElement($(this));\r\n });\r\n } else {\r\n that.element.on(BLUR + NS, function() {\r\n that._checkElement(that.element);\r\n });\r\n\r\n if (that.element.is(CHECKBOXSELECTOR)) {\r\n that.element.on(\"click\" + NS, function() {\r\n that._checkElement(that.element);\r\n });\r\n }\r\n }\r\n }\r\n },\r\n\r\n validate: function() {\r\n var inputs;\r\n var idx;\r\n var result = false;\r\n var length;\r\n\r\n var isValid = this.value();\r\n\r\n this._errors = {};\r\n\r\n if (!this.element.is(INPUTSELECTOR)) {\r\n var invalid = false;\r\n\r\n inputs = this.element.find(this._inputSelector);\r\n\r\n for (idx = 0, length = inputs.length; idx < length; idx++) {\r\n if (!this.validateInput(inputs.eq(idx))) {\r\n invalid = true;\r\n }\r\n }\r\n\r\n result = !invalid;\r\n } else {\r\n result = this.validateInput(this.element);\r\n }\r\n\r\n if (this.options.validationSummary && !isValid) {\r\n this.showValidationSummary();\r\n }\r\n\r\n this.trigger(VALIDATE, { valid: result, errors: this.errors() });\r\n\r\n if (isValid !== result) {\r\n this.trigger(CHANGE);\r\n }\r\n\r\n return result;\r\n },\r\n\r\n validateInput: function(input) {\r\n input = $(input);\r\n\r\n\r\n this._isValidated = true;\r\n\r\n var that = this,\r\n template = that._errorTemplate,\r\n result = that._checkValidity(input),\r\n valid = result.valid,\r\n widgetInstance,\r\n className = \".\" + INVALIDMSG,\r\n fieldName = (input.attr(NAME) || \"\"),\r\n lbl = that._findMessageContainer(fieldName).add(input.next(className).filter(function() {\r\n var element = $(this);\r\n if (element.filter(\"[\" + kendo.attr(\"for\") + \"]\").length) {\r\n return element.attr(kendo.attr(\"for\")) === fieldName;\r\n }\r\n\r\n return true;\r\n\r\n })).addClass(\"k-hidden\"),\r\n messageText = !valid ? that._extractMessage(input, result.key) : \"\",\r\n messageLabel = !valid ? parseHtml(template({ message: decode(messageText), field: fieldName })) : \"\",\r\n wasValid = !input.attr(ARIAINVALID),\r\n isInputInner = input.is(INPUTINNER),\r\n inputWrapper = input.parent(INPUTWRAPPER);\r\n\r\n input.removeAttr(ARIAINVALID);\r\n\r\n if (input.hasClass(\"k-hidden\")) {\r\n widgetInstance = kendo.widgetInstance(input.closest(\".k-signature\"));\r\n }\r\n\r\n if (input.is(\"[type=radio]\")) {\r\n widgetInstance = kendo.widgetInstance(input.closest(\".k-radio-list\"));\r\n }\r\n\r\n if (input.is(\"[type=checkbox]\")) {\r\n widgetInstance = kendo.widgetInstance(input.closest(\".k-checkbox-list\"));\r\n }\r\n\r\n if (!valid && !input.data(\"captcha_validating\")) {\r\n that._errors[fieldName] = messageText;\r\n var lblId = lbl.attr('id');\r\n\r\n that._decorateMessageContainer(messageLabel, fieldName);\r\n\r\n\r\n if (lblId) {\r\n messageLabel.attr('id', lblId);\r\n }\r\n\r\n if (lbl.length !== 0) {\r\n lbl.replaceWith(messageLabel);\r\n } else {\r\n widgetInstance = widgetInstance || kendo.widgetInstance(input);\r\n var parentElement = input.parent().get(0);\r\n var nextElement = input.next().get(0);\r\n var prevElement = input.prev().get(0);\r\n\r\n // Get the instance of the RadioGroup which is not initialized on the input element\r\n if (!widgetInstance && input.is(\"[type=radio]\")) {\r\n widgetInstance = kendo.widgetInstance(input.closest(\".k-radio-list\"));\r\n }\r\n\r\n // Get the instance of the CheckBoxGroup which is not initialized on the input element\r\n if (!widgetInstance && input.is(\"[type=checkbox]\")) {\r\n widgetInstance = kendo.widgetInstance(input.closest(\".k-checkbox-list\"));\r\n }\r\n\r\n if (widgetInstance && widgetInstance.wrapper && (widgetInstance.element !== widgetInstance.wrapper || [\"Signature\", \"RadioGroup\", \"CheckBoxGroup\"].indexOf(widgetInstance.options.name) > -1)) {\r\n messageLabel.insertAfter(widgetInstance.wrapper);\r\n } else if (parentElement && parentElement.nodeName === \"LABEL\") {\r\n // Input inside label\r\n messageLabel.insertAfter(parentElement);\r\n } else if (nextElement && isLabelFor(nextElement, input[0])) {\r\n // Input before label\r\n messageLabel.insertAfter(nextElement);\r\n } else if (prevElement && isLabelFor(prevElement, input[0])) {\r\n // Input after label\r\n messageLabel.insertAfter(input);\r\n } else if (isInputInner && inputWrapper.length) {\r\n // Input after input wrapper\r\n messageLabel.insertAfter(inputWrapper);\r\n } else {\r\n messageLabel.insertAfter(input);\r\n }\r\n }\r\n\r\n messageLabel.removeClass(\"k-hidden\");\r\n\r\n input.attr(ARIAINVALID, true);\r\n } else {\r\n delete that._errors[fieldName];\r\n }\r\n\r\n if (wasValid !== valid) {\r\n this.trigger(VALIDATE_INPUT, { valid: valid, input: input, error: messageText, field: fieldName });\r\n }\r\n\r\n widgetInstance = (widgetInstance && widgetInstance.options.name == \"Signature\") ? widgetInstance : kendo.widgetInstance(input);\r\n if (!widgetInstance || !(widgetInstance._inputWrapper || widgetInstance.wrapper) || (input.is(\"[type=checkbox]\") || input.is(\"[type=radio]\"))) {\r\n input.toggleClass(INVALIDINPUT, !valid);\r\n input.toggleClass(VALIDINPUT, valid);\r\n }\r\n\r\n if (widgetInstance) {\r\n var inputWrap = widgetInstance._inputWrapper || widgetInstance.wrapper;\r\n var inputLabel = widgetInstance._inputLabel;\r\n\r\n if (inputWrap && !(input.is(\"[type=checkbox]\") || input.is(\"[type=radio]\"))) {\r\n inputWrap.toggleClass(INVALIDINPUT, !valid);\r\n inputWrap.toggleClass(VALIDINPUT, valid);\r\n }\r\n if (inputLabel) {\r\n inputLabel.toggleClass(INVALIDLABEL, !valid);\r\n }\r\n }\r\n\r\n if (wasValid !== valid) {\r\n var errorId = messageLabel ? messageLabel.attr(\"id\") : lbl.attr(\"id\");\r\n\r\n that._associateMessageContainer(input, errorId);\r\n\r\n if (this.options.validationSummary && this.options.validateOnBlur) {\r\n this.showValidationSummary();\r\n }\r\n }\r\n\r\n return valid;\r\n },\r\n\r\n hideMessages: function() {\r\n var that = this,\r\n className = \".\" + INVALIDMSG,\r\n element = that.element;\r\n\r\n that._disassociateMessageContainers();\r\n\r\n if (!element.is(INPUTSELECTOR)) {\r\n element.find(className).addClass(\"k-hidden\");\r\n } else {\r\n element.next(className).addClass(\"k-hidden\");\r\n }\r\n },\r\n\r\n reset: function() {\r\n var that = this,\r\n inputs = that.element.find(\".\" + INVALIDINPUT),\r\n labels = that.element.find(\".\" + INVALIDLABEL);\r\n\r\n that._errors = [];\r\n\r\n that.hideMessages();\r\n\r\n that.hideValidationSummary();\r\n\r\n inputs.removeAttr(ARIAINVALID);\r\n inputs.removeClass(INVALIDINPUT);\r\n labels.removeClass(INVALIDLABEL);\r\n },\r\n\r\n _findMessageContainer: function(fieldName) {\r\n var locators = kendo.ui.validator.messageLocators,\r\n name,\r\n containers = $();\r\n\r\n for (var idx = 0, length = this.element.length; idx < length; idx++) {\r\n containers = containers.add(searchForMessageContainer(this.element[idx].getElementsByTagName(\"*\"), fieldName));\r\n }\r\n\r\n for (name in locators) {\r\n containers = containers.add(locators[name].locate(this.element, fieldName));\r\n }\r\n\r\n return containers;\r\n },\r\n\r\n _decorateMessageContainer: function(container, fieldName) {\r\n var locators = kendo.ui.validator.messageLocators,\r\n name;\r\n\r\n container.addClass(INVALIDMSG)\r\n .attr(kendo.attr(\"for\"), fieldName || \"\");\r\n\r\n if (!container.attr(\"id\")) {\r\n container.attr(\"id\", fieldName + \"-error\");\r\n }\r\n\r\n for (name in locators) {\r\n locators[name].decorate(container, fieldName);\r\n }\r\n },\r\n\r\n _extractMessage: function(input, ruleKey) {\r\n var that = this,\r\n customMessage = that.options.messages[ruleKey],\r\n fieldName = input.attr(NAME),\r\n nonDefaultMessage;\r\n\r\n if (!kendo.ui.Validator.prototype.options.messages[ruleKey]) {\r\n nonDefaultMessage = kendo.isFunction(customMessage) ? customMessage(input) : customMessage;\r\n }\r\n\r\n customMessage = kendo.isFunction(customMessage) ? customMessage(input) : customMessage;\r\n\r\n return kendo.format(input.attr(kendo.attr(ruleKey + \"-msg\")) || input.attr(\"validationMessage\") || nonDefaultMessage || customMessage || input.attr(\"title\") || \"\",\r\n fieldName,\r\n input.attr(ruleKey) || input.attr(kendo.attr(ruleKey)));\r\n },\r\n\r\n _checkValidity: function(input) {\r\n var rules = this.options.rules,\r\n rule;\r\n\r\n for (rule in rules) {\r\n if (!rules[rule].call(this, input)) {\r\n return { valid: false, key: rule };\r\n }\r\n }\r\n\r\n return { valid: true };\r\n },\r\n\r\n errors: function() {\r\n var results = [],\r\n errors = this._errors,\r\n error;\r\n\r\n for (error in errors) {\r\n results.push(errors[error]);\r\n }\r\n return results;\r\n },\r\n\r\n setOptions: function(options) {\r\n if (options.validationSummary) {\r\n this.hideValidationSummary();\r\n }\r\n\r\n kendo.deepExtend(this.options, options);\r\n\r\n this.destroy();\r\n\r\n this.init(this.element, this.options);\r\n\r\n this._setEvents(this.options);\r\n },\r\n\r\n _getInputNames: function() {\r\n var that = this,\r\n inputs = that.element.find(that._inputSelector),\r\n sorted = [];\r\n\r\n for (var idx = 0, length = inputs.length; idx < length; idx++) {\r\n var input = $(inputs[idx]);\r\n\r\n if (hasAttribute(input, NAME)) {\r\n // Add current name if:\r\n // - not present so far;\r\n // - present but not part of CheckBoxGroup or RadioGroup.\r\n if (sorted.indexOf(input.attr(NAME)) === -1 ||\r\n (input.closest(\".k-checkbox-list\").length === 0 &&\r\n input.closest(\".k-radio-list\").length === 0)) {\r\n sorted.push(input.attr(NAME));\r\n }\r\n }\r\n }\r\n\r\n return sorted;\r\n },\r\n\r\n _associateMessageContainer: function(input, errorId) {\r\n var nextFocusable = kendo.getWidgetFocusableElement(input);\r\n\r\n if (!nextFocusable || !errorId) {\r\n return;\r\n }\r\n\r\n kendo.toggleAttribute(nextFocusable, ARIADESCRIBEDBY, errorId);\r\n },\r\n\r\n _disassociateMessageContainers: function() {\r\n var that = this,\r\n inputs = that.element.find(\".\" + INVALIDINPUT).addBack(),\r\n input, errorId;\r\n\r\n for (var i = 0; i < inputs.length; i += 1) {\r\n input = $(inputs[i]);\r\n\r\n if (input.is(\"input\")) {\r\n errorId = that._findMessageContainer(input.attr(NAME))\r\n .add(input.next(\".\" + INVALIDMSG))\r\n .attr(\"id\");\r\n\r\n that._associateMessageContainer(input, errorId);\r\n }\r\n }\r\n },\r\n\r\n _errorsByName: function() {\r\n var that = this,\r\n inputNames = that._getInputNames(),\r\n sorted = [];\r\n\r\n for (var i = 0; i < inputNames.length; i += 1) {\r\n var name = inputNames[i];\r\n\r\n if (that._errors[name]) {\r\n sorted.push({\r\n field: name,\r\n message: that._errors[name]\r\n });\r\n }\r\n }\r\n\r\n return sorted;\r\n },\r\n\r\n _renderSummary: function() {\r\n var that = this,\r\n options = this.options.validationSummary,\r\n element = this.element,\r\n prevElement = element.prev(),\r\n container;\r\n\r\n if (options.container) {\r\n container = $(options.container);\r\n } else if (prevElement && prevElement.hasClass(VALIDATIONSUMMARY)) {\r\n container = prevElement;\r\n } else {\r\n container = $(\"
    \").insertBefore(that.element);\r\n }\r\n\r\n container.addClass([VALIDATIONSUMMARY, MESSAGEBOX].join(\" \"));\r\n container.attr(\"role\", \"alert\");\r\n\r\n container.on(\"click\" + NS, that._summaryClick.bind(that));\r\n\r\n return container;\r\n },\r\n\r\n _summaryClick: function(e) {\r\n e.preventDefault();\r\n\r\n var that = this,\r\n link = $(e.target),\r\n target = that.element.find(\"[name='\" + link.data(\"field\") + \"']\"),\r\n nextFocusable;\r\n\r\n if (!target.length) {\r\n return;\r\n }\r\n\r\n nextFocusable = kendo.getWidgetFocusableElement(target);\r\n\r\n if (nextFocusable) {\r\n nextFocusable.trigger(\"focus\");\r\n }\r\n },\r\n\r\n showValidationSummary: function() {\r\n var that = this,\r\n summary = that.validationSummary,\r\n errors = that._errorsByName(),\r\n errorsList;\r\n\r\n if (!summary) {\r\n summary = that.validationSummary = that._renderSummary();\r\n }\r\n\r\n errorsList = parseHtml(that._summaryTemplate({\r\n errors: errors\r\n }));\r\n\r\n summary.html(errorsList);\r\n\r\n summary.toggleClass(\"k-hidden\", !errors.length);\r\n },\r\n\r\n hideValidationSummary: function() {\r\n var that = this,\r\n summary = that.validationSummary;\r\n\r\n if (!summary) {\r\n return;\r\n }\r\n\r\n summary.addClass(\"k-hidden\");\r\n }\r\n });\r\n\r\n kendo.ui.plugin(Validator);\r\n })(window.kendo.jQuery);\r\n var kendo$2o = kendo;\r\n\r\n var __meta__$2n = {\r\n id: \"userevents\",\r\n name: \"User Events\",\r\n category: \"framework\",\r\n depends: [ \"core\" ],\r\n hidden: true\r\n };\r\n\r\n (function($, undefined$1) {\r\n var kendo = window.kendo,\r\n support = kendo.support,\r\n Class = kendo.Class,\r\n Observable = kendo.Observable,\r\n now = Date.now,\r\n extend = $.extend,\r\n OS = support.mobileOS,\r\n invalidZeroEvents = OS && OS.android,\r\n DEFAULT_MIN_HOLD = 800,\r\n CLICK_DELAY = 300,\r\n DEFAULT_THRESHOLD = support.browser.msie ? 5 : 0, // WP8 and W8 are very sensitive and always report move.\r\n\r\n // UserEvents events\r\n PRESS = \"press\",\r\n HOLD = \"hold\",\r\n SELECT = \"select\",\r\n START = \"start\",\r\n MOVE = \"move\",\r\n END = \"end\",\r\n CANCEL = \"cancel\",\r\n TAP = \"tap\",\r\n DOUBLETAP = \"doubleTap\",\r\n RELEASE = \"release\",\r\n GESTURESTART = \"gesturestart\",\r\n GESTURECHANGE = \"gesturechange\",\r\n GESTUREEND = \"gestureend\",\r\n GESTURETAP = \"gesturetap\";\r\n\r\n var THRESHOLD = {\r\n \"api\": 0,\r\n \"touch\": 0,\r\n \"mouse\": 9,\r\n \"pointer\": 9\r\n };\r\n\r\n var ENABLE_GLOBAL_SURFACE = (!support.touch || support.mouseAndTouchPresent);\r\n\r\n function touchDelta(touch1, touch2) {\r\n var x1 = touch1.x.location,\r\n y1 = touch1.y.location,\r\n x2 = touch2.x.location,\r\n y2 = touch2.y.location,\r\n dx = x1 - x2,\r\n dy = y1 - y2;\r\n\r\n return {\r\n center: {\r\n x: (x1 + x2) / 2,\r\n y: (y1 + y2) / 2\r\n },\r\n\r\n distance: Math.sqrt(dx * dx + dy * dy)\r\n };\r\n }\r\n\r\n function getTouches(e) {\r\n var touches = [],\r\n originalEvent = e.originalEvent,\r\n currentTarget = e.currentTarget,\r\n idx = 0, length,\r\n changedTouches,\r\n touch;\r\n\r\n if (e.api) {\r\n touches.push({\r\n id: 2, // hardcoded ID for API call;\r\n event: e,\r\n target: e.target,\r\n currentTarget: e.target,\r\n location: e,\r\n type: \"api\"\r\n });\r\n }\r\n else if (e.type.match(/touch/)) {\r\n changedTouches = originalEvent ? originalEvent.changedTouches : [];\r\n for (length = changedTouches.length; idx < length; idx ++) {\r\n touch = changedTouches[idx];\r\n touches.push({\r\n location: touch,\r\n event: e,\r\n target: touch.target,\r\n currentTarget: currentTarget,\r\n id: touch.identifier,\r\n type: \"touch\"\r\n });\r\n }\r\n }\r\n else if (support.pointers || support.msPointers) {\r\n touches.push({\r\n location: originalEvent,\r\n event: e,\r\n target: e.target,\r\n currentTarget: currentTarget,\r\n id: originalEvent.pointerId,\r\n type: \"pointer\"\r\n });\r\n } else {\r\n touches.push({\r\n id: 1, // hardcoded ID for mouse event;\r\n event: e,\r\n target: e.target,\r\n currentTarget: currentTarget,\r\n location: e,\r\n type: \"mouse\"\r\n });\r\n }\r\n\r\n return touches;\r\n }\r\n\r\n var TouchAxis = Class.extend({\r\n init: function(axis, location) {\r\n var that = this;\r\n\r\n that.axis = axis;\r\n\r\n that._updateLocationData(location);\r\n\r\n that.startLocation = that.location;\r\n that.velocity = that.delta = 0;\r\n that.timeStamp = now();\r\n },\r\n\r\n move: function(location) {\r\n var that = this,\r\n offset = location[\"page\" + that.axis],\r\n timeStamp = now(),\r\n timeDelta = (timeStamp - that.timeStamp) || 1; // Firing manually events in tests can make this 0;\r\n\r\n if (!offset && invalidZeroEvents) {\r\n return;\r\n }\r\n\r\n that.delta = offset - that.location;\r\n\r\n that._updateLocationData(location);\r\n\r\n that.initialDelta = offset - that.startLocation;\r\n that.velocity = that.delta / timeDelta;\r\n that.timeStamp = timeStamp;\r\n },\r\n\r\n _updateLocationData: function(location) {\r\n var that = this, axis = that.axis;\r\n\r\n that.location = location[\"page\" + axis];\r\n that.client = location[\"client\" + axis];\r\n that.screen = location[\"screen\" + axis];\r\n }\r\n });\r\n\r\n var Touch = Class.extend({\r\n init: function(userEvents, target, touchInfo) {\r\n extend(this, {\r\n x: new TouchAxis(\"X\", touchInfo.location),\r\n y: new TouchAxis(\"Y\", touchInfo.location),\r\n type: touchInfo.type,\r\n useClickAsTap: userEvents.useClickAsTap,\r\n threshold: userEvents.threshold || THRESHOLD[touchInfo.type],\r\n userEvents: userEvents,\r\n target: target,\r\n currentTarget: touchInfo.currentTarget,\r\n initialTouch: touchInfo.target,\r\n id: touchInfo.id,\r\n pressEvent: touchInfo,\r\n _clicks: userEvents._clicks,\r\n supportDoubleTap: userEvents.supportDoubleTap,\r\n _moved: false,\r\n _finished: false\r\n });\r\n },\r\n\r\n press: function() {\r\n this._holdTimeout = setTimeout(this._hold.bind(this), this.userEvents.minHold);\r\n this._trigger(PRESS, this.pressEvent);\r\n },\r\n\r\n _tap: function(touchInfo) {\r\n var that = this;\r\n that.userEvents._clicks++;\r\n if (that.userEvents._clicks == 1) {\r\n that._clickTimeout = setTimeout(function() {\r\n if (that.userEvents._clicks == 1) {\r\n that._trigger(TAP, touchInfo);\r\n }\r\n else {\r\n that._trigger(DOUBLETAP, touchInfo);\r\n }\r\n that.userEvents._clicks = 0;\r\n }, CLICK_DELAY);\r\n }\r\n },\r\n\r\n _hold: function() {\r\n this._trigger(HOLD, this.pressEvent);\r\n },\r\n\r\n move: function(touchInfo) {\r\n var that = this;\r\n var preventMove = touchInfo.type !== \"api\" && that.userEvents._shouldNotMove;\r\n\r\n if (that._finished || preventMove) { return; }\r\n\r\n that.x.move(touchInfo.location);\r\n that.y.move(touchInfo.location);\r\n\r\n if (!that._moved) {\r\n if (that._withinIgnoreThreshold()) {\r\n return;\r\n }\r\n\r\n if (!UserEvents.current || UserEvents.current === that.userEvents) {\r\n that._start(touchInfo);\r\n } else {\r\n return that.dispose();\r\n }\r\n }\r\n\r\n // Event handlers may cancel the drag in the START event handler, hence the double check for pressed.\r\n if (!that._finished) {\r\n that._trigger(MOVE, touchInfo);\r\n }\r\n },\r\n\r\n end: function(touchInfo) {\r\n this.endTime = now();\r\n\r\n if (this._finished) { return; }\r\n\r\n // Mark the object as finished if there are blocking operations in the event handlers (alert/confirm)\r\n this._finished = true;\r\n\r\n this._trigger(RELEASE, touchInfo); // Release should be fired before TAP (as click is after mouseup/touchend)\r\n\r\n if (this._moved) {\r\n this._trigger(END, touchInfo);\r\n } else {\r\n if (!this.useClickAsTap) {\r\n if (this.supportDoubleTap) {\r\n this._tap(touchInfo);\r\n }\r\n else {\r\n this._trigger(TAP, touchInfo);\r\n }\r\n }\r\n }\r\n\r\n clearTimeout(this._holdTimeout);\r\n\r\n this.dispose();\r\n },\r\n\r\n dispose: function() {\r\n var userEvents = this.userEvents,\r\n activeTouches = userEvents.touches;\r\n\r\n this._finished = true;\r\n this.pressEvent = null;\r\n clearTimeout(this._holdTimeout);\r\n\r\n activeTouches.splice($.inArray(this, activeTouches), 1);\r\n },\r\n\r\n skip: function() {\r\n this.dispose();\r\n },\r\n\r\n cancel: function() {\r\n this.dispose();\r\n },\r\n\r\n isMoved: function() {\r\n return this._moved;\r\n },\r\n\r\n _start: function(touchInfo) {\r\n clearTimeout(this._holdTimeout);\r\n\r\n this.startTime = now();\r\n this._moved = true;\r\n this._trigger(START, touchInfo);\r\n },\r\n\r\n _trigger: function(name, touchInfo) {\r\n var that = this,\r\n jQueryEvent = touchInfo.event,\r\n data = {\r\n touch: that,\r\n x: that.x,\r\n y: that.y,\r\n target: that.target,\r\n event: jQueryEvent\r\n };\r\n\r\n if (that.userEvents.notify(name, data)) {\r\n jQueryEvent.preventDefault();\r\n }\r\n },\r\n\r\n _withinIgnoreThreshold: function() {\r\n var xDelta = this.x.initialDelta,\r\n yDelta = this.y.initialDelta;\r\n\r\n return Math.sqrt(xDelta * xDelta + yDelta * yDelta) <= this.threshold;\r\n }\r\n });\r\n\r\n function withEachUpEvent(callback) {\r\n var downEvents = kendo.eventMap.up.split(\" \"),\r\n idx = 0,\r\n length = downEvents.length;\r\n\r\n for (; idx < length; idx ++) {\r\n callback(downEvents[idx]);\r\n }\r\n }\r\n\r\n var UserEvents = Observable.extend({\r\n init: function(element, options) {\r\n var that = this,\r\n filter,\r\n ns = kendo.guid();\r\n\r\n options = options || {};\r\n filter = that.filter = options.filter;\r\n that.threshold = options.threshold || DEFAULT_THRESHOLD;\r\n that.minHold = options.minHold || DEFAULT_MIN_HOLD;\r\n that.touches = [];\r\n that._maxTouches = options.multiTouch ? 2 : 1;\r\n that.allowSelection = options.allowSelection;\r\n that.captureUpIfMoved = options.captureUpIfMoved;\r\n that.useClickAsTap = !options.fastTap && !support.delayedClick();\r\n that.eventNS = ns;\r\n that._clicks = 0;\r\n that.supportDoubleTap = options.supportDoubleTap;\r\n\r\n element = $(element).handler(that);\r\n Observable.fn.init.call(that);\r\n\r\n extend(that, {\r\n element: element,\r\n // the touch events lock to the element anyway, so no need for the global setting\r\n surface: options.global && ENABLE_GLOBAL_SURFACE ? $(element[0].ownerDocument.documentElement) : $(options.surface || element),\r\n stopPropagation: options.stopPropagation,\r\n pressed: false\r\n });\r\n\r\n that.surface.handler(that)\r\n .on(kendo.applyEventMap(\"move\", ns), \"_move\")\r\n .on(kendo.applyEventMap(\"up cancel\", ns), \"_end\");\r\n\r\n element.on(kendo.applyEventMap(\"down\", ns), filter, \"_start\");\r\n\r\n if (that.useClickAsTap) {\r\n element.on(kendo.applyEventMap(\"click\", ns), filter, \"_click\");\r\n }\r\n\r\n if (support.pointers || support.msPointers) {\r\n //touch-action:none will not work for IE10\r\n if (support.browser.version < 11) {\r\n var defaultAction = \"pinch-zoom double-tap-zoom\";\r\n element.css(\"-ms-touch-action\", options.touchAction && options.touchAction != \"none\" ? defaultAction + \" \" + options.touchAction : defaultAction);\r\n } else {\r\n element.css(\"touch-action\", options.touchAction || \"none\");\r\n }\r\n }\r\n\r\n if (options.preventDragEvent) {\r\n element.on(kendo.applyEventMap(\"dragstart\", ns), kendo.preventDefault);\r\n }\r\n\r\n element.on(kendo.applyEventMap(\"mousedown\", ns), filter, { root: element }, \"_select\");\r\n\r\n if (that.captureUpIfMoved && support.eventCapture) {\r\n var surfaceElement = that.surface[0],\r\n preventIfMovingProxy = that.preventIfMoving.bind(that);\r\n\r\n withEachUpEvent(function(eventName) {\r\n surfaceElement.addEventListener(eventName, preventIfMovingProxy, true);\r\n });\r\n }\r\n\r\n that.bind([\r\n PRESS,\r\n HOLD,\r\n TAP,\r\n DOUBLETAP,\r\n START,\r\n MOVE,\r\n END,\r\n RELEASE,\r\n CANCEL,\r\n GESTURESTART,\r\n GESTURECHANGE,\r\n GESTUREEND,\r\n GESTURETAP,\r\n SELECT\r\n ], options);\r\n },\r\n\r\n preventIfMoving: function(e) {\r\n if (this._isMoved()) {\r\n e.preventDefault();\r\n }\r\n },\r\n\r\n destroy: function() {\r\n var that = this;\r\n\r\n if (that._destroyed) {\r\n return;\r\n }\r\n\r\n that._destroyed = true;\r\n\r\n if (that.captureUpIfMoved && support.eventCapture) {\r\n var surfaceElement = that.surface[0];\r\n withEachUpEvent(function(eventName) {\r\n surfaceElement.removeEventListener(eventName, that.preventIfMoving);\r\n });\r\n }\r\n\r\n that.element.kendoDestroy(that.eventNS);\r\n that.surface.kendoDestroy(that.eventNS);\r\n that.element.removeData(\"handler\");\r\n that.surface.removeData(\"handler\");\r\n that._disposeAll();\r\n\r\n that.unbind();\r\n delete that.surface;\r\n delete that.element;\r\n delete that.currentTarget;\r\n },\r\n\r\n capture: function() {\r\n UserEvents.current = this;\r\n },\r\n\r\n cancel: function() {\r\n this._disposeAll();\r\n this.trigger(CANCEL);\r\n },\r\n\r\n notify: function(eventName, data) {\r\n var that = this,\r\n touches = that.touches;\r\n\r\n if (this._isMultiTouch()) {\r\n switch (eventName) {\r\n case MOVE:\r\n eventName = GESTURECHANGE;\r\n break;\r\n case END:\r\n eventName = GESTUREEND;\r\n break;\r\n case TAP:\r\n eventName = GESTURETAP;\r\n break;\r\n }\r\n\r\n extend(data, { touches: touches }, touchDelta(touches[0], touches[1]));\r\n }\r\n\r\n return this.trigger(eventName, extend(data, { type: eventName }));\r\n },\r\n\r\n // API\r\n press: function(x, y, target) {\r\n this._apiCall(\"_start\", x, y, target);\r\n },\r\n\r\n move: function(x, y) {\r\n this._apiCall(\"_move\", x, y);\r\n },\r\n\r\n end: function(x, y) {\r\n this._apiCall(\"_end\", x, y);\r\n },\r\n\r\n _isMultiTouch: function() {\r\n return this.touches.length > 1;\r\n },\r\n\r\n _maxTouchesReached: function() {\r\n return this.touches.length >= this._maxTouches;\r\n },\r\n\r\n _disposeAll: function() {\r\n var touches = this.touches;\r\n while (touches.length > 0) {\r\n touches.pop().dispose();\r\n }\r\n },\r\n\r\n _isMoved: function() {\r\n return $.grep(this.touches, function(touch) {\r\n return touch.isMoved();\r\n }).length;\r\n },\r\n\r\n _select: function(e) {\r\n if (!this.allowSelection || this.trigger(SELECT, { event: e })) {\r\n e.preventDefault();\r\n }\r\n },\r\n\r\n _start: function(e) {\r\n var that = this,\r\n idx = 0,\r\n filter = that.filter,\r\n target,\r\n touches = getTouches(e),\r\n length = touches.length,\r\n touch,\r\n which = e.which;\r\n\r\n if ((which && which > 1) || (that._maxTouchesReached())) {\r\n return;\r\n }\r\n\r\n UserEvents.current = null;\r\n\r\n that.currentTarget = e.currentTarget;\r\n\r\n if (that.stopPropagation) {\r\n e.stopPropagation();\r\n }\r\n\r\n for (; idx < length; idx ++) {\r\n if (that._maxTouchesReached()) {\r\n break;\r\n }\r\n\r\n touch = touches[idx];\r\n\r\n if (filter) {\r\n target = $(touch.currentTarget); // target.is(filter) ? target : target.closest(filter, that.element);\r\n } else {\r\n target = that.element;\r\n }\r\n\r\n if (!target.length) {\r\n continue;\r\n }\r\n\r\n touch = new Touch(that, target, touch);\r\n that.touches.push(touch);\r\n touch.press();\r\n\r\n if (that._isMultiTouch()) {\r\n that.notify(\"gesturestart\", {});\r\n }\r\n }\r\n },\r\n\r\n _move: function(e) {\r\n this._eachTouch(\"move\", e);\r\n },\r\n\r\n _end: function(e) {\r\n this._eachTouch(\"end\", e);\r\n },\r\n\r\n _click: function(e) {\r\n var data = {\r\n touch: {\r\n initialTouch: e.target,\r\n target: $(e.currentTarget),\r\n endTime: now(),\r\n x: {\r\n location: e.pageX,\r\n client: e.clientX\r\n },\r\n y: {\r\n location: e.pageY,\r\n client: e.clientY\r\n }\r\n },\r\n x: e.pageX,\r\n y: e.pageY,\r\n target: $(e.currentTarget),\r\n event: e,\r\n type: \"tap\"\r\n };\r\n\r\n if (this.trigger(\"tap\", data)) {\r\n e.preventDefault();\r\n }\r\n },\r\n\r\n _eachTouch: function(methodName, e) {\r\n var that = this,\r\n dict = {},\r\n touches = getTouches(e),\r\n activeTouches = that.touches,\r\n idx,\r\n touch,\r\n touchInfo,\r\n matchingTouch;\r\n\r\n for (idx = 0; idx < activeTouches.length; idx ++) {\r\n touch = activeTouches[idx];\r\n dict[touch.id] = touch;\r\n }\r\n\r\n for (idx = 0; idx < touches.length; idx ++) {\r\n touchInfo = touches[idx];\r\n matchingTouch = dict[touchInfo.id];\r\n\r\n if (matchingTouch) {\r\n matchingTouch[methodName](touchInfo);\r\n }\r\n }\r\n },\r\n\r\n _apiCall: function(type, x, y, target) {\r\n this[type]({\r\n api: true,\r\n pageX: x,\r\n pageY: y,\r\n clientX: x,\r\n clientY: y,\r\n target: $(target || this.element)[0],\r\n stopPropagation: $.noop,\r\n preventDefault: $.noop\r\n });\r\n }\r\n });\r\n\r\n var ClickMoveClick = Observable.extend({\r\n init: function(element, options) {\r\n var that = this,\r\n filter,\r\n ns = kendo.guid();\r\n\r\n options = options || {};\r\n filter = that.filter = options.filter;\r\n that.touches = [];\r\n that._maxTouches = 1;\r\n that.eventNS = ns;\r\n that._downStarted = 0;\r\n\r\n element = $(element).handler(that);\r\n Observable.fn.init.call(that);\r\n\r\n extend(that, {\r\n element: element,\r\n // the touch events lock to the element anyway, so no need for the global setting\r\n surface: options.global && ENABLE_GLOBAL_SURFACE ? $(element[0].ownerDocument.documentElement) : $(options.surface || element),\r\n stopPropagation: options.stopPropagation,\r\n pressed: false\r\n });\r\n\r\n that.surface.handler(that)\r\n .on(kendo.applyEventMap(\"move\", ns), \"_move\")\r\n .on(kendo.applyEventMap(\"cancel up\", ns), \"cancel\");\r\n\r\n element.on(kendo.applyEventMap(\"down\", ns), filter, \"_down\")\r\n .on(kendo.applyEventMap(\"up\", ns), filter, \"_up\");\r\n\r\n that.bind([\r\n START,\r\n MOVE,\r\n END,\r\n HOLD,\r\n CANCEL,\r\n SELECT\r\n ], options);\r\n },\r\n\r\n _down: function(e) {\r\n if (e.which && e.which > 1) {\r\n this.cancel();\r\n } else {\r\n this._downStarted = new Date().getTime();\r\n this._downTarget = e.target;\r\n }\r\n },\r\n\r\n _up: function(e) {\r\n var currentMilestone = new Date().getTime(),\r\n currentTarget = e.target;\r\n\r\n if ((!e.which || e.which === 1) &&\r\n currentMilestone < this._downStarted + CLICK_DELAY &&\r\n currentTarget === this._downTarget) {\r\n if (this.touches && this.touches.length > 0) {\r\n this._end(e);\r\n } else {\r\n this._start(e);\r\n }\r\n\r\n this._preventCancel = true;\r\n } else {\r\n this.cancel();\r\n }\r\n\r\n this._downStarted = 0;\r\n this._downTarget = null;\r\n },\r\n\r\n destroy: function() {\r\n var that = this;\r\n\r\n if (that._destroyed) {\r\n return;\r\n }\r\n\r\n that._destroyed = true;\r\n\r\n that.element.kendoDestroy(that.eventNS);\r\n that.surface.kendoDestroy(that.eventNS);\r\n that.element.removeData(\"handler\");\r\n that.surface.removeData(\"handler\");\r\n that._disposeAll();\r\n\r\n that.unbind();\r\n delete that.surface;\r\n delete that.element;\r\n delete that.currentTarget;\r\n },\r\n\r\n capture: function() {\r\n ClickMoveClick.current = this;\r\n },\r\n\r\n cancel: function() {\r\n if (this._preventCancel) {\r\n this._preventCancel = false;\r\n return;\r\n } else if (this.touches && this.touches.length > 0) {\r\n this._disposeAll();\r\n this.trigger(CANCEL);\r\n }\r\n },\r\n\r\n notify: function(eventName, data) {\r\n data.clickMoveClick = true;\r\n return this.trigger(eventName, extend(data, { type: eventName }));\r\n },\r\n\r\n _maxTouchesReached: function() {\r\n return this.touches.length >= this._maxTouches;\r\n },\r\n\r\n _disposeAll: function() {\r\n var touches = this.touches;\r\n\r\n while (touches.length > 0) {\r\n touches.pop().dispose();\r\n }\r\n },\r\n\r\n _start: function(e) {\r\n var that = this,\r\n idx = 0,\r\n filter = that.filter,\r\n target,\r\n touches = getTouches(e),\r\n length = touches.length,\r\n touch,\r\n which = e.which;\r\n\r\n if ((which && which > 1) || (that._maxTouchesReached())) {\r\n return;\r\n }\r\n\r\n ClickMoveClick.current = null;\r\n\r\n that.currentTarget = e.currentTarget;\r\n\r\n if (that.stopPropagation) {\r\n e.stopPropagation();\r\n }\r\n\r\n for (; idx < length; idx ++) {\r\n if (that._maxTouchesReached()) {\r\n break;\r\n }\r\n\r\n touch = touches[idx];\r\n\r\n if (filter) {\r\n target = $(touch.currentTarget);\r\n } else {\r\n target = that.element;\r\n }\r\n\r\n if (!target.length) {\r\n continue;\r\n }\r\n\r\n touch = new Touch(that, target, touch);\r\n that.touches.push(touch);\r\n touch.press();\r\n touch._start(touch);\r\n }\r\n },\r\n\r\n _move: function(e) {\r\n this._eachTouch(\"move\", e);\r\n },\r\n\r\n _end: function(e) {\r\n this._eachTouch(\"move\", e);\r\n this._eachTouch(\"end\", e);\r\n },\r\n\r\n _eachTouch: function(methodName, e) {\r\n var that = this,\r\n dict = {},\r\n touches = getTouches(e),\r\n activeTouches = that.touches,\r\n idx,\r\n touch,\r\n touchInfo,\r\n matchingTouch;\r\n\r\n for (idx = 0; idx < activeTouches.length; idx ++) {\r\n touch = activeTouches[idx];\r\n dict[touch.id] = touch;\r\n }\r\n\r\n for (idx = 0; idx < touches.length; idx ++) {\r\n touchInfo = touches[idx];\r\n matchingTouch = dict[touchInfo.id];\r\n\r\n if (matchingTouch) {\r\n matchingTouch.x.move(touchInfo.location);\r\n matchingTouch.y.move(touchInfo.location);\r\n matchingTouch[methodName](touchInfo);\r\n }\r\n }\r\n }\r\n });\r\n\r\n UserEvents.defaultThreshold = function(value) {\r\n DEFAULT_THRESHOLD = value;\r\n };\r\n\r\n UserEvents.minHold = function(value) {\r\n DEFAULT_MIN_HOLD = value;\r\n };\r\n\r\n kendo.getTouches = getTouches;\r\n kendo.touchDelta = touchDelta;\r\n kendo.UserEvents = UserEvents;\r\n kendo.ClickMoveClick = ClickMoveClick;\r\n })(window.kendo.jQuery);\r\n var kendo$2n = kendo;\r\n\r\n var __meta__$2m = {\r\n id: \"draganddrop\",\r\n name: \"Drag & drop\",\r\n category: \"framework\",\r\n description: \"Drag & drop functionality for any DOM element.\",\r\n depends: [ \"core\", \"userevents\" ]\r\n };\r\n\r\n (function($, undefined$1) {\r\n var kendo = window.kendo,\r\n support = kendo.support,\r\n document = window.document,\r\n $window = $(window),\r\n Class = kendo.Class,\r\n Widget = kendo.ui.Widget,\r\n Observable = kendo.Observable,\r\n UserEvents = kendo.UserEvents,\r\n ClickMoveClick = kendo.ClickMoveClick,\r\n extend = $.extend,\r\n getOffset = kendo.getOffset,\r\n draggables = {},\r\n dropTargets = {},\r\n dropAreas = {},\r\n lastDropTarget,\r\n elementUnderCursor = kendo.elementUnderCursor,\r\n KEYUP = \"keyup\",\r\n CHANGE = \"change\",\r\n\r\n // Draggable events\r\n DRAGSTART = \"dragstart\",\r\n HOLD = \"hold\",\r\n DRAG = \"drag\",\r\n DRAGEND = \"dragend\",\r\n DRAGCANCEL = \"dragcancel\",\r\n HINTDESTROYED = \"hintDestroyed\",\r\n\r\n // DropTarget events\r\n DRAGENTER = \"dragenter\",\r\n DRAGLEAVE = \"dragleave\",\r\n DROP = \"drop\";\r\n\r\n function contains(parent, child) {\r\n try {\r\n return $.contains(parent, child) || parent == child;\r\n } catch (e) {\r\n return false;\r\n }\r\n }\r\n\r\n function numericCssPropery(element, property) {\r\n return parseInt(element.css(property), 10) || 0;\r\n }\r\n\r\n function within(value, range) {\r\n return Math.min(Math.max(value, range.min), range.max);\r\n }\r\n\r\n function containerBoundaries(container, element) {\r\n var offset = getOffset(container),\r\n outerWidth = kendo._outerWidth,\r\n outerHeight = kendo._outerHeight,\r\n minX = offset.left + numericCssPropery(container, \"borderLeftWidth\") + numericCssPropery(container, \"paddingLeft\"),\r\n minY = offset.top + numericCssPropery(container, \"borderTopWidth\") + numericCssPropery(container, \"paddingTop\"),\r\n maxX = minX + container.width() - outerWidth(element, true),\r\n maxY = minY + container.height() - outerHeight(element, true);\r\n\r\n return {\r\n x: { min: minX, max: maxX },\r\n y: { min: minY, max: maxY }\r\n };\r\n }\r\n\r\n function checkTarget(target, targets, areas) {\r\n var theTarget, theFilter, i = 0,\r\n targetLen = targets && targets.length,\r\n areaLen = areas && areas.length;\r\n\r\n while (target && target.parentNode) {\r\n for (i = 0; i < targetLen; i ++) {\r\n theTarget = targets[i];\r\n if (theTarget.element[0] === target) {\r\n return { target: theTarget, targetElement: target };\r\n }\r\n }\r\n\r\n for (i = 0; i < areaLen; i ++) {\r\n theFilter = areas[i];\r\n if ($.contains(theFilter.element[0], target) && support.matchesSelector.call(target, theFilter.options.filter)) {\r\n return { target: theFilter, targetElement: target };\r\n }\r\n }\r\n\r\n target = target.parentNode;\r\n }\r\n\r\n return undefined$1;\r\n }\r\n\r\n var TapCapture = Observable.extend({\r\n init: function(element, options) {\r\n var that = this,\r\n domElement = element[0];\r\n\r\n that.capture = false;\r\n\r\n if (domElement.addEventListener) {\r\n $.each(kendo.eventMap.down.split(\" \"), function() {\r\n domElement.addEventListener(this, that._press.bind(that), true);\r\n });\r\n $.each(kendo.eventMap.up.split(\" \"), function() {\r\n domElement.addEventListener(this, that._release.bind(that), true);\r\n });\r\n } else {\r\n $.each(kendo.eventMap.down.split(\" \"), function() {\r\n domElement.attachEvent(this, that._press.bind(that));\r\n });\r\n $.each(kendo.eventMap.up.split(\" \"), function() {\r\n domElement.attachEvent(this, that._release.bind(that));\r\n });\r\n }\r\n\r\n Observable.fn.init.call(that);\r\n\r\n that.bind([\"press\", \"release\"], options || {});\r\n },\r\n\r\n captureNext: function() {\r\n this.capture = true;\r\n },\r\n\r\n cancelCapture: function() {\r\n this.capture = false;\r\n },\r\n\r\n _press: function(e) {\r\n var that = this;\r\n that.trigger(\"press\");\r\n if (that.capture) {\r\n e.preventDefault();\r\n }\r\n },\r\n\r\n _release: function(e) {\r\n var that = this;\r\n that.trigger(\"release\");\r\n\r\n if (that.capture) {\r\n e.preventDefault();\r\n that.cancelCapture();\r\n }\r\n }\r\n });\r\n\r\n var PaneDimension = Observable.extend({\r\n init: function(options) {\r\n var that = this;\r\n Observable.fn.init.call(that);\r\n\r\n that.forcedEnabled = false;\r\n\r\n $.extend(that, options);\r\n\r\n that.scale = 1;\r\n\r\n if (that.horizontal) {\r\n that.measure = \"offsetWidth\";\r\n that.scrollSize = \"scrollWidth\";\r\n that.axis = \"x\";\r\n } else {\r\n that.measure = \"offsetHeight\";\r\n that.scrollSize = \"scrollHeight\";\r\n that.axis = \"y\";\r\n }\r\n },\r\n\r\n makeVirtual: function() {\r\n $.extend(this, {\r\n virtual: true,\r\n forcedEnabled: true,\r\n _virtualMin: 0,\r\n _virtualMax: 0\r\n });\r\n },\r\n\r\n virtualSize: function(min, max) {\r\n if (this._virtualMin !== min || this._virtualMax !== max) {\r\n this._virtualMin = min;\r\n this._virtualMax = max;\r\n this.update();\r\n }\r\n },\r\n\r\n outOfBounds: function(offset) {\r\n return offset > this.max || offset < this.min;\r\n },\r\n\r\n forceEnabled: function() {\r\n this.forcedEnabled = true;\r\n },\r\n\r\n getSize: function() {\r\n return this.container[0][this.measure];\r\n },\r\n\r\n getTotal: function() {\r\n return this.element[0][this.scrollSize];\r\n },\r\n\r\n rescale: function(scale) {\r\n this.scale = scale;\r\n },\r\n\r\n update: function(silent) {\r\n var that = this,\r\n total = that.virtual ? that._virtualMax : that.getTotal(),\r\n scaledTotal = total * that.scale,\r\n size = that.getSize();\r\n\r\n if (total === 0 && !that.forcedEnabled) {\r\n return; // we are not visible.\r\n }\r\n\r\n that.max = that.virtual ? -that._virtualMin : 0;\r\n that.size = size;\r\n that.total = scaledTotal;\r\n that.min = Math.min(that.max, size - scaledTotal);\r\n that.minScale = size / total;\r\n that.centerOffset = (scaledTotal - size) / 2;\r\n\r\n that.enabled = that.forcedEnabled || (scaledTotal > size);\r\n\r\n if (!silent) {\r\n that.trigger(CHANGE, that);\r\n }\r\n }\r\n });\r\n\r\n var PaneDimensions = Observable.extend({\r\n init: function(options) {\r\n var that = this;\r\n\r\n Observable.fn.init.call(that);\r\n\r\n that.x = new PaneDimension(extend({ horizontal: true }, options));\r\n that.y = new PaneDimension(extend({ horizontal: false }, options));\r\n that.container = options.container;\r\n that.forcedMinScale = options.minScale;\r\n that.maxScale = options.maxScale || 100;\r\n\r\n that.bind(CHANGE, options);\r\n },\r\n\r\n rescale: function(newScale) {\r\n this.x.rescale(newScale);\r\n this.y.rescale(newScale);\r\n this.refresh();\r\n },\r\n\r\n centerCoordinates: function() {\r\n return { x: Math.min(0, -this.x.centerOffset), y: Math.min(0, -this.y.centerOffset) };\r\n },\r\n\r\n refresh: function() {\r\n var that = this;\r\n that.x.update();\r\n that.y.update();\r\n that.enabled = that.x.enabled || that.y.enabled;\r\n that.minScale = that.forcedMinScale || Math.min(that.x.minScale, that.y.minScale);\r\n that.fitScale = Math.max(that.x.minScale, that.y.minScale);\r\n that.trigger(CHANGE);\r\n }\r\n });\r\n\r\n var PaneAxis = Observable.extend({\r\n init: function(options) {\r\n var that = this;\r\n extend(that, options);\r\n Observable.fn.init.call(that);\r\n },\r\n\r\n outOfBounds: function() {\r\n return this.dimension.outOfBounds(this.movable[this.axis]);\r\n },\r\n\r\n dragMove: function(delta) {\r\n var that = this,\r\n dimension = that.dimension,\r\n axis = that.axis,\r\n movable = that.movable,\r\n position = movable[axis] + delta;\r\n\r\n if (!dimension.enabled) {\r\n return;\r\n }\r\n\r\n if ((position < dimension.min && delta < 0) || (position > dimension.max && delta > 0)) {\r\n delta *= that.resistance;\r\n }\r\n\r\n movable.translateAxis(axis, delta);\r\n that.trigger(CHANGE, that);\r\n }\r\n });\r\n\r\n var Pane = Class.extend({\r\n\r\n init: function(options) {\r\n var that = this,\r\n x,\r\n y,\r\n resistance,\r\n movable;\r\n\r\n extend(that, { elastic: true }, options);\r\n\r\n resistance = that.elastic ? 0.5 : 0;\r\n movable = that.movable;\r\n\r\n that.x = x = new PaneAxis({\r\n axis: \"x\",\r\n dimension: that.dimensions.x,\r\n resistance: resistance,\r\n movable: movable\r\n });\r\n\r\n that.y = y = new PaneAxis({\r\n axis: \"y\",\r\n dimension: that.dimensions.y,\r\n resistance: resistance,\r\n movable: movable\r\n });\r\n\r\n that.userEvents.bind([\"press\", \"move\", \"end\", \"gesturestart\", \"gesturechange\"], {\r\n gesturestart: function(e) {\r\n that.gesture = e;\r\n that.offset = that.dimensions.container.offset();\r\n },\r\n\r\n press: function(e) {\r\n if ($(e.event.target).closest(\"a\").is(\"[data-navigate-on-press=true]\")) {\r\n e.sender.cancel();\r\n }\r\n },\r\n\r\n gesturechange: function(e) {\r\n var previousGesture = that.gesture,\r\n previousCenter = previousGesture.center,\r\n\r\n center = e.center,\r\n\r\n scaleDelta = e.distance / previousGesture.distance,\r\n\r\n minScale = that.dimensions.minScale,\r\n maxScale = that.dimensions.maxScale,\r\n coordinates;\r\n\r\n if (movable.scale <= minScale && scaleDelta < 1) {\r\n // Resist shrinking. Instead of shrinking from 1 to 0.5, it will shrink to 0.5 + (1 /* minScale */ - 0.5) * 0.8 = 0.9;\r\n scaleDelta += (1 - scaleDelta) * 0.8;\r\n }\r\n\r\n if (movable.scale * scaleDelta >= maxScale) {\r\n scaleDelta = maxScale / movable.scale;\r\n }\r\n\r\n var offsetX = movable.x + that.offset.left,\r\n offsetY = movable.y + that.offset.top;\r\n\r\n coordinates = {\r\n x: (offsetX - previousCenter.x) * scaleDelta + center.x - offsetX,\r\n y: (offsetY - previousCenter.y) * scaleDelta + center.y - offsetY\r\n };\r\n\r\n movable.scaleWith(scaleDelta);\r\n\r\n x.dragMove(coordinates.x);\r\n y.dragMove(coordinates.y);\r\n\r\n that.dimensions.rescale(movable.scale);\r\n that.gesture = e;\r\n e.preventDefault();\r\n },\r\n\r\n move: function(e) {\r\n if (e.event.target.tagName.match(/textarea|input/i)) {\r\n return;\r\n }\r\n\r\n if (x.dimension.enabled || y.dimension.enabled) {\r\n x.dragMove(e.x.delta);\r\n y.dragMove(e.y.delta);\r\n e.preventDefault();\r\n } else {\r\n e.touch.skip();\r\n }\r\n },\r\n\r\n end: function(e) {\r\n e.preventDefault();\r\n }\r\n });\r\n }\r\n });\r\n\r\n var TRANSFORM_STYLE = \"transform\",\r\n translate;\r\n\r\n\r\n if (support.hasHW3D) {\r\n translate = function(x, y, scale) {\r\n return \"translate3d(\" + x + \"px,\" + y + \"px,0) scale(\" + scale + \")\";\r\n };\r\n } else {\r\n translate = function(x, y, scale) {\r\n return \"translate(\" + x + \"px,\" + y + \"px) scale(\" + scale + \")\";\r\n };\r\n }\r\n\r\n var Movable = Observable.extend({\r\n init: function(element) {\r\n var that = this;\r\n\r\n Observable.fn.init.call(that);\r\n\r\n that.element = $(element);\r\n that.element[0].style.webkitTransformOrigin = \"left top\";\r\n that.x = 0;\r\n that.y = 0;\r\n that.scale = 1;\r\n that._saveCoordinates(translate(that.x, that.y, that.scale));\r\n },\r\n\r\n translateAxis: function(axis, by) {\r\n this[axis] += by;\r\n this.refresh();\r\n },\r\n\r\n scaleTo: function(scale) {\r\n this.scale = scale;\r\n this.refresh();\r\n },\r\n\r\n scaleWith: function(scaleDelta) {\r\n this.scale *= scaleDelta;\r\n this.refresh();\r\n },\r\n\r\n translate: function(coordinates) {\r\n this.x += coordinates.x;\r\n this.y += coordinates.y;\r\n this.refresh();\r\n },\r\n\r\n moveAxis: function(axis, value) {\r\n this[axis] = value;\r\n this.refresh();\r\n },\r\n\r\n moveTo: function(coordinates) {\r\n extend(this, coordinates);\r\n this.refresh();\r\n },\r\n\r\n refresh: function() {\r\n var that = this,\r\n x = that.x,\r\n y = that.y,\r\n newCoordinates;\r\n\r\n if (that.round) {\r\n x = Math.round(x);\r\n y = Math.round(y);\r\n }\r\n\r\n newCoordinates = translate(x, y, that.scale);\r\n\r\n if (newCoordinates != that.coordinates) {\r\n if (kendo.support.browser.msie && kendo.support.browser.version < 10) {\r\n that.element[0].style.position = \"absolute\";\r\n that.element[0].style.left = that.x + \"px\";\r\n that.element[0].style.top = that.y + \"px\";\r\n\r\n } else {\r\n that.element[0].style[TRANSFORM_STYLE] = newCoordinates;\r\n }\r\n that._saveCoordinates(newCoordinates);\r\n that.trigger(CHANGE);\r\n }\r\n },\r\n\r\n _saveCoordinates: function(coordinates) {\r\n this.coordinates = coordinates;\r\n }\r\n });\r\n\r\n function destroyDroppable(collection, widget) {\r\n var groupName = widget.options.group,\r\n droppables = collection[groupName],\r\n i;\r\n\r\n Widget.fn.destroy.call(widget);\r\n\r\n if (droppables.length > 1) {\r\n for (i = 0; i < droppables.length; i++) {\r\n if (droppables[i] == widget) {\r\n droppables.splice(i, 1);\r\n break;\r\n }\r\n }\r\n } else {\r\n droppables.length = 0; // WTF, porting this from the previous destroyGroup\r\n delete collection[groupName];\r\n }\r\n }\r\n\r\n var DropTarget = Widget.extend({\r\n init: function(element, options) {\r\n var that = this;\r\n\r\n Widget.fn.init.call(that, element, options);\r\n\r\n var group = that.options.group;\r\n\r\n if (!(group in dropTargets)) {\r\n dropTargets[group] = [ that ];\r\n } else {\r\n dropTargets[group].push( that );\r\n }\r\n },\r\n\r\n events: [\r\n DRAGENTER,\r\n DRAGLEAVE,\r\n DROP\r\n ],\r\n\r\n options: {\r\n name: \"DropTarget\",\r\n group: \"default\"\r\n },\r\n\r\n destroy: function() {\r\n destroyDroppable(dropTargets, this);\r\n },\r\n\r\n _trigger: function(eventName, e) {\r\n var that = this,\r\n draggable = draggables[that.options.group];\r\n\r\n if (draggable) {\r\n return that.trigger(eventName, extend({}, e.event, {\r\n draggable: draggable,\r\n dropTarget: e.dropTarget\r\n }));\r\n }\r\n },\r\n\r\n _over: function(e) {\r\n this._trigger(DRAGENTER, e);\r\n },\r\n\r\n _out: function(e) {\r\n this._trigger(DRAGLEAVE, e);\r\n },\r\n\r\n _drop: function(e) {\r\n var that = this,\r\n draggable = draggables[that.options.group];\r\n\r\n if (draggable) {\r\n draggable.dropped = !that._trigger(DROP, e);\r\n }\r\n }\r\n });\r\n\r\n DropTarget.destroyGroup = function(groupName) {\r\n var group = dropTargets[groupName] || dropAreas[groupName],\r\n i;\r\n\r\n if (group) {\r\n for (i = 0; i < group.length; i++) {\r\n Widget.fn.destroy.call(group[i]);\r\n }\r\n\r\n group.length = 0;\r\n delete dropTargets[groupName];\r\n delete dropAreas[groupName];\r\n }\r\n };\r\n\r\n DropTarget._cache = dropTargets;\r\n\r\n var DropTargetArea = DropTarget.extend({\r\n init: function(element, options) {\r\n var that = this;\r\n\r\n Widget.fn.init.call(that, element, options);\r\n\r\n var group = that.options.group;\r\n\r\n if (!(group in dropAreas)) {\r\n dropAreas[group] = [ that ];\r\n } else {\r\n dropAreas[group].push( that );\r\n }\r\n },\r\n\r\n destroy: function() {\r\n destroyDroppable(dropAreas, this);\r\n },\r\n\r\n options: {\r\n name: \"DropTargetArea\",\r\n group: \"default\",\r\n filter: null\r\n }\r\n });\r\n\r\n var Draggable = Widget.extend({\r\n init: function(element, options) {\r\n var that = this;\r\n\r\n Widget.fn.init.call(that, element, options);\r\n\r\n that._activated = false;\r\n\r\n if (this.options.clickMoveClick) {\r\n that.clickMoveClick = new ClickMoveClick(that.element, {\r\n global: true,\r\n filter: that.options.filter,\r\n start: that._startClickMoveClick.bind(that),\r\n move: that._drag.bind(that),\r\n end: that._end.bind(that),\r\n cancel: that._onCancel.bind(that)\r\n });\r\n }\r\n\r\n that.userEvents = new UserEvents(that.element, {\r\n global: true,\r\n allowSelection: true,\r\n filter: that.options.filter,\r\n threshold: that.options.distance,\r\n start: that._start.bind(that),\r\n hold: that._hold.bind(that),\r\n move: that._drag.bind(that),\r\n end: that._end.bind(that),\r\n cancel: that._onCancel.bind(that),\r\n select: that._select.bind(that),\r\n press: that._press.bind(that),\r\n });\r\n\r\n if (kendo.support.touch) {\r\n that.element.find(that.options.filter).css('touch-action', 'none');\r\n }\r\n\r\n that._afterEndHandler = that._afterEnd.bind(that);\r\n that._captureEscape = that._captureEscape.bind(that);\r\n },\r\n\r\n events: [\r\n HOLD,\r\n DRAGSTART,\r\n DRAG,\r\n DRAGEND,\r\n DRAGCANCEL,\r\n HINTDESTROYED\r\n ],\r\n\r\n options: {\r\n name: \"Draggable\",\r\n distance: ( kendo.support.touch ? 0 : 5),\r\n group: \"default\",\r\n cursorOffset: null,\r\n axis: null,\r\n container: null,\r\n filter: null,\r\n ignore: null,\r\n holdToDrag: false,\r\n showHintOnHold: false,\r\n autoScroll: false,\r\n dropped: false,\r\n clickMoveClick: false,\r\n preventOsHoldFeatures: false\r\n },\r\n\r\n cancelHold: function() {\r\n this._activated = false;\r\n },\r\n\r\n _captureEscape: function(e) {\r\n var that = this;\r\n\r\n if (e.keyCode === kendo.keys.ESC) {\r\n that.userEvents.cancel();\r\n\r\n if (that.clickMoveClick) {\r\n that.clickMoveClick.cancel();\r\n }\r\n\r\n this._trigger(DRAGCANCEL, { event: e });\r\n }\r\n },\r\n\r\n _updateHint: function(e) {\r\n var that = this,\r\n coordinates,\r\n options = that.options,\r\n boundaries = that.boundaries,\r\n axis = options.axis,\r\n cursorOffset = that.options.cursorOffset,\r\n updateHint = options.updateHint;\r\n\r\n if (cursorOffset) {\r\n coordinates = { left: e.x.location + cursorOffset.left, top: e.y.location + cursorOffset.top };\r\n } else {\r\n if (e.x.delta !== 0 || e.y.delta !== 0) {\r\n that.hintOffset.left += e.x.delta;\r\n that.hintOffset.top += e.y.delta;\r\n coordinates = $.extend({}, that.hintOffset);\r\n } else {\r\n that.hintOffset.left = e.x.startLocation + e.x.initialDelta;\r\n that.hintOffset.top = e.y.startLocation + e.y.initialDelta;\r\n coordinates = $.extend({}, that.hintOffset);\r\n }\r\n }\r\n\r\n if (boundaries) {\r\n coordinates.top = within(coordinates.top, boundaries.y);\r\n coordinates.left = within(coordinates.left, boundaries.x);\r\n }\r\n\r\n if (axis === \"x\") {\r\n delete coordinates.top;\r\n } else if (axis === \"y\") {\r\n delete coordinates.left;\r\n }\r\n\r\n if (updateHint && kendo.isFunction(updateHint)) {\r\n return $(updateHint.call(that, that.hint, e));\r\n }\r\n\r\n that.hint.css(coordinates);\r\n },\r\n\r\n _shouldIgnoreTarget: function(target) {\r\n var ignoreSelector = this.options.ignore;\r\n return ignoreSelector && $(target).is(ignoreSelector);\r\n },\r\n\r\n _select: function(e) {\r\n if (!this._shouldIgnoreTarget(e.event.target)) {\r\n e.preventDefault();\r\n }\r\n },\r\n\r\n _startClickMoveClick: function(e) {\r\n this._activated = true;\r\n\r\n this._start(e);\r\n },\r\n\r\n _hint: function() {\r\n var that = this,\r\n hint = that.options.hint;\r\n\r\n if (hint) {\r\n if (that.hint) {\r\n that.hint.stop(true, true).remove();\r\n }\r\n\r\n that.hint = kendo.isFunction(hint) ? $(hint.call(that, that.currentTarget)) : hint;\r\n\r\n var offset = getOffset(that.currentTarget);\r\n that.hintOffset = offset;\r\n\r\n that.hint.css({\r\n position: \"absolute\",\r\n zIndex: 20000, // the Window's z-index is 10000 and can be raised because of z-stacking\r\n left: offset.left,\r\n top: offset.top,\r\n })\r\n .appendTo(document.body);\r\n }\r\n },\r\n\r\n _start: function(e) {\r\n var that = this,\r\n options = that.options,\r\n container = options.container ? $(options.container) : null,\r\n hint = options.hint;\r\n\r\n if (this._shouldIgnoreTarget(e.touch.initialTouch) || (options.holdToDrag && !that._activated)) {\r\n that.userEvents.cancel();\r\n return;\r\n }\r\n\r\n that.currentTarget = e.target;\r\n that.currentTargetOffset = getOffset(that.currentTarget);\r\n\r\n if (hint) {\r\n that._hint();\r\n }\r\n\r\n draggables[options.group] = that;\r\n\r\n that.dropped = false;\r\n\r\n if (container) {\r\n that.boundaries = containerBoundaries(container, that.hint);\r\n }\r\n\r\n $(document).on(KEYUP, that._captureEscape);\r\n\r\n if (that._trigger(DRAGSTART, e)) {\r\n that.userEvents.cancel();\r\n\r\n if (that.clickMoveClick) {\r\n that.clickMoveClick.cancel();\r\n }\r\n\r\n that._afterEnd();\r\n }\r\n\r\n that.userEvents.capture();\r\n },\r\n\r\n _hold: function(e) {\r\n this.currentTarget = e.target;\r\n\r\n if (this._trigger(HOLD, e)) {\r\n this.userEvents.cancel();\r\n } else {\r\n this._activated = true;\r\n if (this.options.showHintOnHold) {\r\n this._hint();\r\n }\r\n }\r\n },\r\n\r\n _drag: function(e) {\r\n e.preventDefault();\r\n\r\n var cursorElement = this._elementUnderCursor(e);\r\n\r\n if (this.options.autoScroll && this._cursorElement !== cursorElement) {\r\n this._scrollableParent = findScrollableParent(cursorElement);\r\n this._cursorElement = cursorElement;\r\n }\r\n\r\n this._lastEvent = e;\r\n this._processMovement(e, cursorElement);\r\n\r\n if (this.options.autoScroll) {\r\n // chrome seems to trigger mousemove when mouse is moved outside of the window (over the Chrome), too.\r\n if (this._scrollableParent[0]) {\r\n var velocity = autoScrollVelocity(e.x.location, e.y.location, scrollableViewPort(this._scrollableParent));\r\n\r\n\r\n this._scrollCompenstation = $.extend({}, this.hintOffset);\r\n this._scrollVelocity = velocity;\r\n\r\n if (velocity.y === 0 && velocity.x === 0) {\r\n clearInterval(this._scrollInterval);\r\n this._scrollInterval = null;\r\n } else if (!this._scrollInterval) {\r\n this._scrollInterval = setInterval(this._autoScroll.bind(this), 50);\r\n }\r\n }\r\n }\r\n\r\n if (this.hint) {\r\n this._updateHint(e);\r\n }\r\n },\r\n\r\n _processMovement: function(e, cursorElement) {\r\n this._withDropTarget(cursorElement, function(target, targetElement) {\r\n if (!target) {\r\n if (lastDropTarget) {\r\n lastDropTarget._trigger(DRAGLEAVE, extend(e, { dropTarget: $(lastDropTarget.targetElement) }));\r\n lastDropTarget = null;\r\n }\r\n return;\r\n }\r\n\r\n if (lastDropTarget) {\r\n if (targetElement === lastDropTarget.targetElement) {\r\n return;\r\n }\r\n\r\n lastDropTarget._trigger(DRAGLEAVE, extend(e, { dropTarget: $(lastDropTarget.targetElement) }));\r\n }\r\n\r\n target._trigger(DRAGENTER, extend(e, { dropTarget: $(targetElement) }));\r\n lastDropTarget = extend(target, { targetElement: targetElement });\r\n });\r\n\r\n this._trigger(DRAG, extend(e, { dropTarget: lastDropTarget, elementUnderCursor: cursorElement }));\r\n },\r\n\r\n _autoScroll: function() {\r\n var parent = this._scrollableParent[0],\r\n velocity = this._scrollVelocity,\r\n compensation = this._scrollCompenstation;\r\n\r\n if (!parent) {\r\n return;\r\n }\r\n\r\n var cursorElement = this._elementUnderCursor(this._lastEvent);\r\n this._processMovement(this._lastEvent, cursorElement);\r\n\r\n var yIsScrollable, xIsScrollable;\r\n\r\n var isRootNode = parent === scrollableRoot()[0];\r\n\r\n if (isRootNode) {\r\n yIsScrollable = document.body.scrollHeight > $window.height();\r\n xIsScrollable = document.body.scrollWidth > $window.width();\r\n } else {\r\n yIsScrollable = parent.offsetHeight <= parent.scrollHeight;\r\n xIsScrollable = parent.offsetWidth <= parent.scrollWidth;\r\n }\r\n\r\n var yDelta = parent.scrollTop + velocity.y;\r\n var yInBounds = yIsScrollable && yDelta > 0 && yDelta < parent.scrollHeight;\r\n\r\n var xDelta = parent.scrollLeft + velocity.x;\r\n var xInBounds = xIsScrollable && xDelta > 0 && xDelta < parent.scrollWidth;\r\n\r\n if (yInBounds) {\r\n parent.scrollTop += velocity.y;\r\n } else if (yIsScrollable && yDelta < 0) {\r\n parent.scrollTop = 0;\r\n }\r\n\r\n if (xInBounds) {\r\n parent.scrollLeft += velocity.x;\r\n } else if (xIsScrollable && xDelta < 0) {\r\n parent.scrollLeft = 0;\r\n }\r\n\r\n if (this.hint && isRootNode && (xInBounds || yInBounds)) {\r\n if (yInBounds) {\r\n compensation.top += velocity.y;\r\n }\r\n\r\n if (xInBounds) {\r\n compensation.left += velocity.x;\r\n }\r\n\r\n this.hint.css(compensation);\r\n }\r\n },\r\n\r\n _press: function(ev) {\r\n if (this.options.preventOsHoldFeatures) {\r\n ev.target.css('-webkit-user-select', 'none');\r\n ev.target.attr('unselectable', 'on');\r\n ev.target.one('contextmenu', (ev) => {\r\n ev.preventDefault();\r\n });\r\n }\r\n },\r\n\r\n _end: function(e) {\r\n this._withDropTarget(this._elementUnderCursor(e), function(target, targetElement) {\r\n if (target) {\r\n target._drop(extend({}, e, { dropTarget: $(targetElement) }));\r\n lastDropTarget = null;\r\n }\r\n });\r\n\r\n clearInterval(this._scrollInterval);\r\n this._scrollInterval = null;\r\n this._cancel(this._trigger(DRAGEND, e));\r\n },\r\n\r\n _onCancel: function(e) {\r\n this._cancel();\r\n this._trigger(DRAGCANCEL, { event: e });\r\n },\r\n\r\n _cancel: function(isDefaultPrevented) {\r\n var that = this;\r\n\r\n that._scrollableParent = null;\r\n this._cursorElement = null;\r\n clearInterval(this._scrollInterval);\r\n that._activated = false;\r\n\r\n if (that.hint && !that.dropped) {\r\n setTimeout(function() {\r\n that.hint.stop(true, true);\r\n\r\n if (isDefaultPrevented) {\r\n that._afterEndHandler();\r\n } else {\r\n that.hint.animate(that.currentTargetOffset, \"fast\", that._afterEndHandler);\r\n }\r\n }, 0);\r\n } else {\r\n that._afterEnd();\r\n }\r\n },\r\n\r\n _trigger: function(eventName, e) {\r\n var that = this;\r\n\r\n return that.trigger(\r\n eventName, extend(\r\n {},\r\n e.event,\r\n {\r\n x: e.x,\r\n y: e.y,\r\n currentTarget: that.currentTarget,\r\n initialTarget: e.touch ? e.touch.initialTouch : null,\r\n dropTarget: e.dropTarget,\r\n elementUnderCursor: e.elementUnderCursor,\r\n clickMoveClick: e.clickMoveClick\r\n }\r\n ));\r\n },\r\n\r\n _elementUnderCursor: function(e) {\r\n var target = elementUnderCursor(e),\r\n hint = this.hint;\r\n\r\n if (hint && contains(hint[0], target)) {\r\n hint.hide();\r\n target = elementUnderCursor(e);\r\n // IE8 does not return the element in iframe from first attempt\r\n if (!target) {\r\n target = elementUnderCursor(e);\r\n }\r\n hint.show();\r\n }\r\n\r\n return target;\r\n },\r\n\r\n _withDropTarget: function(element, callback) {\r\n var result,\r\n group = this.options.group,\r\n targets = dropTargets[group],\r\n areas = dropAreas[group];\r\n\r\n if (targets && targets.length || areas && areas.length) {\r\n result = checkTarget(element, targets, areas);\r\n\r\n if (result) {\r\n callback(result.target, result.targetElement);\r\n } else {\r\n callback();\r\n }\r\n }\r\n },\r\n\r\n destroy: function() {\r\n var that = this;\r\n\r\n Widget.fn.destroy.call(that);\r\n\r\n that._afterEnd();\r\n\r\n that.userEvents.destroy();\r\n\r\n if (that.clickMoveClick) {\r\n that.clickMoveClick.destroy();\r\n }\r\n\r\n this._scrollableParent = null;\r\n this._cursorElement = null;\r\n clearInterval(this._scrollInterval);\r\n\r\n that.currentTarget = null;\r\n },\r\n\r\n _afterEnd: function() {\r\n var that = this;\r\n\r\n if (that.hint) {\r\n that.hint.remove();\r\n }\r\n\r\n delete draggables[that.options.group];\r\n\r\n that.trigger(\"destroy\");\r\n that.trigger(HINTDESTROYED);\r\n $(document).off(KEYUP, that._captureEscape);\r\n }\r\n });\r\n\r\n kendo.ui.plugin(DropTarget);\r\n kendo.ui.plugin(DropTargetArea);\r\n kendo.ui.plugin(Draggable);\r\n kendo.TapCapture = TapCapture;\r\n kendo.containerBoundaries = containerBoundaries;\r\n\r\n extend(kendo.ui, {\r\n Pane: Pane,\r\n PaneDimensions: PaneDimensions,\r\n Movable: Movable\r\n });\r\n\r\n function scrollableViewPort(element) {\r\n var root = scrollableRoot()[0],\r\n offset,\r\n top,\r\n left;\r\n\r\n if (element[0] === root) {\r\n top = root.scrollTop;\r\n left = root.scrollLeft;\r\n\r\n return {\r\n top: top,\r\n left: left,\r\n bottom: top + $window.height(),\r\n right: left + $window.width()\r\n };\r\n } else {\r\n offset = element.offset();\r\n offset.bottom = offset.top + element.height();\r\n offset.right = offset.left + element.width();\r\n return offset;\r\n }\r\n }\r\n\r\n function scrollableRoot() {\r\n return $(kendo.support.browser.edge || kendo.support.browser.safari ? document.body : document.documentElement);\r\n }\r\n\r\n function findScrollableParent(element) {\r\n var root = scrollableRoot();\r\n\r\n if (!element || element === document.body || element === document.documentElement) {\r\n return root;\r\n }\r\n\r\n var parent = $(element)[0];\r\n\r\n while (parent && !kendo.isScrollable(parent) && parent !== document.body) {\r\n parent = parent.parentNode;\r\n }\r\n\r\n if (parent === document.body) {\r\n return root;\r\n }\r\n\r\n return $(parent);\r\n }\r\n\r\n function autoScrollVelocity(mouseX, mouseY, rect) {\r\n var velocity = { x: 0, y: 0 };\r\n\r\n var AUTO_SCROLL_AREA = 50;\r\n\r\n if (mouseX - rect.left < AUTO_SCROLL_AREA) {\r\n velocity.x = -(AUTO_SCROLL_AREA - (mouseX - rect.left));\r\n } else if (rect.right - mouseX < AUTO_SCROLL_AREA) {\r\n velocity.x = AUTO_SCROLL_AREA - (rect.right - mouseX);\r\n }\r\n\r\n if (mouseY - rect.top < AUTO_SCROLL_AREA) {\r\n velocity.y = -(AUTO_SCROLL_AREA - (mouseY - rect.top));\r\n } else if (rect.bottom - mouseY < AUTO_SCROLL_AREA) {\r\n velocity.y = AUTO_SCROLL_AREA - (rect.bottom - mouseY);\r\n }\r\n\r\n return velocity;\r\n }\r\n\r\n // export for testing\r\n kendo.ui.Draggable.utils = {\r\n autoScrollVelocity: autoScrollVelocity,\r\n scrollableViewPort: scrollableViewPort,\r\n findScrollableParent: findScrollableParent\r\n };\r\n\r\n })(window.kendo.jQuery);\r\n var kendo$2m = kendo;\r\n\r\n var __meta__$2l = {\r\n id: \"mobile.scroller\",\r\n name: \"Scroller\",\r\n category: \"mobile\",\r\n description: \"The Kendo Mobile Scroller widget enables touch friendly kinetic scrolling for the contents of a given DOM element.\",\r\n depends: [ \"fx\", \"draganddrop\" ]\r\n };\r\n\r\n (function($, undefined$1) {\r\n var kendo = window.kendo,\r\n mobile = kendo.mobile,\r\n fx = kendo.effects,\r\n ui = mobile.ui,\r\n extend = $.extend,\r\n Widget = ui.Widget,\r\n Class = kendo.Class,\r\n Movable = kendo.ui.Movable,\r\n Pane = kendo.ui.Pane,\r\n PaneDimensions = kendo.ui.PaneDimensions,\r\n Transition = fx.Transition,\r\n Animation = fx.Animation,\r\n abs = Math.abs,\r\n SNAPBACK_DURATION = 500,\r\n SCROLLBAR_OPACITY = 0.7,\r\n FRICTION = 0.96,\r\n VELOCITY_MULTIPLIER = 10,\r\n MAX_VELOCITY = 55,\r\n OUT_OF_BOUNDS_FRICTION = 0.5,\r\n ANIMATED_SCROLLER_PRECISION = 5,\r\n RELEASECLASS = \"km-scroller-release\",\r\n REFRESHCLASS = \"km-scroller-refresh\",\r\n PULL = \"pull\",\r\n CHANGE = \"change\",\r\n RESIZE = \"resize\",\r\n SCROLL = \"scroll\",\r\n MOUSE_WHEEL_ID = 2;\r\n\r\n var ZoomSnapBack = Animation.extend({\r\n init: function(options) {\r\n var that = this;\r\n Animation.fn.init.call(that);\r\n extend(that, options);\r\n\r\n that.userEvents.bind(\"gestureend\", that.start.bind(that));\r\n that.tapCapture.bind(\"press\", that.cancel.bind(that));\r\n },\r\n\r\n enabled: function() {\r\n return this.movable.scale < this.dimensions.minScale;\r\n },\r\n\r\n done: function() {\r\n return this.dimensions.minScale - this.movable.scale < 0.01;\r\n },\r\n\r\n tick: function() {\r\n var movable = this.movable;\r\n movable.scaleWith(1.1);\r\n this.dimensions.rescale(movable.scale);\r\n },\r\n\r\n onEnd: function() {\r\n var movable = this.movable;\r\n movable.scaleTo(this.dimensions.minScale);\r\n this.dimensions.rescale(movable.scale);\r\n }\r\n });\r\n\r\n var DragInertia = Animation.extend({\r\n init: function(options) {\r\n var that = this;\r\n\r\n Animation.fn.init.call(that);\r\n\r\n extend(that, options, {\r\n transition: new Transition({\r\n axis: options.axis,\r\n movable: options.movable,\r\n onEnd: function() { that._end(); }\r\n })\r\n });\r\n\r\n that.tapCapture.bind(\"press\", function() { that.cancel(); });\r\n that.userEvents.bind(\"end\", that.start.bind(that));\r\n that.userEvents.bind(\"gestureend\", that.start.bind(that));\r\n that.userEvents.bind(\"tap\", that.onEnd.bind(that));\r\n },\r\n\r\n onCancel: function() {\r\n this.transition.cancel();\r\n },\r\n\r\n freeze: function(location) {\r\n var that = this;\r\n that.cancel();\r\n that._moveTo(location);\r\n },\r\n\r\n onEnd: function() {\r\n var that = this;\r\n if (that.paneAxis.outOfBounds()) {\r\n that._snapBack();\r\n } else {\r\n that._end();\r\n }\r\n },\r\n\r\n done: function() {\r\n return abs(this.velocity) < 1;\r\n },\r\n\r\n start: function(e) {\r\n var that = this,\r\n velocity;\r\n\r\n if (!that.dimension.enabled) { return; }\r\n\r\n if (that.paneAxis.outOfBounds()) {\r\n if (that.transition._started) {\r\n that.transition.cancel();\r\n that.velocity = Math.min(e.touch[that.axis].velocity * that.velocityMultiplier, MAX_VELOCITY);\r\n\r\n Animation.fn.start.call(that);\r\n } else {\r\n that._snapBack();\r\n }\r\n } else {\r\n velocity = e.touch.id === MOUSE_WHEEL_ID ? 0 : e.touch[that.axis].velocity;\r\n that.velocity = Math.max(Math.min(velocity * that.velocityMultiplier, MAX_VELOCITY), -MAX_VELOCITY);\r\n\r\n that.tapCapture.captureNext();\r\n Animation.fn.start.call(that);\r\n }\r\n },\r\n\r\n tick: function() {\r\n var that = this,\r\n dimension = that.dimension,\r\n friction = that.paneAxis.outOfBounds() ? OUT_OF_BOUNDS_FRICTION : that.friction,\r\n delta = (that.velocity *= friction),\r\n location = that.movable[that.axis] + delta;\r\n\r\n if (!that.elastic && dimension.outOfBounds(location)) {\r\n location = Math.max(Math.min(location, dimension.max), dimension.min);\r\n that.velocity = 0;\r\n }\r\n\r\n that.movable.moveAxis(that.axis, location);\r\n },\r\n\r\n _end: function() {\r\n this.tapCapture.cancelCapture();\r\n this.end();\r\n },\r\n\r\n _snapBack: function() {\r\n var that = this,\r\n dimension = that.dimension,\r\n snapBack = that.movable[that.axis] > dimension.max ? dimension.max : dimension.min;\r\n that._moveTo(snapBack);\r\n },\r\n\r\n _moveTo: function(location) {\r\n this.transition.moveTo({ location: location, duration: SNAPBACK_DURATION, ease: Transition.easeOutExpo });\r\n }\r\n });\r\n\r\n var AnimatedScroller = Animation.extend({\r\n init: function(options) {\r\n var that = this;\r\n\r\n kendo.effects.Animation.fn.init.call(this);\r\n\r\n extend(that, options, {\r\n origin: {},\r\n destination: {},\r\n offset: {}\r\n });\r\n },\r\n\r\n tick: function() {\r\n this._updateCoordinates();\r\n this.moveTo(this.origin);\r\n },\r\n\r\n done: function() {\r\n return abs(this.offset.y) < ANIMATED_SCROLLER_PRECISION && abs(this.offset.x) < ANIMATED_SCROLLER_PRECISION;\r\n },\r\n\r\n onEnd: function() {\r\n this.moveTo(this.destination);\r\n if (this.callback) {\r\n this.callback.call();\r\n }\r\n },\r\n\r\n setCoordinates: function(from, to) {\r\n this.offset = {};\r\n this.origin = from;\r\n this.destination = to;\r\n },\r\n\r\n setCallback: function(callback) {\r\n if (callback && kendo.isFunction(callback)) {\r\n this.callback = callback;\r\n } else {\r\n callback = undefined$1;\r\n }\r\n },\r\n\r\n _updateCoordinates: function() {\r\n this.offset = {\r\n x: (this.destination.x - this.origin.x) / 4,\r\n y: (this.destination.y - this.origin.y) / 4\r\n };\r\n\r\n this.origin = {\r\n y: this.origin.y + this.offset.y,\r\n x: this.origin.x + this.offset.x\r\n };\r\n }\r\n });\r\n\r\n var ScrollBar = Class.extend({\r\n init: function(options) {\r\n var that = this,\r\n horizontal = options.axis === \"x\",\r\n element = $('
    ');\r\n\r\n if (horizontal) {\r\n element.attr(\"aria-orientation\", \"horizontal\");\r\n }\r\n\r\n extend(that, options, {\r\n element: element,\r\n elementSize: 0,\r\n movable: new Movable(element),\r\n scrollMovable: options.movable,\r\n alwaysVisible: options.alwaysVisible,\r\n size: horizontal ? \"width\" : \"height\"\r\n });\r\n\r\n that.scrollMovable.bind(CHANGE, that.refresh.bind(that));\r\n that.container.append(element);\r\n if (options.alwaysVisible) {\r\n that.show();\r\n }\r\n },\r\n\r\n refresh: function() {\r\n var that = this,\r\n axis = that.axis,\r\n dimension = that.dimension,\r\n paneSize = dimension.size,\r\n scrollMovable = that.scrollMovable,\r\n sizeRatio = paneSize / dimension.total,\r\n position = Math.round(-scrollMovable[axis] * sizeRatio),\r\n size = Math.round(paneSize * sizeRatio);\r\n\r\n if (sizeRatio >= 1) {\r\n this.element.css(\"display\", \"none\");\r\n } else {\r\n this.element.css(\"display\", \"\");\r\n }\r\n\r\n if (position + size > paneSize) {\r\n size = paneSize - position;\r\n } else if (position < 0) {\r\n size += position;\r\n position = 0;\r\n }\r\n\r\n if (that.elementSize != size) {\r\n that.element.css(that.size, size + \"px\");\r\n that.elementSize = size;\r\n }\r\n\r\n that._ariaValue(position, dimension.size - that.elementSize);\r\n\r\n that.movable.moveAxis(axis, position);\r\n },\r\n\r\n show: function() {\r\n this.element.css({ opacity: SCROLLBAR_OPACITY, visibility: \"visible\" });\r\n },\r\n\r\n hide: function() {\r\n if (!this.alwaysVisible) {\r\n this.element.css({ opacity: 0 });\r\n }\r\n },\r\n\r\n _ariaValue: function(current, total) {\r\n var element = this.element;\r\n\r\n if (current > total) {\r\n current = total;\r\n }\r\n\r\n element.attr(\"aria-valuemax\", total);\r\n element.attr(\"aria-valuenow\", current);\r\n }\r\n });\r\n\r\n var Scroller = Widget.extend({\r\n init: function(element, options) {\r\n var that = this;\r\n Widget.fn.init.call(that, element, options);\r\n\r\n element = that.element;\r\n\r\n that._native = that.options.useNative && kendo.support.hasNativeScrolling;\r\n if (that._native) {\r\n element.addClass(\"km-native-scroller\")\r\n .prepend('
    ');\r\n\r\n extend(that, {\r\n scrollElement: element,\r\n fixedContainer: element.children().first()\r\n });\r\n\r\n return;\r\n }\r\n\r\n element\r\n .css(\"overflow\", \"hidden\")\r\n .addClass(\"km-scroll-wrapper\")\r\n .wrapInner('
    ')\r\n .prepend('
    ');\r\n\r\n var inner = element.children().eq(1),\r\n\r\n tapCapture = new kendo.TapCapture(element),\r\n\r\n movable = new Movable(inner),\r\n\r\n dimensions = new PaneDimensions({\r\n element: inner,\r\n container: element,\r\n forcedEnabled: that.options.zoom\r\n }),\r\n\r\n avoidScrolling = this.options.avoidScrolling,\r\n\r\n userEvents = new kendo.UserEvents(element, {\r\n touchAction: \"pan-y\",\r\n fastTap: true,\r\n allowSelection: true,\r\n preventDragEvent: true,\r\n captureUpIfMoved: true,\r\n multiTouch: that.options.zoom,\r\n supportDoubleTap: that.options.supportDoubleTap,\r\n start: function(e) {\r\n dimensions.refresh();\r\n\r\n var velocityX = abs(e.x.velocity),\r\n velocityY = abs(e.y.velocity),\r\n horizontalSwipe = velocityX * 2 >= velocityY,\r\n originatedFromFixedContainer = $.contains(that.fixedContainer[0], e.event.target),\r\n verticalSwipe = velocityY * 2 >= velocityX;\r\n\r\n\r\n if (!originatedFromFixedContainer && !avoidScrolling(e) && that.enabled && (dimensions.x.enabled && horizontalSwipe || dimensions.y.enabled && verticalSwipe)) {\r\n userEvents.capture();\r\n } else {\r\n userEvents.cancel();\r\n }\r\n }\r\n }),\r\n\r\n pane = new Pane({\r\n movable: movable,\r\n dimensions: dimensions,\r\n userEvents: userEvents,\r\n elastic: that.options.elastic\r\n }),\r\n\r\n zoomSnapBack = new ZoomSnapBack({\r\n movable: movable,\r\n dimensions: dimensions,\r\n userEvents: userEvents,\r\n tapCapture: tapCapture\r\n }),\r\n\r\n animatedScroller = new AnimatedScroller({\r\n moveTo: function(coordinates) {\r\n that.scrollTo(coordinates.x, coordinates.y);\r\n }\r\n });\r\n\r\n movable.bind(CHANGE, function() {\r\n that.scrollTop = - movable.y;\r\n that.scrollLeft = - movable.x;\r\n\r\n that.trigger(SCROLL, {\r\n scrollTop: that.scrollTop,\r\n scrollLeft: that.scrollLeft\r\n });\r\n });\r\n\r\n if (that.options.mousewheelScrolling) {\r\n element.on(\"DOMMouseScroll mousewheel\", this._wheelScroll.bind(this));\r\n }\r\n\r\n extend(that, {\r\n movable: movable,\r\n dimensions: dimensions,\r\n zoomSnapBack: zoomSnapBack,\r\n animatedScroller: animatedScroller,\r\n userEvents: userEvents,\r\n pane: pane,\r\n tapCapture: tapCapture,\r\n pulled: false,\r\n enabled: true,\r\n scrollElement: inner,\r\n scrollTop: 0,\r\n scrollLeft: 0,\r\n fixedContainer: element.children().first()\r\n });\r\n\r\n that._initAxis(\"x\");\r\n that._initAxis(\"y\");\r\n\r\n // build closure\r\n that._wheelEnd = function() {\r\n that._wheel = false;\r\n that.userEvents.end(0, that._wheelY);\r\n };\r\n\r\n dimensions.refresh();\r\n\r\n if (that.options.pullToRefresh) {\r\n that._initPullToRefresh();\r\n }\r\n },\r\n\r\n _wheelScroll: function(e) {\r\n if (e.ctrlKey) {\r\n return;\r\n }\r\n\r\n if (!this._wheel) {\r\n this._wheel = true;\r\n this._wheelY = 0;\r\n this.userEvents.press(0, this._wheelY);\r\n }\r\n\r\n clearTimeout(this._wheelTimeout);\r\n this._wheelTimeout = setTimeout(this._wheelEnd, 50);\r\n\r\n var delta = kendo.wheelDeltaY(e);\r\n\r\n if (delta) {\r\n this._wheelY += delta;\r\n this.userEvents.move(0, this._wheelY);\r\n }\r\n\r\n e.preventDefault();\r\n },\r\n\r\n makeVirtual: function() {\r\n this.dimensions.y.makeVirtual();\r\n },\r\n\r\n virtualSize: function(min, max) {\r\n this.dimensions.y.virtualSize(min, max);\r\n },\r\n\r\n height: function() {\r\n return this.dimensions.y.size;\r\n },\r\n\r\n scrollHeight: function() {\r\n return this.scrollElement[0].scrollHeight;\r\n },\r\n\r\n scrollWidth: function() {\r\n return this.scrollElement[0].scrollWidth;\r\n },\r\n\r\n options: {\r\n name: \"Scroller\",\r\n zoom: false,\r\n pullOffset: 140,\r\n visibleScrollHints: false,\r\n elastic: true,\r\n useNative: false,\r\n mousewheelScrolling: true,\r\n avoidScrolling: function() { return false; },\r\n pullToRefresh: false,\r\n messages: {\r\n pullTemplate: \"Pull to refresh\",\r\n releaseTemplate: \"Release to refresh\",\r\n refreshTemplate: \"Refreshing\"\r\n }\r\n },\r\n\r\n events: [\r\n PULL,\r\n SCROLL,\r\n RESIZE\r\n ],\r\n\r\n _resize: function() {\r\n if (!this._native) {\r\n this.contentResized();\r\n }\r\n },\r\n\r\n setOptions: function(options) {\r\n var that = this;\r\n Widget.fn.setOptions.call(that, options);\r\n if (options.pullToRefresh) {\r\n that._initPullToRefresh();\r\n }\r\n },\r\n\r\n reset: function() {\r\n if (this._native) {\r\n this.scrollElement.scrollTop(0);\r\n } else {\r\n this.movable.moveTo({ x: 0, y: 0 });\r\n this._scale(1);\r\n }\r\n },\r\n\r\n contentResized: function() {\r\n this.dimensions.refresh();\r\n if (this.pane.x.outOfBounds()) {\r\n this.movable.moveAxis(\"x\", this.dimensions.x.min);\r\n }\r\n\r\n if (this.pane.y.outOfBounds()) {\r\n this.movable.moveAxis(\"y\", this.dimensions.y.min);\r\n }\r\n },\r\n\r\n zoomOut: function() {\r\n var dimensions = this.dimensions;\r\n dimensions.refresh();\r\n this._scale(dimensions.fitScale);\r\n this.movable.moveTo(dimensions.centerCoordinates());\r\n },\r\n\r\n enable: function() {\r\n this.enabled = true;\r\n },\r\n\r\n disable: function() {\r\n this.enabled = false;\r\n },\r\n\r\n scrollTo: function(x, y) {\r\n if (this._native) {\r\n kendo.scrollLeft(this.scrollElement, abs(x));\r\n this.scrollElement.scrollTop(abs(y));\r\n } else {\r\n this.dimensions.refresh();\r\n this.movable.moveTo({ x: x, y: y });\r\n }\r\n },\r\n\r\n animatedScrollTo: function(x, y, callback) {\r\n var from,\r\n to;\r\n\r\n if (this._native) {\r\n this.scrollTo(x, y);\r\n } else {\r\n from = { x: this.movable.x, y: this.movable.y };\r\n to = { x: x, y: y };\r\n\r\n this.animatedScroller.setCoordinates(from, to);\r\n this.animatedScroller.setCallback(callback);\r\n this.animatedScroller.start();\r\n }\r\n },\r\n\r\n pullHandled: function() {\r\n var that = this;\r\n that.refreshHint.removeClass(REFRESHCLASS);\r\n that.hintContainer.html(that.pullTemplate({}));\r\n that.yinertia.onEnd();\r\n that.xinertia.onEnd();\r\n that.userEvents.cancel();\r\n },\r\n\r\n destroy: function() {\r\n Widget.fn.destroy.call(this);\r\n if (this.userEvents) {\r\n this.userEvents.destroy();\r\n }\r\n },\r\n\r\n _scale: function(scale) {\r\n this.dimensions.rescale(scale);\r\n this.movable.scaleTo(scale);\r\n },\r\n\r\n _initPullToRefresh: function() {\r\n var that = this;\r\n\r\n that.dimensions.y.forceEnabled();\r\n that.pullTemplate = kendo.template(that.options.messages.pullTemplate);\r\n that.releaseTemplate = kendo.template(that.options.messages.releaseTemplate);\r\n that.refreshTemplate = kendo.template(that.options.messages.refreshTemplate);\r\n\r\n that.scrollElement.prepend('' + that.pullTemplate({}) + '');\r\n that.refreshHint = that.scrollElement.children().first();\r\n that.hintContainer = that.refreshHint.children(\".km-template\");\r\n\r\n that.pane.y.bind(\"change\", that._paneChange.bind(that));\r\n that.userEvents.bind(\"end\", that._dragEnd.bind(that));\r\n },\r\n\r\n _dragEnd: function() {\r\n var that = this;\r\n\r\n if (!that.pulled) {\r\n return;\r\n }\r\n\r\n that.pulled = false;\r\n that.refreshHint.removeClass(RELEASECLASS).addClass(REFRESHCLASS);\r\n that.hintContainer.html(that.refreshTemplate({}));\r\n that.yinertia.freeze(that.options.pullOffset / 2);\r\n that.trigger(\"pull\");\r\n },\r\n\r\n _paneChange: function() {\r\n var that = this;\r\n\r\n if (that.movable.y / OUT_OF_BOUNDS_FRICTION > that.options.pullOffset) {\r\n if (!that.pulled) {\r\n that.pulled = true;\r\n that.refreshHint.removeClass(REFRESHCLASS).addClass(RELEASECLASS);\r\n that.hintContainer.html(that.releaseTemplate({}));\r\n }\r\n } else if (that.pulled) {\r\n that.pulled = false;\r\n that.refreshHint.removeClass(RELEASECLASS);\r\n that.hintContainer.html(that.pullTemplate({}));\r\n }\r\n },\r\n\r\n _initAxis: function(axis) {\r\n var that = this,\r\n elementId = that.element.attr(\"id\"),\r\n movable = that.movable,\r\n dimension = that.dimensions[axis],\r\n tapCapture = that.tapCapture,\r\n paneAxis = that.pane[axis],\r\n scrollBar;\r\n\r\n if (!elementId) {\r\n elementId = kendo.guid();\r\n that.element.attr(\"id\", elementId);\r\n }\r\n\r\n scrollBar = new ScrollBar({\r\n axis: axis,\r\n movable: movable,\r\n dimension: dimension,\r\n container: that.element,\r\n alwaysVisible: that.options.visibleScrollHints,\r\n controlsId: elementId\r\n });\r\n\r\n dimension.bind(CHANGE, function() {\r\n scrollBar.refresh();\r\n });\r\n\r\n paneAxis.bind(CHANGE, function() {\r\n scrollBar.show();\r\n });\r\n\r\n that[axis + \"inertia\"] = new DragInertia({\r\n axis: axis,\r\n paneAxis: paneAxis,\r\n movable: movable,\r\n tapCapture: tapCapture,\r\n userEvents: that.userEvents,\r\n dimension: dimension,\r\n elastic: that.options.elastic,\r\n friction: that.options.friction || FRICTION,\r\n velocityMultiplier: that.options.velocityMultiplier || VELOCITY_MULTIPLIER,\r\n end: function() {\r\n scrollBar.hide();\r\n that.trigger(\"scrollEnd\", {\r\n axis: axis,\r\n scrollTop: that.scrollTop,\r\n scrollLeft: that.scrollLeft\r\n });\r\n }\r\n });\r\n }\r\n });\r\n\r\n ui.plugin(Scroller);\r\n })(window.kendo.jQuery);\r\n var kendo$2l = kendo;\r\n\r\n var __meta__$2k = {\r\n id: \"html.chip\",\r\n name: \"Html.Chip\",\r\n category: \"web\",\r\n description: \"HTML rendering utility for Kendo UI for jQuery.\",\r\n depends: [ \"html.base\", \"icons\" ],\r\n features: []\r\n };\r\n\r\n (function($, undefined$1) {\r\n var kendo = window.kendo,\r\n HTMLBase = kendo.html.HTMLBase;\r\n\r\n var renderChip = function(element, options) {\r\n if (!element || $.isPlainObject(element)) {\r\n options = element;\r\n element = $(\"\");\r\n }\r\n\r\n return (new HTMLChip(element, options)).html();\r\n };\r\n\r\n var HTMLChip = HTMLBase.extend({\r\n init: function(element, options) {\r\n var that = this;\r\n HTMLBase.fn.init.call(that, element, options);\r\n that._wrapper();\r\n },\r\n options: {\r\n name: \"HTMLChip\",\r\n size: \"medium\",\r\n rounded: \"medium\",\r\n fillMode: \"solid\",\r\n themeColor: \"base\",\r\n attr: {},\r\n icon: \"\",\r\n iconClass: \"\",\r\n iconAttr: {},\r\n removable: false,\r\n removableAttr: {},\r\n removeIcon: \"x-circle\",\r\n removeIconClass: \"\",\r\n content: \"\",\r\n text: \"\",\r\n actions: [],\r\n stylingOptions: [ \"size\", \"rounded\", \"fillMode\", \"themeColor\" ]\r\n },\r\n _wrapper: function() {\r\n var that = this,\r\n options = that.options;\r\n\r\n options.text = options.text || options.label;\r\n that.wrapper = that.element.wrap(\"
    \").parent().attr(options.attr);\r\n that._addClasses();\r\n\r\n if (options.icon) {\r\n that.wrapper.prepend($(kendo.ui.icon({ icon: options.icon, size: \"small\", iconClass: `k-chip-icon${options.iconClass ? ` ${options.iconClass}` : '' }` })).attr(options.iconAttr));\r\n } else if (options.iconClass) {\r\n that.wrapper.prepend($(\"\").attr(options.iconAttr));\r\n } else if (options.avatarClass) {\r\n that.wrapper.prepend($(\"\").attr(options.iconAttr));\r\n }\r\n\r\n that.element.addClass(\"k-chip-content\");\r\n if (options.text) {\r\n that.element.html('' + options.text + '');\r\n }\r\n\r\n if (options.visible === false) {\r\n that.wrapper.addClass(\"k-hidden\");\r\n }\r\n\r\n if (options.selected === true) {\r\n that.wrapper.addClass(\"k-selected\");\r\n }\r\n\r\n if (options.enabled === false) {\r\n that.wrapper.addClass(\"k-disabled\");\r\n }\r\n\r\n if ((options.actions && options.actions.length > 0) || options.removable) {\r\n that._actions();\r\n }\r\n\r\n\r\n },\r\n _actions: function() {\r\n var that = this,\r\n options = that.options;\r\n\r\n that.actionsWrapper = $(\"\");\r\n that.actionsWrapper.appendTo(that.wrapper);\r\n\r\n if (options.actions && options.actions.length > 0) {\r\n for (var i = 0; i < options.actions.length; i++) {\r\n var action = options.actions[i];\r\n that.actionsWrapper.append($(`${kendo.ui.icon({ icon: action.icon, size: \"small\" })}`).attr(action.attr ? action.attr : {}));\r\n }\r\n }\r\n\r\n if (options.removable) {\r\n that.actionsWrapper.append($(`${kendo.ui.icon({ icon: options.removeIcon, size: \"small\" })}`).attr(options.removableAttr));\r\n }\r\n }\r\n });\r\n\r\n $.extend(kendo.html, {\r\n renderChip: renderChip,\r\n HTMLChip: HTMLChip\r\n });\r\n\r\n kendo.cssProperties.registerPrefix(\"HTMLChip\", \"k-chip-\");\r\n\r\n kendo.cssProperties.registerValues(\"HTMLChip\", [{\r\n prop: \"rounded\",\r\n values: kendo.cssProperties.roundedValues.concat([['full', 'full']])\r\n }]);\r\n\r\n })(window.kendo.jQuery);\r\n var kendo$2k = kendo;\r\n\r\n var __meta__$2j = {\r\n id: \"chip\",\r\n name: \"Chip\",\r\n category: \"web\", // suite\r\n docsCategory: \"navigation\",\r\n description: \"Displays a Chip that represents an input, attribute or an action\",\r\n depends: [\"core\", \"html.chip\"] // dependencies\r\n };\r\n\r\n (function($, undefined$1) {\r\n var kendo = window.kendo;\r\n var Widget = kendo.ui.Widget;\r\n var html = kendo.html;\r\n var ui = kendo.ui,\r\n keys = kendo.keys,\r\n SELECT = \"select\",\r\n CLICK = \"click\",\r\n REMOVE = \"remove\";\r\n\r\n var NS = \".kendoChip\",\r\n DOT = \".\";\r\n\r\n\r\n var chipStyles = {\r\n widget: \"k-chip\",\r\n iconElement: \"k-chip-icon\",\r\n removeIconElement: \"k-chip-remove-action\",\r\n selected: \"k-selected\",\r\n disabled: \"k-disabled\",\r\n focus: \"k-focus\",\r\n avatarClass: \"k-chip-avatar\"\r\n };\r\n\r\n var Chip = Widget.extend({\r\n init: function(element, options) {\r\n var that = this;\r\n\r\n Widget.fn.init.call(that, element, options);\r\n html.renderChip(element, $.extend({},that.options));\r\n\r\n options = that.options;\r\n\r\n that.wrapper = that.element.closest(\".k-chip\");\r\n that._enabled = that.options.enabled = options.enabled !== undefined$1 ? options.enabled : !(Boolean(that.element.is(\"[disabled]\")));\r\n that._selected = that.options.selected;\r\n that._selectable = that.options.selectable;\r\n\r\n that._setTabIndex();\r\n\r\n that._applyAriaAttributes();\r\n that._bindEvents();\r\n kendo.notify(that);\r\n },\r\n\r\n options: {\r\n name: 'Chip',\r\n enabled: true,\r\n selectable: false,\r\n selected: false,\r\n removable: false,\r\n icon: '',\r\n iconClass: '',\r\n avatarClass: '',\r\n label: '',\r\n removeIcon: 'x-circle',\r\n removeIconClass: '',\r\n fillMode: 'solid',\r\n rounded: 'medium',\r\n size: 'medium',\r\n themeColor: 'base'\r\n },\r\n\r\n events: [\r\n SELECT,\r\n CLICK,\r\n REMOVE\r\n ],\r\n\r\n destroy: function() {\r\n var that = this;\r\n\r\n that.wrapper.off(NS);\r\n Widget.fn.destroy.call(that);\r\n },\r\n\r\n setOptions: function(options) {\r\n var that = this;\r\n\r\n that.wrapper.off(NS);\r\n that.element.insertBefore(that.wrapper);\r\n that.wrapper.remove();\r\n\r\n Widget.fn.setOptions.call(that, options);\r\n\r\n that.element.empty();\r\n html.renderChip(that.element, that.options);\r\n\r\n that.wrapper = that.element.closest(\".k-chip\");\r\n\r\n that._setTabIndex();\r\n that._applyAriaAttributes();\r\n that._bindEvents();\r\n },\r\n\r\n enable: function(state) {\r\n var that = this;\r\n if (state === undefined$1) {\r\n return that._enabled;\r\n }\r\n\r\n that._enabled = state !== false;\r\n that.wrapper.toggleClass(chipStyles.disabled, !that._enabled);\r\n that.wrapper.attr(\"aria-disabled\", !that._enabled);\r\n },\r\n\r\n select: function(state) {\r\n var that = this;\r\n\r\n if (state == undefined$1) {\r\n return that._selected;\r\n }\r\n\r\n state = state !== false;\r\n\r\n if (that._selectable) {\r\n that._selected = state;\r\n that.wrapper.toggleClass(chipStyles.selected, state);\r\n }\r\n\r\n that._applyAriaAttributes();\r\n },\r\n\r\n focus: function() {\r\n if (this._enabled) {\r\n this.wrapper.focus();\r\n }\r\n },\r\n\r\n _bindEvents: function() {\r\n var that = this,\r\n clickProxy = that._click.bind(that),\r\n removeProxy = that._remove.bind(that),\r\n keydownProxy = that._keydown.bind(that);\r\n\r\n that.wrapper.on(CLICK + \" touchend\" + NS, clickProxy)\r\n .on(CLICK + \" touchend\" + NS, DOT + chipStyles.removeIconElement, removeProxy)\r\n .on(\"keydown\" + NS, keydownProxy);\r\n },\r\n\r\n _click: function(ev) {\r\n var that = this;\r\n\r\n if (!that.enable()) {\r\n ev.preventDefault();\r\n return;\r\n }\r\n\r\n if (that.trigger(CLICK, { originalEvent: ev })) {\r\n return;\r\n }\r\n\r\n that._triggerSelect(that, ev);\r\n },\r\n\r\n _remove: function(ev) {\r\n ev.preventDefault();\r\n ev.stopPropagation();\r\n\r\n var that = this;\r\n\r\n if (!that.enable()) {\r\n ev.preventDefault();\r\n return;\r\n }\r\n\r\n that.trigger(REMOVE, { originalEvent: ev });\r\n },\r\n\r\n _triggerSelect: function(item, ev) {\r\n var that = this;\r\n\r\n if (!that._selectable || !that._enabled || that.trigger(SELECT, { originalEvent: ev })) {\r\n return;\r\n }\r\n\r\n that._toggleSelect();\r\n },\r\n\r\n _toggleSelect: function() {\r\n var that = this;\r\n that.select(!that.select());\r\n },\r\n\r\n _keydown: function(ev) {\r\n var that = this,\r\n target = $(ev.target),\r\n key = ev.keyCode;\r\n\r\n if (key === keys.ENTER || key === keys.SPACEBAR) {\r\n if (!that.enable()) {\r\n ev.preventDefault();\r\n return;\r\n }\r\n\r\n if (that.trigger(CLICK, { originalEvent: ev })) {\r\n return;\r\n }\r\n\r\n that._triggerSelect(target, ev);\r\n\r\n if (key === keys.SPACEBAR) {\r\n ev.preventDefault();\r\n }\r\n } else if (key === keys.DELETE || key === keys.BACKSPACE) {\r\n if (that.options.removable) {\r\n that.trigger(REMOVE, { originalEvent: ev });\r\n }\r\n }\r\n },\r\n\r\n _setTabIndex: function() {\r\n var that = this;\r\n var tabindex = that.enable() ? that.options.tabindex || \"0\" : \"-1\";\r\n if (that.options.attributes && that.options.attributes.class) {\r\n that.options.attributes.class = `${that.wrapper.attr(\"class\") || ''} ${that.options.attributes.class}`;\r\n }\r\n\r\n that.wrapper.attr($.extend({}, that.options.attributes, {\r\n tabindex: tabindex,\r\n // skip rendering of this attribute\r\n ariaSelectedAttributeName: null\r\n }));\r\n },\r\n\r\n _applyAriaAttributes: function() {\r\n var that = this;\r\n var role = (that.options.attributes || {}).role || \"button\";\r\n\r\n that.wrapper.attr(\"role\", role);\r\n if (that._selectable && role == \"button\") {\r\n that.wrapper.attr(\"aria-pressed\", that._selected);\r\n }\r\n that.wrapper.attr(\"aria-disabled\", that.enable() === false);\r\n }\r\n });\r\n\r\n ui.plugin(Chip);\r\n\r\n })(window.kendo.jQuery);\r\n var kendo$2j = kendo;\r\n\r\n var __meta__$2i = {\r\n id: \"html.chiplist\",\r\n name: \"Html.ChipList\",\r\n category: \"web\",\r\n description: \"HTML rendering utility for Kendo UI for jQuery.\",\r\n depends: [\"html.base\"],\r\n features: []\r\n };\r\n\r\n (function($, undefined$1) {\r\n var kendo = window.kendo,\r\n HTMLBase = kendo.html.HTMLBase;\r\n\r\n var renderChipList = function(element, options) {\r\n if (arguments[0] === undefined$1 || $.isPlainObject(arguments[0])) {\r\n options = element;\r\n element = $(\"
    \");\r\n }\r\n\r\n return (new HTMLChipList(element, options)).html();\r\n };\r\n\r\n var HTMLChipList = HTMLBase.extend({\r\n init: function(element, options) {\r\n var that = this;\r\n HTMLBase.fn.init.call(that, element, options);\r\n that.wrapper = that.element.addClass(\"k-chip-list\");\r\n that._applyAriaAttributes(options);\r\n that._addClasses();\r\n },\r\n options: {\r\n name: \"HTMLChipList\",\r\n size: \"medium\",\r\n stylingOptions: [\"size\"]\r\n },\r\n _applyAriaAttributes: function(options) {\r\n var that = this;\r\n options = $.extend({ selectable: \"none\" }, options);\r\n var ariaLabelOption = (options.attributes || {})[\"aria-label\"];\r\n\r\n if (options.selectable !== \"none\") {\r\n that.element.attr({\r\n \"aria-multiselectable\": options.selectable === \"multiple\",\r\n role: \"listbox\",\r\n \"aria-label\": ariaLabelOption || that.element.attr(\"id\") + \" listbox\",\r\n \"aria-orientation\": \"horizontal\"\r\n });\r\n } else {\r\n that.element.removeAttr(\"role aria-label aria-multiselectable aria-orientation\");\r\n }\r\n }\r\n });\r\n\r\n $.extend(kendo.html, {\r\n renderChipList: renderChipList,\r\n HTMLChipList: HTMLChipList\r\n });\r\n\r\n kendo.cssProperties.registerPrefix(\"HTMLChipList\", \"k-chip-list-\");\r\n\r\n })(window.kendo.jQuery);\r\n var kendo$2i = kendo;\r\n\r\n var __meta__$2h = {\r\n id: \"chiplist\",\r\n name: \"ChipList\",\r\n category: \"web\",\r\n docsCategory: \"navigation\",\r\n description: \"The ChipList component.\",\r\n depends: [\"core\", \"chip\", \"html.chiplist\"]\r\n };\r\n (function($, undefined$1) {\r\n var kendo = window.kendo,\r\n ui = kendo.ui,\r\n Widget = ui.Widget,\r\n keys = kendo.keys,\r\n isPlainObject = $.isPlainObject,\r\n isEmptyObject = $.isEmptyObject,\r\n\r\n NS = \".kendoChipList\",\r\n PREFIX = \"k-chip-list-\",\r\n DOT = \".\",\r\n\r\n SELECT = \"select\",\r\n REMOVE = \"remove\";\r\n var html = kendo.html;\r\n\r\n var chipListStyles = {\r\n widget: \"k-chip-list\",\r\n item: \"k-chip\",\r\n selected: \"k-selected\",\r\n disabled: \"k-disabled\",\r\n enabledItemSelector: \"k-chip:not(.k-disabled)\"\r\n };\r\n\r\n var ChipList = Widget.extend({\r\n init: function(element, options) {\r\n var that = this;\r\n options = options || {};\r\n Widget.fn.init.call(that, element, options);\r\n\r\n html.renderChipList(element, $.extend({}, options));\r\n\r\n that._selectable = that.options.selectable;\r\n that._bindEvents();\r\n that._items();\r\n },\r\n\r\n options: {\r\n name: \"ChipList\",\r\n selectable: \"none\",\r\n items: [],\r\n fillMode: \"solid\",\r\n rounded: \"medium\",\r\n size: \"medium\",\r\n itemSize: \"medium\"\r\n },\r\n\r\n events: [\r\n SELECT,\r\n REMOVE\r\n ],\r\n\r\n destroy: function() {\r\n var that = this;\r\n\r\n if (that._keydownProxy) {\r\n that.unbind(that._keydownProxy);\r\n that._keydownProxy = null;\r\n }\r\n\r\n if (that._selectProxy) {\r\n that.unbind(that._selectProxy);\r\n that._selectProxy = null;\r\n }\r\n\r\n if (that._removeProxy) {\r\n that.unbind(that._removeProxy);\r\n that._removeProxy = null;\r\n }\r\n\r\n that.element.off(NS);\r\n that.element.find(\"[data-role='chip']\").each(function() {\r\n that._getChipFromElement(this).destroy();\r\n });\r\n\r\n Widget.fn.destroy.call(this);\r\n },\r\n\r\n _updateCssClasses: function() {\r\n var that = this,\r\n options = that.options,\r\n styles = chipListStyles;\r\n\r\n // Remove all class names\r\n that.element.removeClass(function(index, className) {\r\n if (className.indexOf('k-') === 0) {\r\n that.element.removeClass(className);\r\n }\r\n });\r\n\r\n that.element.addClass(styles.widget);\r\n that.element.addClass(kendo.getValidCssClass(PREFIX, \"size\", options.size));\r\n },\r\n\r\n _getInitializeChipOptions: function(itemOptions) {\r\n var that = this,\r\n options = that.options;\r\n\r\n var attributes = $.extend(itemOptions.attributes || {}, {\r\n tabindex: \"-1\"\r\n });\r\n\r\n if (options.selectable !== \"none\") {\r\n attributes.role = \"option\";\r\n attributes[\"aria-selected\"] = itemOptions.selected;\r\n }\r\n\r\n if (options.removable || itemOptions.removable) {\r\n attributes[\"aria-keyshortcuts\"] = \"Enter Delete\";\r\n }\r\n\r\n return $.extend({\r\n fillMode: options.fillMode,\r\n size: options.itemSize,\r\n rounded: options.rounded,\r\n selectable: options.selectable !== \"none\",\r\n removable: options.removable,\r\n remove: that._removeProxy,\r\n select: that._selectProxy,\r\n }, itemOptions, { attributes: attributes });\r\n },\r\n\r\n _getChipFromElement: function(element) {\r\n return $(element).getKendoChip() || $(element).find(\"[data-role='chip']\").getKendoChip();\r\n },\r\n\r\n _items: function() {\r\n var that = this,\r\n options = that.options,\r\n items = options.items,\r\n chipOptions,\r\n selectedItems,\r\n chipEl,\r\n firstNavigatableItem,\r\n item;\r\n\r\n for (var i = 0; i < items.length; i++) {\r\n chipOptions = that._getInitializeChipOptions(items[i]);\r\n chipEl = $(\"\");\r\n that.element.append(chipEl);\r\n item = that._createChip(chipEl, chipOptions);\r\n }\r\n\r\n firstNavigatableItem = that._getFirstNavigatableItem();\r\n if (firstNavigatableItem) {\r\n that._applyTabIndex(that.items().index(firstNavigatableItem));\r\n }\r\n\r\n if (that._selectable === \"single\") {\r\n selectedItems = that.items().filter(DOT + chipListStyles.selected);\r\n selectedItems.each(function(ind, ch) {\r\n if (ind !== selectedItems.length - 1) {\r\n var chip = that._getChipFromElement(ch);\r\n if (chip) {\r\n chip.select(false);\r\n }\r\n }\r\n });\r\n }\r\n },\r\n\r\n _isItem: function(item) {\r\n var that = this;\r\n\r\n item = $(item);\r\n\r\n return item.is(DOT + chipListStyles.item) && !!that.element.find(item).length;\r\n },\r\n\r\n _applyTabIndex: function(index) {\r\n var that = this;\r\n var itemElement = that.item(+index ? +index : 0);\r\n\r\n that.items().each(function(ind, el) {\r\n $(el).attr(\"tabindex\", \"-1\");\r\n });\r\n\r\n itemElement.attr(\"tabindex\", \"0\");\r\n },\r\n\r\n _createChip: function(element, chipOptions) {\r\n return element.kendoChip(chipOptions);\r\n },\r\n\r\n _bindEvents: function() {\r\n var that = this;\r\n that._keydownProxy = that._keydown.bind(that);\r\n that._selectProxy = that._select.bind(that);\r\n that._removeProxy = that._remove.bind(that);\r\n\r\n that.element.on(\"keydown\" + NS, DOT + chipListStyles.item, that._keydownProxy);\r\n },\r\n\r\n _select: function(ev) {\r\n var that = this,\r\n chip = ev.sender;\r\n\r\n if (that._selectable == \"none\") {\r\n ev.preventDefault();\r\n return;\r\n }\r\n\r\n that._triggerSelect(chip, ev);\r\n },\r\n\r\n _triggerSelect: function(item, ev) {\r\n var that = this,\r\n selectedItems;\r\n\r\n if (that.element.is(DOT + chipListStyles.disabled)) {\r\n return;\r\n }\r\n\r\n if (that.trigger(SELECT, { originalEvent: ev, item: item })) {\r\n return;\r\n }\r\n\r\n if (that._selectable === \"single\") {\r\n selectedItems = that.select();\r\n if (selectedItems.length > 0) {\r\n selectedItems.each(function(ind, selectedChipElement) {\r\n var chip = that._getChipFromElement(selectedChipElement);\r\n if (chip && chip !== item) {\r\n chip.select(false);\r\n }\r\n });\r\n }\r\n }\r\n },\r\n\r\n _remove: function(ev) {\r\n var that = this,\r\n chip = ev.sender;\r\n\r\n if (that.trigger(REMOVE, { originalEvent: ev, item: ev.sender })) {\r\n return;\r\n }\r\n\r\n that._removeItem(chip);\r\n },\r\n\r\n _removeItem: function(chip) {\r\n var that = this;\r\n if (chip) {\r\n var el = chip.wrapper;\r\n chip.destroy();\r\n el.remove();\r\n that._focusNavigatableItem();\r\n }\r\n },\r\n\r\n _keydown: function(ev) {\r\n // change the tabindex to the next/prev chip\r\n // and remove it from the others\r\n var that = this,\r\n target = $(ev.target).closest(DOT + chipListStyles.item),\r\n key = ev.keyCode;\r\n\r\n if (key === keys.LEFT || key === keys.RIGHT) {\r\n that._focusNavigatableItem(key, target);\r\n }\r\n // add support for Home and End keys?\r\n },\r\n\r\n _focusNavigatableItem: function(key, target) {\r\n var that = this;\r\n var nextCandidate = that._getNavigatableItem(key, target);\r\n if (nextCandidate) {\r\n that._applyTabIndex(that.items().index(nextCandidate));\r\n nextCandidate.focus();\r\n }\r\n },\r\n\r\n _getFirstNavigatableItem: function() {\r\n var that = this;\r\n return that.items().filter(DOT + chipListStyles.enabledItemSelector).first();\r\n },\r\n\r\n _getLastNavigatableItem: function() {\r\n var that = this;\r\n return that.items().filter(DOT + chipListStyles.enabledItemSelector).last();\r\n },\r\n\r\n _getNavigatableItem: function(key, target) {\r\n var that = this;\r\n var current;\r\n\r\n if (target) {\r\n current = target;\r\n } else {\r\n current = that._getFirstNavigatableItem();\r\n }\r\n\r\n if (key === keys.LEFT && target) {\r\n current = target.prevAll(DOT + chipListStyles.enabledItemSelector).first();\r\n }\r\n\r\n if (key === keys.RIGHT && target) {\r\n current = target.nextAll(DOT + chipListStyles.enabledItemSelector).first();\r\n }\r\n\r\n return current.length ? current : null;\r\n },\r\n\r\n items: function() {\r\n var that = this;\r\n return that.element.children();\r\n },\r\n\r\n select: function(item, state) {\r\n var that = this,\r\n chip,\r\n selectedItems = that.items().filter(DOT + chipListStyles.selected);\r\n\r\n if (!item) {\r\n return selectedItems;\r\n }\r\n\r\n state = state !== false;\r\n\r\n chip = that._getChipFromElement(item);\r\n if (chip) {\r\n if (that._selectable === \"single\") {\r\n selectedItems = that.select();\r\n if (selectedItems.length > 0) {\r\n selectedItems.each(function(ind, selectedChipElement) {\r\n var chip = that._getChipFromElement(selectedChipElement);\r\n if (chip && chip !== item) {\r\n chip.select(false);\r\n }\r\n });\r\n }\r\n }\r\n\r\n chip.select(state);\r\n }\r\n },\r\n\r\n enable: function(item, state) {\r\n var chip = this._getChipFromElement(item);\r\n state = state !== false;\r\n\r\n if (chip) {\r\n chip.enable(state);\r\n }\r\n },\r\n\r\n item: function(index) {\r\n var that = this;\r\n\r\n if (isNaN(index)) {\r\n return null;\r\n }\r\n\r\n return that.items().eq(index);\r\n },\r\n\r\n itemById: function(id) {\r\n var that = this;\r\n\r\n return that.element.find(\"#\" + id);\r\n },\r\n\r\n add: function(item, before) {\r\n // add validation to get element, options object and a Chip widget\r\n var that = this,\r\n method = \"append\",\r\n chip,\r\n chipEl,\r\n targetElement = that.element;\r\n\r\n if (before && that._isItem(before)) {\r\n method = \"before\";\r\n targetElement = $(before);\r\n }\r\n\r\n chip = that._getChipFromElement(item);\r\n if (chip) {\r\n if (that._selectable !== \"none\") {\r\n chip.wrapper.attr(\"role\", \"option\");\r\n }\r\n\r\n targetElement[method](chip.wrapper);\r\n } else if (item && isPlainObject(item) && !isEmptyObject(item)) {\r\n chipEl = $(\"\");\r\n targetElement[method](chipEl);\r\n that._createChip(chipEl, that._getInitializeChipOptions(item));\r\n }\r\n },\r\n\r\n remove: function(item) {\r\n var that = this;\r\n\r\n if (item && that._isItem(item)) {\r\n kendo.destroy(item);\r\n item.remove();\r\n that._focusNavigatableItem();\r\n }\r\n },\r\n\r\n setOptions: function(options) {\r\n var that = this;\r\n\r\n Widget.fn.setOptions.call(this, options);\r\n that._updateCssClasses();\r\n\r\n if (options.items) {\r\n that.element.empty();\r\n that._items();\r\n }\r\n }\r\n });\r\n\r\n ui.plugin(ChipList);\r\n })(window.kendo.jQuery);\r\n var kendo$2h = kendo;\r\n\r\n var __meta__$2g = {\r\n id: \"groupable\",\r\n name: \"Groupable\",\r\n category: \"framework\",\r\n depends: [ \"core\", \"draganddrop\", \"icons\" ],\r\n advanced: true\r\n };\r\n\r\n (function($, undefined$1) {\r\n var kendo = window.kendo,\r\n Widget = kendo.ui.Widget,\r\n outerWidth = kendo._outerWidth,\r\n kendoAttr = kendo.attr,\r\n extend = $.extend,\r\n each = $.each,\r\n isRtl = false,\r\n\r\n DIR = \"dir\",\r\n FIELD = \"field\",\r\n TITLE = \"title\",\r\n ASCENDING = \"asc\",\r\n DESCENDING = \"desc\",\r\n REMOVEGROUP = \"removeGroup\",\r\n GROUP_SORT = \"group-sort\",\r\n DROP_CONTAINER = \"k-grouping-drop-container\",\r\n NS = \".kendoGroupable\",\r\n CHANGE = \"change\",\r\n hint = function(target) {\r\n var title = target.attr(kendo.attr(\"title\"));\r\n if (title) {\r\n title = kendo.htmlEncode(title);\r\n }\r\n\r\n return $('
    ')\r\n .html(title || kendo.htmlEncode(target.attr(kendo.attr(\"field\"))))\r\n .prepend(kendo.ui.icon({ icon: \"cancel\", iconClass: \"k-drag-status\" }));\r\n },\r\n dropCue = $('
    ');\r\n\r\n\r\n function removeText(element) {\r\n element.contents().filter(function() {\r\n return this.nodeType === 3;\r\n }).remove();\r\n }\r\n\r\n var Groupable = Widget.extend({\r\n init: function(element, options) {\r\n var that = this,\r\n group = kendo.guid(),\r\n intializePositions = that._intializePositions.bind(that),\r\n draggable,\r\n horizontalCuePosition,\r\n dropCuePositions = that._dropCuePositions = [];\r\n\r\n Widget.fn.init.call(that, element, options);\r\n\r\n isRtl = kendo.support.isRtl(element);\r\n horizontalCuePosition = isRtl ? \"right\" : \"left\";\r\n\r\n that.draggable = draggable = that.options.draggable || new kendo.ui.Draggable(that.element, {\r\n filter: that.options.draggableElements,\r\n hint: hint,\r\n group: group\r\n });\r\n\r\n that.groupContainer = $(that.options.groupContainer, that.element)\r\n .kendoDropTarget({\r\n group: draggable.options.group,\r\n dragenter: function(e) {\r\n if (that._canDrag(e.draggable.currentTarget)) {\r\n kendo.ui.icon(e.draggable.hint.find(\".k-drag-status\"), { icon: \"plus\" });\r\n dropCue.css(horizontalCuePosition, 0).appendTo(that.groupContainer);\r\n }\r\n },\r\n dragleave: function(e) {\r\n kendo.ui.icon(e.draggable.hint.find(\".k-drag-status\"), { icon: \"cancel\" });\r\n\r\n dropCue.remove();\r\n },\r\n drop: function(e) {\r\n var targetElement = e.draggable.currentTarget,\r\n field = targetElement.attr(kendo.attr(\"field\")),\r\n title = targetElement.attr(kendo.attr(\"title\")),\r\n colID = targetElement.attr(\"id\"),\r\n sourceIndicator = that.indicator(field),\r\n dropCuePositions = that._dropCuePositions,\r\n lastCuePosition = dropCuePositions[dropCuePositions.length - 1],\r\n position,\r\n method = \"after\",\r\n parentLeft = isRtl || !lastCuePosition ? 0 : lastCuePosition.element.parent().position().left;\r\n var sortOptions = extend({}, that.options.sort, targetElement.data(GROUP_SORT));\r\n var dir = sortOptions.dir;\r\n\r\n if (!targetElement.hasClass(\"k-chip\") && !that._canDrag(targetElement)) {\r\n return;\r\n }\r\n if (lastCuePosition) {\r\n position = that._dropCuePosition(kendo.getOffset(dropCue).left + parentLeft + parseInt(lastCuePosition.element.css(\"marginLeft\"), 10) * (isRtl ? -1 : 1) + parseInt(lastCuePosition.element.css(\"marginRight\"), 10));\r\n if (position && that._canDrop($(sourceIndicator), position.element, position.left)) {\r\n if (position.before) {\r\n method = \"before\";\r\n }\r\n\r\n position.element[method](sourceIndicator || that.buildIndicator(field, title, dir, colID).wrapper);\r\n that._setIndicatorSortOptions(field, sortOptions);\r\n that._change();\r\n }\r\n } else {\r\n removeText(that._messageContainer);\r\n that._list.element.show();\r\n that._list.add(that.buildIndicator(field, title, dir, colID).element);\r\n that._setIndicatorSortOptions(field, sortOptions);\r\n that._change();\r\n }\r\n }\r\n })\r\n .kendoDraggable({\r\n filter: \"div.k-chip\",\r\n hint: hint,\r\n group: draggable.options.group,\r\n dragcancel: that._dragCancel.bind(that),\r\n dragstart: function(e) {\r\n var element = e.currentTarget,\r\n marginLeft = parseInt(element.css(\"marginLeft\"), 10),\r\n elementPosition = element.position(),\r\n left = isRtl ? elementPosition.left - marginLeft : elementPosition.left + outerWidth(element);\r\n\r\n intializePositions();\r\n dropCue.css(\"left\", left).appendTo(that.groupContainer);\r\n kendo.ui.icon(this.hint.find(\".k-drag-status\"), { icon: \"plus\" });\r\n },\r\n dragend: function() {\r\n that._dragEnd(this);\r\n },\r\n drag: that._drag.bind(that)\r\n });\r\n\r\n draggable.bind([ \"dragend\", \"dragcancel\", \"dragstart\", \"drag\" ],\r\n {\r\n dragend: function() {\r\n that._dragEnd(this);\r\n },\r\n dragcancel: that._dragCancel.bind(that),\r\n dragstart: function(e) {\r\n\r\n if (!that.options.allowDrag && !that._canDrag(e.currentTarget)) {\r\n e.preventDefault();\r\n return;\r\n }\r\n\r\n intializePositions();\r\n },\r\n drag: that._drag.bind(that)\r\n });\r\n\r\n that.dataSource = that.options.dataSource;\r\n that._messageContainer = that.groupContainer.find(\".\" + DROP_CONTAINER);\r\n\r\n if (!that._messageContainer.length) {\r\n that._messageContainer = $('
    ').addClass(DROP_CONTAINER).appendTo(that.groupContainer);\r\n }\r\n\r\n that._createList();\r\n\r\n if (that.dataSource && that._refreshHandler) {\r\n that.dataSource.unbind(CHANGE, that._refreshHandler);\r\n } else {\r\n that._refreshHandler = that.refresh.bind(that);\r\n }\r\n\r\n if (that.dataSource) {\r\n that.dataSource.bind(\"change\", that._refreshHandler);\r\n that.refresh();\r\n }\r\n },\r\n\r\n refresh: function() {\r\n var that = this,\r\n dataSource = that.dataSource;\r\n var groups = dataSource.group() || [];\r\n var fieldAttr = kendoAttr(FIELD);\r\n var titleAttr = kendoAttr(TITLE);\r\n\r\n if (that.groupContainer) {\r\n if (that._list) {\r\n that._list.remove(that._list.items());\r\n that._list.element.hide();\r\n }\r\n\r\n if (groups.length) {\r\n removeText(that._messageContainer);\r\n }\r\n\r\n each(groups, function(index, group) {\r\n var field = group.field;\r\n var dir = group.dir;\r\n var element = that.element\r\n .find(that.options.filter)\r\n .filter(function() {\r\n return $(this).attr(fieldAttr) === field;\r\n });\r\n var indicator = that.buildIndicator(field, element.attr(titleAttr), dir, element.attr(\"id\"));\r\n\r\n that._list.add(indicator.element);\r\n that._list.element.show();\r\n that._setIndicatorSortOptions(field, extend({}, that.options.sort, { dir: dir, compare: group.compare }));\r\n });\r\n }\r\n\r\n that._invalidateGroupContainer();\r\n },\r\n\r\n destroy: function() {\r\n var that = this;\r\n\r\n Widget.fn.destroy.call(that);\r\n\r\n that.groupContainer.off(NS);\r\n\r\n if (that.groupContainer.data(\"kendoDropTarget\")) {\r\n that.groupContainer.data(\"kendoDropTarget\").destroy();\r\n }\r\n\r\n if (that.groupContainer.data(\"kendoDraggable\")) {\r\n that.groupContainer.data(\"kendoDraggable\").destroy();\r\n }\r\n\r\n if (!that.options.draggable) {\r\n that.draggable.destroy();\r\n }\r\n\r\n if (that.dataSource && that._refreshHandler) {\r\n that.dataSource.unbind(\"change\", that._refreshHandler);\r\n that._refreshHandler = null;\r\n }\r\n\r\n if (that._list) {\r\n that._list.destroy();\r\n }\r\n\r\n that.groupContainer = that.element = that.draggable = null;\r\n },\r\n\r\n events: [\"change\", \"removeGroup\"],\r\n\r\n options: {\r\n name: \"Groupable\",\r\n filter: \"th\",\r\n draggableElements: \"th\",\r\n messages: {\r\n empty: \"Drag a column header and drop it here to group by that column\"\r\n },\r\n sort: {\r\n dir: ASCENDING,\r\n compare: null\r\n },\r\n enableContextMenu: false\r\n },\r\n\r\n indicator: function(field) {\r\n var indicators = $(\".k-chip\", this.groupContainer);\r\n return $.grep(indicators, function(item)\r\n {\r\n return $(item).attr(kendo.attr(\"field\")) === field;\r\n })[0];\r\n },\r\n\r\n removeHandler: function(e) {\r\n var that = this;\r\n\r\n that._removeIndicator(e.sender.wrapper);\r\n },\r\n\r\n clickHandler: function(e) {\r\n var that = this;\r\n var indicator = e.sender.wrapper;\r\n var dirIcon = indicator.find(\".k-chip-icon\");\r\n var newDir = dirIcon.attr(kendoAttr(DIR)) === ASCENDING ? DESCENDING : ASCENDING;\r\n\r\n if ($(e.originalEvent.target).closest('.k-groupable-context-menu').length) {\r\n return;\r\n }\r\n\r\n dirIcon.attr(kendoAttr(DIR), newDir);\r\n that._change();\r\n },\r\n\r\n buildIndicator: function(field, title, dir, id) {\r\n var that = this;\r\n var indicator;\r\n var icon;\r\n var wrapper;\r\n\r\n dir = dir || (that.options.sort || {}).dir || ASCENDING;\r\n indicator = $(`
    `)\r\n .kendoChip({\r\n icon: `sort-${(dir || \"asc\") == \"asc\" ? \"asc-small\" : \"desc-small\"}`,\r\n iconClass: 'k-chip-icon',\r\n label: `${kendo.htmlEncode(title || field)}`,\r\n removable: true,\r\n size: that.options.size || \"medium\",\r\n remove: that.removeHandler.bind(that),\r\n click: that.clickHandler.bind(that),\r\n actions: that.options.enableContextMenu ? [\r\n { icon: \"more-vertical\", iconClass: \"k-groupable-context-menu\" }\r\n ] : null\r\n }).data(\"kendoChip\");\r\n wrapper = indicator.wrapper;\r\n icon = wrapper.find(\".k-chip-icon\").first();\r\n wrapper.attr(`data-${kendo.ns}field`, field);\r\n wrapper.attr(`data-${kendo.ns}title`, title || \"\");\r\n\r\n if (id) {\r\n wrapper.attr(`data-${kendo.ns}id`, id);\r\n }\r\n\r\n icon.attr(\"title\", `(sorted ${dir == \"asc\" ? \"ascending\" : \"descending\"})`);\r\n icon.attr(`data-${kendo.ns}dir`, dir);\r\n\r\n return indicator;\r\n },\r\n\r\n _setIndicatorSortOptions: function(field, options) {\r\n var indicator = $(this.indicator(field));\r\n indicator.data(GROUP_SORT, options);\r\n },\r\n\r\n aggregates: function() {\r\n var that = this;\r\n var names;\r\n var idx;\r\n var length;\r\n\r\n return that.element.find(that.options.filter).map(function() {\r\n var cell = $(this),\r\n aggregate = cell.attr(kendo.attr(\"aggregates\")),\r\n member = cell.attr(kendo.attr(\"field\"));\r\n\r\n if (aggregate && aggregate !== \"\") {\r\n names = aggregate.split(\",\");\r\n aggregate = [];\r\n for (idx = 0, length = names.length; idx < length; idx++) {\r\n aggregate.push({ field: member, aggregate: names[idx] });\r\n }\r\n }\r\n return aggregate;\r\n }).toArray();\r\n },\r\n\r\n descriptors: function() {\r\n var that = this,\r\n indicators = $(\".k-chip\", that.groupContainer),\r\n field,\r\n aggregates = that.aggregates();\r\n\r\n return $.map(indicators, function(item) {\r\n item = $(item);\r\n field = item.attr(kendo.attr(\"field\"));\r\n var sortOptions = that.options.sort || {};\r\n var indicatorSortOptions = item.data(GROUP_SORT) || {};\r\n var dirIcon = item.find(\".k-chip-icon\");\r\n\r\n return {\r\n field: field,\r\n dir: dirIcon.attr(kendo.attr(\"dir\")),\r\n aggregates: aggregates || [],\r\n colID: item.attr(kendo.attr(\"id\")),\r\n compare: indicatorSortOptions.compare || sortOptions.compare\r\n };\r\n });\r\n },\r\n\r\n _removeIndicator: function(indicator) {\r\n var that = this;\r\n\r\n that.trigger(REMOVEGROUP, {\r\n field: indicator.attr(kendo.attr(\"field\")),\r\n colID: indicator.attr(kendo.attr(\"id\")),\r\n });\r\n that._list.remove(indicator);\r\n indicator.off();\r\n indicator.removeData();\r\n that._invalidateGroupContainer();\r\n that._change();\r\n },\r\n\r\n _change: function() {\r\n var that = this;\r\n if (that.dataSource) {\r\n var descriptors = that.descriptors();\r\n if (that.trigger(\"change\", { groups: descriptors })) {\r\n that.refresh();\r\n return;\r\n }\r\n that.dataSource.group(descriptors);\r\n }\r\n },\r\n\r\n _dropCuePosition: function(position) {\r\n var that = this;\r\n var dropCuePositions = this._dropCuePositions;\r\n if (!dropCue.is(\":visible\") || dropCuePositions.length === 0) {\r\n return;\r\n }\r\n\r\n position = Math.ceil(position);\r\n\r\n var lastCuePosition = dropCuePositions[dropCuePositions.length - 1],\r\n left = lastCuePosition.left,\r\n right = lastCuePosition.right,\r\n marginLeft = parseInt(lastCuePosition.element.css(\"marginLeft\"), 10),\r\n marginRight = parseInt(lastCuePosition.element.css(\"marginRight\"), 10),\r\n parentLeft = lastCuePosition.element.parent().position().left - parseInt(that.groupContainer.css(\"paddingLeft\"), 10);\r\n\r\n if (position >= right && !isRtl || position < left && isRtl) {\r\n position = {\r\n left: lastCuePosition.element.position().left + (!isRtl ? outerWidth(lastCuePosition.element) + marginRight : parentLeft - marginLeft),\r\n element: lastCuePosition.element,\r\n before: false\r\n };\r\n } else {\r\n position = $.grep(dropCuePositions, function(item) {\r\n return (item.left <= position && position <= item.right) || (isRtl && position > item.right);\r\n })[0];\r\n\r\n if (position) {\r\n position = {\r\n left: isRtl ? position.element.position().left + outerWidth(position.element) + marginRight + parentLeft : position.element.position().left - marginLeft,\r\n element: position.element,\r\n before: true\r\n };\r\n }\r\n }\r\n\r\n return position;\r\n },\r\n _drag: function(event) {\r\n var position = this._dropCuePosition(event.x.location);\r\n\r\n if (position) {\r\n dropCue.css({ left: position.left, right: \"auto\" });\r\n }\r\n },\r\n _canDrag: function(element) {\r\n var field = element.attr(kendo.attr(\"field\"));\r\n\r\n return element.attr(kendo.attr(\"groupable\")) != \"false\" &&\r\n field &&\r\n (element.hasClass(\"k-chip\") ||\r\n !this.indicator(field));\r\n },\r\n _canDrop: function(source, target, position) {\r\n var next = source.next(),\r\n result = source[0] !== target[0] && (!next[0] || target[0] !== next[0] || (!isRtl && position > next.position().left || isRtl && position < next.position().left));\r\n return result;\r\n },\r\n _dragEnd: function(draggable) {\r\n var that = this,\r\n field = draggable.currentTarget.attr(kendo.attr(\"field\")),\r\n sourceIndicator = that.indicator(field);\r\n\r\n if (draggable !== that.options.draggable && !draggable.dropped && sourceIndicator) {\r\n that._removeIndicator($(sourceIndicator));\r\n }\r\n\r\n that._dragCancel();\r\n },\r\n _dragCancel: function() {\r\n dropCue.remove();\r\n this._dropCuePositions = [];\r\n },\r\n _intializePositions: function() {\r\n var that = this,\r\n indicators = $(\".k-chip\", that.groupContainer),\r\n left;\r\n\r\n that._dropCuePositions = $.map(indicators, function(item) {\r\n item = $(item);\r\n left = kendo.getOffset(item).left;\r\n return {\r\n left: parseInt(left, 10),\r\n right: parseInt(left + outerWidth(item), 10),\r\n element: item\r\n };\r\n });\r\n },\r\n _invalidateGroupContainer: function() {\r\n var that = this;\r\n var groupContainer = that.groupContainer;\r\n var list = that._list;\r\n\r\n if (groupContainer && list && list.element.is(\":empty\")) {\r\n this._messageContainer.text(this.options.messages.empty);\r\n }\r\n },\r\n\r\n _createList: function() {\r\n var that = this;\r\n\r\n that.groupContainer.find(\".k-chip-list\").remove();\r\n that._list = $(\"
    \").kendoChipList({ selectable: \"none\", size: that.options.size || \"medium\" }).data(\"kendoChipList\");\r\n that._list.element.insertBefore(that._messageContainer);\r\n }\r\n });\r\n\r\n kendo.ui.plugin(Groupable);\r\n\r\n })(window.kendo.jQuery);\r\n var kendo$2g = kendo;\r\n\r\n var __meta__$2f = {\r\n id: \"reorderable\",\r\n name: \"Reorderable\",\r\n category: \"framework\",\r\n depends: [ \"core\", \"draganddrop\", \"icons\" ],\r\n advanced: true\r\n };\r\n\r\n (function($, undefined$1) {\r\n var kendo = window.kendo,\r\n outerWidth = kendo._outerWidth,\r\n outerHeight = kendo._outerHeight,\r\n getOffset = kendo.getOffset,\r\n Widget = kendo.ui.Widget,\r\n CHANGE = \"change\",\r\n KREORDERABLE = \"k-reorderable\";\r\n\r\n var Reorderable = Widget.extend({\r\n init: function(element, options) {\r\n var that = this;\r\n\r\n Widget.fn.init.call(that, element, options);\r\n\r\n element = that.element.addClass(KREORDERABLE);\r\n options = that.options;\r\n\r\n that._initDraggable();\r\n\r\n if (!that.options.dropFilter) {\r\n that.options.dropFilter = that.draggable.options.filter;\r\n }\r\n\r\n that.reorderDropCue = that.options.reorderDropCue;\r\n\r\n element.find(options.dropFilter).kendoDropTarget({\r\n group: that.draggable.options.group,\r\n dragenter: function(e) {\r\n var externalDraggableInstance = that._externalDraggable(e);\r\n\r\n if (!that._draggable && !externalDraggableInstance) {\r\n return;\r\n }\r\n\r\n if (externalDraggableInstance) {\r\n that._handleExternalDraggable(externalDraggableInstance);\r\n }\r\n\r\n var dropTarget = this.element, offset;\r\n\r\n var denied = that._isPartOfSortable(that._draggable) ? (!that._dropTargetAllowed(dropTarget) || that._isLastDraggable()) : false;\r\n\r\n that.toggleHintClass(e.draggable.hint, denied);\r\n\r\n if (!denied) {\r\n offset = getOffset(dropTarget);\r\n var cueOffset = { top: offset.top, left: offset.left };\r\n var isHorizontal = options.orientation === \"horizontal\";\r\n\r\n if (!options.smartPosition || (options.inSameContainer && !options.inSameContainer({\r\n source: dropTarget,\r\n target: that._draggable,\r\n sourceIndex: that._index(dropTarget),\r\n targetIndex: that._index(that._draggable)\r\n }))) {\r\n that._dropTarget = dropTarget;\r\n } else {\r\n if (that._index(dropTarget) > that._index(that._draggable) && options.smartPosition) {\r\n cueOffset[isHorizontal ? \"left\" : \"top\"] += isHorizontal ? outerWidth(dropTarget) : outerHeight(dropTarget);\r\n }\r\n }\r\n\r\n that.reorderDropCue.css({\r\n height: outerHeight(dropTarget),\r\n top: cueOffset.top,\r\n left: cueOffset.left,\r\n zIndex: 19000\r\n });\r\n\r\n if (options.positionDropCue) {\r\n options.positionDropCue(that.reorderDropCue, dropTarget);\r\n }\r\n that.reorderDropCue.appendTo(document.body);\r\n }\r\n },\r\n dragleave: function(e) {\r\n that._dropTarget = null;\r\n },\r\n drop: function() {\r\n that._dropTarget = null;\r\n\r\n if (!that._draggable) {\r\n return;\r\n }\r\n var dropTarget = this.element;\r\n var draggable = that._draggable;\r\n var dropIndex = that._index(dropTarget);\r\n\r\n var isAfter = that.options.orientation === \"horizontal\" ?\r\n getOffset(that.reorderDropCue).left > getOffset(dropTarget).left :\r\n getOffset(that.reorderDropCue).top > getOffset(dropTarget).top;\r\n\r\n dropIndex = isAfter ? dropIndex + 1 : dropIndex;\r\n\r\n if (that._dropTargetAllowed(dropTarget) && !that._isLastDraggable() && that._index(draggable) !== dropIndex) {\r\n that.trigger(CHANGE, {\r\n element: that._draggable,\r\n target: dropTarget,\r\n oldIndex: that._index(draggable),\r\n newIndex: that._index(dropTarget),\r\n position: isAfter ? \"after\" : \"before\"\r\n });\r\n }\r\n\r\n if (that.reorderDropCue) {\r\n that.reorderDropCue.remove();\r\n }\r\n }\r\n });\r\n\r\n that.draggable.bind([ \"dragcancel\", \"dragend\", \"dragstart\", \"drag\" ], {\r\n dragcancel: that._dragcancel.bind(that),\r\n dragend: that._dragend.bind(that),\r\n dragstart: that._dragstart.bind(that),\r\n drag: that._drag.bind(that)\r\n });\r\n },\r\n\r\n options: {\r\n name: \"Reorderable\",\r\n filter: \"*\",\r\n orientation: \"horizontal\",\r\n deniedIcon: \"cancel\",\r\n allowIcon: \"plus\",\r\n reorderDropCue: $('
    '),\r\n smartPosition: true\r\n },\r\n\r\n events: [\r\n CHANGE\r\n ],\r\n\r\n toggleHintClass: function(hint, denied) {\r\n var that = this,\r\n options = that.options;\r\n\r\n hint = $(hint);\r\n\r\n if (hint.find(\".k-drag-status\").length > 0) {\r\n kendo.ui.icon(hint.find(\".k-drag-status\").eq(0), { icon: denied ? options.deniedIcon : options.allowIcon });\r\n }\r\n },\r\n\r\n _initDraggable: function() {\r\n let that = this,\r\n options = that.options;\r\n\r\n that.draggable = options.draggable || new kendo.ui.Draggable(that.element, {\r\n group: kendo.guid() + \"-reorderable\",\r\n autoScroll: true,\r\n filter: options.filter,\r\n hint: options.hint\r\n });\r\n\r\n let elementUnderCursorFunc = that.draggable._elementUnderCursor;\r\n that.draggable._elementUnderCursor = function(e) {\r\n let shouldModifyCue = that.reorderDropCue && that.reorderDropCue.is(\":visible\");\r\n\r\n if (shouldModifyCue) {\r\n that.reorderDropCue.hide();\r\n }\r\n let element = elementUnderCursorFunc.call(that.draggable, e);\r\n if (shouldModifyCue) {\r\n that.reorderDropCue.show();\r\n }\r\n return element;\r\n };\r\n },\r\n\r\n _handleExternalDraggable: function(draggable) {\r\n var that = this;\r\n var draggableFilter = that.options.dropFilter.trimStart();\r\n\r\n // make direct child selectors compatible with .closest()\r\n if (draggableFilter && draggableFilter[0] == \">\") {\r\n draggableFilter = draggableFilter.substring(1);\r\n }\r\n\r\n that._dragcancelHandler = that._dragcancel.bind(that);\r\n that._dragendHandler = that._dragend.bind(that);\r\n that._dragstartHandler = that._dragstart.bind(that);\r\n that._dragHandler = that._drag.bind(that);\r\n\r\n that._draggable = draggable.currentTarget.closest(draggableFilter);\r\n that._draggableInstance = draggable;\r\n that._elements = that.element.find(that.options.dropFilter);\r\n\r\n draggable.bind([ \"dragcancel\", \"dragend\", \"dragstart\", \"drag\" ], {\r\n dragcancel: that._dragcancelHandler,\r\n dragend: that._dragendHandler,\r\n dragstart: that._dragstartHandler,\r\n drag: that._dragHandler\r\n });\r\n },\r\n\r\n _dragcancel: function() {\r\n var that = this;\r\n\r\n if (that._draggableInstance && (that._dragcancelHandler || that._dragendHandler ||\r\n that._dragstartHandler || that._dragHandler)) {\r\n\r\n that._draggableInstance.unbind({\r\n dragcancel: that._dragcancelHandler,\r\n dragend: that._dragendHandler,\r\n dragstart: that._dragstartHandler,\r\n drag: that._dragHandler\r\n });\r\n }\r\n\r\n if (that.reorderDropCue) {\r\n that.reorderDropCue.remove();\r\n }\r\n\r\n that._draggable = null;\r\n that._elements = null;\r\n\r\n },\r\n _dragend: function() {\r\n var that = this;\r\n\r\n if (that._draggableInstance && (that._dragcancelHandler || that._dragendHandler ||\r\n that._dragstartHandler || that._dragHandler)) {\r\n\r\n that._draggableInstance.unbind({\r\n dragcancel: that._dragcancelHandler,\r\n dragend: that._dragendHandler,\r\n dragstart: that._dragstartHandler,\r\n drag: that._dragHandler\r\n });\r\n }\r\n\r\n if (that.reorderDropCue) {\r\n that.reorderDropCue.remove();\r\n }\r\n\r\n that._draggable = null;\r\n that._elements = null;\r\n },\r\n _dragstart: function(e) {\r\n var that = this;\r\n var target = $(e.currentTarget);\r\n var draggableFilter = that.options.dropFilter.trimStart();\r\n\r\n // make direct child selectors compatible with .closest()\r\n if (draggableFilter && draggableFilter[0] == \">\") {\r\n draggableFilter = draggableFilter.substring(1);\r\n }\r\n\r\n that._draggable = target.is(draggableFilter) ? target : target.closest(draggableFilter);\r\n that._elements = that.element.find(that.options.dropFilter);\r\n },\r\n _drag: function(e) {\r\n var that = this,\r\n dropIndex, sourceIndex, denied,\r\n offset = {},\r\n target,\r\n draggableFilter = that.options.dropFilter.trimStart();\r\n\r\n // make direct child selectors compatible with .closest()\r\n if (draggableFilter && draggableFilter[0] == \">\") {\r\n draggableFilter = draggableFilter.substring(1);\r\n }\r\n\r\n target = $(e.currentTarget).closest(draggableFilter);\r\n\r\n if (!that._dropTarget || (that.options.smartPosition && e.sender.hint.find(\".k-drag-status\").is(\".k-i-cancel,.k-svg-i-cancel\"))) {\r\n return;\r\n }\r\n\r\n dropIndex = that._index(that._dropTarget);\r\n sourceIndex = that._index(target);\r\n sourceIndex = dropIndex > sourceIndex ? sourceIndex + 1 : sourceIndex;\r\n\r\n if (that.options.orientation === \"horizontal\") {\r\n var dropStartOffset = getOffset(that._dropTarget).left;\r\n var width = outerWidth(that._dropTarget);\r\n\r\n if (e.pageX > dropStartOffset + width / 2) {\r\n offset.left = dropStartOffset + width;\r\n dropIndex += 1;\r\n } else {\r\n offset.left = dropStartOffset;\r\n }\r\n } else {\r\n var dropStartTop = getOffset(that._dropTarget).top;\r\n var height = outerHeight(that._dropTarget);\r\n\r\n if (e.pageY > dropStartTop + height / 2) {\r\n offset.top = dropStartTop + height;\r\n dropIndex += 1;\r\n } else {\r\n offset.top = dropStartTop;\r\n }\r\n }\r\n\r\n that.reorderDropCue.css(offset);\r\n\r\n if (that.options.positionDropCue) {\r\n that.options.positionDropCue(that.reorderDropCue, that._dropTarget);\r\n }\r\n\r\n if (that._isPartOfSortable(target)) {\r\n\r\n denied = sourceIndex === dropIndex ||\r\n (that.options.dragOverContainers && !that.options.dragOverContainers(sourceIndex, dropIndex)) ||\r\n e.clickMoveClick && e.currentTarget.hasClass(\"k-drag-cell\") && $(e.elementUnderCursor).closest(\".k-drag-cell\").length === 0;\r\n\r\n that.toggleHintClass(e.sender.hint, denied);\r\n }\r\n },\r\n\r\n _isPartOfSortable: function(draggable) {\r\n var that = this;\r\n\r\n return that._elements.index(draggable) >= 0;\r\n },\r\n\r\n _externalDraggable: function(e) {\r\n var that = this,\r\n options = that.options;\r\n\r\n if (!that._draggable && options.externalDraggable) {\r\n return options.externalDraggable(e);\r\n }\r\n\r\n return null;\r\n },\r\n\r\n _isLastDraggable: function() {\r\n var inSameContainer = this.options.inSameContainer,\r\n draggable = this._draggable[0],\r\n elements = this._elements.get(),\r\n found = false,\r\n item;\r\n\r\n if (!inSameContainer) {\r\n return false;\r\n }\r\n\r\n while (!found && elements.length > 0) {\r\n item = elements.pop();\r\n found = draggable !== item && inSameContainer({\r\n source: draggable,\r\n target: item,\r\n sourceIndex: this._index(draggable),\r\n targetIndex: this._index(item)\r\n });\r\n }\r\n\r\n return !found;\r\n },\r\n\r\n _dropTargetAllowed: function(dropTarget) {\r\n var inSameContainer = this.options.inSameContainer,\r\n dragOverContainers = this.options.dragOverContainers,\r\n draggable = this._draggable;\r\n\r\n if (draggable[0] === dropTarget[0]) {\r\n return false;\r\n }\r\n\r\n if (!inSameContainer || !dragOverContainers) {\r\n return true;\r\n }\r\n\r\n if (inSameContainer({ source: draggable,\r\n target: dropTarget,\r\n sourceIndex: this._index(draggable),\r\n targetIndex: this._index(dropTarget)\r\n })) {\r\n return true;\r\n }\r\n\r\n return dragOverContainers(this._index(draggable), this._index(dropTarget));\r\n },\r\n\r\n _index: function(element) {\r\n return this._elements.index(element);\r\n },\r\n\r\n destroy: function() {\r\n var that = this;\r\n\r\n\r\n Widget.fn.destroy.call(that);\r\n\r\n that.element.find(that.options.dropFilter).each(function() {\r\n var item = $(this);\r\n if (item.data(\"kendoDropTarget\")) {\r\n item.data(\"kendoDropTarget\").destroy();\r\n }\r\n });\r\n\r\n if (that.draggable) {\r\n that.draggable.destroy();\r\n\r\n that.draggable.element = that.draggable = null;\r\n }\r\n\r\n that.reorderDropCue.remove();\r\n that.elements = that.reorderDropCue = that._elements = that._draggable = null;\r\n }\r\n });\r\n\r\n kendo.ui.plugin(Reorderable);\r\n\r\n })(window.kendo.jQuery);\r\n var kendo$2f = kendo;\r\n\r\n var __meta__$2e = {\r\n id: \"resizable\",\r\n name: \"Resizable\",\r\n category: \"framework\",\r\n depends: [ \"core\", \"draganddrop\" ],\r\n advanced: true\r\n };\r\n\r\n (function($, undefined$1) {\r\n var kendo = window.kendo,\r\n ui = kendo.ui,\r\n Widget = ui.Widget,\r\n isFunction = kendo.isFunction,\r\n extend = $.extend,\r\n HORIZONTAL = \"horizontal\",\r\n VERTICAL = \"vertical\",\r\n START = \"start\",\r\n RESIZE = \"resize\",\r\n RESIZEEND = \"resizeend\";\r\n\r\n var Resizable = Widget.extend({\r\n init: function(element, options) {\r\n var that = this;\r\n\r\n Widget.fn.init.call(that, element, options);\r\n\r\n that.orientation = that.options.orientation.toLowerCase() != VERTICAL ? HORIZONTAL : VERTICAL;\r\n that._positionMouse = that.orientation == HORIZONTAL ? \"x\" : \"y\";\r\n that._position = that.orientation == HORIZONTAL ? \"left\" : \"top\";\r\n that._sizingDom = that.orientation == HORIZONTAL ? \"outerWidth\" : \"outerHeight\";\r\n\r\n that.draggable = new ui.Draggable(options.draggableElement || element, {\r\n distance: 1,\r\n filter: options.handle,\r\n drag: that._resize.bind(that),\r\n dragcancel: that._cancel.bind(that),\r\n dragstart: that._start.bind(that),\r\n dragend: that._dragend.bind(that),\r\n clickMoveClick: options.clickMoveClick\r\n });\r\n\r\n that.userEvents = that.draggable.userEvents;\r\n },\r\n\r\n events: [\r\n RESIZE,\r\n RESIZEEND,\r\n START\r\n ],\r\n\r\n options: {\r\n name: \"Resizable\",\r\n orientation: HORIZONTAL,\r\n clickMoveClick: false\r\n },\r\n\r\n resize: function() {\r\n // Overrides base widget resize\r\n },\r\n\r\n _max: function(e) {\r\n var that = this,\r\n hintSize = that.hint ? that.hint[that._sizingDom]() : 0,\r\n size = that.options.max;\r\n\r\n return isFunction(size) ? size(e) : size !== undefined$1 ? (that._initialElementPosition + size) - hintSize : size;\r\n },\r\n\r\n _min: function(e) {\r\n var that = this,\r\n size = that.options.min;\r\n\r\n return isFunction(size) ? size(e) : size !== undefined$1 ? that._initialElementPosition + size : size;\r\n },\r\n\r\n _start: function(e) {\r\n var that = this,\r\n hint = that.options.hint,\r\n el = $(e.currentTarget);\r\n\r\n that._initialElementPosition = el.position()[that._position];\r\n that._initialMousePosition = e[that._positionMouse].startLocation;\r\n\r\n if (hint) {\r\n that.hint = isFunction(hint) ? $(hint(el)) : hint;\r\n\r\n that.hint.css({\r\n position: \"absolute\"\r\n })\r\n .css(that._position, that._initialElementPosition)\r\n .appendTo(that.element);\r\n }\r\n\r\n that.trigger(START, e);\r\n\r\n that._maxPosition = that._max(e);\r\n that._minPosition = that._min(e);\r\n\r\n $(document.body).css(\"cursor\", el.css(\"cursor\"));\r\n },\r\n\r\n _resize: function(e) {\r\n var that = this,\r\n maxPosition = that._maxPosition,\r\n minPosition = that._minPosition,\r\n currentPosition = that._initialElementPosition + (e[that._positionMouse].location - that._initialMousePosition),\r\n position;\r\n\r\n position = minPosition !== undefined$1 ? Math.max(minPosition, currentPosition) : currentPosition;\r\n that.position = position = maxPosition !== undefined$1 ? Math.min(maxPosition, position) : position;\r\n\r\n if (that.hint) {\r\n that.hint.toggleClass(that.options.invalidClass || \"\", position == maxPosition || position == minPosition)\r\n .css(that._position, position);\r\n }\r\n\r\n that.resizing = true;\r\n that.trigger(RESIZE, extend(e, { position: position }));\r\n },\r\n\r\n _dragend: function(e) {\r\n this._stop();\r\n this.trigger(RESIZEEND, extend(e, { position: this.position }));\r\n },\r\n\r\n _stop: function() {\r\n var that = this;\r\n\r\n if (that.hint) {\r\n that.hint.remove();\r\n }\r\n\r\n that.resizing = false;\r\n $(document.body).css(\"cursor\", \"\");\r\n },\r\n\r\n _cancel: function(e) {\r\n var that = this;\r\n\r\n if (that.hint) {\r\n that.position = undefined$1;\r\n that.hint.css(that._position, that._initialElementPosition);\r\n that._stop();\r\n }\r\n },\r\n\r\n destroy: function() {\r\n var that = this;\r\n\r\n Widget.fn.destroy.call(that);\r\n\r\n if (that.draggable) {\r\n that.draggable.destroy();\r\n }\r\n },\r\n\r\n press: function(target) {\r\n if (!target) {\r\n return;\r\n }\r\n\r\n var position = target.position(),\r\n that = this;\r\n\r\n that.userEvents.press(position.left, position.top, target[0]);\r\n that.targetPosition = position;\r\n that.target = target;\r\n },\r\n\r\n move: function(delta) {\r\n var that = this,\r\n orientation = that._position,\r\n position = that.targetPosition,\r\n current = that.position;\r\n\r\n if (current === undefined$1) {\r\n current = position[orientation];\r\n }\r\n\r\n position[orientation] = current + delta;\r\n\r\n that.userEvents.move(position.left, position.top);\r\n },\r\n\r\n end: function() {\r\n this.userEvents.end();\r\n this.target = this.position = undefined$1;\r\n }\r\n });\r\n\r\n kendo.ui.plugin(Resizable);\r\n\r\n })(window.kendo.jQuery);\r\n var kendo$2e = kendo;\r\n\r\n var __meta__$2d = {\r\n id: \"sortable\",\r\n name: \"Sortable\",\r\n category: \"framework\",\r\n depends: [ \"draganddrop\" ]\r\n };\r\n\r\n (function($, undefined$1) {\r\n var kendo = window.kendo,\r\n Widget = kendo.ui.Widget,\r\n outerWidth = kendo._outerWidth,\r\n outerHeight = kendo._outerHeight,\r\n\r\n START = \"start\",\r\n BEFORE_MOVE = \"beforeMove\",\r\n MOVE = \"move\",\r\n END = \"end\",\r\n CHANGE = \"change\",\r\n CANCEL = \"cancel\",\r\n\r\n ACTION_SORT = \"sort\",\r\n ACTION_REMOVE = \"remove\",\r\n ACTION_RECEIVE = \"receive\",\r\n\r\n DEFAULT_FILTER = \">*\",\r\n MISSING_INDEX = -1;\r\n\r\n function containsOrEqualTo(parent, child) {\r\n try {\r\n return $.contains(parent, child) || parent == child;\r\n } catch (e) {\r\n return false;\r\n }\r\n }\r\n\r\n function defaultHint(element) {\r\n return element.clone();\r\n }\r\n\r\n function defaultPlaceholder(element) {\r\n return element.clone().removeAttr(\"id\").css(\"visibility\", \"hidden\");\r\n }\r\n\r\n var Sortable = Widget.extend({\r\n init: function(element, options) {\r\n var that = this;\r\n\r\n Widget.fn.init.call(that, element, options);\r\n\r\n if (!that.options.placeholder) {\r\n that.options.placeholder = defaultPlaceholder;\r\n }\r\n\r\n if (!that.options.hint) {\r\n that.options.hint = defaultHint;\r\n }\r\n\r\n that.draggable = that._createDraggable();\r\n },\r\n\r\n events: [\r\n START,\r\n BEFORE_MOVE,\r\n MOVE,\r\n END,\r\n CHANGE,\r\n CANCEL\r\n ],\r\n\r\n options: {\r\n name: \"Sortable\",\r\n hint: null,\r\n placeholder: null,\r\n filter: DEFAULT_FILTER,\r\n holdToDrag: false,\r\n disabled: null,\r\n container: null,\r\n connectWith: null,\r\n handler: null,\r\n cursorOffset: null,\r\n axis: null,\r\n ignore: null,\r\n autoScroll: false,\r\n cursor: \"auto\",\r\n moveOnDragEnter: false\r\n },\r\n\r\n destroy: function() {\r\n this.draggable.destroy();\r\n Widget.fn.destroy.call(this);\r\n },\r\n\r\n _createDraggable: function() {\r\n var that = this,\r\n element = that.element,\r\n options = that.options;\r\n\r\n return new kendo.ui.Draggable(element, {\r\n filter: options.filter,\r\n hint: kendo.isFunction(options.hint) ? options.hint : $(options.hint),\r\n holdToDrag: options.holdToDrag,\r\n container: options.container ? $(options.container) : null,\r\n cursorOffset: options.cursorOffset,\r\n axis: options.axis,\r\n ignore: options.ignore,\r\n autoScroll: options.autoScroll,\r\n dragstart: that._dragstart.bind(that),\r\n dragcancel: that._dragcancel.bind(that),\r\n drag: that._drag.bind(that),\r\n dragend: that._dragend.bind(that)\r\n });\r\n },\r\n\r\n _dragstart: function(e) {\r\n var draggedElement = this.draggedElement = e.currentTarget,\r\n disabled = this.options.disabled,\r\n handler = this.options.handler,\r\n _placeholder = this.options.placeholder,\r\n placeholder = this.placeholder = kendo.isFunction(_placeholder) ? $(_placeholder.call(this, draggedElement)) : $(_placeholder);\r\n\r\n if (disabled && draggedElement.is(disabled)) {\r\n e.preventDefault();\r\n } else if (handler && !$(e.initialTarget).is(handler)) {\r\n e.preventDefault();\r\n } else {\r\n\r\n if (this.trigger(START, { item: draggedElement, draggableEvent: e })) {\r\n e.preventDefault();\r\n } else {\r\n draggedElement.css(\"display\", \"none\");\r\n draggedElement.before(placeholder);\r\n\r\n this._setCursor();\r\n }\r\n\r\n }\r\n },\r\n\r\n _dragcancel: function() {\r\n this._cancel();\r\n this.trigger(CANCEL, { item: this.draggedElement });\r\n\r\n this._resetCursor();\r\n },\r\n\r\n _drag: function(e) {\r\n var draggedElement = this.draggedElement,\r\n target = this._findTarget(e),\r\n targetCenter,\r\n cursorOffset = { left: e.x.location, top: e.y.location },\r\n offsetDelta,\r\n axisDelta = { x: e.x.delta, y: e.y.delta },\r\n direction,\r\n sibling,\r\n getSibling,\r\n axis = this.options.axis,\r\n moveOnDragEnter = this.options.moveOnDragEnter,\r\n eventData = { item: draggedElement, list: this, draggableEvent: e };\r\n\r\n if (axis === \"x\" || axis === \"y\") {\r\n this._movementByAxis(axis, cursorOffset, axisDelta[axis], eventData);\r\n return;\r\n }\r\n\r\n if (target) {\r\n targetCenter = this._getElementCenter(target.element);\r\n\r\n offsetDelta = {\r\n left: Math.round(cursorOffset.left - targetCenter.left),\r\n top: Math.round(cursorOffset.top - targetCenter.top)\r\n };\r\n\r\n $.extend(eventData, { target: target.element });\r\n\r\n if (target.appendToBottom) {\r\n this._movePlaceholder(target, null, eventData);\r\n return;\r\n }\r\n\r\n if (target.appendAfterHidden) {\r\n this._movePlaceholder(target, \"next\", eventData);\r\n }\r\n\r\n if (this._isFloating(target.element)) { //horizontal\r\n if ((axisDelta.x < 0 && moveOnDragEnter) || (!moveOnDragEnter && offsetDelta.left < 0)) {\r\n direction = \"prev\";\r\n } else if ((axisDelta.x > 0 && moveOnDragEnter) || (!moveOnDragEnter && offsetDelta.left > 0)) {\r\n direction = \"next\";\r\n }\r\n } else { //vertical\r\n if ((axisDelta.y < 0 && moveOnDragEnter) || (!moveOnDragEnter && offsetDelta.top < 0)) {\r\n direction = \"prev\";\r\n } else if ((axisDelta.y > 0 && moveOnDragEnter) || (!moveOnDragEnter && offsetDelta.top > 0)) {\r\n direction = \"next\";\r\n }\r\n }\r\n\r\n if (direction) {\r\n getSibling = (direction === \"prev\") ? jQuery.fn.prev : jQuery.fn.next;\r\n\r\n sibling = getSibling.call(target.element);\r\n\r\n //find the prev/next visible sibling\r\n while (sibling.length && !sibling.is(\":visible\")) {\r\n sibling = getSibling.call(sibling);\r\n }\r\n\r\n if (sibling[0] != this.placeholder[0]) {\r\n this._movePlaceholder(target, direction, eventData);\r\n }\r\n }\r\n }\r\n },\r\n\r\n _dragend: function(e) {\r\n var placeholder = this.placeholder,\r\n draggedElement = this.draggedElement,\r\n draggedIndex = this.indexOf(draggedElement),\r\n placeholderIndex = this.indexOf(placeholder),\r\n connectWith = this.options.connectWith,\r\n connectedList,\r\n isDefaultPrevented,\r\n eventData,\r\n connectedListEventData;\r\n\r\n this._resetCursor();\r\n\r\n eventData = {\r\n action: ACTION_SORT,\r\n item: draggedElement,\r\n oldIndex: draggedIndex,\r\n newIndex: placeholderIndex,\r\n draggableEvent: e\r\n };\r\n\r\n if (placeholderIndex >= 0) {\r\n isDefaultPrevented = this.trigger(END, eventData);\r\n } else {\r\n connectedList = placeholder.parents(connectWith).getKendoSortable();\r\n\r\n eventData.action = ACTION_REMOVE;\r\n connectedListEventData = $.extend({}, eventData, {\r\n action: ACTION_RECEIVE,\r\n oldIndex: MISSING_INDEX,\r\n newIndex: connectedList.indexOf(placeholder)\r\n });\r\n\r\n isDefaultPrevented = !(!this.trigger(END, eventData) && !connectedList.trigger(END, connectedListEventData));\r\n }\r\n\r\n if (isDefaultPrevented || placeholderIndex === draggedIndex) {\r\n this._cancel();\r\n return;\r\n }\r\n\r\n placeholder.replaceWith(draggedElement);\r\n\r\n draggedElement.show();\r\n this.draggable.dropped = true;\r\n\r\n eventData = {\r\n action: this.indexOf(draggedElement) != MISSING_INDEX ? ACTION_SORT : ACTION_REMOVE,\r\n item: draggedElement,\r\n oldIndex: draggedIndex,\r\n newIndex: this.indexOf(draggedElement),\r\n draggableEvent: e\r\n };\r\n\r\n this.trigger(CHANGE, eventData);\r\n\r\n if (connectedList) {\r\n connectedListEventData = $.extend({}, eventData, {\r\n action: ACTION_RECEIVE,\r\n oldIndex: MISSING_INDEX,\r\n newIndex: connectedList.indexOf(draggedElement)\r\n });\r\n\r\n connectedList.trigger(CHANGE, connectedListEventData);\r\n }\r\n\r\n },\r\n\r\n _findTarget: function(e) {\r\n var element = this._findElementUnderCursor(e),\r\n items,\r\n connectWith = this.options.connectWith,\r\n node;\r\n\r\n if ($.contains(this.element[0], element)) { //the element is part of the sortable container\r\n items = this.items();\r\n node = items.filter(element)[0] || items.has(element)[0];\r\n\r\n return node ? { element: $(node), sortable: this } : null;\r\n } else if (this.element[0] == element && this._isEmpty()) {\r\n return { element: this.element, sortable: this, appendToBottom: true };\r\n } else if (this.element[0] == element && this._isLastHidden()) {\r\n node = this.items().eq(0);\r\n return { element: node , sortable: this, appendAfterHidden: true };\r\n } else if (connectWith) { //connected lists are present\r\n return this._searchConnectedTargets(element, e);\r\n }\r\n },\r\n\r\n _findElementUnderCursor: function(e) {\r\n var elementUnderCursor = kendo.elementUnderCursor(e),\r\n draggable = e.sender;\r\n\r\n if (containsOrEqualTo(draggable.hint[0], elementUnderCursor)) {\r\n draggable.hint.hide();\r\n elementUnderCursor = kendo.elementUnderCursor(e);\r\n // IE8 does not return the element in iframe from first attempt\r\n if (!elementUnderCursor) {\r\n elementUnderCursor = kendo.elementUnderCursor(e);\r\n }\r\n draggable.hint.show();\r\n }\r\n\r\n return elementUnderCursor;\r\n },\r\n\r\n _searchConnectedTargets: function(element, e) {\r\n var connected = $(this.options.connectWith),\r\n sortableInstance,\r\n items,\r\n node;\r\n\r\n for (var i = 0; i < connected.length; i++) {\r\n sortableInstance = connected.eq(i).getKendoSortable();\r\n\r\n if ($.contains(connected[i], element)) {\r\n if (sortableInstance) {\r\n items = sortableInstance.items();\r\n node = items.filter(element)[0] || items.has(element)[0];\r\n\r\n if (node) {\r\n sortableInstance.placeholder = this.placeholder;\r\n return { element: $(node), sortable: sortableInstance };\r\n } else {\r\n return null;\r\n }\r\n }\r\n } else if (connected[i] == element) {\r\n if (sortableInstance && sortableInstance._isEmpty()) {\r\n return { element: connected.eq(i), sortable: sortableInstance, appendToBottom: true };\r\n } else if (this._isCursorAfterLast(sortableInstance, e)) {\r\n node = sortableInstance.items().last();\r\n return { element: node, sortable: sortableInstance };\r\n }\r\n }\r\n }\r\n\r\n },\r\n\r\n _isCursorAfterLast: function(sortable, e) {\r\n var lastItem = sortable.items().last(),\r\n cursorOffset = { left: e.x.location, top: e.y.location },\r\n lastItemOffset,\r\n delta;\r\n\r\n lastItemOffset = kendo.getOffset(lastItem);\r\n lastItemOffset.top += outerHeight(lastItem);\r\n lastItemOffset.left += outerWidth(lastItem);\r\n\r\n if (this._isFloating(lastItem)) { //horizontal\r\n delta = lastItemOffset.left - cursorOffset.left;\r\n } else { //vertical\r\n delta = lastItemOffset.top - cursorOffset.top;\r\n }\r\n\r\n return delta < 0 ? true : false;\r\n },\r\n\r\n _movementByAxis: function(axis, cursorOffset, delta, eventData) {\r\n var cursorPosition = (axis === \"x\") ? cursorOffset.left : cursorOffset.top,\r\n target = (delta < 0) ? this.placeholder.prev() : this.placeholder.next(),\r\n items = this.items(),\r\n targetCenter;\r\n\r\n if (target.length && !target.is(\":visible\")) {\r\n target = (delta < 0) ? target.prev() : target.next();\r\n }\r\n\r\n if (!items.filter(target).length) {\r\n return;\r\n }\r\n\r\n $.extend(eventData, { target: target });\r\n targetCenter = this._getElementCenter(target);\r\n\r\n if (targetCenter) {\r\n targetCenter = (axis === \"x\") ? targetCenter.left : targetCenter.top;\r\n }\r\n\r\n if (target.length && delta < 0 && cursorPosition - targetCenter < 0) { //prev\r\n this._movePlaceholder({ element: target, sortable: this }, \"prev\", eventData);\r\n } else if (target.length && delta > 0 && cursorPosition - targetCenter > 0) { //next\r\n this._movePlaceholder({ element: target, sortable: this }, \"next\", eventData);\r\n }\r\n },\r\n\r\n _movePlaceholder: function(target, direction, eventData) {\r\n var placeholder = this.placeholder;\r\n\r\n if (!target.sortable.trigger(BEFORE_MOVE, eventData)) {\r\n\r\n if (!direction) {\r\n target.element.append(placeholder);\r\n } else if (direction === \"prev\") {\r\n target.element.before(placeholder);\r\n } else if (direction === \"next\") {\r\n target.element.after(placeholder);\r\n }\r\n\r\n target.sortable.trigger(MOVE, eventData);\r\n }\r\n },\r\n\r\n _setCursor: function() {\r\n var cursor = this.options.cursor,\r\n body;\r\n\r\n if (cursor && cursor !== \"auto\") {\r\n body = $(document.body);\r\n\r\n this._originalCursorType = body.css(\"cursor\");\r\n body.css({ \"cursor\": cursor });\r\n\r\n if (!this._cursorStylesheet) {\r\n this._cursorStylesheet = $(\"\");\r\n }\r\n\r\n this._cursorStylesheet.appendTo(body);\r\n }\r\n },\r\n\r\n _resetCursor: function() {\r\n if (this._originalCursorType) {\r\n $(document.body).css(\"cursor\", this._originalCursorType);\r\n this._originalCursorType = null;\r\n\r\n this._cursorStylesheet.remove();\r\n }\r\n },\r\n\r\n _getElementCenter: function(element) {\r\n var center = element.length ? kendo.getOffset(element) : null;\r\n if (center) {\r\n center.top += outerHeight(element) / 2;\r\n center.left += outerWidth(element) / 2;\r\n }\r\n\r\n return center;\r\n },\r\n\r\n _isFloating: function(item) {\r\n var isFloating = /left|right/.test(item.css('float'));\r\n var isTable = /inline|table-cell/.test(item.css('display'));\r\n var isHorizontalFlex = /flex/.test(item.parent().css('display')) && (/row|row-reverse/.test(item.parent().css('flex-direction')) || !item.parent().css('flex-direction'));\r\n return isFloating || isTable || isHorizontalFlex;\r\n },\r\n\r\n _cancel: function() {\r\n if (this.draggedElement) {\r\n this.draggedElement.show();\r\n this.placeholder.remove();\r\n this.draggable.dropped = true;\r\n }\r\n },\r\n\r\n _items: function() {\r\n var filter = this.options.filter,\r\n items;\r\n\r\n if (filter) {\r\n items = this.element.find(filter);\r\n } else {\r\n items = this.element.children();\r\n }\r\n\r\n return items;\r\n },\r\n\r\n indexOf: function(element) {\r\n var items = this._items(),\r\n placeholder = this.placeholder,\r\n draggedElement = this.draggedElement;\r\n\r\n if (placeholder && element[0] == placeholder[0]) {\r\n return items.not(draggedElement).index(element);\r\n } else {\r\n return items.not(placeholder).index(element);\r\n }\r\n },\r\n\r\n items: function() {\r\n var placeholder = this.placeholder,\r\n items = this._items();\r\n\r\n if (placeholder) {\r\n items = items.not(placeholder);\r\n }\r\n\r\n return items;\r\n },\r\n\r\n _isEmpty: function() {\r\n return !this.items().length;\r\n },\r\n\r\n _isLastHidden: function() {\r\n return this.items().length === 1 && this.items().is(\":hidden\");\r\n }\r\n\r\n });\r\n\r\n kendo.ui.plugin(Sortable);\r\n })(window.kendo.jQuery);\r\n var kendo$2d = kendo;\r\n\r\n let __meta__$2c = {\r\n id: \"selectable\",\r\n name: \"Selectable\",\r\n category: \"framework\",\r\n depends: [ \"core\", \"userevents\" ],\r\n advanced: true\r\n };\r\n\r\n (function($, undefined$1) {\r\n let kendo = window.kendo,\r\n Widget = kendo.ui.Widget,\r\n support = kendo.support,\r\n abs = Math.abs,\r\n ARIASELECTED = \"aria-selected\",\r\n SELECTED = \"k-selected\",\r\n ACTIVE = \"k-selecting\",\r\n SELECTABLE = \"k-selectable\",\r\n CHANGE = \"change\",\r\n CHANGING = \"changing\",\r\n NS = \".kendoSelectable\",\r\n UNSELECT = \"unselect\",\r\n UNSELECTING = \"k-unselecting\",\r\n HOVER = \"k-hover\",\r\n MID = \"k-range-mid\",\r\n SPLITEND = \"k-range-split-end\",\r\n SPLITSTART = \"k-range-split-start\",\r\n RANGESTART = \"k-range-start\",\r\n RANGEEND = \"k-range-end\",\r\n START = \"start\",\r\n END = \"end\",\r\n NONE = \"none\",\r\n MOUSEENTER = \"mouseenter\",\r\n MOUSELEAVE = \"mouseleave\",\r\n TOUCHSTART = \"touchstart\",\r\n TOUCHMOVE = \"touchmove\",\r\n TOUCHEND = \"touchend\",\r\n INPUTSELECTOR_ICONSSELECTOR_FONT = \"span.k-icon.k-i-caret-alt-down,span.k-icon.k-i-caret-alt-up,.k-icon.k-i-caret-alt-down,.k-icon.k-i-caret-alt-right,.k-icon.k-i-caret-alt-left\",\r\n INPUTSELECTOR_ICONSSELECTOR_SVG = INPUTSELECTOR_ICONSSELECTOR_FONT.replaceAll('k-i', 'k-svg-i'),\r\n INPUTSELECTOR_SVG_PARTS = INPUTSELECTOR_ICONSSELECTOR_SVG.split(\",\").map((selector) => selector + \" *\").join(\",\"),\r\n INPUTSELECTOR = `input,a,textarea,.k-multiselect-wrap,select,button,${INPUTSELECTOR_ICONSSELECTOR_FONT},${INPUTSELECTOR_ICONSSELECTOR_SVG},${INPUTSELECTOR_SVG_PARTS},.k-button>span,.k-button>span *,.k-button>img,label.k-checkbox-label.k-no-text,span.k-numeric-wrap,.k-focusable`,\r\n msie = kendo.support.browser.msie,\r\n supportEventDelegation = false,\r\n extend = $.extend;\r\n\r\n (function($) {\r\n (function() {\r\n $('
    ')\r\n .on(\"click\", \">*\", function() {\r\n supportEventDelegation = true;\r\n })\r\n .find(\"span\")\r\n .trigger(\"click\")\r\n .end()\r\n .off();\r\n })();\r\n })($);\r\n\r\n const Selectable = Widget.extend({\r\n init: function(element, options) {\r\n let that = this,\r\n multiple,\r\n dragToSelect,\r\n selectableClass;\r\n\r\n Widget.fn.init.call(that, element, options);\r\n\r\n selectableClass = that.selectableClass = that.options.selectableClass || SELECTABLE;\r\n\r\n that._marquee = $(\"
    \");\r\n that._lastActive = null;\r\n that.element.addClass(selectableClass);\r\n\r\n that.relatedTarget = that.options.relatedTarget;\r\n\r\n multiple = that.options.multiple;\r\n dragToSelect = that.options.dragToSelect;\r\n\r\n that.userEvents = new kendo.UserEvents(that.element, {\r\n global: true,\r\n allowSelection: true,\r\n filter: (!supportEventDelegation ? \".\" + selectableClass + \" \" : \"\") + that.options.filter,\r\n tap: that._tap.bind(that),\r\n touchAction: multiple ? \"none\" : \"pan-x pan-y\"\r\n });\r\n\r\n if (multiple) {\r\n if (dragToSelect) {\r\n that.userEvents\r\n .bind(\"hold\", that._hold.bind(that))\r\n .bind(\"start\", that._start.bind(that))\r\n .bind(\"move\", that._move.bind(that))\r\n .bind(\"end\", that._end.bind(that));\r\n }\r\n that.userEvents\r\n .bind(\"select\", that._select.bind(that));\r\n }\r\n },\r\n\r\n events: [CHANGE, CHANGING, UNSELECT],\r\n\r\n options: {\r\n name: \"Selectable\",\r\n filter: \">*\",\r\n inputSelectors: INPUTSELECTOR,\r\n multiple: false,\r\n holdToDrag: false,\r\n dragToSelect: true,\r\n relatedTarget: $.noop,\r\n ignoreOverlapped: false,\r\n addIdToRanges: false,\r\n toggleable: false,\r\n selectableClass: \"\"\r\n },\r\n\r\n _isElement: function(target) {\r\n var elements = this.element;\r\n var idx, length = elements.length, result = false;\r\n\r\n target = target[0];\r\n\r\n for (idx = 0; idx < length; idx ++) {\r\n if (elements[idx] === target) {\r\n result = true;\r\n break;\r\n }\r\n }\r\n\r\n return result;\r\n },\r\n\r\n _tap: function(e) {\r\n let target = $(e.target),\r\n that = this,\r\n options = that.options,\r\n ctrlKey = e.event.ctrlKey || e.event.metaKey,\r\n multiple = that.options.multiple,\r\n shiftKey = multiple && e.event.shiftKey,\r\n selectedClass = that.options.selectedClass || SELECTED,\r\n selected,\r\n whichCode = e.event.which,\r\n buttonCode = e.event.button;\r\n\r\n //in case of hierarchy or right-click\r\n if (!that._isElement(target.closest(\".\" + that.selectableClass)) || whichCode && whichCode == 3 || buttonCode && buttonCode == 2) {\r\n return;\r\n }\r\n\r\n if (!this._allowSelection(e.event.target)) {\r\n return;\r\n }\r\n\r\n if (that.trigger(CHANGING, { target: target, originalEvent: e.event })) {\r\n return;\r\n }\r\n\r\n selected = target.hasClass(selectedClass);\r\n\r\n target = target.add(that.relatedTarget(target));\r\n\r\n if (!multiple) {\r\n if (selected && ctrlKey) {\r\n that._unselect(target);\r\n that._notify(CHANGE, e);\r\n } else if (!selected) {\r\n that.clear();\r\n that.value(target, e);\r\n that._notify(CHANGE, e);\r\n }\r\n } else {\r\n if (shiftKey) {\r\n if (!that._lastRange || !compareElements(that._lastRange, target)) {\r\n that.selectRange(that._firstSelectee(), target, e);\r\n that._notify(CHANGE, e);\r\n }\r\n that._lastRange = target;\r\n } else {\r\n that._lastRange = null;\r\n if (selected && (ctrlKey || options.toggleable)) {\r\n that._unselect(target);\r\n that._notify(CHANGE, e);\r\n } else if (ctrlKey || options.toggleable) {\r\n that.value(target, e);\r\n that._notify(CHANGE, e);\r\n } else if (!selected || that.value().length > 1) {\r\n that.clear();\r\n that.value(target, e);\r\n that._notify(CHANGE, e);\r\n }\r\n\r\n that._lastActive = that._downTarget = target;\r\n }\r\n }\r\n },\r\n\r\n _hold: function(e) {\r\n if (this.options.holdToDrag) {\r\n // serves as a drag hint to indicate start of selection\r\n this._tap(e);\r\n }\r\n\r\n this._activated = true;\r\n },\r\n\r\n _isActivated: function() {\r\n return this.options.holdToDrag ? this._activated : true;\r\n },\r\n\r\n _start: function(e) {\r\n let that = this,\r\n target = $(e.target),\r\n selectedClass = that.options.selectedClass || SELECTED,\r\n selected = target.hasClass(selectedClass),\r\n currentElement,\r\n ctrlKey = e.event.ctrlKey || e.event.metaKey;\r\n\r\n if (!that._isActivated() || !this._allowSelection(e.event.target)) {\r\n return;\r\n }\r\n\r\n if (that.trigger(CHANGING, { target: target, originalEvent: e.event })) {\r\n that.userEvents.cancel();\r\n return;\r\n }\r\n\r\n that._downTarget = target;\r\n\r\n //in case of hierarchy\r\n if (!that._isElement(target.closest(\".\" + that.selectableClass))) {\r\n that.userEvents.cancel();\r\n return;\r\n }\r\n\r\n if (that.options.useAllItems) {\r\n that._items = that.element.find(that.options.filter);\r\n } else {\r\n currentElement = target.closest(that.element);\r\n that._items = currentElement.find(that.options.filter);\r\n }\r\n\r\n e.sender.capture();\r\n\r\n that._marquee\r\n .appendTo(document.body)\r\n .css({\r\n left: e.x.client + 1,\r\n top: e.y.client + 1,\r\n width: 0,\r\n height: 0\r\n });\r\n\r\n if (!ctrlKey) {\r\n that.clear();\r\n }\r\n\r\n target = target.add(that.relatedTarget(target));\r\n if (selected) {\r\n that._selectElement(target, true);\r\n if (ctrlKey) {\r\n target.addClass(UNSELECTING);\r\n }\r\n }\r\n },\r\n\r\n _move: function(e) {\r\n var that = this,\r\n position = {\r\n left: e.x.startLocation > e.x.location ? e.x.location : e.x.startLocation,\r\n top: e.y.startLocation > e.y.location ? e.y.location : e.y.startLocation,\r\n width: abs(e.x.initialDelta),\r\n height: abs(e.y.initialDelta)\r\n };\r\n\r\n if (!that._isActivated()) {\r\n return;\r\n }\r\n\r\n that._marquee.css(position);\r\n\r\n that._invalidateSelectables(position, (e.event.ctrlKey || e.event.metaKey));\r\n\r\n e.preventDefault();\r\n },\r\n\r\n _end: function(e) {\r\n var that = this,\r\n rangeSelectedAttr = kendo.attr(\"range-selected\"),\r\n uid = kendo.guid();\r\n\r\n if (!that._isActivated()) {\r\n return;\r\n }\r\n\r\n that._activated = false;\r\n\r\n that._marquee.remove();\r\n\r\n that._unselect(that.element\r\n .find(that.options.filter + \".\" + UNSELECTING))\r\n .removeClass(UNSELECTING);\r\n\r\n\r\n var target = that.element.find(that.options.filter + \".\" + ACTIVE);\r\n target = target.add(that.relatedTarget(target));\r\n\r\n if (that.options.addIdToRanges) {\r\n for (var i = 0; i < that._currentlyActive.length; i++) {\r\n $(that._currentlyActive[i]).attr(rangeSelectedAttr, uid);\r\n }\r\n }\r\n\r\n if (!that._lastRange || !compareElements(that._lastRange, target)) {\r\n that.value(target, e);\r\n that._notify(CHANGE, e);\r\n }\r\n that._lastRange = target;\r\n that._lastActive = that._downTarget;\r\n that._items = null;\r\n },\r\n\r\n _invalidateSelectables: function(position, ctrlKey) {\r\n var idx,\r\n length,\r\n target = this._downTarget[0],\r\n items = this._items,\r\n selectedClass = this.options.selectedClass || SELECTED,\r\n related,\r\n toSelect;\r\n\r\n this._currentlyActive = [];\r\n\r\n for (idx = 0, length = items.length; idx < length; idx ++) {\r\n toSelect = items.eq(idx);\r\n related = toSelect.add(this.relatedTarget(toSelect));\r\n\r\n if (collision(toSelect, position)) {\r\n if (toSelect.hasClass(selectedClass)) {\r\n if (ctrlKey && target !== toSelect[0]) {\r\n related.removeClass(selectedClass).addClass(UNSELECTING);\r\n }\r\n } else if (!toSelect.hasClass(ACTIVE) && !toSelect.hasClass(UNSELECTING) && !this._collidesWithActiveElement(related, position)) {\r\n related.addClass(ACTIVE);\r\n }\r\n this._currentlyActive.push(related[0]);\r\n } else {\r\n if (toSelect.hasClass(ACTIVE)) {\r\n related.removeClass(ACTIVE);\r\n } else if (ctrlKey && toSelect.hasClass(UNSELECTING)) {\r\n related.removeClass(UNSELECTING).addClass(selectedClass);\r\n }\r\n }\r\n }\r\n },\r\n\r\n _collidesWithActiveElement: function(element, marqueeRect) {\r\n if (!this.options.ignoreOverlapped) {\r\n return false;\r\n }\r\n\r\n var activeElements = this._currentlyActive;\r\n var elemRect = element[0].getBoundingClientRect();\r\n var activeElementRect;\r\n var collision = false;\r\n var isRtl = kendo.support.isRtl(element);\r\n var leftRight = isRtl ? \"right\" : \"left\";\r\n var tempRect = {};\r\n\r\n marqueeRect.right = marqueeRect.left + marqueeRect.width;\r\n marqueeRect.bottom = marqueeRect.top + marqueeRect.height;\r\n\r\n for (var i = 0; i < activeElements.length; i++) {\r\n activeElementRect = activeElements[i].getBoundingClientRect();\r\n if (overlaps(elemRect, activeElementRect)) {\r\n tempRect[leftRight] = leftRight === \"left\" ? activeElementRect.right : activeElementRect.left;\r\n elemRect = extend({}, elemRect, tempRect);\r\n if (elemRect.left > elemRect.right) {\r\n return true;\r\n }\r\n collision = !overlaps(elemRect, marqueeRect);\r\n }\r\n }\r\n return collision;\r\n },\r\n\r\n value: function(val) {\r\n var that = this,\r\n selectElement = that._selectElement.bind(that);\r\n\r\n if (val) {\r\n val.each(function() {\r\n selectElement(this);\r\n });\r\n\r\n return;\r\n }\r\n\r\n return that.element.find(that.options.filter + \".\" + (that.options.selectedClass || SELECTED));\r\n },\r\n\r\n selectedRanges: function() {\r\n var that = this;\r\n var rangeSelectedAttr = kendo.attr(\"range-selected\");\r\n var map = {};\r\n\r\n that.element.find(\"[\" + rangeSelectedAttr + \"]\").each(function(_, elem) {\r\n var rangeId = $(elem).attr(rangeSelectedAttr);\r\n var mapLocation = map[rangeId];\r\n\r\n if (!mapLocation) {\r\n mapLocation = map[rangeId] = [];\r\n }\r\n\r\n mapLocation.push($(elem));\r\n });\r\n\r\n return map;\r\n },\r\n\r\n selectedSingleItems: function() {\r\n var that = this;\r\n var rangeSelectedAttr = kendo.attr(\"range-selected\");\r\n\r\n return that.element.find(that.options.filter + \".\" + (that.options.selectedClass || SELECTED) + \":not([\" + rangeSelectedAttr + \"])\").toArray().map(function(elem) {\r\n return $(elem);\r\n });\r\n },\r\n\r\n _firstSelectee: function() {\r\n var that = this,\r\n selected;\r\n\r\n if (that._lastActive !== null) {\r\n return that._lastActive;\r\n }\r\n\r\n selected = that.value();\r\n return selected.length > 0 ?\r\n selected[0] :\r\n that.element.find(that.options.filter)[0];\r\n },\r\n\r\n _selectElement: function(element, preventNotify) {\r\n var toSelect = $(element),\r\n selectedClass = this.options.selectedClass || SELECTED,\r\n isPrevented = !preventNotify && this._notify(\"select\", { element: element });\r\n\r\n toSelect.removeClass(ACTIVE);\r\n if (!isPrevented) {\r\n toSelect.addClass(selectedClass);\r\n\r\n if (this.options.aria) {\r\n toSelect.attr(ARIASELECTED, true);\r\n }\r\n }\r\n },\r\n\r\n _notify: function(name, args) {\r\n args = args || { };\r\n return this.trigger(name, args);\r\n },\r\n\r\n _unselect: function(element) {\r\n if (this.trigger(UNSELECT, { element: element })) {\r\n return;\r\n }\r\n\r\n var rangeSelectedAttr = kendo.attr(\"range-selected\");\r\n\r\n element.removeClass(this.options.selectedClass || SELECTED).removeAttr(rangeSelectedAttr);\r\n\r\n if (this.options.aria) {\r\n element.attr(ARIASELECTED, false);\r\n }\r\n\r\n return element;\r\n },\r\n\r\n _select: function(e) {\r\n if (this._allowSelection(e.event.target)) {\r\n if (!msie || (msie && !$(kendo._activeElement()).is(this.options.inputSelectors))) {\r\n if (this._allowPreventDefault(e.event.target)) {\r\n e.preventDefault();\r\n }\r\n }\r\n }\r\n },\r\n\r\n _allowPreventDefault: function(target) {\r\n var disallowedSelectors = \".k-table-td\";\r\n // Required for the paste event in the Grid to work in Chrome.\r\n return !$(target).is(disallowedSelectors) || !this.options.allowPaste;\r\n },\r\n\r\n _allowSelection: function(target) {\r\n if ($(target).is(this.options.inputSelectors)) {\r\n this.userEvents.cancel();\r\n this._downTarget = null;\r\n return false;\r\n }\r\n\r\n return true;\r\n },\r\n\r\n resetTouchEvents: function() {\r\n this.userEvents.cancel();\r\n },\r\n\r\n clear: function() {\r\n var items = this.element.find(this.options.filter + \".\" + (this.options.selectedClass || SELECTED));\r\n this._unselect(items);\r\n },\r\n\r\n selectRange: function(start, end) {\r\n var that = this,\r\n idx,\r\n tmp,\r\n items;\r\n\r\n that.clear();\r\n\r\n if (that.element.length > 1) {\r\n items = that.options.continuousItems();\r\n }\r\n\r\n if (!items || !items.length) {\r\n items = that.element.find(that.options.filter);\r\n }\r\n\r\n start = $.inArray($(start)[0], items);\r\n end = $.inArray($(end)[0], items);\r\n\r\n if (start > end) {\r\n tmp = start;\r\n start = end;\r\n end = tmp;\r\n }\r\n\r\n if (!that.options.useAllItems) {\r\n end += that.element.length - 1;\r\n }\r\n\r\n for (idx = start; idx <= end; idx ++ ) {\r\n that._selectElement(items[idx], true);\r\n }\r\n },\r\n\r\n destroy: function() {\r\n var that = this;\r\n\r\n Widget.fn.destroy.call(that);\r\n\r\n that.element.off(NS);\r\n\r\n that.userEvents.destroy();\r\n\r\n that._marquee = that._lastActive = that.element = that.userEvents = null;\r\n }\r\n });\r\n\r\n const RangeSelectable = Widget.extend({\r\n init: function(element, options) {\r\n let that = this,\r\n ns,\r\n cellSelectorValid;\r\n\r\n Widget.fn.init.call(that, element, options);\r\n\r\n that.widget = options.widget;\r\n ns = options.ns;\r\n cellSelectorValid = options.filter;\r\n\r\n that.userEvents = new kendo.UserEvents(that.element, {\r\n global: true,\r\n allowSelection: true,\r\n filter: that.options.filter,\r\n tap: that._tap.bind(that),\r\n touchAction: NONE\r\n });\r\n\r\n if (support.touch) {\r\n element.on(TOUCHSTART + ns, cellSelectorValid, that._mouseEnter.bind(that))\r\n .on(TOUCHEND + ns + \" \" + TOUCHMOVE + ns, cellSelectorValid, that._mouseLeave.bind(that));\r\n } else {\r\n element.on(MOUSEENTER + ns, cellSelectorValid, that._mouseEnter.bind(that))\r\n .on(MOUSELEAVE + ns, cellSelectorValid, that._mouseLeave.bind(that));\r\n }\r\n },\r\n\r\n events: [CHANGE],\r\n\r\n options: {\r\n name: \"RangeSelectable\",\r\n filter: \">*\",\r\n inputSelectors: INPUTSELECTOR,\r\n resetOnStart: false,\r\n multiple: false,\r\n dragToSelect: true,\r\n cellSelector: \"*\",\r\n ns: \"\",\r\n reverse: false,\r\n relatedTarget: $.noop\r\n },\r\n\r\n destroy: function() {\r\n let that = this;\r\n\r\n Widget.fn.destroy.call(that);\r\n\r\n that.userEvents.destroy();\r\n that.widget = null;\r\n\r\n that._lastActive = that.element = that.userEvents = that._start = that._end = null;\r\n },\r\n\r\n _allowSelection: function(target) {\r\n if ($(target).is(this.options.inputSelectors)) {\r\n this.userEvents.cancel();\r\n return false;\r\n }\r\n\r\n return true;\r\n },\r\n\r\n _mouseEnter: function(e) {\r\n let that = this,\r\n cell = $(e.currentTarget),\r\n range;\r\n\r\n cell.addClass(HOVER);\r\n\r\n range = that.widget.selectRange();\r\n\r\n if (that.options.resetOnStart && range.end) {\r\n return;\r\n }\r\n\r\n if (range.target === START && that._end) {\r\n that.range(cell, that._end, true, that.options.reverse);\r\n }\r\n\r\n if (range.target === END) {\r\n that.range(that._start, cell, true, that.options.reverse);\r\n }\r\n },\r\n\r\n _mouseLeave: function(e) {\r\n $(e.currentTarget).removeClass(HOVER);\r\n },\r\n\r\n start: function(element, preventFlagUpdate) {\r\n if (element === undefined$1 || element === null) {\r\n return this._start;\r\n }\r\n\r\n element.addClass(SELECTED + \" \" + RANGESTART).attr(ARIASELECTED, true);\r\n\r\n if (!preventFlagUpdate) {\r\n this._start = element;\r\n }\r\n },\r\n\r\n end: function(element, preventFlagUpdate) {\r\n if (element === undefined$1 || element === null) {\r\n return this._start;\r\n }\r\n\r\n element.addClass(SELECTED + \" \" + RANGEEND).attr(ARIASELECTED, true);\r\n\r\n if (!preventFlagUpdate) {\r\n this._end = element;\r\n }\r\n },\r\n\r\n mid: function(elements) {\r\n let tables = this.element.find(\"table\"),\r\n options = this.options;\r\n\r\n elements.addClass(MID).attr(ARIASELECTED, true);\r\n tables.each(function() {\r\n let that = $(this);\r\n let lastCell = that.find(options.cellSelectorValid).last();\r\n let firstCell = that.find(options.cellSelectorValid).first();\r\n\r\n if (lastCell.hasClass(MID)) {\r\n lastCell.addClass(SPLITEND);\r\n }\r\n\r\n if (firstCell.hasClass(MID)) {\r\n firstCell.addClass(SPLITSTART);\r\n }\r\n });\r\n },\r\n\r\n clear: function(clearVariables) {\r\n let options = this.options;\r\n this.element.find(options.cellSelector)\r\n .removeClass(MID + \" \" + SPLITEND + \" \" + SPLITSTART);\r\n\r\n this.clearStartEnd();\r\n\r\n if (clearVariables) {\r\n this._start = this._end = null;\r\n }\r\n },\r\n\r\n clearStartEnd: function() {\r\n let that = this, options = that.options;\r\n that.element.find(options.cellSelector).removeClass(RANGESTART + \" \" + SELECTED + \" \" + RANGEEND).removeAttr(ARIASELECTED);\r\n },\r\n\r\n selectFrom: function(start) {\r\n let that = this,\r\n options = this.options,\r\n items,\r\n startIdx;\r\n\r\n items = that.element.find(options.cellSelector);\r\n\r\n startIdx = $.inArray($(start)[0], items);\r\n\r\n that.clear();\r\n that.start(start);\r\n\r\n items = items.filter(function(index) {\r\n return index > startIdx;\r\n });\r\n that.mid(items);\r\n },\r\n\r\n selectTo: function(end) {\r\n let that = this,\r\n options = this.options,\r\n items,\r\n endIdx;\r\n\r\n items = that.element.find(options.cellSelector);\r\n\r\n endIdx = $.inArray($(end)[0], items);\r\n\r\n that.clear();\r\n\r\n items = items.filter(function(index) {\r\n return index < endIdx;\r\n });\r\n that.mid(items);\r\n that.end($(end));\r\n },\r\n\r\n range: function(start, end, preventFlagUpdate, invert) {\r\n let that = this,\r\n options = this.options,\r\n items,\r\n startIdx,\r\n endIdx;\r\n\r\n if (start === undefined$1) {\r\n return { start: that._start, end: that._end };\r\n }\r\n\r\n that._clearFlags();\r\n\r\n items = that.element.find(options.cellSelector);\r\n\r\n startIdx = $.inArray($(start)[0], items);\r\n endIdx = $.inArray($(end)[0], items);\r\n\r\n if (!start || (start && !start.length)) {\r\n that._useStart = true;\r\n }\r\n\r\n that.clear();\r\n\r\n if (start) {\r\n that.start($(start), preventFlagUpdate);\r\n }\r\n\r\n items = items.filter(function(index) {\r\n if (endIdx < 0 || (!start && startIdx < 0)) {\r\n return;\r\n }\r\n\r\n return (index > startIdx && index < endIdx) || options.reverse && (index < startIdx && index > endIdx);\r\n });\r\n\r\n that.mid(items);\r\n\r\n if (end) {\r\n that.end($(end), preventFlagUpdate);\r\n } else {\r\n that._useEnd = true;\r\n }\r\n\r\n if (startIdx > endIdx && invert) {\r\n that.clearStartEnd();\r\n that.start($(end), true);\r\n that.end($(start), true);\r\n }\r\n },\r\n\r\n change: function() {\r\n this.trigger(CHANGE);\r\n },\r\n\r\n _clearFlags: function() {\r\n this._useStart = this._useEnd = false;\r\n },\r\n\r\n _tap: function(e) {\r\n let target = $(e.target),\r\n that = this,\r\n range = that.widget.selectRange() || {},\r\n start = range.start,\r\n end = range.end,\r\n currentDate = kendo.calendar.toDateObject($(target).find(\"span\")),\r\n options = that.options,\r\n resetOnStart = options.resetOnStart;\r\n\r\n that._lastActive = target;\r\n\r\n if (!start && !end) {\r\n that.clear(true);\r\n if (range.target === START) {\r\n that.start(target);\r\n }\r\n\r\n if (range.target === END) {\r\n that.end(target);\r\n }\r\n\r\n that._clearFlags();\r\n that.trigger(CHANGE);\r\n return;\r\n }\r\n\r\n if (!start && end) {\r\n if (range.target === END) {\r\n that.end(target);\r\n } else {\r\n if (+currentDate > +range.end && !options.reverse) {\r\n that.clear(true);\r\n that.start(target);\r\n } else {\r\n that.range(target, that._end, false, true);\r\n }\r\n }\r\n that.trigger(CHANGE);\r\n that._clearFlags();\r\n return;\r\n }\r\n\r\n if (start && !end) {\r\n if (range.target === END && !options.reverse && +start > +currentDate) {\r\n that.clear(true);\r\n\r\n if (resetOnStart) {\r\n that.start(target);\r\n } else {\r\n that.end(target);\r\n }\r\n } else if (range.target === START) {\r\n that.start(target);\r\n } else {\r\n that.range(that._start, target, false, true);\r\n }\r\n that.trigger(CHANGE);\r\n that._clearFlags();\r\n return;\r\n }\r\n\r\n if (start && end) {\r\n if (!options.reverse) {\r\n if (+start > +currentDate && range.target === END) {\r\n that.clear(true);\r\n if (resetOnStart) {\r\n that.start(target);\r\n that.end(null);\r\n range.target = START;\r\n } else {\r\n that.start(null);\r\n that.end(target);\r\n }\r\n that.trigger(CHANGE);\r\n return;\r\n }\r\n\r\n if (+start < +currentDate && range.target === START) {\r\n if (+currentDate > +range.end) {\r\n that.clear(true);\r\n that.start(target);\r\n that.end(null);\r\n } else {\r\n that.range(target, that._end);\r\n }\r\n that.trigger(CHANGE);\r\n return;\r\n }\r\n\r\n if (range.target === START) {\r\n that.range(target, that._end);\r\n }\r\n\r\n if (range.target === END) {\r\n that.range(that._start, target);\r\n }\r\n\r\n that.trigger(CHANGE);\r\n return;\r\n }\r\n\r\n if (resetOnStart) {\r\n if (range.target === START) {\r\n that.range(target, that._end, false, true);\r\n } else {\r\n that.range(that._start, target, false, true);\r\n }\r\n } else {\r\n if (range.target === START) {\r\n that.start(target);\r\n } else {\r\n that.end(target);\r\n }\r\n }\r\n\r\n that.trigger(CHANGE);\r\n }\r\n }\r\n });\r\n\r\n Selectable.parseOptions = function(selectable) {\r\n var selectableMode = selectable.mode || selectable;\r\n var asLowerString = typeof selectableMode === \"string\" && selectableMode.toLowerCase();\r\n return {\r\n multiple: asLowerString && asLowerString.indexOf(\"multiple\") > -1,\r\n cell: asLowerString && asLowerString.indexOf(\"cell\") > -1,\r\n range: asLowerString && asLowerString.indexOf(\"range\") > -1,\r\n single: asLowerString && asLowerString.indexOf(\"single\") > -1\r\n };\r\n };\r\n\r\n function compareElements(element, toCompare) {\r\n\r\n if (element.length !== toCompare.length) {\r\n return false;\r\n }\r\n\r\n for (var i = 0; i < element.length; i++) {\r\n if (element[i] !== toCompare[i]) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n function collision(element, position) {\r\n if (!element.is(\":visible\")) {\r\n return false;\r\n }\r\n\r\n var elementPosition = kendo.getOffset(element),\r\n right = position.left + position.width,\r\n bottom = position.top + position.height;\r\n\r\n elementPosition.right = elementPosition.left + kendo._outerWidth(element);\r\n elementPosition.bottom = elementPosition.top + kendo._outerHeight(element);\r\n\r\n return !(elementPosition.left > right ||\r\n elementPosition.right < position.left ||\r\n elementPosition.top > bottom ||\r\n elementPosition.bottom < position.top);\r\n }\r\n\r\n function overlaps(firstRect, secondRect) {\r\n return !(firstRect.right <= secondRect.left ||\r\n firstRect.left >= secondRect.right ||\r\n firstRect.bottom <= secondRect.top ||\r\n firstRect.top >= secondRect.bottom);\r\n }\r\n\r\n kendo.ui.plugin(Selectable);\r\n kendo.ui.plugin(RangeSelectable);\r\n\r\n })(window.kendo.jQuery);\r\n var kendo$2c = kendo;\r\n\r\n var __meta__$2b = {\r\n id: \"html.button\",\r\n name: \"Html.Button\",\r\n category: \"web\",\r\n description: \"HTML rendering utility for Kendo UI for jQuery.\",\r\n depends: [ \"html.base\", \"icons\" ],\r\n features: []\r\n };\r\n\r\n (function($, undefined$1) {\r\n var kendo = window.kendo,\r\n HTMLBase = kendo.html.HTMLBase,\r\n\r\n KBUTTON = \"k-button\",\r\n KBUTTONICON = \"k-button-icon\",\r\n KBUTTONTEXT = \"k-button-text\";\r\n\r\n var renderButton = function(element, options) {\r\n if (arguments[0] === undefined$1 || $.isPlainObject(arguments[0])) {\r\n options = element;\r\n element = $(\"\");\r\n }\r\n\r\n return (new HTMLButton(element, options)).html();\r\n };\r\n\r\n var HTMLButton = HTMLBase.extend({\r\n init: function(element, options) {\r\n var that = this;\r\n HTMLBase.fn.init.call(that, element, options);\r\n that.wrapper = that.element.addClass(KBUTTON);\r\n\r\n if (!that.element.attr(\"type\") && that.options.type) {\r\n that.element.attr(\"type\", that.options.type);\r\n }\r\n\r\n that._addClasses();\r\n that.iconElement();\r\n that._textElement();\r\n },\r\n options: {\r\n name: \"HTMLButton\",\r\n type: \"button\",\r\n icon: \"\",\r\n iconClass: \"\",\r\n spriteCssClass: \"\",\r\n imageUrl: \"\",\r\n size: \"medium\",\r\n rounded: \"medium\",\r\n fillMode: \"solid\",\r\n themeColor: \"base\",\r\n stylingOptions: [ \"size\", \"rounded\", \"fillMode\", \"themeColor\" ]\r\n },\r\n iconElement: function() {\r\n var that = this,\r\n element = that.element,\r\n options = that.options,\r\n icon = options.icon,\r\n iconClass = options.iconClass,\r\n spriteCssClass = options.spriteCssClass,\r\n imageUrl = options.imageUrl,\r\n span, img, isEmpty;\r\n\r\n if (spriteCssClass || imageUrl || icon || iconClass) {\r\n isEmpty = true;\r\n\r\n element.contents().filter(function() {\r\n return (!$(this).hasClass(\"k-sprite\") && !$(this).hasClass(\"k-icon\") && !$(this).hasClass(\"k-svg-icon\") && !$(this).hasClass(\"k-image\"));\r\n }).each(function(idx, el) {\r\n if (el.nodeType == 1 || el.nodeType == 3 && kendo.trim(el.nodeValue).length > 0) {\r\n isEmpty = false;\r\n }\r\n });\r\n }\r\n\r\n if (isEmpty) {\r\n that.element.addClass(\"k-icon-button\");\r\n }\r\n\r\n if (imageUrl) {\r\n img = element.children(\"img.k-image\").first();\r\n if (!img[0]) {\r\n img = $('\"icon\"').prependTo(element);\r\n }\r\n img.attr(\"src\", imageUrl);\r\n img.addClass(KBUTTONICON);\r\n } else if (icon || iconClass) {\r\n span = element.children(\"span.k-icon, span.k-svg-icon\").first();\r\n if (!span[0]) {\r\n span = $(kendo.ui.icon({ icon, iconClass })).prependTo(element);\r\n } else {\r\n kendo.ui.icon(span, { icon, iconClass });\r\n }\r\n\r\n span.addClass(KBUTTONICON);\r\n } else if (spriteCssClass) {\r\n span = element.children(\"span.k-sprite\").first();\r\n if (!span[0]) {\r\n span = $('').prependTo(element);\r\n }\r\n span.addClass(spriteCssClass + \" \" + KBUTTONICON);\r\n }\r\n },\r\n _textElement: function() {\r\n var element = this.element;\r\n\r\n element.contents().filter(function() {\r\n return (!$(this).hasClass(KBUTTONICON) && !$(this).hasClass(\"k-sprite\") && !$(this).hasClass(\"k-icon\") && !$(this).hasClass(\"k-image\"));\r\n }).each(function(idx, el) {\r\n if (el.nodeType == 1 || el.nodeType == 3 && kendo.trim(el.nodeValue).length > 0) {\r\n if (el.nodeType === 3) {\r\n var newSpan = document.createElement('span');\r\n\r\n el.parentNode.insertBefore(newSpan, el);\r\n newSpan.appendChild(el);\r\n el = newSpan;\r\n }\r\n\r\n el.classList.add(KBUTTONTEXT);\r\n }\r\n });\r\n }\r\n });\r\n\r\n $.extend(kendo.html, {\r\n renderButton: renderButton,\r\n HTMLButton: HTMLButton\r\n });\r\n\r\n kendo.cssProperties.registerPrefix(\"HTMLButton\", \"k-button-\");\r\n\r\n kendo.cssProperties.registerValues(\"HTMLButton\", [{\r\n prop: \"fillMode\",\r\n values: kendo.cssProperties.fillModeValues.concat([\"link\", \"clear\"])\r\n }, {\r\n prop: \"rounded\",\r\n values: kendo.cssProperties.roundedValues.concat([['full', 'full']])\r\n }]);\r\n\r\n })(window.kendo.jQuery);\r\n var kendo$2b = kendo;\r\n\r\n (function($, undefined$1) {\r\n\r\n var kendo = window.kendo;\r\n var Widget = kendo.ui.Widget;\r\n var extend = $.extend;\r\n var DOT = \".\";\r\n var NS = \".kendoChat\";\r\n var keys = kendo.keys;\r\n\r\n var messageBoxStyles = {\r\n input: \"k-input-inner\",\r\n inputWrapper: \"k-textbox k-input k-input-md k-input-solid k-rounded-md\",\r\n button: \"k-button\",\r\n buttonFlat: \"k-button-lg k-button-flat k-button-flat-base\",\r\n iconButton: \"k-icon-button\",\r\n buttonIcon: \"k-button-icon\",\r\n buttonSend: \"k-chat-send\",\r\n buttonSendIcon: \"paper-plane\",\r\n buttonToggle: \"k-button-toggle\",\r\n buttonToggleIcon: \"more-horizontal\",\r\n hidden: \"k-hidden\",\r\n inputSuffix: \"k-input-suffix k-input-suffix-horizontal\",\r\n separator: \"k-input-separator k-input-separator-vertical\"\r\n };\r\n\r\n var ChatMessageBox = Widget.extend({\r\n init: function(element, options) {\r\n Widget.fn.init.call(this, element, options);\r\n\r\n this._wrapper();\r\n\r\n this._attachEvents();\r\n\r\n this._typing = false;\r\n },\r\n\r\n events: [\r\n \"focusToolbar\",\r\n \"sendMessage\",\r\n \"toggleToolbar\",\r\n \"typingEnd\",\r\n \"typingStart\"\r\n ],\r\n\r\n options: {\r\n messages: {\r\n placeholder: \"Type a message...\",\r\n toggleButton: \"Toggle toolbar\",\r\n sendButton: \"Send message\"\r\n }\r\n },\r\n\r\n destroy: function() {\r\n Widget.fn.destroy.call(this);\r\n\r\n if (this.input) {\r\n this.input.off(NS);\r\n this.input.remove();\r\n this.input = null;\r\n }\r\n\r\n this.element.off(NS);\r\n this.element.empty();\r\n },\r\n\r\n _wrapper: function() {\r\n var styles = ChatMessageBox.styles;\r\n var options = this.options;\r\n var messages = options.messages;\r\n var inputId = \"inputId_\" + kendo.guid();\r\n\r\n this.inputWrapper = this.element\r\n .addClass(styles.inputWrapper)\r\n .appendTo(this.element);\r\n\r\n this.input = $(\"\")\r\n .addClass(styles.input)\r\n .attr(\"id\", inputId)\r\n .attr(\"aria-label\", messages.placeholder)\r\n .attr(\"placeholder\", messages.placeholder)\r\n .appendTo(this.inputWrapper);\r\n\r\n this.separator = $(\"\")\r\n .addClass(styles.separator)\r\n .appendTo(this.inputWrapper);\r\n\r\n this.inputSuffix = $(\"\")\r\n .addClass(styles.inputSuffix)\r\n .appendTo(this.inputWrapper);\r\n\r\n if (options.toolbar && options.toolbar.toggleable && options.toolbar.buttons && options.toolbar.buttons.length) {\r\n $(kendo.html.renderButton(``,\r\n {\r\n icon: styles.buttonToggleIcon,\r\n fillMode: \"flat\",\r\n size: \"medium\"\r\n }))\r\n .appendTo(this.inputSuffix);\r\n }\r\n\r\n $(kendo.html.renderButton(``,\r\n {\r\n icon: styles.buttonSendIcon,\r\n fillMode: \"flat\",\r\n size: \"medium\"\r\n }))\r\n .appendTo(this.inputSuffix);\r\n },\r\n\r\n _attachEvents: function() {\r\n var styles = ChatMessageBox.styles;\r\n\r\n this.input\r\n .on(\"keydown\" + NS, this._keydown.bind(this))\r\n .on(\"input\" + NS, this._input.bind(this))\r\n .on(\"focusout\" + NS, this._inputFocusout.bind(this));\r\n\r\n this.element\r\n .on(\"click\" + NS, DOT + styles.buttonSend, this._buttonClick.bind(this));\r\n\r\n this.element\r\n .on(\"click\" + NS, DOT + styles.buttonToggle, this._toggleToolbar.bind(this));\r\n },\r\n\r\n _input: function() {\r\n var currentValue = this.input.val();\r\n var start = currentValue.length > 0;\r\n\r\n this._triggerTyping(start);\r\n },\r\n\r\n _keydown: function(e) {\r\n var key = e.keyCode;\r\n\r\n switch (key) {\r\n case keys.ENTER:\r\n e.preventDefault();\r\n\r\n this._sendMessage();\r\n break;\r\n case keys.F10:\r\n e.preventDefault();\r\n\r\n this.trigger(\"focusToolbar\");\r\n break;\r\n }\r\n },\r\n\r\n _buttonClick: function(e) {\r\n e.preventDefault();\r\n\r\n this._sendMessage();\r\n },\r\n\r\n _sendMessage: function() {\r\n var value = this.input.val();\r\n\r\n if (!value.length) {\r\n return;\r\n }\r\n\r\n this._triggerTyping(false);\r\n\r\n var args = {\r\n text: value\r\n };\r\n\r\n this.trigger(\"sendMessage\", args);\r\n\r\n this.input.val(\"\");\r\n },\r\n\r\n _inputFocusout: function() {\r\n this._triggerTyping(false);\r\n },\r\n\r\n _triggerTyping: function(start) {\r\n if (start) {\r\n if (!this._typing) {\r\n this.trigger(\"typingStart\", {});\r\n this._typing = true;\r\n }\r\n } else {\r\n if (this._typing) {\r\n this.trigger(\"typingEnd\", {});\r\n this._typing = false;\r\n }\r\n }\r\n },\r\n\r\n _toggleToolbar: function(ev) {\r\n this.trigger(\"toggleToolbar\", { originalEvent: ev });\r\n }\r\n });\r\n\r\n extend(true, ChatMessageBox, { styles: messageBoxStyles });\r\n extend(kendo, {\r\n chat: {\r\n ChatMessageBox: ChatMessageBox\r\n }\r\n });\r\n })(window.kendo.jQuery);\r\n\r\n (function($, undefined$1) {\r\n\r\n var kendo = window.kendo;\r\n var Widget = kendo.ui.Widget;\r\n var extend = $.extend;\r\n var DOT = \".\";\r\n var NS = \".kendoChat\";\r\n\r\n var DATA_K_BUTTON_NAME = \"kButtonName\";\r\n var SCROLL_LEFT_NAME = \"chatToolbarScrollLeft\";\r\n var SCROLL_RIGHT_NAME = \"chatToolbarScrollRight\";\r\n var VISIBLE = \":visible\";\r\n var TABINDEX = \"tabindex\";\r\n\r\n var DEFAULT_ANIMATION = {\r\n effects: \"expand:vertical\",\r\n duration: 200\r\n };\r\n var NO_ANIMATION = {\r\n expand: {\r\n show: true\r\n },\r\n collapse: {\r\n hide: true\r\n }\r\n };\r\n\r\n var toolbarStyles = {\r\n button: \"k-button\",\r\n buttonDefaults: \"k-button-md k-rounded-md k-button-solid k-button-solid-base\",\r\n buttonList: \"k-button-list k-toolbar-group\",\r\n scrollButton: \"k-scroll-button\",\r\n scrollButtonLeft: \"k-scroll-button-left\",\r\n scrollButtonRight: \"k-scroll-button-right\",\r\n scrollButtonLeftIcon: \"chevron-left\",\r\n scrollButtonRightIcon: \"chevron-right\",\r\n iconButton: \"k-icon-button\"\r\n };\r\n\r\n var ChatToolBar = Widget.extend({\r\n init: function(element, options) {\r\n options = extend({}, options, { name: \"ChatToolbar\" });\r\n var toolbarOptions = options.toolbar;\r\n var buttonsDefined = toolbarOptions.buttons && toolbarOptions.buttons.length;\r\n\r\n Widget.fn.init.call(this, element, options);\r\n\r\n if (buttonsDefined) {\r\n this._createButtonList();\r\n }\r\n\r\n if (buttonsDefined && toolbarOptions.scrollable &&\r\n this.buttonsWidth() > this.element.width()) {\r\n this._initScrolling();\r\n }\r\n\r\n this._setupAnimation();\r\n\r\n if (buttonsDefined && toolbarOptions.toggleable) {\r\n this.toggle(true);\r\n }\r\n\r\n this.element\r\n .on(\"click\" + NS, this._onClick.bind(this))\r\n .on(\"keydown\" + NS, this._onKeydown.bind(this));\r\n },\r\n\r\n events: [\r\n \"click\"\r\n ],\r\n\r\n destroy: function() {\r\n Widget.fn.destroy.call(this);\r\n\r\n this.element.off(NS);\r\n this.element.empty();\r\n },\r\n\r\n _createButtonList: function() {\r\n var that = this;\r\n var styles = ChatToolBar.styles;\r\n var buttons = that.options.toolbar.buttons;\r\n var buttonList = $(\"
    \");\r\n\r\n for (var i = 0; i < buttons.length; i++) {\r\n var button = that._createButton(buttons[i]);\r\n buttonList.append(button);\r\n }\r\n\r\n buttonList.appendTo(this.element);\r\n\r\n this.buttonList = buttonList;\r\n this.buttons().first().removeAttr(TABINDEX);\r\n },\r\n\r\n _createButton: function(btnOptions) {\r\n var styles = ChatToolBar.styles;\r\n var buttonElm = $(\"`;\r\n\r\n var CARD_ACTIONS_TEMPLATE = ({ styles, buttons }) => `
    \r\n ${ buttons.map((button) => CARD_ACTION_BUTTON_TEMPLATE({ styles, button })).join('') }\r\n
    `;\r\n\r\n var HERO_CARD_TEMPLATE = ({ styles, images, buttons, title, subtitle, text }) => `
    \r\n ${ (typeof images !== \"undefined\" && images.length > 0) ? HERO_IMG_TEMPLATE({ images, styles }) : '' }\r\n
    \r\n ${ typeof title !== \"undefined\" ? (() => `
    ${encode(title)}
    `)() : '' }\r\n ${ typeof subtitle !== \"undefined\" ? (() => `
    ${encode(subtitle)}
    `)() : '' }\r\n ${ typeof text !== \"undefined\" ? (() => `

    ${encode(text)}

    `)() : '' }\r\n
    \r\n ${ (typeof buttons !== \"undefined\" && buttons.length > 0) ? CARD_ACTIONS_TEMPLATE({ buttons, styles }) : ''}\r\n
    `;\r\n\r\n extend(kendo.chat, {\r\n Templates: {},\r\n Components: {}\r\n });\r\n\r\n kendo.chat.registerTemplate = function(templateName, template) {\r\n kendo.chat.Templates[templateName] = kendo.template(template);\r\n };\r\n\r\n kendo.chat.getTemplate = function(templateName) {\r\n return kendo.chat.Templates[templateName] || TEXT_MESSAGE_TEMPLATE;\r\n };\r\n\r\n kendo.chat.registerTemplate(\"text\", TEXT_MESSAGE_TEMPLATE);\r\n kendo.chat.registerTemplate(\"message\", TEXT_MESSAGE_TEMPLATE);\r\n kendo.chat.registerTemplate(\"typing\", TYPING_INDICATOR_TEMPLATE);\r\n kendo.chat.registerTemplate(\"suggestedAction\", SUGGESTED_ACTIONS_TEMPLATE);\r\n kendo.chat.registerTemplate(\"heroCard\", HERO_CARD_TEMPLATE);\r\n kendo.chat.registerTemplate(\"application/vnd.microsoft.card.hero\", HERO_CARD_TEMPLATE);\r\n\r\n kendo.chat.registerComponent = function(componentName, component) {\r\n kendo.chat.Components[componentName] = component;\r\n };\r\n\r\n kendo.chat.getComponent = function(componentName) {\r\n return kendo.chat.Components[componentName] || null;\r\n };\r\n\r\n var Component = kendo.chat.Component = kendo.Class.extend({\r\n init: function(options, view) {\r\n this.element = $('
    ');\r\n this.options = options;\r\n this.view = view;\r\n },\r\n\r\n destroy: function() {\r\n kendo.destroy(this.element);\r\n }\r\n });\r\n\r\n var Calendar = Component.extend({\r\n init: function(options, view) {\r\n Component.fn.init.call(this, options, view);\r\n\r\n this.element.kendoCalendar({\r\n change: function() {\r\n view.trigger(\"suggestedAction\", { text: kendo.toString(this.value(), 'd'), type: \"message\" });\r\n }\r\n });\r\n },\r\n\r\n destroy: function() {\r\n }\r\n });\r\n kendo.chat.registerComponent(\"calendar\", Calendar);\r\n\r\n var viewStyles = {\r\n wrapper: \"k-chat\",\r\n messageList: \"k-avatars\",\r\n messageListContent: \"k-message-list-content\",\r\n messageTime: \"k-message-time\",\r\n messageGroup: \"k-message-group\",\r\n message: \"k-message\",\r\n only: \"k-only\",\r\n first: \"k-first\",\r\n middle: \"k-middle\",\r\n last: \"k-last\",\r\n author: \"k-author\",\r\n avatar: \"k-avatar\",\r\n noAvatar: \"k-no-avatar\",\r\n self: \"k-alt\",\r\n button: \"k-button\",\r\n buttonDefaults: \"k-button-md k-rounded-md k-button-solid k-button-solid-base\",\r\n iconButton: \"k-icon-button\",\r\n buttonIcon: \"k-button-icon\",\r\n buttonPrimary: \"k-button-md k-rounded-md k-button-flat k-button-flat-primary\",\r\n scrollButtonIconLeft: \"chevron-left\",\r\n scrollButtonIconRight: \"chevron-right\",\r\n typingIndicator: \"k-typing-indicator\",\r\n typingIndicatorBubble: \"k-typing-indicator-bubble\",\r\n bubble: \"k-chat-bubble\",\r\n suggestedActions: \"k-quick-replies\",\r\n suggestedAction: \"k-quick-reply\",\r\n cardWrapper: \"k-card-container\",\r\n cardDeckScrollWrap: \"k-card-deck-scrollwrap\",\r\n cardDeck: \"k-card-deck\",\r\n cardList: \"k-card-list\",\r\n card: \"k-card\",\r\n cardRich: \"k-card-type-rich\",\r\n cardBody: \"k-card-body\",\r\n cardMedia: \"k-card-media\",\r\n cardTitle: \"k-card-title\",\r\n cardSubtitle: \"k-card-subtitle\",\r\n cardActions: \"k-card-actions\",\r\n cardActionsVertical: \"k-actions-vertical\",\r\n cardActionsHorizontal: \"k-actions-horizontal\",\r\n cardActionsStart: \"k-actions-start\",\r\n cardActionsCenter: \"k-actions-center\",\r\n cardActionsEnd: \"k-actions-end\",\r\n cardActionsStretched: \"k-actions-stretched\",\r\n cardAction: \"k-card-action\",\r\n selected: \"k-selected\"\r\n };\r\n\r\n var ChatView = kendo.chat.ChatView = Widget.extend({\r\n init: function(element, options) {\r\n Widget.fn.init.call(this, element, options);\r\n\r\n this._list();\r\n\r\n this._lastSender = null;\r\n\r\n this.typingParticipants = [];\r\n\r\n this._attachEvents();\r\n\r\n this._scrollable();\r\n },\r\n\r\n events: [\r\n ],\r\n\r\n options: {\r\n messages: {\r\n isTyping: \" is typing.\",\r\n areTyping: \" are typing.\",\r\n and: \" and \"\r\n }\r\n },\r\n\r\n destroy: function() {\r\n Widget.fn.destroy.call(this);\r\n\r\n if (this._scrollDraggable) {\r\n this._scrollDraggable.destroy();\r\n }\r\n\r\n this.element.empty();\r\n this.element.off(NS);\r\n\r\n this.list = null;\r\n this._lastSender = null;\r\n },\r\n\r\n _list: function() {\r\n var viewStyles = ChatView.styles;\r\n\r\n this.element\r\n .addClass(viewStyles.messageList)\r\n .attr(\"role\", \"log\")\r\n .attr(\"aria-label\", this.options.messages.messageListLabel);\r\n\r\n this.list = $(\"
    \")\r\n .addClass(viewStyles.messageListContent)\r\n .appendTo(this.element);\r\n },\r\n\r\n _attachEvents: function() {\r\n var styles = ChatView.styles;\r\n\r\n this.element\r\n .on(\"click\" + NS, this._listClick.bind(this))\r\n .on(\"click\" + NS, DOT + styles.message, this._messageClick.bind(this))\r\n .on(\"click\" + NS, DOT + styles.suggestedAction, this._suggestedActionClick.bind(this))\r\n .on(\"click\" + NS, DOT + styles.cardAction + SPACE + DOT + styles.button, this._cardActionClick.bind(this));\r\n\r\n this.element.on(\"keydown\" + NS, DOT + styles.suggestedAction, this._suggestedActionKeydown.bind(this));\r\n },\r\n\r\n _scrollable: function() {\r\n var viewStyles = ChatView.styles;\r\n\r\n this.element\r\n .on(\"click\" + NS, DOT + viewStyles.cardDeckScrollWrap + SPACE + DOT + viewStyles.button, this._scrollButtonClick.bind(this));\r\n },\r\n\r\n _scrollButtonClick: function(e) {\r\n var viewStyles = ChatView.styles;\r\n var button = $(e.currentTarget);\r\n var scrollToLeft = button.find(`${DOT + viewStyles.buttonIcon}[class*=${viewStyles.scrollButtonIconLeft}]`).length !== 0;\r\n var scrollContainer = button.siblings(DOT + viewStyles.cardDeck);\r\n var lastCard = scrollContainer.find(DOT + viewStyles.card).last();\r\n var cardWidth = lastCard.outerWidth(true);\r\n\r\n if (scrollToLeft) {\r\n kendo.scrollLeft(scrollContainer, kendo.scrollLeft(scrollContainer) - cardWidth);\r\n } else {\r\n kendo.scrollLeft(scrollContainer, kendo.scrollLeft(scrollContainer) + cardWidth);\r\n }\r\n },\r\n\r\n getTemplate: function(templateName) {\r\n return kendo.chat.getTemplate(templateName);\r\n },\r\n\r\n getComponent: function(type) {\r\n return kendo.chat.getComponent(type);\r\n },\r\n\r\n renderMessage: function(message, sender) {\r\n if (!message.timestamp) {\r\n message.timestamp = new Date();\r\n }\r\n\r\n if (!message.text) {\r\n message.text = \"\";\r\n }\r\n\r\n var bubbleElement = this._renderTemplate(message.type, message);\r\n\r\n this._renderBubble(message.type, bubbleElement, sender);\r\n\r\n if (message.type == \"typing\") {\r\n if (this.typingParticipants.length > 0) {\r\n this._removeTypingParticipant(sender);\r\n }\r\n } else {\r\n this._lastSender = sender.id;\r\n }\r\n },\r\n\r\n renderSuggestedActions: function(suggestedActions) {\r\n this._removeSuggestedActions();\r\n\r\n var element = this._renderTemplate(\"suggestedAction\", { suggestedActions: suggestedActions });\r\n\r\n this.list.append(element);\r\n\r\n this._scrollToBottom();\r\n },\r\n\r\n renderAttachments: function(options) {\r\n var wrapper = this._renderAttachmentWrapper(options.attachmentLayout);\r\n var cardContainer = options.attachmentLayout === \"carousel\" ? wrapper.find(DOT + ChatView.styles.cardDeck) : wrapper;\r\n var attachments = options.attachments;\r\n\r\n if (!attachments.length) {\r\n return;\r\n }\r\n\r\n for (var i = 0; i < attachments.length; i++) {\r\n var cardElement = this._renderTemplate(attachments[i].contentType, attachments[i].content);\r\n\r\n cardContainer.append(cardElement);\r\n }\r\n\r\n this._removeSuggestedActions();\r\n this._removeTypingIndicator();\r\n\r\n this.list.append(wrapper);\r\n\r\n this._lastSender = null;\r\n },\r\n\r\n renderComponent: function(type) {\r\n var componentType = this.getComponent(type);\r\n var component = new componentType({}, this);\r\n\r\n this.list.append(component.element);\r\n\r\n this._scrollToBottom();\r\n },\r\n\r\n _renderAttachmentWrapper: function(layout) {\r\n var viewStyles = ChatView.styles;\r\n var wrapper = $(\"
    \");\r\n\r\n if (layout === \"carousel\") {\r\n wrapper.addClass(viewStyles.cardDeckScrollWrap);\r\n\r\n var buttonLeft = this._renderScrollButton(viewStyles.scrollButtonIconLeft);\r\n wrapper.append(buttonLeft);\r\n\r\n wrapper.append($(\"
    \").addClass(viewStyles.cardDeck));\r\n\r\n var buttonRight = this._renderScrollButton(viewStyles.scrollButtonIconRight);\r\n wrapper.append(buttonRight);\r\n } else {\r\n wrapper.addClass(viewStyles.cardList);\r\n }\r\n\r\n return wrapper;\r\n },\r\n\r\n _renderScrollButton: function(directionClass) {\r\n var viewStyles = ChatView.styles;\r\n\r\n return $(\"`;\r\n\r\n function button(options) {\r\n return options.template( {\r\n idx: options.idx,\r\n text: options.text,\r\n ns: kendo.ns,\r\n numeric: options.numeric,\r\n size: options.size,\r\n title: options.title || \"\",\r\n tabindex: options.navigatable ? 0 : -1,\r\n navigatable: options.navigatable\r\n });\r\n }\r\n\r\n function selectOption(template, idx, text, selected) {\r\n return template( {\r\n idx: idx,\r\n text: text || idx,\r\n selected: selected || false\r\n });\r\n }\r\n\r\n function icon(className, text, wrapClassName, id, size) {\r\n return iconTemplate({\r\n className: className,\r\n text: text,\r\n wrapClassName: wrapClassName || \"\",\r\n id: id || \"\",\r\n size: size\r\n });\r\n }\r\n\r\n function update(element, className, page, disabled) {\r\n element.find(`[class*=\"-i-${className}\"]`)\r\n .parent()\r\n .attr(kendo.attr(\"page\"), page)\r\n .attr(\"tabindex\", disabled ? -1 : 0)\r\n .attr(\"aria-disabled\", disabled)\r\n .toggleClass(\"k-disabled\", disabled);\r\n }\r\n\r\n function first(element, page) {\r\n update(element, FIRST, 1, page <= 1);\r\n }\r\n\r\n function prev(element, page) {\r\n update(element, PREV, Math.max(1, page - 1), page <= 1);\r\n }\r\n\r\n function next(element, page, totalPages) {\r\n update(element, NEXT, Math.min(totalPages, page + 1), page >= totalPages);\r\n }\r\n\r\n function last(element, page, totalPages) {\r\n update(element, LAST, totalPages, page >= totalPages);\r\n }\r\n\r\n var Pager = Widget.extend( {\r\n init: function(element, options) {\r\n var that = this, page, totalPages;\r\n var buttonSize = \"\";\r\n var dropDownClasses = \"\";\r\n\r\n Widget.fn.init.call(that, element, options);\r\n\r\n options = that.options;\r\n that._createDataSource(options);\r\n that.linkTemplate = kendo.template(that.options.linkTemplate);\r\n that.selectTemplate = kendo.template(that.options.selectTemplate);\r\n that.numericSelectItemTemplate = kendo.template(that.options.numericSelectItemTemplate);\r\n\r\n page = that.page();\r\n totalPages = that.totalPages();\r\n\r\n that._refreshHandler = that.refresh.bind(that);\r\n\r\n that.dataSource.bind(CHANGE, that._refreshHandler);\r\n that.downEvent = kendo.applyEventMap(MOUSEDOWN, kendo.guid());\r\n\r\n isRtl = kendo.support.isRtl(element);\r\n that._numericWrap = that.element.find(\".k-pager-numbers-wrap\");\r\n\r\n if (isRtl) {\r\n FIRST = LAST_CONST;\r\n LAST = FIRST_CONST;\r\n PREV = NEXT_CONST;\r\n NEXT = PREV_CONST;\r\n if (that._numericWrap.length) {\r\n that._numericWrap.empty();\r\n }\r\n } else {\r\n FIRST = FIRST_CONST;\r\n LAST = LAST_CONST;\r\n PREV = PREV_CONST;\r\n NEXT = NEXT_CONST;\r\n }\r\n\r\n if (options.size) {\r\n buttonSize = kendo.getValidCssClass(\"k-button-\", \"size\", options.size);\r\n dropDownClasses = \"k-rounded-md \" + kendo.getValidCssClass(\"k-picker-\", \"size\", options.size);\r\n }\r\n\r\n if (options.navigatable) {\r\n that._id = that.element.attr(\"id\") || kendo.guid();\r\n }\r\n that._template();\r\n\r\n if (options.previousNext || options.numeric) {\r\n\r\n if (that._numericWrap.length === 0) {\r\n that._numericWrap = $(\"
    \").appendTo(that.element);\r\n }\r\n }\r\n\r\n\r\n if (options.previousNext) {\r\n if (!that._numericWrap.find(\"[class*='-i-\" + FIRST + \"']\").length) {\r\n that._numericWrap.append(icon(FIRST, options.messages.first, \"k-pager-first\", that._id, buttonSize));\r\n\r\n first(that._numericWrap, page, totalPages);\r\n }\r\n\r\n if (!that._numericWrap.find(\"[class*='-i-\" + PREV + \"']\").length) {\r\n that._numericWrap.append(icon(PREV, options.messages.previous, null, that._id, buttonSize));\r\n\r\n prev(that._numericWrap, page, totalPages);\r\n }\r\n }\r\n\r\n if (options.numeric) {\r\n if (!that._numericSelect) {\r\n that._numericSelect = that._numericWrap.find(\".k-dropdown\");\r\n\r\n if (that._numericSelect.length === 0) {\r\n that._numericSelect = $(\"' +\r\n encode(kendo.format(options.messages.of, totalPages)) +\r\n '');\r\n }\r\n\r\n that.element.on(KEYDOWN + NS, \".k-pager-input input\", that._keydown.bind(that));\r\n }\r\n\r\n if (options.previousNext) {\r\n if (!that._numericWrap.find(\"[class*='-i-\" + NEXT + \"']\").length) {\r\n that._numericWrap.append(icon(NEXT, options.messages.next, null, that._id, buttonSize));\r\n\r\n next(that._numericWrap, page, totalPages);\r\n }\r\n\r\n if (!that._numericWrap.find(\"[class*='-i-\" + LAST + \"']\").length) {\r\n that._numericWrap.append(icon(LAST, options.messages.last, \"k-pager-last\", that._id, buttonSize));\r\n\r\n last(that._numericWrap, page, totalPages);\r\n }\r\n }\r\n\r\n if (options.pageSizes) {\r\n if (!that.element.find(\".k-pager-sizes\").length) {\r\n var pageSizes = options.pageSizes.length ? options.pageSizes : [\"all\", 5, 10, 20];\r\n var pageItems = $.map(pageSizes, function(size) {\r\n if (size.toLowerCase && size.toLowerCase() === \"all\") {\r\n return \"\";\r\n }\r\n\r\n return \"\";\r\n });\r\n\r\n $('' + encode(options.messages.itemsPerPage) + \"\")\r\n .appendTo(that.element)\r\n .find(\"select\").html(pageItems.join(\"\")).end()\r\n .appendTo(that.element);\r\n }\r\n\r\n that.element.find(\".k-pager-sizes select\").val(that.pageSize());\r\n\r\n if (kendo.ui.DropDownList) {\r\n that.element.find(\".k-pager-sizes select\").show().attr(\"aria-label\", options.messages.pageSizeDropDownLabel).kendoDropDownList({ size: options.size });\r\n }\r\n\r\n that.element.on(CHANGE + NS, \".k-pager-sizes select\", that._change.bind(that));\r\n }\r\n\r\n if (options.refresh) {\r\n if (!that.element.find(\".k-pager-refresh\").length) {\r\n that.element.append('');\r\n }\r\n\r\n that.element.on(CLICK + NS, \".k-pager-refresh\", that._refreshClick.bind(that));\r\n }\r\n\r\n if (options.info) {\r\n if (!that.element.find(\".k-pager-info\").length) {\r\n that.element.append('');\r\n }\r\n }\r\n\r\n that.element\r\n .on(CLICK + NS , \"button\", that._click.bind(that))\r\n .on(CHANGE + NS , \"select.k-dropdown\", that._numericSelectChange.bind(that))\r\n .addClass(\"k-pager\");\r\n\r\n if (options.size) {\r\n that.element.addClass(kendo.getValidCssClass(\"k-pager-\", \"size\", options.size));\r\n }\r\n\r\n if (options.autoBind) {\r\n that.refresh();\r\n }\r\n\r\n that._resizeHandler = that.resize.bind(that, true);\r\n $(window).on(\"resize\" + NS, that._resizeHandler);\r\n\r\n that._navigatable();\r\n that._responsive();\r\n\r\n kendo.notify(that);\r\n },\r\n\r\n destroy: function() {\r\n var that = this;\r\n\r\n Widget.fn.destroy.call(that);\r\n\r\n that.element.off(NS);\r\n that.dataSource.unbind(CHANGE, that._refreshHandler);\r\n that._refreshHandler = null;\r\n $(window).off(\"resize\" + NS, this._resizeHandler);\r\n\r\n kendo.destroy(that.element);\r\n that.element = that.list = null;\r\n },\r\n\r\n events: [\r\n CHANGE\r\n ],\r\n\r\n options: {\r\n name: \"Pager\",\r\n ARIATemplate: ({ page, totalPages }) => `Page navigation, page ${page} of ${totalPages}`,\r\n selectTemplate: ({ text, title, tabindex, size }) => ``,\r\n linkTemplate: ({ ns, idx, text, title, tabindex, size }) => ``,\r\n numericSelectItemTemplate: ({ idx, selected, text }) => ``,\r\n buttonCount: 10,\r\n autoBind: true,\r\n numeric: true,\r\n info: true,\r\n input: false,\r\n previousNext: true,\r\n pageSizes: false,\r\n refresh: false,\r\n responsive: true,\r\n navigatable: false,\r\n size: \"medium\",\r\n messages: {\r\n allPages: \"All\",\r\n display: \"{0} - {1} of {2} items\",\r\n empty: \"No items to display\",\r\n page: \"Page\",\r\n of: \"of {0}\",\r\n itemsPerPage: \"items per page\",\r\n pageButtonLabel: \"Page {0}\",\r\n pageSizeDropDownLabel: \"Page sizes drop down\",\r\n numbersSelectLabel: \"Page select\",\r\n first: \"Go to the first page\",\r\n previous: \"Go to the previous page\",\r\n next: \"Go to the next page\",\r\n last: \"Go to the last page\",\r\n refresh: \"Refresh\",\r\n morePages: \"More pages\"\r\n }\r\n },\r\n\r\n setDataSource: function(dataSource) {\r\n var that = this;\r\n\r\n that.dataSource.unbind(CHANGE, that._refreshHandler);\r\n that.dataSource = that.options.dataSource = dataSource;\r\n dataSource.bind(CHANGE, that._refreshHandler);\r\n\r\n if (that.options.autoBind) {\r\n dataSource.fetch();\r\n }\r\n },\r\n\r\n _aria: function() {\r\n this.element.attr({\r\n \"role\": \"application\",\r\n \"aria-roledescription\": \"pager\",\r\n \"aria-keyshortcuts\": \"Enter ArrowRight ArrowLeft\"\r\n });\r\n },\r\n\r\n _adaptiveStep: function(step, hide, availableWidth) {\r\n var that = this;\r\n switch (step) {\r\n case 0:\r\n return that._toggleButtons(hide, availableWidth);\r\n case 1:\r\n return that._toggleRefresh(hide, availableWidth);\r\n case 2:\r\n return that._togglePagerInfo(hide, availableWidth);\r\n case 3:\r\n return that._toggleInputSizesLabel(hide, availableWidth);\r\n case 4:\r\n return that._togglePageSizesLabel(hide, availableWidth);\r\n case 5:\r\n return that._togglePageSizesDropDown(hide, availableWidth);\r\n case 6:\r\n return that._togglePageInputs(hide, availableWidth);\r\n default:\r\n break;\r\n }\r\n },\r\n\r\n _calculateNeededWidth: function() {\r\n var sumWidth = 0;\r\n var gap = parseInt(this.element.css(\"gap\"));\r\n this.element.children().each(function() {\r\n const element = $(this);\r\n const pagerInfo = element.hasClass(\"k-pager-info\");\r\n if (pagerInfo) {\r\n element.removeClass(\"k-pager-info k-label\");\r\n }\r\n sumWidth += element.is(\":visible\") ? element.width() : 0;\r\n sumWidth += gap;\r\n if (pagerInfo) {\r\n element.addClass(\"k-pager-info k-label\");\r\n }\r\n });\r\n return sumWidth;\r\n },\r\n\r\n _resize: function(size) {\r\n var that = this;\r\n that._responsive(size);\r\n if (!that.element.is(\":visible\") || !that._lastWidth || !that.options.responsive) {\r\n return;\r\n }\r\n\r\n if (that._lastWidth < size.width) {\r\n for (let i = 6; i >= 0; i--) {\r\n const availableWidth = that._calculateNeededWidth();\r\n if (size.width < availableWidth) {\r\n break;\r\n }\r\n const shouldBreak = that._adaptiveStep(i, false, size.width - availableWidth);\r\n if (shouldBreak) {\r\n break;\r\n }\r\n }\r\n } else if (that._lastWidth > size.width) {\r\n for (let i = 0; i < 7; i++) {\r\n if (size.width > that._calculateNeededWidth()) {\r\n break;\r\n }\r\n that._adaptiveStep(i, true);\r\n }\r\n }\r\n\r\n that._lastWidth = size.width;\r\n },\r\n\r\n _toggleButtons: function(hide, availableWidth) {\r\n if (!this._numericWrap || !this.list || !this._numericSelect) {\r\n return;\r\n }\r\n\r\n if (hide) {\r\n this._numericSelect.show();\r\n this.list.hide();\r\n } else if (availableWidth && ((this.list.width() - this._numericSelect.width()) < availableWidth)) {\r\n this._numericSelect.hide();\r\n this.list.show();\r\n }\r\n },\r\n\r\n _toggleRefresh: function(hide, availableWidth) {\r\n if (!this.options.refresh) {\r\n return;\r\n }\r\n const refreshContainer = this.element.find(\".k-pager-refresh\");\r\n\r\n if (hide) {\r\n refreshContainer.hide();\r\n } else if (availableWidth && (refreshContainer.width() < availableWidth)) {\r\n refreshContainer.show();\r\n } else {\r\n return true;\r\n }\r\n },\r\n\r\n _togglePagerInfo: function(hide, availableWidth) {\r\n if (!this.options.info) {\r\n return;\r\n }\r\n const infoBox = this.element.find(\".k-pager-info\");\r\n if (hide) {\r\n infoBox.show();\r\n } else if (availableWidth && (infoBox.width() < availableWidth)) {\r\n infoBox.show();\r\n } else if (!infoBox.is(\":visible\")) {\r\n return true;\r\n }\r\n },\r\n\r\n _toggleInputSizesLabel: function(hide, availableWidth) {\r\n if (!this.options.input) {\r\n return;\r\n }\r\n const inputElements = this.element.find(\".k-pager-input\").children();\r\n const labels = inputElements.eq(0).add(inputElements.eq(2));\r\n\r\n if (hide) {\r\n labels.hide();\r\n } else if (availableWidth && ((inputElements.eq(0).width() + inputElements.eq(2).width()) < availableWidth)) {\r\n labels.show();\r\n } else {\r\n return true;\r\n }\r\n },\r\n\r\n\r\n _togglePageSizesLabel: function(hide, availableWidth) {\r\n if (!this.options.pageSizes) {\r\n return;\r\n }\r\n const label = this.element.find(\".k-pager-sizes\").children().eq(1);\r\n\r\n if (hide) {\r\n label.hide();\r\n } else if (availableWidth && (label.width() < availableWidth)) {\r\n label.show();\r\n } else {\r\n return true;\r\n }\r\n },\r\n\r\n _togglePageSizesDropDown: function(hide, availableWidth) {\r\n if (!this.options.pageSizes) {\r\n return;\r\n }\r\n\r\n const picker = this.element.find(\".k-pager-sizes .k-picker\");\r\n\r\n if (hide) {\r\n picker.hide();\r\n } else if (availableWidth && (picker.width() < availableWidth)) {\r\n picker.show();\r\n } else {\r\n return true;\r\n }\r\n },\r\n\r\n\r\n _togglePageInputs: function(hide, availableWidth) {\r\n var options = this.options;\r\n\r\n if (!options.input || !this._numericSelect) {\r\n return;\r\n }\r\n\r\n if (hide) {\r\n this._numericSelect.hide();\r\n } else if (availableWidth && (this._numericSelect.width() < availableWidth) && !this.list.is(\":visible\")) {\r\n this._numericSelect.show();\r\n } else {\r\n return true;\r\n }\r\n },\r\n\r\n _createDataSource: function(options) {\r\n this.dataSource = kendo.data.DataSource.create(options.dataSource);\r\n },\r\n\r\n _responsive: function(size) {\r\n var that = this;\r\n var options = that.options;\r\n var width;\r\n var info;\r\n\r\n if (options.responsive) {\r\n \r\n } else if (that._numericSelect) {\r\n that._numericSelect.hide();\r\n }\r\n },\r\n\r\n refresh: function(e) {\r\n var that = this,\r\n idx,\r\n end,\r\n start = 1,\r\n reminder,\r\n page = that.page(),\r\n html = \"\",\r\n selectHtml = \"\",\r\n options = that.options,\r\n pageSize = that.pageSize(),\r\n collapsedTotal = that._collapsedTotal(),\r\n total = that.dataSource._isGroupPaged() ? that.dataSource.groupsTotal(true) : that.dataSource.total(),\r\n totalPages = that.totalPages(),\r\n linkTemplate = that.linkTemplate,\r\n navigatable = options.navigatable,\r\n numericSelectItemTemplate = that.numericSelectItemTemplate,\r\n buttonSize = options.size ? kendo.getValidCssClass(\"k-button-\", \"size\", options.size) : \"\",\r\n buttonCount = options.buttonCount;\r\n\r\n if (e && e.action == \"itemchange\") {\r\n return;\r\n }\r\n\r\n if (options.numeric) {\r\n\r\n if (page > buttonCount) {\r\n reminder = (page % buttonCount);\r\n start = (reminder === 0) ? (page - buttonCount) + 1 : (page - reminder) + 1;\r\n }\r\n\r\n end = Math.min((start + buttonCount) - 1, totalPages);\r\n\r\n if (start > 1) {\r\n html += button({\r\n template: linkTemplate,\r\n navigatable: navigatable,\r\n size: buttonSize,\r\n idx: start - 1,\r\n text: \"...\",\r\n numeric: false,\r\n title: options.messages.morePages\r\n });\r\n selectHtml += selectOption(numericSelectItemTemplate, start - 1, options.messages.morePages);\r\n }\r\n\r\n for (idx = start; idx <= end; idx++) {\r\n html += button({\r\n template: idx == page ? that.selectTemplate : linkTemplate,\r\n navigatable: navigatable,\r\n idx: idx,\r\n text: idx,\r\n size: buttonSize,\r\n numeric: true,\r\n title: kendo.format(options.messages.pageButtonLabel, idx)\r\n });\r\n selectHtml += selectOption(numericSelectItemTemplate, idx, idx, idx == page);\r\n }\r\n\r\n if (end < totalPages) {\r\n html += button({\r\n template: linkTemplate,\r\n navigatable: navigatable,\r\n idx: idx,\r\n size: buttonSize,\r\n text: \"...\",\r\n numeric: numericSelectItemTemplate,\r\n title: options.messages.morePages\r\n });\r\n selectHtml += selectOption(numericSelectItemTemplate, idx, options.messages.morePages);\r\n }\r\n\r\n if (html === \"\") {\r\n html = that.selectTemplate({ text: 0, size: buttonSize, tabindex: navigatable ? 0 : -1, navigatable: navigatable, title: kendo.format(options.messages.pageButtonLabel, 0) });\r\n selectHtml = $(\"
  • \";\r\n var colGroup = \"\";\r\n var row = \"\";\r\n\r\n for (var idx = 0; idx < this.options.columns.length; idx++) {\r\n var currentColumn = this.options.columns[idx];\r\n var title = currentColumn.title || currentColumn.field || \"\";\r\n var titleFunc = () => title;\r\n var template = currentColumn.headerTemplate || titleFunc;\r\n var columnsHeaderTemplate = typeof template !== \"function\" ? kendo.template(template) : template;\r\n var currentWidth = currentColumn.width;\r\n var currentWidthInt = parseInt(currentWidth, 10);\r\n var widthStyle = '';\r\n\r\n if (currentWidth && !isNaN(currentWidthInt)) {\r\n widthStyle += `${kendo.attr('style-width')}=\"${currentWidthInt}${percentageUnitsRegex.test(currentWidth) ? \"%\" : \"px\"}\"`;\r\n }\r\n\r\n colGroup += \"\";\r\n\r\n row += \"\";\r\n }\r\n\r\n colGroup += \"\";\r\n row += \"\";\r\n header += colGroup;\r\n header += \"\";\r\n header += row;\r\n header += \"

    \";\r\n\r\n $header = $(header);\r\n kendo.applyStylesFromKendoAttributes($header, [\"width\"]);\r\n\r\n list.columnsHeader = columnsHeader = $header;\r\n list.list.prepend(columnsHeader);\r\n },\r\n\r\n _noData: function() {\r\n var list = this;\r\n var noData = $(list.noData);\r\n var template = list.options.noDataTemplate === true ? () => htmlEncode(list.options.messages.noData) : list.options.noDataTemplate;\r\n\r\n kendo.destroy(noData);\r\n noData.remove();\r\n\r\n if (!template) {\r\n list.noData = null;\r\n return;\r\n }\r\n\r\n list.noData = $(NO_DATA_EL).hide().appendTo(list.list);\r\n list.noDataTemplate = typeof template !== \"function\" ? kendo.template(template) : template;\r\n },\r\n\r\n _footer: function() {\r\n var list = this;\r\n var footer = $(list.footer);\r\n var template = list.options.footerTemplate;\r\n var footerEl = this.options.columns && this.options.columns.length ? TABLE_FOOTER_EL : LIST_FOOTER_EL;\r\n\r\n kendo.destroy(footer);\r\n footer.remove();\r\n\r\n if (!template) {\r\n list.footer = null;\r\n return;\r\n }\r\n\r\n list.footer = $(footerEl).appendTo(list.list);\r\n list.footerTemplate = typeof template !== \"function\" ? kendo.template(template) : template;\r\n },\r\n\r\n _listOptions: function(options) {\r\n var that = this;\r\n var currentOptions = that.options;\r\n var virtual = currentOptions.virtual;\r\n var changeEventOption = { change: that._listChange.bind(that) };\r\n var listBoundHandler = that._listBound.bind(that);\r\n var focusedElm = that._focused;\r\n var inputId = that.element.attr(\"id\");\r\n var labelElm = $(\"label[for=\\\"\" + that.element.attr(\"id\") + \"\\\"]\");\r\n var labelledBy = focusedElm.attr(ARIA_LABELLEDBY);\r\n\r\n if (!labelledBy && labelElm.length) {\r\n labelledBy = labelElm.attr(\"id\") || that._generateLabelId(labelElm, inputId || kendo.guid());\r\n }\r\n\r\n virtual = typeof virtual === \"object\" ? virtual : {};\r\n\r\n options = $.extend({\r\n autoBind: false,\r\n selectable: true,\r\n dataSource: that.dataSource,\r\n click: that._click.bind(that),\r\n activate: that._activateItem.bind(that),\r\n columns: currentOptions.columns,\r\n deactivate: that._deactivateItem.bind(that),\r\n dataBinding: function() {\r\n that.trigger(DATA_BINDING);\r\n },\r\n dataBound: listBoundHandler,\r\n height: currentOptions.height,\r\n dataValueField: currentOptions.dataValueField,\r\n dataTextField: currentOptions.dataTextField,\r\n groupTemplate: currentOptions.groupTemplate,\r\n fixedGroupTemplate: currentOptions.fixedGroupTemplate,\r\n template: currentOptions.template,\r\n ariaLabel: focusedElm.attr(ARIA_LABEL),\r\n ariaLabelledBy: labelledBy,\r\n listSize: that._listSize\r\n }, options, virtual, changeEventOption);\r\n\r\n if (!options.template) {\r\n options.template = (data) => htmlEncode(kendo.getter(options.dataTextField)(data));\r\n }\r\n\r\n return options;\r\n },\r\n\r\n _initList: function(opts) {\r\n var that = this;\r\n var skipValueUpdate = opts && opts.skipValueUpdate;\r\n var listOptions = that._listOptions({\r\n selectedItemChange: that._listChange.bind(that)\r\n });\r\n\r\n if (!that.options.virtual) {\r\n that.listView = new kendo.ui.StaticList(that.ul, listOptions);\r\n } else {\r\n that.listView = new kendo.ui.VirtualList(that.ul, Object.assign(listOptions, {\r\n height: that._hasActionSheet() ? 362 : that.options.height, // Hardcoded virtual list height for action sheet untill better solution is found\r\n }));\r\n that.list.addClass(\"k-virtual-list\");\r\n }\r\n\r\n that.listView.bind(\"listBound\", that._listBound.bind(that));\r\n\r\n if (!skipValueUpdate) {\r\n that._setListValue();\r\n }\r\n },\r\n\r\n _setListValue: function(value) {\r\n value = value || this.options.value;\r\n\r\n if (value !== undefined$1) {\r\n this.listView.value(value)\r\n .done(this._updateSelectionState.bind(this));\r\n }\r\n },\r\n\r\n _updateSelectionState: $.noop,\r\n\r\n _listMousedown: function(e) {\r\n if (!this.filterInput || this.filterInput[0] !== e.target) {\r\n e.preventDefault();\r\n }\r\n },\r\n\r\n _isFilterEnabled: function() {\r\n var filter = this.options.filter;\r\n return filter && filter !== \"none\";\r\n },\r\n\r\n _hideClear: function() {\r\n var list = this;\r\n\r\n if (list._clear) {\r\n list._clear.addClass(HIDDENCLASS);\r\n }\r\n },\r\n\r\n _showClear: function() {\r\n if (this._clear) {\r\n this._clear.removeClass(HIDDENCLASS);\r\n }\r\n },\r\n\r\n _clearValue: function() {\r\n this._clearText();\r\n this._accessor(\"\");\r\n this.listView.value([]);\r\n\r\n if (this._isSelect) {\r\n this._customOption = undefined$1;\r\n }\r\n\r\n if (this._isFilterEnabled() && !this.options.enforceMinLength) {\r\n this._filter({ word: \"\", open: false });\r\n\r\n if (this.options.highlightFirst) {\r\n this.listView.focus(0);\r\n }\r\n }\r\n this._change();\r\n },\r\n\r\n _clearText: function() {\r\n this.text(\"\");\r\n },\r\n\r\n _clearFilter: function() {\r\n if (!this.options.virtual) {\r\n this.listView.bound(false);\r\n }\r\n\r\n this._filterSource();\r\n },\r\n\r\n _filterSource: function(filter, force) {\r\n var that = this;\r\n var options = that.options;\r\n var isMultiColumnFiltering = options.filterFields && filter && filter.logic && filter.filters && filter.filters.length;\r\n var dataSource = that.dataSource;\r\n var expression = extend({}, dataSource.filter() || {});\r\n var resetPageSettings = filter || (expression.filters && expression.filters.length && !filter);\r\n\r\n var removed = removeFiltersForField(expression, options.dataTextField);\r\n\r\n this._clearFilterExpressions(expression);\r\n\r\n if ((filter || removed) && that.trigger(\"filtering\", { filter: filter })) {\r\n return $.Deferred().reject().promise();\r\n }\r\n\r\n var newExpression = {\r\n filters: [],\r\n logic: \"and\"\r\n };\r\n\r\n if (isMultiColumnFiltering) {\r\n newExpression.filters.push(filter);\r\n } else {\r\n this._pushFilterExpression(newExpression, filter);\r\n }\r\n\r\n if (isValidFilterExpr(expression)) {\r\n if (newExpression.logic === expression.logic) {\r\n newExpression.filters = newExpression.filters.concat(expression.filters);\r\n } else {\r\n newExpression.filters.push(expression);\r\n }\r\n }\r\n\r\n if (that._cascading) {\r\n this.listView.setDSFilter(newExpression);\r\n }\r\n\r\n var dataSourceState = extend({}, {\r\n page: resetPageSettings ? 1 : dataSource.page(),\r\n pageSize: resetPageSettings ? dataSource.options.pageSize : dataSource.pageSize(),\r\n sort: dataSource.sort(),\r\n filter: dataSource.filter(),\r\n group: dataSource.group(),\r\n aggregate: dataSource.aggregate()\r\n }, { filter: newExpression });\r\n\r\n return dataSource[force ? \"read\" : \"query\"](dataSource._mergeState(dataSourceState));\r\n },\r\n\r\n _pushFilterExpression: function(newExpression, filter) {\r\n if (isValidFilterExpr(filter) && filter.value !== \"\") {\r\n newExpression.filters.push(filter);\r\n }\r\n },\r\n\r\n _clearFilterExpressions: function(expression) {\r\n if (!expression.filters) {\r\n return;\r\n }\r\n\r\n var filtersToRemove;\r\n\r\n for (var i = 0; i < expression.filters.length; i++) {\r\n if (\"fromFilter\" in expression.filters[i]) {\r\n filtersToRemove = i;\r\n }\r\n }\r\n\r\n if (!isNaN(filtersToRemove)) {\r\n expression.filters.splice(filtersToRemove, 1);\r\n }\r\n },\r\n\r\n _renderNoData: function() {\r\n var list = this;\r\n var noData = list.noData;\r\n\r\n if (!noData) {\r\n return;\r\n }\r\n\r\n noData.html(list.noDataTemplate({ instance: list }));\r\n },\r\n\r\n _toggleNoData: function(show) {\r\n $(this.noData).toggle(show);\r\n },\r\n\r\n _toggleHeader: function(show) {\r\n var groupHeader = this.listView.content.prev(FIXED_GROUP_HEADER);\r\n groupHeader.toggle(show);\r\n },\r\n\r\n _renderFooter: function() {\r\n var list = this,\r\n footer = list.footer ? this.options.columns && this.options.columns.length ? list.footer.children().first() : list.footer : null;\r\n\r\n if (!footer) {\r\n return;\r\n }\r\n\r\n footer.html(list.footerTemplate({ instance: list }));\r\n },\r\n\r\n _allowOpening: function() {\r\n return this.options.noDataTemplate || this.dataSource.flatView().length;\r\n },\r\n\r\n _initValue: function() {\r\n var that = this,\r\n value = that.options.value;\r\n\r\n if (value !== null) {\r\n that.element.val(value);\r\n } else {\r\n value = that._accessor();\r\n that.options.value = value;\r\n }\r\n\r\n that._old = value;\r\n },\r\n\r\n _ignoreCase: function() {\r\n var that = this,\r\n model = that.dataSource.reader.model,\r\n field;\r\n\r\n if (model && model.fields) {\r\n field = model.fields[that.options.dataTextField];\r\n\r\n if (field && field.type && field.type !== \"string\") {\r\n that.options.ignoreCase = false;\r\n }\r\n }\r\n },\r\n\r\n _focus: function(candidate) {\r\n return this.listView.focus(candidate);\r\n },\r\n\r\n _filter: function(options) {\r\n var that = this;\r\n var widgetOptions = that.options;\r\n var word = options.word;\r\n var filterFields = widgetOptions.filterFields;\r\n var field = widgetOptions.dataTextField;\r\n var expression;\r\n\r\n if (filterFields && filterFields.length) {\r\n expression = {\r\n logic: \"or\",\r\n filters: [],\r\n fromFilter: true\r\n };\r\n for (var i = 0; i < filterFields.length; i++) {\r\n this._pushFilterExpression(expression, that._buildExpression(word, filterFields[i]));\r\n }\r\n } else {\r\n expression = that._buildExpression(word, field);\r\n }\r\n\r\n that._open = options.open;\r\n that._filterSource(expression);\r\n },\r\n\r\n _buildExpression: function(value, field) {\r\n var that = this;\r\n var widgetOptions = that.options;\r\n var ignoreCase = widgetOptions.ignoreCase;\r\n var accentFoldingFiltering = that.dataSource.options.accentFoldingFiltering;\r\n\r\n return {\r\n value: ignoreCase ? (accentFoldingFiltering ? value.toLocaleLowerCase(accentFoldingFiltering) : value.toLowerCase()) : value,\r\n field: field,\r\n operator: widgetOptions.filter,\r\n ignoreCase: ignoreCase\r\n };\r\n },\r\n\r\n _clearButton: function() {\r\n var list = this;\r\n var clearTitle = list.options.messages.clear;\r\n\r\n if (!list._clear) {\r\n list._clear = $(`${kendo.ui.icon(\"x\")}`).attr({\r\n \"role\": \"button\",\r\n \"tabIndex\": -1\r\n });\r\n }\r\n\r\n if (!list.options.clearButton) {\r\n list._clear.remove();\r\n }\r\n this._hideClear();\r\n },\r\n\r\n search: function(word) {\r\n var options = this.options;\r\n\r\n word = typeof word === \"string\" ? word : this._inputValue();\r\n\r\n clearTimeout(this._typingTimeout);\r\n\r\n if ((!options.enforceMinLength && !word.length) || word.length >= options.minLength) {\r\n this._state = \"filter\";\r\n if (this.listView) {\r\n this.listView._emptySearch = !kendo.trim(word).length;\r\n }\r\n\r\n if (!this._isFilterEnabled()) {\r\n this._searchByWord(word);\r\n } else {\r\n this._filter({ word: word, open: true });\r\n }\r\n }\r\n },\r\n\r\n current: function(candidate) {\r\n return this._focus(candidate);\r\n },\r\n\r\n items: function() {\r\n return this.ul[0].children;\r\n },\r\n\r\n destroy: function() {\r\n var that = this;\r\n var ns = that.ns;\r\n\r\n Widget.fn.destroy.call(that);\r\n\r\n that._unbindDataSource();\r\n\r\n if (that.largeMQL || that.mediumMQL || that.smallMQL) {\r\n that.largeMQL.destroy();\r\n that.mediumMQL.destroy();\r\n that.smallMQL.destroy();\r\n }\r\n\r\n that.listView.destroy();\r\n that.list.off(ns);\r\n\r\n that.popup.destroy();\r\n\r\n if (that._form) {\r\n that._form.off(\"reset\", that._resetHandler);\r\n }\r\n\r\n if (that.label) {\r\n that.label.destroy();\r\n }\r\n },\r\n\r\n dataItem: function(index) {\r\n var that = this;\r\n\r\n if (index === undefined$1) {\r\n return that.listView.selectedDataItems()[0];\r\n }\r\n\r\n if (typeof index !== \"number\") {\r\n if (that.options.virtual) {\r\n return that.dataSource.getByUid($(index).data(\"uid\"));\r\n }\r\n\r\n index = $(that.items()).index(index);\r\n }\r\n\r\n return that.dataSource.flatView()[index];\r\n },\r\n\r\n _activateItem: function() {\r\n var current = this.listView.focus();\r\n if (current && this.popup.visible()) {\r\n this._focused.add(this.filterInput).attr(ARIA_ACTIVEDESCENDANT, current.attr(\"id\"));\r\n }\r\n },\r\n\r\n _deactivateItem: function() {\r\n this._focused.add(this.filterInput).removeAttr(ARIA_ACTIVEDESCENDANT);\r\n },\r\n\r\n _accessors: function() {\r\n var that = this;\r\n var element = that.element;\r\n var options = that.options;\r\n var getter = kendo.getter;\r\n var textField = element.attr(kendo.attr(\"text-field\"));\r\n var valueField = element.attr(kendo.attr(\"value-field\"));\r\n\r\n if (!options.dataTextField && textField) {\r\n options.dataTextField = textField;\r\n }\r\n\r\n if (!options.dataValueField && valueField) {\r\n options.dataValueField = valueField;\r\n }\r\n\r\n that._text = getter(options.dataTextField);\r\n that._value = getter(options.dataValueField);\r\n },\r\n\r\n _aria: function(id) {\r\n var that = this,\r\n options = that.options,\r\n element = that._focused,\r\n autocomplete;\r\n\r\n if (options.suggest !== undefined$1) {\r\n if (options.filter === \"none\") {\r\n if (options.suggest === true) {\r\n autocomplete = \"inline\";\r\n } else {\r\n autocomplete = \"none\";\r\n }\r\n } else {\r\n if (options.suggest === true) {\r\n autocomplete = \"both\";\r\n } else {\r\n autocomplete = \"list\";\r\n }\r\n }\r\n\r\n element.attr(ARIA_AUTOCOMPLETE, autocomplete);\r\n }\r\n\r\n id = id ? id + \" \" + that.ul[0].id : that.ul[0].id;\r\n\r\n element.attr({\r\n \"aria-controls\": id\r\n });\r\n\r\n if (that.filterInput && that.filterInput.length > 0) {\r\n that.filterInput.attr(ARIA_CONTROLS, id);\r\n }\r\n\r\n that.ul.attr(ARIA_LIVE, !that._isFilterEnabled() ? \"off\" : \"polite\");\r\n\r\n that._ariaLabel(that._focused);\r\n },\r\n\r\n _blur: function() {\r\n var that = this;\r\n\r\n that._change();\r\n that.close();\r\n that._userTriggered = false;\r\n },\r\n\r\n _isValueChanged: function(value) {\r\n return value !== unifyType(this._old, typeof value);\r\n },\r\n\r\n _change: function() {\r\n var that = this;\r\n var index = that.selectedIndex;\r\n var optionValue = that.options.value;\r\n var value = that.value();\r\n var trigger;\r\n\r\n if (that._isSelect && !that.listView.bound() && optionValue) {\r\n value = optionValue;\r\n }\r\n\r\n if (that._isValueChanged(value)) {\r\n trigger = true;\r\n } else if (that._valueBeforeCascade !== undefined$1 && that._valueBeforeCascade !== unifyType(that._old, typeof that._valueBeforeCascade) && that._userTriggered) {\r\n trigger = true;\r\n } else if (index !== undefined$1 && index !== that._oldIndex && !that.listView.isFiltered()) {\r\n trigger = true;\r\n }\r\n\r\n if (trigger) {\r\n\r\n if (that._old === null || that._old === \"\" || value === \"\") {\r\n that._valueBeforeCascade = that._old = value;\r\n } else {\r\n if (that.dataItem()) {\r\n that._valueBeforeCascade = that._old = that.options.dataValueField ? that.dataItem()[that.options.dataValueField] : that.dataItem();\r\n } else {\r\n that._valueBeforeCascade = that._old = null;\r\n }\r\n }\r\n that._oldIndex = index;\r\n\r\n if (!that._typing) {\r\n // trigger the DOM change event so any subscriber gets notified\r\n that.element.trigger(CHANGE);\r\n }\r\n\r\n that.trigger(CHANGE);\r\n }\r\n\r\n that.typing = false;\r\n },\r\n\r\n _data: function() {\r\n return this.dataSource.view();\r\n },\r\n\r\n _enable: function() {\r\n var that = this,\r\n options = that.options,\r\n disabled = that.element.is(\"[disabled]\");\r\n\r\n if (options.enable !== undefined$1) {\r\n options.enabled = options.enable;\r\n }\r\n\r\n if (!options.enabled || disabled) {\r\n that.enable(false);\r\n } else {\r\n that.readonly(that.element.is(\"[readonly]\"));\r\n }\r\n },\r\n\r\n _dataValue: function(dataItem) {\r\n var value = this._value(dataItem);\r\n\r\n if (value === undefined$1) {\r\n value = this._text(dataItem);\r\n }\r\n\r\n return value;\r\n },\r\n\r\n _offsetHeight: function() {\r\n var offsetHeight = 0;\r\n var siblings = this.listView.content.parent().prevAll(\":visible\");\r\n\r\n siblings.each(function() {\r\n var element = $(this);\r\n\r\n offsetHeight += outerHeight(element, true);\r\n });\r\n\r\n return offsetHeight;\r\n },\r\n\r\n _height: function(length) {\r\n var that = this;\r\n var list = that.list;\r\n var height = that.options.height;\r\n var visible = that.popup.visible();\r\n var isMccb = this.options.columns && this.options.columns.length;\r\n var offsetTop, popups;\r\n\r\n if (length || that.options.noDataTemplate) {\r\n // Check where animation container stays\r\n popups = list.parent().add(list.closest(\".k-animation-container\").add(list.closest(\".k-child-animation-container\"))).show();\r\n\r\n if (!list.parent().is(\":visible\")) {\r\n popups.hide();\r\n return;\r\n }\r\n\r\n height = that.listView.content[0].scrollHeight > height ? height : \"auto\";\r\n\r\n popups.height(height);\r\n\r\n if (height !== \"auto\") {\r\n offsetTop = that._offsetHeight();\r\n\r\n height = height - offsetTop;\r\n\r\n if (isMccb) {\r\n height = height - (outerHeight($(that.footer)) || 0) - (outerHeight($(that.columnsHeader)) || 0);\r\n }\r\n }\r\n\r\n if (isMccb) {\r\n that.listView.content.outerHeight(height);\r\n } else {\r\n that.listView.content.parent().outerHeight(height);\r\n }\r\n\r\n if (!visible) {\r\n list.parent().hide();\r\n }\r\n }\r\n\r\n return height;\r\n },\r\n\r\n _openHandler: function(e) {\r\n var current;\r\n\r\n this._adjustListWidth();\r\n\r\n if (this.trigger(OPEN)) {\r\n e.preventDefault();\r\n } else {\r\n this._focused.attr(ARIA_EXPANDED, true);\r\n this.ul.attr(ARIA_HIDDEN, false);\r\n\r\n current = this.listView.focus();\r\n if (current) {\r\n this._focused.add(this.filterInput).attr(ARIA_ACTIVEDESCENDANT, current.attr(\"id\"));\r\n }\r\n }\r\n },\r\n\r\n _adjustListWidth: function() {\r\n var that = this,\r\n list = that.list.parent(),\r\n width = list[0].style.width,\r\n wrapper = that.wrapper,\r\n computedStyle, computedWidth;\r\n\r\n if ((!list.data(WIDTH) && width) || that._hasActionSheet()) {\r\n return;\r\n }\r\n\r\n computedStyle = window.getComputedStyle ? window.getComputedStyle(wrapper[0], null) : 0;\r\n computedWidth = parseFloat(computedStyle && computedStyle.width) || outerWidth(wrapper);\r\n\r\n if (computedStyle && browser.msie) { // getComputedStyle returns different box in IE.\r\n computedWidth += parseFloat(computedStyle.paddingLeft) + parseFloat(computedStyle.paddingRight) + parseFloat(computedStyle.borderLeftWidth) + parseFloat(computedStyle.borderRightWidth);\r\n }\r\n\r\n if (list.css(\"box-sizing\") !== \"border-box\") {\r\n width = computedWidth - (outerWidth(list) - list.width());\r\n } else {\r\n width = computedWidth;\r\n }\r\n\r\n list.css({\r\n fontFamily: wrapper.css(\"font-family\"),\r\n width: that.options.autoWidth ? \"auto\" : width,\r\n minWidth: width,\r\n whiteSpace: that.options.autoWidth ? \"nowrap\" : \"normal\"\r\n })\r\n .data(WIDTH, width);\r\n\r\n return true;\r\n },\r\n\r\n _closeHandler: function(e) {\r\n if (e.closeButton) {\r\n this._onCloseButtonPressed();\r\n }\r\n\r\n\r\n if (this.trigger(CLOSE)) {\r\n e.preventDefault();\r\n } else {\r\n this._focused.attr(ARIA_EXPANDED, false);\r\n this.ul.attr(ARIA_HIDDEN, true);\r\n this._focused.add(this.filterInput).removeAttr(ARIA_ACTIVEDESCENDANT);\r\n }\r\n },\r\n\r\n _focusItem: function() {\r\n var listView = this.listView;\r\n var noFocusedItem = !listView.focus();\r\n var index = last(listView.select());\r\n\r\n if (index === undefined$1 && this.options.highlightFirst && noFocusedItem) {\r\n index = 0;\r\n }\r\n\r\n if (index !== undefined$1) {\r\n listView.focus(index);\r\n } else if (noFocusedItem) {\r\n listView.scrollToIndex(0);\r\n }\r\n },\r\n\r\n _calculateGroupPadding: function(height) {\r\n var li = this.ul.children(\".k-first\").first();\r\n var groupHeader = this.listView.content.prev(FIXED_GROUP_HEADER);\r\n var padding = 0;\r\n var direction = 'right';\r\n\r\n if (groupHeader[0] && groupHeader[0].style.display !== \"none\") {\r\n if (height !== \"auto\") {\r\n padding = kendo.support.scrollbar();\r\n }\r\n\r\n if (this.element.parents('.k-rtl').length) {\r\n direction = 'left';\r\n }\r\n\r\n padding += parseFloat(li.css(\"border-\" + direction + \"-width\"), 10) + parseFloat(li.children(GROUP_LABEL).css(\"padding-\" + direction), 10);\r\n groupHeader.css(\"padding-\" + direction, padding);\r\n }\r\n },\r\n\r\n _calculatePopupHeight: function(force) {\r\n var height = this._height(this.dataSource.flatView().length || force);\r\n this._calculateGroupPadding(height);\r\n this._calculateColumnsHeaderPadding(height);\r\n },\r\n\r\n _calculateColumnsHeaderPadding: function(height) {\r\n if (this.options.columns && this.options.columns.length) {\r\n var list = this;\r\n var isRtl = support.isRtl(list.wrapper);\r\n var scrollbar = kendo.support.scrollbar();\r\n\r\n list.columnsHeader.css((isRtl ? \"padding-left\" : \"padding-right\"), height !== \"auto\" ? scrollbar : 0);\r\n }\r\n },\r\n\r\n _refreshScroll: function() {\r\n var listView = this.listView;\r\n var enableYScroll = listView.element.height() > listView.content.height();\r\n\r\n if (this.options.autoWidth) {\r\n listView.content.css({\r\n overflowX: \"hidden\",\r\n overflowY: enableYScroll ? \"scroll\" : \"auto\"\r\n });\r\n }\r\n },\r\n\r\n _hasActionSheet: function() {\r\n return this.options.adaptiveMode === \"auto\" && (this.mediumMQL.mediaQueryList.matches\r\n || this.smallMQL.mediaQueryList.matches);\r\n },\r\n\r\n _resizePopup: function(force) {\r\n if (this.options.virtual\r\n || this._hasActionSheet()) {\r\n return;\r\n }\r\n\r\n if (!this.popup.element.is(\":visible\")) {\r\n this.popup.one(\"open\", (function(force) {\r\n return (function(e) {\r\n if (!e.isDefaultPrevented()) {\r\n this._calculatePopupHeight(force);\r\n }\r\n }).bind(this);\r\n }).call(this, force));\r\n\r\n this.popup.one(ACTIVATE, this._refreshScroll.bind(this));\r\n } else {\r\n this._calculatePopupHeight(force);\r\n }\r\n },\r\n\r\n _popup: function() {\r\n var list = this;\r\n\r\n list.list.wrap(\"
    \");\r\n\r\n if (list.options.adaptiveMode === \"auto\") {\r\n list.largeMQL.onEnter(list._createPopup.bind(list));\r\n list.mediumMQL.onEnter(list._createActionSheet.bind(list));\r\n list.smallMQL\r\n .onEnter(() => {\r\n if (!list.popup || !list.popup.fullscreen) {\r\n list._createActionSheet();\r\n }\r\n\r\n list.popup.fullscreen(true);\r\n });\r\n } else {\r\n list._createPopup();\r\n }\r\n },\r\n\r\n _addFilterHeader: function() {\r\n var list = this;\r\n\r\n if (list._isFilterEnabled()) {\r\n list._filterHeader();\r\n\r\n if (list.options.adaptiveMode === \"auto\" && (list.mediumMQL.mediaQueryList.matches || list.smallMQL.mediaQueryList.matches)) {\r\n list.popup.element\r\n .find(ACTIONSHEET_TITLEBAR)\r\n .append($(list.actionSheetFilterTemplate))\r\n .find(\".k-searchbox\")\r\n .append(list.filterInput);\r\n list._enable();\r\n } else if (list.options.popupFilter) {\r\n list.list\r\n .parent()\r\n .prepend($(list.filterTemplate))\r\n .find(\".k-searchbox\")\r\n .append(list.filterInput);\r\n }\r\n\r\n list._enable();\r\n }\r\n },\r\n\r\n _createPopup: function() {\r\n var list = this;\r\n\r\n if (list.popup) {\r\n list._cachedFilterValue = list.filterInput ? list.filterInput.val() : null;\r\n list.popup.destroy();\r\n list._removeFilterHeader();\r\n list._removeStaticHeader();\r\n }\r\n\r\n list.popup = new ui.Popup(list.list.parent().addClass(\"k-list-container\"), extend({}, list.options.popup, {\r\n anchor: list.wrapper,\r\n open: list._openHandler.bind(list),\r\n close: list._closeHandler.bind(list),\r\n animation: list.options.animation,\r\n isRtl: support.isRtl(list.wrapper),\r\n autosize: list.options.autoWidth,\r\n autowidth: list.options.autoWidth,\r\n activate: () => {\r\n this._refreshFloatingLabel();\r\n },\r\n deactivate: () => {\r\n this._refreshFloatingLabel();\r\n }\r\n }));\r\n\r\n list._postCreatePopup();\r\n },\r\n\r\n _onActionSheetCreate: $.noop,\r\n _onCloseButtonPressed: $.noop,\r\n\r\n _createActionSheet: function() {\r\n var list = this;\r\n\r\n if (list.popup) {\r\n list._cachedFilterValue = list.filterInput ? list.filterInput.val() : null;\r\n list.popup.destroy();\r\n list._removeFilterHeader();\r\n list._removeStaticHeader();\r\n list.list.parent().css({\r\n width: \"\",\r\n height: \"\",\r\n minWidth: \"\"\r\n });\r\n }\r\n\r\n list.popup = new ui.ActionSheet(list.list.parent(), {\r\n headerTemplate: (options) =>\r\n `
    ` +\r\n '
    ' +\r\n `
    ` +\r\n (list.options.label ? `
    ${list.options.label}
    ` : '') +\r\n (list.options.placeholder ? `
    ${list.options.placeholder || \"\"}
    ` : \"\") +\r\n '
    ' +\r\n (options.closeButton ?\r\n '
    ' +\r\n kendo.html.renderButton(``, { icon: \"x\", fillMode: \"flat\", size: \"large\" }) +\r\n '
    '\r\n : \"\") +\r\n '
    ' +\r\n '
    ',\r\n open: list._openHandler.bind(list),\r\n close: list._closeHandler.bind(list),\r\n focusOnActivate: false,\r\n adaptive: true,\r\n appendTo: (list.options.popup && list.options.popup.appendTo) || document.body,\r\n closeButton: true,\r\n fullscreen: list.smallMQL.mediaQueryList.matches,\r\n activate: () => {\r\n this._refreshFloatingLabel();\r\n },\r\n deactivate: () => {\r\n this._refreshFloatingLabel();\r\n },\r\n popup: extend({}, list.options.popup, {\r\n autosize: list.options.autoWidth\r\n })\r\n });\r\n\r\n list._postCreatePopup();\r\n list._onActionSheetCreate();\r\n },\r\n\r\n _removeFilterHeader: function() {\r\n if (this.filterInput) {\r\n this.filterInput\r\n .off(this.ns)\r\n .closest(\".k-list-filter\")\r\n .remove();\r\n\r\n this.filterInput = null;\r\n }\r\n },\r\n\r\n _removeStaticHeader: function() {\r\n this.listView.header.remove();\r\n },\r\n\r\n _postCreatePopup: function() {\r\n var list = this;\r\n var listViewValue;\r\n\r\n list._addFilterHeader();\r\n\r\n if (list.filterInput && list._cachedFilterValue) {\r\n list.filterInput.val(list._cachedFilterValue);\r\n }\r\n\r\n list.popup.element.prepend(list.header)\r\n .on(MOUSEDOWN + this.ns, this._listMousedown.bind(this));\r\n\r\n if (list.listView) {\r\n listViewValue = list.listView.value();\r\n\r\n if (list.listView._clean) {\r\n list.listView._clean();\r\n }\r\n\r\n // Dirty hack to clean MultiSelect taglist\r\n if (list.tagList && list.options.virtual) {\r\n list.tagList.empty();\r\n }\r\n\r\n list.listView.destroy();\r\n list._initList({ skipValueUpdate: true });\r\n list.listView.value(listViewValue);\r\n }\r\n },\r\n\r\n _toggleHover: function(e) {\r\n $(e.currentTarget).toggleClass(HOVER, e.type === MOUSEENTER);\r\n },\r\n\r\n _toggle: function(open, preventFocus) {\r\n var that = this;\r\n var touchEnabled = support.mobileOS && (support.touch || support.MSPointers || support.pointers);\r\n\r\n open = open !== undefined$1 ? open : !that.popup.visible();\r\n\r\n if (!preventFocus && !touchEnabled && that._focused[0] !== activeElement()) {\r\n that._prevent = true;\r\n that._focused.trigger(FOCUS);\r\n that._prevent = false;\r\n }\r\n\r\n that[open ? OPEN : CLOSE]();\r\n },\r\n\r\n _triggerCascade: function() {\r\n var that = this;\r\n\r\n if (!that._cascadeTriggered || that.value() !== unifyType(that._cascadedValue, typeof that.value())) {\r\n that._cascadedValue = that.value();\r\n that._cascadeTriggered = true;\r\n that.trigger(CASCADE, { userTriggered: that._userTriggered });\r\n }\r\n },\r\n\r\n _triggerChange: function() {\r\n if (this._valueBeforeCascade !== this.value()) {\r\n this.trigger(CHANGE);\r\n }\r\n },\r\n\r\n _unbindDataSource: function() {\r\n var that = this;\r\n\r\n that.dataSource.unbind(REQUESTSTART, that._requestStartHandler)\r\n .unbind(REQUESTEND, that._requestEndHandler)\r\n .unbind(\"error\", that._errorHandler);\r\n },\r\n\r\n requireValueMapper: function(options, value) {\r\n var hasValue = (options.value instanceof Array ? options.value.length : options.value) || (value instanceof Array ? value.length : value);\r\n if (hasValue && options.virtual && typeof options.virtual.valueMapper !== \"function\") {\r\n throw new Error(\"ValueMapper is not provided while the value is being set. See http://docs.telerik.com/kendo-ui/controls/editors/combobox/virtualization#the-valuemapper-function\");\r\n }\r\n }\r\n });\r\n\r\n function unifyType(value, type) {\r\n if (value !== undefined$1 && value !== \"\" && value !== null) {\r\n if (type === \"boolean\") {\r\n if (typeof value !== \"boolean\") {\r\n value = value.toString().toLowerCase() === \"true\";\r\n }\r\n value = Boolean(value);\r\n } else if (type === \"number\") {\r\n value = Number(value);\r\n } else if (type === \"string\") {\r\n value = value.toString();\r\n }\r\n }\r\n\r\n return value;\r\n }\r\n\r\n extend(List, {\r\n inArray: function(node, parentNode) {\r\n var idx, length, siblings = parentNode.children;\r\n\r\n if (!node || node.parentNode !== parentNode) {\r\n return -1;\r\n }\r\n\r\n for (idx = 0, length = siblings.length; idx < length; idx++) {\r\n if (node === siblings[idx]) {\r\n return idx;\r\n }\r\n }\r\n\r\n return -1;\r\n },\r\n unifyType: unifyType\r\n });\r\n\r\n kendo.ui.List = List;\r\n\r\n ui.Select = List.extend({\r\n init: function(element, options) {\r\n List.fn.init.call(this, element, options);\r\n this._initial = this.element.val();\r\n },\r\n\r\n setDataSource: function(dataSource) {\r\n var that = this;\r\n var parent;\r\n\r\n that.options.dataSource = dataSource;\r\n\r\n that._dataSource();\r\n\r\n if (that.listView.bound()) {\r\n that._initialIndex = null;\r\n that.listView._current = null;\r\n }\r\n\r\n that.listView.setDataSource(that.dataSource);\r\n\r\n if (that.options.autoBind) {\r\n that.dataSource.fetch();\r\n }\r\n\r\n parent = that._parentWidget();\r\n\r\n if (parent) {\r\n that._cascadeSelect(parent);\r\n }\r\n },\r\n\r\n close: function() {\r\n this.popup.close();\r\n },\r\n\r\n select: function(candidate) {\r\n var that = this;\r\n\r\n if (candidate === undefined$1) {\r\n return that.selectedIndex;\r\n } else {\r\n return that._select(candidate).done(function() {\r\n that._cascadeValue = that._old = that._accessor();\r\n that._oldIndex = that.selectedIndex;\r\n\r\n that._refreshFloatingLabel();\r\n });\r\n }\r\n },\r\n\r\n _accessor: function(value, idx) {\r\n return this[this._isSelect ? \"_accessorSelect\" : \"_accessorInput\"](value, idx);\r\n },\r\n\r\n _accessorInput: function(value) {\r\n var element = this.element[0];\r\n\r\n if (value === undefined$1) {\r\n return element.value;\r\n } else {\r\n if (value === null) {\r\n value = \"\";\r\n }\r\n element.value = value;\r\n }\r\n },\r\n\r\n _accessorSelect: function(value, idx) {\r\n var element = this.element[0];\r\n var hasValue;\r\n\r\n if (value === undefined$1) {\r\n return getSelectedOption(element).value || \"\";\r\n }\r\n\r\n getSelectedOption(element).selected = false;\r\n\r\n if (idx === undefined$1) {\r\n idx = -1;\r\n }\r\n\r\n hasValue = (value !== null && value !== \"\");\r\n\r\n if (hasValue && idx == -1) {\r\n this._custom(value);\r\n } else {\r\n if (value) {\r\n element.value = value;\r\n } else {\r\n element.selectedIndex = idx;\r\n }\r\n }\r\n },\r\n\r\n _syncValueAndText: function() {\r\n return true;\r\n },\r\n\r\n _custom: function(value) {\r\n var that = this;\r\n var element = that.element;\r\n var custom = that._customOption;\r\n\r\n if (!custom) {\r\n custom = $(\"\";\r\n options += option;\r\n }\r\n\r\n element.html(options);\r\n\r\n if (value !== undefined$1) {\r\n htmlElement.value = value;\r\n if (htmlElement.value && !value) {\r\n htmlElement.selectedIndex = -1;\r\n }\r\n }\r\n\r\n if (htmlElement.selectedIndex !== -1) {\r\n option = getSelectedOption(htmlElement);\r\n\r\n if (option) {\r\n option.setAttribute(SELECTED, SELECTED);\r\n }\r\n }\r\n },\r\n\r\n _reset: function() {\r\n var that = this,\r\n element = that.element,\r\n formId = element.attr(\"form\"),\r\n form = formId ? $(\"#\" + formId) : element.closest(\"form\");\r\n\r\n if (form[0]) {\r\n that._resetHandler = function() {\r\n setTimeout(function() {\r\n if (that.options._removeDataItems) {\r\n that.listView._dataItems = [];\r\n }\r\n\r\n that.value(that._initial);\r\n\r\n if (that.options._shouldRefresh) {\r\n that.text(that._initial);\r\n that.refresh();\r\n }\r\n });\r\n };\r\n\r\n that._form = form.on(\"reset\", that._resetHandler);\r\n }\r\n },\r\n\r\n _parentWidget: function() {\r\n var name = this.options.name;\r\n\r\n if (!this.options.cascadeFrom) {\r\n return;\r\n }\r\n\r\n var parentElement = $(\"#\" + this.options.cascadeFrom);\r\n var parent = parentElement.data(\"kendo\" + name);\r\n\r\n if (!parent) {\r\n for (var i = 0; i < alternativeNames[name].length; i += 1) {\r\n parent = parentElement.data(\"kendo\" + alternativeNames[name][i]);\r\n\r\n if (!!parent) {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return parent;\r\n },\r\n\r\n _cascade: function() {\r\n var that = this;\r\n var options = that.options;\r\n var cascade = options.cascadeFrom;\r\n var parent;\r\n\r\n if (cascade) {\r\n parent = that._parentWidget();\r\n\r\n if (!parent) {\r\n return;\r\n }\r\n\r\n that._cascadeHandlerProxy = that._cascadeHandler.bind(that);\r\n that._cascadeFilterRequests = [];\r\n\r\n options.autoBind = false;\r\n\r\n parent.bind(\"set\", function() { //will cascade\r\n that.one(\"set\", function(e) { //get your value\r\n that._selectedValue = e.value || that._accessor();\r\n });\r\n });\r\n\r\n parent.first(CASCADE, that._cascadeHandlerProxy);\r\n\r\n //refresh was called\r\n if (parent.listView.bound()) {\r\n that._toggleCascadeOnFocus();\r\n that._cascadeSelect(parent);\r\n } else {\r\n parent.one(DATA_BOUND, function() {\r\n that._toggleCascadeOnFocus();\r\n if (parent.popup.visible()) {\r\n parent._focused.trigger(FOCUS);\r\n }\r\n });\r\n\r\n if (!parent.value()) {\r\n that.enable(false);\r\n }\r\n }\r\n }\r\n },\r\n\r\n _toggleCascadeOnFocus: function() {\r\n var that = this;\r\n var parent = that._parentWidget();\r\n var focusout = isIE && parent instanceof ui.DropDownList ? BLUR : FOCUSOUT;\r\n\r\n parent._focused.add(parent.filterInput).on(FOCUS, function() {\r\n parent.unbind(CASCADE, that._cascadeHandlerProxy);\r\n parent.unbind(CHANGE, that._cascadeHandlerProxy);\r\n parent.first(CHANGE, that._cascadeHandlerProxy);\r\n });\r\n\r\n parent._focused.add(parent.filterInput).on(focusout, function() {\r\n parent.unbind(CHANGE, that._cascadeHandlerProxy);\r\n parent.unbind(CASCADE, that._cascadeHandlerProxy);\r\n parent.first(CASCADE, that._cascadeHandlerProxy);\r\n });\r\n },\r\n\r\n _cascadeHandler: function(e) {\r\n var parent = this._parentWidget();\r\n var valueBeforeCascade = this.value();\r\n\r\n this._userTriggered = e.userTriggered || parent._userTriggered;\r\n\r\n if (this.listView.bound()) {\r\n this._clearSelection(parent, true);\r\n }\r\n\r\n this._cascadeSelect(parent, valueBeforeCascade);\r\n },\r\n\r\n _cascadeChange: function(parent) {\r\n var that = this;\r\n var value = that._accessor() || that._selectedValue;\r\n\r\n if (!that._cascadeFilterRequests.length) {\r\n that._selectedValue = null;\r\n }\r\n\r\n if (that._userTriggered) {\r\n that._clearSelection(parent, true);\r\n } else if (value) {\r\n if (value !== unifyType(that.listView.value()[0], typeof value)) {\r\n that.value(value);\r\n }\r\n\r\n if (!that.dataSource.view()[0] || that.selectedIndex === -1) {\r\n that._clearSelection(parent, true);\r\n }\r\n } else if (that.dataSource.flatView().length) {\r\n that.select(that.options.index);\r\n }\r\n\r\n that.enable();\r\n that._triggerCascade();\r\n that._triggerChange();\r\n that._userTriggered = false;\r\n },\r\n\r\n _cascadeSelect: function(parent, valueBeforeCascade) {\r\n var that = this;\r\n var dataItem = parent.dataItem();\r\n var filterValue = dataItem ? dataItem[that.options.cascadeFromParentField] || parent._value(dataItem) : null;\r\n var valueField = that.options.cascadeFromField || parent.options.dataValueField;\r\n var expressions;\r\n\r\n // Applicable only when parent is ComboBox or MultiColumnComboBox\r\n if (parent.options.cascadeOnCustomValue &&\r\n filterValue === null &&\r\n (!that.options.cascadeFromParentField || that.options.cascadeFromParentField === parent.options.dataValueField)) {\r\n filterValue = parent.value();\r\n }\r\n\r\n that._valueBeforeCascade = valueBeforeCascade !== undefined$1 ? valueBeforeCascade : that.value();\r\n\r\n if (filterValue || filterValue === 0) {\r\n expressions = that.dataSource.filter() || {};\r\n removeFiltersForField(expressions, valueField);\r\n\r\n var handler = function() {\r\n var currentHandler = that._cascadeFilterRequests.shift();\r\n if (currentHandler) {\r\n that.unbind('dataBound', currentHandler);\r\n }\r\n\r\n currentHandler = that._cascadeFilterRequests[0];\r\n if (currentHandler) {\r\n that.first('dataBound', currentHandler);\r\n }\r\n\r\n that._cascadeChange(parent);\r\n };\r\n\r\n that._cascadeFilterRequests.push(handler);\r\n\r\n if (that._cascadeFilterRequests.length === 1) {\r\n that.first('dataBound', handler);\r\n }\r\n\r\n that._cascading = true;\r\n that._filterSource({\r\n field: valueField,\r\n operator: \"eq\",\r\n value: filterValue\r\n });\r\n that._cascading = false;\r\n } else {\r\n that.enable(false);\r\n that._clearSelection(parent);\r\n that._triggerCascade();\r\n that._triggerChange();\r\n that._userTriggered = false;\r\n }\r\n\r\n that._refreshFloatingLabel();\r\n }\r\n });\r\n\r\n var STATIC_LIST_NS = \".StaticList\";\r\n\r\n var StaticList = kendo.ui.DataBoundWidget.extend({\r\n init: function(element, options) {\r\n Widget.fn.init.call(this, element, options);\r\n\r\n this.element.attr(\"role\", (options.aria && options.aria.role) || 'listbox')\r\n .on(CLICK + STATIC_LIST_NS, \"li\", this._click.bind(this))\r\n .on(MOUSEENTER + STATIC_LIST_NS, \"li\", function() { $(this).addClass(HOVER); })\r\n .on(MOUSELEAVE + STATIC_LIST_NS, \"li\", function() { $(this).removeClass(HOVER); });\r\n\r\n if (options && options.ariaLabel) {\r\n this.element.attr(ARIA_LABEL, options.ariaLabel);\r\n } else if (options && options.ariaLabelledBy) {\r\n this.element.attr(ARIA_LABELLEDBY, options.ariaLabelledBy);\r\n }\r\n\r\n if (support.touch) {\r\n this._touchHandlers();\r\n }\r\n\r\n if (this.options.selectable === \"multiple\") {\r\n this.element.attr(ARIA_MULTISELECTABLE, true);\r\n }\r\n\r\n if (this.options.columns && this.options.columns.length) {\r\n var thead = this.element.parent().find('.k-table-thead');\r\n var row = $('' +\r\n '' +\r\n '');\r\n\r\n thead.append(row);\r\n\r\n this.header = row.find(\".k-table-th\");\r\n\r\n this.content = this.element.wrap(\"
    \").parent();\r\n\r\n this.element.addClass(TABLE_LIST);\r\n } else {\r\n this.content = this.element.wrap(\"
    \").parent();\r\n this.header = this.content.before($('
    ').hide()).prev();\r\n this.element.addClass(LIST_UL);\r\n }\r\n\r\n this.bound(false);\r\n\r\n this._optionID = kendo.guid();\r\n\r\n this._selectedIndices = [];\r\n\r\n this._view = [];\r\n this._dataItems = [];\r\n this._values = [];\r\n\r\n var value = this.options.value;\r\n\r\n if (value) {\r\n this._values = Array.isArray(value) ? value.slice(0) : [value];\r\n }\r\n\r\n this._getter();\r\n this._templates();\r\n\r\n this.setDataSource(this.options.dataSource);\r\n\r\n this._createOnScrollProxy();\r\n },\r\n\r\n options: {\r\n name: \"StaticList\",\r\n dataValueField: null,\r\n valuePrimitive: false,\r\n selectable: true,\r\n template: null,\r\n groupTemplate: null,\r\n fixedGroupTemplate: null,\r\n ariaLabel: null,\r\n ariaLabelledBy: null\r\n },\r\n\r\n events: [\r\n CLICK,\r\n CHANGE,\r\n ACTIVATE,\r\n DEACTIVATE,\r\n DATA_BINDING,\r\n DATA_BOUND,\r\n SELECTED_ITEM_CHANGE\r\n ],\r\n\r\n setDataSource: function(source) {\r\n var that = this;\r\n var dataSource = source || {};\r\n var value;\r\n\r\n dataSource = Array.isArray(dataSource) ? { data: dataSource } : dataSource;\r\n dataSource = kendo.data.DataSource.create(dataSource);\r\n\r\n if (that.dataSource) {\r\n that.dataSource.unbind(CHANGE, that._refreshHandler);\r\n\r\n value = that.value();\r\n\r\n that.value([]);\r\n that.bound(false);\r\n\r\n that.value(value);\r\n } else {\r\n that._refreshHandler = that.refresh.bind(that);\r\n }\r\n\r\n that.setDSFilter(dataSource.filter());\r\n\r\n that.dataSource = dataSource.bind(CHANGE, that._refreshHandler);\r\n that._fixedHeader();\r\n },\r\n\r\n _touchHandlers: function() {\r\n var that = this,\r\n itemSelector = this.options.columns && this.options.columns.length ? ITEMSELECTORTABLE : ITEMSELECTOR,\r\n startY, endY,\r\n tapPosition = function(event) {\r\n return (event.originalEvent || event).changedTouches[0].pageY;\r\n };\r\n\r\n that.element.on(\"touchstart\" + STATIC_LIST_NS, function(e) {\r\n startY = tapPosition(e);\r\n });\r\n\r\n that.element.on(\"touchend\" + STATIC_LIST_NS, function(e) {\r\n if (e.isDefaultPrevented()) {\r\n return;\r\n }\r\n\r\n endY = tapPosition(e);\r\n\r\n if (Math.abs(endY - startY) < 10) {\r\n that._touchTriggered = true;\r\n that._triggerClick($(e.target).closest(itemSelector).get(0));\r\n }\r\n });\r\n },\r\n\r\n skip: function() {\r\n return this.dataSource.skip();\r\n },\r\n\r\n setOptions: function(options) {\r\n Widget.fn.setOptions.call(this, options);\r\n\r\n this._getter();\r\n this._templates();\r\n this._render();\r\n\r\n if (this.label && options.label) {\r\n this.label.setOptions(options.label);\r\n } else if (this.label && options.label === false) {\r\n this.label._unwrapFloating();\r\n this._inputLabel.remove();\r\n delete this._inputLabel;\r\n }\r\n },\r\n\r\n destroy: function() {\r\n this.element.off(STATIC_LIST_NS);\r\n\r\n if (this._refreshHandler) {\r\n this.dataSource.unbind(CHANGE, this._refreshHandler);\r\n }\r\n\r\n clearTimeout(this._scrollId);\r\n\r\n Widget.fn.destroy.call(this);\r\n },\r\n\r\n dataItemByIndex: function(index) {\r\n return this.dataSource.flatView()[index];\r\n },\r\n\r\n screenHeight: function() {\r\n return this.content[0].clientHeight;\r\n },\r\n\r\n scrollToIndex: function(index) {\r\n var item = this.element[0].children[index];\r\n\r\n if (item) {\r\n this.scroll(item);\r\n }\r\n },\r\n\r\n scrollWith: function(value) {\r\n this.content.scrollTop(this.content.scrollTop() + value);\r\n },\r\n\r\n scroll: function(item) {\r\n if (!item) {\r\n return;\r\n }\r\n\r\n if (item[0]) {\r\n item = item[0];\r\n }\r\n\r\n var content = this.content[0],\r\n itemOffsetTop = item.offsetTop,\r\n itemOffsetHeight = item.offsetHeight,\r\n contentScrollTop = content.scrollTop,\r\n contentOffsetHeight = content.clientHeight,\r\n bottomDistance = itemOffsetTop + itemOffsetHeight;\r\n\r\n if (contentScrollTop > itemOffsetTop) {\r\n contentScrollTop = itemOffsetTop;\r\n } else if (bottomDistance > (contentScrollTop + contentOffsetHeight)) {\r\n contentScrollTop = (bottomDistance - contentOffsetHeight);\r\n }\r\n\r\n content.scrollTop = contentScrollTop;\r\n },\r\n\r\n selectedDataItems: function(dataItems) {\r\n if (dataItems === undefined$1) {\r\n return this._dataItems.slice();\r\n }\r\n\r\n this._dataItems = dataItems;\r\n this._values = this._getValues(dataItems);\r\n },\r\n\r\n _getValues: function(dataItems) {\r\n var getter = this._valueGetter;\r\n\r\n return $.map(dataItems, function(dataItem) {\r\n return getter(dataItem);\r\n });\r\n },\r\n\r\n focusNext: function() {\r\n var current = this.focus();\r\n\r\n if (!current) {\r\n current = 0;\r\n } else {\r\n current = current.next();\r\n }\r\n\r\n this.focus(current);\r\n },\r\n\r\n focusPrev: function() {\r\n var current = this.focus();\r\n\r\n if (!current) {\r\n current = this.element[0].children.length - 1;\r\n } else {\r\n current = current.prev();\r\n }\r\n\r\n this.focus(current);\r\n },\r\n\r\n focusFirst: function() {\r\n this.focus(this.element[0].children[0]);\r\n },\r\n\r\n focusLast: function() {\r\n this.focus(last(this.element[0].children));\r\n },\r\n\r\n focus: function(candidate) {\r\n var that = this;\r\n var id = that._optionID;\r\n var hasCandidate;\r\n\r\n if (candidate === undefined$1) {\r\n return that._current;\r\n }\r\n\r\n candidate = last(that._get(candidate));\r\n candidate = $(this.element[0].children[candidate]);\r\n\r\n if (that._current) {\r\n that._current\r\n .removeClass(FOCUSED)\r\n .removeAttr(ID);\r\n\r\n that.trigger(DEACTIVATE);\r\n }\r\n\r\n hasCandidate = !!candidate[0];\r\n\r\n if (hasCandidate) {\r\n candidate.addClass(FOCUSED);\r\n that.scroll(candidate);\r\n\r\n candidate.attr(\"id\", id);\r\n }\r\n\r\n that._current = hasCandidate ? candidate : null;\r\n that.trigger(ACTIVATE);\r\n },\r\n\r\n focusIndex: function() {\r\n return this.focus() ? this.focus().index() : undefined$1;\r\n },\r\n\r\n skipUpdate: function(skipUpdate) {\r\n this._skipUpdate = skipUpdate;\r\n },\r\n\r\n select: function(indices) {\r\n var that = this;\r\n var selectable = that.options.selectable;\r\n var singleSelection = selectable !== \"multiple\" && selectable !== false;\r\n var selectedIndices = that._selectedIndices;\r\n var uiSelectedIndices = [this.element.find(\".k-selected\").index()];\r\n\r\n var added = [];\r\n var removed = [];\r\n var result;\r\n\r\n if (indices === undefined$1) {\r\n return selectedIndices.slice();\r\n }\r\n\r\n indices = that._get(indices);\r\n\r\n if (indices.length === 1 && indices[0] === -1) {\r\n indices = [];\r\n }\r\n\r\n var deferred = $.Deferred().resolve();\r\n var filtered = that.isFiltered();\r\n\r\n if (filtered && !singleSelection && that._deselectFiltered(indices)) {\r\n return deferred;\r\n }\r\n\r\n if (singleSelection && !filtered &&\r\n $.inArray(last(indices), selectedIndices) !== -1 && $.inArray(last(indices), uiSelectedIndices) !== -1) {\r\n\r\n if (that._dataItems.length && that._view.length) {\r\n that._dataItems = [that._view[selectedIndices[0]].item];\r\n }\r\n\r\n return deferred;\r\n }\r\n\r\n result = that._deselect(indices);\r\n\r\n removed = result.removed;\r\n indices = result.indices;\r\n\r\n if (indices.length) {\r\n if (singleSelection) {\r\n indices = [last(indices)];\r\n }\r\n\r\n added = that._select(indices);\r\n\r\n }\r\n\r\n if (added.length || removed.length) {\r\n that._valueComparer = null;\r\n that.trigger(CHANGE, {\r\n added: added,\r\n removed: removed\r\n });\r\n\r\n }\r\n\r\n return deferred;\r\n },\r\n\r\n removeAt: function(position) {\r\n this._selectedIndices.splice(position, 1);\r\n this._values.splice(position, 1);\r\n this._valueComparer = null;\r\n\r\n return {\r\n position: position,\r\n dataItem: this._dataItems.splice(position, 1)[0]\r\n };\r\n },\r\n\r\n setValue: function(value) {\r\n value = Array.isArray(value) || value instanceof ObservableArray ? value.slice(0) : [value];\r\n\r\n this._values = value;\r\n\r\n this._valueComparer = null;\r\n },\r\n\r\n value: function(value) {\r\n var that = this;\r\n var deferred = that._valueDeferred;\r\n var indices;\r\n\r\n if (value === undefined$1) {\r\n return that._values.slice();\r\n }\r\n\r\n that.setValue(value);\r\n\r\n if (!deferred || deferred.state() === \"resolved\") {\r\n that._valueDeferred = deferred = $.Deferred();\r\n }\r\n\r\n if (that.bound()) {\r\n indices = that._valueIndices(that._values);\r\n\r\n if (that.options.selectable === \"multiple\") {\r\n that.select(-1);\r\n }\r\n\r\n that.select(indices);\r\n\r\n deferred.resolve();\r\n }\r\n\r\n that._skipUpdate = false;\r\n\r\n return deferred;\r\n },\r\n\r\n items: function() {\r\n return this.element.children(ITEMSELECTOR);\r\n },\r\n\r\n _click: function(e) {\r\n if (this._touchTriggered)\r\n {\r\n this._touchTriggered = false;\r\n return;\r\n }\r\n\r\n if (!e.isDefaultPrevented()) {\r\n this._triggerClick(e.currentTarget);\r\n }\r\n },\r\n\r\n _createOnScrollProxy: function() {\r\n var onScrollProxy = function() {\r\n var that = this;\r\n clearTimeout(that._scrollId);\r\n\r\n that._scrollId = setTimeout(function() {\r\n that._renderHeader();\r\n }, 50);\r\n };\r\n\r\n this._onScroll = onScrollProxy.bind(this);\r\n },\r\n\r\n _triggerClick: function(item) {\r\n if (!this.trigger(CLICK, { item: $(item) })) {\r\n this.select(item);\r\n }\r\n },\r\n\r\n _valueExpr: function(type, values) {\r\n var that = this;\r\n var idx = 0;\r\n var comparer;\r\n var normalized = [];\r\n\r\n if (!that._valueComparer || that._valueType !== type) {\r\n that._valueType = type;\r\n\r\n for (; idx < values.length; idx++) {\r\n normalized.push(unifyType(values[idx], type));\r\n }\r\n\r\n comparer = (current, values) => {\r\n for (var idx = 0; idx < normalized.length; idx++) {\r\n if (current === values[idx]) {\r\n return idx;\r\n }\r\n }\r\n return -1;\r\n };\r\n\r\n that._valueComparer = function(current) {\r\n return comparer(current, normalized);\r\n };\r\n }\r\n\r\n return that._valueComparer;\r\n },\r\n\r\n _dataItemPosition: function(dataItem, values) {\r\n var value = this._valueGetter(dataItem);\r\n\r\n var valueExpr = this._valueExpr(typeof value, values);\r\n\r\n return valueExpr(value);\r\n },\r\n\r\n _getter: function() {\r\n this._valueGetter = kendo.getter(this.options.dataValueField);\r\n },\r\n\r\n _deselect: function(indices) {\r\n var that = this;\r\n var children = that.element[0].children;\r\n var selectable = that.options.selectable;\r\n var selectedIndices = that._selectedIndices;\r\n var dataItems = that._dataItems;\r\n var values = that._values;\r\n var removed = [];\r\n var i = 0;\r\n var j;\r\n\r\n var index, selectedIndex;\r\n var removedIndices = 0;\r\n\r\n indices = indices.slice();\r\n\r\n if (selectable === true || !indices.length) {\r\n for (; i < selectedIndices.length; i++) {\r\n $(children[selectedIndices[i]]).removeClass(KSELECTED).attr(ARIA_SELECTED, false);\r\n\r\n removed.push({\r\n position: i,\r\n dataItem: dataItems[i]\r\n });\r\n }\r\n\r\n that._values = [];\r\n that._dataItems = [];\r\n that._selectedIndices = [];\r\n } else if (selectable === \"multiple\") {\r\n for (; i < indices.length; i++) {\r\n index = indices[i];\r\n\r\n if (!$(children[index]).hasClass(KSELECTED)) {\r\n continue;\r\n }\r\n\r\n for (j = 0; j < selectedIndices.length; j++) {\r\n selectedIndex = selectedIndices[j];\r\n\r\n if (selectedIndex === index) {\r\n $(children[selectedIndex]).removeClass(KSELECTED).attr(ARIA_SELECTED, false);\r\n var dataItem = this._view[index].item;\r\n var position = this._dataItemPosition(dataItem, this._values);\r\n\r\n removed.push({\r\n position: position,\r\n dataItem: dataItem\r\n });\r\n\r\n dataItems.splice(j, 1);\r\n selectedIndices.splice(j, 1);\r\n indices.splice(i, 1);\r\n values.splice(j, 1);\r\n\r\n removedIndices += 1;\r\n i -= 1;\r\n j -= 1;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return {\r\n indices: indices,\r\n removed: removed\r\n };\r\n },\r\n\r\n _deselectFiltered: function(indices) {\r\n var children = this.element[0].children;\r\n var dataItem, index, position;\r\n var removed = [];\r\n var idx = 0;\r\n\r\n for (; idx < indices.length; idx++) {\r\n index = indices[idx];\r\n\r\n dataItem = this._view[index].item;\r\n position = this._dataItemPosition(dataItem, this._values);\r\n\r\n if (position > -1) {\r\n removed.push(this.removeAt(position));\r\n $(children[index]).removeClass(KSELECTED);\r\n }\r\n }\r\n\r\n if (removed.length) {\r\n this.trigger(CHANGE, {\r\n added: [],\r\n removed: removed\r\n });\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n },\r\n\r\n _select: function(indices) {\r\n var that = this;\r\n var children = that.element[0].children;\r\n var data = that._view;\r\n var dataItem, index;\r\n var added = [];\r\n var idx = 0;\r\n\r\n if (last(indices) !== -1) {\r\n that.focus(indices);\r\n }\r\n\r\n for (; idx < indices.length; idx++) {\r\n\r\n index = indices[idx];\r\n dataItem = data[index];\r\n\r\n if (index === -1 || !dataItem) {\r\n continue;\r\n }\r\n\r\n dataItem = dataItem.item;\r\n\r\n that._selectedIndices.push(index);\r\n that._dataItems.push(dataItem);\r\n that._values.push(that._valueGetter(dataItem));\r\n\r\n $(children[index]).addClass(KSELECTED).attr(ARIA_SELECTED, true);\r\n\r\n added.push({\r\n dataItem: dataItem\r\n });\r\n }\r\n return added;\r\n },\r\n\r\n getElementIndex: function(element) {\r\n return $(element).data(\"offset-index\");\r\n },\r\n\r\n _get: function(candidate) {\r\n if (typeof candidate === \"number\") {\r\n candidate = [candidate];\r\n } else if (!isArray(candidate)) {\r\n candidate = this.getElementIndex(candidate);\r\n candidate = [candidate !== undefined$1 ? candidate : -1];\r\n }\r\n\r\n return candidate;\r\n },\r\n\r\n _templates: function() {\r\n var template;\r\n var options = this.options;\r\n var templates = {\r\n template: options.template,\r\n groupTemplate: options.groupTemplate,\r\n fixedGroupTemplate: options.fixedGroupTemplate\r\n };\r\n\r\n if (options.columns) {\r\n options.columns.forEach((column, i) => {\r\n var templateText = column.field ? column.field.toString() : TEXT;\r\n var templateFunc = data => htmlEncode(kendo.getter(templateText)(data));\r\n\r\n templates[\"column\" + i] = column.template || templateFunc;\r\n });\r\n }\r\n\r\n for (var key in templates) {\r\n template = templates[key];\r\n if (template && typeof template !== \"function\") {\r\n templates[key] = kendo.template(template);\r\n }\r\n }\r\n\r\n this.templates = templates;\r\n },\r\n\r\n _normalizeIndices: function(indices) {\r\n var newIndices = [];\r\n var idx = 0;\r\n\r\n for (; idx < indices.length; idx++) {\r\n if (indices[idx] !== undefined$1) {\r\n newIndices.push(indices[idx]);\r\n }\r\n }\r\n\r\n return newIndices;\r\n },\r\n\r\n _valueIndices: function(values, indices) {\r\n var data = this._view;\r\n var idx = 0;\r\n var index;\r\n\r\n indices = indices ? indices.slice() : [];\r\n\r\n if (!values.length) {\r\n return [];\r\n }\r\n\r\n for (; idx < data.length; idx++) {\r\n index = this._dataItemPosition(data[idx].item, values);\r\n\r\n if (index !== -1) {\r\n indices[index] = idx;\r\n }\r\n }\r\n\r\n return this._normalizeIndices(indices);\r\n },\r\n\r\n _firstVisibleItem: function() {\r\n var element = this.element[0];\r\n var content = this.content[0];\r\n var scrollTop = content.scrollTop;\r\n var itemHeight = $(element.children[0]).height();\r\n var itemIndex = Math.floor(scrollTop / itemHeight) || 0;\r\n\r\n if (element.childElementCount == 0) {\r\n return null;\r\n }\r\n\r\n var item = element.children[itemIndex] || element.lastChild;\r\n var forward = item.offsetTop < scrollTop;\r\n\r\n while (item) {\r\n if (forward) {\r\n if ((item.offsetTop + itemHeight) > scrollTop || !item.nextSibling) {\r\n break;\r\n }\r\n\r\n item = item.nextSibling;\r\n } else {\r\n if (item.offsetTop <= scrollTop || !item.previousSibling) {\r\n break;\r\n }\r\n\r\n item = item.previousSibling;\r\n }\r\n }\r\n\r\n return this._view[$(item).data(\"offset-index\")];\r\n },\r\n\r\n _fixedHeader: function() {\r\n if (this.isGrouped() && this.templates.fixedGroupTemplate) {\r\n if (this.header.closest(GROUP_ROW_SEL).length) {\r\n this.header.closest(GROUP_ROW_SEL).show();\r\n } else {\r\n this.header.show();\r\n }\r\n\r\n this.content.scroll(this._onScroll);\r\n } else {\r\n if (this.header.closest(GROUP_ROW_SEL).length) {\r\n this.header.closest(GROUP_ROW_SEL).hide();\r\n } else {\r\n this.header.hide();\r\n }\r\n\r\n this.content.off(\"scroll\", this._onScroll);\r\n }\r\n },\r\n\r\n _renderHeader: function() {\r\n var template = this.templates.fixedGroupTemplate;\r\n if (!template) {\r\n return;\r\n }\r\n\r\n var visibleItem = this._firstVisibleItem();\r\n\r\n if (visibleItem && visibleItem.group.toString().length) {\r\n this.header.html(template(visibleItem.group));\r\n }\r\n },\r\n\r\n _renderItem: function(context) {\r\n var item = `
  • ';\r\n if (hasColumns) {\r\n item += this._renderColumns(dataItem);\r\n } else {\r\n item += '';\r\n item += this.templates.template(dataItem);\r\n item += '';\r\n }\r\n\r\n if (notFirstItem && context.newGroup) {\r\n if (hasColumns) {\r\n item += '' + this.templates.groupTemplate(context.group) + '';\r\n } else {\r\n item += '
    ' + this.templates.groupTemplate(context.group) + '
    ';\r\n }\r\n } else if (isGrouped && hasColumns) {\r\n item += '';\r\n }\r\n\r\n return item + \"
  • \";\r\n },\r\n\r\n _renderColumns: function(dataItem) {\r\n var item = \"\";\r\n\r\n for (var i = 0; i < this.options.columns.length; i++) {\r\n var currentWidth = this.options.columns[i].width;\r\n var currentWidthInt = parseInt(currentWidth, 10);\r\n var widthStyle = '';\r\n\r\n if (currentWidth && !isNaN(currentWidthInt)) {\r\n widthStyle += `${kendo.attr('style-width')}=\"${currentWidthInt}${percentageUnitsRegex.test(currentWidth) ? \"%\" : \"px\"}\"`;\r\n }\r\n\r\n item += \"\";\r\n item += this.templates[\"column\" + i](dataItem);\r\n item += \"\";\r\n }\r\n\r\n return item;\r\n },\r\n\r\n _render: function() {\r\n var html = \"\";\r\n var cspCompliantHtml;\r\n var i = 0;\r\n var idx = 0;\r\n var context;\r\n var dataContext = [];\r\n var view = this.dataSource.view();\r\n var values = this.value();\r\n\r\n var group, newGroup, j;\r\n var isGrouped = this.isGrouped();\r\n\r\n if (isGrouped) {\r\n for (i = 0; i < view.length; i++) {\r\n group = view[i];\r\n newGroup = true;\r\n\r\n for (j = 0; j < group.items.length; j++) {\r\n context = {\r\n selected: this._selected(group.items[j], values),\r\n item: group.items[j],\r\n group: group.value,\r\n newGroup: newGroup,\r\n isLastGroupedItem: j === group.items.length - 1,\r\n index: idx };\r\n dataContext[idx] = context;\r\n idx += 1;\r\n\r\n html += this._renderItem(context);\r\n newGroup = false;\r\n }\r\n }\r\n } else {\r\n for (i = 0; i < view.length; i++) {\r\n context = { selected: this._selected(view[i], values), item: view[i], index: i };\r\n\r\n dataContext[i] = context;\r\n\r\n html += this._renderItem(context);\r\n }\r\n }\r\n\r\n this._view = dataContext;\r\n\r\n cspCompliantHtml = $(html);\r\n kendo.applyStylesFromKendoAttributes(cspCompliantHtml, [\"width\", \"background-color\"]);\r\n\r\n this.element.empty().append(cspCompliantHtml);\r\n\r\n if (isGrouped && dataContext.length) {\r\n this._renderHeader();\r\n }\r\n },\r\n\r\n _selected: function(dataItem, values) {\r\n var select = !this.isFiltered() || this.options.selectable === \"multiple\";\r\n return select && this._dataItemPosition(dataItem, values) !== -1;\r\n },\r\n\r\n setDSFilter: function(filter) {\r\n this._lastDSFilter = extend({}, filter);\r\n },\r\n\r\n isFiltered: function() {\r\n if (!this._lastDSFilter) {\r\n this.setDSFilter(this.dataSource.filter());\r\n }\r\n\r\n return !kendo.data.Query.compareFilters(this.dataSource.filter(), this._lastDSFilter);\r\n },\r\n\r\n refresh: function(e) {\r\n var that = this;\r\n var action = e && e.action;\r\n var skipUpdateOnBind = that.options.skipUpdateOnBind;\r\n var isItemChange = action === \"itemchange\";\r\n var result;\r\n\r\n that.trigger(DATA_BINDING);\r\n\r\n that._fixedHeader();\r\n\r\n that._render();\r\n\r\n that.bound(true);\r\n\r\n if (isItemChange || action === \"remove\") {\r\n result = mapChangedItems(that._dataItems, e.items);\r\n\r\n if (result.changed.length) {\r\n if (isItemChange) {\r\n that.trigger(SELECTED_ITEM_CHANGE, {\r\n items: result.changed\r\n });\r\n } else {\r\n that.value(that._getValues(result.unchanged));\r\n }\r\n }\r\n } else if (that.isFiltered() || that._skipUpdate || that._emptySearch) {\r\n that.focus(0);\r\n if (that._skipUpdate) {\r\n that._skipUpdate = false;\r\n that._selectedIndices = that._valueIndices(that._values, that._selectedIndices);\r\n }\r\n } else if (!skipUpdateOnBind && (!action || action === \"add\")) {\r\n that.value(that._values);\r\n }\r\n\r\n if (that._valueDeferred) {\r\n that._valueDeferred.resolve();\r\n }\r\n\r\n that.trigger(DATA_BOUND);\r\n },\r\n\r\n bound: function(bound) {\r\n if (bound === undefined$1) {\r\n return this._bound;\r\n }\r\n\r\n this._bound = bound;\r\n },\r\n\r\n isGrouped: function() {\r\n return (this.dataSource.group() || []).length;\r\n }\r\n });\r\n\r\n ui.plugin(StaticList);\r\n\r\n function last(list) {\r\n return list[list.length - 1];\r\n }\r\n\r\n function getSelectedOption(select) {\r\n var index = select.selectedIndex;\r\n return index > -1 ? select.options[index] : {};\r\n }\r\n\r\n function mapChangedItems(selected, itemsToMatch) {\r\n var itemsLength = itemsToMatch.length;\r\n var selectedLength = selected.length;\r\n var dataItem;\r\n var found;\r\n var i, j;\r\n\r\n var changed = [];\r\n var unchanged = [];\r\n\r\n if (selectedLength) {\r\n for (i = 0; i < selectedLength; i++) {\r\n dataItem = selected[i];\r\n found = false;\r\n\r\n for (j = 0; j < itemsLength; j++) {\r\n if (dataItem === itemsToMatch[j]) {\r\n found = true;\r\n changed.push({ index: i, item: dataItem });\r\n break;\r\n }\r\n }\r\n\r\n if (!found) {\r\n unchanged.push(dataItem);\r\n }\r\n }\r\n }\r\n\r\n return {\r\n changed: changed,\r\n unchanged: unchanged\r\n };\r\n }\r\n\r\n function isValidFilterExpr(expression) {\r\n if (!expression || $.isEmptyObject(expression)) {\r\n return false;\r\n }\r\n\r\n if (expression.filters && !expression.filters.length) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n function removeFiltersForField(expression, field) {\r\n var filters;\r\n var found = false;\r\n\r\n if (expression.filters) {\r\n filters = $.grep(expression.filters, function(filter) {\r\n found = removeFiltersForField(filter, field);\r\n if (filter.filters) {\r\n return filter.filters.length;\r\n } else {\r\n return filter.field != field;\r\n }\r\n });\r\n\r\n if (!found && expression.filters.length !== filters.length) {\r\n found = true;\r\n }\r\n\r\n expression.filters = filters;\r\n }\r\n\r\n return found;\r\n }\r\n\r\n kendo.cssProperties.registerPrefix(\"List\", \"k-list-\");\r\n\r\n })(window.kendo.jQuery);\r\n var kendo$1Z = kendo;\r\n\r\n let __meta__$1Y = {\r\n id: \"calendar\",\r\n name: \"Calendar\",\r\n category: \"web\",\r\n description: \"The Calendar widget renders a graphical calendar that supports navigation and selection.\",\r\n depends: [ \"core\", \"selectable\" ]\r\n };\r\n\r\n (function($, undefined$1) {\r\n let kendo = window.kendo,\r\n support = kendo.support,\r\n ui = kendo.ui,\r\n Widget = ui.Widget,\r\n keys = kendo.keys,\r\n parse = kendo.parseDate,\r\n encode = kendo.htmlEncode,\r\n adjustDST = kendo.date.adjustDST,\r\n weekInYear = kendo.date.weekInYear,\r\n Selectable = kendo.ui.Selectable,\r\n RangeSelectable = kendo.ui.RangeSelectable,\r\n extractFormat = kendo._extractFormat,\r\n template = kendo.template,\r\n getCulture = kendo.getCulture,\r\n transitionOrigin = \"transform-origin\",\r\n cellTemplate = template((data) => `${data.value}`),\r\n emptyCellTemplate = template(() => ''),\r\n otherMonthCellTemplate = template(() => ' '),\r\n weekNumberTemplate = template((data) => `${data.weekNumber}`),\r\n outerWidth = kendo._outerWidth,\r\n ns = \".kendoCalendar\",\r\n CLICK = \"click\" + ns,\r\n KEYDOWN_NS = \"keydown\" + ns,\r\n DOT = \".\",\r\n EMPTY = \" \",\r\n TABLE = \"table\",\r\n CALENDAR_VIEW = \"k-calendar-view\",\r\n ID = \"id\",\r\n MIN = \"min\",\r\n LEFT = \"left\",\r\n SLIDE = \"slideIn\",\r\n MONTH = \"month\",\r\n CENTURY = \"century\",\r\n CHANGE = \"change\",\r\n NAVIGATE = \"navigate\",\r\n VALUE = \"value\",\r\n HOVER = \"k-hover\",\r\n DISABLED = \"k-disabled\",\r\n FOCUSED = \"k-focus\",\r\n OTHERMONTH = \"k-other-month\",\r\n EMPTYCELL = \"k-empty\",\r\n TODAY = \"k-calendar-nav-today\",\r\n CELLSELECTOR = \"td:has(.k-link)\",\r\n START = \"start\",\r\n END = \"end\",\r\n CELLSELECTORVALID = \"td:has(.k-link):not(.\" + DISABLED + \"):not(.\" + EMPTYCELL + \")\",\r\n WEEKCOLUMNSELECTOR = \"td:not(:has(.k-link))\",\r\n SELECTED = \"k-selected\",\r\n BLUR = \"blur\" + ns,\r\n FOCUS = \"focus\",\r\n FOCUS_WITH_NS = FOCUS + ns,\r\n MOUSEENTER = support.touch ? \"touchstart\" : \"mouseenter\",\r\n MOUSEENTER_WITH_NS = support.touch ? \"touchstart\" + ns : \"mouseenter\" + ns,\r\n MOUSELEAVE = support.touch ? \"touchend\" + ns + \" touchmove\" + ns : \"mouseleave\" + ns,\r\n MS_PER_MINUTE = 60000,\r\n MS_PER_DAY = 86400000,\r\n PREVARROW = \"_prevArrow\",\r\n NEXTARROW = \"_nextArrow\",\r\n ARIA_DISABLED = \"aria-disabled\",\r\n ARIA_SELECTED = \"aria-selected\",\r\n ARIA_LABEL = \"aria-label\",\r\n extend = $.extend,\r\n DATE = Date,\r\n views = {\r\n month: 0,\r\n year: 1,\r\n decade: 2,\r\n century: 3\r\n },\r\n HEADERSELECTOR = '.k-header, .k-calendar-header',\r\n CLASSIC_HEADER_TEMPLATE = ({ actionAttr, size, isRtl }) => `
    \r\n ${kendo.ui.icon({ icon: `caret-alt-${isRtl ? \"right\" : \"left\"}`, iconClass: \"k-button-icon\" })}\r\n \r\n ${kendo.ui.icon({ icon: `caret-alt-${isRtl ? \"left\" : \"right\"}`, iconClass: \"k-button-icon\" })}\r\n
    `,\r\n MODERN_HEADER_TEMPLATE = ({ actionAttr, size, messages, isRtl }) => `
    \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
    `;\r\n\r\n var Calendar = Widget.extend({\r\n init: function(element, options) {\r\n var that = this, value, id;\r\n options = options || {};\r\n options.componentType = options.componentType || \"classic\";\r\n Widget.fn.init.call(that, element, options);\r\n\r\n element = that.wrapper = that.element;\r\n options = that.options;\r\n\r\n options.url = kendo.unescape(options.url);\r\n\r\n that.options.disableDates = getDisabledExpr(that.options.disableDates);\r\n\r\n that._templates();\r\n\r\n that._selectable();\r\n\r\n that._header();\r\n\r\n that._viewWrapper();\r\n\r\n if (that.options.hasFooter) {\r\n that._footer(that.footer);\r\n } else {\r\n that._today = that.element.find('.k-calendar-nav-today');\r\n that._toggle();\r\n }\r\n\r\n id = element\r\n .addClass(\"k-calendar k-calendar-md \" + (options.weekNumber ? \" k-week-number\" : \"\"))\r\n .on(MOUSEENTER_WITH_NS + \" \" + MOUSELEAVE, CELLSELECTOR, mousetoggle)\r\n .on(KEYDOWN_NS, \"table.k-calendar-table\", that._move.bind(that))\r\n .on(CLICK + \" touchend\", CELLSELECTORVALID, function(e) {\r\n var link = e.currentTarget.firstChild,\r\n value = toDateObject(link);\r\n\r\n if ($(link).data(\"href\").indexOf(\"#\") != -1) {\r\n e.preventDefault();\r\n }\r\n\r\n if (that._view.name == \"month\" && that.options.disableDates(value)) {\r\n return;\r\n }\r\n if (that._view.name != \"month\" || that._isSingleSelection()) {\r\n that._click($(link));\r\n }\r\n })\r\n .on(\"mouseup\" + ns, \"table.k-calendar-table, .k-calendar-footer\", function() {\r\n that._focusView(that.options.focusOnNav !== false);\r\n })\r\n .attr(ID);\r\n\r\n if (that.options.weekNumber) {\r\n element.on(CLICK, WEEKCOLUMNSELECTOR, function(e) {\r\n var first = $(e.currentTarget).closest(\"tr\").find(CELLSELECTORVALID).first(),\r\n last = $(e.currentTarget).closest(\"tr\").find(CELLSELECTORVALID).last();\r\n\r\n if (that._isMultipleSelection()) {\r\n that.selectable._lastActive = last;\r\n that.selectable.selectRange(first, last);\r\n that.selectable.trigger(CHANGE, { event: e });\r\n }\r\n\r\n if (that._isRangeSelection()) {\r\n that.rangeSelectable._lastActive = last;\r\n that.rangeSelectable.range(first, last);\r\n that.rangeSelectable.change();\r\n }\r\n\r\n that._current = that._value = toDateObject(last.find(\"span\"));\r\n that._setCurrent(that._current);\r\n });\r\n }\r\n\r\n normalize(options);\r\n value = parse(options.value, options.format, options.culture);\r\n that._selectDates = [];\r\n\r\n that._index = views[options.start];\r\n\r\n that._current = new DATE(+restrictValue(value, options.min, options.max));\r\n\r\n that._addClassProxy = function() {\r\n that._active = true;\r\n\r\n if (that._cell.hasClass(DISABLED)) {\r\n var todayString = that._view.toDateString(getToday());\r\n that._cell = that._cellByDate(todayString);\r\n }\r\n\r\n that._cell.addClass(FOCUSED);\r\n };\r\n\r\n that._removeClassProxy = function() {\r\n that._active = false;\r\n if (that._cell) {\r\n that._cell.removeClass(FOCUSED);\r\n }\r\n };\r\n\r\n that.value(value);\r\n\r\n if (that._isMultipleSelection() && options.selectDates.length > 0) {\r\n that.selectDates(options.selectDates);\r\n }\r\n\r\n that._range = options.range;\r\n\r\n if (that._isRangeSelection()) {\r\n that.selectRange(that._range);\r\n }\r\n\r\n kendo.notify(that);\r\n },\r\n\r\n options: {\r\n name: \"Calendar\",\r\n value: null,\r\n min: new DATE(1900, 0, 1),\r\n max: new DATE(2099, 11, 31),\r\n dates: [],\r\n disableDates: null,\r\n allowReverse: false,\r\n centuryCellsFormat: \"long\",\r\n url: \"\",\r\n culture: \"\",\r\n footer: \"\",\r\n format: \"\",\r\n month: {},\r\n weekNumber: false,\r\n range: { start: null, end: null, target: START },\r\n selectable: \"single\",\r\n selectDates: [],\r\n start: MONTH,\r\n depth: MONTH,\r\n size: \"medium\",\r\n showOtherMonthDays: true,\r\n animation: {\r\n horizontal: {\r\n effects: SLIDE,\r\n reverse: true,\r\n duration: 500,\r\n divisor: 2\r\n },\r\n vertical: {\r\n effects: \"zoomIn\",\r\n duration: 400\r\n }\r\n },\r\n messages: {\r\n weekColumnHeader: \"\",\r\n today: \"Today\",\r\n navigateTo: \"Navigate to \",\r\n parentViews: {\r\n month: \"year view\",\r\n year: \"decade view\",\r\n decade: \"century view\"\r\n }\r\n },\r\n componentType: \"classic\"\r\n },\r\n\r\n events: [\r\n CHANGE,\r\n NAVIGATE\r\n ],\r\n\r\n componentTypes: {\r\n \"classic\": {\r\n header: {\r\n template: CLASSIC_HEADER_TEMPLATE\r\n },\r\n hasFooter: true,\r\n linksSelector: \".k-button\",\r\n contentClasses: \"k-calendar-table\"\r\n },\r\n \"modern\": {\r\n header: {\r\n template: MODERN_HEADER_TEMPLATE\r\n },\r\n hasFooter: false,\r\n linksSelector: \".k-button\",\r\n contentClasses: \"k-calendar-table\"\r\n }\r\n },\r\n\r\n setOptions: function(options) {\r\n var that = this;\r\n\r\n normalize(options);\r\n\r\n options.disableDates = getDisabledExpr(options.disableDates);\r\n that._destroySelectable();\r\n\r\n if (options.messages) {\r\n options.messages = $.extend({}, true, that.options.messages, options.messages);\r\n }\r\n\r\n Widget.fn.setOptions.call(that, options);\r\n\r\n that._templates();\r\n\r\n that._selectable();\r\n\r\n that._viewWrapper();\r\n\r\n if (that.options.hasFooter) {\r\n that._footer(that.footer);\r\n } else {\r\n that.element.find(\".k-calendar-footer\").hide();\r\n that._toggle();\r\n }\r\n that._index = views[that.options.start];\r\n\r\n that.navigate();\r\n\r\n if (options.weekNumber) {\r\n that.element.addClass('k-week-number');\r\n }\r\n },\r\n\r\n destroy: function() {\r\n var that = this,\r\n today = that._today;\r\n\r\n that.element.off(ns);\r\n that._title.off(ns);\r\n that[PREVARROW].off(ns);\r\n that[NEXTARROW].off(ns);\r\n that._destroySelectable();\r\n kendo.destroy(that._table);\r\n\r\n if (today) {\r\n kendo.destroy(today.off(ns));\r\n }\r\n\r\n Widget.fn.destroy.call(that);\r\n },\r\n\r\n current: function() {\r\n return this._current;\r\n },\r\n\r\n view: function() {\r\n return this._view;\r\n },\r\n\r\n focus: function(table) {\r\n table = table || this._table;\r\n this._bindTable(table);\r\n table.trigger(\"focus\");\r\n },\r\n\r\n min: function(value) {\r\n return this._option(MIN, value);\r\n },\r\n\r\n max: function(value) {\r\n return this._option(\"max\", value);\r\n },\r\n\r\n navigateToPast: function() {\r\n this._navigate(PREVARROW, -1);\r\n },\r\n\r\n navigateToFuture: function() {\r\n this._navigate(NEXTARROW, 1);\r\n },\r\n\r\n navigateUp: function() {\r\n var that = this,\r\n index = that._index;\r\n\r\n if (that._title.hasClass(DISABLED)) {\r\n return;\r\n }\r\n\r\n that.navigate(that._current, ++index);\r\n },\r\n\r\n navigateDown: function(value) {\r\n var that = this,\r\n index = that._index,\r\n depth = that.options.depth;\r\n\r\n if (!value) {\r\n return;\r\n }\r\n\r\n if (index === views[depth]) {\r\n if (!isEqualDate(that._value, that._current) || !isEqualDate(that._value, value)) {\r\n that.value(value);\r\n that.trigger(CHANGE);\r\n }\r\n return;\r\n }\r\n\r\n that.navigate(value, --index);\r\n },\r\n\r\n navigate: function(value, view) {\r\n view = isNaN(view) ? views[view] : view;\r\n\r\n var that = this,\r\n options = that.options,\r\n culture = options.culture,\r\n min = options.min,\r\n max = options.max,\r\n title = that._title,\r\n from = that._table,\r\n old = that._oldTable,\r\n currentValue = that._current,\r\n future = value && +value > +currentValue,\r\n vertical = view !== undefined$1 && view !== that._index,\r\n to, currentView, compare,\r\n disabled,\r\n viewWrapper = that.element.children(\".k-calendar-view\");\r\n\r\n if (!value) {\r\n value = currentValue;\r\n }\r\n\r\n that._current = value = new DATE(+restrictValue(value, min, max));\r\n\r\n if (view === undefined$1) {\r\n view = that._index;\r\n } else {\r\n that._index = view;\r\n }\r\n\r\n that._view = currentView = calendar.views[view];\r\n compare = currentView.compare;\r\n\r\n disabled = view === views[CENTURY];\r\n title.toggleClass(DISABLED, disabled).attr(ARIA_DISABLED, disabled);\r\n\r\n disabled = compare(value, min) < 1;\r\n that[PREVARROW].toggleClass(DISABLED, disabled).attr(ARIA_DISABLED, disabled);\r\n\r\n disabled = compare(value, max) > -1;\r\n that[NEXTARROW].toggleClass(DISABLED, disabled).attr(ARIA_DISABLED, disabled);\r\n\r\n if (from && old && old.data(\"animating\")) {\r\n old.kendoStop(true, true);\r\n from.kendoStop(true, true);\r\n }\r\n\r\n that._oldTable = from;\r\n\r\n if (!from || that._changeView) {\r\n title.html('' + currentView.title(value, min, max, culture) + '');\r\n\r\n if (that.options.messages.parentViews && that._view.name !== CENTURY) {\r\n title.attr(\"title\", encode(that.options.messages.navigateTo + that.options.messages.parentViews[that._view.name]));\r\n } else {\r\n title.removeAttr(\"title\");\r\n }\r\n\r\n that._table = to = $(currentView.content(extend({\r\n min: min,\r\n max: max,\r\n date: value,\r\n url: options.url,\r\n dates: options.dates,\r\n format: options.format,\r\n showOtherMonthDays: options.showOtherMonthDays,\r\n centuryCellsFormat: options.centuryCellsFormat,\r\n culture: culture,\r\n disableDates: options.disableDates,\r\n isWeekColumnVisible: options.weekNumber,\r\n messages: options.messages,\r\n contentClasses: that.options.contentClasses\r\n }, that[currentView.name])));\r\n\r\n that._aria();\r\n\r\n var replace = from && from.data(\"start\") === to.data(\"start\");\r\n that._animate({\r\n from: from,\r\n to: to,\r\n vertical: vertical,\r\n future: future,\r\n replace: replace\r\n });\r\n\r\n viewWrapper.removeClass(\"k-calendar-monthview k-calendar-yearview k-calendar-decadeview k-calendar-centuryview\");\r\n viewWrapper.addClass(\"k-calendar-\" + currentView.name + \"view\");\r\n\r\n that.trigger(NAVIGATE);\r\n\r\n that._focus(value);\r\n }\r\n\r\n if (view === views[options.depth] && that._selectDates.length > 0) {\r\n that._visualizeSelectedDatesInView();\r\n }\r\n\r\n if (that._isSingleSelection()) {\r\n if (view === views[options.depth] && that._value && !that.options.disableDates(that._value)) {\r\n that._selectCell(that._value);\r\n }\r\n }\r\n\r\n that._setCurrent(value);\r\n\r\n if (!from && that._cell) {\r\n that._cell.removeClass(FOCUSED);\r\n }\r\n\r\n that._changeView = true;\r\n },\r\n\r\n selectDates: function(dates) {\r\n var that = this,\r\n validSelectedDates,\r\n datesUnique;\r\n\r\n if (dates === undefined$1) {\r\n return that._selectDates;\r\n }\r\n\r\n datesUnique = dates\r\n .map(function(date) { return date.getTime(); })\r\n .filter(function(date, position, array) {\r\n return array.indexOf(date) === position;\r\n })\r\n .map(function(time) { return new Date(time); });\r\n\r\n validSelectedDates = $.grep(datesUnique, function(value) {\r\n if (value) {\r\n return +that._validateValue(new Date(value.setHours(0, 0, 0, 0))) === +value;\r\n }\r\n });\r\n that._selectDates = validSelectedDates.length > 0 ? validSelectedDates : (datesUnique.length === 0 ? datesUnique : that._selectDates);\r\n that._visualizeSelectedDatesInView();\r\n },\r\n\r\n value: function(value) {\r\n var that = this,\r\n old = that._view,\r\n view = that._view;\r\n\r\n if (value === undefined$1) {\r\n return that._value;\r\n }\r\n\r\n value = that._validateValue(value);\r\n if (value && that._isMultipleSelection()) {\r\n var date = new Date(+value);\r\n date.setHours(0, 0, 0, 0);\r\n that._selectDates = [date];\r\n that.selectable._lastActive = null;\r\n }\r\n\r\n if (old && value === null && that._cell) {\r\n that._cell.removeClass(SELECTED);\r\n } else {\r\n that._changeView = !value || view && view.compare(value, that._current) !== 0;\r\n that.navigate(value);\r\n }\r\n },\r\n\r\n isRtl: function() {\r\n return kendo.support.isRtl(this.wrapper);\r\n },\r\n\r\n _aria: function() {\r\n var table = this._table;\r\n\r\n table.attr(\"aria-labelledby\", this._title.attr(\"id\"));\r\n\r\n if (this._view.name === \"month\" && this._isMultipleSelection()) {\r\n table.attr(\"aria-multiselectable\", \"true\");\r\n }\r\n },\r\n\r\n _validateValue: function(value) {\r\n var that = this,\r\n options = that.options,\r\n min = options.min,\r\n max = options.max;\r\n\r\n if (value === null) {\r\n that._current = createDate(that._current.getFullYear(), that._current.getMonth(), that._current.getDate());\r\n }\r\n\r\n value = parse(value, options.format, options.culture);\r\n\r\n if (value !== null) {\r\n value = new DATE(+value);\r\n\r\n if (!isInRange(value, min, max)) {\r\n value = null;\r\n }\r\n }\r\n\r\n if (value === null || !that.options.disableDates(new Date(+value))) {\r\n that._value = value;\r\n } else if (that._value === undefined$1) {\r\n that._value = null;\r\n }\r\n\r\n return that._value;\r\n },\r\n\r\n _visualizeSelectedDatesInView: function() {\r\n var that = this;\r\n var selectedDates = {};\r\n $.each(that._selectDates, function(index, value) {\r\n selectedDates[kendo.calendar.views[0].toDateString(value)] = value;\r\n });\r\n that.selectable.clear();\r\n var cells = that._table\r\n .find(CELLSELECTOR)\r\n .filter(function(index, element) {\r\n return selectedDates[$(element.firstChild).attr(kendo.attr(VALUE))];\r\n });\r\n if (cells.length > 0) {\r\n that.selectable._selectElement(cells, true);\r\n }\r\n },\r\n\r\n _isSingleSelection: function() {\r\n let selectable = this.options.selectable,\r\n selectableOptions = Selectable.parseOptions(selectable);\r\n return selectableOptions.single;\r\n },\r\n\r\n _isMultipleSelection: function() {\r\n let selectable = this.options.selectable,\r\n selectableOptions = Selectable.parseOptions(selectable);\r\n return selectableOptions.multiple;\r\n },\r\n\r\n _isRangeSelection: function() {\r\n let selectable = this.options.selectable,\r\n selectableOptions = Selectable.parseOptions(selectable);\r\n return selectableOptions.range;\r\n },\r\n\r\n _selectable: function() {\r\n let that = this,\r\n selectable = that.options.selectable,\r\n selectableOptions = Selectable.parseOptions(selectable);\r\n\r\n if (!that._isMultipleSelection() && !that._isRangeSelection()) {\r\n return;\r\n }\r\n\r\n if (that.rangeSelectable) {\r\n that.rangeSelectable.destroy();\r\n that.rangeSelectable = null;\r\n }\r\n\r\n if (selectableOptions.range) {\r\n that.rangeSelectable = new RangeSelectable(that.wrapper, {\r\n widget: that,\r\n filter: \".k-calendar-monthview table \" + CELLSELECTORVALID,\r\n cellSelector: CELLSELECTOR,\r\n cellSelectorValid: CELLSELECTORVALID,\r\n change: that._onSelect.bind(that),\r\n reverse: that.options.allowReverse,\r\n resetOnStart: true,\r\n ns: ns\r\n });\r\n\r\n that.element.addClass(\"k-calendar-range\");\r\n } else {\r\n that.selectable = new Selectable(that.wrapper, {\r\n aria: true,\r\n //excludes the anchor element\r\n inputSelectors: \"input,textarea,.k-multiselect-wrap,select,button,.k-button>span,.k-button>img,span.k-icon.k-i-caret-alt-down,span.k-icon.k-i-caret-alt-up,span.k-svg-icon.k-svg-i-caret-alt-down,span.k-svg-icon.k-svg-i-caret-alt-up\",\r\n multiple: selectableOptions.multiple,\r\n filter: \"table.k-calendar-table:eq(0) \" + CELLSELECTORVALID,\r\n change: that._onSelect.bind(that),\r\n relatedTarget: that._onRelatedTarget.bind(that)\r\n });\r\n }\r\n },\r\n\r\n _restoreSelection: function() {\r\n const that = this;\r\n let range;\r\n\r\n that._preventChange = true;\r\n\r\n if (that._isRangeSelection()) {\r\n range = that.selectRange();\r\n\r\n if (!range || !range.start) {\r\n that._preventChange = false;\r\n return;\r\n }\r\n\r\n that.selectRange(range);\r\n }\r\n\r\n that._preventChange = false;\r\n },\r\n\r\n selectRange: function(range) {\r\n const that = this, view = that._view;\r\n let startInRange, endInRange, visibleRange;\r\n\r\n if (range === undefined$1) {\r\n return that._range;\r\n }\r\n\r\n that._range = range;\r\n\r\n if (!range.start) {\r\n return;\r\n }\r\n\r\n visibleRange = that._visibleRange();\r\n\r\n startInRange = that._dateInViews(range.start);\r\n endInRange = range.end && that._dateInViews(range.end);\r\n\r\n if (!startInRange && endInRange) {\r\n that.rangeSelectable.selectTo(that._cellByDate(view.toDateString(range.end)));\r\n }\r\n\r\n if (startInRange && endInRange) {\r\n that.rangeSelectable.range(that._cellByDate(view.toDateString(range.start)), that._cellByDate(view.toDateString(range.end)), false, that.options.allowReverse);\r\n }\r\n\r\n if (range.end && startInRange && !endInRange) {\r\n that.rangeSelectable.selectFrom(that._cellByDate(view.toDateString(range.start)));\r\n }\r\n\r\n if (!range.end && startInRange) {\r\n that.rangeSelectable.start(that._cellByDate(view.toDateString(range.start)));\r\n }\r\n\r\n if (+visibleRange.start > +range.start && +visibleRange.end < +range.end) {\r\n that.rangeSelectable.mid(that.element.find(CELLSELECTORVALID));\r\n }\r\n },\r\n\r\n _onRelatedTarget: function(target) {\r\n var that = this;\r\n\r\n if (that.selectable.options.multiple && target.is(CELLSELECTORVALID)) {\r\n that._current = toDateObject(target.find(\"span\"));\r\n that._setCurrent(that._current);\r\n }\r\n\r\n },\r\n\r\n _onSelect: function(e) {\r\n let that = this,\r\n eventArgs = e,\r\n range,\r\n useEnd = e.sender._useEnd,\r\n useStart = e.sender._useStart,\r\n initialRange,\r\n start,\r\n end,\r\n value,\r\n target,\r\n selectableOptions = Selectable.parseOptions(that.options.selectable);\r\n\r\n if (that._isRangeSelection()) {\r\n range = e.sender.range();\r\n initialRange = that.selectRange() || {};\r\n target = initialRange.target;\r\n if (range.start && range.start.length) {\r\n start = toDateObject(range.start.find(\"span\"));\r\n }\r\n\r\n if (range.end && range.end.length) {\r\n end = toDateObject(range.end.find(\"span\"));\r\n }\r\n\r\n if (target === END) {\r\n target = START;\r\n } else {\r\n target = END;\r\n }\r\n\r\n that._range = { start: useStart ? initialRange.start : start, end: useEnd ? initialRange.end : end, target: target };\r\n\r\n if (!that._preventChange) {\r\n that.trigger(CHANGE);\r\n }\r\n\r\n value = end || start;\r\n\r\n if (end && !that._dateInViews(end)) {\r\n value = start;\r\n }\r\n\r\n that.selectRange(that._range);\r\n that.value(value);\r\n return;\r\n }\r\n\r\n if (!selectableOptions.multiple) {\r\n if ($(eventArgs.event.currentTarget).is(\"td\") && !$(eventArgs.event.currentTarget).hasClass(\"k-selected\")) {\r\n $(eventArgs.event.currentTarget).addClass(\"k-selected\");\r\n }\r\n else {\r\n that._click($(eventArgs.event.currentTarget).find(\"span\"));\r\n }\r\n return;\r\n }\r\n\r\n if (eventArgs.event.ctrlKey || eventArgs.event.metaKey) {\r\n if ($(eventArgs.event.currentTarget).is(CELLSELECTORVALID)) {\r\n that._toggleSelection($(eventArgs.event.currentTarget));\r\n }\r\n else {\r\n that._cellsBySelector(CELLSELECTORVALID).each(function(index, element) {\r\n var value = toDateObject($(element).find(\"span\"));\r\n that._deselect(value);\r\n });\r\n that._addSelectedCellsToArray();\r\n }\r\n }\r\n else if (eventArgs.event.shiftKey) {\r\n that._rangeSelection(that._cell);\r\n }\r\n else if ($(eventArgs.event.currentTarget).is(CELLSELECTOR)) {\r\n that.value(toDateObject($(eventArgs.event.currentTarget).find(\"span\")));\r\n }\r\n else {\r\n that._selectDates = [];\r\n that._addSelectedCellsToArray();\r\n }\r\n that.trigger(CHANGE);\r\n },\r\n\r\n _destroySelectable: function() {\r\n var that = this;\r\n\r\n if (that.selectable) {\r\n that.selectable.destroy();\r\n that.selectable = null;\r\n }\r\n\r\n if (that.rangeSelectable) {\r\n that.rangeSelectable.destroy();\r\n that.rangeSelectable = null;\r\n }\r\n },\r\n\r\n //when ctrl key is clicked\r\n _toggleSelection: function(currentCell) {\r\n var that = this,\r\n date = toDateObject(currentCell.find(\"span\"));\r\n if (currentCell.hasClass(\"k-selected\")) {\r\n that._selectDates.push(date);\r\n }\r\n else {\r\n that._deselect(date);\r\n }\r\n },\r\n\r\n //shift selection\r\n _rangeSelection: function(toDateCell, startDate) {\r\n var that = this,\r\n fromDate = startDate || toDateObject(that.selectable.value().first().find(\"span\")),\r\n toDate = toDateObject(toDateCell.find(\"span\")),\r\n daysDifference;\r\n\r\n if (that.selectable._lastActive || that._value) {\r\n fromDate = that.selectable._lastActive ? toDateObject(that.selectable._lastActive.find(\"span\")) : new Date(+that._value);\r\n } else {\r\n that.selectable._lastActive = startDate ? that._cellByDate(that._view.toDateString(startDate), CELLSELECTORVALID) : that.selectable.value().first();\r\n }\r\n\r\n that._selectDates = [];\r\n daysDifference = daysBetweenTwoDates(fromDate, toDate);\r\n addDaysToArray(that._selectDates, daysDifference, fromDate, that.options.disableDates);\r\n\r\n that._visualizeSelectedDatesInView();\r\n },\r\n\r\n _visibleRange: function() {\r\n let table = this.element.find(DOT + CALENDAR_VIEW + EMPTY + TABLE),\r\n firstDateInView = toDateObject(table.first().find(CELLSELECTOR).first().find(\"span\")),\r\n lastDateInView = toDateObject(table.last().find(CELLSELECTOR).last().find(\"span\"));\r\n return { start: firstDateInView, end: lastDateInView };\r\n },\r\n\r\n _cellsBySelector: function(selector) {\r\n var that = this;\r\n return that._table.find(selector);\r\n },\r\n\r\n _addSelectedCellsToArray: function() {\r\n var that = this;\r\n that.selectable.value().each(function(index, item) {\r\n var date = toDateObject($(item.firstChild));\r\n if (!that.options.disableDates(date)) {\r\n that._selectDates.push(date);\r\n }\r\n });\r\n },\r\n\r\n _deselect: function(date) {\r\n var that = this;\r\n var currentDateIndex = that._selectDates.map(Number).indexOf(+date);\r\n if (currentDateIndex != -1) {\r\n that._selectDates.splice(currentDateIndex, 1);\r\n }\r\n },\r\n\r\n _dateInView: function(date) {\r\n var that = this,\r\n firstDateInView = toDateObject(that._cellsBySelector(CELLSELECTORVALID).first().find(\"span\")),\r\n lastDateInView = toDateObject(that._cellsBySelector(CELLSELECTORVALID).last().find(\"span\"));\r\n\r\n return +date <= +lastDateInView && +date >= +firstDateInView;\r\n },\r\n\r\n _isNavigatable: function(currentValue, cellIndex) {\r\n var that = this;\r\n var isDisabled = that.options.disableDates;\r\n var cell;\r\n var index;\r\n\r\n if (that._view.name == \"month\") {\r\n return !isDisabled(currentValue);\r\n } else {\r\n index = that.wrapper.find(\".\" + FOCUSED).index();\r\n cell = that.wrapper.find(\".k-calendar-table td\").eq(index + cellIndex);\r\n return cell.is(CELLSELECTORVALID) || !isDisabled(currentValue);\r\n }\r\n },\r\n\r\n _dateInViews: function(date) {\r\n let that = this,\r\n tables = that.element.find(\".k-calendar-view table\"),\r\n firstDateInView = toDateObject(tables.first().find(CELLSELECTOR).first().find(\"span\")),\r\n lastDateInView = toDateObject(tables.last().find(CELLSELECTOR).last().find(\"span\"));\r\n\r\n date = new Date(date.toDateString());\r\n\r\n return +date <= +lastDateInView && +date >= +firstDateInView;\r\n },\r\n\r\n _move: function(e) {\r\n var that = this,\r\n options = that.options,\r\n key = e.keyCode,\r\n view = that._view,\r\n index = that._index,\r\n min = that.options.min,\r\n max = that.options.max,\r\n currentValue = new DATE(+that._current),\r\n isRtl = that.isRtl(),\r\n isDisabled = that.options.disableDates,\r\n value, prevent, method, temp, cell, focusedCell, lastActive;\r\n\r\n if (e.target === that._table[0]) {\r\n that._active = true;\r\n }\r\n\r\n if (key == keys.RIGHT && !isRtl || key == keys.LEFT && isRtl) {\r\n value = 1;\r\n prevent = true;\r\n } else if (key == keys.LEFT && !isRtl || key == keys.RIGHT && isRtl) {\r\n value = -1;\r\n prevent = true;\r\n } else if (key == keys.UP) {\r\n value = index === 0 ? -7 : -4;\r\n prevent = true;\r\n } else if (key == keys.DOWN) {\r\n value = index === 0 ? 7 : 4;\r\n prevent = true;\r\n } else if (key == keys.SPACEBAR) {\r\n value = 0;\r\n prevent = true;\r\n } else if (key == keys.HOME || key == keys.END) {\r\n method = key == keys.HOME ? \"first\" : \"last\";\r\n temp = view[method](currentValue);\r\n currentValue = new DATE(temp.getFullYear(), temp.getMonth(), temp.getDate(), currentValue.getHours(), currentValue.getMinutes(), currentValue.getSeconds(), currentValue.getMilliseconds());\r\n currentValue.setFullYear(temp.getFullYear());\r\n prevent = true;\r\n } else if (key === 84) {\r\n that._todayClick(e);\r\n prevent = true;\r\n }\r\n\r\n if (e.ctrlKey || e.metaKey) {\r\n if (key == keys.RIGHT && !isRtl || key == keys.LEFT && isRtl) {\r\n that.navigateToFuture();\r\n prevent = true;\r\n } else if (key == keys.LEFT && !isRtl || key == keys.RIGHT && isRtl) {\r\n that.navigateToPast();\r\n prevent = true;\r\n } else if (key == keys.UP) {\r\n that.navigateUp();\r\n prevent = true;\r\n } else if (key == keys.DOWN) {\r\n that._click($(that._cell[0].firstChild));\r\n prevent = true;\r\n }\r\n else if ((key == keys.ENTER || key == keys.SPACEBAR) && that._isMultipleSelection()) {\r\n that._keyboardToggleSelection(e);\r\n\r\n var focusedDate = toDateObject($(that._cell[0]).find(\"span\"));\r\n that._setCurrent(focusedDate);\r\n\r\n }\r\n } else if (e.shiftKey) {\r\n if (value !== undefined$1 || method) {\r\n if (!method) {\r\n view.setDate(currentValue, value);\r\n }\r\n\r\n if (!isInRange(currentValue, min, max)) {\r\n currentValue = restrictValue(currentValue, options.min, options.max);\r\n }\r\n\r\n if (isDisabled(currentValue)) {\r\n currentValue = that._nextNavigatable(currentValue, value);\r\n }\r\n\r\n min = createDate(min.getFullYear(), min.getMonth(), min.getDate());\r\n if (that._isMultipleSelection()) {\r\n that._keyboardRangeSelection(e, currentValue);\r\n } else if (that._isRangeSelection()) {\r\n if (!that._dateInViews(currentValue)) {\r\n if (value > 0) {\r\n that.navigateToFuture();\r\n } else {\r\n that.navigateToPast();\r\n }\r\n }\r\n } else {\r\n that._focus(currentValue);\r\n }\r\n }\r\n\r\n if (that.rangeSelectable) {\r\n cell = that._cellByDate(view.toDateString(currentValue));\r\n lastActive = toDateObject((that.rangeSelectable._lastActive || focusedCell).find(\"span\"));\r\n if (!that._dateInViews(lastActive)) {\r\n if (+lastActive > +currentValue) {\r\n that.rangeSelectable._end = that.rangeSelectable._lastActive;\r\n that.rangeSelectable.selectFrom(cell);\r\n } else {\r\n that.rangeSelectable.selectTo(cell);\r\n }\r\n } else {\r\n if (that.rangeSelectable._end && that.rangeSelectable._end.is(\".\" + FOCUSED)) {\r\n that.rangeSelectable._lastActive = that.rangeSelectable._start;\r\n } else {\r\n that.rangeSelectable._lastActive = that._cellByDate(view.toDateString(lastActive));\r\n }\r\n that.rangeSelectable.range(that.rangeSelectable._lastActive, cell);\r\n }\r\n that.rangeSelectable.change();\r\n that._setCurrent(currentValue);\r\n }\r\n } else {\r\n if (key == keys.ENTER || key == keys.SPACEBAR) {\r\n if (view.name == \"month\" && that._isMultipleSelection()) {\r\n that.value(toDateObject($(that._cell.find(\"span\"))));\r\n that.selectable._lastActive = $(that._cell[0]);\r\n that.trigger(CHANGE);\r\n } else if (that.rangeSelectable) {\r\n that.rangeSelectable.change();\r\n } else {\r\n that._click($(that._cell[0].firstChild));\r\n }\r\n prevent = true;\r\n } else if (key == keys.PAGEUP) {\r\n prevent = true;\r\n that.navigateToPast();\r\n } else if (key == keys.PAGEDOWN) {\r\n prevent = true;\r\n that.navigateToFuture();\r\n }\r\n\r\n if (value || method) {\r\n if (!method) {\r\n view.setDate(currentValue, value);\r\n }\r\n\r\n min = createDate(min.getFullYear(), min.getMonth(), min.getDate());\r\n\r\n if (!isInRange(currentValue, min, max)) {\r\n currentValue = restrictValue(currentValue, options.min, options.max);\r\n }\r\n\r\n if (!that._isNavigatable(currentValue, value)) {\r\n currentValue = that._nextNavigatable(currentValue, value);\r\n }\r\n\r\n if (that._isMultipleSelection()) {\r\n if (!that._dateInView(currentValue)) {\r\n that.navigate(currentValue);\r\n }\r\n else {\r\n that._current = currentValue;\r\n that._setCurrent(currentValue);\r\n }\r\n }\r\n else {\r\n that._focus(currentValue);\r\n }\r\n }\r\n }\r\n\r\n if (prevent) {\r\n e.preventDefault();\r\n }\r\n\r\n return that._current;\r\n },\r\n\r\n _keyboardRangeSelection: function(event, currentValue) {\r\n var that = this,\r\n fromDate,\r\n daysDifference;\r\n\r\n if (!that._dateInView(currentValue)) {\r\n that._selectDates = [];\r\n\r\n fromDate = that.selectable._lastActive ? toDateObject(that.selectable._lastActive.find(\"span\")) : currentValue;\r\n daysDifference = daysBetweenTwoDates(fromDate, new Date(+currentValue));\r\n\r\n addDaysToArray(that._selectDates, daysDifference, fromDate, that.options.disableDates);\r\n\r\n that.navigate(currentValue);\r\n that._current = currentValue;\r\n that.selectable._lastActive = that.selectable._lastActive || that._cellByDate(that._view.toDateString(currentValue), CELLSELECTORVALID);\r\n that.trigger(CHANGE);\r\n return;\r\n }\r\n that.selectable.options.filter = that.wrapper.find(\"table\").length > 1 && +currentValue > +that._current ? \"table.k-calendar-table:eq(1) \" + CELLSELECTORVALID : \"table.k-calendar-table:eq(0) \" + CELLSELECTORVALID;\r\n that._setCurrent(currentValue);\r\n that._current = currentValue;\r\n\r\n that._rangeSelection(that._cellByDate(that._view.toDateString(currentValue), CELLSELECTORVALID), currentValue);\r\n\r\n that.trigger(CHANGE);\r\n\r\n that.selectable.options.filter = \"table.k-calendar-table:eq(0) \" + CELLSELECTORVALID;\r\n },\r\n\r\n _keyboardToggleSelection: function(event) {\r\n var that = this;\r\n\r\n event.currentTarget = that._cell[0];\r\n that.selectable._lastActive = $(that._cell[0]);\r\n\r\n if ($(that._cell[0]).hasClass(SELECTED)) {\r\n that.selectable._unselect($(that._cell[0]));\r\n }\r\n else {\r\n that.selectable.value($(that._cell[0]));\r\n }\r\n that.selectable.trigger(CHANGE, { event: event });\r\n },\r\n\r\n _nextNavigatable: function(currentValue, value) {\r\n var that = this,\r\n disabled = true,\r\n view = that._view,\r\n min = that.options.min,\r\n max = that.options.max,\r\n isDisabled = that.options.disableDates,\r\n navigatableDate = new Date(currentValue.getTime());\r\n\r\n view.setDate(navigatableDate, -value);\r\n\r\n while (disabled) {\r\n view.setDate(currentValue, value);\r\n\r\n if (!isInRange(currentValue, min, max)) {\r\n currentValue = navigatableDate;\r\n break;\r\n }\r\n disabled = isDisabled(currentValue);\r\n }\r\n return currentValue;\r\n },\r\n\r\n _animate: function(options) {\r\n var that = this;\r\n var from = options.from;\r\n var to = options.to;\r\n var active = that._active;\r\n var viewWrapper = that.element.children(\".k-calendar-view\");\r\n\r\n if (!from) {\r\n viewWrapper.append(to);\r\n that._bindTable(to);\r\n } else if (from.parent().data(\"animating\")) {\r\n from.off(ns);\r\n from.parent().kendoStop(true, true).remove();\r\n from.remove();\r\n\r\n viewWrapper.append(to);\r\n that._focusView(active);\r\n } else if (!from.is(\":visible\") || that.options.animation === false || options.replace) {\r\n to.insertAfter(from);\r\n from.off(ns).remove();\r\n\r\n that._focusView(active);\r\n } else {\r\n that[options.vertical ? \"_vertical\" : \"_horizontal\"](from, to, options.future);\r\n }\r\n },\r\n\r\n _horizontal: function(from, to, future) {\r\n var that = this,\r\n active = that._active,\r\n horizontal = that.options.animation.horizontal,\r\n effects = horizontal.effects,\r\n viewWidth = outerWidth(from),\r\n margin = (outerWidth(from, true) - viewWidth);\r\n\r\n if (effects && effects.indexOf(SLIDE) != -1) {\r\n from.add(to).css({ width: viewWidth });\r\n\r\n from.wrap(\"
    \");\r\n\r\n that._focusView(active, from);\r\n\r\n from.parent()\r\n .css({\r\n position: \"relative\",\r\n width: (viewWidth * 2) + (2 * margin),\r\n display: \"flex\",\r\n \"margin-left\": future ? 0 : (-viewWidth - margin)\r\n });\r\n\r\n to[future ? \"insertAfter\" : \"insertBefore\"](from);\r\n\r\n extend(horizontal, {\r\n effects: SLIDE + \":\" + (future ? \"right\" : LEFT),\r\n complete: function() {\r\n from.off(ns).remove();\r\n that._oldTable = null;\r\n\r\n to.unwrap();\r\n\r\n that._focusView(active);\r\n\r\n }\r\n });\r\n\r\n from.parent().kendoStop(true, true).kendoAnimate(horizontal);\r\n }\r\n },\r\n\r\n _vertical: function(from, to) {\r\n var that = this,\r\n vertical = that.options.animation.vertical,\r\n effects = vertical.effects,\r\n active = that._active, //active state before from's blur\r\n cell, position;\r\n\r\n if (effects && effects.indexOf(\"zoom\") != -1) {\r\n to.insertBefore(from);\r\n\r\n from.css({\r\n position: \"absolute\",\r\n width: to.width()\r\n });\r\n\r\n if (transitionOrigin) {\r\n cell = that._cellByDate(that._view.toDateString(that._current));\r\n position = cell.position();\r\n position = (position.left + parseInt(cell.width() / 2, 10)) + \"px\" + \" \" + (position.top + parseInt(cell.height() / 2, 10) + \"px\");\r\n to.css(transitionOrigin, position);\r\n }\r\n\r\n from.kendoStop(true, true).kendoAnimate({\r\n effects: \"fadeOut\",\r\n duration: 600,\r\n complete: function() {\r\n from.off(ns).remove();\r\n that._oldTable = null;\r\n\r\n that._focusView(active);\r\n }\r\n });\r\n\r\n to.kendoStop(true, true).kendoAnimate(vertical);\r\n }\r\n },\r\n\r\n _cellByDate: function(value, selector) {\r\n return this._table.find(selector ? selector : \"td:not(.\" + OTHERMONTH + \")\")\r\n .filter(function() {\r\n return $(this.firstChild).attr(kendo.attr(VALUE)) === value;\r\n });\r\n },\r\n\r\n _selectCell: function(date) {\r\n var that = this,\r\n cell = that._selectedCell,\r\n value = that._view.toDateString(date);\r\n\r\n if (cell && cell[0]) {\r\n cell[0].removeAttribute(ARIA_SELECTED);\r\n cell.removeClass(SELECTED);\r\n }\r\n\r\n cell = that._cellByDate(value, CELLSELECTOR);\r\n\r\n that._selectedCell = cell;\r\n cell.addClass(SELECTED)\r\n .attr(ARIA_SELECTED, true);\r\n },\r\n\r\n _setCurrent: function(date) {\r\n var that = this,\r\n id = kendo.guid(),\r\n cell = that._cell,\r\n value = that._view.toDateString(date);\r\n\r\n if (cell && cell[0]) {\r\n cell.removeClass(FOCUSED);\r\n cell[0].removeAttribute(ARIA_LABEL);\r\n cell[0].removeAttribute(ID);\r\n }\r\n\r\n cell = that._cellByDate(value, that._isMultipleSelection() ? CELLSELECTOR : \"td:not(.\" + OTHERMONTH + \")\");\r\n\r\n that._cell = cell;\r\n\r\n cell.attr(ID, id)\r\n .addClass(FOCUSED);\r\n\r\n if (that._table[0]) {\r\n that._table[0].removeAttribute(\"aria-activedescendant\");\r\n that._table.attr(\"aria-activedescendant\", id);\r\n }\r\n },\r\n\r\n _bindTable: function(table) {\r\n table\r\n .on(FOCUS_WITH_NS, this._addClassProxy)\r\n .on(BLUR, this._removeClassProxy);\r\n },\r\n\r\n _click: function(link) {\r\n var that = this,\r\n options = that.options,\r\n currentValue = new Date(+that._current),\r\n value = toDateObject(link);\r\n\r\n adjustDST(value, 0);\r\n\r\n if (that._view.name == \"month\" && that.options.disableDates(value)) {\r\n value = that._value;\r\n }\r\n\r\n that._view.setDate(currentValue, value);\r\n\r\n that.navigateDown(restrictValue(currentValue, options.min, options.max));\r\n },\r\n\r\n _focus: function(value) {\r\n var that = this,\r\n view = that._view;\r\n\r\n if (view.compare(value, that._current) !== 0) {\r\n that.navigate(value);\r\n } else {\r\n that._current = value;\r\n that._setCurrent(value);\r\n }\r\n },\r\n\r\n _focusView: function(active, table) {\r\n if (active) {\r\n this.focus(table);\r\n }\r\n },\r\n\r\n _viewWrapper: function() {\r\n var that = this;\r\n var element = that.element;\r\n var viewWrapper = element.children(\".k-calendar-view\");\r\n\r\n if (!viewWrapper[0]) {\r\n viewWrapper = $(\"
    \").insertAfter(element.find(HEADERSELECTOR));\r\n }\r\n },\r\n\r\n _footer: function(template) {\r\n var that = this,\r\n today = getToday(),\r\n element = that.element,\r\n footer = element.find(\".k-calendar-footer\");\r\n\r\n if (!template) {\r\n that._toggle(false);\r\n footer.hide();\r\n return;\r\n }\r\n\r\n if (!footer[0]) {\r\n footer = $(`
    \r\n \r\n
    `).appendTo(element);\r\n }\r\n\r\n that._today = footer.show()\r\n .find(\".k-button-flat-primary\")\r\n .attr(\"title\", kendo.toString(today, \"D\", that.options.culture));\r\n\r\n footer.find(\".k-button-text\")\r\n .html(template(today));\r\n\r\n that._toggle();\r\n },\r\n\r\n _header: function() {\r\n var that = this,\r\n element = that.element,\r\n linksSelector = that.options.linksSelector;\r\n\r\n if (!element.find(HEADERSELECTOR)[0]) {\r\n element.html(kendo.template(that.options.header.template)($.extend(true,{}, that.options, {\r\n actionAttr: kendo.attr(\"action\"),\r\n size: kendo.getValidCssClass(\"k-button-\", \"size\", that.options.size),\r\n isRtl: that.isRtl()\r\n })));\r\n }\r\n\r\n element.find(linksSelector)\r\n .on(CLICK + \" touchend\" + ns, function() { return false; } );\r\n\r\n that._title = element.find('[' + kendo.attr(\"action\") + '=\"nav-up\"]').on(CLICK + \" touchend\" + ns, function() {\r\n that._active = that.options.focusOnNav !== false;\r\n that.navigateUp();\r\n });\r\n that[PREVARROW] = element.find('[' + kendo.attr(\"action\") + '=\"prev\"]').on(CLICK + \" touchend\" + ns, function() {\r\n that._active = that.options.focusOnNav !== false;\r\n that.navigateToPast();\r\n });\r\n that[NEXTARROW] = element.find('[' + kendo.attr(\"action\") + '=\"next\"]').on(CLICK + \" touchend\" + ns, function() {\r\n that._active = that.options.focusOnNav !== false;\r\n that.navigateToFuture();\r\n });\r\n element.find('[' + kendo.attr(\"action\") + '=\"today\"]').on(CLICK + \" touchend\" + ns, that._todayClick.bind(that));\r\n\r\n },\r\n\r\n _navigate: function(arrow, modifier) {\r\n var that = this,\r\n index = that._index + 1,\r\n currentValue = new DATE(+that._current);\r\n\r\n if (that._isMultipleSelection()) {\r\n var firstDayCurrentMonth = that._table.find(\"td:not(.\" + OTHERMONTH + \"):not(.\" + EMPTYCELL + \")\").has(\".k-link\").first();\r\n currentValue = toDateObject(firstDayCurrentMonth.find(\"span\"));\r\n that._current = new Date(+currentValue);\r\n }\r\n\r\n arrow = that[arrow];\r\n\r\n if (!arrow.hasClass(DISABLED)) {\r\n if (index > 3) {\r\n currentValue.setFullYear(currentValue.getFullYear() + 100 * modifier);\r\n } else {\r\n calendar.views[index].setDate(currentValue, modifier);\r\n }\r\n\r\n that.navigate(currentValue);\r\n that._restoreSelection();\r\n }\r\n },\r\n\r\n _option: function(option, value) {\r\n var that = this,\r\n options = that.options,\r\n currentValue = that._value || that._current,\r\n isBigger;\r\n\r\n if (value === undefined$1) {\r\n return options[option];\r\n }\r\n\r\n value = parse(value, options.format, options.culture);\r\n\r\n if (!value) {\r\n return;\r\n }\r\n\r\n options[option] = new DATE(+value);\r\n\r\n if (option === MIN) {\r\n isBigger = value > currentValue;\r\n } else {\r\n isBigger = currentValue > value;\r\n }\r\n\r\n if (isBigger || isEqualMonth(currentValue, value)) {\r\n if (isBigger) {\r\n that._value = null;\r\n }\r\n that._changeView = true;\r\n }\r\n\r\n if (!that._changeView) {\r\n that._changeView = !!(options.month.content || options.month.empty);\r\n }\r\n\r\n that.navigate(that._value);\r\n\r\n that._toggle();\r\n },\r\n\r\n _toggle: function(toggle) {\r\n var that = this,\r\n options = that.options,\r\n isTodayDisabled = that.options.disableDates(getToday()),\r\n link = that._today,\r\n todayClass = that._todayClass();\r\n\r\n if (toggle === undefined$1) {\r\n toggle = isInRange(getToday(), options.min, options.max);\r\n }\r\n\r\n if (link) {\r\n link.off(CLICK);\r\n\r\n if (toggle && !isTodayDisabled) {\r\n link.addClass(todayClass)\r\n .removeClass(DISABLED)\r\n .on(CLICK, that._todayClick.bind(that));\r\n } else {\r\n link.removeClass(todayClass)\r\n .addClass(DISABLED)\r\n .on(CLICK, prevent);\r\n }\r\n }\r\n },\r\n\r\n _todayClass: function() {\r\n return TODAY;\r\n },\r\n\r\n _todayClick: function(e) {\r\n var that = this,\r\n depth = views[that.options.depth],\r\n disabled = that.options.disableDates,\r\n today = getToday();\r\n\r\n e.preventDefault();\r\n\r\n if (disabled(today)) {\r\n return;\r\n }\r\n\r\n if (that._view.compare(that._current, today) === 0 && that._index == depth) {\r\n that._changeView = false;\r\n }\r\n\r\n if (that._isMultipleSelection()) {\r\n that._selectDates = [today];\r\n that.selectable._lastActive = null;\r\n }\r\n\r\n that._value = today;\r\n that.navigate(today, depth);\r\n\r\n that.trigger(CHANGE);\r\n },\r\n\r\n _templates: function() {\r\n var that = this,\r\n options = that.options,\r\n footer = options.footer,\r\n month = options.month,\r\n content = month.content,\r\n weekNumber = month.weekNumber,\r\n empty = month.empty,\r\n footerTemplate = (data) => `${kendo.toString(data,\"D\",options.culture)}`;\r\n\r\n that.month = {\r\n content: (data) => `${executeTemplate(content, data) || data.value}`,\r\n empty: (data) => `${executeTemplate(empty, data) || \" \"}`,\r\n weekNumber: (data) => `${executeTemplate(weekNumber, data) || data.weekNumber}`\r\n };\r\n\r\n that.year = {\r\n content: template((data) => `${data.value}`)\r\n };\r\n\r\n if (footer && footer !== true) {\r\n footerTemplate = footer;\r\n }\r\n\r\n that.footer = footer !== false ? template(footerTemplate, { useWithBlock: false }) : null;\r\n },\r\n\r\n _updateAria: function(ariaTemplate, date) {\r\n var that = this;\r\n var cell = that._cell;\r\n var valueType = that.view().valueType();\r\n var current = date || that.current();\r\n var text;\r\n\r\n if (valueType === \"month\") {\r\n text = kendo.toString(current, \"MMMM\");\r\n } else if (valueType === \"date\") {\r\n text = kendo.toString(current, \"D\");\r\n } else {\r\n text = cell.text();\r\n }\r\n\r\n cell.attr(\"aria-label\", ariaTemplate({ current: current, valueType: valueType, text: text }));\r\n\r\n return cell.attr(\"id\");\r\n }\r\n });\r\n\r\n ui.plugin(Calendar);\r\n\r\n var calendar = {\r\n firstDayOfMonth: function(date) {\r\n return createDate(\r\n date.getFullYear(),\r\n date.getMonth(),\r\n 1\r\n );\r\n },\r\n\r\n firstVisibleDay: function(date, calendarInfo) {\r\n calendarInfo = calendarInfo || kendo.culture().calendar;\r\n\r\n var firstDay = calendarInfo.firstDay,\r\n firstVisibleDay = new DATE(date.getFullYear(), date.getMonth(), 1, date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds());\r\n firstVisibleDay.setFullYear(date.getFullYear());\r\n\r\n while (firstVisibleDay.getDay() != firstDay) {\r\n calendar.setTime(firstVisibleDay, -1 * MS_PER_DAY);\r\n }\r\n\r\n return firstVisibleDay;\r\n },\r\n\r\n setTime: function(date, time) {\r\n var tzOffsetBefore = date.getTimezoneOffset(),\r\n resultDATE = new DATE(date.getTime() + time),\r\n tzOffsetDiff = resultDATE.getTimezoneOffset() - tzOffsetBefore;\r\n\r\n date.setTime(resultDATE.getTime() + tzOffsetDiff * MS_PER_MINUTE);\r\n },\r\n views: [{\r\n name: MONTH,\r\n title: function(date, min, max, culture) {\r\n return getCalendarInfo(culture).months.names[date.getMonth()] + \" \" + date.getFullYear();\r\n },\r\n content: function(options) {\r\n var that = this,\r\n idx = 0,\r\n min = options.min,\r\n max = options.max,\r\n date = options.date,\r\n dates = options.dates,\r\n format = options.format,\r\n culture = options.culture,\r\n navigateUrl = options.url,\r\n showHeader = options.showHeader,\r\n showOtherMonthDays = options.showOtherMonthDays,\r\n isWeekColumnVisible = options.isWeekColumnVisible,\r\n hasUrl = navigateUrl && dates[0],\r\n currentCalendar = getCalendarInfo(culture),\r\n firstDayIdx = currentCalendar.firstDay,\r\n days = currentCalendar.days,\r\n names = shiftArray(days.names, firstDayIdx),\r\n shortNames = shiftArray(days.namesShort, firstDayIdx),\r\n start = calendar.firstVisibleDay(date, currentCalendar),\r\n firstDayOfMonth = that.first(date),\r\n lastDayOfMonth = that.last(date),\r\n toDateString = that.toDateString,\r\n today = getToday(),\r\n contentClasses = options.contentClasses,\r\n html = '';\r\n\r\n if (showHeader) {\r\n html += '';\r\n }\r\n\r\n html += '';\r\n\r\n if (isWeekColumnVisible) {\r\n html += '';\r\n }\r\n\r\n for (; idx < 7; idx++) {\r\n html += '';\r\n }\r\n\r\n adjustDST(today, 0);\r\n today = +today;\r\n\r\n return view({\r\n cells: 42,\r\n perRow: 7,\r\n html: html += '',\r\n start: createDate(start.getFullYear(), start.getMonth(), start.getDate()),\r\n isWeekColumnVisible: isWeekColumnVisible,\r\n weekNumber: options.weekNumber,\r\n min: createDate(min.getFullYear(), min.getMonth(), min.getDate()),\r\n max: createDate(max.getFullYear(), max.getMonth(), max.getDate()),\r\n showOtherMonthDays: showOtherMonthDays,\r\n content: options.content,\r\n lastDayOfMonth: lastDayOfMonth,\r\n empty: options.empty,\r\n setter: that.setDate,\r\n disableDates: options.disableDates,\r\n build: function(date, idx, disableDates) {\r\n var cssClass = [ \"k-calendar-td\" ],\r\n day = date.getDay(),\r\n linkClass = \"\",\r\n url = \"#\";\r\n\r\n if (date < firstDayOfMonth || date > lastDayOfMonth) {\r\n cssClass.push(OTHERMONTH);\r\n }\r\n\r\n if (disableDates(date)) {\r\n cssClass.push(DISABLED);\r\n }\r\n\r\n if (+date === today) {\r\n cssClass.push(\"k-today\");\r\n }\r\n\r\n if (day === 0 || day === 6) {\r\n cssClass.push(\"k-weekend\");\r\n }\r\n\r\n if (hasUrl && inArray(+date, dates)) {\r\n url = navigateUrl.replace(\"{0}\", kendo.toString(date, format, culture));\r\n linkClass = \" k-action-link\";\r\n }\r\n\r\n return {\r\n date: date,\r\n dates: dates,\r\n ns: kendo.ns,\r\n title: kendo.toString(date, \"D\", culture),\r\n value: date.getDate(),\r\n dateString: toDateString(date),\r\n cssClass: cssClass.join(\" \"),\r\n linkClass: linkClass,\r\n url: url\r\n };\r\n },\r\n weekNumberBuild: function(date) {\r\n return {\r\n weekNumber: weekInYear(date, kendo.culture().calendar.firstDay),\r\n currentDate: date\r\n };\r\n }\r\n });\r\n },\r\n first: function(date) {\r\n return calendar.firstDayOfMonth(date);\r\n },\r\n last: function(date) {\r\n var last = createDate(date.getFullYear(), date.getMonth() + 1, 0),\r\n first = calendar.firstDayOfMonth(date),\r\n timeOffset = Math.abs(last.getTimezoneOffset() - first.getTimezoneOffset());\r\n\r\n if (timeOffset) {\r\n last.setHours(first.getHours() + (timeOffset / 60));\r\n }\r\n\r\n return last;\r\n },\r\n compare: function(date1, date2) {\r\n var result,\r\n month1 = date1.getMonth(),\r\n year1 = date1.getFullYear(),\r\n month2 = date2.getMonth(),\r\n year2 = date2.getFullYear();\r\n\r\n if (year1 > year2) {\r\n result = 1;\r\n } else if (year1 < year2) {\r\n result = -1;\r\n } else {\r\n result = month1 == month2 ? 0 : month1 > month2 ? 1 : -1;\r\n }\r\n\r\n return result;\r\n },\r\n setDate: function(date, value) {\r\n var hours = date.getHours();\r\n if (value instanceof DATE) {\r\n date.setFullYear(value.getFullYear(), value.getMonth(), value.getDate());\r\n } else {\r\n calendar.setTime(date, value * MS_PER_DAY);\r\n }\r\n adjustDST(date, hours);\r\n },\r\n toDateString: function(date) {\r\n return date.getFullYear() + \"/\" + date.getMonth() + \"/\" + date.getDate();\r\n },\r\n valueType: function() {\r\n return \"date\";\r\n }\r\n },\r\n {\r\n name: \"year\",\r\n title: function(date) {\r\n return date.getFullYear();\r\n },\r\n content: function(options) {\r\n var calendarMonths = getCalendarInfo(options.culture).months,\r\n namesAbbr = calendarMonths.namesAbbr,\r\n namesFull = calendarMonths.names,\r\n toDateString = this.toDateString,\r\n min = options.min,\r\n max = options.max,\r\n html = \"\";\r\n\r\n if (options.showHeader) {\r\n html += '
    ' + this.title(date, min, max, culture) + '
    ' + encode(options.messages.weekColumnHeader) + '' + shortNames[idx] + '
    ';\r\n html += '';\r\n html += '';\r\n html += '';\r\n }\r\n\r\n return view({\r\n min: createDate(min.getFullYear(), min.getMonth(), 1),\r\n max: createDate(max.getFullYear(), max.getMonth(), 1),\r\n start: createDate(options.date.getFullYear(), 0, 1),\r\n html: html,\r\n setter: this.setDate,\r\n content: options.content,\r\n build: function(date) {\r\n var cssClass = [ \"k-calendar-td\" ];\r\n\r\n return {\r\n value: namesAbbr[date.getMonth()],\r\n label: namesFull[date.getMonth()],\r\n ns: kendo.ns,\r\n dateString: toDateString(date),\r\n cssClass: cssClass.join(\" \")\r\n };\r\n }\r\n });\r\n },\r\n first: function(date) {\r\n return createDate(date.getFullYear(), 0, date.getDate());\r\n },\r\n last: function(date) {\r\n return createDate(date.getFullYear(), 11, date.getDate());\r\n },\r\n compare: function(date1, date2) {\r\n return compare(date1, date2);\r\n },\r\n setDate: function(date, value) {\r\n var month,\r\n hours = date.getHours();\r\n\r\n if (value instanceof DATE) {\r\n month = value.getMonth();\r\n\r\n date.setFullYear(value.getFullYear(), month, date.getDate());\r\n\r\n if (month !== date.getMonth()) {\r\n date.setDate(0);\r\n }\r\n } else {\r\n month = date.getMonth() + value;\r\n\r\n date.setMonth(month);\r\n\r\n if (month > 11) {\r\n month -= 12;\r\n }\r\n\r\n if (month > 0 && date.getMonth() != month) {\r\n date.setDate(0);\r\n }\r\n }\r\n\r\n adjustDST(date, hours);\r\n },\r\n toDateString: function(date) {\r\n return date.getFullYear() + \"/\" + date.getMonth() + \"/1\";\r\n },\r\n valueType: function() {\r\n return \"month\";\r\n }\r\n },\r\n {\r\n name: \"decade\",\r\n title: function(date, min, max) {\r\n return title(date, min, max, 10);\r\n },\r\n content: function(options) {\r\n var year = options.date.getFullYear(),\r\n toDateString = this.toDateString,\r\n html = \"\";\r\n\r\n if (options.showHeader) {\r\n html += '
    ';\r\n html += this.title(options.date);\r\n html += '
    ';\r\n html += '';\r\n html += '';\r\n html += '';\r\n }\r\n\r\n return view({\r\n start: createDate(year - year % 10, 0, 1),\r\n min: createDate(options.min.getFullYear(), 0, 1),\r\n max: createDate(options.max.getFullYear(), 0, 1),\r\n showOtherMonthDays: options.showOtherMonthDays,\r\n html: html,\r\n setter: this.setDate,\r\n build: function(date, idx) {\r\n var cssClass = [ \"k-calendar-td\" ];\r\n\r\n if (idx === 10 || idx === 11) {\r\n cssClass.push(EMPTYCELL);\r\n }\r\n\r\n return {\r\n value: date.getFullYear(),\r\n ns: kendo.ns,\r\n dateString: toDateString(date),\r\n cssClass: cssClass.join(\" \")\r\n };\r\n }\r\n });\r\n },\r\n first: function(date) {\r\n var year = date.getFullYear();\r\n return createDate(year - year % 10, date.getMonth(), date.getDate());\r\n },\r\n last: function(date) {\r\n var year = date.getFullYear();\r\n return createDate(year - year % 10 + 9, date.getMonth(), date.getDate());\r\n },\r\n compare: function(date1, date2) {\r\n return compare(date1, date2, 10);\r\n },\r\n setDate: function(date, value) {\r\n setDate(date, value, 1);\r\n },\r\n toDateString: function(date) {\r\n return date.getFullYear() + \"/0/1\";\r\n },\r\n valueType: function() {\r\n return \"year\";\r\n }\r\n },\r\n {\r\n name: CENTURY,\r\n title: function(date, min, max) {\r\n return title(date, min, max, 100);\r\n },\r\n content: function(options) {\r\n var year = options.date.getFullYear(),\r\n min = options.min.getFullYear(),\r\n max = options.max.getFullYear(),\r\n toDateString = this.toDateString,\r\n minYear = min,\r\n maxYear = max,\r\n html = \"\";\r\n\r\n minYear = minYear - minYear % 10;\r\n maxYear = maxYear - maxYear % 10;\r\n\r\n if (maxYear - minYear < 10) {\r\n maxYear = minYear + 9;\r\n }\r\n\r\n if (options.showHeader) {\r\n html += '
    ';\r\n html += this.title(options.date, options.min, options.max);\r\n html += '
    ';\r\n html += '';\r\n html += '';\r\n html += '';\r\n }\r\n\r\n return view({\r\n start: createDate(year - year % 100, 0, 1),\r\n min: createDate(minYear, 0, 1),\r\n max: createDate(maxYear, 0, 1),\r\n showOtherMonthDays: options.showOtherMonthDays,\r\n html: html,\r\n setter: this.setDate,\r\n build: function(date, idx) {\r\n var cssClass = [ \"k-calendar-td\" ];\r\n var start = date.getFullYear(),\r\n end = start + 9;\r\n\r\n if (idx === 10 || idx === 11) {\r\n cssClass.push(EMPTYCELL);\r\n }\r\n\r\n if (start < min) {\r\n start = min;\r\n }\r\n\r\n if (end > max) {\r\n end = max;\r\n }\r\n\r\n return {\r\n ns: kendo.ns,\r\n value: options.centuryCellsFormat === \"long\" ? `${start} - ${end}` : start,\r\n dateString: toDateString(date),\r\n cssClass: cssClass.join(\" \")\r\n };\r\n }\r\n });\r\n },\r\n first: function(date) {\r\n var year = date.getFullYear();\r\n return createDate(year - year % 100, date.getMonth(), date.getDate());\r\n },\r\n last: function(date) {\r\n var year = date.getFullYear();\r\n return createDate(year - year % 100 + 99, date.getMonth(), date.getDate());\r\n },\r\n compare: function(date1, date2) {\r\n return compare(date1, date2, 100);\r\n },\r\n setDate: function(date, value) {\r\n setDate(date, value, 10);\r\n },\r\n toDateString: function(date) {\r\n var year = date.getFullYear();\r\n return (year - year % 10) + \"/0/1\";\r\n },\r\n valueType: function() {\r\n return \"decade\";\r\n }\r\n }]\r\n };\r\n\r\n function title(date, min, max, modular) {\r\n var start = date.getFullYear(),\r\n minYear = min.getFullYear(),\r\n maxYear = max.getFullYear(),\r\n end;\r\n\r\n start = start - start % modular;\r\n end = start + (modular - 1);\r\n\r\n if (start < minYear) {\r\n start = minYear;\r\n }\r\n if (end > maxYear) {\r\n end = maxYear;\r\n }\r\n\r\n return start + \"-\" + end;\r\n }\r\n\r\n function view(options) {\r\n var idx = 0,\r\n data,\r\n min = options.min,\r\n max = options.max,\r\n start = options.start,\r\n setter = options.setter,\r\n build = options.build,\r\n weekNumberBuild = options.weekNumberBuild,\r\n length = options.cells || 12,\r\n isWeekColumnVisible = options.isWeekColumnVisible,\r\n cellsPerRow = options.perRow || 4,\r\n showOtherMonthDays = options.showOtherMonthDays,\r\n lastDayOfMonth = options.lastDayOfMonth,\r\n weekNumber = options.weekNumber || weekNumberTemplate,\r\n content = options.content || cellTemplate,\r\n empty = options.empty || emptyCellTemplate,\r\n otherMonthTemplate = options.otherMonthCellTemplate || otherMonthCellTemplate,\r\n html = options.html || '
    ';\r\n html += this.title(options.date, options.min, options.max);\r\n html += '
    ';\r\n\r\n if (isWeekColumnVisible) {\r\n html += weekNumber(weekNumberBuild(start));\r\n }\r\n\r\n\r\n for (; idx < length; idx++) {\r\n if (idx > 0 && idx % cellsPerRow === 0) {\r\n html += '';\r\n if (isWeekColumnVisible) {\r\n html += showOtherMonthDays || (+start <= +lastDayOfMonth) ? weekNumber(weekNumberBuild(start)) : weekNumber({ weekNumber: \" \" });\r\n }\r\n }\r\n\r\n start = createDate(start.getFullYear(), start.getMonth(), start.getDate());\r\n adjustDST(start, 0);\r\n\r\n data = build(start, idx, options.disableDates);\r\n\r\n if (data.cssClass.indexOf(OTHERMONTH) !== -1 && !showOtherMonthDays) {\r\n html += otherMonthTemplate(data);\r\n } else {\r\n if (isInRange(start, min, max) && data.cssClass.indexOf(EMPTYCELL) === -1) {\r\n html += content(data);\r\n } else {\r\n html += empty(data);\r\n }\r\n }\r\n\r\n setter(start, 1);\r\n }\r\n\r\n return html + \"
    \";\r\n }\r\n\r\n function compare(date1, date2, modifier) {\r\n var year1 = date1.getFullYear(),\r\n start = date2.getFullYear(),\r\n end = start,\r\n result = 0;\r\n\r\n if (modifier) {\r\n start = start - start % modifier;\r\n end = start - start % modifier + modifier - 1;\r\n }\r\n\r\n if (year1 > end) {\r\n result = 1;\r\n } else if (year1 < start) {\r\n result = -1;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n function getToday() {\r\n var today = new DATE();\r\n return new DATE(today.getFullYear(), today.getMonth(), today.getDate());\r\n }\r\n\r\n function restrictValue(value, min, max) {\r\n var today = getToday();\r\n\r\n if (value) {\r\n today = new DATE(+value);\r\n }\r\n\r\n if (min > today) {\r\n today = new DATE(+min);\r\n } else if (max < today) {\r\n today = new DATE(+max);\r\n }\r\n return today;\r\n }\r\n\r\n function isInRange(date, min, max) {\r\n return +date >= +min && +date <= +max;\r\n }\r\n\r\n function shiftArray(array, idx) {\r\n return array.slice(idx).concat(array.slice(0, idx));\r\n }\r\n\r\n function setDate(date, value, multiplier) {\r\n value = value instanceof DATE ? value.getFullYear() : date.getFullYear() + multiplier * value;\r\n date.setFullYear(value);\r\n }\r\n\r\n function daysBetweenTwoDates(startDate, endDate) {\r\n if (+endDate < +startDate) {\r\n var temp = +startDate;\r\n calendar.views[0].setDate(startDate, endDate);\r\n calendar.views[0].setDate(endDate, new Date(temp));\r\n }\r\n var fromDateUTC = Date.UTC(startDate.getFullYear(), startDate.getMonth(), startDate.getDate());\r\n var endDateUTC = Date.UTC(endDate.getFullYear(), endDate.getMonth(), endDate.getDate());\r\n\r\n return Math.ceil((+endDateUTC - +fromDateUTC) / kendo.date.MS_PER_DAY);\r\n }\r\n\r\n function addDaysToArray(array, numberOfDays, fromDate, disableDates) {\r\n for (var i = 0; i <= numberOfDays; i++) {\r\n var nextDay = new Date(fromDate.getTime());\r\n nextDay = new Date(nextDay.setDate(nextDay.getDate() + i));\r\n if (!disableDates(nextDay)) {\r\n array.push(nextDay);\r\n }\r\n }\r\n }\r\n\r\n function mousetoggle(e) {\r\n var disabled = $(this).hasClass(\"k-disabled\");\r\n\r\n if (!disabled) {\r\n $(this).toggleClass(HOVER, MOUSEENTER.indexOf(e.type) > -1 || e.type == FOCUS);\r\n }\r\n }\r\n\r\n function prevent(e) {\r\n e.preventDefault();\r\n }\r\n\r\n // creates date with full year\r\n function createDate(year, month, date) {\r\n var dateObject = new DATE(year, month, date);\r\n dateObject.setFullYear(year, month, date);\r\n return dateObject;\r\n }\r\n\r\n function getCalendarInfo(culture) {\r\n return getCulture(culture).calendars.standard;\r\n }\r\n\r\n function normalize(options) {\r\n var start = views[options.start],\r\n depth = views[options.depth],\r\n culture = getCulture(options.culture);\r\n\r\n options.format = extractFormat(options.format || culture.calendars.standard.patterns.d);\r\n\r\n if (isNaN(start)) {\r\n start = 0;\r\n options.start = MONTH;\r\n }\r\n\r\n if (depth === undefined$1 || depth > start) {\r\n options.depth = MONTH;\r\n }\r\n\r\n if (options.dates === null) {\r\n options.dates = [];\r\n }\r\n }\r\n\r\n function inArray(date, dates) {\r\n for (var i = 0, length = dates.length; i < length; i++) {\r\n if (date === +dates[i]) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n function isEqualDatePart(value1, value2) {\r\n if (value1) {\r\n return value1.getFullYear() === value2.getFullYear() &&\r\n value1.getMonth() === value2.getMonth() &&\r\n value1.getDate() === value2.getDate();\r\n }\r\n\r\n return false;\r\n }\r\n\r\n function isEqualMonth(value1, value2) {\r\n if (value1) {\r\n return value1.getFullYear() === value2.getFullYear() &&\r\n value1.getMonth() === value2.getMonth();\r\n }\r\n\r\n return false;\r\n }\r\n\r\n\r\n function getDisabledExpr(option) {\r\n if (kendo.isFunction(option)) {\r\n return option;\r\n }\r\n\r\n if (Array.isArray(option)) {\r\n return createDisabledExpr(option);\r\n }\r\n return $.noop;\r\n }\r\n\r\n function convertDatesArray(dates) {\r\n var result = [];\r\n for (var i = 0; i < dates.length; i++) {\r\n result.push(dates[i].setHours(0, 0, 0, 0));\r\n }\r\n return result;\r\n }\r\n\r\n function createDisabledExpr(dates) {\r\n var callback,\r\n disabledDates = [],\r\n days = [\"su\", \"mo\", \"tu\", \"we\", \"th\", \"fr\", \"sa\"];\r\n\r\n if (dates[0] instanceof DATE) {\r\n disabledDates = convertDatesArray(dates);\r\n callback = (date) => !!(date && disabledDates.indexOf((new Date(date)).setHours(0, 0, 0, 0)) > -1);\r\n } else {\r\n disabledDates = dates.map(day => {\r\n day = day.slice(0,2).toLowerCase();\r\n let index = days.indexOf(day);\r\n if (index > -1) {\r\n return index;\r\n }\r\n });\r\n\r\n callback = (date) => !!(date && disabledDates.indexOf((new Date(date)).getDay()) > -1);\r\n }\r\n\r\n return callback;\r\n }\r\n\r\n function isEqualDate(oldValue, newValue) {\r\n if (oldValue instanceof Date && newValue instanceof Date) {\r\n oldValue = oldValue.getTime();\r\n newValue = newValue.getTime();\r\n }\r\n\r\n return oldValue === newValue;\r\n }\r\n\r\n function toDateObject(link) {\r\n var value = $(link).attr(kendo.attr(VALUE)).split(\"/\");\r\n //Safari cannot create correctly date from \"1/1/2090\"\r\n value = createDate(value[0], value[1], value[2]);\r\n\r\n return value;\r\n }\r\n\r\n // Backwards compatibility after CSP changes.\r\n function executeTemplate(tmpl, data) {\r\n if (tmpl) {\r\n if (kendo.isFunction(tmpl)) {\r\n return tmpl(data);\r\n }\r\n return template(tmpl)(data);\r\n }\r\n return undefined$1;\r\n }\r\n\r\n calendar.isEqualDatePart = isEqualDatePart;\r\n calendar.isEqualDate = isEqualDate;\r\n calendar.restrictValue = restrictValue;\r\n calendar.isInRange = isInRange;\r\n calendar.normalize = normalize;\r\n calendar.viewsEnum = views;\r\n calendar.disabled = getDisabledExpr;\r\n calendar.toDateObject = toDateObject;\r\n calendar.getToday = getToday;\r\n calendar.createDate = createDate;\r\n\r\n kendo.calendar = calendar;\r\n })(window.kendo.jQuery);\r\n var kendo$1Y = kendo;\r\n\r\n /******************************************************************************\r\n Copyright (c) Microsoft Corporation.\r\n\r\n Permission to use, copy, modify, and/or distribute this software for any\r\n purpose with or without fee is hereby granted.\r\n\r\n THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\n REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\n AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\n INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\n LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\n OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\n PERFORMANCE OF THIS SOFTWARE.\r\n ***************************************************************************** */\r\n /* global Reflect, Promise */\r\n\r\n var extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n };\r\n\r\n function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n }\r\n\r\n var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n };\r\n return __assign.apply(this, arguments);\r\n };\r\n\r\n function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n }\r\n\r\n function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n }\r\n\r\n function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n }\r\n\r\n function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n };\r\n\r\n function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n };\r\n\r\n function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n };\r\n\r\n function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n };\r\n\r\n function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n }\r\n\r\n function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n }\r\n\r\n function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n }\r\n\r\n var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n }) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n });\r\n\r\n function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n }\r\n\r\n function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n }\r\n\r\n function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n }\r\n\r\n /** @deprecated */\r\n function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n }\r\n\r\n /** @deprecated */\r\n function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n }\r\n\r\n function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n }\r\n\r\n function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n }\r\n\r\n function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n }\r\n\r\n function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n }\r\n\r\n function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n }\r\n\r\n function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n };\r\n\r\n var __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n }) : function(o, v) {\r\n o[\"default\"] = v;\r\n };\r\n\r\n function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n }\r\n\r\n function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n }\r\n\r\n function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n }\r\n\r\n function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n }\r\n\r\n function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n }\r\n\r\n var tslib_es6 = {\r\n __extends,\r\n __assign,\r\n __rest,\r\n __decorate,\r\n __param,\r\n __metadata,\r\n __awaiter,\r\n __generator,\r\n __createBinding,\r\n __exportStar,\r\n __values,\r\n __read,\r\n __spread,\r\n __spreadArrays,\r\n __spreadArray,\r\n __await,\r\n __asyncGenerator,\r\n __asyncDelegator,\r\n __asyncValues,\r\n __makeTemplateObject,\r\n __importStar,\r\n __importDefault,\r\n __classPrivateFieldGet,\r\n __classPrivateFieldSet,\r\n __classPrivateFieldIn,\r\n };\r\n\r\n /**\r\n * A function that clones the passed date. The parameter could be `null`.\r\n *\r\n * @param date - The initial date value.\r\n * @returns - A new `Date` instance.\r\n *\r\n * @example\r\n * ```ts-no-run\r\n * cloneDate(new Date(2016, 0, 1)); // returns new Date(2016, 0, 1);\r\n * cloneDate(null); // returns null\r\n * ```\r\n */\r\n var cloneDate = function (date) { return date ? new Date(date.getTime()) : null; };\r\n\r\n /**\r\n * @hidden\r\n */\r\n var adjustDST = function (date, hour) {\r\n var newDate = cloneDate(date);\r\n if (hour === 0 && newDate.getHours() === 23) {\r\n newDate.setHours(newDate.getHours() + 2);\r\n }\r\n return newDate;\r\n };\r\n\r\n /**\r\n * A function that adds and subtracts days from a `Date` object.\r\n *\r\n * @param date - The initial date value.\r\n * @param offset - The number of days to add and subtract from the date.\r\n * @returns - A new `Date` instance.\r\n *\r\n * @example\r\n * ```ts-no-run\r\n * addDays(new Date(2016, 0, 1), 5); // 2016-1-6\r\n * addDays(new Date(2016, 0, 1), -5); // 2015-12-26\r\n * ```\r\n */\r\n var addDays = function (date, offset) {\r\n var newDate = cloneDate(date);\r\n newDate.setDate(newDate.getDate() + offset);\r\n return adjustDST(newDate, date.getHours());\r\n };\r\n\r\n /**\r\n * A function which returns a new `Date` instance.\r\n *\r\n * @param year - The year value.\r\n * @param month - The month value.\r\n * @param day - The day value.\r\n * @param hours - The hours value.\r\n * @param minutes - The minutes value.\r\n * @param seconds - The seconds value.\r\n * @param milliseconds - milliseconds value.\r\n * @returns The date instance.\r\n *\r\n * @example\r\n * ```ts-no-run\r\n * createDate(2016, 0, 15); // 2016-01-15 00:00:00\r\n * createDate(2016, 0, 15, 22, 22, 20); // 2016-01-15 22:22:20\r\n * ```\r\n */\r\n var createDate = function (year, month, day, hours, minutes, seconds, milliseconds) {\r\n if (hours === void 0) { hours = 0; }\r\n if (minutes === void 0) { minutes = 0; }\r\n if (seconds === void 0) { seconds = 0; }\r\n if (milliseconds === void 0) { milliseconds = 0; }\r\n var date = new Date(year, month, day, hours, minutes, seconds, milliseconds);\r\n if (year > -1 && year < 100) {\r\n date.setFullYear(date.getFullYear() - 1900);\r\n }\r\n return adjustDST(date, hours);\r\n };\r\n\r\n /**\r\n * A function which returns the last date of the month.\r\n *\r\n * @param date - The initial date.\r\n * @returns - The last date of the initial date month.\r\n *\r\n * @example\r\n * ```ts-no-run\r\n * lastDayOfMonth(new Date(2016, 0, 15)); // 2016-01-31\r\n * ```\r\n */\r\n var lastDayOfMonth = function (date) {\r\n var newDate = createDate(date.getFullYear(), date.getMonth() + 1, 1, date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds());\r\n return addDays(newDate, -1);\r\n };\r\n\r\n var MONTHS_LENGTH = 12;\r\n var normalize = function (date, expectedMonth) { return (date.getMonth() !== expectedMonth ? lastDayOfMonth(addMonths(date, -1)) : date //tslint:disable-line:no-use-before-declare\r\n ); };\r\n /**\r\n * A function that adds and subtracts months from a `Date` object.\r\n *\r\n * @param date - The initial date value.\r\n * @param offset - The number of months to add or subtract from the date.\r\n * @returns - A new `Date` instance.\r\n *\r\n * @example\r\n * ```ts-no-run\r\n * addMonths(new Date(2016, 5, 1), 5); // 2016-11-1\r\n * addMonths(new Date(2016, 5, 1), -5); // 2015-1-1\r\n * ```\r\n */\r\n var addMonths = function (date, offset) {\r\n var newDate = cloneDate(date);\r\n var diff = (newDate.getMonth() + offset) % MONTHS_LENGTH;\r\n var expectedMonth = (MONTHS_LENGTH + diff) % MONTHS_LENGTH;\r\n newDate.setMonth(newDate.getMonth() + offset);\r\n return normalize(adjustDST(newDate, date.getHours()), expectedMonth);\r\n };\r\n\r\n /**\r\n * @hidden\r\n */\r\n var setYear = function (value, year) {\r\n var month = value.getMonth();\r\n var candidate = createDate(year, month, value.getDate(), value.getHours(), value.getMinutes(), value.getSeconds(), value.getMilliseconds());\r\n return candidate.getMonth() === month ? candidate : lastDayOfMonth(addMonths(candidate, -1));\r\n };\r\n\r\n /**\r\n * A function that adds and subtracts years from a `Date` object.\r\n *\r\n * @param date - The initial date value.\r\n * @param offset - The number of years to add or subtract from the date.\r\n * @returns - A new `Date` instance.\r\n *\r\n * @example\r\n * ```ts-no-run\r\n * addYears(new Date(2016, 5, 1), 5); // 2011-6-1\r\n * addYears(new Date(2016, 5, 1), -5); // 2021-6-1\r\n * ```\r\n */\r\n var addYears = function (value, offset) {\r\n return adjustDST(setYear(value, value.getFullYear() + offset), value.getHours());\r\n };\r\n\r\n /**\r\n * A function that adds and subtracts centuries from a `Date` object.\r\n *\r\n * @param date - The initial date value.\r\n * @param offset - The number of centuries to add or subtract from the date.\r\n * @returns - A new `Date` instance.\r\n *\r\n * @example\r\n * ```ts-no-run\r\n * addCenturies(new Date(2016, 5, 1), 5); // 2516-6-1\r\n * addCenturies(new Date(2016, 5, 1), -5); // 1516-6-1\r\n * ```\r\n */\r\n var addCenturies = function (value, offset) {\r\n return addYears(value, 100 * offset);\r\n };\r\n\r\n /**\r\n * A function that adds and subtracts decades from a `Date` object.\r\n *\r\n * @param date - The initial date value.\r\n * @param offset - The number of decades to add or subtract from the date.\r\n * @returns - A new `Date` instance.\r\n *\r\n * @example\r\n * ```ts-no-run\r\n * addDecades(new Date(2016, 5, 1), 5); // 2066-6-1\r\n * addDecades(new Date(2016, 5, 1), -5); // 1966-6-1\r\n * ```\r\n */\r\n var addDecades = function (value, offset) {\r\n return addYears(value, 10 * offset);\r\n };\r\n\r\n /**\r\n * A function that adds and subtracts weeks from a Date object.\r\n *\r\n * @param date - The initial date value.\r\n * @param offset - The number of weeks to add/subtract from the date.\r\n * @returns - A new `Date` instance.\r\n *\r\n * @example\r\n * ```ts-no-run\r\n * addWeeks(new Date(2016, 5, 1), 3); // 2016-6-22\r\n * addWeeks(new Date(2016, 5, 1), -3); // 2015-5-11\r\n * ```\r\n */\r\n var addWeeks = function (date, offset) {\r\n return addDays(date, offset * 7);\r\n };\r\n\r\n /**\r\n * The number of milliseconds in one minute.\r\n */\r\n var MS_PER_MINUTE$1 = 60000;\r\n /**\r\n * The number of milliseconds in one hour.\r\n */\r\n var MS_PER_HOUR = 3600000;\r\n /**\r\n * The number of milliseconds in one standard day.\r\n */\r\n var MS_PER_DAY = 86400000;\r\n\r\n // tslint:disable:max-line-length\r\n /**\r\n * An enumeration which represents the horizontal direction. The `Forward` option moves forward. The `Backward` option moves backward.\r\n */\r\n var Direction;\r\n (function (Direction) {\r\n /**\r\n * The `Forward` value with an underlying `1` number value.\r\n */\r\n Direction[Direction[\"Forward\"] = 1] = \"Forward\";\r\n /**\r\n * The `Backward` value with an underlying `-1` (minus one) number value.\r\n */\r\n Direction[Direction[\"Backward\"] = -1] = \"Backward\";\r\n })(Direction || (Direction = {}));\r\n // tslint:enable:max-line-length\r\n\r\n /**\r\n * @hidden\r\n *\r\n * A function which returns the next or previous date for a specific week day. For example, `Day.Monday`.\r\n *\r\n * @param date - The date to calculate from.\r\n * @param weekDay - The `Day` enum specifying the desired week day.\r\n * @param direction - The `Direction` enum specifying the calculation direction.\r\n * @returns - A `Date` instance.\r\n *\r\n * @example\r\n * ```ts-no-run\r\n * dayOfWeek(new Date(2016, 0, 1), Day.Wednesday, Direction.Forward); // 2016-01-06, Wednesday\r\n * dayOfWeek(new Date(2016, 0, 1), Day.Wednesday, Direction.Backward); // 2015-12-30, Wednesday\r\n * ```\r\n */\r\n var dayOfWeek = function (date, weekDay, direction) {\r\n if (direction === void 0) { direction = Direction.Forward; }\r\n var newDate = cloneDate(date);\r\n var newDay = ((weekDay - newDate.getDay()) + (7 * direction)) % 7;\r\n newDate.setDate(newDate.getDate() + newDay);\r\n return adjustDST(newDate, date.getHours());\r\n };\r\n\r\n /**\r\n * Enumeration which represents the week days.\r\n */\r\n var Day;\r\n (function (Day) {\r\n /**\r\n * The Sunday value with an underlying `0` number value.\r\n */\r\n Day[Day[\"Sunday\"] = 0] = \"Sunday\";\r\n /**\r\n * The Monday value with an underlying `1` number value.\r\n */\r\n Day[Day[\"Monday\"] = 1] = \"Monday\";\r\n /**\r\n * The Tuesday value with an underlying `2` number value.\r\n */\r\n Day[Day[\"Tuesday\"] = 2] = \"Tuesday\";\r\n /**\r\n * The Wednesday value with an underlying `3` number value.\r\n */\r\n Day[Day[\"Wednesday\"] = 3] = \"Wednesday\";\r\n /**\r\n * The Thursday value with an underlying `4` number value.\r\n */\r\n Day[Day[\"Thursday\"] = 4] = \"Thursday\";\r\n /**\r\n * The Friday value with an underlying `5` number value.\r\n */\r\n Day[Day[\"Friday\"] = 5] = \"Friday\";\r\n /**\r\n * The Saturday value with an underlying `6` number value.\r\n */\r\n Day[Day[\"Saturday\"] = 6] = \"Saturday\";\r\n })(Day || (Day = {}));\r\n\r\n /**\r\n * @hidden\r\n */\r\n var normalizeYear = function (value, year) { return (setYear(value, year(value.getFullYear()))); };\r\n\r\n /**\r\n * A function that returns a `Date` object of the first decade in a century.\r\n *\r\n * @param date - The start date value.\r\n * @returns - The first year in a century.\r\n *\r\n * @example\r\n * ```ts-no-run\r\n * firstDecadeOfCentury(new Date(2017, 0, 1)); // 2000-1-1\r\n * firstDecadeOfCentury(new Date(2007, 10, 22)); // 2000-11-22\r\n * firstDecadeOfCentury(new Date(2126, 0, 1)); // 2100-1-1\r\n * ```\r\n */\r\n var firstDecadeOfCentury = function (value) { return (normalizeYear(value, function (y) { return y - (y % 100); })); };\r\n\r\n /**\r\n * A function that calculates duration in centuries between two `Date` objects.\r\n *\r\n * @param start - The start date value.\r\n * @param end - The end date value.\r\n * @returns - The duration in months.\r\n *\r\n * @example\r\n * ```ts-no-run\r\n * durationInCenturies(new Date(2016, 0, 1), new Date(3216, 0, 1)); // 12\r\n * durationInCenturies(new Date(2016, 6, 1), new Date(2617, 0, 1)); // 6\r\n * durationInCenturies(new Date(2016, 0, 1), new Date(2016, 0, 1)); // 0\r\n * ```\r\n */\r\n var durationInCenturies = function (start, end) { return ((firstDecadeOfCentury(end).getFullYear() - firstDecadeOfCentury(start).getFullYear()) / 100); };\r\n\r\n /**\r\n * A function that returns a `Date` object of the first year in a decade.\r\n *\r\n * @param date - The start date value.\r\n * @returns - The first year in a decade.\r\n *\r\n * @example\r\n * ```ts-no-run\r\n * firstYearOfDecade(new Date(2017, 0, 1)); // 2010-1-1\r\n * firstYearOfDecade(new Date(2007, 10, 22)); // 2000-11-22\r\n * firstYearOfDecade(new Date(2026, 0, 1)); // 2020-1-1\r\n * ```\r\n */\r\n var firstYearOfDecade = function (value) { return (normalizeYear(value, function (y) { return y - (y % 10); })); };\r\n\r\n /**\r\n * A function that calculates duration in decades between two `Date` objects.\r\n *\r\n * @param start - The start date value.\r\n * @param end - The end date value.\r\n * @returns - The duration in months.\r\n *\r\n * @example\r\n * ```ts-no-run\r\n * durationInDecades(new Date(2016, 0, 1), new Date(2136, 0, 1)); // 12\r\n * durationInDecades(new Date(2016, 0, 1), new Date(2016, 0, 1)); // 0\r\n * ```\r\n */\r\n var durationInDecades = function (start, end) { return ((firstYearOfDecade(end).getFullYear() - firstYearOfDecade(start).getFullYear()) / 10); };\r\n\r\n /**\r\n * A function that calculates duration in months between two `Date` objects.\r\n *\r\n * @param start - The start date value.\r\n * @param end - The end date value.\r\n * @returns - The duration in months.\r\n *\r\n * @example\r\n * ```ts-no-run\r\n * durationInMonths(new Date(2016, 0, 1), new Date(2017, 0, 1)); // 12\r\n * durationInMonths(new Date(2016, 6, 1), new Date(2017, 0, 1)); // 6\r\n * durationInMonths(new Date(2016, 0, 1), new Date(2016, 0, 1)); // 0\r\n * ```\r\n */\r\n var durationInMonths = function (start, end) { return (((end.getFullYear() - start.getFullYear())) * 12 + (end.getMonth() - start.getMonth())); };\r\n\r\n /**\r\n * A function that calculates duration in years between two `Date` objects.\r\n *\r\n * @param start - The start date value.\r\n * @param end - The end date value.\r\n * @returns - The duration in years.\r\n *\r\n * @example\r\n * ```ts-no-run\r\n * durationInYears(new Date(2016, 0, 1), new Date(2028, 0, 1)); // 12\r\n * durationInYears(new Date(2016, 0, 1), new Date(2022, 0, 1)); // 6\r\n * durationInYears(new Date(2016, 0, 1), new Date(2016, 0, 1)); // 0\r\n * ```\r\n */\r\n var durationInYears = function (start, end) { return (end.getFullYear() - start.getFullYear()); };\r\n\r\n /**\r\n * A function which returns the first date of the current week.\r\n *\r\n * @param date - The initial date.\r\n * @param weekStartDay [default: Day.Sunday] - The first day of the week.\r\n * @returns - The first date of the current week.\r\n *\r\n * @example\r\n * ```ts-no-run\r\n * firstDayInWeek(new Date(2016, 0, 15)); // 2016-01-10\r\n * firstDayInWeek(new Date(2016, 0, 15), Day.Monday); // 2016-01-11\r\n * ```\r\n */\r\n var firstDayInWeek = function (date, weekStartDay) {\r\n if (weekStartDay === void 0) { weekStartDay = Day.Sunday; }\r\n var first = cloneDate(date);\r\n while (first.getDay() !== weekStartDay) {\r\n first.setDate(first.getDate() - 1);\r\n }\r\n return first;\r\n };\r\n\r\n /**\r\n * A function which returns the first date of the month.\r\n *\r\n * @param date - The initial date.\r\n * @returns - The first date of the initial date month.\r\n *\r\n * @example\r\n * ```ts-no-run\r\n * firstDayOfMonth(new Date(2016, 0, 15)); // 2016-01-01\r\n * ```\r\n */\r\n var firstDayOfMonth = function (date) {\r\n return createDate(date.getFullYear(), date.getMonth(), 1, date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds());\r\n };\r\n\r\n /**\r\n * @hidden\r\n */\r\n var setMonth = function (value, month) {\r\n var day = value.getDate();\r\n var candidate = createDate(value.getFullYear(), month, day, value.getHours(), value.getMinutes(), value.getSeconds(), value.getMilliseconds());\r\n return candidate.getDate() === day ? candidate : lastDayOfMonth(addMonths(candidate, -1));\r\n };\r\n\r\n /**\r\n * A function that returns a `Date` object of the first month in a year.\r\n *\r\n * @param date - The start date value.\r\n * @returns - The first month in a year.\r\n *\r\n * @example\r\n * ```ts-no-run\r\n * firstMonthOfYear(new Date(2017, 11, 1)); // 2017-1-1\r\n * firstMonthOfYear(new Date(2017, 0, 1)); // 2017-1-1\r\n * ```\r\n */\r\n var firstMonthOfYear = function (value) { return setMonth(value, 0); };\r\n\r\n /**\r\n * A function which returns the passed date with a midnight time portion.\r\n *\r\n * @param date - The initial date.\r\n * @returns - The date with a midnight time portion.\r\n *\r\n * @example\r\n * ```ts-no-run\r\n * getDate(new Date(2016, 0, 15, 14, 30, 30)); // 2016-01-15 00:00:00\r\n * ```\r\n */\r\n var getDate = function (date) {\r\n return createDate(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0);\r\n };\r\n\r\n /**\r\n * A function that compares two dates. The comparison also includes the time portion.\r\n *\r\n * @param candidate - The candidate date.\r\n * @param expected - The expected date.\r\n * @returns - A Boolean value indicating whether the values are equal.\r\n *\r\n * @example\r\n * ```ts-no-run\r\n * isEqual(new Date(2016, 0, 1), new Date(2016, 0, 1)); // true\r\n * isEqual(new Date(2016, 0, 1), new Date(2016, 0, 2)); // false\r\n * isEqual(new Date(2016, 0, 1, 10), new Date(2016, 0, 1, 20)); // false\r\n * ```\r\n */\r\n var isEqual = function (candidate, expected) {\r\n if (!candidate && !expected) {\r\n return true;\r\n }\r\n return candidate && expected && candidate.getTime() === expected.getTime();\r\n };\r\n\r\n /**\r\n * A function that compares the date portions of 2 dates.\r\n *\r\n * @param candidate - The candidate date.\r\n * @param expected - The expected date.\r\n * @returns - A Boolean value whether the values are equal.\r\n *\r\n * @example\r\n * ```ts-no-run\r\n * isEqualDate(new Date(2016, 0, 1, 10), new Date(2016, 0, 1, 20)); // true\r\n * isEqualDate(new Date(2016, 0, 1, 10), new Date(2016, 0, 2, 10)); // false\r\n * ```\r\n */\r\n var isEqualDate = function (candidate, expected) {\r\n if (!candidate && !expected) {\r\n return true;\r\n }\r\n return candidate && expected && isEqual(getDate(candidate), getDate(expected));\r\n };\r\n\r\n /**\r\n * A function that returns a `Date` object of the last decade in a century.\r\n *\r\n * @param date - The start date value.\r\n * @returns - The last year in a decade.\r\n *\r\n * @example\r\n * ```ts-no-run\r\n * lastDecadeOfCentury(new Date(2017, 0, 1)); // 2090-1-1\r\n * lastDecadeOfCentury(new Date(2007, 10, 22)); // 2090-11-22\r\n * lastDecadeOfCentury(new Date(2126, 0, 1)); // 2190-1-1\r\n * ```\r\n */\r\n var lastDecadeOfCentury = function (value) { return (normalizeYear(value, function (y) { return y - (y % 100) + 90; })); };\r\n\r\n /**\r\n * A function that returns a `Date` object of the last month in a year.\r\n *\r\n * @param date - The start date value.\r\n * @returns - The last month in a year.\r\n *\r\n * @example\r\n * ```ts-no-run\r\n * lastMonthOfYear(new Date(2017, 5, 3)); // 2017-12-3\r\n * lastMonthOfYear(new Date(2017, 11, 3)); // 2017-12-3\r\n * ```\r\n */\r\n var lastMonthOfYear = function (value) { return setMonth(value, 11); };\r\n\r\n /**\r\n * A function that returns a `Date` object of the last year in a decade.\r\n *\r\n * @param date - The start date value.\r\n * @returns - The last year in a decade.\r\n *\r\n * @example\r\n * ```ts-no-run\r\n * lastYearOfDecade(new Date(2017, 0, 1)); // 2019-1-1\r\n * lastYearOfDecade(new Date(2007, 10, 22)); // 2009-11-22\r\n * lastYearOfDecade(new Date(2026, 0, 1)); // 2029-1-1\r\n * ```\r\n */\r\n var lastYearOfDecade = function (value) { return (normalizeYear(value, function (y) { return y - (y % 10) + 9; })); };\r\n\r\n /**\r\n * A function which returns a date by a specific week name. For example, `Day.Monday`.\r\n *\r\n * @param date - The date to calculate from.\r\n * @param weekDay - The `Day` enum specifying the desired week day.\r\n * @returns - A `Date` instance.\r\n *\r\n * @example\r\n * ```ts-no-run\r\n * nextDayOfWeek(new Date(2016, 0, 1), Day.Wednesday); // 2016-01-06, Wednesday\r\n * ```\r\n */\r\n var nextDayOfWeek = function (date, weekDay) {\r\n return dayOfWeek(date, weekDay, Direction.Forward);\r\n };\r\n\r\n /**\r\n * A function which returns a date by a specific week name. For example, `Day.Monday`.\r\n *\r\n * @param date - The date to calculate from.\r\n * @param weekDay - The `Day` enum specifying the desired week day.\r\n * @returns - A `Date` instance.\r\n *\r\n * @example\r\n * ```ts-no-run\r\n * prevDayOfWeek(new Date(2016, 0, 1), Day.Wednesday); // 2015-12-30, Wednesday\r\n * ```\r\n */\r\n var prevDayOfWeek = function (date, weekDay) {\r\n return dayOfWeek(date, weekDay, Direction.Backward);\r\n };\r\n\r\n /**\r\n * @hidden\r\n *\r\n * An object which contains the information about the cities within the timezone.\r\n */\r\n var timezones = {\r\n rules: {},\r\n titles: {},\r\n zones: {}\r\n };\r\n\r\n var MONTHS = { Jan: 0, Feb: 1, Mar: 2, Apr: 3, May: 4, Jun: 5, Jul: 6, Aug: 7, Sep: 8, Oct: 9, Nov: 10, Dec: 11 };\r\n var DAYS = { Sun: 0, Mon: 1, Tue: 2, Wed: 3, Thu: 4, Fri: 5, Sat: 6 };\r\n var MS_PER_MINUTE = 60000;\r\n /**\r\n * @hidden\r\n *\r\n * A function that finds zone rules which become applicable after a specific time.\r\n *\r\n * @param year - The value of the year.\r\n * @param rule - A specific zone rule.\r\n * @param zone - The definition of the zone.\r\n *\r\n * @return - Returns an extended rule.\r\n *\r\n * @example\r\n * ```ts-no-run\r\n * ruleToDate(2018, rule); // A rule that contains {'2018': |2018 DST date| }\r\n * ```\r\n */\r\n var ruleToDate = function (year, rule, zoneOffset) {\r\n var month = rule[3];\r\n var on = rule[4];\r\n var time = rule[5];\r\n var date;\r\n var ruleOffset = time[3] === 'u' ? -zoneOffset * MS_PER_MINUTE : 0;\r\n if (!isNaN(on)) {\r\n date = new Date(Date.UTC(year, MONTHS[month], on, time[0], time[1], time[2]) + ruleOffset);\r\n }\r\n else if (on.indexOf('last') === 0) {\r\n date = new Date(Date.UTC(year, MONTHS[month] + 1, 1, time[0] - 24, time[1], time[2]) + ruleOffset);\r\n var targetDay = DAYS[on.substr(4, 3)];\r\n var ourDay = date.getUTCDay();\r\n date.setUTCDate(date.getUTCDate() + targetDay - ourDay - (targetDay > ourDay ? 7 : 0));\r\n }\r\n else if (on.indexOf('>=') >= 0) {\r\n date = new Date(Date.UTC(year, MONTHS[month], on.substr(5), time[0], time[1], time[2], 0) + ruleOffset);\r\n var targetDay = DAYS[on.substr(0, 3)];\r\n var ourDay = date.getUTCDay();\r\n date.setUTCDate(date.getUTCDate() + targetDay - ourDay + (targetDay < ourDay ? 7 : 0));\r\n }\r\n return date;\r\n };\r\n\r\n var CURRENT_UTC_TIME = (new Date()).getTime();\r\n /**\r\n * @hidden\r\n *\r\n * A function that finds zone rules which become applicable after a specific time.\r\n *\r\n * @param timezone - The timezone name. For example, `America/Chicago`, `Europe/Sofia`.\r\n * @param utcTime - The UTC time boundary for a zone rule. Defaults to the current UTC time.\r\n *\r\n * @return - Returns a zone rule for the specific zone name.\r\n *\r\n * @example\r\n * ```ts-no-run\r\n * findZone('Europe/Sofia'); //[-120,\"EU\",\"EE%sT\",null]\r\n * ```\r\n */\r\n var findRule = function (zoneRule, utcTime, zoneOffset) {\r\n if (utcTime === void 0) { utcTime = CURRENT_UTC_TIME; }\r\n if (zoneOffset === void 0) { zoneOffset = 0; }\r\n var rules = timezones.rules[zoneRule];\r\n if (!rules) {\r\n var time = zoneRule.split(\":\");\r\n var offset = 0;\r\n if (time.length > 1) {\r\n offset = time[0] * 60 + Number(time[1]);\r\n }\r\n return [-1000000, 'max', '-', 'Jan', 1, [0, 0, 0], offset, '-'];\r\n }\r\n var year = new Date(utcTime).getUTCFullYear();\r\n rules = rules.filter(function (currentRule) {\r\n var from = currentRule[0];\r\n var to = currentRule[1];\r\n return from <= year && (to >= year || (from === year && to === \"only\") || to === \"max\");\r\n });\r\n rules.push(utcTime);\r\n rules.sort(function (a, b) {\r\n if (typeof a !== \"number\") {\r\n a = Number(ruleToDate(year, a, zoneOffset));\r\n }\r\n if (typeof b !== \"number\") {\r\n b = Number(ruleToDate(year, b, zoneOffset));\r\n }\r\n return a - b;\r\n });\r\n var rule = rules[rules.indexOf(utcTime) - 1] || rules[rules.length - 1];\r\n return isNaN(rule) ? rule : null;\r\n };\r\n\r\n /** @hidden */\r\n var NO_TZ_INFO = 'The required {0} timezone information is not provided!';\r\n /** @hidden */\r\n var INVALID_TZ_STRUCTURE = 'The provided timezone information has invalid stucture!';\r\n var formatRegExp = /\\{(\\d+)}?\\}/g;\r\n var flatten = function (arr) { return arr.reduce(function (a, b) { return a.concat(b); }, []); };\r\n /** @hidden */\r\n var formatMessage = function (message) {\r\n var values = [];\r\n for (var _i = 1; _i < arguments.length; _i++) {\r\n values[_i - 1] = arguments[_i];\r\n }\r\n var flattenValues = flatten(values);\r\n return message.replace(formatRegExp, function (_, index) { return flattenValues[parseInt(index, 10)]; });\r\n };\r\n\r\n /**\r\n * @hidden\r\n *\r\n * A function that gets all zone rules for a specific zone.\r\n *\r\n * @param timezone - The timezone name. For example, `America/Chicago`, `Europe/Sofia`.\r\n *\r\n * @return - Returns all zone rules for the specific zone name.\r\n *\r\n * @example\r\n * ```ts-no-run\r\n * findZone('Europe/Sofia'); //[[-120,\"E-Eur\",\"EE%sT\",883526400000], [-120,\"EU\",\"EE%sT\",null]]\r\n * ```\r\n */\r\n var getZoneRules = function (timezone) {\r\n var zones = timezones.zones;\r\n if (!zones) {\r\n throw new Error(formatMessage(NO_TZ_INFO, timezone));\r\n }\r\n var zoneRules = zones[timezone];\r\n var result = typeof zoneRules === \"string\" ? zones[zoneRules] : zoneRules;\r\n if (!result) {\r\n throw new Error(formatMessage(NO_TZ_INFO, timezone));\r\n }\r\n return result;\r\n };\r\n\r\n /**\r\n * @hidden\r\n *\r\n * A function that finds zone rules which become applicable after specific time.\r\n */\r\n var findZone = function (timezone, utcTime) {\r\n if (utcTime === void 0) { utcTime = new Date().getTime(); }\r\n if (timezone === 'Etc/UTC' || timezone === 'Etc/GMT') {\r\n return [0, \"-\", \"UTC\", null];\r\n }\r\n var zoneRules = getZoneRules(timezone);\r\n var idx = zoneRules.length - 1;\r\n for (; idx >= 0; idx--) {\r\n var until = zoneRules[idx][3];\r\n if (until && utcTime > until) {\r\n break;\r\n }\r\n }\r\n var zone = zoneRules[idx + 1];\r\n if (!zone) {\r\n throw new Error(formatMessage(NO_TZ_INFO, timezone));\r\n }\r\n return zone;\r\n };\r\n\r\n /**\r\n * @hidden\r\n *\r\n * A function that gets the information about the zone and the rule for a specific timezone.\r\n *\r\n */\r\n var zoneAndRule = function (timezone, date) {\r\n var utcTime = date.getTime();\r\n var zone = findZone(timezone, utcTime);\r\n return {\r\n rule: findRule(zone[1], utcTime, zone[0]),\r\n zone: zone\r\n };\r\n };\r\n\r\n // tslint:disable:max-line-length\r\n /**\r\n * A function which returns the abbreviated name of the timezone. You can specify an optional date for returning the timezone name at a different point in time. The corresponding UTC date is used for locating the relevant rule. Timezone names change both historically and when they reflect the Daylight Savings Time rules.\r\n *\r\n * @param timezone - The timezone name. For example, `America/Chicago`, `Europe/Sofia`.\r\n * @param date - A date for which to locate the zone rule. By default, the current time is used.\r\n *\r\n * @return - The abbreviated name of the timezone at the specified date or, if not set, returns now.\r\n *\r\n * @example\r\n * ```ts-no-run\r\n * import { abbrTimezone } from '@progress/kendo-date-math';\r\n * import '@progress/kendo-date-math/tz/Europe/Sofia';\r\n *\r\n * const dstDate = new Date('2018-04-01T00:00:00Z');\r\n * console.log(abbrTimezone('Europe/Sofia', dstDate)); // EEST\r\n *\r\n * const date = new Date('2018-01-01T00:00:00Z');\r\n * console.log(abbrTimezone('Europe/Sofia', date)); // EET\r\n * ```\r\n */\r\n // tslint:enable:max-line-length\r\n var abbrTimezone = function (timezone, date) {\r\n if (date === void 0) { date = new Date(); }\r\n if (timezone === \"Etc/UTC\") {\r\n return 'UTC';\r\n }\r\n if (timezone === \"Etc/GMT\") {\r\n return 'GMT';\r\n }\r\n if (timezone === '') {\r\n return '';\r\n }\r\n var _a = zoneAndRule(timezone, date), zone = _a.zone, rule = _a.rule;\r\n var base = zone[2];\r\n if (base.indexOf(\"/\") >= 0) {\r\n return base.split(\"/\")[rule && +rule[6] ? 1 : 0];\r\n }\r\n else if (base.indexOf(\"%s\") >= 0) {\r\n return base.replace(\"%s\", (!rule || rule[7] === \"-\") ? '' : rule[7]);\r\n }\r\n return base;\r\n };\r\n\r\n // tslint:disable:max-line-length\r\n /**\r\n * A function that loads the information about the provided timezone. The details for the loaded timezone will be available to all functions that are related to the manipulation of the timezone.\r\n *\r\n * @param timezoneInfo - The information about the timezone that will be loaded.\r\n *\r\n * @example\r\n * ```ts-no-run\r\n * loadTimezone({ zones: [...], rules: [...]});\r\n * ```\r\n */\r\n // tslint:enable:max-line-length\r\n var loadTimezone = function (tzInfo) {\r\n if (!tzInfo) {\r\n throw new Error(formatMessage(NO_TZ_INFO, ''));\r\n }\r\n var rules = tzInfo.rules, titles = tzInfo.titles, zones = tzInfo.zones;\r\n if (rules === undefined || zones === undefined) {\r\n throw new Error(INVALID_TZ_STRUCTURE);\r\n }\r\n Object.assign(timezones.rules, rules);\r\n Object.assign(timezones.titles, titles || {});\r\n Object.assign(timezones.zones, zones);\r\n };\r\n\r\n /**\r\n * @hidden\r\n *\r\n * A function that calculates the time offset based on zone name.\r\n *\r\n * @param timezone - The timezone name. For example, `America/Chicago`, `Europe/Sofia`.\r\n * @param date - A date for which the zone rule will be located.\r\n *\r\n * @return - Returns the timezone offset in minutes at the specified time.\r\n */\r\n var offset = function (timezone, date) {\r\n if (date === void 0) { date = new Date(); }\r\n if (timezone === 'Etc/UTC' || timezone === 'Etc/GMT') {\r\n return 0;\r\n }\r\n if (timezone === '') {\r\n return date.getTimezoneOffset();\r\n }\r\n var _a = zoneAndRule(timezone, date), rule = _a.rule, zone = _a.zone;\r\n return parseFloat(rule ? zone[0] - rule[6] : zone[0]);\r\n };\r\n\r\n /**\r\n * A function that returns a list of grouped timezone names.\r\n *\r\n * @return - Returns a list of grouped timezone names.\r\n *\r\n * @example\r\n * ```ts-no-run\r\n * import '@progress/kendo-date-math/timezones/europe-berlin';\r\n * import '@progress/kendo-date-math/timezones/europe-sofia';\r\n *\r\n * timezoneGroupNames(); // ['(GMT+01:00) Amsterdam, Berlin, ...', '(GMT+02:00) Sofia, Tallinn...']\r\n * ```\r\n */\r\n var timezoneGroupNames = function () {\r\n var groups = Object.keys(timezones.titles).reduce(function (tmp, t) {\r\n var group = timezones.titles[t].group;\r\n tmp[group] = group;\r\n return tmp;\r\n }, {});\r\n return Object.keys(groups);\r\n };\r\n\r\n /**\r\n * A function that returns the list of all timezones that are loaded.\r\n *\r\n * @return - Returns the list of all timezones that are loaded.\r\n *\r\n * @example\r\n * ```ts-no-run\r\n * import '@progress/kendo-date-math/timezones/europe-berlin';\r\n * import '@progress/kendo-date-math/timezones/europe-sofia';\r\n *\r\n * timezoneNames(); // ['Europe/Berlin', 'Europe/Sofia']\r\n * ```\r\n */\r\n var timezoneNames = function () { return Object.keys(timezones.zones); };\r\n\r\n /**\r\n * A function that returns the full name of the timezone.\r\n *\r\n * @param timezone - The timezone name. For example, `America/Chicago`, `Europe/Sofia`.\r\n *\r\n * @return - Returns the full names of the timezone and the group.\r\n *\r\n * @example\r\n * ```ts-no-run\r\n * timezoneTitle('America/Chicago'); // Central Standard Time\r\n * ```\r\n */\r\n var timezoneTitle = function (timezone) {\r\n var titles = timezones.titles;\r\n var info = titles[timezone] || {};\r\n return info.long || timezone;\r\n };\r\n\r\n /**\r\n * A function that creates a local date from the UTC date parts of the input.\r\n *\r\n * @param date - The date value that will be converted. Only the UTC date parts are read.\r\n * @return Date - A local date with the UTC time parts of the supplied date.\r\n *\r\n * @example\r\n * ```ts-no-run\r\n * import { toLocalDate } from '@progress/kendo-date-math'\r\n *\r\n * const date = new Date('2016-11-05');\r\n * const local = toLocalDate(date);\r\n *\r\n * // For example, if the browser is in GMT+0200,\r\n * // the local date will be shifted 2 hours back:\r\n * //\r\n * // \"Fri Nov 04 2016 22:00:00 GMT+0200\"\r\n * console.log(local);\r\n *\r\n * // This is the same as the UTC parts of the input date:\r\n * //\r\n * // \"2016-11-05T22:00:00.000Z\"\r\n * console.log(date.toISOString());\r\n * ```\r\n */\r\n function toLocalDate(date) {\r\n return new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds(), date.getUTCMilliseconds());\r\n }\r\n\r\n var addMinutes = function (date, minutes) { return new Date(date.getTime() + minutes * MS_PER_MINUTE$1); };\r\n var addHours = function (date, hours) { return new Date(date.getTime() + hours * MS_PER_HOUR); };\r\n var dayAbbr = [\r\n 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'\r\n ];\r\n var monthAbbr = [\r\n 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dev'\r\n ];\r\n var datePrefix = function (utcDate) {\r\n return dayAbbr[utcDate.getUTCDay()] + ' ' + monthAbbr[utcDate.getUTCMonth()];\r\n };\r\n var padNumber = function (num, len) {\r\n if (len === void 0) { len = 2; }\r\n var sign = num < 0 ? '-' : '';\r\n return sign + new Array(len).concat([Math.abs(num)]).join('0').slice(-len);\r\n };\r\n function isZoneMissingHour(date, timezone) {\r\n var currentOffset = offset(timezone, date);\r\n var prevHour = addHours(date, -1);\r\n var prevOffset = offset(timezone, prevHour);\r\n return currentOffset < prevOffset;\r\n }\r\n function shiftZoneMissingHour(utcDate, timezone) {\r\n // Adjust for missing hour during DST transition in timezone.\r\n var dstOffset = isZoneMissingHour(utcDate, timezone) ? 1 : 0;\r\n return addHours(utcDate, dstOffset);\r\n }\r\n function convertTimezoneUTC(utcLocal, fromTimezone, toTimezone) {\r\n if (fromTimezone === toTimezone) {\r\n return utcLocal;\r\n }\r\n var fromOffset = offset(fromTimezone, utcLocal);\r\n var toOffset = offset(toTimezone, utcLocal);\r\n var baseDiff = fromOffset - toOffset;\r\n var midDate = addMinutes(utcLocal, baseDiff);\r\n var midOffset = offset(toTimezone, midDate);\r\n var dstDiff = toOffset - midOffset;\r\n return addMinutes(utcLocal, baseDiff + dstDiff);\r\n }\r\n function formatOffset(tzOffset) {\r\n var sign = tzOffset <= 0 ? '+' : '-';\r\n var value = Math.abs(tzOffset);\r\n var hours = padNumber(Math.floor(value / 60));\r\n var minutes = padNumber(value % 60);\r\n return \"GMT\" + sign + hours + minutes;\r\n }\r\n /**\r\n * Represents a local date in a specified timezone.\r\n *\r\n * The following example demonstrates how to convert a local date to the specified timezone.\r\n *\r\n * @example\r\n * ```ts-no-run\r\n * import { ZonedDate } from '@progress/kendo-date-math';\r\n * import '@progress/kendo-date-math/tz/America/New_York';\r\n *\r\n * const date = new Date('2018-03-13T00:00:00Z');\r\n * const tzDate = ZonedDate.fromLocalDate(date, 'America/New_York');\r\n *\r\n * // If you run this example in GMT+0200,\r\n * // the output will be '2018-03-12T22:00:00.000Z'.\r\n * console.log(tzDate.toISOString());\r\n * ```\r\n *\r\n * The following example demonstrates how to convert between timezones.\r\n *\r\n * @example\r\n * ```ts-no-run\r\n * import { ZonedDate } from '@progress/kendo-date-math';\r\n * import '@progress/kendo-date-math/tz/America/New_York';\r\n * import '@progress/kendo-date-math/tz/America/Los_Angeles';\r\n *\r\n * // Note the \"Z\" suffix for UTC dates.\r\n * const date = new Date('2018-03-12T22:00:00Z');\r\n *\r\n * const tzDate = ZonedDate.fromLocalDate(date, 'America/New_York');\r\n * const result = tzDate.toTimezone('America/Los_Angeles');\r\n *\r\n * // Regardless of the browser timezone\r\n * // the output will be '2018-03-12T15:00:00.000Z'.\r\n * console.log(tzDate.toUTCDate());\r\n * ```\r\n */\r\n var ZonedDate = /** @class */ (function () {\r\n // The constructor is aliased as a static fromUTCDate method\r\n // to clarify the meaning of the utcDate parameter.\r\n //\r\n // It can be confused for a local date time while it is in fact\r\n // treated as a UTC date that represents the local date in the timezone.\r\n function ZonedDate(utcDate, timezone) {\r\n this._utcDate = cloneDate(utcDate);\r\n this.timezone = timezone;\r\n var tzOffset = offset(timezone, utcDate);\r\n this.timezoneOffset = tzOffset;\r\n var localDate = shiftZoneMissingHour(utcDate, timezone);\r\n this._localDate = convertTimezoneUTC(localDate, timezone, 'Etc/UTC');\r\n }\r\n Object.defineProperty(ZonedDate.prototype, \"cachedLocalDate\", {\r\n /**\r\n * Returns a cached local date that denotes the exact time in the set timezone.\r\n *\r\n * @return Date - A local date that denotes the exact time in the set timezone.\r\n *\r\n * This property is an alternative to `toLocalDate()` that returns a cached value instead of cloning it.\r\n *\r\n * > Modifying the returned instance will corrupt the `ZonedDate` state.\r\n */\r\n get: function () {\r\n return this._localDate;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(ZonedDate.prototype, \"cachedUTCDate\", {\r\n /**\r\n * Returns a cached `Date` instance with UTC date parts that are set to the local time in the set timezone.\r\n *\r\n * @returns Date - A `Date` with UTC date parts that are set to the local time in the set timezone.\r\n *\r\n * This property is an alternative to `toUTCDate()` that returns a cached value instead of cloning it.\r\n *\r\n * > Modifying the returned instance will corrupt the `ZonedDate` state.\r\n */\r\n get: function () {\r\n return this._utcDate;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n // tslint:disable:max-line-length\r\n /**\r\n * Converts an existing date to a specified timezone.\r\n *\r\n * If the `timezone` parameter is omitted, the `ZonedDate` defaults to the timezone of the browser. This concept is known as \"floating date\" because it does not represent a particular moment in time. Instead, its actual value depends on the current timezone of the browser.\r\n *\r\n * @param date - The local date that represents the actual time instance.\r\n * @param timezone - The ID of the timezone that will be assumed. For example, `Europe/Sofia`.\r\n * @return ZonedDate - The date in the specified timezone.\r\n *\r\n * @example\r\n * ```ts-no-run\r\n * import { ZonedDate } from '@progress/kendo-date-math';\r\n * import '@progress/kendo-date-math/tz/America/New_York';\r\n *\r\n * const date = new Date('2018-03-13T00:00:00');\r\n * const tzDate = ZonedDate.fromLocalDate(date, 'America/New_York');\r\n *\r\n * // If you run this example in GMT+0200,\r\n * // the output will be 'Mon Mar 12 2018 18:00:00 GMT+0200 (EET)'.\r\n * console.log(tzDate.toString());\r\n *\r\n * // If you run this example in UTC,\r\n * // the output will be '2018-03-12T22:00:00.000Z'.\r\n * console.log(tzDate.toISOString());\r\n * ```\r\n */\r\n // tslint:enable:max-line-length\r\n ZonedDate.fromLocalDate = function (date, timezone) {\r\n if (timezone === void 0) { timezone = ''; }\r\n var utcDate = convertTimezoneUTC(date, 'Etc/UTC', timezone);\r\n var shiftZone = isZoneMissingHour(utcDate, timezone);\r\n var zoneOffset = offset(timezone, utcDate);\r\n var fixedOffset = 0;\r\n if (shiftZone) {\r\n // Adjust for the missing hour during the DST transition in the timezone.\r\n fixedOffset = zoneOffset > 0 ? -1 : 1;\r\n }\r\n var adjDate = addHours(utcDate, fixedOffset);\r\n return ZonedDate.fromUTCDate(adjDate, timezone);\r\n };\r\n // tslint:disable:max-line-length\r\n /**\r\n * Creates a date in a specific timezone from the UTC date parts of the supplied `Date`.\r\n *\r\n * If the `timezone` parameter is omitted, the `ZonedDate` defaults to the timezone of the browser. This concept is known as \"floating date\" because it does not represent a particular moment in time. Instead, its actual value depends on the current timezone of the browser.\r\n *\r\n * @param date - The UTC date that represents the time in the target zone. This time is not the actual time instant in UTC.\r\n * @param timezone - The ID of the timezone that will be assumed. For example, `Europe/Sofia`.\r\n * @return ZonedDate - The date in the specified timezone.\r\n *\r\n * @example\r\n * ```ts-no-run\r\n * import { ZonedDate } from '@progress/kendo-date-math';\r\n * import '@progress/kendo-date-math/tz/America/New_York';\r\n *\r\n * // Note the \"Z\" suffix for UTC dates.\r\n * const date = new Date('2018-03-12T18:00:00Z');\r\n *\r\n * // Alternative syntax using Date.UTC\r\n * // const date = new Date(Date.UTC(2018, 2, 12, 18, 0));\r\n *\r\n * const tzDate = ZonedDate.fromUTCDate(date, 'America/New_York');\r\n *\r\n * // Regardless of the browser timezone\r\n * // the output will be 'Mon Mar 12 2018 18:00:00 GMT+0200 (EET)'.\r\n * console.log(tzDate.toString());\r\n *\r\n * // Regardless of the browser timezone\r\n * // the output in UTC will be '2018-03-12T22:00:00.000Z'.\r\n * console.log(tzDate.toISOString());\r\n * ```\r\n */\r\n // tslint:enable:max-line-length\r\n ZonedDate.fromUTCDate = function (utcDate, timezone) {\r\n if (timezone === void 0) { timezone = ''; }\r\n return new ZonedDate(utcDate, timezone);\r\n };\r\n /**\r\n * Returns a local date that denotes the exact time in the set timezone.\r\n *\r\n * @return Date - A local date that denotes the exact time in the set timezone.\r\n *\r\n * @example\r\n * ```ts-no-run\r\n * import { ZonedDate } from '@progress/kendo-date-math';\r\n * import '@progress/kendo-date-math/tz/America/New_York';\r\n *\r\n * // Note the \"Z\" suffix for UTC dates.\r\n * const date = new Date('2018-03-12T18:00:00Z');\r\n * const tzDate = ZonedDate.fromUTCDate(date, 'America/New_York');\r\n *\r\n * // The local date represents the same moment in time as the ZonedDate:\r\n * // `2018-03-12T22:00:00.000Z`.\r\n * console.log(tzDate.toLocalDate().toISOString());\r\n *\r\n * // The local date will apply the timezone of the browser. For example,\r\n * // `Tue Mar 13 2018 00:00:00 GMT+0200 (Eastern European Standard Time)`.\r\n * console.log(tzDate.toLocalDate().toString())\r\n * ```\r\n */\r\n ZonedDate.prototype.toLocalDate = function () {\r\n return cloneDate(this._localDate);\r\n };\r\n /**\r\n * Returns a `Date` instance with UTC date parts that are set to the local time in the set timezone.\r\n *\r\n * @returns Date - A `Date` with UTC date parts that are set to the local time in the set timezone.\r\n *\r\n * @example\r\n * ```ts-no-run\r\n * import { ZonedDate } from '@progress/kendo-date-math';\r\n * import '@progress/kendo-date-math/tz/America/New_York';\r\n *\r\n * // Note the \"Z\" suffix for UTC dates.\r\n * const date = new Date('2018-03-12T18:00:00Z');\r\n * const tzDate = ZonedDate.fromUTCDate(date, 'America/New_York');\r\n *\r\n * // Regardless of the browser timezone\r\n * // the output will be '2018-03-12T18:00:00.000Z'.\r\n * console.log(tzDate.toUTCDate());\r\n * ```\r\n */\r\n ZonedDate.prototype.toUTCDate = function () {\r\n return cloneDate(this._utcDate);\r\n };\r\n /**\r\n * Converts the date to the specified timezone.\r\n *\r\n * @param toTimezone - The timezone to which the values will be converted. For example, `America/Los_Angeles`.\r\n * @returns ZonedDate - The resulting zoned date.\r\n *\r\n * @example\r\n * ```ts-no-run\r\n * import { ZonedDate } from '@progress/kendo-date-math';\r\n * import '@progress/kendo-date-math/tz/America/New_York';\r\n * import '@progress/kendo-date-math/tz/America/Los_Angeles';\r\n *\r\n * // Note the \"Z\" suffix for UTC dates.\r\n * const date = new Date('2018-03-12T22:00:00Z');\r\n *\r\n * const tzDate = ZonedDate.fromLocalDate(date, 'America/New_York');\r\n * const result = tzDate.toTimezone('America/Los_Angeles');\r\n *\r\n * // Regardless of the browser timezone\r\n * // the output will be '2018-03-12T15:00:00.000Z'.\r\n * console.log(tzDate.toUTCDate());\r\n * ```\r\n */\r\n ZonedDate.prototype.toTimezone = function (toTimezone) {\r\n if (this.timezone === toTimezone) {\r\n return this.clone();\r\n }\r\n var tzOffset = offset(this.timezone, this._utcDate);\r\n var date = addMinutes(this._utcDate, tzOffset);\r\n return ZonedDate.fromLocalDate(date, toTimezone);\r\n };\r\n /**\r\n * Returns a new instance that represents the same date.\r\n *\r\n * @returns Date - A copy of the instance of the current zoned date.\r\n */\r\n ZonedDate.prototype.clone = function () {\r\n return ZonedDate.fromUTCDate(this._utcDate, this.timezone);\r\n };\r\n // tslint:disable:max-line-length\r\n /**\r\n * Adds the specified number of days and returns a new instance with the resulting date in the same timezone.\r\n *\r\n * @param days - The number of days that will be added.\r\n * @returns ZonedDate - The resulting date.\r\n */\r\n // tslint:enable:max-line-length\r\n ZonedDate.prototype.addDays = function (days) {\r\n var newDate = new Date(this._utcDate.getTime());\r\n newDate.setUTCDate(newDate.getUTCDate() + days);\r\n return ZonedDate.fromUTCDate(newDate, this.timezone);\r\n };\r\n // tslint:disable:max-line-length\r\n /**\r\n * Adds the specified number of milliseconds and returns a new instance with the resulting date in the same timezone.\r\n *\r\n * The method compensates for DST transitions and ensures that the resulting date occurs exactly after the set amount of time in the timezone.\r\n *\r\n * @param milliseconds - The number of days that will be added.\r\n * @returns ZonedDate - The resulting date.\r\n */\r\n // tslint:enable:max-line-length\r\n ZonedDate.prototype.addTime = function (milliseconds) {\r\n var utcDate = new Date(this._utcDate.getTime());\r\n var utcMid = shiftZoneMissingHour(utcDate, this.timezone);\r\n utcMid.setTime(utcMid.getTime() + milliseconds);\r\n var utcResult = shiftZoneMissingHour(utcMid, this.timezone);\r\n return ZonedDate.fromUTCDate(utcResult, this.timezone);\r\n };\r\n // tslint:disable:max-line-length\r\n /**\r\n * Returns a new instance of the same zoned date having its time parts set to `00:00:00.000`.\r\n *\r\n * @returns ZonedDate - The same date having its time parts set to `00:00:00.000`.\r\n */\r\n // tslint:enable:max-line-length\r\n ZonedDate.prototype.stripTime = function () {\r\n var date = this._utcDate;\r\n var ticks = Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), 0, 0, 0);\r\n return ZonedDate.fromUTCDate(new Date(ticks), this.timezone);\r\n };\r\n /**\r\n * @hidden\r\n */\r\n ZonedDate.prototype.getTime = function () {\r\n return this._localDate.getTime();\r\n };\r\n /**\r\n * @hidden\r\n */\r\n ZonedDate.prototype.getTimezoneOffset = function () {\r\n return this.timezoneOffset;\r\n };\r\n /**\r\n * @hidden\r\n */\r\n ZonedDate.prototype.getFullYear = function () {\r\n return this._utcDate.getUTCFullYear();\r\n };\r\n /**\r\n * @hidden\r\n */\r\n ZonedDate.prototype.getMonth = function () {\r\n return this._utcDate.getUTCMonth();\r\n };\r\n /**\r\n * @hidden\r\n */\r\n ZonedDate.prototype.getDate = function () {\r\n return this._utcDate.getUTCDate();\r\n };\r\n /**\r\n * @hidden\r\n */\r\n ZonedDate.prototype.getDay = function () {\r\n return this._utcDate.getUTCDay();\r\n };\r\n /**\r\n * @hidden\r\n */\r\n ZonedDate.prototype.getHours = function () {\r\n return this._utcDate.getUTCHours();\r\n };\r\n /**\r\n * @hidden\r\n */\r\n ZonedDate.prototype.getMinutes = function () {\r\n return this._utcDate.getUTCMinutes();\r\n };\r\n /**\r\n * @hidden\r\n */\r\n ZonedDate.prototype.getSeconds = function () {\r\n return this._utcDate.getUTCSeconds();\r\n };\r\n /**\r\n * @hidden\r\n */\r\n ZonedDate.prototype.getMilliseconds = function () {\r\n return this._utcDate.getUTCMilliseconds();\r\n };\r\n // The local date UTC parts represent actual UTC time\r\n /**\r\n * @hidden\r\n */\r\n ZonedDate.prototype.getUTCDate = function () {\r\n return this._localDate.getUTCDate();\r\n };\r\n /**\r\n * @hidden\r\n */\r\n ZonedDate.prototype.getUTCDay = function () {\r\n return this._localDate.getUTCDay();\r\n };\r\n /**\r\n * @hidden\r\n */\r\n ZonedDate.prototype.getUTCFullYear = function () {\r\n return this._localDate.getUTCFullYear();\r\n };\r\n /**\r\n * @hidden\r\n */\r\n ZonedDate.prototype.getUTCHours = function () {\r\n return this._localDate.getUTCHours();\r\n };\r\n /**\r\n * @hidden\r\n */\r\n ZonedDate.prototype.getUTCMilliseconds = function () {\r\n return this._localDate.getUTCMilliseconds();\r\n };\r\n /**\r\n * @hidden\r\n */\r\n ZonedDate.prototype.getUTCMinutes = function () {\r\n return this._localDate.getUTCMinutes();\r\n };\r\n /**\r\n * @hidden\r\n */\r\n ZonedDate.prototype.getUTCMonth = function () {\r\n return this._localDate.getUTCMonth();\r\n };\r\n /** @hidden */\r\n ZonedDate.prototype.getUTCSeconds = function () {\r\n return this._localDate.getUTCSeconds();\r\n };\r\n /** @hidden */\r\n ZonedDate.prototype.setTime = function (time) {\r\n throw new Error(\"Method not implemented.\");\r\n };\r\n /** @hidden */\r\n ZonedDate.prototype.setMilliseconds = function (ms) {\r\n throw new Error(\"Method not implemented.\");\r\n };\r\n /** @hidden */\r\n ZonedDate.prototype.setUTCMilliseconds = function (ms) {\r\n throw new Error(\"Method not implemented.\");\r\n };\r\n /** @hidden */\r\n ZonedDate.prototype.setSeconds = function (sec, ms) {\r\n throw new Error(\"Method not implemented.\");\r\n };\r\n /** @hidden */\r\n ZonedDate.prototype.setUTCSeconds = function (sec, ms) {\r\n throw new Error(\"Method not implemented.\");\r\n };\r\n /** @hidden */\r\n ZonedDate.prototype.setMinutes = function (min, sec, ms) {\r\n throw new Error(\"Method not implemented.\");\r\n };\r\n /** @hidden */\r\n ZonedDate.prototype.setUTCMinutes = function (min, sec, ms) {\r\n throw new Error(\"Method not implemented.\");\r\n };\r\n /** @hidden */\r\n ZonedDate.prototype.setHours = function (hours, min, sec, ms) {\r\n throw new Error(\"Method not implemented.\");\r\n };\r\n /** @hidden */\r\n ZonedDate.prototype.setUTCHours = function (hours, min, sec, ms) {\r\n throw new Error(\"Method not implemented.\");\r\n };\r\n /** @hidden */\r\n ZonedDate.prototype.setDate = function (date) {\r\n throw new Error(\"Method not implemented.\");\r\n };\r\n /** @hidden */\r\n ZonedDate.prototype.setUTCDate = function (date) {\r\n throw new Error(\"Method not implemented.\");\r\n };\r\n /** @hidden */\r\n ZonedDate.prototype.setMonth = function (month, date) {\r\n throw new Error(\"Method not implemented.\");\r\n };\r\n /** @hidden */\r\n ZonedDate.prototype.setUTCMonth = function (month, date) {\r\n throw new Error(\"Method not implemented.\");\r\n };\r\n /** @hidden */\r\n ZonedDate.prototype.setFullYear = function (year, month, date) {\r\n throw new Error(\"Method not implemented.\");\r\n };\r\n /** @hidden */\r\n ZonedDate.prototype.setUTCFullYear = function (year, month, date) {\r\n throw new Error(\"Method not implemented.\");\r\n };\r\n /**\r\n * @hidden\r\n */\r\n ZonedDate.prototype.toISOString = function () {\r\n return this._localDate.toISOString();\r\n };\r\n /**\r\n * @hidden\r\n */\r\n ZonedDate.prototype.toJSON = function () {\r\n return this._localDate.toJSON();\r\n };\r\n /**\r\n * @hidden\r\n */\r\n ZonedDate.prototype.toString = function () {\r\n var dateString = datePrefix(this._utcDate);\r\n var timeString = this.toTimeString();\r\n return dateString + \" \" + this.getDate() + \" \" + this.getFullYear() + \" \" + timeString;\r\n };\r\n /** @hidden */\r\n ZonedDate.prototype.toDateString = function () {\r\n return toLocalDate(this._utcDate).toDateString();\r\n };\r\n /** @hidden */\r\n ZonedDate.prototype.toTimeString = function () {\r\n var hours = padNumber(this.getHours());\r\n var minutes = padNumber(this.getMinutes());\r\n var seconds = padNumber(this.getSeconds());\r\n var time = hours + \":\" + minutes + \":\" + seconds;\r\n var tzOffset = formatOffset(this.timezoneOffset);\r\n var abbrev = abbrTimezone(this.timezone, this._utcDate);\r\n if (abbrev) {\r\n abbrev = \" (\" + abbrev + \")\";\r\n }\r\n return time + \" \" + tzOffset + abbrev;\r\n };\r\n ZonedDate.prototype.toLocaleString = function (locales, options) {\r\n return this._localDate.toLocaleString(locales, options);\r\n };\r\n ZonedDate.prototype.toLocaleDateString = function (locales, options) {\r\n return this._localDate.toLocaleDateString(locales, options);\r\n };\r\n ZonedDate.prototype.toLocaleTimeString = function (locales, options) {\r\n return this._localDate.toLocaleTimeString(locales, options);\r\n };\r\n /** @hidden */\r\n ZonedDate.prototype.toUTCString = function () {\r\n return this.toTimezone('Etc/UTC').toString();\r\n };\r\n ZonedDate.prototype[Symbol.toPrimitive] = function (hint) {\r\n if (hint === 'string' || hint === 'default') {\r\n return this.toString();\r\n }\r\n return this._localDate.getTime();\r\n };\r\n /** @hidden */\r\n ZonedDate.prototype.valueOf = function () {\r\n return this.getTime();\r\n };\r\n /** @hidden */\r\n ZonedDate.prototype.getVarDate = function () {\r\n throw new Error('Not implemented.');\r\n };\r\n /** @hidden */\r\n ZonedDate.prototype.format = function (_) {\r\n throw new Error('Not implemented.');\r\n };\r\n /** @hidden */\r\n ZonedDate.prototype.formatUTC = function (_) {\r\n throw new Error('Not implemented.');\r\n };\r\n return ZonedDate;\r\n }());\r\n\r\n /**\r\n * A function that returns all timezones which match the title of the zone.\r\n *\r\n * @param group - The fully qualified zone title. For example, Central Standard Time.\r\n *\r\n * @return - Returns the list of all matching timezone names. For example, `[America/Chicago, ...]`.\r\n *\r\n * @example\r\n * ```ts-no-run\r\n * zonesPerGroup('(GMT+01:00) Amsterdam, Berlin'); // ['Europe/Amsterdam', 'Europe/Berlin'...]\r\n * ```\r\n */\r\n var zonesPerGroup = function (group) {\r\n var titles = timezones.titles;\r\n return Object.keys(titles).reduce(function (result, title) {\r\n var info = titles[title] || {};\r\n return info.group === group ? result.concat(title.split(' ')) : result;\r\n }, []);\r\n };\r\n\r\n var moveDateToWeekStart = function (date, weekStartDay) {\r\n if (weekStartDay !== Day.Monday) {\r\n return addDays(prevDayOfWeek(date, weekStartDay), 4);\r\n }\r\n return addDays(date, (4 - (date.getDay() || 7)));\r\n };\r\n var calcWeekInYear = function (date, weekStartDay) {\r\n var firstWeekInYear = createDate(date.getFullYear(), 0, 1, -6);\r\n var newDate = moveDateToWeekStart(date, weekStartDay);\r\n var diffInMS = newDate.getTime() - firstWeekInYear.getTime();\r\n var days = Math.floor(diffInMS / MS_PER_DAY);\r\n return 1 + Math.floor(days / 7);\r\n };\r\n /**\r\n * A function that returns the number of the week within a year, which is calculated in relation to the date.\r\n *\r\n * For more information, refer to the [**ISO week date**](https://en.wikipedia.org/wiki/ISO_week_date) article.\r\n *\r\n * @param date - The date used for the week number calculation.\r\n * @param weekStartDay - The first day of the week. By default, the first week day is Monday.\r\n * @returns - The number of the week within the year.\r\n *\r\n * @example\r\n * ```ts-no-run\r\n * weekInYear(new Date(2016, 0, 1)); // Week 53, 2015\r\n * weekInYear(new Date(2016, 0, 5)); // Week 1, 2016\r\n * weekInYear(new Date(2017, 0, 1)); // Week 52, 2016\r\n * weekInYear(new Date(2017, 0, 2)); // Week 1, 2017\r\n * ```\r\n */\r\n var weekInYear = function (date, weekStartDay) {\r\n if (weekStartDay === void 0) { weekStartDay = Day.Monday; }\r\n date = getDate(date);\r\n var prevWeekDate = addDays(date, -7);\r\n var nextWeekDate = addDays(date, 7);\r\n var weekNumber = calcWeekInYear(date, weekStartDay);\r\n if (weekNumber === 0) {\r\n return calcWeekInYear(prevWeekDate, weekStartDay) + 1;\r\n }\r\n if (weekNumber === 53 && calcWeekInYear(nextWeekDate, weekStartDay) > 1) {\r\n return 1;\r\n }\r\n return weekNumber;\r\n };\r\n\r\n var Mask = /** @class */ (function () {\r\n function Mask() {\r\n this.symbols = '';\r\n this.partMap = [];\r\n }\r\n return Mask;\r\n }());\r\n\r\n var Constants = {\r\n formatSeparator: \"_\",\r\n twoDigitYearMax: 68,\r\n defaultDateFormat: \"d\",\r\n defaultLocaleId: \"en\"\r\n };\r\n\r\n var Key = {\r\n DELETE: \"Delete\",\r\n BACKSPACE: \"Backspace\",\r\n TAB: \"Tab\",\r\n ENTER: \"Enter\",\r\n ESCAPE: \"Escape\",\r\n ARROW_LEFT: \"ArrowLeft\",\r\n ARROW_UP: \"ArrowUp\",\r\n ARROW_RIGHT: \"ArrowRight\",\r\n ARROW_DOWN: \"ArrowDown\",\r\n SPACE: \" \",\r\n END: \"End\",\r\n HOME: \"Home\",\r\n PAGE_UP: \"PageUp\",\r\n PAGE_DOWN: \"PageDown\"\r\n };\r\n\r\n /**\r\n * @hidden\r\n */\r\n var padZero = function (length) { return new Array(Math.max(length, 0)).fill('0').join(''); };\r\n /**\r\n * @hidden\r\n */\r\n var unpadZero = function (value) { return value.replace(/^0*/, ''); };\r\n /**\r\n * @hidden\r\n */\r\n var approximateStringMatching = function (_a) {\r\n /*\r\n Remove the right part of the cursor.\r\n oldFormat = oldFormat.substring(0, caret + oldText.length - newText.length);\r\n */\r\n var oldText = _a.oldText, newText = _a.newText, formatPattern = _a.formatPattern, selectionStart = _a.selectionStart, isInCaretMode = _a.isInCaretMode, keyEvent = _a.keyEvent;\r\n var oldTextSeparator = oldText[selectionStart + oldText.length - newText.length];\r\n var oldSegmentText = oldText.substring(0, selectionStart + oldText.length - newText.length);\r\n var newSegmentText = newText.substring(0, selectionStart);\r\n var diff = [];\r\n /* Handle the typing of a single character over the same selection. */\r\n if (oldSegmentText === newSegmentText && selectionStart > 0) {\r\n diff.push([formatPattern[selectionStart - 1], newSegmentText[selectionStart - 1]]);\r\n return diff;\r\n }\r\n if (oldSegmentText.indexOf(newSegmentText) === 0 && (isInCaretMode &&\r\n (keyEvent.key === Key.DELETE || keyEvent.key === Key.BACKSPACE)) ||\r\n (oldSegmentText.indexOf(newSegmentText) === 0 && !isInCaretMode &&\r\n (newSegmentText.length === 0 ||\r\n formatPattern[newSegmentText.length - 1] !== formatPattern[newSegmentText.length]))) {\r\n /* Handle Delete/Backspace. */\r\n var deletedSymbol = '';\r\n /*\r\n The whole text is replaced by the same character.\r\n A nasty patch is required to keep the selection in the first segment.\r\n */\r\n if (!isInCaretMode && newSegmentText.length === 1) {\r\n diff.push([formatPattern[0], newSegmentText[0]]);\r\n }\r\n for (var i = newSegmentText.length; i < oldSegmentText.length; i++) {\r\n if (formatPattern[i] !== deletedSymbol && formatPattern[i] !== Constants.formatSeparator) {\r\n deletedSymbol = formatPattern[i];\r\n diff.push([deletedSymbol, '']);\r\n }\r\n }\r\n return diff;\r\n }\r\n /*\r\n Handle the insertion of the text (the new text is longer than the previous one).\r\n Handle the typing over a literal as well.\r\n */\r\n if ((isInCaretMode &&\r\n (newSegmentText.indexOf(oldSegmentText) === 0 ||\r\n formatPattern[selectionStart - 1] === Constants.formatSeparator)) ||\r\n (!isInCaretMode &&\r\n (newSegmentText.indexOf(oldSegmentText) === 0 ||\r\n formatPattern[selectionStart - 1] === Constants.formatSeparator))) {\r\n var symbol = formatPattern[0];\r\n for (var i = Math.max(0, oldSegmentText.length - 1); i < formatPattern.length; i++) {\r\n if (formatPattern[i] !== Constants.formatSeparator) {\r\n symbol = formatPattern[i];\r\n break;\r\n }\r\n }\r\n return [[symbol, newSegmentText[selectionStart - 1]]];\r\n }\r\n /* Handle the entering of a space or a separator for navigating to the next item. */\r\n if ((newSegmentText[newSegmentText.length - 1] === ' ') ||\r\n (newSegmentText[newSegmentText.length - 1] === oldTextSeparator)) {\r\n return [[formatPattern[selectionStart - 1], Constants.formatSeparator]];\r\n }\r\n /* Handle typing over a correctly selected part. */\r\n var result = [[formatPattern[selectionStart - 1], newSegmentText[selectionStart - 1]]];\r\n return result;\r\n };\r\n /**\r\n * @hidden\r\n */\r\n var dateSymbolMap = function (map, part) {\r\n map[part.pattern[0]] = part.type;\r\n return map;\r\n };\r\n /**\r\n * @hidden\r\n */\r\n var isInRange = function (candidate, min, max) { return (candidate === null || !((min && min > candidate) || (max && max < candidate))); };\r\n\r\n var isObject = function (value) { return value && typeof (value) === \"object\" && !Array.isArray(value); };\r\n var isHtmlElement = function (element) { return element instanceof HTMLElement; };\r\n var dateSetter = function (method) { return function (date, value) {\r\n var clone = cloneDate(date);\r\n clone[method](value);\r\n return clone;\r\n }; };\r\n /**\r\n * @hidden\r\n */\r\n var isPresent = function (value) { return value !== undefined && value !== null; };\r\n /**\r\n * @hidden\r\n */\r\n var isDocumentAvailable = function () { return !!document; };\r\n /**\r\n * @hidden\r\n */\r\n var isNumber = function (value) { return isPresent(value) && typeof (value) === \"number\" && !Number.isNaN(value); };\r\n /**\r\n * @hidden\r\n */\r\n var parseToInt = function (value) { return parseInt(value, 10); };\r\n /**\r\n * @hidden\r\n */\r\n var clamp = function (value, min, max) { return Math.min(max, Math.max(min, value)); };\r\n /**\r\n * @hidden\r\n */\r\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\r\n // @ts-ignore\r\n var extend = function () {\r\n var args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n args[_i] = arguments[_i];\r\n }\r\n return Object.assign.apply(Object, args);\r\n };\r\n /**\r\n * @hidden\r\n */\r\n var deepExtend = function (target) {\r\n var _a, _b;\r\n var sources = [];\r\n for (var _i = 1; _i < arguments.length; _i++) {\r\n sources[_i - 1] = arguments[_i];\r\n }\r\n if (!sources.length) {\r\n return target;\r\n }\r\n var source = sources.shift();\r\n if (isObject(target) && isObject(source)) {\r\n for (var key in source) {\r\n if (isHtmlElement(source[key])) {\r\n target[key] = source[key];\r\n }\r\n else if (isObject(source[key]) && !(source[key] instanceof Date)) {\r\n if (!target[key] || !isObject(target[key])) {\r\n extend(target, (_a = {}, _a[key] = {}, _a));\r\n }\r\n deepExtend(target[key], source[key]);\r\n }\r\n else {\r\n extend(target, (_b = {}, _b[key] = source[key], _b));\r\n }\r\n }\r\n }\r\n return deepExtend.apply(void 0, [target].concat(sources));\r\n };\r\n /**\r\n * @hidden\r\n */\r\n var noop$1 = function () { };\r\n /**\r\n * @hidden\r\n */\r\n var isFunction = function (fn) { return typeof (fn) === \"function\"; };\r\n /**\r\n * @hidden\r\n */\r\n var cropTwoDigitYear = function (date) {\r\n if (!isPresent(date) || isNaN(date.getTime())) {\r\n return 0;\r\n }\r\n return Number(date\r\n .getFullYear()\r\n .toString()\r\n .slice(-2));\r\n };\r\n /**\r\n * @hidden\r\n */\r\n var setYears = dateSetter('setFullYear');\r\n /**\r\n * @hidden\r\n */\r\n var millisecondDigitsInFormat = function (format) {\r\n var result = format && format.match(/S+(\\1)/);\r\n return result ? result[0].length : 0;\r\n };\r\n /**\r\n * @hidden\r\n */\r\n var millisecondStepFor = function (digits) {\r\n return Math.pow(10, 3 - digits);\r\n };\r\n /**\r\n * @hidden\r\n */\r\n var areDatePartsEqualTo = function (date, year, month, day, hour, minutes, seconds, milliseconds) {\r\n if (date &&\r\n date.getFullYear() === year &&\r\n date.getMonth() === month &&\r\n date.getDate() === day &&\r\n date.getHours() === hour &&\r\n date.getMinutes() === minutes &&\r\n date.getSeconds() === seconds &&\r\n date.getMilliseconds() === milliseconds) {\r\n return true;\r\n }\r\n return false;\r\n };\r\n /**\r\n * @hidden\r\n */\r\n var isValidDate = function (value) { return isPresent(value) && value.getTime && isNumber(value.getTime()); };\r\n\r\n var PREVIOUS_CENTURY_BASE = 1900;\r\n var CURRENT_CENTURY_BASE = 2000;\r\n var SHORT_PATTERN_LENGTH_REGEXP = /d|M|H|h|m|s/;\r\n var MONTH_PART_WITH_WORDS_THRESHOLD = 2;\r\n var MONTH_SYMBOL = \"M\";\r\n // JS months start from 0 (January) instead of 1 (January)\r\n var JS_MONTH_OFFSET = 1;\r\n var DateObject = /** @class */ (function () {\r\n function DateObject(_a) {\r\n var intlService = _a.intlService, formatPlaceholder = _a.formatPlaceholder, format = _a.format, _b = _a.cycleTime, cycleTime = _b === void 0 ? false : _b, _c = _a.twoDigitYearMax, twoDigitYearMax = _c === void 0 ? Constants.twoDigitYearMax : _c, _d = _a.value, value = _d === void 0 ? null : _d, _e = _a.autoCorrectParts, autoCorrectParts = _e === void 0 ? true : _e;\r\n this.year = true;\r\n this.month = true;\r\n this.date = true;\r\n this.hours = true;\r\n this.minutes = true;\r\n this.seconds = true;\r\n this.milliseconds = true;\r\n this.dayperiod = true;\r\n this.leadingZero = null;\r\n this.typedMonthPart = '';\r\n this.knownParts = 'adHhmMsEyS';\r\n this.symbols = {\r\n 'E': 'E',\r\n 'H': 'H',\r\n 'M': 'M',\r\n 'a': 'a',\r\n 'd': 'd',\r\n 'h': 'h',\r\n 'm': 'm',\r\n 's': 's',\r\n 'y': 'y',\r\n 'S': 'S'\r\n };\r\n this._value = getDate(new Date());\r\n this.cycleTime = false;\r\n this._partiallyInvalidDate = {\r\n startDate: null,\r\n invalidDateParts: {\r\n 'E': { value: null, date: null, startDateOffset: 0 },\r\n 'H': { value: null, date: null, startDateOffset: 0 },\r\n 'M': { value: null, date: null, startDateOffset: 0 },\r\n 'a': { value: null, date: null, startDateOffset: 0 },\r\n 'd': { value: null, date: null, startDateOffset: 0 },\r\n 'h': { value: null, date: null, startDateOffset: 0 },\r\n 'm': { value: null, date: null, startDateOffset: 0 },\r\n 's': { value: null, date: null, startDateOffset: 0 },\r\n 'y': { value: null, date: null, startDateOffset: 0 },\r\n 'S': { value: null, date: null, startDateOffset: 0 }\r\n }\r\n };\r\n this.setOptions({\r\n intlService: intlService,\r\n formatPlaceholder: formatPlaceholder,\r\n format: format,\r\n cycleTime: cycleTime,\r\n twoDigitYearMax: twoDigitYearMax,\r\n value: value,\r\n autoCorrectParts: autoCorrectParts\r\n });\r\n if (!value) {\r\n this._value = getDate(new Date());\r\n var sampleFormat = this.dateFormatString(this.value, this.format).symbols;\r\n for (var i = 0; i < sampleFormat.length; i++) {\r\n this.setExisting(sampleFormat[i], false);\r\n }\r\n }\r\n else {\r\n this._value = cloneDate(value);\r\n }\r\n }\r\n Object.defineProperty(DateObject.prototype, \"value\", {\r\n get: function () {\r\n return this._value;\r\n },\r\n set: function (value) {\r\n if (value && !(value instanceof Date)) {\r\n // throw new Error(\"The 'value' should be a valid JavaScript Date instance.\");\r\n return;\r\n }\r\n this._value = value;\r\n this.resetInvalidDate();\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(DateObject.prototype, \"localeId\", {\r\n get: function () {\r\n var localeId = Constants.defaultLocaleId;\r\n var cldrKeys = Object.keys(this.intl.cldr);\r\n for (var i = 0; i < cldrKeys.length; i++) {\r\n var key = cldrKeys[i];\r\n var value = this.intl.cldr[key];\r\n if (value.name && value.calendar && value.numbers &&\r\n value.name !== Constants.defaultLocaleId) {\r\n localeId = value.name;\r\n break;\r\n }\r\n }\r\n return localeId;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n /**\r\n * @hidden\r\n */\r\n DateObject.prototype.setOptions = function (options) {\r\n this.intl = options.intlService;\r\n this.formatPlaceholder = options.formatPlaceholder || 'wide';\r\n this.format = options.format;\r\n this.cycleTime = options.cycleTime;\r\n this.monthNames = this.allFormattedMonths(this.localeId);\r\n this.dayPeriods = this.allDayPeriods(this.localeId);\r\n this.twoDigitYearMax = options.twoDigitYearMax;\r\n this.autoCorrectParts = options.autoCorrectParts;\r\n };\r\n DateObject.prototype.setValue = function (value) {\r\n if (!value) {\r\n this._value = getDate(new Date());\r\n this.modifyExisting(false);\r\n }\r\n else if (!isEqual(value, this._value)) {\r\n this._value = cloneDate(value);\r\n this.modifyExisting(true);\r\n }\r\n this.resetInvalidDate();\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateObject.prototype.hasValue = function () {\r\n var _this = this;\r\n var pred = function (a, p) { return a || p.type !== 'literal' && p.type !== 'dayperiod' && _this.getExisting(p.pattern[0]); };\r\n return this.intl.splitDateFormat(this.format, this.localeId).reduce(pred, false);\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateObject.prototype.getValue = function () {\r\n for (var i = 0; i < this.knownParts.length; i++) {\r\n if (!this.getExisting(this.knownParts[i])) {\r\n return null;\r\n }\r\n }\r\n return cloneDate(this.value);\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateObject.prototype.getFormattedDate = function (format) {\r\n return this.intl.formatDate(this.getValue(), format, this.localeId);\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateObject.prototype.getTextAndFormat = function (customFormat) {\r\n if (customFormat === void 0) { customFormat = \"\"; }\r\n var format = customFormat || this.format;\r\n var text = this.intl.formatDate(this.value, format, this.localeId);\r\n var mask = this.dateFormatString(this.value, format);\r\n if (!this.autoCorrectParts && this._partiallyInvalidDate.startDate) {\r\n var partiallyInvalidText = \"\";\r\n var formattedDate = this.intl.formatDate(this.value, format, this.localeId);\r\n var formattedDates = this.getFormattedInvalidDates(format);\r\n for (var i = 0; i < formattedDate.length; i++) {\r\n var symbol = mask.symbols[i];\r\n if (mask.partMap[i].type === \"literal\") {\r\n partiallyInvalidText += text[i];\r\n }\r\n else if (this.getInvalidDatePartValue(symbol)) {\r\n var partsForSegment = this.getPartsForSegment(mask, i);\r\n if (symbol === \"M\") {\r\n var datePartText = (parseToInt(this.getInvalidDatePartValue(symbol)) + JS_MONTH_OFFSET).toString();\r\n if (partsForSegment.length > MONTH_PART_WITH_WORDS_THRESHOLD) {\r\n partiallyInvalidText += formattedDates[symbol][i];\r\n }\r\n else {\r\n if (this.getInvalidDatePartValue(symbol)) {\r\n var formattedDatePart = padZero(partsForSegment.length - datePartText.length) + datePartText;\r\n partiallyInvalidText += formattedDatePart;\r\n // add -1 as the first character in the segment is at index i\r\n i += partsForSegment.length - 1;\r\n }\r\n else {\r\n partiallyInvalidText += formattedDates[symbol][i];\r\n }\r\n }\r\n }\r\n else {\r\n if (this.getInvalidDatePartValue(symbol)) {\r\n var datePartText = this.getInvalidDatePartValue(symbol).toString();\r\n var formattedDatePart = padZero(partsForSegment.length - datePartText.length) + datePartText;\r\n partiallyInvalidText += formattedDatePart;\r\n // add -1 as the first character in the segment is at index i\r\n i += partsForSegment.length - 1;\r\n }\r\n else {\r\n partiallyInvalidText += formattedDates[symbol][i];\r\n }\r\n }\r\n }\r\n else {\r\n partiallyInvalidText += text[i];\r\n }\r\n }\r\n text = partiallyInvalidText;\r\n }\r\n var result = this.merge(text, mask);\r\n return result;\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateObject.prototype.getFormattedInvalidDates = function (customFormat) {\r\n var _this = this;\r\n if (customFormat === void 0) { customFormat = \"\"; }\r\n var format = customFormat || this.format;\r\n var formattedDatesForSymbol = {\r\n 'E': '',\r\n 'H': '',\r\n 'M': '',\r\n 'a': '',\r\n 'd': '',\r\n 'h': '',\r\n 'm': '',\r\n 's': '',\r\n 'y': '',\r\n 'S': ''\r\n };\r\n Object.keys(this._partiallyInvalidDate.invalidDateParts).forEach(function (key) {\r\n var date = _this.getInvalidDatePart(key).date;\r\n if (date) {\r\n var formattedInvalidDate = _this.intl.formatDate(date, format, _this.localeId);\r\n formattedDatesForSymbol[key] = formattedInvalidDate;\r\n }\r\n });\r\n return formattedDatesForSymbol;\r\n };\r\n DateObject.prototype.modifyExisting = function (value) {\r\n var sampleFormat = this.dateFormatString(this.value, this.format).symbols;\r\n for (var i = 0; i < sampleFormat.length; i++) {\r\n this.setExisting(sampleFormat[i], value);\r\n }\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateObject.prototype.getExisting = function (symbol) {\r\n switch (symbol) {\r\n case 'y': return this.year;\r\n case 'M':\r\n case 'L': return this.month;\r\n case 'd': return this.date;\r\n case 'E': return this.date && this.month && this.year;\r\n case 'h':\r\n case 'H': return this.hours;\r\n case 't':\r\n case 'a': return this.dayperiod;\r\n case 'm': return this.minutes;\r\n case 's': return this.seconds;\r\n case \"S\": return this.milliseconds;\r\n default:\r\n return true;\r\n }\r\n };\r\n DateObject.prototype.setExisting = function (symbol, value) {\r\n switch (symbol) {\r\n case 'y':\r\n // allow 2/29 dates\r\n this.year = value;\r\n if (value === false) {\r\n this._value.setFullYear(2000);\r\n }\r\n break;\r\n case 'M':\r\n // make sure you can type 31 in the day part\r\n this.month = value;\r\n if (value === false) {\r\n if (this.autoCorrectParts) {\r\n this._value.setMonth(0);\r\n }\r\n }\r\n break;\r\n case 'd':\r\n this.date = value;\r\n break;\r\n case 'h':\r\n case 'H':\r\n this.hours = value;\r\n break;\r\n case 't':\r\n case 'a':\r\n this.dayperiod = value;\r\n break;\r\n case 'm':\r\n this.minutes = value;\r\n break;\r\n case 's':\r\n this.seconds = value;\r\n break;\r\n case \"S\":\r\n this.milliseconds = value;\r\n break;\r\n default:\r\n break;\r\n }\r\n if (this.getValue()) {\r\n this.resetInvalidDate();\r\n }\r\n };\r\n DateObject.prototype.modifyPart = function (symbol, offset) {\r\n if (!isPresent(symbol) || !isPresent(offset) || offset === 0) {\r\n return;\r\n }\r\n var newValue = cloneDate(this.value);\r\n var timeModified = false;\r\n var invalidDateFound;\r\n var isMonth = symbol === \"M\";\r\n var isDay = symbol === \"d\" || symbol === \"E\";\r\n var symbolExists = this.getExisting(symbol);\r\n if (!this.autoCorrectParts && (isDay || isMonth)) {\r\n var invalidDateParts = this._partiallyInvalidDate.invalidDateParts || {};\r\n var invalidDatePartValue = this.getInvalidDatePartValue(symbol);\r\n var year = invalidDateParts.y.value || newValue.getFullYear();\r\n var month = invalidDateParts.M.value || newValue.getMonth();\r\n var day = invalidDateParts.d.value || invalidDateParts.E.value || newValue.getDate();\r\n var hour = invalidDateParts.h.value || invalidDateParts.H.value || newValue.getHours();\r\n var minutes = invalidDateParts.m.value || newValue.getMinutes();\r\n var seconds = invalidDateParts.s.value || newValue.getSeconds();\r\n var milliseconds = invalidDateParts.S.value || newValue.getMilliseconds();\r\n switch (symbol) {\r\n case 'y':\r\n year += offset;\r\n break;\r\n case 'M':\r\n month += offset;\r\n break;\r\n case 'd':\r\n case 'E':\r\n day += offset;\r\n break;\r\n // case 'h':\r\n // case 'H': hour += offset; break;\r\n // case 'm': minutes += offset; break;\r\n // case 's': seconds += offset; break;\r\n // case 'S': milliseconds += offset; break;\r\n default: break;\r\n }\r\n if (symbol === \"M\") {\r\n if ((month < 0 || month > 11)) {\r\n if (symbolExists) {\r\n this.setExisting(symbol, false);\r\n this.resetInvalidDateSymbol(symbol);\r\n return;\r\n }\r\n }\r\n if (!symbolExists) {\r\n if (month < 0) {\r\n month = clamp(11 + ((month % 11) + 1), 0, 11);\r\n }\r\n else {\r\n var monthValue = isPresent(invalidDatePartValue) ?\r\n month :\r\n ((offset - JS_MONTH_OFFSET) % 12);\r\n month = clamp(monthValue, 0, 11);\r\n }\r\n month = clamp(month, 0, 11);\r\n }\r\n month = clamp(month, 0, 11);\r\n }\r\n else if (symbol === \"d\") {\r\n if (symbolExists) {\r\n if (day <= 0 || day > 31) {\r\n this.setExisting(symbol, false);\r\n this.resetInvalidDateSymbol(symbol);\r\n return;\r\n }\r\n }\r\n else if (!symbolExists) {\r\n if (isPresent(invalidDatePartValue)) {\r\n if (day <= 0 || day > 31) {\r\n this.setExisting(symbol, false);\r\n this.resetInvalidDateSymbol(symbol);\r\n return;\r\n }\r\n }\r\n if (offset < 0) {\r\n var dayValue = isPresent(invalidDatePartValue) ? day : 1 + (31 - Math.abs(offset % 31));\r\n day = clamp(dayValue, 1, 31);\r\n }\r\n else {\r\n var dayValue = isPresent(invalidDatePartValue) ? day : offset % 31;\r\n day = clamp(dayValue, 1, 31);\r\n }\r\n day = clamp(day, 1, 31);\r\n }\r\n }\r\n var dateCandidate = createDate(year, month, day, hour, minutes, seconds, milliseconds);\r\n var newValueCandidate = isMonth || isDay ?\r\n this.modifyDateSymbolWithValue(newValue, symbol, isMonth ? month : day) :\r\n null;\r\n var dateCandidateExists = areDatePartsEqualTo(dateCandidate, year, month, day, hour, minutes, seconds, milliseconds);\r\n if (this.getValue() && areDatePartsEqualTo(dateCandidate, year, month, day, hour, minutes, seconds, milliseconds)) {\r\n newValue = cloneDate(dateCandidate);\r\n this.markDatePartsAsExisting();\r\n }\r\n else if (isMonth && newValueCandidate) {\r\n if (newValueCandidate.getMonth() === month) {\r\n if (this.getExisting(\"d\")) {\r\n if (dateCandidateExists) {\r\n newValue = cloneDate(dateCandidate);\r\n this.resetInvalidDateSymbol(symbol);\r\n }\r\n else {\r\n invalidDateFound = true;\r\n this.setInvalidDatePart(symbol, {\r\n value: month,\r\n date: cloneDate(newValueCandidate),\r\n startDateOffset: offset,\r\n startDate: cloneDate(this.value)\r\n });\r\n this.setExisting(symbol, false);\r\n }\r\n }\r\n else if (dateCandidateExists) {\r\n this.resetInvalidDateSymbol(symbol);\r\n newValue = cloneDate(dateCandidate);\r\n if (this.getExisting(\"M\") && this.getExisting(\"y\")) {\r\n // changing from 28/Feb to 29/Feb to 29/March\r\n this.setExisting(\"d\", true);\r\n this.resetInvalidDateSymbol(\"d\");\r\n }\r\n }\r\n else {\r\n this.resetInvalidDateSymbol(symbol);\r\n newValue = cloneDate(newValueCandidate);\r\n }\r\n }\r\n else {\r\n invalidDateFound = true;\r\n this.setInvalidDatePart(symbol, {\r\n value: month,\r\n date: cloneDate(newValueCandidate),\r\n startDateOffset: offset,\r\n startDate: cloneDate(this.value)\r\n });\r\n this.setExisting(symbol, false);\r\n }\r\n }\r\n else if (isDay && newValueCandidate) {\r\n if (newValueCandidate.getDate() === day) {\r\n if (this.getExisting(\"M\")) {\r\n if (dateCandidateExists) {\r\n newValue = cloneDate(dateCandidate);\r\n this.resetInvalidDateSymbol(symbol);\r\n }\r\n else {\r\n invalidDateFound = true;\r\n this.setInvalidDatePart(symbol, {\r\n value: day,\r\n date: cloneDate(newValueCandidate),\r\n startDateOffset: offset,\r\n startDate: cloneDate(this.value)\r\n });\r\n this.setExisting(symbol, false);\r\n }\r\n }\r\n else if (dateCandidateExists) {\r\n newValue = cloneDate(dateCandidate);\r\n this.resetInvalidDateSymbol(symbol);\r\n if (this.getExisting(\"d\") && this.getExisting(\"y\")) {\r\n // changing from 31/Jan to 31/Feb to 28/Feb\r\n this.setExisting(\"M\", true);\r\n this.resetInvalidDateSymbol(\"M\");\r\n }\r\n }\r\n else {\r\n this.resetInvalidDateSymbol(symbol);\r\n newValue = cloneDate(newValueCandidate);\r\n }\r\n }\r\n else {\r\n invalidDateFound = true;\r\n this.setInvalidDatePart(symbol, {\r\n value: day,\r\n date: cloneDate(this.value),\r\n startDateOffset: offset,\r\n startDate: cloneDate(this.value)\r\n });\r\n this.setExisting(symbol, false);\r\n }\r\n }\r\n }\r\n else {\r\n switch (symbol) {\r\n case 'y':\r\n newValue.setFullYear(newValue.getFullYear() + offset);\r\n break;\r\n case 'M':\r\n newValue = addMonths(this.value, offset);\r\n break;\r\n case 'd':\r\n case 'E':\r\n newValue.setDate(newValue.getDate() + offset);\r\n break;\r\n case 'h':\r\n case 'H':\r\n newValue.setHours(newValue.getHours() + offset);\r\n timeModified = true;\r\n break;\r\n case 'm':\r\n newValue.setMinutes(newValue.getMinutes() + offset);\r\n timeModified = true;\r\n break;\r\n case 's':\r\n newValue.setSeconds(newValue.getSeconds() + offset);\r\n timeModified = true;\r\n break;\r\n case \"S\":\r\n newValue.setMilliseconds(newValue.getMilliseconds() + offset);\r\n break;\r\n case 'a':\r\n newValue.setHours(newValue.getHours() + (12 * offset));\r\n timeModified = true;\r\n break;\r\n default: break;\r\n }\r\n }\r\n if (this.shouldNormalizeCentury()) {\r\n newValue = this.normalizeCentury(newValue);\r\n }\r\n if (timeModified && !this.cycleTime && newValue.getDate() !== this._value.getDate()) {\r\n // todo: blazor has this fix, but this fails a unit test\r\n // newValue.setDate(this._value.getDate());\r\n // newValue.setMonth(this._value.getMonth());\r\n // newValue.setFullYear(this._value.getFullYear());\r\n }\r\n if (!invalidDateFound) {\r\n this.setExisting(symbol, true);\r\n this._value = newValue;\r\n if (this.getValue()) {\r\n this.resetInvalidDate();\r\n }\r\n }\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateObject.prototype.parsePart = function (_a) {\r\n var symbol = _a.symbol, currentChar = _a.currentChar, resetSegmentValue = _a.resetSegmentValue, cycleSegmentValue = _a.cycleSegmentValue, rawInputValue = _a.rawTextValue, isDeleting = _a.isDeleting, originalFormat = _a.originalFormat;\r\n var isInCaretMode = !cycleSegmentValue;\r\n var dateParts = this.dateFormatString(this.value, this.format);\r\n var datePartsLiterals = dateParts.partMap\r\n .filter(function (x) { return x.type === \"literal\"; })\r\n .map(function (x, index) {\r\n return {\r\n datePartIndex: index,\r\n type: x.type,\r\n pattern: x.pattern,\r\n literal: \"\"\r\n };\r\n });\r\n var flatDateParts = dateParts.partMap\r\n .map(function (x) {\r\n return {\r\n type: x.type,\r\n pattern: x.pattern,\r\n text: \"\"\r\n };\r\n });\r\n for (var i = 0; i < datePartsLiterals.length; i++) {\r\n var datePart = datePartsLiterals[i];\r\n for (var j = 0; j < datePart.pattern.length; j++) {\r\n if (datePartsLiterals[i + j]) {\r\n datePartsLiterals[i + j].literal = datePart.pattern[j];\r\n }\r\n }\r\n i += datePart.pattern.length - 1;\r\n }\r\n for (var i = 0; i < flatDateParts.length; i++) {\r\n var datePart = flatDateParts[i];\r\n for (var j = 0; j < datePart.pattern.length; j++) {\r\n if (flatDateParts[i + j]) {\r\n flatDateParts[i + j].text = datePart.pattern[j];\r\n }\r\n }\r\n i += datePart.pattern.length - 1;\r\n }\r\n var shouldResetPart = isInCaretMode && symbol === \"M\" && dateParts.partMap\r\n .filter(function (x) { return x.type === \"month\"; })\r\n .some(function (x) { return x.pattern.length > MONTH_PART_WITH_WORDS_THRESHOLD; });\r\n var parseResult = {\r\n value: null,\r\n switchToNext: false,\r\n resetPart: shouldResetPart,\r\n hasInvalidDatePart: false\r\n };\r\n if (!currentChar) {\r\n if (isInCaretMode) {\r\n for (var i = 0; i < datePartsLiterals.length; i++) {\r\n var literal = datePartsLiterals[i].literal;\r\n var rawValueStartsWithLiteral = rawInputValue.startsWith(literal);\r\n var rawValueEndsWithLiteral = rawInputValue.endsWith(literal);\r\n var rawValueHasConsecutiveLiterals = rawInputValue.indexOf(literal + literal) >= 0;\r\n if (rawValueStartsWithLiteral || rawValueEndsWithLiteral || rawValueHasConsecutiveLiterals) {\r\n this.resetLeadingZero();\r\n this.setExisting(symbol, false);\r\n this.resetInvalidDateSymbol(symbol);\r\n return extend(parseResult, { value: null, switchToNext: false });\r\n }\r\n }\r\n }\r\n else {\r\n this.resetLeadingZero();\r\n this.setExisting(symbol, false);\r\n this.resetInvalidDateSymbol(symbol);\r\n return extend(parseResult, { value: null, switchToNext: false });\r\n }\r\n }\r\n var baseDate = this.intl.formatDate(this.value, this.format, this.localeId);\r\n var baseFormat = dateParts.symbols;\r\n var replaced = false;\r\n var prefix = '';\r\n var current = '';\r\n var datePartText = '';\r\n var basePrefix = '';\r\n var baseSuffix = '';\r\n var suffix = '';\r\n var convertedBaseFormat = \"\";\r\n for (var i = 0; i < flatDateParts.length; i++) {\r\n convertedBaseFormat += flatDateParts[i].text;\r\n }\r\n var hasFixedFormat = (this.format === baseFormat) ||\r\n (this.format === convertedBaseFormat) ||\r\n (this.format === originalFormat) ||\r\n (this.format.length === originalFormat.length);\r\n var datePartStartIndex = (hasFixedFormat ? convertedBaseFormat : originalFormat).indexOf(symbol);\r\n var datePartEndIndex = (hasFixedFormat ? convertedBaseFormat : originalFormat).lastIndexOf(symbol);\r\n var segmentLength = datePartEndIndex - datePartStartIndex + 1;\r\n var formatToTextLengthDiff = originalFormat.length - rawInputValue.length;\r\n if (isInCaretMode || (!isInCaretMode && !this.autoCorrectParts)) {\r\n for (var i = 0; i < baseDate.length; i++) {\r\n if (baseFormat[i] === symbol) {\r\n var existing = this.getExisting(symbol);\r\n current += existing ? baseDate[i] : '0';\r\n if (formatToTextLengthDiff > 0) {\r\n if (datePartText.length + formatToTextLengthDiff < segmentLength) {\r\n datePartText += rawInputValue[i] || \"\";\r\n }\r\n }\r\n else {\r\n datePartText += rawInputValue[i] || \"\";\r\n }\r\n replaced = true;\r\n }\r\n else if (!replaced) {\r\n prefix += baseDate[i];\r\n basePrefix += baseDate[i];\r\n }\r\n else {\r\n suffix += baseDate[i];\r\n baseSuffix += baseDate[i];\r\n }\r\n }\r\n if (hasFixedFormat) {\r\n if (convertedBaseFormat.length < rawInputValue.length) {\r\n datePartText += currentChar;\r\n }\r\n else if (!isDeleting && originalFormat.length > rawInputValue.length) {\r\n // let the parsing to determine if the incomplete value is valid\r\n }\r\n if (datePartText.length > segmentLength) {\r\n return extend(parseResult, { value: null, switchToNext: false });\r\n }\r\n }\r\n if (!hasFixedFormat || (hasFixedFormat && !this.autoCorrectParts)) {\r\n current = \"\";\r\n datePartText = \"\";\r\n prefix = \"\";\r\n suffix = \"\";\r\n replaced = false;\r\n for (var i = 0; i < originalFormat.length; i++) {\r\n if (originalFormat[i] === symbol) {\r\n var existing = this.getExisting(symbol);\r\n current += existing ? baseDate[i] || \"\" : '0';\r\n if (formatToTextLengthDiff > 0) {\r\n if (datePartText.length + formatToTextLengthDiff < segmentLength) {\r\n datePartText += rawInputValue[i] || \"\";\r\n }\r\n }\r\n else {\r\n datePartText += rawInputValue[i] || \"\";\r\n }\r\n replaced = true;\r\n }\r\n else if (!replaced) {\r\n prefix += rawInputValue[i] || \"\";\r\n }\r\n else {\r\n suffix += rawInputValue[i - formatToTextLengthDiff] || \"\";\r\n }\r\n }\r\n if (originalFormat.length < rawInputValue.length) {\r\n datePartText += currentChar;\r\n }\r\n }\r\n }\r\n if (!isInCaretMode) {\r\n if (this.autoCorrectParts) {\r\n current = \"\";\r\n datePartText = \"\";\r\n prefix = \"\";\r\n suffix = \"\";\r\n replaced = false;\r\n for (var i = 0; i < baseDate.length; i++) {\r\n if (baseFormat[i] === symbol) {\r\n var existing = this.getExisting(symbol);\r\n current += existing ? baseDate[i] : '0';\r\n replaced = true;\r\n }\r\n else if (!replaced) {\r\n prefix += baseDate[i];\r\n }\r\n else {\r\n suffix += baseDate[i];\r\n }\r\n }\r\n }\r\n else {\r\n current = resetSegmentValue ? datePartText : current;\r\n }\r\n }\r\n var parsedDate = null;\r\n var month = this.matchMonth(currentChar);\r\n var dayPeriod = this.matchDayPeriod(currentChar, symbol);\r\n var isZeroCurrentChar = currentChar === '0';\r\n var leadingZero = this.leadingZero || {};\r\n if (isZeroCurrentChar) {\r\n if (datePartText === \"0\") {\r\n datePartText = current;\r\n }\r\n var valueNumber = parseToInt(resetSegmentValue ?\r\n currentChar :\r\n (isInCaretMode ? datePartText : current) + currentChar);\r\n if (valueNumber === 0 && !this.isAbbrMonth(dateParts.partMap, symbol)) {\r\n this.incrementLeadingZero(symbol);\r\n }\r\n }\r\n else {\r\n this.resetLeadingZero();\r\n }\r\n var partPattern = this.partPattern(dateParts.partMap, symbol);\r\n var patternValue = partPattern ? partPattern.pattern : null;\r\n var patternLength = this.patternLength(patternValue) || patternValue.length;\r\n if (isInCaretMode) {\r\n if (isDeleting && !datePartText) {\r\n this.setExisting(symbol, false);\r\n return extend(parseResult, { value: null, switchToNext: false });\r\n }\r\n }\r\n var currentMaxLength = current.length - 3;\r\n var tryParse = true;\r\n var middle = isInCaretMode ? datePartText : current;\r\n for (var i = Math.max(0, currentMaxLength); i <= current.length; i++) {\r\n if (!tryParse) {\r\n break;\r\n }\r\n middle = resetSegmentValue ?\r\n currentChar :\r\n isInCaretMode ?\r\n datePartText :\r\n (current.substring(i) + currentChar);\r\n if (isInCaretMode || !this.autoCorrectParts) {\r\n tryParse = false;\r\n middle = unpadZero(middle);\r\n // middle = padZero(segmentLength - middle.length) + middle;\r\n middle = padZero(patternLength - middle.length) + middle;\r\n }\r\n var middleNumber = parseInt(middle, 10);\r\n var candidateDateString = prefix + middle + suffix;\r\n parsedDate = this.intl.parseDate(candidateDateString, this.format, this.localeId);\r\n var autoCorrectedPrefixAndSuffix = false;\r\n if (isInCaretMode && !isValidDate(parsedDate)) {\r\n // if part of the date is not available, e.g. \"d\"\r\n // but an expanded format like \"F\" is used\r\n // the element value can be \"EEEE, February 1, 2022 3:04:05 AM\"\r\n // which is not parsable by intl\r\n // use the base prefix and suffix, e.g. convert the candidate date string\r\n // to \"Thursday, February 1, 2022 3:04:05 AM\"\r\n // as \"EEEE, February...\" is not parsable\r\n if (this.autoCorrectParts) {\r\n parsedDate = this.intl.parseDate(basePrefix + middle + baseSuffix, this.format, this.localeId);\r\n autoCorrectedPrefixAndSuffix = true;\r\n }\r\n }\r\n var isCurrentCharParsable = !isNaN(parseInt(currentChar, 10)) || (isInCaretMode && isDeleting && currentChar === \"\");\r\n if (!parsedDate && !isNaN(middleNumber) && isCurrentCharParsable && this.autoCorrectParts) {\r\n if (symbol === MONTH_SYMBOL && !month) {\r\n // JS months start from 0 (January) instead of 1 (January)\r\n var monthNumber = middleNumber - JS_MONTH_OFFSET;\r\n if (monthNumber > -1 && monthNumber < 12) {\r\n parsedDate = cloneDate(this.value);\r\n parsedDate.setMonth(monthNumber);\r\n if (parsedDate.getMonth() !== monthNumber) {\r\n parsedDate = lastDayOfMonth(addMonths(parsedDate, -1));\r\n }\r\n }\r\n }\r\n if (symbol === 'y') {\r\n parsedDate = createDate(parseInt(middle, 10), this.month ? this.value.getMonth() : 0, this.date ? this.value.getDate() : 1, this.hours ? this.value.getHours() : 0, this.minutes ? this.value.getMinutes() : 0, this.seconds ? this.value.getSeconds() : 0, this.milliseconds ? this.value.getMilliseconds() : 0);\r\n if (((isInCaretMode && isValidDate(parsedDate)) ||\r\n (!isInCaretMode && parsedDate)) && this.date && parsedDate.getDate() !== this.value.getDate()) {\r\n parsedDate = lastDayOfMonth(addMonths(parsedDate, -1));\r\n }\r\n }\r\n }\r\n if ((isInCaretMode && isValidDate(parsedDate)) || (!isInCaretMode && parsedDate)) {\r\n // move to next segment if the part will overflow with next char\r\n // when start from empty date (01, then 010), padded zeros should be trimmed\r\n var peekedValue = this.peek(middle, patternValue);\r\n var peekedDateString = autoCorrectedPrefixAndSuffix ?\r\n \"\" + basePrefix + peekedValue + baseSuffix :\r\n \"\" + prefix + peekedValue + suffix;\r\n var peekedDate = this.intl.parseDate(peekedDateString, this.format, this.localeId);\r\n var leadingZeroOffset = (this.leadingZero || {})[symbol] || 0;\r\n var patternSatisfied = (leadingZeroOffset + unpadZero(middle).length) >= patternLength;\r\n var switchToNext = peekedDate === null ||\r\n (leadingZero[symbol] ?\r\n patternValue.length <= middle.length :\r\n patternSatisfied);\r\n if (this.shouldNormalizeCentury()) {\r\n parsedDate = this.normalizeCentury(parsedDate);\r\n }\r\n this._value = parsedDate;\r\n this.setExisting(symbol, true);\r\n this.resetInvalidDateSymbol(symbol);\r\n if (!this.autoCorrectParts) {\r\n if (symbol === \"M\") {\r\n if (this.getExisting(\"M\") && this.getExisting(\"y\")) {\r\n // changing from 28/Feb to 29/Feb to 29/March\r\n this.setExisting(\"d\", true);\r\n this.resetInvalidDateSymbol(\"d\");\r\n }\r\n }\r\n else if (symbol === \"d\") {\r\n if (this.getExisting(\"d\") && this.getExisting(\"y\")) {\r\n // changing from 31/Jan to 31/Feb to 28/Feb\r\n this.setExisting(\"M\", true);\r\n this.resetInvalidDateSymbol(\"M\");\r\n }\r\n }\r\n if (!this.hasInvalidDatePart()) {\r\n this.markDatePartsAsExisting();\r\n }\r\n }\r\n return extend(parseResult, { value: this.value, switchToNext: switchToNext });\r\n }\r\n }\r\n if (month) {\r\n parsedDate = this.intl.parseDate(prefix + month + suffix, this.format, this.localeId);\r\n if (parsedDate) {\r\n this._value = parsedDate;\r\n this.setExisting(symbol, true);\r\n return extend(parseResult, { value: this.value, switchToNext: false });\r\n }\r\n }\r\n if (dayPeriod) {\r\n parsedDate = this.intl.parseDate(prefix + dayPeriod + suffix, this.format);\r\n if (parsedDate) {\r\n this._value = parsedDate;\r\n return extend(parseResult, { value: this.value, switchToNext: true });\r\n }\r\n }\r\n if (isZeroCurrentChar) {\r\n this.setExisting(symbol, false);\r\n }\r\n if (!this.autoCorrectParts) {\r\n var datePartValue = void 0;\r\n var textToParse = isInCaretMode ? datePartText : middle;\r\n var parsedValue = parseToInt(textToParse);\r\n if (isNumber(parsedValue)) {\r\n if ((symbol === \"d\" && (parsedValue <= 0 || parsedValue > 31)) ||\r\n (symbol === \"M\" && (parsedValue < 0 || parsedValue > 11))) {\r\n return extend(parseResult, { value: null, switchToNext: false });\r\n }\r\n datePartValue = symbol === \"M\" ?\r\n parsedValue - JS_MONTH_OFFSET :\r\n parsedValue;\r\n var isMonth = symbol === \"M\";\r\n var isDay = symbol === \"d\";\r\n var newValue = cloneDate(this._value);\r\n var invalidDateParts = this._partiallyInvalidDate.invalidDateParts || {};\r\n var year = invalidDateParts.y.value || newValue.getFullYear();\r\n /* tslint:disable:no-shadowed-variable */\r\n var month_1 = isMonth ? datePartValue : invalidDateParts.M.value || newValue.getMonth();\r\n /* tslint:enable:no-shadowed-variable */\r\n var day = isDay ? datePartValue : invalidDateParts.d.value || invalidDateParts.E.value || newValue.getDate();\r\n var hour = invalidDateParts.h.value || invalidDateParts.H.value || newValue.getHours();\r\n var minutes = invalidDateParts.m.value || newValue.getMinutes();\r\n var seconds = invalidDateParts.s.value || newValue.getSeconds();\r\n var milliseconds = invalidDateParts.S.value || newValue.getMilliseconds();\r\n var dateCandidate = createDate(year, month_1, day, hour, minutes, seconds, milliseconds);\r\n var dateCandidateExists = areDatePartsEqualTo(dateCandidate, year, month_1, day, hour, minutes, seconds, milliseconds);\r\n var newValueCandidate = isMonth || isDay ?\r\n this.modifyDateSymbolWithValue(newValue, symbol, isMonth ? month_1 : day) :\r\n null;\r\n var invalidDateFound = false;\r\n if (isMonth && newValueCandidate) {\r\n if (newValueCandidate.getMonth() === month_1) {\r\n if (this.getExisting(\"d\")) {\r\n if (dateCandidateExists) {\r\n newValue = cloneDate(dateCandidate);\r\n this.resetInvalidDateSymbol(symbol);\r\n }\r\n else {\r\n invalidDateFound = true;\r\n this.setInvalidDatePart(symbol, {\r\n value: month_1,\r\n date: cloneDate(newValueCandidate),\r\n startDate: cloneDate(this.value)\r\n });\r\n this.setExisting(symbol, false);\r\n }\r\n }\r\n else if (dateCandidateExists) {\r\n this.resetInvalidDateSymbol(symbol);\r\n newValue = cloneDate(dateCandidate);\r\n if (this.getExisting(\"M\") && this.getExisting(\"y\")) {\r\n // changing from 28/Feb to 29/Feb to 29/March\r\n this.setExisting(\"d\", true);\r\n this.resetInvalidDateSymbol(\"d\");\r\n }\r\n }\r\n else {\r\n this.resetInvalidDateSymbol(symbol);\r\n newValue = cloneDate(newValueCandidate);\r\n }\r\n }\r\n else {\r\n invalidDateFound = true;\r\n this.setInvalidDatePart(symbol, {\r\n value: month_1,\r\n date: cloneDate(newValueCandidate),\r\n startDate: cloneDate(this.value)\r\n });\r\n this.setExisting(symbol, false);\r\n }\r\n }\r\n else if (isDay && newValueCandidate) {\r\n if (newValueCandidate.getDate() === day) {\r\n if (this.getExisting(\"M\")) {\r\n if (dateCandidateExists) {\r\n newValue = cloneDate(dateCandidate);\r\n this.resetInvalidDateSymbol(symbol);\r\n }\r\n else {\r\n invalidDateFound = true;\r\n this.setInvalidDatePart(symbol, {\r\n value: day,\r\n date: cloneDate(newValueCandidate),\r\n startDate: cloneDate(this.value)\r\n });\r\n this.setExisting(symbol, false);\r\n }\r\n }\r\n else if (dateCandidateExists) {\r\n newValue = cloneDate(dateCandidate);\r\n this.resetInvalidDateSymbol(symbol);\r\n if (this.getExisting(\"d\") && this.getExisting(\"y\")) {\r\n // changing from 31/Jan to 31/Feb to 28/Feb\r\n this.setExisting(\"M\", true);\r\n this.resetInvalidDateSymbol(\"M\");\r\n }\r\n }\r\n else {\r\n this.resetInvalidDateSymbol(symbol);\r\n newValue = cloneDate(newValueCandidate);\r\n }\r\n }\r\n else {\r\n invalidDateFound = true;\r\n this.setInvalidDatePart(symbol, {\r\n value: day,\r\n date: cloneDate(this.value),\r\n startDate: cloneDate(this.value)\r\n });\r\n this.setExisting(symbol, false);\r\n }\r\n }\r\n if (!invalidDateFound) {\r\n this.setExisting(symbol, true);\r\n if (isInCaretMode && !isValidDate(parsedDate)) {\r\n var valueCandidate = this.intl.parseDate(basePrefix + middle + baseSuffix, this.format, this.localeId);\r\n if (isValidDate(valueCandidate)) {\r\n this._value = valueCandidate;\r\n }\r\n }\r\n else {\r\n this._value = newValue;\r\n }\r\n if (this.getValue()) {\r\n this.resetInvalidDate();\r\n }\r\n }\r\n var switchToNext = false;\r\n if (symbol === \"M\") {\r\n if (parsedValue >= 2 || textToParse.length >= 2) {\r\n switchToNext = true;\r\n }\r\n else {\r\n switchToNext = false;\r\n }\r\n }\r\n else {\r\n switchToNext = hasFixedFormat ?\r\n textToParse.length === segmentLength :\r\n textToParse.length > segmentLength;\r\n }\r\n return extend(parseResult, {\r\n value: null,\r\n switchToNext: switchToNext,\r\n hasInvalidDatePart: invalidDateFound\r\n });\r\n }\r\n }\r\n return extend(parseResult, { value: null, switchToNext: false });\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateObject.prototype.symbolMap = function (symbol) {\r\n return this.intl.splitDateFormat(this.format, this.localeId).reduce(dateSymbolMap, {})[symbol];\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateObject.prototype.resetLeadingZero = function () {\r\n var hasLeadingZero = this.leadingZero !== null;\r\n this.setLeadingZero(null);\r\n return hasLeadingZero;\r\n };\r\n DateObject.prototype.setLeadingZero = function (leadingZero) {\r\n this.leadingZero = leadingZero;\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateObject.prototype.getLeadingZero = function () {\r\n return this.leadingZero || {};\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateObject.prototype.normalizeCentury = function (date) {\r\n if (!isPresent(date)) {\r\n return date;\r\n }\r\n var twoDigitYear = cropTwoDigitYear(date);\r\n var centuryBase = this.getNormalizedCenturyBase(twoDigitYear);\r\n var normalizedDate = setYears(date, centuryBase + twoDigitYear);\r\n return normalizedDate;\r\n };\r\n DateObject.prototype.incrementLeadingZero = function (symbol) {\r\n var leadingZero = this.leadingZero || {};\r\n leadingZero[symbol] = (leadingZero[symbol] || 0) + 1;\r\n this.leadingZero = leadingZero;\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateObject.prototype.isAbbrMonth = function (parts, symbol) {\r\n var pattern = this.partPattern(parts, symbol);\r\n return pattern.type === 'month' && pattern.names;\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateObject.prototype.partPattern = function (parts, symbol) {\r\n return parts.filter(function (part) { return part.pattern.indexOf(symbol) !== -1; })[0];\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateObject.prototype.peek = function (value, pattern) {\r\n var peekValue = value.replace(/^0*/, '') + '0';\r\n return padZero(pattern.length - peekValue.length) + peekValue;\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateObject.prototype.matchMonth = function (typedChar) {\r\n this.typedMonthPart += typedChar.toLowerCase();\r\n if (this.monthNames.length === 0) {\r\n return '';\r\n }\r\n while (this.typedMonthPart.length > 0) {\r\n for (var i = 0; i < this.monthNames.length; i++) {\r\n if (this.monthNames[i].toLowerCase().indexOf(this.typedMonthPart) === 0) {\r\n return this.monthNames[i];\r\n }\r\n }\r\n var monthAsNum = parseInt(this.typedMonthPart, 10);\r\n /* ensure they exact match */\r\n if (monthAsNum >= 1 && monthAsNum <= 12 && monthAsNum.toString() === this.typedMonthPart) {\r\n return this.monthNames[monthAsNum - 1];\r\n }\r\n this.typedMonthPart = this.typedMonthPart.substring(1, this.typedMonthPart.length);\r\n }\r\n return '';\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateObject.prototype.matchDayPeriod = function (typedChar, symbol) {\r\n var lowerChart = typedChar.toLowerCase();\r\n if (symbol === 'a' && this.dayPeriods) {\r\n if (this.dayPeriods.am.toLowerCase().startsWith(lowerChart)) {\r\n return this.dayPeriods.am;\r\n }\r\n else if (this.dayPeriods.pm.toLowerCase().startsWith(lowerChart)) {\r\n return this.dayPeriods.pm;\r\n }\r\n }\r\n return '';\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateObject.prototype.allFormattedMonths = function (locale) {\r\n if (locale === void 0) { locale = \"en\"; }\r\n var dateFormatParts = this.intl.splitDateFormat(this.format, this.localeId);\r\n for (var i = 0; i < dateFormatParts.length; i++) {\r\n if (dateFormatParts[i].type === 'month' && dateFormatParts[i].names) {\r\n return this.intl.dateFormatNames(locale, dateFormatParts[i].names);\r\n }\r\n }\r\n return [];\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateObject.prototype.allDayPeriods = function (locale) {\r\n if (locale === void 0) { locale = \"en\"; }\r\n var dateFormatParts = this.intl.splitDateFormat(this.format);\r\n for (var i = 0; i < dateFormatParts.length; i++) {\r\n if (dateFormatParts[i].type === \"dayperiod\" && dateFormatParts[i].names) {\r\n return this.intl.dateFormatNames(locale, dateFormatParts[i].names);\r\n }\r\n }\r\n return null;\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateObject.prototype.patternLength = function (pattern) {\r\n if (pattern[0] === 'y') {\r\n return 4;\r\n }\r\n if (SHORT_PATTERN_LENGTH_REGEXP.test(pattern)) {\r\n return 2;\r\n }\r\n return 0;\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateObject.prototype.dateFormatString = function (date, format) {\r\n var dateFormatParts = this.intl.splitDateFormat(format, this.localeId);\r\n var parts = [];\r\n var partMap = [];\r\n for (var i = 0; i < dateFormatParts.length; i++) {\r\n var partLength = this.intl.formatDate(date, { pattern: dateFormatParts[i].pattern }, this.localeId).length;\r\n while (partLength > 0) {\r\n parts.push(this.symbols[dateFormatParts[i].pattern[0]] || Constants.formatSeparator);\r\n partMap.push(dateFormatParts[i]);\r\n partLength--;\r\n }\r\n }\r\n var returnValue = new Mask();\r\n returnValue.symbols = parts.join('');\r\n returnValue.partMap = partMap;\r\n return returnValue;\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateObject.prototype.merge = function (text, mask) {\r\n // Important: right to left.\r\n var resultText = '';\r\n var resultFormat = '';\r\n var format = mask.symbols;\r\n var processTextSymbolsEnded = false;\r\n var ignoreFormatSymbolsCount = 0;\r\n var formattedDates = this.getFormattedInvalidDates(format);\r\n for (var formatSymbolIndex = format.length - 1; formatSymbolIndex >= 0; formatSymbolIndex--) {\r\n var partsForSegment = this.getPartsForSegment(mask, formatSymbolIndex);\r\n if (this.knownParts.indexOf(format[formatSymbolIndex]) === -1 || this.getExisting(format[formatSymbolIndex])) {\r\n if (this.autoCorrectParts) {\r\n resultText = text[formatSymbolIndex] + resultText;\r\n }\r\n else {\r\n if (text.length !== format.length) {\r\n if (processTextSymbolsEnded) {\r\n resultText = text[formatSymbolIndex] + resultText;\r\n }\r\n else if (ignoreFormatSymbolsCount > 0) {\r\n resultText = text[formatSymbolIndex] + resultText;\r\n ignoreFormatSymbolsCount--;\r\n if (ignoreFormatSymbolsCount <= 0) {\r\n processTextSymbolsEnded = true;\r\n }\r\n }\r\n else {\r\n resultText = (text[formatSymbolIndex + text.length - format.length] || \"\") + resultText;\r\n }\r\n }\r\n else {\r\n resultText = text[formatSymbolIndex] + resultText;\r\n }\r\n }\r\n resultFormat = format[formatSymbolIndex] + resultFormat;\r\n }\r\n else {\r\n var symbol = format[formatSymbolIndex];\r\n var formatSymbolIndexModifier = 0;\r\n if (this.autoCorrectParts || (!this.autoCorrectParts && !this.getInvalidDatePartValue(symbol))) {\r\n while (formatSymbolIndex >= 0 && symbol === format[formatSymbolIndex]) {\r\n formatSymbolIndex--;\r\n }\r\n formatSymbolIndex++;\r\n }\r\n if (this.leadingZero && this.leadingZero[symbol]) {\r\n resultText = '0' + resultText;\r\n }\r\n else {\r\n if (!this.autoCorrectParts && this.getInvalidDatePartValue(symbol)) {\r\n var datePartText = this.getInvalidDatePartValue(symbol).toString();\r\n if (symbol === \"M\") {\r\n datePartText = (parseToInt(this.getInvalidDatePartValue(symbol)) + JS_MONTH_OFFSET).toString();\r\n if (partsForSegment.length > MONTH_PART_WITH_WORDS_THRESHOLD) {\r\n resultText = formattedDates[symbol][formatSymbolIndex] + resultText;\r\n }\r\n else {\r\n datePartText = (parseToInt(this.getInvalidDatePartValue(symbol)) + JS_MONTH_OFFSET).toString();\r\n var formattedDatePart = padZero(partsForSegment.length - datePartText.length) + datePartText;\r\n resultText = formattedDatePart + resultText;\r\n formatSymbolIndexModifier = partsForSegment.length - 1;\r\n ignoreFormatSymbolsCount = datePartText.length - partsForSegment.length;\r\n }\r\n }\r\n else {\r\n var formattedDatePart = padZero(partsForSegment.length - datePartText.length) + datePartText;\r\n resultText = formattedDatePart + resultText;\r\n formatSymbolIndexModifier = partsForSegment.length - 1;\r\n ignoreFormatSymbolsCount = datePartText.length - partsForSegment.length;\r\n }\r\n }\r\n else {\r\n resultText = this.dateFieldName(mask.partMap[formatSymbolIndex]) + resultText;\r\n }\r\n }\r\n while (resultFormat.length < resultText.length) {\r\n resultFormat = format[formatSymbolIndex] + resultFormat;\r\n }\r\n if (formatSymbolIndexModifier !== 0) {\r\n formatSymbolIndex = (formatSymbolIndex - formatSymbolIndexModifier) + (text.length - format.length);\r\n }\r\n }\r\n }\r\n return { text: resultText, format: resultFormat };\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateObject.prototype.dateFieldName = function (part) {\r\n var formatPlaceholder = this.formatPlaceholder || 'wide';\r\n if (formatPlaceholder[part.type]) {\r\n return formatPlaceholder[part.type];\r\n }\r\n if (formatPlaceholder === 'formatPattern') {\r\n return part.pattern;\r\n }\r\n return this.intl.dateFieldName(Object.assign(part, { nameType: formatPlaceholder }));\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateObject.prototype.getNormalizedCenturyBase = function (twoDigitYear) {\r\n return twoDigitYear > this.twoDigitYearMax ?\r\n PREVIOUS_CENTURY_BASE :\r\n CURRENT_CENTURY_BASE;\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateObject.prototype.shouldNormalizeCentury = function () {\r\n return this.intl.splitDateFormat(this.format).some(function (part) { return part.pattern === 'yy'; });\r\n };\r\n DateObject.prototype.resetInvalidDate = function () {\r\n var _this = this;\r\n this._partiallyInvalidDate.startDate = null;\r\n Object.keys(this._partiallyInvalidDate.invalidDateParts).forEach(function (key) {\r\n _this.resetInvalidDatePart(key);\r\n });\r\n };\r\n DateObject.prototype.resetInvalidDateSymbol = function (symbol) {\r\n var _this = this;\r\n this.resetInvalidDatePart(symbol);\r\n var shouldResetInvalidDate = true;\r\n Object.keys(this._partiallyInvalidDate.invalidDateParts).forEach(function (key) {\r\n if (_this._partiallyInvalidDate.invalidDateParts[key] &&\r\n isPresent(_this._partiallyInvalidDate.invalidDateParts[key].value)) {\r\n shouldResetInvalidDate = false;\r\n }\r\n });\r\n if (shouldResetInvalidDate) {\r\n this.resetInvalidDate();\r\n }\r\n };\r\n DateObject.prototype.resetInvalidDatePart = function (symbol) {\r\n if (this._partiallyInvalidDate.invalidDateParts[symbol]) {\r\n this._partiallyInvalidDate.invalidDateParts[symbol] = {\r\n value: null,\r\n date: null,\r\n startDateOffset: 0\r\n };\r\n }\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateObject.prototype.getInvalidDatePart = function (symbol) {\r\n var invalidDatePart = this._partiallyInvalidDate.invalidDateParts[symbol];\r\n return invalidDatePart || {};\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateObject.prototype.getInvalidDatePartValue = function (symbol) {\r\n var invalidDatePart = this._partiallyInvalidDate.invalidDateParts[symbol];\r\n return (invalidDatePart || {}).value;\r\n };\r\n DateObject.prototype.setInvalidDatePart = function (symbol, _a) {\r\n var _b = _a.value, value = _b === void 0 ? null : _b, _c = _a.date, date = _c === void 0 ? null : _c, _d = _a.startDateOffset, startDateOffset = _d === void 0 ? 0 : _d, _e = _a.startDate, startDate = _e === void 0 ? null : _e;\r\n if (this._partiallyInvalidDate.invalidDateParts[symbol]) {\r\n this._partiallyInvalidDate.invalidDateParts[symbol].value = value;\r\n this._partiallyInvalidDate.invalidDateParts[symbol].date = date;\r\n this._partiallyInvalidDate.invalidDateParts[symbol].startDateOffset = startDateOffset;\r\n this._partiallyInvalidDate.startDate = startDate;\r\n }\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateObject.prototype.hasInvalidDatePart = function () {\r\n var _this = this;\r\n var hasInvalidDatePart = false;\r\n Object.keys(this._partiallyInvalidDate.invalidDateParts).forEach(function (key) {\r\n if (_this._partiallyInvalidDate.invalidDateParts[key] &&\r\n isPresent(_this._partiallyInvalidDate.invalidDateParts[key].value)) {\r\n hasInvalidDatePart = true;\r\n }\r\n });\r\n return hasInvalidDatePart;\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateObject.prototype.modifyDateSymbolWithOffset = function (date, symbol, offset) {\r\n var newValue = cloneDate(date);\r\n var timeModified = false;\r\n switch (symbol) {\r\n case 'y':\r\n newValue.setFullYear(newValue.getFullYear() + offset);\r\n break;\r\n case 'M':\r\n newValue = addMonths(this.value, offset);\r\n break;\r\n case 'd':\r\n case 'E':\r\n newValue.setDate(newValue.getDate() + offset);\r\n break;\r\n case 'h':\r\n case 'H':\r\n newValue.setHours(newValue.getHours() + offset);\r\n timeModified = true;\r\n break;\r\n case 'm':\r\n newValue.setMinutes(newValue.getMinutes() + offset);\r\n timeModified = true;\r\n break;\r\n case 's':\r\n newValue.setSeconds(newValue.getSeconds() + offset);\r\n timeModified = true;\r\n break;\r\n case \"S\":\r\n newValue.setMilliseconds(newValue.getMilliseconds() + offset);\r\n break;\r\n case 'a':\r\n newValue.setHours(newValue.getHours() + (12 * offset));\r\n timeModified = true;\r\n break;\r\n default: break;\r\n }\r\n return {\r\n date: newValue,\r\n timeModified: timeModified\r\n };\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateObject.prototype.modifyDateSymbolWithValue = function (date, symbol, value) {\r\n var newValue = cloneDate(date);\r\n switch (symbol) {\r\n case 'y':\r\n newValue.setFullYear(value);\r\n break;\r\n case 'M':\r\n newValue = addMonths(date, value - date.getMonth());\r\n break;\r\n case 'd':\r\n case 'E':\r\n newValue.setDate(value);\r\n break;\r\n case 'h':\r\n case 'H':\r\n newValue.setHours(value);\r\n break;\r\n case 'm':\r\n newValue.setMinutes(value);\r\n break;\r\n case 's':\r\n newValue.setSeconds(value);\r\n break;\r\n case \"S\":\r\n newValue.setMilliseconds(value);\r\n break;\r\n case 'a':\r\n newValue.setHours(value);\r\n break;\r\n default: break;\r\n }\r\n return newValue;\r\n };\r\n DateObject.prototype.markDatePartsAsExisting = function () {\r\n this.modifyExisting(true);\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateObject.prototype.getPartsForSegment = function (mask, partIndex) {\r\n var segmentPart = mask.partMap[partIndex];\r\n var partsForSegment = [];\r\n for (var maskPartIndex = partIndex; maskPartIndex < mask.partMap.length; maskPartIndex++) {\r\n var part = mask.partMap[maskPartIndex];\r\n if (segmentPart.type === part.type && segmentPart.pattern === part.pattern) {\r\n partsForSegment.push(part);\r\n }\r\n else {\r\n break;\r\n }\r\n }\r\n for (var maskPartIndex = partIndex - 1; maskPartIndex >= 0; maskPartIndex--) {\r\n var part = mask.partMap[maskPartIndex];\r\n if (segmentPart.type === part.type && segmentPart.pattern === part.pattern) {\r\n partsForSegment.unshift(part);\r\n }\r\n else {\r\n break;\r\n }\r\n }\r\n return partsForSegment;\r\n };\r\n return DateObject;\r\n }());\r\n\r\n var KeyCode = {\r\n BACKSPACE: 8,\r\n DELETE: 46,\r\n TAB: 9,\r\n ENTER: 13,\r\n ESCAPE: 27,\r\n ARROW_LEFT: 37,\r\n ARROW_UP: 38,\r\n ARROW_RIGHT: 39,\r\n ARROW_DOWN: 40,\r\n SPACE: 32,\r\n END: 35,\r\n HOME: 36,\r\n PAGE_UP: 33,\r\n PAGE_DOWN: 34\r\n };\r\n\r\n var defaultOptions = {\r\n events: {}\r\n };\r\n var Observable = /** @class */ (function () {\r\n function Observable(options) {\r\n this.options = deepExtend({}, defaultOptions, options);\r\n }\r\n Observable.prototype.destroy = function () {\r\n };\r\n /**\r\n * @hidden\r\n */\r\n Observable.prototype.trigger = function (eventName, args) {\r\n if (args === void 0) { args = {}; }\r\n var eventData = {\r\n defaultPrevented: false,\r\n preventDefault: function () {\r\n eventData.defaultPrevented = true;\r\n }\r\n };\r\n if (isFunction(this.options.events[eventName])) {\r\n this.options.events[eventName](extend(eventData, args, {\r\n sender: this\r\n }));\r\n return eventData.defaultPrevented;\r\n }\r\n return false;\r\n };\r\n return Observable;\r\n }());\r\n\r\n var DateInputInteractionMode;\r\n (function (DateInputInteractionMode) {\r\n DateInputInteractionMode[\"None\"] = \"none\";\r\n DateInputInteractionMode[\"Caret\"] = \"caret\";\r\n DateInputInteractionMode[\"Selection\"] = \"selection\";\r\n })(DateInputInteractionMode || (DateInputInteractionMode = {}));\r\n\r\n var _a;\r\n var DEFAULT_SEGMENT_STEP = 1;\r\n var DRAG_START = \"dragStart\";\r\n var DROP = \"drop\";\r\n var TOUCH_START = \"touchstart\";\r\n var MOUSE_DOWN = \"mousedown\";\r\n var MOUSE_UP = \"mouseup\";\r\n var CLICK = \"click\";\r\n var INPUT = \"input\";\r\n var KEY_DOWN = \"keydown\";\r\n var FOCUS = \"focus\";\r\n var BLUR = \"blur\";\r\n var PASTE = \"paste\";\r\n var MOUSE_SCROLL = \"DOMMouseScroll\";\r\n var MOUSE_WHEEL = \"mousewheel\";\r\n var VALUE_CHANGE = \"valueChange\";\r\n var INPUT_END = \"inputEnd\";\r\n var BLUR_END = \"blurEnd\";\r\n var FOCUS_END = \"focusEnd\";\r\n var CHANGE = \"change\";\r\n var defaultDateInputOptions = {\r\n format: \"d\",\r\n hasPlaceholder: false,\r\n placeholder: null,\r\n cycleTime: true,\r\n locale: null,\r\n steps: {\r\n millisecond: DEFAULT_SEGMENT_STEP,\r\n second: DEFAULT_SEGMENT_STEP,\r\n minute: DEFAULT_SEGMENT_STEP,\r\n hour: DEFAULT_SEGMENT_STEP,\r\n day: DEFAULT_SEGMENT_STEP,\r\n month: DEFAULT_SEGMENT_STEP,\r\n year: DEFAULT_SEGMENT_STEP\r\n },\r\n formatPlaceholder: null,\r\n events: (_a = {},\r\n _a[VALUE_CHANGE] = null,\r\n _a[INPUT] = null,\r\n _a[INPUT_END] = null,\r\n _a[FOCUS] = null,\r\n _a[FOCUS_END] = null,\r\n _a[BLUR] = null,\r\n _a[BLUR_END] = null,\r\n _a[KEY_DOWN] = null,\r\n _a[MOUSE_WHEEL] = null,\r\n _a[CHANGE] = null,\r\n _a),\r\n selectNearestSegmentOnFocus: false,\r\n selectPreviousSegmentOnBackspace: false,\r\n enableMouseWheel: false,\r\n allowCaretMode: false,\r\n autoSwitchParts: true,\r\n autoSwitchKeys: [],\r\n twoDigitYearMax: Constants.twoDigitYearMax,\r\n autoCorrectParts: true,\r\n autoFill: false\r\n };\r\n var DateInput = /** @class */ (function (_super) {\r\n __extends(DateInput, _super);\r\n function DateInput(element, options) {\r\n var _this = _super.call(this, options) || this;\r\n _this.dateObject = null;\r\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\r\n // @ts-ignore\r\n _this.currentText = '';\r\n _this.currentFormat = '';\r\n _this.interactionMode = DateInputInteractionMode.None;\r\n _this.previousElementSelection = { start: 0, end: 0 };\r\n _this.init(element, options);\r\n return _this;\r\n }\r\n Object.defineProperty(DateInput.prototype, \"value\", {\r\n get: function () {\r\n return this.dateObject && this.dateObject.getValue();\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n DateInput.prototype.init = function (element, options) {\r\n var dateValue = isValidDate(this.options.value) ? cloneDate(this.options.value) : new Date(options.formattedValue);\r\n if (!isValidDate(dateValue)) {\r\n dateValue = null;\r\n }\r\n this.element = element;\r\n // this.element._kendoWidget = this;\r\n this.options = deepExtend({}, defaultDateInputOptions, options);\r\n this.intl = this.options.intlService;\r\n this.dateObject = this.createDateObject();\r\n this.dateObject.setValue(dateValue);\r\n this.setTextAndFormat();\r\n this.bindEvents();\r\n this.resetSegmentValue = true;\r\n this.interactionMode = DateInputInteractionMode.None;\r\n this.forceUpdate();\r\n };\r\n DateInput.prototype.destroy = function () {\r\n this.unbindEvents();\r\n this.dateObject = null;\r\n _super.prototype.destroy.call(this);\r\n };\r\n DateInput.prototype.bindEvents = function () {\r\n this.onElementDragStart = this.onElementDragStart.bind(this);\r\n this.element.addEventListener(DRAG_START, this.onElementDragStart);\r\n this.onElementDrop = this.onElementDrop.bind(this);\r\n this.element.addEventListener(DROP, this.onElementDrop);\r\n this.onElementClick = this.onElementClick.bind(this);\r\n this.element.addEventListener(CLICK, this.onElementClick);\r\n this.onElementMouseDown = this.onElementMouseDown.bind(this);\r\n this.element.addEventListener(MOUSE_DOWN, this.onElementMouseDown);\r\n this.element.addEventListener(TOUCH_START, this.onElementMouseDown);\r\n this.onElementMouseUp = this.onElementMouseUp.bind(this);\r\n this.element.addEventListener(MOUSE_UP, this.onElementMouseUp);\r\n this.onElementInput = this.onElementInput.bind(this);\r\n this.element.addEventListener(INPUT, this.onElementInput);\r\n this.onElementKeyDown = this.onElementKeyDown.bind(this);\r\n this.element.addEventListener(KEY_DOWN, this.onElementKeyDown);\r\n this.onElementFocus = this.onElementFocus.bind(this);\r\n this.element.addEventListener(FOCUS, this.onElementFocus);\r\n this.onElementBlur = this.onElementBlur.bind(this);\r\n this.element.addEventListener(BLUR, this.onElementBlur);\r\n this.onElementChange = this.onElementChange.bind(this);\r\n this.element.addEventListener(CHANGE, this.onElementChange);\r\n this.onElementPaste = this.onElementPaste.bind(this);\r\n this.element.addEventListener(PASTE, this.onElementPaste);\r\n this.onElementMouseWheel = this.onElementMouseWheel.bind(this);\r\n this.element.addEventListener(MOUSE_SCROLL, this.onElementMouseWheel);\r\n this.element.addEventListener(MOUSE_WHEEL, this.onElementMouseWheel);\r\n };\r\n DateInput.prototype.unbindEvents = function () {\r\n this.element.removeEventListener(DRAG_START, this.onElementDragStart);\r\n this.element.removeEventListener(DROP, this.onElementDrop);\r\n this.element.removeEventListener(TOUCH_START, this.onElementMouseDown);\r\n this.element.removeEventListener(MOUSE_DOWN, this.onElementMouseDown);\r\n this.element.removeEventListener(MOUSE_UP, this.onElementMouseUp);\r\n this.element.removeEventListener(CLICK, this.onElementClick);\r\n this.element.removeEventListener(INPUT, this.onElementInput);\r\n this.element.removeEventListener(KEY_DOWN, this.onElementKeyDown);\r\n this.element.removeEventListener(FOCUS, this.onElementFocus);\r\n this.element.removeEventListener(BLUR, this.onElementBlur);\r\n this.element.removeEventListener(CHANGE, this.onElementChange);\r\n this.element.removeEventListener(PASTE, this.onElementPaste);\r\n this.element.removeEventListener(MOUSE_SCROLL, this.onElementMouseWheel);\r\n this.element.removeEventListener(MOUSE_WHEEL, this.onElementMouseWheel);\r\n };\r\n DateInput.prototype.setOptions = function (options, refresh) {\r\n if (refresh === void 0) { refresh = false; }\r\n this.options = deepExtend({}, this.options, options);\r\n this.setDateObjectOptions();\r\n if (refresh) {\r\n this.unbindEvents();\r\n this.init(this.element, this.options);\r\n }\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateInput.prototype.setDateObjectOptions = function () {\r\n if (this.dateObject) {\r\n var newOptions = this.getDateObjectOptions();\r\n this.dateObject.setOptions(newOptions);\r\n }\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateInput.prototype.resetLocale = function () {\r\n this.unbindEvents();\r\n this.init(this.element, this.options);\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateInput.prototype.isInCaretMode = function () {\r\n return this.interactionMode === DateInputInteractionMode.Caret;\r\n };\r\n DateInput.prototype.focus = function () {\r\n this.element.focus();\r\n if (this.options.selectNearestSegmentOnFocus) {\r\n this.selectNearestSegment(0);\r\n }\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateInput.prototype.onElementDragStart = function (e) {\r\n e.preventDefault();\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateInput.prototype.onElementDrop = function (e) {\r\n e.preventDefault();\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateInput.prototype.onElementMouseDown = function () {\r\n this.mouseDownStarted = true;\r\n this.focusedPriorToMouseDown = this.isActive;\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateInput.prototype.onElementMouseUp = function (e) {\r\n this.mouseDownStarted = false;\r\n e.preventDefault();\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateInput.prototype.onElementClick = function (e) {\r\n this.mouseDownStarted = false;\r\n this.switchedPartOnPreviousKeyAction = false;\r\n var selection = this.selection;\r\n if (this.isInCaretMode()) {\r\n // explicitly refresh the input element value\r\n // caret mode can change the number of symbols in the element\r\n // thus clicking on a segment can result in incorrect selection\r\n this.forceUpdate();\r\n }\r\n if (e.detail === 3) {\r\n // when 3 clicks occur, leave the native event to handle the change\r\n // this results in selecting the whole element value\r\n }\r\n else {\r\n if (this.isActive && this.options.selectNearestSegmentOnFocus) {\r\n var selectionPresent = this.element.selectionStart !== this.element.selectionEnd;\r\n var placeholderToggled = isPresent(this.options.placeholder) &&\r\n !this.dateObject.hasValue() &&\r\n !this.focusedPriorToMouseDown;\r\n // focus first segment if the user hasn't selected something during mousedown and if the placeholder was just toggled\r\n var selectFirstSegment = !selectionPresent && placeholderToggled;\r\n var index = selectFirstSegment ? 0 : this.caret()[0];\r\n this.selectNearestSegment(index);\r\n }\r\n else {\r\n this.setSelection(this.selectionByIndex(selection.start));\r\n }\r\n }\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateInput.prototype.onElementInput = function (e) {\r\n this.triggerInput({ event: e });\r\n if (!this.element || !this.dateObject) {\r\n return;\r\n }\r\n var switchedPartOnPreviousKeyAction = this.switchedPartOnPreviousKeyAction;\r\n if (this.isPasteInProgress) {\r\n if (this.options.allowCaretMode) {\r\n // pasting should leave the input with caret\r\n // thus allow direct input instead of selection mode\r\n this.resetSegmentValue = false;\r\n }\r\n this.updateOnPaste(e);\r\n this.isPasteInProgress = false;\r\n return;\r\n }\r\n var keyDownEvent = this.keyDownEvent || {};\r\n var isBackspaceKey = keyDownEvent.keyCode === KeyCode.BACKSPACE || keyDownEvent.key === Key.BACKSPACE;\r\n var isDeleteKey = keyDownEvent.keyCode === KeyCode.DELETE || keyDownEvent.key === Key.DELETE;\r\n var originalInteractionMode = this.interactionMode;\r\n if (this.options.allowCaretMode &&\r\n originalInteractionMode !== DateInputInteractionMode.Caret &&\r\n !isDeleteKey && !isBackspaceKey) {\r\n this.resetSegmentValue = true;\r\n }\r\n if (this.options.allowCaretMode) {\r\n this.interactionMode = DateInputInteractionMode.Caret;\r\n }\r\n else {\r\n this.interactionMode = DateInputInteractionMode.Selection;\r\n }\r\n var hasCaret = this.isInCaretMode();\r\n if (hasCaret && this.keyDownEvent.key === Key.SPACE) {\r\n // do not allow custom \"holes\" in the date segments\r\n this.restorePreviousInputEventState();\r\n return;\r\n }\r\n var oldExistingDateValue = this.dateObject && this.dateObject.getValue();\r\n var oldDateValue = this.dateObject ? this.dateObject.value : null;\r\n var _a = this.dateObject.getTextAndFormat(), currentText = _a.text, currentFormat = _a.format;\r\n this.currentFormat = currentFormat;\r\n var oldText = \"\";\r\n if (hasCaret) {\r\n if (isBackspaceKey || isDeleteKey) {\r\n oldText = this.previousElementValue;\r\n }\r\n else if (originalInteractionMode === DateInputInteractionMode.Caret) {\r\n oldText = this.previousElementValue;\r\n }\r\n else {\r\n oldText = currentText;\r\n }\r\n }\r\n else {\r\n oldText = currentText;\r\n }\r\n var newText = this.elementValue;\r\n var diff = approximateStringMatching({\r\n oldText: oldText,\r\n newText: newText,\r\n formatPattern: this.currentFormat,\r\n selectionStart: this.selection.start,\r\n isInCaretMode: hasCaret,\r\n keyEvent: this.keyDownEvent\r\n });\r\n if (diff && diff.length && diff[0] && diff[0][1] !== Constants.formatSeparator) {\r\n this.switchedPartOnPreviousKeyAction = false;\r\n }\r\n if (hasCaret && (!diff || diff.length === 0)) {\r\n this.restorePreviousInputEventState();\r\n return;\r\n }\r\n else if (hasCaret && diff.length === 1) {\r\n if (!diff[0] || !diff[0][0]) {\r\n this.restorePreviousInputEventState();\r\n return;\r\n }\r\n else if (hasCaret && diff[0] &&\r\n (diff[0][0] === Constants.formatSeparator || diff[0][1] === Constants.formatSeparator)) {\r\n this.restorePreviousInputEventState();\r\n return;\r\n }\r\n }\r\n var navigationOnly = (diff.length === 1 && diff[0][1] === Constants.formatSeparator);\r\n var parsePartsResults = [];\r\n var switchPart = false;\r\n var error = null;\r\n if (!navigationOnly) {\r\n for (var i = 0; i < diff.length; i++) {\r\n var parsePartResult = this.dateObject.parsePart({\r\n symbol: diff[i][0],\r\n currentChar: diff[i][1],\r\n resetSegmentValue: this.resetSegmentValue,\r\n cycleSegmentValue: !this.isInCaretMode(),\r\n rawTextValue: this.element.value,\r\n isDeleting: isBackspaceKey || isDeleteKey,\r\n originalFormat: this.currentFormat\r\n });\r\n parsePartsResults.push(parsePartResult);\r\n if (!parsePartResult.value) {\r\n error = { type: \"parse\" };\r\n }\r\n switchPart = parsePartResult.switchToNext;\r\n }\r\n }\r\n if (!this.options.autoSwitchParts) {\r\n switchPart = false;\r\n }\r\n this.resetSegmentValue = false;\r\n var hasFixedFormat = this.options.format === this.currentFormat ||\r\n // all not fixed formats are 1 symbol, e.g. \"d\"\r\n (isPresent(this.options.format) && this.options.format.length > 1);\r\n var lastParseResult = parsePartsResults[parsePartsResults.length - 1];\r\n var lastParseResultHasNoValue = lastParseResult && !isPresent(lastParseResult.value);\r\n var parsingFailedOnDelete = (hasCaret && (isBackspaceKey || isDeleteKey) && lastParseResultHasNoValue);\r\n var resetPart = lastParseResult ? lastParseResult.resetPart : false;\r\n var newExistingDateValue = this.dateObject.getValue();\r\n var hasExistingDateValueChanged = !isEqual(oldExistingDateValue, newExistingDateValue);\r\n var newDateValue = this.dateObject.value;\r\n var symbolForSelection;\r\n var currentSelection = this.selection;\r\n if (hasCaret) {\r\n var diffChar = diff && diff.length > 0 ? diff[0][0] : null;\r\n var hasLeadingZero = this.dateObject.getLeadingZero()[diffChar];\r\n if (diff.length && diff[0][0] !== Constants.formatSeparator) {\r\n if (switchPart) {\r\n this.forceUpdateWithSelection();\r\n this.switchDateSegment(1);\r\n }\r\n else if (resetPart) {\r\n symbolForSelection = this.currentFormat[currentSelection.start];\r\n if (symbolForSelection) {\r\n this.forceUpdate();\r\n this.setSelection(this.selectionBySymbol(symbolForSelection));\r\n }\r\n else {\r\n this.restorePreviousInputEventState();\r\n }\r\n }\r\n else if (parsingFailedOnDelete) {\r\n this.forceUpdate();\r\n if (diff.length && diff[0][0] !== Constants.formatSeparator) {\r\n this.setSelection(this.selectionBySymbol(diff[0][0]));\r\n }\r\n }\r\n else if (lastParseResultHasNoValue) {\r\n if (e.data === \"0\" && hasLeadingZero) {\r\n // do not reset element value on a leading zero\r\n // wait for consecutive input to determine the value\r\n }\r\n else if (isPresent(oldExistingDateValue) && !isPresent(newExistingDateValue)) {\r\n this.restorePreviousInputEventState();\r\n }\r\n else if (!isPresent(oldExistingDateValue) && isPresent(newExistingDateValue)) {\r\n this.forceUpdateWithSelection();\r\n }\r\n else if (isPresent(oldExistingDateValue) && isPresent(newExistingDateValue)) {\r\n if (hasExistingDateValueChanged) {\r\n this.forceUpdateWithSelection();\r\n }\r\n else {\r\n this.restorePreviousInputEventState();\r\n }\r\n }\r\n else if (!isPresent(oldExistingDateValue) && !isPresent(newExistingDateValue)) {\r\n this.forceUpdateWithSelection();\r\n }\r\n else if (oldDateValue !== newDateValue) {\r\n // this can happen on auto correct when no valid value is parsed\r\n }\r\n else {\r\n this.restorePreviousInputEventState();\r\n }\r\n }\r\n else if (!lastParseResultHasNoValue) {\r\n // the user types a valid but incomplete date (e.g. year \"123\" with format \"yyyy\")\r\n // let them continue typing, but refresh for not fixed formats\r\n if (!hasFixedFormat) {\r\n this.forceUpdateWithSelection();\r\n }\r\n }\r\n }\r\n else {\r\n if (!this.options.autoSwitchParts && diff[0][1] === Constants.formatSeparator) {\r\n // do not change the selection when a separator is pressed\r\n // this should happen only if autoSwitchKeys contains the separator explicitly\r\n }\r\n else {\r\n this.setSelection(this.selectionBySymbol(diff[0][0]));\r\n }\r\n }\r\n }\r\n else if (!hasCaret) {\r\n this.forceUpdate();\r\n if (diff.length && diff[0][0] !== Constants.formatSeparator) {\r\n this.setSelection(this.selectionBySymbol(diff[0][0]));\r\n }\r\n if (this.options.autoSwitchParts) {\r\n if (navigationOnly) {\r\n this.resetSegmentValue = true;\r\n if (!switchedPartOnPreviousKeyAction) {\r\n this.switchDateSegment(1);\r\n }\r\n this.switchedPartOnPreviousKeyAction = true;\r\n }\r\n else if (switchPart) {\r\n this.switchDateSegment(1);\r\n this.switchedPartOnPreviousKeyAction = true;\r\n }\r\n }\r\n else {\r\n if (lastParseResult && lastParseResult.switchToNext) {\r\n // the value is complete and should be switched, but the \"autoSwitchParts\" option prevents this\r\n // ensure that the segment value can be reset on next input\r\n this.resetSegmentValue = true;\r\n }\r\n else if (navigationOnly) {\r\n this.resetSegmentValue = true;\r\n if (!switchedPartOnPreviousKeyAction) {\r\n this.switchDateSegment(1);\r\n }\r\n this.switchedPartOnPreviousKeyAction = true;\r\n }\r\n }\r\n if (isBackspaceKey && this.options.selectPreviousSegmentOnBackspace) {\r\n // kendo angular have this UX\r\n this.switchDateSegment(-1);\r\n }\r\n }\r\n this.tryTriggerValueChange({\r\n oldValue: oldExistingDateValue,\r\n event: e\r\n });\r\n this.triggerInputEnd({ event: e, error: error });\r\n if (hasCaret) {\r\n // a format like \"F\" can dynamically change the resolved format pattern based on the value, e.g.\r\n // \"Tuesday, February 1, 2022 3:04:05 AM\" becomes\r\n // \"Wednesday, February 2, 2022 3:04:05 AM\" giving a diff of 2 (\"Tuesday\".length - \"Wednesday\".length)\r\n this.setTextAndFormat();\r\n }\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateInput.prototype.onElementFocus = function (e) {\r\n if (this.triggerFocus({ event: e })) {\r\n return;\r\n }\r\n this.isActive = true;\r\n this.interactionMode = DateInputInteractionMode.None;\r\n this.switchedPartOnPreviousKeyAction = false;\r\n this.refreshElementValue();\r\n if (!this.mouseDownStarted) {\r\n this.caret(0, this.elementValue.length);\r\n }\r\n this.mouseDownStarted = false;\r\n this.triggerFocusEnd({ event: e });\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateInput.prototype.onElementBlur = function (e) {\r\n this.resetSegmentValue = true;\r\n this.isActive = false;\r\n if (this.triggerBlur({ event: e })) {\r\n return;\r\n }\r\n if (this.options.autoFill) {\r\n this.autoFill();\r\n }\r\n this.interactionMode = DateInputInteractionMode.None;\r\n this.switchedPartOnPreviousKeyAction = false;\r\n this.refreshElementValue();\r\n this.triggerBlurEnd({ event: e });\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateInput.prototype.onElementChange = function (e) {\r\n this.triggerChange({ event: e });\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateInput.prototype.onElementKeyDown = function (e) {\r\n if (this.triggerKeyDown({ event: e })) {\r\n return;\r\n }\r\n var _a = this.selection, start = _a.start, end = _a.end;\r\n this.keyDownEvent = e;\r\n this.previousElementValue = this.element.value;\r\n this.previousElementSelection = { start: start, end: end };\r\n if (this.keyEventMatchesAutoSwitchKeys(e)) {\r\n var isTabKey = e.keyCode === KeyCode.TAB;\r\n if (isTabKey) {\r\n var _b = this.selection, selectionStart = _b.start, selectionEnd = _b.end;\r\n if (e.shiftKey && isTabKey) {\r\n this.switchDateSegment(-1);\r\n }\r\n else {\r\n this.switchDateSegment(1);\r\n }\r\n if (selectionStart !== this.selection.start || selectionEnd !== this.selection.end) {\r\n // when the selection changes, prevent the default Tab behavior\r\n e.preventDefault();\r\n return;\r\n }\r\n }\r\n else {\r\n // do not allow the \"input\" event to be triggered\r\n e.preventDefault();\r\n this.switchDateSegment(1);\r\n return;\r\n }\r\n }\r\n var symbol = this.currentFormat[this.selection.start];\r\n var step = this.getStepFromSymbol(symbol);\r\n var shouldPreventDefault = false;\r\n if (e.altKey || e.ctrlKey || e.metaKey || e.keyCode === KeyCode.TAB) {\r\n return;\r\n }\r\n switch (e.keyCode) {\r\n case KeyCode.ARROW_LEFT:\r\n this.switchDateSegment(-1);\r\n shouldPreventDefault = true;\r\n this.switchedPartOnPreviousKeyAction = false;\r\n break;\r\n case KeyCode.ARROW_UP:\r\n this.modifyDateSegmentValue(step, symbol, event);\r\n shouldPreventDefault = true;\r\n this.switchedPartOnPreviousKeyAction = false;\r\n break;\r\n case KeyCode.ARROW_RIGHT:\r\n this.switchDateSegment(1);\r\n shouldPreventDefault = true;\r\n this.switchedPartOnPreviousKeyAction = false;\r\n break;\r\n case KeyCode.ARROW_DOWN:\r\n this.modifyDateSegmentValue(-step, symbol, event);\r\n shouldPreventDefault = true;\r\n this.switchedPartOnPreviousKeyAction = false;\r\n break;\r\n case KeyCode.ENTER:\r\n // todo: handle \"change\" event\r\n break;\r\n case KeyCode.HOME:\r\n this.selectNearestSegment(0);\r\n shouldPreventDefault = true;\r\n this.switchedPartOnPreviousKeyAction = false;\r\n this.resetSegmentValue = true;\r\n break;\r\n case KeyCode.END:\r\n this.selectNearestSegment(this.elementValue.length);\r\n shouldPreventDefault = true;\r\n this.switchedPartOnPreviousKeyAction = false;\r\n this.resetSegmentValue = true;\r\n break;\r\n default:\r\n // allow the \"input\" event to handle the change\r\n return;\r\n }\r\n if (shouldPreventDefault) {\r\n e.preventDefault();\r\n }\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateInput.prototype.onElementPaste = function () {\r\n this.isPasteInProgress = true;\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateInput.prototype.onElementMouseWheel = function (e) {\r\n if (!this.options.enableMouseWheel || this.triggerMouseWheel({ event: e })) {\r\n return;\r\n }\r\n if (!this.isActive) {\r\n return;\r\n }\r\n var event = e;\r\n if (event.shiftKey) {\r\n this.switchDateSegment((event.wheelDelta || -event.detail) > 0 ? -1 : 1);\r\n }\r\n else {\r\n this.modifyDateSegmentValue((event.wheelDelta || -event.detail) > 0 ? 1 : -1);\r\n }\r\n event.returnValue = false;\r\n if (event.preventDefault) {\r\n event.preventDefault();\r\n }\r\n if (event.stopPropagation) {\r\n event.stopPropagation();\r\n }\r\n };\r\n DateInput.prototype.updateOnPaste = function (e) {\r\n var value = this.intl.parseDate(this.elementValue, this.inputFormat) || this.value;\r\n if (isPresent(value) && this.dateObject.shouldNormalizeCentury()) {\r\n value = this.dateObject.normalizeCentury(value);\r\n }\r\n var oldDateObjectValue = this.dateObject && this.dateObject.getValue();\r\n this.writeValue(value);\r\n this.tryTriggerValueChange({\r\n oldValue: oldDateObjectValue,\r\n event: e\r\n });\r\n };\r\n Object.defineProperty(DateInput.prototype, \"elementValue\", {\r\n get: function () {\r\n return (this.element || {}).value || '';\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(DateInput.prototype, \"inputFormat\", {\r\n get: function () {\r\n if (!this.options.format) {\r\n return Constants.defaultDateFormat;\r\n }\r\n if (typeof this.options.format === 'string') {\r\n return this.options.format;\r\n }\r\n else {\r\n return this.options.format.inputFormat;\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(DateInput.prototype, \"displayFormat\", {\r\n get: function () {\r\n if (!this.options.format) {\r\n return Constants.defaultDateFormat;\r\n }\r\n if (typeof this.options.format === 'string') {\r\n return this.options.format;\r\n }\r\n else {\r\n return this.options.format.displayFormat;\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(DateInput.prototype, \"selection\", {\r\n get: function () {\r\n var returnValue = { start: 0, end: 0 };\r\n if (this.element !== null && this.element.selectionStart !== undefined) {\r\n returnValue = {\r\n start: this.element.selectionStart,\r\n end: this.element.selectionEnd\r\n };\r\n }\r\n return returnValue;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n DateInput.prototype.setSelection = function (selection) {\r\n if (this.element && document.activeElement === this.element) {\r\n this.element.setSelectionRange(selection.start, selection.end);\r\n if (selection.start !== selection.end) {\r\n this.interactionMode = DateInputInteractionMode.Selection;\r\n }\r\n }\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateInput.prototype.selectionBySymbol = function (symbol) {\r\n var start = -1;\r\n var end = 0;\r\n for (var i = 0; i < this.currentFormat.length; i++) {\r\n if (this.currentFormat[i] === symbol) {\r\n end = i + 1;\r\n if (start === -1) {\r\n start = i;\r\n }\r\n }\r\n }\r\n if (start < 0) {\r\n start = 0;\r\n }\r\n if (!this.options.autoCorrectParts && this.currentFormat.length !== this.currentText.length) {\r\n if (this.currentFormat.length < this.currentText.length) {\r\n end += this.currentText.length - this.currentFormat.length;\r\n }\r\n else {\r\n end = Math.max(0, end - (this.currentFormat.length - this.currentText.length));\r\n }\r\n }\r\n return { start: start, end: end };\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateInput.prototype.selectionByIndex = function (index) {\r\n var selection = { start: index, end: index };\r\n for (var i = index, j = index - 1; i < this.currentFormat.length || j >= 0; i++, j--) {\r\n if (i < this.currentFormat.length && this.currentFormat[i] !== Constants.formatSeparator) {\r\n selection = this.selectionBySymbol(this.currentFormat[i]);\r\n break;\r\n }\r\n if (j >= 0 && this.currentFormat[j] !== Constants.formatSeparator) {\r\n selection = this.selectionBySymbol(this.currentFormat[j]);\r\n break;\r\n }\r\n }\r\n return selection;\r\n };\r\n DateInput.prototype.switchDateSegment = function (offset) {\r\n var selection = this.selection;\r\n if (this.isInCaretMode()) {\r\n var start = selection.start;\r\n var currentSymbol = this.currentFormat[start - 1];\r\n var symbol = \"\";\r\n var symbolCandidate = \"\";\r\n if (offset < 0) {\r\n for (var i = start + offset; i >= 0; i--) {\r\n symbolCandidate = this.currentFormat[i];\r\n if (symbolCandidate !== Constants.formatSeparator &&\r\n symbolCandidate !== currentSymbol) {\r\n start = i;\r\n symbol = symbolCandidate;\r\n break;\r\n }\r\n }\r\n }\r\n else {\r\n for (var i = start + offset; i < this.currentFormat.length; i++) {\r\n symbolCandidate = this.currentFormat[i];\r\n if (symbolCandidate !== Constants.formatSeparator &&\r\n symbolCandidate !== currentSymbol) {\r\n start = i;\r\n symbol = symbolCandidate;\r\n break;\r\n }\r\n }\r\n }\r\n if (symbol) {\r\n this.forceUpdate();\r\n this.setSelection(this.selectionBySymbol(symbol));\r\n this.interactionMode = DateInputInteractionMode.Selection;\r\n return;\r\n }\r\n }\r\n this.interactionMode = DateInputInteractionMode.None;\r\n var _a = this.selection, selectionStart = _a.start, selectionEnd = _a.end;\r\n if (selectionStart < selectionEnd &&\r\n this.currentFormat[selectionStart] !== this.currentFormat[selectionEnd - 1]) {\r\n this.setSelection(this.selectionByIndex(offset > 0 ? selectionStart : selectionEnd - 1));\r\n this.resetSegmentValue = true;\r\n this.interactionMode = DateInputInteractionMode.None;\r\n return;\r\n }\r\n var previousFormatSymbol = this.currentFormat[selectionStart];\r\n var a = selectionStart + offset;\r\n while (a > 0 && a < this.currentFormat.length) {\r\n if (this.currentFormat[a] !== previousFormatSymbol &&\r\n this.currentFormat[a] !== Constants.formatSeparator) {\r\n break;\r\n }\r\n a += offset;\r\n }\r\n if (this.currentFormat[a] === Constants.formatSeparator) {\r\n // no known symbol is found\r\n return;\r\n }\r\n var b = a;\r\n while (b >= 0 && b < this.currentFormat.length) {\r\n if (this.currentFormat[b] !== this.currentFormat[a]) {\r\n break;\r\n }\r\n b += offset;\r\n }\r\n if (a > b && (b + 1 !== selectionStart || a + 1 !== selectionEnd)) {\r\n this.setSelection({ start: b + 1, end: a + 1 });\r\n this.resetSegmentValue = true;\r\n }\r\n else if (a < b && (a !== selectionStart || b !== selectionEnd)) {\r\n this.setSelection({ start: a, end: b });\r\n this.resetSegmentValue = true;\r\n }\r\n this.interactionMode = DateInputInteractionMode.None;\r\n };\r\n DateInput.prototype.modifyDateSegmentValue = function (offset, symbol, event) {\r\n if (symbol === void 0) { symbol = \"\"; }\r\n if (event === void 0) { event = {}; }\r\n if (!this.dateObject || this.options.readonly) {\r\n return;\r\n }\r\n var oldValue = this.value;\r\n var step = DEFAULT_SEGMENT_STEP * offset;\r\n var caret = this.caret();\r\n symbol = symbol || this.currentFormat[caret[0]];\r\n if (symbol === \"S\" && !this.options.steps.millisecond) {\r\n var msDigits = millisecondDigitsInFormat(this.inputFormat);\r\n step = millisecondStepFor(msDigits);\r\n }\r\n this.dateObject.modifyPart(symbol, step);\r\n this.tryTriggerValueChange({\r\n oldValue: oldValue,\r\n event: event\r\n });\r\n this.forceUpdate();\r\n this.setSelection(this.selectionBySymbol(symbol));\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateInput.prototype.tryTriggerValueChange = function (args) {\r\n if (args === void 0) { args = { oldValue: null, event: {} }; }\r\n if (!isEqual(this.value, args.oldValue)) {\r\n return this.triggerValueChange(args);\r\n }\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateInput.prototype.triggerValueChange = function (args) {\r\n if (args === void 0) { args = { oldValue: null, event: {} }; }\r\n return this.trigger(VALUE_CHANGE, extend(args, {\r\n value: this.value\r\n }));\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateInput.prototype.triggerInput = function (args) {\r\n if (args === void 0) { args = { event: {} }; }\r\n return this.trigger(INPUT, extend(args, {\r\n value: this.value\r\n }));\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateInput.prototype.triggerInputEnd = function (args) {\r\n if (args === void 0) { args = { event: {}, error: null }; }\r\n return this.trigger(INPUT_END, extend(args, {\r\n value: this.value\r\n }));\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateInput.prototype.triggerFocus = function (args) {\r\n if (args === void 0) { args = { event: {} }; }\r\n return this.trigger(FOCUS, extend({}, args));\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateInput.prototype.triggerFocusEnd = function (args) {\r\n if (args === void 0) { args = { event: {} }; }\r\n return this.trigger(FOCUS_END, extend({}, args));\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateInput.prototype.triggerBlur = function (args) {\r\n if (args === void 0) { args = { event: {} }; }\r\n return this.trigger(BLUR, extend({}, args));\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateInput.prototype.triggerBlurEnd = function (args) {\r\n if (args === void 0) { args = { event: {} }; }\r\n return this.trigger(BLUR_END, extend({}, args));\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateInput.prototype.triggerChange = function (args) {\r\n if (args === void 0) { args = { event: {} }; }\r\n return this.trigger(CHANGE, extend(args, {\r\n value: this.value\r\n }));\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateInput.prototype.triggerKeyDown = function (args) {\r\n if (args === void 0) { args = { event: {} }; }\r\n return this.trigger(KEY_DOWN, extend({}, args));\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateInput.prototype.triggerMouseWheel = function (args) {\r\n if (args === void 0) { args = { event: {} }; }\r\n return this.trigger(MOUSE_WHEEL, extend({}, args));\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateInput.prototype.forceUpdate = function () {\r\n this.setTextAndFormat();\r\n this.refreshElementValue();\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateInput.prototype.forceUpdateWithSelection = function () {\r\n var _a = this.selection, start = _a.start, end = _a.end;\r\n var elementValueLength = this.elementValue.length;\r\n this.forceUpdate();\r\n var selectionOffset = this.elementValue.length - elementValueLength;\r\n this.setSelection({\r\n start: start + selectionOffset,\r\n end: end + selectionOffset\r\n });\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateInput.prototype.setTextAndFormat = function () {\r\n var _a = this.dateObject.getTextAndFormat(), currentText = _a.text, currentFormat = _a.format;\r\n this.currentFormat = currentFormat;\r\n this.currentText = currentText;\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateInput.prototype.setElementValue = function (value) {\r\n this.element.value = value;\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateInput.prototype.getStepFromSymbol = function (symbol) {\r\n /* eslint-disable no-fallthrough */\r\n switch (symbol) {\r\n case \"S\":\r\n return Number(this.options.steps.millisecond);\r\n case \"s\":\r\n return Number(this.options.steps.second);\r\n case \"m\":\r\n return Number(this.options.steps.minute);\r\n // represents hour as value from 01 through 12\r\n case \"h\":\r\n // represents hour as value from 01 through 23\r\n case \"H\":\r\n return Number(this.options.steps.hour);\r\n case \"M\":\r\n return Number(this.options.steps.month);\r\n // there is no 'D' format specifier for day\r\n case \"d\":\r\n // used for formats such as \"EEEE, MMMM d, yyyy\",\r\n // where \"EEEE\" stands for full name of the day e.g. Monday\r\n case \"E\":\r\n return Number(this.options.steps.day);\r\n // there is no 'Y' format specifier for year\r\n case \"y\":\r\n return Number(this.options.steps.year);\r\n default:\r\n return DEFAULT_SEGMENT_STEP;\r\n }\r\n /* eslint-enable no-fallthrough */\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateInput.prototype.restorePreviousInputEventState = function () {\r\n this.restorePreviousElementValue();\r\n this.restorePreviousElementSelection();\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateInput.prototype.restorePreviousElementValue = function () {\r\n this.setElementValue(this.previousElementValue || '');\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateInput.prototype.restorePreviousElementSelection = function () {\r\n var _a = this.previousElementSelection, start = _a.start, end = _a.end;\r\n this.setSelection({ start: start || 0, end: end || 0 });\r\n };\r\n DateInput.prototype.writeValue = function (value) {\r\n this.verifyValue(value);\r\n this.dateObject = this.getDateObject(value);\r\n this.refreshElementValue();\r\n };\r\n DateInput.prototype.verifyValue = function (value) {\r\n if (value && !isValidDate(value)) {\r\n throw new Error(\"The 'value' should be a valid JavaScript Date instance.\");\r\n }\r\n };\r\n DateInput.prototype.refreshElementValue = function () {\r\n var start = this.caret()[0];\r\n var element = this.element;\r\n var format = this.isActive ? this.inputFormat : this.displayFormat;\r\n var _a = this.dateObject.getTextAndFormat(format), currentText = _a.text, currentFormat = _a.format;\r\n this.currentFormat = currentFormat;\r\n this.currentText = currentText;\r\n var hasPlaceholder = this.options.hasPlaceholder || isPresent(this.options.placeholder);\r\n var showPlaceholder = !this.isActive &&\r\n hasPlaceholder &&\r\n !this.dateObject.hasValue();\r\n if (hasPlaceholder && isPresent(this.options.placeholder)) {\r\n element.placeholder = this.options.placeholder;\r\n }\r\n var newElementValue = showPlaceholder ? \"\" : currentText;\r\n this.previousElementValue = this.elementValue;\r\n this.setElementValue(newElementValue);\r\n if (this.isActive && !this.options.allowCaretMode && this.options.selectNearestSegmentOnFocus) {\r\n this.selectNearestSegment(start);\r\n }\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateInput.prototype.caret = function (start, end) {\r\n if (end === void 0) { end = start; }\r\n var isPosition = start !== undefined;\r\n var returnValue = [start, start];\r\n var element = this.element;\r\n if (isPosition && (this.options.disabled || this.options.readonly)) {\r\n return undefined;\r\n }\r\n try {\r\n if (element.selectionStart !== undefined) {\r\n if (isPosition) {\r\n if (isDocumentAvailable() && document.activeElement !== element) {\r\n element.focus();\r\n }\r\n element.setSelectionRange(start, end);\r\n }\r\n returnValue = [element.selectionStart, element.selectionEnd];\r\n }\r\n }\r\n catch (e) {\r\n returnValue = [];\r\n }\r\n return returnValue;\r\n };\r\n DateInput.prototype.selectNearestSegment = function (index) {\r\n // Finds the nearest (in both directions) known part.\r\n for (var i = index, j = index - 1; i < this.currentFormat.length || j >= 0; i++, j--) {\r\n if (i < this.currentFormat.length && this.currentFormat[i] !== \"_\") {\r\n this.selectDateSegment(this.currentFormat[i]);\r\n return;\r\n }\r\n if (j >= 0 && this.currentFormat[j] !== \"_\") {\r\n this.selectDateSegment(this.currentFormat[j]);\r\n return;\r\n }\r\n }\r\n };\r\n DateInput.prototype.selectDateSegment = function (symbol) {\r\n var begin = -1;\r\n var end = 0;\r\n for (var i = 0; i < this.currentFormat.length; i++) {\r\n if (this.currentFormat[i] === symbol) {\r\n end = i + 1;\r\n if (begin === -1) {\r\n begin = i;\r\n }\r\n }\r\n }\r\n if (begin < 0) {\r\n begin = 0;\r\n }\r\n this.caret(0, 0);\r\n this.caret(begin, end);\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateInput.prototype.getDateObject = function (value) {\r\n var leadingZero = ((this.dateObject || {}) || null).leadingZero;\r\n this.options.value = value;\r\n var dateObject = this.createDateObject();\r\n dateObject.setLeadingZero(this.isActive ? leadingZero : null);\r\n return dateObject;\r\n };\r\n /* tslint:disable:align */\r\n /**\r\n * @hidden\r\n */\r\n DateInput.prototype.createDateObject = function () {\r\n var defaultOptions = this.getDateObjectOptions();\r\n var dateObject = new DateObject(extend({}, defaultOptions));\r\n return dateObject;\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateInput.prototype.getDateObjectOptions = function () {\r\n var newOptions = {\r\n intlService: this.options.intlService,\r\n formatPlaceholder: this.options.formatPlaceholder ? this.options.formatPlaceholder : 'formatPattern',\r\n format: this.inputFormat,\r\n cycleTime: this.options.cycleTime,\r\n twoDigitYearMax: this.options.twoDigitYearMax,\r\n autoCorrectParts: this.options.autoCorrectParts,\r\n value: this.options.value\r\n };\r\n return newOptions;\r\n };\r\n /* tslint:enable:align */\r\n /**\r\n * @hidden\r\n */\r\n DateInput.prototype.keyEventMatchesAutoSwitchKeys = function (keyObject) {\r\n var autoSwitchKeys = (this.options.autoSwitchKeys || [])\r\n .map(function (x) { return x.toString().toLowerCase().trim(); });\r\n if (autoSwitchKeys.indexOf(keyObject.keyCode.toString()) >= 0 ||\r\n autoSwitchKeys.indexOf(keyObject.keyCode) >= 0 ||\r\n autoSwitchKeys.indexOf(keyObject.key.toLowerCase().trim()) >= 0) {\r\n return true;\r\n }\r\n return false;\r\n };\r\n /**\r\n * @hidden\r\n */\r\n DateInput.prototype.autoFill = function () {\r\n var dateObject = this.dateObject, currentDate = new Date(), day, month, year, hours, minutes, seconds;\r\n if (dateObject.date || dateObject.month || dateObject.year || dateObject.hours || dateObject.minutes || dateObject.seconds) {\r\n year = dateObject.year ? dateObject.value.getFullYear() : currentDate.getFullYear(),\r\n month = dateObject.month ? dateObject.value.getMonth() : currentDate.getMonth(),\r\n day = dateObject.date ? dateObject.value.getDate() : currentDate.getDate(),\r\n hours = dateObject.hours ? dateObject.value.getHours() : currentDate.getHours(),\r\n minutes = dateObject.minutes ? dateObject.value.getMinutes() : currentDate.getMinutes(),\r\n seconds = dateObject.seconds ? dateObject.value.getSeconds() : currentDate.getSeconds();\r\n dateObject.setValue(new Date(year, month, day, hours, minutes, seconds));\r\n this.refreshElementValue();\r\n this.triggerChange();\r\n }\r\n };\r\n return DateInput;\r\n }(Observable));\r\n\r\n var __meta__$1X = {\r\n id: \"dateinputcommon\",\r\n name: \"DateInputCommon\",\r\n category: \"web\",\r\n description: \"This is the common package for date editing accross all kendo flavours\",\r\n depends: [\"core\"]\r\n };\r\n\r\n (function($, undefined$1) {\r\n kendo.ui.DateInputCommon = DateInput;\r\n })(window.kendo.jQuery);\r\n var kendo$1X = kendo;\r\n\r\n var __meta__$1W = {\r\n id: \"dateinput\",\r\n name: \"DateInput\",\r\n category: \"web\",\r\n description: \"The DateInput widget allows to edit date by typing.\",\r\n depends: [ \"core\", \"label\" ]\r\n };\r\n\r\n (function($, undefined$1) {\r\n var global = window;\r\n var kendo = global.kendo;\r\n var ui = kendo.ui;\r\n var Widget = ui.Widget;\r\n var DateInputCommon = ui.DateInputCommon;\r\n var ns = \".kendoDateInput\";\r\n var objectToString = {}.toString;\r\n var isPlainObject = $.isPlainObject;\r\n\r\n\r\n var FOCUSED = \"k-focus\";\r\n var STATEDISABLED = \"k-disabled\";\r\n var STATEINVALID = \"k-invalid\";\r\n\r\n var DISABLED = \"disabled\";\r\n var READONLY = \"readonly\";\r\n var CHANGE = \"change\";\r\n\r\n var IntlService = kendo.Class.extend({\r\n init: function(options) {\r\n const info = options.culture ? kendo.getCulture(options.culture) : kendo.culture();\r\n this.messages = options.messages;\r\n this.cldr = { };\r\n this.cldr[info.name] = {\r\n name: info.name,\r\n calendar: info.calendar || {},\r\n numbers: info.numberFormat\r\n };\r\n },\r\n\r\n parseDate: function(value, format, culture) {\r\n return kendo.parseDate(value, format, culture, true);\r\n },\r\n\r\n formatDate: function(date, format, culture) {\r\n return kendo.toString(date, format, culture);\r\n },\r\n\r\n splitDateFormat: function(format) {\r\n return kendo.date.splitDateFormat(format);\r\n },\r\n\r\n dateFormatNames: function(locale, options) {\r\n return kendo.date.dateFormatNames(options);\r\n },\r\n\r\n dateFieldName: function(options) {\r\n return this.messages[options.type] || {};\r\n }\r\n });\r\n\r\n function buildKeys() {\r\n const cultureInfo = kendo.culture();\r\n let keys = [];\r\n\r\n keys.push(cultureInfo.calendars.standard[\"/\"]);\r\n keys.push(cultureInfo.calendars.standard[\":\"]);\r\n\r\n return keys;\r\n }\r\n\r\n function getCultureFormat(culture, format) {\r\n if (!culture) {\r\n return format;\r\n }\r\n const cultureInfo = kendo.getCulture(culture);\r\n return cultureInfo.calendars.standard.patterns[format] || format;\r\n }\r\n\r\n var DateInput = Widget.extend({\r\n init: function(element, options) {\r\n var that = this;\r\n\r\n Widget.fn.init.call(that, element, options);\r\n element = that.element;\r\n\r\n options = that.options;\r\n options.format = kendo._extractFormat(options.format || kendo.getCulture(options.culture).calendars.standard.patterns.d);\r\n options.min = kendo.parseDate(element.attr(\"min\")) || kendo.parseDate(options.min);\r\n options.max = kendo.parseDate(element.attr(\"max\")) || kendo.parseDate(options.max);\r\n\r\n var wrapperClass = (element.parent().attr(\"class\") || \"\");\r\n var skipStyling = wrapperClass.indexOf(\"picker\") >= 0 && wrapperClass.indexOf(\"rangepicker\") < 0;\r\n var initialValue = that.options.value || element.val();\r\n\r\n if (skipStyling) {\r\n that.wrapper = that.element.parent();\r\n } else {\r\n that.wrapper = element.wrap(\"\").parent();\r\n that.wrapper.addClass(element[0].className).removeClass('input-validation-error');\r\n }\r\n that.wrapper[0].style.cssText = element[0].style.cssText;\r\n element.css({\r\n height: element[0].style.height\r\n });\r\n\r\n\r\n that._validationIcon = $(kendo.ui.icon({ icon: \"exclamation-circle\", iconClass: \"k-input-validation-icon k-hidden\" })).insertAfter(element);\r\n\r\n that._form();\r\n\r\n that.dateInputInstance = new DateInputCommon(element[0], {\r\n format: getCultureFormat(options.culture, options.format),\r\n autoCorrectParts: options.autoCorrectParts,\r\n autoSwitchKeys: options.autoSwitchKeys.length ? options.autoSwitchKeys : buildKeys(),\r\n enableMouseWheel: options.enableMouseWheel,\r\n twoDigitYearMax: options.twoDigitYearMax,\r\n steps: options.steps,\r\n formatPlaceholder: options.messages,\r\n events: {\r\n inputEnd: function(e) {\r\n if (e.error) {\r\n that._blinkInvalidState();\r\n }\r\n },\r\n keydown: function(e) {\r\n if (e.event.keyCode == kendo.keys.UP || e.event.keyCode == kendo.keys.DOWN) {\r\n setTimeout(function() {\r\n that.element.trigger(CHANGE);\r\n });\r\n }\r\n },\r\n blur: function(e) {\r\n that._change();\r\n e.preventDefault();\r\n },\r\n },\r\n intlService: new IntlService({\r\n culture: options.culture,\r\n messages: that.options.messages\r\n }),\r\n autoSwitchParts: options.autoSwitchParts,\r\n autoFill: options.autoFill\r\n });\r\n\r\n that._emptyMask = this.element.val();\r\n if (options.value) {\r\n that.value(options.value);\r\n }\r\n\r\n that.element\r\n .addClass(\"k-input-inner\")\r\n .attr(\"autocomplete\", \"off\")\r\n .on(\"focus\" + ns, function() {\r\n that.wrapper.addClass(FOCUSED);\r\n })\r\n .on(\"focusout\" + ns, function() {\r\n that.wrapper.removeClass(FOCUSED);\r\n });\r\n\r\n try {\r\n element[0].setAttribute(\"type\", \"text\");\r\n } catch (e) {\r\n element[0].type = \"text\";\r\n }\r\n\r\n var disabled = element.is(\"[disabled]\") || $(that.element).parents(\"fieldset\").is(':disabled');\r\n\r\n if (disabled) {\r\n that.enable(false);\r\n } else {\r\n that.readonly(element.is(\"[readonly]\"));\r\n }\r\n that.value(initialValue);\r\n if (!skipStyling) {\r\n that._applyCssClasses();\r\n }\r\n\r\n if (options.label) {\r\n that._label();\r\n }\r\n\r\n kendo.notify(that);\r\n },\r\n\r\n options: {\r\n name: \"DateInput\",\r\n autoAdjust: true,\r\n autoCorrectParts: true,\r\n autoSwitchKeys: [],\r\n autoSwitchParts: false,\r\n enableMouseWheel: true,\r\n culture: \"\",\r\n value: \"\",\r\n format: \"\",\r\n min: new Date(1900, 0, 1),\r\n max: new Date(2099, 11, 31),\r\n messages: {\r\n \"year\": \"year\",\r\n \"month\": \"month\",\r\n \"day\": \"day\",\r\n \"weekday\": \"day of the week\",\r\n \"hour\": \"hours\",\r\n \"minute\": \"minutes\",\r\n \"second\": \"seconds\",\r\n \"milliseconds\": \"milliseconds\",\r\n \"dayperiod\": \"AM/PM\"\r\n },\r\n size: \"medium\",\r\n steps: {\r\n year: 1,\r\n month: 1,\r\n day: 1,\r\n hour: 1,\r\n minute: 1,\r\n second: 1,\r\n millisecond: 1,\r\n },\r\n fillMode: \"solid\",\r\n rounded: \"medium\",\r\n label: null,\r\n autoFill: false\r\n },\r\n\r\n events: [\r\n CHANGE\r\n ],\r\n\r\n min: function(value) {\r\n if (value !== undefined$1) {\r\n this.options.min = value;\r\n } else {\r\n return this.options.min;\r\n }\r\n },\r\n\r\n max: function(value) {\r\n if (value !== undefined$1) {\r\n this.options.max = value;\r\n } else {\r\n return this.options.max;\r\n }\r\n },\r\n\r\n setOptions: function(options) {\r\n var that = this;\r\n Widget.fn.setOptions.call(that, options);\r\n that.dateInputInstance.destroy();\r\n that.dateInputInstance = null;\r\n\r\n that.dateInputInstance = new DateInputCommon(this.element[0], {\r\n format: getCultureFormat(that.options.culture, that.options.format),\r\n autoSwitchKeys: that.options.autoSwitchKeys.length ? that.options.autoSwitchKeys : buildKeys(),\r\n autoCorrectParts: that.options.autoCorrectParts,\r\n enableMouseWheel: that.options.enableMouseWheel,\r\n steps: that.options.steps,\r\n twoDigitYearMax: that.options.twoDigitYearMax,\r\n formatPlaceholder: that.options.messages,\r\n events: {\r\n inputEnd: function(e) {\r\n if (e.error) {\r\n that._blinkInvalidState();\r\n }\r\n },\r\n keydown: function(e) {\r\n if (e.event.keyCode == kendo.keys.UP || e.event.keyCode == kendo.keys.DOWN) {\r\n setTimeout(function() {\r\n that.element.trigger(CHANGE);\r\n });\r\n }\r\n },\r\n blur: function(e) {\r\n that._change();\r\n e.preventDefault();\r\n },\r\n },\r\n intlService: new IntlService({\r\n culture: that.options.culture,\r\n messages: that.options.messages\r\n }),\r\n autoSwitchParts: that.options.autoSwitchParts,\r\n autoFill: that.options.autoFill\r\n });\r\n },\r\n\r\n destroy: function() {\r\n var that = this;\r\n that.element.off(ns);\r\n that.dateInputInstance.destroy();\r\n\r\n if (that._formElement) {\r\n that._formElement.off(\"reset\", that._resetHandler);\r\n }\r\n\r\n if (that.label) {\r\n that.label.destroy();\r\n }\r\n\r\n if (that._validationIcon) {\r\n that._validationIcon.remove();\r\n }\r\n\r\n Widget.fn.destroy.call(that);\r\n },\r\n\r\n value: function(value) {\r\n if (value === undefined$1) {\r\n return this.dateInputInstance.value;\r\n }\r\n\r\n if (value === null) {\r\n value = \"\";\r\n }\r\n\r\n if (objectToString.call(value) !== \"[object Date]\") {\r\n value = kendo.parseDate(value, this.options.format, this.options.culture);\r\n }\r\n\r\n if (value && !value.getTime()) {\r\n value = null;\r\n }\r\n\r\n this.dateInputInstance.writeValue(value);\r\n\r\n this._oldValue = value;\r\n\r\n if (this.label && this.label.floatingLabel) {\r\n this.label.floatingLabel.refresh();\r\n }\r\n },\r\n\r\n _hasDateInput: function() {\r\n\r\n return this._emptyMask !== this.element.val();\r\n },\r\n\r\n readonly: function(readonly) {\r\n this._editable({\r\n readonly: readonly === undefined$1 ? true : readonly,\r\n disable: false\r\n });\r\n\r\n if (this.label && this.label.floatingLabel) {\r\n this.label.floatingLabel.readonly(readonly === undefined$1 ? true : readonly);\r\n }\r\n },\r\n\r\n enable: function(enable) {\r\n this._editable({\r\n readonly: false,\r\n disable: !(enable = enable === undefined$1 ? true : enable)\r\n });\r\n\r\n if (this.label && this.label.floatingLabel) {\r\n this.label.floatingLabel.enable(enable = enable === undefined$1 ? true : enable);\r\n }\r\n },\r\n\r\n _label: function() {\r\n var that = this;\r\n var options = that.options;\r\n var labelOptions = isPlainObject(options.label) ? options.label : {\r\n content: options.label\r\n };\r\n\r\n that.label = new kendo.ui.Label(null, $.extend({}, labelOptions, {\r\n widget: that,\r\n floatCheck: () => {\r\n if (!that.value() && (!that._hasDateInput() || that.element.val() === \"\") && document.activeElement !== that.element[0]) {\r\n this.element.val(\"\");\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n }));\r\n\r\n that._inputLabel = that.label.element;\r\n },\r\n\r\n _bindInput: function() {\r\n var that = this;\r\n that.element\r\n .on(\"focus\" + ns, function() {\r\n that.wrapper.addClass(FOCUSED);\r\n })\r\n .on(\"focusout\" + ns, function() {\r\n that.wrapper.removeClass(FOCUSED);\r\n });\r\n\r\n if (this.dateInputInstance) {\r\n this.dateInputInstance.bindEvents();\r\n }\r\n },\r\n\r\n _unbindInput: function() {\r\n this.element\r\n .off(\"focus\" + ns)\r\n .off(\"focusout\" + ns);\r\n\r\n if (this.dateInputInstance) {\r\n this.dateInputInstance.unbindEvents();\r\n }\r\n },\r\n\r\n _editable: function(options) {\r\n var that = this;\r\n var element = that.element;\r\n var disable = options.disable;\r\n var readonly = options.readonly;\r\n var wrapper = that.wrapper;\r\n\r\n that._unbindInput();\r\n\r\n if (!readonly && !disable) {\r\n wrapper.removeClass(STATEDISABLED);\r\n if (element && element.length) {\r\n element[0].removeAttribute(DISABLED);\r\n element[0].removeAttribute(READONLY);\r\n }\r\n\r\n that._bindInput();\r\n } else {\r\n if (disable) {\r\n wrapper.addClass(STATEDISABLED);\r\n element.attr(DISABLED, disable);\r\n if (element && element.length) {\r\n element[0].removeAttribute(READONLY);\r\n }\r\n }\r\n if (readonly) {\r\n element.attr(READONLY, readonly);\r\n }\r\n }\r\n },\r\n\r\n _change: function() {\r\n let that = this,\r\n oldValue = that._oldValue,\r\n value = that.value(),\r\n autoAdjust = that.options.autoAdjust;\r\n\r\n if (autoAdjust && value && that.min() && value < that.min()) {\r\n that.value(that.min());\r\n value = that.value();\r\n }\r\n if (autoAdjust && value && that.max() && value > that.max()) {\r\n that.value(that.max());\r\n value = that.value();\r\n }\r\n\r\n if (oldValue && value && value.getTime() !== oldValue.getTime() ||\r\n oldValue && !value ||\r\n !oldValue && value\r\n ) {\r\n that._oldValue = value;\r\n that.trigger(CHANGE, { blur: true });\r\n that.element.trigger(CHANGE);\r\n }\r\n },\r\n\r\n\r\n _blinkInvalidState: function() {\r\n var that = this;\r\n\r\n that._addInvalidState();\r\n clearTimeout(that._invalidStateTimeout);\r\n that._invalidStateTimeout = setTimeout(that._removeInvalidState.bind(that), 100);\r\n },\r\n\r\n _addInvalidState: function() {\r\n var that = this;\r\n\r\n that.wrapper.addClass(STATEINVALID);\r\n that._validationIcon.removeClass(\"k-hidden\");\r\n },\r\n\r\n _removeInvalidState: function() {\r\n var that = this;\r\n\r\n that.wrapper.removeClass(STATEINVALID);\r\n that._validationIcon.addClass(\"k-hidden\");\r\n that._invalidStateTimeout = null;\r\n },\r\n\r\n\r\n _form: function() {\r\n var that = this;\r\n var element = that.element;\r\n var formId = element.attr(\"form\");\r\n var form = formId ? $(\"#\" + formId) : element.closest(\"form\");\r\n var initialValue = element[0].value;\r\n\r\n if (!initialValue && that.options.value) {\r\n initialValue = that.options.value;\r\n }\r\n\r\n if (form[0]) {\r\n that._resetHandler = function() {\r\n setTimeout(function() {\r\n that.value(initialValue);\r\n });\r\n };\r\n\r\n that._formElement = form.on(\"reset\", that._resetHandler);\r\n }\r\n },\r\n\r\n _paste: function(e) {\r\n e.preventDefault();\r\n },\r\n\r\n\r\n });\r\n\r\n kendo.cssProperties.registerPrefix(\"DateInput\", \"k-input-\");\r\n\r\n kendo.cssProperties.registerValues(\"DateInput\", [{\r\n prop: \"rounded\",\r\n values: kendo.cssProperties.roundedValues.concat([['full', 'full']])\r\n }]);\r\n\r\n ui.plugin(DateInput);\r\n\r\n })(window.kendo.jQuery);\r\n var kendo$1W = kendo;\r\n\r\n var __meta__$1V = {\r\n id: \"datepicker\",\r\n name: \"DatePicker\",\r\n category: \"web\",\r\n description: \"The DatePicker widget allows the user to select a date from a calendar or by direct input.\",\r\n depends: [ \"calendar\", \"popup\", \"html.button\", \"label\", \"actionsheet\" ]\r\n };\r\n\r\n (function($, undefined$1) {\r\n var kendo = window.kendo,\r\n ui = kendo.ui,\r\n html = kendo.html,\r\n mediaQuery = kendo.mediaQuery,\r\n Widget = ui.Widget,\r\n parse = kendo.parseDate,\r\n keys = kendo.keys,\r\n support = kendo.support,\r\n template = kendo.template,\r\n activeElement = kendo._activeElement,\r\n DIV = \"
    \",\r\n SPAN = \"\",\r\n ns = \".kendoDatePicker\",\r\n CLICK = \"click\" + ns,\r\n UP = support.mouseAndTouchPresent ? kendo.applyEventMap(\"up\", ns.slice(1)) : CLICK,\r\n OPEN = \"open\",\r\n CLOSE = \"close\",\r\n CHANGE = \"change\",\r\n DISABLED = \"disabled\",\r\n READONLY = \"readonly\",\r\n FOCUSED = \"k-focus\",\r\n SELECTED = \"k-selected\",\r\n STATEDISABLED = \"k-disabled\",\r\n HOVER = \"k-hover\",\r\n HOVEREVENTS = \"mouseenter\" + ns + \" mouseleave\" + ns,\r\n MOUSEDOWN = \"mousedown\" + ns,\r\n NAVIGATE = \"navigate\",\r\n ID = \"id\",\r\n MIN = \"min\",\r\n MAX = \"max\",\r\n MONTH = \"month\",\r\n ARIA_DISABLED = \"aria-disabled\",\r\n ARIA_READONLY = \"aria-readonly\",\r\n ARIA_EXPANDED = \"aria-expanded\",\r\n ARIA_HIDDEN = \"aria-hidden\",\r\n ARIA_ACTIVEDESCENDANT = \"aria-activedescendant\",\r\n calendar = kendo.calendar,\r\n isInRange = calendar.isInRange,\r\n restrictValue = calendar.restrictValue,\r\n isEqualDatePart = calendar.isEqualDatePart,\r\n extend = $.extend,\r\n DATE = Date;\r\n\r\n function normalize(options) {\r\n var parseFormats = options.parseFormats,\r\n format = options.format;\r\n\r\n calendar.normalize(options);\r\n\r\n parseFormats = Array.isArray(parseFormats) ? parseFormats : [parseFormats];\r\n\r\n if (!parseFormats.length) {\r\n parseFormats.push(\"yyyy-MM-dd\");\r\n }\r\n\r\n if ($.inArray(format, parseFormats) === -1) {\r\n parseFormats.splice(0, 0, options.format);\r\n }\r\n\r\n options.parseFormats = parseFormats;\r\n }\r\n\r\n function preventDefault(e) {\r\n e.preventDefault();\r\n }\r\n\r\n var DateView = function(options) {\r\n var that = this, id,\r\n body = document.body,\r\n div = $(DIV).attr(ARIA_HIDDEN, \"true\")\r\n .addClass(\"k-calendar-container\");\r\n\r\n that.options = options = options || {};\r\n id = options.id;\r\n\r\n that.bigScreenMQL = mediaQuery(\"large\");\r\n that.smallScreenMQL = mediaQuery(\"small\");\r\n if (options.adaptiveMode == \"auto\" ) {\r\n that.smallScreenMQL.onChange(function() {\r\n if (that.popup && kendo.isFunction(that.popup.fullscreen)) {\r\n that.popup.fullscreen(that.smallScreenMQL.mediaQueryList.matches);\r\n }\r\n });\r\n }\r\n\r\n if (!options.omitPopup) {\r\n div.appendTo(body);\r\n if (options.adaptiveMode == \"auto\" && !that.bigScreenMQL.mediaQueryList.matches) {\r\n that.popup = new ui.ActionSheet(div, {\r\n adaptive: true,\r\n title: \"Set dates\",\r\n subtitle: \"DD / MM / YY\",\r\n closeButton: true,\r\n focusOnActivate: false,\r\n fullscreen: that.smallScreenMQL.mediaQueryList.matches,\r\n popup: extend(options.popup, options, { name: \"Popup\", isRtl: kendo.support.isRtl(options.anchor) })\r\n });\r\n } else {\r\n that.popup = new ui.Popup(div, extend(options.popup, options, { name: \"Popup\", isRtl: kendo.support.isRtl(options.anchor) }));\r\n }\r\n } else {\r\n div = options.dateDiv;\r\n }\r\n if (id) {\r\n id += \"_dateview\";\r\n\r\n div.attr(ID, id);\r\n that._dateViewID = id;\r\n }\r\n that.div = div;\r\n\r\n that.value(options.value);\r\n };\r\n\r\n DateView.prototype = {\r\n _calendar: function() {\r\n var that = this;\r\n var calendar = that.calendar;\r\n var options = that.options;\r\n var div;\r\n\r\n if (!calendar) {\r\n var size = options.adaptiveMode != \"auto\" || this.bigScreenMQL.mediaQueryList.matches ? this.options.size : \"large\";\r\n div = $(DIV).attr(ID, kendo.guid())\r\n .appendTo(options.omitPopup ? options.dateDiv : (that.popup._content || that.popup.element))\r\n .on(MOUSEDOWN, preventDefault)\r\n .on(CLICK, \"td:has(.k-link)\", that._click.bind(that));\r\n\r\n\r\n that.calendar = calendar = new ui.Calendar(div, {\r\n componentType: options.componentType,\r\n size: size,\r\n messages: options.messages\r\n });\r\n that._setOptions(options);\r\n\r\n div.addClass(kendo.getValidCssClass(\"k-calendar-\", \"size\", size));\r\n\r\n calendar.navigate(that._value || that._current, options.start);\r\n\r\n that.value(that._value);\r\n }\r\n },\r\n\r\n _setOptions: function(options) {\r\n this.calendar.setOptions({\r\n focusOnNav: false,\r\n change: options.change,\r\n culture: options.culture,\r\n dates: options.dates,\r\n depth: options.depth,\r\n footer: options.footer,\r\n format: options.format,\r\n max: options.max,\r\n min: options.min,\r\n month: options.month,\r\n weekNumber: options.weekNumber,\r\n start: options.start,\r\n messages: options.messages,\r\n disableDates: options.disableDates\r\n });\r\n },\r\n\r\n setOptions: function(options) {\r\n var that = this;\r\n var old = that.options;\r\n var disableDates = options.disableDates;\r\n\r\n if (disableDates) {\r\n options.disableDates = calendar.disabled(disableDates);\r\n }\r\n\r\n that.options = extend(old, options, {\r\n change: old.change,\r\n close: old.close,\r\n open: old.open\r\n });\r\n\r\n if (that.calendar) {\r\n that._setOptions(that.options);\r\n }\r\n },\r\n\r\n destroy: function() {\r\n var that = this;\r\n if (this.popup) {\r\n this.popup.destroy();\r\n }\r\n\r\n if (that.bigScreenMQL) {\r\n that.bigScreenMQL.destroy();\r\n that.bigScreenMQL = null;\r\n }\r\n\r\n if (that.smallScreenMQL) {\r\n that.smallScreenMQL.destroy();\r\n that.smallScreenMQL = null;\r\n }\r\n },\r\n\r\n open: function() {\r\n var that = this;\r\n var popupHovered;\r\n\r\n that._calendar();\r\n\r\n // In some cases when the popup is opened resize is triggered which will cause it to close\r\n // Setting the below flag will prevent this from happening\r\n // Reference: https://github.com/telerik/kendo/pull/7553\r\n popupHovered = that.popup._hovered;\r\n that.popup._hovered = true;\r\n\r\n that.popup.open();\r\n\r\n setTimeout(function() {\r\n that.popup._hovered = popupHovered;\r\n }, 1);\r\n },\r\n\r\n close: function() {\r\n if (this.popup) {\r\n this.popup.close();\r\n }\r\n },\r\n\r\n min: function(value) {\r\n this._option(MIN, value);\r\n },\r\n\r\n max: function(value) {\r\n this._option(MAX, value);\r\n },\r\n\r\n toggle: function() {\r\n var that = this;\r\n\r\n that[that.popup.visible() ? CLOSE : OPEN]();\r\n },\r\n\r\n move: function(e) {\r\n var that = this,\r\n key = e.keyCode,\r\n calendar = that.calendar,\r\n selectIsClicked = e.ctrlKey && key == keys.DOWN || key == keys.ENTER,\r\n handled = false;\r\n\r\n if (e.altKey) {\r\n if (key == keys.DOWN) {\r\n that.open();\r\n e.preventDefault();\r\n handled = true;\r\n } else if (key == keys.UP) {\r\n that.close();\r\n e.preventDefault();\r\n handled = true;\r\n }\r\n\r\n } else if (that.popup && that.popup.visible()) {\r\n\r\n if (key == keys.ESC || (selectIsClicked && calendar._cell.hasClass(SELECTED))) {\r\n that.close();\r\n e.preventDefault();\r\n return true;\r\n }\r\n //spacebar selects a date in the calendar\r\n if (key != keys.SPACEBAR) {\r\n that._current = calendar._move(e);\r\n }\r\n\r\n handled = true;\r\n }\r\n\r\n return handled;\r\n },\r\n\r\n current: function(date) {\r\n this._current = date;\r\n if (this.calendar) {\r\n this.calendar._focus(date);\r\n }\r\n },\r\n\r\n value: function(value) {\r\n var that = this,\r\n calendar = that.calendar,\r\n options = that.options,\r\n disabledDate = options.disableDates;\r\n\r\n if (disabledDate && disabledDate(value)) {\r\n value = null;\r\n }\r\n\r\n that._value = value;\r\n that._current = new DATE(+restrictValue(value, options.min, options.max));\r\n\r\n if (calendar) {\r\n calendar.value(value);\r\n }\r\n },\r\n\r\n _click: function(e) {\r\n\r\n if (e.currentTarget.className.indexOf(SELECTED) !== -1) {\r\n this.calendar.trigger(\"change\");\r\n this.close();\r\n }\r\n },\r\n\r\n _option: function(option, value) {\r\n var that = this;\r\n var calendar = that.calendar;\r\n\r\n that.options[option] = value;\r\n\r\n if (calendar) {\r\n calendar[option](value);\r\n }\r\n }\r\n };\r\n\r\n DateView.normalize = normalize;\r\n\r\n kendo.DateView = DateView;\r\n\r\n var DatePicker = Widget.extend({\r\n init: function(element, options) {\r\n var that = this,\r\n initialValue,\r\n disabled;\r\n\r\n Widget.fn.init.call(that, element, options);\r\n element = that.element;\r\n options = that.options;\r\n\r\n options.disableDates = kendo.calendar.disabled(options.disableDates);\r\n\r\n options.min = parse(element.attr(\"min\")) || parse(options.min);\r\n options.max = parse(element.attr(\"max\")) || parse(options.max);\r\n\r\n that.options.readonly = options.readonly !== undefined$1 ? options.readonly : Boolean(that.element.attr(\"readonly\"));\r\n that.options.enable = options.enable !== undefined$1 ? options.enable : !(Boolean(element.is(\"[disabled]\") || $(element).parents(\"fieldset\").is(':disabled')));\r\n\r\n normalize(options);\r\n\r\n that._initialOptions = extend({}, options);\r\n\r\n that._wrapper();\r\n\r\n that._createDateView();\r\n that._createDateViewProxy = that._createDateView.bind(that);\r\n\r\n that.bigScreenMQL = mediaQuery(\"large\");\r\n if (that.options.adaptiveMode == \"auto\") {\r\n that.bigScreenMQL.onChange(()=> {\r\n that._createDateViewProxy();\r\n that.dateView.value(that._value);\r\n });\r\n }\r\n\r\n that._icon();\r\n\r\n try {\r\n element[0].setAttribute(\"type\", \"text\");\r\n } catch (e) {\r\n element[0].type = \"text\";\r\n }\r\n\r\n element\r\n .addClass(\"k-input-inner\")\r\n .attr({\r\n role: \"combobox\",\r\n \"aria-expanded\": false,\r\n \"aria-haspopup\": \"grid\",\r\n \"aria-controls\": that.dateView._dateViewID,\r\n \"autocomplete\": \"off\"\r\n });\r\n that._reset();\r\n that._template();\r\n\r\n disabled = !that.options.enable;\r\n if (disabled) {\r\n that.enable(false);\r\n } else {\r\n that.readonly(element.is(\"[readonly]\"));\r\n }\r\n\r\n initialValue = parse(options.value || that.element.val(), options.parseFormats, options.culture);\r\n\r\n that._createDateInput(options);\r\n\r\n that._old = that._update(initialValue || that.element.val());\r\n that._oldText = element.val();\r\n that._applyCssClasses();\r\n\r\n if (options.label) {\r\n that._label();\r\n }\r\n\r\n that.element.removeAttr(\"style\");\r\n\r\n kendo.notify(that);\r\n },\r\n events: [\r\n OPEN,\r\n CLOSE,\r\n CHANGE],\r\n options: {\r\n name: \"DatePicker\",\r\n autoAdjust: true,\r\n value: null,\r\n footer: \"\",\r\n format: \"\",\r\n culture: \"\",\r\n parseFormats: [],\r\n min: new Date(1900, 0, 1),\r\n max: new Date(2099, 11, 31),\r\n start: MONTH,\r\n depth: MONTH,\r\n animation: {},\r\n month: {},\r\n dates: [],\r\n disableDates: null,\r\n ARIATemplate: ({ valueType, text }) => `Current focused ${valueType} is ${text}`,\r\n dateInput: false,\r\n weekNumber: false,\r\n messages: {\r\n weekColumnHeader: \"\"\r\n },\r\n componentType: \"classic\",\r\n adaptiveMode: \"none\",\r\n size: \"medium\",\r\n fillMode: \"solid\",\r\n rounded: \"medium\",\r\n label: null,\r\n autoFill: false,\r\n autoCorrectParts: true\r\n },\r\n\r\n _createDateView: function() {\r\n var that = this,\r\n options = that.options,\r\n element = that.element,\r\n div;\r\n\r\n if (that.dateView) {\r\n that.dateView.destroy();\r\n that.dateView = null;\r\n }\r\n\r\n that.dateView = new DateView(extend({}, options, {\r\n id: element.attr(ID),\r\n anchor: that.wrapper,\r\n change: function() {\r\n // calendar is the current scope\r\n that._change(this.value());\r\n that.close();\r\n },\r\n close: function(e) {\r\n if (that.trigger(CLOSE)) {\r\n e.preventDefault();\r\n } else {\r\n element.attr(ARIA_EXPANDED, false);\r\n div.attr(ARIA_HIDDEN, true);\r\n\r\n setTimeout(function() {\r\n element.removeAttr(\"aria-activedescendant\");\r\n });\r\n }\r\n },\r\n open: function(e) {\r\n var options = that.options,\r\n date;\r\n\r\n if (that.trigger(OPEN)) {\r\n e.preventDefault();\r\n } else {\r\n if (that.element.val() !== that._oldText) {\r\n date = parse(element.val(), options.parseFormats, options.culture);\r\n\r\n that.dateView[date ? \"current\" : \"value\"](date);\r\n }\r\n\r\n element.attr(ARIA_EXPANDED, true);\r\n div.attr(ARIA_HIDDEN, false);\r\n\r\n that._updateARIA(date);\r\n\r\n }\r\n }\r\n }));\r\n\r\n div = that.dateView.div;\r\n },\r\n\r\n setOptions: function(options) {\r\n var that = this;\r\n var value = that._value;\r\n\r\n Widget.fn.setOptions.call(that, options);\r\n\r\n options = that.options;\r\n\r\n options.min = parse(options.min);\r\n options.max = parse(options.max);\r\n\r\n normalize(options);\r\n\r\n that._dateIcon.off(ns);\r\n that._dateIcon.remove();\r\n\r\n that.dateView.setOptions(options);\r\n that._icon();\r\n that._editable({\r\n readonly: options.readonly === undefined$1 ? that.options.readonly : options.readonly,\r\n disable: !(options.enable === undefined$1 ? that.options.enable : options.enable)\r\n });\r\n\r\n that._createDateInput(options);\r\n\r\n if (!that._dateInput) {\r\n that.element.val(kendo.toString(value, options.format, options.culture));\r\n }\r\n\r\n if (value) {\r\n that._updateARIA(value);\r\n }\r\n\r\n if (options.label && that._inputLabel) {\r\n that.label.setOptions(options.label);\r\n } else if (options.label === false) {\r\n that.label._unwrapFloating();\r\n that._inputLabel.remove();\r\n delete that._inputLabel;\r\n } else if (options.label) {\r\n that._label();\r\n }\r\n },\r\n\r\n _editable: function(options) {\r\n var that = this,\r\n icon = that._dateIcon.off(ns),\r\n element = that.element.off(ns),\r\n wrapper = that.wrapper.off(ns),\r\n readonly = options.readonly,\r\n disable = options.disable;\r\n\r\n if (!readonly && !disable) {\r\n wrapper\r\n .removeClass(STATEDISABLED)\r\n .on(HOVEREVENTS, that._toggleHover);\r\n if (element && element.length) {\r\n element[0].removeAttribute(DISABLED);\r\n element[0].removeAttribute(READONLY);\r\n }\r\n element.attr(ARIA_DISABLED, false)\r\n .attr(ARIA_READONLY, false)\r\n .on(\"keydown\" + ns, that._keydown.bind(that))\r\n .on(\"focusout\" + ns, that._blur.bind(that))\r\n .on(\"focus\" + ns, function() {\r\n that.wrapper.addClass(FOCUSED);\r\n });\r\n\r\n icon.on(UP, that._click.bind(that))\r\n .on(MOUSEDOWN, preventDefault);\r\n } else {\r\n wrapper\r\n .addClass(disable ? STATEDISABLED : \"\")\r\n .removeClass(disable ? \"\" : STATEDISABLED);\r\n\r\n element.attr(DISABLED, disable)\r\n .attr(READONLY, readonly)\r\n .attr(ARIA_DISABLED, disable)\r\n .attr(ARIA_READONLY, readonly);\r\n }\r\n },\r\n\r\n readonly: function(readonly) {\r\n this._editable({\r\n readonly: readonly === undefined$1 ? true : readonly,\r\n disable: false\r\n });\r\n if (this._dateInput) {\r\n this._dateInput._editable({\r\n readonly: readonly === undefined$1 ? true : readonly,\r\n disable: false\r\n });\r\n }\r\n\r\n if (this.label && this.label.floatingLabel) {\r\n this.label.floatingLabel.readonly(readonly === undefined$1 ? true : readonly);\r\n }\r\n },\r\n\r\n enable: function(enable) {\r\n this._editable({\r\n readonly: false,\r\n disable: !(enable = enable === undefined$1 ? true : enable)\r\n });\r\n if (this._dateInput) {\r\n this._dateInput._editable({\r\n readonly: false,\r\n disable: !(enable = enable === undefined$1 ? true : enable)\r\n });\r\n }\r\n\r\n if (this.label && this.label.floatingLabel) {\r\n this.label.floatingLabel.enable(enable = enable === undefined$1 ? true : enable);\r\n }\r\n },\r\n\r\n _label: function() {\r\n var that = this;\r\n var options = that.options;\r\n var labelOptions = $.isPlainObject(options.label) ? options.label : {\r\n content: options.label\r\n };\r\n\r\n if (that._dateInput) {\r\n labelOptions.floatCheck = () => {\r\n\r\n if (!that.value() && (!that._dateInput._hasDateInput() || that.element.val() === \"\") && document.activeElement !== that.element[0]) {\r\n that.element.val(\"\");\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n }\r\n\r\n that.label = new kendo.ui.Label(null, $.extend({}, labelOptions, {\r\n widget: that\r\n }));\r\n\r\n that._inputLabel = that.label.element;\r\n },\r\n\r\n destroy: function() {\r\n var that = this;\r\n\r\n if (that.label) {\r\n that.label.destroy();\r\n }\r\n\r\n Widget.fn.destroy.call(that);\r\n\r\n if (that.dateView.calendar && that._navigateCalendarHandler) {\r\n that.dateView.calendar.unbind(NAVIGATE, that._navigateCalendarHandler);\r\n that._navigateCalendarHandler = null;\r\n }\r\n\r\n that.dateView.destroy();\r\n\r\n that.element.off(ns);\r\n that._dateIcon.off(ns);\r\n\r\n if (that._form) {\r\n that._form.off(\"reset\", that._resetHandler);\r\n }\r\n\r\n if (that.bigScreenMQL) {\r\n that.bigScreenMQL.destroy();\r\n }\r\n\r\n that._createDateViewProxy = null;\r\n },\r\n\r\n open: function() {\r\n this.dateView.open();\r\n this._navigateCalendar();\r\n },\r\n\r\n close: function() {\r\n this.dateView.close();\r\n },\r\n\r\n min: function(value) {\r\n return this._option(MIN, value);\r\n },\r\n\r\n max: function(value) {\r\n return this._option(MAX, value);\r\n },\r\n\r\n value: function(value) {\r\n var that = this;\r\n\r\n if (value === undefined$1) {\r\n return that._value;\r\n }\r\n\r\n that._old = that._update(value);\r\n\r\n if (that._old === null) {\r\n if (that._dateInput) {\r\n that._dateInput.value(that._old);\r\n } else {\r\n that.element.val(\"\");\r\n }\r\n }\r\n\r\n that._oldText = that.element.val();\r\n\r\n if (that.label && that.label.floatingLabel) {\r\n that.label.floatingLabel.refresh();\r\n }\r\n },\r\n\r\n _toggleHover: function(e) {\r\n $(e.currentTarget).toggleClass(HOVER, e.type === \"mouseenter\");\r\n },\r\n\r\n _isReset: function(value) {\r\n var that = this;\r\n return that.options.dateInput && that.options.autoFill && that._dateInput._emptyMask == value;\r\n },\r\n\r\n _blur: function() {\r\n var that = this,\r\n value = that.element.val();\r\n\r\n that.close();\r\n if (value !== that._oldText) {\r\n\r\n if (that.options.autoFill && !that._isReset(value)) {\r\n that._dateInput.dateInputInstance.autoFill();\r\n value = that.element.val();\r\n }\r\n\r\n that._change(value);\r\n if (!value) {\r\n that.dateView.current(kendo.calendar.getToday());\r\n }\r\n }\r\n\r\n that.wrapper.removeClass(FOCUSED);\r\n },\r\n\r\n _click: function(e) {\r\n var that = this;\r\n\r\n that.dateView.toggle();\r\n that._navigateCalendar();\r\n that._focusElement(e.type);\r\n },\r\n\r\n _focusElement: function(eventType) {\r\n var element = this.element;\r\n\r\n if ((!support.touch || (support.mouseAndTouchPresent && !(eventType || \"\").match(/touch/i))) && element[0] !== activeElement()) {\r\n element.trigger(\"focus\");\r\n }\r\n },\r\n\r\n _change: function(value) {\r\n var that = this,\r\n oldValue = that.element.val(),\r\n dateChanged;\r\n\r\n value = that._update(value);\r\n dateChanged = !kendo.calendar.isEqualDate(that._old, value);\r\n\r\n var valueUpdated = dateChanged && !that._typing;\r\n var textFormatted = oldValue !== that.element.val();\r\n\r\n if (valueUpdated || textFormatted) {\r\n that.element.trigger(CHANGE);\r\n }\r\n\r\n if (dateChanged) {\r\n that._old = value;\r\n that._oldText = that.element.val();\r\n\r\n that.trigger(CHANGE);\r\n }\r\n\r\n that._typing = false;\r\n },\r\n\r\n _keydown: function(e) {\r\n var that = this,\r\n dateView = that.dateView,\r\n value = that.element.val(),\r\n handled = false;\r\n\r\n if (!dateView.popup.visible() && e.keyCode == keys.ENTER && value !== that._oldText) {\r\n that._change(value);\r\n } else {\r\n handled = dateView.move(e);\r\n that._updateARIA(dateView._current);\r\n\r\n if (!handled) {\r\n that._typing = true;\r\n } else if (that._dateInput && e.stopImmediatePropagation) {\r\n e.stopImmediatePropagation();\r\n }\r\n }\r\n },\r\n\r\n _icon: function() {\r\n var that = this,\r\n element = that.element,\r\n options = that.options,\r\n icon;\r\n\r\n icon = element.next(\"button.k-input-button\");\r\n\r\n if (!icon[0]) {\r\n icon = $(html.renderButton('', {\r\n icon: \"calendar\",\r\n size: options.size,\r\n fillMode: options.fillMode,\r\n shape: \"none\",\r\n rounded: \"none\"\r\n })).insertAfter(element);\r\n }\r\n\r\n that._dateIcon = icon.attr({\r\n \"role\": \"button\"\r\n });\r\n },\r\n\r\n _setCalendarAttribute: function() {\r\n var that = this;\r\n setTimeout(function() {\r\n that.element.attr(ARIA_ACTIVEDESCENDANT, that.dateView.calendar._table.attr(ARIA_ACTIVEDESCENDANT));\r\n });\r\n },\r\n\r\n _navigateCalendar: function() {\r\n var that = this;\r\n\r\n if (!that._navigateCalendarHandler) {\r\n that._navigateCalendarHandler = that._setCalendarAttribute.bind(that);\r\n }\r\n\r\n if (!!that.dateView.calendar) {\r\n that.dateView.calendar.unbind(NAVIGATE, that._navigateCalendarHandler).bind(NAVIGATE, that._navigateCalendarHandler);\r\n }\r\n },\r\n\r\n _option: function(option, value) {\r\n var that = this,\r\n options = that.options;\r\n\r\n if (value === undefined$1) {\r\n return options[option];\r\n }\r\n\r\n value = parse(value, options.parseFormats, options.culture);\r\n\r\n if (!value) {\r\n return;\r\n }\r\n\r\n options[option] = new DATE(+value);\r\n that.dateView[option](value);\r\n\r\n if (that._dateInput) {\r\n that._dateInput[option](value);\r\n }\r\n },\r\n\r\n _update: function(value) {\r\n var that = this,\r\n options = that.options,\r\n min = options.min,\r\n max = options.max,\r\n current = that._value,\r\n date = parse(value, options.parseFormats, options.culture),\r\n isSameType = (date === null && current === null) || (date instanceof Date && current instanceof Date),\r\n formattedValue;\r\n\r\n if (options.disableDates(date)) {\r\n date = null;\r\n if (!that._old && !that.element.val()) {\r\n value = null;\r\n }\r\n }\r\n\r\n if (+date === +current && isSameType) {\r\n formattedValue = kendo.toString(date, options.format, options.culture);\r\n\r\n if (formattedValue !== value && !(that._dateInput && !date)) {\r\n that.element.val(date === null ? value : formattedValue);\r\n }\r\n\r\n return date;\r\n }\r\n\r\n if (date !== null && isEqualDatePart(date, min)) {\r\n date = restrictValue(date, min, max);\r\n } else if (!isInRange(date, min, max)) {\r\n date = null;\r\n }\r\n\r\n that._value = date;\r\n that.dateView.value(date);\r\n if (that._dateInput && date) {\r\n that._dateInput.value(date || value);\r\n } else {\r\n that.element.val(kendo.toString(date || value, options.format, options.culture));\r\n }\r\n that._updateARIA(date);\r\n\r\n return date;\r\n },\r\n\r\n _wrapper: function() {\r\n var that = this,\r\n element = that.element,\r\n wrapper;\r\n\r\n wrapper = element.parents(\".k-datepicker\");\r\n\r\n if (!wrapper[0]) {\r\n wrapper = element.wrap(SPAN).parent();\r\n }\r\n\r\n wrapper[0].style.cssText = element[0].style.cssText;\r\n element.css({\r\n height: element[0].style.height\r\n });\r\n\r\n that.wrapper = wrapper.addClass(\"k-datepicker k-input\")\r\n .addClass(element[0].className).removeClass('input-validation-error');\r\n },\r\n\r\n _reset: function() {\r\n var that = this,\r\n element = that.element,\r\n formId = element.attr(\"form\"),\r\n options = that.options,\r\n disabledDate = options.disableDates,\r\n parseFormats = options.parseFormats.length ? options.parseFormats : null,\r\n optionsValue = that._initialOptions.value,\r\n form = formId ? $(\"#\" + formId) : element.closest(\"form\"),\r\n initialValue = element[0].defaultValue;\r\n\r\n if (optionsValue && (disabledDate && disabledDate(optionsValue))) {\r\n optionsValue = null;\r\n }\r\n\r\n if ((!initialValue || !kendo.parseDate(initialValue, parseFormats, options.culture)) && optionsValue) {\r\n element.attr(\"value\", kendo.toString(optionsValue, options.format, options.culture));\r\n }\r\n\r\n if (form[0]) {\r\n that._resetHandler = function() {\r\n that.value(optionsValue || element[0].defaultValue);\r\n that.max(that._initialOptions.max);\r\n that.min(that._initialOptions.min);\r\n };\r\n\r\n that._form = form.on(\"reset\", that._resetHandler);\r\n }\r\n },\r\n\r\n _template: function() {\r\n this._ariaTemplate = template(this.options.ARIATemplate).bind(this);\r\n },\r\n\r\n _createDateInput: function(options) {\r\n if (this._dateInput) {\r\n this._dateInput.destroy();\r\n this._dateInput = null;\r\n }\r\n\r\n if (options.dateInput ) {\r\n this._dateInput = new ui.DateInput(this.element, {\r\n autoAdjust: options.autoAdjust,\r\n culture: options.culture,\r\n format: options.format,\r\n size: options.size,\r\n fillMode: options.fillMode,\r\n rounded: options.rounded,\r\n min: options.min,\r\n max: options.max,\r\n messages: options.messages.dateInput,\r\n autoFill: options.autoFill,\r\n autoCorrectParts: options.autoCorrectParts,\r\n });\r\n }\r\n },\r\n\r\n _updateARIA: function(date) {\r\n var that = this;\r\n var calendar = that.dateView.calendar;\r\n\r\n if (that.element && that.element.length) {\r\n that.element[0].removeAttribute(ARIA_ACTIVEDESCENDANT);\r\n }\r\n\r\n if (calendar) {\r\n that.element.attr(ARIA_ACTIVEDESCENDANT, calendar._updateAria(that._ariaTemplate, date));\r\n }\r\n }\r\n });\r\n\r\n kendo.cssProperties.registerPrefix(\"DatePicker\", \"k-input-\");\r\n\r\n kendo.cssProperties.registerValues(\"DatePicker\", [{\r\n prop: \"rounded\",\r\n values: kendo.cssProperties.roundedValues.concat([['full', 'full']])\r\n }]);\r\n\r\n ui.plugin(DatePicker);\r\n\r\n })(window.kendo.jQuery);\r\n var kendo$1V = kendo;\r\n\r\n var __meta__$1U = {\r\n id: \"drawer\",\r\n name: \"Drawer\",\r\n category: \"web\",\r\n description: \"The Kendo Drawer widget provides slide to reveal sidebar\",\r\n depends: [ \"userevents\" ]\r\n };\r\n\r\n (function($, undefined$1) {\r\n var kendo = window.kendo,\r\n ui = kendo.ui,\r\n Widget = ui.Widget,\r\n SHOW = \"show\",\r\n HIDE = \"hide\",\r\n NS = \".kendoDrawer\",\r\n FOCUSED = \"k-focus\",\r\n keys = kendo.keys,\r\n ITEMCLICK = \"itemClick\",\r\n TABINDEX = \"tabIndex\",\r\n PUSH = \"push\",\r\n OVERLAY = \"overlay\",\r\n LEFT = \"left\",\r\n START = \"start\",\r\n END = \"end\",\r\n RIGHT = \"right\",\r\n DOT = \".\",\r\n DRAWER_ITEMS_CLASS = \"k-drawer-items\";\r\n\r\n var Drawer = kendo.ui.Widget.extend({\r\n init: function(element, options) {\r\n var that = this;\r\n var userEvents;\r\n\r\n Widget.fn.init.call(this, element, options);\r\n\r\n options = that.options;\r\n\r\n that._element(element);\r\n\r\n that._wrapper(element);\r\n\r\n that._navigatable();\r\n\r\n that.position();\r\n\r\n that._mode();\r\n\r\n if (options.mini) {\r\n that._miniMode();\r\n }\r\n\r\n that._initDrawerItems();\r\n\r\n if (options.mini && options.mode != PUSH) {\r\n that._setBodyOffset();\r\n }\r\n\r\n userEvents = this.userEvents = new kendo.UserEvents(options.mode != PUSH ? $(document.body) : this.drawerContainer, { fastTap: true, allowSelection: true });\r\n\r\n that.tap = function(e) {\r\n if ($.contains(that.drawerItemsWrapper.filter(DOT + DRAWER_ITEMS_CLASS)[0], e.event.target)) {\r\n that._itemClick(e);\r\n }\r\n if (options.autoCollapse && that.visible && !that.trigger(\"hide\", { sender: this })) {\r\n that.hide();\r\n e.preventDefault();\r\n }\r\n };\r\n\r\n if (this.options.swipeToOpen) {\r\n userEvents.bind(\"start\", function(e) { that._start(e); });\r\n userEvents.bind(\"move\", function(e) { that._update(e); });\r\n userEvents.bind(\"end\", function(e) { that._end(e); });\r\n userEvents.bind(\"tap\", that.tap);\r\n } else {\r\n userEvents.bind(\"press\", that.tap);\r\n }\r\n\r\n if (options.minHeight && options.mode == PUSH) {\r\n that.drawerContainer.css(\"min-height\", options.minHeight);\r\n }\r\n\r\n\r\n if (that._showWatermarkOverlay) {\r\n that._showWatermarkOverlay(that.drawerContainer[0]);\r\n }\r\n\r\n if (options.expanded) {\r\n that._removeTransition();\r\n that.show();\r\n }\r\n },\r\n\r\n _element: function() {\r\n var that = this;\r\n\r\n var element = that.element;\r\n var options = that.options;\r\n that.contentElement = element.children()\r\n .wrapAll(\"
    \")\r\n .parent();\r\n that.drawerElement = $(options.template);\r\n\r\n element.addClass(\"k-drawer\");\r\n },\r\n\r\n _navigatable: function() {\r\n var that = this;\r\n var element = that.element;\r\n var drawerItems = element.find(\"[data-role='drawer-item']\");\r\n\r\n drawerItems.first().parent()\r\n .attr(\"role\", \"menubar\")\r\n .attr(\"aria-orientation\", \"vertical\");\r\n\r\n if (!this.options.navigatable) {\r\n return;\r\n }\r\n\r\n element\r\n .attr(TABINDEX, 0)\r\n .on(\"focus\" + NS, that._focus.bind(that))\r\n .on(\"focusout\" + NS, that._blur.bind(that))\r\n .on(\"keydown\" + NS, that, that._keyDown.bind(that));\r\n },\r\n\r\n _blur: function() {\r\n var that = this;\r\n\r\n if (that._current) {\r\n that._current.removeClass(FOCUSED);\r\n }\r\n },\r\n\r\n _focus: function() {\r\n var that = this;\r\n\r\n that._setCurrent(that._current ? that._current : that.drawerItemsWrapper.find(\"[data-role='drawer-item']\").eq(0));\r\n },\r\n\r\n _setCurrent: function(current) {\r\n var that = this;\r\n var id = kendo.guid();\r\n var next = $(current);\r\n\r\n if (that._current) {\r\n $(that._current)\r\n .removeClass(FOCUSED)\r\n .removeAttr(\"id\");\r\n\r\n that.drawerItemsWrapper.removeAttr(\"aria-activedescendant\");\r\n }\r\n\r\n next\r\n .attr(\"id\", id)\r\n .addClass(FOCUSED);\r\n\r\n that.drawerItemsWrapper.attr(\"aria-activedescendant\", id);\r\n\r\n that._current = next;\r\n },\r\n\r\n _keyDown: function(e) {\r\n var that = this;\r\n var handled = false;\r\n var current = that._current;\r\n var next;\r\n\r\n if (e.keyCode == keys.UP) {\r\n handled = true;\r\n next = current.prevAll(\"[data-role='drawer-item']\").first();\r\n\r\n if (next.length) {\r\n that._setCurrent(next);\r\n } else {\r\n that._setCurrent(current.parent().find(\"[data-role='drawer-item']\").last());\r\n }\r\n\r\n }\r\n\r\n if (e.keyCode == keys.DOWN) {\r\n handled = true;\r\n next = current.nextAll(\"[data-role='drawer-item']\").first();\r\n\r\n if (next.length) {\r\n that._setCurrent(next);\r\n } else {\r\n that._setCurrent(current.parent().find(\"[data-role='drawer-item']\").first());\r\n }\r\n }\r\n\r\n if (e.keyCode == keys.HOME) {\r\n handled = true;\r\n that._setCurrent(that.drawerItemsWrapper.find(\"[data-role='drawer-item']\").eq(0));\r\n }\r\n\r\n if (e.keyCode == keys.END) {\r\n handled = true;\r\n that._setCurrent(that.drawerItemsWrapper.find(\"[data-role='drawer-item']\").last());\r\n }\r\n\r\n if (e.keyCode == keys.SPACEBAR || e.keyCode == keys.ENTER) {\r\n handled = true;\r\n that.tap({\r\n event: { target: current[0] },\r\n preventDefault: $.noop\r\n });\r\n }\r\n\r\n if (e.keyCode == keys.ESC) {\r\n handled = true;\r\n that.hide();\r\n }\r\n\r\n if (handled) {\r\n //prevent scrolling while pressing the keys\r\n e.preventDefault();\r\n }\r\n },\r\n\r\n _wrapper: function() {\r\n var options = this.options;\r\n var drawerElement = this.drawerElement;\r\n var element = this.element;\r\n var contentElement = this.contentElement;\r\n var drawerItemsWrapper = this.drawerItemsWrapper = drawerElement;\r\n var drawerWrapper = this.drawerWrapper = drawerItemsWrapper.wrapAll(\"
    \").parent();\r\n var drawerContainer = this.drawerContainer = element.wrap(\"
    \").parent();\r\n\r\n drawerElement.filter(\"ul\").addClass(DRAWER_ITEMS_CLASS);\r\n\r\n if (options.mini) {\r\n if (options.mini.width) {\r\n drawerWrapper.width(options.mini.width);\r\n }\r\n } else {\r\n drawerWrapper.width(0);\r\n }\r\n\r\n drawerContainer.append(contentElement);\r\n\r\n element.append( drawerWrapper );\r\n },\r\n\r\n _addTransition: function() {\r\n this.drawerWrapper.css(\"transition\", \"all .3s ease-out\");\r\n },\r\n\r\n _removeTransition: function() {\r\n this.drawerWrapper.css(\"transition\", \"none\");\r\n },\r\n\r\n _setBodyOffset: function() {\r\n var overlayMiniOffset = this.element.outerWidth();\r\n\r\n if (this.leftPositioned) {\r\n $(document.body).css(\"padding-left\", overlayMiniOffset);\r\n }\r\n else {\r\n $(document.body).css(\"padding-right\", overlayMiniOffset);\r\n }\r\n },\r\n\r\n _initDrawerItems: function() {\r\n var drawerItemsWrapper = this.drawerItemsWrapper;\r\n var drawerItems = drawerItemsWrapper.find(\"[data-role='drawer-item']\");\r\n var separatorItems = drawerItemsWrapper.find(\"[data-role='drawer-separator']\");\r\n\r\n drawerItems.addClass(\"k-drawer-item\").attr(\"role\", \"menuitem\");\r\n separatorItems.addClass(\"k-drawer-item k-drawer-separator\").attr(\"role\", \"separator\");\r\n\r\n this._toggleLevelClasses(!!this.visible);\r\n\r\n drawerItems.each((i, item) => {\r\n item.setAttribute(\"aria-label\", item.textContent.trim());\r\n });\r\n\r\n if (this._selectedItemIndex >= 0) {\r\n drawerItems.removeClass(\"k-selected\");\r\n drawerItems.eq(this._selectedItemIndex).addClass(\"k-selected\");\r\n }\r\n },\r\n\r\n _toggleLevelClasses: function(flag) {\r\n let drawerItems = this.drawerItemsWrapper.find(\"[data-role='drawer-item']\"), level, levelClass;\r\n\r\n drawerItems.each((i, item) => {\r\n level = $(item).data(\"level\") || 0;\r\n levelClass = \"k-level-\" + level;\r\n\r\n $(item).toggleClass(levelClass, flag);\r\n });\r\n },\r\n\r\n _mode: function() {\r\n var options = this.options;\r\n var drawerContainer = this.drawerContainer;\r\n var overlayContainer;\r\n\r\n if (options.mode == PUSH) {\r\n drawerContainer.addClass('k-drawer-' + PUSH);\r\n }\r\n else {\r\n drawerContainer.addClass('k-drawer-' + OVERLAY);\r\n overlayContainer = this.overlayContainer = $('
    ');\r\n overlayContainer.hide();\r\n drawerContainer.prepend(overlayContainer);\r\n }\r\n },\r\n\r\n _miniMode: function() {\r\n var options = this.options;\r\n var drawerContainer = this.drawerContainer;\r\n var miniWidth = options.mini.width;\r\n var miniTemplate = this._miniTemplate = options.mini.template && $(options.mini.template);\r\n var drawerItemsWrapper = this.drawerItemsWrapper;\r\n var drawerWrapper = this.drawerWrapper;\r\n\r\n drawerContainer.addClass(\"k-drawer-mini\");\r\n\r\n if (miniTemplate) {\r\n drawerItemsWrapper.html(miniTemplate);\r\n }\r\n\r\n if (miniWidth) {\r\n drawerWrapper.width(miniWidth);\r\n }\r\n\r\n this.minWidth = options.mini.width || this.drawerWrapper.width();\r\n },\r\n\r\n show: function() {\r\n var drawerWrapper = this.drawerWrapper;\r\n var drawerContainer = this.drawerContainer;\r\n var options = this.options;\r\n var isExpanded = drawerContainer.hasClass(\"k-drawer-expanded\");\r\n var miniTemplate = this._miniTemplate;\r\n var drawerElement = this.drawerElement;\r\n var drawerItemsWrapper = this.drawerItemsWrapper;\r\n\r\n if (!isExpanded) {\r\n drawerContainer.addClass('k-drawer-expanded');\r\n this.visible = true;\r\n }\r\n\r\n if (miniTemplate) {\r\n drawerItemsWrapper.html(drawerElement);\r\n this._initDrawerItems();\r\n this._selectItem();\r\n }\r\n\r\n drawerWrapper.width(options.width);\r\n\r\n if (options.mini) {\r\n drawerContainer.removeClass(\"k-drawer-mini\");\r\n }\r\n\r\n if (options.mode === OVERLAY) {\r\n this.overlayContainer.show();\r\n this.visible = true;\r\n }\r\n\r\n this._toggleLevelClasses(true);\r\n },\r\n\r\n hide: function() {\r\n var that = this;\r\n var drawerWrapper = that.drawerWrapper;\r\n var drawerContainer = that.drawerContainer;\r\n var options = this.options;\r\n var drawerItemsWrapper = this.drawerItemsWrapper;\r\n var miniTemplate = this._miniTemplate;\r\n var miniWidth = options.mini && options.mini.width;\r\n\r\n this._addTransition();\r\n\r\n if (this._miniTemplate) {\r\n drawerItemsWrapper.html(miniTemplate);\r\n that._initDrawerItems();\r\n this._selectItem();\r\n }\r\n\r\n if (options.mini) {\r\n drawerContainer.addClass(\"k-drawer-mini\");\r\n if (miniWidth) {\r\n drawerWrapper.width(miniWidth);\r\n } else {\r\n drawerWrapper.width(\"\");\r\n }\r\n } else {\r\n drawerWrapper.width(0);\r\n }\r\n\r\n if (this.visible) {\r\n drawerContainer.removeClass('k-drawer-expanded');\r\n this.visible = false;\r\n }\r\n\r\n if (options.mode === OVERLAY) {\r\n this.overlayContainer.hide();\r\n }\r\n\r\n this._toggleLevelClasses(false);\r\n },\r\n\r\n position: function(value) {\r\n var that = this;\r\n var options = that.options;\r\n var position = value || options.position;\r\n\r\n if (position == RIGHT) {\r\n that.element.removeClass('k-drawer-' + START);\r\n that.element.addClass('k-drawer-' + END);\r\n }\r\n else {\r\n that.element.removeClass('k-drawer-' + END);\r\n that.element.addClass('k-drawer-' + START);\r\n }\r\n\r\n this.leftPositioned = position === LEFT;\r\n },\r\n\r\n _start: function(e) {\r\n var that = this;\r\n var options = this.options;\r\n var drawerWrapper = this.drawerWrapper;\r\n var drawerItemsWrapper = this.drawerItemsWrapper;\r\n var userEvents = e.sender;\r\n\r\n\r\n // ignore non-horizontal swipes\r\n if (Math.abs(e.x.velocity) < Math.abs(e.y.velocity) || kendo.triggeredByInput(e.event)) {\r\n userEvents.cancel();\r\n return;\r\n }\r\n\r\n\r\n if (this.drawerMini) {\r\n drawerItemsWrapper.html(that.drawerElement);\r\n }\r\n\r\n this._removeTransition();\r\n\r\n if (options.mode != PUSH) {\r\n this.overlayContainer.show();\r\n }\r\n },\r\n\r\n _update: function(e) {\r\n var options = this.options;\r\n var mode = options.mode;\r\n\r\n if (mode == PUSH) {\r\n this._push(e);\r\n }\r\n else {\r\n this._overlay(e);\r\n }\r\n },\r\n\r\n _end: function(e) {\r\n var velocity = e.x.velocity;\r\n var options = this.options;\r\n var drawerWrapper = this.drawerWrapper;\r\n var elementWidth = drawerWrapper.width();\r\n var pastHalf = elementWidth > options.width / 2;\r\n var velocityThreshold = 0.8;\r\n var shouldShow;\r\n\r\n this._addTransition();\r\n\r\n if (this.leftPositioned) {\r\n shouldShow = velocity > -velocityThreshold && (velocity > velocityThreshold || pastHalf);\r\n }\r\n else {\r\n shouldShow = velocity < velocityThreshold && (velocity < -velocityThreshold || pastHalf);\r\n }\r\n\r\n if (shouldShow) {\r\n if (this.trigger(\"show\", { sender: this })) {\r\n e.preventDefault();\r\n this.hide();\r\n } else {\r\n this.show();\r\n }\r\n } else {\r\n if (this.trigger(\"hide\", { sender: this })) {\r\n e.preventDefault();\r\n this.show();\r\n } else {\r\n this.hide();\r\n }\r\n }\r\n },\r\n\r\n _overlay: function(moveEventArgs) {\r\n var options = this.options;\r\n var minWidth = (options.mini && options.mini.width) || this.minWidth || 0;\r\n var drawerWrapper = this.drawerWrapper;\r\n var elementWidth = drawerWrapper.width();\r\n var limitedPosition;\r\n var updatedPosition;\r\n\r\n updatedPosition = elementWidth + (this.leftPositioned ? moveEventArgs.x.delta : -moveEventArgs.x.delta);\r\n\r\n limitedPosition = Math.min(Math.max(updatedPosition, minWidth), options.width);\r\n\r\n moveEventArgs.event.preventDefault();\r\n moveEventArgs.event.stopPropagation();\r\n\r\n drawerWrapper.width(limitedPosition);\r\n },\r\n\r\n _push: function(moveEventArgs) {\r\n var options = this.options;\r\n var minWidth = (options.mini && options.mini.width) || this.minWidth || 0;\r\n var drawerWrapper = this.drawerWrapper;\r\n var elementWidth = drawerWrapper.width();\r\n var limitedPosition;\r\n var updatedPosition;\r\n\r\n updatedPosition = elementWidth + (this.leftPositioned ? moveEventArgs.x.delta : -moveEventArgs.x.delta);\r\n\r\n limitedPosition = Math.min(Math.max(updatedPosition, minWidth), options.width);\r\n\r\n moveEventArgs.event.preventDefault();\r\n moveEventArgs.event.stopPropagation();\r\n\r\n drawerWrapper.width(limitedPosition);\r\n },\r\n\r\n _selectItem: function(item) {\r\n var selectedItemIndex;\r\n\r\n if (item) {\r\n item.addClass(\"k-selected\");\r\n this.trigger(\"itemClick\", { item: item, sender: this });\r\n this._selectedItemIndex = item.index();\r\n return;\r\n }\r\n\r\n selectedItemIndex = this._selectedItemIndex;\r\n\r\n if (selectedItemIndex) {\r\n this.drawerItemsWrapper.find(\"[data-role='drawer-item']\").eq(selectedItemIndex).addClass(\"k-selected\");\r\n }\r\n },\r\n\r\n _itemClick: function(e) {\r\n var that = this;\r\n var item;\r\n var items;\r\n\r\n if ($(e.event.target).find(\".k-drawer-item\").length > 0) {\r\n item = $(e.event.target).find(\".k-drawer-item\");\r\n }\r\n else if ($(e.event.target).closest(\".k-drawer-item\").length > 0) {\r\n item = $(e.event.target).closest(\".k-drawer-item\");\r\n }\r\n else if ($(e.event.target).hasClass(\".k-drawer-item\")) {\r\n item = $(e.event.target);\r\n }\r\n items = that.drawerItemsWrapper.find(\".k-drawer-item\").removeClass(\"k-selected\");\r\n that._selectItem(item);\r\n\r\n if (that.options.navigatable) {\r\n that._setCurrent(item);\r\n }\r\n },\r\n\r\n destroy: function() {\r\n var options = this.options;\r\n\r\n if (options.mode != PUSH) {\r\n if (this.leftPositioned) {\r\n $(document.body).css(\"padding-left\", 0);\r\n }\r\n else {\r\n $(document.body).css(\"padding-right\", 0);\r\n }\r\n }\r\n\r\n Widget.fn.destroy.call(this);\r\n\r\n this.userEvents.destroy();\r\n\r\n kendo.destroy(this.element);\r\n this.element = this.drawerWrapper = this.drawerElement = this.drawerContainer = this.drawerItemsWrapper = this._miniTemplate = null;\r\n },\r\n\r\n options: {\r\n name: \"Drawer\",\r\n autoCollapse: true,\r\n expanded: false,\r\n position: LEFT,\r\n mode: \"overlay\",\r\n swipeToOpen: true,\r\n width: 280,\r\n mini: false,\r\n navigatable: false,\r\n template: \"\"\r\n },\r\n\r\n events: [\r\n HIDE,\r\n SHOW,\r\n ITEMCLICK\r\n ]\r\n\r\n });\r\n kendo.ui.plugin(Drawer);\r\n })(window.kendo.jQuery);\r\n var kendo$1U = kendo;\r\n\r\n let __meta__$1T = {\r\n id: \"multiviewcalendar\",\r\n name: \"MultiViewCalendar\",\r\n category: \"web\",\r\n description: \"Multi-view calendar.\",\r\n depends: [ \"core\", \"selectable\", \"calendar\" ]\r\n };\r\n\r\n (function($, undefined$1) {\r\n let kendo = window.kendo,\r\n calendar = kendo.calendar,\r\n support = kendo.support,\r\n isInRange = calendar.isInRange,\r\n toDateObject = calendar.toDateObject,\r\n createDate = calendar.createDate,\r\n isEqualDate = calendar.isEqualDate,\r\n getToday = calendar.getToday,\r\n keys = kendo.keys,\r\n ui = kendo.ui,\r\n Widget = ui.Widget,\r\n Selectable = ui.Selectable,\r\n RangeSelectable = ui.RangeSelectable,\r\n template = kendo.template,\r\n mobileOS = support.mobileOS,\r\n ns = \".kendoMultiViewCalendar\",\r\n CLICK = \"click\",\r\n KEYDOWN = \"keydown\",\r\n ID = \"id\",\r\n MIN = \"min\",\r\n MONTH = \"month\",\r\n DOT = \".\",\r\n EMPTY = \" \",\r\n CENTURY = \"century\",\r\n DECADE = \"decade\",\r\n CHANGE = \"change\",\r\n NAVIGATE = \"navigate\",\r\n VALUE = \"value\",\r\n FOCUSED = \"k-focus\",\r\n SELECTED = \"k-selected\",\r\n HOVER = \"k-hover\",\r\n DISABLED = \"k-disabled\",\r\n TODAY = \"k-calendar-nav-today\",\r\n OTHERMONTH = \"k-other-month\",\r\n EMPTYCELL = \"k-empty\",\r\n CALENDAR_VIEW = \"k-calendar-view\",\r\n CELLSELECTOR = \"td:has(.k-link):not(.\" + EMPTYCELL + \"):not(.k-alt)\",\r\n CELLSELECTORVALID = \"td:has(.k-link):not(.\" + DISABLED + \"):not(.\" + EMPTYCELL + \"):not(.k-alt)\",\r\n BLUR = \"blur\",\r\n FOCUS = \"focus\",\r\n MOUSEENTER = support.touch ? \"touchstart\" : \"mouseenter\",\r\n MOUSELEAVE_NS = support.touch ? \"touchend\" + ns + \" touchmove\" + ns : \"mouseleave\" + ns,\r\n PREVARROW = \"_prevArrow\",\r\n NEXTARROW = \"_nextArrow\",\r\n RANGE = \"range\",\r\n SINGLE = \"single\",\r\n START = \"start\",\r\n END = \"end\",\r\n TABINDEX = \"tabindex\",\r\n TABLE = \"table\",\r\n TBODY = \"tbody\",\r\n THEAD = \"thead\",\r\n TR = \"tr\",\r\n TD = \"td\",\r\n TD_NOT_WEEK_CELL = TD + \":not(.k-alt)\",\r\n TH = \"th\",\r\n ROLE = \"role\",\r\n NONE = \"none\",\r\n ROWGROUP = \"rowgroup\",\r\n COLUMNHEADER = \"columnheader\",\r\n ROWHEADER = \"rowheader\",\r\n GRIDCELL = \"gridcell\",\r\n ARIA_SELECTED = \"aria-selected\",\r\n ARIA_DISABLED = \"aria-disabled\",\r\n ARIA_LABEL = \"aria-label\",\r\n ARIA_OWNS = \"aria-owns\",\r\n ARIA_ACTIVEDESCENDANT = \"aria-activedescendant\",\r\n INPUTSELECTOR = \"input,a,span,textarea,.k-multiselect-wrap,select,button,.k-button>span,.k-button>img,span.k-icon.k-i-caret-alt-down,span.k-icon.k-i-caret-alt-up,span.k-svg-icon.k-svg-i-caret-alt-down,span.k-svg-icon.k-svg-i-caret-alt-up\",\r\n DATE = Date,\r\n views = {\r\n month: 0,\r\n year: 1,\r\n decade: 2,\r\n century: 3\r\n };\r\n\r\n var MultiViewCalendar = Widget.extend({\r\n init: function(element, options) {\r\n var that = this;\r\n var id;\r\n var culture;\r\n\r\n Widget.fn.init.call(that, element, options);\r\n\r\n element = that.wrapper = that.element;\r\n options = that.options;\r\n\r\n that.options.disableDates = calendar.disabled(that.options.disableDates);\r\n\r\n culture = kendo.getCulture(options.culture);\r\n options.format = kendo._extractFormat(options.format || culture.calendars.standard.patterns.d);\r\n\r\n that._templates();\r\n\r\n that._header();\r\n\r\n that._wrapper();\r\n\r\n id = element\r\n .addClass(`k-calendar k-calendar-range ${kendo.getValidCssClass(\"k-calendar-\", \"size\", that.options.size || \"medium\")}` + (options.weekNumber ? \" k-week-number\" : \"\"))\r\n .on(KEYDOWN + ns, DOT + CALENDAR_VIEW, that._move.bind(that))\r\n .on(FOCUS + ns, DOT + CALENDAR_VIEW, that._focus.bind(that))\r\n .on(BLUR + ns, DOT + CALENDAR_VIEW, that._blur.bind(that))\r\n .on(CLICK + ns, CELLSELECTORVALID, function(e) {\r\n var link = e.currentTarget.firstChild;\r\n\r\n if ($(link).data(\"href\").indexOf(\"#\") != -1) {\r\n e.preventDefault();\r\n }\r\n\r\n that._click($(link));\r\n })\r\n .attr(ID);\r\n\r\n if (!id) {\r\n id = kendo.guid();\r\n }\r\n\r\n that._cellID = id + \"_cell_selected\";\r\n\r\n that._calendarWidth = that.element.width();\r\n\r\n that._range = options.range;\r\n\r\n if (that._range && that._range.start && !that._range.end) {\r\n that._range.target = END;\r\n }\r\n\r\n that._initViews({ viewName: options.start, value: options.value });\r\n that._selectable();\r\n\r\n that._footer(that.footer);\r\n that._selectDates = [];\r\n that.value(options.value);\r\n that._addSelectedCellsToArray();\r\n\r\n if (that._isMultipleSelection()) {\r\n that._selectDates = options.selectDates.length ? options.selectDates : that._selectDates;\r\n that._restoreSelection();\r\n }\r\n\r\n if (that._isRangeSelection()) {\r\n that.selectRange(that._range);\r\n }\r\n\r\n kendo.notify(that);\r\n },\r\n\r\n options: {\r\n name: \"MultiViewCalendar\",\r\n value: null,\r\n min: new DATE(1900, 0, 1),\r\n max: new DATE(2099, 11, 31),\r\n dates: [],\r\n allowReverse: false,\r\n disableDates: null,\r\n showOtherMonthDays: false,\r\n centuryCellsFormat: \"long\",\r\n culture: \"\",\r\n footer: \"\",\r\n format: \"\",\r\n month: {},\r\n range: { start: null, end: null, target: START },\r\n weekNumber: false,\r\n views: 2,\r\n showViewHeader: false,\r\n selectable: SINGLE,\r\n selectDates: [],\r\n start: MONTH,\r\n depth: MONTH,\r\n messages: {\r\n weekColumnHeader: \"\"\r\n },\r\n size: \"medium\",\r\n orientation: \"horizontal\"\r\n },\r\n\r\n events: [\r\n CHANGE,\r\n NAVIGATE\r\n ],\r\n\r\n setOptions: function(options) {\r\n var that = this;\r\n\r\n calendar.normalize(options);\r\n\r\n options.disableDates = calendar.disabled(options.disableDates);\r\n\r\n Widget.fn.setOptions.call(that, options);\r\n\r\n that._selectable();\r\n\r\n that._templates();\r\n\r\n that._footer(that.footer);\r\n\r\n for (var i = 0; i < that._views.length; i++) {\r\n that._views[i].off(ns).remove();\r\n }\r\n\r\n that._initViews({ viewName: options.start, value: options.value });\r\n\r\n that._range = options.range || { start: null, end: null };\r\n\r\n that._restoreSelection();\r\n\r\n if (that._isRangeSelection()) {\r\n that.selectRange(that._range);\r\n }\r\n },\r\n\r\n destroy: function() {\r\n var that = this;\r\n\r\n that._cell = null;\r\n that._currentView = null;\r\n that._current = null;\r\n\r\n if (that._views) {\r\n for (var i = 0; i < that._views.length; i++) {\r\n that._views[i].off(ns).remove();\r\n }\r\n }\r\n\r\n that.element.off(ns);\r\n\r\n if (that.header) {\r\n that.header.off(ns);\r\n that._title = null;\r\n that.header = null;\r\n }\r\n\r\n if (that.selectable) {\r\n that.selectable.destroy();\r\n that.selectable = null;\r\n }\r\n\r\n if (that.rangeSelectable) {\r\n that.rangeSelectable.destroy();\r\n that.rangeSelectable = null;\r\n }\r\n\r\n if (that._today) {\r\n kendo.destroy(that._today.off(ns));\r\n }\r\n\r\n that._views = null;\r\n\r\n Widget.fn.destroy.call(that);\r\n },\r\n\r\n current: function() {\r\n return this._current;\r\n },\r\n\r\n focus: function() {\r\n this.tablesWrapper.trigger(\"focus\");\r\n },\r\n\r\n min: function(value) {\r\n return this._option(MIN, value);\r\n },\r\n\r\n max: function(value) {\r\n return this._option(\"max\", value);\r\n },\r\n\r\n view: function() {\r\n return this._currentView;\r\n },\r\n\r\n navigateToPast: function() {\r\n this._navigate(PREVARROW, -1);\r\n },\r\n\r\n navigateToFuture: function() {\r\n this._navigate(NEXTARROW, 1);\r\n },\r\n\r\n navigateUp: function() {\r\n var that = this,\r\n index = that._index;\r\n\r\n if (that._title.hasClass(DISABLED)) {\r\n return;\r\n }\r\n\r\n that.navigate(that._current, ++index);\r\n },\r\n\r\n navigateDown: function(value) {\r\n var that = this,\r\n index = that._index,\r\n depth = that.options.depth;\r\n\r\n if (!value) {\r\n return;\r\n }\r\n\r\n if (index === views[depth]) {\r\n if (!isEqualDate(that._value, that._current) || !isEqualDate(that._value, value)) {\r\n that.value(value);\r\n that.trigger(CHANGE);\r\n }\r\n return;\r\n }\r\n\r\n that.navigate(value, --index);\r\n },\r\n\r\n navigate: function(value, view) {\r\n view = isNaN(view) ? calendar.views[calendar.viewsEnum[view]] : calendar.views[view];\r\n\r\n var that = this;\r\n var options = that.options;\r\n var min = options.min;\r\n var max = options.max;\r\n\r\n if (!value) {\r\n that._current = value = new DATE(+calendar.restrictValue(value, min, max));\r\n } else {\r\n that._current = value;\r\n }\r\n\r\n if (view === undefined$1) {\r\n view = that._currentView;\r\n }\r\n\r\n that._currentView = view;\r\n\r\n for (var i = 0; i < that._views.length; i++) {\r\n that._views[i].off(ns).remove();\r\n }\r\n\r\n that._initViews({ viewName: view.name, value: value });\r\n\r\n that._restoreSelection();\r\n },\r\n\r\n _aria: function() {\r\n var tables = this.tablesWrapper.find(TABLE),\r\n rowGroups = tables.first().find(THEAD).add(tables.find(TBODY)),\r\n viewName = this._currentView.name;\r\n\r\n tables.removeAttr(TABINDEX);\r\n\r\n tables.attr({\r\n role: NONE\r\n });\r\n\r\n rowGroups.attr({\r\n role: ROWGROUP\r\n });\r\n\r\n if (viewName === MONTH) {\r\n this._ariaMonth();\r\n }\r\n },\r\n\r\n _ariaMonth: function() {\r\n var tables = this.tablesWrapper.find(TABLE),\r\n rowGroups = tables.first().find(THEAD).add(tables.find(TBODY)),\r\n rows = rowGroups.find(TR),\r\n noHeaderRows = tables.not(\":eq(0)\").find(THEAD + EMPTY + TR),\r\n noHeaderCells = noHeaderRows.find(TH),\r\n columnHeaderCells = tables.first().find(THEAD + EMPTY + TH),\r\n rowHeaderCells = tables.find(TBODY + EMPTY + TD + \".k-alt\"),\r\n outOfRange = tables.find(DOT + EMPTYCELL),\r\n ariaDataCells = function(i, row) {\r\n var $row = $(row),\r\n numberOfEmpty = $row.find(DOT + EMPTYCELL).length,\r\n owned = [],\r\n prev, cells;\r\n\r\n if (i === 1) {\r\n $row.children()\r\n .filter(DOT + EMPTYCELL)\r\n .attr({\r\n \"aria-hidden\": \"false\",\r\n role: GRIDCELL\r\n });\r\n } else if (numberOfEmpty === 7) {\r\n $row.removeAttr(ROLE);\r\n $row.find(TH).removeAttr(ROLE);\r\n } else if (numberOfEmpty > 0 && numberOfEmpty < 7 && $row.children().not(TH).first().hasClass(EMPTYCELL)) {\r\n $row.find(TH).removeAttr(ROLE);\r\n prev = rows.eq(i - 1);\r\n\r\n if (!prev.attr(ROLE) || prev.attr(ROLE) === NONE) {\r\n prev = rows.eq(i - 2);\r\n }\r\n\r\n cells = $row.children().not(TH);\r\n\r\n cells.each(function(j, cell) {\r\n var $cell = $(cell),\r\n id;\r\n\r\n if (!$cell.hasClass(EMPTYCELL)) {\r\n id = \"owned_\" + i + \"_\" + j;\r\n $cell.attr(ID, id);\r\n owned.push(id);\r\n }\r\n });\r\n\r\n $row.removeAttr(ROLE);\r\n prev.attr(ARIA_OWNS, owned.join(\" \"));\r\n }\r\n };\r\n\r\n columnHeaderCells.attr({\r\n role: COLUMNHEADER\r\n });\r\n\r\n rowHeaderCells.attr({\r\n role: ROWHEADER\r\n });\r\n\r\n outOfRange.removeAttr(ROLE);\r\n noHeaderRows.removeAttr(ROLE);\r\n noHeaderCells.removeAttr(ARIA_LABEL).removeAttr(ROLE);\r\n\r\n rows.each(ariaDataCells);\r\n },\r\n\r\n _updateHeader: function() {\r\n let that = this,\r\n view = that._currentView,\r\n title = that._title,\r\n value = that._firstViewValue,\r\n options = that.options,\r\n visibleRange = that._visibleRange(),\r\n culture = options.culture,\r\n min = options.min,\r\n max = options.max,\r\n lastDate,\r\n disabled,\r\n prevDisabled,\r\n nextDisabled;\r\n\r\n if (view.name === DECADE || view.name === CENTURY) {\r\n lastDate = shiftDate(value, view.name, options.views - 1);\r\n if (!isInRange(lastDate, min, max)) {\r\n lastDate = max;\r\n }\r\n\r\n title.html('' + view.first(value).getFullYear() + \" - \" + view.last(lastDate).getFullYear() + \"\");\r\n } else {\r\n title.html('' + view.title(value, min, max, culture) + \" - \" + view.title(shiftDate(value, view.name, options.views - 1), min, max, culture) + \"\");\r\n }\r\n\r\n disabled = view.name === CENTURY;\r\n title.toggleClass(DISABLED, disabled).attr(ARIA_DISABLED, disabled);\r\n\r\n prevDisabled = view.compare(visibleRange.start, that.options.min) < 1;\r\n nextDisabled = view.compare(visibleRange.end, that.options.max) > -1;\r\n\r\n if (prevDisabled && nextDisabled) {\r\n if (that._navContainer) {\r\n that._navContainer.remove();\r\n that._navContainer = null;\r\n }\r\n } else {\r\n if (!that._navContainer) {\r\n that._navContainer = $(`` +\r\n `${kendo.ui.icon({ icon: \"chevron-left\", iconClass: \"k-button-icon\" })}` +\r\n `${kendo.ui.icon({ icon: \"chevron-right\", iconClass: \"k-button-icon\" })}` +\r\n '').appendTo(that.header);\r\n that[PREVARROW] = that._navContainer.find(\".k-calendar-nav-prev\");\r\n that[NEXTARROW] = that._navContainer.find(\".k-calendar-nav-next\");\r\n }\r\n\r\n that[PREVARROW].toggleClass(DISABLED, prevDisabled).attr(ARIA_DISABLED, prevDisabled);\r\n if (that[PREVARROW].hasClass(DISABLED)) {\r\n that[PREVARROW].removeClass(HOVER);\r\n }\r\n\r\n that[NEXTARROW].toggleClass(DISABLED, nextDisabled).attr(ARIA_DISABLED, nextDisabled);\r\n if (that[NEXTARROW].hasClass(DISABLED)) {\r\n that[NEXTARROW].removeClass(HOVER);\r\n }\r\n }\r\n },\r\n\r\n _move: function(e) {\r\n var that = this;\r\n var options = that.options;\r\n var key = e.keyCode;\r\n var index = that._index;\r\n var min = options.min;\r\n var max = options.max;\r\n var focusedCell = that.element.find(DOT + FOCUSED);\r\n var table = focusedCell.closest(TABLE);\r\n var currentValue = new DATE(+(that._current || toDateObject(focusedCell.find(\"span\"))));\r\n var isRtl = kendo.support.isRtl(that.wrapper);\r\n var navigate = false;\r\n var value, prevent, method, cell, lastActive, cellIndex, triggerChange;\r\n\r\n if (key == keys.RIGHT && !isRtl || key == keys.LEFT && isRtl) {\r\n value = 1;\r\n prevent = true;\r\n } else if (key == keys.LEFT && !isRtl || key == keys.RIGHT && isRtl) {\r\n value = -1;\r\n prevent = true;\r\n } else if (key == keys.UP) {\r\n value = index === 0 ? -7 : -4;\r\n prevent = true;\r\n } else if (key == keys.DOWN) {\r\n value = index === 0 ? 7 : 4;\r\n prevent = true;\r\n } else if (key == keys.SPACEBAR) {\r\n value = 0;\r\n prevent = true;\r\n } else if (key == keys.HOME) {\r\n prevent = true;\r\n cell = table.find(CELLSELECTORVALID).eq(0);\r\n if (cell.hasClass(FOCUSED)) {\r\n table = table.prev();\r\n if (table.length) {\r\n that._focusCell(table.find(CELLSELECTORVALID).eq(0));\r\n } else {\r\n navigate = that[PREVARROW] && !that[PREVARROW].hasClass(DISABLED);\r\n that._navigate(PREVARROW, -1);\r\n that._focusCell(that.element.find(TABLE).first().find(CELLSELECTORVALID).first());\r\n }\r\n } else {\r\n that._focusCell(cell);\r\n }\r\n } else if (key == keys.END) {\r\n prevent = true;\r\n cell = table.find(CELLSELECTORVALID).last();\r\n if (cell.hasClass(FOCUSED)) {\r\n table = table.next();\r\n if (table.length) {\r\n that._focusCell(table.find(CELLSELECTORVALID).last());\r\n } else {\r\n navigate = that[NEXTARROW] && !that[NEXTARROW].hasClass(DISABLED);\r\n that._navigate(NEXTARROW, 1);\r\n that._focusCell(that.element.find(TABLE).last().find(CELLSELECTORVALID).last());\r\n }\r\n } else {\r\n that._focusCell(cell);\r\n }\r\n } else if (key === 84) {\r\n that._todayClick(e);\r\n prevent = true;\r\n }\r\n\r\n if (e.ctrlKey || e.metaKey) {\r\n if (key == keys.RIGHT && !isRtl || key == keys.LEFT && isRtl) {\r\n navigate = that[NEXTARROW] && !that[NEXTARROW].hasClass(DISABLED);\r\n that._navigate(NEXTARROW, 1);\r\n prevent = true;\r\n } else if (key == keys.LEFT && !isRtl || key == keys.RIGHT && isRtl) {\r\n navigate = that[PREVARROW] && !that[PREVARROW].hasClass(DISABLED);\r\n that._navigate(PREVARROW, -1);\r\n prevent = true;\r\n } else if (key == keys.UP) {\r\n navigate = !that._title.hasClass(DISABLED);\r\n that.navigateUp();\r\n that._focusCell(that._cellByDate(that._current));\r\n prevent = true;\r\n } else if (key == keys.DOWN) {\r\n if (that._currentView.name === MONTH) {\r\n that.value(currentValue);\r\n } else {\r\n that.navigateDown(currentValue);\r\n that._focusCell(that._cellByDate(that._current));\r\n navigate = true;\r\n }\r\n prevent = true;\r\n } else if ((key == keys.ENTER || key == keys.SPACEBAR)) {\r\n if (that._isMultipleSelection()) {\r\n that._toggleSelection(e);\r\n }\r\n }\r\n } else if (e.shiftKey && !that._isSingleSelection()) {\r\n if (value !== undefined$1 || method) {\r\n if (!method) {\r\n that._currentView.setDate(currentValue, value);\r\n }\r\n\r\n if (that._currentView.name !== MONTH) {\r\n return;\r\n }\r\n\r\n if (options.disableDates(currentValue)) {\r\n currentValue = that._nextNavigatable(currentValue, value);\r\n }\r\n\r\n min = createDate(min.getFullYear(), min.getMonth(), min.getDate());\r\n\r\n if (isInRange(currentValue, min, max)) {\r\n if (!that._dateInViews(currentValue)) {\r\n if (value > 0) {\r\n navigate = that[NEXTARROW] && !that[NEXTARROW].hasClass(DISABLED);\r\n that._navigate(NEXTARROW, 1);\r\n } else {\r\n navigate = that[PREVARROW] && !that[PREVARROW].hasClass(DISABLED);\r\n that._navigate(PREVARROW, -1);\r\n }\r\n }\r\n cell = that._cellByDate(currentValue);\r\n that._current = currentValue;\r\n\r\n if (that.selectable) {\r\n that._selectRange(toDateObject((that.selectable._lastActive || focusedCell).find(\"span\")), currentValue);\r\n if (!that.selectable._lastActive) {\r\n that.selectable._lastActive = focusedCell;\r\n }\r\n that.trigger(CHANGE);\r\n that._focusCell(cell);\r\n }\r\n\r\n if (that.rangeSelectable) {\r\n lastActive = toDateObject((that.rangeSelectable._lastActive || focusedCell).find(\"span\"));\r\n if (!that._dateInViews(lastActive)) {\r\n if (+lastActive > +currentValue) {\r\n that.rangeSelectable._end = that.rangeSelectable._lastActive;\r\n that.rangeSelectable.selectFrom(cell);\r\n } else {\r\n that.rangeSelectable.selectTo(cell);\r\n }\r\n } else {\r\n if (that.rangeSelectable._end && that.rangeSelectable._end.is(DOT + FOCUSED)) {\r\n that.rangeSelectable._lastActive = that.rangeSelectable._start;\r\n } else {\r\n that.rangeSelectable._lastActive = that._cellByDate(lastActive);\r\n }\r\n that.rangeSelectable.range(that.rangeSelectable._lastActive, cell);\r\n }\r\n that.rangeSelectable.change();\r\n that._focusCell(cell);\r\n }\r\n }\r\n }\r\n } else {\r\n if (key == keys.ENTER || key == keys.SPACEBAR) {\r\n if (that._currentView.name === MONTH) {\r\n triggerChange = !focusedCell.hasClass(SELECTED) || that.element.find(DOT + SELECTED).length > 1;\r\n that.value(currentValue);\r\n if (that.selectable) {\r\n that.selectable._lastActive = that._cellByDate(currentValue);\r\n if (triggerChange) {\r\n that.selectable.trigger(CHANGE, { event: e });\r\n }\r\n }\r\n if (that.rangeSelectable) {\r\n that.rangeSelectable.change();\r\n }\r\n } else {\r\n that._click($(that._cell[0].firstChild));\r\n }\r\n prevent = true;\r\n } else if (key == keys.PAGEUP || key == keys.PAGEDOWN) {\r\n prevent = true;\r\n cellIndex = table.find(CELLSELECTORVALID).index(focusedCell);\r\n table = key == keys.PAGEUP ? table.prev() : table.next();\r\n if (!table.length) {\r\n if (key == keys.PAGEUP) {\r\n navigate = that[PREVARROW] && !that[PREVARROW].hasClass(DISABLED);\r\n that.navigateToPast();\r\n table = that.element.find(TABLE).first();\r\n } else {\r\n navigate = that[NEXTARROW] && !that[NEXTARROW].hasClass(DISABLED);\r\n that.navigateToFuture();\r\n table = that.element.find(TABLE).last();\r\n }\r\n }\r\n cell = table.find(CELLSELECTORVALID).eq(cellIndex);\r\n if (cell.length) {\r\n that._focusCell(cell);\r\n } else {\r\n that._focusCell(table.find(CELLSELECTORVALID).last());\r\n }\r\n }\r\n\r\n if (value || method) {\r\n if (!method) {\r\n that._currentView.setDate(currentValue, value);\r\n }\r\n\r\n min = createDate(min.getFullYear(), min.getMonth(), min.getDate());\r\n\r\n if (isInRange(currentValue, min, max)) {\r\n if (that.selectable && options.disableDates(currentValue)) {\r\n currentValue = that._nextNavigatable(currentValue, value);\r\n }\r\n if (!that._dateInViews(currentValue)) {\r\n if (value > 0) {\r\n navigate = that[NEXTARROW] && !that[NEXTARROW].hasClass(DISABLED);\r\n that._navigate(NEXTARROW, 1);\r\n } else {\r\n navigate = that[PREVARROW] && !that[PREVARROW].hasClass(DISABLED);\r\n that._navigate(NEXTARROW, -1);\r\n }\r\n }\r\n cell = that._cellByDate(currentValue);\r\n that._current = currentValue;\r\n that._focusCell(cell);\r\n }\r\n }\r\n }\r\n\r\n if (navigate) {\r\n that.trigger(NAVIGATE);\r\n }\r\n\r\n if (prevent) {\r\n e.preventDefault();\r\n }\r\n\r\n return that._current;\r\n\r\n },\r\n\r\n _visualizeSelectedDatesInView: function() {\r\n var that = this;\r\n var selectedDates = {};\r\n var cells;\r\n\r\n $.each(that._selectDates, function(index, value) {\r\n selectedDates[kendo.calendar.views[0].toDateString(value)] = value;\r\n });\r\n that.selectable.clear();\r\n cells = that.element.find(TABLE)\r\n .find(CELLSELECTOR)\r\n .filter(function(index, element) {\r\n return selectedDates[$(element.firstChild).attr(kendo.attr(VALUE))];\r\n });\r\n\r\n if (cells.length > 0) {\r\n that.selectable._selectElement(cells, true);\r\n }\r\n },\r\n\r\n _nextNavigatable: function(currentValue, value) {\r\n var that = this;\r\n var disabled = true;\r\n var view = that._currentView;\r\n var min = that.options.min;\r\n var max = that.options.max;\r\n var isDisabled = that.options.disableDates;\r\n var navigatableDate = new Date(currentValue.getTime());\r\n\r\n view.setDate(navigatableDate, -value);\r\n while (disabled) {\r\n view.setDate(currentValue, value);\r\n if (!isInRange(currentValue, min, max)) {\r\n currentValue = navigatableDate;\r\n break;\r\n }\r\n disabled = isDisabled(currentValue);\r\n }\r\n return currentValue;\r\n },\r\n\r\n _toggleSelection: function(event) {\r\n var that = this;\r\n\r\n that.selectable._lastActive = $(that._cell[0]);\r\n\r\n if ($(that._cell[0]).hasClass(SELECTED)) {\r\n that.selectable._unselect($(that._cell[0]));\r\n }\r\n else {\r\n that.selectable.value($(that._cell[0]));\r\n }\r\n that.selectable.trigger(CHANGE, { event: event });\r\n },\r\n\r\n _option: function(option, value) {\r\n var that = this;\r\n var options = that.options;\r\n var currentValue = that._value || that._current;\r\n var isBigger;\r\n\r\n if (value === undefined$1) {\r\n return options[option];\r\n }\r\n\r\n value = kendo.parseDate(value, options.format, options.culture);\r\n\r\n if (!value) {\r\n return;\r\n }\r\n\r\n options[option] = new DATE(+value);\r\n\r\n if (option === MIN) {\r\n isBigger = value > currentValue;\r\n } else {\r\n isBigger = currentValue > value;\r\n }\r\n\r\n if (isBigger) {\r\n that._value = null;\r\n }\r\n\r\n that.navigate(that._value);\r\n\r\n that._toggle();\r\n },\r\n\r\n _cellByDate: function(value) {\r\n if (value instanceof Date) {\r\n value = this._currentView.toDateString(value);\r\n }\r\n return this.element.find(TABLE).find(\"td:not(.\" + OTHERMONTH + \")\")\r\n .filter(function() {\r\n return $(this.firstChild).attr(kendo.attr(VALUE)) === value;\r\n });\r\n },\r\n\r\n _selectable: function() {\r\n let that = this,\r\n selectable = that.options.selectable,\r\n mode = Selectable.parseOptions(selectable);\r\n\r\n if (that.selectable) {\r\n that.selectable.destroy();\r\n that.selectable = null;\r\n }\r\n\r\n if (that.rangeSelectable) {\r\n that.rangeSelectable.destroy();\r\n that.rangeSelectable = null;\r\n }\r\n\r\n if (mode.range) {\r\n that.rangeSelectable = new RangeSelectable(that.wrapper, {\r\n widget: that,\r\n filter: \".k-calendar-monthview table \" + CELLSELECTORVALID,\r\n cellSelector: CELLSELECTOR,\r\n cellSelectorValid: CELLSELECTORVALID,\r\n change: that._rangeSelection.bind(that),\r\n reverse: that.options.allowReverse,\r\n resetOnStart: selectable.resetOnStart !== undefined$1 ? selectable.resetOnStart : true,\r\n ns: ns,\r\n inputSelectors: INPUTSELECTOR\r\n });\r\n } else {\r\n that.selectable = new Selectable(that.wrapper, {\r\n aria: true,\r\n dragToSelect: false,\r\n multiple: mode.multiple,\r\n filter: \"table.k-calendar-table \" + CELLSELECTORVALID,\r\n selectableClass: \"k-calendar\",\r\n change: that._selection.bind(that),\r\n relatedTarget: that._onRelatedTarget.bind(that),\r\n unselect: that._unselecting.bind(that)\r\n });\r\n }\r\n },\r\n\r\n _onRelatedTarget: function(target) {\r\n var that = this;\r\n\r\n if (that.selectable.options.multiple && target.is(CELLSELECTORVALID) && target.length > 1) {\r\n that._focusCell(target.first(), true);\r\n }\r\n },\r\n\r\n _getFirstViewDate: function(currentView) {\r\n var that = this;\r\n var options = that.options;\r\n var ranges = [];\r\n var start;\r\n var end;\r\n var current = new Date(+that._current);\r\n var i;\r\n\r\n for (i = 0; i < options.views; i++) {\r\n start = currentView.first(current);\r\n end = currentView.last(current);\r\n\r\n if (+end > +options.max) {\r\n if (+start <= +options.max) {\r\n ranges.push({ start: start, end: new Date(+options.max) });\r\n }\r\n break;\r\n }\r\n\r\n ranges.push({ start: start, end: end });\r\n\r\n current = new Date(+shiftDate(end, currentView.name, 1));\r\n }\r\n\r\n current = new Date(+that._current);\r\n\r\n for (i = 0; i < options.views; i++) {\r\n start = currentView.first(current);\r\n end = currentView.last(current);\r\n\r\n if (+start < +options.min) {\r\n if (+end >= +options.min) {\r\n ranges.push({ start: new Date(+options.min), end: end });\r\n }\r\n break;\r\n }\r\n\r\n ranges.push({ start: start, end: end });\r\n\r\n current = new Date(+shiftDate(start, currentView.name, -1));\r\n }\r\n\r\n start = ranges[0].start;\r\n\r\n for (i = 0; i < options.views + 1; i++) {\r\n if (!ranges[i]) {\r\n break;\r\n }\r\n\r\n if (+start > +ranges[i].start) {\r\n start = ranges[i].start;\r\n }\r\n }\r\n\r\n return new Date(+start);\r\n },\r\n\r\n _canRenderNextView: function(viewDate) {\r\n var fullYear = viewDate.getFullYear();\r\n var month = viewDate.getMonth();\r\n var date = viewDate.getDate();\r\n var max = this.options.max;\r\n var maxYear = max.getFullYear();\r\n var maxMonth = max.getMonth();\r\n\r\n\r\n if (fullYear < maxYear) {\r\n return true;\r\n }\r\n\r\n if (fullYear === maxYear && month < maxMonth) {\r\n return true;\r\n }\r\n\r\n if (fullYear === maxYear && month === maxMonth && date < max.getDate()) {\r\n return true;\r\n }\r\n\r\n if (fullYear === maxYear && month === maxMonth && date === max.getDate()) {\r\n return true;\r\n }\r\n\r\n return false;\r\n },\r\n\r\n _initViews: function(viewOptions) {\r\n var that = this;\r\n var options = that.options;\r\n var index = calendar.viewsEnum[viewOptions.viewName];\r\n var currentView = calendar.views[index];\r\n var viewDate;\r\n\r\n that._current = new DATE(+calendar.restrictValue(viewOptions.value, options.min, options.max));\r\n that._views = [];\r\n that._index = index;\r\n viewDate = that._getFirstViewDate(currentView);\r\n viewDate.setDate(1);\r\n\r\n that._firstViewValue = new Date(+viewDate);\r\n\r\n for (var i = 0; i < options.views; i++) {\r\n viewDate = i ? shiftDate(viewDate, currentView.name, 1) : viewDate;\r\n viewDate.setDate(1);\r\n\r\n if (!that._canRenderNextView(viewDate)) {\r\n break;\r\n }\r\n\r\n that._table = $(currentView.content($.extend({\r\n min: options.min,\r\n max: options.max,\r\n date: viewDate,\r\n url: options.url,\r\n dates: options.dates,\r\n format: options.format,\r\n culture: options.culture,\r\n disableDates: options.disableDates,\r\n showHeader: options.showViewHeader,\r\n isWeekColumnVisible: options.weekNumber,\r\n showOtherMonthDays: options.showOtherMonthDays,\r\n centuryCellsFormat: options.centuryCellsFormat,\r\n messages: options.messages,\r\n contentClasses: \"k-calendar-table\"\r\n }, that[currentView.name])));\r\n\r\n that._table.appendTo(that.tablesWrapper);\r\n that._views.push(that._table);\r\n }\r\n\r\n that._currentView = currentView;\r\n\r\n that.tablesWrapper.attr(\"class\", \"k-calendar-view k-calendar-\" + currentView.name + `view ${that.options.orientation != \"vertical\" ? \"k-hstack\" : \"k-vstack\"} k-align-items-start k-justify-content-center`);\r\n\r\n that._updateHeader();\r\n\r\n that._aria();\r\n },\r\n\r\n _rangeSelection: function(e) {\r\n let that = this,\r\n range = e.sender.range(),\r\n useEnd = e.sender._useEnd,\r\n useStart = e.sender._useStart,\r\n initialRange = that.selectRange() || {},\r\n start,\r\n end,\r\n target = initialRange.target;\r\n\r\n if (range.start && range.start.length) {\r\n start = toDateObject(range.start.find(\"span\"));\r\n }\r\n\r\n if (range.end && range.end.length) {\r\n end = toDateObject(range.end.find(\"span\"));\r\n }\r\n\r\n if (target === END) {\r\n target = START;\r\n } else {\r\n target = END;\r\n }\r\n\r\n that._range = { start: useStart ? initialRange.start : start, end: useEnd ? initialRange.end : end, target: target };\r\n\r\n if (!that._preventChange) {\r\n that.trigger(CHANGE);\r\n }\r\n },\r\n\r\n _selection: function(e) {\r\n let that = this,\r\n selectElements = e.sender.value(),\r\n domEvent = e.event,\r\n currentTarget = $(domEvent && domEvent.currentTarget),\r\n isCell = currentTarget.is(TD_NOT_WEEK_CELL),\r\n currentValue;\r\n\r\n if (that._isSingleSelection()) {\r\n that._validateValue(selectElements[0] ? toDateObject(selectElements.first().find(\"span\")) : e.sender._lastActive ? toDateObject(e.sender._lastActive.find(\"span\")) : that.value());\r\n }\r\n\r\n if (that._isMultipleSelection()) {\r\n\r\n if (isCell) {\r\n currentValue = toDateObject(currentTarget.find(\"span\"));\r\n }\r\n\r\n if (domEvent && domEvent.ctrlKey) {\r\n if (isCell) {\r\n if (currentTarget.hasClass(SELECTED)) {\r\n that._selectDates.push(currentValue);\r\n } else {\r\n that._deselect(currentValue);\r\n }\r\n } else {\r\n that.element.find(\"table \" + CELLSELECTORVALID).each(function(index, element) {\r\n var value = toDateObject($(element).find(\"span\"));\r\n that._deselect(value);\r\n });\r\n that._addSelectedCellsToArray();\r\n }\r\n } else if (domEvent && domEvent.shiftKey) {\r\n that._selectRange(toDateObject(e.sender._lastActive ? e.sender._lastActive.find(\"span\") : selectElements.first().find(\"span\")), currentValue);\r\n } else if (isCell) {\r\n that._selectDates = [];\r\n that._selectDates.push(currentValue);\r\n } else {\r\n that._selectDates = [];\r\n that._addSelectedCellsToArray();\r\n }\r\n }\r\n\r\n if (!that._preventChange) {\r\n that.trigger(CHANGE);\r\n }\r\n },\r\n\r\n _addSelectedCellsToArray: function() {\r\n var that = this;\r\n if (!that.selectable) {\r\n return;\r\n }\r\n that.selectable.value().each(function(index, item) {\r\n var date = toDateObject($(item.firstChild));\r\n if (!that.options.disableDates(date)) {\r\n that._selectDates.push(date);\r\n }\r\n });\r\n },\r\n\r\n _deselect: function(date) {\r\n var that = this;\r\n var currentDateIndex = that._selectDates.map(Number).indexOf(+date);\r\n if (currentDateIndex != -1) {\r\n that._selectDates.splice(currentDateIndex, 1);\r\n }\r\n },\r\n\r\n _unselecting: function(e) {\r\n var that = this;\r\n var element = e.element;\r\n\r\n if (that._isSingleSelection() && !mobileOS && element.hasClass(FOCUSED)) {\r\n e.preventDefault();\r\n }\r\n },\r\n\r\n _visibleRange: function() {\r\n var tables = this.element.find(DOT + CALENDAR_VIEW + EMPTY + TABLE);\r\n var firstDateInView = toDateObject(tables.first().find(CELLSELECTOR).first().find(\"span\"));\r\n var lastDateInView = toDateObject(tables.last().find(CELLSELECTOR).last().find(\"span\"));\r\n return { start: firstDateInView, end: lastDateInView };\r\n },\r\n\r\n _dateInViews: function(date) {\r\n var that = this;\r\n var tables = that.element.find(DOT + CALENDAR_VIEW + EMPTY + TABLE);\r\n var firstDateInView = toDateObject(tables.first().find(CELLSELECTOR).first().find(\"span\"));\r\n var lastDateInView = toDateObject(tables.last().find(CELLSELECTOR).last().find(\"span\"));\r\n\r\n if (!date) {\r\n return;\r\n }\r\n\r\n date = new Date(date.toDateString());\r\n\r\n return +date <= +lastDateInView && +date >= +firstDateInView;\r\n },\r\n\r\n _fillRange: function(start, end) {\r\n var that = this;\r\n var daysDifference;\r\n\r\n that._selectDates = [];\r\n daysDifference = daysBetweenTwoDates(start, end);\r\n addDaysToArray(that._selectDates, daysDifference, start, that.options.disableDates);\r\n },\r\n\r\n _selectRange: function(start, end) {\r\n var that = this;\r\n var current;\r\n\r\n if (+end < +start) {\r\n current = end;\r\n end = start;\r\n start = current;\r\n }\r\n\r\n that._fillRange(start, end);\r\n that._visualizeSelectedDatesInView();\r\n },\r\n\r\n _header: function() {\r\n var that = this;\r\n var element = that.element;\r\n var buttons;\r\n var header = element.find(\".k-calendar-header\");\r\n\r\n if (!header.length) {\r\n header = $(`
    ` +\r\n `` +\r\n '' +\r\n `` +\r\n `${kendo.ui.icon({ icon: \"chevron-left\", iconClass: \"k-button-icon\" })}` +\r\n `${kendo.ui.icon({ icon: \"chevron-right\", iconClass: \"k-button-icon\" })}` +\r\n '' +\r\n '
    ').prependTo(element);\r\n }\r\n\r\n that.header = header;\r\n\r\n header.on(MOUSEENTER + ns + \" \" + MOUSELEAVE_NS + \" \" + FOCUS + ns + \" \" + BLUR + ns, \".k-button\", mousetoggle)\r\n .on(CLICK, function() { return false; })\r\n .on(CLICK + ns, \".k-button.k-calendar-title\", that._calendarTitleClick.bind(that))\r\n .on(CLICK + ns, \".k-button.k-calendar-nav-prev\", that._prevViewClick.bind(that))\r\n .on(CLICK + ns, \".k-button.k-calendar-nav-next\", that._nextViewClick.bind(that));\r\n\r\n buttons = header.find(\".k-button\");\r\n\r\n that._title = buttons.filter(\".k-calendar-title\");\r\n that._navContainer = header.find(\".k-calendar-nav\");\r\n that[PREVARROW] = buttons.filter(\".k-calendar-nav-prev\");\r\n that[NEXTARROW] = buttons.filter(\".k-calendar-nav-next\");\r\n },\r\n\r\n _calendarTitleClick: function() {\r\n this.navigateUp();\r\n this.focus();\r\n this.trigger(NAVIGATE);\r\n },\r\n\r\n _prevViewClick: function(e) {\r\n e.preventDefault();\r\n this.navigateToPast();\r\n this.focus();\r\n this.trigger(NAVIGATE);\r\n },\r\n\r\n _nextViewClick: function(e) {\r\n e.preventDefault();\r\n this.navigateToFuture();\r\n this.focus();\r\n this.trigger(NAVIGATE);\r\n },\r\n\r\n _wrapper: function() {\r\n this.tablesWrapper = $('
    ').insertAfter(this.element[0].firstChild);\r\n },\r\n\r\n _templates: function() {\r\n var that = this;\r\n var options = that.options;\r\n var month = options.month;\r\n var content = month.content;\r\n var weekNumber = month.weekNumber;\r\n var empty = month.empty;\r\n\r\n that.month = {\r\n content: template((data) => `${content ? kendo.template(content, { useWithBlock: !!content })(data) : data.value}`, { useWithBlock: !!content }),\r\n empty: template((data) => `' : ' class=\"k-calendar-td k-empty\">'}${(empty ? kendo.template(empty, { useWithBlock: !!empty })(data) : \"\")}`, { useWithBlock: !!empty }),\r\n weekNumber: template((data) => `${weekNumber ? kendo.template(weekNumber, { useWithBlock: !!weekNumber })(data) : data.weekNumber}`, { useWithBlock: !!weekNumber })\r\n };\r\n },\r\n\r\n _footer: function() {\r\n var that = this;\r\n var options = that.options;\r\n var template = options.footer !== false ? kendo.template(that.options.footer || ((data) => kendo.toString(data,\"D\", options.culture)), { useWithBlock: false }) : null;\r\n var today = getToday();\r\n var element = that.element;\r\n var footer = element.find(\".k-calendar-footer\");\r\n\r\n if (!template) {\r\n that._toggle(false);\r\n footer.hide();\r\n return;\r\n }\r\n\r\n if (!footer[0]) {\r\n footer = $(`
    \r\n \r\n
    `).appendTo(element);\r\n }\r\n\r\n that._today = footer.show()\r\n .find(\".k-button-flat-primary\")\r\n .attr(\"title\", kendo.toString(today, \"D\", that.options.culture));\r\n\r\n footer.find(\".k-button-text\")\r\n .html(template(today));\r\n\r\n that._toggle();\r\n },\r\n\r\n _navigate: function(arrow, modifier) {\r\n var that = this;\r\n var index = that._index + 1;\r\n var currentValue = new DATE(+that._current);\r\n var originaValue = new DATE(+that._current);\r\n var offset;\r\n\r\n arrow = that[arrow];\r\n\r\n offset = that._cellByDate(currentValue).closest(TABLE).index();\r\n\r\n if (modifier > 0) {\r\n offset = 1 - offset;\r\n } else {\r\n offset = offset + 1;\r\n }\r\n\r\n if (!arrow || !arrow.hasClass(DISABLED)) {\r\n if (index > 3) {\r\n currentValue.setFullYear(currentValue.getFullYear() + 100 * (modifier * offset));\r\n } else {\r\n calendar.views[index].setDate(currentValue, (modifier * offset));\r\n }\r\n\r\n that.navigate(currentValue);\r\n\r\n if (that._dateInViews(originaValue)) {\r\n that._focusCell(that._cellByDate(originaValue));\r\n that._current = originaValue;\r\n } else {\r\n if (index > 3) {\r\n originaValue.setFullYear(originaValue.getFullYear() + 100 * modifier);\r\n } else {\r\n calendar.views[index].setDate(originaValue, modifier);\r\n }\r\n that._focusCell(that._cellByDate(originaValue));\r\n that._current = originaValue;\r\n }\r\n }\r\n },\r\n\r\n _toggle: function(toggle) {\r\n var that = this;\r\n var options = that.options;\r\n var isTodayDisabled = options.selectable !== RANGE && that.options.disableDates(getToday());\r\n var link = that._today;\r\n\r\n if (toggle === undefined$1) {\r\n toggle = isInRange(getToday(), options.min, options.max);\r\n }\r\n\r\n if (link) {\r\n link.off(CLICK + ns);\r\n\r\n if (toggle && !isTodayDisabled) {\r\n link.addClass(TODAY)\r\n .removeClass(DISABLED)\r\n .on(CLICK + ns, function(e) { that._todayClick(e); that.focus(); });\r\n } else {\r\n link.removeClass(TODAY)\r\n .addClass(DISABLED)\r\n .on(CLICK + ns, function prevent(e) {\r\n e.preventDefault();\r\n });\r\n }\r\n }\r\n },\r\n\r\n _click: function(link) {\r\n var that = this;\r\n var options = that.options;\r\n var currentValue = new Date(+that._current);\r\n var value = toDateObject(link);\r\n\r\n kendo.date.adjustDST(value, 0);\r\n\r\n that._currentView.setDate(currentValue, value);\r\n that._current = value;\r\n\r\n if (that._currentView.name !== options.depth) {\r\n that.navigateDown(calendar.restrictValue(currentValue, options.min, options.max));\r\n that._focusCell(that._cellByDate(that._current));\r\n that.trigger(NAVIGATE);\r\n } else {\r\n that._focusCell(link.closest(TD_NOT_WEEK_CELL));\r\n }\r\n\r\n that.focus();\r\n },\r\n\r\n _blur: function() {\r\n var that = this;\r\n\r\n if (that._cell) {\r\n that._cell.removeClass(FOCUSED);\r\n }\r\n },\r\n\r\n _focus: function() {\r\n var cell = this._cell;\r\n\r\n if (!cell || !$.contains(this.tablesWrapper[0], cell[0])) {\r\n if (this._current && this._dateInViews(this._current)) {\r\n cell = this._cellByDate(this._current);\r\n } else {\r\n cell = this.tablesWrapper.find(CELLSELECTORVALID).first();\r\n }\r\n }\r\n\r\n this._focusCell(cell);\r\n },\r\n\r\n _focusCell: function(cell) {\r\n var that = this;\r\n var cellId = that._cellID;\r\n\r\n if (that._cell && that._cell.length) {\r\n that._cell[0].removeAttribute(ARIA_LABEL);\r\n that._cell.removeClass(FOCUSED);\r\n that.tablesWrapper.removeAttr(ARIA_ACTIVEDESCENDANT);\r\n\r\n if (that._cell.attr(ID) === cellId) {\r\n that._cell[0].removeAttribute(ID);\r\n }\r\n }\r\n\r\n that._cell = cell;\r\n\r\n if (cell.attr(ID)) {\r\n that.tablesWrapper.attr(ARIA_ACTIVEDESCENDANT, cell.attr(ID));\r\n } else if (cellId) {\r\n cell.attr(ID, cellId);\r\n that.tablesWrapper.attr(ARIA_ACTIVEDESCENDANT, cellId);\r\n }\r\n\r\n cell.addClass(FOCUSED);\r\n\r\n if (cell.length && that._currentView.name == MONTH) {\r\n that._current = toDateObject(cell.find(\"span\"));\r\n }\r\n },\r\n\r\n _todayClick: function(e) {\r\n var that = this;\r\n var disabled = that.options.disableDates;\r\n var today = getToday();\r\n var navigate = false;\r\n\r\n e.preventDefault();\r\n\r\n if (disabled(today)) {\r\n return;\r\n }\r\n\r\n that._value = today;\r\n\r\n if (that._isMultipleSelection()) {\r\n that._selectDates = [today];\r\n }\r\n\r\n if (that._isRangeSelection()) {\r\n that.rangeSelectable.clear(true);\r\n that._range = { start: today, end: null };\r\n }\r\n\r\n if (that._currentView.name != MONTH || !that._dateInViews(today)) {\r\n navigate = true;\r\n }\r\n\r\n that.navigate(today, that.options.depth);\r\n\r\n if (that._isSingleSelection()) {\r\n that.selectable._lastActive = null;\r\n }\r\n\r\n if (navigate) {\r\n that.trigger(NAVIGATE);\r\n }\r\n\r\n that.trigger(CHANGE);\r\n },\r\n\r\n _validateValue: function(value) {\r\n var that = this;\r\n var options = that.options;\r\n var min = options.min;\r\n var max = options.max;\r\n\r\n value = kendo.parseDate(value, options.format, options.culture);\r\n\r\n if (value !== null) {\r\n value = new DATE(+value);\r\n\r\n if (!isInRange(value, min, max)) {\r\n value = null;\r\n }\r\n }\r\n\r\n if (value === null || !that.options.disableDates(new Date(+value))) {\r\n that._value = value;\r\n } else if (that._value === undefined$1) {\r\n that._value = null;\r\n }\r\n\r\n return that._value;\r\n },\r\n\r\n _updateAria: function(ariaTemplate, date) {\r\n var that = this;\r\n var cell = that._cellByDate(date || that.current());\r\n var valueType = that.view().valueType();\r\n var current = date || that.current();\r\n var text;\r\n\r\n that._focusCell(cell);\r\n\r\n if (valueType === MONTH) {\r\n text = kendo.toString(current, \"MMMM\");\r\n } else if (valueType === \"date\") {\r\n text = kendo.toString(current, \"D\");\r\n } else {\r\n text = cell.text();\r\n }\r\n\r\n cell.attr(ARIA_LABEL, ariaTemplate({ current: current, valueType: valueType, text: text }));\r\n return cell.attr(ID);\r\n },\r\n\r\n clearSelection: function() {\r\n var that = this;\r\n\r\n if (that.selectable) {\r\n that.element.find(DOT + SELECTED).removeClass(SELECTED).removeAttr(ARIA_SELECTED);\r\n }\r\n\r\n if (that.rangeSelectable) {\r\n that.rangeSelectable.clear(true);\r\n }\r\n },\r\n\r\n _restoreSelection: function() {\r\n var that = this;\r\n var range;\r\n\r\n if (that._currentView.name !== that.options.depth) {\r\n return;\r\n }\r\n\r\n that._preventChange = true;\r\n\r\n if (that._isRangeSelection()) {\r\n range = that.selectRange();\r\n\r\n if (!range || !range.start) {\r\n that._preventChange = false;\r\n return;\r\n }\r\n\r\n that.selectRange(range);\r\n }\r\n\r\n if (that._isSingleSelection() && that.value()) {\r\n that.selectable.value(that._cellByDate(that.value()));\r\n }\r\n\r\n if (that._isMultipleSelection()) {\r\n that._visualizeSelectedDatesInView();\r\n }\r\n\r\n that._preventChange = false;\r\n },\r\n\r\n _isMultipleSelection: function() {\r\n let selectable = this.options.selectable,\r\n selectableOptions = Selectable.parseOptions(selectable);\r\n return selectableOptions.multiple;\r\n },\r\n\r\n _isRangeSelection: function() {\r\n let selectable = this.options.selectable,\r\n selectableOptions = Selectable.parseOptions(selectable);\r\n return selectableOptions.range;\r\n },\r\n\r\n _isSingleSelection: function() {\r\n let selectable = this.options.selectable,\r\n selectableOptions = Selectable.parseOptions(selectable);\r\n return selectableOptions.single;\r\n },\r\n\r\n value: function(value) {\r\n var that = this;\r\n var cell;\r\n\r\n if (value === undefined$1) {\r\n return that._value;\r\n }\r\n\r\n value = that._validateValue(value);\r\n\r\n that.clearSelection();\r\n\r\n if (value && !that._dateInViews(value)) {\r\n that.navigate(value);\r\n }\r\n\r\n if (value !== null && that._currentView.name === MONTH) {\r\n cell = that._cellByDate(value);\r\n\r\n if (that.selectable) {\r\n that.selectable.value(cell);\r\n }\r\n\r\n if (that.rangeSelectable) {\r\n that.rangeSelectable.start(cell);\r\n that.rangeSelectable._lastActive = cell;\r\n }\r\n }\r\n },\r\n\r\n selectDates: function(dates) {\r\n var that = this;\r\n var validSelectedDates;\r\n var datesUnique;\r\n\r\n if (dates === undefined$1) {\r\n return that._selectDates;\r\n }\r\n\r\n datesUnique = dates\r\n .map(function(date) { return date.getTime(); })\r\n .filter(function(date, position, array) {\r\n return array.indexOf(date) === position;\r\n })\r\n .map(function(time) { return new Date(time); });\r\n\r\n validSelectedDates = $.grep(datesUnique, function(value) {\r\n if (value) {\r\n return +that._validateValue(new Date(value.setHours(0, 0, 0, 0))) === +value;\r\n }\r\n });\r\n that._selectDates = validSelectedDates.length > 0 ? validSelectedDates : (datesUnique.length === 0 ? datesUnique : that._selectDates);\r\n that._visualizeSelectedDatesInView();\r\n },\r\n\r\n selectRange: function(range) {\r\n let that = this,\r\n startInRange,\r\n endInRange,\r\n visibleRange;\r\n\r\n if (range === undefined$1) {\r\n return that._range;\r\n }\r\n\r\n that._range = range;\r\n\r\n visibleRange = that._visibleRange();\r\n\r\n startInRange = that._dateInViews(range.start);\r\n endInRange = range.end && that._dateInViews(range.end);\r\n\r\n if (!startInRange) {\r\n if (endInRange) {\r\n if (range.start) {\r\n that.rangeSelectable.selectTo(that._cellByDate(range.end));\r\n } else {\r\n that.rangeSelectable.clear(true);\r\n that.rangeSelectable.end(that._cellByDate(range.end));\r\n }\r\n } else if (range.start) {\r\n that.rangeSelectable.start(that._cellByDate(range.start));\r\n }\r\n }\r\n\r\n if (startInRange && endInRange) {\r\n that.rangeSelectable.range(that._cellByDate(range.start), that._cellByDate(range.end), false, that.options.allowReverse);\r\n }\r\n\r\n if (range.end && startInRange && !endInRange) {\r\n that.rangeSelectable.selectFrom(that._cellByDate(range.start));\r\n }\r\n\r\n if (!range.end && startInRange) {\r\n that.rangeSelectable.clear(true);\r\n that.rangeSelectable.start(that._cellByDate(range.start));\r\n }\r\n\r\n if (+visibleRange.start > +range.start && +visibleRange.end < +range.end) {\r\n that.rangeSelectable.mid(that.element.find(CELLSELECTORVALID));\r\n }\r\n }\r\n });\r\n\r\n kendo.ui.plugin(MultiViewCalendar);\r\n\r\n function mousetoggle(e) {\r\n var disabled = $(this).hasClass(\"k-disabled\");\r\n\r\n if (!disabled) {\r\n $(this).toggleClass(HOVER, MOUSEENTER.indexOf(e.type) > -1 || e.type == FOCUS);\r\n }\r\n }\r\n\r\n function addDaysToArray(array, numberOfDays, fromDate, disableDates) {\r\n for (var i = 0; i <= numberOfDays; i++) {\r\n var nextDay = new Date(fromDate.getTime());\r\n nextDay = new Date(nextDay.setDate(nextDay.getDate() + i));\r\n if (!disableDates(nextDay)) {\r\n array.push(nextDay);\r\n }\r\n }\r\n }\r\n\r\n function daysBetweenTwoDates(startDate, endDate) {\r\n if (+endDate < +startDate) {\r\n var temp = +startDate;\r\n calendar.views[0].setDate(startDate, endDate);\r\n calendar.views[0].setDate(endDate, new Date(temp));\r\n }\r\n var fromDateUTC = Date.UTC(startDate.getFullYear(), startDate.getMonth(), startDate.getDate());\r\n var endDateUTC = Date.UTC(endDate.getFullYear(), endDate.getMonth(), endDate.getDate());\r\n\r\n return Math.ceil((+endDateUTC - +fromDateUTC) / kendo.date.MS_PER_DAY);\r\n }\r\n\r\n function shiftDate(value, dimension, numberOfViews) {\r\n var current;\r\n if (dimension === MONTH) {\r\n current = new DATE(value.getFullYear(), value.getMonth() + numberOfViews, value.getDate());\r\n current.setFullYear(value.getFullYear());\r\n if (Math.abs(current.getMonth() - value.getMonth()) > numberOfViews || numberOfViews > 10) {\r\n current.setMonth(value.getMonth() + numberOfViews);\r\n current = calendar.views[0].last(current);\r\n }\r\n return current;\r\n } else if (dimension === \"year\") {\r\n current = new DATE(1, value.getMonth(), value.getDate());\r\n current.setFullYear(value.getFullYear() + numberOfViews);\r\n if (Math.abs(current.getFullYear() - value.getFullYear()) > numberOfViews) {\r\n current = new DATE(1, value.getMonth(), 1);\r\n current.setFullYear(value.getFullYear() + numberOfViews);\r\n current = calendar.views[1].last(current);\r\n }\r\n return current;\r\n } else if (dimension === \"decade\") {\r\n current = new DATE(1, value.getMonth(), value.getDate());\r\n current.setFullYear(value.getFullYear() + 10 * numberOfViews);\r\n if (Math.abs(current.getFullYear() - value.getFullYear()) > 10 * numberOfViews) {\r\n current = new DATE(1, value.getMonth(), 1);\r\n current.setFullYear(value.getFullYear() + 10 * numberOfViews);\r\n current = calendar.views[2].last(current);\r\n }\r\n return current;\r\n } else if (dimension === \"century\") {\r\n current = new DATE(1, value.getMonth(), value.getDate());\r\n current.setFullYear(value.getFullYear() + 100 * numberOfViews);\r\n if (Math.abs(current.getFullYear() - value.getFullYear()) > 100 * numberOfViews) {\r\n current = new DATE(1, value.getMonth(), 1);\r\n current.setFullYear(value.getFullYear() + 100 * numberOfViews);\r\n current = calendar.views[3].last(current);\r\n }\r\n return current;\r\n }\r\n }\r\n\r\n })(window.kendo.jQuery);\r\n var kendo$1T = kendo;\r\n\r\n let $$5 = kendo.jQuery;\r\n\r\n function valueMapperOptions(options, value, callback) {\r\n return {\r\n value: (options.selectable === \"multiple\" || options.checkboxes) ? value : value[0],\r\n success: function(response) {\r\n callback(response);\r\n }\r\n };\r\n }\r\n\r\n var __meta__$1S = {\r\n id: \"virtuallist\",\r\n name: \"VirtualList\",\r\n category: \"framework\",\r\n depends: [ \"data\" ],\r\n hidden: true\r\n };\r\n\r\n (function($, undefined$1) {\r\n var kendo = window.kendo,\r\n ui = kendo.ui,\r\n encode = kendo.htmlEncode,\r\n Widget = ui.Widget,\r\n DataBoundWidget = ui.DataBoundWidget,\r\n percentageUnitsRegex = /^\\d+(\\.\\d+)?%$/i,\r\n LIST_CONTENT = \"k-list-content k-virtual-content\",\r\n TABLE_CONTENT = \"k-table-body k-table-scroller\",\r\n HEADER = \"k-list-group-sticky-header\",\r\n LIST_ITEM = \"k-list-item\",\r\n TABLE_ITEM = \"k-table-row\",\r\n HEIGHTCONTAINER = \"k-height-container\",\r\n GROUPITEM = \"k-list-item-group-label\",\r\n LIST_UL = \"k-list-ul\",\r\n TABLE_LIST = \"k-table-list\",\r\n\r\n SELECTED = \"k-selected\",\r\n FOCUSED = \"k-focus\",\r\n HOVER = \"k-hover\",\r\n CHANGE = \"change\",\r\n CLICK = \"click\",\r\n LISTBOUND = \"listBound\",\r\n ITEMCHANGE = \"itemChange\",\r\n\r\n ACTIVATE = \"activate\",\r\n DEACTIVATE = \"deactivate\",\r\n\r\n GROUP_ROW_SEL = \".k-table-group-row\",\r\n\r\n VIRTUAL_LIST_NS = \".VirtualList\";\r\n\r\n function lastFrom(array) {\r\n return array[array.length - 1];\r\n }\r\n\r\n function toArray(value) {\r\n return value instanceof Array ? value : [value];\r\n }\r\n\r\n function isPrimitive(dataItem) {\r\n return typeof dataItem === \"string\" || typeof dataItem === \"number\" || typeof dataItem === \"boolean\";\r\n }\r\n\r\n function getItemCount(screenHeight, listScreens, itemHeight) {\r\n return Math.ceil(screenHeight * listScreens / itemHeight);\r\n }\r\n\r\n function appendChild(parent, className, tagName) {\r\n var element = document.createElement(tagName || \"div\");\r\n if (className) {\r\n element.className = className;\r\n }\r\n parent.appendChild(element);\r\n\r\n return element;\r\n }\r\n\r\n function getDefaultItemHeight(listSize) {\r\n var mockList = $('
    ' +\r\n '
    ' +\r\n '
      ' +\r\n '
    • ' +\r\n 'test' +\r\n '
    • ' +\r\n '
    ' +\r\n '
    ' +\r\n '
    ');\r\n var lineHeight;\r\n\r\n mockList.css({\r\n position: \"absolute\",\r\n left: \"-200000px\",\r\n visibility: \"hidden\"\r\n });\r\n mockList.appendTo(document.body);\r\n lineHeight = parseFloat(kendo.getComputedStyles(mockList.find(\".k-list-item\")[0], [\"height\"]).height);\r\n mockList.remove();\r\n\r\n return lineHeight;\r\n }\r\n\r\n function bufferSizes(screenHeight, listScreens, opposite) { //in pixels\r\n return {\r\n down: screenHeight * opposite,\r\n up: screenHeight * (listScreens - 1 - opposite)\r\n };\r\n }\r\n\r\n function listValidator(options, screenHeight) {\r\n var downThreshold = (options.listScreens - 1 - options.threshold) * screenHeight;\r\n var upThreshold = options.threshold * screenHeight;\r\n\r\n return function(list, scrollTop, lastScrollTop) {\r\n if (scrollTop > lastScrollTop) {\r\n return scrollTop - list.top < downThreshold;\r\n } else {\r\n return list.top === 0 || scrollTop - list.top > upThreshold;\r\n }\r\n };\r\n }\r\n\r\n function scrollCallback(element, callback) {\r\n return function(force) {\r\n return callback(element.scrollTop, force);\r\n };\r\n }\r\n\r\n function syncList(reorder) {\r\n return function(list, force) {\r\n reorder(list.items, list.index, force);\r\n return list;\r\n };\r\n }\r\n\r\n function position(element, y) {\r\n element.style.webkitTransform = 'translateY(' + y + \"px)\";\r\n element.style.transform = 'translateY(' + y + \"px)\";\r\n }\r\n\r\n function map2(callback, templates) {\r\n return function(arr1, arr2) {\r\n for (var i = 0, len = arr1.length; i < len; i++) {\r\n callback(arr1[i], arr2[i], templates);\r\n if (arr2[i].item) {\r\n this.trigger(ITEMCHANGE, { item: $(arr1[i]), data: arr2[i].item, ns: kendo.ui });\r\n }\r\n }\r\n };\r\n }\r\n\r\n function reshift(items, diff) {\r\n var range;\r\n\r\n if (diff > 0) { // down\r\n range = items.splice(0, diff);\r\n items.push.apply(items, range);\r\n } else { // up\r\n range = items.splice(diff, -diff);\r\n items.unshift.apply(items, range);\r\n }\r\n\r\n return range;\r\n }\r\n\r\n function render(element, data, templates) {\r\n var itemTemplate = templates.template,\r\n hasColumns = this.options.columns && this.options.columns.length,\r\n altRow = data.index % 2 === 1 ? \"k-table-alt-row\" : \"\";\r\n\r\n element = $(element);\r\n\r\n if (!data.item) {\r\n itemTemplate = templates.placeholderTemplate;\r\n }\r\n\r\n if (data.index === 0 && this.header && data.group) {\r\n this.header.html(templates.fixedGroupTemplate(data.group));\r\n }\r\n\r\n element\r\n .attr(\"data-uid\", data.item ? data.item.uid : \"\")\r\n .attr(\"data-offset-index\", data.index);\r\n\r\n if (hasColumns && data.item) {\r\n if (altRow.length > 0) {\r\n element.addClass(altRow);\r\n } else {\r\n element.removeClass(\"k-table-alt-row\");\r\n }\r\n\r\n let renderedColumns = $(renderColumns(this.options, data.item, templates));\r\n kendo.applyStylesFromKendoAttributes(renderedColumns, [\"width\", \"max-width\"]);\r\n element.empty().append(renderedColumns);\r\n } else {\r\n element.find(\".\" + GROUPITEM).remove();\r\n element.find(\".k-list-item-text\").html(itemTemplate(data.item || {}));\r\n }\r\n\r\n element.toggleClass(FOCUSED, data.current);\r\n element.toggleClass(SELECTED, data.selected);\r\n element.toggleClass(\"k-first\", data.newGroup);\r\n element.toggleClass(\"k-last\", data.isLastGroupedItem);\r\n element.toggleClass(\"k-loading-item\", !data.item);\r\n\r\n if (data.index !== 0 && data.newGroup) {\r\n if (hasColumns) {\r\n $('' + templates.groupTemplate(data.group) + '')\r\n .appendTo(element);\r\n } else {\r\n $(\"
    \")\r\n .appendTo(element)\r\n .html(templates.groupTemplate(data.group));\r\n }\r\n } else if (data.group && hasColumns) {\r\n element.append($(''));\r\n }\r\n\r\n if (data.top !== undefined$1) {\r\n position(element[0], data.top);\r\n }\r\n }\r\n\r\n function renderColumns(options, dataItem, templates) {\r\n var item = \"\";\r\n\r\n for (var i = 0; i < options.columns.length; i++) {\r\n var currentWidth = options.columns[i].width;\r\n var currentWidthInt = parseInt(currentWidth, 10);\r\n var widthStyle = '';\r\n\r\n if (currentWidth) {\r\n let widthValue = `${currentWidthInt}${percentageUnitsRegex.test(currentWidth) ? \"%\" : \"px\"}`;\r\n widthStyle = `${kendo.attr(\"style-width\")}=\"${widthValue}\" ${kendo.attr(\"style-max-width\")}=\"${widthValue}\"`;\r\n }\r\n\r\n item += \"\";\r\n item += templates[\"column\" + i](dataItem);\r\n item += \"\";\r\n }\r\n\r\n return item;\r\n }\r\n\r\n function mapChangedItems(selected, itemsToMatch) {\r\n var itemsLength = itemsToMatch.length;\r\n var selectedLength = selected.length;\r\n var dataItem;\r\n var found;\r\n var i, j;\r\n\r\n var changed = [];\r\n var unchanged = [];\r\n\r\n if (selectedLength) {\r\n for (i = 0; i < selectedLength; i++) {\r\n dataItem = selected[i];\r\n found = false;\r\n\r\n for (j = 0; j < itemsLength; j++) {\r\n if (dataItem === itemsToMatch[j]) {\r\n found = true;\r\n changed.push({ index: i, item: dataItem });\r\n break;\r\n }\r\n }\r\n\r\n if (!found) {\r\n unchanged.push(dataItem);\r\n }\r\n }\r\n }\r\n\r\n return {\r\n changed: changed,\r\n unchanged: unchanged\r\n };\r\n }\r\n\r\n function isActivePromise(promise) {\r\n return promise && promise.state() !== \"resolved\";\r\n }\r\n\r\n var VirtualList = DataBoundWidget.extend({\r\n init: function(element, options) {\r\n var that = this,\r\n contentClasses = options.columns && options.columns.length ? TABLE_CONTENT : LIST_CONTENT;\r\n\r\n that.bound(false);\r\n that._fetching = false;\r\n\r\n Widget.fn.init.call(that, element, options);\r\n\r\n if (!that.options.itemHeight) {\r\n that.options.itemHeight = getDefaultItemHeight(options.listSize);\r\n }\r\n\r\n options = that.options;\r\n\r\n that.element.attr(\"role\", \"listbox\");\r\n\r\n var contentSelector = \".\" + contentClasses.split(' ').join('.');\r\n var wrapper = that.element.closest(contentSelector);\r\n\r\n that.content = that.wrapper = wrapper.length ? wrapper : that.element.wrap(\"
    \").parent();\r\n\r\n if (that.options.columns && that.options.columns.length) {\r\n var thead = that.element.closest(\".k-data-table\").find('.k-table-thead');\r\n var row = $('' +\r\n '' +\r\n '');\r\n\r\n thead.append(row);\r\n\r\n that.header = row.find(\".k-table-th\");\r\n that.element.addClass(TABLE_LIST + \" k-virtual-table\");\r\n } else {\r\n that.header = that.content.before(\"
    \").prev();\r\n that.element.addClass(LIST_UL);\r\n }\r\n\r\n if (options.ariaLabel) {\r\n this.element.attr(\"aria-label\", options.ariaLabel);\r\n } else if (options.ariaLabelledBy) {\r\n this.element.attr(\"aria-labelledby\", options.ariaLabelledBy);\r\n }\r\n\r\n that.element.on(\"mouseenter\" + VIRTUAL_LIST_NS, \"li:not(.k-loading-item)\", function() { $(this).addClass(HOVER); })\r\n .on(\"mouseleave\" + VIRTUAL_LIST_NS, \"li\", function() { $(this).removeClass(HOVER); });\r\n\r\n that._values = toArray(that.options.value);\r\n that._selectedDataItems = [];\r\n that._selectedIndexes = [];\r\n that._rangesList = {};\r\n that._promisesList = [];\r\n that._optionID = kendo.guid();\r\n\r\n that._templates();\r\n\r\n that.setDataSource(options.dataSource);\r\n\r\n that.content.on(\"scroll\" + VIRTUAL_LIST_NS, kendo.throttle(function() {\r\n that._renderItems();\r\n that._triggerListBound();\r\n }, options.delay));\r\n\r\n that._selectable();\r\n },\r\n\r\n options: {\r\n name: \"VirtualList\",\r\n autoBind: true,\r\n delay: 100,\r\n height: null,\r\n listScreens: 4,\r\n threshold: 0.5,\r\n itemHeight: null,\r\n oppositeBuffer: 1,\r\n type: \"flat\",\r\n selectable: false,\r\n value: [],\r\n dataValueField: null,\r\n template: (data) => encode(data),\r\n placeholderTemplate: () => \"loading...\",\r\n groupTemplate: (data) => encode(data),\r\n fixedGroupTemplate: (data) => encode(data),\r\n mapValueTo: \"index\",\r\n valueMapper: null,\r\n ariaLabel: null,\r\n ariaLabelledBy: null\r\n },\r\n\r\n events: [\r\n CHANGE,\r\n CLICK,\r\n LISTBOUND,\r\n ITEMCHANGE,\r\n ACTIVATE,\r\n DEACTIVATE\r\n ],\r\n\r\n setOptions: function(options) {\r\n var itemClass = this.options.columns && this.options.columns.length ? TABLE_ITEM : LIST_ITEM;\r\n\r\n Widget.fn.setOptions.call(this, options);\r\n\r\n if (this._selectProxy && this.options.selectable === false) {\r\n this.element.off(CLICK, \".\" + itemClass, this._selectProxy);\r\n } else if (!this._selectProxy && this.options.selectable) {\r\n this._selectable();\r\n }\r\n\r\n this._templates();\r\n this.refresh();\r\n },\r\n\r\n items: function() {\r\n return $(this._items);\r\n },\r\n\r\n destroy: function() {\r\n this.wrapper.off(VIRTUAL_LIST_NS);\r\n this.dataSource.unbind(CHANGE, this._refreshHandler);\r\n Widget.fn.destroy.call(this);\r\n },\r\n\r\n setDataSource: function(source) {\r\n var that = this;\r\n var dataSource = source || {};\r\n var value;\r\n\r\n dataSource = Array.isArray(dataSource) ? { data: dataSource } : dataSource;\r\n dataSource = kendo.data.DataSource.create(dataSource);\r\n\r\n if (that.dataSource) {\r\n that.dataSource.unbind(CHANGE, that._refreshHandler);\r\n\r\n that._clean();\r\n that.bound(false);\r\n\r\n that._deferValueSet = true;\r\n value = that.value();\r\n\r\n that.value([]);\r\n that.mute(function() {\r\n that.value(value);\r\n });\r\n } else {\r\n that._refreshHandler = that.refresh.bind(that);\r\n }\r\n\r\n that.dataSource = dataSource.bind(CHANGE, that._refreshHandler);\r\n\r\n that.setDSFilter(dataSource.filter());\r\n\r\n if (dataSource.view().length !== 0) {\r\n that.refresh();\r\n } else if (that.options.autoBind) {\r\n dataSource.fetch();\r\n }\r\n },\r\n\r\n skip: function() {\r\n return this.dataSource.currentRangeStart();\r\n },\r\n\r\n _triggerListBound: function() {\r\n var that = this;\r\n var skip = that.skip();\r\n\r\n if (that.bound() && !that._selectingValue && that._skip !== skip) {\r\n that._skip = skip;\r\n that.trigger(LISTBOUND);\r\n }\r\n },\r\n\r\n _getValues: function(dataItems) {\r\n var getter = this._valueGetter;\r\n\r\n return $.map(dataItems, function(dataItem) {\r\n return getter(dataItem);\r\n });\r\n },\r\n\r\n _highlightSelectedItems: function() {\r\n for (var i = 0; i < this._selectedDataItems.length; i++) {\r\n var item = this._getElementByDataItem(this._selectedDataItems[i]);\r\n if (item.length) {\r\n item.addClass(SELECTED);\r\n }\r\n }\r\n },\r\n\r\n refresh: function(e) {\r\n var that = this;\r\n var action = e && e.action;\r\n var isItemChange = action === \"itemchange\";\r\n var filtered = this.isFiltered();\r\n var result;\r\n\r\n if (that._mute) { return; }\r\n\r\n that._deferValueSet = false;\r\n\r\n if (!that._fetching) {\r\n if (filtered) {\r\n that.focus(0);\r\n }\r\n\r\n that._createList();\r\n if (!action && that._values.length && !filtered &&\r\n !that.options.skipUpdateOnBind && !that._emptySearch) {\r\n that._selectingValue = true;\r\n\r\n that.bound(true);\r\n that.value(that._values, true).done(function() {\r\n that._selectingValue = false;\r\n that._triggerListBound();\r\n });\r\n } else {\r\n that.bound(true);\r\n that._highlightSelectedItems();\r\n that._triggerListBound();\r\n }\r\n } else {\r\n if (that._renderItems) {\r\n that._renderItems(true);\r\n }\r\n\r\n that._triggerListBound();\r\n }\r\n\r\n if (isItemChange || action === \"remove\") {\r\n result = mapChangedItems(that._selectedDataItems, e.items);\r\n if (result.changed.length) {\r\n if (isItemChange) {\r\n that.trigger(\"selectedItemChange\", {\r\n items: result.changed\r\n });\r\n } else {\r\n that.value(that._getValues(result.unchanged));\r\n }\r\n }\r\n }\r\n\r\n that._fetching = false;\r\n },\r\n\r\n removeAt: function(position) {\r\n var value = this._values.splice(position, 1)[0];\r\n\r\n return {\r\n position: position,\r\n dataItem: this._removeSelectedDataItem(value)\r\n };\r\n },\r\n\r\n _removeSelectedDataItem: function(value) {\r\n var that = this,\r\n valueGetter = that._valueGetter;\r\n\r\n for (var idx in that._selectedDataItems) {\r\n if (valueGetter(that._selectedDataItems[idx]) === value) {\r\n that._selectedIndexes.splice(idx, 1);\r\n return that._selectedDataItems.splice(idx, 1)[0];\r\n }\r\n }\r\n },\r\n\r\n setValue: function(value) {\r\n this._values = toArray(value);\r\n },\r\n\r\n value: function(value, _forcePrefetch) {\r\n var that = this;\r\n\r\n if (value === undefined$1) {\r\n return that._values.slice();\r\n }\r\n\r\n if (value === null) {\r\n value = [];\r\n }\r\n\r\n value = toArray(value);\r\n\r\n if (!that._valueDeferred || that._valueDeferred.state() === \"resolved\") {\r\n that._valueDeferred = $.Deferred();\r\n }\r\n\r\n var shouldClear = that.options.selectable === \"multiple\" && that.select().length && value.length;\r\n\r\n if (shouldClear || !value.length) {\r\n that.select(-1);\r\n }\r\n\r\n that._values = value;\r\n\r\n if ((that.bound() && !that._mute && !that._deferValueSet) || _forcePrefetch) {\r\n that._prefetchByValue(value);\r\n }\r\n\r\n return that._valueDeferred;\r\n },\r\n\r\n _checkValuesOrder: function(value) {\r\n if (this._removedAddedIndexes &&\r\n this._removedAddedIndexes.length === value.length) {\r\n var newValue = this._removedAddedIndexes.slice();\r\n this._removedAddedIndexes = null;\r\n return newValue;\r\n }\r\n\r\n return value;\r\n },\r\n\r\n _prefetchByValue: function(value) {\r\n var that = this,\r\n dataView = that._dataView,\r\n valueGetter = that._valueGetter,\r\n mapValueTo = that.options.mapValueTo,\r\n item, match = false,\r\n forSelection = [];\r\n\r\n //try to find the items in the loaded data\r\n for (var i = 0; i < value.length; i++) {\r\n for (var idx = 0; idx < dataView.length; idx++) {\r\n item = dataView[idx].item;\r\n if (item) {\r\n match = isPrimitive(item) ? value[i] === item : value[i] === valueGetter(item);\r\n\r\n if (match) {\r\n forSelection.push(dataView[idx].index);\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (forSelection.length === value.length) {\r\n that._values = [];\r\n that.select(forSelection);\r\n return;\r\n }\r\n\r\n //prefetch the items\r\n if (typeof that.options.valueMapper === \"function\") {\r\n const callback = mapValueTo === 'index' ? that.mapValueToIndex : that.mapValueToDataItem;\r\n that.options.valueMapper(valueMapperOptions(this.options, value, callback.bind(that)));\r\n } else {\r\n if (!that.value()[0]) {\r\n that.select([-1]);\r\n } else {\r\n that._selectingValue = false;\r\n that._triggerListBound();\r\n }\r\n }\r\n },\r\n\r\n mapValueToIndex: function(indexes) {\r\n if (indexes === undefined$1 || indexes === -1 || indexes === null) {\r\n indexes = [];\r\n } else {\r\n indexes = toArray(indexes);\r\n }\r\n\r\n if (!indexes.length) {\r\n indexes = [-1];\r\n } else {\r\n var removed = this._deselect([]).removed;\r\n if (removed.length) {\r\n this._triggerChange(removed, []);\r\n }\r\n }\r\n\r\n this.select(indexes);\r\n },\r\n\r\n mapValueToDataItem: function(dataItems) {\r\n var removed, added;\r\n\r\n if (dataItems === undefined$1 || dataItems === null) {\r\n dataItems = [];\r\n } else {\r\n dataItems = toArray(dataItems);\r\n }\r\n\r\n if (!dataItems.length) {\r\n this.select([-1]);\r\n } else {\r\n removed = $.map(this._selectedDataItems, function(item, index) {\r\n return { index: index, dataItem: item };\r\n });\r\n\r\n added = $.map(dataItems, function(item, index) {\r\n return { index: index, dataItem: item };\r\n });\r\n\r\n this._selectedDataItems = dataItems;\r\n\r\n this._selectedIndexes = [];\r\n\r\n for (var i = 0; i < this._selectedDataItems.length; i++) {\r\n var item = this._getElementByDataItem(this._selectedDataItems[i]);\r\n this._selectedIndexes.push(this._getIndecies(item)[0]);\r\n item.addClass(SELECTED);\r\n }\r\n\r\n this._triggerChange(removed, added);\r\n\r\n if (this._valueDeferred) {\r\n this._valueDeferred.resolve();\r\n }\r\n }\r\n },\r\n\r\n deferredRange: function(index) {\r\n var dataSource = this.dataSource;\r\n var take = this.itemCount;\r\n var ranges = this._rangesList;\r\n var result = $.Deferred();\r\n var defs = [];\r\n\r\n var low = Math.floor(index / take) * take;\r\n var high = Math.ceil(index / take) * take;\r\n\r\n var pages = high === low ? [ high ] : [ low, high ];\r\n\r\n $.each(pages, function(_, skip) {\r\n var end = skip + take;\r\n var existingRange = ranges[skip];\r\n var deferred;\r\n\r\n if (!existingRange || (existingRange.end !== end)) {\r\n deferred = $.Deferred();\r\n ranges[skip] = { end: end, deferred: deferred };\r\n\r\n dataSource._multiplePrefetch(skip, take, function() {\r\n deferred.resolve();\r\n });\r\n } else {\r\n deferred = existingRange.deferred;\r\n }\r\n\r\n defs.push(deferred);\r\n });\r\n\r\n $.when.apply($, defs).done(function() {\r\n result.resolve();\r\n });\r\n\r\n return result;\r\n },\r\n\r\n prefetch: function(indexes) {\r\n var that = this,\r\n take = this.itemCount,\r\n isEmptyList = !that._promisesList.length;\r\n\r\n if (!isActivePromise(that._activeDeferred)) {\r\n that._activeDeferred = $.Deferred();\r\n that._promisesList = [];\r\n }\r\n\r\n $.each(indexes, function(_, index) {\r\n that._promisesList.push(that.deferredRange(that._getSkip(index, take)));\r\n });\r\n\r\n if (isEmptyList) {\r\n $.when.apply($, that._promisesList).done(function() {\r\n that._promisesList = [];\r\n that._activeDeferred.resolve();\r\n });\r\n }\r\n\r\n return that._activeDeferred;\r\n },\r\n\r\n _findDataItem: function(view, index) {\r\n var group;\r\n\r\n //find in grouped view\r\n if (this.options.type === \"group\") {\r\n for (var i = 0; i < view.length; i++) {\r\n group = view[i].items;\r\n if (group.length <= index) {\r\n index = index - group.length;\r\n } else {\r\n return group[index];\r\n }\r\n }\r\n }\r\n\r\n //find in flat view\r\n return view[index];\r\n },\r\n\r\n _getRange: function(skip, take) {\r\n return this.dataSource._findRange(skip, Math.min(skip + take, this.dataSource.total()));\r\n },\r\n\r\n dataItemByIndex: function(index) {\r\n var that = this;\r\n var take = that.itemCount;\r\n var skip = that._getSkip(index, take);\r\n var view = this._getRange(skip, take);\r\n\r\n //should not return item if data is not loaded\r\n if (!that._getRange(skip, take).length) {\r\n return null;\r\n }\r\n\r\n if (that.options.type === \"group\") {\r\n kendo.ui.progress($(that.wrapper), true);\r\n that.mute(function() {\r\n that.dataSource.range(skip, take, function() {\r\n kendo.ui.progress($(that.wrapper), false);\r\n });\r\n view = that.dataSource.view();\r\n });\r\n }\r\n\r\n return that._findDataItem(view, [index - skip]);\r\n },\r\n\r\n selectedDataItems: function() {\r\n return this._selectedDataItems.slice();\r\n },\r\n\r\n scrollWith: function(value) {\r\n this.content.scrollTop(this.content.scrollTop() + value);\r\n },\r\n\r\n scrollTo: function(y) {\r\n this.content.scrollTop(y); //works only if the element is visible\r\n },\r\n\r\n scrollToIndex: function(index) {\r\n this.scrollTo(index * this.options.itemHeight);\r\n },\r\n\r\n focus: function(candidate) {\r\n var element,\r\n index,\r\n data,\r\n current,\r\n itemHeight = this.options.itemHeight,\r\n id = this._optionID,\r\n triggerEvent = true;\r\n\r\n if (candidate === undefined$1) {\r\n current = this.element.find(\".\" + FOCUSED);\r\n return current.length ? current : null;\r\n }\r\n\r\n if (typeof candidate === \"function\") {\r\n data = this.dataSource.flatView();\r\n for (var idx = 0; idx < data.length; idx++) {\r\n if (candidate(data[idx])) {\r\n candidate = idx;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (candidate instanceof Array) {\r\n candidate = lastFrom(candidate);\r\n }\r\n\r\n if (isNaN(candidate)) {\r\n element = $(candidate);\r\n index = parseInt($(element).attr(\"data-offset-index\"), 10);\r\n } else {\r\n index = candidate;\r\n element = this._getElementByIndex(index);\r\n }\r\n\r\n if (index === -1) {\r\n this.element.find(\".\" + FOCUSED).removeClass(FOCUSED);\r\n this._focusedIndex = undefined$1;\r\n return;\r\n }\r\n\r\n if (element.length) { /*focus rendered item*/\r\n if (element.hasClass(FOCUSED)) {\r\n triggerEvent = false;\r\n }\r\n if (this._focusedIndex !== undefined$1) {\r\n current = this._getElementByIndex(this._focusedIndex);\r\n current\r\n .removeClass(FOCUSED)\r\n .removeAttr(\"id\");\r\n\r\n if (triggerEvent) {\r\n this.trigger(DEACTIVATE);\r\n }\r\n }\r\n\r\n this._focusedIndex = index;\r\n\r\n element\r\n .addClass(FOCUSED)\r\n .attr(\"id\", id);\r\n\r\n var position = this._getElementLocation(index);\r\n\r\n if (position === \"top\") {\r\n this.scrollTo(index * itemHeight);\r\n } else if (position === \"bottom\") {\r\n this.scrollTo((index * itemHeight + itemHeight) - this._screenHeight);\r\n } else if (position === \"outScreen\") {\r\n this.scrollTo(index * itemHeight);\r\n }\r\n\r\n if (triggerEvent) {\r\n this.trigger(ACTIVATE);\r\n }\r\n } else { /*focus non rendered item*/\r\n this._focusedIndex = index;\r\n this.items().removeClass(FOCUSED);\r\n this.scrollToIndex(index);\r\n }\r\n },\r\n\r\n focusIndex: function() {\r\n return this._focusedIndex;\r\n },\r\n\r\n focusFirst: function() {\r\n this.scrollTo(0);\r\n this.focus(0);\r\n },\r\n\r\n focusLast: function() {\r\n var lastIndex = this.dataSource.total();\r\n this.scrollTo(this.heightContainer.offsetHeight);\r\n this.focus(lastIndex - 1);\r\n },\r\n\r\n focusPrev: function() {\r\n var index = this._focusedIndex;\r\n var current;\r\n\r\n if (!isNaN(index) && index > 0) {\r\n index -= 1;\r\n this.focus(index);\r\n\r\n current = this.focus();\r\n if (current && current.hasClass(\"k-loading-item\")) {\r\n index += 1;\r\n this.focus(index);\r\n }\r\n\r\n return index;\r\n } else {\r\n index = this.dataSource.total() - 1;\r\n this.focus(index);\r\n return index;\r\n }\r\n },\r\n\r\n focusNext: function() {\r\n var index = this._focusedIndex;\r\n var lastIndex = this.dataSource.total() - 1;\r\n var current;\r\n\r\n if (!isNaN(index) && index < lastIndex) {\r\n index += 1;\r\n this.focus(index);\r\n\r\n current = this.focus();\r\n if (current && current.hasClass(\"k-loading-item\")) {\r\n index -= 1;\r\n this.focus(index);\r\n }\r\n\r\n return index;\r\n } else {\r\n index = 0;\r\n this.focus(index);\r\n return index;\r\n }\r\n },\r\n\r\n _triggerChange: function(removed, added) {\r\n removed = removed || [];\r\n added = added || [];\r\n\r\n if (removed.length || added.length) {\r\n this.trigger(CHANGE, {\r\n removed: removed,\r\n added: added\r\n });\r\n }\r\n },\r\n\r\n select: function(candidate) {\r\n var that = this,\r\n indices,\r\n initialIndices,\r\n singleSelection = that.options.selectable !== \"multiple\",\r\n prefetchStarted = isActivePromise(that._activeDeferred),\r\n filtered = this.isFiltered(),\r\n isAlreadySelected,\r\n deferred,\r\n result,\r\n removed = [];\r\n\r\n if (candidate === undefined$1) {\r\n return that._selectedIndexes.slice();\r\n }\r\n\r\n if (!that._selectDeferred || that._selectDeferred.state() === \"resolved\") {\r\n that._selectDeferred = $.Deferred();\r\n }\r\n\r\n indices = that._getIndecies(candidate);\r\n isAlreadySelected = singleSelection && !filtered && lastFrom(indices) === lastFrom(this._selectedIndexes);\r\n removed = that._deselectCurrentValues(indices);\r\n\r\n if (removed.length || !indices.length || isAlreadySelected) {\r\n that._triggerChange(removed);\r\n\r\n if (that._valueDeferred) {\r\n that._valueDeferred.resolve().promise();\r\n }\r\n\r\n return that._selectDeferred.resolve().promise();\r\n }\r\n\r\n if (indices.length === 1 && indices[0] === -1) {\r\n indices = [];\r\n }\r\n\r\n initialIndices = indices;\r\n result = that._deselect(indices);\r\n removed = result.removed;\r\n indices = result.indices;\r\n\r\n if (singleSelection) {\r\n prefetchStarted = false;\r\n if (indices.length) {\r\n indices = [lastFrom(indices)];\r\n }\r\n }\r\n\r\n var done = function() {\r\n var added = that._select(indices);\r\n\r\n if (initialIndices.length === indices.length || singleSelection) {\r\n that.focus(indices);\r\n }\r\n\r\n that._triggerChange(removed, added);\r\n\r\n if (that._valueDeferred) {\r\n that._valueDeferred.resolve();\r\n }\r\n\r\n that._selectDeferred.resolve();\r\n };\r\n\r\n deferred = that.prefetch(indices);\r\n\r\n if (!prefetchStarted) {\r\n if (deferred) {\r\n deferred.done(done);\r\n } else {\r\n done();\r\n }\r\n }\r\n\r\n return that._selectDeferred.promise();\r\n },\r\n\r\n bound: function(bound) {\r\n if (bound === undefined$1) {\r\n return this._listCreated;\r\n }\r\n\r\n this._listCreated = bound;\r\n },\r\n\r\n mute: function(callback) {\r\n this._mute = true;\r\n callback();\r\n this._mute = false;\r\n },\r\n\r\n setDSFilter: function(filter) {\r\n this._lastDSFilter = $.extend({}, filter);\r\n },\r\n\r\n isFiltered: function() {\r\n if (!this._lastDSFilter) {\r\n this.setDSFilter(this.dataSource.filter());\r\n }\r\n\r\n return !kendo.data.Query.compareFilters(this.dataSource.filter(), this._lastDSFilter);\r\n },\r\n\r\n skipUpdate: $.noop,\r\n\r\n _getElementByIndex: function(index) {\r\n return this.items().filter(function(idx, element) {\r\n return index === parseInt($(element).attr(\"data-offset-index\"), 10);\r\n });\r\n },\r\n\r\n _getElementByDataItem: function(dataItem) {\r\n var dataView = this._dataView,\r\n valueGetter = this._valueGetter,\r\n element, match;\r\n\r\n for (var i = 0; i < dataView.length; i++) {\r\n match = dataView[i].item && isPrimitive(dataView[i].item) ? dataView[i].item === dataItem : dataView[i].item && dataItem && valueGetter(dataView[i].item) == valueGetter(dataItem);\r\n if (match) {\r\n element = dataView[i];\r\n break;\r\n }\r\n }\r\n\r\n return element ? this._getElementByIndex(element.index) : $();\r\n },\r\n\r\n _clean: function() {\r\n this.result = undefined$1;\r\n this._lastScrollTop = undefined$1;\r\n this._skip = undefined$1;\r\n $(this.heightContainer).remove();\r\n this.heightContainer = undefined$1;\r\n this.element.empty();\r\n },\r\n\r\n _height: function() {\r\n var hasData = !!this.dataSource.view().length,\r\n height = this.options.height,\r\n itemHeight = this.options.itemHeight,\r\n total = this.dataSource.total();\r\n\r\n if (!hasData) {\r\n height = 0;\r\n } else if (height / itemHeight > total) {\r\n height = total * itemHeight;\r\n }\r\n\r\n return height;\r\n },\r\n\r\n setScreenHeight: function() {\r\n var height = this._height();\r\n\r\n this.content.height(height);\r\n this._screenHeight = height;\r\n },\r\n\r\n screenHeight: function() {\r\n return this._screenHeight;\r\n },\r\n\r\n _getElementLocation: function(index) {\r\n var scrollTop = this.content.scrollTop(),\r\n screenHeight = this._screenHeight,\r\n itemHeight = this.options.itemHeight,\r\n yPosition = index * itemHeight,\r\n yDownPostion = yPosition + itemHeight,\r\n screenEnd = scrollTop + screenHeight,\r\n position;\r\n\r\n if (yPosition === (scrollTop - itemHeight) || (yDownPostion > scrollTop && yPosition < scrollTop)) {\r\n position = \"top\";\r\n } else if (yPosition === screenEnd || (yPosition < screenEnd && screenEnd < yDownPostion)) {\r\n position = \"bottom\";\r\n } else if ((yPosition >= scrollTop) && (yPosition <= scrollTop + (screenHeight - itemHeight))) {\r\n position = \"inScreen\";\r\n } else {\r\n position = \"outScreen\";\r\n }\r\n\r\n return position;\r\n },\r\n\r\n _templates: function() {\r\n var options = this.options;\r\n var templates = {\r\n template: options.template,\r\n placeholderTemplate: options.placeholderTemplate,\r\n groupTemplate: options.groupTemplate,\r\n fixedGroupTemplate: options.fixedGroupTemplate\r\n };\r\n\r\n if (options.columns) {\r\n options.columns.forEach((column, i) => {\r\n var templateText = column.field ? column.field.toString() : \"text\";\r\n var templateFunc = data => encode(kendo.getter(templateText)(data));\r\n\r\n templates[\"column\" + i] = column.template || templateFunc;\r\n });\r\n }\r\n\r\n for (var key in templates) {\r\n if (typeof templates[key] !== \"function\") {\r\n templates[key] = kendo.template(templates[key] || \"\");\r\n }\r\n }\r\n\r\n this.templates = templates;\r\n },\r\n\r\n _generateItems: function(element, count) {\r\n var items = [],\r\n item, text,\r\n itemHeight = this.options.itemHeight + \"px\",\r\n itemClass = this.options.columns && this.options.columns.length ? TABLE_ITEM : LIST_ITEM;\r\n\r\n while (count-- > 0) {\r\n text = document.createElement(\"span\");\r\n text.className = \"k-list-item-text\";\r\n\r\n item = document.createElement(\"li\");\r\n item.tabIndex = -1;\r\n item.className = itemClass;\r\n item.setAttribute(\"role\", \"option\");\r\n item.style.height = itemHeight;\r\n item.style.minHeight = itemHeight;\r\n item.appendChild(text);\r\n\r\n element.appendChild(item);\r\n\r\n items.push(item);\r\n }\r\n\r\n return items;\r\n },\r\n\r\n _saveInitialRanges: function() {\r\n var ranges = this.dataSource._ranges;\r\n var deferred = $.Deferred();\r\n deferred.resolve();\r\n\r\n this._rangesList = {};\r\n for (var i = 0; i < ranges.length; i++) {\r\n this._rangesList[ranges[i].start] = { end: ranges[i].end, deferred: deferred };\r\n }\r\n },\r\n\r\n _createList: function() {\r\n var that = this,\r\n content = that.content.get(0),\r\n options = that.options,\r\n dataSource = that.dataSource;\r\n\r\n if (that.bound()) {\r\n that._clean();\r\n }\r\n\r\n that._saveInitialRanges();\r\n that._buildValueGetter();\r\n that.setScreenHeight();\r\n that.itemCount = getItemCount(that._screenHeight, options.listScreens, options.itemHeight);\r\n\r\n if (that.itemCount > dataSource.total()) {\r\n that.itemCount = dataSource.total();\r\n }\r\n\r\n that._items = that._generateItems(that.element[0], that.itemCount);\r\n\r\n that._setHeight(options.itemHeight * dataSource.total());\r\n that.options.type = (dataSource.group() || []).length ? \"group\" : \"flat\";\r\n\r\n if (that.options.type === \"flat\") {\r\n if (that.header.closest(GROUP_ROW_SEL).length) {\r\n that.header.closest(GROUP_ROW_SEL).hide();\r\n } else {\r\n that.header.hide();\r\n }\r\n } else {\r\n if (that.header.closest(GROUP_ROW_SEL).length) {\r\n that.header.closest(GROUP_ROW_SEL).show();\r\n } else {\r\n that.header.show();\r\n }\r\n }\r\n\r\n that.getter = that._getter(function() {\r\n that._renderItems(true);\r\n });\r\n\r\n that._onScroll = function(scrollTop, force) {\r\n var getList = that._listItems(that.getter);\r\n return that._fixedHeader(scrollTop, getList(scrollTop, force));\r\n };\r\n\r\n that._renderItems = that._whenChanged(\r\n scrollCallback(content, that._onScroll),\r\n syncList(that._reorderList(that._items, render.bind(that)))\r\n );\r\n\r\n that._renderItems();\r\n that._calculateGroupPadding(that._screenHeight);\r\n that._calculateColumnsHeaderPadding();\r\n },\r\n\r\n _setHeight: function(height) {\r\n var currentHeight,\r\n heightContainer = this.heightContainer;\r\n\r\n if (!heightContainer) {\r\n heightContainer = this.heightContainer = appendChild(this.content[0], HEIGHTCONTAINER);\r\n } else {\r\n currentHeight = heightContainer.offsetHeight;\r\n }\r\n\r\n if (height !== currentHeight) {\r\n heightContainer.innerHTML = \"\";\r\n\r\n while (height > 0) {\r\n var padHeight = Math.min(height, 250000); //IE workaround, should not create elements with height larger than 250000px\r\n appendChild(heightContainer).style.height = padHeight + \"px\";\r\n height -= padHeight;\r\n }\r\n }\r\n },\r\n\r\n _getter: function() {\r\n var lastRequestedRange = null,\r\n dataSource = this.dataSource,\r\n lastRangeStart = dataSource.skip(),\r\n type = this.options.type,\r\n pageSize = this.itemCount,\r\n flatGroups = {};\r\n\r\n if (dataSource.pageSize() < pageSize) {\r\n this.mute(function() {\r\n dataSource.pageSize(pageSize);\r\n });\r\n }\r\n\r\n return function(index, rangeStart) {\r\n var that = this;\r\n if (!dataSource.inRange(rangeStart, pageSize)) {\r\n if (lastRequestedRange !== rangeStart) {\r\n lastRequestedRange = rangeStart;\r\n lastRangeStart = rangeStart;\r\n\r\n if (that._getterDeferred) {\r\n that._getterDeferred.reject();\r\n }\r\n\r\n that._getterDeferred = that.deferredRange(rangeStart);\r\n that._getterDeferred.then(function() {\r\n var firstItemIndex = that._indexConstraint(that.content[0].scrollTop);\r\n\r\n that._getterDeferred = null;\r\n\r\n if (rangeStart <= firstItemIndex && firstItemIndex <= (rangeStart + pageSize)) {\r\n that._fetching = true;\r\n dataSource.range(rangeStart, pageSize);\r\n }\r\n });\r\n }\r\n\r\n return null;\r\n } else {\r\n if (lastRangeStart !== rangeStart) {\r\n this.mute(function() {\r\n dataSource.range(rangeStart, pageSize);\r\n lastRangeStart = rangeStart;\r\n });\r\n }\r\n\r\n var result;\r\n if (type === \"group\") { //grouped list\r\n if (!flatGroups[rangeStart]) {\r\n var flatGroup = flatGroups[rangeStart] = [];\r\n var groups = dataSource.view();\r\n for (var i = 0, len = groups.length; i < len; i++) {\r\n var group = groups[i];\r\n for (var j = 0, groupLength = group.items.length; j < groupLength; j++) {\r\n flatGroup.push({ item: group.items[j], group: group.value });\r\n }\r\n }\r\n }\r\n\r\n result = flatGroups[rangeStart][index - rangeStart];\r\n } else { //flat list\r\n result = dataSource.view()[index - rangeStart];\r\n }\r\n\r\n return result;\r\n }\r\n };\r\n },\r\n\r\n _fixedHeader: function(scrollTop, list) {\r\n var group = this.currentVisibleGroup,\r\n itemHeight = this.options.itemHeight,\r\n firstVisibleDataItemIndex = Math.floor((scrollTop - list.top) / itemHeight),\r\n firstVisibleDataItem = list.items[firstVisibleDataItemIndex];\r\n\r\n if (firstVisibleDataItem && firstVisibleDataItem.item) {\r\n var firstVisibleGroup = firstVisibleDataItem.group;\r\n\r\n if (firstVisibleGroup !== group) {\r\n var fixedGroupText = firstVisibleGroup || \"\";\r\n this.header.html(this.templates.fixedGroupTemplate(fixedGroupText));\r\n this.currentVisibleGroup = firstVisibleGroup;\r\n }\r\n }\r\n\r\n return list;\r\n },\r\n\r\n _itemMapper: function(item, index, value) {\r\n var listType = this.options.type,\r\n itemHeight = this.options.itemHeight,\r\n currentIndex = this._focusedIndex,\r\n selected = false,\r\n current = false,\r\n newGroup = false,\r\n group = null,\r\n match = false,\r\n valueGetter = this._valueGetter;\r\n\r\n if (listType === \"group\") {\r\n if (item) {\r\n newGroup = index === 0 || (this._currentGroup !== false && this._currentGroup !== item.group);\r\n this._currentGroup = item.group;\r\n }\r\n\r\n group = item ? item.group : null;\r\n item = item ? item.item : null;\r\n }\r\n\r\n if (this.options.mapValueTo === \"dataItem\" && this._selectedDataItems.length && item) {\r\n for (var i = 0; i < this._selectedDataItems.length; i++) {\r\n match = valueGetter(this._selectedDataItems[i]) === valueGetter(item);\r\n if (match) {\r\n selected = true;\r\n break;\r\n }\r\n }\r\n } else if (!this.isFiltered() && value.length && item) {\r\n for (var j = 0; j < value.length; j++) {\r\n match = isPrimitive(item) ? value[j] === item : value[j] === valueGetter(item);\r\n if (match) {\r\n value.splice(j , 1);\r\n selected = true;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (currentIndex === index) {\r\n current = true;\r\n }\r\n\r\n return {\r\n item: item ? item : null,\r\n group: group,\r\n newGroup: newGroup,\r\n selected: selected,\r\n current: current,\r\n index: index,\r\n top: index * itemHeight\r\n };\r\n },\r\n\r\n _range: function(index) {\r\n var itemCount = this.itemCount,\r\n value = this._values.slice(),\r\n items = [],\r\n item;\r\n\r\n this._view = {};\r\n this._currentGroup = false;\r\n\r\n for (var i = index, length = index + itemCount; i < length; i++) {\r\n item = this._itemMapper(this.getter(i, index), i, value);\r\n if (items[items.length - 1]) {\r\n items[items.length - 1].isLastGroupedItem = item.newGroup;\r\n }\r\n items.push(item);\r\n this._view[item.index] = item;\r\n }\r\n\r\n this._dataView = items;\r\n return items;\r\n },\r\n\r\n _getDataItemsCollection: function(scrollTop, lastScrollTop) {\r\n var items = this._range(this._listIndex(scrollTop, lastScrollTop));\r\n return {\r\n index: items.length ? items[0].index : 0,\r\n top: items.length ? items[0].top : 0,\r\n items: items\r\n };\r\n },\r\n\r\n _listItems: function() {\r\n var screenHeight = this._screenHeight,\r\n options = this.options;\r\n\r\n var theValidator = listValidator(options, screenHeight);\r\n\r\n return (function(value, force) {\r\n var result = this.result,\r\n lastScrollTop = this._lastScrollTop;\r\n\r\n if (force || !result || !theValidator(result, value, lastScrollTop)) {\r\n result = this._getDataItemsCollection(value, lastScrollTop);\r\n }\r\n\r\n this._lastScrollTop = value;\r\n this.result = result;\r\n\r\n return result;\r\n }).bind(this);\r\n },\r\n\r\n _whenChanged: function(getter, callback) {\r\n var current;\r\n\r\n return function(force) {\r\n var theNew = getter(force);\r\n\r\n if (theNew !== current) {\r\n current = theNew;\r\n callback(theNew, force);\r\n }\r\n };\r\n },\r\n\r\n _reorderList: function(list, reorder) {\r\n var that = this;\r\n var length = list.length;\r\n var currentOffset = -Infinity;\r\n reorder = map2(reorder, this.templates).bind(this);\r\n\r\n return function(list2, offset, force) {\r\n var diff = offset - currentOffset;\r\n var range, range2;\r\n\r\n if (force || Math.abs(diff) >= length) { // full reorder\r\n range = list;\r\n range2 = list2;\r\n } else { // partial reorder\r\n range = reshift(list, diff);\r\n range2 = diff > 0 ? list2.slice(-diff) : list2.slice(0, -diff);\r\n }\r\n\r\n reorder(range, range2, that.bound());\r\n\r\n currentOffset = offset;\r\n };\r\n },\r\n\r\n _bufferSizes: function() {\r\n var options = this.options;\r\n\r\n return bufferSizes(this._screenHeight, options.listScreens, options.oppositeBuffer);\r\n },\r\n\r\n _indexConstraint: function(position) {\r\n var itemCount = this.itemCount,\r\n itemHeight = this.options.itemHeight,\r\n total = this.dataSource.total();\r\n\r\n return Math.min(Math.max(total - itemCount, 0), Math.max(0, Math.floor(position / itemHeight )));\r\n },\r\n\r\n _listIndex: function(scrollTop, lastScrollTop) {\r\n var buffers = this._bufferSizes(),\r\n position;\r\n\r\n position = scrollTop - ((scrollTop > lastScrollTop) ? buffers.down : buffers.up);\r\n\r\n return this._indexConstraint(position);\r\n },\r\n\r\n _selectable: function() {\r\n var itemClass = this.options.columns && this.options.columns.length ? TABLE_ITEM : LIST_ITEM;\r\n\r\n if (this.options.selectable) {\r\n this._selectProxy = this._clickHandler.bind(this);\r\n this.element.on(CLICK + VIRTUAL_LIST_NS, \".\" + itemClass, this._selectProxy);\r\n }\r\n },\r\n\r\n getElementIndex: function(element) {\r\n if (!(element instanceof jQuery)) {\r\n return undefined$1;\r\n }\r\n\r\n return parseInt(element.attr(\"data-offset-index\"), 10);\r\n },\r\n\r\n _getIndecies: function(candidate) {\r\n var result = [], data;\r\n\r\n if (typeof candidate === \"function\") {\r\n data = this.dataSource.flatView();\r\n for (var idx = 0; idx < data.length; idx++) {\r\n if (candidate(data[idx])) {\r\n result.push(idx);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (typeof candidate === \"number\") {\r\n result.push(candidate);\r\n }\r\n\r\n var elementIndex = this.getElementIndex(candidate);\r\n if (!isNaN(elementIndex)) {\r\n result.push(elementIndex);\r\n }\r\n\r\n if (candidate instanceof Array) {\r\n result = candidate;\r\n }\r\n\r\n return result;\r\n },\r\n\r\n _deselect: function(indices) {\r\n var removed = [],\r\n selectedIndex,\r\n dataItem,\r\n selectedIndexes = this._selectedIndexes,\r\n selectedDataItems = this._selectedDataItems,\r\n position = 0,\r\n selectable = this.options.selectable,\r\n removedindexesCounter = 0,\r\n valueGetter = this._valueGetter,\r\n item, match,\r\n result = null;\r\n\r\n indices = indices.slice();\r\n\r\n if (selectable === true || !indices.length) { //deselect everything\r\n for (var idx = 0; idx < selectedIndexes.length; idx++) {\r\n if (selectedIndexes[idx] !== undefined$1) {\r\n this._getElementByIndex(selectedIndexes[idx]).removeClass(SELECTED);\r\n } else if (selectedDataItems[idx]) {\r\n this._getElementByDataItem(selectedDataItems[idx]).removeClass(SELECTED);\r\n }\r\n\r\n removed.push({\r\n index: selectedIndexes[idx],\r\n position: idx,\r\n dataItem: selectedDataItems[idx]\r\n });\r\n }\r\n\r\n this._values = [];\r\n this._selectedDataItems = [];\r\n this._selectedIndexes = [];\r\n } else if (selectable === \"multiple\") {\r\n for (var i = 0; i < indices.length; i++) {\r\n result = null;\r\n position = $.inArray(indices[i], selectedIndexes);\r\n dataItem = this.dataItemByIndex(indices[i]);\r\n\r\n if (position === -1 && dataItem) {\r\n for (var j = 0; j < selectedDataItems.length; j++) {\r\n match = isPrimitive(dataItem) ? selectedDataItems[j] === dataItem : valueGetter(selectedDataItems[j]) === valueGetter(dataItem);\r\n if (match) {\r\n item = this._getElementByIndex(indices[i]);\r\n result = this._deselectSingleItem(item, j, indices[i], removedindexesCounter);\r\n }\r\n }\r\n } else {\r\n selectedIndex = selectedIndexes[position];\r\n\r\n if (selectedIndex !== undefined$1) {\r\n item = this._getElementByIndex(selectedIndex);\r\n result = this._deselectSingleItem(item, position, selectedIndex, removedindexesCounter);\r\n }\r\n }\r\n\r\n if (result) {\r\n indices.splice(i, 1);\r\n removed.push(result);\r\n\r\n removedindexesCounter++;\r\n i--;\r\n }\r\n }\r\n }\r\n\r\n return {\r\n indices: indices,\r\n removed: removed\r\n };\r\n },\r\n\r\n _deselectSingleItem: function(item, position, selectedIndex, removedindexesCounter) {\r\n var dataItem;\r\n\r\n if (!item.hasClass(SELECTED)) {\r\n return;\r\n }\r\n\r\n item.removeClass(SELECTED);\r\n this._values.splice(position, 1);\r\n this._selectedIndexes.splice(position, 1);\r\n dataItem = this._selectedDataItems.splice(position, 1)[0];\r\n\r\n return {\r\n index: selectedIndex,\r\n position: position + removedindexesCounter,\r\n dataItem: dataItem\r\n };\r\n },\r\n\r\n _deselectCurrentValues: function(indices) {\r\n var children = this.element[0].children;\r\n var value, index, position;\r\n var values = this._values;\r\n var removed = [];\r\n var idx = 0;\r\n var j;\r\n\r\n if (this.options.selectable !== \"multiple\" || !this.isFiltered()) {\r\n return [];\r\n }\r\n\r\n if (indices[0] === -1) {\r\n $(children).removeClass(SELECTED);\r\n removed = $.map(this._selectedDataItems.slice(0), function(dataItem, idx) {\r\n return {\r\n dataItem: dataItem,\r\n position: idx\r\n };\r\n });\r\n this._selectedIndexes = [];\r\n this._selectedDataItems = [];\r\n this._values = [];\r\n return removed;\r\n }\r\n\r\n for (; idx < indices.length; idx++) {\r\n position = -1;\r\n index = indices[idx];\r\n if (this.dataItemByIndex(index)) {\r\n value = this._valueGetter(this.dataItemByIndex(index));\r\n }\r\n\r\n for (j = 0; j < values.length; j++) {\r\n if (value == values[j]) {\r\n position = j;\r\n break;\r\n }\r\n }\r\n\r\n if (position > -1) {\r\n removed.push(this.removeAt(position));\r\n $(children[index]).removeClass(SELECTED);\r\n }\r\n }\r\n\r\n return removed;\r\n },\r\n\r\n _getSkip: function(index, take) {\r\n var page = index < take ? 1 : Math.floor(index / take) + 1;\r\n\r\n return (page - 1) * take;\r\n },\r\n\r\n _select: function(indexes) {\r\n var that = this,\r\n singleSelection = this.options.selectable !== \"multiple\",\r\n dataSource = this.dataSource,\r\n dataItem, oldSkip,\r\n take = this.itemCount,\r\n valueGetter = this._valueGetter,\r\n added = [];\r\n\r\n if (singleSelection) {\r\n that._selectedIndexes = [];\r\n that._selectedDataItems = [];\r\n that._values = [];\r\n }\r\n\r\n oldSkip = dataSource.skip();\r\n\r\n $.each(indexes, function(_, index) {\r\n var skip = that._getSkip(index, take);\r\n\r\n that.mute(function() {\r\n dataSource.range(skip, take); //switch the range to get the dataItem\r\n\r\n dataItem = that._findDataItem(dataSource.view(), [index - skip]);\r\n that._selectedIndexes.push(index);\r\n that._selectedDataItems.push(dataItem);\r\n that._values.push(isPrimitive(dataItem) ? dataItem : valueGetter(dataItem));\r\n\r\n added.push({\r\n index: index,\r\n dataItem: dataItem\r\n });\r\n\r\n that._getElementByIndex(index).addClass(SELECTED);\r\n\r\n dataSource.range(oldSkip, take); //switch back the range\r\n });\r\n });\r\n\r\n that._values = that._checkValuesOrder(that._values);\r\n\r\n return added;\r\n },\r\n\r\n _clickHandler: function(e) {\r\n var item = $(e.currentTarget);\r\n\r\n if (!e.isDefaultPrevented() && item.attr(\"data-uid\")) {\r\n this.trigger(CLICK, { item: item });\r\n }\r\n },\r\n\r\n _buildValueGetter: function() {\r\n this._valueGetter = kendo.getter(this.options.dataValueField);\r\n },\r\n\r\n _calculateGroupPadding: function(height) {\r\n var firstItem = this.items().first(),\r\n groupHeader = this.header,\r\n padding = 0;\r\n\r\n if (groupHeader[0] && groupHeader[0].style.display !== \"none\") {\r\n if (height !== \"auto\") {\r\n padding = kendo.support.scrollbar();\r\n }\r\n\r\n padding += parseFloat(firstItem.css(\"border-right-width\"), 10) + parseFloat(firstItem.children(\".k-group\").css(\"right\"), 10);\r\n\r\n groupHeader.css(\"padding-right\", padding);\r\n }\r\n },\r\n\r\n _calculateColumnsHeaderPadding: function() {\r\n if (this.options.columns && this.options.columns.length) {\r\n var isRtl = kendo.support.isRtl(this.wrapper);\r\n var scrollbar = kendo.support.scrollbar();\r\n var columnsHeader = this.content.parent().parent().find(\".k-table-header\");\r\n var total = this.dataSource.total();\r\n\r\n columnsHeader.css((isRtl ? \"padding-left\" : \"padding-right\"), total ? scrollbar : 0);\r\n }\r\n }\r\n\r\n });\r\n\r\n kendo.ui.VirtualList = VirtualList;\r\n kendo.ui.plugin(VirtualList);\r\n\r\n })(window.kendo.jQuery);\r\n var kendo$1S = kendo;\r\n\r\n let $$4 = kendo.jQuery;\r\n\r\n function addInputPrefixSuffixContainers({ widget, wrapper, options, prefixInsertBefore, suffixInsertAfter }) {\r\n var prefix = options.prefixOptions,\r\n suffix = options.suffixOptions,\r\n hasPrefixContent = prefix.template || prefix.icon,\r\n hasSuffixContent = suffix.template || suffix.icon,\r\n suffixInsertAfter = suffixInsertAfter || prefixInsertBefore,\r\n layoutFlow = options.layoutFlow,\r\n containerOrientation = layoutFlow ? (layoutFlow == \"vertical\" ? \"horizontal\" : \"vertical\") : \"horizontal\",\r\n separatorOrientation = layoutFlow == \"vertical\" ? \"horizontal\" : \"vertical\",\r\n INPUT_SEPARATOR = ``,\r\n prefixContainer,\r\n suffixContainer;\r\n\r\n if (prefix && hasPrefixContent) {\r\n prefixContainer = wrapper.children(\".k-input-prefix\");\r\n\r\n if (!prefixContainer[0]) {\r\n prefixContainer = $$4(``);\r\n if (prefixInsertBefore) {\r\n prefixContainer.insertBefore(prefixInsertBefore);\r\n } else {\r\n prefixContainer.prependTo(wrapper);\r\n }\r\n }\r\n\r\n if (prefix.icon) {\r\n prefixContainer.html(kendo.html.renderIcon({ icon: prefix.icon }));\r\n }\r\n\r\n if (prefix.template) {\r\n prefixContainer.html(kendo.template(prefix.template)({}));\r\n }\r\n\r\n if (prefix.separator) {\r\n $$4(INPUT_SEPARATOR).insertAfter(prefixContainer);\r\n }\r\n }\r\n\r\n if (suffix && hasSuffixContent) {\r\n suffixContainer = wrapper.children(\".k-input-suffix\");\r\n\r\n if (!suffixContainer[0]) {\r\n suffixContainer = $$4(``).appendTo(wrapper);\r\n if (suffixInsertAfter) {\r\n suffixContainer.insertAfter(suffixInsertAfter);\r\n } else {\r\n suffixContainer.appendTo(wrapper);\r\n }\r\n }\r\n\r\n if (suffix.icon) {\r\n suffixContainer.html(kendo.html.renderIcon({ icon: suffix.icon }));\r\n }\r\n\r\n if (suffix.template) {\r\n suffixContainer.html(kendo.template(suffix.template)({}));\r\n }\r\n\r\n if (suffix.separator) {\r\n $$4(INPUT_SEPARATOR).insertBefore(suffixContainer);\r\n }\r\n }\r\n\r\n widget._prefixContainer = prefixContainer;\r\n widget._suffixContainer = suffixContainer;\r\n }\r\n\r\n var __meta__$1R = {\r\n id: \"autocomplete\",\r\n name: \"AutoComplete\",\r\n category: \"web\",\r\n description: \"The AutoComplete widget provides suggestions depending on the typed text.It also allows multiple value entries.\",\r\n depends: [ \"list\" ],\r\n features: [ {\r\n id: \"mobile-scroller\",\r\n name: \"Mobile scroller\",\r\n description: \"Support for kinetic scrolling in mobile device\",\r\n depends: [ \"mobile.scroller\" ]\r\n }, {\r\n id: \"virtualization\",\r\n name: \"VirtualList\",\r\n description: \"Support for virtualization\",\r\n depends: [ \"virtuallist\" ]\r\n } ]\r\n };\r\n\r\n (function($, undefined$1) {\r\n var kendo = window.kendo,\r\n encode = kendo.htmlEncode,\r\n support = kendo.support,\r\n caret = kendo.caret,\r\n activeElement = kendo._activeElement,\r\n placeholderSupported = support.placeholder,\r\n ui = kendo.ui,\r\n List = ui.List,\r\n keys = kendo.keys,\r\n DataSource = kendo.data.DataSource,\r\n ARIA_DISABLED = \"aria-disabled\",\r\n ARIA_READONLY = \"aria-readonly\",\r\n CHANGE = \"change\",\r\n DISABLED = \"disabled\",\r\n READONLY = \"readonly\",\r\n FOCUSED = \"k-focus\",\r\n SELECTED = \"k-selected\",\r\n HIDDENCLASS = \"k-hidden\",\r\n STATEDISABLED = \"k-disabled\",\r\n AUTOCOMPLETEVALUE = \"off\",\r\n HOVER = \"k-hover\",\r\n ns = \".kendoAutoComplete\",\r\n HOVEREVENTS = \"mouseenter\" + ns + \" mouseleave\" + ns;\r\n\r\n function indexOfWordAtCaret(caretIdx, text, separator) {\r\n return separator ? text.substring(0, caretIdx).split(separator).length - 1 : 0;\r\n }\r\n\r\n function wordAtCaret(caretIdx, text, separator) {\r\n return text.split(separator)[indexOfWordAtCaret(caretIdx, text, separator)];\r\n }\r\n\r\n function replaceWordAtCaret(caretIdx, text, word, separator, defaultSeparator) {\r\n var words = text.split(separator);\r\n\r\n words.splice(indexOfWordAtCaret(caretIdx, text, separator), 1, word);\r\n\r\n if (separator && words[words.length - 1] !== \"\") {\r\n words.push(\"\");\r\n }\r\n\r\n return words.join(defaultSeparator);\r\n }\r\n\r\n var AutoComplete = List.extend({\r\n init: function(element, options) {\r\n var that = this, wrapper, disabled;\r\n\r\n that.ns = ns;\r\n options = Array.isArray(options) ? { dataSource: options } : options;\r\n\r\n List.fn.init.call(that, element, options);\r\n\r\n element = that.element;\r\n options = that.options;\r\n\r\n options.placeholder = options.placeholder || element.attr(\"placeholder\");\r\n if (placeholderSupported) {\r\n element.attr(\"placeholder\", options.placeholder);\r\n }\r\n\r\n that._wrapper();\r\n that._loader();\r\n that._clearButton();\r\n\r\n that._dataSource();\r\n that._ignoreCase();\r\n\r\n element[0].type = \"text\";\r\n wrapper = that.wrapper;\r\n\r\n that._popup();\r\n\r\n element\r\n .addClass(\"k-input-inner\")\r\n .on(\"keydown\" + ns, that._keydown.bind(that))\r\n .on(\"keypress\" + ns, that._keypress.bind(that))\r\n .on(\"input\" + ns, that._search.bind(that))\r\n .on(\"paste\" + ns, that._search.bind(that))\r\n .on(\"focus\" + ns, function() {\r\n that._prev = that._accessor();\r\n that._oldText = that._prev;\r\n that._placeholder(false);\r\n wrapper.addClass(FOCUSED);\r\n })\r\n .on(\"focusout\" + ns, function(ev) {\r\n if (that.filterInput && ev.relatedTarget === that.filterInput[0]) {\r\n return;\r\n }\r\n\r\n that._change();\r\n that._placeholder();\r\n that.close();\r\n wrapper.removeClass(FOCUSED);\r\n })\r\n .attr({\r\n autocomplete: AUTOCOMPLETEVALUE,\r\n role: \"combobox\",\r\n \"aria-expanded\": false\r\n });\r\n\r\n that._clear.on(\"click\" + ns + \" touchend\" + ns, that._clearValue.bind(that));\r\n that._clear.on(\"mousedown\" + ns, that._clearValueMouseDownHandler.bind(that));\r\n that._enable();\r\n\r\n that._old = that._accessor();\r\n\r\n that._placeholder();\r\n\r\n that._initList();\r\n\r\n disabled = $(that.element).parents(\"fieldset\").is(':disabled');\r\n\r\n if (disabled) {\r\n that.enable(false);\r\n }\r\n\r\n that.listView.bind(\"click\", function(e) { e.preventDefault(); });\r\n\r\n that._resetFocusItemHandler = that._resetFocusItem.bind(that);\r\n\r\n addInputPrefixSuffixContainers({ widget: that, wrapper: that.wrapper, options: that.options, prefixInsertBefore: that._inputValuesContainer, suffixInsertAfter: that._loading });\r\n\r\n kendo.notify(that);\r\n that._toggleCloseVisibility();\r\n that._applyCssClasses();\r\n\r\n if (options.label) {\r\n that._label();\r\n }\r\n\r\n that._aria();\r\n },\r\n\r\n options: {\r\n name: \"AutoComplete\",\r\n enabled: true,\r\n suggest: false,\r\n template: \"\",\r\n groupTemplate: (data) => encode(data),\r\n fixedGroupTemplate: (data) => encode(data),\r\n prefixOptions: {\r\n separator: true\r\n },\r\n suffixOptions: {\r\n separator: true\r\n },\r\n dataTextField: \"\",\r\n minLength: 1,\r\n enforceMinLength: false,\r\n delay: 200,\r\n height: 200,\r\n filter: \"startswith\",\r\n ignoreCase: true,\r\n highlightFirst: false,\r\n separator: null,\r\n placeholder: \"\",\r\n animation: {},\r\n virtual: false,\r\n value: null,\r\n clearButton: true,\r\n autoWidth: false,\r\n popup: null,\r\n size: \"medium\",\r\n fillMode: \"solid\",\r\n rounded: \"medium\",\r\n label: null,\r\n },\r\n\r\n _clearValueMouseDownHandler: function(ev) {\r\n var that = this;\r\n\r\n if (ev && ev.currentTarget && ev.currentTarget.classList.contains('k-clear-value')) {\r\n that._clearValueTrigger = true;\r\n } else {\r\n that._clearValueTrigger = false;\r\n }\r\n },\r\n\r\n _onActionSheetCreate: function() {\r\n var that = this;\r\n\r\n if (that.filterInput) {\r\n that.filterInput\r\n .on(\"keydown\" + ns, that._keydown.bind(that))\r\n .on(\"keypress\" + ns, that._keypress.bind(that))\r\n .on(\"input\" + ns, that._search.bind(that))\r\n .on(\"paste\" + ns, that._search.bind(that))\r\n .attr({\r\n autocomplete: AUTOCOMPLETEVALUE,\r\n role: \"combobox\",\r\n \"aria-expanded\": false\r\n });\r\n\r\n that.popup.bind(\"activate\", () => {\r\n that.filterInput.val(that.element.val());\r\n that.filterInput.trigger(\"focus\");\r\n });\r\n\r\n that.popup.bind(\"deactivate\", () => {\r\n that.element.trigger(\"focus\");\r\n });\r\n }\r\n },\r\n\r\n _onCloseButtonPressed: function() {\r\n var that = this;\r\n\r\n if (that.filterInput && activeElement() === that.filterInput[0]) {\r\n that.element.val(that.filterInput.val());\r\n }\r\n },\r\n\r\n _popup: function() {\r\n List.fn._popup.call(this);\r\n this.popup.element.addClass(\"k-autocomplete-popup\");\r\n },\r\n\r\n _dataSource: function() {\r\n var that = this;\r\n\r\n if (that.dataSource && that._refreshHandler) {\r\n that._unbindDataSource();\r\n } else {\r\n that._progressHandler = that._showBusy.bind(that);\r\n that._errorHandler = that._hideBusy.bind(that);\r\n }\r\n\r\n that.dataSource = DataSource.create(that.options.dataSource)\r\n .bind(\"progress\", that._progressHandler)\r\n .bind(\"error\", that._errorHandler);\r\n },\r\n\r\n setDataSource: function(dataSource) {\r\n this.options.dataSource = dataSource;\r\n this._dataSource();\r\n\r\n this.listView.setDataSource(this.dataSource);\r\n },\r\n\r\n events: [\r\n \"open\",\r\n \"close\",\r\n CHANGE,\r\n \"select\",\r\n \"filtering\",\r\n \"dataBinding\",\r\n \"dataBound\"\r\n ],\r\n\r\n setOptions: function(options) {\r\n var listOptions = this._listOptions(options);\r\n\r\n List.fn.setOptions.call(this, options);\r\n\r\n this.listView.setOptions(listOptions);\r\n this._accessors();\r\n this._aria();\r\n this._clearButton();\r\n },\r\n\r\n _listOptions: function(options) {\r\n var listOptions = List.fn._listOptions.call(this, $.extend(options, {\r\n skipUpdateOnBind: true\r\n }));\r\n\r\n listOptions.dataValueField = listOptions.dataTextField;\r\n listOptions.selectedItemChange = null;\r\n\r\n return listOptions;\r\n },\r\n\r\n _editable: function(options) {\r\n var that = this,\r\n element = that.element,\r\n wrapper = that.wrapper.off(ns),\r\n readonly = options.readonly,\r\n disable = options.disable;\r\n\r\n if (!readonly && !disable) {\r\n wrapper\r\n .removeClass(STATEDISABLED)\r\n .on(HOVEREVENTS, that._toggleHover);\r\n\r\n element.prop(DISABLED, false)\r\n .prop(READONLY, false)\r\n .attr(ARIA_DISABLED, false)\r\n .attr(ARIA_READONLY, false);\r\n } else {\r\n wrapper\r\n .addClass(disable ? STATEDISABLED : \"\")\r\n .removeClass(disable ? \"\" : STATEDISABLED);\r\n\r\n element.attr(DISABLED, disable)\r\n .attr(READONLY, readonly)\r\n .attr(ARIA_DISABLED, disable)\r\n .attr(ARIA_READONLY, readonly);\r\n }\r\n\r\n that._toggleCloseVisibility();\r\n },\r\n\r\n close: function() {\r\n var that = this;\r\n var current = that.listView.focus();\r\n\r\n if (current) {\r\n current.removeClass(SELECTED);\r\n }\r\n\r\n that.popup.close();\r\n that._deactivateItem();\r\n },\r\n\r\n destroy: function() {\r\n var that = this;\r\n\r\n that.element.off(ns);\r\n that._clear.off(ns);\r\n that.wrapper.off(ns);\r\n\r\n if (that.filterInput) {\r\n that.filterInput.off(ns);\r\n }\r\n\r\n List.fn.destroy.call(that);\r\n },\r\n\r\n refresh: function() {\r\n this.listView.refresh();\r\n },\r\n\r\n select: function(li) {\r\n this._select(li);\r\n },\r\n\r\n search: function(word) {\r\n var that = this,\r\n options = that.options,\r\n ignoreCase = options.ignoreCase,\r\n separator = that._separator(),\r\n length,\r\n accentFoldingFiltering = that.dataSource.options.accentFoldingFiltering,\r\n element = that.filterInput && activeElement() === that.filterInput[0] ? that.filterInput : that.element;\r\n\r\n word = word || that._accessor();\r\n\r\n clearTimeout(that._typingTimeout);\r\n\r\n if (separator) {\r\n word = wordAtCaret(caret(element)[0], word, separator);\r\n }\r\n\r\n length = word.length;\r\n\r\n if ((!options.enforceMinLength && !length) || length >= options.minLength) {\r\n that._open = true;\r\n\r\n that._mute(function() {\r\n this.listView.value([]);\r\n });\r\n\r\n that._filterSource({\r\n value: ignoreCase ? (accentFoldingFiltering ? word.toLocaleLowerCase(accentFoldingFiltering) : word.toLowerCase()) : word,\r\n operator: options.filter,\r\n field: options.dataTextField,\r\n ignoreCase: ignoreCase\r\n });\r\n\r\n that.one(\"close\", that._unifySeparators.bind(that));\r\n }\r\n that._toggleCloseVisibility();\r\n },\r\n\r\n suggest: function(word) {\r\n var that = this,\r\n key = that._last,\r\n value = that._accessor(),\r\n element = that.element[0],\r\n caretIdx = caret(element)[0],\r\n separator = that._separator(),\r\n words = value.split(separator),\r\n wordIndex = indexOfWordAtCaret(caretIdx, value, separator),\r\n selectionEnd = caretIdx,\r\n idx,\r\n accentFoldingFiltering = that.dataSource.options.accentFoldingFiltering;\r\n\r\n if (key == keys.BACKSPACE || key == keys.DELETE) {\r\n that._last = undefined$1;\r\n return;\r\n }\r\n\r\n word = word || \"\";\r\n\r\n if (typeof word !== \"string\") {\r\n if (word[0]) {\r\n word = that.dataSource.view()[List.inArray(word[0], that.ul[0])];\r\n }\r\n\r\n word = word ? that._text(word) : \"\";\r\n }\r\n\r\n if (caretIdx <= 0) {\r\n caretIdx = (accentFoldingFiltering ? value.toLocaleLowerCase(accentFoldingFiltering) : value.toLowerCase()).indexOf(accentFoldingFiltering ? word.toLocaleLowerCase(accentFoldingFiltering) : word.toLowerCase()) + 1;\r\n }\r\n\r\n idx = value.substring(0, caretIdx).lastIndexOf(separator);\r\n idx = idx > -1 ? caretIdx - (idx + separator.length) : caretIdx;\r\n value = words[wordIndex].substring(0, idx);\r\n\r\n if (word) {\r\n word = word.toString();\r\n idx = (accentFoldingFiltering ? word.toLocaleLowerCase(accentFoldingFiltering) : word.toLowerCase()).indexOf(accentFoldingFiltering ? value.toLocaleLowerCase(accentFoldingFiltering) : value.toLowerCase());\r\n if (idx > -1) {\r\n word = word.substring(idx + value.length);\r\n\r\n selectionEnd = caretIdx + word.length;\r\n\r\n value += word;\r\n }\r\n\r\n if (separator && words[words.length - 1] !== \"\") {\r\n words.push(\"\");\r\n }\r\n\r\n }\r\n\r\n words[wordIndex] = value;\r\n\r\n that._accessor(words.join(separator || \"\"));\r\n\r\n if (element === activeElement()) {\r\n caret(element, caretIdx, selectionEnd);\r\n }\r\n },\r\n\r\n value: function(value) {\r\n if (value !== undefined$1) {\r\n this.listView.value(value);\r\n\r\n this._accessor(value);\r\n this._old = this._accessor();\r\n this._oldText = this._accessor();\r\n } else {\r\n return this._accessor();\r\n }\r\n this._toggleCloseVisibility();\r\n this._refreshFloatingLabel();\r\n },\r\n\r\n _click: function(e) {\r\n var item = e.item;\r\n var that = this;\r\n var element = that.element;\r\n var dataItem = that.listView.dataItemByIndex(that.listView.getElementIndex(item));\r\n\r\n e.preventDefault();\r\n\r\n that._active = true;\r\n\r\n if (that.trigger(\"select\", { dataItem: dataItem, item: item })) {\r\n that.close();\r\n return;\r\n }\r\n that._oldText = element.val();\r\n that._select(item).done(function() {\r\n that._blur();\r\n\r\n caret(element, element.val().length);\r\n });\r\n },\r\n\r\n _clearText: $.noop,\r\n\r\n _highlightFirst: function() {\r\n var index = this.options.highlightFirst ? 0 : -1;\r\n\r\n this.listView.focus(index);\r\n },\r\n\r\n _resetFocusItem: function() {\r\n if (this.options.virtual) {\r\n this.listView.scrollTo(0);\r\n }\r\n\r\n this._highlightFirst();\r\n },\r\n\r\n _listBound: function() {\r\n var that = this;\r\n var popup = that.popup;\r\n var options = that.options;\r\n var data = that.dataSource.flatView();\r\n var length = data.length;\r\n var groupsLength = that.dataSource._group ? that.dataSource._group.length : 0;\r\n var isActive = that.element[0] === activeElement() || that.filterInput && that.filterInput[0] === activeElement();\r\n var action;\r\n\r\n that._renderFooter();\r\n that._renderNoData();\r\n that._toggleNoData(!length);\r\n that._toggleHeader(!!groupsLength && !!length);\r\n\r\n that._resizePopup();\r\n\r\n popup.position();\r\n\r\n if (length) {\r\n if (options.suggest && isActive && that._inputValue()) {\r\n that.suggest(data[0]);\r\n }\r\n\r\n that._highlightFirst();\r\n }\r\n\r\n if (that._open) {\r\n that._open = false;\r\n action = that._allowOpening() ? \"open\" : \"close\";\r\n\r\n if (that._typingTimeout && !isActive) {\r\n action = \"close\";\r\n }\r\n\r\n if (length) {\r\n that._resetFocusItem();\r\n\r\n if (options.virtual) {\r\n that.popup\r\n .unbind(\"activate\", that._resetFocusItemHandler)\r\n .one(\"activate\", that._resetFocusItemHandler);\r\n }\r\n }\r\n\r\n popup[action]();\r\n that._typingTimeout = undefined$1;\r\n }\r\n\r\n if (that._touchScroller) {\r\n that._touchScroller.reset();\r\n }\r\n\r\n that._hideBusy();\r\n\r\n that.trigger(\"dataBound\");\r\n },\r\n\r\n _mute: function(callback) {\r\n this._muted = true;\r\n callback.call(this);\r\n this._muted = false;\r\n },\r\n\r\n _listChange: function() {\r\n var isActive = this._active || this.element[0] === activeElement();\r\n\r\n if (isActive && !this._muted) {\r\n this._selectValue(this.listView.selectedDataItems()[0]);\r\n }\r\n },\r\n\r\n _selectValue: function(dataItem) {\r\n var separator = this._separator();\r\n var text = \"\";\r\n\r\n if (dataItem) {\r\n text = this._text(dataItem);\r\n }\r\n\r\n if (text === null) {\r\n text = \"\";\r\n }\r\n\r\n if (separator) {\r\n text = replaceWordAtCaret(caret(this.element)[0], this._accessor(), text, separator, this._defaultSeparator());\r\n }\r\n\r\n this._prev = text;\r\n this._accessor(text);\r\n this._placeholder();\r\n },\r\n\r\n _unifySeparators: function() {\r\n this._accessor(this.value().split(this._separator()).join(this._defaultSeparator()));\r\n return this;\r\n },\r\n\r\n _preselect: function(value, text) {\r\n this._inputValue(text);\r\n this._accessor(value);\r\n\r\n this._old = this.oldText = this._accessor();\r\n\r\n this.listView.setValue(value);\r\n this._placeholder();\r\n },\r\n\r\n _change: function() {\r\n var that = this;\r\n var value = that._unifySeparators().value();\r\n var trigger = value !== List.unifyType(that._old, typeof value);\r\n\r\n var valueUpdated = trigger && !that._typing;\r\n var itemSelected = that._oldText !== value;\r\n var clearValueTrigger = that._clearValueTrigger;\r\n\r\n that._old = value;\r\n that._oldText = value;\r\n\r\n if (that.filterInput && activeElement() === that.filterInput[0]) {\r\n that.element.val(that.filterInput.val());\r\n }\r\n\r\n if ((valueUpdated || itemSelected) && !clearValueTrigger) {\r\n // trigger the DOM change event so any subscriber gets notified\r\n that.element.trigger(CHANGE);\r\n }\r\n\r\n if (trigger && !clearValueTrigger) {\r\n that.trigger(CHANGE);\r\n }\r\n\r\n that.typing = false;\r\n that._toggleCloseVisibility();\r\n },\r\n\r\n _accessor: function(value) {\r\n var that = this,\r\n element = that.filterInput && activeElement() === that.filterInput[0] ? that.filterInput[0] : that.element[0];\r\n\r\n if (value !== undefined$1) {\r\n element.value = value === null ? \"\" : value;\r\n that._placeholder();\r\n } else {\r\n value = element.value;\r\n\r\n if (element.className.indexOf(\"k-readonly\") > -1) {\r\n if (value === that.options.placeholder) {\r\n return \"\";\r\n } else {\r\n return value;\r\n }\r\n }\r\n\r\n return value;\r\n }\r\n },\r\n\r\n _keydown: function(e) {\r\n var that = this;\r\n var key = e.keyCode;\r\n var listView = that.listView;\r\n var visible = that.popup.visible();\r\n var current = listView.focus();\r\n\r\n that._last = key;\r\n\r\n if (key === keys.DOWN) {\r\n if (visible) {\r\n this._move(current ? \"focusNext\" : \"focusFirst\");\r\n } else if (that.value()) {\r\n that._filterSource({\r\n value: that.ignoreCase ? that.value().toLowerCase() : that.value(),\r\n operator: that.options.filter,\r\n field: that.options.dataTextField,\r\n ignoreCase: that.ignoreCase\r\n }).done(function() {\r\n if (that._allowOpening()) {\r\n that._resetFocusItem();\r\n that.popup.open();\r\n }\r\n });\r\n }\r\n e.preventDefault();\r\n } else if (key === keys.ESC ) {\r\n if (visible) {\r\n e.preventDefault();\r\n that.close();\r\n } else {\r\n that._clearValue();\r\n }\r\n } else if (e.altKey && key === keys.UP && visible) {\r\n e.preventDefault();\r\n that.close();\r\n } else if (key === keys.UP) {\r\n if (visible) {\r\n this._move(current ? \"focusPrev\" : \"focusLast\");\r\n }\r\n e.preventDefault();\r\n } else if (key === keys.HOME) {\r\n this._move(\"focusFirst\");\r\n } else if (key === keys.END) {\r\n this._move(\"focusLast\");\r\n } else if (key === keys.ENTER || key === keys.TAB) {\r\n\r\n if (key === keys.ENTER && visible) {\r\n e.preventDefault();\r\n }\r\n\r\n if (visible && current) {\r\n var dataItem = listView.dataItemByIndex(listView.getElementIndex(current));\r\n if (that.trigger(\"select\", { dataItem: dataItem, item: current })) {\r\n return;\r\n }\r\n\r\n this._select(current);\r\n }\r\n\r\n this._blur();\r\n } else if (that.popup.visible() && (key === keys.PAGEDOWN || key === keys.PAGEUP)) {\r\n e.preventDefault();\r\n\r\n var direction = key === keys.PAGEDOWN ? 1 : -1;\r\n listView.scrollWith(direction * listView.screenHeight());\r\n } else {\r\n // In some cases when the popup is opened resize is triggered which will cause it to close\r\n // Setting the below flag will prevent this from happening\r\n that.popup._hovered = true;\r\n that._search();\r\n }\r\n },\r\n\r\n _keypress: function() {\r\n this._oldText = this.element.val();\r\n this._typing = true;\r\n },\r\n\r\n _move: function(action) {\r\n this.listView[action]();\r\n\r\n if (this.options.suggest) {\r\n this.suggest(this.listView.focus());\r\n }\r\n },\r\n\r\n _hideBusy: function() {\r\n var that = this;\r\n clearTimeout(that._busy);\r\n that._loading.addClass(HIDDENCLASS);\r\n that.element.attr(\"aria-busy\", false);\r\n that._busy = null;\r\n that._toggleCloseVisibility();\r\n },\r\n\r\n _showBusy: function() {\r\n var that = this;\r\n\r\n if (that._busy) {\r\n return;\r\n }\r\n\r\n that._busy = setTimeout(function() {\r\n that.element.attr(\"aria-busy\", true);\r\n that._loading.removeClass(HIDDENCLASS);\r\n that._hideClear();\r\n }, 100);\r\n },\r\n\r\n _placeholder: function(show) {\r\n if (placeholderSupported) {\r\n return;\r\n }\r\n\r\n var that = this,\r\n element = that.element,\r\n placeholder = that.options.placeholder,\r\n value;\r\n\r\n if (placeholder) {\r\n value = element.val();\r\n\r\n if (show === undefined$1) {\r\n show = !value;\r\n }\r\n\r\n if (!show) {\r\n if (value !== placeholder) {\r\n placeholder = value;\r\n } else {\r\n placeholder = \"\";\r\n }\r\n }\r\n\r\n if (value === that._old && !show) {\r\n return;\r\n }\r\n\r\n element.toggleClass(\"k-readonly\", show)\r\n .val(placeholder);\r\n\r\n if (!placeholder && element[0] === document.activeElement) {\r\n caret(element[0], 0, 0);\r\n }\r\n }\r\n },\r\n\r\n _separator: function() {\r\n var separator = this.options.separator;\r\n if (separator instanceof Array) {\r\n return new RegExp(separator.join(\"|\"), 'gi');\r\n }\r\n return separator;\r\n },\r\n\r\n _defaultSeparator: function() {\r\n var separator = this.options.separator;\r\n if (separator instanceof Array) {\r\n return separator[0];\r\n }\r\n return separator;\r\n },\r\n\r\n _inputValue: function() {\r\n return this.element.val();\r\n },\r\n\r\n _search: function() {\r\n var that = this;\r\n clearTimeout(that._typingTimeout);\r\n\r\n that._typingTimeout = setTimeout(function() {\r\n if (that._prev !== that._accessor()) {\r\n that._prev = that._accessor();\r\n that.search();\r\n }\r\n }, that.options.delay);\r\n },\r\n\r\n _select: function(candidate) {\r\n var that = this;\r\n that._active = true;\r\n\r\n return that.listView.select(candidate).done(function() {\r\n that._active = false;\r\n });\r\n },\r\n\r\n _loader: function() {\r\n this._loading = $('').insertAfter(this.element);\r\n },\r\n\r\n _clearButton: function() {\r\n List.fn._clearButton.call(this);\r\n\r\n if (this.options.clearButton) {\r\n this._clear.insertAfter(this.element);\r\n }\r\n },\r\n\r\n _toggleHover: function(e) {\r\n $(e.currentTarget).toggleClass(HOVER, e.type === \"mouseenter\");\r\n },\r\n\r\n _toggleCloseVisibility: function() {\r\n var preventShow = this.element.is(\":disabled\") || this.element.is(\"[readonly]\");\r\n\r\n if (this.value() && !preventShow) {\r\n this._showClear();\r\n } else {\r\n this._hideClear();\r\n }\r\n },\r\n\r\n _wrapper: function() {\r\n var that = this,\r\n element = that.element,\r\n DOMelement = element[0],\r\n wrapper;\r\n\r\n wrapper = element.parent();\r\n\r\n if (!wrapper.is(\"span.k-autocomplete\")) {\r\n wrapper = element.wrap(\"\").parent();\r\n }\r\n\r\n wrapper.attr(\"tabindex\", -1);\r\n\r\n wrapper[0].style.cssText = DOMelement.style.cssText;\r\n element.css({\r\n width: \"\",\r\n height: DOMelement.style.height\r\n });\r\n\r\n that._focused = that.element;\r\n that.wrapper = wrapper\r\n .addClass(\"k-autocomplete k-input\")\r\n .addClass(DOMelement.className)\r\n .removeClass('input-validation-error');\r\n },\r\n\r\n _clearValue: function() {\r\n this._clearValueTrigger = false;\r\n List.fn._clearValue.call(this);\r\n this.element.focus();\r\n }\r\n });\r\n\r\n ui.plugin(AutoComplete);\r\n\r\n kendo.cssProperties.registerPrefix(\"AutoComplete\", \"k-input-\");\r\n\r\n kendo.cssProperties.registerValues(\"AutoComplete\", [{\r\n prop: \"rounded\",\r\n values: kendo.cssProperties.roundedValues.concat([['full', 'full']])\r\n }]);\r\n })(window.kendo.jQuery);\r\n var kendo$1R = kendo;\r\n\r\n var __meta__$1Q = {\r\n id: \"dropdownlist\",\r\n name: \"DropDownList\",\r\n category: \"web\",\r\n description: \"The DropDownList widget displays a list of values and allows the selection of a single value from the list.\",\r\n depends: [ \"list\", \"html.button\", \"icons\" ],\r\n features: [ {\r\n id: \"mobile-scroller\",\r\n name: \"Mobile scroller\",\r\n description: \"Support for kinetic scrolling in mobile device\",\r\n depends: [ \"mobile.scroller\" ]\r\n }, {\r\n id: \"virtualization\",\r\n name: \"VirtualList\",\r\n description: \"Support for virtualization\",\r\n depends: [ \"virtuallist\" ]\r\n } ]\r\n };\r\n\r\n (function($, undefined$1) {\r\n var kendo = window.kendo,\r\n encode = kendo.htmlEncode,\r\n ui = kendo.ui,\r\n html = kendo.html,\r\n List = ui.List,\r\n Select = ui.Select,\r\n support = kendo.support,\r\n activeElement = kendo._activeElement,\r\n ObservableObject = kendo.data.ObservableObject,\r\n keys = kendo.keys,\r\n ns = \".kendoDropDownList\",\r\n nsFocusEvent = ns + \"FocusEvent\",\r\n DISABLED = \"disabled\",\r\n READONLY = \"readonly\",\r\n CHANGE = \"change\",\r\n FOCUSED = \"k-focus\",\r\n STATEDISABLED = \"k-disabled\",\r\n ARIA_DISABLED = \"aria-disabled\",\r\n ARIA_READONLY = \"aria-readonly\",\r\n CLICKEVENTS = \"click\" + ns + \" touchend\" + ns,\r\n HOVEREVENTS = \"mouseenter\" + ns + \" mouseleave\" + ns,\r\n TABINDEX = \"tabindex\",\r\n STATE_FILTER = \"filter\",\r\n STATE_ACCEPT = \"accept\",\r\n MSG_INVALID_OPTION_LABEL = \"The `optionLabel` option is not valid due to missing fields. Define a custom optionLabel as shown here http://docs.telerik.com/kendo-ui/api/javascript/ui/dropdownlist#configuration-optionLabel\",\r\n OPEN = \"open\",\r\n CLOSE = \"close\";\r\n\r\n var DropDownList = Select.extend( {\r\n init: function(element, options) {\r\n var that = this;\r\n var index = options && options.index;\r\n var optionLabel, text, disabled;\r\n\r\n that.ns = ns;\r\n options = Array.isArray(options) ? { dataSource: options } : options;\r\n\r\n Select.fn.init.call(that, element, options);\r\n\r\n options = that.options;\r\n element = that.element.on(\"focus\" + ns, that._focusHandler.bind(that));\r\n\r\n that._focusInputHandler = that._focusInput.bind(that);\r\n\r\n that.optionLabel = $();\r\n that._optionLabel();\r\n\r\n that._inputTemplate();\r\n\r\n that._reset();\r\n\r\n that._prev = \"\";\r\n that._word = \"\";\r\n\r\n that._wrapper();\r\n\r\n that._tabindex();\r\n that.wrapper.data(TABINDEX, that.wrapper.attr(TABINDEX));\r\n\r\n that._span();\r\n\r\n that._popup();\r\n\r\n that._mobile();\r\n\r\n that._dataSource();\r\n\r\n that._ignoreCase();\r\n\r\n if (options.label) {\r\n this._label();\r\n }\r\n\r\n that._aria();\r\n\r\n that._enable();\r\n\r\n that._oldIndex = that.selectedIndex = -1;\r\n\r\n if (index !== undefined$1) {\r\n options.index = index;\r\n }\r\n\r\n that._initialIndex = options.index;\r\n\r\n that.requireValueMapper(that.options);\r\n that._initList();\r\n that.listView.one(\"dataBound\", that._attachAriaActiveDescendant.bind(that));\r\n\r\n that._cascade();\r\n\r\n that.one(\"set\", function(e) {\r\n if (!e.sender.listView.bound() && that.hasOptionLabel()) {\r\n that._textAccessor(that._optionLabelText());\r\n }\r\n });\r\n\r\n if (options.autoBind) {\r\n that.dataSource.fetch();\r\n } else if (that.selectedIndex === -1) { //selectedIndex !== -1 when cascade functionality happens instantly\r\n text = options.text || \"\";\r\n if (!text) {\r\n optionLabel = options.optionLabel;\r\n\r\n if (optionLabel && options.index === 0) {\r\n text = optionLabel;\r\n } else if (that._isSelect) {\r\n text = element.children(\":selected\").text();\r\n }\r\n }\r\n\r\n that._textAccessor(text);\r\n }\r\n\r\n disabled = $(that.element).parents(\"fieldset\").is(':disabled');\r\n\r\n if (disabled) {\r\n that.enable(false);\r\n }\r\n\r\n that.listView.bind(\"click\", function(e) { e.preventDefault(); });\r\n\r\n kendo.notify(that);\r\n that._applyCssClasses();\r\n },\r\n\r\n options: {\r\n name: \"DropDownList\",\r\n enabled: true,\r\n autoBind: true,\r\n _allowFilterPaste: true, // Related to the paste functionality in the Grid. In certain cases the focus remains on the dropdownlist and the paste action is executed on it instead of the Grid.\r\n index: 0,\r\n text: null,\r\n value: null,\r\n delay: 500,\r\n height: 200,\r\n dataTextField: \"\",\r\n dataValueField: \"\",\r\n optionLabel: \"\",\r\n cascadeFrom: \"\",\r\n cascadeFromField: \"\",\r\n cascadeFromParentField: \"\",\r\n ignoreCase: true,\r\n animation: {},\r\n filter: \"none\",\r\n minLength: 1,\r\n enforceMinLength: false,\r\n virtual: false,\r\n template: null,\r\n valueTemplate: null,\r\n optionLabelTemplate: null,\r\n groupTemplate: (data) => encode(data),\r\n fixedGroupTemplate: (data) => encode(data),\r\n autoWidth: false,\r\n popup: null,\r\n filterTitle: null,\r\n size: \"medium\",\r\n fillMode: \"solid\",\r\n rounded: \"medium\",\r\n label: null,\r\n popupFilter: true\r\n },\r\n\r\n events: [\r\n \"open\",\r\n \"close\",\r\n CHANGE,\r\n \"select\",\r\n \"filtering\",\r\n \"dataBinding\",\r\n \"dataBound\",\r\n \"cascade\",\r\n \"set\",\r\n \"kendoKeydown\"\r\n ],\r\n\r\n setOptions: function(options) {\r\n Select.fn.setOptions.call(this, options);\r\n\r\n this.listView.setOptions(this._listOptions(options));\r\n\r\n this._optionLabel();\r\n this._inputTemplate();\r\n this._accessors();\r\n this._removeFilterHeader();\r\n this._addFilterHeader();\r\n this._enable();\r\n this._aria();\r\n\r\n if (!this.value() && this.hasOptionLabel()) {\r\n this.select(0);\r\n }\r\n },\r\n\r\n destroy: function() {\r\n var that = this;\r\n\r\n Select.fn.destroy.call(that);\r\n\r\n that.wrapper.off(ns);\r\n that.wrapper.off(nsFocusEvent);\r\n that.element.off(ns);\r\n\r\n that._arrow.off();\r\n that._arrow = null;\r\n that._arrowIcon = null;\r\n\r\n that.optionLabel.off();\r\n\r\n if (that.filterInput) {\r\n that.filterInput.off(nsFocusEvent);\r\n }\r\n },\r\n\r\n open: function() {\r\n var that = this;\r\n var isFiltered = that.dataSource.filter() ? that.dataSource.filter().filters.length > 0 : false;\r\n var listView = this.listView;\r\n\r\n if (that.popup.visible()) {\r\n return;\r\n }\r\n\r\n if (!that.listView.bound() || that._state === STATE_ACCEPT) {\r\n that._open = true;\r\n that._state = \"rebind\";\r\n\r\n if (that.filterInput) {\r\n that.filterInput.val(\"\");\r\n that._prev = \"\";\r\n }\r\n\r\n if (that.filterInput && that.options.minLength !== 1 && !isFiltered) {\r\n that.refresh();\r\n that.popup.one(\"activate\", that._focusInputHandler);\r\n that.wrapper.attr(\"aria-activedescendant\", listView._optionID);\r\n that.popup.open();\r\n that._resizeFilterInput();\r\n } else {\r\n that._filterSource();\r\n }\r\n } else if (that._allowOpening()) {\r\n that._focusFilter = true;\r\n that.popup.one(\"activate\", that._focusInputHandler);\r\n // In some cases when the popup is opened resize is triggered which will cause it to close\r\n // Setting the below flag will prevent this from happening\r\n that.popup._hovered = true;\r\n that.wrapper.attr(\"aria-activedescendant\", listView._optionID);\r\n that.popup.open();\r\n that._resizeFilterInput();\r\n that._focusItem();\r\n }\r\n },\r\n\r\n close: function() {\r\n this._attachAriaActiveDescendant();\r\n this.popup.close();\r\n },\r\n\r\n _attachAriaActiveDescendant: function() {\r\n var wrapper = this.wrapper,\r\n inputId = wrapper.find(\".k-input-inner\").attr('id');\r\n\r\n wrapper.attr(\"aria-describedby\", inputId);\r\n },\r\n\r\n _focusInput: function() {\r\n if (!this._hasActionSheet()) {\r\n this._focusElement(this.filterInput);\r\n }\r\n },\r\n\r\n _resizeFilterInput: function() {\r\n var filterInput = this.filterInput;\r\n var originalPrevent = this._prevent;\r\n\r\n if (!filterInput || this._hasActionSheet()) {\r\n return;\r\n }\r\n\r\n var isInputActive = this.filterInput[0] === activeElement();\r\n var caret = kendo.caret(this.filterInput[0])[0];\r\n\r\n this._prevent = true;\r\n\r\n filterInput.addClass(\"k-hidden\");\r\n filterInput.closest(\".k-list-filter\").css(\"width\", this.popup.element.width());\r\n filterInput.removeClass(\"k-hidden\");\r\n\r\n if (isInputActive) {\r\n filterInput.trigger(\"focus\");\r\n kendo.caret(filterInput[0], caret);\r\n }\r\n\r\n this._prevent = originalPrevent;\r\n },\r\n\r\n _allowOpening: function() {\r\n return this.hasOptionLabel() || this.filterInput || Select.fn._allowOpening.call(this);\r\n },\r\n\r\n toggle: function(toggle) {\r\n this._toggle(toggle, true);\r\n },\r\n\r\n current: function(candidate) {\r\n var current;\r\n\r\n if (candidate === undefined$1) {\r\n current = this.listView.focus();\r\n\r\n if (!current && this.selectedIndex === 0 && this.hasOptionLabel()) {\r\n return this.optionLabel;\r\n }\r\n\r\n return current;\r\n }\r\n\r\n this._focus(candidate);\r\n },\r\n\r\n dataItem: function(index) {\r\n var that = this;\r\n var dataItem = null;\r\n\r\n if (index === null) { return index; }\r\n\r\n if (index === undefined$1) {\r\n dataItem = that.listView.selectedDataItems()[0];\r\n } else {\r\n if (typeof index !== \"number\") {\r\n if (that.options.virtual) {\r\n return that.dataSource.getByUid($(index).data(\"uid\"));\r\n }\r\n if (index.hasClass(\"k-list-optionlabel\")) {\r\n index = -1;\r\n } else {\r\n index = $(that.items()).index(index);\r\n }\r\n } else if (that.hasOptionLabel()) {\r\n index -= 1;\r\n }\r\n\r\n dataItem = that.dataSource.flatView()[index];\r\n }\r\n\r\n if (!dataItem) {\r\n dataItem = that._optionLabelDataItem();\r\n }\r\n\r\n return dataItem;\r\n },\r\n\r\n refresh: function() {\r\n this.listView.refresh();\r\n },\r\n\r\n text: function(text) {\r\n var that = this;\r\n var loweredText;\r\n var ignoreCase = that.options.ignoreCase;\r\n\r\n text = text === null ? \"\" : text;\r\n\r\n if (text !== undefined$1) {\r\n if (typeof text !== \"string\") {\r\n that._textAccessor(text);\r\n return;\r\n }\r\n\r\n loweredText = ignoreCase ? text.toLowerCase() : text;\r\n\r\n that._select(function(data) {\r\n data = that._text(data);\r\n\r\n if (ignoreCase) {\r\n data = (data + \"\").toLowerCase();\r\n }\r\n\r\n return data === loweredText;\r\n }).done(function() {\r\n that._textAccessor(that.dataItem() || text);\r\n that._refreshFloatingLabel();\r\n });\r\n\r\n } else {\r\n return that._textAccessor();\r\n }\r\n },\r\n\r\n _clearFilter: function() {\r\n $(this.filterInput).val(\"\");\r\n Select.fn._clearFilter.call(this);\r\n },\r\n\r\n value: function(value) {\r\n var that = this;\r\n var listView = that.listView;\r\n var dataSource = that.dataSource;\r\n var valueFn = function() { that.value(value); };\r\n\r\n if (value === undefined$1) {\r\n value = that._accessor() || that.listView.value()[0];\r\n return value === undefined$1 || value === null ? \"\" : value;\r\n }\r\n\r\n that.requireValueMapper(that.options, value);\r\n\r\n if (value || !that.hasOptionLabel()) {\r\n that._initialIndex = null;\r\n }\r\n\r\n this.trigger(\"set\", { value: value });\r\n\r\n if (that._request && that.options.cascadeFrom && that.listView.bound()) {\r\n if (that._valueSetter) {\r\n dataSource.unbind(CHANGE, that._valueSetter);\r\n }\r\n\r\n that._valueSetter = valueFn.bind(that);\r\n\r\n dataSource.one(CHANGE, that._valueSetter);\r\n return;\r\n }\r\n\r\n if (that._isFilterEnabled() && listView.bound() && listView.isFiltered()) {\r\n that._clearFilter();\r\n } else {\r\n that._fetchData();\r\n }\r\n\r\n listView.value(value).done(function() {\r\n that._old = that._valueBeforeCascade = that._accessor();\r\n that._oldIndex = that.selectedIndex;\r\n that._refreshFloatingLabel();\r\n });\r\n },\r\n\r\n hasOptionLabel: function() {\r\n return this.optionLabel && !!this.optionLabel[0];\r\n },\r\n\r\n _optionLabel: function() {\r\n var that = this;\r\n var options = that.options;\r\n var optionLabel = options.optionLabel;\r\n var template = options.optionLabelTemplate;\r\n\r\n if (!optionLabel) {\r\n that.optionLabel.off().remove();\r\n that.optionLabel = $();\r\n return;\r\n }\r\n\r\n if (!template) {\r\n template = (data) => (typeof optionLabel === \"string\" ?\r\n encode(data) :\r\n encode(kendo.getter(options.dataTextField)(data)));\r\n }\r\n\r\n if (typeof template !== \"function\") {\r\n template = kendo.template(template);\r\n }\r\n\r\n that.optionLabelTemplate = template;\r\n\r\n if (!that.hasOptionLabel()) {\r\n that.optionLabel = $('
    ').prependTo(that.list);\r\n }\r\n\r\n that.optionLabel.html(template(optionLabel))\r\n .off()\r\n .on(CLICKEVENTS, that._click.bind(that))\r\n .on(HOVEREVENTS, that._toggleHover);\r\n\r\n },\r\n\r\n _optionLabelText: function() {\r\n var optionLabel = this.options.optionLabel;\r\n return (typeof optionLabel === \"string\") ? optionLabel : this._text(optionLabel);\r\n },\r\n\r\n _optionLabelDataItem: function() {\r\n var that = this;\r\n var optionLabel = that.options.optionLabel;\r\n\r\n if (that.hasOptionLabel()) {\r\n return $.isPlainObject(optionLabel) ? new ObservableObject(optionLabel) : that._assignInstance(that._optionLabelText(), \"\");\r\n }\r\n\r\n return undefined$1;\r\n },\r\n\r\n _buildOptions: function(data) {\r\n var that = this;\r\n if (!that._isSelect) {\r\n return;\r\n }\r\n\r\n var value = that.listView.value()[0];\r\n var optionLabel = that._optionLabelDataItem();\r\n var optionLabelValue = optionLabel && that._value(optionLabel);\r\n\r\n if (value === undefined$1 || value === null) {\r\n value = \"\";\r\n }\r\n\r\n if (optionLabel) {\r\n if (optionLabelValue === undefined$1 || optionLabelValue === null) {\r\n optionLabelValue = \"\";\r\n }\r\n\r\n optionLabel = '\";\r\n }\r\n\r\n that._options(data, optionLabel, value);\r\n\r\n if (value !== List.unifyType(that._accessor(), typeof value)) {\r\n that._customOption = null;\r\n that._custom(value);\r\n }\r\n },\r\n\r\n _listBound: function() {\r\n\r\n var that = this;\r\n var initialIndex = that._initialIndex;\r\n var filtered = that._state === STATE_FILTER;\r\n\r\n var data = that.dataSource.flatView();\r\n var dataItem;\r\n\r\n that._presetValue = false;\r\n\r\n that._renderFooter();\r\n that._renderNoData();\r\n that._toggleNoData(!data.length);\r\n\r\n that._resizePopup(true);\r\n\r\n that.popup.position();\r\n\r\n that._buildOptions(data);\r\n\r\n if (!filtered) {\r\n if (that._open) {\r\n that.toggle(that._allowOpening());\r\n }\r\n\r\n that._open = false;\r\n\r\n if (!that._fetch) {\r\n if (data.length) {\r\n if (!that.listView.value().length && initialIndex > -1 && initialIndex !== null) {\r\n that.select(initialIndex);\r\n }\r\n\r\n that._initialIndex = null;\r\n dataItem = that.listView.selectedDataItems()[0];\r\n if (dataItem && that.text() !== that._text(dataItem)) {\r\n that._selectValue(dataItem);\r\n }\r\n } else if (that._textAccessor() !== that._optionLabelText()) {\r\n that.listView.value(\"\");\r\n that._selectValue(null);\r\n that._oldIndex = that.selectedIndex;\r\n }\r\n }\r\n }\r\n\r\n that._hideBusy();\r\n that.trigger(\"dataBound\");\r\n },\r\n\r\n _listChange: function() {\r\n this._selectValue(this.listView.selectedDataItems()[0]);\r\n\r\n if (this._presetValue || (this._old && this._oldIndex === -1)) {\r\n this._oldIndex = this.selectedIndex;\r\n }\r\n },\r\n\r\n _filterPaste: function() {\r\n if (this.options._allowFilterPaste) {\r\n this._search();\r\n }\r\n },\r\n\r\n _attachFocusHandlers: function() {\r\n var that = this;\r\n var wrapper = that.wrapper;\r\n\r\n wrapper.on(\"focusin\" + nsFocusEvent, that._focusinHandler.bind(that))\r\n .on(\"focusout\" + nsFocusEvent, that._focusoutHandler.bind(that));\r\n if (that.filterInput) {\r\n that.filterInput.on(\"focusin\" + nsFocusEvent, that._focusinHandler.bind(that))\r\n .on(\"focusout\" + nsFocusEvent, that._focusoutHandler.bind(that));\r\n }\r\n },\r\n\r\n _focusHandler: function() {\r\n this.wrapper.trigger(\"focus\");\r\n },\r\n\r\n _focusinHandler: function() {\r\n this.wrapper.addClass(FOCUSED);\r\n this._prevent = false;\r\n },\r\n\r\n _focusoutHandler: function() {\r\n var that = this;\r\n var isIFrame = window.self !== window.top;\r\n\r\n if (!that._prevent) {\r\n clearTimeout(that._typingTimeout);\r\n\r\n if (support.mobileOS.ios && isIFrame) {\r\n that._change();\r\n } else {\r\n that._blur();\r\n }\r\n\r\n that.wrapper.removeClass(FOCUSED);\r\n that._prevent = true;\r\n that._open = false;\r\n that.element.trigger(\"blur\");\r\n }\r\n },\r\n\r\n _wrapperMousedown: function() {\r\n this._prevent = !!this.filterInput;\r\n },\r\n\r\n _wrapperClick: function(e) {\r\n e.preventDefault();\r\n this.popup.unbind(\"activate\", this._focusInputHandler);\r\n this._focused = this.wrapper;\r\n this._prevent = false;\r\n this._toggle();\r\n },\r\n\r\n _editable: function(options) {\r\n var that = this;\r\n var element = that.element;\r\n var disable = options.disable;\r\n var readonly = options.readonly;\r\n var wrapper = that.wrapper.add(that.filterInput).off(ns);\r\n var dropDownWrapper = that.wrapper.off(HOVEREVENTS);\r\n\r\n if (!readonly && !disable) {\r\n element.prop(DISABLED, false).prop(READONLY, false);\r\n\r\n dropDownWrapper\r\n .removeClass(STATEDISABLED)\r\n .on(HOVEREVENTS, that._toggleHover);\r\n\r\n wrapper\r\n .attr(TABINDEX, wrapper.data(TABINDEX))\r\n .attr(ARIA_DISABLED, false)\r\n .attr(ARIA_READONLY, false)\r\n .on(\"keydown\" + ns, that, that._keydown.bind(that))\r\n .on(kendo.support.mousedown + ns, that._wrapperMousedown.bind(that))\r\n .on(\"paste\" + ns, that._filterPaste.bind(that));\r\n\r\n that.wrapper.on(\"click\" + ns, that._wrapperClick.bind(that));\r\n\r\n if (!that.filterInput) {\r\n wrapper.on(\"keypress\" + ns, that._keypress.bind(that));\r\n } else {\r\n wrapper.on(\"input\" + ns, that._search.bind(that));\r\n }\r\n\r\n } else if (disable) {\r\n wrapper.removeAttr(TABINDEX);\r\n dropDownWrapper.addClass(STATEDISABLED);\r\n } else {\r\n dropDownWrapper.removeClass(STATEDISABLED);\r\n }\r\n\r\n element.attr(DISABLED, disable)\r\n .attr(READONLY, readonly);\r\n\r\n wrapper.attr(ARIA_DISABLED, disable)\r\n .attr(ARIA_READONLY, readonly);\r\n },\r\n\r\n _keydown: function(e) {\r\n var that = this;\r\n var key = e.keyCode;\r\n var altKey = e.altKey;\r\n var isInputActive;\r\n var handled;\r\n\r\n var isPopupVisible = that.popup.visible();\r\n\r\n if (that.filterInput) {\r\n isInputActive = that.filterInput[0] === activeElement();\r\n }\r\n\r\n if (key === keys.LEFT) {\r\n key = keys.UP;\r\n handled = true;\r\n } else if (key === keys.RIGHT) {\r\n key = keys.DOWN;\r\n handled = true;\r\n }\r\n\r\n if (handled && isInputActive) {\r\n return;\r\n }\r\n\r\n e.keyCode = key;\r\n\r\n if ((altKey && key === keys.UP) || key === keys.ESC) {\r\n that._focusElement(that.wrapper);\r\n }\r\n\r\n if (that._state === STATE_FILTER && key === keys.ESC) {\r\n that._clearFilter();\r\n that._open = false;\r\n that._state = STATE_ACCEPT;\r\n }\r\n\r\n if (key === keys.ENTER && that._typingTimeout && that.filterInput && isPopupVisible) {\r\n e.preventDefault();\r\n return;\r\n }\r\n\r\n if (key === keys.SPACEBAR && !isInputActive) {\r\n that.toggle(!isPopupVisible);\r\n e.preventDefault();\r\n }\r\n\r\n handled = that._move(e);\r\n\r\n if (handled) {\r\n return;\r\n }\r\n\r\n if (!isPopupVisible || !that.filterInput) {\r\n var current = that._focus();\r\n\r\n if (key === keys.HOME) {\r\n handled = true;\r\n that._firstItem();\r\n } else if (key === keys.END) {\r\n handled = true;\r\n that._lastItem();\r\n }\r\n\r\n if (handled) {\r\n if (that.trigger(\"select\", { dataItem: that._getElementDataItem(that._focus()), item: that._focus() })) {\r\n that._focus(current);\r\n return;\r\n }\r\n\r\n that._select(that._focus(), true).done(function() {\r\n if (!isPopupVisible) {\r\n that._blur();\r\n }\r\n });\r\n e.preventDefault();\r\n }\r\n }\r\n\r\n if (!altKey && !handled && that.filterInput) {\r\n that._search();\r\n }\r\n },\r\n\r\n _matchText: function(text, word) {\r\n var ignoreCase = this.options.ignoreCase;\r\n\r\n if (text === undefined$1 || text === null) {\r\n return false;\r\n }\r\n\r\n text = text + \"\";\r\n\r\n if (ignoreCase) {\r\n text = text.toLowerCase();\r\n }\r\n\r\n return text.indexOf(word) === 0;\r\n },\r\n\r\n _shuffleData: function(data, splitIndex) {\r\n var optionDataItem = this._optionLabelDataItem();\r\n\r\n if (optionDataItem) {\r\n data = [optionDataItem].concat(data);\r\n }\r\n\r\n return data.slice(splitIndex).concat(data.slice(0, splitIndex));\r\n },\r\n\r\n _selectNext: function() {\r\n var that = this;\r\n var data = that.dataSource.flatView();\r\n var dataLength = data.length + (that.hasOptionLabel() ? 1 : 0);\r\n var isInLoop = sameCharsOnly(that._word, that._last);\r\n var startIndex = that.selectedIndex;\r\n var oldFocusedItem;\r\n var text;\r\n\r\n if (startIndex === -1) {\r\n startIndex = 0;\r\n } else {\r\n startIndex += isInLoop ? 1 : 0;\r\n startIndex = normalizeIndex(startIndex, dataLength);\r\n }\r\n\r\n data = data.toJSON ? data.toJSON() : data.slice();\r\n data = that._shuffleData(data, startIndex);\r\n\r\n for (var idx = 0; idx < dataLength; idx++) {\r\n text = that._text(data[idx]);\r\n\r\n if (isInLoop && that._matchText(text, that._last)) {\r\n break;\r\n } else if (that._matchText(text, that._word)) {\r\n break;\r\n }\r\n }\r\n\r\n if (idx !== dataLength) {\r\n oldFocusedItem = that._focus();\r\n\r\n that._select(normalizeIndex(startIndex + idx, dataLength)).done(function() {\r\n var done = function() {\r\n if (!that.popup.visible()) {\r\n that._change();\r\n }\r\n };\r\n\r\n if (that.trigger(\"select\", { dataItem: that._getElementDataItem(that._focus()), item: that._focus() })) {\r\n that._select(oldFocusedItem).done(done);\r\n } else {\r\n done();\r\n }\r\n });\r\n }\r\n },\r\n\r\n _keypress: function(e) {\r\n var that = this;\r\n\r\n if (e.which === 0 || e.keyCode === kendo.keys.ENTER) {\r\n return;\r\n }\r\n\r\n var character = String.fromCharCode(e.charCode || e.keyCode);\r\n\r\n if (that.options.ignoreCase) {\r\n character = character.toLowerCase();\r\n }\r\n\r\n if (character === \" \") {\r\n e.preventDefault();\r\n }\r\n\r\n that._word += character;\r\n that._last = character;\r\n\r\n that._search();\r\n },\r\n\r\n _popupOpen: function(e) {\r\n var popup = this.popup;\r\n\r\n if (e.isDefaultPrevented() || this._hasActionSheet()) {\r\n return;\r\n }\r\n\r\n popup.wrapper = kendo.wrap(popup.element);\r\n\r\n if (popup.element.closest(\".km-root\")[0]) {\r\n popup.wrapper.addClass(\"km-popup km-widget\");\r\n this.wrapper.addClass(\"km-widget\");\r\n }\r\n },\r\n\r\n _popup: function() {\r\n Select.fn._popup.call(this);\r\n this.popup.element.addClass(\"k-dropdownlist-popup\");\r\n this.popup.one(\"open\", this._popupOpen.bind(this));\r\n },\r\n\r\n _postCreatePopup: function() {\r\n Select.fn._postCreatePopup.call(this);\r\n this._attachFocusHandlers();\r\n },\r\n\r\n _getElementDataItem: function(element) {\r\n if (!element || !element[0]) {\r\n return null;\r\n }\r\n\r\n if (element[0] === this.optionLabel[0]) {\r\n return this._optionLabelDataItem();\r\n }\r\n\r\n return this.listView.dataItemByIndex(this.listView.getElementIndex(element));\r\n },\r\n\r\n _click: function(e) {\r\n var that = this;\r\n var item = e.item || $(e.currentTarget);\r\n\r\n e.preventDefault();\r\n\r\n if (that.trigger(\"select\", { dataItem: that._getElementDataItem(item), item: item })) {\r\n that.close();\r\n return;\r\n }\r\n\r\n that._userTriggered = true;\r\n\r\n that._select(item).done(function() {\r\n that._blur();\r\n that._focusElement(that.wrapper);\r\n });\r\n },\r\n\r\n _focusElement: function(element) {\r\n var active = activeElement();\r\n var wrapper = this.wrapper;\r\n var filterInput = this.filterInput;\r\n var compareElement = element === filterInput ? wrapper : filterInput;\r\n var touchEnabled = support.mobileOS && (support.touch || support.MSPointers || support.pointers);\r\n\r\n if (filterInput && filterInput[0] === element[0] && touchEnabled) {\r\n return;\r\n }\r\n\r\n if (filterInput && (compareElement[0] === active || this._focusFilter)) {\r\n this._focusFilter = false;\r\n this._prevent = true;\r\n this._focused = element.trigger(\"focus\");\r\n }\r\n },\r\n\r\n _searchByWord: function(word) {\r\n if (!word) {\r\n return;\r\n }\r\n\r\n var that = this;\r\n var ignoreCase = that.options.ignoreCase;\r\n\r\n if (ignoreCase) {\r\n word = word.toLowerCase();\r\n }\r\n\r\n that._select(function(dataItem) {\r\n return that._matchText(that._text(dataItem), word);\r\n });\r\n },\r\n\r\n _inputValue: function() {\r\n return this.text();\r\n },\r\n\r\n _search: function() {\r\n var that = this;\r\n var dataSource = that.dataSource;\r\n\r\n clearTimeout(that._typingTimeout);\r\n\r\n if (that._isFilterEnabled()) {\r\n that._typingTimeout = setTimeout(function() {\r\n var value = that.filterInput.val();\r\n\r\n if (that._prev !== value) {\r\n that._prev = value;\r\n that.search(value);\r\n that._resizeFilterInput();\r\n }\r\n\r\n that._typingTimeout = null;\r\n }, that.options.delay);\r\n } else {\r\n that._typingTimeout = setTimeout(function() {\r\n that._word = \"\";\r\n }, that.options.delay);\r\n\r\n if (!that.listView.bound()) {\r\n dataSource.fetch().done(function() {\r\n that._selectNext();\r\n });\r\n return;\r\n }\r\n\r\n that._selectNext();\r\n }\r\n },\r\n\r\n _get: function(candidate) {\r\n var data, found, idx;\r\n var isFunction = typeof candidate === \"function\";\r\n var jQueryCandidate = !isFunction ? $(candidate) : $();\r\n\r\n if (this.hasOptionLabel()) {\r\n if (typeof candidate === \"number\") {\r\n if (candidate > -1) {\r\n candidate -= 1;\r\n }\r\n } else if (jQueryCandidate.hasClass(\"k-list-optionlabel\")) {\r\n candidate = -1;\r\n }\r\n }\r\n\r\n if (isFunction) {\r\n data = this.dataSource.flatView();\r\n\r\n for (idx = 0; idx < data.length; idx++) {\r\n if (candidate(data[idx])) {\r\n candidate = idx;\r\n found = true;\r\n break;\r\n }\r\n }\r\n\r\n if (!found) {\r\n candidate = -1;\r\n }\r\n }\r\n\r\n return candidate;\r\n },\r\n\r\n _firstItem: function() {\r\n if (this.hasOptionLabel()) {\r\n this._focus(this.optionLabel);\r\n } else {\r\n this.listView.focusFirst();\r\n }\r\n },\r\n\r\n _lastItem: function() {\r\n this._resetOptionLabel();\r\n this.listView.focusLast();\r\n },\r\n\r\n _nextItem: function() {\r\n var focusIndex;\r\n\r\n if (this.optionLabel.hasClass(\"k-focus\")) {\r\n this._resetOptionLabel();\r\n this.listView.focusFirst();\r\n focusIndex = 1;\r\n } else {\r\n focusIndex = this.listView.focusNext();\r\n }\r\n\r\n return focusIndex;\r\n },\r\n\r\n _prevItem: function() {\r\n var focusIndex;\r\n\r\n if (this.optionLabel.hasClass(\"k-focus\")) {\r\n return;\r\n }\r\n\r\n focusIndex = this.listView.focusPrev();\r\n\r\n if (!this.listView.focus() && !this.options.virtual) {\r\n this._focus(this.optionLabel);\r\n }\r\n\r\n return focusIndex;\r\n },\r\n\r\n _focusItem: function() {\r\n var options = this.options;\r\n var listView = this.listView;\r\n var focusedItem = listView.focus();\r\n var index = listView.select();\r\n\r\n index = index[index.length - 1];\r\n\r\n if (index === undefined$1 && options.highlightFirst && !focusedItem) {\r\n index = 0;\r\n }\r\n\r\n if (index !== undefined$1) {\r\n listView.focus(index);\r\n } else {\r\n if (options.optionLabel && (!options.virtual || options.virtual.mapValueTo !== \"dataItem\")) {\r\n this._focus(this.optionLabel);\r\n this._select(this.optionLabel);\r\n this.listView.content.scrollTop(0);\r\n } else {\r\n listView.scrollToIndex(0);\r\n }\r\n }\r\n },\r\n\r\n _resetOptionLabel: function(additionalClass) {\r\n this.optionLabel.removeClass(\"k-focus\" + (additionalClass || \"\")).removeAttr(\"id\");\r\n },\r\n\r\n _focus: function(candidate) {\r\n var listView = this.listView;\r\n var optionLabel = this.optionLabel;\r\n\r\n if (candidate === undefined$1) {\r\n candidate = listView.focus();\r\n\r\n if (!candidate && optionLabel.hasClass(\"k-focus\")) {\r\n candidate = optionLabel;\r\n }\r\n\r\n return candidate;\r\n }\r\n\r\n this._resetOptionLabel();\r\n\r\n candidate = this._get(candidate);\r\n\r\n listView.focus(candidate);\r\n\r\n if (candidate === -1) {\r\n optionLabel.addClass(\"k-focus\")\r\n .attr(\"id\", listView._optionID);\r\n\r\n if (this.filterInput) {\r\n this.filterInput\r\n .removeAttr(\"aria-activedescendant\")\r\n .attr(\"aria-activedescendant\", listView._optionID);\r\n }\r\n }\r\n },\r\n\r\n _select: function(candidate, keepState) {\r\n var that = this;\r\n\r\n candidate = that._get(candidate);\r\n\r\n return that.listView.select(candidate).done(function() {\r\n if (!keepState && that._state === STATE_FILTER) {\r\n that._state = STATE_ACCEPT;\r\n }\r\n\r\n if (candidate === -1) {\r\n that._selectValue(null);\r\n }\r\n });\r\n },\r\n\r\n _selectValue: function(dataItem) {\r\n var that = this;\r\n var optionLabel = that.options.optionLabel;\r\n var idx = that.listView.select();\r\n\r\n var value = \"\";\r\n var text = \"\";\r\n\r\n idx = idx[idx.length - 1];\r\n if (idx === undefined$1) {\r\n idx = -1;\r\n }\r\n\r\n this._resetOptionLabel(\" k-selected\");\r\n\r\n if (dataItem || dataItem === 0) {\r\n text = dataItem;\r\n value = that._dataValue(dataItem);\r\n if (optionLabel) {\r\n idx += 1;\r\n }\r\n } else if (optionLabel) {\r\n that._focus(that.optionLabel.addClass(\"k-selected\"));\r\n\r\n text = that._optionLabelText();\r\n\r\n if (typeof optionLabel === \"string\") {\r\n value = \"\";\r\n } else {\r\n value = that._value(optionLabel);\r\n }\r\n\r\n idx = 0;\r\n }\r\n\r\n that.selectedIndex = idx;\r\n\r\n if (value === null) {\r\n value = \"\";\r\n }\r\n\r\n that._textAccessor(text);\r\n that._accessor(value, idx);\r\n\r\n that._triggerCascade();\r\n },\r\n\r\n _mobile: function() {\r\n var that = this,\r\n popup = that.popup,\r\n mobileOS = support.mobileOS,\r\n root = popup.element.parents(\".km-root\").eq(0);\r\n\r\n if (root.length && mobileOS) {\r\n popup.options.animation.open.effects = (mobileOS.android || mobileOS.meego) ? \"fadeIn\" : (mobileOS.ios || mobileOS.wp) ? \"slideIn:up\" : popup.options.animation.open.effects;\r\n }\r\n },\r\n\r\n _span: function() {\r\n var that = this,\r\n wrapper = that.wrapper,\r\n SELECTOR = \"span.k-input-value-text\",\r\n id = kendo.guid(),\r\n options = that.options,\r\n span, arrowBtn;\r\n\r\n span = wrapper.find(SELECTOR);\r\n\r\n if (!span[0]) {\r\n arrowBtn = html.renderButton('', {\r\n icon: \"caret-alt-down\",\r\n size: options.size,\r\n fillMode: options.fillMode,\r\n shape: \"none\",\r\n rounded: \"none\"\r\n });\r\n\r\n wrapper.append('' +\r\n '' +\r\n '')\r\n .append(arrowBtn)\r\n .append(that.element);\r\n\r\n span = wrapper.find(SELECTOR);\r\n }\r\n\r\n that.span = span;\r\n that._arrow = wrapper.find(\".k-input-button\");\r\n that._arrowIcon = that._arrow.find(\".k-icon,.k-svg-icon\");\r\n },\r\n\r\n _wrapper: function() {\r\n var that = this,\r\n element = that.element,\r\n DOMelement = element[0],\r\n wrapper;\r\n\r\n wrapper = element.parent();\r\n\r\n if (!wrapper.is(\"span.k-picker\")) {\r\n wrapper = element.wrap(\"\").parent();\r\n wrapper[0].style.cssText = DOMelement.style.cssText;\r\n wrapper[0].title = DOMelement.title;\r\n }\r\n\r\n that._focused = that.wrapper = wrapper\r\n .addClass(\"k-picker k-dropdownlist\")\r\n .addClass(DOMelement.className)\r\n .removeClass('input-validation-error')\r\n .css(\"display\", \"\")\r\n .attr({\r\n accesskey: element.attr(\"accesskey\"),\r\n unselectable: \"on\",\r\n role: \"combobox\",\r\n \"aria-expanded\": false\r\n });\r\n\r\n element.hide().removeAttr(\"accesskey\");\r\n },\r\n\r\n _clearSelection: function(parent) {\r\n this.select(parent.value() ? 0 : -1);\r\n },\r\n\r\n _openHandler: function(e) {\r\n this._adjustListWidth();\r\n\r\n if (this.trigger(OPEN)) {\r\n e.preventDefault();\r\n } else {\r\n this.wrapper.attr(\"aria-expanded\", true);\r\n this.ul.attr(\"aria-hidden\", false);\r\n }\r\n },\r\n\r\n _closeHandler: function(e) {\r\n if (this.trigger(CLOSE)) {\r\n e.preventDefault();\r\n } else {\r\n this.wrapper.attr(\"aria-expanded\", false);\r\n this.ul.attr(\"aria-hidden\", true);\r\n }\r\n },\r\n\r\n _inputTemplate: function() {\r\n var that = this,\r\n template = that.options.valueTemplate;\r\n\r\n\r\n if (!template) {\r\n template = (data) => encode(that._text(data));\r\n } else {\r\n template = kendo.template(template);\r\n }\r\n\r\n that.valueTemplate = template;\r\n\r\n if (that.hasOptionLabel() && !that.options.optionLabelTemplate) {\r\n try {\r\n that.valueTemplate(that._optionLabelDataItem());\r\n } catch (e) {\r\n throw new Error(MSG_INVALID_OPTION_LABEL);\r\n }\r\n }\r\n },\r\n\r\n _textAccessor: function(text) {\r\n var dataItem = null;\r\n var template = this.valueTemplate;\r\n var optionLabelText = this._optionLabelText();\r\n var span = this.span;\r\n\r\n if (text === undefined$1) {\r\n return span.text();\r\n }\r\n\r\n if ($.isPlainObject(text) || text instanceof ObservableObject) {\r\n dataItem = text;\r\n } else if (optionLabelText && optionLabelText === text) {\r\n dataItem = this.options.optionLabel;\r\n }\r\n\r\n if (!dataItem) {\r\n dataItem = this._assignInstance(text, this._accessor());\r\n }\r\n\r\n if (this.hasOptionLabel()) {\r\n if (dataItem === optionLabelText || this._text(dataItem) === optionLabelText) {\r\n template = this.optionLabelTemplate;\r\n\r\n if (typeof this.options.optionLabel === \"string\" && !this.options.optionLabelTemplate) {\r\n dataItem = optionLabelText;\r\n }\r\n }\r\n }\r\n\r\n try {\r\n span.html(template(dataItem));\r\n } catch (e) {\r\n //dataItem has missing fields required in custom template\r\n span.html(\"\");\r\n }\r\n },\r\n\r\n _preselect: function(value, text) {\r\n if (!value && !text) {\r\n text = this._optionLabelText();\r\n }\r\n\r\n this._accessor(value);\r\n this._textAccessor(text);\r\n\r\n this._old = this._accessor();\r\n this._oldIndex = this.selectedIndex;\r\n\r\n this.listView.setValue(value);\r\n\r\n this._initialIndex = null;\r\n this._presetValue = true;\r\n },\r\n\r\n _assignInstance: function(text, value) {\r\n var dataTextField = this.options.dataTextField;\r\n var dataItem = {};\r\n\r\n if (dataTextField) {\r\n assign(dataItem, dataTextField.split(\".\"), text);\r\n assign(dataItem, this.options.dataValueField.split(\".\"), value);\r\n dataItem = new ObservableObject(dataItem);\r\n } else {\r\n dataItem = text;\r\n }\r\n\r\n return dataItem;\r\n }\r\n });\r\n\r\n function assign(instance, fields, value) {\r\n var idx = 0,\r\n lastIndex = fields.length - 1,\r\n field;\r\n\r\n for (; idx < lastIndex; ++idx) {\r\n field = fields[idx];\r\n\r\n if (!(field in instance)) {\r\n instance[field] = {};\r\n }\r\n\r\n instance = instance[field];\r\n }\r\n\r\n instance[fields[lastIndex]] = value;\r\n }\r\n\r\n function normalizeIndex(index, length) {\r\n if (index >= length) {\r\n index -= length;\r\n }\r\n return index;\r\n }\r\n\r\n function sameCharsOnly(word, character) {\r\n for (var idx = 0; idx < word.length; idx++) {\r\n if (word.charAt(idx) !== character) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n ui.plugin(DropDownList);\r\n\r\n kendo.cssProperties.registerPrefix(\"DropDownList\", \"k-picker-\");\r\n\r\n kendo.cssProperties.registerValues(\"DropDownList\", [{\r\n prop: \"rounded\",\r\n values: kendo.cssProperties.roundedValues.concat([['full', 'full']])\r\n }]);\r\n })(window.kendo.jQuery);\r\n var kendo$1Q = kendo;\r\n\r\n var __meta__$1P = {\r\n id: \"treeview.draganddrop\",\r\n name: \"Hierarchical Drag & Drop\",\r\n category: \"framework\",\r\n depends: [ \"core\", \"draganddrop\" ],\r\n advanced: true\r\n };\r\n\r\n (function($, undefined$1) {\r\n var kendo = window.kendo;\r\n var ui = kendo.ui;\r\n var extend = $.extend;\r\n var VISIBILITY = \"visibility\";\r\n var DRAG_STATUS = \"k-drag-status\";\r\n var DRAG_STATUS_ELEMENT = ``;\r\n var KSTATEHOVER = \"k-hover\";\r\n var INPUTSELECTOR = \"input,a:not(.k-treeview-leaf),textarea,.k-multiselect-wrap,select,button,a.k-button>.k-icon,.k-button>.k-button-text,button.k-button>.k-icon,span.k-toggle-icon,a.k-button>.k-svg-icon,button.k-button>.k-svg-icon,.k-button>.k-svg-icon>svg,.k-button>.k-svg-icon>svg>path\";\r\n var DROPHINTTEMPLATE = \"
    \" +\r\n \"
    \" +\r\n \"
    \" +\r\n \"
    \";\r\n\r\n ui.HierarchicalDragAndDrop = kendo.Class.extend({\r\n init: function(element, options) {\r\n this.element = element;\r\n this.hovered = element;\r\n this.options = extend({\r\n dragstart: $.noop, drag: $.noop, drop: $.noop, dragend: $.noop\r\n }, options);\r\n\r\n this._draggable = new ui.Draggable(element, {\r\n ignore: INPUTSELECTOR,\r\n filter: options.filter,\r\n autoScroll: options.autoScroll,\r\n cursorOffset: {\r\n left: 10,\r\n top: kendo.support.mobileOS ? -40 / kendo.support.zoomLevel() : 10\r\n },\r\n hint: this._hint.bind(this),\r\n dragstart: this.dragstart.bind(this),\r\n dragcancel: this.dragcancel.bind(this),\r\n hintDestroyed: this.dragcancel.bind(this),\r\n drag: this.drag.bind(this),\r\n dragend: this.dragend.bind(this),\r\n holdToDrag: options.holdToDrag,\r\n clickMoveClick: options.clickMoveClick\r\n });\r\n },\r\n\r\n _hint: function(element) {\r\n return \"
    \" +\r\n DRAG_STATUS_ELEMENT +\r\n this.options.hintText(element) +\r\n \"
    \";\r\n },\r\n\r\n _removeTouchHover: function() {\r\n if (kendo.support.touch && this.hovered) {\r\n this.hovered.find(\".\" + KSTATEHOVER).removeClass(KSTATEHOVER);\r\n this.hovered = false;\r\n }\r\n },\r\n\r\n _hintStatus: function(newStatus) {\r\n var statusElement = this._draggable.hint.find(`.${DRAG_STATUS}`);\r\n if (newStatus) {\r\n this.status = newStatus;\r\n ui.icon(statusElement, {\r\n icon: newStatus\r\n });\r\n } else {\r\n this.status = '';\r\n statusElement.replaceWith(DRAG_STATUS_ELEMENT);\r\n }\r\n },\r\n\r\n dragstart: function(e) {\r\n if (this.dropHint) {\r\n this.dropHint.remove();\r\n }\r\n\r\n this.source = e.currentTarget.closest(this.options.itemSelector);\r\n\r\n if (this.options.dragstart(this.source)) {\r\n e.preventDefault();\r\n }\r\n\r\n if (this.options.reorderable) {\r\n this.dropHint = $(DROPHINTTEMPLATE)\r\n .css(VISIBILITY, \"hidden\")\r\n .appendTo(this.element);\r\n } else {\r\n this.dropHint = $();\r\n }\r\n },\r\n\r\n drag: function(e) {\r\n var options = this.options;\r\n var source = this.source;\r\n var target = this.dropTarget = $(kendo.eventTarget(e));\r\n var container = target.closest(options.allowedContainers);\r\n var hoveredItem, itemHeight, itemTop, itemContent, delta;\r\n var insertOnTop, insertOnBottom, addChild;\r\n var itemData, position, status;\r\n\r\n if (!container.length) {\r\n // dragging outside of allowed elements\r\n status = \"cancel\";\r\n this._removeTouchHover();\r\n } else if (source[0] == target[0] || options.contains(source[0], target[0])) {\r\n // dragging item within itself\r\n status = \"cancel\";\r\n } else if (e.clickMoveClick && e.currentTarget.hasClass(\"k-drag-cell\") && target.closest(\".k-drag-cell\").length === 0) {\r\n // click-move-click interaction with drag cell\r\n status = \"cancel\";\r\n } else if (e.clickMoveClick && e.currentTarget.hasClass(\"k-treeview-leaf\") && target.closest(\".k-treeview-leaf\").length === 0) {\r\n // click-move-click interaction with TreeView\r\n status = \"cancel\";\r\n } else {\r\n // moving or reordering item\r\n status = \"insert-middle\";\r\n\r\n itemData = options.itemFromTarget(target);\r\n hoveredItem = itemData.item;\r\n\r\n if (hoveredItem.length) {\r\n this._removeTouchHover();\r\n itemHeight = kendo._outerHeight(hoveredItem);\r\n itemContent = itemData.content;\r\n\r\n if (options.reorderable) {\r\n delta = itemHeight / (itemContent.length > 0 ? 4 : 2);\r\n itemTop = kendo.getOffset(hoveredItem).top;\r\n\r\n insertOnTop = e.y.location < (itemTop + delta);\r\n insertOnBottom = (itemTop + itemHeight - delta) < e.y.location;\r\n addChild = itemContent.length && !insertOnTop && !insertOnBottom;\r\n } else {\r\n addChild = true;\r\n insertOnTop = false;\r\n insertOnBottom = false;\r\n }\r\n\r\n this.hovered = addChild ? container : false;\r\n\r\n this.dropHint.css(VISIBILITY, addChild ? \"hidden\" : \"visible\");\r\n\r\n if (this._lastHover && this._lastHover[0] != itemContent[0]) {\r\n this._lastHover.removeClass(KSTATEHOVER);\r\n }\r\n\r\n this._lastHover = itemContent.toggleClass(KSTATEHOVER, addChild);\r\n\r\n if (addChild) {\r\n status = \"plus\";\r\n } else {\r\n position = hoveredItem.position();\r\n position.top += insertOnTop ? 0 : itemHeight;\r\n\r\n this.dropHint.css(position)\r\n [insertOnTop ? \"prependTo\" : \"appendTo\"]\r\n (options.dropHintContainer(hoveredItem));\r\n\r\n if (insertOnTop && itemData.first) {\r\n status = \"insert-top\";\r\n }\r\n\r\n if (insertOnBottom && itemData.last) {\r\n status = \"insert-bottom\";\r\n }\r\n }\r\n } else if (target[0] != this.dropHint[0]) {\r\n if (this._lastHover) {\r\n this._lastHover.removeClass(KSTATEHOVER);\r\n }\r\n\r\n if (!$.contains(this.element[0], container[0])) {\r\n // moving node to different element\r\n status = \"plus\";\r\n } else {\r\n status = \"cancel\";\r\n }\r\n }\r\n }\r\n\r\n this.options.drag({\r\n originalEvent: e.originalEvent,\r\n source: source,\r\n target: target,\r\n pageY: e.y.location,\r\n pageX: e.x.location,\r\n status: status,\r\n setStatus: function(value) {\r\n status = value;\r\n }\r\n });\r\n\r\n if (status.indexOf(\"insert\") !== 0) {\r\n this.dropHint.css(VISIBILITY, \"hidden\");\r\n }\r\n\r\n this._hintStatus(status);\r\n },\r\n\r\n dragcancel: function() {\r\n if (this.dropHint) {\r\n this.dropHint.remove();\r\n }\r\n },\r\n\r\n dragend: function(e) {\r\n var position = \"over\",\r\n source = this.source,\r\n destination,\r\n dropHint = this.dropHint,\r\n dropTarget = this.dropTarget || $(kendo.eventTarget(e)),\r\n eventArgs, dropPrevented, requireTarget;\r\n\r\n if (dropHint && dropHint.css(VISIBILITY) == \"visible\") {\r\n position = this.options.dropPositionFrom(dropHint);\r\n destination = dropHint.closest(this.options.itemSelector);\r\n requireTarget = true;\r\n } else if (dropTarget) {\r\n destination = dropTarget.closest(this.options.itemSelector);\r\n\r\n // moving node to root element\r\n if (!destination.length) {\r\n destination = dropTarget.closest(this.options.allowedContainers);\r\n }\r\n }\r\n\r\n if (requireTarget && !destination.length) {\r\n this.dragcancel();\r\n return;\r\n }\r\n\r\n eventArgs = {\r\n originalEvent: e.originalEvent,\r\n source: source[0],\r\n destination: destination[0],\r\n valid: this.status != \"cancel\",\r\n setValid: function(newValid) {\r\n this.valid = newValid;\r\n },\r\n dropTarget: dropTarget[0],\r\n position: position\r\n };\r\n\r\n dropPrevented = this.options.drop(eventArgs);\r\n\r\n dropHint.remove();\r\n this._removeTouchHover();\r\n if (this._lastHover) {\r\n this._lastHover.removeClass(KSTATEHOVER);\r\n }\r\n\r\n if (!eventArgs.valid || dropPrevented) {\r\n this._draggable.dropped = eventArgs.valid;\r\n return;\r\n }\r\n\r\n this._draggable.dropped = true;\r\n\r\n this.options.dragend({\r\n originalEvent: e.originalEvent,\r\n source: source,\r\n destination: destination,\r\n position: position\r\n });\r\n },\r\n\r\n destroy: function() {\r\n this._lastHover = this.hovered = null;\r\n this._draggable.destroy();\r\n }\r\n });\r\n\r\n })(window.kendo.jQuery);\r\n var kendo$1P = kendo;\r\n\r\n var __meta__$1O = {\r\n id: \"html.input\",\r\n name: \"Html.Input\",\r\n category: \"web\",\r\n description: \"HTML rendering utility for Kendo UI for jQuery.\",\r\n depends: [ \"html.base\" ],\r\n features: []\r\n };\r\n\r\n (function($, undefined$1) {\r\n var kendo = window.kendo,\r\n HTMLBase = kendo.html.HTMLBase;\r\n\r\n var renderCheckBox = function(element, options) {\r\n if (arguments[0] === undefined$1 || $.isPlainObject(arguments[0])) {\r\n options = element;\r\n element = $(\"\");\r\n }\r\n\r\n return (new HTMLCheckBox(element, options)).html();\r\n };\r\n\r\n var renderRadioButton = function(element, options) {\r\n if (arguments[0] === undefined$1 || $.isPlainObject(arguments[0])) {\r\n options = element;\r\n element = $(\"\");\r\n }\r\n\r\n return (new HTMLRadioButton(element, options)).html();\r\n };\r\n\r\n var HTMLInput = HTMLBase.extend({\r\n init: function(element, options) {\r\n var that = this;\r\n HTMLBase.fn.init.call(that, element, options);\r\n that._wrapper();\r\n that._addClasses();\r\n },\r\n options: {\r\n label: null,\r\n labelPosition: \"after\",\r\n labelId: null,\r\n encoded: true\r\n },\r\n _wrapper: function() {\r\n var that = this,\r\n element = that.element[0],\r\n options = that.options,\r\n elementId = element.id;\r\n\r\n that.wrapper = that.element\r\n .addClass(options.inputClass)\r\n .prop(\"type\", options.type);\r\n\r\n if (!elementId && !!options.label) {\r\n element.id = elementId = kendo.guid();\r\n }\r\n\r\n if (!!options.label) {\r\n that.labelEl = $(\"