{"version":3,"file":"kendo.core.min.js","sources":["kendo.core.js"],"sourcesContent":["(function(f, define) {\n define('kendo.core',['jquery'], f);\n})(function() {\n\nvar __meta__ = {\n id: \"core\",\n name: \"Core\",\n category: \"framework\",\n description: \"The core of the Kendo framework.\"\n};\n\nvar packageMetadata = {\n name: '@progress/kendo-ui',\n productName: 'Kendo UI',\n productCodes: ['KENDOUICOMPLETE', 'KENDOUI', 'KENDOUI', 'KENDOUICOMPLETE'],\n publishDate: 0,\n version: '',\n licensingDocsUrl: 'https://docs.telerik.com/kendo-ui/intro/installation/using-license-code'\n};\n\n\n(function($, window, undefined) {\n var kendo = window.kendo = window.kendo || { cultures: {} },\n extend = $.extend,\n each = $.each,\n isArray = Array.isArray,\n noop = $.noop,\n math = Math,\n Template,\n JSON = window.JSON || {},\n support = {},\n percentRegExp = /%/,\n formatRegExp = /\\{(\\d+)(:[^\\}]+)?\\}/g,\n boxShadowRegExp = /(\\d+(?:\\.?)\\d*)px\\s*(\\d+(?:\\.?)\\d*)px\\s*(\\d+(?:\\.?)\\d*)px\\s*(\\d+)?/i,\n numberRegExp = /^(\\+|-?)\\d+(\\.?)\\d*$/,\n FUNCTION = \"function\",\n STRING = \"string\",\n NUMBER = \"number\",\n OBJECT = \"object\",\n NULL = \"null\",\n BOOLEAN = \"boolean\",\n UNDEFINED = \"undefined\",\n PREFIX = \"prefix\",\n ARIA_LABELLEDBY = \"aria-labelledby\",\n ARIA_LABEL = \"aria-label\",\n LABELIDPART = \"_label\",\n getterCache = {},\n setterCache = {},\n slice = [].slice,\n cssPropertiesNames = [ \"themeColor\", \"fillMode\", \"shape\", \"size\", \"rounded\", \"positionMode\" ],\n // avoid extending the depricated properties in latest verions of jQuery\n noDepricateExtend = function() {\n var src, copyIsArray, copy, name, options, clone,\n target = arguments[ 0 ] || {},\n i = 1,\n length = arguments.length,\n deep = false;\n\n // Handle a deep copy situation\n if ( typeof target === \"boolean\" ) {\n deep = target;\n\n // skip the boolean and the target\n target = arguments[ i ] || {};\n i++;\n }\n\n // Handle case when target is a string or something (possible in deep copy)\n if ( typeof target !== \"object\" && typeof target !== \"function\") {\n target = {};\n }\n\n // extend jQuery itself if only one argument is passed\n if ( i === length ) {\n target = this;\n i--;\n }\n\n for ( ; i < length; i++ ) {\n\n // Only deal with non-null/undefined values\n if ( ( options = arguments[ i ] ) != null ) {\n\n // Extend the base object\n for ( name in options ) {\n // filters, concat and : properties are depricated in the jQuery 3.3.0\n // accessing these properties throw a warning when jQuery migrate is included\n if (name == \"filters\" || name == \"concat\" || name == \":\") {\n continue;\n }\n src = target[ name ];\n copy = options[ name ];\n\n // Prevent never-ending loop\n if ( target === copy ) {\n continue;\n }\n\n // Recurse if we're merging plain objects or arrays\n if ( deep && copy && ( jQuery.isPlainObject( copy ) ||\n ( copyIsArray = Array.isArray( copy ) ) ) ) {\n\n if ( copyIsArray ) {\n copyIsArray = false;\n clone = src && Array.isArray( src ) ? src : [];\n\n } else {\n clone = src && jQuery.isPlainObject( src ) ? src : {};\n }\n\n // Never move original objects, clone them\n target[ name ] = noDepricateExtend( deep, clone, copy );\n\n // Don't bring in undefined values\n } else if ( copy !== undefined ) {\n target[ name ] = copy;\n }\n }\n }\n }\n\n // Return the modified object\n return target;\n };\n\n kendo.version = \"2022.3.913\".replace(/^\\s+|\\s+$/g, '');\n\n function Class() {}\n\n Class.extend = function(proto) {\n var base = function() {},\n member,\n that = this,\n subclass = proto && proto.init ? proto.init : function() {\n that.apply(this, arguments);\n },\n fn;\n\n base.prototype = that.prototype;\n fn = subclass.fn = subclass.prototype = new base();\n\n for (member in proto) {\n if (proto[member] != null && proto[member].constructor === Object) {\n // Merge object members\n fn[member] = extend(true, {}, base.prototype[member], proto[member]);\n } else {\n fn[member] = proto[member];\n }\n }\n\n fn.constructor = subclass;\n subclass.extend = that.extend;\n\n return subclass;\n };\n\n Class.prototype._initOptions = function(options) {\n this.options = deepExtend({}, this.options, options);\n };\n\n var isFunction = kendo.isFunction = function(fn) {\n return typeof fn === \"function\";\n };\n\n var preventDefault = function() {\n this._defaultPrevented = true;\n };\n\n var isDefaultPrevented = function() {\n return this._defaultPrevented === true;\n };\n\n var Observable = Class.extend({\n init: function() {\n this._events = {};\n },\n\n bind: function(eventName, handlers, one) {\n var that = this,\n idx,\n eventNames = typeof eventName === STRING ? [eventName] : eventName,\n length,\n original,\n handler,\n handlersIsFunction = typeof handlers === FUNCTION,\n events;\n\n if (handlers === undefined) {\n for (idx in eventName) {\n that.bind(idx, eventName[idx]);\n }\n return that;\n }\n\n for (idx = 0, length = eventNames.length; idx < length; idx++) {\n eventName = eventNames[idx];\n\n handler = handlersIsFunction ? handlers : handlers[eventName];\n\n if (handler) {\n if (one) {\n original = handler;\n handler = function() {\n that.unbind(eventName, handler);\n original.apply(that, arguments);\n };\n handler.original = original;\n }\n events = that._events[eventName] = that._events[eventName] || [];\n events.push(handler);\n }\n }\n\n return that;\n },\n\n one: function(eventNames, handlers) {\n return this.bind(eventNames, handlers, true);\n },\n\n first: function(eventName, handlers) {\n var that = this,\n idx,\n eventNames = typeof eventName === STRING ? [eventName] : eventName,\n length,\n handler,\n handlersIsFunction = typeof handlers === FUNCTION,\n events;\n\n for (idx = 0, length = eventNames.length; idx < length; idx++) {\n eventName = eventNames[idx];\n\n handler = handlersIsFunction ? handlers : handlers[eventName];\n\n if (handler) {\n events = that._events[eventName] = that._events[eventName] || [];\n events.unshift(handler);\n }\n }\n\n return that;\n },\n\n trigger: function(eventName, e) {\n var that = this,\n events = that._events[eventName],\n idx,\n length;\n\n if (events) {\n e = e || {};\n\n e.sender = that;\n\n e._defaultPrevented = false;\n\n e.preventDefault = preventDefault;\n\n e.isDefaultPrevented = isDefaultPrevented;\n\n events = events.slice();\n\n for (idx = 0, length = events.length; idx < length; idx++) {\n events[idx].call(that, e);\n }\n\n return e._defaultPrevented === true;\n }\n\n return false;\n },\n\n unbind: function(eventName, handler) {\n var that = this,\n events = that._events[eventName],\n idx;\n\n if (eventName === undefined) {\n that._events = {};\n } else if (events) {\n if (handler) {\n for (idx = events.length - 1; idx >= 0; idx--) {\n if (events[idx] === handler || events[idx].original === handler) {\n events.splice(idx, 1);\n }\n }\n } else {\n that._events[eventName] = [];\n }\n }\n\n return that;\n }\n });\n\n\n function compilePart(part, stringPart) {\n if (stringPart) {\n return \"'\" +\n part.split(\"'\").join(\"\\\\'\")\n .split('\\\\\"').join('\\\\\\\\\\\\\"')\n .replace(/\\n/g, \"\\\\n\")\n .replace(/\\r/g, \"\\\\r\")\n .replace(/\\t/g, \"\\\\t\") + \"'\";\n } else {\n var first = part.charAt(0),\n rest = part.substring(1);\n\n if (first === \"=\") {\n return \"+(\" + rest + \")+\";\n } else if (first === \":\") {\n return \"+$kendoHtmlEncode(\" + rest + \")+\";\n } else {\n return \";\" + part + \";$kendoOutput+=\";\n }\n }\n }\n\n var argumentNameRegExp = /^\\w+/,\n encodeRegExp = /\\$\\{([^}]*)\\}/g,\n escapedCurlyRegExp = /\\\\\\}/g,\n curlyRegExp = /__CURLY__/g,\n escapedSharpRegExp = /\\\\#/g,\n sharpRegExp = /__SHARP__/g,\n zeros = [\"\", \"0\", \"00\", \"000\", \"0000\"];\n\n Template = {\n paramName: \"data\", // name of the parameter of the generated template\n useWithBlock: true, // whether to wrap the template in a with() block\n render: function(template, data) {\n var idx,\n length,\n html = \"\";\n\n for (idx = 0, length = data.length; idx < length; idx++) {\n html += template(data[idx]);\n }\n\n return html;\n },\n compile: function(template, options) {\n var settings = extend({}, this, options),\n paramName = settings.paramName,\n argumentName = paramName.match(argumentNameRegExp)[0],\n useWithBlock = settings.useWithBlock,\n functionBody = \"var $kendoOutput, $kendoHtmlEncode = kendo.htmlEncode;\",\n fn,\n parts,\n idx;\n\n if (isFunction(template)) {\n return template;\n }\n\n functionBody += useWithBlock ? \"with(\" + paramName + \"){\" : \"\";\n\n functionBody += \"$kendoOutput=\";\n\n parts = template\n .replace(escapedCurlyRegExp, \"__CURLY__\")\n .replace(encodeRegExp, \"#=$kendoHtmlEncode($1)#\")\n .replace(curlyRegExp, \"}\")\n .replace(escapedSharpRegExp, \"__SHARP__\")\n .split(\"#\");\n\n for (idx = 0; idx < parts.length; idx ++) {\n functionBody += compilePart(parts[idx], idx % 2 === 0);\n }\n\n functionBody += useWithBlock ? \";}\" : \";\";\n\n functionBody += \"return $kendoOutput;\";\n\n functionBody = functionBody.replace(sharpRegExp, \"#\");\n\n try {\n fn = new Function(argumentName, functionBody);\n fn._slotCount = Math.floor(parts.length / 2);\n return fn;\n } catch (e) {\n throw new Error(kendo.format(\"Invalid template:'{0}' Generated code:'{1}'\", template, functionBody));\n }\n }\n };\n\nfunction pad(number, digits, end) {\n number = number + \"\";\n digits = digits || 2;\n end = digits - number.length;\n\n if (end) {\n return zeros[digits].substring(0, end) + number;\n }\n\n return number;\n}\n\n //JSON stringify\n(function() {\n var escapable = /[\\\\\\\"\\x00-\\x1f\\x7f-\\x9f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g,\n gap,\n indent,\n meta = {\n \"\\b\": \"\\\\b\",\n \"\\t\": \"\\\\t\",\n \"\\n\": \"\\\\n\",\n \"\\f\": \"\\\\f\",\n \"\\r\": \"\\\\r\",\n \"\\\"\": '\\\\\"',\n \"\\\\\": \"\\\\\\\\\"\n },\n rep,\n toString = {}.toString;\n\n\n if (typeof Date.prototype.toJSON !== FUNCTION) {\n\n Date.prototype.toJSON = function() {\n var that = this;\n\n return isFinite(that.valueOf()) ?\n pad(that.getUTCFullYear(), 4) + \"-\" +\n pad(that.getUTCMonth() + 1) + \"-\" +\n pad(that.getUTCDate()) + \"T\" +\n pad(that.getUTCHours()) + \":\" +\n pad(that.getUTCMinutes()) + \":\" +\n pad(that.getUTCSeconds()) + \"Z\" : null;\n };\n\n String.prototype.toJSON = Number.prototype.toJSON = Boolean.prototype.toJSON = function() {\n return this.valueOf();\n };\n }\n\n function quote(string) {\n escapable.lastIndex = 0;\n return escapable.test(string) ? \"\\\"\" + string.replace(escapable, function(a) {\n var c = meta[a];\n return typeof c === STRING ? c :\n \"\\\\u\" + (\"0000\" + a.charCodeAt(0).toString(16)).slice(-4);\n }) + \"\\\"\" : \"\\\"\" + string + \"\\\"\";\n }\n\n function str(key, holder) {\n var i,\n k,\n v,\n length,\n mind = gap,\n partial,\n value = holder[key],\n type;\n\n if (value && typeof value === OBJECT && typeof value.toJSON === FUNCTION) {\n value = value.toJSON(key);\n }\n\n if (typeof rep === FUNCTION) {\n value = rep.call(holder, key, value);\n }\n\n type = typeof value;\n if (type === STRING) {\n return quote(value);\n } else if (type === NUMBER) {\n return isFinite(value) ? String(value) : NULL;\n } else if (type === BOOLEAN || type === NULL) {\n return String(value);\n } else if (type === OBJECT) {\n if (!value) {\n return NULL;\n }\n gap += indent;\n partial = [];\n if (toString.apply(value) === \"[object Array]\") {\n length = value.length;\n for (i = 0; i < length; i++) {\n partial[i] = str(i, value) || NULL;\n }\n v = partial.length === 0 ? \"[]\" : gap ?\n \"[\\n\" + gap + partial.join(\",\\n\" + gap) + \"\\n\" + mind + \"]\" :\n \"[\" + partial.join(\",\") + \"]\";\n gap = mind;\n return v;\n }\n if (rep && typeof rep === OBJECT) {\n length = rep.length;\n for (i = 0; i < length; i++) {\n if (typeof rep[i] === STRING) {\n k = rep[i];\n v = str(k, value);\n if (v) {\n partial.push(quote(k) + (gap ? \": \" : \":\") + v);\n }\n }\n }\n } else {\n for (k in value) {\n if (Object.hasOwnProperty.call(value, k)) {\n v = str(k, value);\n if (v) {\n partial.push(quote(k) + (gap ? \": \" : \":\") + v);\n }\n }\n }\n }\n\n v = partial.length === 0 ? \"{}\" : gap ?\n \"{\\n\" + gap + partial.join(\",\\n\" + gap) + \"\\n\" + mind + \"}\" :\n \"{\" + partial.join(\",\") + \"}\";\n gap = mind;\n return v;\n }\n }\n\n if (typeof JSON.stringify !== FUNCTION) {\n JSON.stringify = function(value, replacer, space) {\n var i;\n gap = \"\";\n indent = \"\";\n\n if (typeof space === NUMBER) {\n for (i = 0; i < space; i += 1) {\n indent += \" \";\n }\n\n } else if (typeof space === STRING) {\n indent = space;\n }\n\n rep = replacer;\n if (replacer && typeof replacer !== FUNCTION && (typeof replacer !== OBJECT || typeof replacer.length !== NUMBER)) {\n throw new Error(\"JSON.stringify\");\n }\n\n return str(\"\", { \"\": value });\n };\n }\n})();\n\n// Date and Number formatting\n(function() {\n var dateFormatRegExp = /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,\n standardFormatRegExp = /^(n|c|p|e)(\\d*)$/i,\n literalRegExp = /(\\\\.)|(['][^']*[']?)|([\"][^\"]*[\"]?)/g,\n commaRegExp = /\\,/g,\n EMPTY = \"\",\n POINT = \".\",\n COMMA = \",\",\n SHARP = \"#\",\n ZERO = \"0\",\n PLACEHOLDER = \"??\",\n EN = \"en-US\",\n objectToString = {}.toString;\n\n //cultures\n kendo.cultures[\"en-US\"] = {\n name: EN,\n numberFormat: {\n pattern: [\"-n\"],\n decimals: 2,\n \",\": \",\",\n \".\": \".\",\n groupSize: [3],\n percent: {\n pattern: [\"-n %\", \"n %\"],\n decimals: 2,\n \",\": \",\",\n \".\": \".\",\n groupSize: [3],\n symbol: \"%\"\n },\n currency: {\n name: \"US Dollar\",\n abbr: \"USD\",\n pattern: [\"($n)\", \"$n\"],\n decimals: 2,\n \",\": \",\",\n \".\": \".\",\n groupSize: [3],\n symbol: \"$\"\n }\n },\n calendars: {\n standard: {\n days: {\n names: [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"],\n namesAbbr: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n namesShort: [ \"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\" ]\n },\n months: {\n names: [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"],\n namesAbbr: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"]\n },\n AM: [ \"AM\", \"am\", \"AM\" ],\n PM: [ \"PM\", \"pm\", \"PM\" ],\n patterns: {\n d: \"M/d/yyyy\",\n D: \"dddd, MMMM dd, yyyy\",\n F: \"dddd, MMMM dd, yyyy h:mm:ss tt\",\n g: \"M/d/yyyy h:mm tt\",\n G: \"M/d/yyyy h:mm:ss tt\",\n m: \"MMMM dd\",\n M: \"MMMM dd\",\n s: \"yyyy'-'MM'-'ddTHH':'mm':'ss\",\n t: \"h:mm tt\",\n T: \"h:mm:ss tt\",\n u: \"yyyy'-'MM'-'dd HH':'mm':'ss'Z'\",\n y: \"MMMM, yyyy\",\n Y: \"MMMM, yyyy\"\n },\n \"/\": \"/\",\n \":\": \":\",\n firstDay: 0,\n twoDigitYearMax: 2029\n }\n }\n };\n\n\n function findCulture(culture) {\n if (culture) {\n if (culture.numberFormat) {\n return culture;\n }\n\n if (typeof culture === STRING) {\n var cultures = kendo.cultures;\n return cultures[culture] || cultures[culture.split(\"-\")[0]] || null;\n }\n\n return null;\n }\n\n return null;\n }\n\n function getCulture(culture) {\n if (culture) {\n culture = findCulture(culture);\n }\n\n return culture || kendo.cultures.current;\n }\n\n kendo.culture = function(cultureName) {\n var cultures = kendo.cultures, culture;\n\n if (cultureName !== undefined) {\n culture = findCulture(cultureName) || cultures[EN];\n culture.calendar = culture.calendars.standard;\n cultures.current = culture;\n } else {\n return cultures.current;\n }\n };\n\n kendo.findCulture = findCulture;\n kendo.getCulture = getCulture;\n\n //set current culture to en-US.\n kendo.culture(EN);\n\n function formatDate(date, format, culture) {\n culture = getCulture(culture);\n\n var calendar = culture.calendars.standard,\n days = calendar.days,\n months = calendar.months;\n\n format = calendar.patterns[format] || format;\n\n return format.replace(dateFormatRegExp, function(match) {\n var minutes;\n var result;\n var sign;\n\n if (match === \"d\") {\n result = date.getDate();\n } else if (match === \"dd\") {\n result = pad(date.getDate());\n } else if (match === \"ddd\") {\n result = days.namesAbbr[date.getDay()];\n } else if (match === \"dddd\") {\n result = days.names[date.getDay()];\n } else if (match === \"M\") {\n result = date.getMonth() + 1;\n } else if (match === \"MM\") {\n result = pad(date.getMonth() + 1);\n } else if (match === \"MMM\") {\n result = months.namesAbbr[date.getMonth()];\n } else if (match === \"MMMM\") {\n result = months.names[date.getMonth()];\n } else if (match === \"yy\") {\n result = pad(date.getFullYear() % 100);\n } else if (match === \"yyyy\") {\n result = pad(date.getFullYear(), 4);\n } else if (match === \"h\" ) {\n result = date.getHours() % 12 || 12;\n } else if (match === \"hh\") {\n result = pad(date.getHours() % 12 || 12);\n } else if (match === \"H\") {\n result = date.getHours();\n } else if (match === \"HH\") {\n result = pad(date.getHours());\n } else if (match === \"m\") {\n result = date.getMinutes();\n } else if (match === \"mm\") {\n result = pad(date.getMinutes());\n } else if (match === \"s\") {\n result = date.getSeconds();\n } else if (match === \"ss\") {\n result = pad(date.getSeconds());\n } else if (match === \"f\") {\n result = math.floor(date.getMilliseconds() / 100);\n } else if (match === \"ff\") {\n result = date.getMilliseconds();\n if (result > 99) {\n result = math.floor(result / 10);\n }\n result = pad(result);\n } else if (match === \"fff\") {\n result = pad(date.getMilliseconds(), 3);\n } else if (match === \"tt\") {\n result = date.getHours() < 12 ? calendar.AM[0] : calendar.PM[0];\n } else if (match === \"zzz\") {\n minutes = date.getTimezoneOffset();\n sign = minutes < 0;\n\n result = math.abs(minutes / 60).toString().split(\".\")[0];\n minutes = math.abs(minutes) - (result * 60);\n\n result = (sign ? \"+\" : \"-\") + pad(result);\n result += \":\" + pad(minutes);\n } else if (match === \"zz\" || match === \"z\") {\n result = date.getTimezoneOffset() / 60;\n sign = result < 0;\n\n result = math.abs(result).toString().split(\".\")[0];\n result = (sign ? \"+\" : \"-\") + (match === \"zz\" ? pad(result) : result);\n }\n\n return result !== undefined ? result : match.slice(1, match.length - 1);\n });\n }\n\n //number formatting\n function formatNumber(number, format, culture) {\n culture = getCulture(culture);\n\n var numberFormat = culture.numberFormat,\n decimal = numberFormat[POINT],\n precision = numberFormat.decimals,\n pattern = numberFormat.pattern[0],\n literals = [],\n symbol,\n isCurrency, isPercent,\n customPrecision,\n formatAndPrecision,\n negative = number < 0,\n integer,\n fraction,\n integerLength,\n fractionLength,\n replacement = EMPTY,\n value = EMPTY,\n idx,\n length,\n ch,\n hasGroup,\n hasNegativeFormat,\n decimalIndex,\n sharpIndex,\n zeroIndex,\n hasZero, hasSharp,\n percentIndex,\n currencyIndex,\n startZeroIndex,\n start = -1,\n end;\n\n //return empty string if no number\n if (number === undefined) {\n return EMPTY;\n }\n\n if (!isFinite(number)) {\n return number;\n }\n\n //if no format then return number.toString() or number.toLocaleString() if culture.name is not defined\n if (!format) {\n return culture.name.length ? number.toLocaleString() : number.toString();\n }\n\n formatAndPrecision = standardFormatRegExp.exec(format);\n\n // standard formatting\n if (formatAndPrecision) {\n format = formatAndPrecision[1].toLowerCase();\n\n isCurrency = format === \"c\";\n isPercent = format === \"p\";\n\n if (isCurrency || isPercent) {\n //get specific number format information if format is currency or percent\n numberFormat = isCurrency ? numberFormat.currency : numberFormat.percent;\n decimal = numberFormat[POINT];\n precision = numberFormat.decimals;\n symbol = numberFormat.symbol;\n pattern = numberFormat.pattern[negative ? 0 : 1];\n }\n\n customPrecision = formatAndPrecision[2];\n\n if (customPrecision) {\n precision = +customPrecision;\n }\n\n //return number in exponential format\n if (format === \"e\") {\n var exp = customPrecision ? number.toExponential(precision) : number.toExponential(); // toExponential() and toExponential(undefined) differ in FF #653438.\n\n return exp.replace(POINT, numberFormat[POINT]);\n }\n\n // multiply if format is percent\n if (isPercent) {\n number *= 100;\n }\n\n number = round(number, precision);\n negative = number < 0;\n number = number.split(POINT);\n\n integer = number[0];\n fraction = number[1];\n\n //exclude \"-\" if number is negative.\n if (negative) {\n integer = integer.substring(1);\n }\n\n value = groupInteger(integer, 0, integer.length, numberFormat);\n\n if (fraction) {\n value += decimal + fraction;\n }\n\n if (format === \"n\" && !negative) {\n return value;\n }\n\n number = EMPTY;\n\n for (idx = 0, length = pattern.length; idx < length; idx++) {\n ch = pattern.charAt(idx);\n\n if (ch === \"n\") {\n number += value;\n } else if (ch === \"$\" || ch === \"%\") {\n number += symbol;\n } else {\n number += ch;\n }\n }\n\n return number;\n }\n\n //custom formatting\n //\n //separate format by sections.\n\n if (format.indexOf(\"'\") > -1 || format.indexOf(\"\\\"\") > -1 || format.indexOf(\"\\\\\") > -1) {\n format = format.replace(literalRegExp, function(match) {\n var quoteChar = match.charAt(0).replace(\"\\\\\", \"\"),\n literal = match.slice(1).replace(quoteChar, \"\");\n\n literals.push(literal);\n\n return PLACEHOLDER;\n });\n }\n\n format = format.split(\";\");\n if (negative && format[1]) {\n //get negative format\n format = format[1];\n hasNegativeFormat = true;\n } else if (number === 0 && format[2]) {\n //format for zeros\n format = format[2];\n if (format.indexOf(SHARP) == -1 && format.indexOf(ZERO) == -1) {\n //return format if it is string constant.\n return format;\n }\n } else {\n format = format[0];\n }\n\n percentIndex = format.indexOf(\"%\");\n currencyIndex = format.indexOf(\"$\");\n\n isPercent = percentIndex != -1;\n isCurrency = currencyIndex != -1;\n\n //multiply number if the format has percent\n if (isPercent) {\n number *= 100;\n }\n\n if (isCurrency && format[currencyIndex - 1] === \"\\\\\") {\n format = format.split(\"\\\\\").join(\"\");\n isCurrency = false;\n }\n\n if (isCurrency || isPercent) {\n //get specific number format information if format is currency or percent\n numberFormat = isCurrency ? numberFormat.currency : numberFormat.percent;\n decimal = numberFormat[POINT];\n precision = numberFormat.decimals;\n symbol = numberFormat.symbol;\n }\n\n hasGroup = format.indexOf(COMMA) > -1;\n if (hasGroup) {\n format = format.replace(commaRegExp, EMPTY);\n }\n\n decimalIndex = format.indexOf(POINT);\n length = format.length;\n\n if (decimalIndex != -1) {\n fraction = number.toString().split(\"e\");\n if (fraction[1]) {\n fraction = round(number, Math.abs(fraction[1]));\n } else {\n fraction = fraction[0];\n }\n fraction = fraction.split(POINT)[1] || EMPTY;\n zeroIndex = format.lastIndexOf(ZERO) - decimalIndex;\n sharpIndex = format.lastIndexOf(SHARP) - decimalIndex;\n hasZero = zeroIndex > -1;\n hasSharp = sharpIndex > -1;\n idx = fraction.length;\n\n if (!hasZero && !hasSharp) {\n format = format.substring(0, decimalIndex) + format.substring(decimalIndex + 1);\n length = format.length;\n decimalIndex = -1;\n idx = 0;\n }\n\n if (hasZero && zeroIndex > sharpIndex) {\n idx = zeroIndex;\n } else if (sharpIndex > zeroIndex) {\n if (hasSharp && idx > sharpIndex) {\n var rounded = round(number, sharpIndex, negative);\n\n while (rounded.charAt(rounded.length - 1) === ZERO && sharpIndex > 0 && sharpIndex > zeroIndex) {\n sharpIndex--;\n\n rounded = round(number, sharpIndex, negative);\n }\n\n idx = sharpIndex;\n } else if (hasZero && idx < zeroIndex) {\n idx = zeroIndex;\n }\n }\n }\n\n number = round(number, idx, negative);\n\n sharpIndex = format.indexOf(SHARP);\n startZeroIndex = zeroIndex = format.indexOf(ZERO);\n\n //define the index of the first digit placeholder\n if (sharpIndex == -1 && zeroIndex != -1) {\n start = zeroIndex;\n } else if (sharpIndex != -1 && zeroIndex == -1) {\n start = sharpIndex;\n } else {\n start = sharpIndex > zeroIndex ? zeroIndex : sharpIndex;\n }\n\n sharpIndex = format.lastIndexOf(SHARP);\n zeroIndex = format.lastIndexOf(ZERO);\n\n //define the index of the last digit placeholder\n if (sharpIndex == -1 && zeroIndex != -1) {\n end = zeroIndex;\n } else if (sharpIndex != -1 && zeroIndex == -1) {\n end = sharpIndex;\n } else {\n end = sharpIndex > zeroIndex ? sharpIndex : zeroIndex;\n }\n\n if (start == length) {\n end = start;\n }\n\n if (start != -1) {\n value = number.toString().split(POINT);\n integer = value[0];\n fraction = value[1] || EMPTY;\n\n integerLength = integer.length;\n fractionLength = fraction.length;\n\n if (negative && (number * -1) >= 0) {\n negative = false;\n }\n\n number = format.substring(0, start);\n\n if (negative && !hasNegativeFormat) {\n number += \"-\";\n }\n\n for (idx = start; idx < length; idx++) {\n ch = format.charAt(idx);\n\n if (decimalIndex == -1) {\n if (end - idx < integerLength) {\n number += integer;\n break;\n }\n } else {\n if (zeroIndex != -1 && zeroIndex < idx) {\n replacement = EMPTY;\n }\n\n if ((decimalIndex - idx) <= integerLength && decimalIndex - idx > -1) {\n number += integer;\n idx = decimalIndex;\n }\n\n if (decimalIndex === idx) {\n number += (fraction ? decimal : EMPTY) + fraction;\n idx += end - decimalIndex + 1;\n continue;\n }\n }\n\n if (ch === ZERO) {\n number += ch;\n replacement = ch;\n } else if (ch === SHARP) {\n number += replacement;\n }\n }\n\n if (hasGroup) {\n number = groupInteger(number, start + (negative && !hasNegativeFormat ? 1 : 0), Math.max(end, (integerLength + start)), numberFormat);\n }\n\n if (end >= start) {\n number += format.substring(end + 1);\n }\n\n //replace symbol placeholders\n if (isCurrency || isPercent) {\n value = EMPTY;\n for (idx = 0, length = number.length; idx < length; idx++) {\n ch = number.charAt(idx);\n value += (ch === \"$\" || ch === \"%\") ? symbol : ch;\n }\n number = value;\n }\n\n length = literals.length;\n\n if (length) {\n for (idx = 0; idx < length; idx++) {\n number = number.replace(PLACEHOLDER, literals[idx]);\n }\n }\n }\n\n return number;\n }\n\n var groupInteger = function(number, start, end, numberFormat) {\n var decimalIndex = number.indexOf(numberFormat[POINT]);\n var groupSizes = numberFormat.groupSize.slice();\n var groupSize = groupSizes.shift();\n var integer, integerLength;\n var idx, parts, value;\n var newGroupSize;\n\n end = decimalIndex !== -1 ? decimalIndex : end + 1;\n\n integer = number.substring(start, end);\n integerLength = integer.length;\n\n if (integerLength >= groupSize) {\n idx = integerLength;\n parts = [];\n\n while (idx > -1) {\n value = integer.substring(idx - groupSize, idx);\n if (value) {\n parts.push(value);\n }\n idx -= groupSize;\n newGroupSize = groupSizes.shift();\n groupSize = newGroupSize !== undefined ? newGroupSize : groupSize;\n\n if (groupSize === 0) {\n if (idx > 0) {\n parts.push(integer.substring(0, idx));\n }\n break;\n }\n }\n\n integer = parts.reverse().join(numberFormat[COMMA]);\n number = number.substring(0, start) + integer + number.substring(end);\n }\n\n return number;\n };\n\n var round = function(value, precision, negative) {\n precision = precision || 0;\n\n value = value.toString().split('e');\n value = Math.round(+(value[0] + 'e' + (value[1] ? (+value[1] + precision) : precision)));\n\n if (negative) {\n value = -value;\n }\n\n value = value.toString().split('e');\n value = +(value[0] + 'e' + (value[1] ? (+value[1] - precision) : -precision));\n\n return value.toFixed(Math.min(precision, 20));\n };\n\n var toString = function(value, fmt, culture) {\n if (fmt) {\n if (objectToString.call(value) === \"[object Date]\") {\n return formatDate(value, fmt, culture);\n } else if (typeof value === NUMBER) {\n return formatNumber(value, fmt, culture);\n }\n }\n\n return value !== undefined ? value : \"\";\n };\n\n kendo.format = function(fmt) {\n var values = arguments;\n\n return fmt.replace(formatRegExp, function(match, index, placeholderFormat) {\n var value = values[parseInt(index, 10) + 1];\n\n return toString(value, placeholderFormat ? placeholderFormat.substring(1) : \"\");\n });\n };\n\n kendo._extractFormat = function(format) {\n if (format.slice(0,3) === \"{0:\") {\n format = format.slice(3, format.length - 1);\n }\n\n return format;\n };\n\n kendo._activeElement = function() {\n try {\n return document.activeElement;\n } catch (e) {\n return document.documentElement.activeElement;\n }\n };\n\n kendo._round = round;\n kendo._outerWidth = function(element, includeMargin) { return $(element).outerWidth(includeMargin || false) || 0; };\n kendo._outerHeight = function(element, includeMargin) { return $(element).outerHeight(includeMargin || false) || 0; };\n kendo.toString = toString;\n})();\n\n\n(function() {\n var nonBreakingSpaceRegExp = /\\u00A0/g,\n spaceRegExp = /\\s/g,\n exponentRegExp = /[eE][\\-+]?[0-9]+/,\n shortTimeZoneRegExp = /[+|\\-]\\d{1,2}/,\n longTimeZoneRegExp = /[+|\\-]\\d{1,2}:?\\d{2}/,\n dateRegExp = /^\\/Date\\((.*?)\\)\\/$/,\n offsetRegExp = /[+-]\\d*/,\n FORMATS_SEQUENCE = [ [], [ \"G\", \"g\", \"F\" ], [ \"D\", \"d\", \"y\", \"m\", \"T\", \"t\" ] ],\n STANDARD_FORMATS = [\n [\n \"yyyy-MM-ddTHH:mm:ss.fffffffzzz\",\n \"yyyy-MM-ddTHH:mm:ss.fffffff\",\n \"yyyy-MM-ddTHH:mm:ss.fffzzz\",\n \"yyyy-MM-ddTHH:mm:ss.fff\",\n \"ddd MMM dd yyyy HH:mm:ss\",\n \"yyyy-MM-ddTHH:mm:sszzz\",\n \"yyyy-MM-ddTHH:mmzzz\",\n \"yyyy-MM-ddTHH:mmzz\",\n \"yyyy-MM-ddTHH:mm:ss\",\n \"yyyy-MM-dd HH:mm:ss\",\n \"yyyy/MM/dd HH:mm:ss\"\n ], [\n \"yyyy-MM-ddTHH:mm\",\n \"yyyy-MM-dd HH:mm\",\n \"yyyy/MM/dd HH:mm\"\n ], [\n \"yyyy/MM/dd\",\n \"yyyy-MM-dd\",\n \"HH:mm:ss\",\n \"HH:mm\"\n ]\n ],\n numberRegExp = {\n 2: /^\\d{1,2}/,\n 3: /^\\d{1,3}/,\n 4: /^\\d{4}/\n },\n objectToString = {}.toString;\n\n function outOfRange(value, start, end) {\n return !(value >= start && value <= end);\n }\n\n function designatorPredicate(designator) {\n return designator.charAt(0);\n }\n\n function mapDesignators(designators) {\n return $.map(designators, designatorPredicate);\n }\n\n //if date's day is different than the typed one - adjust\n function adjustDST(date, hours) {\n if (!hours && date.getHours() === 23) {\n date.setHours(date.getHours() + 2);\n }\n }\n\n function lowerArray(data) {\n var idx = 0,\n length = data.length,\n array = [];\n\n for (; idx < length; idx++) {\n array[idx] = (data[idx] + \"\").toLowerCase();\n }\n\n return array;\n }\n\n function lowerLocalInfo(localInfo) {\n var newLocalInfo = {}, property;\n\n for (property in localInfo) {\n newLocalInfo[property] = lowerArray(localInfo[property]);\n }\n\n return newLocalInfo;\n }\n\n function parseExact(value, format, culture, strict) {\n if (!value) {\n return null;\n }\n\n var lookAhead = function(match) {\n var i = 0;\n while (format[idx] === match) {\n i++;\n idx++;\n }\n if (i > 0) {\n idx -= 1;\n }\n return i;\n },\n getNumber = function(size) {\n var rg = numberRegExp[size] || new RegExp('^\\\\d{1,' + size + '}'),\n match = value.substr(valueIdx, size).match(rg);\n\n if (match) {\n match = match[0];\n valueIdx += match.length;\n return parseInt(match, 10);\n }\n return null;\n },\n getIndexByName = function(names, lower) {\n var i = 0,\n length = names.length,\n name, nameLength,\n matchLength = 0,\n matchIdx = 0,\n subValue;\n\n for (; i < length; i++) {\n name = names[i];\n nameLength = name.length;\n subValue = value.substr(valueIdx, nameLength);\n\n if (lower) {\n subValue = subValue.toLowerCase();\n }\n\n if (subValue == name && nameLength > matchLength) {\n matchLength = nameLength;\n matchIdx = i;\n }\n }\n\n if (matchLength) {\n valueIdx += matchLength;\n return matchIdx + 1;\n }\n\n return null;\n },\n checkLiteral = function() {\n var result = false;\n if (value.charAt(valueIdx) === format[idx]) {\n valueIdx++;\n result = true;\n }\n return result;\n },\n calendar = culture.calendars.standard,\n year = null,\n month = null,\n day = null,\n hours = null,\n minutes = null,\n seconds = null,\n milliseconds = null,\n idx = 0,\n valueIdx = 0,\n literal = false,\n date = new Date(),\n twoDigitYearMax = calendar.twoDigitYearMax || 2029,\n defaultYear = date.getFullYear(),\n ch, count, length, pattern,\n pmHour, UTC, matches,\n amDesignators, pmDesignators,\n hoursOffset, minutesOffset,\n hasTime, match;\n\n if (!format) {\n format = \"d\"; //shord date format\n }\n\n //if format is part of the patterns get real format\n pattern = calendar.patterns[format];\n if (pattern) {\n format = pattern;\n }\n\n format = format.split(\"\");\n length = format.length;\n\n for (; idx < length; idx++) {\n ch = format[idx];\n\n if (literal) {\n if (ch === \"'\") {\n literal = false;\n } else {\n checkLiteral();\n }\n } else {\n if (ch === \"d\") {\n count = lookAhead(\"d\");\n if (!calendar._lowerDays) {\n calendar._lowerDays = lowerLocalInfo(calendar.days);\n }\n\n if (day !== null && count > 2) {\n continue;\n }\n\n day = count < 3 ? getNumber(2) : getIndexByName(calendar._lowerDays[count == 3 ? \"namesAbbr\" : \"names\"], true);\n\n if (day === null || outOfRange(day, 1, 31)) {\n return null;\n }\n } else if (ch === \"M\") {\n count = lookAhead(\"M\");\n if (!calendar._lowerMonths) {\n calendar._lowerMonths = lowerLocalInfo(calendar.months);\n }\n month = count < 3 ? getNumber(2) : getIndexByName(calendar._lowerMonths[count == 3 ? 'namesAbbr' : 'names'], true);\n\n if (month === null || outOfRange(month, 1, 12)) {\n return null;\n }\n month -= 1; //because month is zero based\n } else if (ch === \"y\") {\n count = lookAhead(\"y\");\n year = getNumber(count);\n\n if (year === null) {\n return null;\n }\n\n if (count == 2) {\n if (typeof twoDigitYearMax === \"string\") {\n twoDigitYearMax = defaultYear + parseInt(twoDigitYearMax, 10);\n }\n\n year = (defaultYear - defaultYear % 100) + year;\n if (year > twoDigitYearMax) {\n year -= 100;\n }\n }\n } else if (ch === \"h\" ) {\n lookAhead(\"h\");\n hours = getNumber(2);\n if (hours == 12) {\n hours = 0;\n }\n if (hours === null || outOfRange(hours, 0, 11)) {\n return null;\n }\n } else if (ch === \"H\") {\n lookAhead(\"H\");\n hours = getNumber(2);\n if (hours === null || outOfRange(hours, 0, 23)) {\n return null;\n }\n } else if (ch === \"m\") {\n lookAhead(\"m\");\n minutes = getNumber(2);\n if (minutes === null || outOfRange(minutes, 0, 59)) {\n return null;\n }\n } else if (ch === \"s\") {\n lookAhead(\"s\");\n seconds = getNumber(2);\n if (seconds === null || outOfRange(seconds, 0, 59)) {\n return null;\n }\n } else if (ch === \"f\") {\n count = lookAhead(\"f\");\n\n match = value.substr(valueIdx, count).match(numberRegExp[3]);\n milliseconds = getNumber(count); //move value index position\n\n if (milliseconds !== null) {\n milliseconds = parseFloat(\"0.\" + match[0], 10);\n milliseconds = kendo._round(milliseconds, 3);\n milliseconds *= 1000;\n }\n\n if (milliseconds === null || outOfRange(milliseconds, 0, 999)) {\n return null;\n }\n\n } else if (ch === \"t\") {\n count = lookAhead(\"t\");\n amDesignators = calendar.AM;\n pmDesignators = calendar.PM;\n\n if (count === 1) {\n amDesignators = mapDesignators(amDesignators);\n pmDesignators = mapDesignators(pmDesignators);\n }\n\n pmHour = getIndexByName(pmDesignators);\n if (!pmHour && !getIndexByName(amDesignators)) {\n return null;\n }\n }\n else if (ch === \"z\") {\n UTC = true;\n count = lookAhead(\"z\");\n\n if (value.substr(valueIdx, 1) === \"Z\") {\n checkLiteral();\n continue;\n }\n\n matches = value.substr(valueIdx, 6)\n .match(count > 2 ? longTimeZoneRegExp : shortTimeZoneRegExp);\n\n if (!matches) {\n return null;\n }\n\n matches = matches[0].split(\":\");\n\n hoursOffset = matches[0];\n minutesOffset = matches[1];\n\n if (!minutesOffset && hoursOffset.length > 3) { //(+|-)[hh][mm] format is used\n valueIdx = hoursOffset.length - 2;\n minutesOffset = hoursOffset.substring(valueIdx);\n hoursOffset = hoursOffset.substring(0, valueIdx);\n }\n\n hoursOffset = parseInt(hoursOffset, 10);\n if (outOfRange(hoursOffset, -12, 13)) {\n return null;\n }\n\n if (count > 2) {\n minutesOffset = matches[0][0] + minutesOffset;\n minutesOffset = parseInt(minutesOffset, 10);\n if (isNaN(minutesOffset) || outOfRange(minutesOffset, -59, 59)) {\n return null;\n }\n }\n } else if (ch === \"'\") {\n literal = true;\n checkLiteral();\n } else if (!checkLiteral()) {\n return null;\n }\n }\n }\n\n // if more characters follow, assume wrong format\n // https://github.com/telerik/kendo-ui-core/issues/3476\n if (strict && !/^\\s*$/.test(value.substr(valueIdx))) {\n return null;\n }\n\n hasTime = hours !== null || minutes !== null || seconds || null;\n\n if (year === null && month === null && day === null && hasTime) {\n year = defaultYear;\n month = date.getMonth();\n day = date.getDate();\n } else {\n if (year === null) {\n year = defaultYear;\n }\n\n if (day === null) {\n day = 1;\n }\n }\n\n if (pmHour && hours < 12) {\n hours += 12;\n }\n\n if (UTC) {\n if (hoursOffset) {\n hours += -hoursOffset;\n }\n\n if (minutesOffset) {\n minutes += -minutesOffset;\n }\n\n value = new Date(Date.UTC(year, month, day, hours, minutes, seconds, milliseconds));\n } else {\n value = new Date(year, month, day, hours, minutes, seconds, milliseconds);\n adjustDST(value, hours);\n }\n\n if (year < 100) {\n value.setFullYear(year);\n }\n\n if (value.getDate() !== day && UTC === undefined) {\n return null;\n }\n\n return value;\n }\n\n function parseMicrosoftFormatOffset(offset) {\n var sign = offset.substr(0, 1) === \"-\" ? -1 : 1;\n\n offset = offset.substring(1);\n offset = (parseInt(offset.substr(0, 2), 10) * 60) + parseInt(offset.substring(2), 10);\n\n return sign * offset;\n }\n\n function getDefaultFormats(culture) {\n var length = math.max(FORMATS_SEQUENCE.length, STANDARD_FORMATS.length);\n var calendar = culture.calendar || culture.calendars.standard;\n var patterns = calendar.patterns;\n var cultureFormats, formatIdx, idx;\n var formats = [];\n\n for (idx = 0; idx < length; idx++) {\n cultureFormats = FORMATS_SEQUENCE[idx];\n for (formatIdx = 0; formatIdx < cultureFormats.length; formatIdx++) {\n formats.push(patterns[cultureFormats[formatIdx]]);\n }\n formats = formats.concat(STANDARD_FORMATS[idx]);\n }\n\n return formats;\n }\n\n function internalParseDate(value, formats, culture, strict) {\n if (objectToString.call(value) === \"[object Date]\") {\n return value;\n }\n\n var idx = 0;\n var date = null;\n var length;\n var tzoffset;\n\n if (value && value.indexOf(\"/D\") === 0) {\n date = dateRegExp.exec(value);\n if (date) {\n date = date[1];\n tzoffset = offsetRegExp.exec(date.substring(1));\n\n date = new Date(parseInt(date, 10));\n\n if (tzoffset) {\n tzoffset = parseMicrosoftFormatOffset(tzoffset[0]);\n date = kendo.timezone.apply(date, 0);\n date = kendo.timezone.convert(date, 0, -1 * tzoffset);\n }\n\n return date;\n }\n }\n\n culture = kendo.getCulture(culture);\n\n if (!formats) {\n formats = getDefaultFormats(culture);\n }\n\n formats = isArray(formats) ? formats : [formats];\n length = formats.length;\n\n for (; idx < length; idx++) {\n date = parseExact(value, formats[idx], culture, strict);\n if (date) {\n return date;\n }\n }\n\n return date;\n }\n\n kendo.parseDate = function(value, formats, culture) {\n return internalParseDate(value, formats, culture, false);\n };\n\n kendo.parseExactDate = function(value, formats, culture) {\n return internalParseDate(value, formats, culture, true);\n };\n\n kendo.parseInt = function(value, culture) {\n var result = kendo.parseFloat(value, culture);\n if (result) {\n result = result | 0;\n }\n return result;\n };\n\n kendo.parseFloat = function(value, culture, format) {\n if (!value && value !== 0) {\n return null;\n }\n\n if (typeof value === NUMBER) {\n return value;\n }\n\n value = value.toString();\n culture = kendo.getCulture(culture);\n\n var number = culture.numberFormat,\n percent = number.percent,\n currency = number.currency,\n symbol = currency.symbol,\n percentSymbol = percent.symbol,\n negative = value.indexOf(\"-\"),\n parts, isPercent;\n\n //handle exponential number\n if (exponentRegExp.test(value)) {\n value = parseFloat(value.replace(number[\".\"], \".\"));\n if (isNaN(value)) {\n value = null;\n }\n return value;\n }\n\n if (negative > 0) {\n return null;\n } else {\n negative = negative > -1;\n }\n\n if (value.indexOf(symbol) > -1 || (format && format.toLowerCase().indexOf(\"c\") > -1)) {\n number = currency;\n parts = number.pattern[0].replace(\"$\", symbol).split(\"n\");\n if (value.indexOf(parts[0]) > -1 && value.indexOf(parts[1]) > -1) {\n value = value.replace(parts[0], \"\").replace(parts[1], \"\");\n negative = true;\n }\n } else if (value.indexOf(percentSymbol) > -1) {\n isPercent = true;\n number = percent;\n symbol = percentSymbol;\n }\n\n value = value.replace(\"-\", \"\")\n .replace(symbol, \"\")\n .replace(nonBreakingSpaceRegExp, \" \")\n .split(number[\",\"].replace(nonBreakingSpaceRegExp, \" \")).join(\"\")\n .replace(spaceRegExp, \"\")\n .replace(number[\".\"], \".\");\n\n value = parseFloat(value);\n\n if (isNaN(value)) {\n value = null;\n } else if (negative) {\n value *= -1;\n }\n\n if (value && isPercent) {\n value /= 100;\n }\n\n return value;\n };\n})();\n\n function getShadows(element) {\n var shadow = element.css(kendo.support.transitions.css + \"box-shadow\") || element.css(\"box-shadow\"),\n radius = shadow ? shadow.match(boxShadowRegExp) || [ 0, 0, 0, 0, 0 ] : [ 0, 0, 0, 0, 0 ],\n blur = math.max((+radius[3]), +(radius[4] || 0));\n\n return {\n left: (-radius[1]) + blur,\n right: (+radius[1]) + blur,\n bottom: (+radius[2]) + blur\n };\n }\n\n function wrap(element, autosize) {\n var percentage,\n outerWidth = kendo._outerWidth,\n outerHeight = kendo._outerHeight,\n parent = element.parent(),\n windowOuterWidth = outerWidth(window);\n\n parent.removeClass(\"k-animation-container-sm\");\n\n if (!parent.hasClass(\"k-animation-container\")) {\n var width = element[0].style.width,\n height = element[0].style.height,\n percentWidth = percentRegExp.test(width),\n percentHeight = percentRegExp.test(height),\n forceWidth = element.hasClass(\"k-tooltip\") || element.is(\".k-menu-horizontal.k-context-menu\");\n\n percentage = percentWidth || percentHeight;\n\n if (!percentWidth && (!autosize || (autosize && width) || forceWidth)) { width = autosize ? outerWidth(element) + 1 : outerWidth(element); }\n if (!percentHeight && (!autosize || (autosize && height)) || element.is(\".k-menu-horizontal.k-context-menu\")) { height = outerHeight(element); }\n\n element.wrap(\n $(\"
\")\n .addClass(\"k-animation-container\")\n .attr(\"role\", \"region\")\n .css({\n width: width,\n height: height\n }));\n parent = element.parent();\n\n if (percentage) {\n element.css({\n width: \"100%\",\n height: \"100%\",\n boxSizing: \"border-box\",\n mozBoxSizing: \"border-box\",\n webkitBoxSizing: \"border-box\"\n });\n }\n } else {\n wrapResize(element, autosize);\n }\n\n if (windowOuterWidth < outerWidth(parent)) {\n parent.addClass(\"k-animation-container-sm\");\n\n wrapResize(element, autosize);\n }\n\n return parent;\n }\n\n function wrapResize(element, autosize) {\n var percentage,\n outerWidth = kendo._outerWidth,\n outerHeight = kendo._outerHeight,\n wrapper = element.parent(\".k-animation-container\"),\n wrapperStyle = wrapper[0].style;\n\n if (wrapper.is(\":hidden\")) {\n wrapper.css({\n display: \"\",\n position: \"\"\n });\n }\n\n percentage = percentRegExp.test(wrapperStyle.width) || percentRegExp.test(wrapperStyle.height);\n\n if (!percentage) {\n wrapper.css({\n width: autosize ? outerWidth(element) + 1 : outerWidth(element),\n height: outerHeight(element),\n boxSizing: \"content-box\",\n mozBoxSizing: \"content-box\",\n webkitBoxSizing: \"content-box\"\n });\n }\n }\n\n function deepExtend(destination) {\n var i = 1,\n length = arguments.length;\n\n for (i = 1; i < length; i++) {\n deepExtendOne(destination, arguments[i]);\n }\n\n return destination;\n }\n\n function deepExtendOne(destination, source) {\n var ObservableArray = kendo.data.ObservableArray,\n LazyObservableArray = kendo.data.LazyObservableArray,\n DataSource = kendo.data.DataSource,\n HierarchicalDataSource = kendo.data.HierarchicalDataSource,\n property,\n propValue,\n propType,\n propInit,\n destProp;\n\n for (property in source) {\n propValue = source[property];\n propType = typeof propValue;\n\n if (propType === OBJECT && propValue !== null) {\n propInit = propValue.constructor;\n } else {\n propInit = null;\n }\n\n if (propInit &&\n propInit !== Array && propInit !== ObservableArray && propInit !== LazyObservableArray &&\n propInit !== DataSource && propInit !== HierarchicalDataSource && propInit !== RegExp &&\n (!kendo.isFunction(window.ArrayBuffer) || propInit !== ArrayBuffer) && !(propValue instanceof HTMLElement)) {\n\n if (propValue instanceof Date) {\n destination[property] = new Date(propValue.getTime());\n } else if (isFunction(propValue.clone)) {\n destination[property] = propValue.clone();\n } else {\n destProp = destination[property];\n if (typeof (destProp) === OBJECT) {\n destination[property] = destProp || {};\n } else {\n destination[property] = {};\n }\n deepExtendOne(destination[property], propValue);\n }\n } else if (propType !== UNDEFINED) {\n destination[property] = propValue;\n }\n }\n\n return destination;\n }\n\n function testRx(agent, rxs, dflt) {\n for (var rx in rxs) {\n if (rxs.hasOwnProperty(rx) && rxs[rx].test(agent)) {\n return rx;\n }\n }\n return dflt !== undefined ? dflt : agent;\n }\n\n function toHyphens(str) {\n return str.replace(/([a-z][A-Z])/g, function(g) {\n return g.charAt(0) + '-' + g.charAt(1).toLowerCase();\n });\n }\n\n function toCamelCase(str) {\n return str.replace(/\\-(\\w)/g, function(strMatch, g1) {\n return g1.toUpperCase();\n });\n }\n\n function getComputedStyles(element, properties) {\n var styles = {}, computedStyle;\n\n if (document.defaultView && document.defaultView.getComputedStyle) {\n computedStyle = document.defaultView.getComputedStyle(element, \"\");\n\n if (properties) {\n $.each(properties, function(idx, value) {\n styles[value] = computedStyle.getPropertyValue(value);\n });\n }\n } else {\n computedStyle = element.currentStyle;\n\n if (properties) {\n $.each(properties, function(idx, value) {\n styles[value] = computedStyle[toCamelCase(value)];\n });\n }\n }\n\n if (!kendo.size(styles)) {\n styles = computedStyle;\n }\n\n return styles;\n }\n\n function isScrollable(element) {\n if (element && element.className && typeof(element.className) === \"string\" && element.className.indexOf(\"k-auto-scrollable\") > -1) {\n return true;\n }\n\n var overflow = getComputedStyles(element, [\"overflow\"]).overflow;\n return overflow.indexOf(\"auto\") > -1 || overflow.indexOf(\"scroll\") > -1;\n }\n\n function scrollLeft(element, value) {\n var webkit = support.browser.webkit;\n var mozila = support.browser.mozilla;\n var browserVersion = support.browser.version;\n var el, isRtl;\n\n if (element instanceof $ && value !== undefined) {\n element.each(function(i, e) {\n scrollLeft(e, value);\n });\n\n return;\n } else {\n el = element instanceof $ ? element[0] : element;\n }\n\n if (!el) {\n return;\n }\n\n isRtl = support.isRtl(element);\n\n // After updating browser detection,\n // Test in which if should the Safari browsers go\n if (value !== undefined) {\n if (isRtl && webkit && (browserVersion < 85 || support.browser.safari)) {\n el.scrollLeft = el.scrollWidth - el.clientWidth - value;\n } else if (isRtl && (mozila || webkit) && value > 0) {\n el.scrollLeft = -value;\n } else {\n el.scrollLeft = value;\n }\n } else {\n if (isRtl && webkit && (browserVersion < 85 || support.browser.safari)) {\n return el.scrollWidth - el.clientWidth - el.scrollLeft;\n } else {\n return Math.abs(el.scrollLeft);\n }\n }\n }\n\n (function() {\n support._scrollbar = undefined;\n\n support.scrollbar = function(refresh) {\n if (!isNaN(support._scrollbar) && !refresh) {\n return support._scrollbar;\n } else {\n var div = document.createElement(\"div\"),\n result;\n\n div.style.cssText = \"overflow:scroll;overflow-x:hidden;zoom:1;clear:both;display:block\";\n div.innerHTML = \" \";\n document.body.appendChild(div);\n\n support._scrollbar = result = div.offsetWidth - div.scrollWidth;\n\n document.body.removeChild(div);\n\n return result;\n }\n };\n\n support.isRtl = function(element) {\n return $(element).closest(\".k-rtl\").length > 0;\n };\n\n var table = document.createElement(\"table\");\n\n // Internet Explorer does not support setting the innerHTML of TBODY and TABLE elements\n try {\n table.innerHTML = \"\";\n\n support.tbodyInnerHtml = true;\n } catch (e) {\n support.tbodyInnerHtml = false;\n }\n\n support.touch = \"ontouchstart\" in window;\n\n var docStyle = document.documentElement.style;\n var transitions = support.transitions = false,\n transforms = support.transforms = false,\n elementProto = \"HTMLElement\" in window ? HTMLElement.prototype : [];\n\n support.hasHW3D = (\"WebKitCSSMatrix\" in window && \"m11\" in new window.WebKitCSSMatrix()) || \"MozPerspective\" in docStyle || \"msPerspective\" in docStyle;\n support.cssFlexbox = (\"flexWrap\" in docStyle) || (\"WebkitFlexWrap\" in docStyle) || (\"msFlexWrap\" in docStyle);\n\n each([ \"Moz\", \"webkit\", \"O\", \"ms\" ], function() {\n var prefix = this.toString(),\n hasTransitions = typeof table.style[prefix + \"Transition\"] === STRING;\n\n if (hasTransitions || typeof table.style[prefix + \"Transform\"] === STRING) {\n var lowPrefix = prefix.toLowerCase();\n\n transforms = {\n css: (lowPrefix != \"ms\") ? \"-\" + lowPrefix + \"-\" : \"\",\n prefix: prefix,\n event: (lowPrefix === \"o\" || lowPrefix === \"webkit\") ? lowPrefix : \"\"\n };\n\n if (hasTransitions) {\n transitions = transforms;\n transitions.event = transitions.event ? transitions.event + \"TransitionEnd\" : \"transitionend\";\n }\n\n return false;\n }\n });\n\n table = null;\n\n support.transforms = transforms;\n support.transitions = transitions;\n\n support.devicePixelRatio = window.devicePixelRatio === undefined ? 1 : window.devicePixelRatio;\n\n try {\n support.screenWidth = window.outerWidth || window.screen ? window.screen.availWidth : window.innerWidth;\n support.screenHeight = window.outerHeight || window.screen ? window.screen.availHeight : window.innerHeight;\n } catch (e) {\n //window.outerWidth throws error when in IE showModalDialog.\n support.screenWidth = window.screen.availWidth;\n support.screenHeight = window.screen.availHeight;\n }\n\n support.detectOS = function(ua) {\n var os = false, minorVersion, match = [],\n notAndroidPhone = !/mobile safari/i.test(ua),\n agentRxs = {\n wp: /(Windows Phone(?: OS)?)\\s(\\d+)\\.(\\d+(\\.\\d+)?)/,\n fire: /(Silk)\\/(\\d+)\\.(\\d+(\\.\\d+)?)/,\n android: /(Android|Android.*(?:Opera|Firefox).*?\\/)\\s*(\\d+)\\.?(\\d+(\\.\\d+)?)?/,\n iphone: /(iPhone|iPod).*OS\\s+(\\d+)[\\._]([\\d\\._]+)/,\n ipad: /(iPad).*OS\\s+(\\d+)[\\._]([\\d_]+)/,\n meego: /(MeeGo).+NokiaBrowser\\/(\\d+)\\.([\\d\\._]+)/,\n webos: /(webOS)\\/(\\d+)\\.(\\d+(\\.\\d+)?)/,\n blackberry: /(BlackBerry|BB10).*?Version\\/(\\d+)\\.(\\d+(\\.\\d+)?)/,\n playbook: /(PlayBook).*?Tablet\\s*OS\\s*(\\d+)\\.(\\d+(\\.\\d+)?)/,\n windows: /(MSIE)\\s+(\\d+)\\.(\\d+(\\.\\d+)?)/,\n tizen: /(tizen).*?Version\\/(\\d+)\\.(\\d+(\\.\\d+)?)/i,\n sailfish: /(sailfish).*rv:(\\d+)\\.(\\d+(\\.\\d+)?).*firefox/i,\n ffos: /(Mobile).*rv:(\\d+)\\.(\\d+(\\.\\d+)?).*Firefox/\n },\n osRxs = {\n ios: /^i(phone|pad|pod)$/i,\n android: /^android|fire$/i,\n blackberry: /^blackberry|playbook/i,\n windows: /windows/,\n wp: /wp/,\n flat: /sailfish|ffos|tizen/i,\n meego: /meego/\n },\n formFactorRxs = {\n tablet: /playbook|ipad|fire/i\n },\n browserRxs = {\n omini: /Opera\\sMini/i,\n omobile: /Opera\\sMobi/i,\n firefox: /Firefox|Fennec/i,\n mobilesafari: /version\\/.*safari/i,\n ie: /MSIE|Windows\\sPhone/i,\n chrome: /chrome|crios/i,\n webkit: /webkit/i\n };\n\n for (var agent in agentRxs) {\n if (agentRxs.hasOwnProperty(agent)) {\n match = ua.match(agentRxs[agent]);\n if (match) {\n if (agent == \"windows\" && \"plugins\" in navigator) { return false; } // Break if not Metro/Mobile Windows\n\n os = {};\n os.device = agent;\n os.tablet = testRx(agent, formFactorRxs, false);\n os.browser = testRx(ua, browserRxs, \"default\");\n os.name = testRx(agent, osRxs);\n os[os.name] = true;\n os.majorVersion = match[2];\n os.minorVersion = (match[3] || \"0\").replace(\"_\", \".\");\n minorVersion = os.minorVersion.replace(\".\", \"\").substr(0, 2);\n os.flatVersion = os.majorVersion + minorVersion + (new Array(3 - (minorVersion.length < 3 ? minorVersion.length : 2)).join(\"0\"));\n os.cordova = typeof window.PhoneGap !== UNDEFINED || typeof window.cordova !== UNDEFINED; // Use file protocol to detect appModes.\n os.appMode = window.navigator.standalone || (/file|local|wmapp/).test(window.location.protocol) || os.cordova; // Use file protocol to detect appModes.\n\n if (os.android && (support.devicePixelRatio < 1.5 && os.flatVersion < 400 || notAndroidPhone) && (support.screenWidth > 800 || support.screenHeight > 800)) {\n os.tablet = agent;\n }\n\n break;\n }\n }\n }\n return os;\n };\n\n var mobileOS = support.mobileOS = support.detectOS(navigator.userAgent);\n\n support.wpDevicePixelRatio = mobileOS.wp ? screen.width / 320 : 0;\n\n support.hasNativeScrolling = false;\n\n if (mobileOS.ios || (mobileOS.android && mobileOS.majorVersion > 2) || mobileOS.wp) {\n support.hasNativeScrolling = mobileOS;\n }\n\n support.delayedClick = function() {\n\n // only the mobile devices with touch events do this.\n if (support.touch) {\n // All iOS devices so far (by the time I am writing this, iOS 9.0.2 is the latest),\n // delay their click events.\n if (mobileOS.ios) {\n return true;\n }\n\n if (mobileOS.android) {\n\n if (!support.browser.chrome) { // older webkits and webviews delay the click\n return true;\n }\n\n // from here on, we deal with Chrome on Android.\n if (support.browser.version < 32) {\n return false;\n }\n\n // Chrome 32+ does conditional fast clicks if the view port is not user scalable.\n return !($(\"meta[name=viewport]\").attr(\"content\") || \"\").match(/user-scalable=no/i);\n }\n }\n\n return false;\n };\n\n support.mouseAndTouchPresent = support.touch && !(support.mobileOS.ios || support.mobileOS.android);\n\n support.detectBrowser = function(ua) {\n var browser = false,\n match = [],\n chromiumEdgeMatch = [],\n browserRxs = {\n edge: /(edge)[ \\/]([\\w.]+)/i,\n webkit: /(chrome|crios)[ \\/]([\\w.]+)/i,\n safari: /(webkit)[ \\/]([\\w.]+)/i,\n opera: /(opera)(?:.*version|)[ \\/]([\\w.]+)/i,\n msie: /(msie\\s|trident.*? rv:)([\\w.]+)/i,\n mozilla: /(mozilla)(?:.*? rv:([\\w.]+)|)/i\n };\n\n for (var agent in browserRxs) {\n if (browserRxs.hasOwnProperty(agent)) {\n match = ua.match(browserRxs[agent]);\n if (match) {\n browser = {};\n browser[agent] = true;\n browser[match[1].toLowerCase().split(\" \")[0].split(\"/\")[0]] = true;\n browser.version = parseInt(document.documentMode || match[2], 10);\n\n if (browser.chrome) {\n chromiumEdgeMatch = ua.match(/(edg)[ \\/]([\\w.]+)/i);\n\n if (chromiumEdgeMatch) {\n browser.chromiumEdge = true;\n }\n }\n\n break;\n }\n }\n }\n\n return browser;\n };\n\n support.browser = support.detectBrowser(navigator.userAgent);\n\n if (!mobileOS && support.touch && support.browser.safari) {\n mobileOS = support.mobileOS = {\n ios: true,\n tablet: \"tablet\",\n device: \"ipad\"\n };\n }\n\n support.detectClipboardAccess = function() {\n var commands = {\n copy: document.queryCommandSupported ? document.queryCommandSupported(\"copy\") : false,\n cut: document.queryCommandSupported ? document.queryCommandSupported(\"cut\") : false,\n paste: document.queryCommandSupported ? document.queryCommandSupported(\"paste\") : false\n };\n\n if (support.browser.chrome) {\n //not using queryCommandSupported due to chromium issues 476508 and 542948\n commands.paste = false;\n if (support.browser.version >= 43) {\n commands.copy = true;\n commands.cut = true;\n }\n }\n\n return commands;\n };\n\n support.clipboard = support.detectClipboardAccess();\n\n support.zoomLevel = function() {\n try {\n var browser = support.browser;\n var ie11WidthCorrection = 0;\n var docEl = document.documentElement;\n\n if (browser.msie && browser.version == 11 && docEl.scrollHeight > docEl.clientHeight && !support.touch) {\n ie11WidthCorrection = support.scrollbar();\n }\n\n return support.touch ? (docEl.clientWidth / window.innerWidth) :\n browser.msie && browser.version >= 10 ? (((top || window).document.documentElement.offsetWidth + ie11WidthCorrection) / (top || window).innerWidth) : 1;\n } catch (e) {\n return 1;\n }\n };\n\n (function(browser) {\n // add browser-specific CSS class\n var cssClass = \"\",\n docElement = $(document.documentElement),\n majorVersion = parseInt(browser.version, 10);\n\n if (browser.msie) {\n cssClass = \"ie\";\n } else if (browser.mozilla) {\n cssClass = \"ff\";\n } else if (browser.safari) {\n cssClass = \"safari\";\n } else if (browser.webkit) {\n cssClass = \"webkit\";\n } else if (browser.opera) {\n cssClass = \"opera\";\n } else if (browser.edge) {\n cssClass = \"edge\";\n }\n\n if (cssClass) {\n cssClass = \"k-\" + cssClass + \" k-\" + cssClass + majorVersion;\n }\n if (support.mobileOS) {\n cssClass += \" k-mobile\";\n }\n\n if (!support.cssFlexbox) {\n cssClass += \" k-no-flexbox\";\n }\n\n docElement.addClass(cssClass);\n })(support.browser);\n\n support.eventCapture = document.documentElement.addEventListener;\n\n var input = document.createElement(\"input\");\n\n support.placeholder = \"placeholder\" in input;\n support.propertyChangeEvent = \"onpropertychange\" in input;\n\n support.input = (function() {\n var types = [\"number\", \"date\", \"time\", \"month\", \"week\", \"datetime\", \"datetime-local\"];\n var length = types.length;\n var value = \"test\";\n var result = {};\n var idx = 0;\n var type;\n\n for (;idx < length; idx++) {\n type = types[idx];\n input.setAttribute(\"type\", type);\n input.value = value;\n\n result[type.replace(\"-\", \"\")] = input.type !== \"text\" && input.value !== value;\n }\n\n return result;\n })();\n\n input.style.cssText = \"float:left;\";\n\n support.cssFloat = !!input.style.cssFloat;\n\n input = null;\n\n support.stableSort = (function() {\n // Chrome sort is not stable for more than *10* items\n // IE9+ sort is not stable for than *512* items\n var threshold = 513;\n\n var sorted = [{\n index: 0,\n field: \"b\"\n }];\n\n for (var i = 1; i < threshold; i++) {\n sorted.push({\n index: i,\n field: \"a\"\n });\n }\n\n sorted.sort(function(a, b) {\n return a.field > b.field ? 1 : (a.field < b.field ? -1 : 0);\n });\n\n return sorted[0].index === 1;\n })();\n\n support.matchesSelector = elementProto.webkitMatchesSelector || elementProto.mozMatchesSelector ||\n elementProto.msMatchesSelector || elementProto.oMatchesSelector ||\n elementProto.matchesSelector || elementProto.matches ||\n function( selector ) {\n var nodeList = document.querySelectorAll ? ( this.parentNode || document ).querySelectorAll( selector ) || [] : $(selector),\n i = nodeList.length;\n\n while (i--) {\n if (nodeList[i] == this) {\n return true;\n }\n }\n\n return false;\n };\n\n support.matchMedia = \"matchMedia\" in window;\n\n support.pushState = window.history && window.history.pushState;\n\n support.hashChange = \"onhashchange\" in window;\n\n support.customElements = \"registerElement\" in window.document;\n\n var chrome = support.browser.chrome,\n mobileChrome = support.browser.crios,\n mozilla = support.browser.mozilla,\n safari = support.browser.safari;\n support.msPointers = !chrome && window.MSPointerEvent;\n support.pointers = !chrome && !mobileChrome && !mozilla && !safari && window.PointerEvent;\n support.kineticScrollNeeded = mobileOS && (support.touch || support.msPointers || support.pointers);\n })();\n\n\n function size(obj) {\n var result = 0, key;\n for (key in obj) {\n if (obj.hasOwnProperty(key) && key != \"toJSON\") { // Ignore fake IE7 toJSON.\n result++;\n }\n }\n\n return result;\n }\n\n function getOffset(element, type, positioned) {\n if (!type) {\n type = \"offset\";\n }\n\n var offset = element[type]();\n // clone ClientRect object to JS object (jQuery3)\n var result = {\n top: offset.top,\n right: offset.right,\n bottom: offset.bottom,\n left: offset.left\n };\n\n // IE10 touch zoom is living in a separate viewport\n if (support.browser.msie && (support.pointers || support.msPointers) && !positioned) {\n var sign = support.isRtl(element) ? 1 : -1;\n\n result.top -= (window.pageYOffset - (document.documentElement.scrollTop));\n result.left -= (window.pageXOffset + (sign * document.documentElement.scrollLeft));\n }\n\n return result;\n }\n\n var directions = {\n left: { reverse: \"right\" },\n right: { reverse: \"left\" },\n down: { reverse: \"up\" },\n up: { reverse: \"down\" },\n top: { reverse: \"bottom\" },\n bottom: { reverse: \"top\" },\n \"in\": { reverse: \"out\" },\n out: { reverse: \"in\" }\n };\n\n function parseEffects(input) {\n var effects = {};\n\n each((typeof input === \"string\" ? input.split(\" \") : input), function(idx) {\n effects[idx] = this;\n });\n\n return effects;\n }\n\n function fx(element) {\n return new kendo.effects.Element(element);\n }\n\n var effects = {};\n\n $.extend(effects, {\n enabled: true,\n Element: function(element) {\n this.element = $(element);\n },\n\n promise: function(element, options) {\n if (!element.is(\":visible\")) {\n element.css({ display: element.data(\"olddisplay\") || \"block\" }).css(\"display\");\n }\n\n if (options.hide) {\n element.data(\"olddisplay\", element.css(\"display\")).hide();\n }\n\n if (options.init) {\n options.init();\n }\n\n if (options.completeCallback) {\n options.completeCallback(element); // call the external complete callback with the element\n }\n\n element.dequeue();\n },\n\n disable: function() {\n this.enabled = false;\n this.promise = this.promiseShim;\n },\n\n enable: function() {\n this.enabled = true;\n this.promise = this.animatedPromise;\n }\n });\n\n effects.promiseShim = effects.promise;\n\n function prepareAnimationOptions(options, duration, reverse, complete) {\n if (typeof options === STRING) {\n // options is the list of effect names separated by space e.g. animate(element, \"fadeIn slideDown\")\n\n // only callback is provided e.g. animate(element, options, function() {});\n if (isFunction(duration)) {\n complete = duration;\n duration = 400;\n reverse = false;\n }\n\n if (isFunction(reverse)) {\n complete = reverse;\n reverse = false;\n }\n\n if (typeof duration === BOOLEAN) {\n reverse = duration;\n duration = 400;\n }\n\n options = {\n effects: options,\n duration: duration,\n reverse: reverse,\n complete: complete\n };\n }\n\n return extend({\n //default options\n effects: {},\n duration: 400, //jQuery default duration\n reverse: false,\n init: noop,\n teardown: noop,\n hide: false\n }, options, { completeCallback: options.complete, complete: noop }); // Move external complete callback, so deferred.resolve can be always executed.\n\n }\n\n function animate(element, options, duration, reverse, complete) {\n var idx = 0,\n length = element.length,\n instance;\n\n for (; idx < length; idx ++) {\n instance = $(element[idx]);\n instance.queue(function() {\n effects.promise(instance, prepareAnimationOptions(options, duration, reverse, complete));\n });\n }\n\n return element;\n }\n\n function toggleClass(element, classes, options, add) {\n if (classes) {\n classes = classes.split(\" \");\n\n each(classes, function(idx, value) {\n element.toggleClass(value, add);\n });\n }\n\n return element;\n }\n\n if (!(\"kendoAnimate\" in $.fn)) {\n extend($.fn, {\n kendoStop: function(clearQueue, gotoEnd) {\n return this.stop(clearQueue, gotoEnd);\n },\n\n kendoAnimate: function(options, duration, reverse, complete) {\n return animate(this, options, duration, reverse, complete);\n },\n\n kendoAddClass: function(classes, options) {\n return kendo.toggleClass(this, classes, options, true);\n },\n\n kendoRemoveClass: function(classes, options) {\n return kendo.toggleClass(this, classes, options, false);\n },\n kendoToggleClass: function(classes, options, toggle) {\n return kendo.toggleClass(this, classes, options, toggle);\n }\n });\n }\n\n var ampRegExp = /&/g,\n ltRegExp = //g;\n function htmlEncode(value) {\n return (\"\" + value).replace(ampRegExp, \"&\").replace(ltRegExp, \"<\").replace(gtRegExp, \">\").replace(quoteRegExp, \""\").replace(aposRegExp, \"'\");\n }\n\n function unescape(value) {\n var template;\n\n try {\n template = window.decodeURIComponent(value);\n } catch (error) {\n // If the string contains Unicode characters\n // the decodeURIComponent() will throw an error.\n // Therefore: convert to UTF-8 character\n template = value.replace(/%u([\\dA-F]{4})|%([\\dA-F]{2})/gi, function(_, m1, m2) {\n return String.fromCharCode(parseInt(\"0x\" + (m1 || m2), 16));\n });\n }\n\n return template;\n }\n\n var eventTarget = function(e) {\n return e.target;\n };\n\n if (support.touch) {\n\n eventTarget = function(e) {\n var touches = \"originalEvent\" in e ? e.originalEvent.changedTouches : \"changedTouches\" in e ? e.changedTouches : null;\n\n return touches ? document.elementFromPoint(touches[0].clientX, touches[0].clientY) : e.target;\n };\n\n each([\"swipe\", \"swipeLeft\", \"swipeRight\", \"swipeUp\", \"swipeDown\", \"doubleTap\", \"tap\"], function(m, value) {\n $.fn[value] = function(callback) {\n return this.on(value, callback);\n };\n });\n }\n\n if (support.touch) {\n if (!support.mobileOS) {\n support.mousedown = \"mousedown touchstart\";\n support.mouseup = \"mouseup touchend\";\n support.mousemove = \"mousemove touchmove\";\n support.mousecancel = \"mouseleave touchcancel\";\n support.click = \"click\";\n support.resize = \"resize\";\n } else {\n support.mousedown = \"touchstart\";\n support.mouseup = \"touchend\";\n support.mousemove = \"touchmove\";\n support.mousecancel = \"touchcancel\";\n support.click = \"touchend\";\n support.resize = \"orientationchange\";\n }\n } else if (support.pointers) {\n support.mousemove = \"pointermove\";\n support.mousedown = \"pointerdown\";\n support.mouseup = \"pointerup\";\n support.mousecancel = \"pointercancel\";\n support.click = \"pointerup\";\n support.resize = \"orientationchange resize\";\n } else if (support.msPointers) {\n support.mousemove = \"MSPointerMove\";\n support.mousedown = \"MSPointerDown\";\n support.mouseup = \"MSPointerUp\";\n support.mousecancel = \"MSPointerCancel\";\n support.click = \"MSPointerUp\";\n support.resize = \"orientationchange resize\";\n } else {\n support.mousemove = \"mousemove\";\n support.mousedown = \"mousedown\";\n support.mouseup = \"mouseup\";\n support.mousecancel = \"mouseleave\";\n support.click = \"click\";\n support.resize = \"resize\";\n }\n\n var wrapExpression = function(members, paramName) {\n var result = paramName || \"d\",\n index,\n idx,\n length,\n member,\n count = 1;\n\n for (idx = 0, length = members.length; idx < length; idx++) {\n member = members[idx];\n if (member !== \"\") {\n index = member.indexOf(\"[\");\n\n if (index !== 0) {\n if (index == -1) {\n member = \".\" + member;\n } else {\n count++;\n member = \".\" + member.substring(0, index) + \" || {})\" + member.substring(index);\n }\n }\n\n count++;\n result += member + ((idx < length - 1) ? \" || {})\" : \")\");\n }\n }\n return new Array(count).join(\"(\") + result;\n },\n localUrlRe = /^([a-z]+:)?\\/\\//i;\n\n extend(kendo, {\n widgets: [],\n _widgetRegisteredCallbacks: [],\n ui: kendo.ui || {},\n fx: kendo.fx || fx,\n effects: kendo.effects || effects,\n mobile: kendo.mobile || { },\n data: kendo.data || {},\n dataviz: kendo.dataviz || {},\n drawing: kendo.drawing || {},\n spreadsheet: { messages: {} },\n keys: {\n INSERT: 45,\n DELETE: 46,\n BACKSPACE: 8,\n TAB: 9,\n ENTER: 13,\n ESC: 27,\n LEFT: 37,\n UP: 38,\n RIGHT: 39,\n DOWN: 40,\n END: 35,\n HOME: 36,\n SPACEBAR: 32,\n PAGEUP: 33,\n PAGEDOWN: 34,\n F2: 113,\n F10: 121,\n F12: 123,\n NUMPAD_PLUS: 107,\n NUMPAD_MINUS: 109,\n NUMPAD_DOT: 110\n },\n support: kendo.support || support,\n animate: kendo.animate || animate,\n ns: \"\",\n attr: function(value) {\n return \"data-\" + kendo.ns + value;\n },\n getShadows: getShadows,\n wrap: wrap,\n deepExtend: deepExtend,\n getComputedStyles: getComputedStyles,\n isScrollable: isScrollable,\n scrollLeft: scrollLeft,\n size: size,\n toCamelCase: toCamelCase,\n toHyphens: toHyphens,\n getOffset: kendo.getOffset || getOffset,\n parseEffects: kendo.parseEffects || parseEffects,\n toggleClass: kendo.toggleClass || toggleClass,\n directions: kendo.directions || directions,\n Observable: Observable,\n Class: Class,\n Template: Template,\n template: Template.compile.bind(Template),\n render: Template.render.bind(Template),\n stringify: JSON.stringify.bind(JSON),\n eventTarget: eventTarget,\n htmlEncode: htmlEncode,\n unescape: unescape,\n isLocalUrl: function(url) {\n return url && !localUrlRe.test(url);\n },\n\n expr: function(expression, safe, paramName) {\n expression = expression || \"\";\n\n if (typeof safe == STRING) {\n paramName = safe;\n safe = false;\n }\n\n paramName = paramName || \"d\";\n\n if (expression && expression.charAt(0) !== \"[\") {\n expression = \".\" + expression;\n }\n\n if (safe) {\n expression = expression.replace(/\"([^.]*)\\.([^\"]*)\"/g,'\"$1_$DOT$_$2\"');\n expression = expression.replace(/'([^.]*)\\.([^']*)'/g,\"'$1_$DOT$_$2'\");\n expression = wrapExpression(expression.split(\".\"), paramName);\n expression = expression.replace(/_\\$DOT\\$_/g, \".\");\n } else {\n expression = paramName + expression;\n }\n\n return expression;\n },\n\n getter: function(expression, safe) {\n var key = expression + safe;\n return getterCache[key] = getterCache[key] || new Function(\"d\", \"return \" + kendo.expr(expression, safe));\n },\n\n setter: function(expression) {\n return setterCache[expression] = setterCache[expression] || new Function(\"d,value\", kendo.expr(expression) + \"=value\");\n },\n\n accessor: function(expression) {\n return {\n get: kendo.getter(expression),\n set: kendo.setter(expression)\n };\n },\n\n guid: function() {\n var id = \"\", i, random, chars = \"abcdef\";\n\n id += chars[Math.floor(Math.random() * Math.floor(chars.length))];\n\n for (i = 1; i < 32; i++) {\n random = math.random() * 16 | 0;\n\n if (i == 8 || i == 12 || i == 16 || i == 20) {\n id += \"-\";\n }\n id += (i == 12 ? 4 : (i == 16 ? (random & 3 | 8) : random)).toString(16);\n }\n\n return id;\n },\n\n roleSelector: function(role) {\n return role.replace(/(\\S+)/g, \"[\" + kendo.attr(\"role\") + \"=$1],\").slice(0, -1);\n },\n\n directiveSelector: function(directives) {\n var selectors = directives.split(\" \");\n\n if (selectors) {\n for (var i = 0; i < selectors.length; i++) {\n if (selectors[i] != \"view\") {\n selectors[i] = selectors[i].replace(/(\\w*)(view|bar|strip|over)$/, \"$1-$2\");\n }\n }\n }\n\n return selectors.join(\" \").replace(/(\\S+)/g, \"kendo-mobile-$1,\").slice(0, -1);\n },\n\n triggeredByInput: function(e) {\n return (/^(label|input|textarea|select)$/i).test(e.target.tagName);\n },\n\n onWidgetRegistered: function(callback) {\n for (var i = 0, len = kendo.widgets.length; i < len; i++) {\n callback(kendo.widgets[i]);\n }\n\n kendo._widgetRegisteredCallbacks.push(callback);\n },\n\n logToConsole: function(message, type) {\n var console = window.console;\n\n if (!kendo.suppressLog && typeof(console) != \"undefined\" && console.log) {\n console[type || \"log\"](message);\n }\n }\n });\n\n var Widget = Observable.extend( {\n init: function(element, options) {\n var that = this;\n\n validatePackage();\n\n that.element = kendo.jQuery(element).handler(that);\n\n that.angular(\"init\", options);\n\n Observable.fn.init.call(that);\n\n var dataSource = options ? options.dataSource : null;\n var props;\n\n if (options) {\n props = (that.componentTypes || {})[(options || {}).componentType];\n }\n\n if (dataSource) {\n // avoid deep cloning the data source\n options = extend({}, options, { dataSource: {} });\n }\n\n options = that.options = extend(true, {}, that.options, that.defaults, props || {}, options);\n\n if (dataSource) {\n options.dataSource = dataSource;\n }\n\n if (!that.element.attr(kendo.attr(\"role\"))) {\n that.element.attr(kendo.attr(\"role\"), (options.name || \"\").toLowerCase());\n }\n\n that.element.data(\"kendo\" + options.prefix + options.name, that);\n\n that.bind(that.events, options);\n },\n\n events: [],\n\n options: {\n prefix: \"\"\n },\n\n _hasBindingTarget: function() {\n return !!this.element[0].kendoBindingTarget;\n },\n\n _tabindex: function(target) {\n target = target || this.wrapper;\n\n var element = this.element,\n TABINDEX = \"tabindex\",\n tabindex = target.attr(TABINDEX) || element.attr(TABINDEX);\n\n element.removeAttr(TABINDEX);\n\n target.attr(TABINDEX, !isNaN(tabindex) ? tabindex : 0);\n },\n\n setOptions: function(options) {\n this._clearCssClasses(options);\n this._setEvents(options);\n $.extend(this.options, options);\n this._applyCssClasses();\n },\n\n _setEvents: function(options) {\n var that = this,\n idx = 0,\n length = that.events.length,\n e;\n\n for (; idx < length; idx ++) {\n e = that.events[idx];\n if (that.options[e] && options[e]) {\n that.unbind(e, that.options[e]);\n if (that._events && that._events[e]) {\n delete that._events[e];\n }\n }\n }\n\n that.bind(that.events, options);\n },\n\n resize: function(force) {\n var size = this.getSize(),\n currentSize = this._size;\n\n if (force || (size.width > 0 || size.height > 0) && (!currentSize || size.width !== currentSize.width || size.height !== currentSize.height)) {\n this._size = size;\n this._resize(size, force);\n this.trigger(\"resize\", size);\n }\n },\n\n getSize: function() {\n return kendo.dimensions(this.element);\n },\n\n size: function(size) {\n if (!size) {\n return this.getSize();\n } else {\n this.setSize(size);\n }\n },\n\n setSize: $.noop,\n _resize: $.noop,\n\n destroy: function() {\n var that = this;\n\n that.element.removeData(\"kendo\" + that.options.prefix + that.options.name);\n that.element.removeData(\"handler\");\n that.unbind();\n },\n _destroy: function() {\n this.destroy();\n },\n angular: function() {},\n\n _muteAngularRebind: function(callback) {\n this._muteRebind = true;\n\n callback.call(this);\n\n this._muteRebind = false;\n },\n\n _applyCssClasses: function(element) {\n var protoOptions = this.__proto__.options,\n options = this.options,\n el = element || this.wrapper || this.element,\n classes = [],\n i, prop, validFill, widgetName;\n\n if (!kendo.cssProperties.propertyDictionary[protoOptions.name]) {\n return;\n }\n\n for (i = 0; i < cssPropertiesNames.length; i++) {\n prop = cssPropertiesNames[i];\n widgetName = this.options._altname || protoOptions.name;\n\n if (protoOptions.hasOwnProperty(prop)) {\n if (prop === \"themeColor\") {\n validFill = kendo.cssProperties.getValidClass({\n widget: widgetName,\n propName: \"fillMode\",\n value: options.fillMode\n });\n\n if (validFill && validFill.length) {\n classes.push(kendo.cssProperties.getValidClass({\n widget: widgetName,\n propName: prop,\n value: options[prop],\n fill: options.fillMode\n }));\n }\n } else {\n classes.push(kendo.cssProperties.getValidClass({\n widget: widgetName,\n propName: prop,\n value: options[prop]\n }));\n }\n }\n }\n\n el.addClass(classes.join(\" \"));\n },\n\n _ariaLabel: function(target) {\n var that = this,\n inputElm = that.element,\n inputId = inputElm.attr(\"id\"),\n labelElm = $(\"label[for=\\\"\" + inputId + \"\\\"]\"),\n ariaLabel = inputElm.attr(ARIA_LABEL),\n ariaLabelledBy = inputElm.attr(ARIA_LABELLEDBY),\n labelId;\n\n if (target[0] === inputElm[0]) {\n return;\n }\n\n if (ariaLabel) {\n target.attr(ARIA_LABEL, ariaLabel);\n } else if (ariaLabelledBy) {\n target.attr(ARIA_LABELLEDBY, ariaLabelledBy);\n } else if (labelElm.length) {\n labelId = labelElm.attr(\"id\") || that._generateLabelId(labelElm, inputId || kendo.guid());\n target.attr(ARIA_LABELLEDBY, labelId);\n }\n },\n\n _clearCssClasses: function(newOptions, element) {\n var protoOptions = this.__proto__.options,\n currentOptions = this.options,\n el = element || this.wrapper || this.element,\n i, prop, widgetName;\n\n if (!kendo.cssProperties.propertyDictionary[protoOptions.name]) {\n return;\n }\n\n for (i = 0; i < cssPropertiesNames.length; i++) {\n prop = cssPropertiesNames[i];\n widgetName = this.options._altname || protoOptions.name;\n\n if (protoOptions.hasOwnProperty(prop) && newOptions.hasOwnProperty(prop)) {\n if (prop === \"themeColor\") {\n el.removeClass(kendo.cssProperties.getValidClass({\n widget: widgetName,\n propName: prop,\n value: currentOptions[prop],\n fill: currentOptions.fillMode\n }));\n } else {\n if (prop === \"fillMode\") {\n el.removeClass(kendo.cssProperties.getValidClass({\n widget: widgetName,\n propName: \"themeColor\",\n value: currentOptions.themeColor,\n fill: currentOptions.fillMode\n }));\n }\n\n el.removeClass(kendo.cssProperties.getValidClass({\n widget: widgetName,\n propName: prop,\n value: currentOptions[prop]\n }));\n }\n }\n }\n },\n\n _generateLabelId: function(label, inputId) {\n var labelId = inputId + LABELIDPART;\n\n label.attr(\"id\", labelId);\n\n return labelId;\n },\n });\n\n var DataBoundWidget = Widget.extend({\n // Angular consumes these.\n dataItems: function() {\n return this.dataSource.flatView();\n },\n\n _angularItems: function(cmd) {\n var that = this;\n that.angular(cmd, function() {\n return {\n elements: that.items(),\n data: $.map(that.dataItems(), function(dataItem) {\n return { dataItem: dataItem };\n })\n };\n });\n }\n });\n\n kendo.dimensions = function(element, dimensions) {\n var domElement = element[0];\n\n if (dimensions) {\n element.css(dimensions);\n }\n\n return { width: domElement.offsetWidth, height: domElement.offsetHeight };\n };\n\n kendo.notify = noop;\n\n var templateRegExp = /template$/i,\n jsonRegExp = /^\\s*(?:\\{(?:.|\\r\\n|\\n)*\\}|\\[(?:.|\\r\\n|\\n)*\\])\\s*$/,\n jsonFormatRegExp = /^\\{(\\d+)(:[^\\}]+)?\\}|^\\[[A-Za-z_]+\\]$/,\n dashRegExp = /([A-Z])/g;\n\n function parseOption(element, option) {\n var value;\n\n if (option.indexOf(\"data\") === 0) {\n option = option.substring(4);\n option = option.charAt(0).toLowerCase() + option.substring(1);\n }\n\n option = option.replace(dashRegExp, \"-$1\");\n value = element.getAttribute(\"data-\" + kendo.ns + option);\n\n if (value === null) {\n value = undefined;\n } else if (value === \"null\") {\n value = null;\n } else if (value === \"true\") {\n value = true;\n } else if (value === \"false\") {\n value = false;\n } else if (numberRegExp.test(value) && option != \"mask\" && option != \"format\") {\n value = parseFloat(value);\n } else if (jsonRegExp.test(value) && !jsonFormatRegExp.test(value)) {\n value = new Function(\"return (\" + value + \")\")();\n }\n\n return value;\n }\n\n function parseOptions(element, options, source) {\n var result = {},\n option,\n value,\n role = element.getAttribute(\"data-\" + kendo.ns + \"role\");\n\n for (option in options) {\n value = parseOption(element, option);\n\n if (value !== undefined) {\n\n if (templateRegExp.test(option) && role != \"drawer\") {\n if (typeof value === \"string\") {\n if ($(\"#\" + value).length) {\n value = kendo.template($(\"#\" + value).html());\n } else if (source) {\n value = kendo.template(source[value]);\n }\n } else {\n value = element.getAttribute(option);\n }\n }\n\n result[option] = value;\n }\n }\n\n return result;\n }\n\n kendo.initWidget = function(element, options, roles) {\n var result,\n option,\n widget,\n idx,\n length,\n role,\n value,\n dataSource,\n fullPath,\n widgetKeyRegExp;\n\n // Preserve backwards compatibility with (element, options, namespace) signature, where namespace was kendo.ui\n if (!roles) {\n roles = kendo.ui.roles;\n } else if (roles.roles) {\n roles = roles.roles;\n }\n\n element = element.nodeType ? element : element[0];\n\n role = element.getAttribute(\"data-\" + kendo.ns + \"role\");\n\n if (!role) {\n return;\n }\n\n fullPath = role.indexOf(\".\") === -1;\n\n // look for any widget that may be already instantiated based on this role.\n // The prefix used is unknown, hence the regexp\n //\n\n if (fullPath) {\n widget = roles[role];\n } else { // full namespace path - like kendo.ui.Widget\n widget = kendo.getter(role)(window);\n }\n\n var data = $(element).data(),\n widgetKey = widget ? \"kendo\" + widget.fn.options.prefix + widget.fn.options.name : \"\";\n\n if (fullPath) {\n widgetKeyRegExp = new RegExp(\"^kendo.*\" + role + \"$\", \"i\");\n } else { // full namespace path - like kendo.ui.Widget\n widgetKeyRegExp = new RegExp(\"^\" + widgetKey + \"$\", \"i\");\n }\n\n for (var key in data) {\n if (key.match(widgetKeyRegExp)) {\n // we have detected a widget of the same kind - save its reference, we will set its options\n if (key === widgetKey) {\n result = data[key];\n } else {\n return data[key];\n }\n }\n }\n\n if (!widget) {\n return;\n }\n\n dataSource = parseOption(element, \"dataSource\");\n\n options = $.extend({}, parseOptions(element, $.extend({}, widget.fn.options, widget.fn.defaults) ), options);\n\n if (dataSource) {\n if (typeof dataSource === STRING) {\n options.dataSource = kendo.getter(dataSource)(window);\n } else {\n options.dataSource = dataSource;\n }\n }\n\n for (idx = 0, length = widget.fn.events.length; idx < length; idx++) {\n option = widget.fn.events[idx];\n\n value = parseOption(element, option);\n\n if (value !== undefined) {\n options[option] = kendo.getter(value)(window);\n }\n }\n\n if (!result) {\n result = new widget(element, options);\n } else if (!$.isEmptyObject(options)) {\n result.setOptions(options);\n }\n\n return result;\n };\n\n kendo.rolesFromNamespaces = function(namespaces) {\n var roles = [],\n idx,\n length;\n\n if (!namespaces[0]) {\n namespaces = [kendo.ui, kendo.dataviz.ui];\n }\n\n for (idx = 0, length = namespaces.length; idx < length; idx ++) {\n roles[idx] = namespaces[idx].roles;\n }\n\n return extend.apply(null, [{}].concat(roles.reverse()));\n };\n\n kendo.init = function(element) {\n var roles = kendo.rolesFromNamespaces(slice.call(arguments, 1));\n\n $(element).find(\"[data-\" + kendo.ns + \"role]\").addBack().each(function() {\n kendo.initWidget(this, {}, roles);\n });\n };\n\n kendo.destroy = function(element) {\n $(element).find(\"[data-\" + kendo.ns + \"role]\").addBack().each(function() {\n var data = $(this).data();\n\n for (var key in data) {\n if (key.indexOf(\"kendo\") === 0 && typeof data[key].destroy === FUNCTION) {\n data[key].destroy();\n }\n }\n });\n };\n\n function containmentComparer(a, b) {\n return $.contains(a, b) ? -1 : 1;\n }\n\n function resizableWidget() {\n var widget = $(this);\n return ($.inArray(widget.attr(\"data-\" + kendo.ns + \"role\"), [\"slider\", \"rangeslider\", \"breadcrumb\"]) > -1) || widget.is(\":visible\");\n }\n\n kendo.resize = function(element, force) {\n var widgets = $(element).find(\"[data-\" + kendo.ns + \"role]\").addBack().filter(resizableWidget);\n\n if (!widgets.length) {\n return;\n }\n\n // sort widgets based on their parent-child relation\n var widgetsArray = $.makeArray(widgets);\n widgetsArray.sort(containmentComparer);\n\n // resize widgets\n $.each(widgetsArray, function() {\n var widget = kendo.widgetInstance($(this));\n if (widget) {\n widget.resize(force);\n }\n });\n };\n\n kendo.parseOptions = parseOptions;\n\n extend(kendo.ui, {\n Widget: Widget,\n DataBoundWidget: DataBoundWidget,\n roles: {},\n progress: function(container, toggle, options) {\n var mask = container.find(\".k-loading-mask\"),\n support = kendo.support,\n browser = support.browser,\n isRtl, leftRight, webkitCorrection, containerScrollLeft, cssClass;\n\n options = $.extend({}, {\n width: \"100%\",\n height: \"100%\",\n top: container.scrollTop(),\n opacity: false\n }, options);\n\n cssClass = options.opacity ? 'k-loading-mask k-opaque' : 'k-loading-mask';\n\n if (toggle) {\n if (!mask.length) {\n isRtl = support.isRtl(container);\n leftRight = isRtl ? \"right\" : \"left\";\n containerScrollLeft = kendo.scrollLeft(container);\n webkitCorrection = browser.webkit ? (!isRtl ? 0 : container[0].scrollWidth - container.width() - 2 * containerScrollLeft) : 0;\n\n mask = $(kendo.format(\"
{1}
\", cssClass, kendo.ui.progress.messages.loading))\n .width(options.width).height(options.height)\n .css(\"top\", options.top)\n .css(leftRight, Math.abs(containerScrollLeft) + webkitCorrection)\n .prependTo(container);\n }\n } else if (mask) {\n mask.remove();\n }\n },\n plugin: function(widget, register, prefix) {\n var name = widget.fn.options.name,\n getter;\n\n register = register || kendo.ui;\n prefix = prefix || \"\";\n\n register[name] = widget;\n\n register.roles[name.toLowerCase()] = widget;\n\n getter = \"getKendo\" + prefix + name;\n name = \"kendo\" + prefix + name;\n\n var widgetEntry = { name: name, widget: widget, prefix: prefix || \"\" };\n kendo.widgets.push(widgetEntry);\n\n for (var i = 0, len = kendo._widgetRegisteredCallbacks.length; i < len; i++) {\n kendo._widgetRegisteredCallbacks[i](widgetEntry);\n }\n\n $.fn[name] = function(options) {\n var value = this,\n args;\n\n if (typeof options === STRING) {\n args = slice.call(arguments, 1);\n\n this.each(function() {\n var widget = $.data(this, name),\n method,\n result;\n\n if (!widget) {\n throw new Error(kendo.format(\"Cannot call method '{0}' of {1} before it is initialized\", options, name));\n }\n\n method = widget[options];\n\n if (typeof method !== FUNCTION) {\n throw new Error(kendo.format(\"Cannot find method '{0}' of {1}\", options, name));\n }\n\n result = method.apply(widget, args);\n\n if (result !== undefined) {\n value = result;\n return false;\n }\n });\n } else {\n this.each(function() {\n return new widget(this, options);\n });\n }\n\n return value;\n };\n\n $.fn[name].widget = widget;\n\n $.fn[getter] = function() {\n return this.data(name);\n };\n }\n });\n\n kendo.ui.progress.messages = {\n loading: \"Loading...\"\n };\n\n var ContainerNullObject = { bind: function() { return this; }, nullObject: true, options: {} };\n\n var MobileWidget = Widget.extend({\n init: function(element, options) {\n Widget.fn.init.call(this, element, options);\n this.element.autoApplyNS();\n this.wrapper = this.element;\n this.element.addClass(\"km-widget\");\n },\n\n destroy: function() {\n Widget.fn.destroy.call(this);\n this.element.kendoDestroy();\n },\n\n options: {\n prefix: \"Mobile\"\n },\n\n events: [],\n\n view: function() {\n var viewElement = this.element.closest(kendo.roleSelector(\"view splitview modalview drawer\"));\n return kendo.widgetInstance(viewElement, kendo.mobile.ui) || ContainerNullObject;\n },\n\n viewHasNativeScrolling: function() {\n var view = this.view();\n return view && view.options.useNativeScrolling;\n },\n\n container: function() {\n var element = this.element.closest(kendo.roleSelector(\"view layout modalview drawer splitview\"));\n return kendo.widgetInstance(element.eq(0), kendo.mobile.ui) || ContainerNullObject;\n }\n });\n\n extend(kendo.mobile, {\n init: function(element) {\n kendo.init(element, kendo.mobile.ui, kendo.ui, kendo.dataviz.ui);\n },\n\n appLevelNativeScrolling: function() {\n return kendo.mobile.application && kendo.mobile.application.options && kendo.mobile.application.options.useNativeScrolling;\n },\n\n roles: {},\n\n ui: {\n Widget: MobileWidget,\n DataBoundWidget: DataBoundWidget.extend(MobileWidget.prototype),\n roles: {},\n plugin: function(widget) {\n kendo.ui.plugin(widget, kendo.mobile.ui, \"Mobile\");\n }\n }\n });\n\n deepExtend(kendo.dataviz, {\n init: function(element) {\n kendo.init(element, kendo.dataviz.ui);\n },\n ui: {\n roles: {},\n themes: {},\n views: [],\n plugin: function(widget) {\n kendo.ui.plugin(widget, kendo.dataviz.ui);\n }\n },\n roles: {}\n });\n\n kendo.touchScroller = function(elements, options) {\n // return the first touch scroller\n if (!options) { options = {}; }\n\n options.useNative = true;\n\n return $(elements).map(function(idx, element) {\n element = $(element);\n if (support.kineticScrollNeeded && kendo.mobile.ui.Scroller && !element.data(\"kendoMobileScroller\")) {\n element.kendoMobileScroller(options);\n return element.data(\"kendoMobileScroller\");\n } else {\n return false;\n }\n })[0];\n };\n\n kendo.preventDefault = function(e) {\n e.preventDefault();\n };\n\n kendo.widgetInstance = function(element, suites) {\n var role = element.data(kendo.ns + \"role\"),\n widgets = [], i, length,\n elementData = element.data(\"kendoView\");\n\n if (role) {\n // HACK!!! mobile view scroller widgets are instantiated on data-role=\"content\" elements. We need to discover them when resizing.\n if (role === \"content\") {\n role = \"scroller\";\n }\n\n // kendoEditorToolbar is not a public plugin, thus it does not exist in kendo.ui.roles.\n // Therefore, this is needed in order to be resized when placed in Kendo Window.\n if (role === \"editortoolbar\") {\n var editorToolbar = element.data(\"kendoEditorToolbar\");\n if (editorToolbar) {\n return editorToolbar;\n }\n }\n\n // kendo.View is not a ui plugin\n\n if (role === \"view\" && elementData) {\n return elementData;\n }\n\n if (suites) {\n if (suites[0]) {\n for (i = 0, length = suites.length; i < length; i ++) {\n widgets.push(suites[i].roles[role]);\n }\n } else {\n widgets.push(suites.roles[role]);\n }\n }\n else {\n widgets = [ kendo.ui.roles[role], kendo.dataviz.ui.roles[role], kendo.mobile.ui.roles[role] ];\n }\n\n if (role.indexOf(\".\") >= 0) {\n widgets = [ kendo.getter(role)(window) ];\n }\n\n for (i = 0, length = widgets.length; i < length; i ++) {\n var widget = widgets[i];\n if (widget) {\n var instance = element.data(\"kendo\" + widget.fn.options.prefix + widget.fn.options.name);\n if (instance) {\n return instance;\n }\n }\n }\n }\n };\n\n kendo.onResize = function(callback) {\n var handler = callback;\n if (support.mobileOS.android) {\n handler = function() { setTimeout(callback, 600); };\n }\n\n $(window).on(support.resize, handler);\n return handler;\n };\n\n kendo.unbindResize = function(callback) {\n $(window).off(support.resize, callback);\n };\n\n kendo.attrValue = function(element, key) {\n return element.data(kendo.ns + key);\n };\n\n kendo.days = {\n Sunday: 0,\n Monday: 1,\n Tuesday: 2,\n Wednesday: 3,\n Thursday: 4,\n Friday: 5,\n Saturday: 6\n };\n\n function focusable(element, isTabIndexNotNaN) {\n var nodeName = element.nodeName.toLowerCase();\n\n return (/input|select|textarea|button|object/.test(nodeName) ?\n !element.disabled :\n nodeName === \"a\" ?\n element.href || isTabIndexNotNaN :\n isTabIndexNotNaN\n ) &&\n visible(element);\n }\n\n function visible(element) {\n return $.expr.pseudos.visible(element) &&\n !$(element).parents().addBack().filter(function() {\n return $.css(this,\"visibility\") === \"hidden\";\n }).length;\n }\n\n $.extend($.expr.pseudos, {\n kendoFocusable: function(element) {\n var idx = $.attr(element, \"tabindex\");\n return focusable(element, !isNaN(idx) && idx > -1);\n }\n });\n\n var MOUSE_EVENTS = [\"mousedown\", \"mousemove\", \"mouseenter\", \"mouseleave\", \"mouseover\", \"mouseout\", \"mouseup\", \"click\"];\n var EXCLUDE_BUST_CLICK_SELECTOR = \"label, input, [data-rel=external]\";\n\n var MouseEventNormalizer = {\n setupMouseMute: function() {\n var idx = 0,\n length = MOUSE_EVENTS.length,\n element = document.documentElement;\n\n if (MouseEventNormalizer.mouseTrap || !support.eventCapture) {\n return;\n }\n\n MouseEventNormalizer.mouseTrap = true;\n\n MouseEventNormalizer.bustClick = false;\n MouseEventNormalizer.captureMouse = false;\n\n var handler = function(e) {\n if (MouseEventNormalizer.captureMouse) {\n if (e.type === \"click\") {\n if (MouseEventNormalizer.bustClick && !$(e.target).is(EXCLUDE_BUST_CLICK_SELECTOR)) {\n e.preventDefault();\n e.stopPropagation();\n }\n } else {\n e.stopPropagation();\n }\n }\n };\n\n for (; idx < length; idx++) {\n element.addEventListener(MOUSE_EVENTS[idx], handler, true);\n }\n },\n\n muteMouse: function(e) {\n MouseEventNormalizer.captureMouse = true;\n if (e.data.bustClick) {\n MouseEventNormalizer.bustClick = true;\n }\n clearTimeout(MouseEventNormalizer.mouseTrapTimeoutID);\n },\n\n unMuteMouse: function() {\n clearTimeout(MouseEventNormalizer.mouseTrapTimeoutID);\n MouseEventNormalizer.mouseTrapTimeoutID = setTimeout(function() {\n MouseEventNormalizer.captureMouse = false;\n MouseEventNormalizer.bustClick = false;\n }, 400);\n }\n };\n\n var eventMap = {\n down: \"touchstart mousedown\",\n move: \"mousemove touchmove\",\n up: \"mouseup touchend touchcancel\",\n cancel: \"mouseleave touchcancel\"\n };\n\n if (support.touch && (support.mobileOS.ios || support.mobileOS.android)) {\n eventMap = {\n down: \"touchstart\",\n move: \"touchmove\",\n up: \"touchend touchcancel\",\n cancel: \"touchcancel\"\n };\n } else if (support.pointers) {\n eventMap = {\n down: \"pointerdown\",\n move: \"pointermove\",\n up: \"pointerup\",\n cancel: \"pointercancel pointerleave\"\n };\n } else if (support.msPointers) {\n eventMap = {\n down: \"MSPointerDown\",\n move: \"MSPointerMove\",\n up: \"MSPointerUp\",\n cancel: \"MSPointerCancel MSPointerLeave\"\n };\n }\n\n if (support.msPointers && !(\"onmspointerenter\" in window)) { // IE10\n // Create MSPointerEnter/MSPointerLeave events using mouseover/out and event-time checks\n $.each({\n MSPointerEnter: \"MSPointerOver\",\n MSPointerLeave: \"MSPointerOut\"\n }, function( orig, fix ) {\n $.event.special[ orig ] = {\n delegateType: fix,\n bindType: fix,\n\n handle: function( event ) {\n var ret,\n target = this,\n related = event.relatedTarget,\n handleObj = event.handleObj;\n\n // For mousenter/leave call the handler if related is outside the target.\n // NB: No relatedTarget if the mouse left/entered the browser window\n if ( !related || (related !== target && !$.contains( target, related )) ) {\n event.type = handleObj.origType;\n ret = handleObj.handler.apply( this, arguments );\n event.type = fix;\n }\n return ret;\n }\n };\n });\n }\n\n\n var getEventMap = function(e) { return (eventMap[e] || e); },\n eventRegEx = /([^ ]+)/g;\n\n kendo.applyEventMap = function(events, ns) {\n events = events.replace(eventRegEx, getEventMap);\n\n if (ns) {\n events = events.replace(eventRegEx, \"$1.\" + ns);\n }\n\n return events;\n };\n\n kendo.keyDownHandler = function(e, widget) {\n var events = widget._events.kendoKeydown;\n\n if (!events) {\n return true;\n }\n\n events = events.slice();\n e.sender = widget;\n e.preventKendoKeydown = false;\n for (var idx = 0, length = events.length; idx < length; idx++) {\n events[idx].call(widget, e);\n }\n\n return !e.preventKendoKeydown;\n };\n\n var on = $.fn.on;\n\n function kendoJQuery(selector, context) {\n return new kendoJQuery.fn.init(selector, context);\n }\n\n noDepricateExtend(true, kendoJQuery, $);\n\n kendoJQuery.fn = kendoJQuery.prototype = new $();\n\n kendoJQuery.fn.constructor = kendoJQuery;\n\n kendoJQuery.fn.init = function(selector, context) {\n if (context && context instanceof $ && !(context instanceof kendoJQuery)) {\n context = kendoJQuery(context);\n }\n\n return $.fn.init.call(this, selector, context, rootjQuery);\n };\n\n kendoJQuery.fn.init.prototype = kendoJQuery.fn;\n\n var rootjQuery = kendoJQuery(document);\n\n extend(kendoJQuery.fn, {\n handler: function(handler) {\n this.data(\"handler\", handler);\n return this;\n },\n\n autoApplyNS: function(ns) {\n this.data(\"kendoNS\", ns || kendo.guid());\n return this;\n },\n\n on: function() {\n var that = this,\n ns = that.data(\"kendoNS\");\n\n // support for event map signature\n if (arguments.length === 1) {\n return on.call(that, arguments[0]);\n }\n\n var context = that,\n args = slice.call(arguments);\n\n if (typeof args[args.length - 1] === UNDEFINED) {\n args.pop();\n }\n\n var callback = args[args.length - 1],\n events = kendo.applyEventMap(args[0], ns);\n\n // setup mouse trap\n if (support.mouseAndTouchPresent && events.search(/mouse|click/) > -1 && this[0] !== document.documentElement) {\n MouseEventNormalizer.setupMouseMute();\n\n var selector = args.length === 2 ? null : args[1],\n bustClick = events.indexOf(\"click\") > -1 && events.indexOf(\"touchend\") > -1;\n\n on.call(this,\n {\n touchstart: MouseEventNormalizer.muteMouse,\n touchend: MouseEventNormalizer.unMuteMouse\n },\n selector,\n {\n bustClick: bustClick\n });\n }\n\n if (arguments[0].indexOf(\"keydown\") !== -1 && args[1] && args[1].options) {\n args[0] = events;\n var widget = args[1];\n var keyDownCallBack = args[args.length - 1];\n args[args.length - 1] = function(e) {\n if (kendo.keyDownHandler(e, widget)) {\n return keyDownCallBack.apply(this, [e]);\n }\n };\n on.apply(that, args);\n return that;\n }\n\n if (typeof callback === STRING) {\n context = that.data(\"handler\");\n callback = context[callback];\n\n args[args.length - 1] = function(e) {\n callback.call(context, e);\n };\n }\n\n args[0] = events;\n\n on.apply(that, args);\n\n return that;\n },\n\n kendoDestroy: function(ns) {\n ns = ns || this.data(\"kendoNS\");\n\n if (ns) {\n this.off(\".\" + ns);\n }\n\n return this;\n }\n });\n\n kendo.jQuery = kendoJQuery;\n kendo.eventMap = eventMap;\n\n kendo.timezone = (function() {\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 };\n var days = { Sun: 0, Mon: 1, Tue: 2, Wed: 3, Thu: 4, Fri: 5, Sat: 6 };\n\n function ruleToDate(year, rule) {\n var date;\n var targetDay;\n var ourDay;\n var month = rule[3];\n var on = rule[4];\n var time = rule[5];\n var cache = rule[8];\n\n if (!cache) {\n rule[8] = cache = {};\n }\n\n if (cache[year]) {\n return cache[year];\n }\n\n if (!isNaN(on)) {\n date = new Date(Date.UTC(year, months[month], on, time[0], time[1], time[2], 0));\n } else if (on.indexOf(\"last\") === 0) {\n date = new Date(Date.UTC(year, months[month] + 1, 1, time[0] - 24, time[1], time[2], 0));\n\n targetDay = days[on.substr(4, 3)];\n ourDay = date.getUTCDay();\n\n date.setUTCDate(date.getUTCDate() + targetDay - ourDay - (targetDay > ourDay ? 7 : 0));\n } else if (on.indexOf(\">=\") >= 0) {\n date = new Date(Date.UTC(year, months[month], on.substr(5), time[0], time[1], time[2], 0));\n\n targetDay = days[on.substr(0, 3)];\n ourDay = date.getUTCDay();\n\n date.setUTCDate(date.getUTCDate() + targetDay - ourDay + (targetDay < ourDay ? 7 : 0));\n } else if (on.indexOf(\"<=\") >= 0) {\n date = new Date(Date.UTC(year, months[month], on.substr(5), time[0], time[1], time[2], 0));\n\n targetDay = days[on.substr(0, 3)];\n ourDay = date.getUTCDay();\n\n date.setUTCDate(date.getUTCDate() + targetDay - ourDay - (targetDay > ourDay ? 7 : 0));\n }\n\n return cache[year] = date;\n }\n\n function findRule(utcTime, rules, zone) {\n rules = rules[zone];\n\n if (!rules) {\n var time = zone.split(\":\");\n var offset = 0;\n\n if (time.length > 1) {\n offset = time[0] * 60 + Number(time[1]);\n }\n\n return [-1000000, 'max', '-', 'Jan', 1, [0, 0, 0], offset, '-'];\n }\n\n var year = new Date(utcTime).getUTCFullYear();\n\n rules = jQuery.grep(rules, function(rule) {\n var from = rule[0];\n var to = rule[1];\n\n return from <= year && (to >= year || (from == year && to == \"only\") || to == \"max\");\n });\n\n rules.push(utcTime);\n\n rules.sort(function(a, b) {\n if (typeof a != \"number\") {\n a = Number(ruleToDate(year, a));\n }\n\n if (typeof b != \"number\") {\n b = Number(ruleToDate(year, b));\n }\n\n return a - b;\n });\n\n var rule = rules[jQuery.inArray(utcTime, rules) - 1] || rules[rules.length - 1];\n\n return isNaN(rule) ? rule : null;\n }\n\n function findZone(utcTime, zones, timezone) {\n var zoneRules = zones[timezone];\n\n if (typeof zoneRules === \"string\") {\n zoneRules = zones[zoneRules];\n }\n\n if (!zoneRules) {\n throw new Error('Timezone \"' + timezone + '\" is either incorrect, or kendo.timezones.min.js is not included.');\n }\n\n for (var idx = zoneRules.length - 1; idx >= 0; idx--) {\n var until = zoneRules[idx][3];\n\n if (until && utcTime > until) {\n break;\n }\n }\n\n var zone = zoneRules[idx + 1];\n\n if (!zone) {\n throw new Error('Timezone \"' + timezone + '\" not found on ' + utcTime + \".\");\n }\n\n return zone;\n }\n\n function zoneAndRule(utcTime, zones, rules, timezone) {\n if (typeof utcTime != NUMBER) {\n utcTime = Date.UTC(utcTime.getFullYear(), utcTime.getMonth(),\n utcTime.getDate(), utcTime.getHours(), utcTime.getMinutes(),\n utcTime.getSeconds(), utcTime.getMilliseconds());\n }\n\n var zone = findZone(utcTime, zones, timezone);\n\n return {\n zone: zone,\n rule: findRule(utcTime, rules, zone[1])\n };\n }\n\n function offset(utcTime, timezone) {\n if (timezone == \"Etc/UTC\" || timezone == \"Etc/GMT\") {\n return 0;\n }\n\n var info = zoneAndRule(utcTime, this.zones, this.rules, timezone);\n var zone = info.zone;\n var rule = info.rule;\n\n return kendo.parseFloat(rule ? zone[0] - rule[6] : zone[0]);\n }\n\n function abbr(utcTime, timezone) {\n var info = zoneAndRule(utcTime, this.zones, this.rules, timezone);\n var zone = info.zone;\n var rule = info.rule;\n\n var base = zone[2];\n\n if (base.indexOf(\"/\") >= 0) {\n return base.split(\"/\")[rule && +rule[6] ? 1 : 0];\n } else if (base.indexOf(\"%s\") >= 0) {\n return base.replace(\"%s\", (!rule || rule[7] == \"-\") ? '' : rule[7]);\n }\n\n return base;\n }\n\n function convert(date, fromOffset, toOffset) {\n var tempToOffset = toOffset;\n var diff;\n\n if (typeof fromOffset == STRING) {\n fromOffset = this.offset(date, fromOffset);\n }\n\n if (typeof toOffset == STRING) {\n toOffset = this.offset(date, toOffset);\n }\n\n var fromLocalOffset = date.getTimezoneOffset();\n\n date = new Date(date.getTime() + (fromOffset - toOffset) * 60000);\n\n var toLocalOffset = date.getTimezoneOffset();\n\n if (typeof tempToOffset == STRING) {\n tempToOffset = this.offset(date, tempToOffset);\n }\n\n diff = (toLocalOffset - fromLocalOffset) + (toOffset - tempToOffset);\n\n return new Date(date.getTime() + diff * 60000);\n }\n\n function apply(date, timezone) {\n return this.convert(date, date.getTimezoneOffset(), timezone);\n }\n\n function remove(date, timezone) {\n return this.convert(date, timezone, date.getTimezoneOffset());\n }\n\n function toLocalDate(time) {\n return this.apply(new Date(time), \"Etc/UTC\");\n }\n\n return {\n zones: {},\n rules: {},\n offset: offset,\n convert: convert,\n apply: apply,\n remove: remove,\n abbr: abbr,\n toLocalDate: toLocalDate\n };\n })();\n\n kendo.date = (function() {\n var MS_PER_MINUTE = 60000,\n MS_PER_DAY = 86400000;\n\n function adjustDST(date, hours) {\n if (hours === 0 && date.getHours() === 23) {\n date.setHours(date.getHours() + 2);\n return true;\n }\n\n return false;\n }\n\n function setDayOfWeek(date, day, dir) {\n var hours = date.getHours();\n\n dir = dir || 1;\n day = ((day - date.getDay()) + (7 * dir)) % 7;\n\n date.setDate(date.getDate() + day);\n adjustDST(date, hours);\n }\n\n function dayOfWeek(date, day, dir) {\n date = new Date(date);\n setDayOfWeek(date, day, dir);\n return date;\n }\n\n function firstDayOfMonth(date) {\n return new Date(\n date.getFullYear(),\n date.getMonth(),\n 1\n );\n }\n\n function lastDayOfMonth(date) {\n var last = new Date(date.getFullYear(), date.getMonth() + 1, 0),\n first = firstDayOfMonth(date),\n timeOffset = Math.abs(last.getTimezoneOffset() - first.getTimezoneOffset());\n\n if (timeOffset) {\n last.setHours(first.getHours() + (timeOffset / 60));\n }\n\n return last;\n }\n\n function firstDayOfYear(date) {\n return new Date(date.getFullYear(), 0, 1);\n }\n\n function lastDayOfYear(date) {\n return new Date(date.getFullYear(), 11, 31);\n }\n\n function moveDateToWeekStart(date, weekStartDay) {\n if (weekStartDay !== 1) {\n return addDays(dayOfWeek(date, weekStartDay, -1), 4);\n }\n\n return addDays(date, (4 - (date.getDay() || 7)));\n }\n\n function calcWeekInYear(date, weekStartDay) {\n var firstWeekInYear = new Date(date.getFullYear(), 0, 1, -6);\n\n var newDate = moveDateToWeekStart(date, weekStartDay);\n\n var diffInMS = newDate.getTime() - firstWeekInYear.getTime();\n\n var days = Math.floor(diffInMS / MS_PER_DAY);\n\n return 1 + Math.floor(days / 7);\n }\n\n function weekInYear(date, weekStartDay) {\n if (weekStartDay === undefined) {\n weekStartDay = kendo.culture().calendar.firstDay;\n }\n\n var prevWeekDate = addDays(date, -7);\n var nextWeekDate = addDays(date, 7);\n\n var weekNumber = calcWeekInYear(date, weekStartDay);\n\n if (weekNumber === 0) {\n return calcWeekInYear(prevWeekDate, weekStartDay) + 1;\n }\n\n if (weekNumber === 53 && calcWeekInYear(nextWeekDate, weekStartDay) > 1) {\n return 1;\n }\n\n return weekNumber;\n }\n\n function getDate(date) {\n date = new Date(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0);\n adjustDST(date, 0);\n return date;\n }\n\n function toUtcTime(date) {\n return Date.UTC(date.getFullYear(), date.getMonth(),\n date.getDate(), date.getHours(), date.getMinutes(),\n date.getSeconds(), date.getMilliseconds());\n }\n\n function getMilliseconds(date) {\n return toInvariantTime(date).getTime() - getDate(toInvariantTime(date));\n }\n\n function isInTimeRange(value, min, max) {\n var msMin = getMilliseconds(min),\n msMax = getMilliseconds(max),\n msValue;\n\n if (!value || msMin == msMax) {\n return true;\n }\n\n if (min >= max) {\n max += MS_PER_DAY;\n }\n\n msValue = getMilliseconds(value);\n\n if (msMin > msValue) {\n msValue += MS_PER_DAY;\n }\n\n if (msMax < msMin) {\n msMax += MS_PER_DAY;\n }\n\n return msValue >= msMin && msValue <= msMax;\n }\n\n function isInDateRange(value, min, max) {\n var msMin = min.getTime(),\n msMax = max.getTime(),\n msValue;\n\n if (msMin >= msMax) {\n msMax += MS_PER_DAY;\n }\n\n msValue = value.getTime();\n\n return msValue >= msMin && msValue <= msMax;\n }\n\n function addDays(date, offset) {\n var hours = date.getHours();\n date = new Date(date);\n\n setTime(date, offset * MS_PER_DAY);\n adjustDST(date, hours);\n return date;\n }\n\n function setTime(date, milliseconds, ignoreDST) {\n var offset = date.getTimezoneOffset();\n var difference;\n\n date.setTime(date.getTime() + milliseconds);\n\n if (!ignoreDST) {\n difference = date.getTimezoneOffset() - offset;\n date.setTime(date.getTime() + difference * MS_PER_MINUTE);\n }\n }\n\n function setHours(date, time) {\n date = new Date(date.getFullYear(), date.getMonth(), date.getDate(), time.getHours(), time.getMinutes(), time.getSeconds(), time.getMilliseconds());\n adjustDST(date, time.getHours());\n return date;\n }\n\n function today() {\n return getDate(new Date());\n }\n\n function isToday(date) {\n return getDate(date).getTime() == today().getTime();\n }\n\n function toInvariantTime(date) {\n var staticDate = new Date(1980, 1, 1, 0, 0, 0);\n\n if (date) {\n staticDate.setHours(date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds());\n }\n\n return staticDate;\n }\n\n function addYear(date, offset) {\n var currentDate = new Date(date);\n\n return new Date(currentDate.setFullYear(currentDate.getFullYear() + offset));\n }\n\n return {\n adjustDST: adjustDST,\n dayOfWeek: dayOfWeek,\n setDayOfWeek: setDayOfWeek,\n getDate: getDate,\n isInDateRange: isInDateRange,\n isInTimeRange: isInTimeRange,\n isToday: isToday,\n nextDay: function(date) {\n return addDays(date, 1);\n },\n previousDay: function(date) {\n return addDays(date, -1);\n },\n toUtcTime: toUtcTime,\n MS_PER_DAY: MS_PER_DAY,\n MS_PER_HOUR: 60 * MS_PER_MINUTE,\n MS_PER_MINUTE: MS_PER_MINUTE,\n setTime: setTime,\n setHours: setHours,\n addDays: addDays,\n today: today,\n toInvariantTime: toInvariantTime,\n firstDayOfMonth: firstDayOfMonth,\n lastDayOfMonth: lastDayOfMonth,\n weekInYear: weekInYear,\n getMilliseconds: getMilliseconds,\n firstDayOfYear: firstDayOfYear,\n lastDayOfYear: lastDayOfYear,\n nextYear: function(date) {\n return addYear(date, 1);\n },\n previousYear: function(date) {\n return addYear(date, -1);\n }\n };\n })();\n\n\n kendo.stripWhitespace = function(element) {\n if (document.createNodeIterator) {\n var iterator = document.createNodeIterator(element, NodeFilter.SHOW_TEXT, function(node) {\n return node.parentNode == element ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT;\n }, false);\n\n while (iterator.nextNode()) {\n if (iterator.referenceNode && !iterator.referenceNode.textContent.trim()) {\n iterator.referenceNode.parentNode.removeChild(iterator.referenceNode);\n }\n }\n } else { // IE7/8 support\n for (var i = 0; i < element.childNodes.length; i++) {\n var child = element.childNodes[i];\n\n if (child.nodeType == 3 && !/\\S/.test(child.nodeValue)) {\n element.removeChild(child);\n i--;\n }\n\n if (child.nodeType == 1) {\n kendo.stripWhitespace(child);\n }\n }\n }\n };\n\n var animationFrame = window.requestAnimationFrame ||\n window.webkitRequestAnimationFrame ||\n window.mozRequestAnimationFrame ||\n window.oRequestAnimationFrame ||\n window.msRequestAnimationFrame ||\n function(callback) { setTimeout(callback, 1000 / 60); };\n\n kendo.animationFrame = function(callback) {\n animationFrame.call(window, callback);\n };\n\n var animationQueue = [];\n\n kendo.queueAnimation = function(callback) {\n animationQueue[animationQueue.length] = callback;\n if (animationQueue.length === 1) {\n kendo.runNextAnimation();\n }\n };\n\n kendo.runNextAnimation = function() {\n kendo.animationFrame(function() {\n if (animationQueue[0]) {\n animationQueue.shift()();\n if (animationQueue[0]) {\n kendo.runNextAnimation();\n }\n }\n });\n };\n\n kendo.parseQueryStringParams = function(url) {\n var queryString = url.split('?')[1] || \"\",\n params = {},\n paramParts = queryString.split(/&|=/),\n length = paramParts.length,\n idx = 0;\n\n for (; idx < length; idx += 2) {\n if (paramParts[idx] !== \"\") {\n params[decodeURIComponent(paramParts[idx])] = decodeURIComponent(paramParts[idx + 1]);\n }\n }\n\n return params;\n };\n\n kendo.elementUnderCursor = function(e) {\n if (typeof e.x.client != \"undefined\") {\n return document.elementFromPoint(e.x.client, e.y.client);\n }\n };\n\n kendo.wheelDeltaY = function(jQueryEvent) {\n var e = jQueryEvent.originalEvent,\n deltaY = e.wheelDeltaY,\n delta;\n\n if (e.wheelDelta) { // Webkit and IE\n if (deltaY === undefined || deltaY) { // IE does not have deltaY, thus always scroll (horizontal scrolling is treated as vertical)\n delta = e.wheelDelta;\n }\n } else if (e.detail && e.axis === e.VERTICAL_AXIS) { // Firefox and Opera\n delta = (-e.detail) * 10;\n }\n\n return delta;\n };\n\n kendo.throttle = function(fn, delay) {\n var timeout;\n var lastExecTime = 0;\n\n if (!delay || delay <= 0) {\n return fn;\n }\n\n var throttled = function() {\n var that = this;\n var elapsed = +new Date() - lastExecTime;\n var args = arguments;\n\n function exec() {\n fn.apply(that, args);\n lastExecTime = +new Date();\n }\n\n // first execution\n if (!lastExecTime) {\n return exec();\n }\n\n if (timeout) {\n clearTimeout(timeout);\n }\n\n if (elapsed > delay) {\n exec();\n } else {\n timeout = setTimeout(exec, delay - elapsed);\n }\n };\n\n throttled.cancel = function() {\n clearTimeout(timeout);\n };\n\n return throttled;\n };\n\n\n kendo.caret = function(element, start, end) {\n var rangeElement;\n var isPosition = start !== undefined;\n\n if (end === undefined) {\n end = start;\n }\n\n if (element[0]) {\n element = element[0];\n }\n\n if (isPosition && element.disabled) {\n return;\n }\n\n try {\n if (element.selectionStart !== undefined) {\n if (isPosition) {\n element.focus();\n var mobile = support.mobileOS;\n if (mobile.wp || mobile.android) {// without the timeout the caret is at the end of the input\n setTimeout(function() { element.setSelectionRange(start, end); }, 0);\n }\n else {\n element.setSelectionRange(start, end);\n }\n } else {\n start = [element.selectionStart, element.selectionEnd];\n }\n } else if (document.selection) {\n if ($(element).is(\":visible\")) {\n element.focus();\n }\n\n rangeElement = element.createTextRange();\n\n if (isPosition) {\n rangeElement.collapse(true);\n rangeElement.moveStart(\"character\", start);\n rangeElement.moveEnd(\"character\", end - start);\n rangeElement.select();\n } else {\n var rangeDuplicated = rangeElement.duplicate(),\n selectionStart, selectionEnd;\n\n rangeElement.moveToBookmark(document.selection.createRange().getBookmark());\n rangeDuplicated.setEndPoint('EndToStart', rangeElement);\n selectionStart = rangeDuplicated.text.length;\n selectionEnd = selectionStart + rangeElement.text.length;\n\n start = [selectionStart, selectionEnd];\n }\n }\n } catch (e) {\n /* element is not focused or it is not in the DOM */\n start = [];\n }\n\n return start;\n };\n\n kendo.compileMobileDirective = function(element, scope) {\n var angular = window.angular;\n\n element.attr(\"data-\" + kendo.ns + \"role\", element[0].tagName.toLowerCase().replace('kendo-mobile-', '').replace('-', ''));\n\n angular.element(element).injector().invoke([\"$compile\", function($compile) {\n $compile(element)(scope);\n\n if (!/^\\$(digest|apply)$/.test(scope.$$phase)) {\n scope.$digest();\n }\n }]);\n\n return kendo.widgetInstance(element, kendo.mobile.ui);\n };\n\n kendo.antiForgeryTokens = function() {\n var tokens = { },\n csrf_token = $(\"meta[name=csrf-token],meta[name=_csrf]\").attr(\"content\"),\n csrf_param = $(\"meta[name=csrf-param],meta[name=_csrf_header]\").attr(\"content\");\n\n $(\"input[name^='__RequestVerificationToken']\").each(function() {\n tokens[this.name] = this.value;\n });\n\n if (csrf_param !== undefined && csrf_token !== undefined) {\n tokens[csrf_param] = csrf_token;\n }\n\n return tokens;\n };\n\n kendo.cycleForm = function(form) {\n var firstElement = form.find(\"input, .k-widget, .k-dropdownlist, .k-combobox\").first();\n var lastElement = form.find(\"button, .k-button\").last();\n\n function focus(el) {\n var widget = kendo.widgetInstance(el);\n\n if (widget && widget.focus) {\n widget.focus();\n } else {\n el.trigger(\"focus\");\n }\n }\n\n lastElement.on(\"keydown\", function(e) {\n if (e.keyCode == kendo.keys.TAB && !e.shiftKey) {\n e.preventDefault();\n focus(firstElement);\n }\n });\n\n firstElement.on(\"keydown\", function(e) {\n if (e.keyCode == kendo.keys.TAB && e.shiftKey) {\n e.preventDefault();\n focus(lastElement);\n }\n });\n };\n\n kendo.focusElement = function(element) {\n var scrollTopPositions = [];\n var scrollableParents = element.parentsUntil(\"body\")\n .filter(function(index, element) {\n var computedStyle = kendo.getComputedStyles(element, [\"overflow\"]);\n return computedStyle.overflow !== \"visible\";\n })\n .add(window);\n\n scrollableParents.each(function(index, parent) {\n scrollTopPositions[index] = $(parent).scrollTop();\n });\n\n try {\n //The setActive method does not cause the document to scroll to the active object in the current page\n element[0].setActive();\n } catch (e) {\n element[0].focus();\n }\n\n scrollableParents.each(function(index, parent) {\n $(parent).scrollTop(scrollTopPositions[index]);\n });\n };\n\n kendo.focusNextElement = function() {\n if (document.activeElement) {\n var focussable = $(\":kendoFocusable\");\n var index = focussable.index(document.activeElement);\n\n if (index > -1) {\n var nextElement = focussable[index + 1] || focussable[0];\n nextElement.focus();\n }\n }\n };\n\n kendo.trim = function(value) {\n if (!!value) {\n return value.toString().trim();\n } else {\n return \"\";\n }\n };\n\n kendo.getWidgetFocusableElement = function(element) {\n var nextFocusable = element.closest(\":kendoFocusable\"),\n widgetInstance = kendo.widgetInstance(element),\n target;\n\n if (nextFocusable.length) {\n target = nextFocusable;\n } else if (widgetInstance) {\n target = widgetInstance.options.name === 'Editor' ?\n $(widgetInstance.body) :\n widgetInstance.wrapper.find(\":kendoFocusable\").first();\n } else {\n target = element;\n }\n\n return target;\n };\n\n kendo.addAttribute = function(element, attribute, value) {\n var current = element.attr(attribute) || \"\";\n\n if (current.indexOf(value) < 0) {\n element.attr(attribute, (current + \" \" + value).trim());\n }\n };\n\n kendo.removeAttribute = function(element, attribute, value) {\n var current = element.attr(attribute) || \"\";\n\n element.attr(attribute, current.replace(value, \"\").trim());\n };\n\n kendo.toggleAttribute = function(element, attribute, value) {\n var current = element.attr(attribute) || \"\";\n\n if (current.indexOf(value) < 0) {\n kendo.addAttribute(element, attribute, value);\n } else {\n kendo.removeAttribute(element, attribute, value);\n }\n };\n\n kendo.matchesMedia = function(mediaQuery) {\n var media = kendo._bootstrapToMedia(mediaQuery) || mediaQuery;\n return support.matchMedia && window.matchMedia(media).matches;\n };\n\n kendo._bootstrapToMedia = function(bootstrapMedia) {\n return {\n \"xs\": \"(max-width: 576px)\",\n \"sm\": \"(min-width: 576px)\",\n \"md\": \"(min-width: 768px)\",\n \"lg\": \"(min-width: 992px)\",\n \"xl\": \"(min-width: 1200px)\"\n }[bootstrapMedia];\n };\n\n kendo.fileGroupMap = {\n audio: [\".aif\", \".iff\", \".m3u\", \".m4a\", \".mid\", \".mp3\", \".mpa\", \".wav\", \".wma\", \".ogg\", \".wav\", \".wma\", \".wpl\"],\n video: [\".3g2\", \".3gp\", \".avi\", \".asf\", \".flv\", \".m4u\", \".rm\", \".h264\", \".m4v\", \".mkv\", \".mov\", \".mp4\", \".mpg\",\n \".rm\", \".swf\", \".vob\", \".wmv\"],\n image: [\".ai\", \".dds\", \".heic\", \".jpe\", \"jfif\", \".jif\", \".jp2\", \".jps\", \".eps\", \".bmp\", \".gif\", \".jpeg\",\n \".jpg\", \".png\", \".ps\", \".psd\", \".svg\", \".svgz\", \".tif\", \".tiff\"],\n txt: [\".doc\", \".docx\", \".log\", \".pages\", \".tex\", \".wpd\", \".wps\", \".odt\", \".rtf\", \".text\", \".txt\", \".wks\"],\n presentation: [\".key\", \".odp\", \".pps\", \".ppt\", \".pptx\"],\n data: [\".xlr\", \".xls\", \".xlsx\"],\n programming: [\".tmp\", \".bak\", \".msi\", \".cab\", \".cpl\", \".cur\", \".dll\", \".dmp\", \".drv\", \".icns\", \".ico\", \".link\",\n \".sys\", \".cfg\", \".ini\", \".asp\", \".aspx\", \".cer\", \".csr\", \".css\", \".dcr\", \".htm\", \".html\", \".js\",\n \".php\", \".rss\", \".xhtml\"],\n pdf: [\".pdf\"],\n config: [\".apk\", \".app\", \".bat\", \".cgi\", \".com\", \".exe\", \".gadget\", \".jar\", \".wsf\"],\n zip: [\".7z\", \".cbr\", \".gz\", \".sitx\", \".arj\", \".deb\", \".pkg\", \".rar\", \".rpm\", \".tar.gz\", \".z\", \".zip\", \".zipx\"],\n \"disc-image\": [\".dmg\", \".iso\", \".toast\", \".vcd\", \".bin\", \".cue\", \".mdf\"]\n };\n\n kendo.getFileGroup = function(extension, withPrefix) {\n var fileTypeMap = kendo.fileGroupMap;\n var groups = Object.keys(fileTypeMap);\n var type = \"file\";\n\n if (extension === undefined || !extension.length) {\n return type;\n }\n\n for (var i = 0; i < groups.length; i += 1) {\n var extensions = fileTypeMap[groups[i]];\n\n if (extensions.indexOf(extension.toLowerCase()) > -1) {\n return withPrefix ? \"file-\" + groups[i] : groups[i];\n }\n }\n\n return type;\n };\n\n kendo.getFileSizeMessage = function(size) {\n var sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];\n\n if (size === 0) {\n return '0 Byte';\n }\n\n var i = parseInt(Math.floor(Math.log(size) / Math.log(1024)), 10);\n return Math.round(size / Math.pow(1024, i), 2) + ' ' + sizes[i];\n };\n\n kendo.selectorFromClasses = function(classes) {\n return \".\" + classes.split(\" \").join(\".\");\n };\n\n // Standardized Properties and CSS classes\n\n var themeColorValues = ['base', 'primary', 'secondary', 'tertiary', 'inherit', 'info', 'success', 'warning', 'error', 'dark', 'light', 'inverse'];\n var fillValues = ['solid', 'outline', 'flat'];\n //var postitionValues = ['edge', 'outside', 'inside'];\n var shapeValues = ['rectangle', 'square'];\n var sizeValues = [ ['small', 'sm'], ['medium', 'md'], ['large', 'lg'] ];\n var roundedValues = [ ['small', 'sm'], ['medium', 'md'], ['large', 'lg'] ];\n //var alignValues = [ ['top start', 'top-start'], ['top end', 'top-end'], ['bottom start', 'bottom-start'], ['bottom end', 'bottom-end'] ];\n var positionModeValues = [ 'fixed', 'static', 'sticky', 'absolute' ];\n var resizeValues = [ 'both', 'horizontal', 'vertical' ];\n var overflowValues = [ 'auto', 'hidden', 'visible', 'scroll', 'clip' ];\n\n kendo.cssProperties = (function() {\n var defaultValues = {},\n propertyDictionary = {};\n\n function registerPrefix(widget, prefix) {\n var dict = kendo.cssProperties.propertyDictionary;\n\n if (!dict[widget]) {\n dict[widget] = {};\n }\n\n dict[widget][PREFIX] = prefix;\n }\n\n function registerValues(widget, args) {\n var dict = kendo.cssProperties.propertyDictionary,\n i, j, prop, values, newValues, currentValue;\n\n for (i = 0; i < args.length; i++) {\n prop = args[i].prop;\n newValues = args[i].values;\n\n if (!dict[widget][prop]) {\n dict[widget][prop] = {};\n }\n\n values = dict[widget][prop];\n\n for (j = 0; j < newValues.length; j++) {\n currentValue = newValues[j];\n\n if (isArray(newValues[j])) {\n values[currentValue[0]] = currentValue[1];\n } else {\n values[currentValue] = currentValue;\n }\n }\n }\n }\n\n function registerCssClass(propName, value, shorthand) {\n if (!defaultValues[propName]) {\n defaultValues[propName] = {};\n }\n\n defaultValues[propName][value] = shorthand || value;\n }\n\n function registerCssClasses(propName, arr) {\n for (var i = 0; i < arr.length; i++) {\n if (isArray(arr[i])) {\n registerCssClass(propName, arr[i][0], arr[i][1]);\n } else {\n registerCssClass(propName, arr[i]);\n }\n }\n }\n\n function getValidClass(args) {\n var widget = args.widget,\n propName = args.propName,\n value = args.value,\n fill = args.fill,\n cssProperties = kendo.cssProperties,\n defaultValues = cssProperties.defaultValues[propName],\n widgetProperties = cssProperties.propertyDictionary[widget],\n widgetValues, validValue, prefix;\n\n if (!widgetProperties) {\n return \"\";\n }\n\n widgetValues = widgetProperties[propName];\n validValue = widgetValues ? widgetValues[value] || defaultValues[value] : defaultValues[value];\n\n if (validValue) {\n if (propName === \"themeColor\") {\n prefix = widgetProperties[PREFIX] + fill + \"-\";\n } else if (propName === \"positionMode\") {\n prefix = \"k-pos-\";\n } else if (propName === \"rounded\") {\n prefix = \"k-rounded-\";\n } else if (propName === \"resize\") {\n prefix = \"k-resize-\";\n } else if (propName === \"overflow\") {\n prefix = \"k-overflow-\";\n } else {\n prefix = widgetProperties[PREFIX];\n }\n\n return prefix + validValue;\n } else {\n return \"\";\n }\n }\n\n registerCssClasses(\"themeColor\", themeColorValues);\n registerCssClasses(\"fillMode\", fillValues);\n registerCssClasses(\"shape\", shapeValues);\n registerCssClasses(\"size\", sizeValues);\n registerCssClasses(\"positionMode\", positionModeValues);\n registerCssClasses(\"rounded\", roundedValues);\n registerCssClasses(\"resize\", resizeValues);\n registerCssClasses(\"overflow\", overflowValues);\n\n return {\n positionModeValues: positionModeValues,\n roundedValues: roundedValues,\n sizeValues: sizeValues,\n shapeValues: shapeValues,\n fillModeValues: fillValues,\n themeColorValues: themeColorValues,\n\n defaultValues: defaultValues,\n propertyDictionary: propertyDictionary,\n\n registerValues: registerValues,\n getValidClass: getValidClass,\n registerPrefix: registerPrefix\n };\n }());\n\n //To do: delete below after implementing new styles and classes for BottomNavigation\n kendo.registerCssClass = function(propName, value, shorthand) {\n if (!kendo.propertyToCssClassMap[propName]) {\n kendo.propertyToCssClassMap[propName] = {};\n }\n\n kendo.propertyToCssClassMap[propName][value] = shorthand || value;\n };\n\n kendo.registerCssClasses = function(propName, arr) {\n for (var i = 0; i < arr.length; i++) {\n if (isArray(arr[i])) {\n kendo.registerCssClass(propName, arr[i][0], arr[i][1]);\n } else {\n kendo.registerCssClass(propName, arr[i]);\n }\n }\n };\n\n kendo.getValidCssClass = function(prefix, propName, value) {\n var validValue = kendo.propertyToCssClassMap[propName][value];\n\n if (validValue) {\n return prefix + validValue;\n }\n };\n\n kendo.propertyToCssClassMap = {};\n\n kendo.registerCssClasses(\"themeColor\", themeColorValues);\n kendo.registerCssClasses(\"fill\", fillValues);\n //kendo.registerCssClasses(\"postition\", postitionValues);\n kendo.registerCssClasses(\"shape\", shapeValues);\n kendo.registerCssClasses(\"size\", sizeValues);\n //kendo.registerCssClasses(\"align\", alignValues);\n kendo.registerCssClasses(\"positionMode\", positionModeValues);\n\n // jQuery deferred helpers\n\n // influenced from: https://gist.github.com/fearphage/4341799\n kendo.whenAll = function(array) {\n var resolveValues = arguments.length == 1 && Array.isArray(array) ? array : Array.prototype.slice.call(arguments),\n length = resolveValues.length,\n remaining = length,\n deferred = $.Deferred(),\n i = 0,\n failed = 0,\n rejectContexts = Array(length),\n rejectValues = Array(length),\n resolveContexts = Array(length),\n value;\n\n function updateFunc(index, contexts, values) {\n return function() {\n if (values != resolveValues) {\n failed++;\n }\n\n deferred.notifyWith(\n contexts[index] = this,\n values[index] = Array.prototype.slice.call(arguments)\n );\n\n if (!(--remaining)) {\n deferred[(!failed ? 'resolve' : 'reject') + 'With'](contexts, values);\n }\n };\n }\n\n for (; i < length; i++) {\n if ((value = resolveValues[i]) && kendo.isFunction(value.promise)) {\n value.promise()\n .done(updateFunc(i, resolveContexts, resolveValues))\n .fail(updateFunc(i, rejectContexts, rejectValues));\n }\n\n else {\n deferred.notifyWith(this, value);\n --remaining;\n }\n }\n\n if (!remaining) {\n deferred.resolveWith(resolveContexts, resolveValues);\n }\n\n return deferred.promise();\n };\n\n // kendo.saveAs -----------------------------------------------\n (function() {\n function postToProxy(dataURI, fileName, proxyURL, proxyTarget) {\n var form = $(\"
\").attr({\n action: proxyURL,\n method: \"POST\",\n target: proxyTarget\n });\n\n var data = kendo.antiForgeryTokens();\n data.fileName = fileName;\n\n var parts = dataURI.split(\";base64,\");\n data.contentType = parts[0].replace(\"data:\", \"\");\n data.base64 = parts[1];\n\n for (var name in data) {\n if (data.hasOwnProperty(name)) {\n $('').attr({\n value: data[name],\n name: name,\n type: \"hidden\"\n }).appendTo(form);\n }\n }\n\n form.appendTo(\"body\").submit().remove();\n }\n\n var fileSaver = document.createElement(\"a\");\n var downloadAttribute = \"download\" in fileSaver && !kendo.support.browser.edge;\n\n function saveAsBlob(dataURI, fileName) {\n var blob = dataURI; // could be a Blob object\n\n if (typeof dataURI == \"string\") {\n var parts = dataURI.split(\";base64,\");\n var contentType = parts[0];\n var base64 = atob(parts[1]);\n var array = new Uint8Array(base64.length);\n\n for (var idx = 0; idx < base64.length; idx++) {\n array[idx] = base64.charCodeAt(idx);\n }\n blob = new Blob([array.buffer], { type: contentType });\n }\n\n navigator.msSaveBlob(blob, fileName);\n }\n\n function saveAsDataURI(dataURI, fileName) {\n if (window.Blob && dataURI instanceof Blob) {\n dataURI = URL.createObjectURL(dataURI);\n }\n\n fileSaver.download = fileName;\n fileSaver.href = dataURI;\n\n var e = document.createEvent(\"MouseEvents\");\n e.initMouseEvent(\"click\", true, false, window,\n 0, 0, 0, 0, 0, false, false, false, false, 0, null);\n\n fileSaver.dispatchEvent(e);\n setTimeout(function() {\n URL.revokeObjectURL(dataURI);\n });\n }\n\n kendo.saveAs = function(options) {\n var save = postToProxy;\n\n if (!options.forceProxy) {\n if (downloadAttribute) {\n save = saveAsDataURI;\n } else if (navigator.msSaveBlob) {\n save = saveAsBlob;\n }\n }\n\n save(options.dataURI, options.fileName, options.proxyURL, options.proxyTarget);\n };\n })();\n\n // kendo proxySetters\n kendo.proxyModelSetters = function proxyModelSetters(data) {\n var observable = {};\n\n Object.keys(data || {}).forEach(function(property) {\n Object.defineProperty(observable, property, {\n get: function() {\n return data[property];\n },\n set: function(value) {\n data[property] = value;\n data.dirty = true;\n }\n });\n });\n\n return observable;\n };\n\n kendo.getSeriesColors = function() {\n var seriesColorsTemplate = '
' +\n '
' +\n '
' +\n '
' +\n '
' +\n '
',\n series = $(seriesColorsTemplate),\n colors = [];\n\n series.appendTo($('body'));\n\n series.each(function(i, item) {\n colors.push($(item).css(\"background-color\"));\n });\n\n series.remove();\n\n return colors;\n };\n\n kendo.isElement = function(element) {\n return element instanceof Element || element instanceof HTMLDocument;\n };\n\n // Kendo defaults\n (function() {\n\n kendo.defaults = kendo.defaults || {};\n kendo.setDefaults = function(key, value) {\n var path = key.split(\".\");\n var curr = kendo.defaults;\n\n key = path.pop();\n\n path.forEach(function(part) {\n if (curr[part] === undefined) {\n curr[part] = {};\n }\n\n curr = curr[part];\n });\n\n if (value.constructor === Object) {\n curr[key] = deepExtend({}, curr[key], value);\n } else {\n curr[key] = value;\n }\n };\n\n })();\n\n // Implement type() as it has been depricated in jQuery\n (function() {\n kendo.class2type = {};\n\n jQuery.each( \"Boolean Number String Function Array Date RegExp Object Error Symbol\".split( \" \" ),\n function( _i, name ) {\n kendo.class2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n } );\n\n kendo.type = function(obj) {\n if ( obj == null ) {\n return obj + \"\";\n }\n\n // Support: Android <=2.3 only (functionish RegExp)\n return typeof obj === \"object\" || typeof obj === \"function\" ?\n kendo.class2type[Object.prototype.toString.call(obj)] || \"object\" :\n typeof obj;\n };\n }());\n\n var KendoLicensing = { validatePackage: function() {},setScriptKey: function() {} };\n\n window.KendoLicensing = {\n setScriptKey: KendoLicensing.setScriptKey\n };\n\n function validatePackage() {\n KendoLicensing.validatePackage(packageMetadata);\n }\n\n})(jQuery, window);\n\nreturn window.kendo;\n\n}, typeof define == 'function' && define.amd ? define : function(a1, a2, a3) { (a3 || a2)(); });\n\n"],"names":["define","__meta__","id","name","category","description","packageMetadata","productName","productCodes","publishDate","version","licensingDocsUrl","$","jQuery","window","undefined","kendo","cultures","extend","each","isArray","Array","noop","math","Math","Template","JSON","support","percentRegExp","formatRegExp","boxShadowRegExp","numberRegExp","FUNCTION","STRING","NUMBER","OBJECT","NULL","BOOLEAN","UNDEFINED","PREFIX","ARIA_LABELLEDBY","ARIA_LABEL","LABELIDPART","getterCache","setterCache","slice","cssPropertiesNames","noDepricateExtend","src","copyIsArray","copy","options","clone","target","arguments","i","length","deep","this","isPlainObject","Class","replace","proto","base","member","that","subclass","init","apply","fn","prototype","constructor","Object","_initOptions","deepExtend","isFunction","preventDefault","_defaultPrevented","isDefaultPrevented","Observable","_events","bind","eventName","handlers","one","idx","eventNames","original","handler","handlersIsFunction","events","unbind","push","first","unshift","trigger","e","sender","call","splice","compilePart","part","stringPart","split","join","charAt","rest","substring","argumentNameRegExp","encodeRegExp","escapedCurlyRegExp","curlyRegExp","escapedSharpRegExp","sharpRegExp","zeros","pad","number","digits","end","paramName","useWithBlock","render","template","data","html","compile","settings","argumentName","match","functionBody","parts","Function","_slotCount","floor","Error","format","escapable","gap","indent","meta","\b","\t","\n","\f","\r","\"","\\","rep","toString","Date","toJSON","isFinite","valueOf","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","String","Number","Boolean","quote","string","lastIndex","test","a","c","charCodeAt","str","key","holder","k","v","mind","partial","value","type","hasOwnProperty","stringify","replacer","space","","dateFormatRegExp","standardFormatRegExp","literalRegExp","commaRegExp","EMPTY","POINT","COMMA","SHARP","ZERO","PLACEHOLDER","EN","objectToString","findCulture","culture","numberFormat","getCulture","current","formatDate","date","calendar","calendars","standard","days","months","patterns","minutes","result","sign","getDate","namesAbbr","getDay","names","getMonth","getFullYear","getHours","getMinutes","getSeconds","getMilliseconds","AM","PM","getTimezoneOffset","abs","formatNumber","decimal","precision","decimals","pattern","literals","symbol","isCurrency","isPercent","customPrecision","formatAndPrecision","negative","integer","fraction","integerLength","fractionLength","replacement","ch","hasGroup","hasNegativeFormat","decimalIndex","sharpIndex","zeroIndex","hasZero","hasSharp","percentIndex","currencyIndex","startZeroIndex","start","toLocaleString","exec","toLowerCase","currency","percent","exp","toExponential","round","groupInteger","indexOf","quoteChar","literal","lastIndexOf","rounded","max",",",".","groupSize","abbr","namesShort","d","D","F","g","G","m","M","s","t","T","u","y","Y","/",":","firstDay","twoDigitYearMax","cultureName","groupSizes","shift","newGroupSize","reverse","toFixed","min","fmt","nonBreakingSpaceRegExp","values","index","placeholderFormat","parseInt","_extractFormat","_activeElement","document","activeElement","documentElement","_round","_outerWidth","element","includeMargin","outerWidth","_outerHeight","outerHeight","spaceRegExp","exponentRegExp","shortTimeZoneRegExp","longTimeZoneRegExp","dateRegExp","offsetRegExp","FORMATS_SEQUENCE","STANDARD_FORMATS","2","3","4","outOfRange","designatorPredicate","designator","mapDesignators","designators","map","adjustDST","hours","setHours","lowerArray","array","lowerLocalInfo","localInfo","newLocalInfo","property","parseExact","strict","lookAhead","getNumber","size","rg","RegExp","substr","valueIdx","getIndexByName","lower","nameLength","matchLength","matchIdx","subValue","checkLiteral","year","month","day","seconds","milliseconds","defaultYear","count","pmHour","UTC","matches","amDesignators","pmDesignators","hoursOffset","minutesOffset","hasTime","_lowerDays","_lowerMonths","parseFloat","isNaN","setFullYear","parseMicrosoftFormatOffset","offset","getDefaultFormats","cultureFormats","formatIdx","formats","concat","internalParseDate","tzoffset","timezone","convert","getShadows","shadow","css","transitions","radius","blur","left","right","bottom","wrap","autosize","percentage","parent","windowOuterWidth","removeClass","hasClass","width","style","height","percentWidth","percentHeight","forceWidth","is","addClass","attr","boxSizing","mozBoxSizing","webkitBoxSizing","wrapResize","wrapper","wrapperStyle","display","position","destination","deepExtendOne","source","ObservableArray","LazyObservableArray","DataSource","HierarchicalDataSource","propValue","propType","propInit","destProp","ArrayBuffer","HTMLElement","getTime","testRx","agent","rxs","dflt","rx","toHyphens","toCamelCase","strMatch","g1","toUpperCase","getComputedStyles","properties","styles","computedStyle","defaultView","getComputedStyle","getPropertyValue","currentStyle","isScrollable","className","overflow","scrollLeft","webkit","browser","mozila","mozilla","browserVersion","el","isRtl","safari","scrollWidth","clientWidth","parseDate","parseExactDate","percentSymbol","_scrollbar","scrollbar","refresh","div","createElement","cssText","innerHTML","body","appendChild","offsetWidth","removeChild","closest","table","tbodyInnerHtml","touch","docStyle","transforms","elementProto","hasHW3D","WebKitCSSMatrix","cssFlexbox","prefix","hasTransitions","lowPrefix","event","devicePixelRatio","screenWidth","screen","availWidth","innerWidth","screenHeight","availHeight","innerHeight","detectOS","ua","os","minorVersion","notAndroidPhone","agentRxs","wp","fire","android","iphone","ipad","meego","webos","blackberry","playbook","windows","tizen","sailfish","ffos","osRxs","ios","flat","formFactorRxs","tablet","browserRxs","omini","omobile","firefox","mobilesafari","ie","chrome","navigator","device","majorVersion","flatVersion","cordova","PhoneGap","appMode","standalone","location","protocol","mobileOS","userAgent","wpDevicePixelRatio","hasNativeScrolling","delayedClick","mouseAndTouchPresent","detectBrowser","chromiumEdgeMatch","edge","opera","msie","documentMode","chromiumEdge","detectClipboardAccess","commands","queryCommandSupported","cut","paste","clipboard","zoomLevel","ie11WidthCorrection","docEl","scrollHeight","clientHeight","top","cssClass","docElement","eventCapture","addEventListener","input","placeholder","propertyChangeEvent","types","setAttribute","cssFloat","stableSort","threshold","sorted","field","sort","b","matchesSelector","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","oMatchesSelector","selector","nodeList","querySelectorAll","parentNode","matchMedia","pushState","history","hashChange","customElements","mobileChrome","crios","obj","getOffset","positioned","pointers","msPointers","pageYOffset","pageXOffset","MSPointerEvent","PointerEvent","kineticScrollNeeded","directions","down","up","in","out","parseEffects","effects","fx","Element","prepareAnimationOptions","duration","complete","teardown","hide","completeCallback","animate","instance","queue","promise","toggleClass","classes","add","enabled","dequeue","disable","promiseShim","enable","animatedPromise","kendoStop","clearQueue","gotoEnd","stop","kendoAnimate","kendoAddClass","kendoRemoveClass","kendoToggleClass","toggle","ampRegExp","ltRegExp","quoteRegExp","aposRegExp","gtRegExp","htmlEncode","unescape","decodeURIComponent","error","_","m1","m2","fromCharCode","eventTarget","touches","originalEvent","changedTouches","elementFromPoint","clientX","clientY","callback","on","mousedown","mouseup","mousemove","mousecancel","click","resize","wrapExpression","members","localUrlRe","Widget","widgets","_widgetRegisteredCallbacks","ui","mobile","dataviz","drawing","spreadsheet","messages","keys","INSERT","DELETE","BACKSPACE","TAB","ENTER","ESC","LEFT","UP","RIGHT","DOWN","END","HOME","SPACEBAR","PAGEUP","PAGEDOWN","F2","F10","F12","NUMPAD_PLUS","NUMPAD_MINUS","NUMPAD_DOT","ns","isLocalUrl","url","expr","expression","safe","getter","setter","accessor","get","set","guid","random","chars","roleSelector","role","directiveSelector","directives","selectors","triggeredByInput","tagName","onWidgetRegistered","len","logToConsole","message","console","suppressLog","log","validatePackage","angular","dataSource","props","componentTypes","componentType","defaults","_hasBindingTarget","kendoBindingTarget","_tabindex","TABINDEX","tabindex","removeAttr","setOptions","_clearCssClasses","_setEvents","_applyCssClasses","force","getSize","currentSize","_size","_resize","dimensions","setSize","destroy","removeData","_destroy","_muteAngularRebind","_muteRebind","protoOptions","__proto__","prop","validFill","widgetName","cssProperties","propertyDictionary","_altname","getValidClass","widget","propName","fillMode","fill","_ariaLabel","inputElm","inputId","labelElm","ariaLabel","ariaLabelledBy","labelId","_generateLabelId","newOptions","currentOptions","themeColor","label","DataBoundWidget","dataItems","flatView","_angularItems","cmd","elements","items","dataItem","templateRegExp","domElement","offsetHeight","notify","jsonRegExp","jsonFormatRegExp","dashRegExp","parseOption","option","getAttribute","parseOptions","containmentComparer","contains","resizableWidget","inArray","initWidget","roles","fullPath","widgetKeyRegExp","nodeType","widgetKey","isEmptyObject","rolesFromNamespaces","namespaces","find","addBack","filter","widgetsArray","makeArray","widgetInstance","progress","container","mask","leftRight","webkitCorrection","containerScrollLeft","scrollTop","opacity","loading","prependTo","remove","plugin","register","widgetEntry","args","method","ContainerNullObject","nullObject","MobileWidget","autoApplyNS","kendoDestroy","view","viewElement","viewHasNativeScrolling","useNativeScrolling","eq","focusable","isTabIndexNotNaN","nodeName","disabled","href","visible","pseudos","parents","appLevelNativeScrolling","application","themes","views","touchScroller","useNative","Scroller","kendoMobileScroller","suites","elementData","editorToolbar","onResize","setTimeout","unbindResize","off","attrValue","Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","kendoFocusable","MOUSE_EVENTS","EXCLUDE_BUST_CLICK_SELECTOR","MouseEventNormalizer","setupMouseMute","mouseTrap","bustClick","captureMouse","stopPropagation","muteMouse","clearTimeout","mouseTrapTimeoutID","unMuteMouse","eventMap","move","cancel","MSPointerEnter","MSPointerLeave","orig","fix","special","delegateType","bindType","handle","ret","related","relatedTarget","handleObj","origType","getEventMap","eventRegEx","applyEventMap","keyDownHandler","kendoKeydown","preventKendoKeydown","kendoJQuery","context","rootjQuery","animationFrame","pop","search","touchstart","touchend","keyDownCallBack","Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec","Sun","Mon","Tue","Wed","Thu","Fri","Sat","ruleToDate","rule","targetDay","ourDay","time","cache","getUTCDay","setUTCDate","findRule","utcTime","rules","zone","grep","from","to","findZone","zones","zoneRules","until","zoneAndRule","info","fromOffset","toOffset","tempToOffset","diff","fromLocalOffset","toLocalOffset","toLocalDate","MS_PER_MINUTE","MS_PER_DAY","setDayOfWeek","dir","setDate","dayOfWeek","firstDayOfMonth","lastDayOfMonth","last","timeOffset","firstDayOfYear","lastDayOfYear","moveDateToWeekStart","weekStartDay","addDays","calcWeekInYear","firstWeekInYear","newDate","diffInMS","weekInYear","prevWeekDate","nextWeekDate","weekNumber","toUtcTime","toInvariantTime","isInTimeRange","msMin","msMax","msValue","isInDateRange","setTime","ignoreDST","difference","today","isToday","staticDate","addYear","currentDate","nextDay","previousDay","MS_PER_HOUR","nextYear","previousYear","stripWhitespace","createNodeIterator","iterator","NodeFilter","SHOW_TEXT","node","FILTER_ACCEPT","FILTER_REJECT","nextNode","referenceNode","textContent","trim","childNodes","child","nodeValue","requestAnimationFrame","webkitRequestAnimationFrame","mozRequestAnimationFrame","oRequestAnimationFrame","msRequestAnimationFrame","animationQueue","themeColorValues","queueAnimation","runNextAnimation","parseQueryStringParams","queryString","params","paramParts","elementUnderCursor","x","client","wheelDeltaY","jQueryEvent","deltaY","delta","wheelDelta","detail","axis","VERTICAL_AXIS","throttle","delay","timeout","lastExecTime","throttled","elapsed","caret","rangeElement","isPosition","selectionStart","focus","setSelectionRange","selectionEnd","selection","createTextRange","collapse","moveStart","moveEnd","select","rangeDuplicated","duplicate","moveToBookmark","createRange","getBookmark","setEndPoint","text","compileMobileDirective","scope","injector","invoke","$compile","$$phase","$digest","antiForgeryTokens","tokens","csrf_token","csrf_param","cycleForm","form","firstElement","lastElement","keyCode","shiftKey","focusElement","scrollTopPositions","scrollableParents","parentsUntil","setActive","focusNextElement","focussable","nextElement","getWidgetFocusableElement","nextFocusable","addAttribute","attribute","removeAttribute","toggleAttribute","matchesMedia","mediaQuery","media","_bootstrapToMedia","bootstrapMedia","xs","sm","md","lg","xl","fileGroupMap","audio","video","image","txt","presentation","programming","pdf","config","zip","disc-image","getFileGroup","extension","withPrefix","fileTypeMap","groups","extensions","getFileSizeMessage","sizes","pow","selectorFromClasses","fillValues","shapeValues","sizeValues","roundedValues","positionModeValues","resizeValues","overflowValues","postToProxy","dataURI","fileName","proxyURL","proxyTarget","action","contentType","base64","appendTo","submit","defaultValues","registerPrefix","dict","registerValues","j","newValues","currentValue","registerCssClass","shorthand","registerCssClasses","arr","widgetProperties","widgetValues","validValue","fillModeValues","propertyToCssClassMap","getValidCssClass","whenAll","resolveValues","remaining","deferred","Deferred","failed","rejectContexts","rejectValues","resolveContexts","updateFunc","contexts","notifyWith","done","fail","resolveWith","fileSaver","downloadAttribute","saveAsBlob","blob","atob","Uint8Array","Blob","buffer","msSaveBlob","saveAsDataURI","URL","createObjectURL","download","createEvent","initMouseEvent","dispatchEvent","revokeObjectURL","saveAs","save","forceProxy","proxyModelSetters","observable","forEach","defineProperty","dirty","getSeriesColors","seriesColorsTemplate","series","colors","item","isElement","HTMLDocument","setDefaults","path","curr","class2type","_i","KendoLicensing","setScriptKey","amd","a1","a2","a3"],"mappings":"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"}