{"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__ = { // jshint ignore:line\n id: \"core\",\n name: \"Core\",\n category: \"framework\",\n description: \"The core of the Kendo framework.\"\n};\n\n/*jshint eqnull: true, loopfunc: true, evil: true, boss: true, freeze: false*/\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.1.412\".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)) {\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 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, // jshint ignore:line\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, // jshint ignore:line\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 \"a\" === nodeName ?\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; // jshint ignore:line\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})(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","$","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","version","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","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","HTMLElement","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","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","amd","a1","a2","a3"],"mappings":"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"}